From ddd66056089b6ff409eaada4b772aa251377c971 Mon Sep 17 00:00:00 2001 From: scrawl Date: Tue, 14 Feb 2017 02:40:41 +0100 Subject: [PATCH] Move WNAM out of LandData to avoid redundant (de)allocations on startup --- apps/opencs/model/tools/mergestages.cpp | 4 ++-- apps/opencs/model/world/data.cpp | 2 +- apps/openmw/mwrender/globalmap.cpp | 16 ++-------------- components/esm/loadland.cpp | 25 +++++++++++++++---------- components/esm/loadland.hpp | 6 +++--- 5 files changed, 23 insertions(+), 30 deletions(-) diff --git a/apps/opencs/model/tools/mergestages.cpp b/apps/opencs/model/tools/mergestages.cpp index 02fc551ab..176d35914 100644 --- a/apps/opencs/model/tools/mergestages.cpp +++ b/apps/opencs/model/tools/mergestages.cpp @@ -129,7 +129,7 @@ void CSMTools::ListLandTexturesMergeStage::perform (int stage, CSMDoc::Messages& // make sure record is loaded land.loadData (ESM::Land::DATA_VHGT | ESM::Land::DATA_VNML | - ESM::Land::DATA_VCLR | ESM::Land::DATA_VTEX | ESM::Land::DATA_WNAM); + ESM::Land::DATA_VCLR | ESM::Land::DATA_VTEX); if (const ESM::Land::LandData *data = land.getLandData (ESM::Land::DATA_VTEX)) { @@ -221,7 +221,7 @@ void CSMTools::MergeLandStage::perform (int stage, CSMDoc::Messages& messages) const CSMWorld::Land& land = record.get(); land.loadData (ESM::Land::DATA_VCLR | ESM::Land::DATA_VHGT | ESM::Land::DATA_VNML | - ESM::Land::DATA_VTEX | ESM::Land::DATA_WNAM); + ESM::Land::DATA_VTEX); CSMWorld::Land newLand (land); diff --git a/apps/opencs/model/world/data.cpp b/apps/opencs/model/world/data.cpp index 1cc4a2cbf..da4942eec 100644 --- a/apps/opencs/model/world/data.cpp +++ b/apps/opencs/model/world/data.cpp @@ -993,7 +993,7 @@ bool CSMWorld::Data::continueLoading (CSMDoc::Messages& messages) if (index!=-1/* && !mBase*/) mLand.getRecord (index).get().loadData ( ESM::Land::DATA_VHGT | ESM::Land::DATA_VNML | ESM::Land::DATA_VCLR | - ESM::Land::DATA_VTEX | ESM::Land::DATA_WNAM); + ESM::Land::DATA_VTEX); break; } diff --git a/apps/openmw/mwrender/globalmap.cpp b/apps/openmw/mwrender/globalmap.cpp index e89c3d147..50ba14770 100644 --- a/apps/openmw/mwrender/globalmap.cpp +++ b/apps/openmw/mwrender/globalmap.cpp @@ -155,16 +155,6 @@ namespace MWRender { const ESM::Land* land = esmStore.get().search (x,y); - if (land) - { - int mask = ESM::Land::DATA_WNAM; - if (!land->isDataLoaded(mask)) - land->loadData(mask); - } - - const ESM::Land::LandData *landData = - land ? land->getLandData (ESM::Land::DATA_WNAM) : 0; - for (int cellY=0; cellYmWnam[vertexY * 9 + vertexX] << 4) / 2048.f; + if (land && (land->mDataTypes & ESM::Land::DATA_WNAM)) + y2 = (land->mWnam[vertexY * 9 + vertexX] << 4) / 2048.f; else y2 = (SCHAR_MIN << 4) / 2048.f; if (y2 < 0) @@ -218,8 +208,6 @@ namespace MWRender } } loadingListener->increaseProgress(); - if (land) - land->unloadData(); } } diff --git a/components/esm/loadland.cpp b/components/esm/loadland.cpp index 277190e8c..5e33e6082 100644 --- a/components/esm/loadland.cpp +++ b/components/esm/loadland.cpp @@ -76,6 +76,9 @@ namespace ESM mContext = esm.getContext(); + mDataLoaded = 0; + mLandData = NULL; + // Skip the land data here. Load it when the cell is loaded. while (esm.hasMoreSubs()) { @@ -91,7 +94,7 @@ namespace ESM mDataTypes |= DATA_VHGT; break; case ESM::FourCC<'W','N','A','M'>::value: - esm.skipHSub(); + esm.getHExact(mWnam, sizeof(mWnam)); mDataTypes |= DATA_WNAM; break; case ESM::FourCC<'V','C','L','R'>::value: @@ -107,9 +110,6 @@ namespace ESM break; } } - - mDataLoaded = 0; - mLandData = NULL; } void Land::save(ESMWriter &esm, bool isDeleted) const @@ -159,9 +159,14 @@ namespace ESM } esm.writeHNT("VHGT", offsets, sizeof(VHGT)); } - if (mDataTypes & Land::DATA_WNAM) { - esm.writeHNT("WNAM", mLandData->mWnam, 81); - } + } + + if (mDataTypes & Land::DATA_WNAM) { + esm.writeHNT("WNAM", mWnam, 81); + } + + if (mLandData) + { if (mDataTypes & Land::DATA_VCLR) { esm.writeHNT("VCLR", mLandData->mColours, 3*LAND_NUM_VERTS); } @@ -216,9 +221,9 @@ namespace ESM } } - if (reader.isNextSub("WNAM")) { - condLoad(reader, flags, DATA_WNAM, mLandData->mWnam, 81); - } + if (reader.isNextSub("WNAM")) + reader.skipHSub(); + if (reader.isNextSub("VCLR")) condLoad(reader, flags, DATA_VCLR, mLandData->mColours, 3 * LAND_NUM_VERTS); if (reader.isNextSub("VTEX")) { diff --git a/components/esm/loadland.hpp b/components/esm/loadland.hpp index 1a39fa727..bdaf6cce8 100644 --- a/components/esm/loadland.hpp +++ b/components/esm/loadland.hpp @@ -96,14 +96,14 @@ struct Land // 24-bit RGB color for each vertex unsigned char mColours[3 * LAND_NUM_VERTS]; - // low-LOD heightmap (used for rendering the global map) - signed char mWnam[81]; - // ??? short mUnk1; uint8_t mUnk2; }; + // low-LOD heightmap (used for rendering the global map) + signed char mWnam[81]; + void load(ESMReader &esm, bool &isDeleted); void save(ESMWriter &esm, bool isDeleted = false) const;