b3QuantizedBvhNodeData.h 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. #ifndef B3_QUANTIZED_BVH_NODE_H
  2. #define B3_QUANTIZED_BVH_NODE_H
  3. #include "Bullet3Common/shared/b3Float4.h"
  4. #define B3_MAX_NUM_PARTS_IN_BITS 10
  5. ///b3QuantizedBvhNodeData is a compressed aabb node, 16 bytes.
  6. ///Node can be used for leafnode or internal node. Leafnodes can point to 32-bit triangle index (non-negative range).
  7. typedef struct b3QuantizedBvhNodeData b3QuantizedBvhNodeData_t;
  8. struct b3QuantizedBvhNodeData
  9. {
  10. //12 bytes
  11. unsigned short int m_quantizedAabbMin[3];
  12. unsigned short int m_quantizedAabbMax[3];
  13. //4 bytes
  14. int m_escapeIndexOrTriangleIndex;
  15. };
  16. inline int b3GetTriangleIndex(const b3QuantizedBvhNodeData* rootNode)
  17. {
  18. unsigned int x = 0;
  19. unsigned int y = (~(x & 0)) << (31 - B3_MAX_NUM_PARTS_IN_BITS);
  20. // Get only the lower bits where the triangle index is stored
  21. return (rootNode->m_escapeIndexOrTriangleIndex & ~(y));
  22. }
  23. inline int b3IsLeaf(const b3QuantizedBvhNodeData* rootNode)
  24. {
  25. //skipindex is negative (internal node), triangleindex >=0 (leafnode)
  26. return (rootNode->m_escapeIndexOrTriangleIndex >= 0) ? 1 : 0;
  27. }
  28. inline int b3GetEscapeIndex(const b3QuantizedBvhNodeData* rootNode)
  29. {
  30. return -rootNode->m_escapeIndexOrTriangleIndex;
  31. }
  32. inline void b3QuantizeWithClamp(unsigned short* out, b3Float4ConstArg point2, int isMax, b3Float4ConstArg bvhAabbMin, b3Float4ConstArg bvhAabbMax, b3Float4ConstArg bvhQuantization)
  33. {
  34. b3Float4 clampedPoint = b3MaxFloat4(point2, bvhAabbMin);
  35. clampedPoint = b3MinFloat4(clampedPoint, bvhAabbMax);
  36. b3Float4 v = (clampedPoint - bvhAabbMin) * bvhQuantization;
  37. if (isMax)
  38. {
  39. out[0] = (unsigned short)(((unsigned short)(v.x + 1.f) | 1));
  40. out[1] = (unsigned short)(((unsigned short)(v.y + 1.f) | 1));
  41. out[2] = (unsigned short)(((unsigned short)(v.z + 1.f) | 1));
  42. }
  43. else
  44. {
  45. out[0] = (unsigned short)(((unsigned short)(v.x) & 0xfffe));
  46. out[1] = (unsigned short)(((unsigned short)(v.y) & 0xfffe));
  47. out[2] = (unsigned short)(((unsigned short)(v.z) & 0xfffe));
  48. }
  49. }
  50. inline int b3TestQuantizedAabbAgainstQuantizedAabbSlow(
  51. const unsigned short int* aabbMin1,
  52. const unsigned short int* aabbMax1,
  53. const unsigned short int* aabbMin2,
  54. const unsigned short int* aabbMax2)
  55. {
  56. //int overlap = 1;
  57. if (aabbMin1[0] > aabbMax2[0])
  58. return 0;
  59. if (aabbMax1[0] < aabbMin2[0])
  60. return 0;
  61. if (aabbMin1[1] > aabbMax2[1])
  62. return 0;
  63. if (aabbMax1[1] < aabbMin2[1])
  64. return 0;
  65. if (aabbMin1[2] > aabbMax2[2])
  66. return 0;
  67. if (aabbMax1[2] < aabbMin2[2])
  68. return 0;
  69. return 1;
  70. //overlap = ((aabbMin1[0] > aabbMax2[0]) || (aabbMax1[0] < aabbMin2[0])) ? 0 : overlap;
  71. //overlap = ((aabbMin1[2] > aabbMax2[2]) || (aabbMax1[2] < aabbMin2[2])) ? 0 : overlap;
  72. //overlap = ((aabbMin1[1] > aabbMax2[1]) || (aabbMax1[1] < aabbMin2[1])) ? 0 : overlap;
  73. //return overlap;
  74. }
  75. #endif //B3_QUANTIZED_BVH_NODE_H