NAP
parameterblender.h
1 /* This Source Code Form is subject to the terms of the Mozilla Public
2  * License, v. 2.0. If a copy of the MPL was not distributed with this
3  * file, You can obtain one at https://mozilla.org/MPL/2.0/. */
4 
5 #pragma once
6 
7 #include <rtti/rtti.h>
8 #include <parameternumeric.h>
9 #include <parametervec.h>
10 #include <parametercolor.h>
11 #include <parametersimple.h>
12 #include <parameterquat.h>
13 
14 namespace nap
15 {
17  // Registration
19 
20  // Forward Declares
21  class BaseParameterBlender;
22 
26  std::unique_ptr<BaseParameterBlender> NAPAPI getParameterBlender(nap::Parameter& param);
27 
36  bool NAPAPI registerParameterBlender(rtti::TypeInfo inParameterType, rtti::TypeInfo inBlenderType);
37 
38 
40  // Base Parameter Blender
42 
48  class NAPAPI BaseParameterBlender
49  {
50  RTTI_ENABLE()
51  public:
57  BaseParameterBlender(Parameter& parameter);
58 
59  // Default destructor
60  virtual ~BaseParameterBlender() = default;
61 
67  void blend(float value);
68 
74  void setTarget(const Parameter* target);
75 
79  void clearTarget();
80 
84  void sync();
85 
89  bool hasTarget() const;
90 
94  const Parameter& getTarget() const;
95 
99  const Parameter& getParameter() const;
100 
104  template<typename T>
105  const T& getTarget() const;
106 
110  template<typename T>
111  T& getParameter();
112 
113  protected:
119  virtual void onBlend(float value) = 0;
120 
125  virtual void onSync() = 0;
126 
130  virtual void onTargetSet() = 0;
131 
132  private:
133  Parameter* mParameter = nullptr;
134  const Parameter* mTarget = nullptr;
135  };
136 
137 
139  // Default Parameter Blender
141 
149  template<typename ParamType, typename ValueType>
151  {
152  RTTI_ENABLE(BaseParameterBlender)
153  public:
158  ParameterBlender(ParamType& parameter);
159 
164  ParameterBlender(Parameter& parameter);
165 
166  protected:
173  virtual void onBlend(float value) override;
174 
178  virtual void onSync() override;
179 
183  virtual void onTargetSet() override;
184 
185  private:
186  ValueType mSourceValue;
187  };
188 
189 
191  // Type declarations for all supported (out of the box) parameter blenders
193 
205 
206 
207 
209  // Template definitions
211 
212  template<typename T>
214  {
215  assert(mTarget != nullptr);
216  assert(mTarget->get_type().is_derived_from(RTTI_OF(T)));
217  return static_cast<const T&>(*mTarget);
218  }
219 
220  template<typename T>
222  {
223  assert(mParameter != nullptr);
224  assert(mParameter->get_type().is_derived_from(RTTI_OF(T)));
225  return static_cast<T&>(*mParameter);
226  }
227 
228  template<typename ParamType, typename ValueType>
230  {
231  this->mSourceValue = parameter.mValue;
232  }
233 
234  template<typename ParamType, typename ValueType>
236  {
237  assert(parameter.get_type().is_derived_from(RTTI_OF(ParamType)));
238  this->mSourceValue = this->getParameter<ParamType>().mValue;
239  }
240 
241  template<typename ParamType, typename ValueType>
243  {
244  ValueType lval = math::lerp<ValueType>(mSourceValue, getTarget<ParamType>().mValue, value);
245  getParameter<ParamType>().setValue(lval);
246  }
247 
248  template<typename ParamType, typename ValueType>
250  {
251  onSync();
252  }
253 
254  template<typename ParamType, typename ValueType>
256  {
257  const ParamType& source = getParameter<ParamType>();
258  this->mSourceValue = source.mValue;
259  }
260 
261  template<>
263 
264  template<>
266 
267  template<>
269 
270  template<>
272 
273  template<>
275 
276  template<>
278 }
nap::Parameter
Definition: parameter.h:20
nap::ParameterBlender::ParameterBlender
ParameterBlender(ParamType &parameter)
Definition: parameterblender.h:229
nap::ParameterBlender::onSync
virtual void onSync() override
Definition: parameterblender.h:255
nap::ParameterBlender::onBlend
virtual void onBlend(float value) override
Definition: parameterblender.h:242
nap::BaseParameterBlender
Definition: parameterblender.h:48
nap::getParameterBlender
std::unique_ptr< BaseParameterBlender > NAPAPI getParameterBlender(nap::Parameter &param)
nap::registerParameterBlender
bool NAPAPI registerParameterBlender(rtti::TypeInfo inParameterType, rtti::TypeInfo inBlenderType)
nap
Definition: templateapp.h:17
nap::BaseParameterBlender::getParameter
const Parameter & getParameter() const
nap::rtti::TypeInfo
rttr::type TypeInfo
Definition: typeinfo.h:140
nap::BaseParameterBlender::getTarget
const Parameter & getTarget() const
nap::ParameterBlender
Definition: parameterblender.h:150
nap::ParameterBlender::onTargetSet
virtual void onTargetSet() override
Definition: parameterblender.h:249