Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #ifndef __CS_IMESH_ANIMNODE_TEMPLATE_H__
00022 #define __CS_IMESH_ANIMNODE_TEMPLATE_H__
00023
00028 #include "csextern.h"
00029 #include "csutil/csstring.h"
00030 #include "csutil/refarr.h"
00031 #include "csutil/scf_implementation.h"
00032 #include "csutil/weakref.h"
00033 #include "imesh/animnode/skeleton2anim.h"
00034 #include "iutil/comp.h"
00035
00036 namespace CS {
00037 namespace Animation {
00038
00061 template<typename ThisType,
00062 typename ManagerInterface,
00063 typename FactoryType>
00064 class AnimNodeManagerCommon
00065 : public scfImplementation2<AnimNodeManagerCommon<ThisType, ManagerInterface, FactoryType>,
00066 ManagerInterface,
00067 iComponent>
00068 {
00069 typedef typename ManagerInterface::FactoryInterfaceType FactoryInterfaceType;
00070 typedef scfImplementation2<AnimNodeManagerCommon<ThisType, ManagerInterface, FactoryType>,
00071 ManagerInterface,
00072 iComponent> scfImplementationType;
00073 public:
00074 typedef AnimNodeManagerCommon<ThisType, ManagerInterface, FactoryType> AnimNodeManagerCommonType;
00075
00076 AnimNodeManagerCommon (iBase* parent)
00077 : scfImplementationType (this, parent), object_reg (nullptr)
00078 {}
00079
00080 FactoryInterfaceType* CreateAnimNodeFactory (const char* name)
00081 {
00082 csRef<FactoryInterfaceType> newFact;
00083 newFact.AttachNew (new FactoryType (static_cast<ThisType*> (this), name));
00084 return nodeFactories.PutUnique (name, newFact);
00085 }
00086 FactoryInterfaceType* FindAnimNodeFactory (const char* name)
00087 {
00088 return nodeFactories.Get (name, 0);
00089 }
00090 void RemoveAnimNodeFactory (const char* name)
00091 {
00092 nodeFactories.DeleteAll (name);
00093 }
00094 void ClearAnimNodeFactories ()
00095 {
00096 nodeFactories.DeleteAll ();
00097 }
00098
00101 bool Initialize (iObjectRegistry* object_reg)
00102 { this->object_reg = object_reg; return true; }
00105 iObjectRegistry* GetObjectRegistry() const { return object_reg; }
00106 protected:
00107 iObjectRegistry* object_reg;
00108 csHash<csRef<FactoryInterfaceType>, csString> nodeFactories;
00109 };
00110
00114 class CS_CRYSTALSPACE_EXPORT SkeletonAnimNodeFactory
00115 : public virtual iSkeletonAnimNodeFactory
00116 {
00117 public:
00121 SkeletonAnimNodeFactory (const char* name);
00122
00126 virtual ~SkeletonAnimNodeFactory () {}
00127
00131 virtual const char* GetNodeName () const;
00132
00133 protected:
00135 csString name;
00136 };
00137
00138 class SkeletonAnimNodeSingleBase;
00139
00143 class CS_CRYSTALSPACE_EXPORT SkeletonAnimNodeFactorySingle
00144 : public SkeletonAnimNodeFactory
00145 {
00146 public:
00150 SkeletonAnimNodeFactorySingle (const char* name);
00151
00155 virtual ~SkeletonAnimNodeFactorySingle () {}
00156
00160 virtual void SetChildNode (iSkeletonAnimNodeFactory* factory);
00161
00165 virtual iSkeletonAnimNodeFactory* GetChildNode () const;
00166
00167 csPtr<iSkeletonAnimNode> CreateInstance (iSkeletonAnimPacket* packet, iSkeleton* skeleton);
00168 iSkeletonAnimNodeFactory* FindNode (const char* name);
00169
00170 protected:
00172 csRef<CS::Animation::iSkeletonAnimNodeFactory> childNodeFactory;
00173
00175 virtual csPtr<SkeletonAnimNodeSingleBase> ActualCreateInstance (iSkeletonAnimPacket* packet,
00176 iSkeleton* skeleton) = 0;
00177 };
00178
00180 class CS_CRYSTALSPACE_EXPORT SkeletonAnimNodeSingleBase : public virtual iSkeletonAnimNode
00181 {
00182 public:
00186 SkeletonAnimNodeSingleBase (CS::Animation::iSkeleton* skeleton);
00187
00191 virtual ~SkeletonAnimNodeSingleBase () {}
00192
00196 virtual iSkeletonAnimNode* GetChildNode () const;
00197
00198 virtual void Play ();
00199 virtual void Stop ();
00200 virtual void SetPlaybackPosition (float time);
00201 virtual float GetPlaybackPosition () const;
00202 virtual float GetDuration () const;
00203 virtual void SetPlaybackSpeed (float speed);
00204 virtual float GetPlaybackSpeed () const;
00205 virtual void BlendState (AnimatedMeshState* state, float baseWeight = 1.0f);
00206 virtual void TickAnimation (float dt);
00207 virtual bool IsActive () const;
00208 virtual void AddAnimationCallback (iSkeletonAnimCallback* callback);
00209 virtual void RemoveAnimationCallback (iSkeletonAnimCallback* callback);
00210
00211 protected:
00213 csWeakRef<CS::Animation::iSkeleton> skeleton;
00214
00216 csRef<CS::Animation::iSkeletonAnimNode> childNode;
00217
00219 bool isPlaying;
00220
00222 float playbackSpeed;
00223
00224 friend class SkeletonAnimNodeFactorySingle;
00225 };
00226
00232 template<typename FactoryType>
00233 class SkeletonAnimNodeSingle : public SkeletonAnimNodeSingleBase
00234 {
00235 public:
00236 SkeletonAnimNodeSingle (FactoryType* factory,
00237 CS::Animation::iSkeleton* skeleton)
00238 : SkeletonAnimNodeSingleBase (skeleton), factory (factory) {}
00239
00240 iSkeletonAnimNodeFactory* GetFactory () const
00241 {
00242 return factory;
00243 }
00244
00245 iSkeletonAnimNode* FindNode (const char* name)
00246 {
00247 if (strcmp (factory->GetNodeName (), name) == 0)
00248 return this;
00249
00250 if (childNode)
00251 return childNode->FindNode (name);
00252
00253 return nullptr;
00254 }
00255
00256 protected:
00258 csRef<FactoryType> factory;
00259 };
00260
00264 class CS_CRYSTALSPACE_EXPORT SkeletonAnimNodeFactoryMulti
00265 : public SkeletonAnimNodeFactory
00266 {
00267 public:
00271 SkeletonAnimNodeFactoryMulti (const char* name);
00272
00276 virtual ~SkeletonAnimNodeFactoryMulti () {}
00277
00281 virtual void AddChildNode (iSkeletonAnimNodeFactory* factory);
00282
00286 virtual void RemoveChildNode (iSkeletonAnimNodeFactory* factory);
00287
00291 virtual void ClearChildNodes ();
00292
00296 virtual iSkeletonAnimNodeFactory* GetChildNode (size_t index) const;
00297
00298 protected:
00300 csRefArray<CS::Animation::iSkeletonAnimNodeFactory> childNodeFactories;
00301 };
00302
00303 }
00304 }
00305
00306 #endif // __CS_IMESH_ANIMNODE_TEMPLATE_H__