diff --git a/apps/opencs/view/render/instancemode.cpp b/apps/opencs/view/render/instancemode.cpp index 24e307dc5..f4f38dd34 100644 --- a/apps/opencs/view/render/instancemode.cpp +++ b/apps/opencs/view/render/instancemode.cpp @@ -27,7 +27,7 @@ int CSVRender::InstanceMode::getSubModeFromId (const std::string& id) const CSVRender::InstanceMode::InstanceMode (WorldspaceWidget *worldspaceWidget, QWidget *parent) : EditMode (worldspaceWidget, QIcon (":placeholder"), Mask_Reference, "Instance editing", - parent), mSubMode (0), mSelectionMode (0), mDragMode (DragMode_None) + parent), mSubMode (0), mSelectionMode (0), mDragMode (DragMode_None), mDragAxis (0) { } @@ -151,8 +151,6 @@ bool CSVRender::InstanceMode::primaryEditStartDrag (osg::ref_ptr tag) if (selection.empty()) return false; - // \todo check for sub-mode - for (std::vector >::iterator iter (selection.begin()); iter!=selection.end(); ++iter) { @@ -162,7 +160,15 @@ bool CSVRender::InstanceMode::primaryEditStartDrag (osg::ref_ptr tag) } } - mDragMode = DragMode_Move; + // \todo check for sub-mode + + if (CSVRender::ObjectMarkerTag *objectTag = dynamic_cast (tag.get())) + { + mDragAxis = objectTag->mAxis; + mDragMode = DragMode_MoveAxis; + } + else + mDragMode = DragMode_Move; return true; } @@ -175,23 +181,33 @@ bool CSVRender::InstanceMode::secondaryEditStartDrag (osg::ref_ptr tag) void CSVRender::InstanceMode::drag (int diffX, int diffY, double speedFactor) { + osg::Vec3f eye; + osg::Vec3f centre; + osg::Vec3f up; + + getWorldspaceWidget().getCamera()->getViewMatrix().getLookAt (eye, centre, up); + + osg::Vec3f offset; + + if (diffY) + offset += up * diffY * speedFactor; + + if (diffX) + offset += ((centre-eye) ^ up) * diffX * speedFactor; + switch (mDragMode) { - case DragMode_Move: + case DragMode_MoveAxis: { - osg::Vec3f eye; - osg::Vec3f centre; - osg::Vec3f up; - - getWorldspaceWidget().getCamera()->getViewMatrix().getLookAt (eye, centre, up); + for (int i=0; i<3; ++i) + if (i!=mDragAxis) + offset[i] = 0; - osg::Vec3f offset; - - if (diffY) - offset += up * diffY * speedFactor; + // Fall through + } - if (diffX) - offset += ((centre-eye) ^ up) * diffX * speedFactor; + case DragMode_Move: + { std::vector > selection = getWorldspaceWidget().getEdited (Mask_Reference); @@ -226,7 +242,10 @@ void CSVRender::InstanceMode::dragCompleted() switch (mDragMode) { - case DragMode_Move: description = "Move Instances"; break; + case DragMode_Move: + case DragMode_MoveAxis: + + description = "Move Instances"; break; case DragMode_None: break; } diff --git a/apps/opencs/view/render/instancemode.hpp b/apps/opencs/view/render/instancemode.hpp index 5beec5643..e65d8146c 100644 --- a/apps/opencs/view/render/instancemode.hpp +++ b/apps/opencs/view/render/instancemode.hpp @@ -19,13 +19,15 @@ namespace CSVRender enum DragMode { DragMode_None, - DragMode_Move + DragMode_Move, + DragMode_MoveAxis }; CSVWidget::SceneToolMode *mSubMode; InstanceSelectionMode *mSelectionMode; DragMode mDragMode; + int mDragAxis; int getSubModeFromId (const std::string& id) const; diff --git a/apps/opencs/view/render/object.cpp b/apps/opencs/view/render/object.cpp index b7efa5058..1771acdf9 100644 --- a/apps/opencs/view/render/object.cpp +++ b/apps/opencs/view/render/object.cpp @@ -55,7 +55,7 @@ QString CSVRender::ObjectTag::getToolTip (bool hideBasics) const CSVRender::ObjectMarkerTag::ObjectMarkerTag (Object* object, int axis) -: TagBase (Mask_Reference), mObject (object), mAxis (axis) +: ObjectTag (object), mAxis (axis) {} @@ -287,9 +287,9 @@ osg::Vec3f CSVRender::Object::getMarkerPosition (float x, float y, float z, int { switch (axis) { - case 0: return osg::Vec3f (x, y, z); - case 1: return osg::Vec3f (z, x, y); - case 2: return osg::Vec3f (y, z, x); + case 2: return osg::Vec3f (x, y, z); + case 0: return osg::Vec3f (z, x, y); + case 1: return osg::Vec3f (y, z, x); default: diff --git a/apps/opencs/view/render/object.hpp b/apps/opencs/view/render/object.hpp index 9cd0a8d67..12cb0c78b 100644 --- a/apps/opencs/view/render/object.hpp +++ b/apps/opencs/view/render/object.hpp @@ -55,13 +55,12 @@ namespace CSVRender virtual QString getToolTip (bool hideBasics) const; }; - class ObjectMarkerTag : public TagBase + class ObjectMarkerTag : public ObjectTag { public: ObjectMarkerTag (Object* object, int axis); - Object* mObject; int mAxis; };