Multiple document support.

This commit is contained in:
cc9cii 2014-11-01 18:57:39 +11:00
parent 057982b1f8
commit b328aa1fb9
16 changed files with 83 additions and 81 deletions

View file

@ -68,7 +68,7 @@ opencs_units (view/world
opencs_units_noqt (view/world opencs_units_noqt (view/world
subviews enumdelegate vartypedelegate recordstatusdelegate idtypedelegate datadisplaydelegate subviews enumdelegate vartypedelegate recordstatusdelegate idtypedelegate datadisplaydelegate
scripthighlighter idvalidator dialoguecreator physicssystem scripthighlighter idvalidator dialoguecreator physicssystem physicsmanager
) )
opencs_units (view/widget opencs_units (view/widget

View file

@ -21,7 +21,7 @@
CS::Editor::Editor (OgreInit::OgreInit& ogreInit) CS::Editor::Editor (OgreInit::OgreInit& ogreInit)
: mUserSettings (mCfgMgr), mOverlaySystem (0), mDocumentManager (mCfgMgr), : mUserSettings (mCfgMgr), mOverlaySystem (0), mDocumentManager (mCfgMgr),
mViewManager (mDocumentManager), mPhysicsSystem (0), mViewManager (mDocumentManager), mPhysicsManager (0),
mIpcServerName ("org.openmw.OpenCS"), mServer(NULL), mClientSocket(NULL) mIpcServerName ("org.openmw.OpenCS"), mServer(NULL), mClientSocket(NULL)
{ {
std::pair<Files::PathContainer, std::vector<std::string> > config = readConfig(); std::pair<Files::PathContainer, std::vector<std::string> > config = readConfig();
@ -34,7 +34,7 @@ CS::Editor::Editor (OgreInit::OgreInit& ogreInit)
ogreInit.init ((mCfgMgr.getUserConfigPath() / "opencsOgre.log").string()); ogreInit.init ((mCfgMgr.getUserConfigPath() / "opencsOgre.log").string());
mOverlaySystem.reset (new CSVRender::OverlaySystem); mOverlaySystem.reset (new CSVRender::OverlaySystem);
mPhysicsSystem.reset (new CSVWorld::PhysicsSystem); mPhysicsManager.reset (new CSVWorld::PhysicsManager);
Bsa::registerResources (Files::Collections (config.first, !mFsStrict), config.second, true, Bsa::registerResources (Files::Collections (config.first, !mFsStrict), config.second, true,
mFsStrict); mFsStrict);

View file

@ -28,7 +28,7 @@
#include "view/settings/dialog.hpp" #include "view/settings/dialog.hpp"
#include "view/render/overlaysystem.hpp" #include "view/render/overlaysystem.hpp"
#include "view/world/physicssystem.hpp" #include "view/world/physicsmanager.hpp"
namespace OgreInit namespace OgreInit
{ {
@ -45,7 +45,7 @@ namespace CS
Files::ConfigurationManager mCfgMgr; Files::ConfigurationManager mCfgMgr;
CSMSettings::UserSettings mUserSettings; CSMSettings::UserSettings mUserSettings;
std::auto_ptr<CSVRender::OverlaySystem> mOverlaySystem; std::auto_ptr<CSVRender::OverlaySystem> mOverlaySystem;
std::auto_ptr<CSVWorld::PhysicsSystem> mPhysicsSystem; std::auto_ptr<CSVWorld::PhysicsManager> mPhysicsManager;
CSMDoc::DocumentManager mDocumentManager; CSMDoc::DocumentManager mDocumentManager;
CSVDoc::ViewManager mViewManager; CSVDoc::ViewManager mViewManager;
CSVDoc::StartupDialogue mStartup; CSVDoc::StartupDialogue mStartup;

View file

@ -16,6 +16,7 @@
#include "../../model/world/idtable.hpp" #include "../../model/world/idtable.hpp"
#include "../world/subviews.hpp" #include "../world/subviews.hpp"
#include "../world/physicsmanager.hpp"
#include "../tools/subviews.hpp" #include "../tools/subviews.hpp"
@ -406,6 +407,8 @@ CSVDoc::View::View (ViewManager& viewManager, CSMDoc::Document *document, int to
mSubViewFactory.add (CSMWorld::UniversalId::Type_RunLog, new SubViewFactory<RunLogSubView>); mSubViewFactory.add (CSMWorld::UniversalId::Type_RunLog, new SubViewFactory<RunLogSubView>);
connect (mOperations, SIGNAL (abortOperation (int)), this, SLOT (abortOperation (int))); connect (mOperations, SIGNAL (abortOperation (int)), this, SLOT (abortOperation (int)));
CSVWorld::PhysicsManager::instance()->setupPhysics(document);
} }
CSVDoc::View::~View() CSVDoc::View::~View()

View file

@ -51,7 +51,7 @@ bool CSVRender::Cell::addObjects (int start, int end)
std::string id = Misc::StringUtils::lowerCase (references.data ( std::string id = Misc::StringUtils::lowerCase (references.data (
references.index (i, idColumn)).toString().toUtf8().constData()); references.index (i, idColumn)).toString().toUtf8().constData());
mObjects.insert (std::make_pair (id, new Object (mData, mCellNode, id, false))); mObjects.insert (std::make_pair (id, new Object (mData, mCellNode, id, false, mPhysics)));
modified = true; modified = true;
} }
} }
@ -60,8 +60,8 @@ bool CSVRender::Cell::addObjects (int start, int end)
} }
CSVRender::Cell::Cell (CSMWorld::Data& data, Ogre::SceneManager *sceneManager, CSVRender::Cell::Cell (CSMWorld::Data& data, Ogre::SceneManager *sceneManager,
const std::string& id, const Ogre::Vector3& origin) const std::string& id, CSVWorld::PhysicsSystem *physics, const Ogre::Vector3& origin)
: mData (data), mId (Misc::StringUtils::lowerCase (id)), mSceneMgr(sceneManager) : mData (data), mId (Misc::StringUtils::lowerCase (id)), mSceneMgr(sceneManager), mPhysics(physics)
{ {
mCellNode = sceneManager->getRootSceneNode()->createChildSceneNode(); mCellNode = sceneManager->getRootSceneNode()->createChildSceneNode();
mCellNode->setPosition (origin); mCellNode->setPosition (origin);
@ -88,26 +88,17 @@ CSVRender::Cell::Cell (CSMWorld::Data& data, Ogre::SceneManager *sceneManager,
{ {
float verts = ESM::Land::LAND_SIZE; float verts = ESM::Land::LAND_SIZE;
float worldsize = ESM::Land::REAL_SIZE; float worldsize = ESM::Land::REAL_SIZE;
CSVWorld::PhysicsSystem::instance()->addHeightField(sceneManager, mX = esmLand->mX;
esmLand->mLandData->mHeights, esmLand->mX, esmLand->mY, 0, worldsize / (verts-1), verts); mY = esmLand->mY;
mPhysics->addHeightField(sceneManager,
esmLand->mLandData->mHeights, mX, mY, 0, worldsize / (verts-1), verts);
} }
} }
} }
CSVRender::Cell::~Cell() CSVRender::Cell::~Cell()
{ {
// TODO: maybe store the cell coordinates rather than searching for them in the destructor? mPhysics->removeHeightField(mSceneMgr, mX, mY);
if(mTerrain.get())
{
const CSMWorld::IdCollection<CSMWorld::Land>& land = mData.getLand();
int landIndex = land.searchId(mId);
if (landIndex != -1)
{
const ESM::Land* esmLand = land.getRecord(mId).get().mLand.get();
if(esmLand)
CSVWorld::PhysicsSystem::instance()->removeHeightField(mSceneMgr, esmLand->mX, esmLand->mY);
}
}
for (std::map<std::string, Object *>::iterator iter (mObjects.begin()); for (std::map<std::string, Object *>::iterator iter (mObjects.begin());
iter!=mObjects.end(); ++iter) iter!=mObjects.end(); ++iter)
@ -201,7 +192,7 @@ bool CSVRender::Cell::referenceDataChanged (const QModelIndex& topLeft,
for (std::map<std::string, bool>::iterator iter (ids.begin()); iter!=ids.end(); ++iter) for (std::map<std::string, bool>::iterator iter (ids.begin()); iter!=ids.end(); ++iter)
{ {
mObjects.insert (std::make_pair ( mObjects.insert (std::make_pair (
iter->first, new Object (mData, mCellNode, iter->first, false))); iter->first, new Object (mData, mCellNode, iter->first, false, mPhysics)));
modified = true; modified = true;
} }

View file

@ -23,6 +23,11 @@ namespace CSMWorld
class Data; class Data;
} }
namespace CSVWorld
{
class PhysicsSystem;
}
namespace CSVRender namespace CSVRender
{ {
class Cell class Cell
@ -32,7 +37,10 @@ namespace CSVRender
Ogre::SceneNode *mCellNode; Ogre::SceneNode *mCellNode;
std::map<std::string, Object *> mObjects; std::map<std::string, Object *> mObjects;
std::auto_ptr<Terrain::TerrainGrid> mTerrain; std::auto_ptr<Terrain::TerrainGrid> mTerrain;
CSVWorld::PhysicsSystem *mPhysics;
Ogre::SceneManager *mSceneMgr; Ogre::SceneManager *mSceneMgr;
int mX;
int mY;
/// Ignored if cell does not have an object with the given ID. /// Ignored if cell does not have an object with the given ID.
/// ///
@ -46,8 +54,8 @@ namespace CSVRender
public: public:
Cell (CSMWorld::Data& data, Ogre::SceneManager *sceneManager, Cell (CSMWorld::Data& data, Ogre::SceneManager *sceneManager, const std::string& id,
const std::string& id, const Ogre::Vector3& origin = Ogre::Vector3 (0, 0, 0)); CSVWorld::PhysicsSystem *physics, const Ogre::Vector3& origin = Ogre::Vector3 (0, 0, 0));
~Cell(); ~Cell();

View file

@ -34,7 +34,7 @@ void CSVRender::Object::clearSceneNode (Ogre::SceneNode *node)
void CSVRender::Object::clear() void CSVRender::Object::clear()
{ {
if(!mObject.isNull()) if(!mObject.isNull())
CSVWorld::PhysicsSystem::instance()->removeObject(mBase->getName()); mPhysics->removeObject(mBase->getName());
mObject.setNull(); mObject.setNull();
@ -79,7 +79,7 @@ void CSVRender::Object::update()
mObject = NifOgre::Loader::createObjects (mBase, "Meshes\\" + model); mObject = NifOgre::Loader::createObjects (mBase, "Meshes\\" + model);
mObject->setVisibilityFlags (Element_Reference); mObject->setVisibilityFlags (Element_Reference);
if (!mReferenceId.empty()) if (mPhysics && !mReferenceId.empty())
{ {
const CSMWorld::CellRef& reference = getReference(); const CSMWorld::CellRef& reference = getReference();
@ -93,8 +93,7 @@ void CSVRender::Object::update()
Ogre::Quaternion yr (Ogre::Radian (-reference.mPos.rot[1]), Ogre::Vector3::UNIT_Y); Ogre::Quaternion yr (Ogre::Radian (-reference.mPos.rot[1]), Ogre::Vector3::UNIT_Y);
Ogre::Quaternion zr (Ogre::Radian (-reference.mPos.rot[2]), Ogre::Vector3::UNIT_Z); Ogre::Quaternion zr (Ogre::Radian (-reference.mPos.rot[2]), Ogre::Vector3::UNIT_Z);
CSVWorld::PhysicsSystem::instance()->addObject("meshes\\" + model, mPhysics->addObject("meshes\\" + model, mBase->getName(), mReferenceId, reference.mScale, position, xr*yr*zr);
mBase->getName(), mReferenceId, reference.mScale, position, xr*yr*zr);
} }
} }
} }
@ -133,8 +132,9 @@ const CSMWorld::CellRef& CSVRender::Object::getReference() const
} }
CSVRender::Object::Object (const CSMWorld::Data& data, Ogre::SceneNode *cellNode, CSVRender::Object::Object (const CSMWorld::Data& data, Ogre::SceneNode *cellNode,
const std::string& id, bool referenceable, bool forceBaseToZero) const std::string& id, bool referenceable, CSVWorld::PhysicsSystem *physics,
: mData (data), mBase (0), mForceBaseToZero (forceBaseToZero) bool forceBaseToZero)
: mData (data), mBase (0), mForceBaseToZero (forceBaseToZero), mPhysics(physics)
{ {
mBase = cellNode->createChildSceneNode(); mBase = cellNode->createChildSceneNode();

View file

@ -16,6 +16,11 @@ namespace CSMWorld
class CellRef; class CellRef;
} }
namespace CSVWorld
{
class PhysicsSystem;
}
namespace CSVRender namespace CSVRender
{ {
class Object class Object
@ -26,6 +31,7 @@ namespace CSVRender
Ogre::SceneNode *mBase; Ogre::SceneNode *mBase;
NifOgre::ObjectScenePtr mObject; NifOgre::ObjectScenePtr mObject;
bool mForceBaseToZero; bool mForceBaseToZero;
CSVWorld::PhysicsSystem *mPhysics;
/// Not implemented /// Not implemented
Object (const Object&); Object (const Object&);
@ -51,7 +57,8 @@ namespace CSVRender
public: public:
Object (const CSMWorld::Data& data, Ogre::SceneNode *cellNode, Object (const CSMWorld::Data& data, Ogre::SceneNode *cellNode,
const std::string& id, bool referenceable, bool forceBaseToZero = false); const std::string& id, bool referenceable,
CSVWorld::PhysicsSystem *physics = NULL, bool forceBaseToZero = false);
/// \param forceBaseToZero If this is a reference ignore the coordinates and place /// \param forceBaseToZero If this is a reference ignore the coordinates and place
/// it at 0, 0, 0 instead. /// it at 0, 0, 0 instead.

View file

@ -109,7 +109,7 @@ bool CSVRender::PagedWorldspaceWidget::adjustCells()
mCells.find (*iter)==mCells.end()) mCells.find (*iter)==mCells.end())
{ {
Cell *cell = new Cell (mDocument.getData(), getSceneManager(), Cell *cell = new Cell (mDocument.getData(), getSceneManager(),
iter->getId (mWorldspace)); iter->getId (mWorldspace), getPhysics());
mCells.insert (std::make_pair (*iter, cell)); mCells.insert (std::make_pair (*iter, cell));
float height = cell->getTerrainHeightAt(Ogre::Vector3( float height = cell->getTerrainHeightAt(Ogre::Vector3(

View file

@ -10,7 +10,7 @@
CSVRender::PreviewWidget::PreviewWidget (CSMWorld::Data& data, CSVRender::PreviewWidget::PreviewWidget (CSMWorld::Data& data,
const std::string& id, bool referenceable, QWidget *parent) const std::string& id, bool referenceable, QWidget *parent)
: SceneWidget (parent), mData (data), : SceneWidget (parent), mData (data),
mObject (data, getSceneManager()->getRootSceneNode(), id, referenceable, true) mObject (data, getSceneManager()->getRootSceneNode(), id, referenceable, NULL, true)
{ {
setNavigation (&mOrbit); setNavigation (&mOrbit);

View file

@ -13,8 +13,6 @@
#include <OgreViewport.h> #include <OgreViewport.h>
#include <OgreOverlaySystem.h> #include <OgreOverlaySystem.h>
#include "../world/physicssystem.hpp"
#include "../widget/scenetoolmode.hpp" #include "../widget/scenetoolmode.hpp"
#include "../../model/settings/usersettings.hpp" #include "../../model/settings/usersettings.hpp"
@ -66,8 +64,6 @@ namespace CSVRender
mOverlaySystem = OverlaySystem::instance().get(); mOverlaySystem = OverlaySystem::instance().get();
mSceneMgr->addRenderQueueListener(mOverlaySystem); mSceneMgr->addRenderQueueListener(mOverlaySystem);
CSVWorld::PhysicsSystem::instance()->addSceneManager(mSceneMgr, this);
QTimer *timer = new QTimer (this); QTimer *timer = new QTimer (this);
connect (timer, SIGNAL (timeout()), this, SLOT (update())); connect (timer, SIGNAL (timeout()), this, SLOT (update()));
@ -166,8 +162,6 @@ namespace CSVRender
SceneWidget::~SceneWidget() SceneWidget::~SceneWidget()
{ {
CSVWorld::PhysicsSystem::instance()->removeSceneManager(mSceneMgr);
if (mWindow) if (mWindow)
Ogre::Root::getSingleton().destroyRenderTarget (mWindow); Ogre::Root::getSingleton().destroyRenderTarget (mWindow);

View file

@ -56,7 +56,7 @@ CSVRender::UnpagedWorldspaceWidget::UnpagedWorldspaceWidget (const std::string&
update(); update();
mCell.reset (new Cell (document.getData(), getSceneManager(), mCellId)); mCell.reset (new Cell (document.getData(), getSceneManager(), mCellId, getPhysics()));
} }
void CSVRender::UnpagedWorldspaceWidget::cellDataChanged (const QModelIndex& topLeft, void CSVRender::UnpagedWorldspaceWidget::cellDataChanged (const QModelIndex& topLeft,
@ -98,7 +98,7 @@ bool CSVRender::UnpagedWorldspaceWidget::handleDrop (const std::vector<CSMWorld:
return false; return false;
mCellId = data.begin()->getId(); mCellId = data.begin()->getId();
mCell.reset (new Cell (getDocument().getData(), getSceneManager(), mCellId)); mCell.reset (new Cell (getDocument().getData(), getSceneManager(), mCellId, getPhysics()));
update(); update();
emit cellChanged(*data.begin()); emit cellChanged(*data.begin());

View file

@ -24,6 +24,7 @@
#include "../widget/scenetooltoggle.hpp" #include "../widget/scenetooltoggle.hpp"
#include "../widget/scenetoolrun.hpp" #include "../widget/scenetoolrun.hpp"
#include "../world/physicsmanager.hpp"
#include "../world/physicssystem.hpp" #include "../world/physicssystem.hpp"
#include "elements.hpp" #include "elements.hpp"
@ -147,6 +148,10 @@ CSVRender::WorldspaceWidget::WorldspaceWidget (CSMDoc::Document& document, QWidg
connect (debugProfiles, SIGNAL (rowsAboutToBeRemoved (const QModelIndex&, int, int)), connect (debugProfiles, SIGNAL (rowsAboutToBeRemoved (const QModelIndex&, int, int)),
this, SLOT (debugProfileAboutToBeRemoved (const QModelIndex&, int, int))); this, SLOT (debugProfileAboutToBeRemoved (const QModelIndex&, int, int)));
// associate WorldSpaceWidgets (and their SceneManagers with Documents, then create physics if new document
mPhysics = CSVWorld::PhysicsManager::instance()->addSceneWidget(document, this);
mPhysics->addSceneManager(getSceneManager(), this);
initDebug(); initDebug();
mMouseEventTimer = new QElapsedTimer(); mMouseEventTimer = new QElapsedTimer();
mMouseEventTimer->invalidate(); mMouseEventTimer->invalidate();
@ -166,6 +171,9 @@ CSVRender::WorldspaceWidget::WorldspaceWidget (CSMDoc::Document& document, QWidg
CSVRender::WorldspaceWidget::~WorldspaceWidget () CSVRender::WorldspaceWidget::~WorldspaceWidget ()
{ {
mPhysics->removeSceneManager(getSceneManager());
CSVWorld::PhysicsManager::instance()->removeSceneWidget(this);
delete mMouseEventTimer; delete mMouseEventTimer;
// For debugging only // For debugging only
@ -457,6 +465,12 @@ void CSVRender::WorldspaceWidget::updateOverlay()
{ {
} }
CSVWorld::PhysicsSystem *CSVRender::WorldspaceWidget::getPhysics()
{
assert(mPhysics);
return mPhysics;
}
// mouse picking // mouse picking
// FIXME: need to virtualise mouse buttons // FIXME: need to virtualise mouse buttons
// //
@ -525,8 +539,7 @@ void CSVRender::WorldspaceWidget::mouseMoveEvent (QMouseEvent *event)
pos.z += mZOffset; pos.z += mZOffset;
getSceneManager()->getSceneNode(mGrabbedSceneNode)->setPosition(pos+planeResult.second-mOrigMousePos); getSceneManager()->getSceneNode(mGrabbedSceneNode)->setPosition(pos+planeResult.second-mOrigMousePos);
mCurrentMousePos = planeResult.second; mCurrentMousePos = planeResult.second;
CSVWorld::PhysicsSystem::instance()->moveSceneNodes(mGrabbedSceneNode, mPhysics->moveSceneNodes(mGrabbedSceneNode, pos+planeResult.second-mOrigMousePos);
pos+planeResult.second-mOrigMousePos);
updateSceneWidgets(); updateSceneWidgets();
} }
} }
@ -634,8 +647,7 @@ void CSVRender::WorldspaceWidget::mouseReleaseEvent (QMouseEvent *event)
// print some debug info // print some debug info
if(isDebug()) if(isDebug())
{ {
std::string referenceId = std::string referenceId = mPhysics->sceneNodeToRefId(result.first);
CSVWorld::PhysicsSystem::instance()->sceneNodeToRefId(result.first);
std::cout << "ReferenceId: " << referenceId << std::endl; std::cout << "ReferenceId: " << referenceId << std::endl;
const CSMWorld::RefCollection& references = mDocument.getData().getReferences(); const CSMWorld::RefCollection& references = mDocument.getData().getReferences();
int index = references.searchId(referenceId); int index = references.searchId(referenceId);
@ -719,8 +731,8 @@ void CSVRender::WorldspaceWidget::mouseDoubleClickEvent (QMouseEvent *event)
// debug drawer. Hence only the first subview that creates the debug drawer // debug drawer. Hence only the first subview that creates the debug drawer
// can view the debug lines. Will need to keep a map in OEngine if multiple // can view the debug lines. Will need to keep a map in OEngine if multiple
// subviews are to be supported. // subviews are to be supported.
//CSVWorld::PhysicsSystem::instance()->setSceneManager(getSceneManager()); //mPhysics->setSceneManager(getSceneManager());
CSVWorld::PhysicsSystem::instance()->toggleDebugRendering(getSceneManager()); mPhysics->toggleDebugRendering(getSceneManager());
flagAsModified(); flagAsModified();
} }
} }
@ -746,8 +758,7 @@ void CSVRender::WorldspaceWidget::wheelEvent (QWheelEvent *event)
Ogre::Vector3 pos = mOrigObjPos; Ogre::Vector3 pos = mOrigObjPos;
pos.z += mZOffset; pos.z += mZOffset;
getSceneManager()->getSceneNode(mGrabbedSceneNode)->setPosition(pos+mCurrentMousePos-mOrigMousePos); getSceneManager()->getSceneNode(mGrabbedSceneNode)->setPosition(pos+mCurrentMousePos-mOrigMousePos);
CSVWorld::PhysicsSystem::instance()->moveSceneNodes(mGrabbedSceneNode, mPhysics->moveSceneNodes(mGrabbedSceneNode, pos+mCurrentMousePos-mOrigMousePos);
pos+mCurrentMousePos-mOrigMousePos);
updateSceneWidgets(); updateSceneWidgets();
} }
break; break;
@ -844,8 +855,7 @@ std::pair<std::string, Ogre::Vector3> CSVRender::WorldspaceWidget::terrainUnderC
float x = (float) mouseX / getCamera()->getViewport()->getActualWidth(); float x = (float) mouseX / getCamera()->getViewport()->getActualWidth();
float y = (float) mouseY / getCamera()->getViewport()->getActualHeight(); float y = (float) mouseY / getCamera()->getViewport()->getActualHeight();
std::pair<std::string, Ogre::Vector3> result = std::pair<std::string, Ogre::Vector3> result = mPhysics->castRay(x, y, getSceneManager(), getCamera());
CSVWorld::PhysicsSystem::instance()->castRay(x, y, getSceneManager(), getCamera());
if(result.first != "") if(result.first != "")
{ {
// FIXME: is there a better way to distinguish terrain from objects? // FIXME: is there a better way to distinguish terrain from objects?
@ -867,8 +877,7 @@ std::pair<std::string, Ogre::Vector3> CSVRender::WorldspaceWidget::objectUnderCu
float x = (float) mouseX / getCamera()->getViewport()->getActualWidth(); float x = (float) mouseX / getCamera()->getViewport()->getActualWidth();
float y = (float) mouseY / getCamera()->getViewport()->getActualHeight(); float y = (float) mouseY / getCamera()->getViewport()->getActualHeight();
std::pair<std::string, Ogre::Vector3> result = std::pair<std::string, Ogre::Vector3> result = mPhysics->castRay(x, y, getSceneManager(), getCamera());
CSVWorld::PhysicsSystem::instance()->castRay(x, y, getSceneManager(), getCamera());
if(result.first != "") if(result.first != "")
{ {
// NOTE: anything not terrain is assumed to be an object // NOTE: anything not terrain is assumed to be an object
@ -910,17 +919,16 @@ void CSVRender::WorldspaceWidget::placeObject(const std::string sceneNode, const
getSceneManager()->getSceneNode(sceneNode)->setPosition(pos); getSceneManager()->getSceneNode(sceneNode)->setPosition(pos);
// update physics // update physics
std::string refId = CSVWorld::PhysicsSystem::instance()->sceneNodeToRefId(sceneNode); std::string refId = mPhysics->sceneNodeToRefId(sceneNode);
const CSMWorld::CellRef& cellref = const CSMWorld::CellRef& cellref = mDocument.getData().getReferences().getRecord (refId).get();
mDocument.getData().getReferences().getRecord (refId).get();
Ogre::Quaternion xr (Ogre::Radian (-cellref.mPos.rot[0]), Ogre::Vector3::UNIT_X); Ogre::Quaternion xr (Ogre::Radian (-cellref.mPos.rot[0]), Ogre::Vector3::UNIT_X);
Ogre::Quaternion yr (Ogre::Radian (-cellref.mPos.rot[1]), Ogre::Vector3::UNIT_Y); Ogre::Quaternion yr (Ogre::Radian (-cellref.mPos.rot[1]), Ogre::Vector3::UNIT_Y);
Ogre::Quaternion zr (Ogre::Radian (-cellref.mPos.rot[2]), Ogre::Vector3::UNIT_Z); Ogre::Quaternion zr (Ogre::Radian (-cellref.mPos.rot[2]), Ogre::Vector3::UNIT_Z);
// FIXME: adjustRigidBody() seems to lose objects, work around by deleting and recreating objects // FIXME: adjustRigidBody() seems to lose objects, work around by deleting and recreating objects
//CSVWorld::PhysicsSystem::instance()->moveObject(sceneNode, pos, xr*yr*zr); //mPhysics->moveObject(sceneNode, pos, xr*yr*zr);
std::string mesh = CSVWorld::PhysicsSystem::instance()->sceneNodeToMesh(sceneNode); std::string mesh = mPhysics->sceneNodeToMesh(sceneNode);
CSVWorld::PhysicsSystem::instance()->replaceObject(mesh, sceneNode, refId, cellref.mScale, pos, xr*yr*zr); mPhysics->replaceObject(mesh, sceneNode, refId, cellref.mScale, pos, xr*yr*zr);
// update all SceneWidgets and their SceneManagers // update all SceneWidgets and their SceneManagers
updateSceneWidgets(); updateSceneWidgets();
@ -928,8 +936,7 @@ void CSVRender::WorldspaceWidget::placeObject(const std::string sceneNode, const
void CSVRender::WorldspaceWidget::updateSceneWidgets() void CSVRender::WorldspaceWidget::updateSceneWidgets()
{ {
std::map<Ogre::SceneManager*, CSVRender::SceneWidget *> sceneWidgets = std::map<Ogre::SceneManager*, CSVRender::SceneWidget *> sceneWidgets = mPhysics->sceneWidgets();
CSVWorld::PhysicsSystem::instance()->sceneWidgets();
std::map<Ogre::SceneManager*, CSVRender::SceneWidget *>::iterator iter = sceneWidgets.begin(); std::map<Ogre::SceneManager*, CSVRender::SceneWidget *>::iterator iter = sceneWidgets.begin();
for(; iter != sceneWidgets.end(); ++iter) for(; iter != sceneWidgets.end(); ++iter)

View file

@ -13,6 +13,7 @@ namespace CSMWorld
{ {
class UniversalId; class UniversalId;
} }
namespace CSVWidget namespace CSVWidget
{ {
class SceneToolMode; class SceneToolMode;
@ -21,6 +22,11 @@ namespace CSVWidget
class SceneToolRun; class SceneToolRun;
} }
namespace CSVWorld
{
class PhysicsSystem;
}
class QElapsedTimer; class QElapsedTimer;
namespace CSVRender namespace CSVRender
@ -35,6 +41,7 @@ namespace CSVRender
CSVWidget::SceneToolToggle *mSceneElements; CSVWidget::SceneToolToggle *mSceneElements;
CSVWidget::SceneToolRun *mRun; CSVWidget::SceneToolRun *mRun;
CSMDoc::Document& mDocument; CSMDoc::Document& mDocument;
CSVWorld::PhysicsSystem *mPhysics;
enum MouseState enum MouseState
{ {
@ -113,6 +120,8 @@ namespace CSVRender
virtual void updateOverlay(); virtual void updateOverlay();
CSVWorld::PhysicsSystem *getPhysics();
virtual void mouseMoveEvent (QMouseEvent *event); virtual void mouseMoveEvent (QMouseEvent *event);
virtual void mousePressEvent (QMouseEvent *event); virtual void mousePressEvent (QMouseEvent *event);
virtual void mouseReleaseEvent (QMouseEvent *event); virtual void mouseReleaseEvent (QMouseEvent *event);

View file

@ -13,13 +13,8 @@
namespace CSVWorld namespace CSVWorld
{ {
PhysicsSystem *PhysicsSystem::mPhysicsSystemInstance = 0;
PhysicsSystem::PhysicsSystem() PhysicsSystem::PhysicsSystem()
{ {
assert(!mPhysicsSystemInstance);
mPhysicsSystemInstance = this;
// Create physics. shapeLoader is deleted by the physic engine // Create physics. shapeLoader is deleted by the physic engine
NifBullet::ManualBulletShapeLoader* shapeLoader = new NifBullet::ManualBulletShapeLoader(); NifBullet::ManualBulletShapeLoader* shapeLoader = new NifBullet::ManualBulletShapeLoader();
mEngine = new OEngine::Physic::PhysicEngine(shapeLoader); mEngine = new OEngine::Physic::PhysicEngine(shapeLoader);
@ -28,13 +23,6 @@ namespace CSVWorld
PhysicsSystem::~PhysicsSystem() PhysicsSystem::~PhysicsSystem()
{ {
delete mEngine; delete mEngine;
// FIXME: update maps when SceneManagers are destroyed
}
PhysicsSystem *PhysicsSystem::instance()
{
assert(mPhysicsSystemInstance);
return mPhysicsSystemInstance;
} }
// FIXME: looks up the scene manager based on the scene node name (highly inefficient) // FIXME: looks up the scene manager based on the scene node name (highly inefficient)
@ -60,7 +48,7 @@ namespace CSVWorld
} }
if(!foundSceneManager) if(!foundSceneManager)
return; // FIXME: this should be an exception return; // FIXME: should this be an exception
// update physics, only one physics model per referenceId // update physics, only one physics model per referenceId
if(mEngine->getRigidBody(referenceId, true) == NULL) if(mEngine->getRigidBody(referenceId, true) == NULL)

View file

@ -30,12 +30,10 @@ namespace CSVWorld
{ {
class PhysicsSystem class PhysicsSystem
{ {
static PhysicsSystem *mPhysicsSystemInstance;
std::map<std::string, std::string> mSceneNodeToRefId; std::map<std::string, std::string> mSceneNodeToRefId;
std::map<std::string, std::map<Ogre::SceneManager *, std::string> > mRefIdToSceneNode; std::map<std::string, std::map<Ogre::SceneManager *, std::string> > mRefIdToSceneNode;
std::map<std::string, std::string> mSceneNodeToMesh; std::map<std::string, std::string> mSceneNodeToMesh;
std::list<Ogre::SceneManager *> mSceneManagers; // FIXME: change to list per OEngine std::list<Ogre::SceneManager *> mSceneManagers;
//std::list<CSVRender::SceneWidget *> mSceneWidgets; // FIXME: change to list per OEngine
std::map<Ogre::SceneManager*, CSVRender::SceneWidget *> mSceneWidgets; std::map<Ogre::SceneManager*, CSVRender::SceneWidget *> mSceneWidgets;
OEngine::Physic::PhysicEngine* mEngine; OEngine::Physic::PhysicEngine* mEngine;
std::multimap<std::string, Ogre::SceneManager *> mTerrain; std::multimap<std::string, Ogre::SceneManager *> mTerrain;
@ -44,9 +42,6 @@ namespace CSVWorld
PhysicsSystem(); PhysicsSystem();
~PhysicsSystem(); ~PhysicsSystem();
static PhysicsSystem *instance();
void addSceneManager(Ogre::SceneManager *sceneMgr, CSVRender::SceneWidget * scene); void addSceneManager(Ogre::SceneManager *sceneMgr, CSVRender::SceneWidget * scene);
void removeSceneManager(Ogre::SceneManager *sceneMgr); void removeSceneManager(Ogre::SceneManager *sceneMgr);