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