diff --git a/src/app.h b/src/app.h index 32392e6..ddd758d 100644 --- a/src/app.h +++ b/src/app.h @@ -7,69 +7,7 @@ #include #include -#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; -using line_type = simulation::Line; -using simu_type = simulation::Simulation; - -using note_info = Vec2; -using note_type = Note; -using beat_type = Beat; - -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 calculate_lines() const { - auto dir = normalize(end_point - starting_point); - auto normal = rotate_ccw(dir); - LineKind lk = static_cast(line_kind); - - if(line_kind == simulation::kOneWay){ - std::vector 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 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) -) +#include "app_common.h" struct libwebsocket; struct App{ diff --git a/src/app_common.h b/src/app_common.h new file mode 100644 index 0000000..86fb37a --- /dev/null +++ b/src/app_common.h @@ -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; +using line_type = simulation::Line; +using simu_type = simulation::Simulation; + +using note_info = Vec2; +using note_type = Note; +using beat_type = Beat; + +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 calculate_lines() const { + auto dir = normalize(end_point - starting_point); + auto normal = rotate_ccw(dir); + LineKind lk = static_cast(line_kind); + + if(line_kind == simulation::kOneWay){ + std::vector 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 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) +) diff --git a/src/json_ext.h b/src/json_ext.h index 3a24980..76a2760 100644 --- a/src/json_ext.h +++ b/src/json_ext.h @@ -2,20 +2,18 @@ #include "json.h" -template -inline js::Value ptrvector_to_json(C const & container){ - js::Array array; - for(auto x : container){ - array.push_back(to_json(*x)); +struct Identity{ + template + T operator()(T t){ + return t; } - return array; -} +}; -template -inline js::Value vector_to_json(C const & container){ +template +inline js::Value vector_to_json(C const & container, F f = Identity()){ js::Array array; for(auto x : container){ - array.push_back(to_json(x)); + array.push_back(to_json(f(x))); } return array; } diff --git a/src/main.cpp b/src/main.cpp index 16f3a09..80adc38 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -30,7 +30,7 @@ websockets::TestProtocol default_protocol{ // write (will always come after receive) [](User& user, basic_websocket_info) -> std::string{ js::Object ret; - ret["balls"] = vector_to_json(app->sim.balls); + ret["balls"] = vector_to_json(app->sim.balls, [](ball_type const & b){return cheap_ball_type(b);}); if(user.update_lines){ ret["lines"] = vector_to_json(app->sim.lines); user.update_lines = false; @@ -63,7 +63,7 @@ websockets::TestProtocol observer_protocol{ // write (will always come after receive) [](Empty& user, basic_websocket_info) -> std::string{ js::Object ret; - ret["people"] = ptrvector_to_json(app->people_online); + ret["people"] = vector_to_json(app->people_online, [](User* u){return *u;}); ret["balls"] = vector_to_json(app->sim.balls); ret["lines"] = vector_to_json(app->sim.lines); return write_json(ret);