diff --git a/docs/src/progress/renderertodo.md b/docs/src/progress/renderertodo.md index cbe2b6d4..68598495 100644 --- a/docs/src/progress/renderertodo.md +++ b/docs/src/progress/renderertodo.md @@ -1515,6 +1515,7 @@ Obliterate old navmesh/pathfinding code Integrate recast4j as pathfinding source GriddedDataCellManager pathfinding solution ServerTerrainManager nullcheck fix +Fix nav mesh construction params diff --git a/src/main/java/electrosphere/server/datacell/gridded/GriddedDataCellManager.java b/src/main/java/electrosphere/server/datacell/gridded/GriddedDataCellManager.java index 28674c2d..a7fe88f5 100644 --- a/src/main/java/electrosphere/server/datacell/gridded/GriddedDataCellManager.java +++ b/src/main/java/electrosphere/server/datacell/gridded/GriddedDataCellManager.java @@ -357,7 +357,9 @@ public class GriddedDataCellManager implements DataCellManager, VoxelCellManager TerrainChunkData terrainMeshData = cell.getTerrainChunkData(); ServerDataCell serverDataCell = this.groundDataCells.get(key); GriddedDataCellTrackingData trackingData = this.cellTrackingMap.get(serverDataCell); - trackingData.setNavMeshData(NavMeshConstructor.constructNavmesh(terrainMeshData)); + if(terrainMeshData.getVertices().length > 0){ + trackingData.setNavMeshData(NavMeshConstructor.constructNavmesh(terrainMeshData)); + } loadedCellsLock.lock(); posPhysicsMap.put(key, cell); @@ -778,7 +780,9 @@ public class GriddedDataCellManager implements DataCellManager, VoxelCellManager } //create pathfinding mesh - trackingData.setNavMeshData(NavMeshConstructor.constructNavmesh(terrainMeshData)); + if(terrainMeshData.getVertices().length > 0){ + trackingData.setNavMeshData(NavMeshConstructor.constructNavmesh(terrainMeshData)); + } //set ready dataCell.setReady(true); diff --git a/src/main/java/electrosphere/server/pathfinding/NavMeshConstructor.java b/src/main/java/electrosphere/server/pathfinding/NavMeshConstructor.java index 10706288..6e3a61ad 100644 --- a/src/main/java/electrosphere/server/pathfinding/NavMeshConstructor.java +++ b/src/main/java/electrosphere/server/pathfinding/NavMeshConstructor.java @@ -76,75 +76,91 @@ public class NavMeshConstructor { * @return the MeshData */ public static MeshData constructNavmesh(TerrainChunkData terrainChunkData){ - RecastConfig recastConfig = new RecastConfig( - PartitionType.MONOTONE, - RECAST_CELL_SIZE, - RECAST_CELL_HEIGHT, - RECAST_AGENT_HEIGHT, - RECAST_AGENT_SIZE, - RECAST_AGENT_MAX_CLIMB, - RECAST_AGENT_MAX_SLOPE, - RECAST_MIN_REGION_SIZE, - RECAST_REGION_MERGE_SIZE, - RECAST_REGION_EDGE_MAX_LEN, - RECAST_REGION_EDGE_MAX_ERROR, - RECAST_VERTS_PER_POLY, - RECAST_DETAIL_SAMPLE_DIST, - RECAST_DETAIL_SAMPLE_MAX_ERROR, - new AreaModification(0) - ); - SingleTrimeshInputGeomProvider geomProvider = new SingleTrimeshInputGeomProvider(terrainChunkData.getVertices(), terrainChunkData.getFaceElements()); - RecastBuilderConfig recastBuilderConfig = new RecastBuilderConfig(recastConfig, geomProvider.getMeshBoundsMin(), geomProvider.getMeshBoundsMax()); - RecastBuilder recastBuilder = new RecastBuilder(); - RecastBuilderResult recastBuilderResult = recastBuilder.build(geomProvider, recastBuilderConfig); - PolyMesh polyMesh = recastBuilderResult.getMesh(); - for(int i = 0; i < polyMesh.npolys; i++){ - polyMesh.flags[i] = 1; + MeshData rVal = null; + + try { + RecastConfig recastConfig = new RecastConfig( + PartitionType.WATERSHED, + RECAST_CELL_SIZE, + RECAST_CELL_HEIGHT, + RECAST_AGENT_HEIGHT, + RECAST_AGENT_SIZE, + RECAST_AGENT_MAX_CLIMB, + RECAST_AGENT_MAX_SLOPE, + RECAST_MIN_REGION_SIZE, + RECAST_REGION_MERGE_SIZE, + RECAST_REGION_EDGE_MAX_LEN, + RECAST_REGION_EDGE_MAX_ERROR, + RECAST_VERTS_PER_POLY, + RECAST_DETAIL_SAMPLE_DIST, + RECAST_DETAIL_SAMPLE_MAX_ERROR, + new AreaModification(0) + ); + SingleTrimeshInputGeomProvider geomProvider = new SingleTrimeshInputGeomProvider(terrainChunkData.getVertices(), terrainChunkData.getFaceElements()); + RecastBuilderConfig recastBuilderConfig = new RecastBuilderConfig(recastConfig, geomProvider.getMeshBoundsMin(), geomProvider.getMeshBoundsMax()); + RecastBuilder recastBuilder = new RecastBuilder(); + RecastBuilderResult recastBuilderResult = recastBuilder.build(geomProvider, recastBuilderConfig); + PolyMesh polyMesh = recastBuilderResult.getMesh(); + for(int i = 0; i < polyMesh.npolys; i++){ + 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(); + params.verts = polyMesh.verts; + params.vertCount = polyMesh.nverts; + params.polys = polyMesh.polys; + params.polyAreas = polyMesh.areas; + 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; + params.bmin = polyMesh.bmin; + params.bmax = polyMesh.bmax; + params.cs = RECAST_CELL_SIZE; + params.ch = RECAST_CELL_HEIGHT; + params.buildBvTree = true; + + // params.offMeshConVerts = new float[6]; + // params.offMeshConVerts[0] = 0.1f; + // params.offMeshConVerts[1] = 0.2f; + // params.offMeshConVerts[2] = 0.3f; + // params.offMeshConVerts[3] = 0.4f; + // params.offMeshConVerts[4] = 0.5f; + // params.offMeshConVerts[5] = 0.6f; + // params.offMeshConRad = new float[1]; + // params.offMeshConRad[0] = 0.1f; + // params.offMeshConDir = new int[1]; + // params.offMeshConDir[0] = 1; + // params.offMeshConAreas = new int[1]; + // params.offMeshConAreas[0] = 2; + // params.offMeshConFlags = new int[1]; + // params.offMeshConFlags[0] = 12; + // params.offMeshConUserID = new int[1]; + // params.offMeshConUserID[0] = 0x4567; + // params.offMeshConCount = 1; + + //actually build + rVal = NavMeshBuilder.createNavMeshData(params); + + + } catch (Exception e){ + e.printStackTrace(); } - PolyMeshDetail polyMeshDetail = recastBuilderResult.getMeshDetail(); - NavMeshDataCreateParams params = new NavMeshDataCreateParams(); - params.verts = polyMesh.verts; - params.vertCount = polyMesh.nverts; - params.polys = polyMesh.polys; - params.polyAreas = polyMesh.areas; - 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; - params.bmin = polyMesh.bmin; - params.bmax = polyMesh.bmax; - params.cs = RECAST_CELL_SIZE; - params.ch = RECAST_CELL_HEIGHT; - params.buildBvTree = true; - // params.offMeshConVerts = new float[6]; - // params.offMeshConVerts[0] = 0.1f; - // params.offMeshConVerts[1] = 0.2f; - // params.offMeshConVerts[2] = 0.3f; - // params.offMeshConVerts[3] = 0.4f; - // params.offMeshConVerts[4] = 0.5f; - // params.offMeshConVerts[5] = 0.6f; - // params.offMeshConRad = new float[1]; - // params.offMeshConRad[0] = 0.1f; - // params.offMeshConDir = new int[1]; - // params.offMeshConDir[0] = 1; - // params.offMeshConAreas = new int[1]; - // params.offMeshConAreas[0] = 2; - // params.offMeshConFlags = new int[1]; - // params.offMeshConFlags[0] = 12; - // params.offMeshConUserID = new int[1]; - // params.offMeshConUserID[0] = 0x4567; - // params.offMeshConCount = 1; - MeshData meshData = NavMeshBuilder.createNavMeshData(params); - - return meshData; + return rVal; } }