| 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