From 0d511da615991a332edc574763f9639fe1dfaaa2 Mon Sep 17 00:00:00 2001 From: unelsson Date: Mon, 30 Aug 2021 00:26:26 +0300 Subject: [PATCH] Test of basic mouse-plane use --- apps/opencs/view/render/instancemode.cpp | 35 ++++++------------------ apps/opencs/view/render/instancemode.hpp | 1 + 2 files changed, 9 insertions(+), 27 deletions(-) diff --git a/apps/opencs/view/render/instancemode.cpp b/apps/opencs/view/render/instancemode.cpp index 99ddce7f7d..d511523574 100644 --- a/apps/opencs/view/render/instancemode.cpp +++ b/apps/opencs/view/render/instancemode.cpp @@ -305,6 +305,9 @@ bool CSVRender::InstanceMode::primaryEditStartDrag (const QPoint& pos) if (mSubModeId == "move") { objectTag->mObject->setEdited (Object::Override_Position); + mDragStart.x() = objectTag->mObject->getPosition().pos[0]; + mDragStart.y() = objectTag->mObject->getPosition().pos[1]; + mDragStart.z() = objectTag->mObject->getPosition().pos[2]; mDragMode = DragMode_Move; } else if (mSubModeId == "rotate") @@ -392,29 +395,7 @@ void CSVRender::InstanceMode::drag (const QPoint& pos, int diffX, int diffY, dou std::vector > selection = getWorldspaceWidget().getEdited (Mask_Reference); - if (mDragMode == DragMode_Move) - { - osg::Vec3f eye, centre, up; - getWorldspaceWidget().getCamera()->getViewMatrix().getLookAt (eye, centre, up); - - if (diffY) - { - offset += up * diffY * speedFactor; - } - if (diffX) - { - offset += ((centre-eye) ^ up) * diffX * speedFactor; - } - - if (mDragAxis!=-1) - { - for (int i=0; i<3; ++i) - { - if (i!=mDragAxis) - offset[i] = 0; - } - } - } + if (mDragMode == DragMode_Move) {} else if (mDragMode == DragMode_Rotate) { osg::Vec3f eye, centre, up; @@ -522,10 +503,10 @@ void CSVRender::InstanceMode::drag (const QPoint& pos, int diffX, int diffY, dou if (mDragMode == DragMode_Move) { ESM::Position position = objectTag->mObject->getPosition(); - for (int i=0; i<3; ++i) - { - position.pos[i] += offset[i]; - } + osg::Vec3d mousePos = getMousePlaneCoords(pos, getProjectionSpaceCoords(mDragStart)); + position.pos[0] = mousePos.x(); + position.pos[1] = mousePos.y(); + position.pos[2] = mousePos.z(); objectTag->mObject->setPosition(position.pos); } diff --git a/apps/opencs/view/render/instancemode.hpp b/apps/opencs/view/render/instancemode.hpp index 73b7fff12a..3eb140a9af 100644 --- a/apps/opencs/view/render/instancemode.hpp +++ b/apps/opencs/view/render/instancemode.hpp @@ -45,6 +45,7 @@ namespace CSVRender bool mLocked; float mUnitScaleDist; osg::ref_ptr mParentNode; + osg::Vec3d mDragStart; int getSubModeFromId (const std::string& id) const;