OPC_VolumeCollider.cpp 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  2. /*
  3. * OPCODE - Optimized Collision Detection
  4. * Copyright (C) 2001 Pierre Terdiman
  5. * Homepage: http://www.codercorner.com/Opcode.htm
  6. */
  7. ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  8. ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  9. /**
  10. * Contains base volume collider class.
  11. * \file OPC_VolumeCollider.cpp
  12. * \author Pierre Terdiman
  13. * \date June, 2, 2001
  14. */
  15. ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  16. ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  17. /**
  18. * Contains the abstract class for volume colliders.
  19. *
  20. * \class VolumeCollider
  21. * \author Pierre Terdiman
  22. * \version 1.3
  23. * \date June, 2, 2001
  24. */
  25. ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  26. ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  27. // Precompiled Header
  28. #include "Stdafx.h"
  29. using namespace Opcode;
  30. ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  31. /**
  32. * Constructor.
  33. */
  34. ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  35. VolumeCollider::VolumeCollider() :
  36. mTouchedPrimitives (null),
  37. mNbVolumeBVTests (0),
  38. mNbVolumePrimTests (0)
  39. {
  40. }
  41. ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  42. /**
  43. * Destructor.
  44. */
  45. ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  46. VolumeCollider::~VolumeCollider()
  47. {
  48. mTouchedPrimitives = null;
  49. }
  50. ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  51. /**
  52. * Validates current settings. You should call this method after all the settings / callbacks have been defined for a collider.
  53. * \return null if everything is ok, else a string describing the problem
  54. */
  55. ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  56. const char* VolumeCollider::ValidateSettings()
  57. {
  58. return null;
  59. }
  60. // Pretty dumb way to dump - to do better - one day...
  61. #define IMPLEMENT_NOLEAFDUMP(type) \
  62. void VolumeCollider::_Dump(const type* node) \
  63. { \
  64. if(node->HasPosLeaf()) mTouchedPrimitives->Add(udword(node->GetPosPrimitive())); \
  65. else _Dump(node->GetPos()); \
  66. \
  67. if(ContactFound()) return; \
  68. \
  69. if(node->HasNegLeaf()) mTouchedPrimitives->Add(udword(node->GetNegPrimitive())); \
  70. else _Dump(node->GetNeg()); \
  71. }
  72. #define IMPLEMENT_LEAFDUMP(type) \
  73. void VolumeCollider::_Dump(const type* node) \
  74. { \
  75. if(node->IsLeaf()) \
  76. { \
  77. mTouchedPrimitives->Add(udword(node->GetPrimitive())); \
  78. } \
  79. else \
  80. { \
  81. _Dump(node->GetPos()); \
  82. \
  83. if(ContactFound()) return; \
  84. \
  85. _Dump(node->GetNeg()); \
  86. } \
  87. }
  88. IMPLEMENT_NOLEAFDUMP(AABBNoLeafNode)
  89. IMPLEMENT_NOLEAFDUMP(AABBQuantizedNoLeafNode)
  90. IMPLEMENT_LEAFDUMP(AABBCollisionNode)
  91. IMPLEMENT_LEAFDUMP(AABBQuantizedNode)