Blender  V3.3
btBoxCollision.h
Go to the documentation of this file.
1 #ifndef BT_BOX_COLLISION_H_INCLUDED
2 #define BT_BOX_COLLISION_H_INCLUDED
3 
7 /*
8 This source file is part of GIMPACT Library.
9 
10 For the latest info, see http://gimpact.sourceforge.net/
11 
12 Copyright (c) 2007 Francisco Leon Najera. C.C. 80087371.
13 email: projectileman@yahoo.com
14 
15 
16 This software is provided 'as-is', without any express or implied warranty.
17 In no event will the authors be held liable for any damages arising from the use of this software.
18 Permission is granted to anyone to use this software for any purpose,
19 including commercial applications, and to alter it and redistribute it freely,
20 subject to the following restrictions:
21 
22 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required.
23 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software.
24 3. This notice may not be removed or altered from any source distribution.
25 */
26 
27 #include "LinearMath/btTransform.h"
28 
30 #define BT_SWAP_NUMBERS(a, b) \
31  { \
32  a = a + b; \
33  b = a - b; \
34  a = a - b; \
35  }
36 
37 #define BT_MAX(a, b) (a < b ? b : a)
38 #define BT_MIN(a, b) (a > b ? b : a)
39 
40 #define BT_GREATER(x, y) btFabs(x) > (y)
41 
42 #define BT_MAX3(a, b, c) BT_MAX(a, BT_MAX(b, c))
43 #define BT_MIN3(a, b, c) BT_MIN(a, BT_MIN(b, c))
44 
46 {
50 };
51 
52 //SIMD_FORCE_INLINE bool test_cross_edge_box(
53 // const btVector3 & edge,
54 // const btVector3 & absolute_edge,
55 // const btVector3 & pointa,
56 // const btVector3 & pointb, const btVector3 & extend,
57 // int dir_index0,
58 // int dir_index1
59 // int component_index0,
60 // int component_index1)
61 //{
62 // // dir coords are -z and y
63 //
64 // const btScalar dir0 = -edge[dir_index0];
65 // const btScalar dir1 = edge[dir_index1];
66 // btScalar pmin = pointa[component_index0]*dir0 + pointa[component_index1]*dir1;
67 // btScalar pmax = pointb[component_index0]*dir0 + pointb[component_index1]*dir1;
68 // //find minmax
69 // if(pmin>pmax)
70 // {
71 // BT_SWAP_NUMBERS(pmin,pmax);
72 // }
73 // //find extends
74 // const btScalar rad = extend[component_index0] * absolute_edge[dir_index0] +
75 // extend[component_index1] * absolute_edge[dir_index1];
76 //
77 // if(pmin>rad || -rad>pmax) return false;
78 // return true;
79 //}
80 //
81 //SIMD_FORCE_INLINE bool test_cross_edge_box_X_axis(
82 // const btVector3 & edge,
83 // const btVector3 & absolute_edge,
84 // const btVector3 & pointa,
85 // const btVector3 & pointb, btVector3 & extend)
86 //{
87 //
88 // return test_cross_edge_box(edge,absolute_edge,pointa,pointb,extend,2,1,1,2);
89 //}
90 //
91 //
92 //SIMD_FORCE_INLINE bool test_cross_edge_box_Y_axis(
93 // const btVector3 & edge,
94 // const btVector3 & absolute_edge,
95 // const btVector3 & pointa,
96 // const btVector3 & pointb, btVector3 & extend)
97 //{
98 //
99 // return test_cross_edge_box(edge,absolute_edge,pointa,pointb,extend,0,2,2,0);
100 //}
101 //
102 //SIMD_FORCE_INLINE bool test_cross_edge_box_Z_axis(
103 // const btVector3 & edge,
104 // const btVector3 & absolute_edge,
105 // const btVector3 & pointa,
106 // const btVector3 & pointb, btVector3 & extend)
107 //{
108 //
109 // return test_cross_edge_box(edge,absolute_edge,pointa,pointb,extend,1,0,0,1);
110 //}
111 
112 #define TEST_CROSS_EDGE_BOX_MCR(edge, absolute_edge, pointa, pointb, _extend, i_dir_0, i_dir_1, i_comp_0, i_comp_1) \
113  { \
114  const btScalar dir0 = -edge[i_dir_0]; \
115  const btScalar dir1 = edge[i_dir_1]; \
116  btScalar pmin = pointa[i_comp_0] * dir0 + pointa[i_comp_1] * dir1; \
117  btScalar pmax = pointb[i_comp_0] * dir0 + pointb[i_comp_1] * dir1; \
118  if (pmin > pmax) \
119  { \
120  BT_SWAP_NUMBERS(pmin, pmax); \
121  } \
122  const btScalar abs_dir0 = absolute_edge[i_dir_0]; \
123  const btScalar abs_dir1 = absolute_edge[i_dir_1]; \
124  const btScalar rad = _extend[i_comp_0] * abs_dir0 + _extend[i_comp_1] * abs_dir1; \
125  if (pmin > rad || -rad > pmax) return false; \
126  }
127 
128 #define TEST_CROSS_EDGE_BOX_X_AXIS_MCR(edge, absolute_edge, pointa, pointb, _extend) \
129  { \
130  TEST_CROSS_EDGE_BOX_MCR(edge, absolute_edge, pointa, pointb, _extend, 2, 1, 1, 2); \
131  }
132 
133 #define TEST_CROSS_EDGE_BOX_Y_AXIS_MCR(edge, absolute_edge, pointa, pointb, _extend) \
134  { \
135  TEST_CROSS_EDGE_BOX_MCR(edge, absolute_edge, pointa, pointb, _extend, 0, 2, 2, 0); \
136  }
137 
138 #define TEST_CROSS_EDGE_BOX_Z_AXIS_MCR(edge, absolute_edge, pointa, pointb, _extend) \
139  { \
140  TEST_CROSS_EDGE_BOX_MCR(edge, absolute_edge, pointa, pointb, _extend, 1, 0, 0, 1); \
141  }
142 
145  const btMatrix3x3 &mat, const btVector3 &vec3, int colindex)
146 {
147  return vec3[0] * mat[0][colindex] + vec3[1] * mat[1][colindex] + vec3[2] * mat[2][colindex];
148 }
149 
151 ATTRIBUTE_ALIGNED16(class)
153 {
154 public:
155  btVector3 m_T1to0;
158 
160  {
161  // static const btVector3 vepsi(1e-6f,1e-6f,1e-6f);
162  // m_AR[0] = vepsi + m_R1to0[0].absolute();
163  // m_AR[1] = vepsi + m_R1to0[1].absolute();
164  // m_AR[2] = vepsi + m_R1to0[2].absolute();
165 
166  int i, j;
167 
168  for (i = 0; i < 3; i++)
169  {
170  for (j = 0; j < 3; j++)
171  {
172  m_AR[i][j] = 1e-6f + btFabs(m_R1to0[i][j]);
173  }
174  }
175  }
176 
178  {
179  }
180 
183  {
184  btTransform temp_trans = trans0.inverse();
185  temp_trans = temp_trans * trans1;
186 
187  m_T1to0 = temp_trans.getOrigin();
188  m_R1to0 = temp_trans.getBasis();
189 
191  }
192 
195  {
196  m_R1to0 = trans0.getBasis().inverse();
197  m_T1to0 = m_R1to0 * (-trans0.getOrigin());
198 
199  m_T1to0 += m_R1to0 * trans1.getOrigin();
200  m_R1to0 *= trans1.getBasis();
201 
203  }
204 
206  {
207  return point.dot3(m_R1to0[0], m_R1to0[1], m_R1to0[2]) + m_T1to0;
208  }
209 };
210 
211 #define BOX_PLANE_EPSILON 0.000001f
212 
214 ATTRIBUTE_ALIGNED16(class)
216 {
217 public:
218  btVector3 m_min;
220 
221  btAABB()
222  {
223  }
224 
225  btAABB(const btVector3 &V1,
226  const btVector3 &V2,
227  const btVector3 &V3)
228  {
229  m_min[0] = BT_MIN3(V1[0], V2[0], V3[0]);
230  m_min[1] = BT_MIN3(V1[1], V2[1], V3[1]);
231  m_min[2] = BT_MIN3(V1[2], V2[2], V3[2]);
232 
233  m_max[0] = BT_MAX3(V1[0], V2[0], V3[0]);
234  m_max[1] = BT_MAX3(V1[1], V2[1], V3[1]);
235  m_max[2] = BT_MAX3(V1[2], V2[2], V3[2]);
236  }
237 
238  btAABB(const btVector3 &V1,
239  const btVector3 &V2,
240  const btVector3 &V3,
241  btScalar margin)
242  {
243  m_min[0] = BT_MIN3(V1[0], V2[0], V3[0]);
244  m_min[1] = BT_MIN3(V1[1], V2[1], V3[1]);
245  m_min[2] = BT_MIN3(V1[2], V2[2], V3[2]);
246 
247  m_max[0] = BT_MAX3(V1[0], V2[0], V3[0]);
248  m_max[1] = BT_MAX3(V1[1], V2[1], V3[1]);
249  m_max[2] = BT_MAX3(V1[2], V2[2], V3[2]);
250 
251  m_min[0] -= margin;
252  m_min[1] -= margin;
253  m_min[2] -= margin;
254  m_max[0] += margin;
255  m_max[1] += margin;
256  m_max[2] += margin;
257  }
258 
259  btAABB(const btAABB &other) : m_min(other.m_min), m_max(other.m_max)
260  {
261  }
262 
263  btAABB(const btAABB &other, btScalar margin) : m_min(other.m_min), m_max(other.m_max)
264  {
265  m_min[0] -= margin;
266  m_min[1] -= margin;
267  m_min[2] -= margin;
268  m_max[0] += margin;
269  m_max[1] += margin;
270  m_max[2] += margin;
271  }
272 
274  {
275  m_min[0] = SIMD_INFINITY;
276  m_min[1] = SIMD_INFINITY;
277  m_min[2] = SIMD_INFINITY;
278  m_max[0] = -SIMD_INFINITY;
279  m_max[1] = -SIMD_INFINITY;
280  m_max[2] = -SIMD_INFINITY;
281  }
282 
284  {
285  m_min[0] -= margin;
286  m_min[1] -= margin;
287  m_min[2] -= margin;
288  m_max[0] += margin;
289  m_max[1] += margin;
290  m_max[2] += margin;
291  }
292 
294  {
295  m_min[0] = other.m_min[0] - margin;
296  m_min[1] = other.m_min[1] - margin;
297  m_min[2] = other.m_min[2] - margin;
298 
299  m_max[0] = other.m_max[0] + margin;
300  m_max[1] = other.m_max[1] + margin;
301  m_max[2] = other.m_max[2] + margin;
302  }
303 
304  template <typename CLASS_POINT>
306  const CLASS_POINT &V1,
307  const CLASS_POINT &V2,
308  const CLASS_POINT &V3)
309  {
310  m_min[0] = BT_MIN3(V1[0], V2[0], V3[0]);
311  m_min[1] = BT_MIN3(V1[1], V2[1], V3[1]);
312  m_min[2] = BT_MIN3(V1[2], V2[2], V3[2]);
313 
314  m_max[0] = BT_MAX3(V1[0], V2[0], V3[0]);
315  m_max[1] = BT_MAX3(V1[1], V2[1], V3[1]);
316  m_max[2] = BT_MAX3(V1[2], V2[2], V3[2]);
317  }
318 
319  template <typename CLASS_POINT>
321  const CLASS_POINT &V1,
322  const CLASS_POINT &V2,
323  const CLASS_POINT &V3, btScalar margin)
324  {
325  m_min[0] = BT_MIN3(V1[0], V2[0], V3[0]);
326  m_min[1] = BT_MIN3(V1[1], V2[1], V3[1]);
327  m_min[2] = BT_MIN3(V1[2], V2[2], V3[2]);
328 
329  m_max[0] = BT_MAX3(V1[0], V2[0], V3[0]);
330  m_max[1] = BT_MAX3(V1[1], V2[1], V3[1]);
331  m_max[2] = BT_MAX3(V1[2], V2[2], V3[2]);
332 
333  m_min[0] -= margin;
334  m_min[1] -= margin;
335  m_min[2] -= margin;
336  m_max[0] += margin;
337  m_max[1] += margin;
338  m_max[2] += margin;
339  }
340 
343  {
344  btVector3 center = (m_max + m_min) * 0.5f;
345  btVector3 extends = m_max - center;
346  // Compute new center
347  center = trans(center);
348 
349  btVector3 textends = extends.dot3(trans.getBasis().getRow(0).absolute(),
350  trans.getBasis().getRow(1).absolute(),
351  trans.getBasis().getRow(2).absolute());
352 
353  m_min = center - textends;
354  m_max = center + textends;
355  }
356 
359  {
360  btVector3 center = (m_max + m_min) * 0.5f;
361  btVector3 extends = m_max - center;
362  // Compute new center
363  center = trans.transform(center);
364 
365  btVector3 textends = extends.dot3(trans.m_R1to0.getRow(0).absolute(),
366  trans.m_R1to0.getRow(1).absolute(),
367  trans.m_R1to0.getRow(2).absolute());
368 
369  m_min = center - textends;
370  m_max = center + textends;
371  }
372 
374  SIMD_FORCE_INLINE void merge(const btAABB &box)
375  {
376  m_min[0] = BT_MIN(m_min[0], box.m_min[0]);
377  m_min[1] = BT_MIN(m_min[1], box.m_min[1]);
378  m_min[2] = BT_MIN(m_min[2], box.m_min[2]);
379 
380  m_max[0] = BT_MAX(m_max[0], box.m_max[0]);
381  m_max[1] = BT_MAX(m_max[1], box.m_max[1]);
382  m_max[2] = BT_MAX(m_max[2], box.m_max[2]);
383  }
384 
386  template <typename CLASS_POINT>
387  SIMD_FORCE_INLINE void merge_point(const CLASS_POINT &point)
388  {
389  m_min[0] = BT_MIN(m_min[0], point[0]);
390  m_min[1] = BT_MIN(m_min[1], point[1]);
391  m_min[2] = BT_MIN(m_min[2], point[2]);
392 
393  m_max[0] = BT_MAX(m_max[0], point[0]);
394  m_max[1] = BT_MAX(m_max[1], point[1]);
395  m_max[2] = BT_MAX(m_max[2], point[2]);
396  }
397 
400  {
401  center = (m_max + m_min) * 0.5f;
402  extend = m_max - center;
403  }
404 
407  {
408  intersection.m_min[0] = BT_MAX(other.m_min[0], m_min[0]);
409  intersection.m_min[1] = BT_MAX(other.m_min[1], m_min[1]);
410  intersection.m_min[2] = BT_MAX(other.m_min[2], m_min[2]);
411 
412  intersection.m_max[0] = BT_MIN(other.m_max[0], m_max[0]);
413  intersection.m_max[1] = BT_MIN(other.m_max[1], m_max[1]);
414  intersection.m_max[2] = BT_MIN(other.m_max[2], m_max[2]);
415  }
416 
417  SIMD_FORCE_INLINE bool has_collision(const btAABB &other) const
418  {
419  if (m_min[0] > other.m_max[0] ||
420  m_max[0] < other.m_min[0] ||
421  m_min[1] > other.m_max[1] ||
422  m_max[1] < other.m_min[1] ||
423  m_min[2] > other.m_max[2] ||
424  m_max[2] < other.m_min[2])
425  {
426  return false;
427  }
428  return true;
429  }
430 
436  SIMD_FORCE_INLINE bool collide_ray(const btVector3 &vorigin, const btVector3 &vdir) const
437  {
438  btVector3 extents, center;
439  this->get_center_extend(center, extents);
440  ;
441 
442  btScalar Dx = vorigin[0] - center[0];
443  if (BT_GREATER(Dx, extents[0]) && Dx * vdir[0] >= 0.0f) return false;
444  btScalar Dy = vorigin[1] - center[1];
445  if (BT_GREATER(Dy, extents[1]) && Dy * vdir[1] >= 0.0f) return false;
446  btScalar Dz = vorigin[2] - center[2];
447  if (BT_GREATER(Dz, extents[2]) && Dz * vdir[2] >= 0.0f) return false;
448 
449  btScalar f = vdir[1] * Dz - vdir[2] * Dy;
450  if (btFabs(f) > extents[1] * btFabs(vdir[2]) + extents[2] * btFabs(vdir[1])) return false;
451  f = vdir[2] * Dx - vdir[0] * Dz;
452  if (btFabs(f) > extents[0] * btFabs(vdir[2]) + extents[2] * btFabs(vdir[0])) return false;
453  f = vdir[0] * Dy - vdir[1] * Dx;
454  if (btFabs(f) > extents[0] * btFabs(vdir[1]) + extents[1] * btFabs(vdir[0])) return false;
455  return true;
456  }
457 
458  SIMD_FORCE_INLINE void projection_interval(const btVector3 &direction, btScalar &vmin, btScalar &vmax) const
459  {
460  btVector3 center = (m_max + m_min) * 0.5f;
461  btVector3 extend = m_max - center;
462 
463  btScalar _fOrigin = direction.dot(center);
464  btScalar _fMaximumExtent = extend.dot(direction.absolute());
465  vmin = _fOrigin - _fMaximumExtent;
466  vmax = _fOrigin + _fMaximumExtent;
467  }
468 
470  {
471  btScalar _fmin, _fmax;
472  this->projection_interval(plane, _fmin, _fmax);
473 
474  if (plane[3] > _fmax + BOX_PLANE_EPSILON)
475  {
476  return BT_CONST_BACK_PLANE; // 0
477  }
478 
479  if (plane[3] + BOX_PLANE_EPSILON >= _fmin)
480  {
481  return BT_CONST_COLLIDE_PLANE; //1
482  }
483  return BT_CONST_FRONT_PLANE; //2
484  }
485 
487  {
488  btAABB tbox = box;
489  tbox.appy_transform(trans1_to_0);
490  return has_collision(tbox);
491  }
492 
494  const BT_BOX_BOX_TRANSFORM_CACHE &trans1_to_0) const
495  {
496  btAABB tbox = box;
497  tbox.appy_transform_trans_cache(trans1_to_0);
498  return has_collision(tbox);
499  }
500 
503  const btAABB &box, const BT_BOX_BOX_TRANSFORM_CACHE &transcache, bool fulltest) const
504  {
505  //Taken from OPCODE
506  btVector3 ea, eb; //extends
507  btVector3 ca, cb; //extends
508  get_center_extend(ca, ea);
509  box.get_center_extend(cb, eb);
510 
511  btVector3 T;
512  btScalar t, t2;
513  int i;
514 
515  // Class I : A's basis vectors
516  for (i = 0; i < 3; i++)
517  {
518  T[i] = transcache.m_R1to0[i].dot(cb) + transcache.m_T1to0[i] - ca[i];
519  t = transcache.m_AR[i].dot(eb) + ea[i];
520  if (BT_GREATER(T[i], t)) return false;
521  }
522  // Class II : B's basis vectors
523  for (i = 0; i < 3; i++)
524  {
525  t = bt_mat3_dot_col(transcache.m_R1to0, T, i);
526  t2 = bt_mat3_dot_col(transcache.m_AR, ea, i) + eb[i];
527  if (BT_GREATER(t, t2)) return false;
528  }
529  // Class III : 9 cross products
530  if (fulltest)
531  {
532  int j, m, n, o, p, q, r;
533  for (i = 0; i < 3; i++)
534  {
535  m = (i + 1) % 3;
536  n = (i + 2) % 3;
537  o = i == 0 ? 1 : 0;
538  p = i == 2 ? 1 : 2;
539  for (j = 0; j < 3; j++)
540  {
541  q = j == 2 ? 1 : 2;
542  r = j == 0 ? 1 : 0;
543  t = T[n] * transcache.m_R1to0[m][j] - T[m] * transcache.m_R1to0[n][j];
544  t2 = ea[o] * transcache.m_AR[p][j] + ea[p] * transcache.m_AR[o][j] +
545  eb[r] * transcache.m_AR[i][q] + eb[q] * transcache.m_AR[i][r];
546  if (BT_GREATER(t, t2)) return false;
547  }
548  }
549  }
550  return true;
551  }
552 
555  const btVector4 &plane) const
556  {
558  return (classify == BT_CONST_COLLIDE_PLANE);
559  }
560 
563  const btVector3 &p1,
564  const btVector3 &p2,
565  const btVector3 &p3,
566  const btVector4 &triangle_plane) const
567  {
568  if (!collide_plane(triangle_plane)) return false;
569 
570  btVector3 center, extends;
571  this->get_center_extend(center, extends);
572 
573  const btVector3 v1(p1 - center);
574  const btVector3 v2(p2 - center);
575  const btVector3 v3(p3 - center);
576 
577  //First axis
578  btVector3 diff(v2 - v1);
579  btVector3 abs_diff = diff.absolute();
580  //Test With X axis
581  TEST_CROSS_EDGE_BOX_X_AXIS_MCR(diff, abs_diff, v1, v3, extends);
582  //Test With Y axis
583  TEST_CROSS_EDGE_BOX_Y_AXIS_MCR(diff, abs_diff, v1, v3, extends);
584  //Test With Z axis
585  TEST_CROSS_EDGE_BOX_Z_AXIS_MCR(diff, abs_diff, v1, v3, extends);
586 
587  diff = v3 - v2;
588  abs_diff = diff.absolute();
589  //Test With X axis
590  TEST_CROSS_EDGE_BOX_X_AXIS_MCR(diff, abs_diff, v2, v1, extends);
591  //Test With Y axis
592  TEST_CROSS_EDGE_BOX_Y_AXIS_MCR(diff, abs_diff, v2, v1, extends);
593  //Test With Z axis
594  TEST_CROSS_EDGE_BOX_Z_AXIS_MCR(diff, abs_diff, v2, v1, extends);
595 
596  diff = v1 - v3;
597  abs_diff = diff.absolute();
598  //Test With X axis
599  TEST_CROSS_EDGE_BOX_X_AXIS_MCR(diff, abs_diff, v3, v2, extends);
600  //Test With Y axis
601  TEST_CROSS_EDGE_BOX_Y_AXIS_MCR(diff, abs_diff, v3, v2, extends);
602  //Test With Z axis
603  TEST_CROSS_EDGE_BOX_Z_AXIS_MCR(diff, abs_diff, v3, v2, extends);
604 
605  return true;
606  }
607 };
608 
611 {
612  if (!(t1.getOrigin() == t2.getOrigin())) return false;
613 
614  if (!(t1.getBasis().getRow(0) == t2.getBasis().getRow(0))) return false;
615  if (!(t1.getBasis().getRow(1) == t2.getBasis().getRow(1))) return false;
616  if (!(t1.getBasis().getRow(2) == t2.getBasis().getRow(2))) return false;
617  return true;
618 }
619 
620 #endif // GIM_BOX_COLLISION_H_INCLUDED
NSNotificationCenter * center
_GL_VOID GLfloat value _GL_VOID_RET _GL_VOID const GLuint GLboolean *residences _GL_BOOL_RET _GL_VOID GLsizei GLfloat GLfloat GLfloat GLfloat const GLubyte *bitmap _GL_VOID_RET _GL_VOID GLenum const void *lists _GL_VOID_RET _GL_VOID const GLdouble *equation _GL_VOID_RET _GL_VOID GLdouble GLdouble blue _GL_VOID_RET _GL_VOID GLfloat GLfloat blue _GL_VOID_RET _GL_VOID GLint GLint blue _GL_VOID_RET _GL_VOID GLshort GLshort blue _GL_VOID_RET _GL_VOID GLubyte GLubyte blue _GL_VOID_RET _GL_VOID GLuint GLuint blue _GL_VOID_RET _GL_VOID GLushort GLushort blue _GL_VOID_RET _GL_VOID GLbyte GLbyte GLbyte alpha _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble alpha _GL_VOID_RET _GL_VOID GLfloat GLfloat GLfloat alpha _GL_VOID_RET _GL_VOID GLint GLint GLint alpha _GL_VOID_RET _GL_VOID GLshort GLshort GLshort alpha _GL_VOID_RET _GL_VOID GLubyte GLubyte GLubyte alpha _GL_VOID_RET _GL_VOID GLuint GLuint GLuint alpha _GL_VOID_RET _GL_VOID GLushort GLushort GLushort alpha _GL_VOID_RET _GL_VOID GLenum mode _GL_VOID_RET _GL_VOID GLint GLsizei GLsizei GLenum type _GL_VOID_RET _GL_VOID GLsizei GLenum GLenum const void *pixels _GL_VOID_RET _GL_VOID const void *pointer _GL_VOID_RET _GL_VOID GLdouble v _GL_VOID_RET _GL_VOID GLfloat v _GL_VOID_RET _GL_VOID GLint GLint i2 _GL_VOID_RET _GL_VOID GLint j _GL_VOID_RET _GL_VOID GLfloat param _GL_VOID_RET _GL_VOID GLint param _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble GLdouble GLdouble zFar _GL_VOID_RET _GL_UINT GLdouble *equation _GL_VOID_RET _GL_VOID GLenum GLint *params _GL_VOID_RET _GL_VOID GLenum GLfloat *v _GL_VOID_RET _GL_VOID GLenum GLfloat *params _GL_VOID_RET _GL_VOID GLfloat *values _GL_VOID_RET _GL_VOID GLushort *values _GL_VOID_RET _GL_VOID GLenum GLfloat *params _GL_VOID_RET _GL_VOID GLenum GLdouble *params _GL_VOID_RET _GL_VOID GLenum GLint *params _GL_VOID_RET _GL_VOID GLsizei const void *pointer _GL_VOID_RET _GL_VOID GLsizei const void *pointer _GL_VOID_RET _GL_BOOL GLfloat param _GL_VOID_RET _GL_VOID GLint param _GL_VOID_RET _GL_VOID GLenum GLfloat param _GL_VOID_RET _GL_VOID GLenum GLint param _GL_VOID_RET _GL_VOID GLushort pattern _GL_VOID_RET _GL_VOID GLdouble GLdouble GLint GLint const GLdouble *points _GL_VOID_RET _GL_VOID GLdouble GLdouble GLint GLint GLdouble GLdouble GLint GLint const GLdouble *points _GL_VOID_RET _GL_VOID GLdouble GLdouble u2 _GL_VOID_RET _GL_VOID GLdouble GLdouble GLint GLdouble GLdouble v2 _GL_VOID_RET _GL_VOID GLenum GLfloat param _GL_VOID_RET _GL_VOID GLenum GLint param _GL_VOID_RET _GL_VOID GLenum mode _GL_VOID_RET _GL_VOID GLdouble GLdouble nz _GL_VOID_RET _GL_VOID GLfloat GLfloat nz _GL_VOID_RET _GL_VOID GLint GLint nz _GL_VOID_RET _GL_VOID GLshort GLshort nz _GL_VOID_RET _GL_VOID GLsizei const void *pointer _GL_VOID_RET _GL_VOID GLsizei const GLfloat *values _GL_VOID_RET _GL_VOID GLsizei const GLushort *values _GL_VOID_RET _GL_VOID GLint param _GL_VOID_RET _GL_VOID const GLuint const GLclampf *priorities _GL_VOID_RET _GL_VOID GLdouble y _GL_VOID_RET _GL_VOID GLfloat y _GL_VOID_RET _GL_VOID GLint y _GL_VOID_RET _GL_VOID GLshort y _GL_VOID_RET _GL_VOID GLdouble GLdouble z _GL_VOID_RET _GL_VOID GLfloat GLfloat z _GL_VOID_RET _GL_VOID GLint GLint z _GL_VOID_RET _GL_VOID GLshort GLshort z _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble w _GL_VOID_RET _GL_VOID GLfloat GLfloat GLfloat w _GL_VOID_RET _GL_VOID GLint GLint GLint w _GL_VOID_RET _GL_VOID GLshort GLshort GLshort w _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble y2 _GL_VOID_RET _GL_VOID GLfloat GLfloat GLfloat y2 _GL_VOID_RET _GL_VOID GLint GLint GLint y2 _GL_VOID_RET _GL_VOID GLshort GLshort GLshort y2 _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble z _GL_VOID_RET _GL_VOID GLdouble GLdouble z _GL_VOID_RET _GL_VOID GLuint *buffer _GL_VOID_RET _GL_VOID GLdouble t _GL_VOID_RET _GL_VOID GLfloat t _GL_VOID_RET _GL_VOID GLint t _GL_VOID_RET _GL_VOID GLshort t _GL_VOID_RET _GL_VOID GLdouble GLdouble r _GL_VOID_RET _GL_VOID GLfloat GLfloat r _GL_VOID_RET _GL_VOID GLint GLint r _GL_VOID_RET _GL_VOID GLshort GLshort r _GL_VOID_RET _GL_VOID GLdouble GLdouble r
_GL_VOID GLfloat value _GL_VOID_RET _GL_VOID const GLuint GLboolean *residences _GL_BOOL_RET _GL_VOID GLsizei GLfloat GLfloat GLfloat GLfloat const GLubyte *bitmap _GL_VOID_RET _GL_VOID GLenum const void *lists _GL_VOID_RET _GL_VOID const GLdouble *equation _GL_VOID_RET _GL_VOID GLdouble GLdouble blue _GL_VOID_RET _GL_VOID GLfloat GLfloat blue _GL_VOID_RET _GL_VOID GLint GLint blue _GL_VOID_RET _GL_VOID GLshort GLshort blue _GL_VOID_RET _GL_VOID GLubyte GLubyte blue _GL_VOID_RET _GL_VOID GLuint GLuint blue _GL_VOID_RET _GL_VOID GLushort GLushort blue _GL_VOID_RET _GL_VOID GLbyte GLbyte GLbyte alpha _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble alpha _GL_VOID_RET _GL_VOID GLfloat GLfloat GLfloat alpha _GL_VOID_RET _GL_VOID GLint GLint GLint alpha _GL_VOID_RET _GL_VOID GLshort GLshort GLshort alpha _GL_VOID_RET _GL_VOID GLubyte GLubyte GLubyte alpha _GL_VOID_RET _GL_VOID GLuint GLuint GLuint alpha _GL_VOID_RET _GL_VOID GLushort GLushort GLushort alpha _GL_VOID_RET _GL_VOID GLenum mode _GL_VOID_RET _GL_VOID GLint GLsizei GLsizei GLenum type _GL_VOID_RET _GL_VOID GLsizei GLenum GLenum const void *pixels _GL_VOID_RET _GL_VOID const void *pointer _GL_VOID_RET _GL_VOID GLdouble v _GL_VOID_RET _GL_VOID GLfloat v _GL_VOID_RET _GL_VOID GLint GLint i2 _GL_VOID_RET _GL_VOID GLint j _GL_VOID_RET _GL_VOID GLfloat param _GL_VOID_RET _GL_VOID GLint param _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble GLdouble GLdouble zFar _GL_VOID_RET _GL_UINT GLdouble *equation _GL_VOID_RET _GL_VOID GLenum GLint *params _GL_VOID_RET _GL_VOID GLenum GLfloat *v _GL_VOID_RET _GL_VOID GLenum GLfloat *params _GL_VOID_RET _GL_VOID GLfloat *values _GL_VOID_RET _GL_VOID GLushort *values _GL_VOID_RET _GL_VOID GLenum GLfloat *params _GL_VOID_RET _GL_VOID GLenum GLdouble *params _GL_VOID_RET _GL_VOID GLenum GLint *params _GL_VOID_RET _GL_VOID GLsizei const void *pointer _GL_VOID_RET _GL_VOID GLsizei const void *pointer _GL_VOID_RET _GL_BOOL GLfloat param _GL_VOID_RET _GL_VOID GLint param _GL_VOID_RET _GL_VOID GLenum GLfloat param _GL_VOID_RET _GL_VOID GLenum GLint param _GL_VOID_RET _GL_VOID GLushort pattern _GL_VOID_RET _GL_VOID GLdouble GLdouble GLint GLint const GLdouble *points _GL_VOID_RET _GL_VOID GLdouble GLdouble GLint GLint GLdouble GLdouble GLint GLint const GLdouble *points _GL_VOID_RET _GL_VOID GLdouble GLdouble u2 _GL_VOID_RET _GL_VOID GLdouble GLdouble GLint GLdouble GLdouble v2 _GL_VOID_RET _GL_VOID GLenum GLfloat param _GL_VOID_RET _GL_VOID GLenum GLint param _GL_VOID_RET _GL_VOID GLenum mode _GL_VOID_RET _GL_VOID GLdouble GLdouble nz _GL_VOID_RET _GL_VOID GLfloat GLfloat nz _GL_VOID_RET _GL_VOID GLint GLint nz _GL_VOID_RET _GL_VOID GLshort GLshort nz _GL_VOID_RET _GL_VOID GLsizei const void *pointer _GL_VOID_RET _GL_VOID GLsizei const GLfloat *values _GL_VOID_RET _GL_VOID GLsizei const GLushort *values _GL_VOID_RET _GL_VOID GLint param _GL_VOID_RET _GL_VOID const GLuint const GLclampf *priorities _GL_VOID_RET _GL_VOID GLdouble y _GL_VOID_RET _GL_VOID GLfloat y _GL_VOID_RET _GL_VOID GLint y _GL_VOID_RET _GL_VOID GLshort y _GL_VOID_RET _GL_VOID GLdouble GLdouble z _GL_VOID_RET _GL_VOID GLfloat GLfloat z _GL_VOID_RET _GL_VOID GLint GLint z _GL_VOID_RET _GL_VOID GLshort GLshort z _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble w _GL_VOID_RET _GL_VOID GLfloat GLfloat GLfloat w _GL_VOID_RET _GL_VOID GLint GLint GLint w _GL_VOID_RET _GL_VOID GLshort GLshort GLshort w _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble y2 _GL_VOID_RET _GL_VOID GLfloat GLfloat GLfloat y2 _GL_VOID_RET _GL_VOID GLint GLint GLint y2 _GL_VOID_RET _GL_VOID GLshort GLshort GLshort y2 _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble z _GL_VOID_RET _GL_VOID GLdouble GLdouble z _GL_VOID_RET _GL_VOID GLuint *buffer _GL_VOID_RET _GL_VOID GLdouble t _GL_VOID_RET _GL_VOID GLfloat t _GL_VOID_RET _GL_VOID GLint t _GL_VOID_RET _GL_VOID GLshort t _GL_VOID_RET _GL_VOID GLdouble t
_GL_VOID GLfloat value _GL_VOID_RET _GL_VOID const GLuint GLboolean *residences _GL_BOOL_RET _GL_VOID GLsizei GLfloat GLfloat GLfloat GLfloat const GLubyte *bitmap _GL_VOID_RET _GL_VOID GLenum const void *lists _GL_VOID_RET _GL_VOID const GLdouble *equation _GL_VOID_RET _GL_VOID GLdouble GLdouble blue _GL_VOID_RET _GL_VOID GLfloat GLfloat blue _GL_VOID_RET _GL_VOID GLint GLint blue _GL_VOID_RET _GL_VOID GLshort GLshort blue _GL_VOID_RET _GL_VOID GLubyte GLubyte blue _GL_VOID_RET _GL_VOID GLuint GLuint blue _GL_VOID_RET _GL_VOID GLushort GLushort blue _GL_VOID_RET _GL_VOID GLbyte GLbyte GLbyte alpha _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble alpha _GL_VOID_RET _GL_VOID GLfloat GLfloat GLfloat alpha _GL_VOID_RET _GL_VOID GLint GLint GLint alpha _GL_VOID_RET _GL_VOID GLshort GLshort GLshort alpha _GL_VOID_RET _GL_VOID GLubyte GLubyte GLubyte alpha _GL_VOID_RET _GL_VOID GLuint GLuint GLuint alpha _GL_VOID_RET _GL_VOID GLushort GLushort GLushort alpha _GL_VOID_RET _GL_VOID GLenum mode _GL_VOID_RET _GL_VOID GLint GLsizei GLsizei GLenum type _GL_VOID_RET _GL_VOID GLsizei GLenum GLenum const void *pixels _GL_VOID_RET _GL_VOID const void *pointer _GL_VOID_RET _GL_VOID GLdouble v _GL_VOID_RET _GL_VOID GLfloat v _GL_VOID_RET _GL_VOID GLint GLint i2 _GL_VOID_RET _GL_VOID GLint j _GL_VOID_RET _GL_VOID GLfloat param _GL_VOID_RET _GL_VOID GLint param _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble GLdouble GLdouble zFar _GL_VOID_RET _GL_UINT GLdouble *equation _GL_VOID_RET _GL_VOID GLenum GLint *params _GL_VOID_RET _GL_VOID GLenum GLfloat *v _GL_VOID_RET _GL_VOID GLenum GLfloat *params _GL_VOID_RET _GL_VOID GLfloat *values _GL_VOID_RET _GL_VOID GLushort *values _GL_VOID_RET _GL_VOID GLenum GLfloat *params _GL_VOID_RET _GL_VOID GLenum GLdouble *params _GL_VOID_RET _GL_VOID GLenum GLint *params _GL_VOID_RET _GL_VOID GLsizei const void *pointer _GL_VOID_RET _GL_VOID GLsizei const void *pointer _GL_VOID_RET _GL_BOOL GLfloat param _GL_VOID_RET _GL_VOID GLint param _GL_VOID_RET _GL_VOID GLenum GLfloat param _GL_VOID_RET _GL_VOID GLenum GLint param _GL_VOID_RET _GL_VOID GLushort pattern _GL_VOID_RET _GL_VOID GLdouble GLdouble GLint GLint const GLdouble *points _GL_VOID_RET _GL_VOID GLdouble GLdouble GLint GLint GLdouble v1
in reality light always falls off quadratically Particle Retrieve the data of the particle that spawned the object for example to give variation to multiple instances of an object Point Retrieve information about points in a point cloud Retrieve the edges of an object as it appears to Cycles topology will always appear triangulated Convert a blackbody temperature to an RGB value Normal Generate a perturbed normal from an RGB normal map image Typically used for faking highly detailed surfaces Generate an OSL shader from a file or text data block Image Sample an image file as a texture Sky Generate a procedural sky texture Noise Generate fractal Perlin noise Wave Generate procedural bands or rings with noise Voronoi Generate Worley noise based on the distance to random points Typically used to generate textures such as or biological cells Brick Generate a procedural texture producing bricks Texture Retrieve multiple types of texture coordinates nTypically used as inputs for texture nodes Vector Convert a point
ATTR_WARN_UNUSED_RESULT const BMVert * v2
#define BT_MAX3(a, b, c)
BT_BOX_BOX_TRANSFORM_CACHE
Class for transforming a model1 to the space of model0.
btVector3 m_max
SIMD_FORCE_INLINE void merge_point(const CLASS_POINT &point)
Merges a point.
SIMD_FORCE_INLINE void copy_with_margin(const btAABB &other, btScalar margin)
SIMD_FORCE_INLINE void calc_from_full_invert(const btTransform &trans0, const btTransform &trans1)
Calcs the full invertion of the matrices. Useful for scaling matrices.
SIMD_FORCE_INLINE void merge(const btAABB &box)
Merges a Box.
#define TEST_CROSS_EDGE_BOX_X_AXIS_MCR(edge, absolute_edge, pointa, pointb, _extend)
SIMD_FORCE_INLINE bool has_collision(const btAABB &other) const
btMatrix3x3 m_R1to0
Transforms Rotation of model1 to model 0, equal to R0' * R1.
SIMD_FORCE_INLINE bool overlapping_trans_conservative(const btAABB &box, btTransform &trans1_to_0) const
#define BT_MAX(a, b)
SIMD_FORCE_INLINE void calc_from_triangle(const CLASS_POINT &V1, const CLASS_POINT &V2, const CLASS_POINT &V3)
#define BT_GREATER(x, y)
#define BT_MIN(a, b)
SIMD_FORCE_INLINE void appy_transform_trans_cache(const BT_BOX_BOX_TRANSFORM_CACHE &trans)
Apply a transform to an AABB.
SIMD_FORCE_INLINE void invalidate()
SIMD_FORCE_INLINE void calc_absolute_matrix()
#define TEST_CROSS_EDGE_BOX_Y_AXIS_MCR(edge, absolute_edge, pointa, pointb, _extend)
eBT_PLANE_INTERSECTION_TYPE
@ BT_CONST_COLLIDE_PLANE
@ BT_CONST_BACK_PLANE
@ BT_CONST_FRONT_PLANE
SIMD_FORCE_INLINE bool collide_ray(const btVector3 &vorigin, const btVector3 &vdir) const
Finds the Ray intersection parameter.
SIMD_FORCE_INLINE bool collide_plane(const btVector4 &plane) const
Simple test for planes.
SIMD_FORCE_INLINE void calc_from_homogenic(const btTransform &trans0, const btTransform &trans1)
Calc the transformation relative 1 to 0. Inverts matrics by transposing.
SIMD_FORCE_INLINE void projection_interval(const btVector3 &direction, btScalar &vmin, btScalar &vmax) const
#define TEST_CROSS_EDGE_BOX_Z_AXIS_MCR(edge, absolute_edge, pointa, pointb, _extend)
SIMD_FORCE_INLINE btScalar bt_mat3_dot_col(const btMatrix3x3 &mat, const btVector3 &vec3, int colindex)
Returns the dot product between a vec3f and the col of a matrix.
SIMD_FORCE_INLINE bool btCompareTransformsEqual(const btTransform &t1, const btTransform &t2)
Compairison of transformation objects.
SIMD_FORCE_INLINE void appy_transform(const btTransform &trans)
Apply a transform to an AABB.
SIMD_FORCE_INLINE bool collide_triangle_exact(const btVector3 &p1, const btVector3 &p2, const btVector3 &p3, const btVector4 &triangle_plane) const
test for a triangle, with edges
SIMD_FORCE_INLINE bool overlapping_trans_conservative2(const btAABB &box, const BT_BOX_BOX_TRANSFORM_CACHE &trans1_to_0) const
#define BT_MIN3(a, b, c)
SIMD_FORCE_INLINE void calc_from_triangle_margin(const CLASS_POINT &V1, const CLASS_POINT &V2, const CLASS_POINT &V3, btScalar margin)
SIMD_FORCE_INLINE eBT_PLANE_INTERSECTION_TYPE plane_classify(const btVector4 &plane) const
SIMD_FORCE_INLINE bool overlapping_trans_cache(const btAABB &box, const BT_BOX_BOX_TRANSFORM_CACHE &transcache, bool fulltest) const
transcache is the transformation cache from box to this AABB
SIMD_FORCE_INLINE void increment_margin(btScalar margin)
SIMD_FORCE_INLINE void find_intersection(const btAABB &other, btAABB &intersection) const
Finds the intersecting box between this box and the other.
SIMD_FORCE_INLINE void get_center_extend(btVector3 &center, btVector3 &extend) const
Gets the extend and center.
btAABB
Axis aligned box.
#define BOX_PLANE_EPSILON
SIMD_FORCE_INLINE btVector3 transform(const btVector3 &point) const
btMatrix3x3 m_AR
Absolute value of m_R1to0.
btMatrix3x3
The btMatrix3x3 class implements a 3x3 rotation matrix, to perform linear algebra in combination with...
Definition: btMatrix3x3.h:50
float btScalar
The btScalar type abstracts floating point numbers, to easily switch between double and single floati...
Definition: btScalar.h:314
#define ATTRIBUTE_ALIGNED16(a)
Definition: btScalar.h:285
SIMD_FORCE_INLINE btScalar btFabs(btScalar x)
Definition: btScalar.h:497
#define SIMD_INFINITY
Definition: btScalar.h:544
#define SIMD_FORCE_INLINE
Definition: btScalar.h:280
btTransform
The btTransform class supports rigid transforms with only translation and rotation and no scaling/she...
Definition: btTransform.h:30
btVector3
btVector3 can be used to represent 3D points and vectors. It has an un-used w component to suit 16-by...
Definition: btVector3.h:82
#define T
Intersection< segment > intersection
IMETHOD Vector diff(const Vector &a, const Vector &b, double dt=1)