From 4804999e54f5f699acbe4dc5cbd3d94407e84467 Mon Sep 17 00:00:00 2001 From: Evgeny Prikazchikov Date: Thu, 26 Dec 2024 15:15:43 +0300 Subject: [PATCH 1/2] Tools refactoring --- .../scenecomposer/objectcontroller.cpp | 2 - .../screens/scenecomposer/scenecomposer.cpp | 55 ++---- .../src/screens/scenecomposer/scenecomposer.h | 6 - .../screens/scenecomposer/scenecomposer.ui | 3 - .../screens/scenecomposer/tools/movetool.cpp | 33 +++- .../screens/scenecomposer/tools/movetool.h | 7 + .../scenecomposer/tools/resizetool.cpp | 166 ------------------ .../screens/scenecomposer/tools/resizetool.h | 27 --- .../scenecomposer/tools/rotatetool.cpp | 52 +++++- .../screens/scenecomposer/tools/rotatetool.h | 11 ++ .../screens/scenecomposer/tools/scaletool.cpp | 39 +++- .../screens/scenecomposer/tools/scaletool.h | 9 + .../scenecomposer/tools/selecttool.cpp | 52 +++--- .../screens/scenecomposer/tools/selecttool.h | 24 +-- 14 files changed, 198 insertions(+), 288 deletions(-) delete mode 100644 worldeditor/src/screens/scenecomposer/tools/resizetool.cpp delete mode 100644 worldeditor/src/screens/scenecomposer/tools/resizetool.h diff --git a/worldeditor/src/screens/scenecomposer/objectcontroller.cpp b/worldeditor/src/screens/scenecomposer/objectcontroller.cpp index 90cdc2481..3f3feb61b 100644 --- a/worldeditor/src/screens/scenecomposer/objectcontroller.cpp +++ b/worldeditor/src/screens/scenecomposer/objectcontroller.cpp @@ -25,7 +25,6 @@ #include "tools/movetool.h" #include "tools/rotatetool.h" #include "tools/scaletool.h" -#include "tools/resizetool.h" #include "config.h" @@ -183,7 +182,6 @@ ObjectController::ObjectController() : new MoveTool(this), new RotateTool(this), new ScaleTool(this), - new ResizeTool(this), }; } diff --git a/worldeditor/src/screens/scenecomposer/scenecomposer.cpp b/worldeditor/src/screens/scenecomposer/scenecomposer.cpp index 23f84bc68..3550335c4 100644 --- a/worldeditor/src/screens/scenecomposer/scenecomposer.cpp +++ b/worldeditor/src/screens/scenecomposer/scenecomposer.cpp @@ -9,7 +9,7 @@ #include #include #include -#include +#include #include #include @@ -65,12 +65,12 @@ class WorldObserver : public Object { void setSceneComposer(SceneComposer *composer) { m_sceneComposer = composer; - World *world = m_sceneComposer->currentWorld(); + World *world = Engine::world(); if(m_world != world) { if(m_world) { disconnect(m_world, 0, 0, 0); } - m_world = m_sceneComposer->currentWorld(); + m_world = world; connect(m_world, _SIGNAL(sceneLoaded()), this, _SLOT(onSceneUpdated())); connect(m_world, _SIGNAL(sceneUnloaded()), this, _SLOT(onSceneUpdated())); @@ -81,7 +81,7 @@ class WorldObserver : public Object { private: void onSceneUpdated() { - m_sceneComposer->worldUpdated(m_world); + m_sceneComposer->updated(); } private: @@ -131,9 +131,6 @@ SceneComposer::SceneComposer(QWidget *parent) : m_worldObserver->setSceneComposer(this); - QDoubleValidator *validator = new QDoubleValidator(0.01f, DBL_MAX, 4, this); - validator->setLocale(QLocale("C")); - QWidget *snapWidget = new QWidget(); QFormLayout *formLayout = new QFormLayout(snapWidget); @@ -141,35 +138,20 @@ SceneComposer::SceneComposer(QWidget *parent) : int index = 0; for(auto &it : m_controller->tools()) { - QPushButton *tool = new QPushButton(); - tool->setProperty("blue", true); - tool->setProperty("checkred", true); - tool->setCheckable(true); - tool->setAutoExclusive(true); - tool->setIcon(QIcon(it->icon())); - tool->setObjectName(it->name()); - QString shortcut = it->shortcut(); - tool->setShortcut(QKeySequence(shortcut)); - tool->setToolTip(it->toolTip() + (!shortcut.isEmpty() ? (" (" + shortcut + ")") : "")); + QPushButton *tool = it->button(); ui->viewportLayout->insertWidget(index, tool); - connect(tool, SIGNAL(clicked()), m_controller, SLOT(onChangeTool())); if(index == 0) { tool->click(); } - float snap = it->snap(); - if(snap > 0.0f) { - QLineEdit *editor = new QLineEdit(snapWidget); - editor->setValidator(validator); - editor->setObjectName(it->name()); - editor->setText(QString::number((double)snap, 'f', 2)); - formLayout->addRow(it->name(), editor); - - m_snapSettings[it->name()] = editor; - + QLineEdit *editor = it->snapWidget(); + if(editor) { connect(editor, &QLineEdit::editingFinished, this, &SceneComposer::onChangeSnap); + + editor->setParent(snapWidget); + formLayout->addRow(editor->objectName(), editor); } index++; @@ -230,7 +212,6 @@ SceneComposer::SceneComposer(QWidget *parent) : m_sceneMenu.addSeparator(); m_sceneMenu.addAction(createAction(tr("Add New Scene"), SLOT(onNewAsset()), false)); - // Add Component Button m_componentButton->setProperty("blue", true); m_componentButton->setPopupMode(QToolButton::InstantPopup); @@ -280,7 +261,7 @@ void SceneComposer::restoreState(const VariantMap &data) { float snap = field->second.toFloat(); it->setSnap(snap); - QLineEdit *editor = m_snapSettings.value(it->name(), nullptr); + QLineEdit *editor = it->snapWidget(); if(editor) { editor->setText(QString::number((double)snap, 'f', 2)); } @@ -295,14 +276,6 @@ void SceneComposer::takeScreenshot() { result.save("MainWindow-" + QDateTime::currentDateTime().toString("ddMMyy-HHmmss") + ".png"); } -World *SceneComposer::currentWorld() const { - return Engine::world(); -} - -void SceneComposer::worldUpdated(World *graph) { - emit updated(); -} - void SceneComposer::onDrop(QDropEvent *event) { m_controller->onDrop(event); } @@ -547,7 +520,7 @@ void SceneComposer::onNewAsset() { void SceneComposer::loadAsset(AssetConverterSettings *settings) { AssetEditor::loadAsset(settings); - if(settings->typeName() == "Map") { + if(settings->typeName() == MetaType::name()) { if(loadScene(settings->source(), false)) { UndoManager::instance()->clear(); } @@ -581,7 +554,7 @@ void SceneComposer::onCreateActor() { Scene *scene = m_controller->isolatedActor() ? m_isolationScene : Engine::world()->activeScene(); if(scene) { - UndoManager::instance()->push(new CreateObject("Actor", scene, m_controller)); + UndoManager::instance()->push(new CreateObject(MetaType::name(), scene, m_controller)); } } @@ -753,7 +726,7 @@ bool SceneComposer::loadScene(QString path, bool additive) { } emit objectsHierarchyChanged(Engine::world()); - worldUpdated(Engine::world()); + emit updated(); return true; } } diff --git a/worldeditor/src/screens/scenecomposer/scenecomposer.h b/worldeditor/src/screens/scenecomposer/scenecomposer.h index 46db05b24..e2cd4f378 100644 --- a/worldeditor/src/screens/scenecomposer/scenecomposer.h +++ b/worldeditor/src/screens/scenecomposer/scenecomposer.h @@ -8,7 +8,6 @@ class ObjectController; class WorldObserver; -class QLineEdit; class QToolButton; namespace Ui { @@ -30,9 +29,6 @@ class SceneComposer : public AssetEditor { void takeScreenshot(); - World *currentWorld() const; - void worldUpdated(World *graph); - QMenu *objectContextMenu(Object *object) override; QWidget *propertiesWidget() const override; @@ -119,8 +115,6 @@ private slots: QMap m_sceneSettings; - QMap m_snapSettings; - QList m_objectActions; QList m_prefabActions; QAction *m_activeSceneAction; diff --git a/worldeditor/src/screens/scenecomposer/scenecomposer.ui b/worldeditor/src/screens/scenecomposer/scenecomposer.ui index 23eeeb2fc..9ec312ba6 100644 --- a/worldeditor/src/screens/scenecomposer/scenecomposer.ui +++ b/worldeditor/src/screens/scenecomposer/scenecomposer.ui @@ -138,9 +138,6 @@ QToolButton::InstantPopup - - Qt::ToolButtonTextBesideIcon - diff --git a/worldeditor/src/screens/scenecomposer/tools/movetool.cpp b/worldeditor/src/screens/scenecomposer/tools/movetool.cpp index c87e99c4e..679da33c6 100644 --- a/worldeditor/src/screens/scenecomposer/tools/movetool.cpp +++ b/worldeditor/src/screens/scenecomposer/tools/movetool.cpp @@ -1,5 +1,8 @@ #include "movetool.h" +#include +#include + #include #include @@ -14,6 +17,17 @@ MoveTool::MoveTool(ObjectController *controller) : } +void MoveTool::beginControl() { + SelectTool::beginControl(); + + m_positions.clear(); + + for(auto it : m_controller->selectList()) { + Transform *t = it.object->transform(); + m_positions.push_back(t->position()); + } +} + void MoveTool::update(bool center, bool local, bool snap) { SelectTool::update(center, local, snap); @@ -29,6 +43,8 @@ void MoveTool::update(bool center, bool local, bool snap) { delta[i] = m_snap * int(delta[i] / m_snap); } } + + auto posIt = m_positions.begin(); for(const auto &it : qAsConst(m_controller->selectList())) { Vector3 dt(local ? t->worldQuaternion() * delta : delta); Actor *a = dynamic_cast(it.object->parent()); @@ -36,12 +52,27 @@ void MoveTool::update(bool center, bool local, bool snap) { dt = a->transform()->worldTransform().rotation().inverse() * delta; } if(it.object->transform()) { - it.object->transform()->setPosition(it.position + dt); + it.object->transform()->setPosition(*posIt + dt); } + posIt++; } } } +QLineEdit *MoveTool::snapWidget() { + if(m_snapEditor == nullptr) { + QDoubleValidator *validator = new QDoubleValidator(0.01f, DBL_MAX, 4); + validator->setLocale(QLocale("C")); + + m_snapEditor = new QLineEdit(); + m_snapEditor->setValidator(validator); + m_snapEditor->setObjectName(name()); + m_snapEditor->setText(QString::number((double)m_snap, 'f', 2)); + } + + return m_snapEditor; +} + QString MoveTool::icon() const { return ":/Images/editor/Move.png"; } diff --git a/worldeditor/src/screens/scenecomposer/tools/movetool.h b/worldeditor/src/screens/scenecomposer/tools/movetool.h index 22d53b8b7..a511278d4 100644 --- a/worldeditor/src/screens/scenecomposer/tools/movetool.h +++ b/worldeditor/src/screens/scenecomposer/tools/movetool.h @@ -9,13 +9,20 @@ class MoveTool : public SelectTool { public: explicit MoveTool(ObjectController *controller); + void beginControl() override; + void update(bool center, bool local, bool snap) override; + QLineEdit *snapWidget() override; + QString icon() const override; QString name() const override; QString toolTip() const override; QString shortcut() const override; + +private: + std::list m_positions; }; #endif // MOVETOOL_H diff --git a/worldeditor/src/screens/scenecomposer/tools/resizetool.cpp b/worldeditor/src/screens/scenecomposer/tools/resizetool.cpp deleted file mode 100644 index d4323168f..000000000 --- a/worldeditor/src/screens/scenecomposer/tools/resizetool.cpp +++ /dev/null @@ -1,166 +0,0 @@ -#include "resizetool.h" - -#include -#include -#include -#include - -#include - -#include "../objectcontroller.h" - -ResizeTool::ResizeTool(ObjectController *controller) : - SelectTool(controller) { - -} - -void ResizeTool::beginControl() { - SelectTool::beginControl(); - m_savedBox = m_box; - for(auto &it : m_controller->selectList()) { - if(it.renderable) { - it.box = it.renderable->bound(); - - Vector3 p = it.object->transform()->worldPosition(); - it.pivot = it.box.center - p; - } - } -} - -void ResizeTool::update(bool pivot, bool local, bool snap) { - SelectTool::update(pivot, local, snap); - - m_box = objectBound(); - if(!m_box.isValid()) { - return; - } - - bool isDrag = m_controller->isDrag(); - if(!isDrag) { - m_position = objectPosition(); - } - - int axis; - m_world = Handles::rectTool(m_box.center, m_box.extent * 2.0f, axis, false, isDrag); - - if(isDrag) { - Vector3 delta; - Vector3 mask(1.0f); - - if(Handles::s_Axes & Handles::POINT_R) { - if(axis == Handles::AXIS_X) { - delta.z = m_savedWorld.z - m_world.z; - mask.z = -1.0f; - } else { - delta.x = m_world.x - m_savedWorld.x; - } - } - if(Handles::s_Axes & Handles::POINT_L) { - if(axis == Handles::AXIS_X) { - delta.z = m_world.z - m_savedWorld.z; - } else { - delta.x = m_savedWorld.x - m_world.x; - mask.x = -1.0f; - } - } - - if(Handles::s_Axes & Handles::POINT_T) { - if(axis == Handles::AXIS_Y) { - delta.z = m_world.z - m_savedWorld.z; - } else { - delta.y = m_world.y - m_savedWorld.y; - } - } - if(Handles::s_Axes & Handles::POINT_B) { - if(axis == Handles::AXIS_Y) { - delta.z = m_savedWorld.z - m_world.z; - mask.z = -1.0f; - } else { - delta.y = m_savedWorld.y - m_world.y; - mask.y = -1.0f; - } - } - delta *= 0.5f; - - for(const auto &it : qAsConst(m_controller->selectList())) { - Transform *tr = it.object->transform(); - - Matrix4 parent; - if(tr->parentTransform()) { - parent = tr->parentTransform()->worldTransform(); - } - - Vector3 p((parent * it.position) - m_position); - - bool skipScale = false; - if(it.renderable) { - const MetaObject *meta = it.renderable->metaObject(); - int index = meta->indexOfProperty("size"); - void *object = it.renderable; - if(index == -1) { - meta = tr->metaObject(); - index = meta->indexOfProperty("size"); - object = tr; - } - if(index > -1) { - skipScale = true; - MetaProperty property = meta->property(index); - Vector2 size((it.box.extent.x + delta.x) * 2.0f / it.scale.x, - (it.box.extent.y + delta.y) * 2.0f / it.scale.y); - - property.write(object, size); - - Vector3 d(it.pivot.x / ((it.box.extent.x == 0.0f) ? 1.0f : it.box.extent.x), - it.pivot.y / ((it.box.extent.y == 0.0f) ? 1.0f : it.box.extent.y), - it.pivot.z / ((it.box.extent.z == 0.0f) ? 1.0f : it.box.extent.z)); - - tr->setPosition(parent.inverse() * (p + m_position + delta * (mask - d))); - } - } - - if(!skipScale) { - AABBox aabb(m_savedBox.center + delta, m_savedBox.extent + delta); - Vector3 v(it.scale * Vector3((m_savedBox.extent.x == 0.0f) ? 1.0f : (aabb.extent.x / m_savedBox.extent.x), - (m_savedBox.extent.y == 0.0f) ? 1.0f : (aabb.extent.y / m_savedBox.extent.y), - (m_savedBox.extent.z == 0.0f) ? 1.0f : (aabb.extent.z / m_savedBox.extent.z))); - - tr->setScale(v); - tr->setPosition(parent.inverse() * (v * p + m_position + delta * mask)); - } - } - } - - Qt::CursorShape shape = Qt::ArrowCursor; - if(Handles::s_Axes == (Handles::POINT_T | Handles::POINT_B | Handles::POINT_L | Handles::POINT_R)) { - shape = Qt::SizeAllCursor; - } else if(Handles::s_Axes == (Handles::POINT_T | Handles::POINT_R)) { - shape = Qt::SizeBDiagCursor; - } else if(Handles::s_Axes == (Handles::POINT_T | Handles::POINT_L)) { - shape = Qt::SizeFDiagCursor; - } else if(Handles::s_Axes == (Handles::POINT_B | Handles::POINT_R)) { - shape = Qt::SizeFDiagCursor; - } else if(Handles::s_Axes == (Handles::POINT_B | Handles::POINT_L)) { - shape = Qt::SizeBDiagCursor; - } else if((Handles::s_Axes == Handles::POINT_T) | (Handles::s_Axes == Handles::POINT_B)) { - shape = Qt::SizeVerCursor; - } else if((Handles::s_Axes == Handles::POINT_L) | (Handles::s_Axes == Handles::POINT_R)) { - shape = Qt::SizeHorCursor; - } - m_cursor = shape; -} - -QString ResizeTool::icon() const { - return ":/Images/editor/Transform.png"; -} - -QString ResizeTool::name() const { - return "Resize"; -} - -QString ResizeTool::toolTip() const { - return QObject::tr("Select and manipulate objects with rect transform tool"); -} - -QString ResizeTool::shortcut() const { - return "Shift+G"; -} diff --git a/worldeditor/src/screens/scenecomposer/tools/resizetool.h b/worldeditor/src/screens/scenecomposer/tools/resizetool.h deleted file mode 100644 index fbfe1af10..000000000 --- a/worldeditor/src/screens/scenecomposer/tools/resizetool.h +++ /dev/null @@ -1,27 +0,0 @@ -#ifndef RESIZETOOL_H -#define RESIZETOOL_H - -#include "selecttool.h" - -class ResizeTool : public SelectTool { -public: - explicit ResizeTool(ObjectController *controller); - - void update(bool pivot, bool local, bool snap) override; - - void beginControl() override; - - QString icon() const override; - QString name() const override; - - QString toolTip() const override; - QString shortcut() const override; - -protected: - AABBox m_savedBox; - - AABBox m_box; - -}; - -#endif // RESIZETOOL_H diff --git a/worldeditor/src/screens/scenecomposer/tools/rotatetool.cpp b/worldeditor/src/screens/scenecomposer/tools/rotatetool.cpp index fc00a872b..a2ac59eb7 100644 --- a/worldeditor/src/screens/scenecomposer/tools/rotatetool.cpp +++ b/worldeditor/src/screens/scenecomposer/tools/rotatetool.cpp @@ -1,5 +1,8 @@ #include "rotatetool.h" +#include +#include + #include #include #include @@ -9,11 +12,26 @@ #include "../objectcontroller.h" RotateTool::RotateTool(ObjectController *controller) : - SelectTool(controller) { + SelectTool(controller) { m_snap = 5.0f; } +void RotateTool::beginControl() { + SelectTool::beginControl(); + + m_eulers.clear(); + m_quaternions.clear(); + m_positions.clear(); + + for(auto it : m_controller->selectList()) { + Transform *t = it.object->transform(); + m_eulers.push_back(t->rotation()); + m_positions.push_back(t->position()); + m_quaternions.push_back(t->quaternion()); + } +} + void RotateTool::update(bool pivot, bool local, bool snap) { SelectTool::update(pivot, local, snap); @@ -21,30 +39,30 @@ void RotateTool::update(bool pivot, bool local, bool snap) { m_position = objectPosition(); } - SelectTool::Select &sel = m_controller->selectList().back(); - - float angle = Handles::rotationTool(m_position, local ? sel.quat : Quaternion(), m_controller->isDrag()); + float angle = Handles::rotationTool(m_position, local ? m_quaternions.front() : Quaternion(), m_controller->isDrag()); if(m_snap > 0) { angle = m_snap * int(angle / m_snap); } if(m_controller->isDrag()) { + auto eulerIt = m_eulers.begin(); + auto posIt = m_positions.begin(); + auto quatIt = m_quaternions.begin(); for(const auto &it : qAsConst(m_controller->selectList())) { Transform *tr = it.object->transform(); Matrix4 parent; if(tr->parentTransform()) { parent = tr->parentTransform()->worldTransform(); } - Vector3 p((parent * it.position) - m_position); + Vector3 p((parent * *posIt) - m_position); Quaternion q; - Vector3 euler(it.euler); + Vector3 euler(*eulerIt); - Quaternion rot = local ? it.quat : Quaternion(); + Quaternion rot = local ? *quatIt : Quaternion(); switch(Handles::s_Axes) { case Handles::AXIS_X: { q = Quaternion(rot * Vector3(1.0f, 0.0f, 0.0f), angle); - //euler += Vector3(angle, 0.0f, 0.0f); euler += rot * Vector3(angle, 0.0f, 0.0f); } break; case Handles::AXIS_Y: { @@ -65,11 +83,27 @@ void RotateTool::update(bool pivot, bool local, bool snap) { } tr->setPosition(parent.inverse() * (m_position + q * p)); tr->setRotation(euler); - //tr->setQuaternion(q); + + eulerIt++; + quatIt++; } } } +QLineEdit *RotateTool::snapWidget() { + if(m_snapEditor == nullptr) { + QDoubleValidator *validator = new QDoubleValidator(0.01f, DBL_MAX, 4); + validator->setLocale(QLocale("C")); + + m_snapEditor = new QLineEdit(); + m_snapEditor->setValidator(validator); + m_snapEditor->setObjectName(name()); + m_snapEditor->setText(QString::number((double)m_snap, 'f', 2)); + } + + return m_snapEditor; +} + QString RotateTool::icon() const { return ":/Images/editor/Rotate.png"; } diff --git a/worldeditor/src/screens/scenecomposer/tools/rotatetool.h b/worldeditor/src/screens/scenecomposer/tools/rotatetool.h index d16bac639..728955f4c 100644 --- a/worldeditor/src/screens/scenecomposer/tools/rotatetool.h +++ b/worldeditor/src/screens/scenecomposer/tools/rotatetool.h @@ -3,18 +3,29 @@ #include "selecttool.h" +#include + class RotateTool : public SelectTool { public: explicit RotateTool(ObjectController *controller); + void beginControl() override; + void update(bool pivot, bool local, bool snap) override; + QLineEdit *snapWidget() override; + QString icon() const override; QString name() const override; QString toolTip() const override; QString shortcut() const override; +private: + std::list m_eulers; + std::list m_positions; + std::list m_quaternions; + }; #endif // ROTATETOOL_H diff --git a/worldeditor/src/screens/scenecomposer/tools/scaletool.cpp b/worldeditor/src/screens/scenecomposer/tools/scaletool.cpp index 10fe88d0f..b30ba97a4 100644 --- a/worldeditor/src/screens/scenecomposer/tools/scaletool.cpp +++ b/worldeditor/src/screens/scenecomposer/tools/scaletool.cpp @@ -1,5 +1,8 @@ #include "scaletool.h" +#include +#include + #include #include #include @@ -14,6 +17,19 @@ ScaleTool::ScaleTool(ObjectController *controller) : m_snap = 1.0f; } +void ScaleTool::beginControl() { + SelectTool::beginControl(); + + m_scales.clear(); + m_positions.clear(); + + for(auto it : m_controller->selectList()) { + Transform *t = it.object->transform(); + m_scales.push_back(t->scale()); + m_positions.push_back(t->position()); + } +} + void ScaleTool::update(bool center, bool local, bool snap) { SelectTool::update(center, local, snap); @@ -57,6 +73,8 @@ void ScaleTool::update(bool center, bool local, bool snap) { s.z += scale; } + auto scaleIt = m_scales.begin(); + auto positionIt = m_positions.begin(); for(const auto &it : qAsConst(m_controller->selectList())) { Transform *tr = it.object->transform(); Matrix4 parent; @@ -64,15 +82,32 @@ void ScaleTool::update(bool center, bool local, bool snap) { parent = tr->parentTransform()->worldTransform(); } - Vector3 v(it.scale + s); + Vector3 v(*scaleIt + s); tr->setScale(v); - Vector3 p(parent * it.position - m_position); + Vector3 p(parent * *positionIt - m_position); tr->setPosition(parent.inverse() * (v * p + m_position)); + + scaleIt++; + positionIt++; } } } +QLineEdit *ScaleTool::snapWidget() { + if(m_snapEditor == nullptr) { + QDoubleValidator *validator = new QDoubleValidator(0.01f, DBL_MAX, 4); + validator->setLocale(QLocale("C")); + + m_snapEditor = new QLineEdit(); + m_snapEditor->setValidator(validator); + m_snapEditor->setObjectName(name()); + m_snapEditor->setText(QString::number((double)m_snap, 'f', 2)); + } + + return m_snapEditor; +} + QString ScaleTool::icon() const { return ":/Images/editor/Scale.png"; } diff --git a/worldeditor/src/screens/scenecomposer/tools/scaletool.h b/worldeditor/src/screens/scenecomposer/tools/scaletool.h index 56f2a3d0b..3c13f5664 100644 --- a/worldeditor/src/screens/scenecomposer/tools/scaletool.h +++ b/worldeditor/src/screens/scenecomposer/tools/scaletool.h @@ -7,13 +7,22 @@ class ScaleTool : public SelectTool { public: explicit ScaleTool(ObjectController *controller); + void beginControl() override; + void update(bool center, bool local, bool snap) override; + QLineEdit *snapWidget() override; + QString icon() const override; QString name() const override; QString toolTip() const override; QString shortcut() const override; + +private: + std::list m_scales; + std::list m_positions; + }; #endif // SCALETOOL_H diff --git a/worldeditor/src/screens/scenecomposer/tools/selecttool.cpp b/worldeditor/src/screens/scenecomposer/tools/selecttool.cpp index d63f1a2ab..38caeb15c 100644 --- a/worldeditor/src/screens/scenecomposer/tools/selecttool.cpp +++ b/worldeditor/src/screens/scenecomposer/tools/selecttool.cpp @@ -1,5 +1,7 @@ #include "selecttool.h" +#include + #include #include #include @@ -10,7 +12,9 @@ SelectTool::SelectTool(ObjectController *controller) : EditorTool(), - m_controller(controller) { + m_controller(controller), + m_snapEditor(nullptr), + m_button(nullptr) { } @@ -20,11 +24,6 @@ void SelectTool::beginControl() { m_propertiesCache.clear(); for(auto &it : m_controller->selectList()) { - Transform *t = it.object->transform(); - it.position = t->position(); - it.scale = t->scale(); - it.euler = t->rotation(); - it.quat = t->quaternion(); VariantMap components; for(auto &child : it.object->getChildren()) { @@ -78,6 +77,29 @@ const VariantList &SelectTool::cache() const { return m_propertiesCache; } +QPushButton *SelectTool::button() { + if(m_button == nullptr) { + m_button = new QPushButton(); + m_button->setProperty("blue", true); + m_button->setProperty("checkred", true); + m_button->setCheckable(true); + m_button->setAutoExclusive(true); + m_button->setIcon(QIcon(icon())); + m_button->setObjectName(name()); + QString cut = shortcut(); + m_button->setShortcut(QKeySequence(cut)); + m_button->setToolTip(toolTip() + (!cut.isEmpty() ? (" (" + cut + ")") : "")); + + QObject::connect(m_button, &QPushButton::clicked, m_controller, &ObjectController::onChangeTool); + } + + return m_button; +} + +QLineEdit *SelectTool::snapWidget() { + return m_snapEditor; +} + Vector3 SelectTool::objectPosition() { if(m_controller->selectList().size() == 1) { return m_controller->selectList().front().object->transform()->worldPosition(); @@ -91,22 +113,10 @@ AABBox SelectTool::objectBound() { if(!m_controller->selectList().empty()) { bool first = true; for(auto &it : m_controller->selectList()) { - if(it.renderable == nullptr) { - it.renderable = it.object->getComponent(); - } - if(it.renderable) { - if(first) { - result = it.renderable->bound(); - first = false; - } else { - result.encapsulate(it.renderable->bound()); - } + if(first) { + result.center = it.object->transform()->worldPosition(); } else { - if(first) { - result.center = it.object->transform()->worldPosition(); - } else { - result.encapsulate(it.object->transform()->worldPosition()); - } + result.encapsulate(it.object->transform()->worldPosition()); } } } diff --git a/worldeditor/src/screens/scenecomposer/tools/selecttool.h b/worldeditor/src/screens/scenecomposer/tools/selecttool.h index d574af6c3..9f5b877a2 100644 --- a/worldeditor/src/screens/scenecomposer/tools/selecttool.h +++ b/worldeditor/src/screens/scenecomposer/tools/selecttool.h @@ -6,6 +6,9 @@ class ObjectController; class Renderable; +class QLineEdit; +class QPushButton; + class SelectTool : public EditorTool { public: struct Select { @@ -15,14 +18,6 @@ class SelectTool : public EditorTool { uint32_t uuid = 0; Actor *object = nullptr; - Renderable *renderable = nullptr; - - Vector3 position; - Vector3 scale; - Vector3 euler; - Vector3 pivot; - Quaternion quat; - AABBox box; }; typedef QList