diff --git a/toonz/sources/include/tfxparam.h b/toonz/sources/include/tfxparam.h index a698c73..909262b 100644 --- a/toonz/sources/include/tfxparam.h +++ b/toonz/sources/include/tfxparam.h @@ -11,7 +11,14 @@ template void bindParam(TFx *fx, std::string name, T &var, bool hidden = false, bool obsolete = false) { - fx->getParams()->add(new TParamVarT(name, var, hidden, obsolete)); + fx->getParams()->add(new TParamVarT(name, &var, 0, hidden, obsolete)); + var->addObserver(fx); +} + +template +void bindPluginParam(TFx *fx, std::string name, T &var, bool hidden = false, + bool obsolete = false) { + fx->getParams()->add(new TParamVarT(name, nullptr, var, hidden, obsolete)); var->addObserver(fx); } diff --git a/toonz/sources/include/tparamcontainer.h b/toonz/sources/include/tparamcontainer.h index a44c3a2..899a4c2 100644 --- a/toonz/sources/include/tparamcontainer.h +++ b/toonz/sources/include/tparamcontainer.h @@ -54,20 +54,33 @@ public: template class TParamVarT final : public TParamVar { - TParamP m_var; + // Very dirty fix for link fx, separating the variable between the plugin fx + // and the built-in fx. + // Note that for now link fx is available only with built-in fx, since m_var + // must be "pointer to pointer" of parameter to make the link fx to work + // properly. + T *m_var = nullptr; + TParamP m_pluginVar = 0; public: - TParamVarT(std::string name, TParamP var, bool hidden = false, - bool obsolete = false) - : TParamVar(name, hidden, obsolete), m_var(var) {} - TParamVarT(std::string name, T *var, bool hidden = false, - bool obsolete = false) - : TParamVar(name, hidden, obsolete), m_var(var) {} - void setParam(TParam *param) override { m_var = TParamP(param); } - - TParam *getParam() const override { return m_var.getPointer(); } - TParamVar *clone() const override { - return new TParamVarT(getName(), m_var, isHidden(), isObsolete()); + TParamVarT(std::string name, T *var = nullptr, TParamP pluginVar = 0, + bool hidden = false, bool obsolete = false) + : TParamVar(name, hidden), m_var(var), m_pluginVar(pluginVar) {} + TParamVarT() = delete; + void setParam(TParam *param) { + if (m_var) + *m_var = TParamP(param); + else + m_pluginVar = TParamP(param); + } + virtual TParam *getParam() const { + if (m_var) + return m_var->getPointer(); + else + return m_pluginVar.getPointer(); + } + TParamVar *clone() const { + return new TParamVarT(getName(), m_var, m_pluginVar, isHidden()); } }; diff --git a/toonz/sources/toonzqt/pluginhost.cpp b/toonz/sources/toonzqt/pluginhost.cpp index 39b8565..895b130 100644 --- a/toonz/sources/toonzqt/pluginhost.cpp +++ b/toonz/sources/toonzqt/pluginhost.cpp @@ -602,7 +602,7 @@ Param *RasterFxPluginHost::createParam(const toonz_param_desc_t *desc) { p->setDescription(desc->note); p->setUILabel(desc->base.label); - bindParam(this, desc->key, p); + bindPluginParam(this, desc->key, p); params_.push_back(std::make_shared( this, desc->key, toonz_param_type_enum(desc->traits_tag), desc));