navmesh construction fix
Some checks reported errors
studiorailgun/Renderer/pipeline/head Something is wrong with the build of this commit
Some checks reported errors
studiorailgun/Renderer/pipeline/head Something is wrong with the build of this commit
This commit is contained in:
parent
f64d360d14
commit
6c06391245
@ -1515,6 +1515,7 @@ Obliterate old navmesh/pathfinding code
|
|||||||
Integrate recast4j as pathfinding source
|
Integrate recast4j as pathfinding source
|
||||||
GriddedDataCellManager pathfinding solution
|
GriddedDataCellManager pathfinding solution
|
||||||
ServerTerrainManager nullcheck fix
|
ServerTerrainManager nullcheck fix
|
||||||
|
Fix nav mesh construction params
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -357,7 +357,9 @@ public class GriddedDataCellManager implements DataCellManager, VoxelCellManager
|
|||||||
TerrainChunkData terrainMeshData = cell.getTerrainChunkData();
|
TerrainChunkData terrainMeshData = cell.getTerrainChunkData();
|
||||||
ServerDataCell serverDataCell = this.groundDataCells.get(key);
|
ServerDataCell serverDataCell = this.groundDataCells.get(key);
|
||||||
GriddedDataCellTrackingData trackingData = this.cellTrackingMap.get(serverDataCell);
|
GriddedDataCellTrackingData trackingData = this.cellTrackingMap.get(serverDataCell);
|
||||||
trackingData.setNavMeshData(NavMeshConstructor.constructNavmesh(terrainMeshData));
|
if(terrainMeshData.getVertices().length > 0){
|
||||||
|
trackingData.setNavMeshData(NavMeshConstructor.constructNavmesh(terrainMeshData));
|
||||||
|
}
|
||||||
|
|
||||||
loadedCellsLock.lock();
|
loadedCellsLock.lock();
|
||||||
posPhysicsMap.put(key, cell);
|
posPhysicsMap.put(key, cell);
|
||||||
@ -778,7 +780,9 @@ public class GriddedDataCellManager implements DataCellManager, VoxelCellManager
|
|||||||
}
|
}
|
||||||
|
|
||||||
//create pathfinding mesh
|
//create pathfinding mesh
|
||||||
trackingData.setNavMeshData(NavMeshConstructor.constructNavmesh(terrainMeshData));
|
if(terrainMeshData.getVertices().length > 0){
|
||||||
|
trackingData.setNavMeshData(NavMeshConstructor.constructNavmesh(terrainMeshData));
|
||||||
|
}
|
||||||
|
|
||||||
//set ready
|
//set ready
|
||||||
dataCell.setReady(true);
|
dataCell.setReady(true);
|
||||||
|
|||||||
@ -76,75 +76,91 @@ public class NavMeshConstructor {
|
|||||||
* @return the MeshData
|
* @return the MeshData
|
||||||
*/
|
*/
|
||||||
public static MeshData constructNavmesh(TerrainChunkData terrainChunkData){
|
public static MeshData constructNavmesh(TerrainChunkData terrainChunkData){
|
||||||
RecastConfig recastConfig = new RecastConfig(
|
MeshData rVal = null;
|
||||||
PartitionType.MONOTONE,
|
|
||||||
RECAST_CELL_SIZE,
|
try {
|
||||||
RECAST_CELL_HEIGHT,
|
RecastConfig recastConfig = new RecastConfig(
|
||||||
RECAST_AGENT_HEIGHT,
|
PartitionType.WATERSHED,
|
||||||
RECAST_AGENT_SIZE,
|
RECAST_CELL_SIZE,
|
||||||
RECAST_AGENT_MAX_CLIMB,
|
RECAST_CELL_HEIGHT,
|
||||||
RECAST_AGENT_MAX_SLOPE,
|
RECAST_AGENT_HEIGHT,
|
||||||
RECAST_MIN_REGION_SIZE,
|
RECAST_AGENT_SIZE,
|
||||||
RECAST_REGION_MERGE_SIZE,
|
RECAST_AGENT_MAX_CLIMB,
|
||||||
RECAST_REGION_EDGE_MAX_LEN,
|
RECAST_AGENT_MAX_SLOPE,
|
||||||
RECAST_REGION_EDGE_MAX_ERROR,
|
RECAST_MIN_REGION_SIZE,
|
||||||
RECAST_VERTS_PER_POLY,
|
RECAST_REGION_MERGE_SIZE,
|
||||||
RECAST_DETAIL_SAMPLE_DIST,
|
RECAST_REGION_EDGE_MAX_LEN,
|
||||||
RECAST_DETAIL_SAMPLE_MAX_ERROR,
|
RECAST_REGION_EDGE_MAX_ERROR,
|
||||||
new AreaModification(0)
|
RECAST_VERTS_PER_POLY,
|
||||||
);
|
RECAST_DETAIL_SAMPLE_DIST,
|
||||||
SingleTrimeshInputGeomProvider geomProvider = new SingleTrimeshInputGeomProvider(terrainChunkData.getVertices(), terrainChunkData.getFaceElements());
|
RECAST_DETAIL_SAMPLE_MAX_ERROR,
|
||||||
RecastBuilderConfig recastBuilderConfig = new RecastBuilderConfig(recastConfig, geomProvider.getMeshBoundsMin(), geomProvider.getMeshBoundsMax());
|
new AreaModification(0)
|
||||||
RecastBuilder recastBuilder = new RecastBuilder();
|
);
|
||||||
RecastBuilderResult recastBuilderResult = recastBuilder.build(geomProvider, recastBuilderConfig);
|
SingleTrimeshInputGeomProvider geomProvider = new SingleTrimeshInputGeomProvider(terrainChunkData.getVertices(), terrainChunkData.getFaceElements());
|
||||||
PolyMesh polyMesh = recastBuilderResult.getMesh();
|
RecastBuilderConfig recastBuilderConfig = new RecastBuilderConfig(recastConfig, geomProvider.getMeshBoundsMin(), geomProvider.getMeshBoundsMax());
|
||||||
for(int i = 0; i < polyMesh.npolys; i++){
|
RecastBuilder recastBuilder = new RecastBuilder();
|
||||||
polyMesh.flags[i] = 1;
|
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];
|
return rVal;
|
||||||
// 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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user