GteIndexBuffer.cpp
Go to the documentation of this file.
1 // David Eberly, Geometric Tools, Redmond WA 98052
2 // Copyright (c) 1998-2017
3 // Distributed under the Boost Software License, Version 1.0.
4 // http://www.boost.org/LICENSE_1_0.txt
5 // http://www.geometrictools.com/License/Boost/LICENSE_1_0.txt
6 // File Version: 3.0.1 (2016/12/09)
7 
8 #include <GTEnginePCH.h>
11 using namespace gte;
12 
13 
14 IndexBuffer::IndexBuffer(IPType type, uint32_t numPrimitives, size_t indexSize, bool createStorage)
15  :
16  Buffer(msIndexCounter[Log2OfPowerOfTwo(type)](numPrimitives), indexSize, createStorage),
17  mPrimitiveType(type),
18  mNumPrimitives(numPrimitives),
19  mNumActivePrimitives(numPrimitives),
20  mFirstPrimitive(0)
21 {
23  LogAssert(mNumPrimitives > 0, "Invalid number of primitives.");
24 }
25 
26 IndexBuffer::IndexBuffer(IPType type, uint32_t numPrimitives)
27  :
28  Buffer(msIndexCounter[Log2OfPowerOfTwo(type)](numPrimitives), 0, false),
29  mPrimitiveType(type),
30  mNumPrimitives(numPrimitives),
31  mNumActivePrimitives(numPrimitives),
33 {
35  LogAssert(mNumPrimitives > 0, "Invalid number of primitives.");
36 }
37 
38 void IndexBuffer::SetNumActivePrimitives(uint32_t numActive)
39 {
40  if (numActive <= mNumPrimitives)
41  {
42  mNumActivePrimitives = numActive;
43  }
44  else
45  {
46  LogWarning("Invalid number of active primitives.");
48  }
49 }
50 
52 {
53  uint32_t i = Log2OfPowerOfTwo(mPrimitiveType);
55 }
56 
58 {
59  if (0 <= first && first < mNumPrimitives && first + mNumActivePrimitives <= mNumPrimitives)
60  {
62  return;
63  }
64 
65  LogError("Invalid first primitive.");
66 }
67 
69 {
70  if (mFirstPrimitive == 0)
71  {
72  return 0;
73  }
74 
77 }
78 
79 bool IndexBuffer::SetPoint(uint32_t i, uint32_t v)
80 {
82  {
83  if (mData && i < mNumPrimitives)
84  {
85  if (mElementSize == sizeof(uint32_t))
86  {
87  uint32_t* index = i + Get<uint32_t>();
88  *index = v;
89  }
90  else
91  {
92  uint16_t* index = i + Get<uint16_t>();
93  *index = static_cast<uint16_t>(v);
94  }
95  return true;
96  }
97  }
98  return false;
99 }
100 
101 bool IndexBuffer::GetPoint(uint32_t i, uint32_t& v) const
102 {
104  {
105  if (mData && i < mNumPrimitives)
106  {
107  if (mElementSize == sizeof(uint32_t))
108  {
109  uint32_t const* index = i + Get<uint32_t>();
110  v = *index;
111  }
112  else
113  {
114  uint16_t const* index = i + Get<uint16_t>();
115  v = static_cast<uint32_t>(*index);
116  }
117  return true;
118  }
119  }
120  return false;
121 }
122 
123 bool IndexBuffer::SetSegment(uint32_t i, uint32_t v0, uint32_t v1)
124 {
126  {
127  if (mData && i < mNumPrimitives)
128  {
129  if (mElementSize == sizeof(uint32_t))
130  {
132  {
133  uint32_t* index = 2 * i + Get<uint32_t>();
134  *index++ = v0;
135  *index = v1;
136  }
137  else
138  {
139  uint32_t* index = i + Get<uint32_t>();
140  *index++ = v0;
141  *index = v1;
142  }
143  }
144  else
145  {
147  {
148  uint16_t* index = 2 * i + Get<uint16_t>();
149  *index++ = static_cast<uint16_t>(v0);
150  *index = static_cast<uint16_t>(v1);
151  }
152  else
153  {
154  uint16_t* index = i + Get<uint16_t>();
155  *index++ = static_cast<uint16_t>(v0);
156  *index = static_cast<uint16_t>(v1);
157  }
158  }
159  return true;
160  }
161  }
162  return false;
163 }
164 
165 bool IndexBuffer::GetSegment(uint32_t i, uint32_t& v0, uint32_t& v1) const
166 {
168  {
169  if (mData && i < mNumPrimitives)
170  {
171  if (mElementSize == sizeof(uint32_t))
172  {
174  {
175  uint32_t const* index = 2 * i + Get<uint32_t>();
176  v0 = *index++;
177  v1 = *index;
178  }
179  else
180  {
181  uint32_t const* index = i + Get<uint32_t>();
182  v0 = *index++;
183  v1 = *index;
184  }
185  }
186  else
187  {
189  {
190  uint16_t const* index = 2 * i + Get<uint16_t>();
191  v0 = static_cast<uint32_t>(*index++);
192  v1 = static_cast<uint32_t>(*index);
193  }
194  else
195  {
196  uint16_t const* index = i + Get<uint16_t>();
197  v0 = static_cast<uint32_t>(*index++);
198  v1 = static_cast<uint32_t>(*index);
199  }
200  }
201  return true;
202  }
203  }
204  return false;
205 }
206 
207 bool IndexBuffer::SetTriangle(uint32_t i, uint32_t v0, uint32_t v1, uint32_t v2)
208 {
210  {
211  if (mData && i < mNumPrimitives)
212  {
213  if (mElementSize == sizeof(uint32_t))
214  {
215  if (mPrimitiveType == IP_TRIMESH)
216  {
217  uint32_t* index = 3 * i + Get<uint32_t>();
218  *index++ = v0;
219  *index++ = v1;
220  *index = v2;
221  }
222  else
223  {
224  uint32_t* index = i + Get<uint32_t>();
225  index[0] = v0;
226  if (i & 1)
227  {
228  index[2] = v1;
229  index[1] = v2;
230  }
231  else
232  {
233  index[1] = v1;
234  index[2] = v2;
235  }
236  }
237  }
238  else
239  {
240  if (mPrimitiveType == IP_TRIMESH)
241  {
242  uint16_t* index = 3 * i + Get<uint16_t>();
243  *index++ = static_cast<uint16_t>(v0);
244  *index++ = static_cast<uint16_t>(v1);
245  *index = static_cast<uint16_t>(v2);
246  }
247  else
248  {
249  uint16_t* index = i + Get<uint16_t>();
250  index[0] = static_cast<uint16_t>(v0);
251  if (i & 1)
252  {
253  index[2] = static_cast<uint16_t>(v1);
254  index[1] = static_cast<uint16_t>(v2);
255  }
256  else
257  {
258  index[1] = static_cast<uint16_t>(v1);
259  index[2] = static_cast<uint16_t>(v2);
260  }
261  }
262  }
263  return true;
264  }
265  }
266  return false;
267 }
268 
269 bool IndexBuffer::GetTriangle(uint32_t i, uint32_t& v0, uint32_t& v1, uint32_t& v2) const
270 {
272  {
273  if (mData && i < mNumPrimitives)
274  {
275  if (mElementSize == sizeof(uint32_t))
276  {
277  if (mPrimitiveType == IP_TRIMESH)
278  {
279  uint32_t const* index = 3 * i + Get<uint32_t>();
280  v0 = *index++;
281  v1 = *index++;
282  v2 = *index;
283  }
284  else
285  {
286  uint32_t const* index = i + Get<uint32_t>();
287  uint32_t offset = (i & 1);
288  v0 = index[0];
289  v1 = index[1 + offset];
290  v2 = index[2 - offset];
291  }
292  }
293  else
294  {
295  if (mPrimitiveType == IP_TRIMESH)
296  {
297  uint16_t const* index =
298  3 * i + Get<uint16_t>();
299  v0 = static_cast<uint32_t>(*index++);
300  v1 = static_cast<uint32_t>(*index++);
301  v2 = static_cast<uint32_t>(*index);
302  }
303  else
304  {
305  uint16_t const* index = i + Get<uint16_t>();
306  int offset = (i & 1);
307  v0 = static_cast<uint32_t>(index[0]);
308  v1 = static_cast<uint32_t>(index[1 + offset]);
309  v2 = static_cast<uint32_t>(index[2 - offset]);
310  }
311  }
312  return true;
313  }
314  }
315  return false;
316 }
317 
318 uint32_t IndexBuffer::GetPolypointIndexCount(uint32_t numPrimitives)
319 {
320  // Create one point when numPrimitives is invalid.
321  return numPrimitives > 0 ? numPrimitives : 1;
322 }
323 
325  uint32_t numPrimitives)
326 {
327  // Create one segment when numPrimitives is invalid.
328  return numPrimitives > 0 ? 2 * numPrimitives : 2;
329 }
330 
332  uint32_t numPrimitives)
333 {
334  // Create one segment when numPrimitives is invalid.
335  return numPrimitives > 0 ? numPrimitives + 1 : 2;
336 }
337 
338 uint32_t IndexBuffer::GetTrimeshIndexCount(uint32_t numPrimitives)
339 {
340  // Create one triangle when numPrimitives is invalid.
341  return numPrimitives > 0 ? 3 * numPrimitives : 3;
342 }
343 
344 uint32_t IndexBuffer::GetTristripIndexCount(uint32_t numPrimitives)
345 {
346  // Create one triangle when numPrimitives is invalid.
347  return numPrimitives > 0 ? numPrimitives + 2 : 3;
348 }
349 
350 uint32_t IndexBuffer::GetPolysegmentDisjointAdjIndexCount(uint32_t numPrimitives)
351 {
352  // Create one segment-adj when numPrimitives is invalid.
353  return numPrimitives > 0 ? 4 * numPrimitives : 4;
354 }
355 
357 {
358  // Create one segment-adj when numPrimitives is invalid.
359  return numPrimitives > 0 ? numPrimitives + 3 : 4;
360 }
361 
362 uint32_t IndexBuffer::GetTrimeshAdjIndexCount(uint32_t numPrimitives)
363 {
364  // Create one triangle-adj when numPrimitives is invalid.
365  return numPrimitives > 0 ? 6 * numPrimitives : 6;
366 }
367 
368 uint32_t IndexBuffer::GetTristripAdjIndexCount(uint32_t numPrimitives)
369 {
370  // Create one triangle-adj when numPrimitives is invalid.
371  return numPrimitives > 0 ? 2 * (numPrimitives + 2) : 6;
372 }
373 
375 {
385 };
static uint32_t GetPolysegmentContiguousAdjIndexCount(uint32_t numPrimitives)
static ICFunction msIndexCounter[IP_NUM_TYPES]
static uint32_t GetPolysegmentDisjointAdjIndexCount(uint32_t numPrimitives)
bool SetSegment(uint32_t i, uint32_t v0, uint32_t v1)
bool SetTriangle(uint32_t i, uint32_t v0, uint32_t v1, uint32_t v2)
#define LogAssert(condition, message)
Definition: GteLogger.h:86
IP_TRIMESH
static uint32_t GetPolysegmentContiguousIndexCount(uint32_t numPrimitives)
static uint32_t GetTrimeshIndexCount(uint32_t numPrimitives)
uint32_t(* ICFunction)(uint32_t)
GLfloat GLfloat v1
Definition: glcorearb.h:812
GraphicsObjectType mType
void SetFirstPrimitive(uint32_t first)
static uint32_t GetTrimeshAdjIndexCount(uint32_t numPrimitives)
static uint32_t GetTristripIndexCount(uint32_t numPrimitives)
bool GetSegment(uint32_t i, uint32_t &v0, uint32_t &v1) const
uint32_t GetFirstIndex() const
uint32_t mNumPrimitives
unsigned int mElementSize
Definition: GteResource.h:95
IP_HAS_POINTS
#define LogError(message)
Definition: GteLogger.h:92
GLint first
Definition: glcorearb.h:400
IP_POLYSEGMENT_DISJOINT
static uint32_t GetTristripAdjIndexCount(uint32_t numPrimitives)
uint32_t mFirstPrimitive
bool ValidPrimitiveType(IPType type) const
void SetNumActivePrimitives(uint32_t numActive)
#define LogWarning(message)
Definition: GteLogger.h:95
GLfloat v0
Definition: glcorearb.h:811
bool GetPoint(uint32_t i, uint32_t &v) const
IP_HAS_SEGMENTS
static uint32_t GetPolypointIndexCount(uint32_t numPrimitives)
bool SetPoint(uint32_t i, uint32_t v)
GTE_IMPEXP uint32_t Log2OfPowerOfTwo(uint32_t powerOfTwo)
Definition: GteBitHacks.cpp:41
const GLdouble * v
Definition: glcorearb.h:832
GLfloat GLfloat GLfloat v2
Definition: glcorearb.h:813
GLuint index
Definition: glcorearb.h:781
IP_HAS_TRIANGLES
GT_INDEX_BUFFER
GLintptr offset
Definition: glcorearb.h:660
bool GetTriangle(uint32_t i, uint32_t &v0, uint32_t &v1, uint32_t &v2) const
uint32_t mNumActivePrimitives
GLint GLint GLsizei GLint GLenum GLenum type
Definition: glcorearb.h:103
IndexBuffer(IPType type, uint32_t numPrimitives, size_t indexSize, bool createStorage=true)
static uint32_t GetPolysegmentDisjointIndexCount(uint32_t numPrimitives)
uint32_t GetNumActiveIndices() const


geometric_tools_engine
Author(s): Yijiang Huang
autogenerated on Thu Jul 18 2019 04:00:00