Torque3D/Engine/source/navigation/navMeshTools/tileTool.cpp
marauder2k7 2df2cb5c15 off mesh connection tool
Adds off mesh connection tool
upgrade functionality to allow setting the direction to be bi-directional
added immediate draw to duDebugDrawtorque so we can draw offmesh connections
2025-07-24 23:43:35 +01:00

116 lines
2.5 KiB
C++

#include "tileTool.h"
#include "navigation/guiNavEditorCtrl.h"
#include "console/consoleTypes.h"
#include "gfx/gfxDrawUtil.h"
#include "scene/sceneManager.h"
#include "math/mathUtils.h"
IMPLEMENT_CONOBJECT(TileTool);
static void renderBoxOutline(const Box3F& box, const ColorI& col)
{
if (box != Box3F::Invalid)
{
GFXStateBlockDesc desc;
desc.setCullMode(GFXCullNone);
desc.setFillModeSolid();
desc.setZReadWrite(true, false);
desc.setBlend(true);
GFX->getDrawUtil()->drawCube(desc, box, ColorI(col, 20));
desc.setFillModeWireframe();
desc.setBlend(false);
GFX->getDrawUtil()->drawCube(desc, box, ColorI(col, 255));
}
}
void TileTool::onActivated(const Gui3DMouseEvent& lastEvent)
{
Con::executef(this, "onActivated");
}
void TileTool::onDeactivated()
{
Con::executef(this, "onDeactivated");
}
void TileTool::on3DMouseDown(const Gui3DMouseEvent& evt)
{
if (mNavMesh.isNull())
return;
Point3F start = evt.pos;
Point3F end = evt.pos + evt.vec * 1000.0f;
RayInfo ri;
if (gServerContainer.castRay(start, end, StaticObjectType, &ri))
{
mSelTile = mNavMesh->getTile(ri.point);
}
}
void TileTool::on3DMouseMove(const Gui3DMouseEvent& evt)
{
if (mNavMesh.isNull())
return;
Point3F startPnt = evt.pos;
Point3F endPnt = evt.pos + evt.vec * 1000.0f;
RayInfo ri;
if (gServerContainer.castRay(startPnt, endPnt, StaticObjectType, &ri))
mCurTile = mNavMesh->getTile(ri.point);
else
mCurTile = -1;
}
void TileTool::onRender3D()
{
if (mNavMesh.isNull())
return;
if(mCurTile != -1)
renderBoxOutline(mNavMesh->getTileBox(mCurTile), ColorI::BLUE);
if(mSelTile != -1)
renderBoxOutline(mNavMesh->getTileBox(mSelTile), ColorI::GREEN);
}
void TileTool::buildTile()
{
if (!mNavMesh.isNull() && mSelTile != -1)
mNavMesh->buildTile(mSelTile);
}
bool TileTool::updateGuiInfo()
{
SimObject* statusbar;
Sim::findObject("EditorGuiStatusBar", statusbar);
GuiTextCtrl* selectionBar;
Sim::findObject("EWorldEditorStatusBarSelection", selectionBar);
String text;
text = "LMB To select NavMesh Tile";
if (statusbar)
Con::executef(statusbar, "setInfo", text.c_str());
if (mSelTile != -1)
text = String::ToString("Selected Tile: %d", mSelTile);
else
text = "";
if (selectionBar)
selectionBar->setText(text);
return true;
}
DefineEngineMethod(TileTool, buildTile, void, (), ,
"@brief Build the currently selected tile.")
{
return object->buildTile();
}