OpenMW
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
controller.hpp
Go to the documentation of this file.
1 #ifndef COMPONENTS_NIFOSG_CONTROLLER_H
2 #define COMPONENTS_NIFOSG_CONTROLLER_H
3 
8 
11 
12 #include <set> //UVController
13 
14 // FlipController
15 #include <osg/Texture2D>
16 #include <osg/ref_ptr>
17 
18 #include <osg/StateSet>
19 #include <osg/NodeCallback>
20 #include <osg/Drawable>
21 
22 
23 namespace osg
24 {
25  class Node;
26  class StateSet;
27 }
28 
29 namespace osgParticle
30 {
31  class Emitter;
32 }
33 
34 namespace NifOsg
35 {
36 
37  // interpolation of keyframes
38  template <typename MapT, typename InterpolationFunc>
40  {
41  public:
42  typedef typename MapT::ValueType ValueT;
43 
45  : mDefaultVal(ValueT())
46  {
47  }
48 
49  ValueInterpolator(std::shared_ptr<const MapT> keys, ValueT defaultVal = ValueT())
50  : mKeys(keys)
51  , mDefaultVal(defaultVal)
52  {
53  if (keys)
54  {
55  mLastLowKey = mKeys->mKeys.end();
56  mLastHighKey = mKeys->mKeys.end();
57  }
58  }
59 
60  ValueT interpKey(float time) const
61  {
62  if (empty())
63  return mDefaultVal;
64 
65  const typename MapT::MapType & keys = mKeys->mKeys;
66 
67  if(time <= keys.begin()->first)
68  return keys.begin()->second.mValue;
69 
70  // retrieve the current position in the map, optimized for the most common case
71  // where time moves linearly along the keyframe track
72  typename MapT::MapType::const_iterator it = mLastHighKey;
73  if (mLastHighKey != keys.end())
74  {
75  if (time > mLastHighKey->first)
76  {
77  // try if we're there by incrementing one
78  ++mLastLowKey;
79  ++mLastHighKey;
80  it = mLastHighKey;
81  }
82  if (mLastHighKey == keys.end() || (time < mLastLowKey->first || time > mLastHighKey->first))
83  it = keys.lower_bound(time); // still not there, reorient by performing lower_bound check on the whole map
84  }
85  else
86  it = keys.lower_bound(time);
87 
88  // now do the actual interpolation
89  if (it != keys.end())
90  {
91  float aTime = it->first;
92  const typename MapT::KeyType* aKey = &it->second;
93 
94  // cache for next time
95  mLastHighKey = it;
96 
97  typename MapT::MapType::const_iterator last = --it;
98  mLastLowKey = last;
99  float aLastTime = last->first;
100  const typename MapT::KeyType* aLastKey = &last->second;
101 
102  float a = (time - aLastTime) / (aTime - aLastTime);
103 
104  return InterpolationFunc()(aLastKey->mValue, aKey->mValue, a);
105  }
106  else
107  return keys.rbegin()->second.mValue;
108  }
109 
110  bool empty() const
111  {
112  return !mKeys || mKeys->mKeys.empty();
113  }
114 
115  private:
116  mutable typename MapT::MapType::const_iterator mLastLowKey;
117  mutable typename MapT::MapType::const_iterator mLastHighKey;
118 
119  std::shared_ptr<const MapT> mKeys;
120 
122  };
123 
124  struct LerpFunc
125  {
126  template <typename ValueType>
127  inline ValueType operator()(const ValueType& a, const ValueType& b, float fraction)
128  {
129  return a + ((b - a) * fraction);
130  }
131  };
132 
134  {
135  inline osg::Quat operator()(const osg::Quat& a, const osg::Quat& b, float fraction)
136  {
137  osg::Quat result;
138  result.slerp(fraction, a, b);
139  return result;
140  }
141  };
142 
146 
148  {
149  private:
150  float mFrequency;
151  float mPhase;
152  float mStartTime;
153  float mStopTime;
155  {
156  Cycle = 0,
157  Reverse = 1,
159  };
161 
162  public:
163  ControllerFunction(const Nif::Controller *ctrl);
164 
165  float calculate(float value) const;
166 
167  virtual float getMaximum() const;
168  };
169 
172  {
173  public:
176  GeomMorpherController(const GeomMorpherController& copy, const osg::CopyOp& copyop);
177 
178  META_Object(NifOsg, GeomMorpherController)
179 
180  virtual void update(osg::NodeVisitor* nv, osg::Drawable* drawable);
181 
182  private:
183  std::vector<FloatInterpolator> mKeyFrames;
184  };
185 
186  class KeyframeController : public osg::NodeCallback, public SceneUtil::Controller
187  {
188  public:
191  KeyframeController(const KeyframeController& copy, const osg::CopyOp& copyop);
192 
193  META_Object(NifOsg, KeyframeController)
194 
195  virtual osg::Vec3f getTranslation(float time) const;
196 
197  virtual void operator() (osg::Node*, osg::NodeVisitor*);
198 
199  private:
201 
205 
208 
209  osg::Quat getXYZRotation(float time) const;
210  };
211 
213  {
214  public:
215  UVController();
216  UVController(const UVController&,const osg::CopyOp&);
217  UVController(const Nif::NiUVData *data, const std::set<int>& textureUnits);
218 
219  META_Object(NifOsg,UVController)
220 
221  virtual void setDefaults(osg::StateSet* stateset);
222  virtual void apply(osg::StateSet *stateset, osg::NodeVisitor *nv);
223 
224  private:
229  std::set<int> mTextureUnits;
230  };
231 
232  class VisController : public osg::NodeCallback, public SceneUtil::Controller
233  {
234  private:
235  std::vector<Nif::NiVisData::VisData> mData;
236 
237  bool calculate(float time) const;
238 
239  public:
240  VisController(const Nif::NiVisData *data);
241  VisController();
242  VisController(const VisController& copy, const osg::CopyOp& copyop);
243 
244  META_Object(NifOsg, VisController)
245 
246  virtual void operator() (osg::Node* node, osg::NodeVisitor* nv);
247  };
248 
249  class AlphaController : public SceneUtil::StateSetUpdater, public SceneUtil::Controller
250  {
251  private:
253 
254  public:
255  AlphaController(const Nif::NiFloatData *data);
256  AlphaController();
257  AlphaController(const AlphaController& copy, const osg::CopyOp& copyop);
258 
259  virtual void setDefaults(osg::StateSet* stateset);
260 
261  virtual void apply(osg::StateSet* stateset, osg::NodeVisitor* nv);
262 
263  META_Object(NifOsg, AlphaController)
264  };
265 
267  {
268  private:
270 
271  public:
274  MaterialColorController(const MaterialColorController& copy, const osg::CopyOp& copyop);
275 
276  META_Object(NifOsg, MaterialColorController)
277 
278  virtual void setDefaults(osg::StateSet* stateset);
279 
280  virtual void apply(osg::StateSet* stateset, osg::NodeVisitor* nv);
281  };
282 
283  class FlipController : public SceneUtil::StateSetUpdater, public SceneUtil::Controller
284  {
285  private:
286  int mTexSlot;
287  float mDelta;
288  std::vector<osg::ref_ptr<osg::Texture2D> > mTextures;
289 
290  public:
291  FlipController(const Nif::NiFlipController* ctrl, const std::vector<osg::ref_ptr<osg::Texture2D> >& textures);
292  FlipController(int texSlot, float delta, const std::vector<osg::ref_ptr<osg::Texture2D> >& textures);
293  FlipController();
294  FlipController(const FlipController& copy, const osg::CopyOp& copyop);
295 
297 
298  std::vector<osg::ref_ptr<osg::Texture2D> >& getTextures() { return mTextures; }
299 
300  virtual void apply(osg::StateSet *stateset, osg::NodeVisitor *nv);
301  };
302 
303  class ParticleSystemController : public osg::NodeCallback, public SceneUtil::Controller
304  {
305  public:
308  ParticleSystemController(const ParticleSystemController& copy, const osg::CopyOp& copyop);
309 
310  META_Object(NifOsg, ParticleSystemController)
311 
312  virtual void operator() (osg::Node* node, osg::NodeVisitor* nv);
313 
314  private:
315  float mEmitStart;
316  float mEmitStop;
317  };
318 
319 }
320 
321 #endif
ExtrapolationMode mExtrapolationMode
Definition: controller.hpp:160
FloatInterpolator mYRotations
Definition: controller.hpp:203
void copy(const btTransform &src, Nif::Transformation &dst)
Definition: testbulletnifloader.cpp:269
GeomMorpherController()
Definition: controller.cpp:171
META_Object(NifOsg, FlipController) std
Definition: controller.hpp:296
float mPhase
Definition: controller.hpp:151
Definition: controller.hpp:303
ValueInterpolator()
Definition: controller.hpp:44
ControllerFunction(const Nif::Controller *ctrl)
Definition: controller.cpp:19
Implements efficient per-frame updating of StateSets.
Definition: statesetupdater.hpp:19
Definition: controller.hpp:158
Definition: controller.hpp:156
Definition: controller.hpp:32
float mFrequency
Definition: controller.hpp:150
MapT::ValueType ValueT
Definition: controller.hpp:42
ValueInterpolator< Nif::FloatKeyMap, LerpFunc > FloatInterpolator
Definition: controller.hpp:144
bool empty() const
Definition: controller.hpp:110
float mDelta
Definition: controller.hpp:287
Definition: data.hpp:198
Definition: controller.hpp:124
Definition: controller.hpp:147
Definition: controller.hpp:283
Definition: controller.hpp:232
MapT::MapType::const_iterator mLastLowKey
Definition: controller.hpp:116
std::vector< Nif::NiVisData::VisData > mData
Definition: controller.hpp:235
FloatInterpolator mUScale
Definition: controller.hpp:227
Vec3Interpolator mData
Definition: controller.hpp:269
ValueInterpolator(std::shared_ptr< const MapT > keys, ValueT defaultVal=ValueT())
Definition: controller.hpp:49
Controller()
Definition: controller.cpp:16
ValueT mDefaultVal
Definition: controller.hpp:121
std::shared_ptr< const MapT > mKeys
Definition: controller.hpp:119
Definition: controller.hpp:37
FloatInterpolator mScales
Definition: controller.hpp:207
Definition: controller.hpp:186
FloatInterpolator mData
Definition: controller.hpp:252
std::vector< FloatInterpolator > mKeyFrames
Definition: controller.hpp:178
Definition: controller.hpp:39
FloatInterpolator mXRotations
Definition: controller.hpp:202
Definition: controller.hpp:249
Definition: controller.hpp:212
Definition: base.hpp:26
osg::Quat operator()(const osg::Quat &a, const osg::Quat &b, float fraction)
Definition: controller.hpp:135
std::vector< osg::ref_ptr< osg::Texture2D > > mTextures
Definition: controller.hpp:288
Definition: data.hpp:86
Definition: data.hpp:140
FloatInterpolator mVScale
Definition: controller.hpp:228
Definition: data.hpp:94
int mTexSlot
Definition: controller.hpp:286
ExtrapolationMode
Definition: controller.hpp:154
Definition: controller.hpp:133
Vec3Interpolator mTranslations
Definition: controller.hpp:206
Definition: controller.hpp:157
ValueInterpolator< Nif::Vector3KeyMap, LerpFunc > Vec3Interpolator
Definition: controller.hpp:145
FloatInterpolator mZRotations
Definition: controller.hpp:204
ValueType operator()(const ValueType &a, const ValueType &b, float fraction)
Definition: controller.hpp:127
FloatInterpolator mUTrans
Definition: controller.hpp:225
Definition: data.hpp:78
Definition: controller.hpp:25
float mStartTime
Definition: controller.hpp:152
ValueT interpKey(float time) const
Definition: controller.hpp:60
QuaternionInterpolator mRotations
Definition: controller.hpp:200
FloatInterpolator mVTrans
Definition: controller.hpp:226
float mStopTime
Definition: controller.hpp:153
virtual float getMaximum() const
Definition: controller.cpp:65
std::set< int > mTextureUnits
Definition: controller.hpp:229
Must be set on a SceneUtil::MorphGeometry.
Definition: controller.hpp:171
Definition: controller.hpp:156
float calculate(float value) const
Definition: controller.cpp:28
Definition: data.hpp:186
Definition: controller.hpp:266
MapT::MapType::const_iterator mLastHighKey
Definition: controller.hpp:117
ValueInterpolator< Nif::QuaternionKeyMap, QuaternionSlerpFunc > QuaternionInterpolator
Definition: controller.hpp:143