mirror of
https://gitlab.com/OpenMW/openmw.git
synced 2025-03-25 16:43:33 +00:00
fixed movable object cleanup for ordinary objects
This commit is contained in:
parent
c471aa950f
commit
e1600d9a2a
@ -23,6 +23,17 @@ bool Objects::lightOutQuadInLin = false;
|
|||||||
|
|
||||||
int Objects::uniqueID = 0;
|
int Objects::uniqueID = 0;
|
||||||
|
|
||||||
|
void Objects::clearSceneNode (Ogre::SceneNode *node)
|
||||||
|
{
|
||||||
|
/// \todo This should probably be moved into OpenEngine at some point.
|
||||||
|
for (int i=node->numAttachedObjects()-1; i>=0; --i)
|
||||||
|
{
|
||||||
|
Ogre::MovableObject *object = node->getAttachedObject (i);
|
||||||
|
node->detachObject (object);
|
||||||
|
mRend.getScene()->destroyMovableObject (object);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void Objects::setMwRoot(Ogre::SceneNode* root){
|
void Objects::setMwRoot(Ogre::SceneNode* root){
|
||||||
mMwRoot = root;
|
mMwRoot = root;
|
||||||
}
|
}
|
||||||
@ -59,6 +70,7 @@ void Objects::insertBegin (const MWWorld::Ptr& ptr, bool enabled, bool static_){
|
|||||||
|
|
||||||
// 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);
|
||||||
|
|
||||||
if (!enabled)
|
if (!enabled)
|
||||||
insert->setVisible (false);
|
insert->setVisible (false);
|
||||||
ptr.getRefData().setBaseNode(insert);
|
ptr.getRefData().setBaseNode(insert);
|
||||||
@ -145,6 +157,7 @@ bool Objects::deleteObject (const MWWorld::Ptr& ptr)
|
|||||||
mCellSceneNodes.begin()); iter!=mCellSceneNodes.end(); ++iter)
|
mCellSceneNodes.begin()); iter!=mCellSceneNodes.end(); ++iter)
|
||||||
if (iter->second==parent)
|
if (iter->second==parent)
|
||||||
{
|
{
|
||||||
|
clearSceneNode (base);
|
||||||
base->removeAndDestroyAllChildren();
|
base->removeAndDestroyAllChildren();
|
||||||
mRend.getScene()->destroySceneNode (base);
|
mRend.getScene()->destroySceneNode (base);
|
||||||
ptr.getRefData().setBaseNode (0);
|
ptr.getRefData().setBaseNode (0);
|
||||||
@ -161,13 +174,16 @@ void Objects::removeCell(MWWorld::Ptr::CellStore* store){
|
|||||||
if(mCellSceneNodes.find(store) != mCellSceneNodes.end())
|
if(mCellSceneNodes.find(store) != mCellSceneNodes.end())
|
||||||
{
|
{
|
||||||
Ogre::SceneNode* base = mCellSceneNodes[store];
|
Ogre::SceneNode* base = mCellSceneNodes[store];
|
||||||
|
|
||||||
|
for (int i=0; i<base->numChildren(); ++i)
|
||||||
|
clearSceneNode (static_cast<Ogre::SceneNode *> (base->getChild (i)));
|
||||||
|
|
||||||
base->removeAndDestroyAllChildren();
|
base->removeAndDestroyAllChildren();
|
||||||
mCellSceneNodes.erase(store);
|
mCellSceneNodes.erase(store);
|
||||||
mRend.getScene()->destroySceneNode(base);
|
mRend.getScene()->destroySceneNode(base);
|
||||||
base = 0;
|
base = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if(mSG.find(store) != mSG.end())
|
if(mSG.find(store) != mSG.end())
|
||||||
{
|
{
|
||||||
Ogre::StaticGeometry* sg = mSG[store];
|
Ogre::StaticGeometry* sg = mSG[store];
|
||||||
@ -176,6 +192,7 @@ void Objects::removeCell(MWWorld::Ptr::CellStore* store){
|
|||||||
sg = 0;
|
sg = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Objects::buildStaticGeometry(ESMS::CellStore<MWWorld::RefData>& cell){
|
void Objects::buildStaticGeometry(ESMS::CellStore<MWWorld::RefData>& cell){
|
||||||
if(mSG.find(&cell) != mSG.end())
|
if(mSG.find(&cell) != mSG.end())
|
||||||
{
|
{
|
||||||
|
@ -1,11 +1,12 @@
|
|||||||
#ifndef _GAME_RENDER_OBJECTS_H
|
#ifndef _GAME_RENDER_OBJECTS_H
|
||||||
#define _GAME_RENDER_OBJECTS_H
|
#define _GAME_RENDER_OBJECTS_H
|
||||||
|
|
||||||
#include "components/esm_store/cell_store.hpp"
|
#include <openengine/ogre/renderer.hpp>
|
||||||
|
|
||||||
|
#include <components/esm_store/cell_store.hpp>
|
||||||
|
|
||||||
#include "../mwworld/refdata.hpp"
|
#include "../mwworld/refdata.hpp"
|
||||||
#include "../mwworld/ptr.hpp"
|
#include "../mwworld/ptr.hpp"
|
||||||
#include <openengine/ogre/renderer.hpp>
|
|
||||||
|
|
||||||
namespace MWRender{
|
namespace MWRender{
|
||||||
|
|
||||||
@ -30,6 +31,10 @@ class Objects{
|
|||||||
static float lightQuadraticRadiusMult;
|
static float lightQuadraticRadiusMult;
|
||||||
|
|
||||||
static bool lightOutQuadInLin;
|
static bool lightOutQuadInLin;
|
||||||
|
|
||||||
|
void clearSceneNode (Ogre::SceneNode *node);
|
||||||
|
///< Remove all movable objects from \a node.
|
||||||
|
|
||||||
public:
|
public:
|
||||||
Objects(OEngine::Render::OgreRenderer& _rend): mRend(_rend){}
|
Objects(OEngine::Render::OgreRenderer& _rend): mRend(_rend){}
|
||||||
~Objects(){}
|
~Objects(){}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user