aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/src/others/irrlicht-1.8.1/include/ISkinnedMesh.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/others/irrlicht-1.8.1/include/ISkinnedMesh.h')
-rw-r--r--src/others/irrlicht-1.8.1/include/ISkinnedMesh.h219
1 files changed, 219 insertions, 0 deletions
diff --git a/src/others/irrlicht-1.8.1/include/ISkinnedMesh.h b/src/others/irrlicht-1.8.1/include/ISkinnedMesh.h
new file mode 100644
index 0000000..03f5016
--- /dev/null
+++ b/src/others/irrlicht-1.8.1/include/ISkinnedMesh.h
@@ -0,0 +1,219 @@
1// Copyright (C) 2002-2012 Nikolaus Gebhardt
2// This file is part of the "Irrlicht Engine".
3// For conditions of distribution and use, see copyright notice in irrlicht.h
4
5#ifndef __I_SKINNED_MESH_H_INCLUDED__
6#define __I_SKINNED_MESH_H_INCLUDED__
7
8#include "irrArray.h"
9#include "IBoneSceneNode.h"
10#include "IAnimatedMesh.h"
11#include "SSkinMeshBuffer.h"
12
13namespace irr
14{
15namespace scene
16{
17
18 enum E_INTERPOLATION_MODE
19 {
20 // constant does use the current key-values without interpolation
21 EIM_CONSTANT = 0,
22
23 // linear interpolation
24 EIM_LINEAR,
25
26 //! count of all available interpolation modes
27 EIM_COUNT
28 };
29
30
31 //! Interface for using some special functions of Skinned meshes
32 class ISkinnedMesh : public IAnimatedMesh
33 {
34 public:
35
36 //! Gets joint count.
37 /** \return Amount of joints in the skeletal animated mesh. */
38 virtual u32 getJointCount() const = 0;
39
40 //! Gets the name of a joint.
41 /** \param number: Zero based index of joint. The last joint
42 has the number getJointCount()-1;
43 \return Name of joint and null if an error happened. */
44 virtual const c8* getJointName(u32 number) const = 0;
45
46 //! Gets a joint number from its name
47 /** \param name: Name of the joint.
48 \return Number of the joint or -1 if not found. */
49 virtual s32 getJointNumber(const c8* name) const = 0;
50
51 //! Use animation from another mesh
52 /** The animation is linked (not copied) based on joint names
53 so make sure they are unique.
54 \return True if all joints in this mesh were
55 matched up (empty names will not be matched, and it's case
56 sensitive). Unmatched joints will not be animated. */
57 virtual bool useAnimationFrom(const ISkinnedMesh *mesh) = 0;
58
59 //! Update Normals when Animating
60 /** \param on If false don't animate, which is faster.
61 Else update normals, which allows for proper lighting of
62 animated meshes. */
63 virtual void updateNormalsWhenAnimating(bool on) = 0;
64
65 //! Sets Interpolation Mode
66 virtual void setInterpolationMode(E_INTERPOLATION_MODE mode) = 0;
67
68 //! Animates this mesh's joints based on frame input
69 virtual void animateMesh(f32 frame, f32 blend)=0;
70
71 //! Preforms a software skin on this mesh based of joint positions
72 virtual void skinMesh() = 0;
73
74 //! converts the vertex type of all meshbuffers to tangents.
75 /** E.g. used for bump mapping. */
76 virtual void convertMeshToTangents() = 0;
77
78 //! Allows to enable hardware skinning.
79 /* This feature is not implementated in Irrlicht yet */
80 virtual bool setHardwareSkinning(bool on) = 0;
81
82 //! A vertex weight
83 struct SWeight
84 {
85 //! Index of the mesh buffer
86 u16 buffer_id; //I doubt 32bits is needed
87
88 //! Index of the vertex
89 u32 vertex_id; //Store global ID here
90
91 //! Weight Strength/Percentage (0-1)
92 f32 strength;
93
94 private:
95 //! Internal members used by CSkinnedMesh
96 friend class CSkinnedMesh;
97 bool *Moved;
98 core::vector3df StaticPos;
99 core::vector3df StaticNormal;
100 };
101
102
103 //! Animation keyframe which describes a new position
104 struct SPositionKey
105 {
106 f32 frame;
107 core::vector3df position;
108 };
109
110 //! Animation keyframe which describes a new scale
111 struct SScaleKey
112 {
113 f32 frame;
114 core::vector3df scale;
115 };
116
117 //! Animation keyframe which describes a new rotation
118 struct SRotationKey
119 {
120 f32 frame;
121 core::quaternion rotation;
122 };
123
124 //! Joints
125 struct SJoint
126 {
127 SJoint() : UseAnimationFrom(0), GlobalSkinningSpace(false),
128 positionHint(-1),scaleHint(-1),rotationHint(-1)
129 {
130 }
131
132 //! The name of this joint
133 core::stringc Name;
134
135 //! Local matrix of this joint
136 core::matrix4 LocalMatrix;
137
138 //! List of child joints
139 core::array<SJoint*> Children;
140
141 //! List of attached meshes
142 core::array<u32> AttachedMeshes;
143
144 //! Animation keys causing translation change
145 core::array<SPositionKey> PositionKeys;
146
147 //! Animation keys causing scale change
148 core::array<SScaleKey> ScaleKeys;
149
150 //! Animation keys causing rotation change
151 core::array<SRotationKey> RotationKeys;
152
153 //! Skin weights
154 core::array<SWeight> Weights;
155
156 //! Unnecessary for loaders, will be overwritten on finalize
157 core::matrix4 GlobalMatrix;
158 core::matrix4 GlobalAnimatedMatrix;
159 core::matrix4 LocalAnimatedMatrix;
160 core::vector3df Animatedposition;
161 core::vector3df Animatedscale;
162 core::quaternion Animatedrotation;
163
164 core::matrix4 GlobalInversedMatrix; //the x format pre-calculates this
165
166 private:
167 //! Internal members used by CSkinnedMesh
168 friend class CSkinnedMesh;
169
170 SJoint *UseAnimationFrom;
171 bool GlobalSkinningSpace;
172
173 s32 positionHint;
174 s32 scaleHint;
175 s32 rotationHint;
176 };
177
178
179 //Interface for the mesh loaders (finalize should lock these functions, and they should have some prefix like loader_
180
181 //these functions will use the needed arrays, set values, etc to help the loaders
182
183 //! exposed for loaders: to add mesh buffers
184 virtual core::array<SSkinMeshBuffer*>& getMeshBuffers() = 0;
185
186 //! exposed for loaders: joints list
187 virtual core::array<SJoint*>& getAllJoints() = 0;
188
189 //! exposed for loaders: joints list
190 virtual const core::array<SJoint*>& getAllJoints() const = 0;
191
192 //! loaders should call this after populating the mesh
193 virtual void finalize() = 0;
194
195 //! Adds a new meshbuffer to the mesh, access it as last one
196 virtual SSkinMeshBuffer* addMeshBuffer() = 0;
197
198 //! Adds a new joint to the mesh, access it as last one
199 virtual SJoint* addJoint(SJoint *parent=0) = 0;
200
201 //! Adds a new weight to the mesh, access it as last one
202 virtual SWeight* addWeight(SJoint *joint) = 0;
203
204 //! Adds a new position key to the mesh, access it as last one
205 virtual SPositionKey* addPositionKey(SJoint *joint) = 0;
206 //! Adds a new scale key to the mesh, access it as last one
207 virtual SScaleKey* addScaleKey(SJoint *joint) = 0;
208 //! Adds a new rotation key to the mesh, access it as last one
209 virtual SRotationKey* addRotationKey(SJoint *joint) = 0;
210
211 //! Check if the mesh is non-animated
212 virtual bool isStatic()=0;
213 };
214
215} // end namespace scene
216} // end namespace irr
217
218#endif
219