Go to the documentation of this file.00001
00002
00003
00004
00005 #ifndef __S_ANIMATED_MESH_H_INCLUDED__
00006 #define __S_ANIMATED_MESH_H_INCLUDED__
00007
00008 #include "IAnimatedMesh.h"
00009 #include "IMesh.h"
00010 #include "aabbox3d.h"
00011 #include "irrArray.h"
00012
00013 namespace irr
00014 {
00015 namespace scene
00016 {
00017
00019 struct SAnimatedMesh : public IAnimatedMesh
00020 {
00022 SAnimatedMesh(scene::IMesh* mesh=0, scene::E_ANIMATED_MESH_TYPE type=scene::EAMT_UNKNOWN) : IAnimatedMesh(), FramesPerSecond(25.f), Type(type)
00023 {
00024 #ifdef _DEBUG
00025 setDebugName("SAnimatedMesh");
00026 #endif
00027 addMesh(mesh);
00028 recalculateBoundingBox();
00029 }
00030
00032 virtual ~SAnimatedMesh()
00033 {
00034
00035 for (u32 i=0; i<Meshes.size(); ++i)
00036 Meshes[i]->drop();
00037 }
00038
00040
00041 virtual u32 getFrameCount() const
00042 {
00043 return Meshes.size();
00044 }
00045
00047
00048 virtual f32 getAnimationSpeed() const
00049 {
00050 return FramesPerSecond;
00051 }
00052
00054
00056 virtual void setAnimationSpeed(f32 fps)
00057 {
00058 FramesPerSecond=fps;
00059 }
00060
00062
00069 virtual IMesh* getMesh(s32 frame, s32 detailLevel=255, s32 startFrameLoop=-1, s32 endFrameLoop=-1)
00070 {
00071 if (Meshes.empty())
00072 return 0;
00073
00074 return Meshes[frame];
00075 }
00076
00078 void addMesh(IMesh* mesh)
00079 {
00080 if (mesh)
00081 {
00082 mesh->grab();
00083 Meshes.push_back(mesh);
00084 }
00085 }
00086
00088
00089 virtual const core::aabbox3d<f32>& getBoundingBox() const
00090 {
00091 return Box;
00092 }
00093
00095 virtual void setBoundingBox(const core::aabbox3df& box)
00096 {
00097 Box = box;
00098 }
00099
00101 void recalculateBoundingBox()
00102 {
00103 Box.reset(0,0,0);
00104
00105 if (Meshes.empty())
00106 return;
00107
00108 Box = Meshes[0]->getBoundingBox();
00109
00110 for (u32 i=1; i<Meshes.size(); ++i)
00111 Box.addInternalBox(Meshes[i]->getBoundingBox());
00112 }
00113
00115 virtual E_ANIMATED_MESH_TYPE getMeshType() const
00116 {
00117 return Type;
00118 }
00119
00121 virtual u32 getMeshBufferCount() const
00122 {
00123 if (Meshes.empty())
00124 return 0;
00125
00126 return Meshes[0]->getMeshBufferCount();
00127 }
00128
00130 virtual IMeshBuffer* getMeshBuffer(u32 nr) const
00131 {
00132 if (Meshes.empty())
00133 return 0;
00134
00135 return Meshes[0]->getMeshBuffer(nr);
00136 }
00137
00139
00142 virtual IMeshBuffer* getMeshBuffer( const video::SMaterial &material) const
00143 {
00144 if (Meshes.empty())
00145 return 0;
00146
00147 return Meshes[0]->getMeshBuffer(material);
00148 }
00149
00151 virtual void setMaterialFlag(video::E_MATERIAL_FLAG flag, bool newvalue)
00152 {
00153 for (u32 i=0; i<Meshes.size(); ++i)
00154 Meshes[i]->setMaterialFlag(flag, newvalue);
00155 }
00156
00158 virtual void setHardwareMappingHint( E_HARDWARE_MAPPING newMappingHint, E_BUFFER_TYPE buffer=EBT_VERTEX_AND_INDEX )
00159 {
00160 for (u32 i=0; i<Meshes.size(); ++i)
00161 Meshes[i]->setHardwareMappingHint(newMappingHint, buffer);
00162 }
00163
00165 virtual void setDirty(E_BUFFER_TYPE buffer=EBT_VERTEX_AND_INDEX)
00166 {
00167 for (u32 i=0; i<Meshes.size(); ++i)
00168 Meshes[i]->setDirty(buffer);
00169 }
00170
00172 core::array<IMesh*> Meshes;
00173
00175 core::aabbox3d<f32> Box;
00176
00178 f32 FramesPerSecond;
00179
00181 E_ANIMATED_MESH_TYPE Type;
00182 };
00183
00184
00185 }
00186 }
00187
00188 #endif
00189