polar snapping now very goood!
This commit is contained in:
+24
-19
@@ -38,8 +38,7 @@ int main(){
|
||||
|
||||
srand(time(NULL));
|
||||
|
||||
|
||||
InitWindow(1920, 1080, "VISEQ");
|
||||
InitWindow(1920, 1080, "VISEQ - The Visual Sequencer");
|
||||
|
||||
int current_monitor = GetCurrentMonitor();
|
||||
int monitor_width = GetMonitorWidth(current_monitor);
|
||||
@@ -71,10 +70,10 @@ int main(){
|
||||
camera.zoom = 1.0f;
|
||||
|
||||
for(int i = 0; i < 4; ++i){
|
||||
app.gm.addMidiNode(Vec2D<float>{(float)i * app.settings.grid*4 + 5 * app.settings.grid, 5 * app.settings.grid*4});
|
||||
app.gm.addMidiNode(Vec2D<float>{(float)i * app.settings.grid*4 + 7 * app.settings.grid, 2 * app.settings.grid*4});
|
||||
}
|
||||
for(int i = 3; i >= 0; --i){
|
||||
app.gm.addMidiNode(Vec2D<float>{(float)i * app.settings.grid*4 + 5 * app.settings.grid, 6 * app.settings.grid*4});
|
||||
app.gm.addMidiNode(Vec2D<float>{(float)i * app.settings.grid*4 + 7 * app.settings.grid, 3 * app.settings.grid*4});
|
||||
}
|
||||
|
||||
for(int i = 0; i < 8; ++i){
|
||||
@@ -92,7 +91,7 @@ int main(){
|
||||
Vec2D<float> select_start;
|
||||
Rectangle selection;
|
||||
|
||||
std::vector<std::shared_ptr<Node>> copied_nodes;
|
||||
VEC_SPTR_Node copied_nodes;
|
||||
|
||||
while(!WindowShouldClose()){
|
||||
|
||||
@@ -117,11 +116,11 @@ int main(){
|
||||
Vec2D<float> mouse_delta = {GetMouseDelta().x, GetMouseDelta().y};
|
||||
Vec2D<float> delta = mouse_delta * (-1.0f/camera.zoom);
|
||||
|
||||
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 | RANGE_FILTER([](SPTR_Node n) { return n->dragging;});
|
||||
auto connecting_nodes = app.gm.nodes | RANGE_FILTER([](SPTR_Node n) { return n->connecting;});
|
||||
auto selected_nodes = app.gm.nodes | RANGE_FILTER([](SPTR_Node n) { return n->selected && !n->dragging;}) | std::ranges::to<VEC_SPTR_Node>();
|
||||
auto hovering_nodes = app.gm.nodes | RANGE_FILTER([&mouse_pos](SPTR_Node n) { return CheckCollisionPointCircle(mouse_pos, n->position, n->radius);});
|
||||
auto hovering_connectors = app.gm.nodes | RANGE_FILTER([&mouse_pos](SPTR_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 ){
|
||||
if(hovering_nodes.empty()) n->hovering = false;
|
||||
@@ -206,23 +205,29 @@ int main(){
|
||||
case InteractionState::DRAG_NODE:
|
||||
{
|
||||
if(!dragging_nodes.empty()){
|
||||
SPTR_Node dragNode = dragging_nodes.front();
|
||||
|
||||
for(auto &n : selected_nodes){
|
||||
if(!n->picked_up) n->drag_offset = n->position - dragging_nodes.front()->position;
|
||||
if(!n->picked_up) n->drag_offset = n->position - dragNode->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};
|
||||
dragNode->position.x = round((mouse_pos.x + dragNode->drag_offset.x) / app.settings.grid) * app.settings.grid;
|
||||
dragNode->position.y = round((mouse_pos.y + dragNode->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((dragNode->neighbor->position.dist(mouse_pos)) / app.settings.grid) * app.settings.grid;
|
||||
float pol_r = steps;
|
||||
float pol_theta = Vector2Angle(Vec2D<float>{1,0},(mouse_pos - dragNode->neighbor->position));
|
||||
|
||||
Vec2D<float> polar = polarToCartesian(pol_r, pol_theta);
|
||||
dragNode->position = dragNode->neighbor->position + polar;
|
||||
} else {
|
||||
dragging_nodes.front()->position = mouse_pos + dragging_nodes.front()->drag_offset;
|
||||
dragNode->position = mouse_pos + dragNode->drag_offset;
|
||||
}
|
||||
|
||||
for(auto &n : selected_nodes){
|
||||
n->position = dragging_nodes.front()->position + n->drag_offset;
|
||||
n->position = dragNode->position + n->drag_offset;
|
||||
}
|
||||
|
||||
if(mouse_released) {
|
||||
@@ -269,7 +274,7 @@ int main(){
|
||||
} else if(!hovering_connectors.empty()){
|
||||
app.gm.addConnection(connecting_nodes.front(), hovering_connectors.front());
|
||||
} else {
|
||||
std::shared_ptr<Node> new_node = app.gm.addMidiNode(mouse_pos);
|
||||
SPTR_Node new_node = app.gm.addMidiNode(mouse_pos);
|
||||
app.gm.addConnection(connecting_nodes.front(), new_node);
|
||||
}
|
||||
}
|
||||
@@ -280,7 +285,7 @@ int main(){
|
||||
}
|
||||
case InteractionState::DELETE_SELECTED_NODES:
|
||||
{
|
||||
app.removeNodes(selected_nodes | std::ranges::to<std::vector<std::shared_ptr<Node>>>());
|
||||
app.removeNodes(selected_nodes | std::ranges::to<VEC_SPTR_Node>());
|
||||
break;
|
||||
}
|
||||
case InteractionState::COPY_SELECTED_NODES:
|
||||
|
||||
Reference in New Issue
Block a user