You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
106 lines
2.5 KiB
106 lines
2.5 KiB
#pragma once
|
|
|
|
#include "basics.h"
|
|
#include "adaptions.h"
|
|
|
|
#include "simulation/Simulation.h"
|
|
#include "simulation/Beat.h"
|
|
|
|
using Vec2 = math::Vec2;
|
|
using LineKind = simulation::LineKind;
|
|
|
|
using ball_info = int;
|
|
using line_info = void;
|
|
using ball_type = simulation::Ball<ball_info>;
|
|
using line_type = simulation::Line<line_info>;
|
|
using simu_type = simulation::Simulation<ball_info, line_info>;
|
|
|
|
using note_info = Vec2;
|
|
using note_type = Note<note_info>;
|
|
using beat_type = Beat<note_info>;
|
|
|
|
struct AbstractLine {
|
|
math::Vec2 starting_point;
|
|
math::Vec2 end_point;
|
|
int line_kind;
|
|
|
|
const float hsize = 5.0f;
|
|
|
|
AbstractLine() = default;
|
|
|
|
AbstractLine(math::Vec2 starting_point, math::Vec2 end_point, int line_kind)
|
|
: starting_point(starting_point)
|
|
, end_point(end_point)
|
|
, line_kind(line_kind)
|
|
{}
|
|
|
|
// create 6 lines, to emulate width, and rounded edges
|
|
std::vector<line_type> calculate_lines() const {
|
|
auto dir = normalize(end_point - starting_point);
|
|
auto normal = rotate_ccw(dir);
|
|
LineKind lk = static_cast<LineKind>(line_kind);
|
|
|
|
if(line_kind == simulation::kOneWay){
|
|
std::vector<line_type> ret;
|
|
ret.emplace_back(starting_point + hsize*normal, end_point + hsize*normal, lk);
|
|
ret.emplace_back(end_point + hsize*normal, end_point + hsize*dir, lk);
|
|
ret.emplace_back(end_point + hsize*dir, end_point - hsize*normal, lk);
|
|
ret.emplace_back(end_point - hsize*normal, starting_point - hsize*normal, lk);
|
|
ret.emplace_back(starting_point - hsize*normal, starting_point - hsize*dir, lk);
|
|
ret.emplace_back(starting_point - hsize*dir, starting_point + hsize*normal, lk);
|
|
return ret;
|
|
} else {
|
|
std::vector<line_type> ret;
|
|
ret.emplace_back(starting_point, end_point, lk);
|
|
return ret;
|
|
}
|
|
}
|
|
};
|
|
|
|
BOOST_FUSION_ADAPT_STRUCT(
|
|
AbstractLine,
|
|
(::math::Vec2, starting_point)
|
|
(::math::Vec2, end_point)
|
|
(int, line_kind)
|
|
)
|
|
|
|
BOOST_FUSION_DEFINE_STRUCT(
|
|
, IntVec2,
|
|
(int, x)
|
|
(int, y)
|
|
)
|
|
|
|
struct cheap_ball_type {
|
|
IntVec2 position;
|
|
ball_info information;
|
|
|
|
cheap_ball_type(ball_type const & b)
|
|
: position(b.position)
|
|
, information(b.information)
|
|
{}
|
|
};
|
|
|
|
BOOST_FUSION_ADAPT_STRUCT(
|
|
cheap_ball_type,
|
|
(IntVec2, position)
|
|
(ball_info, information)
|
|
)
|
|
|
|
struct cheap_line_type {
|
|
IntVec2 starting_point;
|
|
IntVec2 end_point;
|
|
int line_kind;
|
|
|
|
cheap_line_type(AbstractLine const & l)
|
|
: starting_point(l.starting_point)
|
|
, end_point(l.end_point)
|
|
, line_kind(l.line_kind)
|
|
{}
|
|
};
|
|
|
|
BOOST_FUSION_ADAPT_STRUCT(
|
|
cheap_line_type,
|
|
(IntVec2, starting_point)
|
|
(IntVec2, end_point)
|
|
(int, line_kind)
|
|
)
|
|
|