diff --git a/Engine/source/gui/shaderEditor/guiShaderEditor.cpp b/Engine/source/gui/shaderEditor/guiShaderEditor.cpp new file mode 100644 index 000000000..3ede1823f --- /dev/null +++ b/Engine/source/gui/shaderEditor/guiShaderEditor.cpp @@ -0,0 +1,40 @@ +//----------------------------------------------------------------------------- +// 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. +//----------------------------------------------------------------------------- + +#include "platform/platform.h" +#include "gui/shaderEditor/guiShaderEditor.h" + +#include "core/frameAllocator.h" +#include "core/stream/fileStream.h" +#include "core/stream/memStream.h" +#include "console/consoleTypes.h" +#include "gui/core/guiCanvas.h" +#include "console/engineAPI.h" +#include "console/script.h" + +IMPLEMENT_CONOBJECT(GuiShaderEditor); + +ConsoleDocClass(GuiShaderEditor, + "@brief Implementation of a shader node editor.\n\n" + "Editor use only.\n\n" + "@internal" +); diff --git a/Engine/source/gui/shaderEditor/guiShaderEditor.h b/Engine/source/gui/shaderEditor/guiShaderEditor.h new file mode 100644 index 000000000..3d0773f62 --- /dev/null +++ b/Engine/source/gui/shaderEditor/guiShaderEditor.h @@ -0,0 +1,96 @@ +//----------------------------------------------------------------------------- +// 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 _GUISHADEREDITOR_H_ +#define _GUISHADEREDITOR_H_ + +#ifndef _GUICONTROL_H_ +#include "gui/core/guiControl.h" +#endif +#ifndef _UNDO_H_ +#include "util/undo.h" +#endif +#ifndef _GFX_GFXDRAWER_H_ +#include "gfx/gfxDrawUtil.h" +#endif + +#ifndef _SHADERNODE_H_ +#include "gui/shaderEditor/nodes/shaderNode.h" +#endif // !_SHADERNODE_H_ + +class GuiShaderEditor : public GuiControl +{ +public: + + typedef GuiControl Parent; + + enum mouseModes { Selecting, MovingSelection, DragConnection, DragSelecting, DragClone }; + +protected: + + // list + typedef Vector ShaderNodeVector; + // all nodes in this graph. + ShaderNodeVector mCurrNodes; + + // Undo + SimGroup* mTrash; + SimSet* mSelectedSet; + + // mouse interaction + mouseModes mMouseDownMode; + Point2I mLastMousePos; + Point2I mLastDragPos; + Point2I mSelectionAnchor; + Point2I mDragBeginPoint; + Vector mDragBeginPoints; + bool mDragAddSelection; + bool mDragMoveUndo; + ShaderNodeVector mSelectedNodes; + +public: + GuiShaderEditor(); + + DECLARE_CONOBJECT(GuiShaderEditor); + DECLARE_CATEGORY("Shader Editor"); + DECLARE_DESCRIPTION("Implements a shader node based editor."); + + bool onWake(); + void onSleep(); + static void initPersistFields(); + virtual bool onAdd() override; + virtual void onRemove() override; + + virtual void onPreRender() override; + virtual void onRender(Point2I offset, const RectI& updateRect) override; + + // interaction + virtual bool onKeyDown(const GuiEvent& event) override; + virtual void onMouseDown(const GuiEvent& event) override; + virtual void onMouseUp(const GuiEvent& event) override; + virtual void onMouseMove(const GuiEvent& event) override; + virtual void onMiddleMouseDown(const GuiEvent& event) override; + virtual bool onMouseWheelUp(const GuiEvent& event) override; + virtual bool onMouseWheelDown(const GuiEvent& event) override; +}; + +#endif _GUISHADEREDITOR_H_ diff --git a/Engine/source/gui/shaderEditor/nodes/shaderNode.cpp b/Engine/source/gui/shaderEditor/nodes/shaderNode.cpp new file mode 100644 index 000000000..dfb284269 --- /dev/null +++ b/Engine/source/gui/shaderEditor/nodes/shaderNode.cpp @@ -0,0 +1,27 @@ +//----------------------------------------------------------------------------- +// 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. +//----------------------------------------------------------------------------- + +#include "platform/platform.h" + +#include "gui/shaderEditor/nodes/shaderNode.h" + + diff --git a/Engine/source/gui/shaderEditor/nodes/shaderNode.h b/Engine/source/gui/shaderEditor/nodes/shaderNode.h new file mode 100644 index 000000000..9be57caf7 --- /dev/null +++ b/Engine/source/gui/shaderEditor/nodes/shaderNode.h @@ -0,0 +1,84 @@ +//----------------------------------------------------------------------------- +// 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 _SHADERNODE_H_ +#define _SHADERNODE_H_ + +#ifndef _SIMBASE_H_ +#include "console/simBase.h" +#endif + +enum class NodeTypes +{ + Uniform, + Input, + Output, + TextureSampler, + MathOperation, + Procedural +}; + +enum class DataDimensions +{ + Scalar, + Vector2, + Vector3, + Vector4, + Mat4x4, +}; + +struct NodeInput +{ + String name; + DataDimensions dimensions; +}; + +struct NodeOutput +{ + String name; + DataDimensions dimensions; +}; + +class ShaderNode : public GuiControl +{ +private: + typedef GuiControl Parent; + +public: + ShaderNode(); + + bool onWake(); + void onSleep(); + static void initPersistFields(); + virtual bool onAdd() override; + virtual void onRemove() override; + + // Serialization functions + void write(Stream& stream, U32 tabStop = 0, U32 flags = 0); + void read(Stream& stream); + + // is the parent that all other nodes are derived from. + DECLARE_CONOBJECT(ShaderNode); + DECLARE_CATEGORY("Shader Core"); + DECLARE_DESCRIPTION("Base class for all shader nodes."); +}; +#endif // !_SHADERNODE_H_ diff --git a/Templates/BaseGame/game/tools/shaderEditor/gui/shaderEditorGui.asset.taml b/Templates/BaseGame/game/tools/shaderEditor/gui/shaderEditorGui.asset.taml new file mode 100644 index 000000000..9898caa03 --- /dev/null +++ b/Templates/BaseGame/game/tools/shaderEditor/gui/shaderEditorGui.asset.taml @@ -0,0 +1,7 @@ + diff --git a/Templates/BaseGame/game/tools/shaderEditor/gui/shaderEditorGui.ed.gui b/Templates/BaseGame/game/tools/shaderEditor/gui/shaderEditorGui.ed.gui new file mode 100644 index 000000000..c5709f856 --- /dev/null +++ b/Templates/BaseGame/game/tools/shaderEditor/gui/shaderEditorGui.ed.gui @@ -0,0 +1,114 @@ +//--- OBJECT WRITE BEGIN --- +$guiContent = new GuiControl(ShaderEditorGui) { + extent = "800 600"; + profile = "GuiDefaultProfile"; + tooltipProfile = "ToolsGuiToolTipProfile"; + isContainer = "1"; + canSaveDynamicFields = "1"; + + new GuiFrameSetCtrl() { + columns = "0 200 625"; + borderWidth = "2"; + borderColor = "10 10 10 0"; + autoBalance = "1"; + extent = "800 600"; + horizSizing = "width"; + vertSizing = "height"; + profile = "ToolsGuiFrameSetProfile"; + tooltipProfile = "ToolsGuiToolTipProfile"; + + new GuiControl() { + extent = "198 600"; + horizSizing = "width"; + vertSizing = "height"; + profile = "ToolsGuiDefaultProfile"; + tooltipProfile = "ToolsGuiToolTipProfile"; + isContainer = "1"; + + new GuiSplitContainer() { + orientation = "Horizontal"; + splitPoint = "0 200"; + extent = "197 600"; + horizSizing = "width"; + vertSizing = "height"; + profile = "ToolsGuiDefaultProfile"; + tooltipProfile = "ToolsGuiToolTipProfile"; + + new GuiPanel(ShaderEditorPreview) { + docking = "Client"; + extent = "197 198"; + profile = "ToolsGuiButtonProfile"; + tooltipProfile = "ToolsGuiToolTipProfile"; + internalName = "Panel1"; + }; + new GuiPanel(ShaderEditorInspector) { + docking = "Client"; + position = "0 202"; + extent = "197 398"; + profile = "ToolsGuiButtonProfile"; + tooltipProfile = "ToolsGuiToolTipProfile"; + internalName = "panel2"; + }; + }; + }; + new GuiControl() { + position = "200 0"; + extent = "423 600"; + horizSizing = "width"; + vertSizing = "height"; + profile = "ToolsGuiButtonProfile"; + tooltipProfile = "ToolsGuiToolTipProfile"; + isContainer = "1"; + }; + new GuiControl(ShaderEditorSidebar) { + position = "625 0"; + extent = "175 600"; + horizSizing = "width"; + vertSizing = "height"; + profile = "ToolsGuiDefaultProfile"; + tooltipProfile = "ToolsGuiButtonProfile"; + isContainer = "1"; + + new GuiTabBookCtrl(ShaderEditorTabBook) { + tabHeight = "20"; + allowReorder = "1"; + selectedPage = "0"; + position = "3 5"; + extent = "166 400"; + horizSizing = "width"; + vertSizing = "height"; + profile = "ToolsGuiTabBookProfile"; + tooltipProfile = "ToolsGuiToolTipProfile"; + + new GuiTabPageCtrl() { + fitBook = "1"; + text = "Library"; + position = "0 20"; + extent = "166 380"; + horizSizing = "width"; + vertSizing = "height"; + profile = "ToolsGuiTabPageProfile"; + tooltipProfile = "ToolsGuiToolTipProfile"; + + new GuiScrollCtrl() { + hScrollBar = "dynamic"; + childMargin = "0 2"; + extent = "166 370"; + horizSizing = "width"; + vertSizing = "height"; + profile = "ToolsGuiScrollProfile"; + tooltipProfile = "ToolsGuiToolTipProfile"; + + new GuiStackControl(ShaderToolbox) { + extent = "486 1000"; + horizSizing = "width"; + profile = "ToolsGuiDefaultProfile"; + tooltipProfile = "ToolsGuiToolTipProfile"; + }; + }; + }; + }; + }; + }; +}; +//--- OBJECT WRITE END --- diff --git a/Tools/CMake/modules/tools.cmake b/Tools/CMake/modules/tools.cmake index 070c4e15b..62cad2f3b 100644 --- a/Tools/CMake/modules/tools.cmake +++ b/Tools/CMake/modules/tools.cmake @@ -4,7 +4,8 @@ option(TORQUE_TOOLS "Enable Torque Tools" ON) if(TORQUE_TOOLS) message("Enabling Torque Tools Module") - file(GLOB_RECURSE TORQUE_TOOLS_SOURCES "gui/editor/*.cpp" "gui/editor/*.h" "gui/worldEditor/*.cpp" "gui/worldEditor/*.h") + file(GLOB_RECURSE TORQUE_TOOLS_SOURCES "gui/editor/*.cpp" "gui/editor/*.h" "gui/worldEditor/*.cpp" "gui/worldEditor/*.h" "gui/shaderEditor/*.cpp" "gui/shaderEditor/*.h" + "gui/shaderEditor/nodes/*.cpp" "gui/shaderEditor/nodes/*.h") file(GLOB_RECURSE TORQUE_TOOLS_SOURCES2 "environment/editors/*.cpp" "environment/editors/*.h") file(GLOB_RECURSE TORQUE_TOOLS_SOURCES3 "forest/editor/*.cpp" "forest/editor/*.h")