diff --git a/doomsday/apps/gloom/gloom/render/mapbuild.cpp b/doomsday/apps/gloom/gloom/render/mapbuild.cpp index 207eb33a65..26503f8083 100644 --- a/doomsday/apps/gloom/gloom/render/mapbuild.cpp +++ b/doomsday/apps/gloom/gloom/render/mapbuild.cpp @@ -178,7 +178,7 @@ DENG2_PIMPL_NOREF(MapBuild) { const ID pointID = cv.key(); - f.pos = cv.value(); + f.pos = cv.value() * map.metersPerUnit(); f.texCoord = Vec4f(0, 0, 0, 0); // fixed offset f.expander = expanders[pointID]; @@ -327,10 +327,10 @@ DENG2_PIMPL_NOREF(MapBuild) expanders[end], planeIndex, MapVertex::WorldSpaceYToTexCoord, - floor[start], - floor[end], - ceiling[start], - ceiling[end], + floor[start] * map.metersPerUnit(), + floor[end] * map.metersPerUnit(), + ceiling[start] * map.metersPerUnit(), + ceiling[end] * map.metersPerUnit(), length, 0); } @@ -352,10 +352,10 @@ DENG2_PIMPL_NOREF(MapBuild) expanders[end], botIndex, MapVertex::WorldSpaceYToTexCoord | MapVertex::AnchorTopPlane, - floor[start], - floor[end], - backPlaneVerts.front()[start], - backPlaneVerts.front()[end], + floor[start] * map.metersPerUnit(), + floor[end] * map.metersPerUnit(), + backPlaneVerts.front()[start] * map.metersPerUnit(), + backPlaneVerts.front()[end] * map.metersPerUnit(), length, 0); @@ -366,10 +366,10 @@ DENG2_PIMPL_NOREF(MapBuild) expanders[end], topIndex, MapVertex::WorldSpaceYToTexCoord, - backPlaneVerts.back()[start], - backPlaneVerts.back()[end], - ceiling[start], - ceiling[end], + backPlaneVerts.back()[start] * map.metersPerUnit(), + backPlaneVerts.back()[end] * map.metersPerUnit(), + ceiling[start] * map.metersPerUnit(), + ceiling[end] * map.metersPerUnit(), length, 0); } diff --git a/doomsday/apps/gloom/gloom/render/maprender.cpp b/doomsday/apps/gloom/gloom/render/maprender.cpp index 5d45b206b5..55c5b522e6 100644 --- a/doomsday/apps/gloom/gloom/render/maprender.cpp +++ b/doomsday/apps/gloom/gloom/render/maprender.cpp @@ -214,12 +214,14 @@ void MapRender::advanceTime(TimeSpan elapsed) // Update plane heights. { + const Vec3d metersPerUnit = context().map->metersPerUnit(); + for (auto i = d->planeMapper.begin(), end = d->planeMapper.end(); i != end; ++i) { - const float planeY = float(context().map->plane(i.key()).point.y); // + + const double planeY = context().map->plane(i.key()).point.y; // + //std::sin(i.value() + now * .1f); - d->planes.setData(i.value(), planeY); + d->planes.setData(i.value(), float(planeY * metersPerUnit.y)); } } diff --git a/doomsday/apps/gloom/gloom/world/map.cpp b/doomsday/apps/gloom/gloom/world/map.cpp index 8cb9ec0f62..ea879fe705 100644 --- a/doomsday/apps/gloom/gloom/world/map.cpp +++ b/doomsday/apps/gloom/gloom/world/map.cpp @@ -32,6 +32,7 @@ namespace gloom { DENG2_PIMPL(Map) { ID idGen{0}; + Vec3d metersPerUnit{1.0, 1.0, 1.0}; Points points; Lines lines; Planes planes; @@ -45,6 +46,7 @@ DENG2_PIMPL(Map) Impl(Public *i, const Impl &other) : Base(i) , idGen(other.idGen) + , metersPerUnit(other.metersPerUnit) , points(other.points) , lines(other.lines) , planes(other.planes) @@ -177,6 +179,16 @@ gloom::ID Map::newID() return ++d->idGen; } +void Map::setMetersPerUnit(const Vec3d &metersPerUnit) +{ + d->metersPerUnit = metersPerUnit; +} + +Vec3d Map::metersPerUnit() const +{ + return d->metersPerUnit; +} + Points &Map::points() { return d->points; @@ -735,6 +747,12 @@ Block Map::serialize() const const Impl *_d = d; QJsonObject obj; + // Metadata. + { + obj.insert("metersPerUnit", + QJsonArray({_d->metersPerUnit.x, _d->metersPerUnit.y, _d->metersPerUnit.z})); + } + // Points. { QJsonObject points; @@ -852,6 +870,15 @@ void Map::deserialize(const Block &data) return id; }; + // Metadata. + { + if (map.contains("metersPerUnit")) + { + const auto mpu = map["metersPerUnit"].toList(); + d->metersPerUnit = {mpu[0].toDouble(), mpu[1].toDouble(), mpu[2].toDouble()}; + } + } + // Points. { const auto points = map["points"].toHash(); diff --git a/doomsday/apps/gloom/gloom/world/map.h b/doomsday/apps/gloom/gloom/world/map.h index d3a7e0e596..2bbbdecd23 100644 --- a/doomsday/apps/gloom/gloom/world/map.h +++ b/doomsday/apps/gloom/gloom/world/map.h @@ -137,6 +137,9 @@ class Map void removeInvalid(); ID newID(); + void setMetersPerUnit(const Vec3d &metersPerUnit); + Vec3d metersPerUnit() const; + template ID append(H &hash, const T& value) { diff --git a/doomsday/apps/gloom/gloom/world/mapimport.cpp b/doomsday/apps/gloom/gloom/world/mapimport.cpp index 74364d673f..cab327f206 100644 --- a/doomsday/apps/gloom/gloom/world/mapimport.cpp +++ b/doomsday/apps/gloom/gloom/world/mapimport.cpp @@ -150,6 +150,7 @@ DENG2_PIMPL_NOREF(MapImport) const double mapUnit = humanEyeHeight / (levelFormat == DoomFormat ? 41.0 : 48.0); worldScale = {mapUnit, mapUnit * 1.2, mapUnit}; // VGA aspect ratio for vertical + map.setMetersPerUnit(worldScale); const auto linedefData = lumps.read(headerPos + 2); diff --git a/doomsday/apps/gloom/src/gloomapp.cpp b/doomsday/apps/gloom/src/gloomapp.cpp index da346007dd..b061494091 100644 --- a/doomsday/apps/gloom/src/gloomapp.cpp +++ b/doomsday/apps/gloom/src/gloomapp.cpp @@ -111,6 +111,7 @@ void GloomApp::initialize() { const auto &asset = App::asset(d->editWin->editor().mapId()); loadedMap.deserialize(FS::locate(asset.absolutePath("path"))); + //loadedMap.setMetersPerUnit(vectorFromValue(asset.get("metersPerUnit")); } d->world->setMap(loadedMap);