/* -*-c++-*- * Copyright (C) 2008 Cedric Pinson * * This library is open source and may be redistributed and/or modified under * the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or * (at your option) any later version. The full license is in LICENSE file * included with this distribution, and on the openscenegraph.org website. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * OpenSceneGraph Public License for more details. */ #ifndef OSGANIMATION_SAMPLER_H #define OSGANIMATION_SAMPLER_H #include #include #include #include #include #include #include namespace osgAnimation { class Sampler : public osg::Referenced { public: virtual KeyframeContainer* getKeyframeContainer() = 0; virtual const KeyframeContainer* getKeyframeContainer() const = 0; protected: }; // Sampler generic template class TemplateSampler : public Sampler { public: typedef typename F::KeyframeType KeyframeType; typedef TemplateKeyframeContainer KeyframeContainerType; typedef typename F::UsingType UsingType; typedef F FunctorType; TemplateSampler() {} ~TemplateSampler() {} void getValueAt(float time, UsingType& result) const { _functor.getValue(*_keyframes, time, result);} void setKeyframeContainer(KeyframeContainerType* kf) { _keyframes = kf;} virtual KeyframeContainer* getKeyframeContainer() { return _keyframes.get(); } virtual const KeyframeContainer* getKeyframeContainer() const { return _keyframes.get();} KeyframeContainerType* getKeyframeContainerTyped() { return _keyframes.get();} const KeyframeContainerType* getKeyframeContainerTyped() const { return _keyframes.get();} KeyframeContainerType* getOrCreateKeyframeContainer() { if (_keyframes != 0) return _keyframes.get(); _keyframes = new KeyframeContainerType; return _keyframes.get(); } float getStartTime() const { OSGANIMATION_ASSERT(_keyframes.valid() && !_keyframes->empty() && "no keyframes"); return _keyframes->front().getTime(); } float getEndTime() const { OSGANIMATION_ASSERT(_keyframes.valid() && !_keyframes->empty() && "no keyframes"); return _keyframes->back().getTime(); } protected: FunctorType _functor; osg::ref_ptr _keyframes; }; template class TemplateCompositeSampler : public osg::Referenced { VALUESAMPLERTYPE& _value; TIMESAMPLERTYPE& _time; public: typedef typename VALUESAMPLERTYPE::FunctorType::UsingType UsingType; typedef typename VALUESAMPLERTYPE::FunctorType::KeyframeType KeyframeType; TemplateCompositeSampler(VALUESAMPLERTYPE& value, TIMESAMPLERTYPE& time) : _value(value), _time(time) { } void getValueAt(float time, typename VALUESAMPLERTYPE::FunctorType::UsingType& result) { float newtime; _time.getValueAt(time, newtime); _value.getValueAt(newtime, result); } float getStartTime() const {return _time.getStartTime(); } float getEndTime() const {return _time.getEndTime();} }; typedef TemplateSampler DoubleLinearSampler; typedef TemplateSampler FloatLinearSampler; typedef TemplateSampler Vec2LinearSampler; typedef TemplateSampler Vec3LinearSampler; typedef TemplateSampler Vec4LinearSampler; typedef TemplateSampler QuatSphericalLinearSampler; typedef TemplateSampler FloatCubicBezierSampler; typedef TemplateSampler DoubleCubicBezierSampler; typedef TemplateSampler Vec2CubicBezierSampler; typedef TemplateSampler Vec3CubicBezierSampler; typedef TemplateSampler Vec4CubicBezierSampler; }; #endif