renzora
Game Engine

Blueprint Node API

Every built-in blueprint node, its node_type string, and its pins — generated from the ALL_NODES registry in renzora_blueprint.

This is the per-node reference for Visual Blueprints. For the data model (pins, wires, the .blueprint file format) start there; to register node types of your own see Custom Blueprint Nodes.

How to read these tables

Node-type strings are namespaced category/name (for example transform/set_position). Every node also has a friendly display name shown in the editor palette.

Pins are either execution pins (the white flow wires, PinType::Exec) or data pins (typed values). To keep the tables readable:

  • Action nodes (the ones that change the world) follow a standard convention: one exec input and one then exec output. Those two are not repeated in every row — only data pins are listed, plus any non-standard exec pins (called out in the Notes column, e.g. Branch's true/false).
  • Pure data nodes (Math, getters, queries) have no exec pins at all — they only run when a downstream node pulls their output.
  • Event nodes have an exec output and no exec input; they are the graph's entry points.

Inline defaults are shown as = value. Data pins use this PinType set:

Pin typeMeaning
ExecExecution flow (not a value)
Float32-bit float
Int32-bit signed integer
Booltrue / false
StringUTF-8 text
Vec22-component vector
Vec33-component vector
ColorRGBA (4 floats)
Entityentity reference (resolved by name at runtime)
Anywildcard — accepts any non-exec type

Event

Entry points. Each has an exec output and no exec input; the interpreter starts a flow from it when its trigger fires.

Nodenode_typeData outputsFires when
On Readyevent/on_readyThe entity is first initialized (once per play session; re-fires when play mode restarts)
On Updateevent/on_updatedelta Float, elapsed FloatEvery frame
On Collision Enterevent/on_collision_enterother EntityThis entity starts colliding with another
On Collision Exitevent/on_collision_exitother EntityA collision ends
On Timerevent/on_timer— (input timer_name String = "my_timer")A named timer (from flow/start_timer) completes
On Messageevent/on_message— (input message String = "my_message")A named message arrives (from flow/send_message; fires the frame after the send)
Custom Eventevent/custom— (input name String = "my_event")Invoked by a flow/call_event node naming it (a reusable subgraph; never auto-fires)

Three more entry-style nodes live in other categories (they also have an exec output and no exec input): animation/on_finished, network/on_message, and lifecycle/on_scene_loaded.

Runtime status. The live interpreter (interpreter::run_blueprints) dispatches On Ready, On Update, On Timer, On Message, On Collision Enter/Exit, On Animation Finished, and On Scene Loaded. Collision events are sourced from CollisionReadState (populated by renzora_physics from Avian contact pairs) and surface a single other per frame. Custom Event only runs via flow/call_event. network/on_message is still palette-only.

Flow

Nodenode_typeData inputsNotes
Branchflow/branchcondition Bool = trueExec out is true / false (not then) — if/else routing
Sequenceflow/sequenceExec outs then_0, then_1, then_2 run in order
Do Onceflow/do_onceExtra exec input reset; exec out is completed. Passes once until reset
Flip Flopflow/flip_flopExec outs a / b alternate; data out is_a Bool
Gateflow/gatestart_open Bool = trueExtra exec inputs open / close / toggle; exec out is exit
Delayflow/delayduration Float = 1.0Exec out is completed
Counterflow/counterstep Float = 1.0, min Float = 0.0, max Float = 1.0, loop Bool = trueData out value Float; increments each run, wraps when loop
Start Timerflow/start_timername String = "my_timer", duration Float = 1.0, repeat Bool = falseStandard execthen; completion surfaces on event/on_timer
For Loopflow/for_loopfirst_index Int = 0, last_index Int = 4Exec out loop_body runs once per index (data out index Int), then completed. Capped at 100k iterations/run
While Loopflow/while_loopcondition Bool = falseExec out loop_body repeats while condition (re-evaluated each pass), then completed. Capped at 100k/run
Switch (Int)flow/switch_intvalue Int = 0Exec outs case_0case_3, else default
Switch (String)flow/switch_stringvalue + case_0case_3 StringExec outs match_0match_3 (first match), else default
Call Eventflow/call_eventevent String = "my_event"Runs the matching event/custom subgraph (recursion-guarded), then then
Send Messageflow/send_messagemessage String = "my_message"Broadcasts to event/on_message; delivered next frame

Loops run within a single frame (loop_body fires N times before completed), unlike flow/counter which advances one step per run. Both loops clear the per-tick data cache each pass so the body sees fresh variable reads. They're capped at 100,000 iterations per execution as a hang guard.

Math

All Math nodes are pure data (no exec pins).

Nodenode_typeInputsOutputs
Addmath/adda Float = 0, b Float = 0result Float
Subtractmath/subtracta Float = 0, b Float = 0result Float
Multiplymath/multiplya Float = 1, b Float = 1result Float
Dividemath/dividea Float = 1, b Float = 1result Float (returns 0 if b == 0)
Negatemath/negatevalue Floatresult Float
Absmath/absvalue Floatresult Float
Clampmath/clampvalue Float = 0.5, min Float = 0, max Float = 1result Float
Lerpmath/lerpa Float = 0, b Float = 1, t Float = 0.5result Float
Random Rangemath/random_rangemin Float = 0, max Float = 1result Float
Sinmath/sinvalue Floatresult Float
Cosmath/cosvalue Floatresult Float
Comparemath/comparea Float = 0, b Float = 0greater Bool (A > B), less Bool (A < B), equal Bool (A == B)
ANDmath/anda Bool, b Boolresult Bool
ORmath/ora Bool, b Boolresult Bool
NOTmath/notvalue Boolresult Bool
Combine Vec3math/combine_vec3x Float, y Float, z Floatresult Vec3
Split Vec3math/split_vec3vector Vec3x Float, y Float, z Float
Minmath/mina Float, b Floatresult Float
Maxmath/maxa Float, b Floatresult Float
Floormath/floorvalue Floatresult Float
Ceilmath/ceilvalue Floatresult Float
Roundmath/roundvalue Floatresult Float
Modulomath/moduloa Float = 0, b Float = 1result Float
Distancemath/distancea Vec3, b Vec3distance Float
Dot Productmath/dota Vec3, b Vec3result Float
Cross Productmath/crossa Vec3, b Vec3result Vec3
Normalizemath/normalizevalue Vec3result Vec3
Tanmath/tanvalue Floatresult Float
Asinmath/asinvalue Floatresult Float (radians)
Acosmath/acosvalue Floatresult Float (radians)
Atanmath/atanvalue Floatresult Float (radians)
Atan2math/atan2y Float = 0, x Float = 1result Float (radians) — heading of direction (x, y)
Sqrtmath/sqrtvalue Float = 1result Float (0 for negative input)
Powermath/powbase Float = 2, exponent Float = 2result Float
Squaremath/squarevalue Floatresult Float
Expmath/expvalue Floatresult Float (e^value)
Lnmath/lnvalue Float = 1result Float
Log10math/log10value Float = 1result Float
Signmath/signvalue Floatresult Float (-1 / 0 / +1)
Fractmath/fractvalue Floatresult Float
Truncatemath/truncvalue Floatresult Float
Deg → Radmath/deg2raddegrees Floatradians Float
Rad → Degmath/rad2degradians Floatdegrees Float
Pimath/pivalue Float (3.14159…)
Taumath/tauvalue Float (2π)
Selectmath/selectcondition Bool = true, a Any, b Anyresult Any (data-side ternary)
Stepmath/stepedge Float = 0.5, value Floatresult Float (0 or 1)
Smoothstepmath/smoothstepedge0 Float = 0, edge1 Float = 1, value Float = 0.5result Float
Saturatemath/saturatevalue Floatresult Float (clamped 0..1)
Move Towardmath/move_towardcurrent Float, target Float, max_delta Float = 1result Float (no overshoot)
Wrap Anglemath/wrap_angledegrees Floatresult Float (wrapped to [-180, 180])
Map Rangemath/map_rangevalue, in_min = 0, in_max = 1, out_min = 0, out_max = 1 (all Float)result Float
Inverse Lerpmath/inverse_lerpa Float = 0, b Float = 1, value Float = 0.5result Float (0..1 fraction)

Vector

Pure data nodes for Vec2/Vec3 construction and arithmetic. (combine_vec3/split_vec3, distance, dot, cross, normalize live under Math.)

Nodenode_typeInputsOutputs
Make Vec2vector/make_vec2x Float, y Floatresult Vec2
Break Vec2vector/break_vec2vector Vec2x Float, y Float
Vec2 Lengthvector/vec2_lengthvector Vec2length Float, length_sq Float
Vec2 Scalevector/vec2_scalevector Vec2, scalar Float = 1result Vec2
Vec2 Addvector/vec2_adda Vec2, b Vec2result Vec2
Vec2 Normalizevector/vec2_normalizevector Vec2result Vec2
Vec2 Dotvector/vec2_dota Vec2, b Vec2result Float
Vec3 Addvector/vec3_adda Vec3, b Vec3result Vec3
Vec3 Subtractvector/vec3_suba Vec3, b Vec3result Vec3
Vec3 Scalevector/vec3_scalevector Vec3, scalar Float = 1result Vec3
Vec3 Lengthvector/vec3_lengthvector Vec3length Float, length_sq Float
Vec3 Lerpvector/vec3_lerpa Vec3, b Vec3, t Float = 0.5result Vec3

String

Pure data nodes for text.

Nodenode_typeInputsOutputs
Concatstring/concata String, b Stringresult String
Formatstring/formattemplate String = "Value: {0}", value Anyresult String (replaces {0})
String to Floatstring/to_floatvalue String = "0"result Float
String to Intstring/to_intvalue String = "0"result Int
String Equalsstring/equalsa String, b Stringequal Bool
String Not Equalsstring/not_equalsa String, b Stringnot_equal Bool

Convert

Pure data type conversions.

Nodenode_typeInputsOutputs
To Stringconvert/to_stringvalue Anyresult String
To Floatconvert/to_floatvalue Anyresult Float
To Intconvert/to_intvalue Anyresult Int
To Boolconvert/to_boolvalue Anyresult Bool

Transform

Operates on this entity's transform. Getters are pure data; setters use the standard execthen flow.

Nodenode_typeInputsOutputs
Get Positiontransform/get_positionposition Vec3, x Float, y Float, z Float
Set Positiontransform/set_positionposition Vec3
Translatetransform/translateoffset Vec3— (moves by offset)
Get Rotationtransform/get_rotationrotation Vec3 (euler degrees), x, y, z Float
Set Rotationtransform/set_rotationrotation Vec3 (euler degrees)
Rotatetransform/rotatedegrees Vec3— (rotates by degrees)
Look Attransform/look_attarget Vec3— (faces the target position)
Set Scaletransform/set_scalescale Vec3 = (1, 1, 1)
Set Scale Uniformtransform/set_scale_uniformscale Float = 1.0
Get Forwardtransform/get_forwardforward Vec3, right Vec3, up Vec3

Input

All Input nodes are pure data — sample them from a flow driven by event/on_update.

Nodenode_typeInputsOutputs
Get Movementinput/get_movementmovement Vec2 (normalized WASD/arrows), x Float, y Float
Is Key Pressedinput/is_key_pressedkey String = "Space"pressed Bool (held down)
Is Key Just Pressedinput/is_key_just_pressedkey String = "Space"pressed Bool (this frame only)
Get Mouse Positioninput/get_mouse_positionposition Vec2, delta Vec2
Is Mouse Pressedinput/is_mouse_pressedbutton Int = 0 (0=left, 1=right, 2=middle)pressed Bool
Get Gamepadinput/get_gamepadindex Int = 0 (pad slot id, 0 = first pad)left_stick Vec2, right_stick Vec2, left_trigger Float, right_trigger Float, connected Bool
Is Gamepad Button Pressedinput/is_gamepad_buttonindex Int = 0, button String = "south" (south/east/west/north, l1/r1/l2/r2, select/start, l3/r3, dpad_up/down/left/right)pressed Bool, just_pressed Bool
Get Gamepad Countinput/get_gamepad_countcount Int
Is Action Pressedinput/is_action_pressedaction String = "jump"pressed Bool
Is Action Just Pressedinput/is_action_just_pressedaction String = "jump"pressed Bool
Get Action Axisinput/get_action_axisaction String = "move"value Float (-1 to 1)
Get Action Axis 2Dinput/get_action_axis2daction String = "move"value Vec2, x Float, y Float
Is Mouse Just Pressedinput/is_mouse_just_pressedbutton Int = 0 (0=left, 1=right, 2=middle)pressed Bool (this frame only)
Is Key Just Releasedinput/is_key_just_releasedkey String = "Space"released Bool (this frame only)
Lock Cursorinput/lock_cursorExec node (execthen): lock + hide the OS cursor
Unlock Cursorinput/unlock_cursorExec node (execthen): release + show the OS cursor

Most Input nodes are pure data; Lock/Unlock Cursor are exec actions (handled by a renzora_scripting observer).

Entity

Nodenode_typeInputsOutputs
Get Selfentity/get_selfentity Entity (this entity), name String
Get Entityentity/get_entityname Stringentity Entity, found Bool
Spawn Entityentity/spawnname String = "New Entity"entity Entity — standard execthen
Despawn Entityentity/despawnentity Entity— standard execthen
Despawn Selfentity/despawn_selfexec input only (destroys this entity)

Component

Reflection-based access to any registered component. The default component/field pins target Transform.translation.

Nodenode_typeInputsOutputs
Get Component Fieldcomponent/get_fieldentity Entity, component String = "Transform", field String = "translation"value Any
Set Component Fieldcomponent/set_fieldentity Entity, component String = "Transform", field String = "translation", value Any— standard execthen

Physics

Acts on this entity's rigidbody. Getters/queries are pure data; the rest use execthen.

Nodenode_typeInputsOutputs
Apply Forcephysics/apply_forceforce Vec3— (continuous force)
Apply Impulsephysics/apply_impulseimpulse Vec3 = (0, 10, 0)— (instant impulse)
Set Velocityphysics/set_velocityvelocity Vec3— (sets linear velocity)
Kinematic Slidephysics/kinematic_slidedelta Vec3— (collide-and-slide move)
Raycastphysics/raycastorigin Vec3, direction Vec3 = (0, -1, 0), max_distance Float = 100point Vec3, normal Vec3, entity Entity, distance Float. Exec outs are hit / miss (not then)
Is Groundedphysics/is_groundedgrounded Bool
Get Velocityphysics/get_velocityvelocity Vec3, speed Float

Audio

All Audio nodes use execthen.

Nodenode_typeInputs
Play Soundaudio/play_soundpath String = "sounds/click.ogg", volume Float = 1.0, looping Bool = false
Play Musicaudio/play_musicpath String = "music/theme.ogg", volume Float = 0.8, fade_in Float = 1.0
Stop Musicaudio/stop_musicfade_out Float = 1.0

Audio is native-only (Kira). On the WASM/web export these nodes are no-ops.

UI

Drive game UI widgets by name. All use execthen.

Nodenode_typeInputs
Show UIui/showpath String = "ui/main_menu.ui"
Hide UIui/hidepath String = "ui/main_menu.ui"
Toggle UIui/togglename String (canvas name)
Set UI Textui/set_textelement String, text String
Set UI Progressui/set_progresselement String, value Float = 1.0 (0–1)
Set UI Healthui/set_healthelement String, current Float = 75, max Float = 100
Set UI Sliderui/set_sliderelement String, value Float = 0.5
Set UI Checkboxui/set_checkboxelement String, checked Bool = true
Set UI Toggleui/set_toggleelement String, on Bool = true
Set UI Visibleui/set_visibleelement String (empty = self), visible Bool = true
Set UI Themeui/set_themetheme String = "dark"
Set UI Colorui/set_colorelement String, color Color = (1, 1, 1, 1)

Scene

Nodenode_typeInputs
Load Scenescene/loadpath String = "scenes/main.ron" — standard execthen

Variable

Per-instance graph variables, stored in the interpreter's runtime state and reset when play mode restarts.

Nodenode_typeInputsOutputs
Get Variablevariable/getname String = "my_var"value Any
Set Variablevariable/setname String = "my_var", value Any— standard execthen

Rendering

Nodenode_typeInputs
Set Visibilityrendering/set_visibilityvisible Bool = true
Set Material Colorrendering/set_material_colorcolor Color = (1, 1, 1, 1) (base color of this entity's material)

Both use execthen. Material colour lives here, not in a separate "Material" category — there is no Set Emissive, Set Material Property, or Swap Material node.

Animation

Acts on this entity's animator. Setters use execthen; reads are pure data; animation/on_finished is an entry node.

Nodenode_typeInputsOutputs
Play Animationanimation/playname String, looping Bool = true, speed Float = 1.0
Stop Animationanimation/stop
Pause Animationanimation/pause
Resume Animationanimation/resume
Set Animation Speedanimation/set_speedspeed Float = 1.0
Crossfade Animationanimation/crossfadename String, duration Float = 0.3, looping Bool = true
Set Anim Paramanimation/set_paramname String (param), value Float = 0.0— (state-machine float param)
Set Anim Boolanimation/set_bool_paramname String (param), value Bool = false— (state-machine bool param)
Trigger Animanimation/triggername String (trigger)— (one-shot state-machine trigger)
Set Layer Weightanimation/set_layer_weightlayer String, weight Float = 1.0
Tween Positionanimation/tween_positiontarget Vec3, duration Float = 1.0, easing String = "ease_in_out"
Get Animation Timeanimation/get_timetime Float (pure data)
Get Animation Lengthanimation/get_lengthname Stringlength Float (seconds, 0 if not loaded; pure data)
Get Anim Paramanimation/get_paramname Stringvalue Float (pure data)
Get Anim Boolanimation/get_boolname Stringvalue Bool (pure data)
Is Animation Playinganimation/is_playingplaying Bool (pure data)
On Animation Finishedanimation/on_finishedEvent node: exec output + name String (clip name). Fires when a non-looping clip finishes

Network

Nodenode_typeInputsOutputs
Is Servernetwork/is_servervalue Bool (pure data)
Is Connectednetwork/is_connectedvalue Bool (pure data)
Send Messagenetwork/send_messagechannel String = "default", data String— standard execthen
Net Spawnnetwork/spawnname String, position Vec3— standard execthen
On Messagenetwork/on_messagechannel String = "default"Event node: exec output + data String + sender Int (sender ID)

Network nodes are minimal today. The blueprint interpreter does not read the networking crate, so Is Server / Is Connected evaluate to false, and Send Message / Net Spawn map onto the same TODO/stub network actions as the scripting API. Treat the Network category as forward-looking. See Multiplayer for the real status.

Lifecycle

Nodenode_typeInputsOutputs
On Scene Loadedlifecycle/on_scene_loadedEvent node: exec output + scene String (loaded scene path)
Global Getlifecycle/global_getkey Stringvalue String (reads the cross-system global store)
Global Setlifecycle/global_setkey String, value String— standard execthen

global_get / global_set share the same global store as the scripting global_get / global_set actions, so blueprints and Lua/Rhai scripts can exchange values.

Navigation

Drives this entity's NavAgent (requires the navmesh subsystem). Queries are pure data.

Nodenode_typeInputsOutputs
Set Destinationnavigation/set_destinationtarget Vec3— standard execthen
Clear Destinationnavigation/clear_destination— standard execthen (stops the agent)
Has Pathnavigation/has_pathhas_path Bool
Has Targetnavigation/has_targethas_target Bool
Is At Destinationnavigation/is_at_destinationarrived Bool
Distance To Destinationnavigation/distance_to_destinationdistance Float (planar XZ)

Action

The generic escape hatch — fire any named ScriptAction (the same mechanism as scripting's action() / action_on()). This reaches any capability that's implemented as a ScriptAction observer (markup UI hui_spawn/hui_despawn, domain actions, custom plugin actions) without a dedicated node. Args are passed as up to four key/value pairs; empty keys are skipped.

Nodenode_typeInputsNotes
Call Actionaction/callname String, key0..3 String, value0..3 AnyFires on self; execthen
Call Action Onaction/call_onentity Entity, name String, key0..2 String, value0..2 AnyFires targeting a named entity

Call Action reaches capabilities handled via ScriptAction observers. Core engine ops routed through ScriptCommand (e.g. screen_shake, set_fog, spawn_primitive) are not reachable this way yet — they need a per-op blueprint node + bridge (like lock_cursor/despawn).

Debug

Nodenode_typeInputs
Logdebug/logmessage String = "Hello!" (prints to the console)
Draw Linedebug/draw_linestart Vec3, end Vec3, color Color = (1, 0, 0, 1), duration Float = 0.0

Both use execthen.

Looking up nodes in code

The registry is a flat slice you can iterate from Rust:

use renzora_blueprint::{ALL_NODES, categories, node_def, nodes_in_category};

// Every node definition.
for def in ALL_NODES {
    println!("{} ({})", def.display_name, def.node_type);
}

// Categories in editor display order.
let cats: Vec<&str> = categories();

// Nodes in one category, or a single definition by type.
let physics = nodes_in_category("Physics");
let set_pos = node_def("transform/set_position").unwrap();

Each entry is a BlueprintNodeDef { node_type, display_name, category, description, pins, color }, where pins is a function returning the node's PinTemplates. This is the same data the editor palette and the interpreter dispatch on, so adding a node in one place keeps both in sync — see Custom Blueprint Nodes.

See also