diff --git a/src/naveditor/Editor.cpp b/src/naveditor/Editor.cpp index b6d80eea..abed04e6 100644 --- a/src/naveditor/Editor.cpp +++ b/src/naveditor/Editor.cpp @@ -251,6 +251,25 @@ void Editor::handleCommonSettings() ImGui::PopItemWidth(); + ImGui::Separator(); + ImGui::Text("Bounding"); + + float* navMeshBMin = m_geom->getNavMeshBoundsMin(); + float* navMeshBMax = m_geom->getNavMeshBoundsMax(); + + ImGui::PushItemWidth(230); + + ImGui::SliderFloat3("Mins##BuildSettings", navMeshBMin, -MAX_COORD_FLOAT, MAX_COORD_FLOAT); + ImGui::SliderFloat3("Maxs##BuildSettings", navMeshBMax, -MAX_COORD_FLOAT, MAX_COORD_FLOAT); + + ImGui::PopItemWidth(); + + if (ImGui::Button("Reset##BuildSettings", ImVec2(120, 0))) + { + dtVcopy(navMeshBMin, m_geom->getOriginalNavMeshBoundsMin()); + dtVcopy(navMeshBMax, m_geom->getOriginalNavMeshBoundsMax()); + } + ImGui::Separator(); ImGui::Text("Partitioning"); diff --git a/src/naveditor/Editor_Common.cpp b/src/naveditor/Editor_Common.cpp index 58ecd0ba..c3b74149 100644 --- a/src/naveditor/Editor_Common.cpp +++ b/src/naveditor/Editor_Common.cpp @@ -61,9 +61,15 @@ static void EditorCommon_DrawInputGeometry(duDebugDraw* const dd, const InputGeo static void EditorCommon_DrawBoundingBox(duDebugDraw* const dd, const InputGeom* const geom) { // Draw bounds - const float* const bmin = geom->getNavMeshBoundsMin(); - const float* const bmax = geom->getNavMeshBoundsMax(); - duDebugDrawBoxWire(dd, bmin[0], bmin[1], bmin[2], bmax[0], bmax[1], bmax[2], duRGBA(255, 255, 255, 128), 1.0f, nullptr); + const float* const origBmin = geom->getOriginalNavMeshBoundsMin(); + const float* const origBmax = geom->getOriginalNavMeshBoundsMax(); + duDebugDrawBoxWire(dd, origBmin[0], origBmin[1], origBmin[2], origBmax[0], origBmax[1], origBmax[2], duRGBA(255, 255, 255, 170), 1.0f, nullptr); + + const float* const navBmin = geom->getNavMeshBoundsMin(); + const float* const navBmax = geom->getNavMeshBoundsMax(); + + if (!rcVequal(origBmin, navBmin) || !rcVequal(origBmax, navBmax)) + duDebugDrawBoxWire(dd, navBmin[0], navBmin[1], navBmin[2], navBmax[0], navBmax[1], navBmax[2], duRGBA(0, 255, 0, 215), 1.0f, nullptr); } static void EditorCommon_DrawTilingGrid(duDebugDraw* const dd, const InputGeom* const geom, const int tileSize, const float cellSize) @@ -130,7 +136,7 @@ Editor_StaticTileMeshCommon::Editor_StaticTileMeshCommon() , m_pmesh(nullptr) , m_dmesh(nullptr) , m_tileMeshDrawFlags(TM_DRAWFLAGS_INPUT_MESH|TM_DRAWFLAGS_NAVMESH) - , m_tileCol(duRGBA(0, 0, 0, 32)) + , m_tileCol(duRGBA(0, 0, 0, 64)) , m_totalBuildTimeMs(0.0f) , m_drawActiveTile(false) , m_keepInterResults(false) diff --git a/src/naveditor/Editor_TileMesh.cpp b/src/naveditor/Editor_TileMesh.cpp index 11022b65..0c5697e4 100644 --- a/src/naveditor/Editor_TileMesh.cpp +++ b/src/naveditor/Editor_TileMesh.cpp @@ -498,7 +498,7 @@ void Editor_TileMesh::removeTile(const float* pos) getTilePos(pos, tx, ty); getTileExtents(tx, ty, m_lastBuiltTileBmin, m_lastBuiltTileBmax); - m_tileCol = duRGBA(128,32,16,64); + m_tileCol = duRGBA(255,0,0,180); m_navMesh->removeTile(m_navMesh->getTileRefAt(tx,ty,0),0,0); } @@ -545,7 +545,7 @@ void Editor_TileMesh::buildAllTiles() m_ctx->stopTimer(RC_TIMER_TEMP); m_totalBuildTimeMs = m_ctx->getAccumulatedTime(RC_TIMER_TEMP)/1000.0f; - + m_tileCol = duRGBA(0,0,0,64); } void Editor_TileMesh::removeAllTiles() diff --git a/src/naveditor/InputGeom.cpp b/src/naveditor/InputGeom.cpp index d3b297a6..944fed1f 100644 --- a/src/naveditor/InputGeom.cpp +++ b/src/naveditor/InputGeom.cpp @@ -111,6 +111,10 @@ InputGeom::InputGeom() : m_offMeshConCount(0), m_volumeCount(0) { + rcVset(m_meshBMin, 0.0f, 0.0f, 0.0f); + rcVset(m_meshBMax, 0.0f, 0.0f, 0.0f); + rcVset(m_navMeshBMin, 0.0f, 0.0f, 0.0f); + rcVset(m_navMeshBMax, 0.0f, 0.0f, 0.0f); } InputGeom::~InputGeom() @@ -144,6 +148,8 @@ bool InputGeom::loadMesh(rcContext* ctx, const std::string& filepath) } rcCalcBounds(m_mesh->getVerts(), m_mesh->getVertCount(), m_meshBMin, m_meshBMax); + rcVcopy(m_navMeshBMin, m_meshBMin); + rcVcopy(m_navMeshBMax, m_meshBMax); m_chunkyMesh = new rcChunkyTriMesh; if (!m_chunkyMesh) @@ -184,6 +190,8 @@ bool InputGeom::loadPlyMesh(rcContext* ctx, const std::string& filepath) } rcCalcBounds(m_mesh->getVerts(), m_mesh->getVertCount(), m_meshBMin, m_meshBMax); + rcVcopy(m_navMeshBMin, m_meshBMin); + rcVcopy(m_navMeshBMax, m_meshBMax); m_chunkyMesh = new rcChunkyTriMesh; if (!m_chunkyMesh) @@ -334,6 +342,11 @@ bool InputGeom::loadGeomSet(rcContext* ctx, const std::string& filepath) &m_buildSettings.navMeshBMax[1], &m_buildSettings.navMeshBMax[2], &m_buildSettings.tileSize); + + // Copy the original values over so we can reset to them in the + // editor after changes have been made. + rcVcopy(m_buildSettings.origNavMeshBMin, m_buildSettings.navMeshBMin); + rcVcopy(m_buildSettings.origNavMeshBMax, m_buildSettings.navMeshBMax); } } diff --git a/src/naveditor/include/Editor.h b/src/naveditor/include/Editor.h index 31900bb9..c2821900 100644 --- a/src/naveditor/include/Editor.h +++ b/src/naveditor/include/Editor.h @@ -136,6 +136,9 @@ protected: float m_detailSampleMaxError; int m_partitionType; + float m_navMeshBMin[3]; + float m_navMeshBMax[3]; + NavMeshType_e m_selectedNavMeshType; NavMeshType_e m_loadedNavMeshType; const char* m_navmeshName; diff --git a/src/naveditor/include/InputGeom.h b/src/naveditor/include/InputGeom.h index c542df0b..da2f4f19 100644 --- a/src/naveditor/include/InputGeom.h +++ b/src/naveditor/include/InputGeom.h @@ -65,6 +65,9 @@ struct BuildSettings // Bounds of the area to mesh float navMeshBMin[3]; float navMeshBMax[3]; + // Original bounds of the area to mesh. + float origNavMeshBMin[3]; + float origNavMeshBMax[3]; // Size of the tiles in voxels int tileSize; }; @@ -74,6 +77,7 @@ class InputGeom rcChunkyTriMesh* m_chunkyMesh; IMeshLoader* m_mesh; float m_meshBMin[3], m_meshBMax[3]; + float m_navMeshBMin[3], m_navMeshBMax[3]; BuildSettings m_buildSettings; bool m_hasBuildSettings; @@ -113,8 +117,16 @@ public: const IMeshLoader* getMesh() const { return m_mesh; } const float* getMeshBoundsMin() const { return m_meshBMin; } const float* getMeshBoundsMax() const { return m_meshBMax; } - const float* getNavMeshBoundsMin() const { return m_hasBuildSettings ? m_buildSettings.navMeshBMin : m_meshBMin; } - const float* getNavMeshBoundsMax() const { return m_hasBuildSettings ? m_buildSettings.navMeshBMax : m_meshBMax; } + + float* getNavMeshBoundsMin() { return m_hasBuildSettings ? m_buildSettings.navMeshBMin : m_navMeshBMin; } + float* getNavMeshBoundsMax() { return m_hasBuildSettings ? m_buildSettings.navMeshBMax : m_navMeshBMax; } + + const float* getNavMeshBoundsMin() const { return m_hasBuildSettings ? m_buildSettings.navMeshBMin : m_navMeshBMin; } + const float* getNavMeshBoundsMax() const { return m_hasBuildSettings ? m_buildSettings.navMeshBMax : m_navMeshBMax; } + + const float* getOriginalNavMeshBoundsMin() const { return m_hasBuildSettings ? m_buildSettings.origNavMeshBMin : m_meshBMin; } + const float* getOriginalNavMeshBoundsMax() const { return m_hasBuildSettings ? m_buildSettings.origNavMeshBMax : m_meshBMax; } + const rcChunkyTriMesh* getChunkyMesh() const { return m_chunkyMesh; } const BuildSettings* getBuildSettings() const { return m_hasBuildSettings ? &m_buildSettings : 0; } bool raycastMesh(float* src, float* dst, float& tmin);