From d33f528f17ed1be17aca82e5c0bc9f39c1d496ae Mon Sep 17 00:00:00 2001 From: Dan Goodliffe Date: Mon, 3 Jan 2022 18:37:09 +0000 Subject: Support for querying terrain height in GeoData --- game/geoData.cpp | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) (limited to 'game/geoData.cpp') diff --git a/game/geoData.cpp b/game/geoData.cpp index 55c69a1..d66f1ed 100644 --- a/game/geoData.cpp +++ b/game/geoData.cpp @@ -1,11 +1,14 @@ #include "geoData.h" #include "gfx/image.h" #include +#include +#include #include #include #include #include #include +#include GeoData::GeoData(Limits l, float s) : limit {std::move(l)}, size {(limit.second - limit.first) + 1}, scale {s}, nodes {[this]() { @@ -65,6 +68,26 @@ GeoData::loadFromImages(const std::filesystem::path & fileName, float scale_) }); } +glm::vec3 +GeoData::positionAt(const glm::vec2 wcoord) const +{ + const auto coord {wcoord / scale}; + const std::array gridCorner { + {{std::floor(coord.x), std::floor(coord.y)}, {std::floor(coord.x), std::ceil(coord.y)}, + {std::ceil(coord.x), std::floor(coord.y)}, {std::ceil(coord.x), std::ceil(coord.y)}}}; + + const auto point {transform_array(gridCorner, [this](const auto c) { + return nodes[at(c)].height; + })}; + + const glm::vec2 frac = coord - gridCorner.front(); + const auto heightFloor = point[0] + ((point[2] - point[0]) * frac.x), + heightCeil = point[1] + ((point[3] - point[1]) * frac.x), + heightMid = heightFloor + ((heightCeil - heightFloor) * frac.y); + + return wcoord || heightMid; +} + unsigned int GeoData::at(glm::ivec2 coord) const { -- cgit v1.2.3