From 27d4fe9ee18df12cf3559fe7cf77253af5e4a828 Mon Sep 17 00:00:00 2001 From: Capostrophic Date: Sat, 4 Apr 2020 16:39:32 +0300 Subject: [PATCH 1/2] Fix ESM::Land oversights --- components/esm/loadland.cpp | 45 +++++++++++++++++-------------------- 1 file changed, 21 insertions(+), 24 deletions(-) diff --git a/components/esm/loadland.cpp b/components/esm/loadland.cpp index 6fbc6735a..85ebc2c9a 100644 --- a/components/esm/loadland.cpp +++ b/components/esm/loadland.cpp @@ -75,6 +75,8 @@ namespace ESM mContext = esm.getContext(); mLandData = nullptr; + for (int i = 0; i < LAND_GLOBAL_MAP_LOD_SIZE; ++i) + mWnam[i] = 0; // Skip the land data here. Load it when the cell is loaded. while (esm.hasMoreSubs()) @@ -156,30 +158,25 @@ namespace ESM } esm.writeHNT("VHGT", offsets, sizeof(VHGT)); } - } - - if (mDataTypes & Land::DATA_WNAM) - { - // Generate WNAM record - signed char wnam[LAND_GLOBAL_MAP_LOD_SIZE]; - float max = std::numeric_limits::max(); - float min = std::numeric_limits::min(); - float vertMult = static_cast(ESM::Land::LAND_SIZE - 1) / LAND_GLOBAL_MAP_LOD_SIZE_SQRT; - for (int row = 0; row < LAND_GLOBAL_MAP_LOD_SIZE_SQRT; ++row) + if (mDataTypes & Land::DATA_WNAM) { - for (int col = 0; col < LAND_GLOBAL_MAP_LOD_SIZE_SQRT; ++col) + // Generate WNAM record + signed char wnam[LAND_GLOBAL_MAP_LOD_SIZE]; + float max = std::numeric_limits::max(); + float min = std::numeric_limits::min(); + float vertMult = static_cast(ESM::Land::LAND_SIZE - 1) / LAND_GLOBAL_MAP_LOD_SIZE_SQRT; + for (int row = 0; row < LAND_GLOBAL_MAP_LOD_SIZE_SQRT; ++row) { - float height = mLandData->mHeights[int(row * vertMult) * ESM::Land::LAND_SIZE + int(col * vertMult)]; - height /= height > 0 ? 128.f : 16.f; - height = std::min(max, std::max(min, height)); - wnam[row * LAND_GLOBAL_MAP_LOD_SIZE_SQRT + col] = static_cast(height); + for (int col = 0; col < LAND_GLOBAL_MAP_LOD_SIZE_SQRT; ++col) + { + float height = mLandData->mHeights[int(row * vertMult) * ESM::Land::LAND_SIZE + int(col * vertMult)]; + height /= height > 0 ? 128.f : 16.f; + height = std::min(max, std::max(min, height)); + wnam[row * LAND_GLOBAL_MAP_LOD_SIZE_SQRT + col] = static_cast(height); + } } + esm.writeHNT("WNAM", wnam); } - esm.writeHNT("WNAM", wnam); - } - - if (mLandData) - { if (mDataTypes & Land::DATA_VCLR) { esm.writeHNT("VCLR", mLandData->mColours); } @@ -197,7 +194,7 @@ namespace ESM mPlugin = 0; for (int i = 0; i < LAND_GLOBAL_MAP_LOD_SIZE; ++i) - mWnam[0] = 0; + mWnam[i] = 0; if (!mLandData) mLandData = new LandData; @@ -338,7 +335,7 @@ namespace ESM Land::Land (const Land& land) : mFlags (land.mFlags), mX (land.mX), mY (land.mY), mPlugin (land.mPlugin), mContext (land.mContext), mDataTypes (land.mDataTypes), - mLandData (land.mLandData ? new LandData (*land.mLandData) : 0) + mLandData (land.mLandData ? new LandData (*land.mLandData) : nullptr) { std::copy(land.mWnam, land.mWnam + LAND_GLOBAL_MAP_LOD_SIZE, mWnam); } @@ -364,7 +361,7 @@ namespace ESM const Land::LandData *Land::getLandData (int flags) const { if (!(flags & mDataTypes)) - return 0; + return nullptr; loadData (flags); return mLandData; @@ -400,7 +397,7 @@ namespace ESM if (!mLandData->mDataLoaded) { delete mLandData; - mLandData = 0; + mLandData = nullptr; } } } From 5732b8e026542cdda5f8070b7b61f7872a88fa68 Mon Sep 17 00:00:00 2001 From: Capostrophic Date: Sat, 4 Apr 2020 17:53:36 +0300 Subject: [PATCH 2/2] Use std::fill instead of loops to reset some arrays to defaults --- components/esm/loadland.cpp | 19 +++++-------------- 1 file changed, 5 insertions(+), 14 deletions(-) diff --git a/components/esm/loadland.cpp b/components/esm/loadland.cpp index 85ebc2c9a..3064d0c31 100644 --- a/components/esm/loadland.cpp +++ b/components/esm/loadland.cpp @@ -75,8 +75,7 @@ namespace ESM mContext = esm.getContext(); mLandData = nullptr; - for (int i = 0; i < LAND_GLOBAL_MAP_LOD_SIZE; ++i) - mWnam[i] = 0; + std::fill(std::begin(mWnam), std::end(mWnam), 0); // Skip the land data here. Load it when the cell is loaded. while (esm.hasMoreSubs()) @@ -193,15 +192,13 @@ namespace ESM { mPlugin = 0; - for (int i = 0; i < LAND_GLOBAL_MAP_LOD_SIZE; ++i) - mWnam[i] = 0; + std::fill(std::begin(mWnam), std::end(mWnam), 0); if (!mLandData) mLandData = new LandData; mLandData->mHeightOffset = 0; - for (int i = 0; i < LAND_NUM_VERTS; ++i) - mLandData->mHeights[i] = 0; + std::fill(std::begin(mLandData->mHeights), std::end(mLandData->mHeights), 0); mLandData->mMinHeight = 0; mLandData->mMaxHeight = 0; for (int i = 0; i < LAND_NUM_VERTS; ++i) @@ -210,14 +207,8 @@ namespace ESM mLandData->mNormals[i*3+1] = 0; mLandData->mNormals[i*3+2] = 127; } - for (int i = 0; i < LAND_NUM_TEXTURES; ++i) - mLandData->mTextures[i] = 0; - for (int i = 0; i < LAND_NUM_VERTS; ++i) - { - mLandData->mColours[i*3+0] = 255; - mLandData->mColours[i*3+1] = 255; - mLandData->mColours[i*3+2] = 255; - } + std::fill(std::begin(mLandData->mTextures), std::end(mLandData->mTextures), 0); + std::fill(std::begin(mLandData->mColours), std::end(mLandData->mColours), 255); mLandData->mUnk1 = 0; mLandData->mUnk2 = 0; mLandData->mDataLoaded = Land::DATA_VNML | Land::DATA_VHGT | Land::DATA_WNAM |