mirror of
https://github.com/TES3MP/openmw-tes3mp.git
synced 2025-01-19 21:23:52 +00:00
Remove PhysicsManager singleton and use shared_ptr instead. Resolves the issue where sometimes destructors were called in an unexpected sequence resulting in a crash while exiting the application.
This commit is contained in:
parent
4c1906b999
commit
2720e5ea9d
19 changed files with 47 additions and 200 deletions
|
@ -68,7 +68,7 @@ opencs_units (view/world
|
|||
|
||||
opencs_units_noqt (view/world
|
||||
subviews enumdelegate vartypedelegate recordstatusdelegate idtypedelegate datadisplaydelegate
|
||||
scripthighlighter idvalidator dialoguecreator physicssystem physicsmanager
|
||||
scripthighlighter idvalidator dialoguecreator physicssystem
|
||||
)
|
||||
|
||||
opencs_units (view/widget
|
||||
|
|
|
@ -21,7 +21,7 @@
|
|||
|
||||
CS::Editor::Editor (OgreInit::OgreInit& ogreInit)
|
||||
: mUserSettings (mCfgMgr), mOverlaySystem (0), mDocumentManager (mCfgMgr),
|
||||
mViewManager (mDocumentManager), mPhysicsManager (0),
|
||||
mViewManager (mDocumentManager),
|
||||
mIpcServerName ("org.openmw.OpenCS"), mServer(NULL), mClientSocket(NULL)
|
||||
{
|
||||
std::pair<Files::PathContainer, std::vector<std::string> > config = readConfig();
|
||||
|
@ -34,7 +34,6 @@ CS::Editor::Editor (OgreInit::OgreInit& ogreInit)
|
|||
ogreInit.init ((mCfgMgr.getUserConfigPath() / "opencsOgre.log").string());
|
||||
|
||||
mOverlaySystem.reset (new CSVRender::OverlaySystem);
|
||||
mPhysicsManager.reset (new CSVWorld::PhysicsManager);
|
||||
|
||||
Bsa::registerResources (Files::Collections (config.first, !mFsStrict), config.second, true,
|
||||
mFsStrict);
|
||||
|
|
|
@ -28,7 +28,6 @@
|
|||
|
||||
#include "view/settings/dialog.hpp"
|
||||
#include "view/render/overlaysystem.hpp"
|
||||
#include "view/world/physicsmanager.hpp"
|
||||
|
||||
namespace OgreInit
|
||||
{
|
||||
|
@ -45,7 +44,6 @@ namespace CS
|
|||
Files::ConfigurationManager mCfgMgr;
|
||||
CSMSettings::UserSettings mUserSettings;
|
||||
std::auto_ptr<CSVRender::OverlaySystem> mOverlaySystem;
|
||||
std::auto_ptr<CSVWorld::PhysicsManager> mPhysicsManager;
|
||||
CSMDoc::DocumentManager mDocumentManager;
|
||||
CSVDoc::ViewManager mViewManager;
|
||||
CSVDoc::StartupDialogue mStartup;
|
||||
|
|
|
@ -9,6 +9,8 @@
|
|||
#include <components/files/configurationmanager.hpp>
|
||||
#endif
|
||||
|
||||
#include "../../view/world/physicssystem.hpp"
|
||||
|
||||
void CSMDoc::Document::addGmsts()
|
||||
{
|
||||
static const char *gmstFloats[] =
|
||||
|
@ -2253,7 +2255,7 @@ CSMDoc::Document::Document (const Files::ConfigurationManager& configuration,
|
|||
mProjectPath ((configuration.getUserDataPath() / "projects") /
|
||||
(savePath.filename().string() + ".project")),
|
||||
mSaving (*this, mProjectPath, encoding),
|
||||
mRunner (mProjectPath)
|
||||
mRunner (mProjectPath), mPhysics(boost::shared_ptr<CSVWorld::PhysicsSystem>())
|
||||
{
|
||||
if (mContentFiles.empty())
|
||||
throw std::runtime_error ("Empty content file sequence");
|
||||
|
@ -2464,3 +2466,11 @@ void CSMDoc::Document::progress (int current, int max, int type)
|
|||
{
|
||||
emit progress (current, max, type, 1, this);
|
||||
}
|
||||
|
||||
boost::shared_ptr<CSVWorld::PhysicsSystem> CSMDoc::Document::getPhysics ()
|
||||
{
|
||||
if(!mPhysics)
|
||||
mPhysics = boost::shared_ptr<CSVWorld::PhysicsSystem> (new CSVWorld::PhysicsSystem());
|
||||
|
||||
return mPhysics;
|
||||
}
|
||||
|
|
|
@ -3,6 +3,7 @@
|
|||
|
||||
#include <string>
|
||||
|
||||
#include <boost/shared_ptr.hpp>
|
||||
#include <boost/filesystem/path.hpp>
|
||||
|
||||
#include <QUndoStack>
|
||||
|
@ -39,6 +40,11 @@ namespace CSMWorld
|
|||
class ResourcesManager;
|
||||
}
|
||||
|
||||
namespace CSVWorld
|
||||
{
|
||||
class PhysicsSystem;
|
||||
}
|
||||
|
||||
namespace CSMDoc
|
||||
{
|
||||
class Document : public QObject
|
||||
|
@ -57,6 +63,7 @@ namespace CSMDoc
|
|||
boost::filesystem::path mResDir;
|
||||
Blacklist mBlacklist;
|
||||
Runner mRunner;
|
||||
boost::shared_ptr<CSVWorld::PhysicsSystem> mPhysics;
|
||||
|
||||
// It is important that the undo stack is declared last, because on desctruction it fires a signal, that is connected to a slot, that is
|
||||
// using other member variables. Unfortunately this connection is cut only in the QObject destructor, which is way too late.
|
||||
|
@ -129,6 +136,8 @@ namespace CSMDoc
|
|||
|
||||
QTextDocument *getRunLog();
|
||||
|
||||
boost::shared_ptr<CSVWorld::PhysicsSystem> getPhysics();
|
||||
|
||||
signals:
|
||||
|
||||
void stateChanged (int state, CSMDoc::Document *document);
|
||||
|
|
|
@ -16,7 +16,6 @@
|
|||
#include "../../model/world/idtable.hpp"
|
||||
|
||||
#include "../world/subviews.hpp"
|
||||
#include "../world/physicsmanager.hpp"
|
||||
|
||||
#include "../tools/subviews.hpp"
|
||||
|
||||
|
@ -407,8 +406,6 @@ CSVDoc::View::View (ViewManager& viewManager, CSMDoc::Document *document, int to
|
|||
mSubViewFactory.add (CSMWorld::UniversalId::Type_RunLog, new SubViewFactory<RunLogSubView>);
|
||||
|
||||
connect (mOperations, SIGNAL (abortOperation (int)), this, SLOT (abortOperation (int)));
|
||||
|
||||
CSVWorld::PhysicsManager::instance()->setupPhysics(document);
|
||||
}
|
||||
|
||||
CSVDoc::View::~View()
|
||||
|
|
|
@ -6,6 +6,8 @@
|
|||
#include <QApplication>
|
||||
#include <QDesktopWidget>
|
||||
|
||||
#include <openengine/bullet/BulletShapeLoader.h>
|
||||
|
||||
#include "../../model/doc/documentmanager.hpp"
|
||||
#include "../../model/doc/document.hpp"
|
||||
#include "../../model/world/columns.hpp"
|
||||
|
@ -16,7 +18,6 @@
|
|||
#include "../world/vartypedelegate.hpp"
|
||||
#include "../world/recordstatusdelegate.hpp"
|
||||
#include "../world/idtypedelegate.hpp"
|
||||
#include "../world/physicsmanager.hpp"
|
||||
|
||||
#include "../../model/settings/usersettings.hpp"
|
||||
|
||||
|
@ -219,7 +220,8 @@ void CSVDoc::ViewManager::removeDocAndView (CSMDoc::Document *document)
|
|||
mDocumentManager.removeDocument(document);
|
||||
(*iter)->deleteLater();
|
||||
mViews.erase (iter);
|
||||
CSVWorld::PhysicsManager::instance()->removeDocument(document);
|
||||
// cleanup global resources used by OEngine
|
||||
delete OEngine::Physic::BulletShapeManager::getSingletonPtr();
|
||||
|
||||
updateIndices();
|
||||
return;
|
||||
|
|
|
@ -60,7 +60,7 @@ bool CSVRender::Cell::addObjects (int start, int end)
|
|||
}
|
||||
|
||||
CSVRender::Cell::Cell (CSMWorld::Data& data, Ogre::SceneManager *sceneManager,
|
||||
const std::string& id, CSVWorld::PhysicsSystem *physics, const Ogre::Vector3& origin)
|
||||
const std::string& id, boost::shared_ptr<CSVWorld::PhysicsSystem> physics, const Ogre::Vector3& origin)
|
||||
: mData (data), mId (Misc::StringUtils::lowerCase (id)), mSceneMgr(sceneManager), mPhysics(physics)
|
||||
{
|
||||
mCellNode = sceneManager->getRootSceneNode()->createChildSceneNode();
|
||||
|
|
|
@ -5,6 +5,8 @@
|
|||
#include <map>
|
||||
#include <memory>
|
||||
|
||||
#include <boost/shared_ptr.hpp>
|
||||
|
||||
#include <OgreVector3.h>
|
||||
|
||||
#include <components/terrain/terraingrid.hpp>
|
||||
|
@ -38,7 +40,7 @@ namespace CSVRender
|
|||
Ogre::SceneNode *mCellNode;
|
||||
std::map<std::string, Object *> mObjects;
|
||||
std::auto_ptr<Terrain::TerrainGrid> mTerrain;
|
||||
CSVWorld::PhysicsSystem *mPhysics;
|
||||
boost::shared_ptr<CSVWorld::PhysicsSystem> mPhysics;
|
||||
Ogre::SceneManager *mSceneMgr;
|
||||
int mX;
|
||||
int mY;
|
||||
|
@ -56,7 +58,7 @@ namespace CSVRender
|
|||
public:
|
||||
|
||||
Cell (CSMWorld::Data& data, Ogre::SceneManager *sceneManager, const std::string& id,
|
||||
CSVWorld::PhysicsSystem *physics, const Ogre::Vector3& origin = Ogre::Vector3 (0, 0, 0));
|
||||
boost::shared_ptr<CSVWorld::PhysicsSystem> physics, const Ogre::Vector3& origin = Ogre::Vector3 (0, 0, 0));
|
||||
|
||||
~Cell();
|
||||
|
||||
|
|
|
@ -56,7 +56,7 @@ namespace CSVRender
|
|||
//
|
||||
|
||||
MouseState::MouseState(WorldspaceWidget *parent)
|
||||
: mParent(parent), mPhysics(parent->getPhysics()), mSceneManager(parent->getSceneManager())
|
||||
: mParent(parent), mPhysics(parent->mDocument.getPhysics()), mSceneManager(parent->getSceneManager())
|
||||
, mCurrentObj(""), mMouseState(Mouse_Default), mOldPos(0,0), mMouseEventTimer(0), mPlane(0)
|
||||
, mGrabbedSceneNode(""), mOrigObjPos(Ogre::Vector3()), mOrigMousePos(Ogre::Vector3())
|
||||
, mCurrentMousePos(Ogre::Vector3()), mOffset(0.0f)
|
||||
|
|
|
@ -2,6 +2,7 @@
|
|||
#define OPENCS_VIEW_MOUSESTATE_H
|
||||
|
||||
#include <map>
|
||||
#include <boost/shared_ptr.hpp>
|
||||
#include <QPoint>
|
||||
#include <OgreVector3.h>
|
||||
|
||||
|
@ -43,7 +44,7 @@ namespace CSVRender
|
|||
MouseStates mMouseState;
|
||||
|
||||
WorldspaceWidget *mParent;
|
||||
CSVWorld::PhysicsSystem *mPhysics; // local copy
|
||||
boost::shared_ptr<CSVWorld::PhysicsSystem> mPhysics;
|
||||
Ogre::SceneManager *mSceneManager; // local copy
|
||||
|
||||
QPoint mOldPos;
|
||||
|
|
|
@ -132,7 +132,7 @@ const CSMWorld::CellRef& CSVRender::Object::getReference() const
|
|||
}
|
||||
|
||||
CSVRender::Object::Object (const CSMWorld::Data& data, Ogre::SceneNode *cellNode,
|
||||
const std::string& id, bool referenceable, CSVWorld::PhysicsSystem *physics,
|
||||
const std::string& id, bool referenceable, boost::shared_ptr<CSVWorld::PhysicsSystem> physics,
|
||||
bool forceBaseToZero)
|
||||
: mData (data), mBase (0), mForceBaseToZero (forceBaseToZero), mPhysics(physics)
|
||||
{
|
||||
|
|
|
@ -1,6 +1,8 @@
|
|||
#ifndef OPENCS_VIEW_OBJECT_H
|
||||
#define OPENCS_VIEW_OBJECT_H
|
||||
|
||||
#include <boost/shared_ptr.hpp>
|
||||
|
||||
#include <components/nifogre/ogrenifloader.hpp>
|
||||
|
||||
class QModelIndex;
|
||||
|
@ -31,7 +33,7 @@ namespace CSVRender
|
|||
Ogre::SceneNode *mBase;
|
||||
NifOgre::ObjectScenePtr mObject;
|
||||
bool mForceBaseToZero;
|
||||
CSVWorld::PhysicsSystem *mPhysics;
|
||||
boost::shared_ptr<CSVWorld::PhysicsSystem> mPhysics;
|
||||
|
||||
/// Not implemented
|
||||
Object (const Object&);
|
||||
|
@ -58,7 +60,8 @@ namespace CSVRender
|
|||
|
||||
Object (const CSMWorld::Data& data, Ogre::SceneNode *cellNode,
|
||||
const std::string& id, bool referenceable,
|
||||
CSVWorld::PhysicsSystem *physics = NULL, bool forceBaseToZero = false);
|
||||
boost::shared_ptr<CSVWorld::PhysicsSystem> physics = boost::shared_ptr<CSVWorld::PhysicsSystem> (),
|
||||
bool forceBaseToZero = false);
|
||||
/// \param forceBaseToZero If this is a reference ignore the coordinates and place
|
||||
/// it at 0, 0, 0 instead.
|
||||
|
||||
|
|
|
@ -111,7 +111,7 @@ bool CSVRender::PagedWorldspaceWidget::adjustCells()
|
|||
mCells.find (*iter)==mCells.end())
|
||||
{
|
||||
Cell *cell = new Cell (mDocument.getData(), getSceneManager(),
|
||||
iter->getId (mWorldspace), getPhysics());
|
||||
iter->getId (mWorldspace), mDocument.getPhysics());
|
||||
mCells.insert (std::make_pair (*iter, cell));
|
||||
|
||||
float height = cell->getTerrainHeightAt(Ogre::Vector3(
|
||||
|
|
|
@ -49,7 +49,7 @@ CSVRender::UnpagedWorldspaceWidget::UnpagedWorldspaceWidget (const std::string&
|
|||
|
||||
update();
|
||||
|
||||
mCell.reset (new Cell (document.getData(), getSceneManager(), mCellId, getPhysics()));
|
||||
mCell.reset (new Cell (document.getData(), getSceneManager(), mCellId, document.getPhysics()));
|
||||
}
|
||||
|
||||
void CSVRender::UnpagedWorldspaceWidget::cellDataChanged (const QModelIndex& topLeft,
|
||||
|
@ -91,7 +91,7 @@ bool CSVRender::UnpagedWorldspaceWidget::handleDrop (const std::vector<CSMWorld:
|
|||
return false;
|
||||
|
||||
mCellId = data.begin()->getId();
|
||||
mCell.reset (new Cell (getDocument().getData(), getSceneManager(), mCellId, getPhysics()));
|
||||
mCell.reset (new Cell (getDocument().getData(), getSceneManager(), mCellId, getDocument().getPhysics()));
|
||||
|
||||
update();
|
||||
emit cellChanged(*data.begin());
|
||||
|
|
|
@ -16,7 +16,6 @@
|
|||
#include "../widget/scenetooltoggle2.hpp"
|
||||
#include "../widget/scenetoolrun.hpp"
|
||||
|
||||
#include "../world/physicsmanager.hpp"
|
||||
#include "../world/physicssystem.hpp"
|
||||
|
||||
#include "elements.hpp"
|
||||
|
@ -56,9 +55,7 @@ CSVRender::WorldspaceWidget::WorldspaceWidget (CSMDoc::Document& document, QWidg
|
|||
connect (debugProfiles, SIGNAL (rowsAboutToBeRemoved (const QModelIndex&, int, int)),
|
||||
this, SLOT (debugProfileAboutToBeRemoved (const QModelIndex&, int, int)));
|
||||
|
||||
// associate WorldSpaceWidgets (and their SceneManagers) with Documents
|
||||
// then create physics if there is a new document
|
||||
mPhysics = CSVWorld::PhysicsManager::instance()->addSceneWidget(document, this);
|
||||
mPhysics = document.getPhysics(); // create physics if one doesn't exist
|
||||
mPhysics->addSceneManager(getSceneManager(), this);
|
||||
mMouse = new MouseState(this);
|
||||
}
|
||||
|
@ -67,7 +64,6 @@ CSVRender::WorldspaceWidget::~WorldspaceWidget ()
|
|||
{
|
||||
delete mMouse;
|
||||
mPhysics->removeSceneManager(getSceneManager());
|
||||
CSVWorld::PhysicsManager::instance()->removeSceneWidget(this);
|
||||
}
|
||||
|
||||
void CSVRender::WorldspaceWidget::selectNavigationMode (const std::string& mode)
|
||||
|
@ -370,12 +366,6 @@ void CSVRender::WorldspaceWidget::updateOverlay()
|
|||
{
|
||||
}
|
||||
|
||||
CSVWorld::PhysicsSystem *CSVRender::WorldspaceWidget::getPhysics()
|
||||
{
|
||||
assert(mPhysics);
|
||||
return mPhysics;
|
||||
}
|
||||
|
||||
void CSVRender::WorldspaceWidget::mouseMoveEvent (QMouseEvent *event)
|
||||
{
|
||||
if(event->buttons() & Qt::RightButton)
|
||||
|
|
|
@ -1,6 +1,8 @@
|
|||
#ifndef OPENCS_VIEW_WORLDSPACEWIDGET_H
|
||||
#define OPENCS_VIEW_WORLDSPACEWIDGET_H
|
||||
|
||||
#include <boost/shared_ptr.hpp>
|
||||
|
||||
#include "scenewidget.hpp"
|
||||
#include "mousestate.hpp"
|
||||
|
||||
|
@ -40,7 +42,7 @@ namespace CSVRender
|
|||
CSVWidget::SceneToolToggle2 *mSceneElements;
|
||||
CSVWidget::SceneToolRun *mRun;
|
||||
CSMDoc::Document& mDocument;
|
||||
CSVWorld::PhysicsSystem *mPhysics;
|
||||
boost::shared_ptr<CSVWorld::PhysicsSystem> mPhysics;
|
||||
MouseState *mMouse;
|
||||
unsigned int mInteractionMask;
|
||||
|
||||
|
@ -115,8 +117,6 @@ namespace CSVRender
|
|||
|
||||
virtual void updateOverlay();
|
||||
|
||||
CSVWorld::PhysicsSystem *getPhysics();
|
||||
|
||||
virtual void mouseMoveEvent (QMouseEvent *event);
|
||||
virtual void mousePressEvent (QMouseEvent *event);
|
||||
virtual void mouseReleaseEvent (QMouseEvent *event);
|
||||
|
|
|
@ -1,110 +0,0 @@
|
|||
#include "physicsmanager.hpp"
|
||||
|
||||
#include <iostream>
|
||||
|
||||
#include <openengine/bullet/BulletShapeLoader.h>
|
||||
|
||||
#include "../render/worldspacewidget.hpp"
|
||||
#include "physicssystem.hpp"
|
||||
|
||||
namespace CSVWorld
|
||||
{
|
||||
PhysicsManager *PhysicsManager::mPhysicsManagerInstance = 0;
|
||||
|
||||
PhysicsManager::PhysicsManager()
|
||||
{
|
||||
assert(!mPhysicsManagerInstance);
|
||||
mPhysicsManagerInstance = this;
|
||||
}
|
||||
|
||||
PhysicsManager::~PhysicsManager()
|
||||
{
|
||||
std::map<CSMDoc::Document *, CSVWorld::PhysicsSystem *>::iterator iter = mPhysics.begin();
|
||||
for(; iter != mPhysics.end(); ++iter)
|
||||
delete iter->second; // shouldn't be any left but just in case
|
||||
}
|
||||
|
||||
PhysicsManager *PhysicsManager::instance()
|
||||
{
|
||||
assert(mPhysicsManagerInstance);
|
||||
return mPhysicsManagerInstance;
|
||||
}
|
||||
|
||||
// create a physics instance per document, called from CSVDoc::View() to get Document*
|
||||
void PhysicsManager::setupPhysics(CSMDoc::Document *doc)
|
||||
{
|
||||
std::map<CSMDoc::Document *, std::list<CSVRender::SceneWidget *> >::iterator iter = mSceneWidgets.find(doc);
|
||||
if(iter == mSceneWidgets.end())
|
||||
{
|
||||
mSceneWidgets[doc] = std::list<CSVRender::SceneWidget *> (); // zero elements
|
||||
mPhysics[doc] = new PhysicsSystem();
|
||||
}
|
||||
}
|
||||
|
||||
// destroy physics, called from CSVDoc::ViewManager
|
||||
void PhysicsManager::removeDocument(CSMDoc::Document *doc)
|
||||
{
|
||||
std::map<CSMDoc::Document *, CSVWorld::PhysicsSystem *>::iterator iter = mPhysics.find(doc);
|
||||
if(iter != mPhysics.end())
|
||||
{
|
||||
delete iter->second;
|
||||
mPhysics.erase(iter);
|
||||
}
|
||||
|
||||
std::map<CSMDoc::Document *, std::list<CSVRender::SceneWidget *> >::iterator it = mSceneWidgets.find(doc);
|
||||
if(it != mSceneWidgets.end())
|
||||
{
|
||||
mSceneWidgets.erase(it);
|
||||
}
|
||||
|
||||
// cleanup global resources used by OEngine
|
||||
if(mPhysics.empty())
|
||||
{
|
||||
delete OEngine::Physic::BulletShapeManager::getSingletonPtr();
|
||||
}
|
||||
}
|
||||
|
||||
// called from CSVRender::WorldspaceWidget() to get widgets' association with Document&
|
||||
PhysicsSystem *PhysicsManager::addSceneWidget(CSMDoc::Document &doc, CSVRender::WorldspaceWidget *widget)
|
||||
{
|
||||
CSVRender::SceneWidget *sceneWidget = static_cast<CSVRender::SceneWidget *>(widget);
|
||||
|
||||
std::map<CSMDoc::Document *, std::list<CSVRender::SceneWidget *> >::iterator iter = mSceneWidgets.begin();
|
||||
for(; iter != mSceneWidgets.end(); ++iter)
|
||||
{
|
||||
if((*iter).first == &doc)
|
||||
{
|
||||
(*iter).second.push_back(sceneWidget);
|
||||
return mPhysics[(*iter).first]; // TODO: consider using shared_ptr instead
|
||||
}
|
||||
}
|
||||
|
||||
throw std::runtime_error("No physics system found for the given document.");
|
||||
}
|
||||
|
||||
// deprecated by removeDocument() and may be deleted in future code updates
|
||||
// however there may be some value in removing the deleted scene widgets from the
|
||||
// list so that the list does not grow forever
|
||||
void PhysicsManager::removeSceneWidget(CSVRender::WorldspaceWidget *widget)
|
||||
{
|
||||
CSVRender::SceneWidget *sceneWidget = static_cast<CSVRender::SceneWidget *>(widget);
|
||||
|
||||
std::map<CSMDoc::Document *, std::list<CSVRender::SceneWidget *> >::iterator iter = mSceneWidgets.begin();
|
||||
for(; iter != mSceneWidgets.end(); ++iter)
|
||||
{
|
||||
std::list<CSVRender::SceneWidget *>::iterator itWidget = (*iter).second.begin();
|
||||
for(; itWidget != (*iter).second.end(); ++itWidget)
|
||||
{
|
||||
if((*itWidget) == sceneWidget)
|
||||
{
|
||||
(*iter).second.erase(itWidget);
|
||||
|
||||
//if((*iter).second.empty()) // last one for the document
|
||||
// NOTE: do not delete physics until the document itself is closed
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,54 +0,0 @@
|
|||
#ifndef CSV_WORLD_PHYSICSMANAGER_H
|
||||
#define CSV_WORLD_PHYSICSMANAGER_H
|
||||
|
||||
#include <map>
|
||||
#include <list>
|
||||
|
||||
namespace Ogre
|
||||
{
|
||||
class SceneManager;
|
||||
}
|
||||
|
||||
namespace CSMDoc
|
||||
{
|
||||
class Document;
|
||||
}
|
||||
|
||||
namespace CSVRender
|
||||
{
|
||||
class WorldspaceWidget;
|
||||
class SceneWidget;
|
||||
}
|
||||
|
||||
namespace CSVWorld
|
||||
{
|
||||
class PhysicsSystem;
|
||||
}
|
||||
|
||||
namespace CSVWorld
|
||||
{
|
||||
class PhysicsManager
|
||||
{
|
||||
static PhysicsManager *mPhysicsManagerInstance;
|
||||
|
||||
std::map<CSMDoc::Document *, std::list<CSVRender::SceneWidget *> > mSceneWidgets;
|
||||
std::map<CSMDoc::Document *, CSVWorld::PhysicsSystem *> mPhysics;
|
||||
|
||||
public:
|
||||
|
||||
PhysicsManager();
|
||||
~PhysicsManager();
|
||||
|
||||
static PhysicsManager *instance();
|
||||
|
||||
void setupPhysics(CSMDoc::Document *);
|
||||
|
||||
PhysicsSystem *addSceneWidget(CSMDoc::Document &doc, CSVRender::WorldspaceWidget *widget);
|
||||
|
||||
void removeSceneWidget(CSVRender::WorldspaceWidget *widget);
|
||||
|
||||
void removeDocument(CSMDoc::Document *doc);
|
||||
};
|
||||
}
|
||||
|
||||
#endif // CSV_WORLD_PHYSICSMANAGER_H
|
Loading…
Reference in a new issue