From ccb532f4f7884bbef7449bd28e4c31c9787c2966 Mon Sep 17 00:00:00 2001 From: austin Date: Thu, 24 Apr 2025 19:03:43 -0400 Subject: [PATCH] navmesh bugfix --- docs/src/progress/renderertodo.md | 4 ++ .../ui/menu/debug/ImGuiGriddedManager.java | 8 +++ .../gridded/GriddedDataCellManager.java | 64 +++++++++++++------ .../pathfinding/NavMeshConstructor.java | 18 +++--- 4 files changed, 64 insertions(+), 30 deletions(-) diff --git a/docs/src/progress/renderertodo.md b/docs/src/progress/renderertodo.md index 68598495..9f4b9610 100644 --- a/docs/src/progress/renderertodo.md +++ b/docs/src/progress/renderertodo.md @@ -1517,6 +1517,10 @@ GriddedDataCellManager pathfinding solution ServerTerrainManager nullcheck fix Fix nav mesh construction params +(04/24/2025) +GriddedDataCellManager debugging tools +NavMesh bugfix + diff --git a/src/main/java/electrosphere/client/ui/menu/debug/ImGuiGriddedManager.java b/src/main/java/electrosphere/client/ui/menu/debug/ImGuiGriddedManager.java index 03a73db4..3d9bd2b5 100644 --- a/src/main/java/electrosphere/client/ui/menu/debug/ImGuiGriddedManager.java +++ b/src/main/java/electrosphere/client/ui/menu/debug/ImGuiGriddedManager.java @@ -1,6 +1,8 @@ package electrosphere.client.ui.menu.debug; import electrosphere.engine.Globals; +import electrosphere.entity.Entity; +import electrosphere.entity.EntityUtils; import electrosphere.renderer.ui.imgui.ImGuiWindow; import electrosphere.renderer.ui.imgui.ImGuiWindow.ImGuiWindowCallback; import electrosphere.server.datacell.Realm; @@ -46,6 +48,12 @@ public class ImGuiGriddedManager { ImGui.text("Playerless tracking map size: " + manager.getCellPlayerlessFrameMap().keySet().size()); } ImGui.text("Cells cleaned last frame: " + manager.getNumCleaned()); + if(ImGui.button("Player Data Cell Info")){ + Entity playerEntity = Globals.playerManager.getFirstPlayer().getPlayerEntity(); + Realm realm = Globals.realmManager.getEntityRealm(playerEntity); + GriddedDataCellManager griddedDataCellManager = (GriddedDataCellManager)realm.getDataCellManager(); + griddedDataCellManager.printCellInfo(griddedDataCellManager.getDataCellAtPoint(EntityUtils.getPosition(playerEntity))); + } } } diff --git a/src/main/java/electrosphere/server/datacell/gridded/GriddedDataCellManager.java b/src/main/java/electrosphere/server/datacell/gridded/GriddedDataCellManager.java index a7fe88f5..a844aed5 100644 --- a/src/main/java/electrosphere/server/datacell/gridded/GriddedDataCellManager.java +++ b/src/main/java/electrosphere/server/datacell/gridded/GriddedDataCellManager.java @@ -763,29 +763,35 @@ public class GriddedDataCellManager implements DataCellManager, VoxelCellManager GriddedDataCellTrackingData trackingData = cellTrackingMap.get(dataCell); generationService.submit(() -> { - BlockChunkData blockChunkData = realm.getServerWorldData().getServerBlockManager().getChunk(worldPos.x, worldPos.y, worldPos.z); - ServerTerrainChunk terrainChunk = realm.getServerWorldData().getServerTerrainManager().getChunk(worldPos.x, worldPos.y, worldPos.z); - targetCell.setTerrainChunk(terrainChunk); - targetCell.setBlockChunk(blockChunkData); + try { + BlockChunkData blockChunkData = realm.getServerWorldData().getServerBlockManager().getChunk(worldPos.x, worldPos.y, worldPos.z); + ServerTerrainChunk terrainChunk = realm.getServerWorldData().getServerTerrainManager().getChunk(worldPos.x, worldPos.y, worldPos.z); + targetCell.setTerrainChunk(terrainChunk); + targetCell.setBlockChunk(blockChunkData); - TerrainChunkData terrainMeshData; - //create physics entities - if(cell != null){ - cell.retireCell(); - cell.generatePhysics(); - terrainMeshData = cell.getTerrainChunkData(); - } else { - targetCell.generatePhysics(); - terrainMeshData = targetCell.getTerrainChunkData(); + TerrainChunkData terrainMeshData; + //create physics entities + if(cell != null){ + cell.retireCell(); + cell.generatePhysics(); + terrainMeshData = cell.getTerrainChunkData(); + } else { + targetCell.generatePhysics(); + terrainMeshData = targetCell.getTerrainChunkData(); + } + + //create pathfinding mesh + if(terrainMeshData.getVertices().length > 0){ + trackingData.setNavMeshData(NavMeshConstructor.constructNavmesh(terrainMeshData)); + } + + //set ready + dataCell.setReady(true); + } catch(Exception ex){ + LoggerInterface.loggerEngine.ERROR(ex); + } catch (Error ex){ + LoggerInterface.loggerEngine.ERROR(ex); } - - //create pathfinding mesh - if(terrainMeshData.getVertices().length > 0){ - trackingData.setNavMeshData(NavMeshConstructor.constructNavmesh(terrainMeshData)); - } - - //set ready - dataCell.setReady(true); }); } @@ -1078,4 +1084,20 @@ public class GriddedDataCellManager implements DataCellManager, VoxelCellManager throw new UnsupportedOperationException("Unimplemented method 'findPath'"); } + /** + * Prints information about the provided server data cell + * @param serverDataCell The cell + */ + public void printCellInfo(ServerDataCell serverDataCell){ + LoggerInterface.loggerEngine.WARNING("Number of players: " + serverDataCell.getPlayers().size()); + GriddedDataCellTrackingData trackingData = this.cellTrackingMap.get(serverDataCell); + if(trackingData == null){ + LoggerInterface.loggerEngine.WARNING("No tracking data for this cell in the gridded data cell manager"); + } else { + LoggerInterface.loggerEngine.WARNING("Closest player distance: " + trackingData.getClosestPlayer()); + } + LoggerInterface.loggerEngine.WARNING("Should simulate: " + this.shouldSimulate(serverDataCell)); + LoggerInterface.loggerEngine.WARNING("Cell is ready: " + serverDataCell.isReady()); + } + } diff --git a/src/main/java/electrosphere/server/pathfinding/NavMeshConstructor.java b/src/main/java/electrosphere/server/pathfinding/NavMeshConstructor.java index 6e3a61ad..649a6174 100644 --- a/src/main/java/electrosphere/server/pathfinding/NavMeshConstructor.java +++ b/src/main/java/electrosphere/server/pathfinding/NavMeshConstructor.java @@ -105,10 +105,6 @@ public class NavMeshConstructor { polyMesh.flags[i] = 1; } - PolyMeshDetail polyMeshDetail = recastBuilderResult.getMeshDetail(); - if(polyMeshDetail == null){ - throw new Error("Poly mesh detail is null"); - } //set params NavMeshDataCreateParams params = new NavMeshDataCreateParams(); @@ -119,11 +115,6 @@ public class NavMeshConstructor { params.polyFlags = polyMesh.flags; params.polyCount = polyMesh.npolys; params.nvp = polyMesh.nvp; - params.detailMeshes = polyMeshDetail.meshes; - params.detailVerts = polyMeshDetail.verts; - params.detailVertsCount = polyMeshDetail.nverts; - params.detailTris = polyMeshDetail.tris; - params.detailTriCount = polyMeshDetail.ntris; params.walkableHeight = RECAST_AGENT_HEIGHT; params.walkableRadius = RECAST_AGENT_SIZE; params.walkableClimb = RECAST_AGENT_MAX_CLIMB; @@ -133,6 +124,15 @@ public class NavMeshConstructor { params.ch = RECAST_CELL_HEIGHT; params.buildBvTree = true; + PolyMeshDetail polyMeshDetail = recastBuilderResult.getMeshDetail(); + if(polyMeshDetail != null){ + params.detailMeshes = polyMeshDetail.meshes; + params.detailVerts = polyMeshDetail.verts; + params.detailVertsCount = polyMeshDetail.nverts; + params.detailTris = polyMeshDetail.tris; + params.detailTriCount = polyMeshDetail.ntris; + } + // params.offMeshConVerts = new float[6]; // params.offMeshConVerts[0] = 0.1f; // params.offMeshConVerts[1] = 0.2f;