22 #ifndef __ND_FAST_AABB_H__
23 #define __ND_FAST_AABB_H__
25 #include "ndCoreStdafx.h"
41 void SetSeparatingDistance(
const ndFloat32 distance);
42 void SetTransposeAbsMatrix(
const ndMatrix& matrix);
44 D_CORE_API ndFloat32 PolygonBoxDistance(
const ndVector& faceNormal, ndInt32 indexCount,
const ndInt32*
const indexArray, ndInt32 stride,
const ndFloat32*
const vertexArray)
const;
45 D_CORE_API ndFloat32 PolygonBoxRayDistance(
const ndVector& faceNormal, ndInt32 indexCount,
const ndInt32*
const indexArray, ndInt32 stride,
const ndFloat32*
const vertexArray,
const ndFastRay& ray)
const;
48 ndMatrix MakeFaceMatrix(
const ndVector& faceNormal, ndInt32,
const ndInt32*
const indexArray, ndInt32 stride,
const ndFloat32*
const vertexArray)
const;
49 void MakeBox1(ndInt32 indexCount,
const ndInt32*
const indexArray, ndInt32 stride,
const ndFloat32*
const vertexArray,
ndVector& minBox,
ndVector& maxBox)
const;
50 void MakeBox2(
const ndMatrix& faceMatrix, ndInt32 indexCount,
const ndInt32*
const indexArray, ndInt32 stride,
const ndFloat32*
const vertexArray,
ndVector& minBox,
ndVector& maxBox)
const;
57 mutable ndVector m_separationDistance;
60 } D_GCC_NEWTON_ALIGN_32 ;
62 inline ndFastAabb::ndFastAabb()
64 ,m_absDir(ndGetIdentityMatrix())
68 ,m_separationDistance(ndFloat32(1.0e10f))
74 ,m_separationDistance(ndFloat32(1.0e10f))
76 SetTransposeAbsMatrix(matrix);
77 m_size =
ndVector(matrix[0].Abs().Scale(size.m_x) + matrix[1].Abs().Scale(size.m_y) + matrix[2].Abs().Scale(size.m_z));
78 m_p0 = (matrix[3] - m_size) & ndVector::m_triplexMask;
79 m_p1 = (matrix[3] + m_size) & ndVector::m_triplexMask;
84 ,m_absDir(ndGetIdentityMatrix())
87 ,m_size(
ndVector::m_half * (p1 - p0))
88 ,m_separationDistance(ndFloat32(1.0e10f))
90 m_posit = (ndVector::m_half * (p1 + p0)) | ndVector::m_wOne;
91 ndAssert(m_size.m_w == ndFloat32(0.0f));
92 ndAssert(m_posit.m_w == ndFloat32(1.0f));
95 inline const ndVector& ndFastAabb::GetOrigin()
const
100 inline const ndVector& ndFastAabb::GetTarget()
const
105 inline void ndFastAabb::SetSeparatingDistance(
const ndFloat32 distance)
107 m_separationDistance = distance;
110 inline void ndFastAabb::SetTransposeAbsMatrix(
const ndMatrix& matrix)
112 m_absDir = matrix.Transpose();
113 m_absDir[0] = m_absDir[0].Abs();
114 m_absDir[1] = m_absDir[1].Abs();
115 m_absDir[2] = m_absDir[2].Abs();