<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Graphcanvas on GS_Play Gameplay Framework</title><link>https://gsplay.genomestudios.ca/tags/graphcanvas/</link><description>Recent content in Graphcanvas on GS_Play Gameplay Framework</description><generator>Hugo</generator><language>en-us</language><atom:link href="https://gsplay.genomestudios.ca/tags/graphcanvas/index.xml" rel="self" type="application/rss+xml"/><item><title>Descriptor &amp; Topology</title><link>https://gsplay.genomestudios.ca/docs/framework/graphcanvas/descriptor/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://gsplay.genomestudios.ca/docs/framework/graphcanvas/descriptor/</guid><description>&lt;p&gt;The &lt;code&gt;GraphSystemDescriptor&lt;/code&gt; tells gs_graphcanvas what kind of editor to build. It is a plain struct that you fill out and pass to the &lt;code&gt;MainWindow&lt;/code&gt; constructor.&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;h2 id="descriptor-fields"&gt;GraphSystemDescriptor Fields&lt;/h2&gt;
&lt;h3 id="identity"&gt;Identity&lt;/h3&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Field&lt;/th&gt;
 &lt;th&gt;Type&lt;/th&gt;
 &lt;th&gt;Description&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;systemId&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;const char*&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Unique ID string (e.g., &lt;code&gt;&amp;quot;dialogue&amp;quot;&lt;/code&gt;, &lt;code&gt;&amp;quot;audiograph&amp;quot;&lt;/code&gt;, &lt;code&gt;&amp;quot;unitaction&amp;quot;&lt;/code&gt;). Used for node filtering.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;systemName&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;const char*&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Display name shown in the editor title bar.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;fileExtension&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;const char*&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;File extension for graph files (e.g., &lt;code&gt;&amp;quot;.dialogue&amp;quot;&lt;/code&gt;, &lt;code&gt;&amp;quot;.audiograph&amp;quot;&lt;/code&gt;).&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;mimeType&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;const char*&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;MIME type for drag-drop from the node palette.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;saveIdentifier&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;const char*&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;QSettings key for persisting window layout state.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;editorId&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;GraphCanvas::EditorId&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Unique editor ID for the GraphCanvas system.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="topology"&gt;Topology&lt;/h3&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Field&lt;/th&gt;
 &lt;th&gt;Type&lt;/th&gt;
 &lt;th&gt;Default&lt;/th&gt;
 &lt;th&gt;Description&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;topology&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;GraphTopology&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;FlowGraph&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Determines connection style, slot types, and execution model.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;Topology options:&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Nodes</title><link>https://gsplay.genomestudios.ca/docs/framework/graphcanvas/nodes/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://gsplay.genomestudios.ca/docs/framework/graphcanvas/nodes/</guid><description>&lt;p&gt;All gs_graphcanvas nodes inherit from &lt;code&gt;BaseNode&lt;/code&gt;, which extends &lt;code&gt;GraphModel::Node&lt;/code&gt;. BaseNode provides slot registration helpers, flow slot support, inspector property reflection, and transition descriptor management for state machines.&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;h2 id="slot-registration"&gt;Slot Registration&lt;/h2&gt;
&lt;p&gt;Slots are registered in the &lt;code&gt;RegisterSlots()&lt;/code&gt; override using helper macros:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-cpp" data-lang="cpp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;GS_INPUT_SLOT_TYPED&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;slot_name&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;Display Name&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;DataTypeEnum&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;DefaultValue&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;GS_OUTPUT_SLOT_TYPED&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;slot_name&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;Display Name&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;DataTypeEnum&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;GS_INPUT_SLOT_CONNECTION&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;slot_name&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;Display Name&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// Connection-only, no inline editor
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;GS_MULTI_INPUT_SLOT_CONNECTION&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;slot_name&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;Display Name&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// Multiple connections allowed
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;All input slots use &lt;code&gt;editableOnNode=true&lt;/code&gt; by default, providing inline value editing directly on the node in the graph canvas.&lt;/p&gt;</description></item><item><title>Editor Window</title><link>https://gsplay.genomestudios.ca/docs/framework/graphcanvas/editor/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://gsplay.genomestudios.ca/docs/framework/graphcanvas/editor/</guid><description>&lt;p&gt;The &lt;code&gt;MainWindow&lt;/code&gt; class provides a complete graph editor out of the box. Downstream editors subclass it and override virtual hooks to add domain-specific behavior.&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;h2 id="features"&gt;Out-of-the-Box Features&lt;/h2&gt;
&lt;p&gt;Every MainWindow instance includes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Multi-document tabs&lt;/strong&gt; — Each graph opens in its own tab with dirty tracking (asterisk &lt;code&gt;*&lt;/code&gt; in tab title) and close-with-save prompts&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;File menu&lt;/strong&gt; — New, Open, Save, Save As, Open Recent (tracks last 10 files)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Edit menu&lt;/strong&gt; — Undo/Redo (Ctrl+Z / Ctrl+Y), Cut/Copy/Paste&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Node palette&lt;/strong&gt; — Searchable list of available nodes with drag-drop creation&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Inspector panel&lt;/strong&gt; — Auto-generated property editor from node EditContext reflection&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Variable panel&lt;/strong&gt; — Variable declarations, type selection, and default value editing (when enabled)&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="virtual-hooks"&gt;Virtual Hooks&lt;/h2&gt;
&lt;p&gt;MainWindow provides virtual methods for downstream customization:&lt;/p&gt;</description></item><item><title>Variables</title><link>https://gsplay.genomestudios.ca/docs/framework/graphcanvas/variables/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://gsplay.genomestudios.ca/docs/framework/graphcanvas/variables/</guid><description>&lt;p&gt;When &lt;code&gt;variablesEnabled = true&lt;/code&gt; in the &lt;code&gt;GraphSystemDescriptor&lt;/code&gt;, the framework provides a complete variable system for storing and reading named values within a graph.&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;h2 id="variable-panel"&gt;Variable Panel&lt;/h2&gt;
&lt;p&gt;The Variable Panel is a dock widget with a table listing all declared variables. Each variable has:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Name&lt;/strong&gt; — User-defined identifier&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Data Type&lt;/strong&gt; — Selected from a dropdown of registered types (Bool, Int, Float, String, etc.)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Default Value&lt;/strong&gt; — Type-specific editor (checkbox for Bool, spinner for numeric, text field for String, multi-field for vectors, color picker for Color)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Variables are per-graph. Add or remove variables using the panel controls. Undo/redo integration is automatic.&lt;/p&gt;</description></item><item><title>Execution Engines</title><link>https://gsplay.genomestudios.ca/docs/framework/graphcanvas/execution/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://gsplay.genomestudios.ca/docs/framework/graphcanvas/execution/</guid><description>&lt;p&gt;gs_graphcanvas provides three execution engines — one for each topology. All share a common &lt;code&gt;GraphExecutionContext&lt;/code&gt; for variable storage and value resolution, and &lt;code&gt;GraphInstance&lt;/code&gt; for creating independent runtime copies.&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;h2 id="flow-graph"&gt;FlowGraphEvaluator&lt;/h2&gt;
&lt;p&gt;&lt;img src="https://gsplay.genomestudios.ca/images/graph/FlowPath.png" alt="Flow Evaluator in Graph Tool"&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Topology:&lt;/strong&gt; FlowGraph&lt;/p&gt;
&lt;p&gt;Step/wait/resume execution model for sequential graphs. The evaluator follows FlowIn/FlowOut connections from node to node.&lt;/p&gt;
&lt;p&gt;Nodes implement the &lt;code&gt;IExecutableNode&lt;/code&gt; interface:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-cpp" data-lang="cpp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;FlowResult&lt;/span&gt; &lt;span class="nf"&gt;Execute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;GraphExecutionContext&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;FlowResult&lt;/code&gt; controls what happens after a node executes:&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Result&lt;/th&gt;
 &lt;th&gt;Behavior&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;Continue&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Immediately proceed to the next connected node&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;Wait&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Pause execution until &lt;code&gt;Resume()&lt;/code&gt; is called externally&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;Stop&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;End graph execution&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;Used by:&lt;/strong&gt; Dialogue Editor — text nodes return &lt;code&gt;Wait&lt;/code&gt; while dialogue is displayed, then &lt;code&gt;Resume()&lt;/code&gt; advances to the next node.&lt;/p&gt;</description></item></channel></rss>