diff --git a/src/graph-manager.h b/src/graph-manager.h index aac1e15..06e548f 100644 --- a/src/graph-manager.h +++ b/src/graph-manager.h @@ -142,6 +142,12 @@ namespace VISEQ::GRAPH { return possible_connections.at(return_path)->getNextNode(current); } + SPTR_Node getClosestNode(Vec2Df position){ + auto neighbors = nodes | RANGE_FILTER([](SPTR_Node n){ return !n->dragging;}) | std::ranges::to(); + std::sort(neighbors.begin(), neighbors.end(), [position](SPTR_Node na, SPTR_Node nb){ return na->position.dist(position) < nb->position.dist(position);}); + return neighbors.front(); + } + void addConnection(SPTR_Node from, SPTR_Node to){ if(from != to) { edges.emplace_back(std::make_shared()); diff --git a/src/main.cpp b/src/main.cpp index dcec8a3..0ede488 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -86,9 +86,15 @@ int main(){ app.settings = graph.at("settings"); // app.gm = graph["graphmanager"].get(); + int highest_id = 0; + std::shared_ptr hid; for(auto n : graph.at("graphmanager").at("nodes")){ std::shared_ptr mn = n; app.gm.nodes.push_back(mn); + if(mn->id > highest_id) { + highest_id = mn->id; + hid = mn; + } std::cout << std::format("adding node {}", mn->id) << std::endl; } @@ -312,9 +318,25 @@ int main(){ case InteractionState::CONNECT_NODE: { Vec2Df connector_position = connecting_nodes.front()->position - ((connecting_nodes.front()->position - mouse_pos)).norm() * (connecting_nodes.front()->radius + 14.0f); + Vec2Df target_position = mouse_pos; + if(IsKeyDown(KEY_LEFT_CONTROL)) { + target_position.x = round((mouse_pos.x) / app.settings.grid) * app.settings.grid; + target_position.y = round((mouse_pos.y) / app.settings.grid) * app.settings.grid; + } else if(IsKeyDown(KEY_LEFT_SHIFT)){ + std::shared_ptr closest = app.gm.getClosestNode(mouse_pos); + float steps = round((closest->position.dist(mouse_pos)) / app.settings.grid) * app.settings.grid; + float pol_r = steps; + float pol_theta = Vector2Angle(Vec2Df{1,0},(mouse_pos - closest->position)); + + Vec2Df polar = VISEQ::VMATH::polarToCartesian(pol_r, pol_theta); + target_position = closest->position + polar; + } else { + target_position = mouse_pos; + } + if(connecting_nodes.front()->connecting && mouse_down){ - DrawLine(connector_position.x, connector_position.y, mouse_pos.x, mouse_pos.y, (Color){229, 181, 103, 255}); + DrawLine(connector_position.x, connector_position.y, target_position.x, target_position.y, (Color){229, 181, 103, 255}); connecting_nodes.front()->hovering = true; connecting_nodes.front()->hover_connect = true; } @@ -332,8 +354,7 @@ int main(){ } else if(!hovering_connectors.empty()){ app.gm.addConnection(connecting_nodes.front(), hovering_connectors.front()); } else { - //SPTR_Node new_node = app.gm.addMidiNode(mouse_pos); - SPTR_Node new_node = app.gm.copyNode(std::dynamic_pointer_cast(connecting_nodes.front()), mouse_pos); + SPTR_Node new_node = app.gm.copyNode(std::dynamic_pointer_cast(connecting_nodes.front()), target_position); new_node->connecting = false; app.gm.addConnection(connecting_nodes.front(), new_node); } @@ -422,7 +443,7 @@ int main(){ } } } - if(hovering_nodes.empty()){ + if(!IsKeyDown(KEY_LEFT_SHIFT) && !IsKeyDown(KEY_LEFT_CONTROL) && !IsKeyDown(KEY_LEFT_ALT)){ Vector2 mouseWorldPos = GetScreenToWorld2D(GetMousePosition(), camera); camera.offset = GetMousePosition(); camera.target = mouseWorldPos;