hkKdTree.inl
上传用户:yisoukefu
上传日期:2020-08-09
资源大小:39506k
文件大小:6k
源码类别:

其他游戏

开发平台:

Visual C++

  1. /* 
  2.  * 
  3.  * Confidential Information of Telekinesys Research Limited (t/a Havok). Not for disclosure or distribution without Havok's
  4.  * prior written consent. This software contains code, techniques and know-how which is confidential and proprietary to Havok.
  5.  * Level 2 and Level 3 source code contains trade secrets of Havok. Havok Software (C) Copyright 1999-2009 Telekinesys Research Limited t/a Havok. All Rights Reserved. Use of this software is subject to the terms of an end user license agreement.
  6.  * 
  7.  */
  8. HK_FORCE_INLINE hkSplitType hkConvertRealToSplitType( hkReal in, hkReal offset, hkReal scale )
  9. {
  10. //replace with proper int to float correction
  11. return hkSplitType( (in - offset) / scale * 65535.0f );
  12. }
  13. HK_FORCE_INLINE hkReal hkConvertSplitTypeToReal( hkSplitType in, hkReal offset, hkReal scale )
  14. {
  15. return  (hkReal(in) / 65535.0f) * scale  + offset;
  16. }
  17. hkKdTreeNode::hkKdTreeNode( )  
  18. m_data.m_leaf.m_type_primId =0x7FFFFFFF; /* Empty leaf */ 
  19. m_data.m_leaf.m_numPrimitives = 0;
  20. }
  21. int hkKdTreeNode::getSplitAxis() const
  22. {
  23. HK_ASSERT(0x1d97fecf, !isLeaf());
  24. return m_data.m_node.m_type_left_axis & 0x00000003;
  25. }
  26. hkSplitType hkKdTreeNode::getSplitMin() const
  27. {
  28. HK_ASSERT(0x1d97fecf, !isLeaf());
  29. return m_data.m_node.m_splitMin;
  30. }
  31. hkSplitType hkKdTreeNode::getSplitMax() const
  32. {
  33. HK_ASSERT(0x1d97fecf, !isLeaf());
  34. return m_data.m_node.m_splitMax;
  35. }
  36. hkPrimitiveId hkKdTreeNode::getPrimitiveId() const
  37. {
  38. HK_ASSERT(0x1d97fecf, isLeaf());
  39. return m_data.m_leaf.m_type_primId & 0x7FFFFFFF;
  40. }
  41. hkKdTreeNode* hkKdTreeNode::getLeft() const
  42. {
  43. HK_ASSERT(0x1d97fecf, !isLeaf());
  44. hkKdTreeNode* left = reinterpret_cast<hkKdTreeNode*> ((hkUlong)this + (m_data.m_node.m_type_left_axis & 0x7FFFFFFC) );
  45. // Alignment check
  46. HK_ASSERT(0x206ee6f2, (((hkUlong) left) & 0xF) == 0);
  47. return left;
  48. }
  49. hkKdTreeNode* hkKdTreeNode::getRight() const
  50. {
  51. hkKdTreeNode* right = getLeft()+1;
  52. HK_ASSERT(0x206ee6f3, (((hkUlong) right) & 0xF) == 8);
  53. return right;
  54. }
  55. hkUint32 hkKdTreeNode::getLeftOffset() const
  56. {
  57. return m_data.m_node.m_type_left_axis & 0x7FFFFFFC;
  58. }
  59. hkUint32 hkKdTreeNode::getRightOffset() const
  60. {
  61. return getLeftOffset() + sizeof(hkKdTreeNode);
  62. }
  63. void hkKdTreeNode::setSplit(int axis, hkSplitType splitMin, hkSplitType splitMax)
  64. {
  65. HK_ASSERT(0x430fd315, (axis >=0) && (axis <=3) );
  66. m_data.m_node.m_splitMin = splitMin;
  67. m_data.m_node.m_splitMax = splitMax;
  68. m_data.m_node.m_type_left_axis = 0x80000000 | (m_data.m_node.m_type_left_axis & 0xFFFFFFFC) | axis;
  69. }
  70. hkKdTreeNode* hkKdTreeNode::getSibling() const
  71. {
  72. hkKdTreeNode* sibling = reinterpret_cast<hkKdTreeNode*> ((hkUlong)this ^ 0x8 );
  73. HK_ASSERT(0x6115931c, (isLeft() && sibling->isRight()) || (isRight() && sibling->isLeft()) );
  74. return sibling;
  75. }
  76. void hkKdTreeNode::setNumPrimitivesInLeaf( hkUint32 offset )
  77. {
  78. m_data.m_leaf.m_numPrimitives = offset;
  79. }
  80. hkUint32 hkKdTreeNode::getNumPrimitivesInLeaf() const
  81. {
  82. HK_ASSERT(0x1d97fecf, isLeaf());
  83. return m_data.m_leaf.m_numPrimitives;
  84. }
  85. hkBool32 hkKdTreeNode::isLeaf32() const
  86. {
  87. return ~(m_data.m_leaf.m_type_primId >> 31);
  88. }
  89. hkBool32 hkKdTreeNode::isEmptyLeaf32() const
  90. {
  91. return ~(m_data.m_leaf.m_type_primId ^ 0x7FFFFFFF);
  92. }
  93. hkBool hkKdTreeNode::isLeaf() const
  94. {
  95. return m_data.m_leaf.m_type_primId >= 0;
  96. }
  97. hkBool hkKdTreeNode::isEmptyLeaf() const
  98. {
  99. return m_data.m_leaf.m_type_primId == 0x7FFFFFFF;
  100. }
  101. hkBool hkKdTreeNode::isLeft() const
  102. {
  103. return ( ((hkUint32) (hkUlong) this) & 0xF) == 0x0;
  104. }
  105. hkBool hkKdTreeNode::isRight() const
  106. {
  107. return ( ((hkUint32) (hkUlong) this) & 0xF) == 0x8;
  108. }
  109. void hkKdTreeNode::setPrimitiveId(hkPrimitiveId id)
  110. {
  111. HK_ASSERT(0x4097d487, id < 0x7FFFFFFF );
  112. m_data.m_leaf.m_type_primId = (int)id & 0x7FFFFFFF;
  113. }
  114. void hkKdTreeNode::setLeftAndRightByteOffset( hkUlong offset )
  115. {
  116. HK_ASSERT( 0x0, (offset & 0x3) == 0);
  117. HK_ASSERT( 0x0, (offset & 0x80000000) == 0);
  118. m_data.m_node.m_type_left_axis =  (m_data.m_node.m_type_left_axis & 0x80000003) | ((hkUint32)offset);
  119. }
  120. void hkKdTreeNode::adjustLeftAndRightByteOffset( int offsetDelta )
  121. {
  122. hkUlong offset = (m_data.m_node.m_type_left_axis & ~0x80000003);
  123. offset += offsetDelta;
  124. m_data.m_node.m_type_left_axis =  (m_data.m_node.m_type_left_axis & 0x80000003) | ((hkUint32)offset);
  125. }
  126. void hkKdTreeNode::setEmpty()
  127. {
  128. m_data.m_node.m_type_left_axis =0x7FFFFFFF; /* Empty leaf */ 
  129. }
  130. void hkKdTreeNode::setAabbBound(const hkSplitType bound[4])
  131. {
  132. m_data.m_bound[0] = bound[0];
  133. m_data.m_bound[1] = bound[1];
  134. m_data.m_bound[2] = bound[2];
  135. m_data.m_bound[3] = bound[3];
  136. }
  137. void hkKdTree::setNumPrimitives(int n)
  138. {
  139. m_numPrimitives = n; 
  140. m_projectedEntries.setSize(n);
  141. }
  142. inline int HK_CALL hkKdTree::getSizeForDistributedBuild(int numPrimitives)
  143. {
  144. // Worst distribution is 3 subtrees of size 1 and 1 of size N-3
  145. const int smallSubTreeSize = getSizeForFastBuild(1);
  146. const int bigSubTreeSize = getSizeForFastBuild(numPrimitives - 3);
  147. const int singleThreadedOverhead = DISTRIBUTED_BUILD_SUBTREE_OFFSET;
  148. return singleThreadedOverhead + bigSubTreeSize + 3*smallSubTreeSize;
  149. }
  150. inline int HK_CALL hkKdTree::getNumExtraNodesForFastBuild(int numPrimitives, hkKdTreeCinfo::EmptyNodeAllocation ena)
  151. {
  152. if (ena == hkKdTreeCinfo::NO_EMPTY_NODES)
  153. return 0;
  154. else
  155. return numPrimitives / (int) ena;
  156. }
  157. /*
  158. * Havok SDK - NO SOURCE PC DOWNLOAD, BUILD(#20090216)
  159. * Confidential Information of Havok.  (C) Copyright 1999-2009
  160. * Telekinesys Research Limited t/a Havok. All Rights Reserved. The Havok
  161. * Logo, and the Havok buzzsaw logo are trademarks of Havok.  Title, ownership
  162. * rights, and intellectual property rights in the Havok software remain in
  163. * Havok and/or its suppliers.
  164. * Use of this software for evaluation purposes is subject to and indicates
  165. * acceptance of the End User licence Agreement for this product. A copy of
  166. * the license is included with this software and is also available at www.havok.com/tryhavok.
  167. */