#include "terrain.h" #include "game/geoData.h" #include "gfx/models/texture.h" #include #include #include #include #include #include #include #include #include #include #include #include #include Terrain::Terrain(std::shared_ptr tm) : geoData {std::move(tm)}, grass {std::make_shared("grass.png")} { generateMeshes(); } void Terrain::generateMeshes() { std::vector indices; 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::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]; }); }); meshes.create(vertices, indices); } void Terrain::tick(TickDuration) { } void Terrain::render(const SceneShader & shader) const { shader.landmass.use(); grass->bind(); meshes.apply(&Mesh::Draw); } void Terrain::shadows(const ShadowMapper & shadowMapper) const { shadowMapper.fixedPoint.use(); meshes.apply(&Mesh::Draw); }