diff --git a/src/basics.h b/src/basics.h index 41223d6..d46afab 100644 --- a/src/basics.h +++ b/src/basics.h @@ -32,6 +32,14 @@ struct User { Size size{0,0}; Position position{0,0}; + template + bool is_inside(Ball b){ + float x = b.position.x; + float y = b.position.y; + return position.x < x && x < position.x + size.width + && position.y < y && y < position.y + size.height; + } + User& operator=(IncomingPacket const & p){ name = p.name; size = p.size; diff --git a/src/json_ext.h b/src/json_ext.h index 76a2760..2c19f7c 100644 --- a/src/json_ext.h +++ b/src/json_ext.h @@ -4,16 +4,24 @@ struct Identity{ template - T operator()(T t){ + T operator()(T t) const { return t; } }; -template -inline js::Value vector_to_json(C const & container, F f = Identity()){ +struct All{ + template + bool operator()(T const & t) const { + return true; + } +}; + +template +inline js::Value vector_to_json(C const & container, F1 const & transform = Identity(), F2 const & filter = All()){ js::Array array; for(auto x : container){ - array.push_back(to_json(f(x))); + if(!filter(x)) continue; + array.push_back(to_json(transform(x))); } return array; } diff --git a/src/main.cpp b/src/main.cpp index 964bfc2..742ad61 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -39,9 +39,9 @@ websockets::TestProtocol default_protocol{ user.update_lines = false; } else { if(app->uberclient){ - ret["balls"] = vector_to_json(app->offline_sim.balls); + ret["balls"] = vector_to_json(app->offline_sim.balls, Identity(), [&user](cheap_ball_type const & b){ return user.is_inside(b); }); } else { - ret["balls"] = vector_to_json(app->online_sim.sim.balls, [](ball_type const & b){return cheap_ball_type(b);}); + ret["balls"] = vector_to_json(app->online_sim.sim.balls, [](ball_type const & b){return cheap_ball_type(b);}, [&user](ball_type const & b){ return user.is_inside(b); }); } } return write_json(ret);