ui improvements, grid and optimizations
This commit is contained in:
+3
-2
@@ -1,10 +1,11 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#include "datatypes.h"
|
||||||
#include "raylib.h"
|
#include "raylib.h"
|
||||||
#include "raymath.h"
|
#include "raymath.h"
|
||||||
|
|
||||||
inline bool ViButton(float x, float y, float radius, Color color){
|
inline bool ViButton(Vec2D<float> *mouse_pos, float x, float y, float radius, Color color){
|
||||||
Vector2 mp = GetMousePosition();
|
Vector2 mp = {mouse_pos->x, mouse_pos->y}; //GetMousePosition(); TODO: Refactor my own vectors to raylib vectors
|
||||||
DrawCircle(x,y,radius, color);
|
DrawCircle(x,y,radius, color);
|
||||||
return (Vector2Distance(mp, (Vector2){x,y}) < radius && IsMouseButtonPressed(MOUSE_BUTTON_LEFT));
|
return (Vector2Distance(mp, (Vector2){x,y}) < radius && IsMouseButtonPressed(MOUSE_BUTTON_LEFT));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "connection.h"
|
#include "connection.h"
|
||||||
|
#include "raylib.h"
|
||||||
#include <map>
|
#include <map>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
@@ -19,7 +20,7 @@ class ConnectionManager{
|
|||||||
std::vector<Node*> nodes;
|
std::vector<Node*> nodes;
|
||||||
|
|
||||||
for(auto& p : connections){
|
for(auto& p : connections){
|
||||||
if(((p.v1 == current && p.v1_v2) || (p.v2 == current && p.v2_v1))) {
|
if((p.v1 == current && p.v1_v2) || (p.v2 == current && p.v2_v1)) {
|
||||||
p.active = false;
|
p.active = false;
|
||||||
paths.push_back(&p);
|
paths.push_back(&p);
|
||||||
nodes.push_back( p.v1 == current ? p.v2 : p.v1 );
|
nodes.push_back( p.v1 == current ? p.v2 : p.v1 );
|
||||||
@@ -52,10 +53,10 @@ class ConnectionManager{
|
|||||||
return paths.at(return_path)->v1 == current ? paths.at(return_path)->v2 : paths.at(return_path)->v1;
|
return paths.at(return_path)->v1 == current ? paths.at(return_path)->v2 : paths.at(return_path)->v1;
|
||||||
}
|
}
|
||||||
|
|
||||||
void draw(){
|
void draw(Vec2D<float> *mouse_pos, Camera2D *cam){
|
||||||
std::erase_if(connections, [](Connection c){ return c.remove == true;});
|
std::erase_if(connections, [](Connection c){ return c.remove == true;});
|
||||||
for(auto& c : connections){
|
for(auto& c : connections){
|
||||||
c.draw();
|
c.draw(mouse_pos, cam);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
+15
-10
@@ -2,6 +2,7 @@
|
|||||||
|
|
||||||
#include "button.h"
|
#include "button.h"
|
||||||
#include "node.h"
|
#include "node.h"
|
||||||
|
#include "raylib.h"
|
||||||
|
|
||||||
class Connection{
|
class Connection{
|
||||||
|
|
||||||
@@ -24,28 +25,32 @@ class Connection{
|
|||||||
v2 = vt;
|
v2 = vt;
|
||||||
}
|
}
|
||||||
|
|
||||||
void draw(){
|
void draw(Vec2D<float> *mouse_pos, Camera2D *cam){
|
||||||
Vec2D<float> v1_position = v1->position - ((v1->position - v2->position)).norm() * (v1->radius + 10.0f);
|
Vec2D<float> v1_position = v1->position - ((v1->position - v2->position)).norm() * (v1->radius + 14.0f);
|
||||||
Vec2D<float> v2_position = v2->position - ((v2->position - v1->position)).norm() * (v2->radius + 10.0f);
|
Vec2D<float> v2_position = v2->position - ((v2->position - v1->position)).norm() * (v2->radius + 14.0f);
|
||||||
|
|
||||||
Color c = {229, 181, 103, 255};
|
Color c = {229, 181, 103, 255};
|
||||||
if(active) c = {108, 153, 187, 255};
|
if(active) c = {108, 153, 187, 255};
|
||||||
DrawLine(v1_position.x, v1_position.y, v2_position.x, v2_position.y, c);
|
DrawLine(v1_position.x, v1_position.y, v2_position.x, v2_position.y, c);
|
||||||
|
DrawCircle(v1_position.x, v1_position.y, 2.0f, c);
|
||||||
|
DrawCircle(v2_position.x, v2_position.y, 2.0f, c);
|
||||||
|
|
||||||
Vec2D<float> from_to_handle = v1->position - ((v1->position - v2->position)).norm() * (v1->radius + 35);
|
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);
|
Vec2D<float> to_from_handle = v2->position - ((v2->position - v1->position)).norm() * (v2->radius + 35);
|
||||||
Vec2D<float> middle_handle = v2->position - ((v2->position - v1->position))*0.5f;
|
Vec2D<float> middle_handle = v2->position - ((v2->position - v1->position))*0.5f;
|
||||||
Vec2D<float> config_handle = v2->position - ((v2->position - v1->position))*0.66f;
|
Vec2D<float> config_handle = v2->position - ((v2->position - v1->position))*0.66f;
|
||||||
Vec2D<float> flip_handle = (v1_position - v2_position).norm().orth()*20.0f;
|
// Vec2D<float> flip_handle = (v1_position - v2_position).norm().orth()*20.0f;
|
||||||
|
|
||||||
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;
|
unsigned char opacity = 150.0f - Clamp(middle_handle.dist(mouse_pos), 0.0f, 150.0f);
|
||||||
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;
|
unsigned char opacity_from = 250.0f - Clamp(from_to_handle.dist(mouse_pos), 0.0f, 120.0f);
|
||||||
|
unsigned char opacity_to = 250.0f - Clamp(to_from_handle.dist(mouse_pos), 0.0f, 120.0f);
|
||||||
|
|
||||||
if(ViButton(middle_handle.x, middle_handle.y, 8.0f, (Color){232, 50, 32, 255} )) remove = true;
|
if(ViButton(mouse_pos, from_to_handle.x, from_to_handle.y, 8.0f, v1_v2 ? (Color){120, 210, 115, opacity_from} : (Color){232, 50, 32, opacity_from} )) v1_v2 = !v1_v2;
|
||||||
|
if(ViButton(mouse_pos, to_from_handle.x, to_from_handle.y, 8.0f, v2_v1 ? (Color){120, 210, 115, opacity_to} : (Color){232, 50, 32, opacity_to} )) v2_v1 = !v2_v1;
|
||||||
|
|
||||||
if(ViButton(config_handle.x, config_handle.y, 8.0f, (Color){158, 134, 200, 255})) config = !config;
|
if(ViButton(mouse_pos, middle_handle.x, middle_handle.y, 8.0f, (Color){232, 50, 32, opacity} )) remove = true;
|
||||||
|
if(ViButton(mouse_pos, config_handle.x, config_handle.y, 8.0f, (Color){158, 134, 200, opacity})) config = !config;
|
||||||
|
|
||||||
|
//if(ViButton(mouse_pos, config_handle.x + flip_handle.x, config_handle.y + flip_handle.y, 8.0f, (Color){158, 0, 200, opacity})) flip();
|
||||||
if(ViButton(config_handle.x + flip_handle.x, config_handle.y + flip_handle.y, 8.0f, (Color){158, 0, 200, 255})) flip();
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -139,3 +139,24 @@ struct MidiOut{
|
|||||||
int number;
|
int number;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
namespace MIDI{
|
||||||
|
inline std::vector<std::string> Notes = {
|
||||||
|
"C-1", "C#-1", "D-1", "D#-1", "E-1", "F-1", "F#-1", "G-1",
|
||||||
|
"G#-1", "A-1", "A#-1", "B-1", "C0", "C#0", "D0", "D#0",
|
||||||
|
"E0", "F0", "F#0", "G0", "G#0", "A0", "A#0", "B0",
|
||||||
|
"C1", "C#1", "D1", "D#1", "E1", "F1", "F#1", "G1",
|
||||||
|
"G#1", "A1", "A#1", "B1", "C2", "C#2", "D2", "D#2",
|
||||||
|
"E2", "F2", "F#2", "G2", "G#2", "A2", "A#2", "B2",
|
||||||
|
"C3", "C#3", "D3", "D#3", "E3", "F3", "F#3", "G3",
|
||||||
|
"G#3", "A3", "A#3", "B3", "C4", "C#4", "D4", "D#4",
|
||||||
|
"E4", "F4", "F#4", "G4", "G#4", "A4", "A#4", "B4",
|
||||||
|
"C5", "C#5", "D5", "D#5", "E5", "F5", "F#5", "G5",
|
||||||
|
"G#5", "A5", "A#5", "B5", "C6", "C#6", "D6", "D#6",
|
||||||
|
"E6", "F6", "F#6", "G6", "G#6", "A6", "A#6", "B6",
|
||||||
|
"C7", "C#7", "D7", "D#7", "E7", "F7", "F#7", "G7",
|
||||||
|
"G#7", "A7", "A#7", "B7", "C8", "C#8", "D8", "D#8",
|
||||||
|
"E8", "F8", "F#8", "G8", "G#8", "A8", "A#8", "B8",
|
||||||
|
"C9", "C#9", "D9", "D#9", "E9", "F9", "F#9", "G9",
|
||||||
|
"G#9", "A9", "A#9", "B9", "C10"
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|||||||
+99
-32
@@ -86,7 +86,6 @@ int main(){
|
|||||||
|
|
||||||
for(int i = 0; i < 10; i++){
|
for(int i = 0; i < 10; i++){
|
||||||
nodes.emplace(nodes.end(), Node((float)(rand() % app.width*0.5 + app.width*0.25), (float)(rand() % app.height*0.5 + app.height*0.25), 15.0f));
|
nodes.emplace(nodes.end(), Node((float)(rand() % app.width*0.5 + app.width*0.25), (float)(rand() % app.height*0.5 + app.height*0.25), 15.0f));
|
||||||
std::cout << nodes.back().position.x << " " << nodes.back().position.y << std::endl;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
for(int i = 0; i < 1; i++){
|
for(int i = 0; i < 1; i++){
|
||||||
@@ -97,6 +96,9 @@ int main(){
|
|||||||
|
|
||||||
Vec2D<float> drag_offset;
|
Vec2D<float> drag_offset;
|
||||||
|
|
||||||
|
Vec2D<float> cam_drag_offset;
|
||||||
|
Vec2D<float> cam_mouse_drag_offset;
|
||||||
|
|
||||||
Node* connecting_from = nullptr;
|
Node* connecting_from = nullptr;
|
||||||
|
|
||||||
double drag_timer = GetTime();
|
double drag_timer = GetTime();
|
||||||
@@ -105,11 +107,30 @@ int main(){
|
|||||||
|
|
||||||
Vector2 mp = GetScreenToWorld2D(GetMousePosition(), camera);
|
Vector2 mp = GetScreenToWorld2D(GetMousePosition(), camera);
|
||||||
Vec2D<float> mouse_pos = {(float)mp.x, (float)mp.y};
|
Vec2D<float> mouse_pos = {(float)mp.x, (float)mp.y};
|
||||||
|
Vec2D<float> cam_pos = {camera.offset.x, camera.offset.y};
|
||||||
|
|
||||||
bool mouse_down = IsMouseButtonDown(MOUSE_BUTTON_LEFT);
|
bool mouse_down = IsMouseButtonDown(MOUSE_BUTTON_LEFT);
|
||||||
bool mouse_clicked = IsMouseButtonPressed(MOUSE_BUTTON_LEFT);
|
bool mouse_clicked = IsMouseButtonPressed(MOUSE_BUTTON_LEFT);
|
||||||
bool mouse_released = IsMouseButtonReleased(MOUSE_BUTTON_LEFT);
|
bool mouse_released = IsMouseButtonReleased(MOUSE_BUTTON_LEFT);
|
||||||
|
|
||||||
|
if (IsMouseButtonDown(MOUSE_BUTTON_RIGHT))
|
||||||
|
{
|
||||||
|
Vector2 delta = GetMouseDelta();
|
||||||
|
delta = Vector2Scale(delta, -1.0f/camera.zoom);
|
||||||
|
camera.target = Vector2Add(camera.target, delta);
|
||||||
|
}
|
||||||
|
|
||||||
|
float wheel = GetMouseWheelMove();
|
||||||
|
if (wheel != 0)
|
||||||
|
{
|
||||||
|
Vector2 mouseWorldPos = GetScreenToWorld2D(GetMousePosition(), camera);
|
||||||
|
camera.offset = GetMousePosition();
|
||||||
|
camera.target = mouseWorldPos;
|
||||||
|
float scaleFactor = 1.0f + (0.25f*fabsf(wheel));
|
||||||
|
if (wheel < 0) scaleFactor = 1.0f/scaleFactor;
|
||||||
|
camera.zoom = Clamp(camera.zoom*scaleFactor, 0.125f, 64.0f);
|
||||||
|
}
|
||||||
|
|
||||||
if(mouse_clicked){
|
if(mouse_clicked){
|
||||||
drag_start = mouse_pos;
|
drag_start = mouse_pos;
|
||||||
}
|
}
|
||||||
@@ -122,6 +143,13 @@ int main(){
|
|||||||
bool connecting = false;
|
bool connecting = false;
|
||||||
bool dragging = false;
|
bool dragging = false;
|
||||||
|
|
||||||
|
for(int x = -5000; x < 5000; x+=50){
|
||||||
|
for(int y = -5000; y < 5000; y+=50){
|
||||||
|
// DrawLine(-5000, i, 5000, i, (Color){80,80,80,100});
|
||||||
|
DrawPixel(x, y, (Color){120,120,120,200});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
for(auto& n : nodes){
|
for(auto& n : nodes){
|
||||||
Vec2D<float> connector_position = n.position - ((n.position - mouse_pos)).norm() * (n.radius + 14.0f);
|
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_connector = (connector_position - mouse_pos).length();
|
||||||
@@ -171,7 +199,13 @@ int main(){
|
|||||||
drag_timer = GetTime();
|
drag_timer = GetTime();
|
||||||
}
|
}
|
||||||
if(mouse_down && n.picked_up){
|
if(mouse_down && n.picked_up){
|
||||||
if(GetTime() - drag_timer > 0.1) n.position = mouse_pos + drag_offset;
|
if(GetTime() - drag_timer > 0.1) {
|
||||||
|
if(IsKeyDown(KEY_LEFT_CONTROL)) {
|
||||||
|
n.position = (Vec2D<float>){round((mouse_pos.x+drag_offset.x)/50.0f)*50.0f, round((mouse_pos.y+drag_offset.y)/50.0f)*50.0f};
|
||||||
|
} else {
|
||||||
|
n.position = mouse_pos + drag_offset;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(mouse_released && n.picked_up){
|
if(mouse_released && n.picked_up){
|
||||||
@@ -183,10 +217,10 @@ int main(){
|
|||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
n.draw(&mouse_pos);
|
n.draw(&mouse_pos, &camera);
|
||||||
}
|
}
|
||||||
|
|
||||||
cm.draw();
|
cm.draw(&mouse_pos, &camera);
|
||||||
|
|
||||||
for(auto& s : signals){
|
for(auto& s : signals){
|
||||||
s.direction = (s.next->position - s.position).norm();
|
s.direction = (s.next->position - s.position).norm();
|
||||||
@@ -201,7 +235,7 @@ int main(){
|
|||||||
s.next = n;
|
s.next = n;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
s.draw(&mouse_pos);
|
s.draw(&mouse_pos, &camera);
|
||||||
}
|
}
|
||||||
midi.update();
|
midi.update();
|
||||||
EndMode2D();
|
EndMode2D();
|
||||||
@@ -209,61 +243,94 @@ int main(){
|
|||||||
// Main Config Window
|
// Main Config Window
|
||||||
GuiWindowBox((Rectangle){0,0,280,(float)app.height}, "config");
|
GuiWindowBox((Rectangle){0,0,280,(float)app.height}, "config");
|
||||||
{
|
{
|
||||||
GuiLabel((Rectangle){20, 60, 240, 20}, "MIDI OUT");
|
GuiLabel((Rectangle){20, 55, 240, 20}, "MIDI OUT");
|
||||||
int i = 0;
|
int i = 0;
|
||||||
for(auto& mo : midi.midi_out_ports){
|
for(auto& mo : midi.midi_out_ports){
|
||||||
GuiCheckBox((Rectangle){20, 80 + i*20.0f, 20, 20}, mo.port.port_name.c_str(), &mo.enabled);
|
GuiCheckBox((Rectangle){20, 80 + i*20.0f, 20, 20}, mo.port.port_name.c_str(), &mo.enabled);
|
||||||
i++;
|
i++;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(GuiButton((Rectangle){20, 60, 240, 20}, "ADD SIGNAL")){
|
if(GuiButton((Rectangle){20, 100 + i*20.0f, 240, 20}, "ENABLE FOR ALL")) {
|
||||||
signals.emplace_back(Signal(nodes.front().position.x + 1, nodes.front().position.y + 1, 5.0f, 2.0f)); // position + 1 or else it does not render. why? no idea!
|
for(auto &midis : midi.midi_out_ports){
|
||||||
signals.back().next = &nodes[0];
|
if(midis.enabled){
|
||||||
signals.back().last = &nodes[0];
|
for(auto &n : nodes){
|
||||||
|
n.midi_outs[midis.number].enabled = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
GuiLabel((Rectangle){20, 135 + i*20.0f, 240, 20}, "SIGNALS");
|
||||||
|
if(GuiButton((Rectangle){20, 160 + i*20.0f, 240, 20}, "ADD RANDOM SIGNAL")){
|
||||||
|
int ni = rand() % nodes.size();
|
||||||
|
signals.emplace_back(Signal(nodes[ni].position.x + 1, nodes[ni].position.y + 1, 5.0f, 2.0f)); // position + 1 or else it does not render. why? no idea!
|
||||||
|
signals.back().next = &nodes[ni];
|
||||||
|
signals.back().last = &nodes[ni];
|
||||||
|
}
|
||||||
|
|
||||||
|
GuiLabel((Rectangle){20, 185 + i*20.0f, 240, 20}, "NODES");
|
||||||
|
if(GuiButton((Rectangle){20, 215 + i*20.0f, 240, 20}, "ADD RANDOM NODE")){
|
||||||
|
nodes.emplace_back(Node((float)(rand() % app.width*0.5 + app.width*0.25), (float)(rand() % app.height*0.5 + app.height*0.25), 15.0f));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Per Node Config Windows
|
||||||
for(auto& n : nodes){
|
for(auto& n : nodes){
|
||||||
|
Vector2 np = GetWorldToScreen2D((Vector2){n.position.x, n.position.y}, camera);
|
||||||
|
|
||||||
|
for(auto& mo : midi.midi_out_ports){
|
||||||
|
if(!n.midi_outs.contains(mo.number) && mo.enabled){
|
||||||
|
n.midi_outs[mo.number] = {mo.number, mo.port.port_name, false};
|
||||||
|
}
|
||||||
|
if(n.midi_outs.contains(mo.number) && !mo.enabled){
|
||||||
|
n.midi_outs.erase(mo.number);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if(n.config){
|
if(n.config){
|
||||||
n.config = !GuiWindowBox((Rectangle){n.position.x + 10, n.position.y + 10,240,400}, "config");
|
n.config = !GuiWindowBox((Rectangle){np.x + 10, np.y + 10, 240, 440}, "config");
|
||||||
|
|
||||||
int option = n.mode;
|
int option = n.mode;
|
||||||
GuiComboBox((Rectangle){ n.position.x + 20, n.position.y + 40, 220, 20 }, "Round Robin;Random", &option);
|
GuiToggleGroup((Rectangle){ np.x + 20, np.y + 40, 110, 20 }, "Round Robin;Random", &option);
|
||||||
n.mode = (Distribution)option;
|
n.mode = (Distribution)option;
|
||||||
|
|
||||||
int y_midi = 60;
|
GuiLabel((Rectangle){np.x + 20, np.y + 65, 220, 20}, "SIGNALS");
|
||||||
GuiLabel((Rectangle){n.position.x + 20, n.position.y + y_midi, 220, 20}, "MIDI OUT");
|
if(GuiButton((Rectangle){np.x + 20, np.y + 90, 220, 20}, "ADD SIGNAL")){
|
||||||
for(auto& mo : midi.midi_out_ports){
|
signals.emplace_back(Signal(n.position.x + 1, n.position.y + 1, 5.0f, 2.0f)); // position + 1 or else it does not render. why? no idea!
|
||||||
if(!n.midi_outs.contains(mo.number) && mo.enabled){
|
signals.back().next = &n;
|
||||||
n.midi_outs[mo.number] = {mo.number, mo.port.port_name, false};
|
signals.back().last = &n;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int y_midi = 120;
|
||||||
|
GuiLabel((Rectangle){np.x + 20, np.y + y_midi, 220, 20}, "MIDI OUT");
|
||||||
|
|
||||||
int i = 0;
|
int i = 0;
|
||||||
for(auto& mo : n.midi_outs){
|
for(auto& mo : n.midi_outs){
|
||||||
GuiCheckBox((Rectangle){n.position.x + 20, n.position.y + y_midi + 20 + i*20.0f, 20, 20}, mo.second.name.c_str(), &mo.second.enabled);
|
GuiCheckBox((Rectangle){np.x + 20, np.y + y_midi + 20 + i*20.0f, 20, 20}, mo.second.name.c_str(), &mo.second.enabled);
|
||||||
i++;
|
i++;
|
||||||
}
|
}
|
||||||
|
|
||||||
int y_channel = y_midi + 20 + i*20;
|
int y_channel = y_midi + 30 + i*20;
|
||||||
GuiLabel((Rectangle){n.position.x + 20, n.position.y + y_channel, 220, 20}, "CHANNEL");
|
GuiLabel((Rectangle){np.x + 20, np.y + y_channel, 220, 20}, "CHANNEL");
|
||||||
GuiToggleGroup((Rectangle){n.position.x + 20, n.position.y + y_channel + 30, 25, 20}, "1;2;3;4;5;6;7;8\n9;10;11;12;13;14;15;16", &n.midi_channel);
|
GuiToggleGroup((Rectangle){np.x + 20, np.y + y_channel + 30, 25, 20}, "1;2;3;4;5;6;7;8\n9;10;11;12;13;14;15;16", &n.midi_channel);
|
||||||
|
|
||||||
GuiLabel((Rectangle){n.position.x + 20, n.position.y + y_channel + 90, 100, 20}, "NOTE");
|
GuiLabel((Rectangle){np.x + 20, np.y + y_channel + 90, 100, 20}, "NOTE");
|
||||||
float v = n.midi_note;
|
float v = n.midi_note;
|
||||||
GuiLabel((Rectangle){n.position.x + 210, n.position.y + y_channel + 90, 20, 20}, midi.midiNotes[(int)round(v)].c_str());
|
GuiLabel((Rectangle){np.x + 210, np.y + y_channel + 90, 20, 20}, midi.midiNotes[(int)round(v)].c_str());
|
||||||
GuiLabel((Rectangle){n.position.x + 160, n.position.y + y_channel + 90, 40, 20}, std::format("{}",n.midi_note).c_str());
|
GuiLabel((Rectangle){np.x + 160, np.y + y_channel + 90, 40, 20}, std::format("{}",n.midi_note).c_str());
|
||||||
GuiSlider((Rectangle){n.position.x + 20, n.position.y + y_channel + 120, 220, 20}, "", "", &v, 0, 127);
|
GuiSlider((Rectangle){np.x + 20, np.y + y_channel + 120, 220, 20}, "", "", &v, 0, 127);
|
||||||
n.midi_note = round(v);
|
n.midi_note = round(v);
|
||||||
|
|
||||||
GuiLabel((Rectangle){n.position.x + 20, n.position.y + y_channel + 150, 100, 20}, "VELOCITY");
|
GuiLabel((Rectangle){np.x + 20, np.y + y_channel + 150, 100, 20}, "VELOCITY");
|
||||||
v = n.midi_velocity;
|
v = n.midi_velocity;
|
||||||
GuiLabel((Rectangle){n.position.x + 210, n.position.y + y_channel + 150, 20, 20}, std::format("{}",n.midi_velocity).c_str());
|
GuiLabel((Rectangle){np.x + 210, np.y + y_channel + 150, 20, 20}, std::format("{}",n.midi_velocity).c_str());
|
||||||
GuiSlider((Rectangle){n.position.x + 20, n.position.y + y_channel + 180, 220, 20}, "", "", &v, 0, 127);
|
GuiSlider((Rectangle){np.x + 20, np.y + y_channel + 180, 220, 20}, "", "", &v, 0, 127);
|
||||||
n.midi_velocity = round(v);
|
n.midi_velocity = round(v);
|
||||||
|
|
||||||
GuiLabel((Rectangle){n.position.x + 20, n.position.y + y_channel + 210, 100, 20}, "GATE");
|
GuiLabel((Rectangle){np.x + 20, np.y + y_channel + 210, 100, 20}, "GATE");
|
||||||
v = n.midi_gate;
|
v = n.midi_gate;
|
||||||
GuiLabel((Rectangle){n.position.x + 210, n.position.y + y_channel + 210, 20, 20}, std::format("{}",(float)n.midi_gate/1000.0f).c_str());
|
GuiLabel((Rectangle){np.x + 210, np.y + y_channel + 210, 20, 20}, std::format("{}",(float)n.midi_gate/1000.0f).c_str());
|
||||||
GuiSlider((Rectangle){n.position.x + 20, n.position.y + y_channel + 240, 220, 20}, "", "", &v, 0, 5000);
|
GuiSlider((Rectangle){np.x + 20, np.y + y_channel + 240, 220, 20}, "", "", &v, 0, 5000);
|
||||||
n.midi_gate = round(v);
|
n.midi_gate = round(v);
|
||||||
|
|
||||||
//if(GuiValueBox((Rectangle){n.position.x + 100, n.position.y + y_channel + 40, 140, 20}, "VELOCITY", &n.midi_velocity, 0, 127, n.gui_midi_velocity_edit)) n.gui_midi_velocity_edit = !n.gui_midi_velocity_edit;
|
//if(GuiValueBox((Rectangle){n.position.x + 100, n.position.y + y_channel + 40, 140, 20}, "VELOCITY", &n.midi_velocity, 0, 127, n.gui_midi_velocity_edit)) n.gui_midi_velocity_edit = !n.gui_midi_velocity_edit;
|
||||||
|
|||||||
@@ -68,6 +68,13 @@ class Midi {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void close_midi_out(MidiOutPort *out_port){
|
||||||
|
if(midi_outs.contains(out_port->number)){
|
||||||
|
midi_outs[out_port->number]->close_port();
|
||||||
|
midi_outs.erase(out_port->number);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void note(int midi_out, int channel, int note, int velocity, int gate){
|
void note(int midi_out, int channel, int note, int velocity, int gate){
|
||||||
if(!midi_outs.empty()){
|
if(!midi_outs.empty()){
|
||||||
if(midi_outs[midi_out]->is_port_open()){
|
if(midi_outs[midi_out]->is_port_open()){
|
||||||
@@ -89,6 +96,8 @@ class Midi {
|
|||||||
for(auto& p : midi_out_ports){
|
for(auto& p : midi_out_ports){
|
||||||
if(p.enabled) {
|
if(p.enabled) {
|
||||||
open_midi_out(&p);
|
open_midi_out(&p);
|
||||||
|
} else if(!p.enabled) {
|
||||||
|
close_midi_out(&p);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+2
-1
@@ -1,6 +1,7 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "datatypes.h"
|
#include "datatypes.h"
|
||||||
|
#include "raylib.h"
|
||||||
|
|
||||||
class Movable{
|
class Movable{
|
||||||
|
|
||||||
@@ -17,6 +18,6 @@ class Movable{
|
|||||||
Vec2D<float> direction;
|
Vec2D<float> direction;
|
||||||
|
|
||||||
virtual void update() {};
|
virtual void update() {};
|
||||||
virtual void draw(Vec2D<float> *mouse) {};
|
virtual void draw(Vec2D<float> *mouse, Camera2D *cam) {};
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|||||||
+7
-3
@@ -5,6 +5,7 @@
|
|||||||
|
|
||||||
#include "datatypes.h"
|
#include "datatypes.h"
|
||||||
#include "moveable.h"
|
#include "moveable.h"
|
||||||
|
#include "raymath.h"
|
||||||
|
|
||||||
#define R 14.0f
|
#define R 14.0f
|
||||||
|
|
||||||
@@ -46,20 +47,23 @@ class Node : public Movable{
|
|||||||
|
|
||||||
Distribution mode = Distribution::ROUNDROBIN;
|
Distribution mode = Distribution::ROUNDROBIN;
|
||||||
|
|
||||||
void draw(Vec2D<float> *mouse) {
|
void draw(Vec2D<float> *mouse, Camera2D *cam) {
|
||||||
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});
|
||||||
if(hover_move) DrawCircle(position.x, position.y, radius, (Color){108, 153, 187, 255});
|
if(hover_move) DrawCircle(position.x, position.y, radius, (Color){108, 153, 187, 255});
|
||||||
|
int offset = MeasureText(MIDI::Notes[midi_note].c_str(), 10);
|
||||||
|
DrawText(MIDI::Notes[midi_note].c_str(), position.x-offset/2.0f, position.y-5, 10, WHITE );
|
||||||
|
|
||||||
if(mode == Distribution::RANDOM) DrawCircle(position.x, position.y, radius/2.0f, (Color){229, 181, 103, 255});
|
if(mode == Distribution::RANDOM) DrawCircle(position.x, position.y, radius/2.0f, (Color){229, 181, 103, 255});
|
||||||
|
|
||||||
Vec2D<float> connector = position - ((position - *mouse)).norm() * (radius + R);
|
Vec2D<float> connector = position - ((position - *mouse)).norm() * (radius + R);
|
||||||
|
float opacity = 150.0f - Clamp(position.dist(mouse), 0.0f, 150.0f);
|
||||||
|
|
||||||
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});
|
||||||
DrawCircle(connector.x, connector.y, 8.0f, (Color){108, 153, 187, 255});
|
DrawCircle(connector.x, connector.y, 8.0f, (Color){108, 153, 187, 255});
|
||||||
} else {
|
} else {
|
||||||
DrawCircleLines(position.x, position.y, radius + R, (Color){108, 153, 187, 50});
|
DrawCircleLines(position.x, position.y, radius + R, (Color){108, 153, 187, (unsigned char)opacity});
|
||||||
DrawCircle(connector.x, connector.y, 8.0f, (Color){108, 153, 187, 50});
|
DrawCircle(connector.x, connector.y, 8.0f, (Color){108, 153, 187, (unsigned char)opacity});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
+1
-1
@@ -23,7 +23,7 @@ class Signal : public Movable{
|
|||||||
|
|
||||||
float radius;
|
float radius;
|
||||||
|
|
||||||
void draw(Vec2D<float> *mouse) {
|
void draw(Vec2D<float> *mouse, Camera2D *cam) {
|
||||||
|
|
||||||
position += direction.norm() * speed;
|
position += direction.norm() * speed;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user