Advertisement
Guest User

Untitled

a guest
Apr 18th, 2015
210
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.17 KB | None | 0 0
  1. // Add
  2. // IPS SpellSystem ------
  3. void SceneContainer::initConeSearch(
  4. const Point3F Start,
  5. const Point3F End,
  6. const F32 Radius,
  7. const U32 TypeMask)
  8. {
  9. cleanupSearchVectors();
  10.  
  11. Point3F center = ( End - Start ) / 2;
  12. mSearchReferencePoint = center;
  13. VectorF direction = End - Start;
  14. direction.normalize();
  15. Box3F queryBox;
  16. Point3F perp1 = mPerp(direction);
  17. Point3F perp2 = mCross(perp1, direction);
  18. perp1.normalize();
  19. perp2.normalize();
  20. perp1 *= Radius;
  21. perp2 *= Radius;
  22. VectorF perp = perp1 + perp2;
  23.  
  24. AssertFatal( mIsZero( mDot( perp1, perp2 ) ), "ConeSearch, failed to generate perpendicular vector perp1 , perp2" );
  25. AssertFatal( mIsZero( mDot( center, perp2 ) ), "ConeSearch, failed to generate perpendicular vector center , perp2" );
  26. AssertFatal( mIsZero( mDot( perp1, center ) ), "ConeSearch, failed to generate perpendicular vector perp1, center" );
  27. Point3F startcorner = Point3F((Start - center).x - perp.x, (Start - center).y - perp.y, (Start - center).z -perp.z);
  28. Point3F endcorner = Point3F((End - center).x + perp.x, (End - center).y + perp.y, (End - center).z + perp.z);
  29. Point3F minCorner = Point3F(mMax(startcorner.x, endcorner.x) == startcorner.x ? endcorner.x : startcorner.x,
  30. mMax(startcorner.y, endcorner.y) == startcorner.y ? endcorner.y : startcorner.y,
  31. mMax(startcorner.z, endcorner.z) == startcorner.z ? endcorner.z : startcorner.z);
  32. Point3F maxCorner = Point3F(mMax(startcorner.x, endcorner.x),
  33. mMax(startcorner.y, endcorner.y),
  34. mMax(startcorner.z, endcorner.z));
  35. queryBox.minExtents = minCorner;
  36. queryBox.maxExtents = maxCorner;
  37.  
  38. SimpleQueryList queryList;
  39. gServerContainer.findObjects(queryBox, TypeMask, SimpleQueryList::insertionCallback, &queryList);
  40. Vector<PlaneF> planes;
  41. Polyhedron ConePoly;
  42. ConePoly.pointList.setSize(9);
  43. ConePoly.pointList[0] = Start;
  44. ConePoly.planeList.setSize(8);
  45. U8 resolution = 8;
  46. for(int ix = 0; ix < resolution; ix++)
  47. {
  48. Point3F p1,p2;
  49. F32 cAngle1 = cos((360/resolution*ix)*M_PI/180);
  50. F32 sAngle1 = sin((360/resolution*ix)*M_PI/180);
  51. F32 cAngle2 = cos((360/resolution*ix+1)*M_PI/180);
  52. F32 sAngle2 = sin((360/resolution*ix+1)*M_PI/180);
  53. p1 = End+((perp1 * cAngle1) + (perp2 * sAngle1));
  54. p2 = End+((perp1 * cAngle2) + (perp2 * sAngle2));
  55. ConePoly.pointList[ix+1] = p1;
  56. PlaneF plane(Start, p1, p2);
  57. ConePoly.planeList[ix] = plane;
  58. planes.push_back(plane);
  59. /* Debug drawing of the cone
  60. * DebugDrawer::get()->drawTri(Start, p1, p2, ColorI(gRandGen.randI() % 256, gRandGen.randI() % 256, gRandGen.randI() % 256));
  61. * DebugDrawer::get()->setLastTTL(5000);
  62. */
  63. }
  64. Point3F p1,p2,p3;
  65. F32 cAngle1 = cos((360/resolution*1)*M_PI/180);
  66. F32 sAngle1 = sin((360/resolution*1)*M_PI/180);
  67. F32 cAngle2 = cos((360/resolution*2)*M_PI/180);
  68. F32 sAngle2 = sin((360/resolution*2)*M_PI/180);
  69. F32 cAngle3 = cos((360/resolution*3)*M_PI/180);
  70. F32 sAngle3 = sin((360/resolution*4)*M_PI/180);
  71. p1 = End+((perp1 * cAngle1) + (perp2 * sAngle1));
  72. p2 = End+((perp1 * cAngle2) + (perp2 * sAngle2));
  73. p3 = End+((perp1 * cAngle3) + (perp2 * sAngle3));
  74. PlaneF frontPlane(p1,p2,p3);
  75. planes.push_back(frontPlane);
  76. PlaneSetF planeSet(planes.address(),9);
  77. ConePoly.buildFromPlanes(planeSet);
  78.  
  79. gServerContainer.polyhedronFindObjects(ConePoly, TypeMask, SimpleQueryList::insertionCallback, &queryList);
  80.  
  81. for (U32 i = 0; i < queryList.mList.size(); i++)
  82. {
  83. mSearchList.push_back(new SimObjectPtr<SceneObject>);
  84. *(mSearchList.last()) = queryList.mList[i];
  85. }
  86. if (mSearchList.size() != 0)
  87. {
  88. sgSortReferencePoint = mSearchReferencePoint;
  89. dQsort(mSearchList.address(), mSearchList.size(),
  90. sizeof(SimObjectPtr<SceneObject>*), cmpSearchPointers);
  91. }
  92. }
  93.  
  94. void SceneContainer::initBoxSearch(
  95. const Point3F Start,
  96. const Point3F End,
  97. const U32 TypeMask)
  98. {
  99. cleanupSearchVectors();
  100.  
  101. Point3F center = ( End - Start ) / 2;
  102. mSearchReferencePoint = center;
  103.  
  104. Box3F queryBox;
  105. Point3F startcorner = Point3F((Start - center).x, (Start - center).y, (Start - center).z);
  106. Point3F endcorner = Point3F((End - center).x, (End - center).y, (End - center).z);
  107. Point3F minCorner = Point3F(mMax(startcorner.x, endcorner.x) == startcorner.x ? endcorner.x : startcorner.x,
  108. mMax(startcorner.y, endcorner.y) == startcorner.y ? endcorner.y : startcorner.y,
  109. mMax(startcorner.z, endcorner.z) == startcorner.z ? endcorner.z : startcorner.z);
  110. Point3F maxCorner = Point3F(mMax(startcorner.x, endcorner.x),
  111. mMax(startcorner.y, endcorner.y),
  112. mMax(startcorner.z, endcorner.z));
  113. queryBox.minExtents = minCorner;
  114. queryBox.maxExtents = maxCorner;
  115.  
  116. SimpleQueryList queryList;
  117. gServerContainer.findObjects(queryBox, TypeMask, SimpleQueryList::insertionCallback, &queryList);
  118.  
  119. for (U32 i = 0; i < queryList.mList.size(); i++)
  120. {
  121. mSearchList.push_back(new SimObjectPtr<SceneObject>);
  122. *(mSearchList.last()) = queryList.mList[i];
  123. }
  124. if (mSearchList.size() != 0)
  125. {
  126. sgSortReferencePoint = mSearchReferencePoint;
  127. dQsort(mSearchList.address(), mSearchList.size(),
  128. sizeof(SimObjectPtr<SceneObject>*), cmpSearchPointers);
  129. }
  130. }
  131.  
  132. void SceneContainer::initCubeSearch(
  133. const Point3F Center,
  134. const F32 Size,
  135. const U32 TypeMask)
  136. {
  137. cleanupSearchVectors();
  138.  
  139. mSearchReferencePoint = Center;
  140.  
  141. Box3F queryBox;
  142. queryBox.minExtents -= Point3F(Size);
  143. queryBox.maxExtents += Point3F(Size);
  144.  
  145. SimpleQueryList queryList;
  146. gServerContainer.findObjects(queryBox, TypeMask, SimpleQueryList::insertionCallback, &queryList);
  147.  
  148. for (U32 i = 0; i < queryList.mList.size(); i++)
  149. {
  150. mSearchList.push_back(new SimObjectPtr<SceneObject>);
  151. *(mSearchList.last()) = queryList.mList[i];
  152. }
  153. if (mSearchList.size() != 0)
  154. {
  155. sgSortReferencePoint = mSearchReferencePoint;
  156. dQsort(mSearchList.address(), mSearchList.size(),
  157. sizeof(SimObjectPtr<SceneObject>*), cmpSearchPointers);
  158. }
  159. }
  160. // ------ IPS SpellSystem
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement