forked from teamnwah/openmw-tes3coop
instance moving via drag in 3D scenes
This commit is contained in:
parent
b5dc3953a4
commit
dececf6c38
16 changed files with 428 additions and 16 deletions
|
@ -85,7 +85,7 @@ opencs_units (view/widget
|
||||||
|
|
||||||
opencs_units (view/render
|
opencs_units (view/render
|
||||||
scenewidget worldspacewidget pagedworldspacewidget unpagedworldspacewidget
|
scenewidget worldspacewidget pagedworldspacewidget unpagedworldspacewidget
|
||||||
previewwidget editmode instancemode instanceselectionmode
|
previewwidget editmode instancemode instanceselectionmode instancemovemode
|
||||||
)
|
)
|
||||||
|
|
||||||
opencs_units_noqt (view/render
|
opencs_units_noqt (view/render
|
||||||
|
|
|
@ -338,3 +338,16 @@ std::vector<osg::ref_ptr<CSVRender::TagBase> > CSVRender::Cell::getSelection (un
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::vector<osg::ref_ptr<CSVRender::TagBase> > CSVRender::Cell::getEdited (unsigned int elementMask) const
|
||||||
|
{
|
||||||
|
std::vector<osg::ref_ptr<TagBase> > result;
|
||||||
|
|
||||||
|
if (elementMask & Mask_Reference)
|
||||||
|
for (std::map<std::string, Object *>::const_iterator iter (mObjects.begin());
|
||||||
|
iter!=mObjects.end(); ++iter)
|
||||||
|
if (iter->second->isEdited())
|
||||||
|
result.push_back (iter->second->getTag());
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
|
@ -116,6 +116,8 @@ namespace CSVRender
|
||||||
bool isDeleted() const;
|
bool isDeleted() const;
|
||||||
|
|
||||||
std::vector<osg::ref_ptr<TagBase> > getSelection (unsigned int elementMask) const;
|
std::vector<osg::ref_ptr<TagBase> > getSelection (unsigned int elementMask) const;
|
||||||
|
|
||||||
|
std::vector<osg::ref_ptr<TagBase> > getEdited (unsigned int elementMask) const;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -18,10 +18,11 @@
|
||||||
#include "worldspacewidget.hpp"
|
#include "worldspacewidget.hpp"
|
||||||
#include "pagedworldspacewidget.hpp"
|
#include "pagedworldspacewidget.hpp"
|
||||||
#include "instanceselectionmode.hpp"
|
#include "instanceselectionmode.hpp"
|
||||||
|
#include "instancemovemode.hpp"
|
||||||
|
|
||||||
CSVRender::InstanceMode::InstanceMode (WorldspaceWidget *worldspaceWidget, QWidget *parent)
|
CSVRender::InstanceMode::InstanceMode (WorldspaceWidget *worldspaceWidget, QWidget *parent)
|
||||||
: EditMode (worldspaceWidget, QIcon (":placeholder"), Mask_Reference, "Instance editing",
|
: EditMode (worldspaceWidget, QIcon (":placeholder"), Mask_Reference, "Instance editing",
|
||||||
parent), mSubMode (0), mSelectionMode (0)
|
parent), mSubMode (0), mSelectionMode (0), mDragMode (DragMode_None)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -30,12 +31,7 @@ void CSVRender::InstanceMode::activate (CSVWidget::SceneToolbar *toolbar)
|
||||||
if (!mSubMode)
|
if (!mSubMode)
|
||||||
{
|
{
|
||||||
mSubMode = new CSVWidget::SceneToolMode (toolbar, "Edit Sub-Mode");
|
mSubMode = new CSVWidget::SceneToolMode (toolbar, "Edit Sub-Mode");
|
||||||
mSubMode->addButton (":placeholder", "move",
|
mSubMode->addButton (new InstanceMoveMode (this), "move");
|
||||||
"Move selected instances"
|
|
||||||
"<ul><li>Use primary edit to move instances around freely</li>"
|
|
||||||
"<li>Use secondary edit to move instances around within the grid</li>"
|
|
||||||
"</ul>"
|
|
||||||
"<font color=Red>Not implemented yet</font color>");
|
|
||||||
mSubMode->addButton (":placeholder", "rotate",
|
mSubMode->addButton (":placeholder", "rotate",
|
||||||
"Rotate selected instances"
|
"Rotate selected instances"
|
||||||
"<ul><li>Use primary edit to rotate instances freely</li>"
|
"<ul><li>Use primary edit to rotate instances freely</li>"
|
||||||
|
@ -53,6 +49,8 @@ void CSVRender::InstanceMode::activate (CSVWidget::SceneToolbar *toolbar)
|
||||||
if (!mSelectionMode)
|
if (!mSelectionMode)
|
||||||
mSelectionMode = new InstanceSelectionMode (toolbar, getWorldspaceWidget());
|
mSelectionMode = new InstanceSelectionMode (toolbar, getWorldspaceWidget());
|
||||||
|
|
||||||
|
mDragMode = DragMode_None;
|
||||||
|
|
||||||
EditMode::activate (toolbar);
|
EditMode::activate (toolbar);
|
||||||
|
|
||||||
toolbar->addTool (mSubMode);
|
toolbar->addTool (mSubMode);
|
||||||
|
@ -120,6 +118,154 @@ void CSVRender::InstanceMode::secondarySelectPressed (osg::ref_ptr<TagBase> tag)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool CSVRender::InstanceMode::primaryEditStartDrag (osg::ref_ptr<TagBase> tag)
|
||||||
|
{
|
||||||
|
if (mDragMode!=DragMode_None)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (tag && CSMPrefs::get()["3D Scene Input"]["context-select"].isTrue())
|
||||||
|
{
|
||||||
|
getWorldspaceWidget().clearSelection (Mask_Reference);
|
||||||
|
if (CSVRender::ObjectTag *objectTag = dynamic_cast<CSVRender::ObjectTag *> (tag.get()))
|
||||||
|
{
|
||||||
|
CSVRender::Object* object = objectTag->mObject;
|
||||||
|
object->setSelected (true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
std::vector<osg::ref_ptr<TagBase> > selection =
|
||||||
|
getWorldspaceWidget().getSelection (Mask_Reference);
|
||||||
|
|
||||||
|
if (selection.empty())
|
||||||
|
return false;
|
||||||
|
|
||||||
|
// \todo check for sub-mode
|
||||||
|
|
||||||
|
for (std::vector<osg::ref_ptr<TagBase> >::iterator iter (selection.begin());
|
||||||
|
iter!=selection.end(); ++iter)
|
||||||
|
{
|
||||||
|
if (CSVRender::ObjectTag *objectTag = dynamic_cast<CSVRender::ObjectTag *> (iter->get()))
|
||||||
|
{
|
||||||
|
objectTag->mObject->setEdited (Object::Override_Position);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
mDragMode = DragMode_Move;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool CSVRender::InstanceMode::secondaryEditStartDrag (osg::ref_ptr<TagBase> tag)
|
||||||
|
{
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CSVRender::InstanceMode::drag (int diffX, int diffY, double speedFactor)
|
||||||
|
{
|
||||||
|
switch (mDragMode)
|
||||||
|
{
|
||||||
|
case DragMode_Move:
|
||||||
|
{
|
||||||
|
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;
|
||||||
|
|
||||||
|
std::vector<osg::ref_ptr<TagBase> > selection =
|
||||||
|
getWorldspaceWidget().getEdited (Mask_Reference);
|
||||||
|
|
||||||
|
for (std::vector<osg::ref_ptr<TagBase> >::iterator iter (selection.begin());
|
||||||
|
iter!=selection.end(); ++iter)
|
||||||
|
{
|
||||||
|
if (CSVRender::ObjectTag *objectTag = dynamic_cast<CSVRender::ObjectTag *> (iter->get()))
|
||||||
|
{
|
||||||
|
ESM::Position position = objectTag->mObject->getPosition();
|
||||||
|
for (int i=0; i<3; ++i)
|
||||||
|
position.pos[i] += offset[i];
|
||||||
|
objectTag->mObject->setPosition (position.pos);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case DragMode_None: break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void CSVRender::InstanceMode::dragCompleted()
|
||||||
|
{
|
||||||
|
std::vector<osg::ref_ptr<TagBase> > selection =
|
||||||
|
getWorldspaceWidget().getEdited (Mask_Reference);
|
||||||
|
|
||||||
|
QUndoStack& undoStack = getWorldspaceWidget().getDocument().getUndoStack();
|
||||||
|
|
||||||
|
QString description;
|
||||||
|
|
||||||
|
switch (mDragMode)
|
||||||
|
{
|
||||||
|
case DragMode_Move: description = "Move Instances"; break;
|
||||||
|
|
||||||
|
case DragMode_None: break;
|
||||||
|
}
|
||||||
|
|
||||||
|
undoStack.beginMacro (description);
|
||||||
|
|
||||||
|
for (std::vector<osg::ref_ptr<TagBase> >::iterator iter (selection.begin());
|
||||||
|
iter!=selection.end(); ++iter)
|
||||||
|
{
|
||||||
|
if (CSVRender::ObjectTag *objectTag = dynamic_cast<CSVRender::ObjectTag *> (iter->get()))
|
||||||
|
{
|
||||||
|
objectTag->mObject->apply (undoStack);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
undoStack.endMacro();
|
||||||
|
|
||||||
|
mDragMode = DragMode_None;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CSVRender::InstanceMode::dragWheel (int diff, double speedFactor)
|
||||||
|
{
|
||||||
|
if (mDragMode==DragMode_Move)
|
||||||
|
{
|
||||||
|
osg::Vec3f eye;
|
||||||
|
osg::Vec3f centre;
|
||||||
|
osg::Vec3f up;
|
||||||
|
|
||||||
|
getWorldspaceWidget().getCamera()->getViewMatrix().getLookAt (eye, centre, up);
|
||||||
|
|
||||||
|
osg::Vec3f offset = centre - eye;
|
||||||
|
offset.normalize();
|
||||||
|
offset *= diff * speedFactor;
|
||||||
|
|
||||||
|
std::vector<osg::ref_ptr<TagBase> > selection =
|
||||||
|
getWorldspaceWidget().getEdited (Mask_Reference);
|
||||||
|
|
||||||
|
for (std::vector<osg::ref_ptr<TagBase> >::iterator iter (selection.begin());
|
||||||
|
iter!=selection.end(); ++iter)
|
||||||
|
{
|
||||||
|
if (CSVRender::ObjectTag *objectTag = dynamic_cast<CSVRender::ObjectTag *> (iter->get()))
|
||||||
|
{
|
||||||
|
ESM::Position position = objectTag->mObject->getPosition();
|
||||||
|
for (int i=0; i<3; ++i)
|
||||||
|
position.pos[i] += offset[i];
|
||||||
|
objectTag->mObject->setPosition (position.pos);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void CSVRender::InstanceMode::dragEnterEvent (QDragEnterEvent *event)
|
void CSVRender::InstanceMode::dragEnterEvent (QDragEnterEvent *event)
|
||||||
{
|
{
|
||||||
if (const CSMWorld::TableMimeData* mime = dynamic_cast<const CSMWorld::TableMimeData*> (event->mimeData()))
|
if (const CSMWorld::TableMimeData* mime = dynamic_cast<const CSMWorld::TableMimeData*> (event->mimeData()))
|
||||||
|
|
|
@ -15,8 +15,17 @@ namespace CSVRender
|
||||||
class InstanceMode : public EditMode
|
class InstanceMode : public EditMode
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
|
enum DragMode
|
||||||
|
{
|
||||||
|
DragMode_None,
|
||||||
|
DragMode_Move
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
CSVWidget::SceneToolMode *mSubMode;
|
CSVWidget::SceneToolMode *mSubMode;
|
||||||
InstanceSelectionMode *mSelectionMode;
|
InstanceSelectionMode *mSelectionMode;
|
||||||
|
DragMode mDragMode;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
|
@ -34,6 +43,16 @@ namespace CSVRender
|
||||||
|
|
||||||
virtual void secondarySelectPressed (osg::ref_ptr<TagBase> tag);
|
virtual void secondarySelectPressed (osg::ref_ptr<TagBase> tag);
|
||||||
|
|
||||||
|
virtual bool primaryEditStartDrag (osg::ref_ptr<TagBase> tag);
|
||||||
|
|
||||||
|
virtual bool secondaryEditStartDrag (osg::ref_ptr<TagBase> tag);
|
||||||
|
|
||||||
|
virtual void drag (int diffX, int diffY, double speedFactor);
|
||||||
|
|
||||||
|
virtual void dragCompleted();
|
||||||
|
|
||||||
|
virtual void dragWheel (int diff, double speedFactor);
|
||||||
|
|
||||||
virtual void dragEnterEvent (QDragEnterEvent *event);
|
virtual void dragEnterEvent (QDragEnterEvent *event);
|
||||||
|
|
||||||
virtual void dropEvent (QDropEvent* event);
|
virtual void dropEvent (QDropEvent* event);
|
||||||
|
|
12
apps/opencs/view/render/instancemovemode.cpp
Normal file
12
apps/opencs/view/render/instancemovemode.cpp
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
|
||||||
|
#include "instancemovemode.hpp"
|
||||||
|
|
||||||
|
CSVRender::InstanceMoveMode::InstanceMoveMode (QWidget *parent)
|
||||||
|
: ModeButton (QIcon (QPixmap (":placeholder")),
|
||||||
|
"Move selected instances"
|
||||||
|
"<ul><li>Use primary edit to move instances around freely</li>"
|
||||||
|
"<li>Use secondary edit to move instances around within the grid</li>"
|
||||||
|
"</ul>"
|
||||||
|
"<font color=Red>Not implemented yet</font color>",
|
||||||
|
parent)
|
||||||
|
{}
|
18
apps/opencs/view/render/instancemovemode.hpp
Normal file
18
apps/opencs/view/render/instancemovemode.hpp
Normal file
|
@ -0,0 +1,18 @@
|
||||||
|
#ifndef CSV_RENDER_INSTANCEMOVEMODE_H
|
||||||
|
#define CSV_RENDER_INSTANCEMOVEMODE_H
|
||||||
|
|
||||||
|
#include "../widget/modebutton.hpp"
|
||||||
|
|
||||||
|
namespace CSVRender
|
||||||
|
{
|
||||||
|
class InstanceMoveMode : public CSVWidget::ModeButton
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
InstanceMoveMode (QWidget *parent = 0);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
|
@ -15,6 +15,8 @@
|
||||||
#include "../../model/world/data.hpp"
|
#include "../../model/world/data.hpp"
|
||||||
#include "../../model/world/ref.hpp"
|
#include "../../model/world/ref.hpp"
|
||||||
#include "../../model/world/refidcollection.hpp"
|
#include "../../model/world/refidcollection.hpp"
|
||||||
|
#include "../../model/world/commands.hpp"
|
||||||
|
#include "../../model/world/universalid.hpp"
|
||||||
|
|
||||||
#include <components/resource/scenemanager.hpp>
|
#include <components/resource/scenemanager.hpp>
|
||||||
#include <components/sceneutil/lightutil.hpp>
|
#include <components/sceneutil/lightutil.hpp>
|
||||||
|
@ -130,18 +132,20 @@ void CSVRender::Object::adjustTransform()
|
||||||
if (mReferenceId.empty())
|
if (mReferenceId.empty())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
const CSMWorld::CellRef& reference = getReference();
|
ESM::Position position = getPosition();
|
||||||
|
|
||||||
// position
|
// position
|
||||||
mBaseNode->setPosition(mForceBaseToZero ? osg::Vec3() : osg::Vec3f(reference.mPos.pos[0], reference.mPos.pos[1], reference.mPos.pos[2]));
|
mBaseNode->setPosition(mForceBaseToZero ? osg::Vec3() : osg::Vec3f(position.pos[0], position.pos[1], position.pos[2]));
|
||||||
|
|
||||||
// orientation
|
// orientation
|
||||||
osg::Quat xr (-reference.mPos.rot[0], osg::Vec3f(1,0,0));
|
osg::Quat xr (-position.rot[0], osg::Vec3f(1,0,0));
|
||||||
osg::Quat yr (-reference.mPos.rot[1], osg::Vec3f(0,1,0));
|
osg::Quat yr (-position.rot[1], osg::Vec3f(0,1,0));
|
||||||
osg::Quat zr (-reference.mPos.rot[2], osg::Vec3f(0,0,1));
|
osg::Quat zr (-position.rot[2], osg::Vec3f(0,0,1));
|
||||||
mBaseNode->setAttitude(zr*yr*xr);
|
mBaseNode->setAttitude(zr*yr*xr);
|
||||||
|
|
||||||
mBaseNode->setScale(osg::Vec3(reference.mScale, reference.mScale, reference.mScale));
|
float scale = getScale();
|
||||||
|
|
||||||
|
mBaseNode->setScale(osg::Vec3(scale, scale, scale));
|
||||||
}
|
}
|
||||||
|
|
||||||
const CSMWorld::CellRef& CSVRender::Object::getReference() const
|
const CSMWorld::CellRef& CSVRender::Object::getReference() const
|
||||||
|
@ -154,7 +158,8 @@ const CSMWorld::CellRef& CSVRender::Object::getReference() const
|
||||||
|
|
||||||
CSVRender::Object::Object (CSMWorld::Data& data, osg::Group* parentNode,
|
CSVRender::Object::Object (CSMWorld::Data& data, osg::Group* parentNode,
|
||||||
const std::string& id, bool referenceable, bool forceBaseToZero)
|
const std::string& id, bool referenceable, bool forceBaseToZero)
|
||||||
: mData (data), mBaseNode(0), mSelected(false), mParentNode(parentNode), mResourceSystem(data.getResourceSystem().get()), mForceBaseToZero (forceBaseToZero)
|
: mData (data), mBaseNode(0), mSelected(false), mParentNode(parentNode), mResourceSystem(data.getResourceSystem().get()), mForceBaseToZero (forceBaseToZero),
|
||||||
|
mScaleOverride (1), mOverrideFlags (0)
|
||||||
{
|
{
|
||||||
mBaseNode = new osg::PositionAttitudeTransform;
|
mBaseNode = new osg::PositionAttitudeTransform;
|
||||||
mBaseNode->addCullCallback(new SceneUtil::LightListCallback);
|
mBaseNode->addCullCallback(new SceneUtil::LightListCallback);
|
||||||
|
@ -290,3 +295,121 @@ osg::ref_ptr<CSVRender::TagBase> CSVRender::Object::getTag() const
|
||||||
{
|
{
|
||||||
return static_cast<CSVRender::TagBase *> (mBaseNode->getUserData());
|
return static_cast<CSVRender::TagBase *> (mBaseNode->getUserData());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool CSVRender::Object::isEdited() const
|
||||||
|
{
|
||||||
|
return mOverrideFlags;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CSVRender::Object::setEdited (int flags)
|
||||||
|
{
|
||||||
|
bool discard = mOverrideFlags & ~flags;
|
||||||
|
int added = flags & ~mOverrideFlags;
|
||||||
|
|
||||||
|
mOverrideFlags = flags;
|
||||||
|
|
||||||
|
if (added & Override_Position)
|
||||||
|
for (int i=0; i<3; ++i)
|
||||||
|
mPositionOverride.pos[i] = getReference().mPos.pos[i];
|
||||||
|
|
||||||
|
if (added & Override_Rotation)
|
||||||
|
for (int i=0; i<3; ++i)
|
||||||
|
mPositionOverride.rot[i] = getReference().mPos.rot[i];
|
||||||
|
|
||||||
|
if (added & Override_Scale)
|
||||||
|
mScaleOverride = getReference().mScale;
|
||||||
|
|
||||||
|
if (discard)
|
||||||
|
adjustTransform();
|
||||||
|
}
|
||||||
|
|
||||||
|
ESM::Position CSVRender::Object::getPosition() const
|
||||||
|
{
|
||||||
|
ESM::Position position = getReference().mPos;
|
||||||
|
|
||||||
|
if (mOverrideFlags & Override_Position)
|
||||||
|
for (int i=0; i<3; ++i)
|
||||||
|
position.pos[i] = mPositionOverride.pos[i];
|
||||||
|
|
||||||
|
if (mOverrideFlags & Override_Rotation)
|
||||||
|
for (int i=0; i<3; ++i)
|
||||||
|
position.rot[i] = mPositionOverride.rot[i];
|
||||||
|
|
||||||
|
return position;
|
||||||
|
}
|
||||||
|
|
||||||
|
float CSVRender::Object::getScale() const
|
||||||
|
{
|
||||||
|
return mOverrideFlags & Override_Scale ? mScaleOverride : getReference().mScale;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CSVRender::Object::setPosition (const float position[3])
|
||||||
|
{
|
||||||
|
mOverrideFlags |= Override_Position;
|
||||||
|
|
||||||
|
for (int i=0; i<3; ++i)
|
||||||
|
mPositionOverride.pos[i] = position[i];
|
||||||
|
|
||||||
|
adjustTransform();
|
||||||
|
}
|
||||||
|
|
||||||
|
void CSVRender::Object::setRotation (const float rotation[3])
|
||||||
|
{
|
||||||
|
mOverrideFlags |= Override_Rotation;
|
||||||
|
|
||||||
|
for (int i=0; i<3; ++i)
|
||||||
|
mPositionOverride.rot[i] = rotation[i];
|
||||||
|
|
||||||
|
adjustTransform();
|
||||||
|
}
|
||||||
|
|
||||||
|
void CSVRender::Object::setScale (float scale)
|
||||||
|
{
|
||||||
|
mOverrideFlags |= Override_Scale;
|
||||||
|
|
||||||
|
mScaleOverride = scale;
|
||||||
|
|
||||||
|
adjustTransform();
|
||||||
|
}
|
||||||
|
|
||||||
|
void CSVRender::Object::apply (QUndoStack& undoStack)
|
||||||
|
{
|
||||||
|
const CSMWorld::RefCollection& collection = mData.getReferences();
|
||||||
|
QAbstractItemModel *model = mData.getTableModel (CSMWorld::UniversalId::Type_References);
|
||||||
|
|
||||||
|
int recordIndex = collection.getIndex (mReferenceId);
|
||||||
|
|
||||||
|
if (mOverrideFlags & Override_Position)
|
||||||
|
{
|
||||||
|
for (int i=0; i<3; ++i)
|
||||||
|
{
|
||||||
|
int column = collection.findColumnIndex (static_cast<CSMWorld::Columns::ColumnId> (
|
||||||
|
CSMWorld::Columns::ColumnId_PositionXPos+i));
|
||||||
|
|
||||||
|
undoStack.push (new CSMWorld::ModifyCommand (*model,
|
||||||
|
model->index (recordIndex, column), mPositionOverride.pos[i]));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (mOverrideFlags & Override_Rotation)
|
||||||
|
{
|
||||||
|
for (int i=0; i<3; ++i)
|
||||||
|
{
|
||||||
|
int column = collection.findColumnIndex (static_cast<CSMWorld::Columns::ColumnId> (
|
||||||
|
CSMWorld::Columns::ColumnId_PositionXRot+i));
|
||||||
|
|
||||||
|
undoStack.push (new CSMWorld::ModifyCommand (*model,
|
||||||
|
model->index (recordIndex, column), mPositionOverride.rot[i]));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (mOverrideFlags & Override_Scale)
|
||||||
|
{
|
||||||
|
int column = collection.findColumnIndex (CSMWorld::Columns::ColumnId_Scale);
|
||||||
|
|
||||||
|
undoStack.push (new CSMWorld::ModifyCommand (*model,
|
||||||
|
model->index (recordIndex, column), mScaleOverride));
|
||||||
|
}
|
||||||
|
|
||||||
|
mOverrideFlags = 0;
|
||||||
|
}
|
||||||
|
|
|
@ -8,9 +8,12 @@
|
||||||
#include <osg/ref_ptr>
|
#include <osg/ref_ptr>
|
||||||
#include <osg/Referenced>
|
#include <osg/Referenced>
|
||||||
|
|
||||||
|
#include <components/esm/defs.hpp>
|
||||||
|
|
||||||
#include "tagbase.hpp"
|
#include "tagbase.hpp"
|
||||||
|
|
||||||
class QModelIndex;
|
class QModelIndex;
|
||||||
|
class QUndoStack;
|
||||||
|
|
||||||
namespace osg
|
namespace osg
|
||||||
{
|
{
|
||||||
|
@ -53,7 +56,18 @@ namespace CSVRender
|
||||||
|
|
||||||
class Object
|
class Object
|
||||||
{
|
{
|
||||||
const CSMWorld::Data& mData;
|
public:
|
||||||
|
|
||||||
|
enum OverrideFlags
|
||||||
|
{
|
||||||
|
Override_Position = 1,
|
||||||
|
Override_Rotation = 2,
|
||||||
|
Override_Scale = 4
|
||||||
|
};
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
CSMWorld::Data& mData;
|
||||||
std::string mReferenceId;
|
std::string mReferenceId;
|
||||||
std::string mReferenceableId;
|
std::string mReferenceableId;
|
||||||
osg::ref_ptr<osg::PositionAttitudeTransform> mBaseNode;
|
osg::ref_ptr<osg::PositionAttitudeTransform> mBaseNode;
|
||||||
|
@ -62,6 +76,9 @@ namespace CSVRender
|
||||||
osg::Group* mParentNode;
|
osg::Group* mParentNode;
|
||||||
Resource::ResourceSystem* mResourceSystem;
|
Resource::ResourceSystem* mResourceSystem;
|
||||||
bool mForceBaseToZero;
|
bool mForceBaseToZero;
|
||||||
|
ESM::Position mPositionOverride;
|
||||||
|
int mScaleOverride;
|
||||||
|
int mOverrideFlags;
|
||||||
|
|
||||||
/// Not implemented
|
/// Not implemented
|
||||||
Object (const Object&);
|
Object (const Object&);
|
||||||
|
@ -116,6 +133,27 @@ namespace CSVRender
|
||||||
std::string getReferenceableId() const;
|
std::string getReferenceableId() const;
|
||||||
|
|
||||||
osg::ref_ptr<TagBase> getTag() const;
|
osg::ref_ptr<TagBase> getTag() const;
|
||||||
|
|
||||||
|
/// Is there currently an editing operation running on this object?
|
||||||
|
bool isEdited() const;
|
||||||
|
|
||||||
|
void setEdited (int flags);
|
||||||
|
|
||||||
|
ESM::Position getPosition() const;
|
||||||
|
|
||||||
|
float getScale() const;
|
||||||
|
|
||||||
|
/// Set override position.
|
||||||
|
void setPosition (const float position[3]);
|
||||||
|
|
||||||
|
/// Set override rotation
|
||||||
|
void setRotation (const float rotation[3]);
|
||||||
|
|
||||||
|
/// Set override scale
|
||||||
|
void setScale (float scale);
|
||||||
|
|
||||||
|
/// Apply override changes via command and end edit mode
|
||||||
|
void apply (QUndoStack& undoStack);
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -555,6 +555,23 @@ std::vector<osg::ref_ptr<CSVRender::TagBase> > CSVRender::PagedWorldspaceWidget:
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::vector<osg::ref_ptr<CSVRender::TagBase> > CSVRender::PagedWorldspaceWidget::getEdited (
|
||||||
|
unsigned int elementMask) const
|
||||||
|
{
|
||||||
|
std::vector<osg::ref_ptr<CSVRender::TagBase> > result;
|
||||||
|
|
||||||
|
for (std::map<CSMWorld::CellCoordinates, Cell *>::const_iterator iter = mCells.begin();
|
||||||
|
iter!=mCells.end(); ++iter)
|
||||||
|
{
|
||||||
|
std::vector<osg::ref_ptr<CSVRender::TagBase> > cellResult =
|
||||||
|
iter->second->getEdited (elementMask);
|
||||||
|
|
||||||
|
result.insert (result.end(), cellResult.begin(), cellResult.end());
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
CSVWidget::SceneToolToggle *CSVRender::PagedWorldspaceWidget::makeControlVisibilitySelector (
|
CSVWidget::SceneToolToggle *CSVRender::PagedWorldspaceWidget::makeControlVisibilitySelector (
|
||||||
CSVWidget::SceneToolbar *parent)
|
CSVWidget::SceneToolbar *parent)
|
||||||
{
|
{
|
||||||
|
|
|
@ -112,6 +112,9 @@ namespace CSVRender
|
||||||
virtual std::vector<osg::ref_ptr<TagBase> > getSelection (unsigned int elementMask)
|
virtual std::vector<osg::ref_ptr<TagBase> > getSelection (unsigned int elementMask)
|
||||||
const;
|
const;
|
||||||
|
|
||||||
|
virtual std::vector<osg::ref_ptr<TagBase> > getEdited (unsigned int elementMask)
|
||||||
|
const;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
|
||||||
virtual void addVisibilitySelectorButtons (CSVWidget::SceneToolToggle2 *tool);
|
virtual void addVisibilitySelectorButtons (CSVWidget::SceneToolToggle2 *tool);
|
||||||
|
|
|
@ -120,6 +120,12 @@ bool RenderWidget::eventFilter(QObject* obj, QEvent* event)
|
||||||
return QObject::eventFilter(obj, event);
|
return QObject::eventFilter(obj, event);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
osg::Camera *RenderWidget::getCamera()
|
||||||
|
{
|
||||||
|
return mView->getCamera();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// --------------------------------------------------
|
// --------------------------------------------------
|
||||||
|
|
||||||
CompositeViewer::CompositeViewer()
|
CompositeViewer::CompositeViewer()
|
||||||
|
|
|
@ -21,6 +21,7 @@ namespace Resource
|
||||||
namespace osg
|
namespace osg
|
||||||
{
|
{
|
||||||
class Group;
|
class Group;
|
||||||
|
class Camera;
|
||||||
}
|
}
|
||||||
|
|
||||||
namespace CSVWidget
|
namespace CSVWidget
|
||||||
|
@ -47,6 +48,8 @@ namespace CSVRender
|
||||||
|
|
||||||
bool eventFilter(QObject *, QEvent *);
|
bool eventFilter(QObject *, QEvent *);
|
||||||
|
|
||||||
|
osg::Camera *getCamera();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
|
||||||
osg::ref_ptr<osgViewer::View> mView;
|
osg::ref_ptr<osgViewer::View> mView;
|
||||||
|
|
|
@ -131,6 +131,12 @@ std::vector<osg::ref_ptr<CSVRender::TagBase> > CSVRender::UnpagedWorldspaceWidge
|
||||||
return mCell->getSelection (elementMask);
|
return mCell->getSelection (elementMask);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::vector<osg::ref_ptr<CSVRender::TagBase> > CSVRender::UnpagedWorldspaceWidget::getEdited (
|
||||||
|
unsigned int elementMask) const
|
||||||
|
{
|
||||||
|
return mCell->getEdited (elementMask);
|
||||||
|
}
|
||||||
|
|
||||||
void CSVRender::UnpagedWorldspaceWidget::referenceableDataChanged (const QModelIndex& topLeft,
|
void CSVRender::UnpagedWorldspaceWidget::referenceableDataChanged (const QModelIndex& topLeft,
|
||||||
const QModelIndex& bottomRight)
|
const QModelIndex& bottomRight)
|
||||||
{
|
{
|
||||||
|
|
|
@ -60,6 +60,9 @@ namespace CSVRender
|
||||||
virtual std::vector<osg::ref_ptr<TagBase> > getSelection (unsigned int elementMask)
|
virtual std::vector<osg::ref_ptr<TagBase> > getSelection (unsigned int elementMask)
|
||||||
const;
|
const;
|
||||||
|
|
||||||
|
virtual std::vector<osg::ref_ptr<TagBase> > getEdited (unsigned int elementMask)
|
||||||
|
const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
virtual void referenceableDataChanged (const QModelIndex& topLeft,
|
virtual void referenceableDataChanged (const QModelIndex& topLeft,
|
||||||
|
|
|
@ -152,6 +152,9 @@ namespace CSVRender
|
||||||
virtual std::vector<osg::ref_ptr<TagBase> > getSelection (unsigned int elementMask)
|
virtual std::vector<osg::ref_ptr<TagBase> > getSelection (unsigned int elementMask)
|
||||||
const = 0;
|
const = 0;
|
||||||
|
|
||||||
|
virtual std::vector<osg::ref_ptr<TagBase> > getEdited (unsigned int elementMask)
|
||||||
|
const = 0;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
|
||||||
/// Visual elements in a scene
|
/// Visual elements in a scene
|
||||||
|
|
Loading…
Reference in a new issue