offMeshConnTool.cpp 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200
  1. #include "offMeshConnTool.h"
  2. #include "navigation/guiNavEditorCtrl.h"
  3. #include "console/consoleTypes.h"
  4. #include "gfx/gfxDrawUtil.h"
  5. #include "scene/sceneManager.h"
  6. #include "math/mathUtils.h"
  7. IMPLEMENT_CONOBJECT(OffMeshConnectionTool);
  8. void OffMeshConnectionTool::onActivated(const Gui3DMouseEvent& evt)
  9. {
  10. Con::executef(this, "onActivated");
  11. }
  12. void OffMeshConnectionTool::onDeactivated()
  13. {
  14. Con::executef(this, "onDeactivated");
  15. }
  16. void OffMeshConnectionTool::on3DMouseDown(const Gui3DMouseEvent& evt)
  17. {
  18. if (mNavMesh.isNull())
  19. return;
  20. Point3F startPnt = evt.pos;
  21. Point3F endPnt = evt.pos + evt.vec * 1000.0f;
  22. RayInfo ri;
  23. bool shift = evt.modifier & SI_LSHIFT;
  24. bool ctrl = evt.modifier & SI_LCTRL;
  25. if (gServerContainer.castRay(startPnt, endPnt, StaticObjectType, &ri))
  26. {
  27. U32 link = mNavMesh->getLink(ri.point);
  28. if (link != -1)
  29. {
  30. if (mLink != -1)
  31. mNavMesh->selectLink(mLink, false);
  32. mNavMesh->selectLink(link, true, false);
  33. mLink = link;
  34. if (ctrl)
  35. {
  36. mNavMesh->selectLink(mLink, false);
  37. mNavMesh->deleteLink(mLink);
  38. mLink = -1;
  39. Con::executef(this, "onLinkDeselected");
  40. return;
  41. }
  42. else
  43. {
  44. LinkData d = mNavMesh->getLinkFlags(mLink);
  45. bool biDir = mNavMesh->getLinkDir(mLink);
  46. F32 linkRad = mNavMesh->getLinkRadius(mLink);
  47. Con::executef(this, "onLinkSelected", Con::getIntArg(d.getFlags()), Con::getBoolArg(biDir), Con::getFloatArg(linkRad));
  48. }
  49. }
  50. else
  51. {
  52. if (mLink != -1)
  53. {
  54. mNavMesh->selectLink(mLink, false);
  55. mLink = -1;
  56. Con::executef(this, "onLinkDeselected");
  57. }
  58. if (mLinkStart != Point3F::Max)
  59. {
  60. mLink = mNavMesh->addLink(mLinkStart, ri.point, mBiDir, mLinkRadius);
  61. mNavMesh->selectLink(mLink, true, false);
  62. if (shift)
  63. mLinkStart = ri.point;
  64. else
  65. mLinkStart = Point3F::Max;
  66. Con::executef(this, "onLinkSelected", Con::getIntArg(mLinkCache.getFlags()), Con::getBoolArg(mBiDir), Con::getFloatArg(mLinkRadius));
  67. }
  68. else
  69. {
  70. mLinkStart = ri.point;
  71. }
  72. }
  73. }
  74. else
  75. {
  76. if (mLink != -1)
  77. {
  78. mNavMesh->selectLink(mLink, false);
  79. mLink = -1;
  80. Con::executef(this, "onLinkDeselected");
  81. }
  82. }
  83. }
  84. void OffMeshConnectionTool::on3DMouseMove(const Gui3DMouseEvent& evt)
  85. {
  86. if (mNavMesh.isNull())
  87. return;
  88. Point3F startPnt = evt.pos;
  89. Point3F endPnt = evt.pos + evt.vec * 1000.0f;
  90. RayInfo ri;
  91. if (gServerContainer.castRay(startPnt, endPnt, StaticObjectType, &ri))
  92. {
  93. U32 link = mNavMesh->getLink(ri.point);
  94. if (link != -1)
  95. {
  96. if (link != mLink)
  97. {
  98. if (mCurLink != -1)
  99. mNavMesh->selectLink(mCurLink, false);
  100. mNavMesh->selectLink(link, true, true);
  101. }
  102. mCurLink = link;
  103. }
  104. else
  105. {
  106. if (mCurLink != mLink)
  107. mNavMesh->selectLink(mCurLink, false);
  108. mCurLink = -1;
  109. }
  110. }
  111. else
  112. {
  113. mNavMesh->selectLink(mCurLink, false);
  114. mCurLink = -1;
  115. }
  116. }
  117. void OffMeshConnectionTool::onRender3D()
  118. {
  119. if (mNavMesh.isNull())
  120. return;
  121. duDebugDrawTorque dd;
  122. if (mLinkStart != Point3F::Max)
  123. {
  124. Point3F rcFrom = DTStoRC(mLinkStart);
  125. dd.begin(DU_DRAW_LINES);
  126. dd.depthMask(false);
  127. duAppendCircle(&dd, rcFrom.x, rcFrom.y, rcFrom.z, mLinkRadius, duRGBA(0, 255, 0, 255));
  128. dd.end();
  129. }
  130. //mNavMesh->renderLinks(dd);
  131. dd.immediateRender();
  132. }
  133. bool OffMeshConnectionTool::updateGuiInfo()
  134. {
  135. SimObject* statusbar;
  136. Sim::findObject("EditorGuiStatusBar", statusbar);
  137. GuiTextCtrl* selectionBar;
  138. Sim::findObject("EWorldEditorStatusBarSelection", selectionBar);
  139. String text;
  140. text = "LMB To Select Link. CTRL+LMB To Delete Link";
  141. if (mLinkStart != Point3F::Max)
  142. text = "LinkStarted: LMB To place End Point. Hold Left Shift to start a new Link from the end point.";
  143. if (statusbar)
  144. Con::executef(statusbar, "setInfo", text.c_str());
  145. if (mLink != -1)
  146. text = String::ToString("Selected Link: %d", mLink);
  147. else
  148. text = "";
  149. if (selectionBar)
  150. selectionBar->setText(text);
  151. return true;
  152. }
  153. void OffMeshConnectionTool::setLinkProperties(const LinkData& d, bool biDir, F32 rad)
  154. {
  155. if (!mNavMesh.isNull() && mLink != -1)
  156. {
  157. mNavMesh->setLinkFlags(mLink, d);
  158. mNavMesh->setLinkDir(mLink, biDir);
  159. mNavMesh->setLinkRadius(mLink, rad);
  160. }
  161. mLinkCache = d;
  162. mBiDir = biDir;
  163. mLinkRadius = rad;
  164. }
  165. DefineEngineMethod(OffMeshConnectionTool, setLinkProperties, void, (U32 flags, bool biDir, F32 rad), ,
  166. "@Brief Set properties of the selected link.")
  167. {
  168. object->setLinkProperties(LinkData(flags), biDir, rad);
  169. }