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 __S_MESH_H_INCLUDED__ 00006 #define __S_MESH_H_INCLUDED__ 00007 00008 #include "IMesh.h" 00009 #include "IMeshBuffer.h" 00010 #include "aabbox3d.h" 00011 #include "irrArray.h" 00012 00013 namespace irr 00014 { 00015 namespace scene 00016 { 00018 struct SMesh : public IMesh 00019 { 00021 SMesh() 00022 { 00023 #ifdef _DEBUG 00024 setDebugName("SMesh"); 00025 #endif 00026 } 00027 00029 virtual ~SMesh() 00030 { 00031 // drop buffers 00032 for (u32 i=0; i<MeshBuffers.size(); ++i) 00033 MeshBuffers[i]->drop(); 00034 } 00035 00037 virtual void clear() 00038 { 00039 for (u32 i=0; i<MeshBuffers.size(); ++i) 00040 MeshBuffers[i]->drop(); 00041 MeshBuffers.clear(); 00042 BoundingBox.reset ( 0.f, 0.f, 0.f ); 00043 } 00044 00045 00047 virtual u32 getMeshBufferCount() const 00048 { 00049 return MeshBuffers.size(); 00050 } 00051 00053 virtual IMeshBuffer* getMeshBuffer(u32 nr) const 00054 { 00055 return MeshBuffers[nr]; 00056 } 00057 00059 00060 virtual IMeshBuffer* getMeshBuffer( const video::SMaterial & material) const 00061 { 00062 for (s32 i = (s32)MeshBuffers.size()-1; i >= 0; --i) 00063 { 00064 if ( material == MeshBuffers[i]->getMaterial()) 00065 return MeshBuffers[i]; 00066 } 00067 00068 return 0; 00069 } 00070 00072 virtual const core::aabbox3d<f32>& getBoundingBox() const 00073 { 00074 return BoundingBox; 00075 } 00076 00078 virtual void setBoundingBox( const core::aabbox3df& box) 00079 { 00080 BoundingBox = box; 00081 } 00082 00084 void recalculateBoundingBox() 00085 { 00086 if (MeshBuffers.size()) 00087 { 00088 BoundingBox = MeshBuffers[0]->getBoundingBox(); 00089 for (u32 i=1; i<MeshBuffers.size(); ++i) 00090 BoundingBox.addInternalBox(MeshBuffers[i]->getBoundingBox()); 00091 } 00092 else 00093 BoundingBox.reset(0.0f, 0.0f, 0.0f); 00094 } 00095 00097 00098 void addMeshBuffer(IMeshBuffer* buf) 00099 { 00100 if (buf) 00101 { 00102 buf->grab(); 00103 MeshBuffers.push_back(buf); 00104 } 00105 } 00106 00108 virtual void setMaterialFlag(video::E_MATERIAL_FLAG flag, bool newvalue) 00109 { 00110 for (u32 i=0; i<MeshBuffers.size(); ++i) 00111 MeshBuffers[i]->getMaterial().setFlag(flag, newvalue); 00112 } 00113 00115 virtual void setHardwareMappingHint( E_HARDWARE_MAPPING newMappingHint, E_BUFFER_TYPE buffer=EBT_VERTEX_AND_INDEX ) 00116 { 00117 for (u32 i=0; i<MeshBuffers.size(); ++i) 00118 MeshBuffers[i]->setHardwareMappingHint(newMappingHint, buffer); 00119 } 00120 00122 virtual void setDirty(E_BUFFER_TYPE buffer=EBT_VERTEX_AND_INDEX) 00123 { 00124 for (u32 i=0; i<MeshBuffers.size(); ++i) 00125 MeshBuffers[i]->setDirty(buffer); 00126 } 00127 00129 core::array<IMeshBuffer*> MeshBuffers; 00130 00132 core::aabbox3d<f32> BoundingBox; 00133 }; 00134 00135 00136 } // end namespace scene 00137 } // end namespace irr 00138 00139 #endif 00140