signals run in own thread for super precision!

This commit is contained in:
Sebastian
2024-10-22 01:55:31 +02:00
parent 3e14a4a179
commit ad745a720e
6 changed files with 138 additions and 49 deletions
+73
View File
@@ -0,0 +1,73 @@
#pragma once
#include "connection-manager.h"
#include "datatypes.h"
#include "signal.h"
#include "node.h"
#include "midi.h"
#include <chrono>
#include <thread>
class SignalManager{
public:
SignalManager(AppState *app, ConnectionManager *cm, Midi *midi) : app(app), cm(cm), midi(midi) {}
AppState *app;
ConnectionManager *cm;
Midi *midi;
std::vector<Signal> signals;
bool loop = true;
void startSignalThread(){
std::thread t1(&SignalManager::updateSignals, this);
t1.detach();
}
void stopSignalThread(){
loop = false;
}
void addSignalAtNode(Node *node){
signals.emplace(signals.end(), Signal(node->position.x+1, node->position.y+1, 5.0f, app->speed)); // position + 1 or else it does not render. why? no idea!
signals.back().next = node;
signals.back().last = node;
}
void removeSignal(Signal *signal){
}
void updateSignals(){
auto last = std::chrono::steady_clock::now();
while(loop){
std::chrono::duration<double, std::milli> diff = std::chrono::steady_clock::now() - last;
if(diff.count() > 10){
for(auto& s : signals){
s.direction = (s.next->position - s.position).norm();
if(s.position.dist(&s.next->position) < s.speed * 1.5) {
Node* n = cm->next(s.next, s.last);
if(n != s.next && n != nullptr) {
for(auto &m : s.next->midi_outs){
if(m.second.enabled) midi->note(m.second.i, s.next->midi_channel, s.next->midi_note, s.next->midi_velocity, s.next->midi_gate);
}
s.last = s.next;
s.next = n;
}
}
}
last = std::chrono::steady_clock::now();
}
}
}
void drawSignals(Vec2D<float> *mouse_pos, Camera2D *camera){
for(auto& s : signals){
s.draw(mouse_pos, camera);
}
}
};