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.

115 lines
2.9KB

  1. #pragma once
  2. #include "util.hpp"
  3. #include "math.hpp"
  4. #include "asset.hpp"
  5. #include "plugin.hpp"
  6. #include "engine.hpp"
  7. #include "gui.hpp"
  8. #include "app.hpp"
  9. #include "components.hpp"
  10. #include <iostream>
  11. #include <sstream>
  12. namespace rack {
  13. ////////////////////
  14. // helpers
  15. ////////////////////
  16. template <class TModuleWidget, typename... Tags>
  17. Model *createModel(std::string manufacturer, std::string slug, std::string name, Tags... tags) {
  18. struct TModel : Model {
  19. ModuleWidget *createModuleWidget() override {
  20. ModuleWidget *moduleWidget = new TModuleWidget();
  21. moduleWidget->model = this;
  22. moduleWidget->module->node->set_name(name);
  23. return moduleWidget;
  24. }
  25. };
  26. Model *model = new TModel();
  27. model->manufacturer = manufacturer;
  28. model->slug = slug;
  29. model->name = name;
  30. model->tags = {tags...};
  31. return model;
  32. }
  33. template <class TScrew>
  34. Widget *createScrew(Vec pos) {
  35. Widget *screw = new TScrew();
  36. screw->box.pos = pos;
  37. return screw;
  38. }
  39. template <class TParamWidget>
  40. ParamWidget *createParam(Vec pos, Module *module, int paramId, float minValue, float maxValue, float defaultValue, std::string name = std::string("")) {
  41. ParamWidget *param = new TParamWidget();
  42. param->box.pos = pos;
  43. param->module = module;
  44. param->paramId = paramId;
  45. auto& p = module->params[paramId];
  46. if (name == "")
  47. {
  48. std::stringstream ss;
  49. ss << "param." << paramId;
  50. name = ss.str();
  51. }
  52. auto& p_node = ossia::net::create_node(*module->node, name);
  53. p.ossia_param = p_node.create_parameter(ossia::val_type::FLOAT);
  54. p.ossia_param->set_domain(ossia::make_domain(minValue,maxValue));
  55. p.ossia_param->set_bounding(ossia::bounding_mode::CLIP);
  56. p.ossia_param->push_value(defaultValue);
  57. p.ossia_param->set_default_value(defaultValue);
  58. p.ossia_param->add_callback([param] (const ossia::value& v) {
  59. auto& p = param->module->params[param->paramId];
  60. param->value = v.get<float>();
  61. p.value = param->value;
  62. if ( auto fbw = dynamic_cast<FramebufferWidget*>(param))
  63. fbw->dirty = true;
  64. });
  65. param->setLimits(minValue, maxValue);
  66. param->setDefaultValue(defaultValue);
  67. return param;
  68. }
  69. template <class TPort>
  70. Port *createInput(Vec pos, Module *module, int inputId) {
  71. Port *port = new TPort();
  72. port->box.pos = pos;
  73. port->module = module;
  74. port->type = Port::INPUT;
  75. port->portId = inputId;
  76. return port;
  77. }
  78. template <class TPort>
  79. Port *createOutput(Vec pos, Module *module, int outputId) {
  80. Port *port = new TPort();
  81. port->box.pos = pos;
  82. port->module = module;
  83. port->type = Port::OUTPUT;
  84. port->portId = outputId;
  85. return port;
  86. }
  87. template<class TModuleLightWidget>
  88. ModuleLightWidget *createLight(Vec pos, Module *module, int firstLightId) {
  89. ModuleLightWidget *light = new TModuleLightWidget();
  90. light->box.pos = pos;
  91. light->module = module;
  92. light->firstLightId = firstLightId;
  93. return light;
  94. }
  95. } // namespace rack