#include "terrain.h" #include "game/geoData.h" #include #include #include #include #include #include #include #include #include #include #include #include #include static constexpr RGB OPEN_SURFACE {-1}; template<> VertexArrayObject & VertexArrayObject::addAttribsFor(const GLuint arrayBuffer, const GLuint divisor) { return addAttribs( arrayBuffer, divisor); } void Terrain::generateMeshes() { meshes.removeAll(); std::vector indices; indices.reserve(n_faces() * 3); std::vector vertices; vertices.reserve(n_vertices()); std::map, size_t> vertexIndex; std::ranges::for_each(this->vertices(), [this, &vertexIndex, &vertices](const auto vertex) { std::ranges::for_each(vf_range(vertex), [&vertexIndex, vertex, this, &vertices](const auto face) { const auto * const surface = getSurface(face); if (const auto vertexIndexRef = vertexIndex.emplace(std::make_pair(vertex, surface), 0); vertexIndexRef.second) { vertexIndexRef.first->second = vertices.size(); vertices.emplace_back(point(vertex), normal(vertex), surface ? surface->colorBias : OPEN_SURFACE); } }); }); std::ranges::for_each(faces(), [this, &vertexIndex, &indices](const auto face) { std::ranges::transform( fv_range(face), std::back_inserter(indices), [&vertexIndex, face, this](const auto vertex) { return vertexIndex[std::make_pair(vertex, getSurface(face))]; }); }); meshes.create>(vertices, indices); } void Terrain::tick(TickDuration) { } void Terrain::afterChange() { generateMeshes(); } void Terrain::render(const SceneShader & shader) const { shader.landmass.use(); grass->bind(); meshes.apply(&Mesh::Draw); } void Terrain::shadows(const ShadowMapper & shadowMapper) const { shadowMapper.landmess.use(); meshes.apply(&Mesh::Draw); }