| @@ -96,41 +96,32 @@ struct BefacoSlidePot : SpriteKnob { | |||||
| // Jacks | // Jacks | ||||
| //////////////////// | //////////////////// | ||||
| template <typename BASE> | |||||
| struct PJ301M : BASE { | |||||
| PJ301M() { | |||||
| this->box.size = Vec(24, 24); | |||||
| this->spriteOffset = Vec(-2, -2); | |||||
| this->spriteSize = Vec(30, 30); | |||||
| this->spriteImage = Image::load("res/ComponentLibrary/PJ301M.png"); | |||||
| struct PJ301MPort : Port { | |||||
| PJ301MPort() { | |||||
| box.size = Vec(24, 24); | |||||
| spriteOffset = Vec(-2, -2); | |||||
| spriteSize = Vec(30, 30); | |||||
| spriteImage = Image::load("res/ComponentLibrary/PJ301M.png"); | |||||
| } | } | ||||
| }; | }; | ||||
| typedef PJ301M<InputPort> InputPortPJ301M; | |||||
| typedef PJ301M<OutputPort> OutputPortPJ301M; | |||||
| template <typename BASE> | |||||
| struct PJ3410 : BASE { | |||||
| PJ3410() { | |||||
| this->box.size = Vec(32, 31); | |||||
| this->spriteOffset = Vec(-1, -1); | |||||
| this->spriteSize = Vec(36, 36); | |||||
| this->spriteImage = Image::load("res/ComponentLibrary/PJ3410.png"); | |||||
| struct PJ3410Port : Port { | |||||
| PJ3410Port() { | |||||
| box.size = Vec(32, 31); | |||||
| spriteOffset = Vec(-1, -1); | |||||
| spriteSize = Vec(36, 36); | |||||
| spriteImage = Image::load("res/ComponentLibrary/PJ3410.png"); | |||||
| } | } | ||||
| }; | }; | ||||
| typedef PJ3410<InputPort> InputPortPJ3410; | |||||
| typedef PJ3410<OutputPort> OutputPortPJ3410; | |||||
| template <typename BASE> | |||||
| struct CL1362 : BASE { | |||||
| CL1362() { | |||||
| this->box.size = Vec(33, 29); | |||||
| this->spriteOffset = Vec(-2, -2); | |||||
| this->spriteSize = Vec(39, 36); | |||||
| this->spriteImage = Image::load("res/ComponentLibrary/CL1362.png"); | |||||
| struct CL1362Port : Port { | |||||
| CL1362Port() { | |||||
| box.size = Vec(33, 29); | |||||
| spriteOffset = Vec(-2, -2); | |||||
| spriteSize = Vec(39, 36); | |||||
| spriteImage = Image::load("res/ComponentLibrary/CL1362.png"); | |||||
| } | } | ||||
| }; | }; | ||||
| typedef CL1362<InputPort> InputPortCL1362; | |||||
| typedef CL1362<OutputPort> OutputPortCL1362; | |||||
| //////////////////// | //////////////////// | ||||
| // Lights | // Lights | ||||
| @@ -48,21 +48,23 @@ ParamWidget *createParam(Vec pos, Module *module, int paramId, float minValue, f | |||||
| return param; | return param; | ||||
| } | } | ||||
| template <class TInputPort> | |||||
| InputPort *createInput(Vec pos, Module *module, int inputId) { | |||||
| InputPort *port = new TInputPort(); | |||||
| template <class TPort> | |||||
| Port *createInput(Vec pos, Module *module, int inputId) { | |||||
| Port *port = new TPort(); | |||||
| port->box.pos = pos; | port->box.pos = pos; | ||||
| port->module = module; | port->module = module; | ||||
| port->inputId = inputId; | |||||
| port->type = Port::INPUT; | |||||
| port->portId = inputId; | |||||
| return port; | return port; | ||||
| } | } | ||||
| template <class TOutputPort> | |||||
| OutputPort *createOutput(Vec pos, Module *module, int outputId) { | |||||
| OutputPort *port = new TOutputPort(); | |||||
| template <class TPort> | |||||
| Port *createOutput(Vec pos, Module *module, int outputId) { | |||||
| Port *port = new TPort(); | |||||
| port->box.pos = pos; | port->box.pos = pos; | ||||
| port->module = module; | port->module = module; | ||||
| port->outputId = outputId; | |||||
| port->type = Port::OUTPUT; | |||||
| port->portId = outputId; | |||||
| return port; | return port; | ||||
| } | } | ||||
| @@ -12,8 +12,7 @@ struct Wire; | |||||
| struct RackWidget; | struct RackWidget; | ||||
| struct ParamWidget; | struct ParamWidget; | ||||
| struct InputPort; | |||||
| struct OutputPort; | |||||
| struct Port; | |||||
| struct Scene; | struct Scene; | ||||
| //////////////////// | //////////////////// | ||||
| @@ -27,15 +26,15 @@ struct ModuleWidget : OpaqueWidget { | |||||
| /** Owns the module pointer */ | /** Owns the module pointer */ | ||||
| Module *module = NULL; | Module *module = NULL; | ||||
| std::vector<InputPort*> inputs; | |||||
| std::vector<OutputPort*> outputs; | |||||
| std::vector<Port*> inputs; | |||||
| std::vector<Port*> outputs; | |||||
| std::vector<ParamWidget*> params; | std::vector<ParamWidget*> params; | ||||
| ~ModuleWidget(); | ~ModuleWidget(); | ||||
| void setModule(Module *module); | void setModule(Module *module); | ||||
| // Convenience functions for adding special widgets (calls addChild()) | // Convenience functions for adding special widgets (calls addChild()) | ||||
| void addInput(InputPort *input); | |||||
| void addOutput(OutputPort *output); | |||||
| void addInput(Port *input); | |||||
| void addOutput(Port *output); | |||||
| void addParam(ParamWidget *param); | void addParam(ParamWidget *param); | ||||
| json_t *toJson(); | json_t *toJson(); | ||||
| @@ -56,10 +55,10 @@ struct ModuleWidget : OpaqueWidget { | |||||
| }; | }; | ||||
| struct WireWidget : OpaqueWidget { | struct WireWidget : OpaqueWidget { | ||||
| OutputPort *outputPort = NULL; | |||||
| InputPort *inputPort = NULL; | |||||
| OutputPort *hoveredOutputPort = NULL; | |||||
| InputPort *hoveredInputPort = NULL; | |||||
| Port *inputPort = NULL; | |||||
| Port *outputPort = NULL; | |||||
| Port *hoveredInputPort = NULL; | |||||
| Port *hoveredOutputPort = NULL; | |||||
| Wire *wire = NULL; | Wire *wire = NULL; | ||||
| NVGcolor color; | NVGcolor color; | ||||
| @@ -182,35 +181,27 @@ struct MomentarySwitch : virtual Switch { | |||||
| //////////////////// | //////////////////// | ||||
| struct Port : OpaqueWidget, SpriteWidget { | struct Port : OpaqueWidget, SpriteWidget { | ||||
| enum PortType { | |||||
| INPUT, | |||||
| OUTPUT | |||||
| }; | |||||
| Module *module = NULL; | Module *module = NULL; | ||||
| WireWidget *connectedWire = NULL; | WireWidget *connectedWire = NULL; | ||||
| PortType type; | |||||
| int portId; | |||||
| Port(); | Port(); | ||||
| ~Port(); | ~Port(); | ||||
| void disconnect(); | void disconnect(); | ||||
| void draw(NVGcontext *vg); | |||||
| void onMouseDown(int button); | void onMouseDown(int button); | ||||
| void onDragEnd(); | void onDragEnd(); | ||||
| }; | |||||
| struct InputPort : Port { | |||||
| int inputId; | |||||
| void onDragStart(); | |||||
| void onDragDrop(Widget *origin); | |||||
| void onDragEnter(Widget *origin); | |||||
| void onDragLeave(Widget *origin); | |||||
| void draw(NVGcontext *vg); | |||||
| }; | |||||
| struct OutputPort : Port { | |||||
| int outputId; | |||||
| void onDragStart(); | void onDragStart(); | ||||
| void onDragDrop(Widget *origin); | void onDragDrop(Widget *origin); | ||||
| void onDragEnter(Widget *origin); | void onDragEnter(Widget *origin); | ||||
| void onDragLeave(Widget *origin); | void onDragLeave(Widget *origin); | ||||
| void draw(NVGcontext *vg); | |||||
| }; | }; | ||||
| //////////////////// | //////////////////// | ||||
| @@ -459,8 +459,8 @@ AudioInterfaceWidget::AudioInterfaceWidget() { | |||||
| } | } | ||||
| yPos += 5; | yPos += 5; | ||||
| addInput(createInput<InputPortPJ3410>(Vec(20, yPos), module, AudioInterface::AUDIO1_INPUT)); | |||||
| addInput(createInput<InputPortPJ3410>(Vec(70, yPos), module, AudioInterface::AUDIO2_INPUT)); | |||||
| addInput(createInput<PJ3410Port>(Vec(20, yPos), module, AudioInterface::AUDIO1_INPUT)); | |||||
| addInput(createInput<PJ3410Port>(Vec(70, yPos), module, AudioInterface::AUDIO2_INPUT)); | |||||
| yPos += 35 + margin; | yPos += 35 + margin; | ||||
| { | { | ||||
| @@ -472,7 +472,7 @@ AudioInterfaceWidget::AudioInterfaceWidget() { | |||||
| } | } | ||||
| yPos += 5; | yPos += 5; | ||||
| addOutput(createOutput<OutputPortPJ3410>(Vec(20, yPos), module, AudioInterface::AUDIO1_OUTPUT)); | |||||
| addOutput(createOutput<OutputPortPJ3410>(Vec(70, yPos), module, AudioInterface::AUDIO2_OUTPUT)); | |||||
| addOutput(createOutput<PJ3410Port>(Vec(20, yPos), module, AudioInterface::AUDIO1_OUTPUT)); | |||||
| addOutput(createOutput<PJ3410Port>(Vec(70, yPos), module, AudioInterface::AUDIO2_OUTPUT)); | |||||
| yPos += 35 + margin; | yPos += 35 + margin; | ||||
| } | } | ||||
| @@ -254,8 +254,8 @@ MidiInterfaceWidget::MidiInterfaceWidget() { | |||||
| } | } | ||||
| yPos += 5; | yPos += 5; | ||||
| addOutput(createOutput<OutputPortPJ3410>(Vec(20, yPos), module, MidiInterface::PITCH_OUTPUT)); | |||||
| addOutput(createOutput<OutputPortPJ3410>(Vec(70, yPos), module, MidiInterface::GATE_OUTPUT)); | |||||
| addOutput(createOutput<PJ3410Port>(Vec(20, yPos), module, MidiInterface::PITCH_OUTPUT)); | |||||
| addOutput(createOutput<PJ3410Port>(Vec(70, yPos), module, MidiInterface::GATE_OUTPUT)); | |||||
| yPos += 25 + margin; | yPos += 25 + margin; | ||||
| { | { | ||||
| @@ -1,53 +0,0 @@ | |||||
| #include "scene.hpp" | |||||
| namespace rack { | |||||
| void InputPort::onDragStart() { | |||||
| if (connectedWire) { | |||||
| // Disconnect wire from this port, but set it as the active wire | |||||
| connectedWire->inputPort = NULL; | |||||
| connectedWire->updateWire(); | |||||
| gRackWidget->activeWire = connectedWire; | |||||
| connectedWire = NULL; | |||||
| } | |||||
| else { | |||||
| connectedWire = new WireWidget(); | |||||
| connectedWire->inputPort = this; | |||||
| gRackWidget->wireContainer->addChild(connectedWire); | |||||
| gRackWidget->activeWire = connectedWire; | |||||
| } | |||||
| } | |||||
| void InputPort::onDragDrop(Widget *origin) { | |||||
| if (connectedWire) return; | |||||
| if (gRackWidget->activeWire) { | |||||
| gRackWidget->activeWire->hoveredInputPort = NULL; | |||||
| if (gRackWidget->activeWire->inputPort) return; | |||||
| gRackWidget->activeWire->inputPort = this; | |||||
| connectedWire = gRackWidget->activeWire; | |||||
| } | |||||
| } | |||||
| void InputPort::onDragEnter(Widget *origin) { | |||||
| if (connectedWire) return; | |||||
| if (gRackWidget->activeWire) { | |||||
| gRackWidget->activeWire->hoveredInputPort = this; | |||||
| } | |||||
| } | |||||
| void InputPort::onDragLeave(Widget *origin) { | |||||
| if (gRackWidget->activeWire) { | |||||
| gRackWidget->activeWire->hoveredInputPort = NULL; | |||||
| } | |||||
| } | |||||
| void InputPort::draw(NVGcontext *vg) { | |||||
| if (gRackWidget->activeWire) { | |||||
| if (gRackWidget->activeWire->inputPort) | |||||
| nvgGlobalAlpha(vg, 0.5); | |||||
| } | |||||
| SpriteWidget::draw(vg); | |||||
| } | |||||
| } // namespace rack | |||||
| @@ -22,12 +22,12 @@ void ModuleWidget::setModule(Module *module) { | |||||
| this->module = module; | this->module = module; | ||||
| } | } | ||||
| void ModuleWidget::addInput(InputPort *input) { | |||||
| void ModuleWidget::addInput(Port *input) { | |||||
| inputs.push_back(input); | inputs.push_back(input); | ||||
| addChild(input); | addChild(input); | ||||
| } | } | ||||
| void ModuleWidget::addOutput(OutputPort *output) { | |||||
| void ModuleWidget::addOutput(Port *output) { | |||||
| outputs.push_back(output); | outputs.push_back(output); | ||||
| addChild(output); | addChild(output); | ||||
| } | } | ||||
| @@ -77,10 +77,10 @@ void ModuleWidget::fromJson(json_t *root) { | |||||
| } | } | ||||
| void ModuleWidget::disconnectPorts() { | void ModuleWidget::disconnectPorts() { | ||||
| for (InputPort *input : inputs) { | |||||
| for (Port *input : inputs) { | |||||
| input->disconnect(); | input->disconnect(); | ||||
| } | } | ||||
| for (OutputPort *output : outputs) { | |||||
| for (Port *output : outputs) { | |||||
| output->disconnect(); | output->disconnect(); | ||||
| } | } | ||||
| } | } | ||||
| @@ -1,53 +0,0 @@ | |||||
| #include "scene.hpp" | |||||
| namespace rack { | |||||
| void OutputPort::onDragStart() { | |||||
| if (connectedWire) { | |||||
| // Disconnect wire from this port, but set it as the active wire | |||||
| connectedWire->outputPort = NULL; | |||||
| connectedWire->updateWire(); | |||||
| gRackWidget->activeWire = connectedWire; | |||||
| connectedWire = NULL; | |||||
| } | |||||
| else { | |||||
| connectedWire = new WireWidget(); | |||||
| connectedWire->outputPort = this; | |||||
| gRackWidget->wireContainer->addChild(connectedWire); | |||||
| gRackWidget->activeWire = connectedWire; | |||||
| } | |||||
| } | |||||
| void OutputPort::onDragDrop(Widget *origin) { | |||||
| if (connectedWire) return; | |||||
| if (gRackWidget->activeWire) { | |||||
| gRackWidget->activeWire->hoveredOutputPort = NULL; | |||||
| if (gRackWidget->activeWire->outputPort) return; | |||||
| gRackWidget->activeWire->outputPort = this; | |||||
| connectedWire = gRackWidget->activeWire; | |||||
| } | |||||
| } | |||||
| void OutputPort::onDragEnter(Widget *origin) { | |||||
| if (connectedWire) return; | |||||
| if (gRackWidget->activeWire) { | |||||
| gRackWidget->activeWire->hoveredOutputPort = this; | |||||
| } | |||||
| } | |||||
| void OutputPort::onDragLeave(Widget *origin) { | |||||
| if (gRackWidget->activeWire) { | |||||
| gRackWidget->activeWire->hoveredOutputPort = NULL; | |||||
| } | |||||
| } | |||||
| void OutputPort::draw(NVGcontext *vg) { | |||||
| if (gRackWidget->activeWire) { | |||||
| if (gRackWidget->activeWire->outputPort) | |||||
| nvgGlobalAlpha(vg, 0.5); | |||||
| } | |||||
| SpriteWidget::draw(vg); | |||||
| } | |||||
| } // namespace rack | |||||
| @@ -19,6 +19,14 @@ void Port::disconnect() { | |||||
| } | } | ||||
| } | } | ||||
| void Port::draw(NVGcontext *vg) { | |||||
| if (gRackWidget->activeWire) { | |||||
| if (type == INPUT ? gRackWidget->activeWire->inputPort : gRackWidget->activeWire->outputPort) | |||||
| nvgGlobalAlpha(vg, 0.5); | |||||
| } | |||||
| SpriteWidget::draw(vg); | |||||
| } | |||||
| void Port::onMouseDown(int button) { | void Port::onMouseDown(int button) { | ||||
| if (button == 1) { | if (button == 1) { | ||||
| disconnect(); | disconnect(); | ||||
| @@ -36,4 +44,63 @@ void Port::onDragEnd() { | |||||
| gRackWidget->activeWire = NULL; | gRackWidget->activeWire = NULL; | ||||
| } | } | ||||
| void Port::onDragStart() { | |||||
| if (connectedWire) { | |||||
| // Disconnect wire from this port, but set it as the active wire | |||||
| if (type == INPUT) | |||||
| connectedWire->inputPort = NULL; | |||||
| else | |||||
| connectedWire->outputPort = NULL; | |||||
| connectedWire->updateWire(); | |||||
| gRackWidget->activeWire = connectedWire; | |||||
| connectedWire = NULL; | |||||
| } | |||||
| else { | |||||
| connectedWire = new WireWidget(); | |||||
| if (type == INPUT) | |||||
| connectedWire->inputPort = this; | |||||
| else | |||||
| connectedWire->outputPort = this; | |||||
| gRackWidget->wireContainer->addChild(connectedWire); | |||||
| gRackWidget->activeWire = connectedWire; | |||||
| } | |||||
| } | |||||
| void Port::onDragDrop(Widget *origin) { | |||||
| if (connectedWire) return; | |||||
| if (gRackWidget->activeWire) { | |||||
| if (type == INPUT) { | |||||
| gRackWidget->activeWire->hoveredInputPort = NULL; | |||||
| if (gRackWidget->activeWire->inputPort) return; | |||||
| gRackWidget->activeWire->inputPort = this; | |||||
| } | |||||
| else { | |||||
| gRackWidget->activeWire->hoveredOutputPort = NULL; | |||||
| if (gRackWidget->activeWire->outputPort) return; | |||||
| gRackWidget->activeWire->outputPort = this; | |||||
| } | |||||
| connectedWire = gRackWidget->activeWire; | |||||
| } | |||||
| } | |||||
| void Port::onDragEnter(Widget *origin) { | |||||
| if (connectedWire) return; | |||||
| if (gRackWidget->activeWire) { | |||||
| if (type == INPUT) | |||||
| gRackWidget->activeWire->hoveredInputPort = this; | |||||
| else | |||||
| gRackWidget->activeWire->hoveredOutputPort = this; | |||||
| } | |||||
| } | |||||
| void Port::onDragLeave(Widget *origin) { | |||||
| if (gRackWidget->activeWire) { | |||||
| if (type == INPUT) | |||||
| gRackWidget->activeWire->hoveredInputPort = NULL; | |||||
| else | |||||
| gRackWidget->activeWire->hoveredOutputPort = NULL; | |||||
| } | |||||
| } | |||||
| } // namespace rack | } // namespace rack | ||||
| @@ -207,11 +207,11 @@ void RackWidget::fromJson(json_t *root) { | |||||
| // Get ports | // Get ports | ||||
| ModuleWidget *outputModuleWidget = moduleWidgets[outputModuleId]; | ModuleWidget *outputModuleWidget = moduleWidgets[outputModuleId]; | ||||
| if (!outputModuleWidget) continue; | if (!outputModuleWidget) continue; | ||||
| OutputPort *outputPort = outputModuleWidget->outputs[outputId]; | |||||
| Port *outputPort = outputModuleWidget->outputs[outputId]; | |||||
| if (!outputPort) continue; | if (!outputPort) continue; | ||||
| ModuleWidget *inputModuleWidget = moduleWidgets[inputModuleId]; | ModuleWidget *inputModuleWidget = moduleWidgets[inputModuleId]; | ||||
| if (!inputModuleWidget) continue; | if (!inputModuleWidget) continue; | ||||
| InputPort *inputPort = inputModuleWidget->inputs[inputId]; | |||||
| Port *inputPort = inputModuleWidget->inputs[inputId]; | |||||
| if (!inputPort) continue; | if (!inputPort) continue; | ||||
| // Create WireWidget | // Create WireWidget | ||||
| WireWidget *wireWidget = new WireWidget(); | WireWidget *wireWidget = new WireWidget(); | ||||
| @@ -105,11 +105,15 @@ void WireWidget::updateWire() { | |||||
| wire = NULL; | wire = NULL; | ||||
| } | } | ||||
| if (inputPort && outputPort) { | if (inputPort && outputPort) { | ||||
| // Check correct types | |||||
| assert(inputPort->type == Port::INPUT); | |||||
| assert(outputPort->type == Port::OUTPUT); | |||||
| wire = new Wire(); | wire = new Wire(); | ||||
| wire->outputModule = outputPort->module; | wire->outputModule = outputPort->module; | ||||
| wire->outputId = outputPort->outputId; | |||||
| wire->outputId = outputPort->portId; | |||||
| wire->inputModule = inputPort->module; | wire->inputModule = inputPort->module; | ||||
| wire->inputId = inputPort->inputId; | |||||
| wire->inputId = inputPort->portId; | |||||
| engineAddWire(wire); | engineAddWire(wire); | ||||
| } | } | ||||
| } | } | ||||