diff options
Diffstat (limited to 'game/terrain.cpp')
-rw-r--r-- | game/terrain.cpp | 38 |
1 files changed, 28 insertions, 10 deletions
diff --git a/game/terrain.cpp b/game/terrain.cpp index 201c732..3b16e79 100644 --- a/game/terrain.cpp +++ b/game/terrain.cpp @@ -15,11 +15,21 @@ #include <utility> #include <vector> +static constexpr RGB openSurface {-1}; + Terrain::Terrain(std::shared_ptr<GeoData> tm) : geoData {std::move(tm)}, grass {std::make_shared<Texture>("grass.png")} { generateMeshes(); } +template<> +VertexArrayObject & +VertexArrayObject::addAttribsFor<Terrain::Vertex>(const GLuint arrayBuffer, const GLuint divisor) +{ + return addAttribs<Terrain::Vertex, &Terrain::Vertex::pos, &Terrain::Vertex::normal, &Terrain::Vertex::colourBias>( + arrayBuffer, divisor); +} + void Terrain::generateMeshes() { @@ -27,21 +37,29 @@ Terrain::generateMeshes() indices.reserve(geoData->n_faces() * 3); std::vector<Vertex> vertices; vertices.reserve(geoData->n_vertices()); - std::map<GeoData::VertexHandle, size_t> 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<std::pair<GeoData::VertexHandle, const Surface *>, 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) { + const auto surface = geoData->get_surface(f); + if (const auto vertexIndexRef = vertexIndex.emplace(std::make_pair(v, surface), 0); + vertexIndexRef.second) { + vertexIndexRef.first->second = vertices.size(); + + vertices.emplace_back(geoData->point(v), geoData->normal(v), + surface ? surface->colorBias : openSurface); + } + }); }); 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<Mesh>(vertices, indices); + meshes.create<MeshT<Vertex>>(vertices, indices); } void @@ -60,6 +78,6 @@ Terrain::render(const SceneShader & shader) const void Terrain::shadows(const ShadowMapper & shadowMapper) const { - shadowMapper.fixedPoint.use(); + shadowMapper.landmess.use(); meshes.apply(&Mesh::Draw); } |