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 completes
On Messageevent/on_message— (input message String = "my_message")A named message arrives (UI, scripts, or other blueprints)

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) currently dispatches On Ready and On Update. The collision, timer, message, network-message, on-scene-loaded, and on-animation-finished entry nodes exist in the palette and serialize into the file format, but their firing is still being wired into the interpreter (// TODO: on_collision, on_timer, on_message) — don't rely on them triggering in a shipped game yet.

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

There is no For Loop, While Loop, or Switch node. Iterate with flow/counter plus event re-entry; select with flow/branch.

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

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

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)
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

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)

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