mirror of
https://gitlab.com/OpenMW/openmw.git
synced 2025-01-25 15:35:23 +00:00
Fix deleting physics object when scene nodes were still referencing it. Remove unused code from MouseState. Items that do not change are fetched only once.
This commit is contained in:
parent
4556eb74fe
commit
bf5ba41223
@ -59,7 +59,18 @@ namespace CSVRender
|
||||
, mCurrentObj(""), mMouseState(Mouse_Default), mOldPos(0,0), mMouseEventTimer(0), mPlane(0)
|
||||
, mGrabbedSceneNode(""), mOrigObjPos(Ogre::Vector3()), mOrigMousePos(Ogre::Vector3())
|
||||
, mCurrentMousePos(Ogre::Vector3()), mOffset(0.0f)
|
||||
, mColIndexPosX(0), mColIndexPosY(0), mColIndexPosZ(0), mIdTableModel(0)
|
||||
//, mModel(0)
|
||||
{
|
||||
const CSMWorld::RefCollection& references = mParent->mDocument.getData().getReferences();
|
||||
|
||||
mColIndexPosX = references.findColumnIndex(CSMWorld::Columns::ColumnId_PositionXPos);
|
||||
mColIndexPosY = references.findColumnIndex(CSMWorld::Columns::ColumnId_PositionYPos);
|
||||
mColIndexPosZ = references.findColumnIndex(CSMWorld::Columns::ColumnId_PositionZPos);
|
||||
|
||||
mIdTableModel = static_cast<CSMWorld::IdTable *>(
|
||||
mParent->mDocument.getData().getTableModel(CSMWorld::UniversalId::Type_Reference));
|
||||
|
||||
mMouseEventTimer = new QElapsedTimer();
|
||||
mMouseEventTimer->invalidate();
|
||||
|
||||
@ -138,22 +149,6 @@ namespace CSVRender
|
||||
case Mouse_Grab:
|
||||
case Mouse_Drag:
|
||||
{
|
||||
if(0 /*event->buttons() & ~Qt::RightButton*/)
|
||||
{
|
||||
// cancel operation & return the object to the original position
|
||||
placeObject(mGrabbedSceneNode, mOrigObjPos);
|
||||
mMouseState = Mouse_Default;
|
||||
|
||||
// reset states
|
||||
mCurrentMousePos = Ogre::Vector3();
|
||||
mOrigMousePos = Ogre::Vector3();
|
||||
mOrigObjPos = Ogre::Vector3();
|
||||
mGrabbedSceneNode = "";
|
||||
mCurrentObj = "";
|
||||
mOldPos = QPoint(0, 0);
|
||||
mMouseEventTimer->invalidate();
|
||||
mOffset = 0.0f;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case Mouse_Edit:
|
||||
@ -216,16 +211,9 @@ namespace CSVRender
|
||||
{
|
||||
std::string referenceId = mPhysics->sceneNodeToRefId(result.first);
|
||||
std::cout << "ReferenceId: " << referenceId << std::endl;
|
||||
const CSMWorld::RefCollection& references = mParent->mDocument.getData().getReferences();
|
||||
int index = references.searchId(referenceId);
|
||||
if (index != -1)
|
||||
{
|
||||
int columnIndex =
|
||||
references.findColumnIndex(CSMWorld::Columns::ColumnId_ReferenceableId);
|
||||
std::cout << " index: " + QString::number(index).toStdString()
|
||||
+", column index: " + QString::number(columnIndex).toStdString()
|
||||
<< std::endl;
|
||||
}
|
||||
std::cout << " hit pos "+ QString::number(result.second.x).toStdString()
|
||||
+ ", " + QString::number(result.second.y).toStdString()
|
||||
+ ", " + QString::number(result.second.z).toStdString() << std::endl;
|
||||
}
|
||||
}
|
||||
break;
|
||||
@ -240,35 +228,21 @@ namespace CSVRender
|
||||
{
|
||||
std::pair<Ogre::Vector3, Ogre::Vector3> planeRes = planeAxis();
|
||||
Ogre::Vector3 pos = mOrigObjPos+planeRes.first*mOffset+planeResult.second-mOrigMousePos;
|
||||
//placeObject(mGrabbedSceneNode, pos); // FIXME: auto updated via signals
|
||||
|
||||
// use the saved scene node name since the physics model has not moved yet
|
||||
std::string referenceId = mPhysics->sceneNodeToRefId(mGrabbedSceneNode);
|
||||
|
||||
QAbstractItemModel *model =
|
||||
mParent->mDocument.getData().getTableModel(CSMWorld::UniversalId::Type_Reference);
|
||||
const CSMWorld::RefCollection& references =
|
||||
mParent->mDocument.getData().getReferences();
|
||||
|
||||
int columnIndexPosX =
|
||||
references.findColumnIndex(CSMWorld::Columns::ColumnId_PositionXPos);
|
||||
mParent->mDocument.getUndoStack().push(new CSMWorld::ModifyCommand(*model,
|
||||
static_cast<CSMWorld::IdTable *>(model)->getModelIndex(referenceId,
|
||||
columnIndexPosX), pos.x));
|
||||
int columnIndexPosY =
|
||||
references.findColumnIndex(CSMWorld::Columns::ColumnId_PositionYPos);
|
||||
mParent->mDocument.getUndoStack().push(new CSMWorld::ModifyCommand(*model,
|
||||
static_cast<CSMWorld::IdTable *>(model)->getModelIndex(referenceId,
|
||||
columnIndexPosY), pos.y));
|
||||
int columnIndexPosZ =
|
||||
references.findColumnIndex(CSMWorld::Columns::ColumnId_PositionZPos);
|
||||
mParent->mDocument.getUndoStack().push(new CSMWorld::ModifyCommand(*model,
|
||||
static_cast<CSMWorld::IdTable *>(model)->getModelIndex(referenceId,
|
||||
columnIndexPosZ), pos.z));
|
||||
mParent->mDocument.getUndoStack().push(new CSMWorld::ModifyCommand(*mIdTableModel,
|
||||
mIdTableModel->getModelIndex(referenceId, mColIndexPosX), pos.x));
|
||||
mParent->mDocument.getUndoStack().push(new CSMWorld::ModifyCommand(*mIdTableModel,
|
||||
mIdTableModel->getModelIndex(referenceId, mColIndexPosY), pos.y));
|
||||
mParent->mDocument.getUndoStack().push(new CSMWorld::ModifyCommand(*mIdTableModel,
|
||||
mIdTableModel->getModelIndex(referenceId, mColIndexPosZ), pos.z));
|
||||
|
||||
// FIXME: highlight current object?
|
||||
//mCurrentObj = mGrabbedSceneNode; // FIXME: doesn't work?
|
||||
mCurrentObj = ""; // whether the object is selected
|
||||
// on screen
|
||||
|
||||
mMouseState = Mouse_Edit;
|
||||
|
||||
// reset states
|
||||
mCurrentMousePos = Ogre::Vector3(); // mouse pos to use in wheel event
|
||||
@ -277,9 +251,6 @@ namespace CSVRender
|
||||
mGrabbedSceneNode = ""; // id of the object
|
||||
mOffset = 0.0f; // used for z-axis movement
|
||||
mOldPos = QPoint(0, 0); // to calculate relative movement of mouse
|
||||
|
||||
// FIXME: highlight current object?
|
||||
mMouseState = Mouse_Edit;
|
||||
}
|
||||
}
|
||||
break;
|
||||
@ -456,25 +427,6 @@ namespace CSVRender
|
||||
return std::make_pair("", Ogre::Vector3());
|
||||
}
|
||||
|
||||
void MouseState::placeObject(const std::string sceneNode, const Ogre::Vector3 &pos)
|
||||
{
|
||||
mSceneManager->getSceneNode(sceneNode)->setPosition(pos);
|
||||
|
||||
// update physics
|
||||
std::string refId = mPhysics->sceneNodeToRefId(sceneNode);
|
||||
const CSMWorld::CellRef& cellref = mParent->mDocument.getData().getReferences().getRecord (refId).get();
|
||||
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 zr (Ogre::Radian (-cellref.mPos.rot[2]), Ogre::Vector3::UNIT_Z);
|
||||
|
||||
// FIXME: adjustRigidBody() seems to lose objects, work around by deleting and recreating objects
|
||||
//mPhysics->moveObject(sceneNode, pos, xr*yr*zr);
|
||||
mPhysics->replaceObject(sceneNode, cellref.mScale, pos, xr*yr*zr);
|
||||
|
||||
// update all SceneWidgets and their SceneManagers
|
||||
updateSceneWidgets();
|
||||
}
|
||||
|
||||
void MouseState::updateSceneWidgets()
|
||||
{
|
||||
std::map<Ogre::SceneManager*, CSVRender::SceneWidget *> sceneWidgets = mPhysics->sceneWidgets();
|
||||
|
@ -22,6 +22,11 @@ namespace CSVWorld
|
||||
class PhysicsSystem;
|
||||
}
|
||||
|
||||
namespace CSMWorld
|
||||
{
|
||||
class IdTable;
|
||||
}
|
||||
|
||||
namespace CSVRender
|
||||
{
|
||||
class WorldspaceWidget;
|
||||
@ -51,7 +56,10 @@ namespace CSVRender
|
||||
Ogre::Vector3 mCurrentMousePos;
|
||||
float mOffset;
|
||||
|
||||
std::map<std::string, std::vector<std::string> > mSelectedEntities;
|
||||
CSMWorld::IdTable *mIdTableModel;
|
||||
int mColIndexPosX;
|
||||
int mColIndexPosY;
|
||||
int mColIndexPosZ;
|
||||
|
||||
public:
|
||||
|
||||
@ -67,10 +75,8 @@ namespace CSVRender
|
||||
private:
|
||||
|
||||
std::pair<bool, Ogre::Vector3> mousePositionOnPlane(const QPoint &pos, const Ogre::Plane &plane);
|
||||
void placeObject(const std::string sceneNode, const Ogre::Vector3 &pos);
|
||||
std::pair<std::string, Ogre::Vector3> terrainUnderCursor(const int mouseX, const int mouseY);
|
||||
std::pair<std::string, Ogre::Vector3> objectUnderCursor(const int mouseX, const int mouseY);
|
||||
void updateSelectionHighlight(const std::string sceneNode, const Ogre::Vector3 &position);
|
||||
std::pair<Ogre::Vector3, Ogre::Vector3> planeAxis();
|
||||
void updateSceneWidgets();
|
||||
bool isDebug();
|
||||
|
@ -33,9 +33,6 @@ void CSVRender::Object::clearSceneNode (Ogre::SceneNode *node)
|
||||
|
||||
void CSVRender::Object::clear()
|
||||
{
|
||||
if(!mObject.isNull())
|
||||
mPhysics->removePhysicsObject(mBase->getName());
|
||||
|
||||
mObject.setNull();
|
||||
|
||||
clearSceneNode (mBase);
|
||||
@ -43,6 +40,9 @@ void CSVRender::Object::clear()
|
||||
|
||||
void CSVRender::Object::update()
|
||||
{
|
||||
if(!mObject.isNull())
|
||||
mPhysics->removePhysicsObject(mBase->getName());
|
||||
|
||||
clear();
|
||||
|
||||
std::string model;
|
||||
|
@ -154,6 +154,7 @@ namespace CSVWorld
|
||||
}
|
||||
}
|
||||
|
||||
// FIXME: adjustRigidBody() seems to lose objects, work around by deleting and recreating objects
|
||||
void PhysicsSystem::moveObject(const std::string &sceneNodeName,
|
||||
const Ogre::Vector3 &position, const Ogre::Quaternion &rotation)
|
||||
{
|
||||
|
Loading…
x
Reference in New Issue
Block a user