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(), Type(type)
00023 {
00024 #ifdef _DEBUG
00025 setDebugName("SAnimatedMesh");
00026 #endif
00027 addMesh(mesh);
00028 recalculateBoundingBox();
00029 }
00030
00031
00033 virtual ~SAnimatedMesh()
00034 {
00035
00036 for (u32 i=0; i<Meshes.size(); ++i)
00037 Meshes[i]->drop();
00038 }
00039
00040
00042
00043 virtual u32 getFrameCount() const
00044 {
00045 return Meshes.size();
00046 }
00047
00048
00050
00057 virtual IMesh* getMesh(s32 frame, s32 detailLevel, s32 startFrameLoop=-1, s32 endFrameLoop=-1)
00058 {
00059 if (Meshes.empty())
00060 return 0;
00061
00062 return Meshes[frame];
00063 }
00064
00065
00067 void addMesh(IMesh* mesh)
00068 {
00069 if (mesh)
00070 {
00071 mesh->grab();
00072 Meshes.push_back(mesh);
00073 }
00074 }
00075
00076
00078
00079 virtual const core::aabbox3d<f32>& getBoundingBox() const
00080 {
00081 return Box;
00082 }
00083
00084
00086 virtual void setBoundingBox(const core::aabbox3df& box)
00087 {
00088 Box = box;
00089 }
00090
00092 void recalculateBoundingBox()
00093 {
00094 Box.reset(0,0,0);
00095
00096 if (Meshes.empty())
00097 return;
00098
00099 Box = Meshes[0]->getBoundingBox();
00100
00101 for (u32 i=1; i<Meshes.size(); ++i)
00102 Box.addInternalBox(Meshes[i]->getBoundingBox());
00103 }
00104
00105
00107 virtual E_ANIMATED_MESH_TYPE getMeshType() const
00108 {
00109 return Type;
00110 }
00111
00112
00114 virtual u32 getMeshBufferCount() const
00115 {
00116 if (Meshes.empty())
00117 return 0;
00118
00119 return Meshes[0]->getMeshBufferCount();
00120 }
00121
00122
00124 virtual IMeshBuffer* getMeshBuffer(u32 nr) const
00125 {
00126 if (Meshes.empty())
00127 return 0;
00128
00129 return Meshes[0]->getMeshBuffer(nr);
00130 }
00131
00132
00134
00137 virtual IMeshBuffer* getMeshBuffer( const video::SMaterial &material) const
00138 {
00139 if (Meshes.empty())
00140 return 0;
00141
00142 return Meshes[0]->getMeshBuffer(material);
00143 }
00144
00145
00147 virtual void setMaterialFlag(video::E_MATERIAL_FLAG flag, bool newvalue)
00148 {
00149 for (u32 i=0; i<Meshes.size(); ++i)
00150 Meshes[i]->setMaterialFlag(flag, newvalue);
00151 }
00152
00154 virtual void setHardwareMappingHint( E_HARDWARE_MAPPING newMappingHint, E_BUFFER_TYPE buffer=EBT_VERTEX_AND_INDEX )
00155 {
00156 for (u32 i=0; i<Meshes.size(); ++i)
00157 Meshes[i]->setHardwareMappingHint(newMappingHint, buffer);
00158 }
00159
00161 virtual void setDirty(E_BUFFER_TYPE buffer=EBT_VERTEX_AND_INDEX)
00162 {
00163 for (u32 i=0; i<Meshes.size(); ++i)
00164 Meshes[i]->setDirty(buffer);
00165 }
00166
00168 core::array<IMesh*> Meshes;
00169
00171 core::aabbox3d<f32> Box;
00172
00174 E_ANIMATED_MESH_TYPE Type;
00175 };
00176
00177
00178 }
00179 }
00180
00181 #endif
00182