|
|
| (7 intermediate revisions by the same user not shown) |
| Line 1: |
Line 1: |
| '''ProtoGraph''' is a community made declarative programming language designed to work with [[ProtoFlux]] in the [[Resonite]] ecosystem. It allows creators to write logic in a clean, readable text format that compiles directly into ProtoFlux nodes—making it easier to build, test, and maintain complex systems.
| | [[ProtoGraph]] |
| | |
| == Overview ==
| |
| * '''Paradigm''': [[wikipedia:Dataflow_programming|Dataflow]]
| |
| * '''Family''': ML: Caml: OCaml: F#
| |
| * '''Designers''': [[User:Papaltine|Papaltine]], [[User:Kittysquirrel|Kittysquirrel]]
| |
| * '''Developers''': [[User:Papaltine|Papaltine]], [[User:Kittysquirrel|Kittysquirrel]]
| |
| * '''Stable Release''': N/A (Currently in Beta)
| |
| * '''License''': AGPLv3
| |
| * '''Target Platform''': Resonite (via ProtoFlux)
| |
| * '''File Extension''': <code>.pg</code>
| |
| * '''Compiler Tool''': <code>flux-sdk</code>
| |
| * '''Repository''': [https://git.samsmucny.com/ssmucny/Flux-SDK Flux SDK]
| |
| * '''VSCode Extension''': [https://marketplace.visualstudio.com/items?itemName=papaltine.protograph ProtoGraph]
| |
| * '''Nuget Tool''': [https://www.nuget.org/packages/Papaltine.FluxSDK/0.14.0-beta Papaltine.FluxSDK]
| |
| * '''Compiled Format''': <code>.brson</code> (Resonite Record)
| |
| * '''Influenced by''': F#, Elm, Python, Haskell, VHDL, Odin, Go
| |
| * '''Public Folder''': resrec:///U-1O4IcGhlKSm/R-131E69459864F98728F5423884957F2E677BFC75894306493CCADBDAF7E7F154
| |
| * '''Showcase World''': https://go.resonite.com/world/U-1O4IcGhlKSm/R-2045c574-dda6-4a7e-9955-56d2ca002d78
| |
| * [https://flux-sdk.samsmucny.com/ Documentation]
| |
| | |
| == Who should consider ProtoGraph? ==
| |
| * Creators who want to move beyond visual scripting
| |
| * Developers building modular, reusable systems
| |
| * Teams collaborating on large-scale projects
| |
| | |
| === Benefits ===
| |
| * '''Readable''': Clean and concise syntax that mirrors ProtoFlux 1 to 1
| |
| * '''Modular''': Reusable and easy to refactor code using modules (nested nodes)
| |
| * '''Version''': Use industry standard tools to store, diff, share, and version control source code
| |
| * '''Reliable''': Compiler checks help catch errors early and even builds incomplete programs
| |
| * '''Accessible''': Friendly to those familiar with ProtoFlux even as a first programming language
| |
| * '''Compatible''': It's still just ProtoFlux under the hood and works with the rest of Resonite: no mods or plugins
| |
| | |
| == When is ProtoGraph not a good choice? ==
| |
| | |
| * '''Prototyping''': For small tests and one-off examples, ProtoFlux is faster and easier to setup.
| |
| * '''High Performance''': Wait for WASM integration. ProtoGraph is only as fast as the ProtoFlux VM.
| |
| * '''Visual-only Creators''': ProtoGraph is a text version of ProtoFlux. It requires typing.
| |
| | |
| == Building and Using in Resonite ==
| |
| | |
| [https://flux-sdk.samsmucny.com/ProtoGraph/Getting-Started.html Getting Started]
| |
| | |
| # Write your <code>.pg</code> file
| |
| # Compile it:
| |
| <syntaxhighlight lang="bash">
| |
| flux-sdk build MyModule.pg
| |
| </syntaxhighlight>
| |
| # Import the <code>.brson</code> file into Resonite
| |
| # Inspect the generated ProtoFlux under the corresponding slot
| |
| | |
| === Flux UI ===
| |
| The [https://flux-sdk.samsmucny.com/UI/Flux-SDK-UI.html Flux UI] can be used in Resonite to link up the sources and drives from generated ProtoFlux.
| |
| | |
| == Examples ==
| |
| == Cross Product Module ==
| |
| This is a simple pure module that transforms input data into outputs.<syntaxhighlight lang="fsharp" line="1">
| |
| /// Multiplies two 3D vectors using a cross product
| |
| module CrossProduct
| |
| | |
| /// The first vector
| |
| in A: float3
| |
| /// The second vector
| |
| in B: float3
| |
| | |
| /// The result of (A X B)
| |
| out this: float3
| |
| | |
| where {
| |
| // Inputs
| |
| Ax, Ay, Az = A->Unpack_Float3;
| |
| Bx, By, Bz = B->Unpack_Float3;
| |
| | |
| // Computations
| |
| Cx = (Ay * Bz) - (Az * By);
| |
| Cy = (Az * Bx) - (Ax * Bz);
| |
| Cz = (Ax * By) - (Ay * Bx);
| |
| | |
| // Final result
| |
| Pack_Float3(Cx, Cy, Cz);
| |
| }
| |
| </syntaxhighlight>
| |
| | |
| == Counter Object ==
| |
| This shows how you can write an object that maintains internal state and exposes methods to be called.<syntaxhighlight lang="fsharp" line="1">
| |
| /// A simple object state machine that can count up and down
| |
| module Counter
| |
| | |
| /// The current value of the counter
| |
| out this: int
| |
| | |
| /// Public method to count up
| |
| out Increment: Impulse
| |
| /// Public method to count down
| |
| out Decrement: Impulse
| |
| /// Public method that sets counter to 0
| |
| out Reset: Impulse
| |
| | |
| where {
| |
| // Variables are not shared with other nodes, they are private
| |
| sync CounterVar: int;
| |
| | |
| // out impulses are methods on the object that send it messages
| |
| // to do different actions
| |
| Reset = CounterVar <- 0;
| |
| | |
| Increment = CounterVar <- ValueInc(CounterVar);
| |
| | |
| Decrement = CounterVar <- ValueDec(CounterVar);
| |
| | |
| // We can also expose normal data. This is like a getter.
| |
| CounterVar;
| |
| }
| |
| </syntaxhighlight>
| |
| | |
| == See Also ==
| |
| * [https://flux-sdk.samsmucny.com/ ProtoGraph Language Guide]
| |
| * [https://git.samsmucny.com/ssmucny/Flux-SDK Git Repository]
| |
| * [[ProtoFlux]]
| |
| * [https://www.youtube.com/watch?v=aPh4Z3SioB8 <nowiki>Dataflow Programming [Video]</nowiki>]
| |