From b44c2d85bb8e46c4a6c65aacd23157c07cb80eca Mon Sep 17 00:00:00 2001 From: Dan Goodliffe Date: Fri, 12 Apr 2024 00:03:15 +0100 Subject: Create terrain vertices per surface type --- game/geoData.h | 7 +++++++ game/terrain.cpp | 24 ++++++++++++++++-------- 2 files changed, 23 insertions(+), 8 deletions(-) (limited to 'game') diff --git a/game/geoData.h b/game/geoData.h index 7a2344d..5586023 100644 --- a/game/geoData.h +++ b/game/geoData.h @@ -150,6 +150,13 @@ public: return std::tie(lowerExtent, upperExtent); } + template + [[nodiscard]] auto + get_surface(const HandleT h) + { + return property(surface, h); + } + protected: template [[nodiscard]] Triangle diff --git a/game/terrain.cpp b/game/terrain.cpp index 201c732..c19bd0a 100644 --- a/game/terrain.cpp +++ b/game/terrain.cpp @@ -27,18 +27,26 @@ Terrain::generateMeshes() indices.reserve(geoData->n_faces() * 3); std::vector vertices; vertices.reserve(geoData->n_vertices()); - std::map vertexIndex; - std::transform(geoData->vertices_sbegin(), geoData->vertices_end(), std::back_inserter(vertices), - [this, &vertexIndex](const GeoData::VertexHandle v) { - vertexIndex.emplace(v, vertexIndex.size()); - const auto p = geoData->point(v); - return Vertex {p, RelativePosition2D(p) / 10000.F, geoData->normal(v)}; + std::map, size_t> vertexIndex; + std::for_each(geoData->vertices_sbegin(), geoData->vertices_end(), + [this, &vertexIndex, &vertices](const GeoData::VertexHandle v) { + std::for_each(geoData->vf_begin(v), geoData->vf_end(v), + [&vertexIndex, v, this, &vertices](const GeoData::FaceHandle f) { + if (const auto vertexIndexRef + = vertexIndex.emplace(std::make_pair(v, geoData->get_surface(f)), 0); + vertexIndexRef.second) { + vertexIndexRef.first->second = vertices.size(); + + const auto p = geoData->point(v); + vertices.emplace_back(p, RelativePosition2D(p) / 10000.F, geoData->normal(v)); + } + }); }); std::for_each( geoData->faces_sbegin(), geoData->faces_end(), [this, &vertexIndex, &indices](const GeoData::FaceHandle f) { std::transform(geoData->fv_begin(f), geoData->fv_end(f), std::back_inserter(indices), - [&vertexIndex](const GeoData::VertexHandle v) { - return vertexIndex[v]; + [&vertexIndex, f, this](const GeoData::VertexHandle v) { + return vertexIndex[std::make_pair(v, geoData->get_surface(f))]; }); }); meshes.create(vertices, indices); -- cgit v1.2.3