@@ -13,7 +13,7 @@ namespace rack { | |||||
struct Module { | struct Module { | ||||
int id = -1; | |||||
int id = 0; | |||||
std::vector<Param> params; | std::vector<Param> params; | ||||
std::vector<Input> inputs; | std::vector<Input> inputs; | ||||
std::vector<Output> outputs; | std::vector<Output> outputs; | ||||
@@ -7,6 +7,7 @@ namespace rack { | |||||
struct Wire { | struct Wire { | ||||
int id = 0; | |||||
Module *outputModule = NULL; | Module *outputModule = NULL; | ||||
int outputId; | int outputId; | ||||
Module *inputModule = NULL; | Module *inputModule = NULL; | ||||
@@ -235,7 +235,7 @@ json_t *RackWidget::toJson() { | |||||
json_object_set_new(rootJ, "modules", modulesJ); | json_object_set_new(rootJ, "modules", modulesJ); | ||||
// wires | // wires | ||||
json_t *wires = json_array(); | |||||
json_t *wiresJ = json_array(); | |||||
for (Widget *w : wireContainer->children) { | for (Widget *w : wireContainer->children) { | ||||
WireWidget *wireWidget = dynamic_cast<WireWidget*>(w); | WireWidget *wireWidget = dynamic_cast<WireWidget*>(w); | ||||
assert(wireWidget); | assert(wireWidget); | ||||
@@ -245,20 +245,24 @@ json_t *RackWidget::toJson() { | |||||
// Only serialize WireWidgets connected on both ends | // Only serialize WireWidgets connected on both ends | ||||
if (!(outputPort && inputPort)) | if (!(outputPort && inputPort)) | ||||
continue; | continue; | ||||
Wire *wire = wireWidget->wire; | |||||
assert(wire); | |||||
// wire | // wire | ||||
json_t *wire = wireWidget->toJson(); | |||||
json_t *wireJ = wireWidget->toJson(); | |||||
assert(outputPort->module); | assert(outputPort->module); | ||||
assert(inputPort->module); | assert(inputPort->module); | ||||
json_object_set_new(wire, "outputModuleId", json_integer(outputPort->module->id)); | |||||
json_object_set_new(wire, "outputId", json_integer(outputPort->portId)); | |||||
json_object_set_new(wire, "inputModuleId", json_integer(inputPort->module->id)); | |||||
json_object_set_new(wire, "inputId", json_integer(inputPort->portId)); | |||||
json_object_set_new(wireJ, "id", json_integer(wire->id)); | |||||
json_object_set_new(wireJ, "outputModuleId", json_integer(outputPort->module->id)); | |||||
json_object_set_new(wireJ, "outputId", json_integer(outputPort->portId)); | |||||
json_object_set_new(wireJ, "inputModuleId", json_integer(inputPort->module->id)); | |||||
json_object_set_new(wireJ, "inputId", json_integer(inputPort->portId)); | |||||
json_array_append_new(wires, wire); | |||||
json_array_append_new(wiresJ, wireJ); | |||||
} | } | ||||
json_object_set_new(rootJ, "wires", wires); | |||||
json_object_set_new(rootJ, "wires", wiresJ); | |||||
return rootJ; | return rootJ; | ||||
} | } | ||||
@@ -306,7 +310,7 @@ void RackWidget::fromJson(json_t *rootJ) { | |||||
if (moduleWidget) { | if (moduleWidget) { | ||||
// id | // id | ||||
json_t *idJ = json_object_get(moduleJ, "id"); | json_t *idJ = json_object_get(moduleJ, "id"); | ||||
int id = -1; | |||||
int id = 0; | |||||
if (idJ) | if (idJ) | ||||
id = json_integer_value(idJ); | id = json_integer_value(idJ); | ||||
// pos | // pos | ||||
@@ -52,7 +52,8 @@ struct Engine::Internal { | |||||
Module *resetModule = NULL; | Module *resetModule = NULL; | ||||
Module *randomizeModule = NULL; | Module *randomizeModule = NULL; | ||||
int nextModuleId = 0; | |||||
int nextModuleId = 1; | |||||
int nextWireId = 1; | |||||
// Parameter smoothing | // Parameter smoothing | ||||
Module *smoothModule = NULL; | Module *smoothModule = NULL; | ||||
@@ -218,7 +219,7 @@ void Engine::addModule(Module *module) { | |||||
VIPLock vipLock(internal->vipMutex); | VIPLock vipLock(internal->vipMutex); | ||||
std::lock_guard<std::mutex> lock(internal->mutex); | std::lock_guard<std::mutex> lock(internal->mutex); | ||||
// Set ID | // Set ID | ||||
assert(module->id == -1); | |||||
assert(module->id == 0); | |||||
module->id = internal->nextModuleId++; | module->id = internal->nextModuleId++; | ||||
// Check that the module is not already added | // Check that the module is not already added | ||||
auto it = std::find(modules.begin(), modules.end(), module); | auto it = std::find(modules.begin(), modules.end(), module); | ||||
@@ -245,7 +246,7 @@ void Engine::removeModule(Module *module) { | |||||
// Remove the module | // Remove the module | ||||
modules.erase(it); | modules.erase(it); | ||||
// Remove id | // Remove id | ||||
module->id = -1; | |||||
module->id = 0; | |||||
} | } | ||||
void Engine::resetModule(Module *module) { | void Engine::resetModule(Module *module) { | ||||
@@ -285,6 +286,9 @@ void Engine::addWire(Wire *wire) { | |||||
assert(wire2 != wire); | assert(wire2 != wire); | ||||
assert(!(wire2->inputModule == wire->inputModule && wire2->inputId == wire->inputId)); | assert(!(wire2->inputModule == wire->inputModule && wire2->inputId == wire->inputId)); | ||||
} | } | ||||
// Set ID | |||||
assert(wire->id == 0); | |||||
wire->id = internal->nextWireId++; | |||||
// Add the wire | // Add the wire | ||||
wires.push_back(wire); | wires.push_back(wire); | ||||
Engine_updateActive(this); | Engine_updateActive(this); | ||||
@@ -302,6 +306,8 @@ void Engine::removeWire(Wire *wire) { | |||||
// Remove the wire | // Remove the wire | ||||
wires.erase(it); | wires.erase(it); | ||||
Engine_updateActive(this); | Engine_updateActive(this); | ||||
// Remove ID | |||||
wire->id = 0; | |||||
} | } | ||||
void Engine::setParam(Module *module, int paramId, float value) { | void Engine::setParam(Module *module, int paramId, float value) { | ||||