split edge: check, copy paste: check with a little bug
This commit is contained in:
+39
-25
@@ -13,6 +13,7 @@
|
||||
|
||||
#include <algorithm>
|
||||
#include <cstdio>
|
||||
#include <iostream>
|
||||
#include <iterator>
|
||||
#include <map>
|
||||
#include <memory>
|
||||
@@ -30,6 +31,7 @@ class GraphManager{
|
||||
VEC_SPTR_Edge edges;
|
||||
|
||||
VEC_SPTR_Edge remove_edges;
|
||||
VEC_SPTR_Edge split_edges;
|
||||
|
||||
std::map<SPTR_Node, int> counter;
|
||||
|
||||
@@ -45,32 +47,32 @@ class GraphManager{
|
||||
return std::dynamic_pointer_cast<Edge>(o.front());
|
||||
}
|
||||
|
||||
void copyNodes(VEC_SPTR_Node nodes, Vec2D<float> position){
|
||||
for(auto n: nodes){
|
||||
auto nc = std::make_shared<Node>(*n);
|
||||
nc->position = position + nc->drag_offset;
|
||||
nc->selected = true;
|
||||
nodes.push_back(nc);
|
||||
void copyNodes(VEC_SPTR_Node _nodes, Vec2D<float> position){
|
||||
for(auto n: _nodes){
|
||||
nodes.insert(nodes.end(), std::make_shared<Node>(*n));
|
||||
nodes.back()->setPosition(position + nodes.back()->drag_offset);
|
||||
nodes.back()->selected = false;
|
||||
}
|
||||
}
|
||||
|
||||
void copyNodes(std::vector<std::shared_ptr<MidiNode>> nodes, Vec2D<float> position){
|
||||
for(auto n: nodes){
|
||||
std::shared_ptr<MidiNode> nc = std::make_shared<MidiNode>(*n);
|
||||
nc->position = position + nc->drag_offset;
|
||||
nc->selected = true;
|
||||
nodes.push_back(nc);
|
||||
void copyNodes(std::vector<std::shared_ptr<MidiNode>> _nodes, Vec2D<float> position){
|
||||
for(auto n: _nodes){
|
||||
nodes.insert(nodes.end(), std::make_shared<MidiNode>(*n));
|
||||
nodes.back()->setPosition(position + nodes.back()->drag_offset);
|
||||
nodes.back()->selected = false;
|
||||
}
|
||||
}
|
||||
|
||||
SPTR_Node copyNode(SPTR_Node n, Vec2D<float> position){
|
||||
nodes.emplace_back(std::make_shared<Node>(*n));
|
||||
std::cout << "copy basenode" << std::endl;
|
||||
nodes.insert(nodes.end(), std::make_shared<Node>(*n));
|
||||
nodes.back()->setPosition(position);
|
||||
return nodes.back();
|
||||
}
|
||||
|
||||
std::shared_ptr<Node> copyNode(std::shared_ptr<MidiNode> n, Vec2D<float> position){
|
||||
nodes.emplace_back(std::make_shared<Node>(*n));
|
||||
SPTR_Node copyNode(std::shared_ptr<MidiNode> n, Vec2D<float> position){
|
||||
std::cout << "copy midinode" << std::endl;
|
||||
nodes.insert(nodes.end(), std::make_shared<MidiNode>(*n));
|
||||
nodes.back()->setPosition(position);
|
||||
return nodes.back();
|
||||
}
|
||||
@@ -131,15 +133,28 @@ class GraphManager{
|
||||
}
|
||||
|
||||
void addConnection(SPTR_Node from, SPTR_Node to){
|
||||
edges.emplace_back(std::make_shared<Edge>());
|
||||
edges.back()->start = from;
|
||||
edges.back()->end = to;
|
||||
from->connections.push_back(edges.back());
|
||||
to->connections.push_back(edges.back());
|
||||
if(from != to) {
|
||||
edges.emplace_back(std::make_shared<Edge>());
|
||||
edges.back()->start = from;
|
||||
edges.back()->end = to;
|
||||
from->connections.push_back(edges.back());
|
||||
to->connections.push_back(edges.back());
|
||||
}
|
||||
}
|
||||
|
||||
void splitEdge(SPTR_Edge edge){
|
||||
|
||||
split_edges.push_back(edge);
|
||||
}
|
||||
|
||||
void splitEdges(){
|
||||
for(auto s : split_edges){
|
||||
Vec2D<float> center = s->end->position.center(s->start->position);
|
||||
SPTR_Node cn = addMidiNode(center);
|
||||
addConnection(s->start, cn);
|
||||
addConnection(cn, s->end);
|
||||
remove_edges.push_back(s);
|
||||
}
|
||||
split_edges.clear();
|
||||
}
|
||||
|
||||
void removeEdge(SPTR_Edge edge){
|
||||
@@ -152,12 +167,13 @@ class GraphManager{
|
||||
std::erase(edge->end->connections, edge);
|
||||
std::erase(edges, edge);
|
||||
}
|
||||
remove_edges.clear();
|
||||
}
|
||||
|
||||
void drawEdges(Vec2D<float> mouse_pos, Camera2D cam){
|
||||
// std::erase_if(connections, [](Connection c){ return c.remove == true;});
|
||||
if(!remove_edges.empty()) removeEdges();
|
||||
for(auto& c : edges){
|
||||
if(!split_edges.empty()) splitEdges();
|
||||
for(auto c : edges){
|
||||
Vec2D<float> v1_position = c->start->position - ((c->start->position - c->end->position)).norm() * (c->start->radius + c->connector_offset);
|
||||
Vec2D<float> v2_position = c->end->position - ((c->end->position - c->start->position)).norm() * (c->end->radius + c->connector_offset);
|
||||
float v1_v2_distance = v1_position.dist(&v2_position);
|
||||
@@ -185,7 +201,6 @@ class GraphManager{
|
||||
Vec2D<float> flip_handle = middle_handle + (v1_position - v2_position).norm().orth() * (v1_v2_distance < 120.0f ? Clamp((120.0f - v1_v2_distance)*0.2, 0.f, 20.f) : 1.0f);
|
||||
Vec2D<float> flip_handle_2 = middle_handle_2 + (v1_position - v2_position).norm().orth() * (v1_v2_distance < 120.0f ? Clamp((120.0f - v1_v2_distance)*-0.2, -20.f, 0.f) : 1.0f);
|
||||
|
||||
|
||||
// Dynamic opacity by distance to mouse
|
||||
unsigned char opacity = 150.0f - Clamp(middle_handle.dist(mouse_pos), 0.0f, 150.0f);
|
||||
unsigned char opacity_from = 250.0f - Clamp(from_to_handle.dist(mouse_pos), 0.0f, 220.0f);
|
||||
@@ -208,7 +223,6 @@ class GraphManager{
|
||||
DrawLineEx(block_point1, block_point2, 2.0f, (Color){232,232,232,opacity_to});
|
||||
}
|
||||
|
||||
|
||||
if(ViButton(mouse_pos, flip_handle.x, flip_handle.y, 8.0f, (Color){232, 50, 32, opacity} )) removeEdge(c);
|
||||
if(ViButton(mouse_pos, flip_handle_2.x, flip_handle_2.y, 8.0f, (Color){232, 125, 62, opacity} )) splitEdge(c);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user