Line data Source code
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 __S_ANIMATED_MESH_H_INCLUDED__
6 : #define __S_ANIMATED_MESH_H_INCLUDED__
7 :
8 : #include "IAnimatedMesh.h"
9 : #include "IMesh.h"
10 : #include "aabbox3d.h"
11 : #include "irrArray.h"
12 :
13 : namespace irr
14 : {
15 : namespace scene
16 : {
17 :
18 : //! Simple implementation of the IAnimatedMesh interface.
19 : struct SAnimatedMesh : public IAnimatedMesh
20 : {
21 : //! constructor
22 1 : SAnimatedMesh(scene::IMesh* mesh=0, scene::E_ANIMATED_MESH_TYPE type=scene::EAMT_UNKNOWN) : IAnimatedMesh(), FramesPerSecond(25.f), Type(type)
23 : {
24 : #ifdef _DEBUG
25 : setDebugName("SAnimatedMesh");
26 : #endif
27 1 : addMesh(mesh);
28 1 : recalculateBoundingBox();
29 1 : }
30 :
31 : //! destructor
32 2808 : virtual ~SAnimatedMesh()
33 2808 : {
34 : // drop meshes
35 2808 : for (u32 i=0; i<Meshes.size(); ++i)
36 1404 : Meshes[i]->drop();
37 2808 : }
38 :
39 : //! Gets the frame count of the animated mesh.
40 : /** \return Amount of frames. If the amount is 1, it is a static, non animated mesh. */
41 0 : virtual u32 getFrameCount() const
42 : {
43 0 : return Meshes.size();
44 : }
45 :
46 : //! Gets the default animation speed of the animated mesh.
47 : /** \return Amount of frames per second. If the amount is 0, it is a static, non animated mesh. */
48 0 : virtual f32 getAnimationSpeed() const
49 : {
50 0 : return FramesPerSecond;
51 : }
52 :
53 : //! Gets the frame count of the animated mesh.
54 : /** \param fps Frames per second to play the animation with. If the amount is 0, it is not animated.
55 : The actual speed is set in the scene node the mesh is instantiated in.*/
56 0 : virtual void setAnimationSpeed(f32 fps)
57 : {
58 0 : FramesPerSecond=fps;
59 0 : }
60 :
61 : //! Returns the IMesh interface for a frame.
62 : /** \param frame: Frame number as zero based index. The maximum frame number is
63 : getFrameCount() - 1;
64 : \param detailLevel: Level of detail. 0 is the lowest,
65 : 255 the highest level of detail. Most meshes will ignore the detail level.
66 : \param startFrameLoop: start frame
67 : \param endFrameLoop: end frame
68 : \return The animated mesh based on a detail level. */
69 0 : virtual IMesh* getMesh(s32 frame, s32 detailLevel=255, s32 startFrameLoop=-1, s32 endFrameLoop=-1)
70 : {
71 0 : if (Meshes.empty())
72 0 : return 0;
73 :
74 0 : return Meshes[frame];
75 : }
76 :
77 : //! adds a Mesh
78 1 : void addMesh(IMesh* mesh)
79 : {
80 1 : if (mesh)
81 : {
82 1 : mesh->grab();
83 1 : Meshes.push_back(mesh);
84 : }
85 1 : }
86 :
87 : //! Returns an axis aligned bounding box of the mesh.
88 : /** \return A bounding box of this mesh is returned. */
89 1255 : virtual const core::aabbox3d<f32>& getBoundingBox() const
90 : {
91 1255 : return Box;
92 : }
93 :
94 : //! set user axis aligned bounding box
95 2821 : virtual void setBoundingBox(const core::aabbox3df& box)
96 : {
97 2821 : Box = box;
98 2821 : }
99 :
100 : //! Recalculates the bounding box.
101 1 : void recalculateBoundingBox()
102 : {
103 1 : Box.reset(0,0,0);
104 :
105 1 : if (Meshes.empty())
106 0 : return;
107 :
108 1 : Box = Meshes[0]->getBoundingBox();
109 :
110 1 : for (u32 i=1; i<Meshes.size(); ++i)
111 0 : Box.addInternalBox(Meshes[i]->getBoundingBox());
112 : }
113 :
114 : //! Returns the type of the animated mesh.
115 0 : virtual E_ANIMATED_MESH_TYPE getMeshType() const
116 : {
117 0 : return Type;
118 : }
119 :
120 : //! returns amount of mesh buffers.
121 98116 : virtual u32 getMeshBufferCount() const
122 : {
123 98116 : if (Meshes.empty())
124 0 : return 0;
125 :
126 98116 : return Meshes[0]->getMeshBufferCount();
127 : }
128 :
129 : //! returns pointer to a mesh buffer
130 58693 : virtual IMeshBuffer* getMeshBuffer(u32 nr) const
131 : {
132 58693 : if (Meshes.empty())
133 0 : return 0;
134 :
135 58693 : return Meshes[0]->getMeshBuffer(nr);
136 : }
137 :
138 : //! Returns pointer to a mesh buffer which fits a material
139 : /** \param material: material to search for
140 : \return Returns the pointer to the mesh buffer or
141 : NULL if there is no such mesh buffer. */
142 0 : virtual IMeshBuffer* getMeshBuffer( const video::SMaterial &material) const
143 : {
144 0 : if (Meshes.empty())
145 0 : return 0;
146 :
147 0 : return Meshes[0]->getMeshBuffer(material);
148 : }
149 :
150 : //! Set a material flag for all meshbuffers of this mesh.
151 0 : virtual void setMaterialFlag(video::E_MATERIAL_FLAG flag, bool newvalue)
152 : {
153 0 : for (u32 i=0; i<Meshes.size(); ++i)
154 0 : Meshes[i]->setMaterialFlag(flag, newvalue);
155 0 : }
156 :
157 : //! set the hardware mapping hint, for driver
158 0 : virtual void setHardwareMappingHint( E_HARDWARE_MAPPING newMappingHint, E_BUFFER_TYPE buffer=EBT_VERTEX_AND_INDEX )
159 : {
160 0 : for (u32 i=0; i<Meshes.size(); ++i)
161 0 : Meshes[i]->setHardwareMappingHint(newMappingHint, buffer);
162 0 : }
163 :
164 : //! flags the meshbuffer as changed, reloads hardware buffers
165 0 : virtual void setDirty(E_BUFFER_TYPE buffer=EBT_VERTEX_AND_INDEX)
166 : {
167 0 : for (u32 i=0; i<Meshes.size(); ++i)
168 0 : Meshes[i]->setDirty(buffer);
169 0 : }
170 :
171 : //! All meshes defining the animated mesh
172 : core::array<IMesh*> Meshes;
173 :
174 : //! The bounding box of this mesh
175 : core::aabbox3d<f32> Box;
176 :
177 : //! Default animation speed of this mesh.
178 : f32 FramesPerSecond;
179 :
180 : //! The type of the mesh.
181 : E_ANIMATED_MESH_TYPE Type;
182 : };
183 :
184 :
185 : } // end namespace scene
186 : } // end namespace irr
187 :
188 : #endif
189 :
|