Giter Club home page Giter Club logo

godot-orchestrator's Introduction

screen-shot

Godot v4.2 GitHub release (latest by date) LICENSE

Godot Orchestrator

Orchestrator is the ultimate Visual-Scripting solution designed for Godot 4.2+ platform. It revolutionizes Godot game development with its intuitive graph editor interface and hundreds of nodes to build any game logic. This add-on empowers you to craft complex behaviors and intricate game logic with unparalleled ease and flexibility, just as you would find in other commercially available game engines.

Whether you are an experienced Godot veteran or an aspiring developer eager to get started with game development, Orchestrator is a must-have plug-in for any Godot project.

The following screenshots only scratch the surface of what the plug-in offers out of the box, with much more in future builds.

screen-shot

screen-shot

screen-shot

screen-shot

๐Ÿš€ Features

  • A complete visual scripting solution for Godot.
  • Compatible with Godot 4.2+ using Godot GDExtension plug-in technology.
  • Attach an OrchestratorScript to any Godot scene node just like GDScript or CSharp.
  • Hundreds of nodes in dozens of categories such as Flow Control, Logic, Math, Variables and more.
  • Drag-and-drop Editor integration for Scene Nodes, Properties, and Resources.
  • Build re-usable code with custom functions.
  • Supports sending and reacting to Godot signals.
  • Design complex dialogue conversations for NPCs for any game.
  • Work with any Godot engine data type, including complex types like Arrays or Dictionaries.

๐Ÿ“‘ Documentation

For complete documentation, see https://docs.vahera.com/orchestrator.

๐Ÿ—’๏ธ Changelog

See CHANGELOG.

๐Ÿ“ Licenses

๐Ÿ’ฌ Community

๐Ÿ‘ Contributors

godot-orchestrator's People

Contributors

gvrocksnow avatar naros avatar nullmember avatar zomphie avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

godot-orchestrator's Issues

Component view does not scroll to the bottom when adding new element.

Describe the bug

The component view has a series of accordion widgets for Graphs, Functions, Macros, Variables, and Signals. When adding a new item to one of these accordions, if the bottom of its list is not visible because of the scroll panel, the edit widget looks out of place for setting the new item's name.

Expected behavior

The accordion's tree list should be scrolled to the bottom and made visible before adding the new item.a

Actual behavior

No response

How to Reproduce?

Create an orchestration with several functions and lots of variables, such that the variable accordion section spans beyond the visible rect of the component view. Clicking the + button on variables shows an out of place widget, as shown here:
image

Godot full version

4.2.1-stable

Orchestrator version

2.0.dev1

Additional information

No response

Add node icons and improve drop-and-drop visual

Description

The "Available Nodes" tree seems a bit disjointed from the remainder of the Editor UI because the elements do not have icons. We should look through the icons available from the editor by default and see if any of those can work well for our current nodes. Additionally, the drag-and-drop visual from the node list is very bland, it can be improved to look similar to the file dock or others by including the icon in the drag widget itself.

Implementation ideas

No response

Crash on extending bool socket from branch node (4.2.1 mono 2.0 dev 2 )

Describe the bug

While clicking on a bool socket on branch node and then clicking to create a node to connect it to im experiencing a crash to desktop. Branch node is connected to physic process event node.

Expected behavior

Creates a new node and doesnt crash

Actual behavior

Crashes to desktop

How to Reproduce?

  1. Create fresh empty project in Godot 421 mono
  2. create a new node 3d
  3. add new script
  4. create processing event node
  5. connect it to new branch node
  6. extend bool socket to create new node
  7. crash ensues

Godot full version

4.2.1 Mono

Orchestrator version

2.0 dev 2

Additional information

No response

[4.3] Scene Dock does not open Orchestration Script

Describe the bug

When using Godot 4.3.dev2, the attached orchestration script is not opened in the Orchestrator tab.

Expected behavior

Click the Scrpt icon opens the Orchestration.

Actual behavior

No action taken.

How to Reproduce?

  1. Download Godot 4.3.dev2
  2. Attach an Orchestration to a scene node.
  3. Save all files and close the Orchestration.
  4. Click the script icon on the node, nothing happens.

Godot full version

4.3.dev2

Orchestrator version

2.0.dev1

Additional information

Attaching a GDScript seems to work.

Support Debugging and Breakpoints

Description

Currently, built-in scripting solutions like GDScript and CSharp can both integrate with the Godot Editor's debugging subsystem; however, this entire system is not exposed to GDExtension, which presents an issue for tools like Orchestrator to support real-time debugging and breakpoints.

Implementation ideas

A number of changes are required in the main Godot repository, including the following:

  1. Create the ScriptDebugger wrapped in core bindings and expose it along with its debug method.
  2. Expose the get_script_debugger, debug, and line_poll methods on EngineDebugger.
  3. In script_language_extension.cpp add GDVIRTUAL_BIND(_debug_get_stack_level_source, "level");.

Crash after dragging any asset from FileSystem into an EventGraph and then trying to drag the value connection from the resulting node

Describe the bug

Editor crash

Expected behavior

Editor shouldn't crash

Actual behavior

Editor crashes

How to Reproduce?

  1. Drag any asset from FileSystem to EventGraph. I've tried with .tscn, .gd and .os. Same result for all.
  2. In the popup box from the two options, select "Get Path", which adds a GetResourcePath node.
  3. Grab the GetResourcePath node's value connection and start dragging it
  4. Notice how editor crashes

Godot full version

4.2.1

Orchestrator version

2.0.dev2

Additional information

No response

The node action menu creates many temporary objects

Description

The action menu has a function called _register_node that is responsible for inspecting details about a given node type and adds an entry to the menu's tree list. The main issue is that this function is highly inefficient and often leads to the same instance being re-created to retrieve the following details:

  • Flags (is the node catalogable, i.e., should it be shown)
  • Tooltip text
  • Displayed icon
  • Graph compatibility check

However, beyond creating an instance of OScriptNode for each entry on the list, it also creates a node spawner instance and an action menu item. While the latter two are mainly glue for handling the selection and dispatch of the entry in the list, re-creating even those each time the dialog window is opened when the list hasn't changed is also inefficient.

Implementation ideas

The action menu should utilize a cache mechanism, where the list entries are generated once with some way to invalidate the cache based on specific criteria, such as when a user adds/removes a user-defined function, variable, or signal.

Input.get_vector is missing

Description

Currently im trying to make simple character controller, and I tried to find Input.get_vector as it is a nice shortcut for common keybinding setup and I cant seem to find it through new node menu.

Implementation ideas

I can of course program my own node or function but native implementation would be nice.

image

Restricting an orchestration to 1 end node can be cumbersome

Suggestion

When you have a number of flow control nodes that deviate from what happens and have all flows converge on a single end node, it can be difficult to pick precisely which connection you may want to disconnect when adding a new node in the connection's path.

Perhaps it would be helpful to instead allow multiple end nodes to exist while only restricting a singular start terminal node?

Godot full version

4.1.1.stable

Orchestrator version

1.0.2

Additional information

No response

Support Godot 4.2

Description

Godot 4.2 introduced several changes to the GraphEdit and GraphNode nodes.

  1. Connection nodes are referred to as from_node / to_node rather than from / to.
  2. Close buttons were removed from GraphNode and must be added manually if needed.
  3. Old Godot 4.x themes do not apply properly to GraphNode instances.

Implementation ideas

No response

The "Update Available" indicator is always active

Describe the bug

After installing the 2.0.dev1 artifact from the GitHub repository, the "Update available" text is shown in the top right of the main view despite being on the latest build published.

Expected behavior

The "Update available" indicator should only be shown when an update is available.

Actual behavior

The "Update available" indicator is always shown.

How to Reproduce?

  1. Download the GitHub 2.0.dev1 build
  2. Unzip the plug-in into a fresh Godot project
  3. Start the editor
  4. Click the Orchestrator view
  5. Look in the top right area of the main view, "Update available" will be shown.

Godot full version

4.2.1-stable

Orchestrator version

2.0.dev1

Additional information

No response

Removing choice in ShowMessage node throws invalid index 'from'

Describe the bug

When removing a choice node from a ShowMessage node prior to the node being saved, the editor outputs an error:

res://addons/orchestrator/components/editor/orchestration_graph.gd:140 - Invalid get index 'from' (on base: 'Dictionary').
res://addons/orchestrator/components/editor/orchestration_graph.gd:147 - Invalid get index 'from' (on base: 'Dictionary').

Expected behavior

It should not throw an exception.

Actual behavior

Exception thrown.

How to Reproduce?

Steps to reproduce:

  1. Create an orchestration.
  2. Drag a show message node onto the graph.
  3. Add a choice node.
  4. Remove the choice node (error thrown).

If you do the following, no error is thrown:

  1. Create an orchestration.
  2. Drag a show message node onto the graph.
  3. Save the orchestration.
  4. Add a choice node
  5. Remove the choice node (no error)

Godot full version

4.1.1.stable

Orchestrator version

1.0.5

Additional information

No response

Unable to add new variables to an orchestration if any variable is added to a Category

Describe the bug

If any existing variable is added to a Category, I'm unable to add new variables. Once the categorized variable is deleted, I can add variables again.

Expected behavior

By clicking the + button, I should be able to add variables no matter what categories are configured.

Actual behavior

Can't add new variables if a Category is defined for some variable.

How to Reproduce?

  1. Add new variable of any type
  2. Add that variable to "abc" Category
  3. Try to add a new variable and notice that it's not possible anymore

Godot full version

4.2.1

Orchestrator version

2.0.dev2

Additional information

No response

The EditorPlugin._apply_changes() or editor hot-key Ctrl+S does not trigger an Orchestration save

Describe the bug

When using the editor hot-key Ctrl+S, the editor will automatically call all EditorPlugin._apply_changes() callbacks, but this does not save any modified orchestrations to disk.

Expected behavior

When hitting Ctrl+S, the orchestration should be saved just like scripts and scenes.

Actual behavior

The orchestration is not saved and requires the user to click File -> Save on the Orchestrator sub-menu to be saved.

How to Reproduce?

Steps to reproduce:

  1. Create a new orchestration.
  2. Add a new node to the orchestration.
  3. Click Ctrl+S
  4. Orchestration will not be saved and any pending changes may be lost.

Godot full version

4.1.1.stable

Orchestrator version

1.0.1

Additional information

No response

Plug-in generates load failures after installation, editor start-up, and while being enabled

Describe the bug

When the plug-in is not yet enabled and Godot is started, the following errors occur:

res://addons/orchestrator/components/editor/orchestration_graph.gd:30 - Parse Error: Identifier "OrchestratorNodeFactory" not declared in the current scope.
res://addons/orchestrator/components/editor/orchestration_graph.gd:169 - Parse Error: Identifier "OrchestratorNodeFactory" not declared in the current scope.
res://addons/orchestrator/components/editor/node_tree_list.gd:54 - Parse Error: Identifier "OrchestratorNodeFactory" not declared in the current scope.

When the plug-in is enabled, the following errors occur:

res://addons/orchestrator/components/nodes/flow_control/condition_node.gd:16 - Parse Error: Identifier "Orchestrator" not declared in the current scope.
res://addons/orchestrator/components/nodes/logic/expression_node.gd:15 - Parse Error: Identifier "Orchestrator" not declared in the current scope.
res://addons/orchestrator/components/nodes/logic/script_node.gd:125 - Parse Error: Identifier "Orchestrator" not declared in the current scope.
res://addons/orchestrator/components/nodes/logic/show_message_node.gd:46 - Parse Error: Identifier "Orchestrator" not declared in the current scope.
res://addons/orchestrator/components/nodes/logic/show_message_node.gd:393 - Parse Error: Identifier "Orchestrator" not declared in the current scope.
res://addons/orchestrator/components/nodes/logic/wait_node.gd:17 - Parse Error: Identifier "Orchestrator" not declared in the current scope.
res://addons/orchestrator/test/test.gd:17 - Parse Error: Identifier "Orchestrator" not declared in the current scope.
res://addons/orchestrator/test/test.gd:18 - Parse Error: Identifier "Orchestrator" not declared in the current scope.

These errors are a product of the fact that the plugin.gd script uses const preload, and this causes specific parts of the addon to be loaded even though the addon may not be enabled. Due to the dependencies on things such as autoloads, this creates a laundry list of errors.

When the plug-in is enabled, the additional errors are caused by the OrchestratorNodeFactory performing a scan of the Orchestrator resources during its _ready() callback; however, the Orchestrator autoload is registered second, causing the scripts that reference to the autoload to throw an error. For simplicity's sake, adding a process_frame wait before doing the scan will guarantee that both autoloads have been registered successfully before proceeding with the first resource scan.

Expected behavior

There should be no start-up errors when the plug-in is not enabled. There also should not be any errors reported when the plug-in is later enabled.

Actual behavior

Errors are reported in both scenarios, see above.

How to Reproduce?

Steps to reproduce the behavior:

  1. Install the Orchestrator plug-in from the Godot asset library.
  2. You will notice there may be some errors after the files are installed.
  3. Restart the Godot editor.
  4. The first batch of errors is displayed in the output window.
  5. Navigate to the Project --> Project Settings --> Plugins tab and enable the plug-in.
  6. The second batch of errors is displayed in the output window.

Godot full version

4.1.1.stable

Orchestrator version

1.0.1

Additional information

No response

Orchestrator fails to locate nodes when ran from the editor's Run option

Describe the bug

When running an orchestration from Godot's editor, the orchestrator.gd attempts to look up the nodes prior to the factory having loaded all resources due to the await get_tree().process_frame call in orchestrator_node_factory.gd _ready function call.

Expected behavior

The orchestration should be runnable from within the editor's UI.

Actual behavior

Orchestration fails to run in the editor, works fine in-game.

How to Reproduce?

Steps to reproduce:

  1. Create a simple orchestration with a start, expression, and end node where the expression has print("hello world").
  2. Save the orchestration and click "File -> Run Orchestration" from the plug-in menu.
  3. No output is rendered.

Godot full version

4.1.1.stable

Orchestrator version

1.0.2

Additional information

As a workaround, the following can be manually added to orchestrator.gd as a short-term fix line 27:

	# Because OrchestratorNodeFactory awaits on the process frame, we have to
	# await on the same spot here to avoid there being a loading issue and
	# the factory not yet having scanned the nodes.
	await get_tree().process_frame

This should be added immediately before the following line:

	var node = OrchestratorNodeFactory.get_node_resource(data["type"])

Plug-in settings UI

Description

It would be useful to introduce a Plug-in Settings dialog that mimics the behavior similar to the Editor Settings or Project Settings screens. This view would allow the user to set plug-in-specific settings such as:

  1. Default test scene, allowing the user to provide a custom test scene used when running Orchestrations.
  2. Default show message scene used by ShowMessage nodes. This could also tie into the idea that each node type could define its own settings that would be stored and updatable via the settings UI.
  3. Configure the OrchestrationNode category colors for editor skinning purposes.
  4. Restricting which Autoloads are to be globally accessible in Orchestrations (currently all).

Implementation ideas

No response

Consider removing fuzzy finder animation

Description

One thing that immediately frustrates me when starting to use the v2 version of the tool is the fuzzy finder popup with a fancy animation that's 0.5f-1f long. It disrupts my flow and slows me down. I'd much prefer if it appeared as fast as possible.

Implementation ideas

No response

Edited status is not properly tracked

Describe the bug

When closing a modified Orchestration, the user is not alerted that the Orchestration is modified, and changes will be lost. Additionally there is no indicator on the UI that a specific script has been modified like the Scripts tab.

Expected behavior

Notify the user that changes will be lost.

Actual behavior

No response

How to Reproduce?

  1. Open an existing Orchestration and add a new event, variable, or user-defined function.
  2. Now close the Orchestration using Ctrl+W or the File menu, the user will not be notified.

Godot full version

4.2.1-stable

Orchestrator version

2.0.dev1

Additional information

No response

An orchestrator script causes game to crash

Describe the bug

When creating a scene using an orchestration, certain combination of nodes cause the game to crash.combinations

Expected behavior

Game should not crash.

Actual behavior

Game crashes

How to Reproduce?

Create a simple scene with two child nodes:

+ Node3D
  + Node3DChild1
  + Node3DChild2

Create an orchestration attached to Node3DChild1 and add a _ready callback. Then drag Node3DChild2 onto the graph canvas to create an OScriptNodeSceneNode. Add a variable with type Object and then create an OScriptNodeVariableSet node and attach the scene node to the variable node.

The simple logic aims to set the variable with the scene node.

Now save the scene and run the scene, game crashes.

Godot full version

4.1.2-stable

Orchestrator version

2.0.dev1

Additional information

No response

OrchestratorNodeFactory may encounter runtime failure loading scripts

Describe the bug

In particular, when combining the Orchestrator and Terrain3D plug-ins in the same project, the OrchestratorNodeFactory attempts to load the Terrain3D script res://addons/terrain_3d/components/tool_settings.gd and this leads to the following exception in the editor:

Parser Error: Native class "EditorSpinSlider" cannot be constructed as it is abstract.
0 - res://addons/terrain_3d/editor/components/tool_settings.gd:208 - at function:

Expected behavior

The plug-in to not throw a runtime exception while rendering the scene.

Actual behavior

The rendering of the scene fails with a parser error.

How to Reproduce?

Steps to reproduce:

  1. Download the Terrain3D plug-in and install it.
  2. Download the Orchestrator plug-in and install it.
  3. Create an empty scene (2D or 3D).
  4. Run the scene and observe the failure.

Godot full version

4.1.1.stable

Orchestrator version

1.0.1

Additional information

No response

Error in console: ScriptExtension::_gdvirtual__get_language_call

Describe the bug

E 0:00:00:0621 ScriptExtension::_gdvirtual__get_language_call: Required virtual method ScriptExtension::_get_language must be overridden before calling.
<C++ Source> .\core/object/script_language_extension.h:120 @ ScriptExtension::_gdvirtual__get_language_call()

Expected behavior

Clean console

Actual behavior

Console is not clean

How to Reproduce?

  1. Create new orchestration.
  2. Drag the orchestration on some scene node. (My Hierarchy is Node2D/CanvasLayer. Orchestration is on CanvasLayer)
  3. Enter Play mode
  4. Notice the error in console

Godot full version

4.2.1

Orchestrator version

2.0.dev2

Additional information

No response

Add empty graph status text

Description

When a user creates an empty graph or an initial Orchestration, it would be helpful to advise them that using the right mouse button in the graph canvas allows them to add new nodes.

Implementation ideas

No response

Show Message node speaker

Describe the bug

The Show Message node uses the speaker variable instead of the speaker_name variable. It currently displays "Character" for the speakers name on every show message event.

Changed line 49 to this: node.show_message(speaker_name, message, options)

Expected behavior

No response

Actual behavior

No response

How to Reproduce?

Tried making a conversation between 2 people and realized everyone was named "Character".

Godot full version

4.1

Orchestrator version

1.0.5

Additional information

No response

Support Bulk Operations - Cut/Copy/Duplicate/Paste

Description

When working with Graphs, it would be useful to support doing bulk operations within the Graph canvas, such as cutting, copying, pasting, and duplicating nodes.

Implementation ideas

The Orchestrator GraphEdit would maintain a static struct that represents the current clipboard state, holding details about the nodes, their connections, and positions that were selected when the user performed a ui_copy or a ui_cut operation. When performing the ui_paste operation, the current focused graph would use the clipboard state to add nodes to the graph for the paste operation.

Additionally, each node would add Cut (Ctrl+X), Copy (Ctrl+C), and Duplicate (Ctrl+D) to their context menu and dispatch the ui-actions to the parent graph edit to centralize the functionality for handling the node clipboard in one place.

Specific nodes would be ineligible for a copy/duplication, such as OScriptNodeEvent; however this wouldn't block the user from doing a bulk operation. Instead, a warning would be added to the console, but all other valid nodes that can be operated on would be. Connections would also be copied, but only if both the source and target node of the connection are a part of the bulk operation.

Considerations

Some nodes maintain transient state, like Ref<OScriptVariable> in the OScriptNodeVariable node types. When the node resource is duplicated, transient state isn't copied, which can lead to dereferencing of invalid pointers or usages of references that are not valid but are expected to be.

One idea would be to completely move away from transient state. This has a number of benefits in that we may be able to move away from the need for calls such as post_initialize and simply rely on the resource subsystem to hydrate all needed bits in dependency order without having to query such bits via the owning OScript instance. But I don't think it's necessarily a good idea to cloud this change with that re-organization and complexity.

The other solution would be to follow a similar initialization step upon node duplication where the code would assign the node's new id, it's new position, it's OScript reference, and then would call post_initialize(), treating it as though the node was just hydrated from disk. This would give the node a chance to fix-up any references that are needed, for examine getting the OScriptVariable reference mentioned above in the case of OScriptNodeVariable nodes. This allows the code path to remain fairly consistent with the other node construction paths and keeps the changes localized to just the bulk operations themselves.

Plug-in throws errors after installation and during Godot start-up

Describe the bug

Immediately after installation, Godot throws the following errors on both Mono and GDScript versions:

Godot Engine v4.1.1.stable.official (c) 2007-present Juan Linietsky, Ariel Manzur & Godot Contributors.
  modules/gltf/register_types.cpp:73 - Blend file import is enabled in the project settings, but no Blender path is configured in the editor settings. Blend files will not be imported.
  res://addons/orchestrator/components/editor/node_tree_list.gd:53 - Parse Error: Identifier "OrchestratorNodeFactory" not declared in the current scope.
  res://addons/orchestrator/components/editor/orchestration_graph.gd:30 - Parse Error: Identifier "OrchestratorNodeFactory" not declared in the current scope.
  res://addons/orchestrator/components/editor/orchestration_graph.gd:169 - Parse Error: Identifier "OrchestratorNodeFactory" not declared in the current scope.
  res://addons/orchestrator/components/nodes/flow_control/condition_node.gd:16 - Parse Error: Identifier "Orchestrator" not declared in the current scope.
  res://addons/orchestrator/components/nodes/logic/expression_node.gd:15 - Parse Error: Identifier "Orchestrator" not declared in the current scope.
  res://addons/orchestrator/components/nodes/logic/script_node.gd:125 - Parse Error: Identifier "Orchestrator" not declared in the current scope.
  res://addons/orchestrator/components/nodes/logic/show_message_node.gd:46 - Parse Error: Identifier "Orchestrator" not declared in the current scope.
  res://addons/orchestrator/components/nodes/logic/show_message_node.gd:393 - Parse Error: Identifier "Orchestrator" not declared in the current scope.
  res://addons/orchestrator/components/nodes/logic/wait_node.gd:17 - Parse Error: Identifier "Orchestrator" not declared in the current scope.
  res://addons/orchestrator/test/test.gd:17 - Parse Error: Identifier "Orchestrator" not declared in the current scope.
  res://addons/orchestrator/test/test.gd:18 - Parse Error: Identifier "Orchestrator" not declared in the current scope.
  res://addons/orchestrator/orchestrator.gd:32 - Parse Error: Identifier "OrchestratorNodeFactory" not declared in the current scope.
  res://addons/orchestrator/orchestrator.gd:57 - Parse Error: Identifier "OrchestratorNodeFactory" not declared in the current scope.

After the plug-in is enabled, there may be errors during the enablement or during editor start-up.

Expected behavior

No errors displayed.

Actual behavior

Errors thrown, making plug-in potentially unstable. This usually disappears after an editor restart.

It would appear that the issue stems from the order of operations when the OrchestratorNodeFactory is created and started. In some instances, it is started early in the plug-in lifecycle, typically after the plug-in enters the tree when adding the plug-in to the project via the Project Settings window.

However, OrchestratorNodeFactory is added to the scene after the plug-in's ready signal when the plug-in is enabled at the start, which requires a bit of hacky code to support.

How to Reproduce?

No response

Godot full version

4.1.1.stable / 4.1.1.Mono

Orchestrator version

1.0.4

Additional information

No response

Visual Improvements - Border/Corner Radius & Gradient Titlebars

Description

As discussed on Discord, it would be neat to add additional cosmetic features allowing users to specify a custom border/corner radius that is applied to the GraphNode instances and optionally specify gradient title bars.

Border/Corner Radius

We probably should limit this to a range, perhaps 0-24 or maybe even 0-16. Going above those upper bounds will likely distort the application's visual fidelity just due to how these work. Additionally, border/corner radius values cannot be applied to gradient title boxes. This is a Godot limitation with how StyleBox objects work.

Gradient Title Bars

Gradient title bars work by applying a StyleBoxTexture2D rather than a StyleBoxFlat theme to the GraphNode. These do not have the same features as the flat style box, particularly, they exclude the ability to set border/corner radius and border colors. This means they don't work well with the border/corner radius concept above, nor will they render well in selection highlighting, which is currently done by shading the node's border with yellow.

For now, when Gradient title bars are enabled, and a node is selected, the Gradient effect is disabled on the node, and it will render as though it's using the flat style box theme so that the selection looks reasonable without shifting the title bar's color to compensate, which may be worse for accessibility reasons.

Implementation ideas

We need to add two new settings to OrchestratorSettings, specifically:

  • ui/nodes/titlebar/use_gradient/colors
  • ui/nodes/border_radius

For gradient colors, this will be of the type Variant::BOOL, which will either toggle the behavior on or off. The style box will be created using a StyleBoxTexture2D with an inverted, linear gradient texture based on the node's color defined elsewhere in the settings panel. This option should default to false.

For border-radius, this will be a Variant::INT based on a range of 0-24 with a step range of 1. This option will default to 6, slightly improving the current standard border/corner radius.

Add drag short-cut for Variable Getter/Setter

Description

When dragging a variable onto the graph canvas, it would be helpful to use short-cut keybindings to control how the drag is handled rather than forcing the user to select the Getter or Setter from the pop-up menu.

Implementation ideas

  • Add a status message to indicate the short-cut keybindings, i.e. Ctrl=Setter, Shift=Getter.
  • If the short-cut keybindings are pressed at drop-time, bypass the popup and place the Setter or Getter.
  • If no short-cut keybinding is pressed at drop-time, present the user with the pop-up menu.

Local Variable Labels

Description

When defining a local variable in a function, there isn't really a good indicator of what that local variable represents, and typically it requires the user to utilize a comment node to give some context, as shown here:

image

We should consider introducing a text attribute on the node that can be changed in the Inspector to set a description or to change the label from Variable (the default) or something more meaningful similar to how regular variable nodes are rendered.

Implementation ideas

No response

Floating Mode

Description

Support a floating mode, similar to how the Godot editor does this for the Script tab.

Implementation ideas

No response

The plug-in archive includes unnecessary files

Describe the bug

When downloading and installing the archive from AssetLib, the installer warns about there being conflicts. In particular, the addon installs files into the project root such as:

  • .gitattributes
  • .github/
  • .gitiignore
  • CHANGELOG.md
  • LICENSE
  • README.md
  • docs/
  • icon.svg
  • project.godot

Expected behavior

The only contents that is installed should be addons/orchestrator/*

Actual behavior

Installs additional files in the project root and other folders.

How to Reproduce?

Steps to reproduce:

  1. Create a new project.
  2. Install plug-in from the AssetLib
  3. See the "Contents of asset "Orchestrator" - X files(s) conflict with your project.

Godot full version

4.1.1.stable

Orchestrator version

1.0.2

Additional information

No response

AssetLib version imports unnecessary files

Describe the bug

Importing this library from asset lib will put
.github
CHANGELOG.md
LICENSE
README.md
files and docs directory into main project directory while those stuff should all land in addons/orchestrator

Expected behavior

No response

Actual behavior

No response

How to Reproduce?

No response

Godot full version

No response

Orchestrator version

No response

Additional information

No response

Support interacting with node-level scripts and exported variables.

Description

Currently, Orchestrator works well with exposing functions and exported variables from the script so that other parts of Godot can interact with the Orchestration; however, when working with another node that has an attached script, we are not correctly introspecting that node's attached script but rather only introspect the node's base type. This leads to problems such as:

  • Cannot get/set an exported variable from GDScript/Orchestration on another node.
  • Cannot call a GDScript/Orchestration function on another node.

Implementation ideas

When a OScriptNodeSceneNode is dragged onto the graph canvas, the introspection logic should not only provide the user with a list of methods, properties, and signals that are exposed from the scene node's base type hierarchy but it should also provide the exact details that exist on the node's attached script.

Right now, the introspection is done by providing the class name, i.e., Node3D or AnimationPlayer. This uses the ClassDB to get those details. What we should do in this specific case is either see if using the NodePath satisfies this requirement of giving the full picture or whether we need to explicitly call Ref<Script> script = node->get_script(); and then use the script to get these details and amend the details from ClassDB.

Variable nodes?

Would variable nodes (bool, String, Vector3, Node3D etc) be added in the future?
Also would be cool if we can optionally assign those from the scene tree for the relevant nodes.

This asset is gona get updated for the godot version 4.2?

Description

I tried to import this asset in the new version of Godot 4.2 but it has many errors. Is there a way to fix them? Will they release a patched version for Godot 4.2?

Line code errors:

res://addons/orchestrator/components/editor/orchestration_graph_node.gd:15 - Parse Error: Identifier "show_close" not declared in the current scope.

res://addons/orchestrator/components/editor/orchestration_graph_node.gd:20 - Parse Error: Identifier "close_request" not declared in the current scope.

res://addons/orchestrator/core/orchestration_node.gd:-1 - Compile Error:

res://addons/orchestrator/components/editor/orchestration_graph_node.gd:15 - Parse Error: Identifier "show_close" not declared in the current scope.

res://addons/orchestrator/components/editor/orchestration_graph_node.gd:20 - Parse Error: Identifier "close_request" not declared in the current scope.

res://addons/orchestrator/components/editor/orchestration_graph.gd:-1 - Compile Error:

modules/gdscript/gdscript.cpp:2775 - Failed to load script "res://addons/orchestrator/components/editor/orchestration_graph.gd" with error "Compilation failed". (User)

Implementation ideas

No response

Implement a scene tree node for Orchestrations

Description

Introduce an OrchestrationPlayer node that enables the developer to drop an Orchestration resource directly into the player's inspector panel and expose several standard methods for working with orchestrations to avoid the need for boilerplate code by users.

Implementation ideas

No response

Demo broken dependenciss

Describe the bug

image

Expected behavior

Startup without errors

Actual behavior

see image above

How to Reproduce?

Open godot-orchestrator-demo-v2.0-dev1-win32
Using Godot 4.2 stable on Windows 10

Godot full version

Godot 4.2 stable

Orchestrator version

v2.0-dev1-win32

Additional information

No response

Restore open Orchestrations

Description

When stopping the editor, any open Orchestrations should be added to a list that is persisted and reused upon restart to restore the state of Orchestrator to before the editor was stopped. A setting should control this behavior, see:

text_editor/behavior/files/restore_scripts_on_load

We could probably use the above setting.

Implementation ideas

No response

Moving an orchestration leads to multiple resources

Describe the bug

If an orchestration is currently open and the file dock is used to move the file to another path, the editor is not updated so that the new path is used when the plug-in saves the file and will save the file to its old path.

Expected behavior

If the file is moved, the editor should update the path for the orchestration so it is saved in its new path.

Actual behavior

Save uses the old path prior to the move.

How to Reproduce?

Steps to reproduce:

  1. Open/Create a new orchestration at one path.
  2. Modify and save the orchestration.
  3. Move the orchestration resource (.tres) from its current path in the file dock to a new path.
  4. Hit Ctrl+S and the editor will save the orchestration at its old path, creating two copies.

Godot full version

4.1.1.stable

Orchestrator version

1.0.2

Additional information

No response

Introduce a generic Finite State Machine graph type

Description

Visual scripting is particularly well geared towards finite state machine visualisation, so I think this would be a good fit for Orchestrator to handle use cases where EventGraph doesn't always make as much sense as an FSM. For example, when developing enemy AI, a custom animation state machine, a structured player controller or just the state of random doors - open, locked, closed, etc.

  • This would likely be a different graph type - StateGraph.
  • A new State Graph contains a single empty state that's marked as Start state, which is where the flow starts for this graph type.
  • Right click doesn't open node finder, instead it gives options for State creation
  • Individual States group nodes similarly to an EventGraph. The StateGraph goes a level higher and groups State and Transition nodes. EventGraph can be dragged into a StateGraph as a new state, or assigned to a Transition.
  • Introduce a transition node, which also nests an EventGraph, doesn't have input or output ports, but listens to signals emitted in connected State nodes.
  • Transitions are done with signals by emitting a signal from a State node to a connected Transition node. A transition has a baked in event trigger node - "Trigger State Transition", which passes the flow to the next connected state.
  • Introduce Any State node with some kind of priority or weight system. Maybe priority with optional weights, overhead needs to be considered.
  • Introduce two new events - On Enter State, On Exit State as the primary ways of executing logic in a state and performing state cleanup.
  • States can also optionally contain all regular events such as Process, which execute only when the state is active
  • Add a new Node type called SubState(?) for EventGraph that nests a StateGraph. It has two flow inputs - Start, Stop and two flow outputs - Started, Stopped. Dragging a StateGraph into an EventGraph nests it as a SubState node.
  • A simple API to get a reference to some StateGraph and get its current active state in GDScript and do something based on that. Also listen to state_changed signal that passes the current state.

+ Flowchart


Implementation ideas

No response

Add auto-update feature

Description

The plug-in should periodically check for updates. If an update is available, the user should be able to automatically download and install the plug-in update, giving them the option to restart the editor after installation.

Implementation ideas

No response

Add Await/Yield Signal Node

Description

Sometimes, an observer needs to ask a subject to perform some asynchronous operation but wishes to be notified by the subject when the asynchronous operation has finished. This can be done in GDScript using the await keyword.

I propose a new node, OScriptNodeAwaitSignal that provides the same functionality as the GDScript await keyword, as shown here in this mock-up:
image

In this use case, the _ready function uses the SceneTree to create a timer with a 5-second duration, and once the timer expires, it raises the timeout signal. The PrintString node will not write its contents to the screen nor the output window until after the timer has expired, 5 seconds later when the timeout signal is fired.

Implementation ideas

No response

Importable function declarations / function libraries

Description

There are often use cases where it makes little sense to try and model specific behavior using a series of graph nodes but rather to model the behavior by calling into a low-level function that performs the low-level action for you. A great example might be when you need to interact with loading some text or JSON data using the FileAccess API.

Implementation ideas

It's not uncommon in the industry that some other abstraction layer handles specific low-level activities and that the visual tooling merely delegates the operation to that layer. For example, taking the contents of a control and writing it to a file on disk, while simple, can quickly become a complex task depending on the data and format involved. For this reason, even commercial engines elect to handle this outside of the visual tools.

Presently, a user in Godot can make this work by creating a scene node and attaching a GDScript file that implements the file-based operations, interacting with Godot's FileAccess object. Once done, this node can be dragged onto the graph canvas to drop a SceneNode node. When dragging from the node's output pin, any function defined on the script will be shown in the action menu, allowing the user to invoke those functions from the Orchestration.

However, creating this scene node seems superfluous and could be avoided. We could introduce an OrchestrationFunctionLibrary class that can be extended by any Godot scripting language, i.e. GDScript or C#. The Orchestrator plug-in would track all types derived from this class, allowing the user to select which derived implementations are imported into the Orchestration.

Once an OrchestationFunctionLibrary is imported, all functions defined within the library would be immediately callable from within the Orchestration, as if those functions were part of the base type. So, in short, rather than dragging from the scene node example above to access the defined function, the user could simply right-click the graph, and it would be accessible.

Move Orchestrator to GDExtension

Description

The Godot GDExtension framework, offered by their godot-cpp project, provides access to a variety of engine features that are not all directly available using GDScript. It also provides a C++-based runtime that can be more efficient for implementing scripting languages than embedding one language within another as we did with Orchestrator v1.

Implementation ideas

No response

Support signals

Description

Currently, Orchestration resources cannot define signals nor react to any signals that may be sent by other parts of the code. It would be helpful to add the following signal support:

  1. Define signals on an Orchestration that can be subscribed to by other parts of the code.
  2. Introduce a new node to emit one of the defined signals, with optional arguments.
  3. Introduce a new wait node that yields the Orchestration workflow until the specified signal is raised.

Implementation ideas

No response

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.