diff --git a/RecastDemo/Include/InputGeom.h b/RecastDemo/Include/InputGeom.h index 689fa107..5a22cbbd 100644 --- a/RecastDemo/Include/InputGeom.h +++ b/RecastDemo/Include/InputGeom.h @@ -71,18 +71,22 @@ struct BuildSettings float tileSize = 0; }; -class InputGeom -{ -public: - std::string filename; - // Mesh data +struct Mesh +{ std::vector verts; std::vector tris; std::vector normals; [[nodiscard]] int getVertCount() const { return static_cast(verts.size()) / 3; } [[nodiscard]] int getTriCount() const { return static_cast(tris.size()) / 3; } +}; + +class InputGeom +{ +public: + std::string filename; + Mesh mesh; ChunkyTriMesh* chunkyMesh = nullptr; float meshBoundsMin[3] = {}; diff --git a/RecastDemo/Source/InputGeom.cpp b/RecastDemo/Source/InputGeom.cpp index d99cd351..922806e2 100644 --- a/RecastDemo/Source/InputGeom.cpp +++ b/RecastDemo/Source/InputGeom.cpp @@ -166,9 +166,8 @@ bool InputGeom::loadMesh(rcContext* ctx, const std::string& filepath) offMeshConCount = 0; convexVolumeCount = 0; - parseObjModel(buffer, bufferLen, verts, tris, normals); - - rcCalcBounds(verts.data(), getVertCount(), meshBoundsMin, meshBoundsMax); + parseObjModel(buffer, bufferLen, mesh.verts, mesh.tris, mesh.normals); + rcCalcBounds(mesh.verts.data(), mesh.getVertCount(), meshBoundsMin, meshBoundsMax); chunkyMesh = new ChunkyTriMesh; if (!chunkyMesh) @@ -176,7 +175,7 @@ bool InputGeom::loadMesh(rcContext* ctx, const std::string& filepath) ctx->log(RC_LOG_ERROR, "buildTiledNavigation: Out of memory 'm_chunkyMesh'."); return false; } - if (!chunkyMesh->TryPartitionMesh(verts.data(), tris.data(), getTriCount(), 256)) + if (!chunkyMesh->TryPartitionMesh(mesh.verts.data(), mesh.tris.data(), mesh.getTriCount(), 256)) { ctx->log(RC_LOG_ERROR, "buildTiledNavigation: Failed to build chunky mesh."); return false; @@ -363,7 +362,7 @@ bool InputGeom::load(rcContext* ctx, const std::string& filepath) bool InputGeom::saveGeomSet(const BuildSettings* settings) { - if (verts.empty()) + if (mesh.verts.empty()) { return false; } @@ -520,7 +519,7 @@ bool InputGeom::raycastMesh(float* src, float* dst, float& tmin) for (int j = 0; j < ntris * 3; j += 3) { float t = 1; - if (intersectSegmentTriangle(src, dst, &verts[tris[j] * 3], &verts[tris[j + 1] * 3], &verts[tris[j + 2] * 3], t)) + if (intersectSegmentTriangle(src, dst, &mesh.verts[tris[j] * 3], &mesh.verts[tris[j + 1] * 3], &mesh.verts[tris[j + 2] * 3], t)) { if (t < tmin) { diff --git a/RecastDemo/Source/Sample.cpp b/RecastDemo/Source/Sample.cpp index a5dc6778..dc5c26d6 100644 --- a/RecastDemo/Source/Sample.cpp +++ b/RecastDemo/Source/Sample.cpp @@ -130,11 +130,11 @@ void Sample::render() // Draw mesh duDebugDrawTriMesh( &debugDraw, - inputGeometry->verts.data(), - inputGeometry->getVertCount(), - inputGeometry->tris.data(), - inputGeometry->normals.data(), - inputGeometry->getTriCount(), + inputGeometry->mesh.verts.data(), + inputGeometry->mesh.getVertCount(), + inputGeometry->mesh.tris.data(), + inputGeometry->mesh.normals.data(), + inputGeometry->mesh.getTriCount(), 0, 1.0f); // Draw bounds diff --git a/RecastDemo/Source/Sample_SoloMesh.cpp b/RecastDemo/Source/Sample_SoloMesh.cpp index a3481762..c9550aa7 100644 --- a/RecastDemo/Source/Sample_SoloMesh.cpp +++ b/RecastDemo/Source/Sample_SoloMesh.cpp @@ -199,11 +199,11 @@ void Sample_SoloMesh::render() // Draw mesh duDebugDrawTriMeshSlope( &debugDraw, - inputGeometry->verts.data(), - inputGeometry->getVertCount(), - inputGeometry->tris.data(), - inputGeometry->normals.data(), - inputGeometry->getTriCount(), + inputGeometry->mesh.verts.data(), + inputGeometry->mesh.getVertCount(), + inputGeometry->mesh.tris.data(), + inputGeometry->mesh.normals.data(), + inputGeometry->mesh.getTriCount(), agentMaxSlope, texScale); inputGeometry->drawOffMeshConnections(&debugDraw); @@ -354,7 +354,7 @@ void Sample_SoloMesh::onMeshChanged(InputGeom* geom) bool Sample_SoloMesh::build() { - if (!inputGeometry || inputGeometry->verts.empty()) + if (!inputGeometry || inputGeometry->mesh.verts.empty()) { buildContext->log(RC_LOG_ERROR, "buildNavigation: Input mesh is not specified."); return false; @@ -364,10 +364,10 @@ bool Sample_SoloMesh::build() const float* boundsMin = inputGeometry->getNavMeshBoundsMin(); const float* boundsMax = inputGeometry->getNavMeshBoundsMax(); - const float* verts = inputGeometry->verts.data(); - const int numVerts = static_cast(inputGeometry->verts.size()) / 3; - const int* tris = inputGeometry->tris.data(); - const int numTris = static_cast(inputGeometry->tris.size()) / 3; + const float* verts = inputGeometry->mesh.verts.data(); + const int numVerts = static_cast(inputGeometry->mesh.verts.size()) / 3; + const int* tris = inputGeometry->mesh.tris.data(); + const int numTris = static_cast(inputGeometry->mesh.tris.size()) / 3; // // Step 1. Initialize build config. diff --git a/RecastDemo/Source/Sample_TempObstacles.cpp b/RecastDemo/Source/Sample_TempObstacles.cpp index 0cf5e6a9..6cda79b7 100644 --- a/RecastDemo/Source/Sample_TempObstacles.cpp +++ b/RecastDemo/Source/Sample_TempObstacles.cpp @@ -533,7 +533,7 @@ int Sample_TempObstacles::rasterizeTileLayers( TileCacheData* tiles, const int maxTiles) const { - if (!inputGeometry || inputGeometry->getVertCount() == 0 || !inputGeometry->chunkyMesh) + if (!inputGeometry || inputGeometry->mesh.getVertCount() == 0 || !inputGeometry->chunkyMesh) { buildContext->log(RC_LOG_ERROR, "buildTile: Input mesh is not specified."); return 0; @@ -542,8 +542,8 @@ int Sample_TempObstacles::rasterizeTileLayers( FastLZCompressor comp; RasterizationContext rasterContext; - const float* verts = inputGeometry->verts.data(); - const int nverts = inputGeometry->getVertCount(); + const float* verts = inputGeometry->mesh.verts.data(); + const int nverts = inputGeometry->mesh.getVertCount(); const ChunkyTriMesh* chunkyMesh = inputGeometry->chunkyMesh; // Tile bounds. @@ -1111,7 +1111,7 @@ void Sample_TempObstacles::drawDebugUI() void Sample_TempObstacles::render() { - if (!inputGeometry || inputGeometry->getVertCount() == 0) + if (!inputGeometry || inputGeometry->mesh.getVertCount() == 0) { return; } @@ -1124,11 +1124,11 @@ void Sample_TempObstacles::render() // Draw mesh duDebugDrawTriMeshSlope( &debugDraw, - inputGeometry->verts.data(), - inputGeometry->getVertCount(), - inputGeometry->tris.data(), - inputGeometry->normals.data(), - inputGeometry->getTriCount(), + inputGeometry->mesh.verts.data(), + inputGeometry->mesh.getVertCount(), + inputGeometry->mesh.tris.data(), + inputGeometry->mesh.normals.data(), + inputGeometry->mesh.getTriCount(), agentMaxSlope, texScale); inputGeometry->drawOffMeshConnections(&debugDraw); @@ -1310,7 +1310,7 @@ bool Sample_TempObstacles::build() { dtStatus status; - if (!inputGeometry || inputGeometry->getVertCount() == 0) + if (!inputGeometry || inputGeometry->mesh.getVertCount() == 0) { buildContext->log(RC_LOG_ERROR, "buildTiledNavigation: No vertices and triangles."); return false; diff --git a/RecastDemo/Source/Sample_TileMesh.cpp b/RecastDemo/Source/Sample_TileMesh.cpp index 5d9983f9..7bd4b59a 100644 --- a/RecastDemo/Source/Sample_TileMesh.cpp +++ b/RecastDemo/Source/Sample_TileMesh.cpp @@ -362,7 +362,7 @@ void Sample_TileMesh::drawDebugUI() void Sample_TileMesh::render() { - if (!inputGeometry || inputGeometry->getVertCount() == 0) + if (!inputGeometry || inputGeometry->mesh.getVertCount() == 0) { return; } @@ -375,11 +375,11 @@ void Sample_TileMesh::render() // Draw mesh duDebugDrawTriMeshSlope( &debugDraw, - inputGeometry->verts.data(), - inputGeometry->getVertCount(), - inputGeometry->tris.data(), - inputGeometry->normals.data(), - inputGeometry->getTriCount(), + inputGeometry->mesh.verts.data(), + inputGeometry->mesh.getVertCount(), + inputGeometry->mesh.tris.data(), + inputGeometry->mesh.normals.data(), + inputGeometry->mesh.getTriCount(), agentMaxSlope, texScale); inputGeometry->drawOffMeshConnections(&debugDraw); @@ -589,7 +589,7 @@ void Sample_TileMesh::onMeshChanged(InputGeom* geom) bool Sample_TileMesh::build() { - if (!inputGeometry || inputGeometry->getVertCount() == 0) + if (!inputGeometry || inputGeometry->mesh.getVertCount() == 0) { buildContext->log(RC_LOG_ERROR, "buildTiledNavigation: No vertices and triangles."); return false; @@ -834,7 +834,7 @@ unsigned char* Sample_TileMesh::buildTileMesh( const float* boundsMax, int& outDataSize) { - if (!inputGeometry || inputGeometry->getVertCount() == 0 || !inputGeometry->chunkyMesh) + if (!inputGeometry || inputGeometry->mesh.getVertCount() == 0 || !inputGeometry->chunkyMesh) { buildContext->log(RC_LOG_ERROR, "buildNavigation: Input mesh is not specified."); return 0; @@ -845,9 +845,9 @@ unsigned char* Sample_TileMesh::buildTileMesh( cleanup(); - const float* verts = inputGeometry->verts.data(); - const int numVerts = inputGeometry->getVertCount(); - const int numTris = inputGeometry->getTriCount(); + const float* verts = inputGeometry->mesh.verts.data(); + const int numVerts = inputGeometry->mesh.getVertCount(); + const int numTris = inputGeometry->mesh.getTriCount(); const ChunkyTriMesh* chunkyMesh = inputGeometry->chunkyMesh; // Init build configuration from GUI diff --git a/RecastDemo/Source/main.cpp b/RecastDemo/Source/main.cpp index 494828a7..1f6c464d 100644 --- a/RecastDemo/Source/main.cpp +++ b/RecastDemo/Source/main.cpp @@ -665,8 +665,8 @@ int main(int /*argc*/, char** /*argv*/) if (app.inputGeometry) { DrawRightAlignedText("Verts: %.1fk Tris: %.1fk", - static_cast(app.inputGeometry->getVertCount()) / 1000.0f, - static_cast(app.inputGeometry->getTriCount()) / 1000.0f); + static_cast(app.inputGeometry->mesh.getVertCount()) / 1000.0f, + static_cast(app.inputGeometry->mesh.getTriCount()) / 1000.0f); } if (app.sample)