Browse Source

shader editor ground work

Adds the ground work for shader editor
Adds the base gui for the shader editor
marauder2k7 1 year ago
parent
commit
457cdd00bb

+ 40 - 0
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"
+);

+ 96 - 0
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<ShaderNode*> 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<Point2I> 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_

+ 27 - 0
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"
+
+

+ 84 - 0
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_

+ 7 - 0
Templates/BaseGame/game/tools/shaderEditor/gui/shaderEditorGui.asset.taml

@@ -0,0 +1,7 @@
+<GUIAsset
+    canSave="true"
+    canSaveDynamicFields="true"
+    AssetName="ShaderEditorGui, EditorGuiGroup"
+    scriptFile="@assetFile=shaderEditorGui.ed.gui"
+    GUIFile="@assetFile=shaderEditorGui.ed.gui"
+    VersionId="1"/>

+ 114 - 0
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 ---

+ 2 - 1
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")