mirror of
https://github.com/TES3MP/openmw-tes3mp.git
synced 2025-03-30 09:06:43 +00:00
Use typedefs for some maps and some cleanup
This commit is contained in:
parent
3053440462
commit
8361192b64
2 changed files with 80 additions and 62 deletions
|
@ -6,41 +6,42 @@
|
||||||
#include "renderconst.hpp"
|
#include "renderconst.hpp"
|
||||||
|
|
||||||
|
|
||||||
using namespace Ogre;
|
namespace MWRender
|
||||||
using namespace MWRender;
|
{
|
||||||
using namespace NifOgre;
|
|
||||||
|
|
||||||
Actors::~Actors(){
|
Actors::~Actors(){
|
||||||
|
|
||||||
std::map<MWWorld::Ptr, Animation*>::iterator it = mAllActors.begin();
|
PtrAnimationMap::iterator it = mAllActors.begin();
|
||||||
for (; it != mAllActors.end(); ++it) {
|
for(;it != mAllActors.end();++it)
|
||||||
|
{
|
||||||
delete it->second;
|
delete it->second;
|
||||||
it->second = NULL;
|
it->second = NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Actors::setMwRoot(Ogre::SceneNode* root){
|
void Actors::setMwRoot(Ogre::SceneNode* root)
|
||||||
mMwRoot = root;
|
{ mMwRoot = root; }
|
||||||
}
|
|
||||||
void Actors::insertNPC(const MWWorld::Ptr& ptr, MWWorld::InventoryStore& inv){
|
|
||||||
|
|
||||||
|
void Actors::insertNPC(const MWWorld::Ptr &ptr, MWWorld::InventoryStore &inv)
|
||||||
|
{
|
||||||
insertBegin(ptr, true, true);
|
insertBegin(ptr, true, true);
|
||||||
NpcAnimation* anim = new MWRender::NpcAnimation(ptr, ptr.getRefData ().getBaseNode (), inv, RV_Actors);
|
NpcAnimation* anim = new MWRender::NpcAnimation(ptr, ptr.getRefData ().getBaseNode (), inv, RV_Actors);
|
||||||
|
|
||||||
mAllActors[ptr] = anim;
|
mAllActors[ptr] = anim;
|
||||||
}
|
}
|
||||||
void Actors::insertBegin (const MWWorld::Ptr& ptr, bool enabled, bool static_){
|
|
||||||
|
void Actors::insertBegin (const MWWorld::Ptr& ptr, bool enabled, bool static_)
|
||||||
|
{
|
||||||
Ogre::SceneNode* cellnode;
|
Ogre::SceneNode* cellnode;
|
||||||
if(mCellSceneNodes.find(ptr.getCell()) == mCellSceneNodes.end())
|
CellSceneNodeMap::const_iterator celliter = mCellSceneNodes.find(ptr.getCell());
|
||||||
|
if(celliter != mCellSceneNodes.end())
|
||||||
|
cellnode = celliter->second;
|
||||||
|
else
|
||||||
{
|
{
|
||||||
//Create the scenenode and put it in the map
|
//Create the scenenode and put it in the map
|
||||||
cellnode = mMwRoot->createChildSceneNode();
|
cellnode = mMwRoot->createChildSceneNode();
|
||||||
mCellSceneNodes[ptr.getCell()] = cellnode;
|
mCellSceneNodes[ptr.getCell()] = cellnode;
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
cellnode = mCellSceneNodes[ptr.getCell()];
|
|
||||||
}
|
|
||||||
|
|
||||||
Ogre::SceneNode* insert = cellnode->createChildSceneNode();
|
Ogre::SceneNode* insert = cellnode->createChildSceneNode();
|
||||||
const float *f = ptr.getRefData().getPosition().pos;
|
const float *f = ptr.getRefData().getPosition().pos;
|
||||||
|
@ -51,13 +52,13 @@ void Actors::insertBegin (const MWWorld::Ptr& ptr, bool enabled, bool static_){
|
||||||
f = ptr.getCellRef().mPos.rot;
|
f = ptr.getCellRef().mPos.rot;
|
||||||
|
|
||||||
// Rotate around X axis
|
// Rotate around X axis
|
||||||
Quaternion xr(Radian(-f[0]), Vector3::UNIT_X);
|
Ogre::Quaternion xr(Ogre::Radian(-f[0]), Ogre::Vector3::UNIT_X);
|
||||||
|
|
||||||
// Rotate around Y axis
|
// Rotate around Y axis
|
||||||
Quaternion yr(Radian(-f[1]), Vector3::UNIT_Y);
|
Ogre::Quaternion yr(Ogre::Radian(-f[1]), Ogre::Vector3::UNIT_Y);
|
||||||
|
|
||||||
// Rotate around Z axis
|
// Rotate around Z axis
|
||||||
Quaternion zr(Radian(-f[2]), Vector3::UNIT_Z);
|
Ogre::Quaternion zr(Ogre::Radian(-f[2]), Ogre::Vector3::UNIT_Z);
|
||||||
|
|
||||||
// Rotates first around z, then y, then x
|
// Rotates first around z, then y, then x
|
||||||
insert->setOrientation(xr*yr*zr);
|
insert->setOrientation(xr*yr*zr);
|
||||||
|
@ -71,30 +72,30 @@ void Actors::insertCreature (const MWWorld::Ptr& ptr){
|
||||||
|
|
||||||
insertBegin(ptr, true, true);
|
insertBegin(ptr, true, true);
|
||||||
CreatureAnimation* anim = new MWRender::CreatureAnimation(ptr);
|
CreatureAnimation* anim = new MWRender::CreatureAnimation(ptr);
|
||||||
//mAllActors.insert(std::pair<MWWorld::Ptr, Animation*>(ptr,anim));
|
|
||||||
delete mAllActors[ptr];
|
delete mAllActors[ptr];
|
||||||
mAllActors[ptr] = anim;
|
mAllActors[ptr] = anim;
|
||||||
//mAllActors.push_back(&anim);*/
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Actors::deleteObject (const MWWorld::Ptr& ptr)
|
bool Actors::deleteObject (const MWWorld::Ptr& ptr)
|
||||||
{
|
{
|
||||||
delete mAllActors[ptr];
|
delete mAllActors[ptr];
|
||||||
mAllActors.erase(ptr);
|
mAllActors.erase(ptr);
|
||||||
if (Ogre::SceneNode *base = ptr.getRefData().getBaseNode())
|
|
||||||
|
if(Ogre::SceneNode *base=ptr.getRefData().getBaseNode())
|
||||||
{
|
{
|
||||||
|
|
||||||
Ogre::SceneNode *parent = base->getParentSceneNode();
|
Ogre::SceneNode *parent = base->getParentSceneNode();
|
||||||
|
CellSceneNodeMap::const_iterator iter(mCellSceneNodes.begin());
|
||||||
for (std::map<MWWorld::Ptr::CellStore *, Ogre::SceneNode *>::const_iterator iter (
|
for(;iter != mCellSceneNodes.end();++iter)
|
||||||
mCellSceneNodes.begin()); iter!=mCellSceneNodes.end(); ++iter)
|
{
|
||||||
if (iter->second==parent)
|
if(iter->second == parent)
|
||||||
{
|
{
|
||||||
base->removeAndDestroyAllChildren();
|
base->removeAndDestroyAllChildren();
|
||||||
mRend.getScene()->destroySceneNode (base);
|
mRend.getScene()->destroySceneNode (base);
|
||||||
ptr.getRefData().setBaseNode (0);
|
ptr.getRefData().setBaseNode (0);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -102,57 +103,70 @@ bool Actors::deleteObject (const MWWorld::Ptr& ptr)
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Actors::removeCell(MWWorld::Ptr::CellStore* store){
|
void Actors::removeCell(MWWorld::Ptr::CellStore* store)
|
||||||
if(mCellSceneNodes.find(store) != mCellSceneNodes.end())
|
{
|
||||||
|
for(PtrAnimationMap::iterator iter = mAllActors.begin();iter != mAllActors.end();)
|
||||||
{
|
{
|
||||||
Ogre::SceneNode* base = mCellSceneNodes[store];
|
if(iter->first.getCell() == store)
|
||||||
base->removeAndDestroyAllChildren();
|
{
|
||||||
mCellSceneNodes.erase(store);
|
|
||||||
mRend.getScene()->destroySceneNode(base);
|
|
||||||
base = 0;
|
|
||||||
}
|
|
||||||
for(std::map<MWWorld::Ptr, Animation*>::iterator iter = mAllActors.begin(); iter != mAllActors.end(); )
|
|
||||||
{
|
|
||||||
if(iter->first.getCell() == store){
|
|
||||||
delete iter->second;
|
delete iter->second;
|
||||||
mAllActors.erase(iter++);
|
mAllActors.erase(iter++);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
++iter;
|
++iter;
|
||||||
}
|
}
|
||||||
|
CellSceneNodeMap::iterator celliter = mCellSceneNodes.find(store);
|
||||||
|
if(celliter != mCellSceneNodes.end())
|
||||||
|
{
|
||||||
|
Ogre::SceneNode *base = celliter->second;
|
||||||
|
base->removeAndDestroyAllChildren();
|
||||||
|
mRend.getScene()->destroySceneNode(base);
|
||||||
|
mCellSceneNodes.erase(celliter);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Actors::playAnimationGroup (const MWWorld::Ptr& ptr, const std::string& groupName, int mode, int number){
|
void Actors::playAnimationGroup (const MWWorld::Ptr& ptr, const std::string& groupName, int mode, int number)
|
||||||
if(mAllActors.find(ptr) != mAllActors.end())
|
{
|
||||||
mAllActors[ptr]->playGroup(groupName, mode, number);
|
PtrAnimationMap::const_iterator iter = mAllActors.find(ptr);
|
||||||
|
if(iter != mAllActors.end())
|
||||||
|
iter->second->playGroup(groupName, mode, number);
|
||||||
}
|
}
|
||||||
void Actors::skipAnimation (const MWWorld::Ptr& ptr){
|
void Actors::skipAnimation (const MWWorld::Ptr& ptr)
|
||||||
if(mAllActors.find(ptr) != mAllActors.end())
|
{
|
||||||
mAllActors[ptr]->skipAnim();
|
PtrAnimationMap::const_iterator iter = mAllActors.find(ptr);
|
||||||
|
if(iter != mAllActors.end())
|
||||||
|
iter->second->skipAnim();
|
||||||
}
|
}
|
||||||
void Actors::update (float duration){
|
void Actors::update (float duration)
|
||||||
for(std::map<MWWorld::Ptr, Animation*>::iterator iter = mAllActors.begin(); iter != mAllActors.end(); iter++)
|
{
|
||||||
|
for(PtrAnimationMap::const_iterator iter = mAllActors.begin();iter != mAllActors.end();iter++)
|
||||||
iter->second->runAnimation(duration);
|
iter->second->runAnimation(duration);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void Actors::updateObjectCell(const MWWorld::Ptr &ptr)
|
||||||
Actors::updateObjectCell(const MWWorld::Ptr &ptr)
|
|
||||||
{
|
{
|
||||||
Ogre::SceneNode *node;
|
Ogre::SceneNode *node;
|
||||||
MWWorld::CellStore *newCell = ptr.getCell();
|
MWWorld::CellStore *newCell = ptr.getCell();
|
||||||
|
|
||||||
if(mCellSceneNodes.find(newCell) == mCellSceneNodes.end()) {
|
CellSceneNodeMap::const_iterator celliter = mCellSceneNodes.find(newCell);
|
||||||
|
if(celliter != mCellSceneNodes.end())
|
||||||
|
node = celliter->second;
|
||||||
|
else
|
||||||
|
{
|
||||||
node = mMwRoot->createChildSceneNode();
|
node = mMwRoot->createChildSceneNode();
|
||||||
mCellSceneNodes[newCell] = node;
|
mCellSceneNodes[newCell] = node;
|
||||||
} else {
|
|
||||||
node = mCellSceneNodes[newCell];
|
|
||||||
}
|
}
|
||||||
node->addChild(ptr.getRefData().getBaseNode());
|
node->addChild(ptr.getRefData().getBaseNode());
|
||||||
if (mAllActors.find(ptr) != mAllActors.end()) {
|
|
||||||
|
PtrAnimationMap::iterator iter = mAllActors.find(ptr);
|
||||||
|
if(iter != mAllActors.end())
|
||||||
|
{
|
||||||
/// \note Update key (Ptr's are compared only with refdata so mCell
|
/// \note Update key (Ptr's are compared only with refdata so mCell
|
||||||
/// on key is outdated), maybe redundant
|
/// on key is outdated), maybe redundant
|
||||||
Animation *anim = mAllActors[ptr];
|
Animation *anim = iter->second;
|
||||||
mAllActors.erase(ptr);
|
mAllActors.erase(iter);
|
||||||
mAllActors[ptr] = anim;
|
mAllActors[ptr] = anim;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
|
@ -10,18 +10,22 @@ namespace MWWorld
|
||||||
class CellStore;
|
class CellStore;
|
||||||
}
|
}
|
||||||
|
|
||||||
namespace MWRender{
|
namespace MWRender
|
||||||
class Actors{
|
{
|
||||||
|
class Actors
|
||||||
|
{
|
||||||
|
typedef std::map<MWWorld::CellStore*,Ogre::SceneNode*> CellSceneNodeMap;
|
||||||
|
typedef std::map<MWWorld::Ptr,Animation*> PtrAnimationMap;
|
||||||
|
|
||||||
OEngine::Render::OgreRenderer &mRend;
|
OEngine::Render::OgreRenderer &mRend;
|
||||||
std::map<MWWorld::CellStore *, Ogre::SceneNode *> mCellSceneNodes;
|
|
||||||
Ogre::SceneNode* mMwRoot;
|
Ogre::SceneNode* mMwRoot;
|
||||||
std::map<MWWorld::Ptr, Animation*> mAllActors;
|
CellSceneNodeMap mCellSceneNodes;
|
||||||
|
PtrAnimationMap mAllActors;
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
public:
|
|
||||||
Actors(OEngine::Render::OgreRenderer& _rend): mRend(_rend) {}
|
Actors(OEngine::Render::OgreRenderer& _rend): mRend(_rend) {}
|
||||||
~Actors();
|
~Actors();
|
||||||
|
|
||||||
void setMwRoot(Ogre::SceneNode* root);
|
void setMwRoot(Ogre::SceneNode* root);
|
||||||
void insertBegin (const MWWorld::Ptr& ptr, bool enabled, bool static_);
|
void insertBegin (const MWWorld::Ptr& ptr, bool enabled, bool static_);
|
||||||
void insertCreature (const MWWorld::Ptr& ptr);
|
void insertCreature (const MWWorld::Ptr& ptr);
|
||||||
|
|
Loading…
Reference in a new issue