integrated insertObject function into class hierarchy

pull/7/head
Marc Zinnschlag 15 years ago
parent 1d91ac9d9e
commit de2eeb4cde

@ -2,6 +2,9 @@
#include <cassert> #include <cassert>
#include "../mwworld/class.hpp"
#include "../mwworld/ptr.hpp"
using namespace MWRender; using namespace MWRender;
template<typename T> template<typename T>
@ -59,37 +62,45 @@ void insertObj(CellRenderImp& cellRender, ESMS::LiveCellRef<ESM::NPC, MWWorld::R
} }
template<typename T> template<typename T>
void insertCellRefList (CellRenderImp& cellRender, const ESMS::ESMStore& store, T& cellRefList) void insertCellRefList (CellRenderImp& cellRender, MWWorld::Environment& environment,
T& cellRefList, ESMS::CellStore<MWWorld::RefData> &cell)
{ {
for(typename T::List::iterator it = cellRefList.list.begin(); if (!cellRefList.list.empty())
it != cellRefList.list.end(); it++)
{ {
if (it->mData.getCount()) const MWWorld::Class& class_ =
insertObj (cellRender, *it, store); MWWorld::Class::get (MWWorld::Ptr (&*cellRefList.list.begin(), &cell));
for (typename T::List::iterator it = cellRefList.list.begin();
it != cellRefList.list.end(); it++)
{
if (it->mData.getCount())
class_.insertObj (MWWorld::Ptr (&*it, &cell), cellRender, environment);
}
} }
} }
void CellRenderImp::insertCell(ESMS::CellStore<MWWorld::RefData> &cell, const ESMS::ESMStore& store) void CellRenderImp::insertCell(ESMS::CellStore<MWWorld::RefData> &cell,
MWWorld::Environment& environment)
{ {
// Loop through all references in the cell // Loop through all references in the cell
insertCellRefList (*this, store, cell.activators); insertCellRefList (*this, environment, cell.activators, cell);
insertCellRefList (*this, store, cell.potions); insertCellRefList (*this, environment, cell.potions, cell);
insertCellRefList (*this, store, cell.appas); insertCellRefList (*this, environment, cell.appas, cell);
insertCellRefList (*this, store, cell.armors); insertCellRefList (*this, environment, cell.armors, cell);
insertCellRefList (*this, store, cell.books); insertCellRefList (*this, environment, cell.books, cell);
insertCellRefList (*this, store, cell.clothes); insertCellRefList (*this, environment, cell.clothes, cell);
insertCellRefList (*this, store, cell.containers); insertCellRefList (*this, environment, cell.containers, cell);
insertCellRefList (*this, store, cell.creatures); insertCellRefList (*this, environment, cell.creatures, cell);
insertCellRefList (*this, store, cell.doors); insertCellRefList (*this, environment, cell.doors, cell);
insertCellRefList (*this, store, cell.ingreds); insertCellRefList (*this, environment, cell.ingreds, cell);
// insertCellRefList (*this, store, cell.creatureLists); // insertCellRefList (*this, environment, cell.creatureLists, cell);
// insertCellRefList (*this, store, cell.itemLists); // insertCellRefList (*this, environment, cell.itemLists, cell);
insertCellRefList (*this, store, cell.lights); insertCellRefList (*this, environment, cell.lights, cell);
insertCellRefList (*this, store, cell.lockpicks); insertCellRefList (*this, environment, cell.lockpicks, cell);
insertCellRefList (*this, store, cell.miscItems); insertCellRefList (*this, environment, cell.miscItems, cell);
insertCellRefList (*this, store, cell.npcs); insertCellRefList (*this, environment, cell.npcs, cell);
insertCellRefList (*this, store, cell.probes); insertCellRefList (*this, environment, cell.probes, cell);
insertCellRefList (*this, store, cell.repairs); insertCellRefList (*this, environment, cell.repairs, cell);
insertCellRefList (*this, store, cell.statics); insertCellRefList (*this, environment, cell.statics, cell);
insertCellRefList (*this, store, cell.weapons); insertCellRefList (*this, environment, cell.weapons, cell);
} }

@ -12,9 +12,9 @@ namespace ESM
class CellRef; class CellRef;
} }
namespace ESMS namespace MWWorld
{ {
class ESMStore; class Environment;
} }
namespace MWRender namespace MWRender
@ -33,14 +33,14 @@ namespace MWRender
/// insert a mesh related to the most recent insertBegin call. /// insert a mesh related to the most recent insertBegin call.
virtual void insertMesh(const std::string &mesh) = 0; virtual void insertMesh(const std::string &mesh) = 0;
/// insert a light related to the most recent insertBegin call. /// insert a light related to the most recent insertBegin call.
virtual void insertLight(float r, float g, float b, float radius) = 0; virtual void insertLight(float r, float g, float b, float radius) = 0;
/// finish inserting a new reference and return a handle to it. /// finish inserting a new reference and return a handle to it.
virtual std::string insertEnd (bool Enable) = 0; virtual std::string insertEnd (bool Enable) = 0;
void insertCell(ESMS::CellStore<MWWorld::RefData> &cell, const ESMS::ESMStore& store); void insertCell(ESMS::CellStore<MWWorld::RefData> &cell, MWWorld::Environment& environment);
}; };
} }

@ -174,19 +174,12 @@ void InteriorCellRender::setAmbientMode()
void InteriorCellRender::show() void InteriorCellRender::show()
{ {
// If already loaded, just make the cell visible.
if(base)
{
base->setVisible(true);
return;
}
base = scene.getRoot()->createChildSceneNode(); base = scene.getRoot()->createChildSceneNode();
configureAmbient(); configureAmbient();
configureFog(); configureFog();
insertCell(cell, store); insertCell(cell, mEnvironment);
} }
void InteriorCellRender::hide() void InteriorCellRender::hide()

@ -3,7 +3,6 @@
#include "cell.hpp" #include "cell.hpp"
#include "cellimp.hpp" #include "cellimp.hpp"
#include "components/esm_store/cell_store.hpp"
#include "OgreColourValue.h" #include "OgreColourValue.h"
@ -12,6 +11,11 @@ namespace Ogre
class SceneNode; class SceneNode;
} }
namespace MWWorld
{
class Environment;
}
namespace MWRender namespace MWRender
{ {
class MWScene; class MWScene;
@ -43,7 +47,7 @@ namespace MWRender
static bool lightOutQuadInLin; static bool lightOutQuadInLin;
ESMS::CellStore<MWWorld::RefData> &cell; ESMS::CellStore<MWWorld::RefData> &cell;
const ESMS::ESMStore &store; MWWorld::Environment &mEnvironment;
MWScene &scene; MWScene &scene;
/// The scene node that contains all objects belonging to this /// The scene node that contains all objects belonging to this
@ -79,8 +83,9 @@ namespace MWRender
public: public:
InteriorCellRender(ESMS::CellStore<MWWorld::RefData> &_cell, const ESMS::ESMStore& _store, MWScene &_scene) InteriorCellRender(ESMS::CellStore<MWWorld::RefData> &_cell, MWWorld::Environment& environment,
: cell(_cell), store(_store), scene(_scene), base(NULL), insert(NULL), ambientMode (0) {} MWScene &_scene)
: cell(_cell), mEnvironment (environment), scene(_scene), base(NULL), insert(NULL), ambientMode (0) {}
virtual ~InteriorCellRender() { destroy(); } virtual ~InteriorCellRender() { destroy(); }

@ -14,6 +14,12 @@ namespace MWWorld
Class::~Class() {} Class::~Class() {}
void Class::insertObj (const Ptr& ptr, MWRender::CellRenderImp& cellRender,
MWWorld::Environment& environment) const
{
}
MWMechanics::CreatureStats& Class::getCreatureStats (const Ptr& ptr) const MWMechanics::CreatureStats& Class::getCreatureStats (const Ptr& ptr) const
{ {
throw std::runtime_error ("class does not have creature stats"); throw std::runtime_error ("class does not have creature stats");

@ -10,6 +10,11 @@
#include "containerstore.hpp" #include "containerstore.hpp"
#include "refdata.hpp" #include "refdata.hpp"
namespace MWRender
{
class CellRenderImp;
}
namespace MWMechanics namespace MWMechanics
{ {
struct CreatureStats; struct CreatureStats;
@ -18,6 +23,7 @@ namespace MWMechanics
namespace MWWorld namespace MWWorld
{ {
class Ptr; class Ptr;
class Environment;
/// \brief Base class for referenceable esm records /// \brief Base class for referenceable esm records
class Class class Class
@ -36,6 +42,10 @@ namespace MWWorld
virtual ~Class(); virtual ~Class();
virtual void insertObj (const Ptr& ptr, MWRender::CellRenderImp& cellRender,
MWWorld::Environment& environment) const;
///< Add reference into a cell for rendering (default implementation: don't render anything).
virtual std::string getName (const Ptr& ptr) const = 0; virtual std::string getName (const Ptr& ptr) const = 0;
///< \return name (the one that is to be presented to the user; not the internal one); ///< \return name (the one that is to be presented to the user; not the internal one);
/// can return an empty string. /// can return an empty string.

@ -537,6 +537,7 @@ namespace MWWorld
active->second->destroy(); active->second->destroy();
delete active->second; delete active->second;
mActiveCells.erase (active); mActiveCells.erase (active);
// TODO remove sounds
} }
// register local scripts // register local scripts
@ -551,7 +552,7 @@ namespace MWWorld
// This connects the cell data with the rendering scene. // This connects the cell data with the rendering scene.
std::pair<CellRenderCollection::iterator, bool> result = std::pair<CellRenderCollection::iterator, bool> result =
mActiveCells.insert (std::make_pair (cell, mActiveCells.insert (std::make_pair (cell,
new MWRender::InteriorCellRender (*cell, mStore, mScene))); new MWRender::InteriorCellRender (*cell, mEnvironment, mScene)));
if (result.second) if (result.second)
{ {

Loading…
Cancel
Save