Merge remote-tracking branch 'scrawl/ltex'

openmw-38
Marc Zinnschlag 9 years ago
commit ff5582e318

@ -257,6 +257,8 @@ void Launcher::MainDialog::changePage(QListWidgetItem *current, QListWidgetItem
bool Launcher::MainDialog::setupLauncherSettings() bool Launcher::MainDialog::setupLauncherSettings()
{ {
mLauncherSettings.clear();
mLauncherSettings.setMultiValueEnabled(true); mLauncherSettings.setMultiValueEnabled(true);
QString userPath = QString::fromUtf8(mCfgMgr.getUserConfigPath().string().c_str()); QString userPath = QString::fromUtf8(mCfgMgr.getUserConfigPath().string().c_str());
@ -289,6 +291,8 @@ bool Launcher::MainDialog::setupLauncherSettings()
bool Launcher::MainDialog::setupGameSettings() bool Launcher::MainDialog::setupGameSettings()
{ {
mGameSettings.clear();
QString userPath = QString::fromUtf8(mCfgMgr.getUserConfigPath().string().c_str()); QString userPath = QString::fromUtf8(mCfgMgr.getUserConfigPath().string().c_str());
QString globalPath = QString::fromUtf8(mCfgMgr.getGlobalPath().string().c_str()); QString globalPath = QString::fromUtf8(mCfgMgr.getGlobalPath().string().c_str());
@ -384,6 +388,9 @@ bool Launcher::MainDialog::setupGraphicsSettings()
// remain consistent, and possibly be merged into a shared component. At the very least // remain consistent, and possibly be merged into a shared component. At the very least
// the filenames should be in the CfgMgr component. // the filenames should be in the CfgMgr component.
// Ensure to clear previous settings in case we had already loaded settings.
mEngineSettings.clear();
// Create the settings manager and load default settings file // Create the settings manager and load default settings file
const std::string localDefault = (mCfgMgr.getLocalPath() / "settings-default.cfg").string(); const std::string localDefault = (mCfgMgr.getLocalPath() / "settings-default.cfg").string();
const std::string globalDefault = (mCfgMgr.getGlobalPath() / "settings-default.cfg").string(); const std::string globalDefault = (mCfgMgr.getGlobalPath() / "settings-default.cfg").string();

@ -37,9 +37,7 @@ namespace CSVRender
return ltex; return ltex;
} }
std::stringstream error; return NULL;
error << "Can't find LandTexture " << index << " from plugin " << plugin;
throw std::runtime_error(error.str());
} }
void TerrainStorage::getBounds(float &minX, float &maxX, float &minY, float &maxY) void TerrainStorage::getBounds(float &minX, float &maxX, float &minY, float &maxY)

@ -926,7 +926,7 @@ namespace MWMechanics
PtrActorMap::iterator iter = mActors.begin(); PtrActorMap::iterator iter = mActors.begin();
while(iter != mActors.end()) while(iter != mActors.end())
{ {
if(iter->first.getCell()==cellStore && iter->first != ignore) if((iter->first.isInCell() && iter->first.getCell()==cellStore) && iter->first != ignore)
{ {
delete iter->second; delete iter->second;
mActors.erase(iter++); mActors.erase(iter++);

@ -185,7 +185,7 @@ void RippleSimulation::removeCell(const MWWorld::CellStore *store)
{ {
for (std::vector<Emitter>::iterator it = mEmitters.begin(); it != mEmitters.end();) for (std::vector<Emitter>::iterator it = mEmitters.begin(); it != mEmitters.end();)
{ {
if (it->mPtr.getCell() == store && it->mPtr != MWMechanics::getPlayer()) if ((it->mPtr.isInCell() && it->mPtr.getCell() == store) && it->mPtr != MWMechanics::getPlayer())
{ {
it = mEmitters.erase(it); it = mEmitters.erase(it);
} }

@ -69,7 +69,7 @@ namespace MWRender
{ {
const MWWorld::ESMStore &esmStore = const MWWorld::ESMStore &esmStore =
MWBase::Environment::get().getWorld()->getStore(); MWBase::Environment::get().getWorld()->getStore();
return esmStore.get<ESM::LandTexture>().find(index, plugin); return esmStore.get<ESM::LandTexture>().search(index, plugin);
} }
} }

@ -32,6 +32,12 @@ void ESMStore::load(ESM::ESMReader &esm, Loading::Listener* listener)
ESM::Dialogue *dialogue = 0; ESM::Dialogue *dialogue = 0;
// Land texture loading needs to use a separate internal store for each plugin.
// We set the number of plugins here to avoid continual resizes during loading,
// and so we can properly verify if valid plugin indices are being passed to the
// LandTexture Store retrieval methods.
mLandTextures.resize(esm.getGlobalReaderList()->size());
/// \todo Move this to somewhere else. ESMReader? /// \todo Move this to somewhere else. ESMReader?
// Cache parent esX files by tracking their indices in the global list of // Cache parent esX files by tracking their indices in the global list of
// all files/readers used by the engine. This will greaty accelerate // all files/readers used by the engine. This will greaty accelerate

@ -351,8 +351,9 @@ namespace MWWorld
assert(plugin < mStatic.size()); assert(plugin < mStatic.size());
const LandTextureList &ltexl = mStatic[plugin]; const LandTextureList &ltexl = mStatic[plugin];
assert(index < ltexl.size()); if (index >= ltexl.size())
return &ltexl.at(index); return NULL;
return &ltexl[index];
} }
const ESM::LandTexture *Store<ESM::LandTexture>::find(size_t index, size_t plugin) const const ESM::LandTexture *Store<ESM::LandTexture>::find(size_t index, size_t plugin) const
{ {
@ -380,10 +381,8 @@ namespace MWWorld
lt.load(esm, isDeleted); lt.load(esm, isDeleted);
// Make sure we have room for the structure assert(plugin < mStatic.size());
if (plugin >= mStatic.size()) {
mStatic.resize(plugin+1);
}
LandTextureList &ltexl = mStatic[plugin]; LandTextureList &ltexl = mStatic[plugin];
if(lt.mIndex + 1 > (int)ltexl.size()) if(lt.mIndex + 1 > (int)ltexl.size())
ltexl.resize(lt.mIndex+1); ltexl.resize(lt.mIndex+1);
@ -407,6 +406,11 @@ namespace MWWorld
assert(plugin < mStatic.size()); assert(plugin < mStatic.size());
return mStatic[plugin].end(); return mStatic[plugin].end();
} }
void Store<ESM::LandTexture>::resize(size_t num)
{
if (mStatic.size() < num)
mStatic.resize(num);
}
// Land // Land
//========================================================================= //=========================================================================

@ -210,6 +210,9 @@ namespace MWWorld
const ESM::LandTexture *search(size_t index, size_t plugin) const; const ESM::LandTexture *search(size_t index, size_t plugin) const;
const ESM::LandTexture *find(size_t index, size_t plugin) const; const ESM::LandTexture *find(size_t index, size_t plugin) const;
/// Resize the internal store to hold at least \a num plugins.
void resize(size_t num);
size_t getSize() const; size_t getSize() const;
size_t getSize(size_t plugin) const; size_t getSize(size_t plugin) const;

@ -2281,7 +2281,7 @@ namespace MWWorld
{ {
if (!targetActor.getRefData().isEnabled() || !actor.getRefData().isEnabled()) if (!targetActor.getRefData().isEnabled() || !actor.getRefData().isEnabled())
return false; // cannot get LOS unless both NPC's are enabled return false; // cannot get LOS unless both NPC's are enabled
if (!targetActor.getRefData().getBaseNode() || !targetActor.getRefData().getBaseNode()) if (!targetActor.getRefData().getBaseNode() || !actor.getRefData().getBaseNode())
return false; // not in active cell return false; // not in active cell
return mPhysics->getLineOfSight(actor, targetActor); return mPhysics->getLineOfSight(actor, targetActor);

@ -454,3 +454,11 @@ QStringList Config::GameSettings::getContentList() const
return Config::LauncherSettings::reverse(values(sContentKey)); return Config::LauncherSettings::reverse(values(sContentKey));
} }
void Config::GameSettings::clear()
{
mSettings.clear();
mUserSettings.clear();
mDataDirs.clear();
mDataLocal.clear();
}

@ -72,6 +72,8 @@ namespace Config
void setContentList(const QStringList& fileNames); void setContentList(const QStringList& fileNames);
QStringList getContentList() const; QStringList getContentList() const;
void clear();
private: private:
Files::ConfigurationManager &mCfgMgr; Files::ConfigurationManager &mCfgMgr;

@ -101,6 +101,11 @@ namespace Config
return true; return true;
} }
void clear()
{
mSettings.clear();
}
private: private:
Map mSettings; Map mSettings;

@ -1,6 +1,7 @@
#include "storage.hpp" #include "storage.hpp"
#include <set> #include <set>
#include <iostream>
#include <osg/Image> #include <osg/Image>
#include <osg/Plane> #include <osg/Plane>
@ -299,11 +300,17 @@ namespace ESMTerrain
std::string Storage::getTextureName(UniqueTextureId id) std::string Storage::getTextureName(UniqueTextureId id)
{ {
static const std::string defaultTexture = "textures\\_land_default.dds";
if (id.first == 0) if (id.first == 0)
return "textures\\_land_default.dds"; // Not sure if the default texture really is hardcoded? return defaultTexture; // Not sure if the default texture really is hardcoded?
// NB: All vtex ids are +1 compared to the ltex ids // NB: All vtex ids are +1 compared to the ltex ids
const ESM::LandTexture* ltex = getLandTexture(id.first-1, id.second); const ESM::LandTexture* ltex = getLandTexture(id.first-1, id.second);
if (!ltex)
{
std::cerr << "Unable to find land texture index " << id.first-1 << " in plugin " << id.second << ", using default texture instead" << std::endl;
return defaultTexture;
}
// this is needed due to MWs messed up texture handling // this is needed due to MWs messed up texture handling
std::string texture = Misc::ResourceHelpers::correctTexturePath(ltex->mTexture, mVFS); std::string texture = Misc::ResourceHelpers::correctTexturePath(ltex->mTexture, mVFS);

@ -353,6 +353,13 @@ private:
int mLine; int mLine;
}; };
void Manager::clear()
{
mDefaultSettings.clear();
mUserSettings.clear();
mChangedSettings.clear();
}
void Manager::loadDefault(const std::string &file) void Manager::loadDefault(const std::string &file)
{ {
SettingsFileParser parser; SettingsFileParser parser;

@ -23,6 +23,9 @@ namespace Settings
static CategorySettingVector mChangedSettings; static CategorySettingVector mChangedSettings;
///< tracks all the settings that were changed since the last apply() call ///< tracks all the settings that were changed since the last apply() call
void clear();
///< clears all settings and default settings
void loadDefault (const std::string& file); void loadDefault (const std::string& file);
///< load file as the default settings (can be overridden by user settings) ///< load file as the default settings (can be overridden by user settings)

Loading…
Cancel
Save