diff --git a/src/connector.cpp b/src/connector.cpp new file mode 100644 index 0000000..075d1ef --- /dev/null +++ b/src/connector.cpp @@ -0,0 +1,87 @@ +#include "connector.h" + +#include "helper.h" +#include "raymath.h" +#include "state.h" + +#include "button.h" +#include +#include + + +namespace VISEQ::GRAPH { + GraphItemType Connector::getType() { + return GraphItemType::CONNECTOR; + } + + std::shared_ptr Connector::getPtr(){ + return shared_from_this(); + } + + bool Connector::hovering() { + return partner.expired() && CheckCollisionPointCircle(SCREEN_MOUSE, position, radius); + } + + void Connector::setParent(std::shared_ptr _parent){ + parent = _parent; + } + + void Connector::setPosition(Vec2Df pos) { + center_position = pos; + parent_position = pos; + } + + void Connector::setOrbit(float r) { + orbit = r; + } + + void Connector::update() { + if(hovering()) state->pushEvent({getPtr(), APP::Interaction::HOVER}); + if(hovering() && clicked()) state->pushEvent({getPtr(), APP::Interaction::PICKUP}); + if(pickedUp()) state->pushEvent({getPtr(), APP::Interaction::DRAG}); + if(picked_up && released()) state->pushEvent({getPtr(), APP::Interaction::PUTDOWN}); + if(connected) { + state->pushEvent({getPtr(), APP::Interaction::CONNECT}); + connected = false; + } + + if(partner.expired()) { + position = center_position.orbitAlongVector(SCREEN_MOUSE, orbit); + position_text = center_position.orbitAlongVector(SCREEN_MOUSE, orbit+10); + } + if(!partner.expired()) { + position = center_position .orbitAlongVector(partner.lock()->position, orbit); + position_text = center_position.orbitAlongVector(partner.lock()->position, orbit+10); + } + if(new_partner) { + new_partner = false; + state->pushEvent({getPtr(), APP::Interaction::CONNECT}); + } + } + + void Connector::draw() { + BASE::Connectable::draw(); + float opacity = Clamp((400.0f - Clamp(position.dist(SCREEN_MOUSE), 0.0f, 400.0f)) / 400.0f, 0.0f, 1.0f); + float rotation = 0.0f; + + if(partner.expired()) rotation = HELPER::GetRotation(parent_position, SCREEN_MOUSE) + 90.0f; + if(!partner.expired()) { + rotation = HELPER::GetRotation(parent_position, partner.lock()->position) + 90.0f; + opacity = 1.0f; + } + if(connecting) opacity = 1.0f; + + if(partner.expired() && !connecting) ViTexButton(SCREEN_MOUSE, position, rotation, 8.0f, + TEXTURES::tex_connector, TEXTURES::tex_connector_hover, TEXTURES::tex_connector_pressed, + ColorLerp(Fade(VS_COLOR_WHITE, .0f), Fade(VS_COLOR_WHITE, 1.0f), opacity)); + + if(!partner.expired() || connecting) ViTexButton(SCREEN_MOUSE, position, rotation, 8.0f, + TEXTURES::tex_connector_connected, TEXTURES::tex_connector_hover, + ColorLerp(Fade(VS_COLOR_WHITE, .0f), Fade(VS_COLOR_WHITE, 1.0f), opacity)); + + //int partner_id = -1; + //if(!partner.expired()) partner_id = std::dynamic_pointer_cast(partner.lock())->id; + //DrawTextPro(GetFontDefault(), std::format("{} {}", id, partner_id).c_str(), position_text, (Vector2){0,0}, rotation, 10.0f, 2.0f, VS_COLOR_PINK); + //DrawText(std::format("{}", id), position + Vec2Df(100.0f,100.0f), 8.0f, Color(255, 0, 0)); + } +} diff --git a/src/connector.h b/src/connector.h index 21f8a96..ac04ed6 100644 --- a/src/connector.h +++ b/src/connector.h @@ -3,14 +3,10 @@ #include "connectable.h" #include "datatypes.h" #include "graph-item.h" -#include "helper.h" -//#include "interaction-event.h" -#include "raymath.h" -#include "state.h" #include "vmath.h" -#include "button.h" #include #include +#include namespace VISEQ::GRAPH { class Connector : public BASE::Connectable, public GraphItem, public std::enable_shared_from_this { @@ -20,6 +16,8 @@ namespace VISEQ::GRAPH { Connector(std::shared_ptr parent, Vec2Df center_position, float orbit) : orbit(orbit) { setPosition(center_position); setParent(parent); + _id++; + id = _id; } std::weak_ptr parent; @@ -30,69 +28,19 @@ namespace VISEQ::GRAPH { float orbit = 20.0f; Vec2Df center_position; Vec2Df parent_position; + Vec2Df position_text; + inline static int _id = 0; + int id = 0; - GraphItemType getType() override{ - return GraphItemType::CONNECTOR; - } + GraphItemType getType() override; - std::shared_ptr getPtr(){ - return shared_from_this(); - } + std::shared_ptr getPtr(); - virtual bool hovering() override { - return partner.expired() && CheckCollisionPointCircle(SCREEN_MOUSE, position, radius); - } - - void setParent(std::shared_ptr _parent){ - parent = _parent; - } - - void setPosition(Vec2Df pos) override { - center_position = pos; - parent_position = pos; - } - - void setOrbit(float r) { - orbit = r; - } - - void update() override { - if(hovering()) state->pushEvent({getPtr(), APP::Interaction::HOVER}); - if(hovering() && clicked()) state->pushEvent({getPtr(), APP::Interaction::PICKUP}); - if(pickedUp()) state->pushEvent({getPtr(), APP::Interaction::DRAG}); - if(picked_up && released()) state->pushEvent({getPtr(), APP::Interaction::PUTDOWN}); - if(connected) { - state->pushEvent({getPtr(), APP::Interaction::CONNECT}); - connected = false; - } - - if(partner.expired()) position = center_position.orbitAlongVector(SCREEN_MOUSE, orbit); - if(!partner.expired()) position = center_position .orbitAlongVector(partner.lock()->position, orbit); - if(new_partner) { - new_partner = false; - state->pushEvent({getPtr(), APP::Interaction::CONNECT}); - } - } - - void draw() override { - BASE::Connectable::draw(); - float opacity = Clamp((400.0f - Clamp(position.dist(SCREEN_MOUSE), 0.0f, 400.0f)) / 400.0f, 0.0f, 1.0f); - - float rotation; - if(partner.expired()) rotation = HELPER::GetRotation(parent_position, SCREEN_MOUSE) + 90.0f; - if(!partner.expired()) { - rotation = HELPER::GetRotation(position, partner.lock()->position) + 90.0f; - opacity = 1.0f; - } - if(connecting) opacity = 1.0f; - - if(partner.expired() && !connecting) ViTexButton(SCREEN_MOUSE, position, rotation, 8.0f, - TEXTURES::tex_connector, TEXTURES::tex_connector_hover, TEXTURES::tex_connector_pressed, - ColorLerp(Fade(VS_COLOR_WHITE, .0f), Fade(VS_COLOR_WHITE, 1.0f), opacity)); - - if(!partner.expired() || connecting) ViTexButton(SCREEN_MOUSE, position, rotation, 8.0f, - TEXTURES::tex_connector_connected, TEXTURES::tex_connector_hover, - ColorLerp(Fade(VS_COLOR_WHITE, .0f), Fade(VS_COLOR_WHITE, 1.0f), opacity)); - } + virtual bool hovering() override; + void setParent(std::shared_ptr _parent); + void setPosition(Vec2Df pos) override; + void setOrbit(float r); + void update() override; + void draw() override; }; } diff --git a/src/graph-manager.cpp b/src/graph-manager.cpp index 6d7751c..bff4b04 100644 --- a/src/graph-manager.cpp +++ b/src/graph-manager.cpp @@ -64,23 +64,17 @@ namespace VISEQ::GRAPH{ edges.back()->edgeType = et; edges.back()->start = from; edges.back()->end = to; - from.lock()->update(); - to.lock()->update(); + + from.lock()->connectors.back()->partner = to.lock()->getConnector(); + to.lock()->connectors.back()->partner = from.lock()->getConnector(); + edges.back()->start_conn = from.lock()->connectors.back(); edges.back()->end_conn = to.lock()->connectors.back(); - from.lock()->connections.push_back(edges.back()); to.lock()->connections.push_back(edges.back()); - - from.lock()->connectors.back()->partner = to.lock()->getConnector(); - to.lock()->connectors.back()->partner = from.lock()->getConnector(); - - if(to.lock()->connectors.back()->partner.expired()) std::cout << "expired" << std::endl; - else std::cout << "not expired" << std::endl; } - std::cout << "add connection" << std::endl; } void GraphManager::addToSelection(){ @@ -210,10 +204,15 @@ namespace VISEQ::GRAPH{ return edges.back(); } - WPTR_Node GraphManager::next(WPTR_Node current, WPTR_Node last){ - VEC_WPTR_Edge possible_connections = current.lock()->connections | RANGE_FILTER([current](WPTR_Edge c){ - return (c.lock()->getEdgeType() == EdgeType::MIDIEDGE) && ((c.lock()->start.lock() == current.lock() && c.lock()->pass_forward) || (c.lock()->end.lock() == current.lock() && c.lock()->pass_backward)); + VEC_WPTR_Edge GraphManager::getPassableConnections(WPTR_Node node){ + VEC_WPTR_Edge passable_connections = node.lock()->connections | RANGE_FILTER([node](WPTR_Edge c){ + return (c.lock()->getEdgeType() == EdgeType::MIDIEDGE) && ((c.lock()->start.lock() == node.lock() && c.lock()->pass_forward) || (c.lock()->end.lock() == node.lock() && c.lock()->pass_backward)); }) | std::ranges::to(); + return passable_connections; + } + + WPTR_Node GraphManager::next(WPTR_Node current, WPTR_Node last){ + VEC_WPTR_Edge possible_connections = getPassableConnections(current); if(possible_connections.empty()) return SPTR_Node(nullptr); @@ -368,8 +367,8 @@ namespace VISEQ::GRAPH{ if(v1_v2_distance < 100) c->switches_offset = v1_v2_distance/2.3f; Vec2Df from_to_handle = c->start.lock()->position - ((c->start.lock()->position - c->end.lock()->position)).norm()*45.0f; Vec2Df to_from_handle = c->end.lock()->position - ((c->end.lock()->position - c->start.lock()->position)).norm()*45.0f; - Vec2Df middle_handle_2 = c->end.lock()->position - ((c->end.lock()->position - c->start.lock()->position)).norm()*65.0f; - Vec2Df middle_handle = c->start.lock()->position - ((c->start.lock()->position - c->end.lock()->position)).norm()*65.0f; + //Vec2Df middle_handle_2 = c->end.lock()->position - ((c->end.lock()->position - c->start.lock()->position)).norm()*65.0f; + //Vec2Df middle_handle = c->start.lock()->position - ((c->start.lock()->position - c->end.lock()->position)).norm()*65.0f; Vec2Df center_handle = c->end.lock()->position - ((c->end.lock()->position - c->start.lock()->position))*0.5f; Vec2Df delete_position = center_handle + (c->start.lock()->position - c->end.lock()->position).norm().orth() * 12.0f; @@ -390,7 +389,7 @@ namespace VISEQ::GRAPH{ Color col = {229, 181, 103, 255}; if(c->GActive()) col = {108, 153, 187, 255}; DrawLine(v1_position.x, v1_position.y, v2_position.x, v2_position.y, col); - { + if(state->draw_edge_lengths){ float d = c->start.lock()->position.dist(c->end.lock()->position); std::string frac = MIDI::Fractions.at(std::clamp(round(d/60) - 1, 0, 31)); Vector2 text_length = MeasureTextEx(GetFontDefault(), std::format("{:.1f}",d).c_str(), 10.0f, 2.0f); diff --git a/src/graph-manager.h b/src/graph-manager.h index 1292080..806d244 100644 --- a/src/graph-manager.h +++ b/src/graph-manager.h @@ -67,6 +67,7 @@ namespace VISEQ::GRAPH { SPTR_Node getClosestNode(Vec2Df position); VEC_WPTR_Node getNodesByID(int _id); WPTR_Edge lastEdge(); + VEC_WPTR_Edge getPassableConnections(WPTR_Node node); WPTR_Node next(WPTR_Node current, WPTR_Node last); void splitEdge(SPTR_Edge edge); void splitEdges(); diff --git a/src/interaction-manager.cpp b/src/interaction-manager.cpp index 64fcbd9..2f0ac8f 100644 --- a/src/interaction-manager.cpp +++ b/src/interaction-manager.cpp @@ -32,7 +32,10 @@ namespace VISEQ::INTERACTION{ if(KEYS_DOWN.shift && IsKeyPressed(KEY_TAB)) { gm->cycleModeOfSelectedNodes(false); } - + + if(IsKeyPressed(KEY_V)){ + state->draw_edge_lengths = !state->draw_edge_lengths; + } } void InteractionManager::draw(){ diff --git a/src/midi-node.cpp b/src/midi-node.cpp index 0f35dcf..6bbb774 100644 --- a/src/midi-node.cpp +++ b/src/midi-node.cpp @@ -274,23 +274,23 @@ namespace VISEQ::GRAPH::NODES { VMATH::Vec2D desc_position = position + VMATH::Vec2D(radius + 7.0f, radius + 7.0f); switch(mode){ case NOTE:{ - if(!KEYS_DOWN.shift && !KEYS_DOWN.alt) DrawCenteredText(MIDI::Notes[getNotes().note], position, 12, WHITE); - if(!KEYS_DOWN.ctrl && KEYS_DOWN.shift && !KEYS_DOWN.alt) DrawCenteredText(std::format("{}", getNotes().velocity), position, 12, WHITE); + if(!KEYS_DOWN.shift && !KEYS_DOWN.alt) DrawCenteredText(MIDI::Notes[getNotes().note], position, 12, VS_COLOR_BLACK); + if(!KEYS_DOWN.ctrl && KEYS_DOWN.shift && !KEYS_DOWN.alt) DrawCenteredText(std::format("{}", getNotes().velocity), position, 12, VS_COLOR_BLACK); - if(!KEYS_DOWN.ctrl && !KEYS_DOWN.shift && KEYS_DOWN.alt) DrawCenteredText(std::format("{:.1f}s", (float)getNotes().gate / 1000.f), position, 12, WHITE); - if(KEYS_DOWN.ctrl && !KEYS_DOWN.shift && KEYS_DOWN.alt) DrawCenteredText(std::format("{:.2f}s", (float)getNotes().gate / 1000.f), position, 12, WHITE); - if(!KEYS_DOWN.ctrl && KEYS_DOWN.shift && KEYS_DOWN.alt) DrawCenteredText(std::format("{:.2f}s", (float)getNotes().gate / 1000.f), position, 12, WHITE); - if(KEYS_DOWN.ctrl && KEYS_DOWN.shift && KEYS_DOWN.alt) DrawCenteredText(std::format("{:.3f}s", (float)getNotes().gate / 1000.f), position, 12, WHITE); + if(!KEYS_DOWN.ctrl && !KEYS_DOWN.shift && KEYS_DOWN.alt) DrawCenteredText(std::format("{:.1f}s", (float)getNotes().gate / 1000.f), position, 12, VS_COLOR_BLACK); + if(KEYS_DOWN.ctrl && !KEYS_DOWN.shift && KEYS_DOWN.alt) DrawCenteredText(std::format("{:.2f}s", (float)getNotes().gate / 1000.f), position, 12, VS_COLOR_BLACK); + if(!KEYS_DOWN.ctrl && KEYS_DOWN.shift && KEYS_DOWN.alt) DrawCenteredText(std::format("{:.2f}s", (float)getNotes().gate / 1000.f), position, 12, VS_COLOR_BLACK); + if(KEYS_DOWN.ctrl && KEYS_DOWN.shift && KEYS_DOWN.alt) DrawCenteredText(std::format("{:.3f}s", (float)getNotes().gate / 1000.f), position, 12, VS_COLOR_BLACK); if(selected){ - if(!KEYS_DOWN.ctrl && !KEYS_DOWN.shift && !KEYS_DOWN.alt) DrawText("NOTE", desc_position, 8, WHITE); - if(KEYS_DOWN.ctrl && !KEYS_DOWN.shift && !KEYS_DOWN.alt) DrawText("VALUE", desc_position, 8, WHITE); - if(!KEYS_DOWN.ctrl && KEYS_DOWN.shift && !KEYS_DOWN.alt) DrawText("VELOCITY", desc_position, 8, WHITE); + if(!KEYS_DOWN.ctrl && !KEYS_DOWN.shift && !KEYS_DOWN.alt) DrawText("NOTE", desc_position, 8, VS_COLOR_BLACK); + if(KEYS_DOWN.ctrl && !KEYS_DOWN.shift && !KEYS_DOWN.alt) DrawText("VALUE", desc_position, 8, VS_COLOR_BLACK); + if(!KEYS_DOWN.ctrl && KEYS_DOWN.shift && !KEYS_DOWN.alt) DrawText("VELOCITY", desc_position, 8, VS_COLOR_BLACK); - if(!KEYS_DOWN.ctrl && !KEYS_DOWN.shift && KEYS_DOWN.alt) DrawText("GATE 0.1s", desc_position, 8, WHITE); - if(KEYS_DOWN.ctrl && !KEYS_DOWN.shift && KEYS_DOWN.alt) DrawText("GATE 1.0s", desc_position, 8, WHITE); - if(!KEYS_DOWN.ctrl && KEYS_DOWN.shift && KEYS_DOWN.alt) DrawText("GATE 0.01s", desc_position, 8, WHITE); - if(KEYS_DOWN.ctrl && KEYS_DOWN.shift && KEYS_DOWN.alt) DrawText("GATE 0.001s", desc_position, 8, WHITE); + if(!KEYS_DOWN.ctrl && !KEYS_DOWN.shift && KEYS_DOWN.alt) DrawText("GATE 0.1s", desc_position, 8, VS_COLOR_BLACK); + if(KEYS_DOWN.ctrl && !KEYS_DOWN.shift && KEYS_DOWN.alt) DrawText("GATE 1.0s", desc_position, 8, VS_COLOR_BLACK); + if(!KEYS_DOWN.ctrl && KEYS_DOWN.shift && KEYS_DOWN.alt) DrawText("GATE 0.01s", desc_position, 8, VS_COLOR_BLACK); + if(KEYS_DOWN.ctrl && KEYS_DOWN.shift && KEYS_DOWN.alt) DrawText("GATE 0.001s", desc_position, 8, VS_COLOR_BLACK); } break;} case CC:{ diff --git a/src/node.cpp b/src/node.cpp index bd735e9..2cb4f46 100644 --- a/src/node.cpp +++ b/src/node.cpp @@ -72,7 +72,6 @@ namespace VISEQ::GRAPH::NODES { return c; } } - addConnector(); return connectors.back(); } diff --git a/src/state.h b/src/state.h index 56af850..fc46af1 100644 --- a/src/state.h +++ b/src/state.h @@ -66,6 +66,7 @@ namespace VISEQ::APP{ int node_mode = 0; bool context_menu = false; + bool draw_edge_lengths = false; bool hovering = false;