Toggle menu
Toggle preferences menu
Toggle personal menu
Not logged in
Your IP address will be publicly visible if you make any edits.

Papaltine/ProtoGraph: Difference between revisions

From Resonite Wiki
Papaltine (talk | contribs)
Papaltine (talk | contribs)
mNo edit summary
 
(One intermediate revision 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''': 1.1.2
* '''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>
 
== Bouncing Ball ==
A physics simulation of a ball in projectile motion that looses energy with each bounce on the ground.
 
* [https://git.samsmucny.com/ssmucny/BouncingBallTutorial/src/branch/main Source Code]
* [https://youtu.be/p2VCTcyVurk Video]
 
== 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>]
{{DEFAULTSORT:ProtoGraph}}
[[Category:Community tools]]

Latest revision as of 16:53, 5 February 2026