NAP
parametervec.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 // Local Includes
8 #include "mathutils.h"
9 
10 // External Includes
11 #include <parameter.h>
12 #include <nap/signalslot.h>
13 
14 namespace nap
15 {
20  template<typename T>
21  class ParameterVec : public Parameter
22  {
23  RTTI_ENABLE(Parameter)
24  public:
25 
31  virtual void setValue(const Parameter& value) override;
32 
38  void setValue(T value);
39 
47  void setRange(typename T::value_type minimum, typename T::value_type maximum);
48 
49  public:
50  T mValue;
51  bool mClamp = false;
52  typename T::value_type mMinimum = static_cast<typename T::value_type>(0);
53  typename T::value_type mMaximum = static_cast<typename T::value_type>(1);
54 
56  };
57 
58 
60  // Vector Parameter Type Definitions
62 
69 
70 
72  // Template Definitions
74 
75  template<typename T>
77  {
78  const ParameterVec<T>* derived_type = rtti_cast<const ParameterVec<T>>(&value);
79  assert(derived_type != nullptr);
80  setValue(derived_type->mValue);
81  }
82 
83  template<typename T>
85  {
86  // Clamp& set the components for each element individually
87  T oldValue = mValue;
88 
89  if (mClamp)
90  {
91  for (int i = 0; i != mValue.length(); ++i)
92  mValue[i] = math::clamp(value[i], mMinimum, mMaximum);
93  }
94  else
95  {
96  mValue = value;
97  }
98 
99  if (oldValue != mValue)
100  valueChanged(mValue);
101  }
102 
103 
104  template<typename T>
105  void nap::ParameterVec<T>::setRange(typename T::value_type minimum, typename T::value_type maximum)
106  {
107  mMinimum = minimum;
108  mMaximum = maximum;
109  setValue(mValue);
110  }
111 }
112 
116 #define DEFINE_VECTOR_PARAMETER(Type) \
117  RTTI_BEGIN_CLASS(Type) \
118  RTTI_PROPERTY("Value", &Type::mValue, nap::rtti::EPropertyMetaData::Default) \
119  RTTI_PROPERTY("Clamp", &Type::mClamp, nap::rtti::EPropertyMetaData::Default) \
120  RTTI_PROPERTY("Minimum", &Type::mMinimum, nap::rtti::EPropertyMetaData::Default) \
121  RTTI_PROPERTY("Maximum", &Type::mMaximum, nap::rtti::EPropertyMetaData::Default) \
122  RTTI_FUNCTION("setValue", static_cast<void (Type::*)(decltype(Type::mValue))>(&Type::setValue)) \
123  RTTI_END_CLASS
nap::Parameter
Definition: parameter.h:20
nap::ParameterVec::mValue
T mValue
Property: 'Value' the value of this parameter.
Definition: parametervec.h:50
nap::ParameterVec::setRange
void setRange(typename T::value_type minimum, typename T::value_type maximum)
Definition: parametervec.h:105
nap::ParameterVec::setValue
virtual void setValue(const Parameter &value) override
Definition: parametervec.h:76
nap::ParameterVec::mClamp
bool mClamp
Property: 'Clamp' if the vector is clamped to the min / max value.
Definition: parametervec.h:51
nap::Signal< T >
nap::ParameterVec
Definition: parametervec.h:21
nap::ParameterVec::valueChanged
Signal< T > valueChanged
Signal that's raised when the value changes.
Definition: parametervec.h:55
nap::ParameterVec::mMaximum
T::value_type mMaximum
Property: 'Maximum' the maximum value of this parameter.
Definition: parametervec.h:53
nap
Definition: templateapp.h:17
nap::ParameterVec::mMinimum
T::value_type mMinimum
Property: 'Minimum' the minimum value of this parameter.
Definition: parametervec.h:52
nap::math::clamp
T clamp(T value, T min, T max)
Definition: mathutils.h:325