1 // Copyright (C) 2002-2012 Nikolaus Gebhardt
\r
2 // This file is part of the "Irrlicht Engine".
\r
3 // For conditions of distribution and use, see copyright notice in irrlicht.h
\r
5 #ifndef __S_MESH_H_INCLUDED__
\r
6 #define __S_MESH_H_INCLUDED__
\r
9 #include "IMeshBuffer.h"
\r
10 #include "aabbox3d.h"
\r
11 #include "irrArray.h"
\r
17 //! Simple implementation of the IMesh interface.
\r
18 struct SMesh : public IMesh
\r
24 setDebugName("SMesh");
\r
32 for (u32 i=0; i<MeshBuffers.size(); ++i)
\r
33 MeshBuffers[i]->drop();
\r
37 virtual void clear()
\r
39 for (u32 i=0; i<MeshBuffers.size(); ++i)
\r
40 MeshBuffers[i]->drop();
\r
41 MeshBuffers.clear();
\r
42 BoundingBox.reset ( 0.f, 0.f, 0.f );
\r
46 //! returns amount of mesh buffers.
\r
47 u32 getMeshBufferCount() const override
\r
49 return MeshBuffers.size();
\r
52 //! returns pointer to a mesh buffer
\r
53 IMeshBuffer* getMeshBuffer(u32 nr) const override
\r
55 return MeshBuffers[nr];
\r
58 //! returns a meshbuffer which fits a material
\r
59 /** reverse search */
\r
60 IMeshBuffer* getMeshBuffer( const video::SMaterial & material) const override
\r
62 for (s32 i = (s32)MeshBuffers.size()-1; i >= 0; --i)
\r
64 if ( material == MeshBuffers[i]->getMaterial())
\r
65 return MeshBuffers[i];
\r
71 //! returns an axis aligned bounding box
\r
72 const core::aabbox3d<f32>& getBoundingBox() const override
\r
77 //! set user axis aligned bounding box
\r
78 void setBoundingBox( const core::aabbox3df& box) override
\r
83 //! recalculates the bounding box
\r
84 void recalculateBoundingBox()
\r
86 bool hasMeshBufferBBox = false;
\r
87 for (u32 i=0; i<MeshBuffers.size(); ++i)
\r
89 const core::aabbox3df& bb = MeshBuffers[i]->getBoundingBox();
\r
90 if ( !bb.isEmpty() )
\r
92 if ( !hasMeshBufferBBox )
\r
94 hasMeshBufferBBox = true;
\r
99 BoundingBox.addInternalBox(bb);
\r
105 if ( !hasMeshBufferBBox )
\r
106 BoundingBox.reset(0.0f, 0.0f, 0.0f);
\r
109 //! adds a MeshBuffer
\r
110 /** The bounding box is not updated automatically. */
\r
111 void addMeshBuffer(IMeshBuffer* buf)
\r
116 MeshBuffers.push_back(buf);
\r
120 //! sets a flag of all contained materials to a new value
\r
121 void setMaterialFlag(video::E_MATERIAL_FLAG flag, bool newvalue) override
\r
123 for (u32 i=0; i<MeshBuffers.size(); ++i)
\r
124 MeshBuffers[i]->getMaterial().setFlag(flag, newvalue);
\r
127 //! set the hardware mapping hint, for driver
\r
128 void setHardwareMappingHint( E_HARDWARE_MAPPING newMappingHint, E_BUFFER_TYPE buffer=EBT_VERTEX_AND_INDEX ) override
\r
130 for (u32 i=0; i<MeshBuffers.size(); ++i)
\r
131 MeshBuffers[i]->setHardwareMappingHint(newMappingHint, buffer);
\r
134 //! flags the meshbuffer as changed, reloads hardware buffers
\r
135 void setDirty(E_BUFFER_TYPE buffer=EBT_VERTEX_AND_INDEX) override
\r
137 for (u32 i=0; i<MeshBuffers.size(); ++i)
\r
138 MeshBuffers[i]->setDirty(buffer);
\r
141 //! The meshbuffers of this mesh
\r
142 core::array<IMeshBuffer*> MeshBuffers;
\r
144 //! The bounding box of this mesh
\r
145 core::aabbox3d<f32> BoundingBox;
\r
149 } // end namespace scene
\r
150 } // end namespace irr
\r