arsa  2.7
CIndexBuffer.h
Go to the documentation of this file.
1 // Copyright (C) 2008-2012 Nikolaus Gebhardt
2 // This file is part of the "Irrlicht Engine".
3 // For conditions of distribution and use, see copyright notice in irrlicht.h
4 
5 #ifndef __C_INDEX_BUFFER_H_INCLUDED__
6 #define __C_INDEX_BUFFER_H_INCLUDED__
7 
8 #include "IIndexBuffer.h"
9 
10 namespace irr
11 {
12 namespace scene
13 {
14 
15  class CIndexBuffer : public IIndexBuffer
16  {
17 
18  class IIndexList
19  {
20  public:
21  virtual ~IIndexList(){};
22 
23  virtual u32 stride() const =0;
24  virtual u32 size() const =0;
25  virtual void push_back(const u32 &element) =0;
26  virtual u32 operator [](u32 index) const =0;
27  virtual u32 getLast() =0;
28  virtual void setValue(u32 index, u32 value) =0;
29  virtual void set_used(u32 usedNow) =0;
30  virtual void reallocate(u32 new_size) =0;
31  virtual u32 allocated_size() const =0;
32  virtual void* pointer() =0;
33  virtual video::E_INDEX_TYPE getType() const =0;
34  };
35 
36  template <class T>
37  class CSpecificIndexList : public IIndexList
38  {
39  public:
41 
42  virtual u32 stride() const _IRR_OVERRIDE_ {return sizeof(T);}
43 
44  virtual u32 size() const _IRR_OVERRIDE_ {return Indices.size();}
45 
46  virtual void push_back(const u32 &element) _IRR_OVERRIDE_
47  {
48  // push const ref due to compiler problem with gcc 4.6, big endian
49  Indices.push_back((const T&)element);
50  }
51 
52  virtual u32 operator [](u32 index) const _IRR_OVERRIDE_
53  {
54  return (u32)(Indices[index]);
55  }
56 
57  virtual u32 getLast() _IRR_OVERRIDE_ {return (u32)Indices.getLast();}
58 
59  virtual void setValue(u32 index, u32 value) _IRR_OVERRIDE_
60  {
61  Indices[index]=(T)value;
62  }
63 
64  virtual void set_used(u32 usedNow) _IRR_OVERRIDE_
65  {
66  Indices.set_used(usedNow);
67  }
68 
69  virtual void reallocate(u32 new_size) _IRR_OVERRIDE_
70  {
71  Indices.reallocate(new_size);
72  }
73 
74  virtual u32 allocated_size() const _IRR_OVERRIDE_
75  {
76  return Indices.allocated_size();
77  }
78 
79  virtual void* pointer() _IRR_OVERRIDE_ {return Indices.pointer();}
80 
82  {
83  if (sizeof(T)==sizeof(u16))
84  return video::EIT_16BIT;
85  else
86  return video::EIT_32BIT;
87  }
88  };
89 
90  public:
91  IIndexList *Indices;
92 
94  {
95  setType(IndexType);
96  }
97 
98  CIndexBuffer(const IIndexBuffer &IndexBufferCopy) :Indices(0), MappingHint(EHM_NEVER), ChangedID(1)
99  {
100  setType(IndexBufferCopy.getType());
101  reallocate(IndexBufferCopy.size());
102 
103  for (u32 n=0;n<IndexBufferCopy.size();++n)
104  push_back(IndexBufferCopy[n]);
105  }
106 
107  virtual ~CIndexBuffer()
108  {
109  delete Indices;
110  }
111 
112  //virtual void setType(video::E_INDEX_TYPE IndexType);
114  {
115  IIndexList *NewIndices=0;
116 
117  switch (IndexType)
118  {
119  case video::EIT_16BIT:
120  {
121  NewIndices=new CSpecificIndexList<u16>;
122  break;
123  }
124  case video::EIT_32BIT:
125  {
126  NewIndices=new CSpecificIndexList<u32>;
127  break;
128  }
129  }
130 
131  if (Indices)
132  {
133  NewIndices->reallocate( Indices->size() );
134 
135  for(u32 n=0;n<Indices->size();++n)
136  NewIndices->push_back((*Indices)[n]);
137 
138  delete Indices;
139  }
140 
141  Indices=NewIndices;
142  }
143 
144  virtual void* getData() _IRR_OVERRIDE_ {return Indices->pointer();}
145 
146  virtual video::E_INDEX_TYPE getType() const _IRR_OVERRIDE_ {return Indices->getType();}
147 
148  virtual u32 stride() const _IRR_OVERRIDE_ {return Indices->stride();}
149 
151  {
152  return Indices->size();
153  }
154 
155  virtual void push_back(const u32 &element) _IRR_OVERRIDE_
156  {
157  Indices->push_back(element);
158  }
159 
161  {
162  return (*Indices)[index];
163  }
164 
166  {
167  return Indices->getLast();
168  }
169 
171  {
172  Indices->setValue(index, value);
173  }
174 
175  virtual void set_used(u32 usedNow) _IRR_OVERRIDE_
176  {
177  Indices->set_used(usedNow);
178  }
179 
180  virtual void reallocate(u32 new_size) _IRR_OVERRIDE_
181  {
182  Indices->reallocate(new_size);
183  }
184 
186  {
187  return Indices->allocated_size();
188  }
189 
190  virtual void* pointer() _IRR_OVERRIDE_
191  {
192  return Indices->pointer();
193  }
194 
197  {
198  return MappingHint;
199  }
200 
203  {
204  MappingHint=NewMappingHint;
205  }
206 
208  virtual void setDirty() _IRR_OVERRIDE_
209  {
210  ++ChangedID;
211  }
212 
214 
216 
219  };
220 
221 
222 } // end namespace scene
223 } // end namespace irr
224 
225 #endif
226 
virtual u32 getLast() _IRR_OVERRIDE_
Definition: CIndexBuffer.h:165
CIndexBuffer(video::E_INDEX_TYPE IndexType)
Definition: CIndexBuffer.h:93
GLdouble n
virtual void push_back(const u32 &element) _IRR_OVERRIDE_
Definition: CIndexBuffer.h:155
virtual u32 stride() const _IRR_OVERRIDE_
Definition: CIndexBuffer.h:148
virtual void * getData() _IRR_OVERRIDE_
Definition: CIndexBuffer.h:144
virtual void * pointer() _IRR_OVERRIDE_
Definition: CIndexBuffer.h:190
virtual void setDirty() _IRR_OVERRIDE_
flags the mesh as changed, reloads hardware buffers
Definition: CIndexBuffer.h:208
virtual void setValue(u32 index, u32 value) _IRR_OVERRIDE_
Definition: CIndexBuffer.h:170
virtual u32 operator [](u32 index) const _IRR_OVERRIDE_
Definition: CIndexBuffer.h:160
virtual void setHardwareMappingHint(E_HARDWARE_MAPPING NewMappingHint) _IRR_OVERRIDE_
set the hardware mapping hint, for driver
Definition: CIndexBuffer.h:202
Everything in the Irrlicht Engine can be found in this namespace.
Definition: CARSADPad.h:6
Don't store on the hardware.
virtual void set_used(u32 usedNow) _IRR_OVERRIDE_
Definition: CIndexBuffer.h:175
virtual u32 size() const =0
unsigned short u16
16 bit unsigned variable.
Definition: irrTypes.h:44
virtual video::E_INDEX_TYPE getType() const =0
GLsizei const GLfloat * value
unsigned int u32
32 bit unsigned variable.
Definition: irrTypes.h:62
virtual void reallocate(u32 new_size) _IRR_OVERRIDE_
Definition: CIndexBuffer.h:180
GLuint index
virtual E_HARDWARE_MAPPING getHardwareMappingHint() const _IRR_OVERRIDE_
get the current hardware mapping hint
Definition: CIndexBuffer.h:196
virtual void setType(video::E_INDEX_TYPE IndexType) _IRR_OVERRIDE_
Definition: CIndexBuffer.h:113
#define _IRR_OVERRIDE_
Defines an override macro, to protect virtual functions from typos and other mismatches.
Definition: irrTypes.h:216
virtual u32 size() const _IRR_OVERRIDE_
Definition: CIndexBuffer.h:150
#define const
Definition: zconf.h:217
virtual u32 allocated_size() const _IRR_OVERRIDE_
Definition: CIndexBuffer.h:185
E_HARDWARE_MAPPING MappingHint
Definition: CIndexBuffer.h:217
virtual video::E_INDEX_TYPE getType() const _IRR_OVERRIDE_
Definition: CIndexBuffer.h:146
CIndexBuffer(const IIndexBuffer &IndexBufferCopy)
Definition: CIndexBuffer.h:98
virtual u32 getChangedID() const _IRR_OVERRIDE_
Get the currently used ID for identification of changes.
Definition: CIndexBuffer.h:215