two direction connections with blockers working
This commit is contained in:
@@ -0,0 +1,10 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "raylib.h"
|
||||||
|
#include "raymath.h"
|
||||||
|
|
||||||
|
inline bool ViButton(float x, float y, float radius, Color color){
|
||||||
|
Vector2 mp = GetMousePosition();
|
||||||
|
DrawCircle(x,y,radius, color);
|
||||||
|
return (Vector2Distance(mp, (Vector2){x,y}) < radius && IsMouseButtonPressed(MOUSE_BUTTON_LEFT));
|
||||||
|
}
|
||||||
@@ -0,0 +1,44 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "connection.h"
|
||||||
|
#include <map>
|
||||||
|
|
||||||
|
class ConnectionManager{
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
ConnectionManager() {}
|
||||||
|
|
||||||
|
std::vector<Connection> connections;
|
||||||
|
|
||||||
|
std::map<Node*, int> counter;
|
||||||
|
|
||||||
|
Node* next(Node* current){
|
||||||
|
std::vector<Connection*> paths;
|
||||||
|
|
||||||
|
for(auto& p : connections){
|
||||||
|
if((p.v1 == current && p.v1_v2) || (p.v2 == current && p.v2_v1)) {
|
||||||
|
p.active = false;
|
||||||
|
paths.push_back(&p);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(paths.empty()) return nullptr;
|
||||||
|
|
||||||
|
int return_path = 0;
|
||||||
|
if(counter.find(current) == counter.end()) {
|
||||||
|
counter[current] = 0;
|
||||||
|
} else {
|
||||||
|
counter[current] = (counter[current] + 1) % paths.size();
|
||||||
|
return_path = counter[current];
|
||||||
|
}
|
||||||
|
paths[return_path]->active = true;
|
||||||
|
return paths[return_path]->v1 == current ? paths[return_path]->v2 : paths[return_path]->v1;
|
||||||
|
}
|
||||||
|
|
||||||
|
void draw(){
|
||||||
|
for(auto& c : connections){
|
||||||
|
c.draw();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
+21
-5
@@ -1,17 +1,33 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#include "button.h"
|
||||||
#include "node.h"
|
#include "node.h"
|
||||||
|
|
||||||
class Connection{
|
class Connection{
|
||||||
|
|
||||||
public:
|
public:
|
||||||
Connection() {}
|
Connection() {}
|
||||||
Connection(Node* from, Node* to) : from(from), to(to) {}
|
Connection(Node* v1, Node* v2) : v1(v1), v2(v2) {}
|
||||||
|
|
||||||
|
Node* v1;
|
||||||
|
Node* v2;
|
||||||
|
|
||||||
|
bool v1_v2 = true;
|
||||||
|
bool v2_v1 = true;
|
||||||
|
bool active = false;
|
||||||
|
|
||||||
Node* from;
|
|
||||||
Node* to;
|
|
||||||
|
|
||||||
void draw(){
|
void draw(){
|
||||||
|
Vec2D<float> v1_position = v1->position - ((v1->position - v2->position)).norm() * (v1->radius + 10.0f);
|
||||||
|
Vec2D<float> v2_position = v2->position - ((v2->position - v1->position)).norm() * (v2->radius + 10.0f);
|
||||||
|
|
||||||
|
Color c = {229, 181, 103, 255};
|
||||||
|
if(active) c = {108, 153, 187, 255};
|
||||||
|
DrawLine(v1_position.x, v1_position.y, v2_position.x, v2_position.y, c);
|
||||||
|
|
||||||
|
Vec2D<float> from_to_handle = v1->position - ((v1->position - v2->position)).norm() * (v1->radius + 35);
|
||||||
|
Vec2D<float> to_from_handle = v2->position - ((v2->position - v1->position)).norm() * (v2->radius + 35);
|
||||||
|
|
||||||
|
if(ViButton(from_to_handle.x, from_to_handle.y, 8.0f, v1_v2 ? (Color){232, 125, 62, 255} : (Color){232, 50, 32, 255} )) v1_v2 = !v1_v2;
|
||||||
|
if(ViButton(to_from_handle.x, to_from_handle.y, 8.0f, v2_v1 ? (Color){232, 125, 62, 255} : (Color){232, 50, 32, 255} )) v2_v1 = !v2_v1;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
+15
-17
@@ -34,6 +34,9 @@
|
|||||||
|
|
||||||
#include "node.h"
|
#include "node.h"
|
||||||
#include "signal.h"
|
#include "signal.h"
|
||||||
|
#include "connection.h"
|
||||||
|
|
||||||
|
#include "connection-manager.h"
|
||||||
|
|
||||||
libremidi::observer obs;
|
libremidi::observer obs;
|
||||||
libremidi::midi_out midi_out;
|
libremidi::midi_out midi_out;
|
||||||
@@ -43,8 +46,8 @@ std::vector<libremidi::output_port> midi_out_ports;
|
|||||||
|
|
||||||
std::vector<Node> nodes;
|
std::vector<Node> nodes;
|
||||||
std::vector<Signal> signals;
|
std::vector<Signal> signals;
|
||||||
|
//std::vector<Connection> connections;
|
||||||
//std::map<Movable*, std::vector<Node*>> connections;
|
ConnectionManager cm;
|
||||||
|
|
||||||
Vec2D<float> mouse_pos;
|
Vec2D<float> mouse_pos;
|
||||||
Vec2D<float> drag_start;
|
Vec2D<float> drag_start;
|
||||||
@@ -99,7 +102,7 @@ int main(){
|
|||||||
}
|
}
|
||||||
|
|
||||||
for(int i = 0; i < 2; i++){
|
for(int i = 0; i < 2; i++){
|
||||||
signals.emplace(signals.end(), Signal(0, 0, 5.0f, 2.0f));
|
signals.emplace(signals.end(), Signal(1280, 720, 5.0f, 2.0f));
|
||||||
signals[i].next = &nodes[0];
|
signals[i].next = &nodes[0];
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -108,7 +111,7 @@ int main(){
|
|||||||
Vec2D<float> drag_offset;
|
Vec2D<float> drag_offset;
|
||||||
|
|
||||||
Node* connecting_from;
|
Node* connecting_from;
|
||||||
|
|
||||||
while(!WindowShouldClose()){
|
while(!WindowShouldClose()){
|
||||||
|
|
||||||
Vector2 mp = GetScreenToWorld2D(GetMousePosition(), camera);
|
Vector2 mp = GetScreenToWorld2D(GetMousePosition(), camera);
|
||||||
@@ -155,9 +158,9 @@ int main(){
|
|||||||
}
|
}
|
||||||
|
|
||||||
if(mouse_released && (n.hover_connect || n.hover_move)) {
|
if(mouse_released && (n.hover_connect || n.hover_move)) {
|
||||||
if(&n != connecting_from){
|
if(&n != connecting_from && connecting_from != nullptr){
|
||||||
n.connections.push_back(connecting_from);
|
cm.connections.emplace(cm.connections.end(), connecting_from, &n);
|
||||||
connecting_from->connections.push_back(&n);
|
connecting_from = nullptr;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -182,19 +185,14 @@ int main(){
|
|||||||
n.draw(&mouse_pos);
|
n.draw(&mouse_pos);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*for( auto from : connections){*/
|
cm.draw();
|
||||||
/* for( auto to : from.second){*/
|
|
||||||
/* Vec2D<float> from_position = from.first->position - ((from.first->position - to->position)).norm() * (from.first->radius + 10.0f);*/
|
|
||||||
/* Vec2D<float> to_position = to->position - ((to->position - from.first->position)).norm() * (to->radius + 10.0f);*/
|
|
||||||
/* DrawLine(from_position.x, from_position.y, to_position.x, to_position.y, (Color){229, 181, 103, 255});*/
|
|
||||||
/* }*/
|
|
||||||
/*}*/
|
|
||||||
|
|
||||||
for( auto& s : signals){
|
for(auto& s : signals){
|
||||||
s.direction = s.next->position - s.position;
|
s.direction = s.next->position - s.position;
|
||||||
if(s.position.dist(&s.next->position) < s.speed * 1.5) {
|
if(s.position.dist(&s.next->position) < s.speed * 1.5) {
|
||||||
if(s.next->connections.size() > 0) {
|
Node* n = cm.next(s.next);
|
||||||
s.next = s.next->get_next();
|
if(n != s.next && n != nullptr) {
|
||||||
|
s.next = n;
|
||||||
midi_out.send_message(libremidi::channel_events::control_change(2, 10, 50));
|
midi_out.send_message(libremidi::channel_events::control_change(2, 10, 50));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+11
-11
@@ -22,19 +22,19 @@ class Node : public Movable{
|
|||||||
bool hover_connect = false;
|
bool hover_connect = false;
|
||||||
bool connecting = false;
|
bool connecting = false;
|
||||||
|
|
||||||
int next = 0;
|
// int next = 0;
|
||||||
|
|
||||||
int midi_out = 0;
|
int midi_out = 0;
|
||||||
|
|
||||||
int midi_note = 0;
|
int midi_note = 0;
|
||||||
int midi_cc = 0;
|
int midi_cc = 0;
|
||||||
|
|
||||||
std::vector<Node*> connections;
|
// std::vector<Node*> connections;
|
||||||
|
|
||||||
Node* get_next(){
|
/*Node* get_next(){*/
|
||||||
next = (next+1) % connections.size();
|
/* next = (next+1) % connections.size();*/
|
||||||
return connections[next];
|
/* return connections[next];*/
|
||||||
}
|
/*}*/
|
||||||
|
|
||||||
void draw(Vec2D<float> *mouse) {
|
void draw(Vec2D<float> *mouse) {
|
||||||
if(!hover_move) DrawCircle(position.x, position.y, radius, (Color){180, 210, 115, 255});
|
if(!hover_move) DrawCircle(position.x, position.y, radius, (Color){180, 210, 115, 255});
|
||||||
@@ -42,11 +42,11 @@ class Node : public Movable{
|
|||||||
|
|
||||||
Vec2D<float> connector = position - ((position - *mouse)).norm() * (radius + R);
|
Vec2D<float> connector = position - ((position - *mouse)).norm() * (radius + R);
|
||||||
|
|
||||||
for(auto& to : connections){
|
/*for(auto& to : connections){*/
|
||||||
Vec2D<float> from_position = position - ((position - to->position)).norm() * (radius + 10.0f);
|
/* Vec2D<float> from_position = position - ((position - to->position)).norm() * (radius + 10.0f);*/
|
||||||
Vec2D<float> to_position = to->position - ((to->position - position)).norm() * (to->radius + 10.0f);
|
/* Vec2D<float> to_position = to->position - ((to->position - position)).norm() * (to->radius + 10.0f);*/
|
||||||
DrawLine(from_position.x, from_position.y, to_position.x, to_position.y, (Color){229, 181, 103, 255});
|
/* DrawLine(from_position.x, from_position.y, to_position.x, to_position.y, (Color){229, 181, 103, 255});*/
|
||||||
}
|
/*}*/
|
||||||
|
|
||||||
if(hover_connect){
|
if(hover_connect){
|
||||||
DrawCircleLines(position.x, position.y, radius + R, (Color){108, 153, 187, 255});
|
DrawCircleLines(position.x, position.y, radius + R, (Color){108, 153, 187, 255});
|
||||||
|
|||||||
Reference in New Issue
Block a user