Lines have an ID :D removing them works
This commit is contained in:
parent
2eddac0349
commit
39ed1414d0
4 changed files with 59 additions and 20 deletions
|
@ -1 +1 @@
|
||||||
Subproject commit 61c889b0c697f522a66a7bfaf002cd143d018060
|
Subproject commit 092045a2c26552b9494ac0e2a708a56a775904e8
|
22
src/app.h
22
src/app.h
|
@ -22,6 +22,7 @@ struct App{
|
||||||
int lineuid{0};
|
int lineuid{0};
|
||||||
|
|
||||||
struct OfflineSim {
|
struct OfflineSim {
|
||||||
|
std::vector<int> lines_to_remove;
|
||||||
std::vector<cheap_line_type> lines_to_add;
|
std::vector<cheap_line_type> lines_to_add;
|
||||||
std::vector<cheap_line_type> lines;
|
std::vector<cheap_line_type> lines;
|
||||||
std::vector<cheap_ball_type> balls;
|
std::vector<cheap_ball_type> balls;
|
||||||
|
@ -37,22 +38,37 @@ struct App{
|
||||||
App(){
|
App(){
|
||||||
online_sim.beat.notes.emplace_back(note_type::kQuarterNote, note_info{100.0f, 100.0f});
|
online_sim.beat.notes.emplace_back(note_type::kQuarterNote, note_info{100.0f, 100.0f});
|
||||||
|
|
||||||
AbstractLine line(Vec2{50.0f, 100.0f}, Vec2{150.0f, 200.0f}, simulation::kOneWay);
|
AbstractLine line(Vec2{50.0f, 100.0f}, Vec2{150.0f, 200.0f}, simulation::kOneWay, lineuid++);
|
||||||
add_line(line);
|
add_line(line);
|
||||||
}
|
}
|
||||||
|
|
||||||
void add_line(cheap_line_type const & line){
|
void add_line(cheap_line_type line){
|
||||||
|
line.ID = lineuid++;
|
||||||
|
std::cout << "adding line: " << line.ID << std::endl;
|
||||||
if(uberclient){
|
if(uberclient){
|
||||||
offline_sim.lines_to_add.push_back(line);
|
offline_sim.lines_to_add.push_back(line);
|
||||||
} else {
|
} else {
|
||||||
add_line(AbstractLine{
|
add_line(AbstractLine{
|
||||||
to_FloatVec2(line.starting_point),
|
to_FloatVec2(line.starting_point),
|
||||||
to_FloatVec2(line.end_point),
|
to_FloatVec2(line.end_point),
|
||||||
line.line_kind});
|
line.line_kind,
|
||||||
|
line.ID});
|
||||||
}
|
}
|
||||||
lines_changed();
|
lines_changed();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void remove_line(int ID){
|
||||||
|
if(uberclient){
|
||||||
|
offline_sim.lines_to_remove.push_back(ID);
|
||||||
|
} else {
|
||||||
|
auto& v = online_sim.sim.lines;
|
||||||
|
v.erase(std::remove_if(v.begin(), v.end(), [ID](line_type const &l){ return l.information == ID; }), v.end());
|
||||||
|
|
||||||
|
auto& v2 = online_sim.lines;
|
||||||
|
v2.erase(std::remove_if(v2.begin(), v2.end(), [ID](AbstractLine const &l){ return l.ID == ID; }), v2.end());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void add_line(AbstractLine const & line){
|
void add_line(AbstractLine const & line){
|
||||||
online_sim.lines.push_back(line);
|
online_sim.lines.push_back(line);
|
||||||
for(auto & l : line.calculate_lines()){
|
for(auto & l : line.calculate_lines()){
|
||||||
|
|
|
@ -10,7 +10,7 @@ using Vec2 = math::Vec2;
|
||||||
using LineKind = simulation::LineKind;
|
using LineKind = simulation::LineKind;
|
||||||
|
|
||||||
using ball_info = int;
|
using ball_info = int;
|
||||||
using line_info = void;
|
using line_info = int;
|
||||||
using ball_type = simulation::Ball<ball_info>;
|
using ball_type = simulation::Ball<ball_info>;
|
||||||
using line_type = simulation::Line<line_info>;
|
using line_type = simulation::Line<line_info>;
|
||||||
using simu_type = simulation::Simulation<ball_info, line_info>;
|
using simu_type = simulation::Simulation<ball_info, line_info>;
|
||||||
|
@ -19,18 +19,24 @@ using note_info = Vec2;
|
||||||
using note_type = Note<note_info>;
|
using note_type = Note<note_info>;
|
||||||
using beat_type = Beat<note_info>;
|
using beat_type = Beat<note_info>;
|
||||||
|
|
||||||
|
// Pretty unuseful in server
|
||||||
struct AbstractLine {
|
struct AbstractLine {
|
||||||
math::Vec2 starting_point;
|
math::Vec2 starting_point;
|
||||||
math::Vec2 end_point;
|
math::Vec2 end_point;
|
||||||
|
|
||||||
|
int ID;
|
||||||
int line_kind;
|
int line_kind;
|
||||||
|
|
||||||
const float hsize = 5.0f;
|
static constexpr float hsize = 5.0f;
|
||||||
|
|
||||||
AbstractLine() = default;
|
AbstractLine() = default;
|
||||||
|
AbstractLine(AbstractLine const&) = default;
|
||||||
|
AbstractLine& operator=(AbstractLine const&) = default;
|
||||||
|
|
||||||
AbstractLine(math::Vec2 starting_point, math::Vec2 end_point, int line_kind)
|
AbstractLine(math::Vec2 starting_point, math::Vec2 end_point, int line_kind, int ID)
|
||||||
: starting_point(starting_point)
|
: starting_point(starting_point)
|
||||||
, end_point(end_point)
|
, end_point(end_point)
|
||||||
|
, ID(ID)
|
||||||
, line_kind(line_kind)
|
, line_kind(line_kind)
|
||||||
{}
|
{}
|
||||||
|
|
||||||
|
@ -42,16 +48,16 @@ struct AbstractLine {
|
||||||
|
|
||||||
if(line_kind == simulation::kOneWay){
|
if(line_kind == simulation::kOneWay){
|
||||||
std::vector<line_type> ret;
|
std::vector<line_type> ret;
|
||||||
ret.emplace_back(starting_point + hsize*normal, end_point + hsize*normal, lk);
|
ret.emplace_back(starting_point + hsize*normal, end_point + hsize*normal, lk, ID);
|
||||||
ret.emplace_back(end_point + hsize*normal, end_point + hsize*dir, lk);
|
ret.emplace_back(end_point + hsize*normal, end_point + hsize*dir, lk, ID);
|
||||||
ret.emplace_back(end_point + hsize*dir, end_point - hsize*normal, lk);
|
ret.emplace_back(end_point + hsize*dir, end_point - hsize*normal, lk, ID);
|
||||||
ret.emplace_back(end_point - hsize*normal, starting_point - hsize*normal, lk);
|
ret.emplace_back(end_point - hsize*normal, starting_point - hsize*normal, lk, ID);
|
||||||
ret.emplace_back(starting_point - hsize*normal, starting_point - hsize*dir, lk);
|
ret.emplace_back(starting_point - hsize*normal, starting_point - hsize*dir, lk, ID);
|
||||||
ret.emplace_back(starting_point - hsize*dir, starting_point + hsize*normal, lk);
|
ret.emplace_back(starting_point - hsize*dir, starting_point + hsize*normal, lk, ID);
|
||||||
return ret;
|
return ret;
|
||||||
} else {
|
} else {
|
||||||
std::vector<line_type> ret;
|
std::vector<line_type> ret;
|
||||||
ret.emplace_back(starting_point, end_point, lk);
|
ret.emplace_back(starting_point, end_point, lk, ID);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -61,6 +67,7 @@ BOOST_FUSION_ADAPT_STRUCT(
|
||||||
AbstractLine,
|
AbstractLine,
|
||||||
(::math::Vec2, starting_point)
|
(::math::Vec2, starting_point)
|
||||||
(::math::Vec2, end_point)
|
(::math::Vec2, end_point)
|
||||||
|
(int, ID)
|
||||||
(int, line_kind)
|
(int, line_kind)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -94,12 +101,14 @@ BOOST_FUSION_ADAPT_STRUCT(
|
||||||
struct cheap_line_type {
|
struct cheap_line_type {
|
||||||
IntVec2 starting_point;
|
IntVec2 starting_point;
|
||||||
IntVec2 end_point;
|
IntVec2 end_point;
|
||||||
|
int ID;
|
||||||
int line_kind;
|
int line_kind;
|
||||||
|
|
||||||
cheap_line_type() = default;
|
cheap_line_type() = default;
|
||||||
cheap_line_type(AbstractLine const & l)
|
cheap_line_type(AbstractLine const & l)
|
||||||
: starting_point(l.starting_point)
|
: starting_point(l.starting_point)
|
||||||
, end_point(l.end_point)
|
, end_point(l.end_point)
|
||||||
|
, ID(l.ID)
|
||||||
, line_kind(l.line_kind)
|
, line_kind(l.line_kind)
|
||||||
{}
|
{}
|
||||||
};
|
};
|
||||||
|
@ -108,5 +117,6 @@ BOOST_FUSION_ADAPT_STRUCT(
|
||||||
cheap_line_type,
|
cheap_line_type,
|
||||||
(IntVec2, starting_point)
|
(IntVec2, starting_point)
|
||||||
(IntVec2, end_point)
|
(IntVec2, end_point)
|
||||||
|
(int, ID)
|
||||||
(int, line_kind)
|
(int, line_kind)
|
||||||
)
|
)
|
||||||
|
|
25
src/main.cpp
25
src/main.cpp
|
@ -55,6 +55,9 @@ websockets::TestProtocol<User> default_protocol{
|
||||||
app->add_line(from_json<cheap_line_type>(object["data"]));
|
app->add_line(from_json<cheap_line_type>(object["data"]));
|
||||||
std::cout << "Line from: " << &user << ": " << user.name << std::endl;
|
std::cout << "Line from: " << &user << ": " << user.name << std::endl;
|
||||||
request_write(binfo);
|
request_write(binfo);
|
||||||
|
} else if (command == "remove line"){
|
||||||
|
app->remove_line(from_json<int>(object["data"]));
|
||||||
|
request_write(binfo);
|
||||||
} else if (command == "update user") {
|
} else if (command == "update user") {
|
||||||
user = from_json<IncomingPacket>(object["data"]);
|
user = from_json<IncomingPacket>(object["data"]);
|
||||||
std::cout << "Updated user: " << &user << ": " << user.name << std::endl;
|
std::cout << "Updated user: " << &user << ": " << user.name << std::endl;
|
||||||
|
@ -80,11 +83,21 @@ websockets::TestProtocol<Empty> uberclient_protocol{
|
||||||
},
|
},
|
||||||
// write (will always come after receive)
|
// write (will always come after receive)
|
||||||
[](Empty& user, basic_websocket_info) -> std::string{
|
[](Empty& user, basic_websocket_info) -> std::string{
|
||||||
if(app->offline_sim.lines_to_add.empty()) return "";
|
if(!app->offline_sim.lines_to_remove.empty()){
|
||||||
auto it = app->offline_sim.lines_to_add.begin();
|
js::Object ret;
|
||||||
auto str = write_json(to_json(*it));
|
ret["command"] = "remove lines";
|
||||||
app->offline_sim.lines_to_add.erase(it);
|
ret["data"] = vector_to_json(app->offline_sim.lines_to_remove);
|
||||||
return str;
|
app->offline_sim.lines_to_remove.clear();
|
||||||
|
return write_json(ret);
|
||||||
|
}
|
||||||
|
if(!app->offline_sim.lines_to_add.empty()){
|
||||||
|
js::Object ret;
|
||||||
|
ret["command"] = "add lines";
|
||||||
|
ret["data"] = vector_to_json(app->offline_sim.lines_to_add);
|
||||||
|
app->offline_sim.lines_to_add.clear();
|
||||||
|
return write_json(ret);
|
||||||
|
}
|
||||||
|
return "";
|
||||||
},
|
},
|
||||||
// receive
|
// receive
|
||||||
[](Empty& user, std::string in, basic_websocket_info binfo){
|
[](Empty& user, std::string in, basic_websocket_info binfo){
|
||||||
|
@ -105,7 +118,7 @@ websockets::TestProtocol<Empty> uberclient_protocol{
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!app->offline_sim.lines_to_add.empty()){
|
if(!app->offline_sim.lines_to_add.empty() || !app->offline_sim.lines_to_remove.empty()){
|
||||||
request_write(binfo);
|
request_write(binfo);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Reference in a new issue