00001 // Copyright (C) 2008-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 __C_VERTEX_BUFFER_H_INCLUDED__ 00006 #define __C_VERTEX_BUFFER_H_INCLUDED__ 00007 00008 #include "IVertexBuffer.h" 00009 00010 00011 namespace irr 00012 { 00013 namespace scene 00014 { 00015 00016 class CVertexBuffer : public IVertexBuffer 00017 { 00018 class IVertexList 00019 { 00020 public: 00021 virtual ~IVertexList(){}; 00022 00023 virtual u32 stride() const =0; 00024 00025 virtual u32 size() const =0; 00026 00027 virtual void push_back (const video::S3DVertex &element) =0; 00028 virtual video::S3DVertex& operator [](const u32 index) const =0; 00029 virtual video::S3DVertex& getLast() =0; 00030 virtual void set_used(u32 usedNow) =0; 00031 virtual void reallocate(u32 new_size) =0; 00032 virtual u32 allocated_size() const =0; 00033 virtual video::S3DVertex* pointer() =0; 00034 virtual video::E_VERTEX_TYPE getType() const =0; 00035 }; 00036 00037 template <class T> 00038 class CSpecificVertexList : public IVertexList 00039 { 00040 public: 00041 core::array<T> Vertices; 00042 00043 virtual u32 stride() const {return sizeof(T);} 00044 00045 virtual u32 size() const {return Vertices.size();} 00046 00047 virtual void push_back (const video::S3DVertex &element) 00048 {Vertices.push_back((T&)element);} 00049 00050 virtual video::S3DVertex& operator [](const u32 index) const 00051 {return (video::S3DVertex&)Vertices[index];} 00052 00053 virtual video::S3DVertex& getLast() 00054 {return (video::S3DVertex&)Vertices.getLast();} 00055 00056 virtual void set_used(u32 usedNow) 00057 {Vertices.set_used(usedNow);} 00058 00059 virtual void reallocate(u32 new_size) 00060 {Vertices.reallocate(new_size);} 00061 00062 virtual u32 allocated_size() const 00063 { 00064 return Vertices.allocated_size(); 00065 } 00066 00067 virtual video::S3DVertex* pointer() {return Vertices.pointer();} 00068 00069 virtual video::E_VERTEX_TYPE getType() const {return T().getType();} 00070 }; 00071 00072 public: 00073 IVertexList *Vertices; 00074 00075 CVertexBuffer(video::E_VERTEX_TYPE vertexType) : Vertices(0), 00076 MappingHint(EHM_NEVER), ChangedID(1) 00077 { 00078 setType(vertexType); 00079 } 00080 00081 CVertexBuffer(const IVertexBuffer &VertexBufferCopy) : 00082 Vertices(0), MappingHint(EHM_NEVER), 00083 ChangedID(1) 00084 { 00085 setType(VertexBufferCopy.getType()); 00086 reallocate(VertexBufferCopy.size()); 00087 00088 for (u32 n=0;n<VertexBufferCopy.size();++n) 00089 push_back(VertexBufferCopy[n]); 00090 } 00091 00092 virtual ~CVertexBuffer() 00093 { 00094 delete Vertices; 00095 } 00096 00097 00098 virtual void setType(video::E_VERTEX_TYPE vertexType) 00099 { 00100 IVertexList *NewVertices=0; 00101 00102 switch (vertexType) 00103 { 00104 case video::EVT_STANDARD: 00105 { 00106 NewVertices=new CSpecificVertexList<video::S3DVertex>; 00107 break; 00108 } 00109 case video::EVT_2TCOORDS: 00110 { 00111 NewVertices=new CSpecificVertexList<video::S3DVertex2TCoords>; 00112 break; 00113 } 00114 case video::EVT_TANGENTS: 00115 { 00116 NewVertices=new CSpecificVertexList<video::S3DVertexTangents>; 00117 break; 00118 } 00119 } 00120 if (Vertices) 00121 { 00122 NewVertices->reallocate( Vertices->size() ); 00123 00124 for(u32 n=0;n<Vertices->size();++n) 00125 NewVertices->push_back((*Vertices)[n]); 00126 00127 delete Vertices; 00128 } 00129 00130 Vertices=NewVertices; 00131 } 00132 00133 virtual void* getData() {return Vertices->pointer();} 00134 00135 virtual video::E_VERTEX_TYPE getType() const {return Vertices->getType();} 00136 00137 virtual u32 stride() const {return Vertices->stride();} 00138 00139 virtual u32 size() const 00140 { 00141 return Vertices->size(); 00142 } 00143 00144 virtual void push_back (const video::S3DVertex &element) 00145 { 00146 Vertices->push_back(element); 00147 } 00148 00149 virtual video::S3DVertex& operator [](const u32 index) const 00150 { 00151 return (*Vertices)[index]; 00152 } 00153 00154 virtual video::S3DVertex& getLast() 00155 { 00156 return Vertices->getLast(); 00157 } 00158 00159 virtual void set_used(u32 usedNow) 00160 { 00161 Vertices->set_used(usedNow); 00162 } 00163 00164 virtual void reallocate(u32 new_size) 00165 { 00166 Vertices->reallocate(new_size); 00167 } 00168 00169 virtual u32 allocated_size() const 00170 { 00171 return Vertices->allocated_size(); 00172 } 00173 00174 virtual video::S3DVertex* pointer() 00175 { 00176 return Vertices->pointer(); 00177 } 00178 00180 virtual E_HARDWARE_MAPPING getHardwareMappingHint() const 00181 { 00182 return MappingHint; 00183 } 00184 00186 virtual void setHardwareMappingHint( E_HARDWARE_MAPPING NewMappingHint ) 00187 { 00188 MappingHint=NewMappingHint; 00189 } 00190 00192 virtual void setDirty() 00193 { 00194 ++ChangedID; 00195 } 00196 00198 00199 virtual u32 getChangedID() const {return ChangedID;} 00200 00201 E_HARDWARE_MAPPING MappingHint; 00202 u32 ChangedID; 00203 }; 00204 00205 00206 } // end namespace scene 00207 } // end namespace irr 00208 00209 #endif 00210