add cover tool

add cover tool
some more cleanup
navmeshselecttool needs to use collideBox
duDebugDrawTorque now has the transparent blending option
This commit is contained in:
marauder2k7 2025-07-28 08:24:20 +01:00
parent 24ec55e8bc
commit b5d6601b96
11 changed files with 142 additions and 88 deletions

View file

@ -73,6 +73,11 @@ void duDebugDrawTorque::depthMask(bool state, bool isOverride)
mOverrideState = isOverride;
}
void duDebugDrawTorque::blend(bool blend)
{
mDesc.setBlend(true);
}
void duDebugDrawTorque::texture(bool state)
{
// need a checker texture?...... if(state is true) then set first slot to that texture.

View file

@ -68,6 +68,8 @@ public:
/// <param name="isOverride">Set to true to override any future changes.</param>
void depthMask(bool state, bool isOverride);
void blend(bool blend);
/// Begin drawing primitives.
/// @param prim [in] primitive type to draw, one of rcDebugDrawPrimitives.
/// @param size [in] size of a primitive, applies to point size and line width only.

View file

@ -178,9 +178,6 @@ bool GuiNavEditorCtrl::get3DCentre(Point3F &pos)
void GuiNavEditorCtrl::on3DMouseDown(const Gui3DMouseEvent & event)
{
if (!mMesh)
return;
mGizmo->on3DMouseDown(event);
if (mTool)
@ -193,9 +190,6 @@ void GuiNavEditorCtrl::on3DMouseDown(const Gui3DMouseEvent & event)
void GuiNavEditorCtrl::on3DMouseUp(const Gui3DMouseEvent & event)
{
if (!mMesh)
return;
// Keep the Gizmo up to date.
mGizmo->on3DMouseUp(event);
@ -207,9 +201,6 @@ void GuiNavEditorCtrl::on3DMouseUp(const Gui3DMouseEvent & event)
void GuiNavEditorCtrl::on3DMouseMove(const Gui3DMouseEvent & event)
{
if (!mMesh)
return;
if (mTool)
mTool->on3DMouseMove(event);

View file

@ -1582,7 +1582,12 @@ void NavMesh::renderToDrawer()
m_drawMode == DRAWMODE_NAVMESH_INVIS))
{
if (m_drawMode != DRAWMODE_NAVMESH_INVIS)
{
if (m_drawMode == DRAWMODE_NAVMESH_TRANS)
mDbgDraw.blend(true);
duDebugDrawNavMeshWithClosedList(&mDbgDraw, *n->nm, *n->mQuery, 0);
mDbgDraw.blend(false);
}
if(m_drawMode == DRAWMODE_NAVMESH_BVTREE)
duDebugDrawNavMeshBVTree(&mDbgDraw, *n->nm);
if(m_drawMode == DRAWMODE_NAVMESH_PORTALS)

View file

@ -0,0 +1,40 @@
#include "coverTool.h"
IMPLEMENT_CONOBJECT(CoverTool);
CoverTool::CoverTool()
{
}
void CoverTool::onActivated(const Gui3DMouseEvent& evt)
{
Con::executef(this, "onActivated");
}
void CoverTool::onDeactivated()
{
Con::executef(this, "onDeactivated");
}
void CoverTool::on3DMouseDown(const Gui3DMouseEvent& evt)
{
if (mNavMesh.isNull())
return;
}
void CoverTool::on3DMouseMove(const Gui3DMouseEvent& evt)
{
if (mNavMesh.isNull())
return;
}
void CoverTool::onRender3D()
{
if (mNavMesh.isNull())
return;
}
bool CoverTool::updateGuiInfo()
{
return false;
}

View file

@ -0,0 +1,33 @@
#ifndef _COVERTOOL_H_
#define _COVERTOOL_H_
#ifndef _NAVMESH_TOOL_H_
#include "navigation/navMeshTool.h"
#endif
#ifndef _NAVPATH_H_
#include "navigation/navPath.h"
#endif
class CoverTool : public NavMeshTool
{
typedef NavMeshTool Parent;
public:
DECLARE_CONOBJECT(CoverTool);
CoverTool();
virtual ~CoverTool() {}
void onActivated(const Gui3DMouseEvent& evt) override;
void onDeactivated() override;
void on3DMouseDown(const Gui3DMouseEvent& evt) override;
void on3DMouseMove(const Gui3DMouseEvent& evt) override;
void onRender3D() override;
bool updateGuiInfo() override;
};
#endif // !_COVERTOOL_H_

View file

@ -44,7 +44,7 @@ void NavMeshSelectTool::on3DMouseDown(const Gui3DMouseEvent& evt)
Point3F endPnt = evt.pos + evt.vec * 1000.0f;
RayInfo ri;
if (gServerContainer.castRay(startPnt, endPnt, MarkerObjectType, &ri))
if (gServerContainer.collideBox(startPnt, endPnt, MarkerObjectType, &ri))
{
if (!ri.object)
return;
@ -53,6 +53,8 @@ void NavMeshSelectTool::on3DMouseDown(const Gui3DMouseEvent& evt)
if (selNavMesh)
{
mCurEditor->selectMesh(selNavMesh);
mSelMesh = selNavMesh;
Con::executef(this, "onNavMeshSelected");
return;
}
}
@ -68,7 +70,7 @@ void NavMeshSelectTool::on3DMouseMove(const Gui3DMouseEvent& evt)
Point3F endPnt = evt.pos + evt.vec * 1000.0f;
RayInfo ri;
if (gServerContainer.castRay(startPnt, endPnt, MarkerObjectType, &ri))
if (gServerContainer.collideBox(startPnt, endPnt, MarkerObjectType, &ri))
{
NavMesh* selNavMesh = dynamic_cast<NavMesh*>(ri.object);
if (selNavMesh)
@ -90,6 +92,8 @@ void NavMeshSelectTool::onRender3D()
{
if (!mCurMesh.isNull())
renderBoxOutline(mCurMesh->getWorldBox(), ColorI::LIGHT);
if (!mSelMesh.isNull())
renderBoxOutline(mSelMesh->getWorldBox(), ColorI::LIGHT);
}
bool NavMeshSelectTool::updateGuiInfo()

View file

@ -11,6 +11,7 @@ class NavMeshSelectTool : public NavMeshTool
typedef NavMeshTool Parent;
protected:
SimObjectPtr<NavMesh> mCurMesh;
SimObjectPtr<NavMesh> mSelMesh;
public:
DECLARE_CONOBJECT(NavMeshSelectTool);

View file

@ -73,11 +73,11 @@ function initializeNavEditor()
buttonImage = "ToolsModule:nav_link_n_image";
};
new NavMeshTestTool()
new CoverTool()
{
internalName = "TestTool";
toolTip = "PathFinding Test tool";
buttonImage = "ToolsModule:3rd_person_camera_n_image";
internalName = "NavCoverTool";
toolTip = "Cover Tool";
buttonImage = "ToolsModule:nav_cover_n_image";
};
new TileTool()
@ -86,6 +86,13 @@ function initializeNavEditor()
toolTip = "Tile selection tool";
buttonImage = "ToolsModule:select_bounds_n_image";
};
new NavMeshTestTool()
{
internalName = "TestTool";
toolTip = "PathFinding Test tool";
buttonImage = "ToolsModule:3rd_person_camera_n_image";
};
};
// Bind shortcuts for the nav editor.
@ -151,8 +158,8 @@ function EditorGui::SetNavPalletBar()
//Adds a button to the pallete stack
//Name Icon Click Command Tooltip text Keybind
EWToolsPaletteWindow.addButton("EditMode", "ToolsModule:visibility_toggle_n_image", "NavEditorGui.setActiveTool(NavMeshTools->SelectTool);", "", "Edit NavMesh", "1");
EWToolsPaletteWindow.addButton("LinkMode", "ToolsModule:nav_link_n_image", "NavEditorGui.setActiveTool(NavMeshTools->LinkTool);", "", "Create off-mesh links", "2");
// EWToolsPaletteWindow.addButton("CoverMode", "ToolsModule:nav_cover_n_image", "NavEditorGui.setMode(\"CoverMode\");", "","Edit cover", "3");
EWToolsPaletteWindow.addButton("LinkMode", "ToolsModule:nav_link_n_image", "NavEditorGui.setActiveTool(NavMeshTools->LinkTool);", "", "Create off-mesh links", "2");
EWToolsPaletteWindow.addButton("CoverMode","ToolsModule:nav_cover_n_image", "NavEditorGui.setActiveTool(NavMeshTools->NavCoverTool);", "", "Create Cover Points.", "3");
EWToolsPaletteWindow.addButton("TileMode", "ToolsModule:select_bounds_n_image", "NavEditorGui.setActiveTool(NavMeshTools->TileTool);" , "", "View and Edit Tiles", "4");
EWToolsPaletteWindow.addButton("TestMode", "ToolsModule:3rd_person_camera_n_image", "NavEditorGui.setActiveTool(NavMeshTools->TestTool);", "", "Test pathfinding", "5");
EWToolsPaletteWindow.refresh();

View file

@ -297,7 +297,7 @@ function NavEditorGui::showSidePanel()
}
//------------------------------------------------------
// NAVMESHTESTTOOL
// NAVMESHSELECTTOOL
//------------------------------------------------------
function NavMeshSelectTool::onActivated(%this)
@ -317,6 +317,18 @@ function NavMeshSelectTool::onDeactivated(%this)
%actions->SelectActions.setVisible(false);
}
function NavMeshSeletTool::onNavMeshSelected(%this)
{
%obj = NavEditorGui.getMesh();
// we set the naveditorgui navmesh in source so just get it
// and update here.
NavInspector.inspect(NavEditorGui.getMesh());
NavTreeView.clearSelection();
if(isObject(%obj))
NavTreeView.selectItem(%obj);
}
//------------------------------------------------------
// OffMeshConnectionTool
//------------------------------------------------------
@ -416,6 +428,22 @@ function NavMeshLinkBiDirection::onClick(%this)
NavMeshTools->LinkTool.updateLinkFlags();
}
//------------------------------------------------------
// CoverTool
//------------------------------------------------------
function CoverTool::onActivated(%this)
{
%actions = NavEditorOptionsWindow->ActionsBox;
%actions->CoverActions.setVisible(true);
}
function CoverTool::onDeactivated(%this)
{
%actions = NavEditorOptionsWindow->ActionsBox;
%actions->CoverActions.setVisible(false);
}
//------------------------------------------------------
// NAVMESHTESTTOOL
//------------------------------------------------------
@ -573,71 +601,11 @@ function TileTool::onDeactivated(%this)
%properties->TileProperties.setVisible(false);
}
//------------------------------------------------------
function NavEditorGui::onModeSet(%this, %mode)
{
// Callback when the nav editor changes mode. Set the appropriate dynamic
// GUI contents in the properties/actions boxes.
NavInspector.setVisible(false);
%actions = NavEditorOptionsWindow->ActionsBox;
%actions->SelectActions.setVisible(false);
%actions->LinkActions.setVisible(false);
%actions->CoverActions.setVisible(false);
%actions->TileActions.setVisible(false);
%actions->TestActions.setVisible(false);
%properties = NavEditorOptionsWindow->PropertiesBox;
%properties->LinkProperties.setVisible(false);
%properties->TileProperties.setVisible(false);
%properties->TestProperties.setVisible(false);
switch$(%mode)
{
case "SelectMode":
NavInspector.setVisible(true);
%actions->SelectActions.setVisible(true);
case "LinkMode":
%actions->LinkActions.setVisible(true);
%properties->LinkProperties.setVisible(true);
case "CoverMode":
//
%actions->CoverActions.setVisible(true);
case "TileMode":
%actions->TileActions.setVisible(true);
%properties->TileProperties.setVisible(true);
case "TestMode":
%actions->TestActions.setVisible(true);
%properties->TestProperties.setVisible(true);
}
}
function NavEditorGui::onEscapePressed(%this)
{
return false;
}
function NavEditorGui::selectObject(%this, %obj)
{
NavTreeView.clearSelection();
if(isObject(%obj))
NavTreeView.selectItem(%obj);
%this.onObjectSelected(%obj);
}
function NavEditorGui::onObjectSelected(%this, %obj)
{
if(isObject(%this.selectedObject))
%this.deselect();
%this.selectedObject = %obj;
if(isObject(%obj))
{
%this.selectMesh(%obj);
NavInspector.inspect(%obj);
}
}
function NavEditorGui::deleteMesh(%this)
{
if(isObject(%this.selectedObject))
@ -732,7 +700,6 @@ function NavTreeView::onInspect(%this, %obj)
function NavTreeView::onSelect(%this, %obj)
{
NavInspector.inspect(%obj);
NavEditorGui.onObjectSelected(%obj);
}
function NavEditorGui::prepSelectionMode(%this)

View file

@ -11,7 +11,6 @@ $paletteId = new GuiControl(NavEditorPalette,EditorGuiGroup) {
canSave = "1";
Visible = "1";
hovertime = "1000";
new GuiBitmapButtonCtrl(ENavEditorSelectModeBtn) {
canSaveDynamicFields = "1";
class = ENavEditorPaletteButton;
@ -26,9 +25,9 @@ $paletteId = new GuiControl(NavEditorPalette,EditorGuiGroup) {
MinExtent = "8 2";
canSave = "1";
Visible = "1";
Command = "NavEditorGui.prepSelectionMode();";
Command = "NavEditorGui.setActiveTool(NavMeshTools->SelectTool);";
tooltipprofile = "GuiToolTipProfile";
ToolTip = "View NavMesh (1).";
ToolTip = "Edit NavMesh (1).";
DetailedDesc = "";
hovertime = "1000";
bitmapAsset = "ToolsModule:visibility_toggle_n_image";
@ -49,10 +48,10 @@ $paletteId = new GuiControl(NavEditorPalette,EditorGuiGroup) {
MinExtent = "8 2";
canSave = "1";
Visible = "1";
Command = "NavEditorGui.setMode(\"LinkMode\");";
Command = "NavEditorGui.setActiveTool(NavMeshTools->LinkTool);";
tooltipprofile = "GuiToolTipProfile";
ToolTip = "Create off-mesh links (2).";
DetailedDesc = "Click to select/add. Shift-click to add multiple end points.";
ToolTip = "Edit Links (2).";
DetailedDesc = "";
hovertime = "1000";
bitmapAsset = "ToolsModule:nav_link_n_image";
buttonType = "RadioButton";
@ -72,7 +71,7 @@ $paletteId = new GuiControl(NavEditorPalette,EditorGuiGroup) {
MinExtent = "8 2";
canSave = "1";
Visible = "1";
Command = "NavEditorGui.setMode(\"CoverMode\");";
Command = "NavEditorGui.setActiveTool(NavMeshTools->NavCoverTool);";
tooltipprofile = "GuiToolTipProfile";
ToolTip = "Edit cover (3).";
DetailedDesc = "";
@ -95,7 +94,7 @@ $paletteId = new GuiControl(NavEditorPalette,EditorGuiGroup) {
MinExtent = "8 2";
canSave = "1";
Visible = "1";
Command = "NavEditorGui.setMode(\"TileMode\");";
Command = "NavEditorGui.setActiveTool(NavMeshTools->TileTool);";
tooltipprofile = "GuiToolTipProfile";
ToolTip = "View tiles (4).";
DetailedDesc = "Click to select.";
@ -118,7 +117,7 @@ $paletteId = new GuiControl(NavEditorPalette,EditorGuiGroup) {
MinExtent = "8 2";
canSave = "1";
Visible = "1";
Command = "NavEditorGui.setMode(\"TestMode\");";
Command = "NavEditorGui.setActiveTool(NavMeshTools->TestTool);";
tooltipprofile = "GuiToolTipProfile";
ToolTip = "Test pathfinding (5).";
DetailedDesc = "Click to select/move character, CTRL-click to spawn, SHIFT-click to deselect.";