You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

86 lines
1.8KB

  1. #pragma once
  2. #include "math.hpp"
  3. #include "util.hpp"
  4. #include "plugin.hpp"
  5. #include "engine.hpp"
  6. #include "gui.hpp"
  7. #include "scene.hpp"
  8. #include "components.hpp"
  9. #include "dsp.hpp"
  10. namespace rack {
  11. ////////////////////
  12. // helpers
  13. ////////////////////
  14. template <class TModuleWidget>
  15. Model *createModel(Plugin *plugin, std::string slug, std::string name) {
  16. struct TModel : Model {
  17. ModuleWidget *createModuleWidget() {
  18. ModuleWidget *moduleWidget = new TModuleWidget();
  19. moduleWidget->model = this;
  20. return moduleWidget;
  21. }
  22. };
  23. Model *model = new TModel();
  24. model->plugin = plugin;
  25. model->slug = slug;
  26. model->name = name;
  27. // Create bi-directional association between the Plugin and Model
  28. if (plugin) {
  29. plugin->models.push_back(model);
  30. }
  31. return model;
  32. }
  33. template <class TParam>
  34. ParamWidget *createParam(Vec pos, Module *module, int paramId, float minValue, float maxValue, float defaultValue) {
  35. ParamWidget *param = new TParam();
  36. param->box.pos = pos;
  37. param->module = module;
  38. param->paramId = paramId;
  39. param->setLimits(minValue, maxValue);
  40. param->setDefaultValue(defaultValue);
  41. return param;
  42. }
  43. template <class TInputPort>
  44. InputPort *createInput(Vec pos, Module *module, int inputId) {
  45. InputPort *port = new TInputPort();
  46. port->box.pos = pos;
  47. port->module = module;
  48. port->inputId = inputId;
  49. return port;
  50. }
  51. template <class TOutputPort>
  52. OutputPort *createOutput(Vec pos, Module *module, int outputId) {
  53. OutputPort *port = new TOutputPort();
  54. port->box.pos = pos;
  55. port->module = module;
  56. port->outputId = outputId;
  57. return port;
  58. }
  59. template <class TScrew>
  60. Screw *createScrew(Vec pos) {
  61. Screw *screw = new TScrew();
  62. screw->box.pos = pos;
  63. return screw;
  64. }
  65. template <class TLight>
  66. ValueLight *createValueLight(Vec pos, float *value) {
  67. ValueLight *light = new TLight();
  68. light->box.pos = pos;
  69. light->value = value;
  70. return light;
  71. }
  72. } // namespace rack