From eec61ce1b94783bf5877d0ddc4345a743647f6de Mon Sep 17 00:00:00 2001 From: Areloch Date: Thu, 21 Sep 2017 00:10:44 -0500 Subject: [PATCH] Initial implementation of the EditorTool class and world editor hook-in. --- .../gui/worldEditor/tools/editorTool.cpp | 136 ++++++++++++++++++ .../source/gui/worldEditor/tools/editorTool.h | 88 ++++++++++++ Engine/source/gui/worldEditor/worldEditor.cpp | 47 ++++++ Engine/source/gui/worldEditor/worldEditor.h | 8 +- Tools/CMake/torque3d.cmake | 1 + 5 files changed, 279 insertions(+), 1 deletion(-) create mode 100644 Engine/source/gui/worldEditor/tools/editorTool.cpp create mode 100644 Engine/source/gui/worldEditor/tools/editorTool.h diff --git a/Engine/source/gui/worldEditor/tools/editorTool.cpp b/Engine/source/gui/worldEditor/tools/editorTool.cpp new file mode 100644 index 000000000..1af6c5421 --- /dev/null +++ b/Engine/source/gui/worldEditor/tools/editorTool.cpp @@ -0,0 +1,136 @@ +#include "editorTool.h" + +IMPLEMENT_CONOBJECT(EditorTool); + +EditorTool::EditorTool() +{ + mWorldEditor = NULL; + + mUseMouseDown = true; + mUseMouseUp = true; + mUseMouseMove = true; + + mUseRightMouseDown = false; + mUseRightMouseUp = false; + mUseRightMouseMove = false; + + mUseMiddleMouseDown = true; + mUseMiddleMouseUp = true; + mUseMiddleMouseMove = true; + + mUseKeyInput = true; +} + +bool EditorTool::onAdd() +{ + return Parent::onAdd(); +} + +void EditorTool::onRemove() +{ + Parent::onRemove(); +} + +//Called when the tool is activated on the World Editor +void EditorTool::onActivated(WorldEditor* editor) +{ + mWorldEditor = editor; + Con::executef(this, "onActivated"); +} + +//Called when the tool is deactivated on the World Editor +void EditorTool::onDeactivated() +{ + mWorldEditor = NULL; + Con::executef(this, "onDeactivated"); +} + +// +bool EditorTool::onMouseMove(const Gui3DMouseEvent &e) +{ + if (!mUseMouseDown) + return false; + + Con::executef(this, "onMouseMove", e.mousePoint); + return true; +} +bool EditorTool::onMouseDown(const Gui3DMouseEvent &e) +{ + if (!mUseMouseDown) + return false; + + Con::executef(this, "onMouseDown", e.mousePoint); + return true; +} +bool EditorTool::onMouseDragged(const Gui3DMouseEvent &e) +{ + Con::executef(this, "onMouseDragged", e.mousePoint); + return true; +} +bool EditorTool::onMouseUp(const Gui3DMouseEvent &e) +{ + if (!mUseMouseDown) + return false; + + Con::executef(this, "onMouseUp", e.mousePoint); + return true; +} + +// +bool EditorTool::onRightMouseDown(const Gui3DMouseEvent &e) +{ + if (!mUseRightMouseDown) + return false; + + Con::executef(this, "onRightMouseDown", e.mousePoint); + return true; +} +bool EditorTool::onRightMouseDragged(const Gui3DMouseEvent &e) +{ + Con::executef(this, "onRightMouseDragged", e.mousePoint); + return true; +} +bool EditorTool::onRightMouseUp(const Gui3DMouseEvent &e) +{ + if (!mUseRightMouseDown) + return false; + + Con::executef(this, "onRightMouseUp", e.mousePoint); + return true; +} + +// +bool EditorTool::onMiddleMouseDown(const Gui3DMouseEvent &e) +{ + if (!mUseMiddleMouseDown) + return false; + + Con::executef(this, "onMiddleMouseDown", e.mousePoint); + return true; +} +bool EditorTool::onMiddleMouseDragged(const Gui3DMouseEvent &e) +{ + Con::executef(this, "onMiddleMouseDragged", e.mousePoint); + return true; +} +bool EditorTool::onMiddleMouseUp(const Gui3DMouseEvent &e) +{ + if (!mUseMiddleMouseDown) + return false; + + Con::executef(this, "onMiddleMouseUp", e.mousePoint); + return true; +} + +// +bool EditorTool::onInputEvent(const InputEventInfo &e) +{ + if (!mUseKeyInput) + return false; + + Con::executef(this, "onKeyPress", e.ascii, e.modifier); + return true; +} + +// +void render(SceneRenderState *); \ No newline at end of file diff --git a/Engine/source/gui/worldEditor/tools/editorTool.h b/Engine/source/gui/worldEditor/tools/editorTool.h new file mode 100644 index 000000000..4b872fe6b --- /dev/null +++ b/Engine/source/gui/worldEditor/tools/editorTool.h @@ -0,0 +1,88 @@ +//----------------------------------------------------------------------------- +// Copyright (c) 2012 GarageGames, LLC +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to +// deal in the Software without restriction, including without limitation the +// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +// sell copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +// IN THE SOFTWARE. +//----------------------------------------------------------------------------- + +#ifndef _EDITOR_TOOL_ +#define _EDITOR_TOOL_ + +#ifndef _WORLDEDITOR_H_ +#include "gui/worldEditor/worldEditor.h" +#endif + +class EditorTool : public SimObject +{ + typedef SimObject Parent; + +protected: + WorldEditor* mWorldEditor; + bool mUseMouseDown; + bool mUseMouseUp; + bool mUseMouseMove; + + bool mUseRightMouseDown; + bool mUseRightMouseUp; + bool mUseRightMouseMove; + + bool mUseMiddleMouseDown; + bool mUseMiddleMouseUp; + bool mUseMiddleMouseMove; + + bool mUseKeyInput; + +public: + EditorTool(); + ~EditorTool(){} + + DECLARE_CONOBJECT(EditorTool); + + bool onAdd(); + void onRemove(); + + //Called when the tool is activated on the World Editor + virtual void onActivated(WorldEditor*); + + //Called when the tool is deactivated on the World Editor + virtual void onDeactivated(); + + // + virtual bool onMouseMove(const Gui3DMouseEvent &); + virtual bool onMouseDown(const Gui3DMouseEvent &); + virtual bool onMouseDragged(const Gui3DMouseEvent &); + virtual bool onMouseUp(const Gui3DMouseEvent &); + + // + virtual bool onRightMouseDown(const Gui3DMouseEvent &); + virtual bool onRightMouseDragged(const Gui3DMouseEvent &); + virtual bool onRightMouseUp(const Gui3DMouseEvent &); + + // + virtual bool onMiddleMouseDown(const Gui3DMouseEvent &); + virtual bool onMiddleMouseDragged(const Gui3DMouseEvent &); + virtual bool onMiddleMouseUp(const Gui3DMouseEvent &); + + // + virtual bool onInputEvent(const InputEventInfo &); + + // + virtual void render(){} +}; + +#endif \ No newline at end of file diff --git a/Engine/source/gui/worldEditor/worldEditor.cpp b/Engine/source/gui/worldEditor/worldEditor.cpp index d4c4c55ab..7846ec094 100644 --- a/Engine/source/gui/worldEditor/worldEditor.cpp +++ b/Engine/source/gui/worldEditor/worldEditor.cpp @@ -49,6 +49,7 @@ #include "math/mEase.h" #include "T3D/tsStatic.h" +#include "tools/editorTool.h" IMPLEMENT_CONOBJECT( WorldEditor ); @@ -1823,6 +1824,8 @@ WorldEditor::WorldEditor() mUseGroupCenter = true; mFadeIcons = true; mFadeIconsDist = 8.f; + + mActiveEditorTool = nullptr; } WorldEditor::~WorldEditor() @@ -1915,6 +1918,10 @@ void WorldEditor::on3DMouseMove(const Gui3DMouseEvent & event) setCursor(PlatformCursorController::curArrow); mHitObject = NULL; + //If we have an active tool and it's intercepted our input, bail out + if (mActiveEditorTool != nullptr && mActiveEditorTool->onMouseMove(event)) + return; + // mUsingAxisGizmo = false; @@ -1943,6 +1950,10 @@ void WorldEditor::on3DMouseMove(const Gui3DMouseEvent & event) void WorldEditor::on3DMouseDown(const Gui3DMouseEvent & event) { + //If we have an active tool and it's intercepted our input, bail out + if (mActiveEditorTool != nullptr && mActiveEditorTool->onMouseDown(event)) + return; + mMouseDown = true; mMouseDragged = false; mPerformedDragCopy = false; @@ -2010,6 +2021,10 @@ void WorldEditor::on3DMouseDown(const Gui3DMouseEvent & event) void WorldEditor::on3DMouseUp( const Gui3DMouseEvent &event ) { + //If we have an active tool and it's intercepted our input, bail out + if (mActiveEditorTool != nullptr && mActiveEditorTool->onMouseUp(event)) + return; + const bool wasUsingAxisGizmo = mUsingAxisGizmo; mMouseDown = false; @@ -2165,6 +2180,10 @@ void WorldEditor::on3DMouseUp( const Gui3DMouseEvent &event ) void WorldEditor::on3DMouseDragged(const Gui3DMouseEvent & event) { + //If we have an active tool and it's intercepted our input, bail out + if (mActiveEditorTool != nullptr && mActiveEditorTool->onMouseDragged(event)) + return; + if ( !mMouseDown ) return; @@ -2400,6 +2419,9 @@ void WorldEditor::renderScene( const RectI &updateRect ) GFXDEBUGEVENT_SCOPE( Editor_renderScene, ColorI::RED ); smRenderSceneSignal.trigger(this); + + if (mActiveEditorTool != nullptr) + mActiveEditorTool->render(); // Grab this before anything here changes it. Frustum frustum; @@ -3190,6 +3212,19 @@ void WorldEditor::resetSelectedScale() //------------------------------------------------------------------------------ +void WorldEditor::setEditorTool(EditorTool* newTool) +{ + if (mActiveEditorTool) + mActiveEditorTool->onDeactivated(); + + mActiveEditorTool = newTool; + + if (mActiveEditorTool) + mActiveEditorTool->onActivated(this); +} + +//------------------------------------------------------------------------------ + ConsoleMethod( WorldEditor, ignoreObjClass, void, 3, 0, "(string class_name, ...)") { object->ignoreObjClass(argc, argv); @@ -4175,3 +4210,15 @@ DefineEngineMethod( WorldEditor, createConvexShapeFrom, ConvexShape*, ( SceneObj return shape; } + +DefineEngineMethod(WorldEditor, setEditorTool, void, (EditorTool* newEditorTool), (nullAsType()), + "Sets the active Editor Tool for the world editor.") +{ + object->setEditorTool(newEditorTool); +} + +DefineEngineMethod(WorldEditor, getActiveEditorTool, EditorTool*, (),, + "Gets the active Editor Tool for the world editor.") +{ + return object->getActiveEditorTool(); +} diff --git a/Engine/source/gui/worldEditor/worldEditor.h b/Engine/source/gui/worldEditor/worldEditor.h index fb125daf5..5bdd8f0f2 100644 --- a/Engine/source/gui/worldEditor/worldEditor.h +++ b/Engine/source/gui/worldEditor/worldEditor.h @@ -58,7 +58,7 @@ class SceneObject; class WorldEditorSelection; - +class EditorTool; /// class WorldEditor : public EditTSCtrl @@ -285,6 +285,9 @@ class WorldEditor : public EditTSCtrl ClassInfo::Entry * getClassEntry(const SimObject * obj); bool addClassEntry(ClassInfo::Entry * entry); + + EditorTool* mActiveEditorTool; + // persist field data public: @@ -411,6 +414,9 @@ class WorldEditor : public EditTSCtrl DECLARE_CONOBJECT(WorldEditor); static Signal smRenderSceneSignal; + + void setEditorTool(EditorTool*); + EditorTool* getActiveEditorTool() { return mActiveEditorTool; } }; typedef WorldEditor::DropType WorldEditorDropType; diff --git a/Tools/CMake/torque3d.cmake b/Tools/CMake/torque3d.cmake index 1850e4751..63209ae97 100644 --- a/Tools/CMake/torque3d.cmake +++ b/Tools/CMake/torque3d.cmake @@ -418,6 +418,7 @@ endif() # Include tools for non-tool builds (or define player if a tool build) if(TORQUE_TOOLS) addPath("${srcDir}/gui/worldEditor") + addPath("${srcDir}/gui/worldEditor/tools") addPath("${srcDir}/environment/editors") addPath("${srcDir}/forest/editor") addPath("${srcDir}/gui/editor")