1 // Copyright (C) 2008-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 __C_VERTEX_BUFFER_H_INCLUDED__
\r
6 #define __C_VERTEX_BUFFER_H_INCLUDED__
\r
8 #include "IVertexBuffer.h"
\r
16 class CVertexBuffer : public IVertexBuffer
\r
21 virtual ~IVertexList(){};
\r
23 virtual u32 stride() const =0;
\r
25 virtual u32 size() const =0;
\r
27 virtual void push_back (const video::S3DVertex &element) =0;
\r
28 virtual video::S3DVertex& operator [](const u32 index) const =0;
\r
29 virtual video::S3DVertex& getLast() =0;
\r
30 virtual void set_used(u32 usedNow) =0;
\r
31 virtual void reallocate(u32 new_size) =0;
\r
32 virtual u32 allocated_size() const =0;
\r
33 virtual video::S3DVertex* pointer() =0;
\r
34 virtual video::E_VERTEX_TYPE getType() const =0;
\r
38 class CSpecificVertexList : public IVertexList
\r
41 core::array<T> Vertices;
\r
43 u32 stride() const override {return sizeof(T);}
\r
45 u32 size() const override {return Vertices.size();}
\r
47 void push_back (const video::S3DVertex &element) override
\r
48 {Vertices.push_back((T&)element);}
\r
50 video::S3DVertex& operator [](const u32 index) const override
\r
51 {return (video::S3DVertex&)Vertices[index];}
\r
53 video::S3DVertex& getLast() override
\r
54 {return (video::S3DVertex&)Vertices.getLast();}
\r
56 void set_used(u32 usedNow) override
\r
57 {Vertices.set_used(usedNow);}
\r
59 void reallocate(u32 new_size) override
\r
60 {Vertices.reallocate(new_size);}
\r
62 u32 allocated_size() const override
\r
64 return Vertices.allocated_size();
\r
67 video::S3DVertex* pointer() override {return Vertices.pointer();}
\r
69 video::E_VERTEX_TYPE getType() const override {return T::getType();}
\r
73 IVertexList *Vertices;
\r
75 CVertexBuffer(video::E_VERTEX_TYPE vertexType) : Vertices(0),
\r
76 MappingHint(EHM_NEVER), ChangedID(1)
\r
78 CVertexBuffer::setType(vertexType);
\r
81 CVertexBuffer(const IVertexBuffer &VertexBufferCopy) :
\r
82 Vertices(0), MappingHint(EHM_NEVER),
\r
85 CVertexBuffer::setType(VertexBufferCopy.getType());
\r
86 CVertexBuffer::reallocate(VertexBufferCopy.size());
\r
88 for (u32 n=0;n<VertexBufferCopy.size();++n)
\r
89 CVertexBuffer::push_back(VertexBufferCopy[n]);
\r
92 virtual ~CVertexBuffer()
\r
98 void setType(video::E_VERTEX_TYPE vertexType) override
\r
100 if ( Vertices && Vertices->getType() == vertexType )
\r
103 IVertexList *NewVertices=0;
\r
105 switch (vertexType)
\r
107 case video::EVT_STANDARD:
\r
109 NewVertices=new CSpecificVertexList<video::S3DVertex>;
\r
112 case video::EVT_2TCOORDS:
\r
114 NewVertices=new CSpecificVertexList<video::S3DVertex2TCoords>;
\r
117 case video::EVT_TANGENTS:
\r
119 NewVertices=new CSpecificVertexList<video::S3DVertexTangents>;
\r
125 NewVertices->reallocate( Vertices->size() );
\r
127 for(u32 n=0;n<Vertices->size();++n)
\r
128 NewVertices->push_back((*Vertices)[n]);
\r
133 Vertices=NewVertices;
\r
136 void* getData() override {return Vertices->pointer();}
\r
138 video::E_VERTEX_TYPE getType() const override {return Vertices->getType();}
\r
140 u32 stride() const override {return Vertices->stride();}
\r
142 u32 size() const override
\r
144 return Vertices->size();
\r
147 void push_back (const video::S3DVertex &element) override
\r
149 Vertices->push_back(element);
\r
152 video::S3DVertex& operator [](const u32 index) const override
\r
154 return (*Vertices)[index];
\r
157 video::S3DVertex& getLast() override
\r
159 return Vertices->getLast();
\r
162 void set_used(u32 usedNow) override
\r
164 Vertices->set_used(usedNow);
\r
167 void reallocate(u32 new_size) override
\r
169 Vertices->reallocate(new_size);
\r
172 u32 allocated_size() const override
\r
174 return Vertices->allocated_size();
\r
177 video::S3DVertex* pointer() override
\r
179 return Vertices->pointer();
\r
182 //! get the current hardware mapping hint
\r
183 E_HARDWARE_MAPPING getHardwareMappingHint() const override
\r
185 return MappingHint;
\r
188 //! set the hardware mapping hint, for driver
\r
189 void setHardwareMappingHint( E_HARDWARE_MAPPING NewMappingHint ) override
\r
191 MappingHint=NewMappingHint;
\r
194 //! flags the mesh as changed, reloads hardware buffers
\r
195 void setDirty() override
\r
200 //! Get the currently used ID for identification of changes.
\r
201 /** This shouldn't be used for anything outside the VideoDriver. */
\r
202 u32 getChangedID() const override {return ChangedID;}
\r
204 E_HARDWARE_MAPPING MappingHint;
\r
209 } // end namespace scene
\r
210 } // end namespace irr
\r