Irrlicht 3D Engine
ISkinnedMesh.h
Go to the documentation of this file.
00001 // Copyright (C) 2002-2012 Nikolaus Gebhardt
00002 // This file is part of the "Irrlicht Engine".
00003 // For conditions of distribution and use, see copyright notice in irrlicht.h
00004 
00005 #ifndef __I_SKINNED_MESH_H_INCLUDED__
00006 #define __I_SKINNED_MESH_H_INCLUDED__
00007 
00008 #include "irrArray.h"
00009 #include "IBoneSceneNode.h"
00010 #include "IAnimatedMesh.h"
00011 #include "SSkinMeshBuffer.h"
00012 
00013 namespace irr
00014 {
00015 namespace scene
00016 {
00017 
00018     enum E_INTERPOLATION_MODE
00019     {
00020         // constant does use the current key-values without interpolation
00021         EIM_CONSTANT = 0,
00022 
00023         // linear interpolation
00024         EIM_LINEAR,
00025 
00027         EIM_COUNT
00028     };
00029 
00030 
00032     class ISkinnedMesh : public IAnimatedMesh
00033     {
00034     public:
00035 
00037 
00038         virtual u32 getJointCount() const = 0;
00039 
00041 
00044         virtual const c8* getJointName(u32 number) const = 0;
00045 
00047 
00049         virtual s32 getJointNumber(const c8* name) const = 0;
00050 
00052 
00057         virtual bool useAnimationFrom(const ISkinnedMesh *mesh) = 0;
00058 
00060 
00063         virtual void updateNormalsWhenAnimating(bool on) = 0;
00064 
00066         virtual void setInterpolationMode(E_INTERPOLATION_MODE mode) = 0;
00067 
00069         virtual void animateMesh(f32 frame, f32 blend)=0;
00070 
00072         virtual void skinMesh() = 0;
00073 
00075 
00076         virtual void convertMeshToTangents() = 0;
00077 
00079         /* This feature is not implementated in Irrlicht yet */
00080         virtual bool setHardwareSkinning(bool on) = 0;
00081 
00083         struct SWeight
00084         {
00086             u16 buffer_id; //I doubt 32bits is needed
00087 
00089             u32 vertex_id; //Store global ID here
00090 
00092             f32 strength;
00093 
00094         private:
00096             friend class CSkinnedMesh;
00097             bool *Moved;
00098             core::vector3df StaticPos;
00099             core::vector3df StaticNormal;
00100         };
00101 
00102 
00104         struct SPositionKey
00105         {
00106             f32 frame;
00107             core::vector3df position;
00108         };
00109 
00111         struct SScaleKey
00112         {
00113             f32 frame;
00114             core::vector3df scale;
00115         };
00116 
00118         struct SRotationKey
00119         {
00120             f32 frame;
00121             core::quaternion rotation;
00122         };
00123 
00125         struct SJoint
00126         {
00127             SJoint() : UseAnimationFrom(0), GlobalSkinningSpace(false),
00128                 positionHint(-1),scaleHint(-1),rotationHint(-1)
00129             {
00130             }
00131 
00133             core::stringc Name;
00134 
00136             core::matrix4 LocalMatrix;
00137 
00139             core::array<SJoint*> Children;
00140 
00142             core::array<u32> AttachedMeshes;
00143 
00145             core::array<SPositionKey> PositionKeys;
00146 
00148             core::array<SScaleKey> ScaleKeys;
00149 
00151             core::array<SRotationKey> RotationKeys;
00152 
00154             core::array<SWeight> Weights;
00155 
00157             core::matrix4 GlobalMatrix;
00158             core::matrix4 GlobalAnimatedMatrix;
00159             core::matrix4 LocalAnimatedMatrix;
00160             core::vector3df Animatedposition;
00161             core::vector3df Animatedscale;
00162             core::quaternion Animatedrotation;
00163 
00164             core::matrix4 GlobalInversedMatrix; //the x format pre-calculates this
00165 
00166         private:
00168             friend class CSkinnedMesh;
00169 
00170             SJoint *UseAnimationFrom;
00171             bool GlobalSkinningSpace;
00172 
00173             s32 positionHint;
00174             s32 scaleHint;
00175             s32 rotationHint;
00176         };
00177 
00178 
00179         //Interface for the mesh loaders (finalize should lock these functions, and they should have some prefix like loader_
00180 
00181         //these functions will use the needed arrays, set values, etc to help the loaders
00182 
00184         virtual core::array<SSkinMeshBuffer*>& getMeshBuffers() = 0;
00185 
00187         virtual core::array<SJoint*>& getAllJoints() = 0;
00188 
00190         virtual const core::array<SJoint*>& getAllJoints() const = 0;
00191 
00193         virtual void finalize() = 0;
00194 
00196         virtual SSkinMeshBuffer* addMeshBuffer() = 0;
00197 
00199         virtual SJoint* addJoint(SJoint *parent=0) = 0;
00200 
00202         virtual SWeight* addWeight(SJoint *joint) = 0;
00203 
00205         virtual SPositionKey* addPositionKey(SJoint *joint) = 0;
00207         virtual SScaleKey* addScaleKey(SJoint *joint) = 0;
00209         virtual SRotationKey* addRotationKey(SJoint *joint) = 0;
00210 
00212         virtual bool isStatic()=0;
00213     };
00214 
00215 } // end namespace scene
00216 } // end namespace irr
00217 
00218 #endif
00219