void Land::loadData(int flags) const { OpenThreads::ScopedLock<OpenThreads::Mutex> lock(mMutex); // Try to load only available data flags = flags & mDataTypes; // Return if all required data is loaded if ((mDataLoaded & flags) == flags) { return; } // Create storage if nothing is loaded if (mLandData == NULL) { mLandData = new LandData; mLandData->mDataTypes = mDataTypes; } ESM::ESMReader reader; reader.restoreContext(mContext); if (reader.isNextSub("VNML")) { condLoad(reader, flags, DATA_VNML, mLandData->mNormals, sizeof(mLandData->mNormals)); } if (reader.isNextSub("VHGT")) { static VHGT vhgt; if (condLoad(reader, flags, DATA_VHGT, &vhgt, sizeof(vhgt))) { float rowOffset = vhgt.mHeightOffset; for (int y = 0; y < LAND_SIZE; y++) { rowOffset += vhgt.mHeightData[y * LAND_SIZE]; mLandData->mHeights[y * LAND_SIZE] = rowOffset * HEIGHT_SCALE; float colOffset = rowOffset; for (int x = 1; x < LAND_SIZE; x++) { colOffset += vhgt.mHeightData[y * LAND_SIZE + x]; mLandData->mHeights[x + y * LAND_SIZE] = colOffset * HEIGHT_SCALE; } } mLandData->mUnk1 = vhgt.mUnk1; mLandData->mUnk2 = vhgt.mUnk2; } } if (reader.isNextSub("WNAM")) { condLoad(reader, flags, DATA_WNAM, mLandData->mWnam, 81); } if (reader.isNextSub("VCLR")) condLoad(reader, flags, DATA_VCLR, mLandData->mColours, 3 * LAND_NUM_VERTS); if (reader.isNextSub("VTEX")) { static uint16_t vtex[LAND_NUM_TEXTURES]; if (condLoad(reader, flags, DATA_VTEX, vtex, sizeof(vtex))) { LandData::transposeTextureData(vtex, mLandData->mTextures); } } }
/// \todo remove memory allocation when only defaults needed void Land::loadData(int flags) { // Try to load only available data int actual = flags & mDataTypes; // Return if all required data is loaded if (flags == 0 || (actual != 0 && (mDataLoaded & actual) == actual)) { return; } // Create storage if nothing is loaded if (mLandData == NULL) { mLandData = new LandData; mLandData->mDataTypes = mDataTypes; } mEsm->restoreContext(mContext); memset(mLandData->mNormals, 0, sizeof(mLandData->mNormals)); if (mEsm->isNextSub("VNML")) { condLoad(actual, DATA_VNML, mLandData->mNormals, sizeof(mLandData->mNormals)); } if (mEsm->isNextSub("VHGT")) { static VHGT vhgt; if (condLoad(actual, DATA_VHGT, &vhgt, sizeof(vhgt))) { float rowOffset = vhgt.mHeightOffset; for (int y = 0; y < LAND_SIZE; y++) { rowOffset += vhgt.mHeightData[y * LAND_SIZE]; mLandData->mHeights[y * LAND_SIZE] = rowOffset * HEIGHT_SCALE; float colOffset = rowOffset; for (int x = 1; x < LAND_SIZE; x++) { colOffset += vhgt.mHeightData[y * LAND_SIZE + x]; mLandData->mHeights[x + y * LAND_SIZE] = colOffset * HEIGHT_SCALE; } } mLandData->mUnk1 = vhgt.mUnk1; mLandData->mUnk2 = vhgt.mUnk2; } } else if ((flags & DATA_VHGT) && (mDataLoaded & DATA_VHGT) == 0) { for (int i = 0; i < LAND_NUM_VERTS; ++i) { mLandData->mHeights[i] = -256.0f * HEIGHT_SCALE; } mDataLoaded |= DATA_VHGT; } if (mEsm->isNextSub("WNAM")) { condLoad(actual, DATA_WNAM, mLandData->mWnam, 81); } if (mEsm->isNextSub("VCLR")) { mLandData->mUsingColours = true; condLoad(actual, DATA_VCLR, mLandData->mColours, 3 * LAND_NUM_VERTS); } else { mLandData->mUsingColours = false; } if (mEsm->isNextSub("VTEX")) { static uint16_t vtex[LAND_NUM_TEXTURES]; if (condLoad(actual, DATA_VTEX, vtex, sizeof(vtex))) { LandData::transposeTextureData(vtex, mLandData->mTextures); } } else if ((flags & DATA_VTEX) && (mDataLoaded & DATA_VTEX) == 0) { memset(mLandData->mTextures, 0, sizeof(mLandData->mTextures)); mDataLoaded |= DATA_VTEX; } }