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_INDEX_BUFFER_H_INCLUDED__
\r
6 #define __C_INDEX_BUFFER_H_INCLUDED__
\r
8 #include "IIndexBuffer.h"
\r
15 class CIndexBuffer : public IIndexBuffer
\r
21 virtual ~IIndexList(){};
\r
23 virtual u32 stride() const =0;
\r
24 virtual u32 size() const =0;
\r
25 virtual void push_back(const u32 &element) =0;
\r
26 virtual u32 operator [](u32 index) const =0;
\r
27 virtual u32 getLast() =0;
\r
28 virtual void setValue(u32 index, u32 value) =0;
\r
29 virtual void set_used(u32 usedNow) =0;
\r
30 virtual void reallocate(u32 new_size) =0;
\r
31 virtual u32 allocated_size() const =0;
\r
32 virtual void* pointer() =0;
\r
33 virtual video::E_INDEX_TYPE getType() const =0;
\r
37 class CSpecificIndexList : public IIndexList
\r
40 core::array<T> Indices;
\r
42 virtual u32 stride() const _IRR_OVERRIDE_ {return sizeof(T);}
\r
44 virtual u32 size() const _IRR_OVERRIDE_ {return Indices.size();}
\r
46 virtual void push_back(const u32 &element) _IRR_OVERRIDE_
\r
48 // push const ref due to compiler problem with gcc 4.6, big endian
\r
49 Indices.push_back((const T&)element);
\r
52 virtual u32 operator [](u32 index) const _IRR_OVERRIDE_
\r
54 return (u32)(Indices[index]);
\r
57 virtual u32 getLast() _IRR_OVERRIDE_ {return (u32)Indices.getLast();}
\r
59 virtual void setValue(u32 index, u32 value) _IRR_OVERRIDE_
\r
61 Indices[index]=(T)value;
\r
64 virtual void set_used(u32 usedNow) _IRR_OVERRIDE_
\r
66 Indices.set_used(usedNow);
\r
69 virtual void reallocate(u32 new_size) _IRR_OVERRIDE_
\r
71 Indices.reallocate(new_size);
\r
74 virtual u32 allocated_size() const _IRR_OVERRIDE_
\r
76 return Indices.allocated_size();
\r
79 virtual void* pointer() _IRR_OVERRIDE_ {return Indices.pointer();}
\r
81 virtual video::E_INDEX_TYPE getType() const _IRR_OVERRIDE_
\r
83 if (sizeof(T)==sizeof(u16))
\r
84 return video::EIT_16BIT;
\r
86 return video::EIT_32BIT;
\r
91 IIndexList *Indices;
\r
93 CIndexBuffer(video::E_INDEX_TYPE IndexType) :Indices(0), MappingHint(EHM_NEVER), ChangedID(1)
\r
98 CIndexBuffer(const IIndexBuffer &IndexBufferCopy) :Indices(0), MappingHint(EHM_NEVER), ChangedID(1)
\r
100 setType(IndexBufferCopy.getType());
\r
101 reallocate(IndexBufferCopy.size());
\r
103 for (u32 n=0;n<IndexBufferCopy.size();++n)
\r
104 push_back(IndexBufferCopy[n]);
\r
107 virtual ~CIndexBuffer()
\r
112 //virtual void setType(video::E_INDEX_TYPE IndexType);
\r
113 virtual void setType(video::E_INDEX_TYPE IndexType) _IRR_OVERRIDE_
\r
115 IIndexList *NewIndices=0;
\r
119 case video::EIT_16BIT:
\r
121 NewIndices=new CSpecificIndexList<u16>;
\r
124 case video::EIT_32BIT:
\r
126 NewIndices=new CSpecificIndexList<u32>;
\r
133 NewIndices->reallocate( Indices->size() );
\r
135 for(u32 n=0;n<Indices->size();++n)
\r
136 NewIndices->push_back((*Indices)[n]);
\r
141 Indices=NewIndices;
\r
144 virtual void* getData() _IRR_OVERRIDE_ {return Indices->pointer();}
\r
146 virtual video::E_INDEX_TYPE getType() const _IRR_OVERRIDE_ {return Indices->getType();}
\r
148 virtual u32 stride() const _IRR_OVERRIDE_ {return Indices->stride();}
\r
150 virtual u32 size() const _IRR_OVERRIDE_
\r
152 return Indices->size();
\r
155 virtual void push_back(const u32 &element) _IRR_OVERRIDE_
\r
157 Indices->push_back(element);
\r
160 virtual u32 operator [](u32 index) const _IRR_OVERRIDE_
\r
162 return (*Indices)[index];
\r
165 virtual u32 getLast() _IRR_OVERRIDE_
\r
167 return Indices->getLast();
\r
170 virtual void setValue(u32 index, u32 value) _IRR_OVERRIDE_
\r
172 Indices->setValue(index, value);
\r
175 virtual void set_used(u32 usedNow) _IRR_OVERRIDE_
\r
177 Indices->set_used(usedNow);
\r
180 virtual void reallocate(u32 new_size) _IRR_OVERRIDE_
\r
182 Indices->reallocate(new_size);
\r
185 virtual u32 allocated_size() const _IRR_OVERRIDE_
\r
187 return Indices->allocated_size();
\r
190 virtual void* pointer() _IRR_OVERRIDE_
\r
192 return Indices->pointer();
\r
195 //! get the current hardware mapping hint
\r
196 virtual E_HARDWARE_MAPPING getHardwareMappingHint() const _IRR_OVERRIDE_
\r
198 return MappingHint;
\r
201 //! set the hardware mapping hint, for driver
\r
202 virtual void setHardwareMappingHint( E_HARDWARE_MAPPING NewMappingHint ) _IRR_OVERRIDE_
\r
204 MappingHint=NewMappingHint;
\r
207 //! flags the mesh as changed, reloads hardware buffers
\r
208 virtual void setDirty() _IRR_OVERRIDE_
\r
213 //! Get the currently used ID for identification of changes.
\r
214 /** This shouldn't be used for anything outside the VideoDriver. */
\r
215 virtual u32 getChangedID() const _IRR_OVERRIDE_ {return ChangedID;}
\r
217 E_HARDWARE_MAPPING MappingHint;
\r
222 } // end namespace scene
\r
223 } // end namespace irr
\r