From e63f69152a12a79064ecdd07e09a5ef143913763 Mon Sep 17 00:00:00 2001 From: Diject Date: Fri, 2 Jan 2026 20:43:40 +0300 Subject: [PATCH] Add background color export to map info files --- apps/openmw/mapextractor.cpp | 3 +++ apps/openmw/mwrender/globalmap.cpp | 23 ++++++++++++++++------- apps/openmw/mwrender/globalmap.hpp | 4 ++++ apps/openmw/mwworld/worldimp.cpp | 2 ++ 4 files changed, 25 insertions(+), 7 deletions(-) diff --git a/apps/openmw/mapextractor.cpp b/apps/openmw/mapextractor.cpp index ef44a15d45..0e6163e41c 100644 --- a/apps/openmw/mapextractor.cpp +++ b/apps/openmw/mapextractor.cpp @@ -182,6 +182,8 @@ namespace OMW return; } + osg::Vec3f bgColor = mGlobalMap->getBackgroundColor(); + file << "width: " << width << "\n"; file << "height: " << height << "\n"; file << "pixelsPerCell: 32\n"; @@ -192,6 +194,7 @@ namespace OMW file << " min: " << minY << "\n"; file << " max: " << maxY << "\n"; file << "file: \"map.png\"\n"; + file << "bColor: [" << bgColor.x() << ", " << bgColor.y() << ", " << bgColor.z() << "]\n"; file.close(); diff --git a/apps/openmw/mwrender/globalmap.cpp b/apps/openmw/mwrender/globalmap.cpp index 20128ff837..efccc6080a 100644 --- a/apps/openmw/mwrender/globalmap.cpp +++ b/apps/openmw/mwrender/globalmap.cpp @@ -199,12 +199,11 @@ namespace MWRender int texelX = (x - mMinX) * mCellSize + cellX; int texelY = (y - mMinY) * mCellSize + cellY; - int lutIndex = 0; - osg::Vec4 color = mColorLut->getColor(lutIndex, 0); + osg::Vec4 color = mColorLut->getColor(0, 0); image->setColor(color, texelX, texelY); // Set alpha based on lutIndex threshold - osg::Vec4 alpha(0.0f, 0.0f, 0.0f, lutIndex < 128 ? 0.0f : 1.0f); + osg::Vec4 alpha(0.0f, 0.0f, 0.0f, 0.0f); alphaImage->setColor(alpha, texelX, texelY); } } @@ -319,17 +318,17 @@ namespace MWRender // Load color LUT texture constexpr VFS::Path::NormalizedView colorLutPath("textures/omw_map_color_palette.dds"); auto resourceSystem = MWBase::Environment::get().getResourceSystem(); - osg::ref_ptr colorLut = resourceSystem->getImageManager()->getImage(colorLutPath); + mColorLut = resourceSystem->getImageManager()->getImage(colorLutPath); // Validate LUT dimensions - if (!colorLut || colorLut->s() != 256 || colorLut->t() != 1) + if (!mColorLut || mColorLut->s() != 256 || mColorLut->t() != 1) { throw std::runtime_error("Global map color LUT must be 256x1 pixels, got " - + std::to_string(colorLut ? colorLut->s() : 0) + "x" + std::to_string(colorLut ? colorLut->t() : 0)); + + std::to_string(mColorLut ? mColorLut->s() : 0) + "x" + std::to_string(mColorLut ? mColorLut->t() : 0)); } mWorkItem = new CreateMapWorkItem( - mWidth, mHeight, mMinX, mMinY, mMaxX, mMaxY, cellSize, esmStore.get(), colorLut); + mWidth, mHeight, mMinX, mMinY, mMaxX, mMaxY, cellSize, esmStore.get(), mColorLut); mWorkQueue->addWorkItem(mWorkItem); } @@ -674,4 +673,14 @@ namespace MWRender mWritePng = new WritePng(new osg::Image(*mOverlayImage, osg::CopyOp::DEEP_COPY_ALL)); mWorkQueue->addWorkItem(mWritePng, /*front=*/true); } + + osg::Vec3f GlobalMap::getBackgroundColor() const + { + if (mColorLut) + { + osg::Vec4 color = mColorLut->getColor(0, 0); + return osg::Vec3f(color.r(), color.g(), color.b()); + } + return osg::Vec3f(0.0f, 0.0f, 0.0f); + } } diff --git a/apps/openmw/mwrender/globalmap.hpp b/apps/openmw/mwrender/globalmap.hpp index 07d7731e31..c643ca4eb0 100644 --- a/apps/openmw/mwrender/globalmap.hpp +++ b/apps/openmw/mwrender/globalmap.hpp @@ -74,6 +74,8 @@ namespace MWRender void asyncWritePng(); + osg::Vec3f getBackgroundColor() const; + private: struct WritePng; @@ -121,6 +123,8 @@ namespace MWRender // CPU copy of overlay osg::ref_ptr mOverlayImage; + osg::ref_ptr mColorLut; + osg::ref_ptr mWorkQueue; osg::ref_ptr mWorkItem; osg::ref_ptr mWritePng; diff --git a/apps/openmw/mwworld/worldimp.cpp b/apps/openmw/mwworld/worldimp.cpp index ee8f39f5dc..6d1dc6b338 100644 --- a/apps/openmw/mwworld/worldimp.cpp +++ b/apps/openmw/mwworld/worldimp.cpp @@ -4159,6 +4159,8 @@ namespace MWWorld infoFile << " min: " << minY << "\n"; infoFile << " max: " << maxY << "\n"; infoFile << "file: \"tilemap.png\"\n"; + infoFile << "bColor: [" << backgroundColor.x() << ", " << backgroundColor.y() << ", " << backgroundColor.z() + << "]\n"; infoFile.close();