conversion to smart pointers done but still buggy
This commit is contained in:
+113
-110
@@ -6,7 +6,10 @@
|
||||
*
|
||||
*/
|
||||
|
||||
#include "midi-node.h"
|
||||
#include <iterator>
|
||||
#include <memory>
|
||||
#include <vector>
|
||||
#define RAYGUI_IMPLEMENTATION
|
||||
|
||||
#include "datatypes.h"
|
||||
@@ -68,17 +71,19 @@ int main(){
|
||||
camera.zoom = 1.0f;
|
||||
|
||||
for(int i = 0; i < 4; ++i){
|
||||
app.gm.addNode((float)i * app.settings.grid*4 + 10 * app.settings.grid, 5 * app.settings.grid*4);
|
||||
app.gm.addMidiNode(Vec2D<float>{(float)i * app.settings.grid*4 + 5 * app.settings.grid, 5 * app.settings.grid*4});
|
||||
}
|
||||
for(int i = 3; i >= 0; --i){
|
||||
app.gm.addNode((float)i * app.settings.grid*4 + 10 * app.settings.grid, 6 * app.settings.grid*4);
|
||||
app.gm.addMidiNode(Vec2D<float>{(float)i * app.settings.grid*4 + 5 * app.settings.grid, 6 * app.settings.grid*4});
|
||||
}
|
||||
|
||||
for(int i = 0; i < 8; ++i){
|
||||
app.gm.addConnection(app.gm.nodes[i].id, app.gm.nodes[(i+1) % 8].id);
|
||||
app.gm.addConnection(app.gm.nodes[i], app.gm.nodes[(i+1) % 8]);
|
||||
}
|
||||
|
||||
app.sm.addSignalAtNode((app.gm.nodes | std::views::values).front().id);
|
||||
|
||||
std::cout << app.gm.nodes[0]->getNodeType() << std::endl;
|
||||
|
||||
app.sm.addSignalAtNode(app.gm.nodes.front());
|
||||
app.sm.startSignalThread();
|
||||
|
||||
enum InteractionState {HOVER_CANVAS, HOVER_NODE, HOVER_CONNECTOR, DRAG_NODE, CONNECT_NODE, DRAW_SELECTION, DELETE_SELECTED_NODES, COPY_SELECTED_NODES, PASTE_SELECTED_NODES};
|
||||
@@ -87,6 +92,7 @@ int main(){
|
||||
Vec2D<float> select_start;
|
||||
Rectangle selection;
|
||||
|
||||
std::vector<std::shared_ptr<Node>> copied_nodes;
|
||||
|
||||
while(!WindowShouldClose()){
|
||||
|
||||
@@ -111,17 +117,15 @@ int main(){
|
||||
Vec2D<float> mouse_delta = {GetMouseDelta().x, GetMouseDelta().y};
|
||||
Vec2D<float> delta = mouse_delta * (-1.0f/camera.zoom);
|
||||
|
||||
std::vector<std::shared_ptr<Node>> copied_nodes;
|
||||
auto dragging_nodes = app.gm.nodes | std::ranges::views::filter([](std::shared_ptr<Node> n) { return n->dragging;});
|
||||
auto connecting_nodes = app.gm.nodes | std::ranges::views::filter([](std::shared_ptr<Node> n) { return n->connecting;});
|
||||
auto selected_nodes = app.gm.nodes | std::ranges::views::filter([](std::shared_ptr<Node> n) { return n->selected && !n->dragging;}) | std::ranges::to<std::vector<std::shared_ptr<Node>>>();
|
||||
auto hovering_nodes = app.gm.nodes | std::ranges::views::filter([&mouse_pos](std::shared_ptr<Node> n) { return CheckCollisionPointCircle(mouse_pos, n->position, n->radius);});
|
||||
auto hovering_connectors = app.gm.nodes | std::ranges::views::filter([&mouse_pos](std::shared_ptr<Node> n) { return CheckCollisionPointCircle(mouse_pos, (n->position - ((n->position - mouse_pos)).norm() * (n->radius + 14.0f)), 8.0f);});
|
||||
|
||||
auto dragging_nodes = app.gm.nodes | std::ranges::views::values | std::ranges::views::filter([](Node n) { return n.dragging;});
|
||||
auto connecting_nodes = app.gm.nodes | std::ranges::views::values| std::ranges::views::filter([](Node n) { return n.connecting;});
|
||||
auto selected_nodes = app.gm.nodes | std::ranges::views::values| std::ranges::views::filter([](Node n) { return n.selected && !n.dragging;});
|
||||
auto hovering_nodes = app.gm.nodes | std::ranges::views::values| std::ranges::views::filter([&mouse_pos](Node n) { return CheckCollisionPointCircle(mouse_pos, n.position, n.radius);});
|
||||
auto hovering_connectors = app.gm.nodes | std::ranges::views::values| 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);});
|
||||
|
||||
for(auto &n : app.gm.nodes | std::ranges::views::values){
|
||||
if(hovering_nodes.empty()) n.hovering = false;
|
||||
if(hovering_connectors.empty()) n.hover_connect = false;
|
||||
for(auto &n : app.gm.nodes ){
|
||||
if(hovering_nodes.empty()) n->hovering = false;
|
||||
if(hovering_connectors.empty()) n->hover_connect = false;
|
||||
}
|
||||
|
||||
if(!mouse_down && !mouse_right_down && dragging_nodes.empty() && connecting_nodes.empty() && hovering_nodes.empty() && hovering_connectors.empty()) istate = InteractionState::HOVER_CANVAS;
|
||||
@@ -145,8 +149,8 @@ int main(){
|
||||
switch(istate){
|
||||
case InteractionState::HOVER_CANVAS:
|
||||
{
|
||||
for(auto &n : app.gm.nodes | std::ranges::views::values){
|
||||
n.hover_connect = false;
|
||||
for(auto &n : app.gm.nodes){
|
||||
n->hover_connect = false;
|
||||
}
|
||||
if(mouse_right_down) {
|
||||
camera.target = Vector2Add(camera.target, delta);
|
||||
@@ -164,22 +168,22 @@ int main(){
|
||||
DrawRectangleLines(select1.x, select1.y, select2.x, select2.y, (Color){150,150,150,150});
|
||||
selection = (Rectangle){select1.x, select1.y, select2.x, select2.y};
|
||||
|
||||
for(auto& n : app.gm.nodes | std::views::values){
|
||||
if(CheckCollisionPointRec(n.position, selection)) {
|
||||
n.in_rect = true;
|
||||
for(auto& n : app.gm.nodes){
|
||||
if(CheckCollisionPointRec(n->position, selection)) {
|
||||
n->in_rect = true;
|
||||
} else {
|
||||
n.in_rect = false;
|
||||
n->in_rect = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if(mouse_released){
|
||||
for(auto& n : app.gm.nodes | std::views::values){
|
||||
if(CheckCollisionPointRec(n.position, selection)) {
|
||||
n.selected = true;
|
||||
n.in_rect = false;
|
||||
for(auto& n : app.gm.nodes){
|
||||
if(CheckCollisionPointRec(n->position, selection)) {
|
||||
n->selected = true;
|
||||
n->in_rect = false;
|
||||
} else {
|
||||
if(!IsKeyDown(KEY_LEFT_SHIFT)) n.selected = false;
|
||||
if(!IsKeyDown(KEY_LEFT_SHIFT)) n->selected = false;
|
||||
}
|
||||
}
|
||||
selection = (Rectangle){0,0,0,0};
|
||||
@@ -190,45 +194,45 @@ int main(){
|
||||
{
|
||||
if(mouse_clicked) {
|
||||
if(IsKeyDown(KEY_LEFT_SHIFT)) {
|
||||
hovering_nodes.front().selected = true;
|
||||
hovering_nodes.front()->selected = true;
|
||||
} else {
|
||||
hovering_nodes.front().dragging = true;
|
||||
hovering_nodes.front().drag_offset = hovering_nodes.front().position - mouse_pos;
|
||||
hovering_nodes.front()->dragging = true;
|
||||
hovering_nodes.front()->drag_offset = hovering_nodes.front()->position - mouse_pos;
|
||||
}
|
||||
}
|
||||
if(mouse_right_clicked) hovering_nodes.front().config = true;
|
||||
if(mouse_right_clicked) hovering_nodes.front()->config = true;
|
||||
break;
|
||||
}
|
||||
case InteractionState::DRAG_NODE:
|
||||
{
|
||||
if(!dragging_nodes.empty()){
|
||||
for(auto &n : selected_nodes){
|
||||
if(!n.picked_up) n.drag_offset = n.position - dragging_nodes.front().position;
|
||||
n.picked_up = true;
|
||||
if(!n->picked_up) n->drag_offset = n->position - dragging_nodes.front()->position;
|
||||
n->picked_up = true;
|
||||
}
|
||||
|
||||
if(IsKeyDown(KEY_LEFT_CONTROL)) {
|
||||
dragging_nodes.front().position = (Vec2D<float>){round((mouse_pos.x+dragging_nodes.front().drag_offset.x)/app.settings.grid)*app.settings.grid, round((mouse_pos.y+dragging_nodes.front().drag_offset.y)/app.settings.grid)*app.settings.grid};
|
||||
dragging_nodes.front()->position = (Vec2D<float>){round((mouse_pos.x+dragging_nodes.front()->drag_offset.x)/app.settings.grid)*app.settings.grid, round((mouse_pos.y+dragging_nodes.front()->drag_offset.y)/app.settings.grid)*app.settings.grid};
|
||||
} else if(IsKeyDown(KEY_LEFT_SHIFT)){
|
||||
float steps = round(dragging_nodes.front().neighbor->position.dist(mouse_pos) / app.settings.grid) * app.settings.grid;
|
||||
Vec2D<float> polar = dragging_nodes.front().neighbor->position - (dragging_nodes.front().neighbor->position - (mouse_pos + dragging_nodes.front().drag_offset)).norm() * steps;
|
||||
dragging_nodes.front().position = polar;
|
||||
float steps = round(dragging_nodes.front()->neighbor->position.dist(mouse_pos) / app.settings.grid) * app.settings.grid;
|
||||
Vec2D<float> polar = dragging_nodes.front()->neighbor->position - (dragging_nodes.front()->neighbor->position - (mouse_pos + dragging_nodes.front()->drag_offset)).norm() * steps;
|
||||
dragging_nodes.front()->position = polar;
|
||||
} else {
|
||||
dragging_nodes.front().position = mouse_pos + dragging_nodes.front().drag_offset;
|
||||
dragging_nodes.front()->position = mouse_pos + dragging_nodes.front()->drag_offset;
|
||||
}
|
||||
|
||||
for(auto &n : selected_nodes){
|
||||
n.position = dragging_nodes.front().position + n.drag_offset;
|
||||
n->position = dragging_nodes.front()->position + n->drag_offset;
|
||||
}
|
||||
|
||||
if(mouse_released) {
|
||||
for(auto &n : dragging_nodes){
|
||||
n.dragging = false;
|
||||
n.picked_up = false;
|
||||
n->dragging = false;
|
||||
n->picked_up = false;
|
||||
}
|
||||
for(auto &n : selected_nodes){
|
||||
n.picked_up = false;
|
||||
n.dragging = false;
|
||||
n->picked_up = false;
|
||||
n->dragging = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -237,116 +241,115 @@ int main(){
|
||||
case InteractionState::HOVER_CONNECTOR:
|
||||
{
|
||||
if(!hovering_connectors.empty()){
|
||||
hovering_connectors.front().hover_connect = true;
|
||||
if(mouse_clicked) hovering_connectors.front().connecting = true;
|
||||
hovering_connectors.front()->hover_connect = true;
|
||||
if(mouse_clicked) hovering_connectors.front()->connecting = true;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case InteractionState::CONNECT_NODE:
|
||||
{
|
||||
Vec2D<float> connector_position = connecting_nodes.front().position - ((connecting_nodes.front().position - mouse_pos)).norm() * (connecting_nodes.front().radius + 14.0f);
|
||||
Vec2D<float> connector_position = connecting_nodes.front()->position - ((connecting_nodes.front()->position - mouse_pos)).norm() * (connecting_nodes.front()->radius + 14.0f);
|
||||
|
||||
if(connecting_nodes.front().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});
|
||||
connecting_nodes.front().hovering = true;
|
||||
connecting_nodes.front().hover_connect = true;
|
||||
connecting_nodes.front()->hovering = true;
|
||||
connecting_nodes.front()->hover_connect = true;
|
||||
}
|
||||
|
||||
if(!hovering_connectors.empty()) {
|
||||
hovering_connectors.front().hovering = true;
|
||||
hovering_connectors.front().hover_connect = true;
|
||||
hovering_connectors.front()->hovering = true;
|
||||
hovering_connectors.front()->hover_connect = true;
|
||||
}
|
||||
if(!hovering_nodes.empty()) hovering_nodes.front().hovering = true;
|
||||
if(!hovering_nodes.empty()) hovering_nodes.front()->hovering = true;
|
||||
|
||||
if(mouse_released) {
|
||||
if(&hovering_nodes.front() != &connecting_nodes.front() && &connecting_nodes.front() != &hovering_connectors.front()){
|
||||
if(!hovering_nodes.empty()){
|
||||
app.gm.addConnection(connecting_nodes.front().id, hovering_nodes.front().id);
|
||||
app.gm.addConnection(connecting_nodes.front(), hovering_nodes.front());
|
||||
} else if(!hovering_connectors.empty()){
|
||||
app.gm.addConnection(connecting_nodes.front().id, hovering_connectors.front().id);
|
||||
app.gm.addConnection(connecting_nodes.front(), hovering_connectors.front());
|
||||
} else {
|
||||
int id = app.gm.addNode(mouse_pos.x, mouse_pos.y);
|
||||
app.gm.addConnection(connecting_nodes.front().id, id);
|
||||
std::shared_ptr<Node> new_node = app.gm.addMidiNode(mouse_pos);
|
||||
app.gm.addConnection(connecting_nodes.front(), new_node);
|
||||
}
|
||||
}
|
||||
connecting_nodes.front().connecting = false;
|
||||
connecting_nodes.front()->connecting = false;
|
||||
istate = InteractionState::HOVER_CANVAS;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case InteractionState::DELETE_SELECTED_NODES:
|
||||
{
|
||||
for(auto &n : selected_nodes){
|
||||
n.erase = true;
|
||||
}
|
||||
app.removeNodes();
|
||||
app.removeNodes(selected_nodes | std::ranges::to<std::vector<std::shared_ptr<Node>>>());
|
||||
break;
|
||||
}
|
||||
case InteractionState::COPY_SELECTED_NODES:
|
||||
{
|
||||
std::copy(selected_nodes.begin(), selected_nodes.end(), copied_nodes.begin());
|
||||
std::ranges::copy(selected_nodes.begin(), selected_nodes.end(), std::back_inserter(copied_nodes));
|
||||
break;
|
||||
}
|
||||
case InteractionState::PASTE_SELECTED_NODES:
|
||||
{
|
||||
for(auto &n: copied_nodes){
|
||||
n.drag_offset = (n.position - copied_nodes.front().position);
|
||||
n->drag_offset = (n->position - copied_nodes.front()->position);
|
||||
}
|
||||
// app.gm.copyNodes(mouse_pos);
|
||||
//app.gm.copyNodes(selected_nodes, mouse_pos);
|
||||
|
||||
app.copyNodesAndConnections(mouse_pos);
|
||||
app.copyNodesAndConnections(copied_nodes, mouse_pos);
|
||||
copied_nodes.clear();
|
||||
break;
|
||||
}
|
||||
};
|
||||
|
||||
float wheel = GetMouseWheelMove();
|
||||
if(wheel != 0){
|
||||
if(!hovering_nodes.empty() && IsKeyDown(KEY_LEFT_CONTROL) && !IsKeyDown(KEY_LEFT_ALT)){
|
||||
switch(app.settings.mode){
|
||||
case 0:{
|
||||
hovering_nodes.front().midi_note += wheel;
|
||||
break;}
|
||||
case 1:{
|
||||
hovering_nodes.front().midi_cc += wheel;
|
||||
break;}
|
||||
case 2:{
|
||||
hovering_nodes.front().midi_pitch_bend += wheel;
|
||||
break;}
|
||||
};
|
||||
if(hovering_nodes.front().midi_note < 0 ) hovering_nodes.front().midi_note = app.sm.midi.midiNotes.size()-1;
|
||||
if(hovering_nodes.front().midi_note >= app.sm.midi.midiNotes.size() ) hovering_nodes.front().midi_note = 0;
|
||||
if(!hovering_nodes.empty() && hovering_nodes.front()->getNodeType() == NodeType::MIDINODE) {
|
||||
std::shared_ptr<MidiNode> midiNode = std::dynamic_pointer_cast<MidiNode>(hovering_nodes.front());
|
||||
if(IsKeyDown(KEY_LEFT_CONTROL) && !IsKeyDown(KEY_LEFT_ALT)){
|
||||
switch(app.settings.mode){
|
||||
case 0:{
|
||||
midiNode->midi_note += wheel;
|
||||
break;}
|
||||
case 1:{
|
||||
midiNode->midi_cc += wheel;
|
||||
break;}
|
||||
case 2:{
|
||||
midiNode->midi_pitch_bend += wheel;
|
||||
break;}
|
||||
};
|
||||
if(midiNode->midi_note < 0 ) midiNode->midi_note = app.sm.midi.midiNotes.size()-1;
|
||||
if(midiNode->midi_note >= app.sm.midi.midiNotes.size() ) midiNode->midi_note = 0;
|
||||
|
||||
if(midiNode->midi_cc < 0 ) midiNode->midi_cc = 127;
|
||||
if(midiNode->midi_cc > 127 ) midiNode->midi_cc = 0;
|
||||
|
||||
if(hovering_nodes.front().midi_cc < 0 ) hovering_nodes.front().midi_cc = 127;
|
||||
if(hovering_nodes.front().midi_cc > 127 ) hovering_nodes.front().midi_cc = 0;
|
||||
|
||||
if(hovering_nodes.front().midi_pitch_bend < 0 ) hovering_nodes.front().midi_pitch_bend = 0;
|
||||
if(hovering_nodes.front().midi_pitch_bend > 16383 ) hovering_nodes.front().midi_pitch_bend = 16383;
|
||||
if(midiNode->midi_pitch_bend < 0 ) midiNode->midi_pitch_bend = 0;
|
||||
if(midiNode->midi_pitch_bend > 16383 ) midiNode->midi_pitch_bend = 16383;
|
||||
|
||||
} else if(!hovering_nodes.empty() && IsKeyDown(KEY_LEFT_SHIFT) && !IsKeyDown(KEY_LEFT_ALT)) {
|
||||
hovering_nodes.front().midi_velocity += wheel;
|
||||
if(hovering_nodes.front().midi_velocity < 0 ) hovering_nodes.front().midi_velocity = 127;
|
||||
if(hovering_nodes.front().midi_velocity > 127 ) hovering_nodes.front().midi_velocity = 0;
|
||||
} else if(!hovering_nodes.empty() && IsKeyDown(KEY_LEFT_ALT)) {
|
||||
switch(app.settings.mode){
|
||||
case 0:{
|
||||
float incr = (float)wheel * (IsKeyDown(KEY_LEFT_SHIFT) ? 100.0f : IsKeyDown(KEY_LEFT_CONTROL) ? 1000.0f : 10.0f);
|
||||
hovering_nodes.front().midi_gate += incr;
|
||||
if(hovering_nodes.front().midi_gate < 0 ) hovering_nodes.front().midi_gate = 0;
|
||||
break;}
|
||||
case 1:{
|
||||
hovering_nodes.front().midi_cc_value += wheel;
|
||||
if(hovering_nodes.front().midi_cc_value < 0 ) hovering_nodes.front().midi_cc_value = 0;
|
||||
if(hovering_nodes.front().midi_cc_value > 127 ) hovering_nodes.front().midi_cc_value = 127;
|
||||
break;}
|
||||
case 2:{
|
||||
float incr = (float)wheel * (IsKeyDown(KEY_LEFT_SHIFT) ? 100.0f : IsKeyDown(KEY_LEFT_CONTROL) ? 1000.0f : 10.0f);
|
||||
hovering_nodes.front().midi_pitch_bend += incr;
|
||||
if(hovering_nodes.front().midi_pitch_bend < 0 ) hovering_nodes.front().midi_pitch_bend = 0;
|
||||
if(hovering_nodes.front().midi_pitch_bend > 16383 ) hovering_nodes.front().midi_pitch_bend = 16383;
|
||||
break;}
|
||||
};
|
||||
} else {
|
||||
} else if(!hovering_nodes.empty() && IsKeyDown(KEY_LEFT_SHIFT) && !IsKeyDown(KEY_LEFT_ALT)) {
|
||||
midiNode->midi_velocity += wheel;
|
||||
if(midiNode->midi_velocity < 0 ) midiNode->midi_velocity = 127;
|
||||
if(midiNode->midi_velocity > 127 ) midiNode->midi_velocity = 0;
|
||||
} else if(!hovering_nodes.empty() && IsKeyDown(KEY_LEFT_ALT)) {
|
||||
switch(app.settings.mode){
|
||||
case 0:{
|
||||
float incr = (float)wheel * (IsKeyDown(KEY_LEFT_SHIFT) ? 100.0f : IsKeyDown(KEY_LEFT_CONTROL) ? 1000.0f : 10.0f);
|
||||
midiNode->midi_gate += incr;
|
||||
if(midiNode->midi_gate < 0 ) midiNode->midi_gate = 0;
|
||||
break;}
|
||||
case 1:{
|
||||
midiNode->midi_cc_value += wheel;
|
||||
if(midiNode->midi_cc_value < 0 ) midiNode->midi_cc_value = 0;
|
||||
if(midiNode->midi_cc_value > 127 ) midiNode->midi_cc_value = 127;
|
||||
break;}
|
||||
case 2:{
|
||||
float incr = (float)wheel * (IsKeyDown(KEY_LEFT_SHIFT) ? 100.0f : IsKeyDown(KEY_LEFT_CONTROL) ? 1000.0f : 10.0f);
|
||||
midiNode->midi_pitch_bend += incr;
|
||||
if(midiNode->midi_pitch_bend < 0 ) midiNode->midi_pitch_bend = 0;
|
||||
if(midiNode->midi_pitch_bend > 16383 ) midiNode->midi_pitch_bend = 16383;
|
||||
break;}
|
||||
};
|
||||
}
|
||||
}
|
||||
if(hovering_nodes.empty()){
|
||||
Vector2 mouseWorldPos = GetScreenToWorld2D(GetMousePosition(), camera);
|
||||
camera.offset = GetMousePosition();
|
||||
camera.target = mouseWorldPos;
|
||||
@@ -362,7 +365,7 @@ int main(){
|
||||
}
|
||||
}
|
||||
|
||||
app.draw(&mouse_pos, &camera);
|
||||
app.draw(mouse_pos, camera);
|
||||
|
||||
EndMode2D();
|
||||
|
||||
|
||||
Reference in New Issue
Block a user