mNo edit summary |
m Update links and commands |
||
(10 intermediate revisions by the same user not shown) | |||
Line 2: | Line 2: | ||
== Overview == | == Overview == | ||
* ''' | * '''Paradigm''': [[wikipedia:Dataflow_programming|Dataflow]] | ||
* '''Family''': ML: Caml: OCaml: F# | * '''Family''': ML: Caml: OCaml: F# | ||
* ''' | * '''Designers''': [[User:Papaltine|Papaltine]], [[User:Kittysquirrel|Kittysquirrel]] | ||
* '''Developer''': [[User:Papaltine|Papaltine]] | * '''Developer''': [[User:Papaltine|Papaltine]] | ||
* '''Stable Release''': N/A (Currently in | * '''Stable Release''': N/A (Currently in Beta) | ||
* '''License''': AGPLv3 | * '''License''': AGPLv3 | ||
* '''Target Platform''': Resonite (via ProtoFlux) | * '''Target Platform''': Resonite (via ProtoFlux) | ||
Line 12: | Line 12: | ||
* '''Compiler Tool''': <code>flux-sdk</code> | * '''Compiler Tool''': <code>flux-sdk</code> | ||
* '''Repository''': [https://git.samsmucny.com/ssmucny/Flux-SDK Flux SDK] | * '''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) | * '''Compiled Format''': <code>.brson</code> (Resonite Record) | ||
* '''Influenced by''': F#, Elm, Python, Haskell, Odin | * '''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? == | == Who Should Use ProtoGraph? == | ||
Line 21: | Line 23: | ||
== Benefits == | == Benefits == | ||
* '''Readable''': Clean syntax that mirrors ProtoFlux | * '''Readable''': Clean syntax that mirrors ProtoFlux | ||
* '''Modular''': Encourages reusable code | * '''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 | * '''Accessible''': Friendly to those familiar with ProtoFlux as a first programming language | ||
== Building and Using in Resonite == | == Building and Using in Resonite == | ||
[https:// | [https://flux-sdk.samsmucny.com/ProtoGraph/Getting-Started.html Getting Started] | ||
# Write your <code>.pg</code> file | # Write your <code>.pg</code> file | ||
Line 38: | Line 40: | ||
# Inspect the generated ProtoFlux under the corresponding slot | # Inspect the generated ProtoFlux under the corresponding slot | ||
== | == Examples == | ||
<syntaxhighlight lang="fsharp"> | == Cross Product Module == | ||
This is a simple pure module that transforms input data into outputs.<syntaxhighlight lang="fsharp" line="1"> | |||
module CrossProduct | module CrossProduct | ||
in A: float3 | |||
in B: float3 | |||
out this: float3 | |||
where { | 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> | </syntaxhighlight> | ||
== See Also == | == See Also == | ||
* [https:// | * [https://flux-sdk.samsmucny.com/ ProtoGraph Language Guide] | ||
* [https://git.samsmucny.com/ssmucny/Flux-SDK Git Repository] | * [https://git.samsmucny.com/ssmucny/Flux-SDK Git Repository] | ||
* [[ProtoFlux]] | * [[ProtoFlux]] | ||
* [https://www.youtube.com/watch?v=aPh4Z3SioB8 <nowiki>Dataflow Programming [Video]</nowiki>] |
Latest revision as of 03:09, 19 August 2025
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.
Overview
- Paradigm: Dataflow
- Family: ML: Caml: OCaml: F#
- Designers: Papaltine, Kittysquirrel
- Developer: Papaltine
- Stable Release: N/A (Currently in Beta)
- License: AGPLv3
- Target Platform: Resonite (via ProtoFlux)
- File Extension:
.pg
- Compiler Tool:
flux-sdk
- Repository: Flux SDK
- Nuget: Papaltine.FluxSDK
- Compiled Format:
.brson
(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
- Write your
.pg
file - Compile it:
flux-sdk build MyModule.pg
- Import the
.brson
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.
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);
}
Counter Object
This shows how you can write an object that maintains internal state and exposes methods to be called.
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;
}