|
|
| (16 intermediate revisions by the same user not shown) |
| Line 1: |
Line 1: |
| '''ProtoGraph''' is a 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]]
| |
| * '''Developer''': [[User:Papaltine|Papaltine]]
| |
| * '''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]
| |
| * '''Nuget''': [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
| |
| * '''Showcase World''': https://go.resonite.com/world/U-1O4IcGhlKSm/R-2045c574-dda6-4a7e-9955-56d2ca002d78
| |
| | |
| == Who Should Use ProtoGraph? ==
| |
| * Creators who want to move beyond visual scripting
| |
| * Developers building modular, reusable systems
| |
| * Teams collaborating on large-scale Resonite projects
| |
| | |
| == Benefits ==
| |
| * '''Readable''': Clean syntax that mirrors ProtoFlux
| |
| * '''Modular''': Encourages reusable and easy to refactor code
| |
| * '''Reliable''': Compiler checks help catch errors early
| |
| * '''Accessible''': Friendly to those familiar with ProtoFlux as a first programming language
| |
| | |
| == 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
| |
| | |
| == Examples ==
| |
| == Cross Product Module ==
| |
| This is a simple pure module that transforms input data into outputs.<syntaxhighlight lang="fsharp" line="1">
| |
| module CrossProduct
| |
| | |
| in A: float3
| |
| in B: float3
| |
| | |
| out this: float3
| |
| | |
| where {
| |
| // Inputs
| |
| Ax, Ay, Az = Unpack_Float3(A);
| |
| Bx, By, Bz = Unpack_Float3(B);
| |
| | |
| // 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">
| |
| module Counter
| |
| | |
| out this: int // The current value of the counter
| |
| | |
| // Public methods
| |
| out Increment: Impulse
| |
| out Decrement: Impulse
| |
| 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>]
| |