Joshua Moerman
12 years ago
4 changed files with 98 additions and 75 deletions
@ -0,0 +1,87 @@ |
|||||
|
#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) |
||||
|
) |
Reference in new issue