Advertisement
Guest User

Untitled

a guest
Jan 21st, 2018
181
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.19 KB | None | 0 0
  1. #include "StdAfx.h"
  2. #include "MapOutdoor.h"
  3. #include "TerrainQuadtree.h"
  4.  
  5. //////////////////////////////////////////////////////////////////////////
  6. // QuadTree
  7. //////////////////////////////////////////////////////////////////////////
  8. void CMapOutdoor::BuildQuadTree()
  9. {
  10. FreeQuadTree();
  11.  
  12. // m_wPatchCount´Â ConvertPatchSplatżˇĽ­µµ Á¤ÇŃ´Ů, ľČŔüŔ» Ŕ§ÇŘ ż©±âĽ­ ĂĽĹ©ÇŃ´Ů.
  13. if (0 == m_wPatchCount)
  14. {
  15. TraceError("MapOutdoor::BuildQuadTree : m_wPatchCount is zero, you must call ConvertPatchSplat before call this method.");
  16. return;
  17. }
  18.  
  19. m_pRootNode = AllocQuadTreeNode(0, 0, m_wPatchCount - 1, m_wPatchCount - 1);
  20. if (!m_pRootNode)
  21. TraceError("CMapOutdoor::BuildQuadTree() RootNode is NULL");
  22.  
  23. if (m_pRootNode->Size > 1)
  24. SubDivideNode(m_pRootNode);
  25. }
  26.  
  27. CTerrainQuadtreeNode * CMapOutdoor::AllocQuadTreeNode(long x0, long y0, long x1, long y1)
  28. {
  29. CTerrainQuadtreeNode * Node;
  30. long xsize, ysize;
  31.  
  32. xsize = x1-x0+1;
  33. ysize = y1-y0+1;
  34. if ((xsize == 0) || (ysize == 0))
  35. return NULL;
  36.  
  37. Node = new CTerrainQuadtreeNode;
  38. Node->x0 = x0;
  39. Node->y0 = y0;
  40. Node->x1 = x1;
  41. Node->y1 = y1;
  42.  
  43. if (ysize > xsize)
  44. Node->Size = ysize;
  45. else
  46. Node->Size = xsize;
  47.  
  48. Node->PatchNum = y0 * m_wPatchCount + x0;
  49.  
  50. /*
  51. const float fTerrainMin = -(float) (m_lViewRadius * m_lCellScale);
  52.  
  53. minx = fTerrainMin + x0 * c_byPatchSize * m_lCellScale;
  54. maxx = fTerrainMin + (x1 + 1) * c_byPatchSize * m_lCellScale;
  55. miny = fTerrainMin + y0 * c_byPatchSize * m_lCellScale;
  56. maxy = fTerrainMin + (y1 + 1) * c_byPatchSize * m_lCellScale;
  57. minz = 0.0f;
  58. maxz = 0.0f;
  59.  
  60. / * Set up 8 vertices that belong to the bounding box * /
  61. Node->center.x = minx + (maxx - minx) * 0.5f;
  62. Node->center.y = miny + (maxy - miny) * 0.5f;
  63. Node->center.z = minz + (maxz - minz) * 0.5f;
  64.  
  65. Node->radius = sqrtf(
  66. (maxx-minx)*(maxx-minx)+
  67. (maxy-miny)*(maxy-miny)+
  68. (maxz-minz)*(maxz-minz)
  69. )/2.0f;
  70. */
  71.  
  72. Node->center.x = 0.0f;
  73. Node->center.y = 0.0f;
  74. Node->center.z = 0.0f;
  75.  
  76. Node->radius = 0.0f;
  77.  
  78. return Node;
  79. }
  80.  
  81.  
  82. void CMapOutdoor::SubDivideNode(CTerrainQuadtreeNode * Node)
  83. {
  84. long nw_size;
  85. CTerrainQuadtreeNode * tempnode;
  86.  
  87. nw_size = Node->Size / 2;
  88.  
  89. Node->NW_Node = AllocQuadTreeNode (Node->x0, Node->y0, Node->x0 + nw_size-1, Node->y0 + nw_size-1);
  90. Node->NE_Node = AllocQuadTreeNode (Node->x0 + nw_size, Node->y0, Node->x1, Node->y0 + nw_size-1);
  91. Node->SW_Node = AllocQuadTreeNode (Node->x0, Node->y0 + nw_size, Node->x0 + nw_size-1, Node->y1);
  92. Node->SE_Node = AllocQuadTreeNode (Node->x0 + nw_size, Node->y0 + nw_size, Node->x1, Node->y1);
  93.  
  94. tempnode = (CTerrainQuadtreeNode *) Node->NW_Node;
  95. if ((tempnode != NULL) && (tempnode->Size > 1))
  96. SubDivideNode (tempnode);
  97. tempnode = (CTerrainQuadtreeNode *) Node->NE_Node;
  98. if ((tempnode != NULL) && (tempnode->Size > 1))
  99. SubDivideNode (tempnode);
  100. tempnode = (CTerrainQuadtreeNode *) Node->SW_Node;
  101. if ((tempnode != NULL) && (tempnode->Size > 1))
  102. SubDivideNode (tempnode);
  103. tempnode = (CTerrainQuadtreeNode *) Node->SE_Node;
  104. if ((tempnode != NULL) && (tempnode->Size > 1))
  105. SubDivideNode (tempnode);
  106. }
  107.  
  108. /*
  109. void CMapOutdoor::RecurseDeleteQuadTree(CTerrainQuadtreeNode *Node)
  110. {
  111. if (Node == NULL)
  112. return;
  113.  
  114. if (Node->NW_Node != NULL)
  115. {
  116. RecurseDeleteQuadTree(Node->NW_Node);
  117. Node->NW_Node = NULL;
  118. }
  119. if (Node->NE_Node != NULL)
  120. {
  121. RecurseDeleteQuadTree(Node->NE_Node);
  122. Node->NE_Node = NULL;
  123. }
  124. if (Node->SW_Node != NULL)
  125. {
  126. RecurseDeleteQuadTree(Node->SW_Node);
  127. Node->SW_Node = NULL;
  128. }
  129. if (Node->SE_Node != NULL)
  130. {
  131. RecurseDeleteQuadTree(Node->SE_Node);
  132. Node->SE_Node = NULL;
  133. }
  134.  
  135. free(Node);
  136. }
  137. */
  138.  
  139. void CMapOutdoor::FreeQuadTree()
  140. {
  141. if (NULL == m_pRootNode)
  142. return;
  143.  
  144. if (m_pRootNode->NW_Node)
  145. {
  146. delete m_pRootNode->NW_Node;
  147. m_pRootNode->NW_Node = NULL;
  148. }
  149. if (m_pRootNode->NE_Node)
  150. {
  151. delete m_pRootNode->NE_Node;
  152. m_pRootNode->NE_Node = NULL;
  153. }
  154. if (m_pRootNode->SW_Node)
  155. {
  156. delete m_pRootNode->SW_Node;
  157. m_pRootNode->SW_Node = NULL;
  158. }
  159. if (m_pRootNode->SE_Node)
  160. {
  161. delete m_pRootNode->SE_Node;
  162. m_pRootNode->SE_Node = NULL;
  163. }
  164.  
  165. delete m_pRootNode;
  166. m_pRootNode = NULL;
  167. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement