forked from teamnwah/openmw-tes3coop
Merge remote-tracking branch 'remotes/upstream/master' into single-instance
Conflicts: apps/opencs/editor.cpp
This commit is contained in:
commit
8d0cca6cfc
22 changed files with 60 additions and 206 deletions
|
@ -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 physicsmanager
|
scripthighlighter idvalidator dialoguecreator physicssystem
|
||||||
)
|
)
|
||||||
|
|
||||||
opencs_units (view/widget
|
opencs_units (view/widget
|
||||||
|
|
|
@ -1,6 +1,8 @@
|
||||||
|
|
||||||
#include "editor.hpp"
|
#include "editor.hpp"
|
||||||
|
|
||||||
|
#include <openengine/bullet/BulletShapeLoader.h>
|
||||||
|
|
||||||
#include <QApplication>
|
#include <QApplication>
|
||||||
#include <QLocalServer>
|
#include <QLocalServer>
|
||||||
#include <QLocalSocket>
|
#include <QLocalSocket>
|
||||||
|
@ -21,7 +23,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), mPhysicsManager (0),
|
mViewManager (mDocumentManager),
|
||||||
mIpcServerName ("org.openmw.OpenCS"), mServer(NULL), mClientSocket(NULL), mPid(""), mLock()
|
mIpcServerName ("org.openmw.OpenCS"), mServer(NULL), mClientSocket(NULL), mPid(""), mLock()
|
||||||
{
|
{
|
||||||
std::pair<Files::PathContainer, std::vector<std::string> > config = readConfig();
|
std::pair<Files::PathContainer, std::vector<std::string> > config = readConfig();
|
||||||
|
@ -34,7 +36,6 @@ 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);
|
||||||
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);
|
||||||
|
@ -73,6 +74,9 @@ CS::Editor::~Editor ()
|
||||||
{
|
{
|
||||||
if(mServer && boost::filesystem::exists(mPid))
|
if(mServer && boost::filesystem::exists(mPid))
|
||||||
remove(mPid.string().c_str()); // ignore error
|
remove(mPid.string().c_str()); // ignore error
|
||||||
|
|
||||||
|
// cleanup global resources used by OEngine
|
||||||
|
delete OEngine::Physic::BulletShapeManager::getSingletonPtr();
|
||||||
}
|
}
|
||||||
|
|
||||||
void CS::Editor::setupDataFiles (const Files::PathContainer& dataDirs)
|
void CS::Editor::setupDataFiles (const Files::PathContainer& dataDirs)
|
||||||
|
|
|
@ -30,7 +30,6 @@
|
||||||
|
|
||||||
#include "view/settings/dialog.hpp"
|
#include "view/settings/dialog.hpp"
|
||||||
#include "view/render/overlaysystem.hpp"
|
#include "view/render/overlaysystem.hpp"
|
||||||
#include "view/world/physicsmanager.hpp"
|
|
||||||
|
|
||||||
namespace OgreInit
|
namespace OgreInit
|
||||||
{
|
{
|
||||||
|
@ -47,7 +46,6 @@ 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::PhysicsManager> mPhysicsManager;
|
|
||||||
CSMDoc::DocumentManager mDocumentManager;
|
CSMDoc::DocumentManager mDocumentManager;
|
||||||
CSVDoc::ViewManager mViewManager;
|
CSVDoc::ViewManager mViewManager;
|
||||||
CSVDoc::StartupDialogue mStartup;
|
CSVDoc::StartupDialogue mStartup;
|
||||||
|
|
|
@ -9,6 +9,8 @@
|
||||||
#include <components/files/configurationmanager.hpp>
|
#include <components/files/configurationmanager.hpp>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#include "../../view/world/physicssystem.hpp"
|
||||||
|
|
||||||
void CSMDoc::Document::addGmsts()
|
void CSMDoc::Document::addGmsts()
|
||||||
{
|
{
|
||||||
static const char *gmstFloats[] =
|
static const char *gmstFloats[] =
|
||||||
|
@ -2253,7 +2255,7 @@ CSMDoc::Document::Document (const Files::ConfigurationManager& configuration,
|
||||||
mProjectPath ((configuration.getUserDataPath() / "projects") /
|
mProjectPath ((configuration.getUserDataPath() / "projects") /
|
||||||
(savePath.filename().string() + ".project")),
|
(savePath.filename().string() + ".project")),
|
||||||
mSaving (*this, mProjectPath, encoding),
|
mSaving (*this, mProjectPath, encoding),
|
||||||
mRunner (mProjectPath)
|
mRunner (mProjectPath), mPhysics(boost::shared_ptr<CSVWorld::PhysicsSystem>())
|
||||||
{
|
{
|
||||||
if (mContentFiles.empty())
|
if (mContentFiles.empty())
|
||||||
throw std::runtime_error ("Empty content file sequence");
|
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);
|
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 <string>
|
||||||
|
|
||||||
|
#include <boost/shared_ptr.hpp>
|
||||||
#include <boost/filesystem/path.hpp>
|
#include <boost/filesystem/path.hpp>
|
||||||
|
|
||||||
#include <QUndoStack>
|
#include <QUndoStack>
|
||||||
|
@ -39,6 +40,11 @@ namespace CSMWorld
|
||||||
class ResourcesManager;
|
class ResourcesManager;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
namespace CSVWorld
|
||||||
|
{
|
||||||
|
class PhysicsSystem;
|
||||||
|
}
|
||||||
|
|
||||||
namespace CSMDoc
|
namespace CSMDoc
|
||||||
{
|
{
|
||||||
class Document : public QObject
|
class Document : public QObject
|
||||||
|
@ -57,6 +63,7 @@ namespace CSMDoc
|
||||||
boost::filesystem::path mResDir;
|
boost::filesystem::path mResDir;
|
||||||
Blacklist mBlacklist;
|
Blacklist mBlacklist;
|
||||||
Runner mRunner;
|
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
|
// 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.
|
// 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();
|
QTextDocument *getRunLog();
|
||||||
|
|
||||||
|
boost::shared_ptr<CSVWorld::PhysicsSystem> getPhysics();
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
|
|
||||||
void stateChanged (int state, CSMDoc::Document *document);
|
void stateChanged (int state, CSMDoc::Document *document);
|
||||||
|
|
|
@ -272,7 +272,7 @@ namespace CSMWorld
|
||||||
{
|
{
|
||||||
ESXRecordT record2 = record.get();
|
ESXRecordT record2 = record.get();
|
||||||
|
|
||||||
record2.mData.mUseValue[mIndex] = data.toInt();
|
record2.mData.mUseValue[mIndex] = data.toFloat();
|
||||||
|
|
||||||
record.setModified (record2);
|
record.setModified (record2);
|
||||||
}
|
}
|
||||||
|
|
|
@ -16,7 +16,6 @@
|
||||||
#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"
|
||||||
|
|
||||||
|
@ -407,8 +406,6 @@ 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()
|
||||||
|
|
|
@ -16,7 +16,6 @@
|
||||||
#include "../world/vartypedelegate.hpp"
|
#include "../world/vartypedelegate.hpp"
|
||||||
#include "../world/recordstatusdelegate.hpp"
|
#include "../world/recordstatusdelegate.hpp"
|
||||||
#include "../world/idtypedelegate.hpp"
|
#include "../world/idtypedelegate.hpp"
|
||||||
#include "../world/physicsmanager.hpp"
|
|
||||||
|
|
||||||
#include "../../model/settings/usersettings.hpp"
|
#include "../../model/settings/usersettings.hpp"
|
||||||
|
|
||||||
|
@ -219,7 +218,6 @@ void CSVDoc::ViewManager::removeDocAndView (CSMDoc::Document *document)
|
||||||
mDocumentManager.removeDocument(document);
|
mDocumentManager.removeDocument(document);
|
||||||
(*iter)->deleteLater();
|
(*iter)->deleteLater();
|
||||||
mViews.erase (iter);
|
mViews.erase (iter);
|
||||||
CSVWorld::PhysicsManager::instance()->removeDocument(document);
|
|
||||||
|
|
||||||
updateIndices();
|
updateIndices();
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -60,7 +60,7 @@ 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, 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)
|
: mData (data), mId (Misc::StringUtils::lowerCase (id)), mSceneMgr(sceneManager), mPhysics(physics)
|
||||||
{
|
{
|
||||||
mCellNode = sceneManager->getRootSceneNode()->createChildSceneNode();
|
mCellNode = sceneManager->getRootSceneNode()->createChildSceneNode();
|
||||||
|
|
|
@ -5,6 +5,8 @@
|
||||||
#include <map>
|
#include <map>
|
||||||
#include <memory>
|
#include <memory>
|
||||||
|
|
||||||
|
#include <boost/shared_ptr.hpp>
|
||||||
|
|
||||||
#include <OgreVector3.h>
|
#include <OgreVector3.h>
|
||||||
|
|
||||||
#include <components/terrain/terraingrid.hpp>
|
#include <components/terrain/terraingrid.hpp>
|
||||||
|
@ -38,7 +40,7 @@ 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;
|
boost::shared_ptr<CSVWorld::PhysicsSystem> mPhysics;
|
||||||
Ogre::SceneManager *mSceneMgr;
|
Ogre::SceneManager *mSceneMgr;
|
||||||
int mX;
|
int mX;
|
||||||
int mY;
|
int mY;
|
||||||
|
@ -56,7 +58,7 @@ namespace CSVRender
|
||||||
public:
|
public:
|
||||||
|
|
||||||
Cell (CSMWorld::Data& data, Ogre::SceneManager *sceneManager, const std::string& id,
|
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();
|
~Cell();
|
||||||
|
|
||||||
|
|
|
@ -56,7 +56,7 @@ namespace CSVRender
|
||||||
//
|
//
|
||||||
|
|
||||||
MouseState::MouseState(WorldspaceWidget *parent)
|
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)
|
, mCurrentObj(""), mMouseState(Mouse_Default), mOldPos(0,0), mMouseEventTimer(0), mPlane(0)
|
||||||
, mGrabbedSceneNode(""), mOrigObjPos(Ogre::Vector3()), mOrigMousePos(Ogre::Vector3())
|
, mGrabbedSceneNode(""), mOrigObjPos(Ogre::Vector3()), mOrigMousePos(Ogre::Vector3())
|
||||||
, mCurrentMousePos(Ogre::Vector3()), mOffset(0.0f)
|
, mCurrentMousePos(Ogre::Vector3()), mOffset(0.0f)
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
#define OPENCS_VIEW_MOUSESTATE_H
|
#define OPENCS_VIEW_MOUSESTATE_H
|
||||||
|
|
||||||
#include <map>
|
#include <map>
|
||||||
|
#include <boost/shared_ptr.hpp>
|
||||||
#include <QPoint>
|
#include <QPoint>
|
||||||
#include <OgreVector3.h>
|
#include <OgreVector3.h>
|
||||||
|
|
||||||
|
@ -43,7 +44,7 @@ namespace CSVRender
|
||||||
MouseStates mMouseState;
|
MouseStates mMouseState;
|
||||||
|
|
||||||
WorldspaceWidget *mParent;
|
WorldspaceWidget *mParent;
|
||||||
CSVWorld::PhysicsSystem *mPhysics; // local copy
|
boost::shared_ptr<CSVWorld::PhysicsSystem> mPhysics;
|
||||||
Ogre::SceneManager *mSceneManager; // local copy
|
Ogre::SceneManager *mSceneManager; // local copy
|
||||||
|
|
||||||
QPoint mOldPos;
|
QPoint mOldPos;
|
||||||
|
|
|
@ -132,7 +132,7 @@ 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, CSVWorld::PhysicsSystem *physics,
|
const std::string& id, bool referenceable, boost::shared_ptr<CSVWorld::PhysicsSystem> physics,
|
||||||
bool forceBaseToZero)
|
bool forceBaseToZero)
|
||||||
: mData (data), mBase (0), mForceBaseToZero (forceBaseToZero), mPhysics(physics)
|
: mData (data), mBase (0), mForceBaseToZero (forceBaseToZero), mPhysics(physics)
|
||||||
{
|
{
|
||||||
|
@ -156,6 +156,7 @@ CSVRender::Object::~Object()
|
||||||
{
|
{
|
||||||
clear();
|
clear();
|
||||||
|
|
||||||
|
if(mPhysics) // preview may not have physics enabled
|
||||||
mPhysics->removeObject(mBase->getName());
|
mPhysics->removeObject(mBase->getName());
|
||||||
|
|
||||||
if (mBase)
|
if (mBase)
|
||||||
|
|
|
@ -1,6 +1,8 @@
|
||||||
#ifndef OPENCS_VIEW_OBJECT_H
|
#ifndef OPENCS_VIEW_OBJECT_H
|
||||||
#define OPENCS_VIEW_OBJECT_H
|
#define OPENCS_VIEW_OBJECT_H
|
||||||
|
|
||||||
|
#include <boost/shared_ptr.hpp>
|
||||||
|
|
||||||
#include <components/nifogre/ogrenifloader.hpp>
|
#include <components/nifogre/ogrenifloader.hpp>
|
||||||
|
|
||||||
class QModelIndex;
|
class QModelIndex;
|
||||||
|
@ -31,7 +33,7 @@ namespace CSVRender
|
||||||
Ogre::SceneNode *mBase;
|
Ogre::SceneNode *mBase;
|
||||||
NifOgre::ObjectScenePtr mObject;
|
NifOgre::ObjectScenePtr mObject;
|
||||||
bool mForceBaseToZero;
|
bool mForceBaseToZero;
|
||||||
CSVWorld::PhysicsSystem *mPhysics;
|
boost::shared_ptr<CSVWorld::PhysicsSystem> mPhysics;
|
||||||
|
|
||||||
/// Not implemented
|
/// Not implemented
|
||||||
Object (const Object&);
|
Object (const Object&);
|
||||||
|
@ -58,7 +60,8 @@ namespace CSVRender
|
||||||
|
|
||||||
Object (const CSMWorld::Data& data, Ogre::SceneNode *cellNode,
|
Object (const CSMWorld::Data& data, Ogre::SceneNode *cellNode,
|
||||||
const std::string& id, bool referenceable,
|
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
|
/// \param forceBaseToZero If this is a reference ignore the coordinates and place
|
||||||
/// it at 0, 0, 0 instead.
|
/// it at 0, 0, 0 instead.
|
||||||
|
|
||||||
|
|
|
@ -112,7 +112,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), getPhysics());
|
iter->getId (mWorldspace), mDocument.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(
|
||||||
|
@ -371,9 +371,12 @@ CSVRender::PagedWorldspaceWidget::~PagedWorldspaceWidget()
|
||||||
delete iter->second;
|
delete iter->second;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(mOverlayMask)
|
||||||
|
{
|
||||||
removeRenderTargetListener(mOverlayMask);
|
removeRenderTargetListener(mOverlayMask);
|
||||||
delete mOverlayMask;
|
delete mOverlayMask;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void CSVRender::PagedWorldspaceWidget::useViewHint (const std::string& hint)
|
void CSVRender::PagedWorldspaceWidget::useViewHint (const std::string& hint)
|
||||||
{
|
{
|
||||||
|
|
|
@ -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, NULL, true)
|
mObject (data, getSceneManager()->getRootSceneNode(), id, referenceable, boost::shared_ptr<CSVWorld::PhysicsSystem>(), true)
|
||||||
{
|
{
|
||||||
setNavigation (&mOrbit);
|
setNavigation (&mOrbit);
|
||||||
|
|
||||||
|
|
|
@ -49,7 +49,7 @@ CSVRender::UnpagedWorldspaceWidget::UnpagedWorldspaceWidget (const std::string&
|
||||||
|
|
||||||
update();
|
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,
|
void CSVRender::UnpagedWorldspaceWidget::cellDataChanged (const QModelIndex& topLeft,
|
||||||
|
@ -91,7 +91,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, getPhysics()));
|
mCell.reset (new Cell (getDocument().getData(), getSceneManager(), mCellId, getDocument().getPhysics()));
|
||||||
|
|
||||||
update();
|
update();
|
||||||
emit cellChanged(*data.begin());
|
emit cellChanged(*data.begin());
|
||||||
|
|
|
@ -16,14 +16,13 @@
|
||||||
#include "../widget/scenetooltoggle2.hpp"
|
#include "../widget/scenetooltoggle2.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"
|
||||||
#include "editmode.hpp"
|
#include "editmode.hpp"
|
||||||
|
|
||||||
CSVRender::WorldspaceWidget::WorldspaceWidget (CSMDoc::Document& document, QWidget* parent)
|
CSVRender::WorldspaceWidget::WorldspaceWidget (CSMDoc::Document& document, QWidget* parent)
|
||||||
: SceneWidget (parent), mDocument(document), mSceneElements(0), mRun(0), mPhysics(0), mMouse(0),
|
: SceneWidget (parent), mDocument(document), mSceneElements(0), mRun(0), mPhysics(boost::shared_ptr<CSVWorld::PhysicsSystem>()), mMouse(0),
|
||||||
mInteractionMask (0)
|
mInteractionMask (0)
|
||||||
{
|
{
|
||||||
setAcceptDrops(true);
|
setAcceptDrops(true);
|
||||||
|
@ -56,9 +55,7 @@ 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
|
mPhysics = document.getPhysics(); // create physics if one doesn't exist
|
||||||
// then create physics if there is a new document
|
|
||||||
mPhysics = CSVWorld::PhysicsManager::instance()->addSceneWidget(document, this);
|
|
||||||
mPhysics->addSceneManager(getSceneManager(), this);
|
mPhysics->addSceneManager(getSceneManager(), this);
|
||||||
mMouse = new MouseState(this);
|
mMouse = new MouseState(this);
|
||||||
}
|
}
|
||||||
|
@ -67,7 +64,6 @@ CSVRender::WorldspaceWidget::~WorldspaceWidget ()
|
||||||
{
|
{
|
||||||
delete mMouse;
|
delete mMouse;
|
||||||
mPhysics->removeSceneManager(getSceneManager());
|
mPhysics->removeSceneManager(getSceneManager());
|
||||||
CSVWorld::PhysicsManager::instance()->removeSceneWidget(this);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void CSVRender::WorldspaceWidget::selectNavigationMode (const std::string& mode)
|
void CSVRender::WorldspaceWidget::selectNavigationMode (const std::string& mode)
|
||||||
|
@ -368,12 +364,6 @@ void CSVRender::WorldspaceWidget::updateOverlay()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
CSVWorld::PhysicsSystem *CSVRender::WorldspaceWidget::getPhysics()
|
|
||||||
{
|
|
||||||
assert(mPhysics);
|
|
||||||
return mPhysics;
|
|
||||||
}
|
|
||||||
|
|
||||||
void CSVRender::WorldspaceWidget::mouseMoveEvent (QMouseEvent *event)
|
void CSVRender::WorldspaceWidget::mouseMoveEvent (QMouseEvent *event)
|
||||||
{
|
{
|
||||||
if(event->buttons() & Qt::RightButton)
|
if(event->buttons() & Qt::RightButton)
|
||||||
|
|
|
@ -1,6 +1,8 @@
|
||||||
#ifndef OPENCS_VIEW_WORLDSPACEWIDGET_H
|
#ifndef OPENCS_VIEW_WORLDSPACEWIDGET_H
|
||||||
#define OPENCS_VIEW_WORLDSPACEWIDGET_H
|
#define OPENCS_VIEW_WORLDSPACEWIDGET_H
|
||||||
|
|
||||||
|
#include <boost/shared_ptr.hpp>
|
||||||
|
|
||||||
#include "scenewidget.hpp"
|
#include "scenewidget.hpp"
|
||||||
#include "mousestate.hpp"
|
#include "mousestate.hpp"
|
||||||
|
|
||||||
|
@ -40,7 +42,7 @@ namespace CSVRender
|
||||||
CSVWidget::SceneToolToggle2 *mSceneElements;
|
CSVWidget::SceneToolToggle2 *mSceneElements;
|
||||||
CSVWidget::SceneToolRun *mRun;
|
CSVWidget::SceneToolRun *mRun;
|
||||||
CSMDoc::Document& mDocument;
|
CSMDoc::Document& mDocument;
|
||||||
CSVWorld::PhysicsSystem *mPhysics;
|
boost::shared_ptr<CSVWorld::PhysicsSystem> mPhysics;
|
||||||
MouseState *mMouse;
|
MouseState *mMouse;
|
||||||
unsigned int mInteractionMask;
|
unsigned int mInteractionMask;
|
||||||
|
|
||||||
|
@ -115,8 +117,6 @@ 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);
|
||||||
|
|
|
@ -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
|
|
|
@ -173,6 +173,8 @@ QWidget *CSVWorld::CommandDelegate::createEditor (QWidget *parent, const QStyleO
|
||||||
{
|
{
|
||||||
QDoubleSpinBox *dsb = new QDoubleSpinBox(parent);
|
QDoubleSpinBox *dsb = new QDoubleSpinBox(parent);
|
||||||
dsb->setRange(FLT_MIN, FLT_MAX);
|
dsb->setRange(FLT_MIN, FLT_MAX);
|
||||||
|
dsb->setSingleStep(0.01f);
|
||||||
|
dsb->setDecimals(3);
|
||||||
return dsb;
|
return dsb;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue