connecting rewritten with vector view, mousewheel + ctrl changes notes

This commit is contained in:
Sebastian
2024-10-24 00:39:39 +02:00
parent 0815db411e
commit 79c3de9d97
2 changed files with 90 additions and 52 deletions
+3 -3
View File
@@ -1,8 +1,8 @@
CXX = g++
CXXFLAGS = -std=c++20 -Wall -g -fno-omit-frame-pointer -gdwarf-4 -Og -Wnarrowing
CXXINC = -I/usr/lib/gcc/x86_64-pc-linux-gnu/13.3.0/include -Iinclude
CXXFLAGS = -std=c++20 -Wall -g -fno-omit-frame-pointer -gdwarf-4 -Og -Wnarrowing -DLIBREMIDI_ALSA=1
CXXINC = -Iinclude
LDLIBS = -lraylib
LDLIBS = -lraylib -lasound -pthread
LDFLAGS = -Llib -L/usr/lib -L/usr/local/lib
hdr_files = ${wildcard src/*.h}
+79 -41
View File
@@ -19,6 +19,7 @@
#include "datatypes.h"
#include "signal-manager.h"
#include <format>
#include <iterator>
#include <ranges>
#include <raylib.h>
#include <raymath.h>
@@ -101,13 +102,13 @@ int main(){
SetTargetFPS(app.fps);
ToggleFullscreen();
nodes.reserve(1000);
for(int i = 0; i < 4; ++i){
nodes.emplace(nodes.end(), Node((float)i * app.grid + 10 * app.grid, 5 * app.grid, 15.0f));
nodes.emplace_back((float)i * app.grid + 10 * app.grid, 5 * app.grid, 15.0f);
}
for(int i = 3; i >= 0; --i){
nodes.emplace(nodes.end(), Node((float)i * app.grid + 10 * app.grid, 6 * app.grid, 15.0f));
nodes.emplace_back((float)i * app.grid + 10 * app.grid, 6 * app.grid, 15.0f);
}
for(int i = 0; i < 8; ++i){
@@ -130,6 +131,8 @@ int main(){
Vec2D<float> select_start;
Rectangle selection;
ToggleFullscreen();
while(!WindowShouldClose()){
//app.grid = round(((app.fps / (app.bpm / 60.0f)) * app.speed) / 4.0f); // from quarter notes to 16th notes = div by 4
@@ -143,6 +146,16 @@ int main(){
bool mouse_clicked = IsMouseButtonPressed(MOUSE_BUTTON_LEFT);
bool mouse_released = IsMouseButtonReleased(MOUSE_BUTTON_LEFT);
for(auto &n : nodes){
n.hovering = false;
n.hover_connect = false;
}
auto dragging_nodes = nodes | std::ranges::views::filter([](Node n) { return n.dragging;});
auto connecting_nodes = nodes | std::ranges::views::filter([](Node n) { return n.connecting;});
auto hovering_nodes = nodes | std::ranges::views::filter([&mouse_pos](Node n) { return CheckCollisionPointCircle(mouse_pos, n.position, n.radius);});
auto hovering_connectors = nodes | std::ranges::views::filter([&mouse_pos](Node n) { return CheckCollisionPointCircle(mouse_pos, (n.position - ((n.position - mouse_pos)).norm() * (n.radius + 14.0f)), 8.0f);});
if(IsMouseButtonDown(MOUSE_BUTTON_RIGHT)){
Vector2 delta = GetMouseDelta();
delta = Vector2Scale(delta, -1.0f/camera.zoom);
@@ -151,6 +164,9 @@ int main(){
float wheel = GetMouseWheelMove();
if(wheel != 0){
if(!hovering_nodes.empty() && IsKeyDown(KEY_LEFT_CONTROL)){
hovering_nodes.front().midi_note = (hovering_nodes.front().midi_note + 1) % midi.midiNotes.size();
} else {
Vector2 mouseWorldPos = GetScreenToWorld2D(GetMousePosition(), camera);
camera.offset = GetMousePosition();
camera.target = mouseWorldPos;
@@ -158,6 +174,7 @@ int main(){
if (wheel < 0) scaleFactor = 1.0f/scaleFactor;
camera.zoom = Clamp(camera.zoom*scaleFactor, 0.125f, 64.0f);
}
}
if(mouse_clicked){
drag_start = mouse_pos;
@@ -176,14 +193,17 @@ int main(){
}
}
for(auto &n : nodes){
n.hovering = false;
for(auto &h : hovering_connectors){
h.hover_connect = true;
}
if(dragging_nodes.empty() && connecting_nodes.empty()) {
auto dragging_nodes = nodes | std::ranges::views::filter([](Node n) { return n.dragging;});
if(dragging_nodes.empty()) {
auto hovering_nodes = nodes | std::ranges::views::filter([&mouse_pos](Node n) { return CheckCollisionPointCircle(mouse_pos, n.position, n.radius);});
if(!hovering_connectors.empty()){
if(mouse_clicked){
hovering_connectors.front().connecting = true;
}
}
if(hovering_nodes.empty() || selection.width > 0){
if(mouse_clicked){
@@ -216,7 +236,9 @@ int main(){
}
selection = (Rectangle){0,0,0,0};
}
} else {
}
if(!hovering_nodes.empty()){
hovering_nodes.front().hovering = true;
if(selection.width == 0.0f){
if(mouse_clicked){
@@ -232,7 +254,7 @@ int main(){
}
}
} else {
} else if(!dragging_nodes.empty()){
if(mouse_down){
if(IsKeyDown(KEY_LEFT_CONTROL)) {
@@ -260,42 +282,58 @@ int main(){
}
}
}
} else if(!connecting_nodes.empty() || connecting){
for(auto& n : nodes){
Vec2D<float> connector_position = n.position - ((n.position - mouse_pos)).norm() * (n.radius + 14.0f);
float dist_connector = (connector_position - mouse_pos).length();
Vec2D<float> connector_position = connecting_nodes.front().position - ((connecting_nodes.front().position - mouse_pos)).norm() * (connecting_nodes.front().radius + 14.0f);
float dist = (n.position - mouse_pos).length();
// connect nodes
if( (dist <= n.radius + 25.0f && dist > n.radius) || n.connecting){
n.hover_connect = true;
} else {
n.hover_connect = false;
}
if(dist_connector <= 8.0f && mouse_clicked && !connecting) {
connecting_from = &n;
n.connecting = true;
connecting = true;
}
if(n.connecting && mouse_down){
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});
}
if(mouse_released && n.connecting) {
n.connecting = false;
//connecting_from = nullptr;
if(mouse_released) {
if(!hovering_nodes.empty()){
cm.addConnection(&connecting_nodes.front(), &hovering_nodes.front());
} else if(!hovering_connectors.empty()){
cm.addConnection(&connecting_nodes.front(), &hovering_connectors.front());
}
connecting_nodes.front().connecting = false;
}
}
if(mouse_released && (n.hover_connect || n.dragging)) {
if(&n != connecting_from && connecting_from != nullptr){
cm.addConnection(connecting_from, &n);
connecting_from = nullptr;
}
}
for(auto& n : nodes){
/*Vec2D<float> connector_position = n.position - ((n.position - mouse_pos)).norm() * (n.radius + 14.0f);*/
/*float dist_connector = (connector_position - mouse_pos).length();*/
/**/
/*float dist = (n.position - mouse_pos).length();*/
/**/
/*// connect nodes*/
/*if( (dist <= n.radius + 25.0f && dist > n.radius) || n.connecting){*/
/* n.hover_connect = true;*/
/*} else {*/
/* n.hover_connect = false;*/
/*}*/
/**/
/*if(dist_connector <= 8.0f && mouse_clicked && !connecting) {*/
/* connecting_from = &n;*/
/* n.connecting = true;*/
/* connecting = true;*/
/*}*/
/**/
/*if(n.connecting && mouse_down){*/
/* DrawLine(connector_position.x, connector_position.y, mouse_pos.x, mouse_pos.y, (Color){229, 181, 103, 255});*/
/*}*/
/**/
/*if(mouse_released && n.connecting) {*/
/* n.connecting = false;*/
/* //connecting_from = nullptr;*/
/*}*/
/**/
/*if(mouse_released && (n.hover_connect || n.dragging)) {*/
/* if(&n != connecting_from && connecting_from != nullptr){*/
/* cm.addConnection(connecting_from, &n);*/
/* connecting_from = nullptr;*/
/* }*/
/*}*/
n.draw(&mouse_pos, &camera);
}
@@ -354,7 +392,7 @@ int main(){
int s_nodes = s_signal + 60 + signal_configs*20;
GuiLabel((Rectangle){20, (float)s_nodes + 30, 240, 20}, "NODES");
if(GuiButton((Rectangle){20, (float)s_nodes + 60, 240, 20}, "ADD RANDOM NODE")){
nodes.emplace_back(Node(200.0f, 200.0f, 15.0f));
nodes.emplace_back(200.0f, 200.0f, 15.0f);
}