Render comparison
3D
3D generic
Animation
Audio
CSG
Cameras
Collision shapes
Environment
Import / editor internals
Lighting
Markers & helpers
Meshes & rendering
Navigation
Particles
Paths & curves
Physics — areas
Physics — bodies
Physics — joints
Physics — queries
Physics — vehicles
Reflection & global illumination
Skeleton, bones & IK
Tilemaps & grids
Transform helpers
Viewports
Visibility
XR / AR
2D
2D generic
2D rendering
Audio
Cameras
Canvas effects
Canvas layers
Collision shapes
Lighting
Markers & helpers
Navigation
Parallax & scrolling
Particles
Paths & curves
Physics — areas
Physics — bodies
Physics — joints
Physics — queries
Skeleton, bones & IK
Tilemaps & grids
Touch input
Transform helpers
UI — containers
UI — controls
Visibility
Resources
Complex Scenes
Other
Audio
Generic
Networking
OS integration
Reading these sheets
Rendering globals
Resources
Timers & logic
UI — windows

Reading these sheets

Each sheet shows how this previewer renders one Godot node type against real Godot 4.6.3, from the same camera. Images are regenerated by scripts/compare-docs/capture.mjs. The gallery is index.html, which pnpm docs:gallery rebuilds and pnpm docs:gallery --check holds to the sheets in validate and CI.

Each sheet lives beside the code it documents, as <slice>/comparison.md.

How to read a sheet's Linting chapter

Every sheet carries a generated ## Linting block (pnpm docs:lint-sections, verified in CI). It lists the validators and rules that reach that node type. Hand-written prose below it says what the lenient parser does instead. The four facts below are true of every node, so this file states them once.

The two parsers disagree on purpose. TscnParser renders what it can. StrictTscnParser reports everything. Where strict rejects a value, lenient substitutes a documented default and continues. Each sheet's prose describes that substitution.

The lenient parser swallows five structural errors silently, with no warning and no node dropped from the render: INVALID_HEADING_FORMAT, INVALID_PROPERTY_FORMAT, MISSING_NODE_NAME, MISSING_NODE_IDENTIFIER and INSTANCE_PLACEHOLDER_ROOT.

Two classes of property are never format-checked, even by strict. StrictTscnParser.onProperty skips validation for multiline values (shader source, long label text) and for any property whose owning type is unknown. A property override on an instanced child (instance=) is therefore never validated. Existence checks stay silent across an instance boundary on purpose.

Semantic rules run on every scene the strict parser could build. A format error does not withhold the tree, so a file reports its parse errors and the semantic findings under them together. A pre-current format header is the one exception. It reports a single legacy-format-version info and nothing else.

What a RemoteTransform relay does not reproduce

RemoteTransform2D and RemoteTransform3D share one implementation and one set of limitations, so this file records them once.

A relay copies its transform onto its remote_path target once on load: the static enter-tree effect, not a per-frame drive. Three cases are not fully reproduced:

  • use_global_coordinates = false is a no-op on a static load. Only the default global-coordinate drive repositions the target.
  • A cross-instance remote_path, one crossing into or out of an instanced sub-scene, stays unresolved. In-scene resolution, the common case, works.
  • Relay chains resolve in document (pre-order) order. A feedback loop is not iterated to a fixed point.

Why a 2D background reads 77 here and 76 in Godot

Both sides clear a 2D scene to default_clear_color, 0.3 grey. The Godot images read 76 there, and the previewer reads 77. The value is 76.5 in 8 bits, so the driver's rounding decides the byte. pnpm ref:godot renders on Vulkan through lavapipe, which gives 76, and --rendering-driver opengl3 gives 77. The previewer clears through WebGL, which gives 77. This 1/255 gap is not a parity defect.

AcceptDialog

renders as nothing yet, not implemented docs ↗ source ↗ unit-accept-dialog.tscn ↗ Not implemented
Comparison images not captured yet for AcceptDialog.

A base dialog with an OK button and a message, which ConfirmationDialog and FileDialog build on. The previewer parses and validates it but does not draw it. The base Node mounts under renderIntent: 'pending' as an empty group, and its children still show (ADR-0045).

Linting

Strict parsing format-checks these AcceptDialog properties, plus 45 inherited from Window, 47 inherited from Viewport, 10 inherited from Node. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

PropertyAcceptsOut of range
dialog_autowraptrue or false
dialog_close_on_escapetrue or false
dialog_hide_on_oktrue or false
dialog_textquoted string, or the &"…" StringName or NodePath("…") it converts
ok_button_textquoted string, or the &"…" StringName or NodePath("…") it converts
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-window-properties (type-family match)window-max-size-below-min-sizeinfo
window-size-clamped-by-limitswarning
window-content-scale-factor-flooredwarning

The lenient parser registers the plain Node reader, which reads only the heading attributes and an optional transform. A bad dialog_text is never read, substituted or reported on the lenient path.

Known limitations

  • Not drawn Godot displays the dialog once popped up, but the previewer draws nothing for it.

AimModifier3D

renders as nothing yet, Godot rotates a bone toward its target, the previewer does not docs ↗ source ↗ unit-aim-modifier-3d.tscn ↗ Not implemented
No visual output — this node draws nothing to compare.

Rotates a bone of its parent skeleton to point at a reference bone or node. It is a simplified LookAtModifier3D without angle limits or interpolation. Godot runs that drive each frame, and the previewer does not yet (ADR-0045). It mounts the Node3D base, so children still show and the bones hold their rest pose.

Linting

Strict parsing format-checks these AimModifier3D properties, plus 2 inherited from SkeletonModifier3D, 17 inherited from Node3D, 10 inherited from Node. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

PropertyAcceptsOut of range
setting_countinteger >= 0error below
settings/#/*setting
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-node3d-visibility (type-family match)valid-node3d-visibilityerror
valid-skeletonmodifier3d-parent (type-family match)skeletonmodifier3d-parent-not-skeleton3dwarning
valid-aimmodifier3d-rotation-axesaimmodifier3d-parallel-rotation-axeswarning

The lenient parser reuses parseNode3D, so every settings/<i>/ leaf is dropped rather than substituted. Strict warns on an out-of-range forward_axis or primary_rotation_axis rather than erroring, since Godot's setter assigns it unclamped.

AnimatableBody2D

renders as nothing (a transform-only group) docs ↗ source ↗ unit-animatable-body-2d.tscn ↗ Linter only
No visual output — this node draws nothing to compare.

A kinematic 2D body meant to be moved by code, an AnimationMixer or a RemoteTransform2D. It draws nothing at runtime, so the previewer renders it as a transform-only group (ADR-0008) and its children still show.

Linting

Strict parsing format-checks these AnimatableBody2D properties, plus 3 inherited from StaticBody2D, 5 inherited from CollisionObject2D, 12 inherited from Node2D, 16 inherited from CanvasItem, 10 inherited from Node. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

PropertyAcceptsOut of range
sync_to_physicstrue or false
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-canvasitem-clip-ancestry (type-family match)canvasitem-ancestor-clips-childrenwarning
canvasitem-ancestor-is-canvasgroupwarning
valid-collisionobject2d (type-family match)collisionobject2d-needs-collision-shapewarning

The lenient parser reuses parseNode2D, which reads only Node2D's own keys, so a malformed sync_to_physics = maybe is dropped rather than substituted.

AnimatableBody3D

renders as nothing (a transform-only group) docs ↗ source ↗ unit-animatable-body-3d.tscn ↗ Linter only
No visual output — this node draws nothing to compare.

A StaticBody3D meant to be moved by code, AnimationMixer or RemoteTransform3D rather than by physics. It draws nothing at runtime, so the previewer renders it as a transform-only group (ADR-0008).

Linting

Strict parsing format-checks these AnimatableBody3D properties, plus 3 inherited from StaticBody3D, 6 inherited from PhysicsBody3D, 6 inherited from CollisionObject3D, 17 inherited from Node3D, 10 inherited from Node. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

PropertyAcceptsOut of range
sync_to_physicstrue or false
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-node3d-visibility (type-family match)valid-node3d-visibilityerror
valid-collisionobject3d-scale (type-family match)collisionobject3d-non-uniform-scalewarning
valid-collisionobject3d (type-family match)collisionobject3d-needs-collision-shapewarning

AnimatableBody3D registers parseNode3D directly, which reads only transform and visible. A non-boolean sync_to_physics = "maybe" is dropped rather than substituted or warned on, and survives only on rawProperties.

AnimatedSprite2D

renders as a textured quad docs ↗ source ↗ unit-animatedsprite2d.tscn ↗ Limitation
Godot render of AnimatedSprite2D Our render of AnimatedSprite2D
Godot 4.6.3 Ours

AnimatedSprite2D plays a SpriteFrames clip. The previewer draws the current frame as a textured quad, and its transport plays the clip while the node is selected (ADR-0012).

Linting

Strict parsing format-checks these AnimatedSprite2D properties, plus 12 inherited from Node2D, 16 inherited from CanvasItem, 10 inherited from Node. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032). AnimatedSprite2D also REFUSES playing outright.

PropertyAcceptsOut of range
animationquoted string or &"name"
autoplayquoted string or &"name"
centeredtrue or false
flip_htrue or false
flip_vtrue or false
frameinteger >= 0error below
frame_progressfloat
offsetVector2(x, y), or the Vector2i spelling Godot converts
speed_scalefloat
sprite_framesnull, SubResource("id"), ExtResource("id") or Resource("path")
playingnot available on this type
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-canvasitem-clip-ancestry (type-family match)canvasitem-ancestor-clips-childrenwarning
canvasitem-ancestor-is-canvasgroupwarning
valid-animatedsprite2d-resourcesanimatedsprite2d-requires-spriteframeswarning
animatedsprite2d-animation-no-spriteframeserror
animatedsprite2d-frame-no-spriteframeserror

frame falls back to 0 on a non-numeric value, but a negative frame passes through with no warning. centered falls back to true, flip_h and flip_v to false and offset to (0, 0), each warning first when the value is malformed. speed_scale, frame_progress and autoplay are never read.

Known limitations

  • Needs runtime An autoplay clip does not run on its own, so the sprite shows its authored frame until it is selected and the transport plays it.
  • Approximated The scaled sprite's outline is a little sharper than Godot's, which shows a slightly darker fringe along the curved edge.

AnimatedSprite3D

renders as invisible transform-only fallback docs ↗ source ↗ unit-animated-sprite-3d.tscn ↗ Not implemented
Comparison images not captured yet for AnimatedSprite3D.

Plays a frame-by-frame animation from a SpriteFrames resource on a quad in 3D space, the animated twin of Sprite3D. The previewer does not draw a frame yet, so the node is an invisible transform-only fallback and its children still show.

Linting

Strict parsing format-checks these AnimatedSprite3D properties, plus 20 inherited from SpriteBase3D, 18 inherited from GeometryInstance3D, 1 inherited from VisualInstance3D, 17 inherited from Node3D, 10 inherited from Node. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032). AnimatedSprite3D also REFUSES playing outright.

PropertyAcceptsOut of range
animationquoted string or &"name"
autoplayquoted string or &"name"
frameinteger >= 0error below
frame_progressfloat
speed_scalefloat
sprite_framesnull, SubResource("id"), ExtResource("id") or Resource("path")
playingnot available on this type
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-node3d-visibility (type-family match)valid-node3d-visibilityerror
valid-geometryinstance3d-visibility-range (type-family match)geometryinstance3d-visibility-range-end-before-beginwarning
geometryinstance3d-visibility-range-begin-fade-without-marginwarning
geometryinstance3d-visibility-range-end-fade-without-marginwarning
valid-animatedsprite3d-propertiesanimatedsprite3d-requires-spriteframeswarning
animatedsprite3d-animation-no-spriteframeserror

The lenient parser reads the GeometryInstance3D base. It also reads what places the quad: pixel_size, axis, billboard, offset and centered. The scene cull measures the node by the quad of the frame that sprite_frames, animation and frame select. So its visibility range still decides its visibility dependants. autoplay, frame_progress and speed_scale are never read.

Known limitations

  • Not drawn Godot shows the current animation frame, but here the quad is absent.

AnimationPlayer

renders as no geometry of its own, a working driver of other nodes' properties docs ↗ source ↗ unit-animation-player.tscn ↗ Limitation
Godot render of AnimationPlayer Our render of AnimationPlayer
Godot 4.6.3 Ours

Godot's keyframe animation driver. It has no geometry of its own, but the previewer plays its clips through a THREE.AnimationMixer (ADR-0011). The animated pair above steps through one loop of the spin clip, and the box turns in both.

Linting

Strict parsing format-checks these AnimationPlayer properties, plus 13 inherited from AnimationMixer, 10 inherited from Node. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

PropertyAcceptsOut of range
autoplayquoted string or &"name"
blend_timesArray literal of (from, to, time) triples
current_animationany value (no format constraint)
method_call_modeenum 0-1 (DEFERRED/IMMEDIATE)warning
movie_quit_on_finishtrue or false
next/*quoted string or &"name"
playback/playany value (no format constraint)
playback_activetrue or false
playback_auto_capturetrue or false
playback_auto_capture_durationfloat
playback_auto_capture_ease_typeenum 0-3 (IN/OUT/IN_OUT/OUT_IN)warning
playback_auto_capture_transition_typeenum 0-11 (LINEAR/SINE/QUINT/QUART/QUAD/EXPO/ELASTIC/CUBIC/CIRC/BOUNCE/BACK/SPRING)warning
playback_default_blend_timefloat 0-4096warning
playback_process_modeenum 0-2 (PHYSICS/IDLE/MANUAL)warning
speed_scalefloat
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-animationplayer-propertiesanimationplayer-autoplay-missingwarning
animationplayer-current-animation-missingerror
animationplayer-inactiveinfo

speed_scale and playback_default_blend_time fall back to 1.0 and 0.0 only when the value fails to parse as a float. callback_mode_process and callback_mode_method re-check the enum through enumOr and fall back to IDLE (1) and DEFERRED (0). Each has a deprecated 3.x spelling that Godot forwards to the same setter, so the parser reads both spellings into one field. root_node defaults to NodePath("..") when absent.

Known limitations

  • Not drawn Only transform and value tracks play, so bezier, method, audio and nested animation tracks are parsed and ignored (ADR-0011).
  • Approximated Cubic interpolation plays as a smooth spline on transform tracks and as linear on modulate and size tracks (ADR-0017).
  • Approximated Per-key transition easing plays as linear, so an eased clip reaches the same poses on a different curve (ADR-0017).

AnimationTree

renders as no geometry of its own, a working blend-tree driver docs ↗ source ↗ unit-animationtree-blend.tscn ↗ Limitation
Godot render of AnimationTree Our render of AnimationTree
Godot 4.6.3 Ours

AnimationTree drives another node's clips through a blend tree and draws no geometry of its own. The previewer evaluates the tree while playing, so two clips from its AnimationPlayer are mixed and applied at once (ADR-0019). The stills show the rest pose only.

Linting

Strict parsing format-checks these AnimationTree properties, plus 13 inherited from AnimationMixer, 10 inherited from Node. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

PropertyAcceptsOut of range
advance_expression_base_nodeNodePath("path/to/node")
anim_playerNodePath("path/to/node")
parameters/*any Variant — the type comes from the live AnimationNode graph, not the .tscn
process_callbackenum 0-2 (PHYSICS/IDLE/MANUAL)warning
tree_rootnull, SubResource("id"), ExtResource("id") or Resource("path")
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-animationtree-propertiesanimationtree-missing-tree-rootwarning
animationtree-anim-player-not-foundwarning
animationtree-anim-player-wrong-typeinfo
animationtree-inactiveinfo

active, deterministic and reset_on_save fall back to true on an unparseable bool, and root_motion_local to false. The enums re-check membership through enumOr and fall back to IDLE (1), DEFERRED (0) and FORCE_CONTINUOUS (2). audio_max_polyphony falls back to 32 on a parse failure, but an out-of-range integer passes through unwarned. tree_root has no fallback: absent, it stays unset.

Known limitations

  • Approximated Blend weights are per clip, not per bone, so a filtered AnimationNodeBlend2 moves the whole skeleton.
  • Approximated AnimationNodeTransition always takes input 0.
  • Needs runtime A StateMachine root evaluates its saved current_state or its start state, with no travel or transition timing.

Area2D

renders as a transform-only Node2D group docs ↗ source ↗ unit-area2d.tscn ↗ Linter only
No visual output — this node draws nothing to compare.

A 2D physics region that detects overlaps. It has no runtime visual, so the previewer mounts it as a transform-only Node2D group (ADR-0008). Both captures are an empty grey frame.

Linting

Strict parsing format-checks these Area2D properties, plus 5 inherited from CollisionObject2D, 12 inherited from Node2D, 16 inherited from CanvasItem, 10 inherited from Node. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

PropertyAcceptsOut of range
angular_dampfloat >= 0warning below
angular_damp_space_overrideenum 0-4 (DISABLED/COMBINE/COMBINE_REPLACE/REPLACE/REPLACE_COMBINE)warning
audio_bus_namequoted string or &"name"
audio_bus_overridetrue or false
gravityfloat
gravity_directionVector2(x, y), or the Vector2i spelling Godot converts
gravity_pointtrue or false
gravity_point_centerVector2(x, y), or the Vector2i spelling Godot converts
gravity_point_unit_distancefloat >= 0warning below
gravity_space_overrideenum 0-4 (DISABLED/COMBINE/COMBINE_REPLACE/REPLACE/REPLACE_COMBINE)warning
linear_dampfloat >= 0warning below
linear_damp_space_overrideenum 0-4 (DISABLED/COMBINE/COMBINE_REPLACE/REPLACE/REPLACE_COMBINE)warning
monitorabletrue or false
monitoringtrue or false
priorityinteger
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-canvasitem-clip-ancestry (type-family match)canvasitem-ancestor-clips-childrenwarning
canvasitem-ancestor-is-canvasgroupwarning
valid-area2darea2d-detects-nothinginfo
area2d-monitoring-zero-maskinfo
valid-collisionobject2d (type-family match)collisionobject2d-needs-collision-shapewarning

The lenient parser reads only monitoring, monitorable, collision_layer and collision_mask through the parseOptional* readers, which omit an absent or unparseable value with no warning. Every other Area2D property is never read, since none touches a pixel.

Area3D

renders as an invisible transform-only group docs ↗ source ↗ edge-area3d-inactive.tscn ↗ Linter only
No visual output — this node draws nothing to compare.

A physics region for detecting overlaps, with no runtime visual of its own. The previewer mounts it as a transform-only Node3D group, so both images show only the preview environment's sky.

Linting

Strict parsing format-checks these Area3D properties, plus 6 inherited from CollisionObject3D, 17 inherited from Node3D, 10 inherited from Node. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

PropertyAcceptsOut of range
angular_dampfloat >= 0warning below
angular_damp_space_overrideenum 0-4 (DISABLED/COMBINE/COMBINE_REPLACE/REPLACE/REPLACE_COMBINE)warning
audio_bus_namequoted string or &"name"
audio_bus_overridetrue or false
gravityfloat
gravity_directionVector3(x, y, z), or the Vector3i spelling Godot converts
gravity_pointtrue or false
gravity_point_centerVector3(x, y, z), or the Vector3i spelling Godot converts
gravity_point_unit_distancefloat >= 0warning below
gravity_space_overrideenum 0-4 (DISABLED/COMBINE/COMBINE_REPLACE/REPLACE/REPLACE_COMBINE)warning
linear_dampfloat >= 0warning below
linear_damp_space_overrideenum 0-4 (DISABLED/COMBINE/COMBINE_REPLACE/REPLACE/REPLACE_COMBINE)warning
monitorabletrue or false
monitoringtrue or false
priorityinteger
reverb_bus_amountfloat 0-1warning
reverb_bus_enabledtrue or false
reverb_bus_namequoted string or &"name"
reverb_bus_uniformityfloat 0-1warning
wind_attenuation_factorfloat >= 0warning below
wind_force_magnitudefloat >= 0warning below
wind_source_pathNodePath("path/to/node")
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-node3d-visibility (type-family match)valid-node3d-visibilityerror
valid-collisionobject3d-scale (type-family match)collisionobject3d-non-uniform-scalewarning
valid-area3darea3d-detects-nothinginfo
area3d-monitoring-zero-maskinfo
valid-collisionobject3d (type-family match)collisionobject3d-needs-collision-shapewarning

Area3D reuses parseNode3D unmodified, so none of its own properties (monitoring, the gravity and damp settings, audio_bus_name, priority) is ever read. The transform-only render needs none of them.

AreaLight3D

renders as a THREE.RectAreaLight shaded as Godot 4.7.2's area light docs ↗ source ↗ Done

Godot's rectangular area lamp, which lights the side its local -Z faces. The previewer draws Godot 4.7.2's area light: light_energy spread over area_size, faded by area_range and area_attenuation, with light_specular on the highlight. area_texture colours the light. It shades each material in its diffuse_mode and specular_mode, and a clearcoat dims the light beneath it. With distance_fade_enabled, the light fades by Godot's smoothstep over the distance from the rendering camera. In volumetric fog, it scatters light_volumetric_fog_energy times its light into the medium, under its shadow. The reference images come from Godot 4.7.2, as Godot 4.6.3 emits no light from the node.

Energy over the rectangle

Done
Godot render of Energy over the rectangle Our render of Energy over the rectangle
Godot 4.6.3 Ours

A 1×1 panel and a 4×0.05 strip at the same energy, over matte plates. area_normalize_energy divides each light's colour by its area, so both plates receive the same total light.

Texture

Done
Godot render of Texture Our render of Texture
Godot 4.6.3 Ours

The 1×1 panel of the energy scene with a red-to-blue gradient as its area_texture. The plate below the panel turns purple: at that distance the light reads a blurred mip of the texture, which mixes the two colours. A surface closer to the panel reads a sharper mip and shows the red and the blue apart.

An AtlasTexture as the area_texture colours the light with its whole sheet, not its region, as Godot does. Godot reads the texture by its RID, which is the sheet's.

Shadow

Done
Godot render of Shadow Our render of Shadow
Godot 4.6.3 Ours

A 2×1 light over a box on the ground, with shadow_enabled on and area_range 6. The box casts a soft shadow on the ground that widens away from the box, at the default light_size of 0.5. shadow_opacity, shadow_bias, shadow_normal_bias, shadow_blur and the distance fade apply as in Godot.

Linting

Strict parsing format-checks these AreaLight3D properties, plus 27 inherited from Light3D, 1 inherited from VisualInstance3D, 17 inherited from Node3D, 10 inherited from Node. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

PropertyAcceptsOut of range
area_attenuationfloat
area_normalize_energytrue or false
area_rangefloat >= 0warning below
area_sizeVector2(x, y), each >= 0
area_texturenull, SubResource("id"), ExtResource("id") or Resource("path")
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-node3d-visibility (type-family match)valid-node3d-visibilityerror
valid-arealight3d-propertiesarealight3d-projector-unsupportedwarning
valid-light3d-scale (type-family match)light3d-non-unit-scalewarning

The linter warns (resource-type-excluded-by-hint) when area_texture or light_projector holds a class its hint excludes, such as an AtlasTexture. Godot's editor never offers such a class, and the setter keeps it with a debug warning (4.7.2 light_3d.cpp:698-716).

The lenient parser falls back silently when a key is absent. When a key is unparseable, it warns and falls back: area_range to 5.0, area_attenuation to 1.0, area_size to Vector2(1, 1), area_normalize_energy to true, light_size to 0.5.

ArrayMesh

renders as one merged THREE.BufferGeometry with a draw group per surface docs ↗ source ↗ Unreviewed
Comparison images not captured yet for ArrayMesh.

A baked mesh whose surfaces are base64 PackedByteArray blobs laid out by a format bitfield. The previewer decodes both the plain and the compressed layout and merges every triangle surface into one BufferGeometry with a draw group per surface. A surface's TEX_UV2 becomes the mesh's UV2, and a compressed UV2 re-expands by uv_scale's z and w as in Godot (rendering_server.cpp:1581-1582).

Linting

Strict parsing format-checks the inherited set (1 inherited from Mesh, 2 inherited from Resource); ArrayMesh declares none of its own. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo

The lenient parser never rejects a mesh property. An unreadable subdivide_width or uv2_padding falls back to Godot's default through the shared value decoders. A surface whose arrays are malformed is dropped with a warning, and the mesh's other surfaces still render.

Known limitations

  • Not drawn A POINTS, LINES or strip surface is skipped, since only triangle surfaces are decoded.
  • Approximated Blend shapes, LODs and skins are ignored, so a skinned mesh renders in its rest pose.
  • Approximated A compressed surface with a normal but no tangent is decoded by symmetry and is not measured against Godot.
  • Approximated A .tres whose every surface is undecodable is listed in the missing-resources panel even though the file is present.

AspectRatioContainer

renders as each child scaled and aligned to a fixed ratio docs ↗ source ↗ unit-aspect-ratio-container.tscn ↗ Unreviewed
Comparison images not captured yet for AspectRatioContainer.

AspectRatioContainer scales and aligns every child to a fixed width-to-height ratio, fitting, covering, or driving one axis from the other per stretch_mode. It draws nothing itself. A right-to-left layout_direction mirrors the horizontal alignment, so alignment_horizontal Begin puts the child against the right edge.

Linting

Strict parsing format-checks these AspectRatioContainer properties, plus 53 inherited from Control, 16 inherited from CanvasItem, 10 inherited from Node. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

PropertyAcceptsOut of range
alignment_horizontalenum 0-2 (ALIGNMENT_BEGIN/ALIGNMENT_CENTER/ALIGNMENT_END)warning
alignment_verticalenum 0-2 (ALIGNMENT_BEGIN/ALIGNMENT_CENTER/ALIGNMENT_END)warning
ratiofloat >= 0.001warning below
stretch_modeenum 0-3 (STRETCH_WIDTH_CONTROLS_HEIGHT/STRETCH_HEIGHT_CONTROLS_WIDTH/STRETCH_FIT/STRETCH_COVER)warning
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-canvasitem-clip-ancestry (type-family match)canvasitem-ancestor-clips-childrenwarning
canvasitem-ancestor-is-canvasgroupwarning
valid-control-properties (type-family match)control-tooltip-ignored-by-mouse-filterwarning
control-property-orderwarning
valid-aspectratiocontainer-childrenaspectratiocontainer-unsupported-texturerect-expand-modeinfo

parser.ts reads all four members straight through, unclamped: the same values linterParser.ts only warns about. The solver applies aspect_ratio_container.h's own defaults (ratio 1.0, stretch_mode FIT, both alignments CENTER) and, for an out-of-range stretch_mode, falls through to no scaling at all, matching the engine's own unmatched-switch behaviour. linter.ts's rule for a direct TextureRect child with a proportional expand_mode names a child the solver also skips from sorting, matching Godot's own sort pass.

AudioListener2D

renders as nothing (a transform-only group) docs ↗ source ↗ unit-audio-listener-2d.tscn ↗ Linter only
No visual output — this node draws nothing to compare.

AudioListener2D is the point 2D audio is panned from. It draws nothing at runtime, so the previewer renders it as a transform-only group (ADR-0008) and its children still show.

Linting

Strict parsing format-checks these AudioListener2D properties, plus 12 inherited from Node2D, 16 inherited from CanvasItem, 10 inherited from Node. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

PropertyAcceptsOut of range
currenttrue or false
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-canvasitem-clip-ancestry (type-family match)canvasitem-ancestor-clips-childrenwarning
canvasitem-ancestor-is-canvasgroupwarning

Strict checks current as a bool. The lenient parser reuses parseNode2D, which never reads current, and a malformed position warns and falls back to Vector2(0, 0).

AudioListener3D

renders as nothing (a transform-only group) docs ↗ source ↗ unit-audio-listener-3d.tscn ↗ Linter only
No visual output — this node draws nothing to compare.

Sets the point 3D audio is heard from. It draws nothing at runtime, so the previewer renders it as a transform-only group (ADR-0008) and its children still show.

Linting

Strict parsing format-checks these AudioListener3D properties, plus 17 inherited from Node3D, 10 inherited from Node. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

PropertyAcceptsOut of range
currenttrue or false
doppler_trackingenum 0-2 (DISABLED/IDLE_STEP/PHYSICS_STEP)warning
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-node3d-visibility (type-family match)valid-node3d-visibilityerror

The lenient parser never consults doppler_tracking, the node's only own property, since nothing reads it for drawing. An out-of-range or non-numeric value has no fallback and is carried through untouched, while strict warns on it.

AudioStreamPlayer

renders as nothing (a non-spatial audio node) docs ↗ source ↗ unit-physics-bodies.tscn ↗ Linter only
No visual output — this node draws nothing to compare.

Plays a non-spatial audio stream and has no runtime visual. The previewer draws nothing for it, reusing the base Node component. The blue slab in both images is the fixture's Ground StaticBody3D.

Linting

Strict parsing format-checks these AudioStreamPlayer properties, plus 10 inherited from Node. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

PropertyAcceptsOut of range
autoplaytrue or false
busquoted string or &"name"
max_polyphonyinteger >= 1error below
mix_targetenum 0-2 (STEREO/SURROUND/CENTER)warning
pitch_scalefloat >= 0.01error at or below 0, warning below 0.01
playback_typeenum 0-2 (DEFAULT/STREAM/SAMPLE)warning
playingtrue or false
streamnull, SubResource("id"), ExtResource("id") or Resource("path")
stream_pausedtrue or false
volume_dbfloat -80-24warning
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-audiostreamplayer-propertiesaudiostreamplayer-autoplay-without-streaminfo

pitch_scale, volume_db and the playing, autoplay and stream_paused flags fall back to 1, 0, false, false and false, with a warning when present but unparseable. max_polyphony defaults to 1 with no floor. bus defaults to "Master" only when absent and accepts any string with its quotes stripped.

AudioStreamPlayer2D

renders as an invisible Node2D transform group docs ↗ source ↗ unit-audio-stream-player-2d.tscn ↗ Linter only
No visual output — this node draws nothing to compare.

A positional audio emitter with no runtime visual. The previewer reuses the Node2D transform-group component (ADR-0008), which positions its children and draws nothing itself. Both images are an empty scene.

Linting

Strict parsing format-checks these AudioStreamPlayer2D properties, plus 12 inherited from Node2D, 16 inherited from CanvasItem, 10 inherited from Node. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

PropertyAcceptsOut of range
area_mask32-bit layer mask (layers 1-32)
attenuationfloat
autoplaytrue or false
busquoted string or &"name"
max_distancefloat >= 1error at or below 0, warning below 1
max_polyphonyinteger >= 1error below
panning_strengthfloat >= 0error below
pitch_scalefloat >= 0.01error at or below 0, warning below 0.01
playback_typeenum 0-2 (DEFAULT/STREAM/SAMPLE)warning
playingtrue or false
streamnull, SubResource("id"), ExtResource("id") or Resource("path")
stream_pausedtrue or false
volume_dbfloat -80-24warning
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-canvasitem-clip-ancestry (type-family match)canvasitem-ancestor-clips-childrenwarning
canvasitem-ancestor-is-canvasgroupwarning
valid-audiostreamplayer2d-propertiesaudiostreamplayer2d-autoplay-without-streaminfo

max_distance defaults to 2000, attenuation to 1 and panning_strength to 1 when absent. Those defaults are reused with a warning when the value fails to parse. playback_type re-checks the enum through enumOr and falls back to DEFAULT (0) for any value outside 0-2. Strict's floors on max_distance and panning_strength have no lenient counterpart.

AudioStreamPlayer3D

renders as a selection-gated speaker gizmo docs ↗ source ↗ unit-audio-stream-player.tscn ↗ Done
Godot render of AudioStreamPlayer3D Our render of AudioStreamPlayer3D
Godot 4.6.3 Ours

A positional audio source with no runtime visual. The previewer draws a speaker gizmo with a range circle and emission cone, gated on selection like the camera and light gizmos. Both images show only the ground plane and the preview sky.

Linting

Strict parsing format-checks these AudioStreamPlayer3D properties, plus 17 inherited from Node3D, 10 inherited from Node. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

PropertyAcceptsOut of range
area_mask32-bit layer mask (layers 1-32)
attenuation_filter_cutoff_hzfloat 1-20500warning
attenuation_filter_dbfloat -80-0warning
attenuation_modelenum 0-3 (INVERSE_DISTANCE/INVERSE_SQUARE_DISTANCE/LOGARITHMIC/DISABLED)error
autoplaytrue or false
busquoted string or &"name"
doppler_trackingenum 0-2 (DISABLED/IDLE_STEP/PHYSICS_STEP)warning
emission_angle_degreesfloat 0.1-90error below 0, warning below 0.1, error above 90
emission_angle_enabledtrue or false
emission_angle_filter_attenuation_dbfloat -80-0warning
max_dbfloat -24-6warning
max_distancefloat >= 0error below
max_polyphonyinteger >= 1error below
panning_strengthfloat >= 0error below
pitch_scalefloat >= 0.01error at or below 0, warning below 0.01
playback_typeenum 0-2 (DEFAULT/STREAM/SAMPLE)warning
playingtrue or false
streamnull, SubResource("id"), ExtResource("id") or Resource("path")
stream_pausedtrue or false
unit_sizefloat >= 0.1warning below
volume_dbfloat -80-80warning
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-node3d-visibility (type-family match)valid-node3d-visibilityerror
valid-audiostreamplayer3d-propertiesaudiostreamplayer3d-emission-angle-not-enabledinfo
audiostreamplayer3d-emission-filter-not-enabledinfo

Every numeric property defaults through floatOr without strict's range checks: unit_size falls back to 10, max_distance to 0, attenuation_filter_cutoff_hz to 5000 and emission_angle_degrees to 45. attenuation_model and doppler_tracking re-check the enum through enumOr and fall back to 0 for any out-of-range value.

Known limitations

  • Editor only The speaker gizmo draws only for the selected node, so a plain capture shows nothing for the three speakers.

BackBufferCopy

renders as nothing (a transform-only group) docs ↗ source ↗ unit-back-buffer-copy.tscn ↗ Linter only
No visual output — this node draws nothing to compare.

BackBufferCopy copies a screen region into the backbuffer for shaders to sample. It draws nothing of its own, so the previewer renders it as a transform-only group (ADR-0008) and its children still show.

Linting

Strict parsing format-checks these BackBufferCopy properties, plus 12 inherited from Node2D, 16 inherited from CanvasItem, 10 inherited from Node. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

PropertyAcceptsOut of range
copy_modeenum 0-2 (Disabled/Rect/Viewport)warning
rectRect2(x, y, w, h), or the Rect2i spelling Godot converts
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-canvasitem-clip-ancestry (type-family match)canvasitem-ancestor-clips-childrenwarning
canvasitem-ancestor-is-canvasgroupwarning

The lenient parser reuses parseNode2D, which never reads copy_mode or rect. Both keys are dropped whatever their value, valid or malformed.

BaseButton

renders as nothing of its own docs ↗ source ↗ unit-base-button.tscn ↗ Unreviewed
Comparison images not captured yet for BaseButton.

BaseButton is the base of every clickable Control and draws nothing of its own. Godot's BaseButton::_notification handles only accessibility, mouse and focus, never NOTIFICATION_DRAW. A concrete descendant like Button draws. BaseButton's disabled/toggle_mode/button_pressed/… interaction state is real but has no chrome of its own to affect. The previewer's native painter is registered but empty, and its children still show.

Linting

Strict parsing format-checks these BaseButton properties, plus 53 inherited from Control, 16 inherited from CanvasItem, 10 inherited from Node. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

PropertyAcceptsOut of range
action_modeenum 0-1 (ACTION_MODE_BUTTON_PRESS/ACTION_MODE_BUTTON_RELEASE)warning
button_groupnull, SubResource("id"), ExtResource("id") or Resource("path")
button_maskinteger
button_pressedtrue or false
disabledtrue or false
keep_pressed_outsidetrue or false
shortcutnull, SubResource("id"), ExtResource("id") or Resource("path")
shortcut_feedbacktrue or false
shortcut_in_tooltiptrue or false
toggle_modetrue or false
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-canvasitem-clip-ancestry (type-family match)canvasitem-ancestor-clips-childrenwarning
canvasitem-ancestor-is-canvasgroupwarning
valid-control-properties (type-family match)control-tooltip-ignored-by-mouse-filterwarning
control-property-orderwarning
valid-button-group (type-family match)button-group-without-toggle-modewarning

linterParser.ts format-checks all ten of BaseButton's own members. The lenient parser reuses parseControl unchanged and reads none of them, so a bad toggle_mode or button_group is neither substituted nor warned on.

Bone2D

renders as nothing (a transform-only group, the bone gizmo is editor-only) docs ↗ source ↗ unit-bone-2d.tscn ↗ Linter only
No visual output — this node draws nothing to compare.

Bone2D is one bone of a Skeleton2D chain. Its gizmo draws only in the editor, so at runtime the node is a transform, and the previewer renders it as a transform-only group (ADR-0008).

Linting

Strict parsing format-checks these Bone2D properties, plus 12 inherited from Node2D, 16 inherited from CanvasItem, 10 inherited from Node. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

PropertyAcceptsOut of range
auto_calculate_length_and_angletrue or false
bone_anglefloat -360-360warning
editor_settings/show_bone_gizmotrue or false
lengthfloat 1-1024warning
restTransform2D(6 floats)
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-canvasitem-clip-ancestry (type-family match)canvasitem-ancestor-clips-childrenwarning
canvasitem-ancestor-is-canvasgroupwarning
valid-bone2d-ancestrybone2d-chain-does-not-terminatewarning
bone2d-invalid-parentwarning
bone2d-missing-rest-posewarning

The lenient parser reuses parseNode2D, which reads none of the five bone keys. A length of 2048 or a bone_angle of 900 is carried through untouched and changes nothing on screen, where strict warns on both. default_length is a legacy alias Godot never writes, so an old scene carrying it lints clean.

BoneAttachment3D

renders as nothing yet, Godot rides it on its bone each frame, the previewer parks it at its authored transform docs ↗ source ↗ unit-bone-attachment-3d.tscn ↗ Not implemented
No visual output — this node draws nothing to compare.

Copies one bone's global pose onto itself so its children ride that bone, or with override_pose on pushes its own transform back onto the bone. Godot updates that relay every frame, and the previewer does not yet (ADR-0045): the node sits at the transform the scene file states.

Linting

Strict parsing format-checks these BoneAttachment3D properties, plus 17 inherited from Node3D, 10 inherited from Node. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

PropertyAcceptsOut of range
bone_idxinteger >= -1error below
bone_namequoted string or &"name"
external_skeletonNodePath("path/to/node")
override_posetrue or false
use_external_skeletontrue or false
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-node3d-visibility (type-family match)valid-node3d-visibilityerror
valid-boneattachment3d-skeleton (type-family match)boneattachment3d-parent-not-skeleton3dwarning
boneattachment3d-external-skeleton-unsetwarning

The lenient parser reads BoneAttachment3D through parseNode3D, so bone_name, bone_idx, override_pose, use_external_skeleton and external_skeleton reach no fallback at all. Only strict reads them, and a bad value there is an error rather than a substitution.

Known limitations

  • Approximated The attachment and its children sit at the authored transform, where Godot moves them to the bone's pose each update.

BoneConstraint3D

renders as nothing yet, Godot applies its bone constraints each frame, the previewer does not docs ↗ source ↗ unit-bone-constraint-3d.tscn ↗ Not implemented
No visual output — this node draws nothing to compare.

The base class of the bone constraint modifiers, holding the settings/<i>/ entries that name an apply bone and a reference bone or node. Godot applies those constraints to its Skeleton3D each frame, and the previewer does not yet (ADR-0045): the bones hold their rest pose.

Linting

Strict parsing format-checks these BoneConstraint3D properties, plus 2 inherited from SkeletonModifier3D, 17 inherited from Node3D, 10 inherited from Node. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

PropertyAcceptsOut of range
settings/#/*BoneConstraint3D setting
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-node3d-visibility (type-family match)valid-node3d-visibilityerror
valid-skeletonmodifier3d-parent (type-family match)skeletonmodifier3d-parent-not-skeleton3dwarning

The lenient parser reuses parseNode3D, which reads only transform and visible. Every settings/<i>/ leaf is dropped rather than substituted, and only strict reports a bad one.

BoneTwistDisperser3D

renders as nothing yet, Godot disperses one bone's twist up its chain, the previewer does not docs ↗ source ↗ unit-bone-twist-disperser-3d.tscn ↗ Not implemented
No visual output — this node draws nothing to compare.

Spreads one bone's twist back up its parent chain, so a wrist rotation becomes a smooth spiral through the forearm. It changes only the twist about each joint's axis. Godot runs it each frame, and the previewer does not yet (ADR-0045). The bones hold their rest pose.

Linting

Strict parsing format-checks these BoneTwistDisperser3D properties, plus 2 inherited from SkeletonModifier3D, 17 inherited from Node3D, 10 inherited from Node. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

PropertyAcceptsOut of range
mutable_bone_axestrue or false
setting_countinteger >= 0error below
settings/*settings/<i>/<leaf> and settings/<i>/joints/<j>/<leaf>
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-node3d-visibility (type-family match)valid-node3d-visibilityerror
valid-skeletonmodifier3d-parent (type-family match)skeletonmodifier3d-parent-not-skeleton3dwarning
valid-bonetwistdisperser3d-settings (type-family match)bonetwistdisperser3d-setting-index-out-of-rangeerror
bonetwistdisperser3d-joint-index-out-of-rangeerror

The lenient parser reuses parseNode3D, so setting_count and every settings/<i>/ value is dropped rather than substituted, with no fallback to name. Strict warns on a disperse_mode, end_bone_direction or weight_position outside its hint, and refuses the read-only reference_bone_name and joints/<j>/bone keys outright.

BoxContainer

renders as children laid out along its own vertical-chosen axis docs ↗ source ↗ unit-box-container.tscn ↗ Unreviewed
Comparison images not captured yet for BoxContainer.

BoxContainer is the base behind HBoxContainer and VBoxContainer that stacks children along one axis. Here vertical is an authorable property, and the previewer reads it to pick the axis. Children lay out as in HBoxContainer and VBoxContainer: spaced by separation and sized by each child's size_flags.

Linting

Strict parsing format-checks these BoxContainer properties, plus 53 inherited from Control, 16 inherited from CanvasItem, 10 inherited from Node. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

PropertyAcceptsOut of range
alignmentenum 0-2 (ALIGNMENT_BEGIN/ALIGNMENT_CENTER/ALIGNMENT_END)warning
verticaltrue or false
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-canvasitem-clip-ancestry (type-family match)canvasitem-ancestor-clips-childrenwarning
canvasitem-ancestor-is-canvasgroupwarning
valid-control-properties (type-family match)control-tooltip-ignored-by-mouse-filterwarning
control-property-orderwarning

index.ts parses alignment through the shared BoxContainer base, and reads vertical itself, since the fixed-axis subclasses hide that property. An unparseable alignment becomes undefined with no warning and falls back to Godot's BEGIN default. An unparseable vertical reads as false (horizontal), because a bool slot stores what it can and is never unset.

Button

renders as a StyleBox quad with a centred text run docs ↗ source ↗ unit-button.tscn ↗ Done
Godot render of Button Our render of Button
Godot 4.6.3 Ours

Button is Godot's clickable text control. The previewer paints the StyleBox its state calls for and centres the label on it, wrapping it to the box where autowrap_mode asks for it.

Linting

Strict parsing format-checks these Button properties, plus 10 inherited from BaseButton, 53 inherited from Control, 16 inherited from CanvasItem, 10 inherited from Node. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

PropertyAcceptsOut of range
alignmentenum 0-2 (HORIZONTAL_ALIGNMENT_LEFT/HORIZONTAL_ALIGNMENT_CENTER/HORIZONTAL_ALIGNMENT_RIGHT)warning
autowrap_modeenum 0-3 (AUTOWRAP_OFF/AUTOWRAP_ARBITRARY/AUTOWRAP_WORD/AUTOWRAP_WORD_SMART)warning
autowrap_trim_flagsbit mask of BREAK_TRIM_INDENT (32) | BREAK_TRIM_START_EDGE_SPACES (64) | BREAK_TRIM_END_EDGE_SPACES (128)
clip_texttrue or false
expand_icontrue or false
flattrue or false
iconnull, SubResource("id"), ExtResource("id") or Resource("path")
icon_alignmentenum 0-2 (HORIZONTAL_ALIGNMENT_LEFT/HORIZONTAL_ALIGNMENT_CENTER/HORIZONTAL_ALIGNMENT_RIGHT)warning
languagequoted string, or the &"…" StringName or NodePath("…") it converts
textquoted string, or the &"…" StringName or NodePath("…") it converts
text_directionenum 0-3 (TEXT_DIRECTION_AUTO/TEXT_DIRECTION_LTR/TEXT_DIRECTION_RTL/TEXT_DIRECTION_INHERITED)error below -1, warning below 0, error above 3
text_overrun_behaviorenum 0-6 (OVERRUN_NO_TRIMMING/OVERRUN_TRIM_CHAR/OVERRUN_TRIM_WORD/OVERRUN_TRIM_ELLIPSIS/OVERRUN_TRIM_WORD_ELLIPSIS/OVERRUN_TRIM_ELLIPSIS_FORCE/OVERRUN_TRIM_WORD_ELLIPSIS_FORCE)warning
vertical_icon_alignmentenum 0-2 (VERTICAL_ALIGNMENT_TOP/VERTICAL_ALIGNMENT_CENTER/VERTICAL_ALIGNMENT_BOTTOM)warning
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-canvasitem-clip-ancestry (type-family match)canvasitem-ancestor-clips-childrenwarning
canvasitem-ancestor-is-canvasgroupwarning
valid-control-properties (type-family match)control-tooltip-ignored-by-mouse-filterwarning
control-property-orderwarning
valid-button-group (type-family match)button-group-without-toggle-modewarning

Button's own keys, text, disabled, flat, alignment, icon, icon_alignment, vertical_icon_alignment and expand_icon, have no strict counterpart. disabled, flat and expand_icon become false for any value that does not read as true, with no warning. The three alignments go through parseOptionalInt, so a malformed value becomes undefined and the render default applies.

Known limitations

  • Approximated Under layout_direction = 3 or text_direction = 2, the label's glyphs keep left-to-right order for a right-to-left script or trailing punctuation, though layout_direction = 3 swaps the label, icon and chrome.

Camera2D

renders as a 2D view frame with no drawn geometry docs ↗ source ↗ unit-sub-viewport-container-camera-2d.tscn ↗ Unreviewed
Comparison images not captured yet for Camera2D.

Camera2D defines which slice of the canvas the viewport shows, and the previewer draws no geometry for it. A sub-viewport's 2D pass frames through it, while the main 2D stage frames the whole scene (ADR-0006).

Linting

Strict parsing format-checks these Camera2D properties, plus 12 inherited from Node2D, 16 inherited from CanvasItem, 10 inherited from Node. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

PropertyAcceptsOut of range
anchor_modeenum 0-1 (FIXED_TOP_LEFT/DRAG_CENTER)warning
drag_bottom_marginfloat 0-1warning
drag_horizontal_enabledtrue or false
drag_horizontal_offsetfloat -1-1warning
drag_left_marginfloat 0-1warning
drag_right_marginfloat 0-1warning
drag_top_marginfloat 0-1warning
drag_vertical_enabledtrue or false
drag_vertical_offsetfloat -1-1warning
editor_draw_drag_margintrue or false
editor_draw_limitstrue or false
editor_draw_screentrue or false
enabledtrue or false
ignore_rotationtrue or false
limit_bottominteger
limit_enabledtrue or false
limit_leftinteger
limit_rightinteger
limit_smoothedtrue or false
limit_topinteger
offsetVector2(x, y), or the Vector2i spelling Godot converts
position_smoothing_enabledtrue or false
position_smoothing_speedfloat >= 0error below
process_callbackenum 0-1 (PHYSICS/IDLE)warning
rotation_smoothing_enabledtrue or false
rotation_smoothing_speedfloat >= 0error below
zoomVector2(x, y), neither component (near-)zero
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-canvasitem-clip-ancestry (type-family match)canvasitem-ancestor-clips-childrenwarning
canvasitem-ancestor-is-canvasgroupwarning
valid-camera2d-propertiescamera2d-multiple-enabledinfo
camera2d-invalid-horizontal-limitsinfo
camera2d-invalid-vertical-limitsinfo
camera2d-smoothing-speed-zeroinfo
camera2d-rotation-smoothing-speed-zeroinfo

zoom falls back to (1, 1) only when absent or ungrammatical, so a zero or negative component that strict rejects renders as authored. anchor_mode falls back to DRAG_CENTER, the four limit_* keys to plus or minus 10000000, limit_enabled to true and offset to (0, 0). enabled is true unless the value reads as false. The smoothing, drag and editor_draw_* keys are never read.

Known limitations

  • Approximated The main 2D stage opens on the whole scene rather than the enabled camera's view, which a Cameras panel row shows on request.

Camera3D

renders as a selection-gated frustum gizmo docs ↗ source ↗ unit-camera3d.tscn ↗ Done
Godot render of Camera3D Our render of Camera3D
Godot 4.6.3 Ours

An authored viewpoint that draws nothing at runtime. The previewer matches that and draws only a frustum gizmo, which is selection-gated (ADR-0018), so with nothing selected the camera is absent from both images.

Linting

Strict parsing format-checks these Camera3D properties, plus 17 inherited from Node3D, 10 inherited from Node. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

PropertyAcceptsOut of range
attributesnull, SubResource("id"), ExtResource("id") or Resource("path")
compositornull, SubResource("id"), ExtResource("id") or Resource("path")
cull_mask32-bit layer mask (layers 1-32)
currenttrue or false
doppler_trackingenum 0-2 (DISABLED/IDLE_STEP/PHYSICS_STEP)warning
environmentnull, SubResource("id"), ExtResource("id") or Resource("path")
farfloat >= 0.01warning below
fovfloat 1-179error
frustum_offsetVector2(x, y), or the Vector2i spelling Godot converts
h_offsetfloat
keep_aspectenum 0-1 (KEEP_WIDTH/KEEP_HEIGHT)warning
nearfloat >= 0.001warning below
projectionenum 0-2 (PERSPECTIVE/ORTHOGONAL/FRUSTUM)error
sizefloat >= 0.001error at or below 0.00001, warning below 0.001
v_offsetfloat
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-node3d-visibility (type-family match)valid-node3d-visibilityerror
valid-camera3d-properties (type-family match)camera3d-multiple-currentinfo
camera3d-invalid-clipping-planeserror
camera3d-zero-depth-rangewarning

The numeric keys (fov, size, near, far, h_offset, v_offset, frustum_offset) warn and fall back to Godot's defaults through floatOr and vec2Or, and cull_mask and doppler_tracking to 1048575 and 0. projection and keep_aspect silently treat any unrecognised value as the default. current is a raw === 'true' comparison, so "1" leaves the camera inactive.

Known limitations

  • Editor only The frustum gizmo appears only in Godot's editor, but here it is selection-gated.

CanvasGroup

renders as invisible transform-only fallback, the children's composite into one offscreen buffer is not reproduced docs ↗ source ↗ unit-canvas-group.tscn ↗ Not implemented
Comparison images not captured yet for CanvasGroup.

CanvasGroup composites its children into one offscreen buffer and blends that buffer once. The previewer parses and validates it but does not reproduce the compositing, so it renders as a transform-only fallback and its children still show.

Linting

Strict parsing format-checks these CanvasGroup properties, plus 12 inherited from Node2D, 16 inherited from CanvasItem, 10 inherited from Node. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

PropertyAcceptsOut of range
clear_marginfloat >= 0error below
fit_marginfloat >= 0error below
use_mipmapstrue or false
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-canvasitem-clip-ancestry (type-family match)canvasitem-ancestor-clips-childrenwarning
canvasitem-ancestor-is-canvasgroupwarning
valid-canvasgroup-ancestrycanvasgroup-ancestor-clips-childrenwarning
canvasgroup-nested-in-canvasgroupwarning

The lenient parser reuses parseNode2D, which never reads fit_margin, clear_margin or use_mipmaps. All three are dropped whatever their value.

Known limitations

  • Not drawn Overlapping semi-transparent children blend against the background one by one, not once through the group's buffer.

CanvasLayer

renders as a full-rect passthrough layer hosting Control children docs ↗ source ↗ unit-canvas-layer.tscn ↗ Done

CanvasLayer is not a Control and paints nothing of its own. It puts its children on their own draw layer, above or below the 2D world, and gives them a viewport to anchor against.

Godot render of CanvasLayer Our render of CanvasLayer
Godot 4.6.3 Ours

The canvas transform

Done
Godot render of The canvas transform Our render of The canvas transform
Godot 4.6.3 Ours

offset, rotation and scale, or transform when written, place the layer's whole canvas. A Control and a Node2D inside it both draw through that transform, while the square outside stays put.

In a sub-viewport that draws through a Camera2D (ADR-0006), the layer stays in viewport pixels. With follow_viewport_enabled it draws through the camera's view, scaled about the view's centre by follow_viewport_scale. The editor view has no Camera2D transform to follow, and the editor turns the follow scale off.

Linting

Strict parsing format-checks these CanvasLayer properties, plus 10 inherited from Node. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

PropertyAcceptsOut of range
follow_viewport_enabledtrue or false
follow_viewport_scalefloat
layerinteger -2147483648-2147483647warning
offsetVector2(x, y), or the Vector2i spelling Godot converts
rotationfloat
scaleVector2(x, y), or the Vector2i spelling Godot converts
transformTransform2D(6 floats)
visibletrue or false
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo

layer goes through parseOptionalInt, so an absent or unparseable value becomes undefined with no warning. visible is true for anything other than a value that reads as false. A malformed transform falls back to offset, rotation and scale. Each of those, and follow_viewport_enabled and follow_viewport_scale, falls back to its Godot default.

CanvasModulate

renders as a colour multiply applied to the whole canvas docs ↗ source ↗ unit-canvas-modulate.tscn ↗ Limitation
Godot render of CanvasModulate Our render of CanvasModulate
Godot 4.6.3 Ours

CanvasModulate tints every CanvasItem on its canvas by one color. The previewer multiplies that colour onto each item it draws on the same canvas, wherever the node sits in the tree.

Linting

Strict parsing format-checks these CanvasModulate properties, plus 12 inherited from Node2D, 16 inherited from CanvasItem, 10 inherited from Node. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

PropertyAcceptsOut of range
colorColor(r, g, b, a), or the colour string or int it converts
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-canvasitem-clip-ancestry (type-family match)canvasitem-ancestor-clips-childrenwarning
canvasitem-ancestor-is-canvasgroupwarning

color falls back to opaque white (1, 1, 1, 1) when absent or malformed, with no warning, since parseColor swallows its own parse failures.

Known limitations

  • Approximated A CanvasModulate inside an instanced sub-scene is not found, so its tint is not applied where Godot would apply it.

CCDIK3D

renders as nothing yet, Godot solves its chain onto the target each frame, the previewer does not docs ↗ source ↗ unit-ccdik-3d.tscn ↗ Not implemented
No visual output — this node draws nothing to compare.

Cyclic coordinate descent inverse kinematics. It rotates a bone chain joint by joint, from the far end back to the root, until the tip reaches the target. Godot runs it each frame, and the previewer does not yet (ADR-0045). The bones hold their rest pose.

Linting

Strict parsing format-checks the inherited set (6 inherited from IterateIK3D, 1 inherited from IKModifier3D, 2 inherited from SkeletonModifier3D, 17 inherited from Node3D, 10 inherited from Node); CCDIK3D declares none of its own. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-node3d-visibility (type-family match)valid-node3d-visibilityerror
valid-skeletonmodifier3d-parent (type-family match)skeletonmodifier3d-parent-not-skeleton3dwarning
valid-iterateik3d-target-node (type-family match)iterateik3d-setting-missing-target-nodewarning

CCDIK3D registers no validator of its own, and the lenient parser reuses parseNode3D. influence, max_iterations, min_distance, angular_delta_limit, deterministic and mutable_bone_axes are dropped with no fallback, and strict range-checks them through the base-walk.

CenterContainer

renders as a rect centred inside its own docs ↗ source ↗ unit-center-container.tscn ↗ Done
Godot render of CenterContainer Our render of CenterContainer
Godot 4.6.3 Ours

CenterContainer places its single child at the centre of its rect, at the child's own minimum size, and draws nothing itself.

Linting

Strict parsing format-checks these CenterContainer properties, plus 53 inherited from Control, 16 inherited from CanvasItem, 10 inherited from Node. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

PropertyAcceptsOut of range
use_top_lefttrue or false
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-canvasitem-clip-ancestry (type-family match)canvasitem-ancestor-clips-childrenwarning
canvasitem-ancestor-is-canvasgroupwarning
valid-control-properties (type-family match)control-tooltip-ignored-by-mouse-filterwarning
control-property-orderwarning

use_top_left carries a strict bool check, since set_use_top_left assigns straight through. The lenient parser is a pure passthrough to parseControl and never reads it.

CharacterBody2D

renders as a transform-only group docs ↗ source ↗ unit-characterbody2d.tscn ↗ Linter only
No visual output — this node draws nothing to compare.

A 2D body moved by script rather than by the solver. It draws nothing in Godot, and the previewer mounts it as a transform-only Node2D group (ADR-0008) whose children carry the picture.

Linting

Strict parsing format-checks these CharacterBody2D properties, plus 5 inherited from CollisionObject2D, 12 inherited from Node2D, 16 inherited from CanvasItem, 10 inherited from Node. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

PropertyAcceptsOut of range
floor_block_on_walltrue or false
floor_constant_speedtrue or false
floor_max_angleradians, 0° to 180°warning
floor_snap_lengthfloat >= 0error below
floor_stop_on_slopetrue or false
max_slidesinteger >= 1error below
motion_modeenum 0-1 (GROUNDED/FLOATING)warning
platform_floor_layers32-bit layer mask (layers 1-32)
platform_on_leaveenum 0-2 (ADD_VELOCITY/ADD_UPWARD_VELOCITY/DO_NOTHING)warning
platform_wall_layers32-bit layer mask (layers 1-32)
safe_marginfloat 0.001-256warning
slide_on_ceilingtrue or false
up_directionVector2(x, y) other than the zero vector, or the Vector2i spelling Godot converts
velocityVector2(x, y), or the Vector2i spelling Godot converts
wall_min_slide_angleradians, 0° to 180°warning
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-canvasitem-clip-ancestry (type-family match)canvasitem-ancestor-clips-childrenwarning
canvasitem-ancestor-is-canvasgroupwarning
valid-characterbody2dcharacterbody2d-floor-props-in-floating-modeinfo
characterbody2d-slide-on-ceiling-in-floating-modeinfo
characterbody2d-wall-min-slide-angle-in-grounded-modeinfo
valid-collisionobject2d (type-family match)collisionobject2d-needs-collision-shapewarning

velocity is checked for Vector2(x, y) shape only. It has no bound in either direction, since Godot neither clamps nor rejects a value there, and the lenient parser never reads it.

CharacterBody3D

renders as a transform-only Node3D group docs ↗ source ↗ unit-characterbody3d.tscn ↗ Linter only
Godot render of CharacterBody3D Our render of CharacterBody3D
Godot 4.6.3 Ours

A physics body with no visual of its own. It renders as a transform-only group (ADR-0008), reusing the Node3D component. The blue capsule on screen is its child MeshInstance3D.

Linting

Strict parsing format-checks these CharacterBody3D properties, plus 6 inherited from PhysicsBody3D, 6 inherited from CollisionObject3D, 17 inherited from Node3D, 10 inherited from Node. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

PropertyAcceptsOut of range
floor_block_on_walltrue or false
floor_constant_speedtrue or false
floor_max_angleradians, 0° to 180°warning
floor_snap_lengthfloat >= 0error below
floor_stop_on_slopetrue or false
max_slidesinteger >= 1error below
motion_modeenum 0-1 (GROUNDED/FLOATING)warning
platform_floor_layers32-bit layer mask (layers 1-32)
platform_on_leaveenum 0-2 (ADD_VELOCITY/ADD_UPWARD_VELOCITY/DO_NOTHING)warning
platform_wall_layers32-bit layer mask (layers 1-32)
safe_marginfloat 0.001-256warning
slide_on_ceilingtrue or false
up_directionVector3(x, y, z) other than the zero vector, or the Vector3i spelling Godot converts
velocityVector3(x, y, z), or the Vector3i spelling Godot converts
wall_min_slide_angleradians, 0° to 180°warning
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-node3d-visibility (type-family match)valid-node3d-visibilityerror
valid-collisionobject3d-scale (type-family match)collisionobject3d-non-uniform-scalewarning
valid-characterbody3dcharacterbody3d-floor-props-in-floating-modeinfo
characterbody3d-slide-on-ceiling-in-floating-modeinfo
valid-collisionobject3d (type-family match)collisionobject3d-needs-collision-shapewarning

CharacterBody3D reuses parseNode3D directly, so motion_mode, velocity, the floor and wall settings and max_slides are never read by the lenient parser. The node renders as an empty group, so no substitution is needed.

CheckBox

renders as a theme icon followed by a text run docs ↗ source ↗ unit-checkbox.tscn ↗ Done
Godot render of CheckBox Our render of CheckBox
Godot 4.6.3 Ours

CheckBox is a toggle button with a check indicator to the left of its label. The previewer draws the theme's indicator icon and the label beside it.

Linting

Strict parsing format-checks the inherited set (13 inherited from Button, 10 inherited from BaseButton, 53 inherited from Control, 16 inherited from CanvasItem, 10 inherited from Node); CheckBox declares none of its own. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-canvasitem-clip-ancestry (type-family match)canvasitem-ancestor-clips-childrenwarning
canvasitem-ancestor-is-canvasgroupwarning
valid-control-properties (type-family match)control-tooltip-ignored-by-mouse-filterwarning
control-property-orderwarning
valid-button-group (type-family match)button-group-without-toggle-modewarning

text, button_pressed, disabled and button_group have no strict counterpart beyond the inherited Control set. button_pressed and disabled become false for any value that does not read as true, with no warning. button_group is stored as the raw string.

Known limitations

  • Approximated Under layout_direction = 3 or text_direction = 2, the label's glyphs keep left-to-right order for a right-to-left script or trailing punctuation, though layout_direction = 3 swaps the label, icon and chrome.

CheckButton

renders as a toggle-switch icon followed by a text run docs ↗ source ↗ unit-check-button.tscn ↗ Unreviewed
Comparison images not captured yet for CheckButton.

CheckButton is a labelled on-off switch. The previewer draws the theme's toggle-switch icon flush against the right edge and the label to its left, with no StyleBox chrome (CheckButton's own StyleBoxes are all a StyleBoxEmpty).

Linting

Strict parsing format-checks the inherited set (13 inherited from Button, 10 inherited from BaseButton, 53 inherited from Control, 16 inherited from CanvasItem, 10 inherited from Node); CheckButton declares none of its own. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-canvasitem-clip-ancestry (type-family match)canvasitem-ancestor-clips-childrenwarning
canvasitem-ancestor-is-canvasgroupwarning
valid-control-properties (type-family match)control-tooltip-ignored-by-mouse-filterwarning
control-property-orderwarning
valid-button-group (type-family match)button-group-without-toggle-modewarning

CheckButton binds no new property beyond Button's, only theme items, so the strict and lenient parsers agree on every key Button's parser reads. The lenient parser also reads button_pressed (a BaseButton property) for the on/off state of the switch.

Known limitations

  • Not drawn Button's inherited icon property (distinct from the toggle glyph) is parsed but never drawn.
  • Approximated Under layout_direction = 3 or text_direction = 2, the label's glyphs keep left-to-right order for a right-to-left script or trailing punctuation, while the label, icon and chrome swap sides.

CodeEdit

renders as a TextEdit with a line-number gutter docs ↗ source ↗ unit-code-edit.tscn ↗ Unreviewed
Comparison images not captured yet for CodeEdit.

CodeEdit is the source-code editor Control, a TextEdit with gutters, completion, indentation and folding. The previewer draws everything TextEdit's painter draws, shifted right by this node's gutter band. It adds the line-numbers gutter, the fold gutter's arrows and the line_length_guidelines rules.

Linting

Strict parsing format-checks these CodeEdit properties, plus 47 inherited from TextEdit, 53 inherited from Control, 16 inherited from CanvasItem, 10 inherited from Node. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

PropertyAcceptsOut of range
auto_brace_completion_enabledtrue or false
auto_brace_completion_highlight_matchingtrue or false
auto_brace_completion_pairsDictionary { "open": "close", … }, each key a symbol-only string
code_completion_enabledtrue or false
code_completion_prefixesstring array (ArrayString, PackedStringArray(…) or […]), each a single character
delimiter_commentsstring array (ArrayString, PackedStringArray(…) or […]), each a symbol-only "start[ end]" delimiter key
delimiter_stringsstring array (ArrayString, PackedStringArray(…) or […]), each a symbol-only "start[ end]" delimiter key
gutters_draw_bookmarkstrue or false
gutters_draw_breakpoints_guttertrue or false
gutters_draw_executing_linestrue or false
gutters_draw_fold_guttertrue or false
gutters_draw_line_numberstrue or false
gutters_line_numbers_min_digitsinteger 1-5warning
gutters_zero_pad_line_numberstrue or false
indent_automatictrue or false
indent_automatic_prefixesstring array (ArrayString, PackedStringArray(…) or […]), each a single character
indent_sizeinteger >= 1error below
indent_use_spacestrue or false
line_foldingtrue or false
line_length_guidelinesint array (PackedInt32Array(…), Arrayint or […])
symbol_lookup_on_clicktrue or false
symbol_tooltip_on_hovertrue or false
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-canvasitem-clip-ancestry (type-family match)canvasitem-ancestor-clips-childrenwarning
canvasitem-ancestor-is-canvasgroupwarning
valid-control-properties (type-family match)control-tooltip-ignored-by-mouse-filterwarning
control-property-orderwarning
valid-codeedit-properties (type-family match)codeedit-delimiter-start-key-collisionerror

linterParser.ts format-checks every one of CodeEdit's own members. The registered lenient parser reads the members the picture needs: gutters_draw_line_numbers, gutters_zero_pad_line_numbers, gutters_line_numbers_min_digits, gutters_draw_bookmarks, gutters_draw_breakpoints_gutter, gutters_draw_executing_lines, gutters_draw_fold_gutter, line_folding, indent_size, line_length_guidelines, delimiter_comments and delimiter_strings. It also reads every property TextEdit's parser reads.

A malformed boolean reads as false, and a malformed integer reads as unset. line_folding gates the fold-gutter arrows: with it off, the gutter draws none. The two delimiter arrays decide which lines can fold. indent_size widens every tab stop (see the doc of indentSize). The strict linter format-checks the completion and brace-pair members, and this parser never reads them, because none of them changes the picture.

Known limitations

  • Not drawn The main gutter reserves its width but draws no bookmark, breakpoint or executing-line icon, since a .tscn cannot set that per-line state (code_edit.cpp:1419-1503).
  • Not drawn The fold gutter's folded/folded_code_region icons, since nothing in a .tscn folds a line (code_edit.cpp:1619-1650).
  • Not drawn The completion popup's RTL arms (code_edit.cpp:75,236) and the fold-icon hit test's (:426,451,471): a popup needs code_completion_active, the hit test pointer state.

CollisionPolygon2D

renders as nothing (a transform-only group) docs ↗ source ↗ unit-collision-polygon-2d.tscn ↗ Linter only
No visual output — this node draws nothing to compare.

Gives a polygon collision shape to a CollisionObject2D parent. Its outline is an editor and debug gizmo with no runtime visual, so the previewer renders it as a transform-only group (ADR-0008).

Linting

Strict parsing format-checks these CollisionPolygon2D properties, plus 12 inherited from Node2D, 16 inherited from CanvasItem, 10 inherited from Node. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

PropertyAcceptsOut of range
build_modeenum 0-1 (BUILD_SOLIDS/BUILD_SEGMENTS)error
disabledtrue or false
one_way_collisiontrue or false
one_way_collision_marginfloat 0-128warning
polygonPackedVector2Array(x, y, …)
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-canvasitem-clip-ancestry (type-family match)canvasitem-ancestor-clips-childrenwarning
canvasitem-ancestor-is-canvasgroupwarning
valid-collisionpolygon2dcollisionpolygon2d-no-parentwarning
collisionpolygon2d-invalid-parentwarning
collisionpolygon2d-empty-polygonwarning
collisionpolygon2d-insufficient-pointswarning
collisionpolygon2d-one-way-ignoredwarning

The lenient parser reuses parseNode2D, so it never reads build_mode, polygon, disabled, one_way_collision or one_way_collision_margin. A malformed value passes through unexamined with no substitution.

CollisionPolygon3D

renders as nothing (a transform-only group) docs ↗ source ↗ unit-collision-polygon-3d.tscn ↗ Linter only
No visual output — this node draws nothing to compare.

Gives a CollisionObject3D parent a prism collision shape extruded from a 2D polygon. That shape is editor and debug visualisation only, so the previewer renders it as a transform-only group (ADR-0008).

Linting

Strict parsing format-checks these CollisionPolygon3D properties, plus 17 inherited from Node3D, 10 inherited from Node. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

PropertyAcceptsOut of range
debug_colorColor(r, g, b, a), or the colour string or int it converts
debug_filltrue or false
depthfloat
disabledtrue or false
marginfloat 0.001-10warning
polygonPackedVector2Array(x, y, …)
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-node3d-visibility (type-family match)valid-node3d-visibilityerror
valid-collisionpolygon3dcollisionpolygon3d-no-parentwarning
collisionpolygon3d-invalid-parentwarning
collisionpolygon3d-empty-polygonwarning
collisionpolygon3d-non-uniform-scalewarning

polygon, depth, margin, disabled, debug_color and debug_fill are never read by the lenient parser, which reuses parseNode3D wholesale. A malformed value lints only through the strict validators.

CollisionShape2D

renders as a toggle-gated collision outline docs ↗ source ↗ unit-collisionshape2d.tscn ↗ Done
No visual output — this node draws nothing to compare.

Attaches a 2D collision shape to a physics body. Its outline is a debug gizmo gated behind "Visible Collision Shapes" (ADR-0005, ADR-0006), so a plain capture draws nothing.

Linting

Strict parsing format-checks these CollisionShape2D properties, plus 12 inherited from Node2D, 16 inherited from CanvasItem, 10 inherited from Node. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

PropertyAcceptsOut of range
debug_colorColor(r, g, b, a), or the colour string or int it converts
disabledtrue or false
one_way_collisiontrue or false
one_way_collision_marginfloat 0-128warning
shapenull, SubResource("id"), ExtResource("id") or Resource("path")
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-canvasitem-clip-ancestry (type-family match)canvasitem-ancestor-clips-childrenwarning
canvasitem-ancestor-is-canvasgroupwarning
valid-collisionshape2dcollisionshape2d-requires-shapewarning
collisionshape2d-invalid-parentwarning
collisionshape2d-no-parentwarning
collisionshape2d-unused-one-way-margininfo
collisionshape2d-one-way-ignored-under-area2dwarning
collisionshape2d-polygon-shape-limited-editingwarning

shape is copied through verbatim with no format check. disabled is true only for the literal string true. debug_color falls back to the project default Color(0, 0.6, 0.7, 0.42) for an absent or unparseable value, with no warning.

Known limitations

  • Editor only The shape outline draws only while the collision-shape toggle is on.

CollisionShape3D

renders as a toggle-gated collision wireframe docs ↗ source ↗ unit-rigidbody3d.tscn ↗ Done
Godot render of CollisionShape3D Our render of CollisionShape3D
Godot 4.6.3 Ours

Attaches a collision shape to a physics body and has no visible form at runtime. Its wireframe draws only when "Visible Collision Shapes" is on (ADR-0005, ADR-0006). The salmon cube on screen is the sibling mesh.

Linting

Strict parsing format-checks these CollisionShape3D properties, plus 17 inherited from Node3D, 10 inherited from Node. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

PropertyAcceptsOut of range
debug_colorColor(r, g, b, a), or the colour string or int it converts
debug_filltrue or false
disabledtrue or false
shapenull, SubResource("id"), ExtResource("id") or Resource("path")
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-node3d-visibility (type-family match)valid-node3d-visibilityerror
valid-collisionshape3dcollisionshape3d-requires-shapewarning
collisionshape3d-invalid-parentwarning
collisionshape3d-no-parentwarning
collisionshape3d-non-uniform-scalewarning
collisionshape3d-concave-under-rigidbodywarning
collisionshape3d-worldboundary-under-rigidbodywarning
collisionshape3d-concave-under-characterbodywarning

shape is copied through verbatim with no format check. disabled is true only for the literal string true. debug_color falls back to the project default Color(0, 0.6, 0.7, 0.42) for an absent or unparseable value, with no warning.

Known limitations

  • Editor only The shape wireframe draws only while the collision-shape toggle is on.

ColorPicker

renders as the sample row, the RGB/HSV/Linear mode row, the channel slider grid, the hex field, the swatches rows and, at the default picker_shape, an SV square + hue slider docs ↗ source ↗ unit-color-picker.tscn ↗ Unreviewed
Comparison images not captured yet for ColorPicker.

ColorPicker is the widget for choosing a colour through sliders, a wheel, hex input and presets. Its C++ constructor builds the whole widget as internal children, and a .tscn never serialises them. So the previewer's painter draws the composite directly from color, picker_shape and every row-visibility property, not from a subtree it could walk. It draws these parts:

  • The pick and shape buttons, with their screen_picker and shape_rect icons, and the colour sample (checkerboard and swatch).
  • The RGB/HSV/Linear mode row. OKHSL has no button, and only the dropdown reaches it. The current mode's button draws TabContainer's tab_selected box and white font_pressed_color text, which BIND_THEME_ITEM_EXT brings in from color_picker.cpp:2060-2062. Every other mode button draws tab_unselected, and btn_mode adds its menu_option icon.
  • The channel slider grid for the current color_mode, with the alpha and intensity rows that edit_alpha and edit_intensity add. Every channel and alpha row draws the stock HSlider chrome under its gradient band, with the bar_arrow grabber that _reset_sliders_theme sets (color_picker.cpp:628-651). Intensity keeps the default circle grabber, since that override skips it.
  • The value SpinBox of each row, at the real width of its LineEdit field (spin_box.cpp:82-86), with the up/down stepper icons beside it.
  • The hex/expression field.
  • The swatches rows: a collapsed "Swatches" toggle with its folded_arrow and a menu button, and a "Recent Colors" toggle. Neither toggle changes state. This is all a .tscn-loaded picker holds: presets arrive only through add_preset() at runtime, never as a serialised property. Godot leaves the swatches grid collapsed until a viewer expands it, so there is no grid to draw.
  • At the default picker_shape (the HSV rectangle), the SV square and the hue slider with their cursor and indicator.

Every row-visibility flag also moves this node's minimum size, to match the combined minimum of real_vbox. "Known limitations" lists everything else.

Linting

Strict parsing format-checks these ColorPicker properties, plus 1 inherited from BoxContainer, 53 inherited from Control, 16 inherited from CanvasItem, 10 inherited from Node. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032). ColorPicker also REFUSES vertical, which its base declares but this class cannot carry.

PropertyAcceptsOut of range
can_add_swatchestrue or false
colorColor(r, g, b, a), or the colour string or int it converts
color_modeenum 0-3 (MODE_RGB/MODE_HSV/MODE_LINEAR/MODE_OKHSL)error
color_modes_visibletrue or false
deferred_modetrue or false
edit_alphatrue or false
edit_intensitytrue or false
hex_visibletrue or false
picker_shapeenum 0-6 (SHAPE_HSV_RECTANGLE/SHAPE_HSV_WHEEL/SHAPE_VHS_CIRCLE/SHAPE_OKHSL_CIRCLE/SHAPE_NONE/SHAPE_OK_HS_RECTANGLE/SHAPE_OK_HL_RECTANGLE)error
presets_visibletrue or false
sampler_visibletrue or false
sliders_visibletrue or false
verticalnot available on this type
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-canvasitem-clip-ancestry (type-family match)canvasitem-ancestor-clips-childrenwarning
canvasitem-ancestor-is-canvasgroupwarning
valid-control-properties (type-family match)control-tooltip-ignored-by-mouse-filterwarning
control-property-orderwarning

index.ts reads color, picker_shape, color_mode, color_modes_visible, sliders_visible, hex_visible, presets_visible, sampler_visible, edit_alpha and edit_intensity with VBoxContainer's properties. can_add_swatches and deferred_mode stay unread, and the allowlist's citation gives the reason: a button that is never visible, and signal timing. A picker_shape of 7 or a malformed color loads and renders the same as a well-formed value. An absent color renders opaque white, not the raw Color() member default, because ColorPicker::ColorPicker() calls set_pick_color(Color(1, 1, 1)) (color_picker.cpp:2289).

Known limitations

  • Shader missing A picker_shape other than 0 (HSV Rectangle) or 4 (none) selects a shader-backed shape (wheel, VHS/OKHSL circle, either OK rectangle), so only the sample row draws.
  • Not drawn The script icon of text_type (color_picker.cpp:1324), which shows only for an HDR or negative color.
  • Approximated The HSV hue channel row (color_mode = MODE_HSV, slider index 0) draws a flat grey base with no rainbow overlay, where Godot blends one in at alpha = saturation (color_mode.cpp:218-221).
  • Approximated The minimum-size calculation floors the channel-label column at label_width (10px), not the widest label's width, which the shape row's 290px floor hides in every fixture.
  • Not drawn Focus rings (draw_focus_rect/draw_focus_circle): a static previewer has no focus.

ColorPickerButton

renders as a Button with a checkerboard + colour swatch over its face docs ↗ source ↗ unit-color-picker-button.tscn ↗ Unreviewed
Comparison images not captured yet for ColorPickerButton.

ColorPickerButton is a Button that opens a ColorPicker popup and shows the chosen color on its face. The previewer draws the button's chrome, then the checkerboard and colour swatch on top, inset by the "normal" StyleBox's content margins.

Linting

Strict parsing format-checks these ColorPickerButton properties, plus 13 inherited from Button, 10 inherited from BaseButton, 53 inherited from Control, 16 inherited from CanvasItem, 10 inherited from Node. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

PropertyAcceptsOut of range
colorColor(r, g, b, a), or the colour string or int it converts
edit_alphatrue or false
edit_intensitytrue or false
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-canvasitem-clip-ancestry (type-family match)canvasitem-ancestor-clips-childrenwarning
canvasitem-ancestor-is-canvasgroupwarning
valid-control-properties (type-family match)control-tooltip-ignored-by-mouse-filterwarning
control-property-orderwarning
valid-button-group (type-family match)button-group-without-toggle-modewarning

index.ts reads color (default: Godot's opaque black) with Button's properties. It never reads edit_alpha or edit_intensity, so a malformed value for either loads and renders the same as a well-formed one. A malformed color = Color(1, 1) fails COLOR_RE and falls back to the white of parseColor.

Known limitations

  • Not drawn edit_alpha/edit_intensity only affect the internal ColorPicker popup, a Window this previewer never opens.

ColorRect

renders as a flat-filled quad docs ↗ source ↗ unit-color-rect.tscn ↗ Done
Godot render of ColorRect Our render of ColorRect
Godot 4.6.3 Ours

ColorRect fills its rect with one flat color, alpha included.

Linting

Strict parsing format-checks these ColorRect properties, plus 53 inherited from Control, 16 inherited from CanvasItem, 10 inherited from Node. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

PropertyAcceptsOut of range
colorColor(r, g, b, a), or the colour string or int it converts
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-canvasitem-clip-ancestry (type-family match)canvasitem-ancestor-clips-childrenwarning
canvasitem-ancestor-is-canvasgroupwarning
valid-control-properties (type-family match)control-tooltip-ignored-by-mouse-filterwarning
control-property-orderwarning

color gets a format-only check, since set_color assigns any value unclamped and a component outside 0 to 1 is legal HDR. The render parser keeps the raw string verbatim, so even a malformed literal reaches the renderer. Only an absent or empty value falls back to Color(1, 1, 1, 1).

Complex 2D GUI

renders as a composed settings/HUD panel of 22 Control types in one tree complex-2d-gui.tscn ↗ Limitation
Godot render of Complex 2D GUI Our render of Complex 2D GUI
Godot 4.6.3 Ours

A mission settings panel built from 22 Control types. It holds a header card, a scrolling column of controls, a briefing, an action row, a sector map and a status readout. An alert strip sits over everything.

The scene moves many variables at once, so it shows how Controls interact, not which one broke. Find a regression here, then pin it in the unit-* fixture of the type that owns it.

What it exercises

  • A deep container chain: MarginContainer, HSplitContainer, VBoxContainer, ScrollContainer, PanelContainer and GridContainer
  • Sliders, an OptionButton, a LineEdit and a CheckBox sized only by their grid cells
  • modulate multiplied down a nesting chain
  • StyleBoxFlat content margins inside container separations
  • A ScrollContainer that clips its content, with a scrollbar
  • A VSplitContainer beside an HSplitContainer split by size_flags_stretch_ratio
  • A CanvasLayer over the whole Control tree
  • A SubViewportContainer that shows a Control subtree
  • Wrapped Label and RichTextLabel text, with [b], [i], [u] and [color] spans
  • Theme overrides on a default theme

Known limitations

  • Approximated Text edges differ slightly from Godot's, because glyphs come from an MSDF atlas, while layout, wrap points and every non-text surface match.
  • Approximated A [u] underline sits slightly higher and softer than Godot's.
  • Approximated The [b] span reads heavier than Godot's and pushes the rest of its line slightly to the right.

ConeTwistJoint3D

renders as nothing (a transform-only group) docs ↗ source ↗ unit-cone-twist-joint-3d.tscn ↗ Linter only
No visual output — this node draws nothing to compare.

A ball-and-socket joint between two 3D physics bodies. It draws nothing at runtime, so the previewer renders it as a transform-only group (ADR-0008). Godot shows the cone only as an editor gizmo.

Linting

Strict parsing format-checks these ConeTwistJoint3D properties, plus 4 inherited from Joint3D, 17 inherited from Node3D, 10 inherited from Node. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

PropertyAcceptsOut of range
biasfloat 0.01-16warning
relaxationfloat 0.01-16warning
softnessfloat 0.01-16warning
swing_spanradians, -180° to 180°warning
twist_spanradians, -40000° to 40000°warning
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-node3d-visibility (type-family match)valid-node3d-visibilityerror
valid-joint (type-family match)joint-not-connectedwarning
joint-same-bodywarning

index.ts registers parseNode3D directly, which reads only transform and visible. An out-of-range swing_span or a malformed bias is dropped from the lenient tree rather than substituted or warned on.

ConfirmationDialog

renders as nothing yet, not implemented docs ↗ source ↗ unit-confirmation-dialog.tscn ↗ Not implemented
Comparison images not captured yet for ConfirmationDialog.

A two-button dialog with independent OK and Cancel outcomes, built on AcceptDialog. The previewer parses and validates it but does not draw it. The base Node mounts under renderIntent: 'pending' as an empty group, and its children still show (ADR-0045).

Linting

Strict parsing format-checks these ConfirmationDialog properties, plus 5 inherited from AcceptDialog, 45 inherited from Window, 47 inherited from Viewport, 10 inherited from Node. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

PropertyAcceptsOut of range
cancel_button_textquoted string, or the &"…" StringName or NodePath("…") it converts
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-window-properties (type-family match)window-max-size-below-min-sizeinfo
window-size-clamped-by-limitswarning
window-content-scale-factor-flooredwarning

The lenient parser registers the plain Node reader, which reads only the heading attributes and an optional transform. A bad cancel_button_text is never read, substituted or reported on the lenient path.

Known limitations

  • Not drawn Godot displays the dialog once popped up, but the previewer draws nothing for it.

Container

renders as nothing of its own; children stay at their own free/anchored rects docs ↗ source ↗ unit-container.tscn ↗ Unreviewed
Comparison images not captured yet for Container.

Container is the base every layout container extends. It draws no chrome. A bare Container also imposes no layout, because Godot's _notification has no NOTIFICATION_SORT_CHILDREN arm for it, so its children lay out as free Controls do.

Linting

Strict parsing format-checks the inherited set (53 inherited from Control, 16 inherited from CanvasItem, 10 inherited from Node); Container declares none of its own. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-canvasitem-clip-ancestry (type-family match)canvasitem-ancestor-clips-childrenwarning
canvasitem-ancestor-is-canvasgroupwarning
valid-control-properties (type-family match)control-tooltip-ignored-by-mouse-filterwarning
control-property-orderwarning
valid-container-scriptcontainer-no-scriptwarning

Container registers no validators or rules of its own, so the strict and lenient parsers agree on every property. The registered base parser reads each property without substitution.

Control

renders as a full-rect layout region docs ↗ source ↗ unit-control-state.tscn ↗ Done
Godot render of Control Our render of Control
Godot 4.6.3 Ours

Control is the base UI node. It draws nothing of its own. A Control directly under it anchors against its rect. One separated from it by another node anchors against that node instead. Where that node is not a canvas item, the Control is a canvas root. It anchors against the viewport and draws after everything under the root it hangs in.

top_level makes it a canvas root wherever it sits. Nothing above it then composes onto it: no transform, no tint, no z, no rect to anchor against and no container layout. Visibility is the exception, since it follows the scene tree rather than the canvas parenting. A hidden ancestor still hides a top_level Control, while a non-canvas-item ancestor between them releases it again.

layout_direction resolves to one answer per node. An explicit LTR or RTL answers from the value alone. INHERITED climbs to the nearest ancestor Control or Window and steps over every other node type. That includes a SubViewport, so the Controls inside one inherit the direction of the Control that encloses the viewport. At the top of the tree it falls back to internationalization/rendering/root_node_layout_direction and the project's test locale. A right-to-left Control is mirrored inside its parent, and an HBoxContainer also reverses its children.

Linting

Strict parsing format-checks these Control properties, plus 16 inherited from CanvasItem, 10 inherited from Node. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

PropertyAcceptsOut of range
accessibility_controls_nodesArrayNodePath, …]) or [NodePath("path") or "path", …]
accessibility_described_by_nodesArrayNodePath, …]) or [NodePath("path") or "path", …]
accessibility_descriptionquoted string, or the &"…" StringName or NodePath("…") it converts
accessibility_flow_to_nodesArrayNodePath, …]) or [NodePath("path") or "path", …]
accessibility_labeled_by_nodesArrayNodePath, …]) or [NodePath("path") or "path", …]
accessibility_liveenum 0-2 (OFF/POLITE/ASSERTIVE)warning
accessibility_namequoted string, or the &"…" StringName or NodePath("…") it converts
anchor_bottomfloat
anchor_leftfloat
anchor_rightfloat
anchor_topfloat
anchors_presetinteger -1-15error
clip_contentstrue or false
custom_minimum_sizeVector2(x, y), or the Vector2i spelling Godot converts
focus_behavior_recursiveenum 0-2 (INHERITED/DISABLED/ENABLED)error
focus_modeenum 0-3 (NONE/CLICK/ALL/ACCESSIBILITY)error
focus_neighbor_bottomNodePath("path/to/node")
focus_neighbor_leftNodePath("path/to/node")
focus_neighbor_rightNodePath("path/to/node")
focus_neighbor_topNodePath("path/to/node")
focus_nextNodePath("path/to/node")
focus_previousNodePath("path/to/node")
grow_horizontalinteger 0-2error
grow_verticalinteger 0-2error
layout_directionenum 0-4 (INHERITED/APPLICATION_LOCALE/LTR/RTL/SYSTEM_LOCALE)error
layout_modeinteger 0-3warning
localize_numeral_systemtrue or false
mouse_behavior_recursiveenum 0-2 (INHERITED/DISABLED/ENABLED)error
mouse_default_cursor_shapeenum 0-16 (ARROW/IBEAM/POINTING_HAND/CROSS/WAIT/BUSY/DRAG/CAN_DROP/FORBIDDEN/VSIZE/HSIZE/BDIAGSIZE/FDIAGSIZE/MOVE/VSPLIT/HSPLIT/HELP)error
mouse_filterenum 0-2 (STOP/PASS/IGNORE)error
mouse_force_pass_scroll_eventstrue or false
offset_bottomfloat
offset_leftfloat
offset_rightfloat
offset_topfloat
pivot_offsetVector2(x, y), or the Vector2i spelling Godot converts
pivot_offset_ratioVector2(x, y), or the Vector2i spelling Godot converts
rotationfloat
scaleVector2(x, y), or the Vector2i spelling Godot converts
shortcut_contextnull or NodePath("path/to/node")
size_flags_horizontalbit mask of SIZE_FILL (1) | SIZE_EXPAND (2) | SIZE_SHRINK_CENTER (4) | SIZE_SHRINK_END (8)
size_flags_stretch_ratiofloat >= 0warning below
size_flags_verticalbit mask of SIZE_FILL (1) | SIZE_EXPAND (2) | SIZE_SHRINK_CENTER (4) | SIZE_SHRINK_END (8)
themenull, SubResource("id"), ExtResource("id") or Resource("path")
theme_override_colors/*Color(r, g, b, a), or the colour string or int it converts
theme_override_constants/*integer -16384-16384warning
theme_override_font_sizes/*integer >= 1warning below
theme_override_fonts/*null, SubResource("id"), ExtResource("id") or Resource("path")
theme_override_icons/*null, SubResource("id"), ExtResource("id") or Resource("path")
theme_override_styles/*null, SubResource("id"), ExtResource("id") or Resource("path")
theme_type_variationquoted string or &"name"
tooltip_auto_translate_modeenum 0-2 (INHERIT/ALWAYS/DISABLED)warning
tooltip_textquoted string, or the &"…" StringName or NodePath("…") it converts
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-canvasitem-clip-ancestry (type-family match)canvasitem-ancestor-clips-childrenwarning
canvasitem-ancestor-is-canvasgroupwarning
valid-control-properties (type-family match)control-tooltip-ignored-by-mouse-filterwarning
control-property-orderwarning

Most layout and theme keys go through the parseOptional* family. An absent or malformed anchor_left, offset_top, rotation, scale, pivot_offset, custom_minimum_size or size_flags_* becomes undefined with no warning, and the renderer applies its own default. theme_override_styles/* is stored unparsed. visible is true for anything other than a value that reads as false.

Known limitations

  • Approximated A Control set to SYSTEM_LOCALE, or to APPLICATION_LOCALE with no internationalization/locale/test, draws left-to-right, since the scene files hold no machine locale.
  • Approximated A Control below a Window inherits its direction from the Control above that Window, where Godot takes the Window's own layout_direction.
  • Approximated Text is always shaped left-to-right, so a Label, Button title or ItemList row in a right-to-left script draws its characters in code-point order.
  • Approximated A widget's per-node text_direction is not read, so a value other than its AUTO default (label.h:70, line_edit.h:144, text_edit.h:327, rich_text_label.h:615) has no effect.
  • Needs runtime The direction also drives hit-testing, keyboard and drag in TabBar, Tree, ItemList, the sliders and the text controls, which a frozen frame never exercises.

ConvertTransformModifier3D

renders as nothing yet, Godot remaps a reference value onto an apply bone, the previewer does not docs ↗ source ↗ unit-convert-transform-modifier-3d.tscn ↗ Not implemented
No visual output — this node draws nothing to compare.

Reads one scalar off a reference bone or node: a position, a roll or a scale. It remaps that value from the reference range onto the apply range, and writes it as another kind of transform on the apply bone. Godot runs it each frame, and the previewer does not yet (ADR-0045). The bones hold their rest pose.

Linting

Strict parsing format-checks these ConvertTransformModifier3D properties, plus 1 inherited from BoneConstraint3D, 2 inherited from SkeletonModifier3D, 17 inherited from Node3D, 10 inherited from Node. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

PropertyAcceptsOut of range
setting_countinteger >= 0error below
settings/*per-setting apply/ and reference/ transform_mode, axis, range_min, range_max, plus relative, additive and the BoneConstraint3D leaves
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-node3d-visibility (type-family match)valid-node3d-visibilityerror
valid-skeletonmodifier3d-parent (type-family match)skeletonmodifier3d-parent-not-skeleton3dwarning
valid-converttransformmodifier3d-ranges (type-family match)converttransformmodifier3d-range-outside-mode-hintwarning

ConvertTransformModifier3D registers parseNode3D directly, so setting_count and every settings/<i>/ leaf is validated but never read into the scene tree. An out-of-range range_min is reported as a warning and then dropped rather than substituted.

CopyTransformModifier3D

renders as nothing yet, Godot copies a reference transform onto an apply bone, the previewer does not docs ↗ source ↗ unit-copy-transform-modifier-3d.tscn ↗ Not implemented
No visual output — this node draws nothing to compare.

Copies a reference bone's or node's transform onto an apply bone each frame, masked per component and per axis by its settings/<i>/ entries. Godot runs that copy, and the previewer does not yet (ADR-0045): the bones hold their rest pose.

Linting

Strict parsing format-checks these CopyTransformModifier3D properties, plus 2 inherited from SkeletonModifier3D, 17 inherited from Node3D, 10 inherited from Node. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

PropertyAcceptsOut of range
setting_countinteger >= 0error below
settings/#/*per-setting copy, axes and invert bit masks, plus relative and additive
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-node3d-visibility (type-family match)valid-node3d-visibilityerror
valid-skeletonmodifier3d-parent (type-family match)skeletonmodifier3d-parent-not-skeleton3dwarning

CopyTransformModifier3D registers parseNode3D directly, so setting_count and every settings/<i>/ leaf is validated but never read into the scene tree. A copy, axes or invert bit outside the three-bit flag list is a warning strict reports and lenient drops.

CPUParticles2D

renders as one merged quad mesh holding a frozen particle pose docs ↗ source ↗ unit-cpuparticles2d.tscn ↗ Done

CPUParticles2D is Godot's CPU-simulated emitter. The previewer runs a port of the engine's own simulation once, PCG32 generator included. It draws the result as one merged quad mesh that holds a frozen pose.

Godot render of CPUParticles2D Our render of CPUParticles2D
Godot 4.6.3 Ours

Emission shapes

Done
Godot render of Emission shapes Our render of Emission shapes
Godot 4.6.3 Ours

Point, Sphere, Sphere Surface and Rectangle side by side. With use_fixed_seed and preprocess set, every particle lands where Godot's does.

Curves

Done
Godot render of Curves Our render of Curves
Godot 4.6.3 Ours

The min, max and curve parameter mechanism, on scale_amount and angle.

Colour ramps

Done
Godot render of Colour ramps Our render of Colour ramps
Godot 4.6.3 Ours

color_ramp fades each particle by age, and color_initial_ramp picks one colour at birth.

local_coords

Done
Godot render of local_coords Our render of local_coords
Godot 4.6.3 Ours

A scaled emitter's particles do not scale with it by default, in Godot as here.

No preprocess

Done
Godot render of No preprocess Our render of No preprocess
Godot 4.6.3 Ours

An emitter that authors no preprocess names no instant, so the previewer picks one lifetime, where a continuous emitter reaches steady state. It halves that for a one_shot burst, so the burst is caught mid-flight. This fixture's lifetime is 0.95 s, and both images show that instant. The Godot image comes from pnpm ref:godot … --particles 0.95. Godot holds speed_scale at 1 through that advance, so the instant is the same at any speed_scale.

emitting = false

Done
Godot render of emitting = false Our render of emitting = false
Godot 4.6.3 Ours

Godot draws nothing for an emitter that is neither active nor emitting, and neither does the previewer. An empty frame here is the correct frame.

Linting

Strict parsing format-checks these CPUParticles2D properties, plus 12 inherited from Node2D, 16 inherited from CanvasItem, 10 inherited from Node. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

PropertyAcceptsOut of range
amountinteger 1-1000000error below, warning above
angle_curvenull, SubResource("id"), ExtResource("id") or Resource("path")
angle_maxfloat
angle_minfloat
angular_velocity_curvenull, SubResource("id"), ExtResource("id") or Resource("path")
angular_velocity_maxfloat
angular_velocity_minfloat
anim_offset_curvenull, SubResource("id"), ExtResource("id") or Resource("path")
anim_offset_maxfloat 0-1warning
anim_offset_minfloat 0-1warning
anim_speed_curvenull, SubResource("id"), ExtResource("id") or Resource("path")
anim_speed_maxfloat
anim_speed_minfloat
colorColor(r, g, b, a), or the colour string or int it converts
color_initial_rampnull, SubResource("id"), ExtResource("id") or Resource("path")
color_rampnull, SubResource("id"), ExtResource("id") or Resource("path")
damping_curvenull, SubResource("id"), ExtResource("id") or Resource("path")
damping_maxfloat >= 0warning below
damping_minfloat >= 0warning below
directionVector2(x, y), or the Vector2i spelling Godot converts
draw_orderenum 0-1 (INDEX/LIFETIME)warning
emission_colorsPackedColorArray(r, g, b, a, …)
emission_normalsPackedVector2Array(x, y, …)
emission_pointsPackedVector2Array(x, y, …)
emission_rect_extentsVector2(x, y), or the Vector2i spelling Godot converts
emission_ring_inner_radiusfloat
emission_ring_radiusfloat
emission_shapeenum 0-6 (POINT/SPHERE/SPHERE_SURFACE/RECTANGLE/POINTS/DIRECTED_POINTS/RING)error
emission_sphere_radiusfloat 0.01-128warning
emittingtrue or false
explosivenessfloat 0-1warning
fixed_fpsinteger 0-1000warning
fract_deltatrue or false
gravityVector2(x, y), or the Vector2i spelling Godot converts
hue_variation_curvenull, SubResource("id"), ExtResource("id") or Resource("path")
hue_variation_maxfloat -1-1warning
hue_variation_minfloat -1-1warning
initial_velocity_maxfloat >= 0warning below
initial_velocity_minfloat >= 0warning below
lifetimefloat >= 0.01error at or below 0, warning below 0.01
lifetime_randomnessfloat 0-1warning
linear_accel_curvenull, SubResource("id"), ExtResource("id") or Resource("path")
linear_accel_maxfloat
linear_accel_minfloat
local_coordstrue or false
one_shottrue or false
orbit_velocity_curvenull, SubResource("id"), ExtResource("id") or Resource("path")
orbit_velocity_maxfloat
orbit_velocity_minfloat
particle_flag_align_ytrue or false
preprocessfloat >= 0warning below
radial_accel_curvenull, SubResource("id"), ExtResource("id") or Resource("path")
radial_accel_maxfloat
radial_accel_minfloat
randomnessfloat 0-1warning
scale_amount_curvenull, SubResource("id"), ExtResource("id") or Resource("path")
scale_amount_maxfloat >= 0warning below
scale_amount_minfloat >= 0warning below
scale_curve_xnull, SubResource("id"), ExtResource("id") or Resource("path")
scale_curve_ynull, SubResource("id"), ExtResource("id") or Resource("path")
seedinteger 0-4294967295warning
speed_scalefloat 0-64warning
split_scaletrue or false
spreadfloat 0-180warning
tangential_accel_curvenull, SubResource("id"), ExtResource("id") or Resource("path")
tangential_accel_maxfloat
tangential_accel_minfloat
texturenull, SubResource("id"), ExtResource("id") or Resource("path")
use_fixed_seedtrue or false
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-canvasitem-clip-ancestry (type-family match)canvasitem-ancestor-clips-childrenwarning
canvasitem-ancestor-is-canvasgroupwarning
valid-cpuparticles2d-propertiescpuparticles2d-nondeterministic-emission-shapeinfo
cpuparticles2d-param-min-above-maxwarning

Where strict rejects a value, the lenient parser substitutes Godot's constructor default. lifetime reads as 1.0, spread as 45.0, a malformed gravity as Vector2(0, 980) and an out-of-range emission_shape as POINT. An amount below 1 clamps to 1. draw_order is not range-checked, since Godot's setter accepts any int and reads everything but 1 as Index.

Known limitations

  • Needs runtime The emitter runs in Godot and freezes here, at Godot's own preprocess moment or else at the substituted window described above.
  • Approximated An emitter without use_fixed_seed takes a fixed constant seed, so its particles sit in plausible places where Godot randomises them on every run.
  • Approximated split_scale, scale_curve_x and scale_curve_y are not read, so a quad stretched on one axis draws square.
  • Approximated emission_shape POINTS, DIRECTED_POINTS and RING sample Godot's process-wide RNG, so they emit from the origin here and raise a warning.

CPUParticles3D

renders as nothing yet, not implemented docs ↗ source ↗ unit-cpu-particles-3d.tscn ↗ Not implemented
Comparison images not captured yet for CPUParticles3D.

A CPU-simulated particle emitter that draws its mesh once per live particle. The previewer does not draw the cloud yet, so the node is an invisible transform-only fallback and its children still show.

Linting

Strict parsing format-checks these CPUParticles3D properties, plus 18 inherited from GeometryInstance3D, 1 inherited from VisualInstance3D, 17 inherited from Node3D, 10 inherited from Node. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

PropertyAcceptsOut of range
amountinteger 1-1000000error below, warning above
angle_curvenull, SubResource("id"), ExtResource("id") or Resource("path")
angle_maxfloat
angle_minfloat
angular_velocity_curvenull, SubResource("id"), ExtResource("id") or Resource("path")
angular_velocity_maxfloat
angular_velocity_minfloat
anim_offset_curvenull, SubResource("id"), ExtResource("id") or Resource("path")
anim_offset_maxfloat 0-1warning
anim_offset_minfloat 0-1warning
anim_speed_curvenull, SubResource("id"), ExtResource("id") or Resource("path")
anim_speed_maxfloat
anim_speed_minfloat
colorColor(r, g, b, a), or the colour string or int it converts
color_initial_rampnull, SubResource("id"), ExtResource("id") or Resource("path")
color_rampnull, SubResource("id"), ExtResource("id") or Resource("path")
damping_curvenull, SubResource("id"), ExtResource("id") or Resource("path")
damping_maxfloat >= 0warning below
damping_minfloat >= 0warning below
directionVector3(x, y, z), or the Vector3i spelling Godot converts
draw_orderenum 0-2 (INDEX/LIFETIME/VIEW_DEPTH)error
emission_box_extentsVector3(x, y, z), or the Vector3i spelling Godot converts
emission_colorsPackedColorArray(r, g, b, a, …)
emission_normalsPackedVector3Array(x, y, z, …)
emission_pointsPackedVector3Array(x, y, z, …)
emission_ring_axisVector3(x, y, z), or the Vector3i spelling Godot converts
emission_ring_cone_anglefloat 0-90warning
emission_ring_heightfloat >= 0warning below
emission_ring_inner_radiusfloat >= 0warning below
emission_ring_radiusfloat >= 0warning below
emission_shapeenum 0-6 (POINT/SPHERE/SPHERE_SURFACE/BOX/POINTS/DIRECTED_POINTS/RING)error
emission_sphere_radiusfloat 0.01-128warning
emittingtrue or false
explosivenessfloat 0-1warning
fixed_fpsinteger 0-1000warning
flatnessfloat 0-1warning
fract_deltatrue or false
gravityVector3(x, y, z), or the Vector3i spelling Godot converts
hue_variation_curvenull, SubResource("id"), ExtResource("id") or Resource("path")
hue_variation_maxfloat -1-1warning
hue_variation_minfloat -1-1warning
initial_velocity_maxfloat >= 0warning below
initial_velocity_minfloat >= 0warning below
lifetimefloat >= 0.01error at or below 0, warning below 0.01
lifetime_randomnessfloat 0-1warning
linear_accel_curvenull, SubResource("id"), ExtResource("id") or Resource("path")
linear_accel_maxfloat
linear_accel_minfloat
local_coordstrue or false
meshnull, SubResource("id"), ExtResource("id") or Resource("path")
one_shottrue or false
orbit_velocity_curvenull, SubResource("id"), ExtResource("id") or Resource("path")
orbit_velocity_maxfloat
orbit_velocity_minfloat
particle_flag_align_ytrue or false
particle_flag_disable_ztrue or false
particle_flag_rotate_ytrue or false
preprocessfloat >= 0warning below
radial_accel_curvenull, SubResource("id"), ExtResource("id") or Resource("path")
radial_accel_maxfloat
radial_accel_minfloat
randomnessfloat 0-1warning
scale_amount_curvenull, SubResource("id"), ExtResource("id") or Resource("path")
scale_amount_maxfloat >= 0warning below
scale_amount_minfloat >= 0warning below
scale_curve_xnull, SubResource("id"), ExtResource("id") or Resource("path")
scale_curve_ynull, SubResource("id"), ExtResource("id") or Resource("path")
scale_curve_znull, SubResource("id"), ExtResource("id") or Resource("path")
seedinteger 0-4294967295warning
speed_scalefloat 0-64warning
split_scaletrue or false
spreadfloat 0-180warning
tangential_accel_curvenull, SubResource("id"), ExtResource("id") or Resource("path")
tangential_accel_maxfloat
tangential_accel_minfloat
use_fixed_seedtrue or false
visibility_aabbAABB(x, y, z, w, h, d)
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-node3d-visibility (type-family match)valid-node3d-visibilityerror
valid-geometryinstance3d-visibility-range (type-family match)geometryinstance3d-visibility-range-end-before-beginwarning
geometryinstance3d-visibility-range-begin-fade-without-marginwarning
geometryinstance3d-visibility-range-end-fade-without-marginwarning
valid-cpuparticles3d-propertiescpuparticles3d-requires-meshwarning
cpuparticles3d-param-min-above-maxwarning

The lenient parser reads the GeometryInstance3D base, visibility_aabb and whether a mesh is set. Together these give the box that the scene cull measures the emitter by. It reads no other CPUParticles3D key, so a spread = 400.0 is dropped silently, and linter.ts ports the "no mesh assigned" configuration warning.

Known limitations

  • Not drawn Godot draws the live particle cloud, but here nothing appears.
  • Needs runtime An emitter with a mesh and no visibility_aabb stays hidden with its visibility dependants, where Godot culls it by its live particles.

CSGBox3D

renders as a solid box mesh docs ↗ source ↗ unit-csg-box.tscn ↗ Done
Godot render of CSGBox3D Our render of CSGBox3D
Godot 4.6.3 Ours

Godot's constructive-solid-geometry box. The previewer draws it as a box with its StandardMaterial3D and evaluates the boolean operation (ADR-0027). A box inside a CSG root adds to that root's result instead of drawing itself.

Linting

Strict parsing format-checks these CSGBox3D properties, plus 1 inherited from CSGPrimitive3D, 6 inherited from CSGShape3D, 18 inherited from GeometryInstance3D, 1 inherited from VisualInstance3D, 17 inherited from Node3D, 10 inherited from Node. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

PropertyAcceptsOut of range
materialnull, SubResource("id"), ExtResource("id") or Resource("path")
sizeVector3(x, y, z), or the Vector3i spelling Godot converts
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-node3d-visibility (type-family match)valid-node3d-visibilityerror
valid-csgshape3d-own-geometry (type-family match)csgmesh3d-requires-meshinfo
csgpolygon3d-insufficient-pointsinfo
valid-geometryinstance3d-visibility-range (type-family match)geometryinstance3d-visibility-range-end-before-beginwarning
geometryinstance3d-visibility-range-begin-fade-without-marginwarning
geometryinstance3d-visibility-range-end-fade-without-marginwarning

The lenient parser keeps the default size of (1, 1, 1) when the key is absent. It warns and keeps that default when the value is unparseable. operation is read with parseOptionalInt, so it warns neither way, and material is copied through unvalidated.

CSGCombiner3D

renders as a grouping node whose children fold into one solid docs ↗ source ↗ Limitation

The only CSG node with no shape of its own. It exists so a set of CSG children folds into one solid, which then combines into its parent by its own operation. The previewer evaluates the boolean at the CSG root (ADR-0027), so only the root draws a mesh. Clicking the result selects the root, as in Godot's editor.

Grouping and visibility

Done
Godot render of Grouping and visibility Our render of Grouping and visibility
Godot 4.6.3 Ours

A combiner under a StaticBody3D holding two CSGBox3D children, plus a hidden combiner whose sphere never draws. Both images show the slab, the raised step and no sphere.

Union, subtraction, intersection

Done
Godot render of Union, subtraction, intersection Our render of Union, subtraction, intersection
Godot 4.6.3 Ours

Three identical box-plus-sphere pairs differing only in the sphere's operation. Left to right: union bulges out of the box, subtraction bites a cavity into it, intersection leaves only the lens where the two overlap.

One surface per material

Limitation
Godot render of One surface per material Our render of One surface per material
Godot 4.6.3 Ours

Three contributions with three materials come out as three surfaces on one mesh, as Godot interns each material per root. The subtracted cavity carries the subtracting node's red, not the shell's green.

  • Approximated The rim's shadow along the top of the cavity reaches further towards the left than in Godot.

Transparency through a boolean result

Done
Godot render of Transparency through a boolean result Our render of Transparency through a boolean result
Godot 4.6.3 Ours

A subtraction whose result carries a transparent material, so the hole is seen through glass. The glass panel, the hole and the opaque half match in both images.

Linting

Strict parsing format-checks the inherited set (6 inherited from CSGShape3D, 18 inherited from GeometryInstance3D, 1 inherited from VisualInstance3D, 17 inherited from Node3D, 10 inherited from Node); CSGCombiner3D declares none of its own. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-node3d-visibility (type-family match)valid-node3d-visibilityerror
valid-csgshape3d-own-geometry (type-family match)csgmesh3d-requires-meshinfo
csgpolygon3d-insufficient-pointsinfo
valid-geometryinstance3d-visibility-range (type-family match)geometryinstance3d-visibility-range-end-before-beginwarning
geometryinstance3d-visibility-range-begin-fade-without-marginwarning
geometryinstance3d-visibility-range-end-fade-without-marginwarning

The combiner's only validated property is operation. The lenient parser reads it with parseOptionalInt and warns neither when absent nor when unparseable. The shared Node3D validator listed above handles its visible flag.

CSGCylinder3D

renders as a solid cylinder or cone mesh docs ↗ source ↗ unit-csg-cylinder.tscn ↗ Done
Godot render of CSGCylinder3D Our render of CSGCylinder3D
Godot 4.6.3 Ours

A CSG cylinder, drawn as a solid cylinder or as a cone when cone is set. The geometry is a port of Godot's own _build_brush, so the tessellation and the apex normals match, and the boolean operation is evaluated (ADR-0027).

Linting

Strict parsing format-checks these CSGCylinder3D properties, plus 1 inherited from CSGPrimitive3D, 6 inherited from CSGShape3D, 18 inherited from GeometryInstance3D, 1 inherited from VisualInstance3D, 17 inherited from Node3D, 10 inherited from Node. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

PropertyAcceptsOut of range
conetrue or false
heightfloat >= 0.001warning below
materialnull, SubResource("id"), ExtResource("id") or Resource("path")
radiusfloat >= 0.001warning below
sidesinteger 3-64error below, warning above
smooth_facestrue or false
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-node3d-visibility (type-family match)valid-node3d-visibilityerror
valid-csgshape3d-own-geometry (type-family match)csgmesh3d-requires-meshinfo
csgpolygon3d-insufficient-pointsinfo
valid-geometryinstance3d-visibility-range (type-family match)geometryinstance3d-visibility-range-end-before-beginwarning
geometryinstance3d-visibility-range-begin-fade-without-marginwarning
geometryinstance3d-visibility-range-end-fade-without-marginwarning

The lenient parser falls back silently when a key is absent. When a key is unparseable, it warns and falls back: radius to 0.5, height to 2.0, sides to 8. cone is a raw === 'true' comparison, so any other value silently becomes false. operation is read with parseOptionalInt and warns neither way.

CSGMesh3D

renders as a solid built from an arbitrary Mesh resource docs ↗ source ↗ unit-csg-mesh.tscn ↗ Limitation
Godot render of CSGMesh3D Our render of CSGMesh3D
Godot 4.6.3 Ours

The CSG shape whose solid comes from a Mesh resource, so any mesh can take part in a boolean. The previewer builds the solid from the triangle surfaces of an inline or .tres PrimitiveMesh or ArrayMesh. Each face takes the node's material, else its own surface's material, as in Godot.

Linting

Strict parsing format-checks these CSGMesh3D properties, plus 1 inherited from CSGPrimitive3D, 6 inherited from CSGShape3D, 18 inherited from GeometryInstance3D, 1 inherited from VisualInstance3D, 17 inherited from Node3D, 10 inherited from Node. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

PropertyAcceptsOut of range
materialnull, SubResource("id"), ExtResource("id") or Resource("path")
meshnull, SubResource("id"), ExtResource("id") or Resource("path")
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-node3d-visibility (type-family match)valid-node3d-visibilityerror
valid-csgshape3d-own-geometry (type-family match)csgmesh3d-requires-meshinfo
csgpolygon3d-insufficient-pointsinfo
valid-geometryinstance3d-visibility-range (type-family match)geometryinstance3d-visibility-range-end-before-beginwarning
geometryinstance3d-visibility-range-begin-fade-without-marginwarning
geometryinstance3d-visibility-range-end-fade-without-marginwarning

The linter warns (resource-type-excluded-by-hint) when mesh holds a class its hint excludes: a PlaneMesh, PointMesh, QuadMesh or RibbonTrailMesh. Godot's editor never offers such a class, and the setter keeps it without a warning (csg_shape.cpp:1302-1316).

The lenient parser copies mesh through only when present. An absent one leaves the node with no solid, which is Godot's empty brush and not an error. flip_faces warns then falls back to false when unparseable. Neither side rejects a non-manifold mesh such as PlaneMesh, since Godot excludes those only in its property hint.

Known limitations

  • Approximated The thin lit band along the capsule's shaded flank reads fainter than in Godot.

CSGPolygon3D

renders as a 2D profile swept into a solid docs ↗ source ↗ Limitation

A 2D profile swept into a 3D solid: extruded straight back (DEPTH), revolved about +Y (SPIN) or carried along a Path3D (PATH), chosen by mode. The previewer implements all three as a port of Godot's _build_brush and evaluates the boolean operation (ADR-0027).

Extrusion (mode = DEPTH)

Done
Godot render of Extrusion (mode = DEPTH) Our render of Extrusion (mode = DEPTH)
Godot 4.6.3 Ours

The default mode. The profile sits at z = 0 and extrudes toward -Z, so the solid spans [-depth, 0]. A wedge, a concave staircase, a smooth-walled blob and a default unit square all match.

Revolution (mode = SPIN)

Done
Godot render of Revolution (mode = SPIN) Our render of Revolution (mode = SPIN)
Godot 4.6.3 Ours

The profile revolves about +Y. A quarter turn keeps both end caps, and a full 360 degrees closes the surface on itself with no caps at all, as in Godot.

Path sweep (mode = PATH)

Limitation
Godot render of Path sweep (mode = PATH) Our render of Path sweep (mode = PATH)
Godot 4.6.3 Ours

The profile is carried along the Path3D named by path_node, resolved as a sibling or a child. The road and the rail follow their curves in both images.

  • Approximated path_rotation = 2 (PATH_FOLLOW) renders as PATH, so the profile does not tilt where the path banks.
  • Approximated path_rotation_accurate = true renders as false.
  • Approximated The curve takes a fixed 16 segments per span, not bake_interval, so the extrusion count can differ by one on a tight span.

Linting

Strict parsing format-checks these CSGPolygon3D properties, plus 1 inherited from CSGPrimitive3D, 6 inherited from CSGShape3D, 18 inherited from GeometryInstance3D, 1 inherited from VisualInstance3D, 17 inherited from Node3D, 10 inherited from Node. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

PropertyAcceptsOut of range
depthfloat >= 0.01error below 0.001, warning below 0.01
materialnull, SubResource("id"), ExtResource("id") or Resource("path")
modeenum 0-2 (DEPTH/SPIN/PATH)warning
path_continuous_utrue or false
path_intervalfloat >= 0.01warning below
path_interval_typeenum 0-1 (DISTANCE/SUBDIVIDE)warning
path_joinedtrue or false
path_localtrue or false
path_nodeNodePath("path/to/node")
path_rotationenum 0-2 (POLYGON/PATH/PATH_FOLLOW)warning
path_rotation_accuratetrue or false
path_simplify_anglefloat 0-180warning
path_u_distancefloat >= 0warning below
polygonPackedVector2Array(x, y, …)
smooth_facestrue or false
spin_degreesfloat 1-360error below 0.01, warning below 1, error above 360
spin_sidesinteger 3-64error below, warning above
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-node3d-visibility (type-family match)valid-node3d-visibilityerror
valid-csgshape3d-own-geometry (type-family match)csgmesh3d-requires-meshinfo
csgpolygon3d-insufficient-pointsinfo
valid-geometryinstance3d-visibility-range (type-family match)geometryinstance3d-visibility-range-end-before-beginwarning
geometryinstance3d-visibility-range-begin-fade-without-marginwarning
geometryinstance3d-visibility-range-end-fade-without-marginwarning

The lenient parser falls back silently when a key is absent, and warns then falls back when it is unparseable. A broken polygon yields the default unit square, and a broken depth its 1.0. A path_node that resolves to no Path3D, or a curve with fewer than two points, renders empty on both sides and is reported by neither.

CSGSphere3D

renders as a solid sphere mesh docs ↗ source ↗ unit-csg-sphere.tscn ↗ Done
Godot render of CSGSphere3D Our render of CSGSphere3D
Godot 4.6.3 Ours

A constructive-solid-geometry sphere. The previewer draws it as a solid sphere with its StandardMaterial3D and evaluates the boolean operation (ADR-0027). A sphere inside a CSG root adds to that root's result.

Linting

Strict parsing format-checks these CSGSphere3D properties, plus 1 inherited from CSGPrimitive3D, 6 inherited from CSGShape3D, 18 inherited from GeometryInstance3D, 1 inherited from VisualInstance3D, 17 inherited from Node3D, 10 inherited from Node. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

PropertyAcceptsOut of range
materialnull, SubResource("id"), ExtResource("id") or Resource("path")
radial_segmentsinteger 4-100error below, warning above
radiusfloat 0.001-100error at or below 0, warning below 0.001, warning above 100
ringsinteger 1-100error below, warning above
smooth_facestrue or false
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-node3d-visibility (type-family match)valid-node3d-visibilityerror
valid-csgshape3d-own-geometry (type-family match)csgmesh3d-requires-meshinfo
csgpolygon3d-insufficient-pointsinfo
valid-geometryinstance3d-visibility-range (type-family match)geometryinstance3d-visibility-range-end-before-beginwarning
geometryinstance3d-visibility-range-begin-fade-without-marginwarning
geometryinstance3d-visibility-range-end-fade-without-marginwarning

The lenient parser falls back silently when a key is absent. When a key is unparseable, it warns and falls back: radius to 0.5, radial_segments to 12, rings to 6. operation is read with parseOptionalInt and warns neither way, and material is copied through unvalidated.

CSGTorus3D

renders as a solid torus mesh docs ↗ source ↗ unit-csg-torus.tscn ↗ Done
Godot render of CSGTorus3D Our render of CSGTorus3D
Godot 4.6.3 Ours

Godot's constructive-solid-geometry torus: a ring lying in XZ with the hole on +Y. The previewer builds it from a port of Godot's own _build_brush, so the tessellation and the smooth_faces normals match per vertex. It evaluates the boolean operation (ADR-0027).

Linting

Strict parsing format-checks these CSGTorus3D properties, plus 1 inherited from CSGPrimitive3D, 6 inherited from CSGShape3D, 18 inherited from GeometryInstance3D, 1 inherited from VisualInstance3D, 17 inherited from Node3D, 10 inherited from Node. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

PropertyAcceptsOut of range
inner_radiusfloat >= 0.001warning below
materialnull, SubResource("id"), ExtResource("id") or Resource("path")
outer_radiusfloat >= 0.001warning below
ring_sidesinteger 3-64error below, warning above
sidesinteger 3-64error below, warning above
smooth_facestrue or false
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-node3d-visibility (type-family match)valid-node3d-visibilityerror
valid-csgshape3d-own-geometry (type-family match)csgmesh3d-requires-meshinfo
csgpolygon3d-insufficient-pointsinfo
valid-geometryinstance3d-visibility-range (type-family match)geometryinstance3d-visibility-range-end-before-beginwarning
geometryinstance3d-visibility-range-begin-fade-without-marginwarning
geometryinstance3d-visibility-range-end-fade-without-marginwarning

The lenient parser falls back silently when a key is absent, and warns then falls back when it is unparseable. inner_radius falls back to 0.5, outer_radius to 1.0, sides to 8 and ring_sides to 6. smooth_faces falls back to true and flip_faces to false. Equal radii are not an error on either side, since Godot returns an empty brush and so does the previewer. operation is read with parseOptionalInt and warns neither way.

DampedSpringJoint2D

renders as nothing (a transform-only group) docs ↗ source ↗ unit-damped-spring-joint-2d.tscn ↗ Linter only
No visual output — this node draws nothing to compare.

Connects two 2D physics bodies with a spring-like force. Godot shows the spring only as an editor gizmo, so the previewer renders it as a transform-only group (ADR-0008) and its children still show.

Linting

Strict parsing format-checks these DampedSpringJoint2D properties, plus 4 inherited from Joint2D, 12 inherited from Node2D, 16 inherited from CanvasItem, 10 inherited from Node. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

PropertyAcceptsOut of range
dampingfloat 0.01-16warning
lengthfloat 1-65535warning
rest_lengthfloat 0-65535warning
stiffnessfloat 0.1-64warning
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-canvasitem-clip-ancestry (type-family match)canvasitem-ancestor-clips-childrenwarning
canvasitem-ancestor-is-canvasgroupwarning
valid-joint (type-family match)joint-not-connectedwarning
joint-same-bodywarning

The lenient parser reuses parseNode2D, which reads only Node2D's own keys, so a malformed stiffness never reaches node.properties. Only the raw text survives on node.rawProperties.

Decal

renders as a texture projected onto the surfaces its box intersects docs ↗ source ↗ Limitation

Godot's texture projector: it casts texture_albedo down the node's local -Y axis onto the surfaces inside its size box, blended onto the lit surface.

Projection

Limitation
Godot render of Projection Our render of Projection
Godot 4.6.3 Ours

The previewer bakes the same projection onto each mesh the box overlaps and shades it with the scene's lights, honouring cull_mask and the three fades. The projection samples its texture clamped, as Godot samples the decal atlas: the blit disables repeat (copy_effects.cpp:592), and fragments outside the box are discarded (scene_forward_clustered.glsl:1585-1587).

Texture wrappers

Done
Godot render of Texture wrappers Our render of Texture wrappers
Godot 4.6.3 Ours

A decal takes its texture's RID (scene/3d/decal.cpp:46), as a material slot does. An AtlasTexture's RID is its whole sheet, so the decal projects all four quadrants, not the red region. The decal atlas refuses a CanvasTexture's RID (texture_storage.cpp:2941), so the far decal projects nothing.

Mip chain

Done
Godot render of Mip chain Our render of Mip chain
Godot 4.6.3 Ours

The decal atlas gives each decal a mip chain, even over an import without one. It halves each level in the atlas's RGBA8 bytes (texture_storage.cpp:3162-3226). The previewer builds the same chain on the CPU with the importer's 2 × 2 byte average. So the minified red and green checker projects a dark yellow, as in Godot.

Linting

Strict parsing format-checks these Decal properties, plus 1 inherited from VisualInstance3D, 17 inherited from Node3D, 10 inherited from Node. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

PropertyAcceptsOut of range
albedo_mixfloat 0-1warning
cull_mask32-bit layer mask (layers 1-32)
distance_fade_beginfloat >= 0warning below
distance_fade_enabledtrue or false
distance_fade_lengthfloat >= 0warning below
emission_energyfloat >= 0warning below
lower_fadefloat >= 0error below
modulateColor(r, g, b, a), or the colour string or int it converts
normal_fadefloat 0-0.999warning
sizeVector3(x, y, z), each float >= 0.001error below
sorting_offsetfloat
texture_albedonull, SubResource("id"), ExtResource("id") or Resource("path")
texture_emissionnull, SubResource("id"), ExtResource("id") or Resource("path")
texture_normalnull, SubResource("id"), ExtResource("id") or Resource("path")
texture_ormnull, SubResource("id"), ExtResource("id") or Resource("path")
upper_fadefloat >= 0error below
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-node3d-visibility (type-family match)valid-node3d-visibilityerror
valid-decal-resourcesdecal-requires-texturewarning
decal-normal-orm-without-albedowarning
decal-empty-cull-maskwarning

The linter warns (resource-type-excluded-by-hint) when one of the four texture_* slots holds a class its hint excludes, such as an AtlasTexture. Godot's editor never offers such a class, and the setter keeps it with a debug warning (decal.cpp:49-58).

size falls back to Godot's default Vector3(2, 2, 2) with a warning when malformed. albedo_mix, emission_energy, normal_fade, upper_fade, lower_fade and cull_mask fall back the same way to 1, 1, 0, 0.3, 0.3 and 1048575. The two fade exponents are also clamped at zero, as Godot's setters clamp them. modulate falls back silently to opaque white, and the four texture_* references are copied through unvalidated.

Known limitations

  • Approximated The projection reads bolder than Godot's at a partial albedo_mix, since exact blending needs a custom projector shader.
  • Approximated The depth and normal fades are baked per vertex, so a large decal on a low-poly tilted or curved receiver bands where Godot's is smooth.
  • Approximated texture_normal, texture_orm, texture_emission and emission_energy are parsed but not applied, so the projection carries albedo alone.
  • Approximated The projection takes the scalar roughness, metallic and diffuse_mode of its receiver's first surface, not its maps.
  • Approximated In Godot 4.6 an untextured decal hides each decal sorted after it (texture_storage.cpp:3420, :3485), where the previewer draws each decal on its own.
  • Approximated At the projection rim Godot fades the outer half-texel toward the transparent padding of its atlas, where the clamped sample here stays crisp.
  • Approximated A decal's mip chain halves its own texture, where Godot halves the whole atlas and can blend a neighbouring decal into the smallest levels.

DirectionalLight2D

renders as one term over the whole light buffer that every lit CanvasItem multiplies in docs ↗ source ↗ unit-directionallight2d.tscn ↗ Done

DirectionalLight2D lights the whole canvas with color and energy, and draws nothing itself. It reaches every lit item on its canvas layers whatever the item's light_mask or z_index. The previewer adds it to the light buffer a PointLight2D uses. The three panels take one warm light, and the clear colour below them takes none.

Godot render of DirectionalLight2D Our render of DirectionalLight2D
Godot 4.6.3 Ours

Hard shadows: a parallel shadow map

Done
Godot render of Hard shadows: a parallel shadow map Our render of Hard shadows: a parallel shadow map
Godot 4.6.3 Ours

A square occluder under a light turned 0.5 rad casts a band down and to the left. Godot measures depth along the light across the project viewport's diagonal (renderer_canvas_render_rd.cpp:1140-1146). The previewer builds the same 1D map, so the band covers the occluder's inside too. It culls an occluder on its local bounds, as Godot does (renderer_viewport.cpp:635).

The map spans the project viewport at the canvas origin. In Godot's editor no Camera2D becomes current (camera_2d.cpp:354), and the previewer draws the canvas as the editor does. Every occluder casts on every lit item: the directional pass reads no shadow_item_cull_mask on the item (canvas.glsl:747).

Soft shadows: shadow_filter and shadow_filter_smooth

Done
Godot render of Soft shadows: shadow_filter and shadow_filter_smooth Our render of Soft shadows: shadow_filter and shadow_filter_smooth
Godot 4.6.3 Ours

shadow_filter = PCF5 averages five taps across the parallel map. The taps keep one width along the whole band, unlike a point light's penumbra, which widens with distance.

Linting

Strict parsing format-checks these DirectionalLight2D properties, plus 15 inherited from Light2D, 12 inherited from Node2D, 16 inherited from CanvasItem, 10 inherited from Node. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

PropertyAcceptsOut of range
heightfloat 0-1warning
max_distancefloat >= 0warning below
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-canvasitem-clip-ancestry (type-family match)canvasitem-ancestor-clips-childrenwarning
canvasitem-ancestor-is-canvasgroupwarning
valid-directionallight2d-rangesdirectionallight2d-inverted-layer-rangeinfo

enabled falls back to true, energy to 1.0, height to 0, max_distance to 10000 and blend_mode to 0 (ADD), each with a warning. color falls back to opaque white silently.

Known limitations

  • Shader missing A CanvasTexture.normal_texture is not read, so height has no effect and every surface takes the light head-on.

DirectionalLight3D

renders as a THREE.DirectionalLight docs ↗ source ↗ unit-directional-light-3d.tscn ↗ Limitation
Godot render of DirectionalLight3D Our render of DirectionalLight3D
Godot 4.6.3 Ours

A sun-like light that lights every surface from one direction, down the node's local -Z. The previewer draws a THREE.DirectionalLight with Godot's shadow, fitted to the camera in one, two or four splits. Each shadow draws into its share of one atlas texture and fades out at directional_shadow_max_distance. Every lit surface samples that one texture, as in Godot, so eight shadowed lights take one texture unit. Its highlight scales by light_specular, as Godot's does.

Linting

Strict parsing format-checks these DirectionalLight3D properties, plus 27 inherited from Light3D, 1 inherited from VisualInstance3D, 17 inherited from Node3D, 10 inherited from Node. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

PropertyAcceptsOut of range
directional_shadow_blend_splitstrue or false
directional_shadow_fade_startfloat 0-1warning
directional_shadow_max_distancefloat >= 0warning below
directional_shadow_modeenum 0-2 (ORTHOGONAL/PARALLEL_2_SPLITS/PARALLEL_4_SPLITS)warning
directional_shadow_pancake_sizefloat >= 0warning below
directional_shadow_split_1float 0-1warning
directional_shadow_split_2float 0-1warning
directional_shadow_split_3float 0-1warning
sky_modeenum 0-2 (LIGHT_AND_SKY/LIGHT_ONLY/SKY_ONLY)warning
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-node3d-visibility (type-family match)valid-node3d-visibilityerror
valid-directionallight3d-propertiesdirectionallight3d-unused-splitsinfo
valid-light3d-scale (type-family match)light3d-non-unit-scalewarning

The linter warns (resource-type-excluded-by-hint) when light_projector holds a class its hint excludes, such as an AtlasTexture. Godot's editor never offers such a class, and the setter keeps it with a debug warning (light_3d.cpp:204-213).

The lenient parser reads the shadow mode, the three split offsets, the max distance, the pancake size, the fade start, directional_shadow_blend_splits and sky_mode. An absent, unparseable or non-finite value takes Godot's default. The defaults are four splits at 0.1, 0.2 and 0.5, no blending, and a fade from 0.8 of the distance. An out-of-range split offset or fade start reaches the renderer as written, as Godot's setter keeps it.

The shadow's soft edge takes the four taps of Godot's default Soft Low filter, with the same dither as Godot. The filter reaches shadow_blur times two atlas texels.

A shadowed light with a light_angular_distance and a shadow_blur above zero turns on Godot's directional soft shadows. Then each directional light with an angular distance searches its split for blockers. Its penumbra widens with the distance from the caster, as Godot's does. It also lights each surface with Godot's size term, which widens the lit side by 1 - cos of the angle. Without the soft shadows, the light keeps the filter above and no size term.

sky_mode decides what the light reaches, as in Godot. A Sky Only light draws only its sun in the sky, and casts no shadow. A Light Only light lights surfaces and draws no sun in the sky.

light_negative makes the light subtract, on surfaces and in the sky's sun, as in Godot. shadow_opacity mixes the shadow towards unshadowed through three's shadow.intensity.

Godot draws the first eight visible directional lights in the scene and stops. A light past the eighth neither lights nor casts, here as in Godot. So at most eight directional lights cast a shadow.

Known limitations

  • Approximated A caster more than one view diameter towards the sun casts no shadow, where Godot still draws it.
  • Approximated The editor camera's clip planes follow the framing, so the shadow's splits and fade can end nearer or further than in Godot's editor.

Environment

renders as THREE scene.environment / background / tone mapping / fog docs ↗ source ↗ Limitation

The resource a WorldEnvironment holds: background and sky, ambient light, tone mapping, glow, colour adjustments, depth fog and volumetric fog. The editor injects a preview Environment on a scene that declares none (ADR-0025). Each section drives one feature from its own fixture.

Background sky

Done
Godot render of Background sky Our render of Background sky
Godot 4.6.3 Ours

A ProceduralSkyMaterial under background_mode = BG_SKY. The gradient, and the sphere and floor it lights, match Godot. sky_rotation turns the drawn sky, the light it gives and the sky colour the fog reads, as Godot turns them.

Tone mapping

Done
Godot render of Tone mapping Our render of Tone mapping
Godot 4.6.3 Ours

tonemap_mode = AGX. The lit grass and the crushed shadow match Godot.

Tone mapping exposure

Done
Godot render of Tone mapping exposure Our render of Tone mapping exposure
Godot 4.6.3 Ours

tonemap_exposure = 1.6 under LINEAR, with nothing that needs the tone-map pass. The three boxes and the colour background are 1.6 times their colours, and the brightest box clips at white, as in Godot. The exposure multiplies the colour before every tone mapper, LINEAR included, in the main view and in a shared-world SubViewport alike.

Ambient light + sky reflection

Limitation
Godot render of Ambient light + sky reflection Our render of Ambient light + sky reflection
Godot 4.6.3 Ours

AMBIENT_SOURCE_COLOR with ambient_light_sky_contribution = 0. The grass is lit by the flat ambient alone, while the metallic sphere still reflects the gold sky at full strength.

  • Approximated The SHADOWS_ONLY box's shadow projects a visibly different shape than Godot's.

Glow (bloom)

Done
Godot render of Glow (bloom) Our render of Glow (bloom)
Godot 4.6.3 Ours

The preview environment enables glow, which blooms the emissive sphere. Both engines draw the same tight halo and leave the ground untouched. The bright pass, the seven-level pyramid and all five blend modes are ported from Godot's shaders. The glow runs whenever the environment enables it, so a lit specular highlight blooms as well, as in Godot. A glow_map scales the glow per screen position, as Godot's tonemap pass does.

  • Approximated The pyramid blurs with a 13-tap downsample and a 9-tap tent upsample rather than Godot's gaussian, so a bare glow buffer (REPLACE) differs slightly.

Adjustments

Done
Godot render of Adjustments Our render of Adjustments
Godot 4.6.3 Ours

adjustment_enabled with brightness 1.3, contrast 1.25 and saturation 0.5 over an unshaded box and a colour background. The whole frame, background included, is brighter, harder and greyer, as in Godot. The adjustments act after the tone curve and the glow under every tone mapper.

Depth fog

Done
Godot render of Depth fog Our render of Depth fog
Godot 4.6.3 Ours

fog_enabled in exponential mode over a colour background. The fog thickens with distance over the three boxes and hides the background, as in Godot. Godot's depth mode and its curve, the height fog, fog_sun_scatter and fog_aerial_perspective follow Godot's shader too. fog_sky_affect sets how far the fog covers the background.

Volumetric fog

Limitation
Godot render of Volumetric fog Our render of Volumetric fog
Godot 4.6.3 Ours

volumetric_fog_enabled over a colour background, lit by one OmniLight3D. The fog thickens with distance over the three boxes and the background, and brightens around the light, as in Godot. A moving camera blends each frame into the last, as Godot's temporal reprojection does. A still camera adds one of Godot's 16 jitters a render and shows their mean so far. After all 16, it is the mean Godot converges to. Under either fog, Godot converts a colour background to linear twice, so the background is darker than with no fog, and the previewer matches it.

  • Not drawn volumetric_fog_gi_inject adds no light, because the previewer draws no VoxelGI or SDFGI.

Volumetric fog shadow

Done
Godot render of Volumetric fog shadow Our render of Volumetric fog shadow
Godot 4.6.3 Ours

A thin box under a DirectionalLight3D tilted 60° with shadow_enabled, in volumetric fog of density 0.1 over a colour background. The fog under the box stays dark where the box blocks the light, and the shadow's edge in the fog matches Godot. An OmniLight3D or a SpotLight3D that casts shadows darkens the fog behind its casters in the same way. A SpotLight3D's shadow_bias pushes each fog cell away from the light, as in Godot, so a large bias darkens its whole cone. The fog around a shadowed SpotLight3D's origin shows no dark blocks. The cells behind the light's plane stay unlit, as Godot's clamped shadow read leaves them.

Linting

Strict parsing format-checks these Environment properties, plus 2 inherited from Resource. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

PropertyAcceptsOut of range
adjustment_brightnessfloat >= 0warning below
adjustment_color_correctionnull, SubResource("id"), ExtResource("id") or Resource("path")
adjustment_contrastfloat
adjustment_enabledtrue or false
adjustment_saturationfloat
ambient_light_colorColor(r, g, b, a), or the colour string or int it converts
ambient_light_energyfloat 0-16warning
ambient_light_sky_contributionfloat 0-1error
ambient_light_sourceenum 0-3 (BG/DISABLED/COLOR/SKY)warning
background_camera_feed_idinteger 1-10warning
background_canvas_max_layerinteger -1000-1000warning
background_colorColor(r, g, b, a), or the colour string or int it converts
background_energy_multiplierfloat 0-16warning
background_intensityfloat 0-100000warning
background_modeenum 0-5 (BG_CLEAR_COLOR/BG_COLOR/BG_SKY/BG_CANVAS/BG_KEEP/BG_CAMERA_FEED)warning
fog_aerial_perspectivefloat 0-1warning
fog_densityfloat >= 0warning below
fog_depth_beginfloat
fog_depth_curvefloat
fog_depth_endfloat
fog_enabledtrue or false
fog_heightfloat
fog_height_densityfloat
fog_light_colorColor(r, g, b, a), or the colour string or int it converts
fog_light_energyfloat >= 0warning below
fog_modeenum 0-1 (EXPONENTIAL/DEPTH)warning
fog_sky_affectfloat 0-1warning
fog_sun_scatterfloat >= 0warning below
glow_blend_modeenum 0-4 (ADDITIVE/SCREEN/SOFTLIGHT/REPLACE/MIX)warning
glow_bloomfloat 0-1warning
glow_enabledtrue or false
glow_hdr_luminance_capfloat 0-256warning
glow_hdr_scalefloat 0-4warning
glow_hdr_thresholdfloat 0-4warning
glow_intensityfloat 0-8warning
glow_levels/*float >= 0warning below
glow_mapnull, SubResource("id"), ExtResource("id") or Resource("path")
glow_map_strengthfloat 0-1warning
glow_mixfloat 0-1warning
glow_normalizedtrue or false
glow_strengthfloat 0-2warning
reflected_light_sourceenum 0-2 (BG/DISABLED/SKY)warning
sdfgi_bounce_feedbackfloat 0-1.99warning
sdfgi_cascadesinteger 1-8error
sdfgi_enabledtrue or false
sdfgi_energyfloat
sdfgi_min_cell_sizefloat 0.01-64warning
sdfgi_normal_biasfloat
sdfgi_probe_biasfloat
sdfgi_read_sky_lighttrue or false
sdfgi_use_occlusiontrue or false
sdfgi_y_scaleenum 0-2 (Y_SCALE_50_PERCENT/Y_SCALE_75_PERCENT/Y_SCALE_100_PERCENT)warning
skynull, SubResource("id"), ExtResource("id") or Resource("path")
sky_custom_fovfloat 0-180warning
sky_rotationVector3(x, y, z), or the Vector3i spelling Godot converts
ssao_ao_channel_affectfloat 0-1warning
ssao_detailfloat 0-5warning
ssao_enabledtrue or false
ssao_horizonfloat 0-1warning
ssao_intensityfloat >= 0warning below
ssao_light_affectfloat 0-1warning
ssao_powerfloat
ssao_radiusfloat >= 0.01warning below
ssao_sharpnessfloat 0-1warning
ssil_enabledtrue or false
ssil_intensityfloat >= 0warning below
ssil_normal_rejectionfloat 0-1warning
ssil_radiusfloat >= 0.01warning below
ssil_sharpnessfloat 0-1warning
ssr_depth_tolerancefloat 0.01-128warning
ssr_enabledtrue or false
ssr_fade_infloat >= 0error below
ssr_fade_outfloat >= 0error below
ssr_max_stepsinteger 32-512warning
tonemap_agx_contrastfloat >= 1warning below
tonemap_agx_whitefloat >= 2warning below
tonemap_exposurefloat >= 0warning below
tonemap_modeenum 0-4 (LINEAR/REINHARDT/FILMIC/ACES/AGX)warning
tonemap_whitefloat >= 1warning below
volumetric_fog_albedoColor(r, g, b, a), or the colour string or int it converts
volumetric_fog_ambient_injectfloat 0-16warning
volumetric_fog_anisotropyfloat -0.9-0.9warning
volumetric_fog_densityfloat >= 0warning below
volumetric_fog_detail_spreadfloat 0.5-6error
volumetric_fog_emissionColor(r, g, b, a), or the colour string or int it converts
volumetric_fog_emission_energyfloat >= 0warning below
volumetric_fog_enabledtrue or false
volumetric_fog_gi_injectfloat 0-16warning
volumetric_fog_lengthfloat >= 0.01warning below
volumetric_fog_sky_affectfloat 0-1warning
volumetric_fog_temporal_reprojection_amountfloat 0.5-0.99warning
volumetric_fog_temporal_reprojection_enabledtrue or false
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo

The lenient parser never rejects. Every scalar goes through the shared floatOr, intOr, enumOr and boolOr decoders. Each logs the bad literal and falls back to Godot's default. An unreadable glow_intensity therefore renders as default glow rather than as no Environment at all. A depth-mode fog with no stored fog_density takes 1. fog_depth_begin and fog_depth_end drag each other along, so the begin never passes the end, as Godot's setters do.

Known limitations

  • Shader missing ssr_enabled draws no screen-space reflections.
  • Resource gap adjustment_color_correction is not applied, so a colour-correction texture leaves the frame unchanged.

FABRIK3D

renders as nothing yet, Godot drags its chain onto the target each frame, the previewer does not docs ↗ source ↗ unit-fabrik-3d.tscn ↗ Not implemented
No visual output — this node draws nothing to compare.

The position-based IK solver. Each frame, a backward reaching pass and a forward one drag a bone chain onto its target. It writes the result into the parent Skeleton3D's poses. Godot runs it each frame, and the previewer does not yet (ADR-0045). The bones hold their rest pose.

Linting

Strict parsing format-checks the inherited set (6 inherited from IterateIK3D, 1 inherited from IKModifier3D, 2 inherited from SkeletonModifier3D, 17 inherited from Node3D, 10 inherited from Node); FABRIK3D declares none of its own. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-node3d-visibility (type-family match)valid-node3d-visibilityerror
valid-skeletonmodifier3d-parent (type-family match)skeletonmodifier3d-parent-not-skeleton3dwarning
valid-iterateik3d-target-node (type-family match)iterateik3d-setting-missing-target-nodewarning

FABRIK3D declares no validator of its own, and index.ts registers parseNode3D directly, so the solver keys are never read by the lenient parser. A value strict rejects through the inherited set is dropped rather than substituted.

FileDialog

renders as nothing yet, not implemented docs ↗ source ↗ unit-file-dialog.tscn ↗ Not implemented
Comparison images not captured yet for FileDialog.

A preset dialog for choosing files or directories, built on ConfirmationDialog with filters and a per-dialog options family. The previewer parses and validates it but does not draw it. The base Node mounts under renderIntent: 'pending' as an empty group, and its children still show (ADR-0045).

Linting

Strict parsing format-checks these FileDialog properties, plus 1 inherited from ConfirmationDialog, 5 inherited from AcceptDialog, 45 inherited from Window, 47 inherited from Viewport, 10 inherited from Node. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

PropertyAcceptsOut of range
accessenum 0-2 (RESOURCES/USERDATA/FILESYSTEM)error
deleting_enabledtrue or false
display_modeenum 0-1 (THUMBNAILS/LIST)error
favorites_enabledtrue or false
file_filter_toggle_enabledtrue or false
file_modeenum 0-4 (OPEN_FILE/OPEN_FILES/OPEN_DIR/OPEN_ANY/SAVE_FILE)error
file_sort_options_enabledtrue or false
filename_filterquoted string, or the &"…" StringName or NodePath("…") it converts
filtersstring array (PackedStringArray(…), ArrayString or […])
folder_creation_enabledtrue or false
hidden_files_toggle_enabledtrue or false
layout_toggle_enabledtrue or false
mode_overrides_titletrue or false
option_#/*option name, values or default
option_countinteger >= 0error below
overwrite_warning_enabledtrue or false
recent_list_enabledtrue or false
root_subfolderquoted string, or the &"…" StringName or NodePath("…") it converts
show_hidden_filestrue or false
use_native_dialogtrue or false
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-window-properties (type-family match)window-max-size-below-min-sizeinfo
window-size-clamped-by-limitswarning
window-content-scale-factor-flooredwarning
valid-filedialog-properties (type-family match)filedialog-option-index-out-of-rangeerror

The lenient parser registers the plain Node reader, which reads only the heading attributes and an optional transform. A file_mode of 5, which set_file_mode refuses at runtime, is never read, substituted or reported on the lenient path.

Known limitations

  • Not drawn Godot displays the dialog once popped up, but the previewer draws nothing for it.

FlowContainer

renders as children flowed along one axis and wrapped into lines docs ↗ source ↗ unit-flow-container.tscn ↗ Unreviewed
Comparison images not captured yet for FlowContainer.

FlowContainer lays its children out along one axis and wraps to a new line when the current one runs out of room. It aligns each line per alignment. It draws nothing itself. A right-to-left layout_direction mirrors each line horizontally. On a vertical flow, that mirror and reverse_fill act on the same axis, so setting both cancels out.

Linting

Strict parsing format-checks these FlowContainer properties, plus 53 inherited from Control, 16 inherited from CanvasItem, 10 inherited from Node. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

PropertyAcceptsOut of range
alignmentenum 0-2 (ALIGNMENT_BEGIN/ALIGNMENT_CENTER/ALIGNMENT_END)warning
last_wrap_alignmentenum 0-3 (LAST_WRAP_ALIGNMENT_INHERIT/LAST_WRAP_ALIGNMENT_BEGIN/LAST_WRAP_ALIGNMENT_CENTER/LAST_WRAP_ALIGNMENT_END)warning
reverse_filltrue or false
verticaltrue or false
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-canvasitem-clip-ancestry (type-family match)canvasitem-ancestor-clips-childrenwarning
canvasitem-ancestor-is-canvasgroupwarning
valid-control-properties (type-family match)control-tooltip-ignored-by-mouse-filterwarning
control-property-orderwarning

parser.ts reads all four members straight through, unclamped. vertical is validated and parsed here, since a plain FlowContainer serialises it where its fixed-axis subclasses hide it. The solver resolves the orientation of HFlowContainer and VFlowContainer from the node's type, not from this property.

Known limitations

  • Approximated A TextureRect child with a Fit expand mode inside a multi-line flow is sized like any other child, where Godot keeps its previous frame's size.

FogVolume

renders as density, scattering and emission added to the volumetric fog docs ↗ source ↗ unit-fog-volume.tscn ↗ Unreviewed
Godot render of FogVolume Our render of FogVolume
Godot 4.6.3 Ours

A FogVolume adds a local region of fog to the Environment's volumetric fog. A negative-density FogMaterial removes fog instead. The previewer adds each volume's density, albedo and emission to the froxels its shape covers, as Godot's volume pass does. It draws nothing where the Environment's volumetric fog is off.

A FogMaterial density_texture shapes the density by its red channel. It can be a NoiseTexture3D or an ImageTexture3D, inline or saved as its own .tres. It can also be an image its import sidecar imports as a 3D texture. A float ImageTexture3D keeps a density above 1, as Godot does.

A ShaderMaterial without a shader, or with a shader of another shader_type than fog, fills the volume with Godot's default fog, as Godot does. The shader can be inline, a .tres or a .gdshader file.

Linting

Strict parsing format-checks these FogVolume properties, plus 1 inherited from VisualInstance3D, 17 inherited from Node3D, 10 inherited from Node. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

PropertyAcceptsOut of range
materialnull, SubResource("id"), ExtResource("id") or Resource("path")
shapeenum 0-4 (ELLIPSOID/CONE/CYLINDER/BOX/WORLD)warning
sizeVector3(x, y, z), each >= 0 (>= 0.01 recommended; 1024 ceiling is or_greater, so unbounded above)warning below
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-node3d-visibility (type-family match)valid-node3d-visibilityerror
valid-fogvolume-sizefogvolume-size-ignored-for-world-shapeinfo

The lenient parser clamps each negative size component to 0, as set_size does. It keeps an out-of-range shape, which then has no surface, and the default size for a malformed one.

Known limitations

  • Shader missing A volume whose material is a fog ShaderMaterial adds no fog, where Godot runs its fog shader.
  • Approximated A fog shader with a compile error adds no fog, where Godot draws its default fog.
  • Approximated A fog shader whose shader_type comes from an #include or a macro draws the default fog, where Godot runs its fog shader.
  • Resource gap An ImageTexture3D saved in a BPTC, ETC, EAC, ASTC or integer format leaves the density even.
  • Approximated An imported 3D texture reads its source image, so its density differs slightly from Godot's Lossy or VRAM-compressed copy.
  • Approximated A NoiseTexture3D density_texture leaves the density even on first load until its build finishes, where Godot shapes the fog on its first frame.
  • Approximated Past 2048 stacked slices of distinct density textures in one view, each further texture leaves its density even.

FoldableContainer

renders as a collapsible titled panel (accordion) docs ↗ source ↗ unit-foldable-container.tscn ↗ Unreviewed
Comparison images not captured yet for FoldableContainer.

FoldableContainer is a titled panel that expands or collapses its children like an accordion section. The previewer draws the title bar (its StyleBox, fold-state arrow icon and title text) and, only while unfolded, a content panel behind the children and their solved rects below (or above) it. Sorting writes each direct child's own visible, so folding hides the children and unfolding shows them whatever the file authored. A right-to-left layout_direction moves the arrow to the right of the title bar and puts the title text at the left margin, with title_alignment swapped. It also insets the content from the panel style's right margin.

Linting

Strict parsing format-checks these FoldableContainer properties, plus 53 inherited from Control, 16 inherited from CanvasItem, 10 inherited from Node. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

PropertyAcceptsOut of range
foldable_groupnull, SubResource("id"), ExtResource("id") or Resource("path")
foldedtrue or false
languagequoted string, or the &"…" StringName or NodePath("…") it converts
titlequoted string, or the &"…" StringName or NodePath("…") it converts
title_alignmentenum 0-2 (HORIZONTAL_ALIGNMENT_LEFT/HORIZONTAL_ALIGNMENT_CENTER/HORIZONTAL_ALIGNMENT_RIGHT)error
title_positionenum 0-1 (POSITION_TOP/POSITION_BOTTOM)error
title_text_directionenum 0-3 (TEXT_DIRECTION_AUTO/TEXT_DIRECTION_LTR/TEXT_DIRECTION_RTL/TEXT_DIRECTION_INHERITED)error
title_text_overrun_behaviorenum 0-4 (OVERRUN_NO_TRIMMING/OVERRUN_TRIM_CHAR/OVERRUN_TRIM_WORD/OVERRUN_TRIM_ELLIPSIS/OVERRUN_TRIM_WORD_ELLIPSIS)warning
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-canvasitem-clip-ancestry (type-family match)canvasitem-ancestor-clips-childrenwarning
canvasitem-ancestor-is-canvasgroupwarning
valid-control-properties (type-family match)control-tooltip-ignored-by-mouse-filterwarning
control-property-orderwarning

parser.ts reads the own keys that change what draws: folded, title, title_alignment, title_position and title_text_overrun_behavior. foldable_group, title_text_direction and language are behaviour, not pixels, and stay unread. A malformed folded becomes false. A malformed title_alignment, title_position or title_text_overrun_behavior becomes undefined, and the render default (LEFT / TOP / no trimming) applies.

Known limitations

  • Approximated A right-to-left title keeps its glyphs in the written order, and title_text_direction changes nothing.

Generic6DOFJoint3D

renders as nothing (a transform-only group) docs ↗ source ↗ unit-generic-6d-of-joint-3d.tscn ↗ Linter only
No visual output — this node draws nothing to compare.

A joint with limits, motors and springs on all six axes. It draws nothing at runtime, so the previewer renders it as a transform-only group (ADR-0008) and its children still show.

Linting

Strict parsing format-checks these Generic6DOFJoint3D properties, plus 4 inherited from Joint3D, 17 inherited from Node3D, 10 inherited from Node. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

PropertyAcceptsOut of range
angular_limit_x/*angular limit parameter (see generic_6dof_joint_3d.cpp _bind_methods)
angular_limit_x/dampingfloat 0.01-16warning
angular_limit_x/lower_angleradians, -180° to 180°warning
angular_limit_x/restitutionfloat 0.01-16warning
angular_limit_x/softnessfloat 0.01-16warning
angular_limit_x/upper_angleradians, -180° to 180°warning
angular_limit_y/*angular limit parameter (see generic_6dof_joint_3d.cpp _bind_methods)
angular_limit_y/dampingfloat 0.01-16warning
angular_limit_y/lower_angleradians, -180° to 180°warning
angular_limit_y/restitutionfloat 0.01-16warning
angular_limit_y/softnessfloat 0.01-16warning
angular_limit_y/upper_angleradians, -180° to 180°warning
angular_limit_z/*angular limit parameter (see generic_6dof_joint_3d.cpp _bind_methods)
angular_limit_z/dampingfloat 0.01-16warning
angular_limit_z/lower_angleradians, -180° to 180°warning
angular_limit_z/restitutionfloat 0.01-16warning
angular_limit_z/softnessfloat 0.01-16warning
angular_limit_z/upper_angleradians, -180° to 180°warning
angular_motor_x/*angular motor parameter (see generic_6dof_joint_3d.cpp _bind_methods)
angular_motor_y/*angular motor parameter (see generic_6dof_joint_3d.cpp _bind_methods)
angular_motor_z/*angular motor parameter (see generic_6dof_joint_3d.cpp _bind_methods)
angular_spring_x/*angular spring parameter (see generic_6dof_joint_3d.cpp _bind_methods)
angular_spring_x/equilibrium_pointradians, -180° to 180°warning
angular_spring_y/*angular spring parameter (see generic_6dof_joint_3d.cpp _bind_methods)
angular_spring_y/equilibrium_pointradians, -180° to 180°warning
angular_spring_z/*angular spring parameter (see generic_6dof_joint_3d.cpp _bind_methods)
angular_spring_z/equilibrium_pointradians, -180° to 180°warning
linear_limit_x/*linear limit parameter (see generic_6dof_joint_3d.cpp _bind_methods)
linear_limit_x/dampingfloat 0.01-16warning
linear_limit_x/restitutionfloat 0.01-16warning
linear_limit_x/softnessfloat 0.01-16warning
linear_limit_y/*linear limit parameter (see generic_6dof_joint_3d.cpp _bind_methods)
linear_limit_y/dampingfloat 0.01-16warning
linear_limit_y/restitutionfloat 0.01-16warning
linear_limit_y/softnessfloat 0.01-16warning
linear_limit_z/*linear limit parameter (see generic_6dof_joint_3d.cpp _bind_methods)
linear_limit_z/dampingfloat 0.01-16warning
linear_limit_z/restitutionfloat 0.01-16warning
linear_limit_z/softnessfloat 0.01-16warning
linear_motor_x/*linear motor parameter (see generic_6dof_joint_3d.cpp _bind_methods)
linear_motor_y/*linear motor parameter (see generic_6dof_joint_3d.cpp _bind_methods)
linear_motor_z/*linear motor parameter (see generic_6dof_joint_3d.cpp _bind_methods)
linear_spring_x/*linear spring parameter (see generic_6dof_joint_3d.cpp _bind_methods)
linear_spring_y/*linear spring parameter (see generic_6dof_joint_3d.cpp _bind_methods)
linear_spring_z/*linear spring parameter (see generic_6dof_joint_3d.cpp _bind_methods)
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-node3d-visibility (type-family match)valid-node3d-visibilityerror
valid-joint (type-family match)joint-not-connectedwarning
joint-same-bodywarning

The lenient parser reuses parseNode3D, which reads only transform and visible. A malformed linear_limit_x/damping or any other axis key is dropped rather than substituted or warned on, since nothing renders from it.

GeometryInstance3D

renders as a transform-only group docs ↗ source ↗ unit-geometry-instance-3d.tscn ↗ Linter only
No visual output — this node draws nothing to compare.

The base every visible 3D leaf inherits its shadow, LOD, global-illumination and visibility-range settings from. Instantiated bare it draws nothing, so the previewer renders it as a transform-only group (ADR-0008) and its children still show.

Linting

Strict parsing format-checks these GeometryInstance3D properties, plus 1 inherited from VisualInstance3D, 17 inherited from Node3D, 10 inherited from Node. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

PropertyAcceptsOut of range
cast_shadowenum 0-3 (OFF/ON/DOUBLE_SIDED/SHADOWS_ONLY)warning
custom_aabbAABB(x, y, z, w, h, d)
extra_cull_marginfloat 0-16384error below, warning above
gi_lightmap_texel_scalefloat >= 0.01warning below
gi_modeenum 0-2 (DISABLED/STATIC/DYNAMIC)warning
ignore_occlusion_cullingtrue or false
instance_shader_parameters/*any Variant — the type comes from the attached shader's uniform declarations, not the .tscn
lod_biasfloat 0.001-128error below 0, warning below 0.001, warning above 128
material_overlaynull, SubResource("id"), ExtResource("id") or Resource("path")
material_overridenull, SubResource("id"), ExtResource("id") or Resource("path")
sorting_offsetfloat
sorting_use_aabb_centertrue or false
transparencyfloat 0-1error
visibility_range_beginfloat >= 0warning below
visibility_range_begin_marginfloat >= 0warning below
visibility_range_endfloat >= 0warning below
visibility_range_end_marginfloat >= 0warning below
visibility_range_fade_modeenum 0-2 (DISABLED/SELF/DEPENDENCIES)warning
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-node3d-visibility (type-family match)valid-node3d-visibilityerror
valid-geometryinstance3d-visibility-range (type-family match)geometryinstance3d-visibility-range-end-before-beginwarning
geometryinstance3d-visibility-range-begin-fade-without-marginwarning
geometryinstance3d-visibility-range-end-fade-without-marginwarning

The lenient parser reads transform, visible and layers through parseVisualInstance3D, then transparency, cast_shadow, the visibility_range_* keys and custom_aabb, which every drawn leaf parser starts from. A malformed transparency, cast_shadow or visibility_range_* value keeps Godot's default with no warning. A malformed custom_aabb warns and keeps no box, and AABB(0, 0, 0, 0, 0, 0) keeps no box, as Godot clears it. Only strict reports a malformed value as an error.

Every drawn leaf (MeshInstance3D, a CSG root, Sprite3D, Label3D and each mesh of a GLB, which Godot imports as a MeshInstance3D) honours the visibility range against the camera distance to its AABB centre. A culled leaf draws nothing and casts no directional shadow. Its children still draw. It still casts into an omni or spot shadow, because Godot's shadow cull for those lights reads no range. The visibility-range golden pins this.

A scene-level cull runs before each render, so the first frame is culled and faded too. Each surface mounts an unfaded and an alpha-pass material. The cull puts the one for this render's fade on the mesh, so a SubViewport camera fades the scene by its own distance. Each render camera keeps its own state. Only an instance inside the camera frustum or a directional shadow split updates it. So a DISABLED range keeps Godot's hysteresis when the camera turns away. A leaf whose visibility parent is another GeometryInstance3D draws as its parent's range allows, and fades in across a DEPENDENCIES margin. The parent counts whether the previewer draws it or not. An undrawn one measures to the centre of its custom_aabb, an emitter's visibility_aabb, or else its origin. The visibility-parent golden pins the drawn parents. A parent with no geometry base is no parent, such as a MeshInstance3D with no mesh, or with a custom_aabb of no surface. Godot never indexes it (renderer_scene_cull.cpp:1675-1681), so the dependant links to none (:1502-1503). A node hidden in the tree is no parent either, as Godot unpairs a hidden instance (renderer_scene_cull.cpp:1051-1052).

An override node in the instancing scene gives a GLB mesh its visibility_range_*, transparency, cast_shadow and visibility_parent. A GLB node with no override takes the visibility parent of its nearest ancestor, up to the node that instances the GLB. Another node can name a GLB mesh as its visibility parent by its path under the instancing node. Each path names a GLB node as Godot's importer names it: Cube.001 is Cube_001, and a repeated Cube is Cube2. In a GODOT_single_root file, glTF node 0 is the instancing node. It takes that node's properties, and each path starts below it.

Godot 2D Platformer

renders as Godot's 2D platformer demo level demos/2d/platformer/level/level.tscn ↗ Limitation
Godot render of Godot 2D Platformer Our render of Godot 2D Platformer
Godot 4.6.3 Ours

Godot's 2D platformer demo level: grass-topped platforms over a parallax sky, with trees, coins, rocks, mushrooms and crab enemies.

What it exercises

  • TileMapLayer platforms and a full-height rock column
  • Sprite2D decoration and enemy sprites
  • A multi-layer parallax background
  • A Camera2D framing the level

Framing, the tiles, the trees and the parallax layers match.

Known limitations

  • Approximated The coins and the crab enemies draw smoothed, where Godot draws them pixel-sharp, for a cause not yet known.
  • Approximated Each crab shows another pose than Godot's, for a cause not yet known.

Godot 3D Platformer

renders as Godot's 3D platformer level at the editor orbit demos/3d/platformer/game.tscn ↗ Limitation
Godot render of Godot 3D Platformer Our render of Godot 3D Platformer
Godot 4.6.3 Ours

Godot's 3D platformer demo (game.tscn): textured terrain blocks, floating platforms, an enemy and coins under a blue sky. Both sides use the same editor orbit.

What it exercises

  • GridMap terrain
  • StandardMaterial3D albedo textures
  • Textured mesh characters and props, including a GLB enemy that self-shadows
  • Coin instances with additive glow sprites
  • The stage's own WorldEnvironment: AgX tonemapping, a flat colour ambient and depth fog
  • Seven ReflectionProbes that update once

Framing, terrain, props and shadow shapes match.

Known limitations

  • Shader missing The previewer does not run the custom sky shader over a CompressedCubemap, so smooth metal reflects black and the coins read grey, not gold.

GPUParticles2D

renders as nothing yet, Godot draws a particle cloud, the previewer does not docs ↗ source ↗ unit-gpu-particles-2d.tscn ↗ Not implemented
Comparison images not captured yet for GPUParticles2D.

GPUParticles2D emits a GPU-simulated particle cloud. The previewer parses and validates it but does not draw it, so it renders as a transform-only fallback and its children still show.

Linting

Strict parsing format-checks these GPUParticles2D properties, plus 12 inherited from Node2D, 16 inherited from CanvasItem, 10 inherited from Node. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

PropertyAcceptsOut of range
amountinteger 1-1000000error below, warning above
amount_ratiofloat 0-1warning
collision_base_sizefloat >= 0warning below
draw_orderenum 0-2 (INDEX/LIFETIME/REVERSE_LIFETIME)warning
emittingtrue or false
explosivenessfloat 0-1warning
fixed_fpsinteger 0-1000warning
fract_deltatrue or false
interp_to_endfloat 0-1error
interpolatetrue or false
lifetimefloat >= 0.01error at or below 0, warning below 0.01
local_coordstrue or false
one_shottrue or false
preprocessfloat >= 0warning below
process_materialnull, SubResource("id"), ExtResource("id") or Resource("path")
randomnessfloat 0-1warning
seedinteger 0-4294967295warning
speed_scalefloat 0-64warning
sub_emitterNodePath("path/to/node")
texturenull, SubResource("id"), ExtResource("id") or Resource("path")
trail_enabledtrue or false
trail_lifetimefloat >= 0.01error below 0.00999, warning below 0.01
trail_section_subdivisionsinteger 1-1024error
trail_sectionsinteger 2-128error
use_fixed_seedtrue or false
visibility_rectRect2(x, y, w, h), or the Rect2i spelling Godot converts
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-canvasitem-clip-ancestry (type-family match)canvasitem-ancestor-clips-childrenwarning
canvasitem-ancestor-is-canvasgroupwarning
valid-gpuparticles2d-process-materialgpuparticles2d-missing-process-materialwarning

The lenient parser reuses parseNode2D and reads none of the emitter keys, so a value strict rejects is dropped rather than substituted. draw_order only warns out of range, since its setter takes any int and only the inspector hint bounds it.

Known limitations

  • Not drawn Godot draws the particle cloud, but the previewer draws nothing for this node.

GPUParticles3D

renders as nothing yet, Godot draws a particle cloud, the previewer does not docs ↗ source ↗ unit-gpuparticles3d.tscn ↗ Not implemented
Godot render of GPUParticles3D Our render of GPUParticles3D
Godot 4.6.3 Ours

A GPU-simulated particle emitter. The previewer runs no simulation, so the emitter contributes no geometry and only its transform and visible flag take effect.

Linting

Strict parsing format-checks these GPUParticles3D properties, plus 18 inherited from GeometryInstance3D, 1 inherited from VisualInstance3D, 17 inherited from Node3D, 10 inherited from Node. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

PropertyAcceptsOut of range
amountinteger 1-1000000error below, warning above
amount_ratiofloat 0-1warning
collision_base_sizefloat >= 0warning below
draw_orderenum 0-3 (INDEX/LIFETIME/REVERSE_LIFETIME/VIEW_DEPTH)warning
draw_pass_1null, SubResource("id"), ExtResource("id") or Resource("path")
draw_pass_2null, SubResource("id"), ExtResource("id") or Resource("path")
draw_pass_3null, SubResource("id"), ExtResource("id") or Resource("path")
draw_pass_4null, SubResource("id"), ExtResource("id") or Resource("path")
draw_passesinteger 1-4error below, warning above
draw_skinnull, SubResource("id"), ExtResource("id") or Resource("path")
emittingtrue or false
explosivenessfloat 0-1warning
fixed_fpsinteger 0-1000warning
fract_deltatrue or false
interp_to_endfloat 0-1error
interpolatetrue or false
lifetimefloat >= 0.01error at or below 0, warning below 0.01
local_coordstrue or false
one_shottrue or false
preprocessfloat >= 0warning below
process_materialnull, SubResource("id"), ExtResource("id") or Resource("path")
randomnessfloat 0-1warning
seedinteger 0-4294967295warning
speed_scalefloat 0-64warning
sub_emitterNodePath("path/to/node")
trail_enabledtrue or false
trail_lifetimefloat >= 0.01error below 0.00999, warning below 0.01
transform_alignenum 0-4 (DISABLED/Z_BILLBOARD/Y_TO_VELOCITY/Z_BILLBOARD_Y_TO_VELOCITY/LOCAL_BILLBOARD)warning
use_fixed_seedtrue or false
visibility_aabbAABB(x, y, z, w, h, d)
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-node3d-visibility (type-family match)valid-node3d-visibilityerror
valid-gpuparticles3d-resourcesgpuparticles3d-missing-process-materialwarning
gpuparticles3d-no-draw-pass-meshwarning
valid-gpuparticles3d-sub-emitterinfo
gpuparticles3d-sub-emitter-selfinfo
gpuparticles3d-sub-emitter-wrong-typeinfo
valid-geometryinstance3d-visibility-range (type-family match)geometryinstance3d-visibility-range-end-before-beginwarning
geometryinstance3d-visibility-range-begin-fade-without-marginwarning
geometryinstance3d-visibility-range-end-fade-without-marginwarning

The lenient parser reads the GeometryInstance3D base and visibility_aabb, the box the scene cull measures the emitter by. It never reads amount, lifetime, process_material or draw_pass_1, so an invalid or missing value has no lenient-side effect, and only strict reports it.

Known limitations

  • Not drawn Godot draws the burst of orange emissive spheres mid-flight, but here only the sky and ground appear.

GPUParticlesAttractorBox3D

renders as nothing yet, not implemented docs ↗ source ↗ unit-gpu-particles-attractor-box-3d.tscn ↗ Not implemented
Comparison images not captured yet for GPUParticlesAttractorBox3D.

A box-shaped attractor that pulls or pushes particles from nearby GPUParticles3D nodes toward or away from its origin. The previewer does not draw the box or apply its force yet, so the node is an invisible transform-only fallback and its children still show.

Linting

Strict parsing format-checks these GPUParticlesAttractorBox3D properties, plus 4 inherited from GPUParticlesAttractor3D, 1 inherited from VisualInstance3D, 17 inherited from Node3D, 10 inherited from Node. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

PropertyAcceptsOut of range
sizeVector3(x, y, z), each float >= 0.01warning below
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-node3d-visibility (type-family match)valid-node3d-visibilityerror

The lenient parser reuses parseNode3D, which reads only transform and visible. A size below 0.01 or a malformed Vector3 parses with no warning and no fallback, and only strict reports it.

Known limitations

  • Needs runtime Godot bends a live particle cloud around the box, but here there is no cloud to bend.

GPUParticlesAttractorSphere3D

renders as nothing yet, not implemented docs ↗ source ↗ unit-gpu-particles-attractor-sphere-3d.tscn ↗ Not implemented
Comparison images not captured yet for GPUParticlesAttractorSphere3D.

A spheroid attractor that pulls or pushes particles from nearby GPUParticles3D nodes toward or away from its origin. The previewer does not draw the sphere or apply its force yet, so the node is an invisible transform-only fallback and its children still show.

Linting

Strict parsing format-checks these GPUParticlesAttractorSphere3D properties, plus 4 inherited from GPUParticlesAttractor3D, 1 inherited from VisualInstance3D, 17 inherited from Node3D, 10 inherited from Node. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

PropertyAcceptsOut of range
radiusfloat >= 0.01warning below
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-node3d-visibility (type-family match)valid-node3d-visibilityerror

The lenient parser reuses parseNode3D, which reads only transform and visible. A radius below 0.01 or a non-numeric one parses with no warning and no fallback, and only strict reports it.

Known limitations

  • Needs runtime Godot bends a live particle cloud around the sphere, but here there is no cloud to bend.

GPUParticlesAttractorVectorField3D

renders as nothing yet, not implemented docs ↗ source ↗ unit-gpu-particles-attractor-vector-field-3d.tscn ↗ Not implemented
Comparison images not captured yet for GPUParticlesAttractorVectorField3D.

A box-shaped attractor that samples a 3D texture to vary attraction strength and direction across its volume. The previewer does not draw the box or sample the texture yet, so the node is an invisible transform-only fallback and its children still show.

Linting

Strict parsing format-checks these GPUParticlesAttractorVectorField3D properties, plus 4 inherited from GPUParticlesAttractor3D, 1 inherited from VisualInstance3D, 17 inherited from Node3D, 10 inherited from Node. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

PropertyAcceptsOut of range
sizeVector3(x, y, z), each float >= 0.01warning below
texturenull, SubResource("id"), ExtResource("id") or Resource("path")
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-node3d-visibility (type-family match)valid-node3d-visibilityerror

The lenient parser reuses parseNode3D, which reads only transform and visible. A size below 0.01 or a texture that is not a Texture3D parses with no warning. Strict checks only that texture is a resource reference.

Known limitations

  • Needs runtime Godot steers a live particle cloud by the field texture, but here there is no cloud to steer.

GPUParticlesCollisionBox3D

renders as nothing yet, not implemented docs ↗ source ↗ unit-gpu-particles-collision-box-3d.tscn ↗ Not implemented
Comparison images not captured yet for GPUParticlesCollisionBox3D.

A box that particles from nearby GPUParticles3D nodes collide with. The previewer does not draw the box or apply the collision yet, so the node is an invisible transform-only fallback and its children still show.

Linting

Strict parsing format-checks these GPUParticlesCollisionBox3D properties, plus 1 inherited from GPUParticlesCollision3D, 1 inherited from VisualInstance3D, 17 inherited from Node3D, 10 inherited from Node. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

PropertyAcceptsOut of range
sizeVector3(x, y, z), each float >= 0.01warning below
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-node3d-visibility (type-family match)valid-node3d-visibilityerror

The lenient parser reuses parseNode3D, which reads only transform and visible. A size below 0.01 or a malformed Vector3 parses with no warning and no fallback, and only strict reports it.

Known limitations

  • Needs runtime Godot stops a live particle cloud at the box, but here there is no cloud to stop.

GPUParticlesCollisionHeightField3D

renders as nothing yet, not implemented docs ↗ source ↗ unit-gpu-particles-collision-height-field-3d.tscn ↗ Not implemented
Comparison images not captured yet for GPUParticlesCollisionHeightField3D.

A heightmap, regenerated in real time from the scene's geometry, that particles from nearby GPUParticles3D nodes collide with. The previewer neither generates nor draws it yet, so the node is an invisible transform-only fallback and its children still show.

Linting

Strict parsing format-checks these GPUParticlesCollisionHeightField3D properties, plus 1 inherited from GPUParticlesCollision3D, 1 inherited from VisualInstance3D, 17 inherited from Node3D, 10 inherited from Node. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

PropertyAcceptsOut of range
follow_camera_enabledtrue or false
heightfield_mask32-bit layer mask (layers 1-32)
resolutionenum 0-5 (256/512/1024/2048/4096/8192)warning
sizeVector3(x, y, z), each float >= 0.01warning below
update_modeenum 0-1 (WHEN_MOVED/ALWAYS)warning
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-node3d-visibility (type-family match)valid-node3d-visibilityerror

The lenient parser reuses parseNode3D, which reads only transform and visible. An out-of-range resolution or a malformed size parses with no warning and no fallback, and only strict reports it.

Known limitations

  • Needs runtime Godot stops a live particle cloud at the heightmap, but here there is no cloud to stop.

GPUParticlesCollisionSDF3D

renders as nothing yet, not implemented docs ↗ source ↗ unit-gpu-particles-collision-sdf-3d.tscn ↗ Not implemented
Comparison images not captured yet for GPUParticlesCollisionSDF3D.

A baked signed distance field that particles from nearby GPUParticles3D nodes collide with. The previewer does not draw it or apply the collision yet, so the node is an invisible transform-only fallback and its children still show.

Linting

Strict parsing format-checks these GPUParticlesCollisionSDF3D properties, plus 1 inherited from GPUParticlesCollision3D, 1 inherited from VisualInstance3D, 17 inherited from Node3D, 10 inherited from Node. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

PropertyAcceptsOut of range
bake_mask32-bit layer mask (layers 1-32)
resolutionenum 0-5 (16/32/64/128/256/512)warning
sizeVector3(x, y, z), each float >= 0.01warning below
texturenull, SubResource("id"), ExtResource("id") or Resource("path")
thicknessfloat 0-2warning
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-node3d-visibility (type-family match)valid-node3d-visibilityerror
valid-gpuparticlescollisionsdf3d-bake-mask (type-family match)gpuparticlescollisionsdf3d-empty-bake-maskwarning

GPUParticlesCollisionSDF3D registers parseNode3D directly, which reads only transform and visible. An out-of-range resolution or a malformed size is dropped silently rather than substituted or warned on, and only strict reports it.

Known limitations

  • Needs runtime Godot stops a live particle cloud at the baked field, but here there is no cloud to stop.

GPUParticlesCollisionSphere3D

renders as nothing yet, not implemented docs ↗ source ↗ unit-gpu-particles-collision-sphere-3d.tscn ↗ Not implemented
Comparison images not captured yet for GPUParticlesCollisionSphere3D.

A sphere that particles from nearby GPUParticles3D nodes collide with. The previewer does not draw the sphere or apply the collision yet, so the node is an invisible transform-only fallback and its children still show.

Linting

Strict parsing format-checks these GPUParticlesCollisionSphere3D properties, plus 1 inherited from GPUParticlesCollision3D, 1 inherited from VisualInstance3D, 17 inherited from Node3D, 10 inherited from Node. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

PropertyAcceptsOut of range
radiusfloat >= 0.01warning below
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-node3d-visibility (type-family match)valid-node3d-visibilityerror

The lenient parser reuses parseNode3D, which reads only transform and visible. A radius below 0.01 or a non-numeric one parses with no warning and no fallback, and only strict reports it.

Known limitations

  • Needs runtime Godot stops a live particle cloud at the sphere, but here there is no cloud to stop.

GraphEdit

renders as a background panel, grid, toolbar, scrollbars and minimap, with GraphElement children placed by position_offset and the whole rect clipped docs ↗ source ↗ unit-graph-edit.tscn ↗ Unreviewed
Comparison images not captured yet for GraphEdit.

GraphEdit is the scrollable, zoomable canvas for wiring GraphNodes together, with a grid, connection lines, a toolbar and a minimap. The previewer draws the background panel and the grid (lines or dots, per grid_pattern/snapping_distance). It draws every resolvable connections entry as a curved, tinted ribbon (connection_lines_curvature/connection_lines_thickness), coloured by the slot of each endpoint (get_output_port_position/get_input_port_position in graph_node.cpp). It places every GraphElement child (GraphNode/GraphFrame) at position_offset * zoom - scroll_offset, as GraphEdit::_update_scroll_offset does. The constructor's set_clip_contents(true) (:3342) clips all of it to the widget's rect.

scroll_offset and zoom are stored values, not authored ones. Each setter clamps against state an earlier property left behind, and a scene is applied in file order (packed_scene.cpp:492, which parents the node only afterwards at :541). set_scroll_offset (:407) clamps against min_scroll_offset/max_scroll_offset. Both are normally still (0, 0): the handler that writes them runs off NOTIFICATION_RESIZED (:867), and Control::_size_changed suppresses that outside the tree (control.cpp:1812). CLAMP tests its min first (typedefs.h:139-141), so that range is inverted. A negative authored offset lands on (0, 0), and every other one on minus the size the preceding offset_* keys produced.

A zoom write that moves the value is the one load-time path that writes the pair first (:2448). It measures a child list that is still empty, so the bounds become -size and +size. The clamp then spans -size to (0, 0), and an offset inside it survives. set_zoom (:2434) clamps against zoom_min/zoom_max as they stand: the constructor's 1 / 1.2^8 and 1.2^4 (:3175-3177) until the file states otherwise. Each bound's setter re-runs set_zoom(zoom) (:2487, :2502), which also sets the disabled flags of the two zoom buttons (:2445-2446). It skips them when the clamp changed nothing and it returned first (:2435-2437).

A disabled zoom button keeps the empty box of FlatButton (default_theme.cpp:370) and draws its icon at the 0.4 alpha of icon_disabled_color (:169). loadOrder.ts replays all of it.

It also draws the three pieces of chrome that the GraphEdit C++ constructor builds. They are present in every GraphEdit, whatever the scene file says:

  • The toolbar at (10, 10), a PanelContainer at its minimum size around an HBoxContainer. Its widgets are the zoom label (round(zoom * 100)%), three zoom buttons, the grid and snapping toggles, the snapping-distance SpinBox, the minimap toggle and the arrange button. show_menu hides the panel. show_zoom_label, show_zoom_buttons, show_grid_buttons, show_minimap_button and show_arrange_button hide widgets inside it, which re-flows the row and re-sizes the panel. show_grid, snapping_enabled and minimap_enabled each press their toggle, and the SpinBox shows snapping_distance.
  • The two scrollbars, anchored to the bottom and right edges. _update_scrollbars grows the scroll range past the page in every GraphEdit with a non-zero rect, so both are always visible. The size and offset of each grabber come from that range and scroll_offset.
  • The minimap, anchored bottom-right, inset 12px, at minimap_size (at least 50 per axis) and minimap_opacity, drawn only while minimap_enabled. Inside it are the panel, one rect per visible GraphFrame and then GraphNode in its panel colour, every connection, and the camera viewport rect. A connection is a 0.5px draw_polyline_colors polyline, with each point's colour lerped in minimap space and a feather that connection_lines_antialiased selects. All of it is letterboxed into the bounding box of the graph.

Linting

Strict parsing format-checks these GraphEdit properties, plus 53 inherited from Control, 16 inherited from CanvasItem, 10 inherited from Node. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

PropertyAcceptsOut of range
connection_lines_antialiasedtrue or false
connection_lines_curvaturefloat
connection_lines_thicknessfloat 0-100error below, warning above
connectionsArray literal ([...] or ArrayDictionary)
grid_patternenum 0-1 (GRID_PATTERN_LINES/GRID_PATTERN_DOTS)warning
minimap_enabledtrue or false
minimap_opacityfloat
minimap_sizeVector2(x, y), or the Vector2i spelling Godot converts
panning_schemeenum 0-1 (SCROLL_ZOOMS/SCROLL_PANS)warning
right_disconnectstrue or false
scroll_offsetVector2(x, y), or the Vector2i spelling Godot converts
show_arrange_buttontrue or false
show_gridtrue or false
show_grid_buttonstrue or false
show_menutrue or false
show_minimap_buttontrue or false
show_zoom_buttonstrue or false
show_zoom_labeltrue or false
snapping_distanceinteger 2-100error
snapping_enabledtrue or false
type_namesDictionary literal ({…})
zoomfloat
zoom_maxfloat
zoom_minfloat
zoom_stepfloat >= 0error below
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-canvasitem-clip-ancestry (type-family match)canvasitem-ancestor-clips-childrenwarning
canvasitem-ancestor-is-canvasgroupwarning
valid-control-properties (type-family match)control-tooltip-ignored-by-mouse-filterwarning
control-property-orderwarning
valid-graphedit-propertiesgraphedit-zoom-min-above-maxerror
graphedit-scroll-offset-discardedinfo

The lenient parser reads the members that drawing needs, as the strict one does. They are scroll_offset, zoom, zoom_min, zoom_max, show_grid, grid_pattern, snapping_distance, snapping_enabled, connection_lines_curvature, connection_lines_thickness, connection_lines_antialiased, connections, the three minimap_* members and the six show_* flags. The others (type_names, panning_scheme, right_disconnects, zoom_step) have no picture to draw, so the lenient tree carries none of them, and a malformed one does not reach the tree.

Known limitations

  • Approximated A GraphElement child's position scales with zoom but its drawn pixels do not, so away from zoom = 1 a node's chrome draws at its unscaled size.
  • Approximated Connections draw at the grid's renderOrder instead of directly above it (graph_edit.cpp:717), which shows only where a node overlaps a line.
  • Approximated The toolbar buttons and SpinBox draw their icons, pressed boxes, field, arrows and disabled state, but no hover or focus state.

GraphElement

renders as an invisible container that fits its children into its own rect docs ↗ source ↗ unit-graph-element.tscn ↗ Unreviewed
Comparison images not captured yet for GraphElement.

GraphElement is the abstract base for a Control placed inside a GraphEdit, behind GraphNode and GraphFrame. It draws no chrome of its own, since graph_element.cpp has no NOTIFICATION_DRAW case. But it is a Container: it fits every visible child into its full rect.

Linting

Strict parsing format-checks these GraphElement properties, plus 53 inherited from Control, 16 inherited from CanvasItem, 10 inherited from Node. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

PropertyAcceptsOut of range
draggabletrue or false
position_offsetVector2(x, y), or the Vector2i spelling Godot converts
resizabletrue or false
scaling_menustrue or false
selectabletrue or false
selectedtrue or false
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-canvasitem-clip-ancestry (type-family match)canvasitem-ancestor-clips-childrenwarning
canvasitem-ancestor-is-canvasgroupwarning
valid-control-properties (type-family match)control-tooltip-ignored-by-mouse-filterwarning
control-property-orderwarning
valid-graph-element-selection (type-family match)graph-element-selected-not-selectableerror

All of GraphElement's own members format-check as a plain Vector2 or bool. The lenient parser reads all of them. position_offset, resizable, draggable, selectable and scaling_menus pass through as parsed. selected is forced to false whenever selectable = false, because GraphElement::set_selectable calls set_selected(false) unconditionally. This matches the render behaviour, not only the linter's graph-element-selected-not-selectable warning above.

GraphFrame

renders as a titled frame around its own content rect docs ↗ source ↗ unit-graph-frame.tscn ↗ Unreviewed
Comparison images not captured yet for GraphFrame.

GraphFrame is a GraphElement that groups and auto-resizes around other elements inside a GraphEdit. The previewer draws its panel/titlebar StyleBoxes (tint-substituted when tint_color_enabled), the title text, and the resize handle when resizable is set and autoshrink_enabled is not. It draws the frame at its authored size/position_offset. That is the rect a freshly loaded scene shows. attach_graph_element_to_frame is a runtime call with no .tscn surface, so no auto-resize runs before a script calls it.

Linting

Strict parsing format-checks these GraphFrame properties, plus 6 inherited from GraphElement, 53 inherited from Control, 16 inherited from CanvasItem, 10 inherited from Node. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

PropertyAcceptsOut of range
autoshrink_enabledtrue or false
autoshrink_margininteger 0-128warning
drag_margininteger 0-128warning
tint_colorColor(r, g, b, a), or the colour string or int it converts
tint_color_enabledtrue or false
titlequoted string, or the &"…" StringName or NodePath("…") it converts
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-canvasitem-clip-ancestry (type-family match)canvasitem-ancestor-clips-childrenwarning
canvasitem-ancestor-is-canvasgroupwarning
valid-control-properties (type-family match)control-tooltip-ignored-by-mouse-filterwarning
control-property-orderwarning
valid-graph-element-selection (type-family match)graph-element-selected-not-selectableerror

The lenient parser reads title, autoshrink_enabled, autoshrink_margin, drag_margin, tint_color_enabled and tint_color the same way the strict one does. An out-of-range autoshrink_margin or drag_margin still applies as parsed, since both are warnings, not errors, in the linter. A malformed tint_color resolves to undefined and falls back to Color(0.3, 0.3, 0.3, 0.75) at draw time.

GraphNode

renders as a titled panel with slot rows and left/right port icons docs ↗ source ↗ unit-graph-node.tscn ↗ Unreviewed
Comparison images not captured yet for GraphNode.

GraphNode is a titled container inside a GraphEdit whose children become slots with input and output ports. The previewer draws its panel/titlebar StyleBoxes, the title text and one left/right port icon per enabled slot side. It adds each slot's own StyleBox when draw_stylebox is set, and the resize handle when resizable is set.

Linting

Strict parsing format-checks these GraphNode properties, plus 6 inherited from GraphElement, 53 inherited from Control, 16 inherited from CanvasItem, 10 inherited from Node. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

PropertyAcceptsOut of range
ignore_invalid_connection_typetrue or false
slot/*slot
slots_focus_modeenum 1-3 (Click/All/Accessibility)error
titlequoted string, or the &"…" StringName or NodePath("…") it converts
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-canvasitem-clip-ancestry (type-family match)canvasitem-ancestor-clips-childrenwarning
canvasitem-ancestor-is-canvasgroupwarning
valid-control-properties (type-family match)control-tooltip-ignored-by-mouse-filterwarning
control-property-orderwarning
valid-graph-element-selection (type-family match)graph-element-selected-not-selectableerror

The lenient parser reads title, ignore_invalid_connection_type and slots_focus_mode the same way the strict one does. slot/<index>/<leaf> is replayed in file order, one leaf write at a time, as GraphNode::_set does. An unparseable leaf value is dropped, not applied. A slot that authors only draw_stylebox = false, with every other leaf at its class default, is erased, as the erase condition of GraphNode::set_slot requires.

GridContainer

renders as children packed into a fixed column count docs ↗ source ↗ unit-grid-container.tscn ↗ Done
Godot render of GridContainer Our render of GridContainer
Godot 4.6.3 Ours

GridContainer lays its children into a fixed number of columns and wraps to a new row. Column widths and row heights come from the children's minimum sizes. A right-to-left layout_direction starts each row at the opposite edge and fills it the other way, with the same column widths and row heights.

Linting

Strict parsing format-checks these GridContainer properties, plus 53 inherited from Control, 16 inherited from CanvasItem, 10 inherited from Node. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

PropertyAcceptsOut of range
columnsinteger 1-1024error below, warning above
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-canvasitem-clip-ancestry (type-family match)canvasitem-ancestor-clips-childrenwarning
canvasitem-ancestor-is-canvasgroupwarning
valid-control-properties (type-family match)control-tooltip-ignored-by-mouse-filterwarning
control-property-orderwarning

columns goes through parseOptionalInt, so an absent or unparseable value becomes undefined with no warning. The Component clamps that, and any value below 1, up to one column. A missing h_separation or v_separation takes the Component's default of 4 px.

GridMap

renders as a THREE.InstancedMesh per MeshLibrary item surface, or a mesh per cell when that surface's material billboards docs ↗ source ↗ unit-grid-map.tscn ↗ Limitation
Godot render of GridMap Our render of GridMap
Godot 4.6.3 Ours

Instances each populated cell's MeshLibrary item mesh, batching the cells of each item surface into one THREE.InstancedMesh with that surface's material. A surface whose material billboards draws one mesh per cell instead, so it turns about its own cell as Godot's does. The fixture's nine flat tiles read as one grey surface receding to the upper right in both images.

Linting

Strict parsing format-checks these GridMap properties, plus 17 inherited from Node3D, 10 inherited from Node. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

PropertyAcceptsOut of range
bake_navigationtrue or false
baked_meshesArray of resource references ([SubResource("id"), …])
cell_center_xtrue or false
cell_center_ytrue or false
cell_center_ztrue or false
cell_octant_sizeinteger, nonzero, 1-1024 hintedwarning
cell_scalefloat
cell_sizeVector3(x, y, z), or the Vector3i spelling Godot converts
collision_layer32-bit layer mask (layers 1-32)
collision_mask32-bit layer mask (layers 1-32)
collision_priorityfloat
dataDictionary literal { "cells": PackedInt32Array(...) }
mesh_librarynull, SubResource("id"), ExtResource("id") or Resource("path")
physics_materialnull, SubResource("id"), ExtResource("id") or Resource("path")
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-node3d-visibility (type-family match)valid-node3d-visibilityerror
valid-gridmap-resourcesgridmap-requires-mesh-libraryinfo

cell_size falls back silently to Godot's default Vector3(2, 2, 2) on a malformed value. mesh_library is copied straight through when present, with no check that it resolves. cell_center_x, _y and _z default to true when all three are absent. Otherwise each warns and falls back to true on its own through boolOr.

Known limitations

  • Approximated cell_scale is not parsed, so a map that sets it renders every tile at the wrong size.

GrooveJoint2D

renders as nothing (a transform-only group, the groove is an editor gizmo) docs ↗ source ↗ unit-groove-joint-2d.tscn ↗ Linter only
No visual output — this node draws nothing to compare.

Restricts body B to sliding along a fixed axis from the joint's origin. Godot draws the groove only as a debug line, so the previewer renders it as a transform-only group (ADR-0008).

Linting

Strict parsing format-checks these GrooveJoint2D properties, plus 4 inherited from Joint2D, 12 inherited from Node2D, 16 inherited from CanvasItem, 10 inherited from Node. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

PropertyAcceptsOut of range
initial_offsetfloat 1-65535warning
lengthfloat 1-65535warning
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-canvasitem-clip-ancestry (type-family match)canvasitem-ancestor-clips-childrenwarning
canvasitem-ancestor-is-canvasgroupwarning
valid-joint (type-family match)joint-not-connectedwarning
joint-same-bodywarning

GrooveJoint2D registers parseNode2D directly, so length and initial_offset are never read. An out-of-range length = 70000 or a non-numeric initial_offset is dropped rather than substituted or warned on.

HBoxContainer

renders as children laid out along a row docs ↗ source ↗ unit-hbox-container.tscn ↗ Done
Godot render of HBoxContainer Our render of HBoxContainer
Godot 4.6.3 Ours

HBoxContainer stacks its children in a horizontal row, spaced by separation and sized by each child's size_flags. A right-to-left layout_direction reverses that row and packs it against the opposite edge.

Linting

Strict parsing format-checks the inherited set (1 inherited from BoxContainer, 53 inherited from Control, 16 inherited from CanvasItem, 10 inherited from Node); HBoxContainer declares none of its own. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032). HBoxContainer also REFUSES vertical, which its base declares but this class cannot carry.

PropertyAcceptsOut of range
verticalnot available on this type
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-canvasitem-clip-ancestry (type-family match)canvasitem-ancestor-clips-childrenwarning
canvasitem-ancestor-is-canvasgroupwarning
valid-control-properties (type-family match)control-tooltip-ignored-by-mouse-filterwarning
control-property-orderwarning

alignment goes through parseOptionalInt, so an absent or unparseable value becomes undefined with no warning and maps to flex-start, Godot's BEGIN default. A missing theme_override_constants/separation takes the Component's default of 4 px, which is Godot's default.

HFlowContainer

renders as children flowed left to right, wrapping to a new row docs ↗ source ↗ unit-h-flow-container.tscn ↗ Unreviewed
Comparison images not captured yet for HFlowContainer.

HFlowContainer is a FlowContainer fixed to the horizontal axis. Children flow left to right and wrap to a new row when the current one runs out of width. It draws nothing itself. A right-to-left layout_direction mirrors every row horizontally.

Linting

Strict parsing format-checks the inherited set (3 inherited from FlowContainer, 53 inherited from Control, 16 inherited from CanvasItem, 10 inherited from Node); HFlowContainer declares none of its own. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032). HFlowContainer also REFUSES vertical, which its base declares but this class cannot carry.

PropertyAcceptsOut of range
verticalnot available on this type
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-canvasitem-clip-ancestry (type-family match)canvasitem-ancestor-clips-childrenwarning
canvasitem-ancestor-is-canvasgroupwarning
valid-control-properties (type-family match)control-tooltip-ignored-by-mouse-filterwarning
control-property-orderwarning

HFlowContainer declares no member of its own and removes vertical. index.ts reuses FlowContainer's parser, which never reads vertical, so a scene with that key parses the same as one without. The solver reads this node's type, not the property, to fix its orientation to horizontal. Only strict rejects the key.

Known limitations

  • Approximated A TextureRect child with a Fit expand mode inside a multi-line flow is sized like any other child, where Godot keeps its previous frame's size.

HingeJoint3D

renders as nothing (a transform-only group) docs ↗ source ↗ unit-hinge-joint-3d.tscn ↗ Linter only
No visual output — this node draws nothing to compare.

A joint that restricts a body's rotation to one axis relative to another body. It draws nothing at runtime, so the previewer renders it as a transform-only group (ADR-0008). Godot shows the hinge only as an editor gizmo.

Linting

Strict parsing format-checks these HingeJoint3D properties, plus 4 inherited from Joint3D, 17 inherited from Node3D, 10 inherited from Node. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

PropertyAcceptsOut of range
angular_limit/biasfloat 0.01-0.99warning
angular_limit/enabletrue or false
angular_limit/lowerradians, -180° to 180°warning
angular_limit/relaxationfloat 0.01-16warning
angular_limit/softnessfloat 0.01-16warning
angular_limit/upperradians, -180° to 180°warning
motor/enabletrue or false
motor/max_impulsefloat 0.01-1024warning
motor/target_velocityfloat
params/biasfloat 0-0.99warning
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-node3d-visibility (type-family match)valid-node3d-visibilityerror
valid-joint (type-family match)joint-not-connectedwarning
joint-same-bodywarning

index.ts registers parseNode3D directly, which reads only transform and visible. An out-of-range angular_limit/upper or a malformed motor/enable is dropped from the lenient tree rather than substituted or warned on.

HScrollBar

renders as a horizontal track with a rectangular grabber docs ↗ source ↗ unit-h-scroll-bar.tscn ↗ Done
Godot render of HScrollBar Our render of HScrollBar
Godot 4.6.3 Ours

HScrollBar is a horizontal track with a draggable grabber and step buttons. The previewer draws the track and the grabber, sized and positioned from value, min_value, max_value and page. Godot's default theme sets every increment and decrement icon to an empty texture, so neither Godot nor the previewer draws step buttons.

Linting

Strict parsing format-checks the inherited set (1 inherited from ScrollBar, 9 inherited from Range, 53 inherited from Control, 16 inherited from CanvasItem, 10 inherited from Node); HScrollBar declares none of its own. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-canvasitem-clip-ancestry (type-family match)canvasitem-ancestor-clips-childrenwarning
canvasitem-ancestor-is-canvasgroupwarning
valid-control-properties (type-family match)control-tooltip-ignored-by-mouse-filterwarning
control-property-orderwarning
valid-range-bounds (type-family match)range-max-below-minerror
range-exp-edit-negative-minwarning

The lenient parser is parseHScrollBar, which reuses the shared Range reader for value, min_value, max_value and page, plus its own custom_step. A malformed number becomes undefined and the bar falls back to Godot's Range defaults: min 0, max 100, value 0, page 0. custom_step never reaches a draw formula, so a malformed one is harmless.

HSeparator

renders as a thin horizontal quad docs ↗ source ↗ unit-h-separator.tscn ↗ Unreviewed
Comparison images not captured yet for HSeparator.

HSeparator draws the default theme's separator StyleBoxLine (or a resolved theme_override_styles/separator override) as a thin horizontal band, centred on the cross axis and sized by the separation theme constant.

Linting

Strict parsing format-checks the inherited set (53 inherited from Control, 16 inherited from CanvasItem, 10 inherited from Node); HSeparator declares none of its own. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-canvasitem-clip-ancestry (type-family match)canvasitem-ancestor-clips-childrenwarning
canvasitem-ancestor-is-canvasgroupwarning
valid-control-properties (type-family match)control-tooltip-ignored-by-mouse-filterwarning
control-property-orderwarning

HSeparator binds no property of its own, only theme items, so linterParser.ts declares nothing for it. The strict and lenient parsers agree on every key, since index.ts reuses parseControl unchanged.

HSlider

renders as a horizontal track with a round grabber docs ↗ source ↗ unit-hslider.tscn ↗ Done
Godot render of HSlider Our render of HSlider
Godot 4.6.3 Ours

HSlider is a horizontal slider over a Range. The previewer draws the four parts Godot does: the track, the fill, the tick marks and the grabber.

Linting

Strict parsing format-checks the inherited set (5 inherited from Slider, 9 inherited from Range, 53 inherited from Control, 16 inherited from CanvasItem, 10 inherited from Node); HSlider declares none of its own. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-canvasitem-clip-ancestry (type-family match)canvasitem-ancestor-clips-childrenwarning
canvasitem-ancestor-is-canvasgroupwarning
valid-control-properties (type-family match)control-tooltip-ignored-by-mouse-filterwarning
control-property-orderwarning
valid-range-bounds (type-family match)range-max-below-minerror
range-exp-edit-negative-minwarning
hslider-property-orderhslider-property-orderwarning

value, min_value, max_value and step have no strict counterpart and go through the optional-float reader. An unparseable number becomes undefined and the slider takes Godot's defaults of 0, 0 and 100. A value outside the range is clamped silently, and a malformed tick_count draws no ticks.

Known limitations

  • Not drawn Slider's right-to-left drag origin and motion (slider.cpp:77,116), ui_left/ui_right step (:144,160) and joypad repeat (:216,224), which need pointer or gamepad state.

HSplitContainer

renders as two children side by side, split at a computed offset docs ↗ source ↗ unit-split-container.tscn ↗ Done
Godot render of HSplitContainer Our render of HSplitContainer
Godot 4.6.3 Ours

HSplitContainer places its children side by side, split where each entry of split_offsets puts that boundary, with the dragger's band between them. A right-to-left layout_direction puts the first child on the right and mirrors every boundary.

Linting

Strict parsing format-checks the inherited set (10 inherited from SplitContainer, 53 inherited from Control, 16 inherited from CanvasItem, 10 inherited from Node); HSplitContainer declares none of its own. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032). HSplitContainer also REFUSES vertical, which its base declares but this class cannot carry.

PropertyAcceptsOut of range
verticalnot available on this type
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-canvasitem-clip-ancestry (type-family match)canvasitem-ancestor-clips-childrenwarning
canvasitem-ancestor-is-canvasgroupwarning
valid-control-properties (type-family match)control-tooltip-ignored-by-mouse-filterwarning
control-property-orderwarning

Neither parser reads split_offset, collapsed or dragger_visibility beyond its scalar type, and an out-of-range dragger_visibility behaves as VISIBLE on both sides. A malformed value leaves the property undefined and Godot's default applies. The lenient parser also reads the split_offsets array, and replays a split_offset scalar onto its first entry in file order. A malformed split_offsets is skipped.

HTTPRequest

renders as nothing (a transform-only group) docs ↗ source ↗ unit-http-request.tscn ↗ Linter only
No visual output — this node draws nothing to compare.

Issues HTTP requests at runtime and draws nothing, so the previewer renders it as a transform-only group (ADR-0008) and its children still show.

Linting

Strict parsing format-checks these HTTPRequest properties, plus 10 inherited from Node. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

PropertyAcceptsOut of range
accept_gziptrue or false
body_size_limitinteger -1-2000000000warning
download_chunk_sizeinteger 256-16777216error
download_filequoted string, or the &"…" StringName or NodePath("…") it converts
max_redirectsinteger -1-64warning
timeoutfloat >= 0error below
use_threadstrue or false
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo

index.ts registers the base parseNode, which reads only the heading attributes and transform. A malformed download_chunk_size is never read on the lenient path, so there is no fallback to report.

ImporterMeshInstance3D

renders as nothing (a transform-only group) docs ↗ source ↗ unit-importer-mesh-instance-3d.tscn ↗ Linter only
No visual output — this node draws nothing to compare.

An import-pipeline node that Godot's importer replaces with a real MeshInstance3D before the scene runs, so it draws nothing at runtime. The previewer renders it as a transform-only group (ADR-0008) and its children still show.

Linting

Strict parsing format-checks these ImporterMeshInstance3D properties, plus 17 inherited from Node3D, 10 inherited from Node. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

PropertyAcceptsOut of range
cast_shadowenum 0-3 (OFF/ON/DOUBLE_SIDED/SHADOWS_ONLY)warning
layer_mask32-bit layer mask (layers 1-32)
meshnull, SubResource("id"), ExtResource("id") or Resource("path")
skeleton_pathNodePath("path/to/node")
skinnull, SubResource("id"), ExtResource("id") or Resource("path")
visibility_range_beginfloat >= 0warning below
visibility_range_begin_marginfloat >= 0warning below
visibility_range_endfloat >= 0warning below
visibility_range_end_marginfloat >= 0warning below
visibility_range_fade_modeenum 0-2 (DISABLED/SELF/DEPENDENCIES)warning
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-node3d-visibility (type-family match)valid-node3d-visibilityerror

index.ts registers the plain parseNode reader, which decodes only transform. mesh, skin, layer_mask, cast_shadow and the visibility_range_* keys are never decoded by the lenient parser, and a malformed transform warns and substitutes the identity.

Isometric Dungeon

renders as Godot's isometric dungeon demo — one whole scene dungeon.tscn ↗ Limitation

Godot's isometric dungeon demo: a large map of stone walls, pillars and floor tiles, with jars, coins, doors, enemies, candles and lights.

What it exercises

  • A large isometric TileMapLayer
  • Sprite2D props as PackedScene instances inside a y_sort_enabled subtree
  • Draw order and occlusion down the isometric depth
  • 61 Polygon2D nodes: soft shadows, floor decals and additive torch pools
  • A CanvasModulate over 45 PointLight2D nodes and 8 LightOccluder2D nodes

Draw order and the light pass match.

Known limitations

  • Needs runtime The candle sparks draw here and not in Godot (see Candle).
  • Approximated The coin stacks, the paw-print stains and the inner rings of the circles read softer and darker than Godot's.

The pieces on their own

Each section below shows one of the dungeon's own PackedScenes on a neutral backdrop, so a difference has one owner. The wrappers in scenes/isometric/previews/ only re-centre them.

Godot render of Isometric Dungeon Our render of Isometric Dungeon
Godot 4.6.3 Ours

Candle

Limitation
Godot render of Candle Our render of Candle
Godot 4.6.3 Ours

A wick, four CPUParticles2D emitters and two PointLight2D nodes. The wick, the flame and the light pools match.

  • Needs runtime The previewer draws each emitter settled over one lifetime, so a spark above the flame shows here and not in Godot's first frame.

Internal shadow

Done
Godot render of Internal shadow Our render of Internal shadow
Godot 4.6.3 Ours

One Polygon2D with a gradient texture and UVs outside 0 to 1. It matches Godot.

Goblin

Done
Godot render of Goblin Our render of Goblin
Godot 4.6.3 Ours

A CharacterBody2D with an AnimatedSprite2D, a drop-shadow Sprite2D, a Camera2D and a hidden LightOccluder2D. The sprite, its frame and the drop shadow match Godot.

ItemList

renders as a panel StyleBox plus a packed grid of icon/label rows docs ↗ source ↗ unit-item-list.tscn ↗ Unreviewed
Comparison images not captured yet for ItemList.

ItemList is a scrollable list of selectable rows, each an optional icon and a label, in one or more columns. The previewer draws the panel and every row's icon and text, packed by max_columns/same_column_width/fixed_column_width/icon_mode. A disabled row's icon and text are dimmed. Outside TOP icon mode, a row or column guide line marks every packed separator. A right-to-left list mirrors each row's icon inside the list's width. Its label's pen is re-derived and lands at a different distance from the icon than the left-to-right pen.

No row is drawn selected, hovered or under a cursor highlight. selected, the current index and a live hover or focus state are never part of a .tscn.

Linting

Strict parsing format-checks these ItemList properties, plus 53 inherited from Control, 16 inherited from CanvasItem, 10 inherited from Node. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

PropertyAcceptsOut of range
allow_reselecttrue or false
allow_rmb_selecttrue or false
allow_searchtrue or false
auto_heighttrue or false
auto_widthtrue or false
fixed_column_widthinteger >= 0error below
fixed_icon_sizeVector2i(x, y), or the Vector2 spelling Godot converts
icon_modeenum 0-1 (ICON_MODE_TOP/ICON_MODE_LEFT)error
icon_scalefloat
item_#/*item_<index>/<leaf> (see item_list.cpp, PropertyListHelper-backed)
item_countinteger >= 0error below
itemsArray literal ([...] or ArrayT)
max_columnsinteger >= 0error below
max_text_linesinteger >= 1error below
same_column_widthtrue or false
scroll_hint_modeenum 0-3 (SCROLL_HINT_MODE_DISABLED/SCROLL_HINT_MODE_BOTH/SCROLL_HINT_MODE_TOP/SCROLL_HINT_MODE_BOTTOM)warning
select_modeenum 0-2 (SELECT_SINGLE/SELECT_MULTI/SELECT_TOGGLE)warning
text_overrun_behaviorenum 0-6 (OVERRUN_NO_TRIMMING/OVERRUN_TRIM_CHAR/OVERRUN_TRIM_WORD/OVERRUN_TRIM_ELLIPSIS/OVERRUN_TRIM_WORD_ELLIPSIS/OVERRUN_TRIM_ELLIPSIS_FORCE/OVERRUN_TRIM_WORD_ELLIPSIS_FORCE)warning
tile_scroll_hinttrue or false
wraparound_itemstrue or false
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-canvasitem-clip-ancestry (type-family match)canvasitem-ancestor-clips-childrenwarning
canvasitem-ancestor-is-canvasgroupwarning
valid-control-properties (type-family match)control-tooltip-ignored-by-mouse-filterwarning
control-property-orderwarning
valid-itemlist-properties (type-family match)itemlist-item-index-out-of-rangeerror

The lenient parser reads every property above and the item_N/text/item_N/icon/ item_N/selectable/item_N/disabled family, clamped to item_count rows. Godot drops a PropertyListHelper write past that count (ERR_FAIL_INDEX), so this parser drops it too and substitutes nothing. valid-itemlist-properties warns when an item_<N>/ index reaches past item_count, since Godot then drops the value and logs nothing.

The parser also reads the deprecated items = [text, icon, disabled, …] array (ItemList::_set, item_list.cpp:2242-2259), but only for a file with no item_count. Godot's saver never writes both forms in one file, because the array predates the PropertyListHelper family. So a file that carries both is read as item_count/item_N/* only. A wrong arity (arr.size() % 3 != 0) yields no rows, as Godot's ERR_FAIL_COND_V does before clear() runs.

Known limitations

  • Not drawn The scroll-hint icon (scroll_hint_mode), which needs a live scroll position that no static file has.
  • Not drawn The focus StyleBox and every selected, hovered or cursor row background, since hover, focus, selected and the current index are not .tscn properties.
  • Not drawn custom_bg_color/custom_fg_color/icon_modulate/icon_region/ icon_transposed are real Item members that a .tscn cannot author, since none is a PropertyListHelper-registered leaf.
  • Approximated A TOP-icon-mode, multi-line label wraps at word boundaries only, so a long word overflows its column where Godot breaks it mid-word.
  • Approximated A row's text is shaped once, at its auto_width/auto_height width, so a column of another width keeps lines that Godot re-wraps.
  • Approximated max_text_lines reserves a row's text height but does not cap its lines, where Godot collapses the tail into an ellipsis on the last visible line.
  • Approximated A right-to-left script draws in logical order, since the previewer has no bidirectional pass, though every layout branch of is_layout_rtl() is ported.
  • Not drawn Both scrollbars, along with the row-guide shift and narrower packing that a right-to-left vertical scrollbar causes (item_list.cpp:1454-1458, :1862-1864).
  • Approximated A right-to-left, CENTER-aligned TOP-mode line wider than its box stays at the box origin, where Godot pulls it to the trailing edge (text_paragraph.cpp:907-914).
  • Needs runtime The right-to-left arms of get_item_at_position (item_list.cpp:1975,1986) and is_pos_at_end_of_items (:2021-2023) answer mouse hits under a live cursor, which a static preview does not have.
  • Approximated text_overrun_behavior trims each row at its minimum-size width (fixed_column_width, or unconstrained when unset), so a row narrower at draw time is not re-trimmed.

JacobianIK3D

renders as nothing yet, Godot converges its chain onto the target each frame, the previewer does not docs ↗ source ↗ unit-jacobian-ik-3d.tscn ↗ Not implemented
No visual output — this node draws nothing to compare.

A Jacobian-transpose IK solver that turns every joint in the chain at once toward the target, converging slowly but moving smoothly. Godot runs the solver each frame, and the previewer does not yet (ADR-0045): the bones hold their rest pose.

Linting

Strict parsing format-checks the inherited set (6 inherited from IterateIK3D, 1 inherited from IKModifier3D, 2 inherited from SkeletonModifier3D, 17 inherited from Node3D, 10 inherited from Node); JacobianIK3D declares none of its own. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-node3d-visibility (type-family match)valid-node3d-visibilityerror
valid-skeletonmodifier3d-parent (type-family match)skeletonmodifier3d-parent-not-skeleton3dwarning
valid-iterateik3d-target-node (type-family match)iterateik3d-setting-missing-target-nodewarning

JacobianIK3D declares no validator of its own, and the slice registers parseNode3D directly, so only the Node3D keys are read. An angular_delta_limit above PI is a warning strict reports through the inherited set and lenient drops.

Label

renders as a shaped text run on the canvas docs ↗ source ↗ unit-label-2d.tscn ↗ Limitation
Godot render of Label Our render of Label
Godot 4.6.3 Ours

Label is the 2D UI text node. The previewer shapes the string in the theme's font (or in the size, colour and line spacing of label_settings, which override the theme outright) and draws the glyphs on the canvas. It honours the alignment, case, wrap, line-window and partial-reveal settings.

Linting

Strict parsing format-checks these Label properties, plus 53 inherited from Control, 16 inherited from CanvasItem, 10 inherited from Node. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

PropertyAcceptsOut of range
autowrap_modeenum 0-3 (AUTOWRAP_OFF/AUTOWRAP_ARBITRARY/AUTOWRAP_WORD/AUTOWRAP_WORD_SMART)warning
autowrap_trim_flagsbit mask of BREAK_TRIM_INDENT (32) | BREAK_TRIM_START_EDGE_SPACES (64) | BREAK_TRIM_END_EDGE_SPACES (128)
clip_texttrue or false
ellipsis_charquoted string (or the &"…" StringName or NodePath("…") it converts), at most one character
horizontal_alignmentenum 0-3 (HORIZONTAL_ALIGNMENT_LEFT/HORIZONTAL_ALIGNMENT_CENTER/HORIZONTAL_ALIGNMENT_RIGHT/HORIZONTAL_ALIGNMENT_FILL)error
justification_flagsbit mask of JUSTIFICATION_KASHIDA (1) | JUSTIFICATION_WORD_BOUND (2) | JUSTIFICATION_AFTER_LAST_TAB (8) | JUSTIFICATION_SKIP_LAST_LINE (32) | JUSTIFICATION_SKIP_LAST_LINE_WITH_VISIBLE_CHARS (64) | JUSTIFICATION_DO_NOT_SKIP_SINGLE_LINE (128)
label_settingsnull, SubResource("id"), ExtResource("id") or Resource("path")
languagequoted string, or the &"…" StringName or NodePath("…") it converts
lines_skippedinteger 0-999error below, warning above
max_lines_visibleinteger -1-999warning
paragraph_separatorquoted string, or the &"…" StringName or NodePath("…") it converts
structured_text_bidi_overrideenum 0-6 (STRUCTURED_TEXT_DEFAULT/STRUCTURED_TEXT_URI/STRUCTURED_TEXT_FILE/STRUCTURED_TEXT_EMAIL/STRUCTURED_TEXT_LIST/STRUCTURED_TEXT_GDSCRIPT/STRUCTURED_TEXT_CUSTOM)warning
structured_text_bidi_override_optionsArray literal ([...] or ArrayT)
tab_stopsPackedFloat32Array(x, y, …)
textquoted string, or the &"…" StringName or NodePath("…") it converts
text_directionenum 0-3 (TEXT_DIRECTION_AUTO/TEXT_DIRECTION_LTR/TEXT_DIRECTION_RTL/TEXT_DIRECTION_INHERITED)error below -1, warning below 0, error above 3
text_overrun_behaviorenum 0-6 (OVERRUN_NO_TRIMMING/OVERRUN_TRIM_CHAR/OVERRUN_TRIM_WORD/OVERRUN_TRIM_ELLIPSIS/OVERRUN_TRIM_WORD_ELLIPSIS/OVERRUN_TRIM_ELLIPSIS_FORCE/OVERRUN_TRIM_WORD_ELLIPSIS_FORCE)warning
uppercasetrue or false
vertical_alignmentenum 0-3 (VERTICAL_ALIGNMENT_TOP/VERTICAL_ALIGNMENT_CENTER/VERTICAL_ALIGNMENT_BOTTOM/VERTICAL_ALIGNMENT_FILL)error
visible_charactersinteger -1-128000warning
visible_characters_behaviorenum 0-4 (VC_CHARS_BEFORE_SHAPING/VC_CHARS_AFTER_SHAPING/VC_GLYPHS_AUTO/VC_GLYPHS_LTR/VC_GLYPHS_RTL)warning
visible_ratiofloat 0-1warning
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-canvasitem-clip-ancestry (type-family match)canvasitem-ancestor-clips-childrenwarning
canvasitem-ancestor-is-canvasgroupwarning
valid-control-properties (type-family match)control-tooltip-ignored-by-mouse-filterwarning
control-property-orderwarning
valid-label-autowrap-sizinglabel-autowrap-needs-custom-minimum-sizewarning

The lenient parser reads text, horizontal_alignment, vertical_alignment, autowrap_mode, uppercase, text_overrun_behavior, clip_text, ellipsis_char, justification_flags, tab_stops, autowrap_trim_flags, paragraph_separator, lines_skipped, max_lines_visible, label_settings, visible_characters, visible_ratio and visible_characters_behavior. An out-of-range or unparseable alignment becomes undefined with no warning. uppercase turns on only for a value that reads as true. ellipsis_char keeps only its first character, and a malformed tab_stops literal leaves tab stops unset.

visible_characters and visible_ratio derive each other as Label::set_visible_characters/set_visible_ratio do (label.cpp:1285-1327). Whichever the scene writes last, in file order, wins outright. Each setter's guard is if (this_field != new_value), and the earlier setter already left the field at the value the later write matches. The parser replays both writes in file order against Label's construction defaults. It assumes that text, whose length is the denominator, is already applied. Every real Godot save guarantees that, since text is the first ADD_PROPERTY, but a hand-edited file that writes text after either does not.

Known limitations

  • Approximated A wrapping Label inside a ScrollContainer can read one line short when the wrap is what makes the scrollbar appear.
  • Not drawn BREAK_TRIM_INDENT (an autowrap_trim_flags bit): a wrapped continuation line does not reserve the leading tab/space indent Godot re-applies to it.
  • Approximated A FILL-aligned Label with autowrap OFF and a trimming text_overrun_behavior puts the ellipsis after the last kept glyph, where Godot re-justifies the line.
  • Not drawn label_settings.font, so every Label shapes in its theme font.
  • Not drawn label_settings.paragraph_spacing.
  • Not drawn The stacked-outline and stacked-shadow arrays of label_settings, while its single outline and shadow and the theme's own draw.
  • Approximated A non-default visible_characters_behavior counts glyphs as a proxy for Godot's indices, so the reveal count drifts by one per trimmed line-edge space past the first.
  • Not drawn The doubled-backslash escapes of paragraph_separator, so a literal "\\n" stays two characters where Godot's String::c_unescape() (label.cpp:158) makes it a newline.
  • Not drawn The line-count clamp of get_layout_data (label.cpp:533-548), so text taller than the rect overflows it here, where Godot drops the lowest lines.
  • Not drawn The right-to-left arm of HORIZONTAL_ALIGNMENT_FILL (label.cpp:472-478) and the leading-edge ellipsis (label.h:198-241), which only a non-default text_direction reaches.
  • Not drawn Bidirectional reordering of a mixed-direction paragraph (text_server_adv.cpp:5374): the bundled atlas covers no RTL script.

Label3D

renders as canvas-rasterised glyph quads, billboard-able docs ↗ source ↗ unit-label3d.tscn ↗ Limitation
Godot render of Label3D Our render of Label3D
Godot 4.6.3 Ours

Draws a single line of text on a flat plane in 3D space. The previewer rasterises each label to a canvas texture and maps it onto a transparent plane sized by pixel_size. It tints the plane by modulate and orients it by the node's billboard mode.

A label casts no shadow by default, as its constructor turns cast_shadow off (label_3d.cpp:1090). With it on, the glyphs cast when Godot files their surface in the shadow pass (render_forward_clustered.cpp:4079-4089). That pass takes a cut surface, or an OPAQUE_PREPASS one, with the depth test on. An OPAQUE_PREPASS surface blends uncut, writes its depth in a depth prepass cut at 0.99, and cuts its shadow at 0.1 (render_forward_clustered.cpp:1791,2770). A blended label, the default alpha_cut, casts nothing. The label3d-shadow golden pins this.

Linting

Strict parsing format-checks these Label3D properties, plus 18 inherited from GeometryInstance3D, 1 inherited from VisualInstance3D, 17 inherited from Node3D, 10 inherited from Node. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

PropertyAcceptsOut of range
alpha_antialiasing_edgefloat 0-1warning
alpha_antialiasing_modeenum 0-2 (OFF/ALPHA_TO_COVERAGE/ALPHA_TO_COVERAGE_AND_TO_ONE)warning
alpha_cutenum 0-3 (DISABLED/DISCARD/OPAQUE_PREPASS/HASH)error
alpha_hash_scalefloat 0-2warning
alpha_scissor_thresholdfloat 0-1warning
autowrap_modeenum 0-3 (AUTOWRAP_OFF/AUTOWRAP_ARBITRARY/AUTOWRAP_WORD/AUTOWRAP_WORD_SMART)warning
autowrap_trim_flagsbit mask of BREAK_TRIM_INDENT (32) | BREAK_TRIM_START_EDGE_SPACES (64) | BREAK_TRIM_END_EDGE_SPACES (128)
billboardenum 0-2 (DISABLED/ENABLED/FIXED_Y)error
double_sidedtrue or false
fixed_sizetrue or false
fontnull, SubResource("id"), ExtResource("id") or Resource("path")
font_sizeinteger >= 1warning below
horizontal_alignmentenum 0-3 (HORIZONTAL_ALIGNMENT_LEFT/HORIZONTAL_ALIGNMENT_CENTER/HORIZONTAL_ALIGNMENT_RIGHT/HORIZONTAL_ALIGNMENT_FILL)error
justification_flagsbit mask of JUSTIFICATION_KASHIDA (1) | JUSTIFICATION_WORD_BOUND (2) | JUSTIFICATION_AFTER_LAST_TAB (8) | JUSTIFICATION_SKIP_LAST_LINE (32) | JUSTIFICATION_SKIP_LAST_LINE_WITH_VISIBLE_CHARS (64) | JUSTIFICATION_DO_NOT_SKIP_SINGLE_LINE (128)
languagequoted string, or the &"…" StringName or NodePath("…") it converts
line_spacingfloat
modulateColor(r, g, b, a), or the colour string or int it converts
no_depth_testtrue or false
offsetVector2(x, y), or the Vector2i spelling Godot converts
outline_modulateColor(r, g, b, a), or the colour string or int it converts
outline_render_priorityinteger -128-127error
outline_sizeinteger 0-127warning
pixel_sizefloat 0.0001-128warning
render_priorityinteger -128-127error
shadedtrue or false
structured_text_bidi_overrideenum 0-6 (STRUCTURED_TEXT_DEFAULT/STRUCTURED_TEXT_URI/STRUCTURED_TEXT_FILE/STRUCTURED_TEXT_EMAIL/STRUCTURED_TEXT_LIST/STRUCTURED_TEXT_GDSCRIPT/STRUCTURED_TEXT_CUSTOM)warning
structured_text_bidi_override_optionsArray literal ([...] or ArrayT)
textquoted string, or the &"…" StringName or NodePath("…") it converts
text_directionenum 0-2 (TEXT_DIRECTION_AUTO/TEXT_DIRECTION_LTR/TEXT_DIRECTION_RTL)error below -1, warning below 0, warning above 2, error above 3
texture_filterenum 0-5 (NEAREST/LINEAR/NEAREST_WITH_MIPMAPS/LINEAR_WITH_MIPMAPS/NEAREST_WITH_MIPMAPS_ANISOTROPIC/LINEAR_WITH_MIPMAPS_ANISOTROPIC)warning
uppercasetrue or false
vertical_alignmentenum 0-2 (VERTICAL_ALIGNMENT_TOP/VERTICAL_ALIGNMENT_CENTER/VERTICAL_ALIGNMENT_BOTTOM)error below 0, warning above 2, error above 3
widthfloat
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-node3d-visibility (type-family match)valid-node3d-visibilityerror
valid-geometryinstance3d-visibility-range (type-family match)geometryinstance3d-visibility-range-end-before-beginwarning
geometryinstance3d-visibility-range-begin-fade-without-marginwarning
geometryinstance3d-visibility-range-end-fade-without-marginwarning

pixel_size, outline_size, font_size, line_spacing and alpha_antialiasing_edge warn and fall back through floatOr to 0.005, 12, 32, 0 and 0. alpha_antialiasing_mode warns and falls back to OFF. A malformed transparency keeps Godot's default (0) silently, which draws the label opaque. A billboard outside 0 to 2 keeps DISABLED, as Godot's setter refuses it. no_depth_test is a raw === 'true' comparison, so any other value renders false without a warning. modulate and outline_modulate fall back silently to opaque white and opaque black on a malformed Color.

Known limitations

  • Approximated width and autowrap_mode are not read, so a long label runs on one line where Godot wraps it.
  • Approximated The glyph texture carries no mipmaps, so a label seen small sparkles where Godot's stays smooth.
  • Approximated Godot draws the glyphs softer, and an outline_size = 8 outline as a faint grey halo, where here it is a crisp black ring.
  • Approximated Under msaa_3d Disabled, alpha to coverage cuts the edge at alpha 0.5, where Godot's driver picks its own one-sample mask.
  • Approximated Under msaa_3d, ALPHA_TO_COVERAGE_AND_TO_ONE stores the ramped alpha where Godot stores 1, so a transparent background shows the edge fainter.
  • Approximated ALPHA_HASH keeps about Godot's share of pixels but not the same pixels, as the ported hash's fract(1e4 * sin()) rounds differently on each GPU (scene_forward_aa_inc.glsl:3-39).

LightmapGI

renders as invisible transform-only fallback docs ↗ source ↗ unit-lightmap-gi.tscn ↗ Not implemented
Comparison images not captured yet for LightmapGI.

Bakes static global illumination into a lightmap atlas and applies it from light_data at runtime. The previewer neither bakes nor applies lightmap data yet, so the node is an invisible transform-only fallback and its children still show.

Linting

Strict parsing format-checks these LightmapGI properties, plus 1 inherited from VisualInstance3D, 17 inherited from Node3D, 10 inherited from Node. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

PropertyAcceptsOut of range
biasfloat >= 0.00001error below
bounce_indirect_energyfloat 0-2error below, warning above
bouncesinteger 0-16error below 0, error above 16
camera_attributesnull, SubResource("id"), ExtResource("id") or Resource("path")
denoiser_rangeinteger 1-20warning
denoiser_strengthfloat >= 0.001warning below
directionaltrue or false
environment_custom_colorColor(r, g, b, a), or the colour string or int it converts
environment_custom_energyfloat 0-64warning
environment_custom_skynull, SubResource("id"), ExtResource("id") or Resource("path")
environment_modeenum 0-3 (DISABLED/SCENE/CUSTOM_SKY/CUSTOM_COLOR)warning
generate_probes_subdivenum 0-4 (DISABLED/SUBDIV_4/SUBDIV_8/SUBDIV_16/SUBDIV_32)warning
interiortrue or false
light_datanull, SubResource("id"), ExtResource("id") or Resource("path")
max_texture_sizeinteger 2048-16384error
qualityenum 0-3 (LOW/MEDIUM/HIGH/ULTRA)warning
shadowmask_modeenum 0-2 (NONE/REPLACE/OVERLAY)warning
supersamplingtrue or false
supersampling_factorfloat 1-8error below, warning above
texel_scalefloat 0.01-100error below 0.00999, warning below 0.01, warning above 100
use_denoisertrue or false
use_texture_for_bouncestrue or false
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-node3d-visibility (type-family match)valid-node3d-visibilityerror

The lenient parser reuses parseNode3D, which reads only transform and visible. A bounces = "banana" or max_texture_size = -5 sits untouched in the raw property bag, with no warning and no substitution.

Known limitations

  • Not drawn Godot lights surfaces from the baked lightmap, but here only the live lights apply.

LightmapProbe

renders as invisible transform-only fallback docs ↗ source ↗ unit-lightmap-probe.tscn ↗ Not implemented
Comparison images not captured yet for LightmapProbe.

A hand-placed probe position that LightmapGI samples to light dynamic objects. It carries no state beyond where it sits. The previewer does not use it yet, so the node is an invisible transform-only fallback and its children still show.

Linting

Strict parsing format-checks the inherited set (17 inherited from Node3D, 10 inherited from Node); LightmapProbe declares none of its own. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-node3d-visibility (type-family match)valid-node3d-visibilityerror

LightmapProbe declares no validator of its own. The lenient parser reuses parseNode3D, so a malformed transform warns and substitutes the identity rather than dropping the node.

Known limitations

  • Not drawn Godot samples the probe to light dynamic objects, but here it has no effect.

LightOccluder2D

renders as a selection-gated outline of its occluder polygon, it occludes 2D light docs ↗ source ↗ unit-lightoccluder2d.tscn ↗ Done

LightOccluder2D blocks a shadow-enabled Light2D and is invisible on its own. The previewer draws only a selection-gated outline for it and withholds the light where its shadow falls.

Godot render of LightOccluder2D Our render of LightOccluder2D
Godot 4.6.3 Ours

A single occluder edge

Done
Godot render of A single occluder edge Our render of A single occluder edge
Godot 4.6.3 Ours

A closed occluder polygon

Done
Godot render of A closed occluder polygon Our render of A closed occluder polygon
Godot 4.6.3 Ours

cull_mode

Done
Godot render of cull_mode Our render of cull_mode
Godot 4.6.3 Ours

The same polygon, wound the other way

Done
Godot render of The same polygon, wound the other way Our render of The same polygon, wound the other way
Godot 4.6.3 Ours

What does not cast

Done
Godot render of What does not cast Our render of What does not cast
Godot 4.6.3 Ours

Two shadowed lights over one occluder

Done
Godot render of Two shadowed lights over one occluder Our render of Two shadowed lights over one occluder
Godot 4.6.3 Ours

shadow_color

Done
Godot render of shadow_color Our render of shadow_color
Godot 4.6.3 Ours

shadow_color belongs to the light. It replaces the light term where the shadow falls, and it is the one term Godot never multiplies by the item's albedo. Both images show the same blue behind the occluder.

The boundary under a shadow_filter

Done
Godot render of The boundary under a shadow_filter Our render of The boundary under a shadow_filter
Godot 4.6.3 Ours

Under PCF5 or PCF13 Godot averages taps offset in angle around the light, so the same occluder casts a stepped penumbra that widens with distance. The filter belongs to the light, so the PointLight2D sheet shows it.

Linting

Strict parsing format-checks these LightOccluder2D properties, plus 12 inherited from Node2D, 16 inherited from CanvasItem, 10 inherited from Node. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

PropertyAcceptsOut of range
occludernull, SubResource("id"), ExtResource("id") or Resource("path")
occluder_light_mask32-bit layer mask (layers 1-32)
sdf_collisiontrue or false
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-canvasitem-clip-ancestry (type-family match)canvasitem-ancestor-clips-childrenwarning
canvasitem-ancestor-is-canvasgroupwarning
valid-lightoccluder2d-occluderlightoccluder2d-requires-occluderwarning

Strict rejects a non-numeric light_mask or occluder_light_mask. The lenient parser warns and falls back to 1 for either, and an unparseable sdf_collision falls back to true. occluder is copied through with no reference check.

Known limitations

  • Shader missing sdf_collision has no effect, since no signed-distance field is built for particle collision or SDF-lit materials.
  • Editor only The occluder outline is selection-gated, so a still render shows none, as Godot's runtime does.
  • Approximated Under a shadow_filter a tap lands in one of 2048 polar bins, so a boundary at a glancing angle can sit one bin from Godot's.

LimitAngularVelocityModifier3D

renders as nothing yet, Godot caps how fast its bones may turn, the previewer does not docs ↗ source ↗ unit-limit-angular-velocity-modifier-3d.tscn ↗ Not implemented
No visual output — this node draws nothing to compare.

Caps how fast a bone may rotate, slerping only as far as max_angular_velocity * delta allows each frame. It post-processes another modifier's pose. Godot runs that pass, and the previewer does not yet (ADR-0045): nothing moves here to be limited.

Linting

Strict parsing format-checks these LimitAngularVelocityModifier3D properties, plus 2 inherited from SkeletonModifier3D, 17 inherited from Node3D, 10 inherited from Node. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

PropertyAcceptsOut of range
chain_countinteger >= 0error below
chains/#/*LimitAngularVelocityModifier3D chain
excludetrue or false
joints/#/*read-only (derived from LimitAngularVelocityModifier3D's per-chain root_bone and end_bone)
max_angular_velocityfloat >= -0.0001warning below
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-node3d-visibility (type-family match)valid-node3d-visibilityerror
valid-skeletonmodifier3d-parent (type-family match)skeletonmodifier3d-parent-not-skeleton3dwarning

The lenient parser reuses parseNode3D, so every key above is dropped before it reaches the scene tree and has no fallback. Strict errors on chain_count = -1, warns on a negative max_angular_velocity and refuses the derived joints/<i>/ keys outright.

Line2D

renders as a stroked mesh polyline docs ↗ source ↗ unit-line2d.tscn ↗ Limitation
Godot render of Line2D Our render of Line2D
Godot 4.6.3 Ours

Line2D strokes a chain of points at a fixed width. The previewer draws one flat quad per segment, with a joint wedge filling each interior corner.

Linting

Strict parsing format-checks these Line2D properties, plus 12 inherited from Node2D, 16 inherited from CanvasItem, 10 inherited from Node. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

PropertyAcceptsOut of range
antialiasedtrue or false
begin_cap_modeenum 0-2 (NONE/BOX/ROUND)warning
closedtrue or false
default_colorColor(r, g, b, a), or the colour string or int it converts
end_cap_modeenum 0-2 (NONE/BOX/ROUND)warning
gradientnull, SubResource("id"), ExtResource("id") or Resource("path")
joint_modeenum 0-2 (SHARP/BEVEL/ROUND)warning
pointsPackedVector2Array(x, y, …)
round_precisioninteger 1-32error below, warning above
sharp_limitfloat >= 0error below 0
texturenull, SubResource("id"), ExtResource("id") or Resource("path")
texture_modeenum 0-2 (NONE/TILE/STRETCH)warning
widthfloat >= 0error below 0
width_curvenull, SubResource("id"), ExtResource("id") or Resource("path")
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-canvasitem-clip-ancestry (type-family match)canvasitem-ancestor-clips-childrenwarning
canvasitem-ancestor-is-canvasgroupwarning

width falls back to 10 and sharp_limit to 2 on a non-numeric value, closed to false and round_precision to 8, each with a warning. joint_mode is read as a plain int, so an out-of-range value passes silently. A malformed default_color falls back to white with no warning, and malformed points warn and leave the line empty.

Known limitations

  • Approximated gradient, texture, width_curve, the cap modes and antialiased are not read, so the line draws in default_color at one width with flat ends.

LineEdit

renders as a single-line text box docs ↗ source ↗ unit-lineedit.tscn ↗ Done
Godot render of LineEdit Our render of LineEdit
Godot 4.6.3 Ours

LineEdit is a single-line text field. The previewer draws its stylebox, its right_icon or clear button, and its caret while caret_force_displayed is set. It draws one clipped run of text (the string, or the placeholder) in the colour its state calls for. max_length truncates an over-long text the same way Godot does.

Linting

Strict parsing format-checks these LineEdit properties, plus 53 inherited from Control, 16 inherited from CanvasItem, 10 inherited from Node. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

PropertyAcceptsOut of range
alignmentenum 0-3 (HORIZONTAL_ALIGNMENT_LEFT/HORIZONTAL_ALIGNMENT_CENTER/HORIZONTAL_ALIGNMENT_RIGHT/HORIZONTAL_ALIGNMENT_FILL)error
backspace_deletes_composite_character_enabledtrue or false
caret_blinktrue or false
caret_blink_intervalfloat 0.1-10error at or below 0, warning below 0.1, warning above 10
caret_columninteger >= 0error below
caret_force_displayedtrue or false
caret_mid_graphemetrue or false
clear_button_enabledtrue or false
context_menu_enabledtrue or false
deselect_on_focus_loss_enabledtrue or false
drag_and_drop_selection_enabledtrue or false
draw_control_charstrue or false
editabletrue or false
emoji_menu_enabledtrue or false
expand_to_text_lengthtrue or false
flattrue or false
icon_expand_modeenum 0-2 (EXPAND_MODE_ORIGINAL_SIZE/EXPAND_MODE_FIT_TO_TEXT/EXPAND_MODE_FIT_TO_LINE_EDIT)warning
keep_editing_on_text_submittrue or false
languagequoted string, or the &"…" StringName or NodePath("…") it converts
max_lengthinteger >= 0error below
middle_mouse_paste_enabledtrue or false
placeholder_textquoted string, or the &"…" StringName or NodePath("…") it converts
right_iconnull, SubResource("id"), ExtResource("id") or Resource("path")
right_icon_scalefloat 0.1-1warning
secrettrue or false
secret_characterquoted string (or the &"…" StringName or NodePath("…") it converts), at most one character
select_all_on_focustrue or false
selecting_enabledtrue or false
shortcut_keys_enabledtrue or false
structured_text_bidi_overrideenum 0-6 (STRUCTURED_TEXT_DEFAULT/STRUCTURED_TEXT_URI/STRUCTURED_TEXT_FILE/STRUCTURED_TEXT_EMAIL/STRUCTURED_TEXT_LIST/STRUCTURED_TEXT_GDSCRIPT/STRUCTURED_TEXT_CUSTOM)warning
structured_text_bidi_override_optionsArray literal ([...] or ArrayT)
textquoted string, or the &"…" StringName or NodePath("…") it converts
text_directionenum 0-3 (TEXT_DIRECTION_AUTO/TEXT_DIRECTION_LTR/TEXT_DIRECTION_RTL/TEXT_DIRECTION_INHERITED)error below -1, warning below 0, error above 3
virtual_keyboard_enabledtrue or false
virtual_keyboard_show_on_focustrue or false
virtual_keyboard_typeenum 0-7 (KEYBOARD_TYPE_DEFAULT/KEYBOARD_TYPE_MULTILINE/KEYBOARD_TYPE_NUMBER/KEYBOARD_TYPE_NUMBER_DECIMAL/KEYBOARD_TYPE_PHONE/KEYBOARD_TYPE_EMAIL_ADDRESS/KEYBOARD_TYPE_PASSWORD/KEYBOARD_TYPE_URL)warning
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-canvasitem-clip-ancestry (type-family match)canvasitem-ancestor-clips-childrenwarning
canvasitem-ancestor-is-canvasgroupwarning
valid-control-properties (type-family match)control-tooltip-ignored-by-mouse-filterwarning
control-property-orderwarning

secret_character, alignment and flat have no strict counterpart. alignment goes through the optional-int reader, so a malformed or out-of-range value left-aligns silently. secret and flat become false for any value that does not read as true. An empty secret_character falls back to the bullet, as Godot does.

Known limitations

  • Not drawn The right-to-left hit region of _is_over_clear_button (line_edit.cpp:1175) and the direction-aware caret markers (:1590-1601), which need pointer or focus state.
  • Not drawn shaped_text_set_direction at :3104: it takes is_layout_rtl() only while text_direction is INHERITED, and the default is TEXT_DIRECTION_AUTO (line_edit.h:144).

LinkButton

renders as a text run with an optional underline stroke docs ↗ source ↗ unit-link-button.tscn ↗ Unreviewed
Comparison images not captured yet for LinkButton.

LinkButton is a hyperlink-style button that opens uri when pressed. The previewer never navigates. It draws the label text with no StyleBox chrome, and a solid underline stroke when underline asks for it at the node's draw state.

Linting

Strict parsing format-checks these LinkButton properties, plus 10 inherited from BaseButton, 53 inherited from Control, 16 inherited from CanvasItem, 10 inherited from Node. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

PropertyAcceptsOut of range
ellipsis_charquoted string (or the &"…" StringName or NodePath("…") it converts), at most one character
languagequoted string, or the &"…" StringName or NodePath("…") it converts
structured_text_bidi_overrideenum 0-6 (STRUCTURED_TEXT_DEFAULT/STRUCTURED_TEXT_URI/STRUCTURED_TEXT_FILE/STRUCTURED_TEXT_EMAIL/STRUCTURED_TEXT_LIST/STRUCTURED_TEXT_GDSCRIPT/STRUCTURED_TEXT_CUSTOM)warning
structured_text_bidi_override_optionsArray literal ([...] or ArrayT)
textquoted string, or the &"…" StringName or NodePath("…") it converts
text_directionenum 0-3 (TEXT_DIRECTION_AUTO/TEXT_DIRECTION_LTR/TEXT_DIRECTION_RTL/TEXT_DIRECTION_INHERITED)error below -1, warning below 0, error above 3
text_overrun_behaviorenum 0-6 (OVERRUN_NO_TRIMMING/OVERRUN_TRIM_CHAR/OVERRUN_TRIM_WORD/OVERRUN_TRIM_ELLIPSIS/OVERRUN_TRIM_WORD_ELLIPSIS/OVERRUN_TRIM_ELLIPSIS_FORCE/OVERRUN_TRIM_WORD_ELLIPSIS_FORCE)warning
underlineenum 0-2 (UNDERLINE_MODE_ALWAYS/UNDERLINE_MODE_ON_HOVER/UNDERLINE_MODE_NEVER)warning
uriquoted string, or the &"…" StringName or NodePath("…") it converts
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-canvasitem-clip-ancestry (type-family match)canvasitem-ancestor-clips-childrenwarning
canvasitem-ancestor-is-canvasgroupwarning
valid-control-properties (type-family match)control-tooltip-ignored-by-mouse-filterwarning
control-property-orderwarning
valid-button-group (type-family match)button-group-without-toggle-modewarning

linterParser.ts format-checks all of LinkButton's own members. parser.ts reads text, uri, underline, text_overrun_behavior and ellipsis_char. language, text_direction and the structured-text-bidi pair go into the untyped property bag with no substitution.

Known limitations

  • Approximated A theme_override_fonts/font scene font takes its underline position and thickness from the vendored Open Sans metrics, because no scene font carries baked underline data.
  • Approximated Under layout_direction = 3 or text_direction = 2, the label's glyphs keep left-to-right order for a right-to-left script or trailing punctuation, though layout_direction = 3 swaps the label and its underline.

LookAtModifier3D

renders as nothing yet, Godot rotates a bone to face its target, the previewer does not docs ↗ source ↗ unit-look-at-modifier-3d.tscn ↗ Not implemented
No visual output — this node draws nothing to compare.

Rotates one skeleton bone to face a target node, with optional angle limits and timed interpolation. Godot runs that drive each frame, and the previewer does not yet (ADR-0045): the bones hold their rest pose.

Linting

Strict parsing format-checks these LookAtModifier3D properties, plus 2 inherited from SkeletonModifier3D, 17 inherited from Node3D, 10 inherited from Node. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

PropertyAcceptsOut of range
boneinteger >= -1error below
bone_namequoted string, or the &"…" StringName or NodePath("…") it converts
durationfloat >= 0warning below
ease_typeenum 0-3 (In/Out/InOut/OutIn)warning
forward_axisenum 0-5 (+X/-X/+Y/-Y/+Z/-Z)warning
origin_boneinteger >= -1error below
origin_bone_namequoted string, or the &"…" StringName or NodePath("…") it converts
origin_external_nodeNodePath("path/to/node")
origin_fromenum 0-2 (Self/SpecificBone/ExternalNode)warning
origin_offsetVector3(x, y, z), or the Vector3i spelling Godot converts
origin_safe_marginfloat >= 0warning below
primary_damp_thresholdfloat 0-1warning
primary_limit_angleradians, 0° to 360°warning
primary_negative_damp_thresholdfloat 0-1warning
primary_negative_limit_angleradians, 0° to 180°warning
primary_positive_damp_thresholdfloat 0-1warning
primary_positive_limit_angleradians, 0° to 180°warning
primary_rotation_axisenum 0-2 (X/Y/Z)warning
relativetrue or false
secondary_damp_thresholdfloat 0-1warning
secondary_limit_angleradians, 0° to 360°warning
secondary_negative_damp_thresholdfloat 0-1warning
secondary_negative_limit_angleradians, 0° to 180°warning
secondary_positive_damp_thresholdfloat 0-1warning
secondary_positive_limit_angleradians, 0° to 180°warning
symmetry_limitationtrue or false
target_nodeNodePath("path/to/node")
transition_typeenum 0-11 (Linear/Sine/Quint/Quart/Quad/Expo/Elastic/Cubic/Circ/Bounce/Back/Spring)warning
use_angle_limitationtrue or false
use_secondary_rotationtrue or false
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-node3d-visibility (type-family match)valid-node3d-visibilityerror
valid-skeletonmodifier3d-parent (type-family match)skeletonmodifier3d-parent-not-skeleton3dwarning
valid-lookatmodifier3d-rotation-axeslookatmodifier3d-parallel-rotation-axeswarning

The lenient parser reads LookAtModifier3D through parseNode3D, so every property above is dropped with no fallback. Strict warns on a primary_limit_angle above TAU, since the .tscn stores radians while the inspector shows degrees. linter.ts warns when forward_axis resolves to the same axis as primary_rotation_axis.

MarginContainer

renders as a child inset by four margin constants docs ↗ source ↗ unit-margin-container.tscn ↗ Done
Godot render of MarginContainer Our render of MarginContainer
Godot 4.6.3 Ours

MarginContainer insets its single child by four margin constants and draws nothing itself.

Linting

Strict parsing format-checks the inherited set (53 inherited from Control, 16 inherited from CanvasItem, 10 inherited from Node); MarginContainer declares none of its own. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-canvasitem-clip-ancestry (type-family match)canvasitem-ancestor-clips-childrenwarning
canvasitem-ancestor-is-canvasgroupwarning
valid-control-properties (type-family match)control-tooltip-ignored-by-mouse-filterwarning
control-property-orderwarning

The four margins are collected as theme_override_constants through parseOptionalFloat, which returns undefined with no warning for an absent or unparseable value. The Component then substitutes 0 for that side, so a garbled constant removes its padding rather than failing.

Marker2D

renders as a selection-gated cross gizmo docs ↗ source ↗ unit-marker2d.tscn ↗ Done
No visual output — this node draws nothing to compare.

Marker2D is a transform anchor that draws a small cross at its origin in the editor. The previewer selection-gates that cross (ADR-0018), so a plain capture shows nothing, as Godot's game render does.

Linting

Strict parsing format-checks these Marker2D properties, plus 12 inherited from Node2D, 16 inherited from CanvasItem, 10 inherited from Node. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

PropertyAcceptsOut of range
gizmo_extentsfloat >= 0warning below
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-canvasitem-clip-ancestry (type-family match)canvasitem-ancestor-clips-childrenwarning
canvasitem-ancestor-is-canvasgroupwarning

Strict rejects a non-numeric gizmo_extents. The lenient parser warns and falls back to 10, Godot's default arm length.

Marker3D

renders as a selection-gated axis-cross gizmo docs ↗ source ↗ unit-marker-3d.tscn ↗ Done
No visual output — this node draws nothing to compare.

A Node3D anchor that positions its children and shows a three-axis cross at its origin in the editor. The previewer draws that cross only when the node is selected (ADR-0018), so a plain capture shows nothing for it.

Linting

Strict parsing format-checks these Marker3D properties, plus 17 inherited from Node3D, 10 inherited from Node. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

PropertyAcceptsOut of range
gizmo_extentsfloat >= 0warning below
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-node3d-visibility (type-family match)valid-node3d-visibilityerror

The lenient parser reads gizmo_extents through floatOr, so a non-numeric value warns and falls back to Godot's default of 0.25. An absent key gets the same 0.25 silently.

Known limitations

  • Editor only The axis cross appears only in Godot's editor, but here it is selection-gated.

Material Feature Showcase

renders as the StandardMaterial3D feature range on one stand integration-material-features.tscn ↗ Limitation
Godot render of Material Feature Showcase Our render of Material Feature Showcase
Godot 4.6.3 Ours

A feature showcase of the StandardMaterial3D model: rows of spheres, each row named by a Label3D caption, in front of a large red backdrop sphere. Both images show the same whole scene from real Godot and from this previewer.

What it exercises

  • Label3D captions: the "Material Feature Showcase" title plus the four row labels (Basic Materials (albedo, metallic, roughness), Emission & Normal Maps, Advanced PBR, Transparency & Glass). Both frames draw every one.
  • StandardMaterial3D albedo: the flat red, cyan and copper/brown spheres.
  • Metallic + roughness: the chrome-grey sphere with its tight specular highlight, and the polished browns of the Advanced PBR row.
  • Emission: the bright turquoise/green spheres that light up against the dark ground.
  • Transparency / glass: the frosted white sphere and the pale translucent sphere in the bottom row.
  • A large emissive red backdrop sphere filling the upper right.
  • The scene's own Camera3D framing the whole stand of spheres against the grey-sky-over-brown-ground preview environment. Both images render through that authored camera (Godot adopts it, and the previewer activates it with the ?camera= deep link), so the framing matches by construction rather than from two independent fit-to-bounds passes.

The layout, every Label3D caption, the plain PBR spheres and their colours match. The emissive spheres bloom on both sides, with Godot's cyan-green halo and cyan-white cores.

Known limitations

  • Approximated The glow blurs with a 13-tap kernel, not Godot's gaussian, so the emission halos spread less wide than Godot's.
  • Approximated The chrome sphere's sun highlight reads smaller and softer than Godot's.

MenuBar

renders as one StyleBox + text run per PopupMenu-child title docs ↗ source ↗ unit-menu-bar.tscn ↗ Unreviewed
Comparison images not captured yet for MenuBar.

MenuBar is a horizontal strip of menu titles, one per PopupMenu child, that opens the matching popup on click. The previewer draws each title's normal StyleBox (unless flat) and its text, left to right with h_separation between them. The popups never open, since a PopupMenu is a Window and this previewer draws no Windows.

Linting

Strict parsing format-checks these MenuBar properties, plus 53 inherited from Control, 16 inherited from CanvasItem, 10 inherited from Node. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

PropertyAcceptsOut of range
flattrue or false
languagequoted string, or the &"…" StringName or NodePath("…") it converts
prefer_global_menutrue or false
start_indexinteger
switch_on_hovertrue or false
text_directionenum 0-3 (TEXT_DIRECTION_AUTO/TEXT_DIRECTION_LTR/TEXT_DIRECTION_RTL/TEXT_DIRECTION_INHERITED)error below -1, warning below 0, error above 3
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-canvasitem-clip-ancestry (type-family match)canvasitem-ancestor-clips-childrenwarning
canvasitem-ancestor-is-canvasgroupwarning
valid-control-properties (type-family match)control-tooltip-ignored-by-mouse-filterwarning
control-property-orderwarning

linterParser.ts format-checks all of MenuBar's own members. parser.ts reads flat: a malformed value becomes false, with no warning. The others (start_index, switch_on_hover, prefer_global_menu, text_direction, language) are behaviour, not pixels, and stay unread by the render parser. text_direction errors outside -1..3, since the setter refuses anything else, while the inspector hint offers only 0..3.

Each title's text comes from its PopupMenu child's title property when set, else from its node name, the same fallback as MenuBar::_refresh_menu_names. A title is always drawn in Godot's plain "normal" state: per-menu disabled/hidden are runtime-only APIs with no serialised property, so a .tscn cannot author them.

Known limitations

  • Approximated Under layout_direction = 3, a menu title in a right-to-left script keeps left-to-right glyph order, while the titles still start from the mirrored end of the bar.
  • Not drawn Opening a menu, hovering a title and the *_mirrored hover and pressed StyleBoxes all need a pointer, so none of them appears.

MenuButton

renders as a StyleBox quad with a centred text run and optional icon docs ↗ source ↗ unit-menu-button.tscn ↗ Unreviewed
Comparison images not captured yet for MenuButton.

MenuButton is a Button that opens an internal PopupMenu when pressed. menu_button.cpp draws no chrome of its own, so the previewer paints what its Button base does. The internal PopupMenu never opens, since it is a Window and this previewer draws no Windows.

Linting

Strict parsing format-checks these MenuButton properties, plus 13 inherited from Button, 10 inherited from BaseButton, 53 inherited from Control, 16 inherited from CanvasItem, 10 inherited from Node. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

PropertyAcceptsOut of range
item_countinteger >= 0error below
popup/item_#/*item
switch_on_hovertrue or false
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-canvasitem-clip-ancestry (type-family match)canvasitem-ancestor-clips-childrenwarning
canvasitem-ancestor-is-canvasgroupwarning
valid-control-properties (type-family match)control-tooltip-ignored-by-mouse-filterwarning
control-property-orderwarning
valid-button-group (type-family match)button-group-without-toggle-modewarning
valid-menubutton-properties (type-family match)menubutton-item-index-out-of-rangeerror

The lenient parser reuses parseButton, plus one default that MenuButton's constructor overrides: flat defaults to true here (MenuButton::MenuButton() calls set_flat(true)), not Button's false. A .tscn writes flat only when it differs from that default. switch_on_hover, item_count and every popup/item_<idx>/<leaf> key are never read, since none of them affects MenuButton's drawing. They govern only the contents and behaviour of the internal PopupMenu.

MenuButton's default theme registers font_disabled_color as Color(1, 1, 1, 0.3), not Button's control_font_disabled_color (Color(0.875, 0.875, 0.875, 0.5)). It is the one default this slice does not inherit from Button.

Known limitations

  • Approximated Under layout_direction = 3 or text_direction = 2, the label's glyphs keep left-to-right order for a right-to-left script or trailing punctuation, though layout_direction = 3 swaps the label, icon and chrome.

MeshInstance2D

renders as nothing yet, Godot draws a textured mesh, the previewer does not docs ↗ source ↗ unit-mesh-instance-2d.tscn ↗ Not implemented
Comparison images not captured yet for MeshInstance2D.

MeshInstance2D draws a Mesh on the canvas, textured through texture. The previewer parses and validates it but does not draw it, so it renders as a transform-only fallback and its children still show.

Linting

Strict parsing format-checks these MeshInstance2D properties, plus 12 inherited from Node2D, 16 inherited from CanvasItem, 10 inherited from Node. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

PropertyAcceptsOut of range
meshnull, SubResource("id"), ExtResource("id") or Resource("path")
texturenull, SubResource("id"), ExtResource("id") or Resource("path")
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-canvasitem-clip-ancestry (type-family match)canvasitem-ancestor-clips-childrenwarning
canvasitem-ancestor-is-canvasgroupwarning

A bare string in mesh or texture, such as "res://quad.tres", is stored as-is with no warning. Nothing reads it back, since no render component exists.

Known limitations

  • Not drawn Godot draws the textured mesh, but the previewer draws nothing for this node.

MeshInstance3D

renders as a THREE.Mesh docs ↗ source ↗ unit-torus-mesh.tscn ↗ Limitation
Godot render of MeshInstance3D Our render of MeshInstance3D
Godot 4.6.3 Ours

Draws its mesh resource as a THREE.Mesh, with each surface_material_override/N replacing that surface's material. The fixture's orange metallic torus lies flat with the hole facing up in both images.

Linting

Strict parsing format-checks these MeshInstance3D properties, plus 18 inherited from GeometryInstance3D, 1 inherited from VisualInstance3D, 17 inherited from Node3D, 10 inherited from Node. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

PropertyAcceptsOut of range
blend_shapes/*float -1-1warning
meshnull, SubResource("id"), ExtResource("id") or Resource("path")
skeletonNodePath("path/to/node")
skinnull, SubResource("id"), ExtResource("id") or Resource("path")
surface_material_override/*null, SubResource("id"), ExtResource("id") or Resource("path")
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-node3d-visibility (type-family match)valid-node3d-visibilityerror
valid-geometryinstance3d-visibility-range (type-family match)geometryinstance3d-visibility-range-end-before-beginwarning
geometryinstance3d-visibility-range-begin-fade-without-marginwarning
geometryinstance3d-visibility-range-end-fade-without-marginwarning

The enum and range keys (cast_shadow, gi_mode, layers, transparency, the visibility_range_* floats) go through parseOptionalInt and parseOptionalFloat. An unparseable cast_shadow, transparency or visibility_range_* value keeps Godot's default. Any other unparseable value is dropped silently, and an out-of-range cast_shadow = 99 is kept as is. The component treats any cast_shadow other than 0, 2 or 3 as 1, Godot's default. mesh, material_override, skeleton, skin and each surface override are assigned from the raw string with no resolution check.

Known limitations

  • Approximated A transparent material renders darker than Godot's on a brightly lit face, while an opaque one agrees.
  • Approximated A bright highlight on the metallic torus carries a soft glow halo in Godot, where here it ends sharply.
  • Approximated three removes both cylinder caps or neither, so a CylinderMesh with exactly one of cap_top and cap_bottom disabled renders with both.

ModifierBoneTarget3D

renders as nothing yet, Godot mirrors its bone onto its transform, the previewer does not docs ↗ source ↗ unit-modifier-bone-target-3d.tscn ↗ Not implemented
No visual output — this node draws nothing to compare.

Attaches itself to one bone of its parent Skeleton3D and copies that bone's global pose onto its own transform each pass. Another modifier can then aim at it. Godot runs that copy each frame, and the previewer does not yet (ADR-0045). The node sits at the transform the scene file states.

Linting

Strict parsing format-checks these ModifierBoneTarget3D properties, plus 2 inherited from SkeletonModifier3D, 17 inherited from Node3D, 10 inherited from Node. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

PropertyAcceptsOut of range
boneinteger >= -1error below
bone_namequoted string, or the &"…" StringName or NodePath("…") it converts
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-node3d-visibility (type-family match)valid-node3d-visibilityerror
valid-skeletonmodifier3d-parent (type-family match)skeletonmodifier3d-parent-not-skeleton3dwarning

index.ts registers parseNode3D directly, so neither bone_name nor bone is ever read. An unquoted bone_name = Head or an out-of-range bone = -7 is dropped rather than substituted, and only strict reports it.

MultiMeshInstance2D

renders as nothing yet, Godot draws a batch of textured mesh instances, the previewer does not docs ↗ source ↗ unit-multi-mesh-instance-2d.tscn ↗ Not implemented
Comparison images not captured yet for MultiMeshInstance2D.

MultiMeshInstance2D batch-draws many copies of one mesh from a MultiMesh resource. The previewer parses and validates it but does not draw it, so it renders as a transform-only fallback and its children still show.

Linting

Strict parsing format-checks these MultiMeshInstance2D properties, plus 12 inherited from Node2D, 16 inherited from CanvasItem, 10 inherited from Node. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

PropertyAcceptsOut of range
multimeshnull, SubResource("id"), ExtResource("id") or Resource("path")
texturenull, SubResource("id"), ExtResource("id") or Resource("path")
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-canvasitem-clip-ancestry (type-family match)canvasitem-ancestor-clips-childrenwarning
canvasitem-ancestor-is-canvasgroupwarning

A bare string in multimesh or texture, such as "res://grass.tres", is stored as-is with no warning. Nothing reads it back, since no render component exists.

Known limitations

  • Not drawn Godot draws the batch of textured instances, but the previewer draws nothing for this node.

MultiMeshInstance3D

renders as nothing yet, Godot draws a batch of mesh instances, the previewer does not docs ↗ source ↗ unit-multi-mesh-instance-3d.tscn ↗ Not implemented
Comparison images not captured yet for MultiMeshInstance3D.

Instances a MultiMesh resource, drawing many copies of one mesh in a single call. The previewer does not draw the batch yet, so the node is an invisible transform-only fallback and its children still show.

Linting

Strict parsing format-checks these MultiMeshInstance3D properties, plus 18 inherited from GeometryInstance3D, 1 inherited from VisualInstance3D, 17 inherited from Node3D, 10 inherited from Node. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

PropertyAcceptsOut of range
multimeshnull, SubResource("id"), ExtResource("id") or Resource("path")
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-node3d-visibility (type-family match)valid-node3d-visibilityerror
valid-geometryinstance3d-visibility-range (type-family match)geometryinstance3d-visibility-range-end-before-beginwarning
geometryinstance3d-visibility-range-begin-fade-without-marginwarning
geometryinstance3d-visibility-range-end-fade-without-marginwarning

The scene cull measures the node by its MultiMesh's box: the custom_aabb, or the mesh's box under each instance transform. So its visibility range still decides its visibility dependants.

The lenient parser never runs multimesh's validator. Given multimesh = "res://grass.tres", a bare string instead of a resource reference, it stores the string on the node's property bag with no substitution and no warning.

Known limitations

  • Not drawn Godot draws every instance in the multimesh, but here none appears.

MultiplayerSpawner

renders as nothing (a transform-only group) docs ↗ source ↗ unit-multiplayer-spawner.tscn ↗ Linter only
No visual output — this node draws nothing to compare.

Replicates spawned nodes from the multiplayer authority to peers and draws nothing. The previewer renders it as a transform-only group (ADR-0008) and its children still show.

Linting

Strict parsing format-checks these MultiplayerSpawner properties, plus 10 inherited from Node. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

PropertyAcceptsOut of range
_spawnable_scenesstring array (PackedStringArray(…), ArrayString or […])
spawn_limitinteger >= 0warning below
spawn_pathNodePath("path/to/node")
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-multiplayerspawner-spawn-pathmultiplayerspawner-spawn-path-danglingwarning

index.ts registers the base parseNode, which reads only the heading attributes and transform. A malformed spawn_limit is never read on the lenient path, so there is no fallback to report.

MultiplayerSynchronizer

renders as nothing (a transform-only group) docs ↗ source ↗ unit-multiplayer-synchronizer.tscn ↗ Linter only
No visual output — this node draws nothing to compare.

Synchronises properties from the multiplayer authority to remote peers and draws nothing. The previewer renders it as a transform-only group (ADR-0008) and its children still show.

Linting

Strict parsing format-checks these MultiplayerSynchronizer properties, plus 10 inherited from Node. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

PropertyAcceptsOut of range
delta_intervalfloat 0-5error below, warning above
public_visibilitytrue or false
replication_confignull, SubResource("id"), ExtResource("id") or Resource("path")
replication_intervalfloat 0-5error below, warning above
root_pathNodePath("path/to/node")
visibility_update_modeenum 0-2 (VISIBILITY_PROCESS_IDLE/VISIBILITY_PROCESS_PHYSICS/VISIBILITY_PROCESS_NONE)warning
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-multiplayersynchronizer-root-pathmultiplayersynchronizer-root-path-danglingwarning

index.ts registers the base parseNode, which reads only the heading attributes and transform. A malformed replication_interval is never read on the lenient path, so there is no fallback to report.

NavigationAgent2D

renders as nothing (a transform-only group) docs ↗ source ↗ unit-navigation-agent-2d.tscn ↗ Linter only
No visual output — this node draws nothing to compare.

NavigationAgent2D steers its Node2D parent along a navigation path. It has no runtime visual, only an editor debug path, so the previewer draws nothing for it and that absence is correct.

Linting

Strict parsing format-checks these NavigationAgent2D properties, plus 10 inherited from Node. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

PropertyAcceptsOut of range
avoidance_enabledtrue or false
avoidance_layers32-bit layer mask (layers 1-32)
avoidance_mask32-bit layer mask (layers 1-32)
avoidance_priorityfloat 0-1error
debug_enabledtrue or false
debug_path_custom_colorColor(r, g, b, a), or the colour string or int it converts
debug_path_custom_line_widthfloat >= -1warning below
debug_path_custom_point_sizefloat >= 0error below
debug_use_customtrue or false
max_neighborsinteger >= 1warning below
max_speedfloat >= 0.01error below 0, warning below 0.01
navigation_layers32-bit layer mask (layers 1-32)
neighbor_distancefloat >= 0.1warning below
path_desired_distancefloat >= 0.1warning below
path_max_distancefloat >= 10warning below
path_metadata_flagsbit mask of PATH_METADATA_INCLUDE_TYPES (1) | PATH_METADATA_INCLUDE_RIDS (2) | PATH_METADATA_INCLUDE_OWNERS (4)
path_postprocessingenum 0-2 (PATH_POSTPROCESSING_CORRIDORFUNNEL/PATH_POSTPROCESSING_EDGECENTERED/PATH_POSTPROCESSING_NONE)warning
path_return_max_lengthfloat >= 0error below
path_return_max_radiusfloat >= 0error below
path_search_max_distancefloat >= 0error below
path_search_max_polygonsinteger >= 0warning below
pathfinding_algorithmenum 0-0 (PATHFINDING_ALGORITHM_ASTAR)warning
radiusfloat >= 0.01error below 0, warning below 0.01
simplify_epsilonfloat >= 0error below
simplify_pathtrue or false
target_desired_distancefloat >= 0.1warning below
target_positionVector2(x, y), or the Vector2i spelling Godot converts
time_horizon_agentsfloat >= 0error below
time_horizon_obstaclesfloat >= 0error below
velocityVector2(x, y), or the Vector2i spelling Godot converts
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-navigationagent2dnavigationagent2d-parent-not-node2dwarning

The lenient parser reuses the generic parseNode, so none of the thirty agent keys is read. A radius of -5 or a malformed target_position changes nothing in the parsed tree. Only strict sees these values.

NavigationAgent3D

renders as nothing (non-visual navigation helper) docs ↗ source ↗ unit-navigation-agent-3d.tscn ↗ Linter only
No visual output — this node draws nothing to compare.

A pathfinding and avoidance helper that steers its parent body toward a target. It has no runtime visual, only an editor path debug draw. The previewer draws nothing for it, and both images show the empty preview scene.

Linting

Strict parsing format-checks these NavigationAgent3D properties, plus 10 inherited from Node. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

PropertyAcceptsOut of range
avoidance_enabledtrue or false
avoidance_layers32-bit layer mask (layers 1-32)
avoidance_mask32-bit layer mask (layers 1-32)
avoidance_priorityfloat 0-1error
debug_enabledtrue or false
debug_path_custom_colorColor(r, g, b, a), or the colour string or int it converts
debug_path_custom_point_sizefloat >= 0error below
debug_use_customtrue or false
heightfloat >= 0.01error below 0, warning below 0.01
keep_y_velocitytrue or false
max_neighborsinteger >= 1warning below
max_speedfloat >= 0.01error below 0, warning below 0.01
navigation_layers32-bit layer mask (layers 1-32)
neighbor_distancefloat >= 0.1warning below
path_desired_distancefloat >= 0.1warning below
path_height_offsetfloat >= -100warning below
path_max_distancefloat >= 0.01warning below
path_metadata_flagsbit mask of PATH_METADATA_INCLUDE_TYPES (1) | PATH_METADATA_INCLUDE_RIDS (2) | PATH_METADATA_INCLUDE_OWNERS (4)
path_postprocessingenum 0-2 (PATH_POSTPROCESSING_CORRIDORFUNNEL/PATH_POSTPROCESSING_EDGECENTERED/PATH_POSTPROCESSING_NONE)warning
path_return_max_lengthfloat >= 0error below
path_return_max_radiusfloat >= 0error below
path_search_max_distancefloat >= 0error below
path_search_max_polygonsinteger >= 0warning below
pathfinding_algorithmenum 0-0 (PATHFINDING_ALGORITHM_ASTAR)warning
radiusfloat >= 0.01error below 0, warning below 0.01
simplify_epsilonfloat >= 0error below
simplify_pathtrue or false
target_desired_distancefloat >= 0.1warning below
target_positionVector3(x, y, z), or the Vector3i spelling Godot converts
time_horizon_agentsfloat >= 0error below
time_horizon_obstaclesfloat >= 0error below
use_3d_avoidancetrue or false
velocityVector3(x, y, z), or the Vector3i spelling Godot converts
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-navigationagent3dnavigationagent3d-parent-not-node3dwarning

The lenient parser reads eleven keys: radius, height, avoidance_enabled, avoidance_layers, avoidance_mask, max_neighbors, max_speed, navigation_layers, target_desired_distance, path_desired_distance and target_position. The ten scalars use the optional readers, so a radius of -5 passes through unchanged, and target_position warns and stays unset on a malformed Vector3. The other keys reach no reader.

Known limitations

  • Editor only The path debug draw appears only in Godot's editor, but here it is absent.

NavigationLink2D

renders as nothing (a transform-only group) docs ↗ source ↗ unit-navigation-link-2d.tscn ↗ Linter only
No visual output — this node draws nothing to compare.

NavigationLink2D describes a shortcut between two points for the navigation server. It draws nothing at runtime, so the previewer renders it as a transform-only group (ADR-0008).

Linting

Strict parsing format-checks these NavigationLink2D properties, plus 12 inherited from Node2D, 16 inherited from CanvasItem, 10 inherited from Node. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

PropertyAcceptsOut of range
bidirectionaltrue or false
enabledtrue or false
end_positionVector2(x, y), or the Vector2i spelling Godot converts
enter_costfloat >= 0error below
navigation_layers32-bit layer mask (layers 1-32)
start_positionVector2(x, y), or the Vector2i spelling Godot converts
travel_costfloat >= 0error below
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-canvasitem-clip-ancestry (type-family match)canvasitem-ancestor-clips-childrenwarning
canvasitem-ancestor-is-canvasgroupwarning
valid-navigationlink2d-endpointsnavigationlink2d-coincident-endpointswarning

The lenient parser reuses parseNode2D, which reads none of the seven link keys. A malformed enter_cost or navigation_layers gets no warning and no fallback, since the key is never read. Strict still checks every line.

NavigationLink3D

renders as nothing (a transform-only group) docs ↗ source ↗ unit-navigation-link-3d.tscn ↗ Linter only
No visual output — this node draws nothing to compare.

Connects two positions on a navigation map so agents can path across a gap. It draws nothing at runtime, so the previewer renders it as a transform-only group (ADR-0008) and its children still show.

Linting

Strict parsing format-checks these NavigationLink3D properties, plus 17 inherited from Node3D, 10 inherited from Node. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

PropertyAcceptsOut of range
bidirectionaltrue or false
enabledtrue or false
end_positionVector3(x, y, z), or the Vector3i spelling Godot converts
enter_costfloat >= 0error below
navigation_layers32-bit layer mask (layers 1-32)
start_positionVector3(x, y, z), or the Vector3i spelling Godot converts
travel_costfloat >= 0error below
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-node3d-visibility (type-family match)valid-node3d-visibilityerror
valid-navigationlink3d-positionsnavigationlink3d-start-position-equals-end-positionwarning

index.ts registers parseNode3D, which reads only transform and visible. A negative enter_cost or a non-boolean enabled parses and renders exactly like a good value, and only strict reports it.

NavigationObstacle2D

renders as nothing (a transform-only group) docs ↗ source ↗ unit-navigation-obstacle-2d.tscn ↗ Linter only
No visual output — this node draws nothing to compare.

NavigationObstacle2D defines an avoidance and navmesh-carving region. It has no runtime visual, so the previewer renders it as a transform-only group (ADR-0008).

Linting

Strict parsing format-checks these NavigationObstacle2D properties, plus 12 inherited from Node2D, 16 inherited from CanvasItem, 10 inherited from Node. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

PropertyAcceptsOut of range
affect_navigation_meshtrue or false
avoidance_enabledtrue or false
avoidance_layers32-bit layer mask (layers 1-32)
carve_navigation_meshtrue or false
radiusfloat 0-500error below, warning above
velocityVector2(x, y), or the Vector2i spelling Godot converts
verticesPackedVector2Array(x, y, …)
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-canvasitem-clip-ancestry (type-family match)canvasitem-ancestor-clips-childrenwarning
canvasitem-ancestor-is-canvasgroupwarning
valid-navigationobstacle2dnavigationobstacle2d-carve-without-affectinfo
navigationobstacle2d-non-positive-global-scalewarning
navigationobstacle2d-non-uniform-global-scalewarning
navigationobstacle2d-global-skew-ignoredwarning

The lenient parser reuses parseNode2D, so radius, vertices and the avoidance keys are never read into a typed field. A radius of -1 or 9999 has no effect on the render, and the raw string stays in rawProperties.

NavigationObstacle3D

renders as a transform-only group (no runtime visual) docs ↗ source ↗ unit-navigation-obstacle-3d.tscn ↗ Linter only
No visual output — this node draws nothing to compare.

Defines an avoidance region for navigation agents. It has no runtime visual, so the previewer renders it as a transform-only group (ADR-0008) and its children still show.

Linting

Strict parsing format-checks these NavigationObstacle3D properties, plus 17 inherited from Node3D, 10 inherited from Node. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

PropertyAcceptsOut of range
affect_navigation_meshtrue or false
avoidance_enabledtrue or false
avoidance_layers32-bit layer mask (layers 1-32)
carve_navigation_meshtrue or false
heightfloat 0-100error below, warning above
radiusfloat 0-100error below, warning above
use_3d_avoidancetrue or false
velocityVector3(x, y, z), or the Vector3i spelling Godot converts
verticesPackedVector3Array(x, y, z, …)
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-node3d-visibility (type-family match)valid-node3d-visibilityerror
valid-navigationobstacle3dnavigationobstacle3d-carve-without-affectinfo

The seven scalar and flag keys (radius, height, avoidance_enabled, avoidance_layers, affect_navigation_mesh, carve_navigation_mesh, use_3d_avoidance) use the optional readers, so an absent or unparseable value leaves the property unset silently. A negative radius passes through unchanged, and vertices and velocity are never read.

NavigationRegion2D

renders as a translucent green navigation-mesh overlay docs ↗ source ↗ unit-navigation-region-2d.tscn ↗ Limitation
No visual output — this node draws nothing to compare.

NavigationRegion2D holds a NavigationPolygon of walkable area. The previewer draws that polygon as a translucent green fill with edge lines, gated on the showNavigation toggle, which is on by default.

Linting

Strict parsing format-checks these NavigationRegion2D properties, plus 12 inherited from Node2D, 16 inherited from CanvasItem, 10 inherited from Node. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

PropertyAcceptsOut of range
enabledtrue or false
enter_costfloat >= 0error below
navigation_layers32-bit layer mask (layers 1-32)
navigation_polygonnull, SubResource("id"), ExtResource("id") or Resource("path")
travel_costfloat >= 0error below
use_edge_connectionstrue or false
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-canvasitem-clip-ancestry (type-family match)canvasitem-ancestor-clips-childrenwarning
canvasitem-ancestor-is-canvasgroupwarning
valid-navigationregion2d-resourcesnavigationregion2d-requires-navigation-polygonwarning

navigation_polygon has no fallback. The parser passes the raw reference string through when present and leaves it undefined when absent, so a dangling reference draws no mesh.

Known limitations

  • Editor only Godot's game render draws no navigation mesh, so the green overlay appears only here, and turning showNavigation off matches Godot.

NavigationRegion3D

renders as a translucent green navmesh overlay docs ↗ source ↗ unit-navigation-region-3d.tscn ↗ Limitation
No visual output — this node draws nothing to compare.

Holds a NavigationMesh describing walkable area. That mesh is navigation data with no game-runtime visual, and the previewer draws it as the editor's "Visible Navigation" overlay: translucent green faces with edge lines.

Linting

Strict parsing format-checks these NavigationRegion3D properties, plus 17 inherited from Node3D, 10 inherited from Node. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

PropertyAcceptsOut of range
enabledtrue or false
enter_costfloat >= 0error below
navigation_layers32-bit layer mask (layers 1-32)
navigation_meshnull, SubResource("id"), ExtResource("id") or Resource("path")
travel_costfloat >= 0error below
use_edge_connectionstrue or false
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-node3d-visibility (type-family match)valid-node3d-visibilityerror
valid-navigationregion3d-resourcesnavigationregion3d-requires-navigation-meshwarning

The lenient parser assigns navigation_mesh straight from the raw property string with no format check. A malformed reference that strict rejects is stored as written and fails only at the resource lookup.

Known limitations

  • Editor only Godot draws the navigation mesh only as an editor overlay, so the reference image shows none, while the previewer draws it by default.

NinePatchRect

renders as a 9-sliced textured quad in the control's rect docs ↗ source ↗ unit-nine-patch-rect.tscn ↗ Done
Godot render of NinePatchRect Our render of NinePatchRect
Godot 4.6.3 Ours

NinePatchRect splits its texture into nine cells by the four patch_margin_* values. The four corners draw at native size, while the edges and centre stretch or tile per axis_stretch_horizontal/axis_stretch_vertical. region_rect windows the source texture, and draw_center omits the centre cell entirely.

Linting

Strict parsing format-checks these NinePatchRect properties, plus 53 inherited from Control, 16 inherited from CanvasItem, 10 inherited from Node. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

PropertyAcceptsOut of range
axis_stretch_horizontalenum 0-2 (AXIS_STRETCH_MODE_STRETCH/AXIS_STRETCH_MODE_TILE/AXIS_STRETCH_MODE_TILE_FIT)warning
axis_stretch_verticalenum 0-2 (AXIS_STRETCH_MODE_STRETCH/AXIS_STRETCH_MODE_TILE/AXIS_STRETCH_MODE_TILE_FIT)warning
draw_centertrue or false
patch_margin_bottominteger 0-16384warning
patch_margin_leftinteger 0-16384warning
patch_margin_rightinteger 0-16384warning
patch_margin_topinteger 0-16384warning
region_rectRect2(x, y, w, h), or the Rect2i spelling Godot converts
texturenull, SubResource("id"), ExtResource("id") or Resource("path")
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-canvasitem-clip-ancestry (type-family match)canvasitem-ancestor-clips-childrenwarning
canvasitem-ancestor-is-canvasgroupwarning
valid-control-properties (type-family match)control-tooltip-ignored-by-mouse-filterwarning
control-property-orderwarning

patch_margin_* and axis_stretch_* go through the optional-int reader: an unparseable value becomes undefined and falls back to 0 (margins) or STRETCH (axis mode) at render time. A malformed region_rect becomes undefined, drawing the whole texture instead of a crop.

Node

renders as nothing, a non-spatial base node docs ↗ source ↗ Linter only
No visual output — this node draws nothing to compare.

The base of every Godot node. A plain Node has no transform and no visual of its own, so the previewer mounts it as an empty group and draws nothing. Its children render on their own.

Linting

Strict parsing format-checks these Node properties. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

PropertyAcceptsOut of range
auto_translate_modeenum 0-2 (AUTO_TRANSLATE_MODE_INHERIT/AUTO_TRANSLATE_MODE_ALWAYS/AUTO_TRANSLATE_MODE_DISABLED)warning
editor_descriptionquoted string, or the &"…" StringName or NodePath("…") it converts
physics_interpolation_modeenum 0-2 (PHYSICS_INTERPOLATION_MODE_INHERIT/PHYSICS_INTERPOLATION_MODE_ON/PHYSICS_INTERPOLATION_MODE_OFF)warning
process_modeenum 0-4 (PROCESS_MODE_INHERIT/PROCESS_MODE_PAUSABLE/PROCESS_MODE_WHEN_PAUSED/PROCESS_MODE_ALWAYS/PROCESS_MODE_DISABLED)warning
process_physics_priorityinteger
process_priorityinteger
process_thread_groupenum 0-2 (PROCESS_THREAD_GROUP_INHERIT/PROCESS_THREAD_GROUP_MAIN_THREAD/PROCESS_THREAD_GROUP_SUB_THREAD)warning
process_thread_group_orderinteger
process_thread_messagesbit mask of FLAG_PROCESS_THREAD_MESSAGES (1) | FLAG_PROCESS_THREAD_MESSAGES_PHYSICS (2)
unique_name_in_ownertrue or false
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo

The lenient parser.ts reads a transform property the same way Node3D does. Absent, it stays undefined. Malformed, it warns and falls back to the identity Transform3D. A plain Node never carries that key in an authored .tscn.

Node2D

renders as a transform-only THREE.Group docs ↗ source ↗ unit-area2d.tscn ↗ Linter only
No visual output — this node draws nothing to compare.

The base of 2D transform objects: a position, rotation, scale, skew and draw-order Z, with no pixels of its own. The previewer maps it to a <group> and draws its children inside. Here the root Node2D is bare, so both frames are blank.

Linting

Strict parsing format-checks these Node2D properties, plus 16 inherited from CanvasItem, 10 inherited from Node. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

PropertyAcceptsOut of range
global_positionVector2(x, y), or the Vector2i spelling Godot converts
global_rotationfloat
global_rotation_degreesfloat
global_scaleVector2(x, y), or the Vector2i spelling Godot converts
global_skewfloat
global_transformTransform2D(6 floats)
positionVector2(x, y), or the Vector2i spelling Godot converts
rotationfloat
rotation_degreesfloat
scaleVector2(x, y), no (near-)zero component
skewradians, -89.9° to 89.9°warning
transformTransform2D(6 floats)
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-canvasitem-clip-ancestry (type-family match)canvasitem-ancestor-clips-childrenwarning
canvasitem-ancestor-is-canvasgroupwarning

transform takes priority when present. A malformed matrix warns and falls back to the discrete position, rotation, scale and skew path, which default to (0, 0), 0, (1, 1) and 0. z_index falls back to 0. The six global_* properties are never read by the lenient parser, so an authored global_position has no effect.

top_level makes the node a canvas root. It draws in canvas space, with a white inherited modulate, z_index accumulated from 0 and the viewport's own texture sampler defaults. A node whose direct parent is not a CanvasItem is a canvas root for the same reason and gets the same reset. Its parent still hides it, because visibility crosses the break in Godot too.

Node3D

renders as an invisible transform group docs ↗ source ↗ unit-node3d-basic.tscn ↗ Linter only
No visual output — this node draws nothing to compare.

The base 3D node: a pure transform with no geometry of its own. The previewer renders it as a <group> that positions its children, decomposing each Transform3D into position, rotation and scale. Both captures show only the preview sky.

Linting

Strict parsing format-checks these Node3D properties, plus 10 inherited from Node. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

PropertyAcceptsOut of range
basisBasis(9 floats)
global_basisBasis(9 floats)
global_positionVector3(x, y, z), or the Vector3i spelling Godot converts
global_rotationVector3(x, y, z), or the Vector3i spelling Godot converts
global_rotation_degreesVector3(x, y, z), or the Vector3i spelling Godot converts
global_transformTransform3D(12 floats)
positionVector3(x, y, z), or the Vector3i spelling Godot converts
quaternionQuaternion(x, y, z, w)
rotationVector3(x, y, z), or the Vector3i spelling Godot converts
rotation_degreesVector3(x, y, z), or the Vector3i spelling Godot converts
rotation_edit_modeenum 0-2 (Euler/Quaternion/Basis)warning
rotation_orderenum 0-5 (XYZ/XZY/YXZ/YZX/ZXY/ZYX)error
scaleVector3(x, y, z), or the Vector3i spelling Godot converts
top_leveltrue or false
transformTransform3D(12 floats)
visibility_parentNodePath("path/to/node")
visibletrue or false
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-node3d-visibility (type-family match)valid-node3d-visibilityerror

The lenient parser reads exactly four properties: transform, visible, top_level and visibility_parent. A malformed transform warns and falls back to the identity. visible and top_level resolve through Godot's bool conversion with no warning. A spelling that does not convert leaves visible true and top_level false. An empty visibility_parent reads as unset, so the node takes its Node3D parent's visibility parent, as Godot does. The lenient parser never reads position, rotation, scale, basis, quaternion or the global_* fields, so only the composite Transform3D literal places a node.

OccluderInstance3D

renders as nothing (a transform-only group) docs ↗ source ↗ unit-occluder-instance-3d.tscn ↗ Linter only
No visual output — this node draws nothing to compare.

Holds a baked occluder shape for Godot's occlusion culling. It draws nothing at runtime, so the previewer renders it as a transform-only group (ADR-0008) and its children still show.

Linting

Strict parsing format-checks these OccluderInstance3D properties, plus 1 inherited from VisualInstance3D, 17 inherited from Node3D, 10 inherited from Node. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

PropertyAcceptsOut of range
bake_mask32-bit layer mask (layers 1-32)
bake_simplification_distancefloat 0-2error below, warning above
occludernull, SubResource("id"), ExtResource("id") or Resource("path")
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-node3d-visibility (type-family match)valid-node3d-visibilityerror
valid-occluderinstance3d-configurationoccluderinstance3d-empty-bake-maskwarning
occluderinstance3d-missing-occluderwarning

The lenient parser reuses parseNode3D, which reads only transform and visible. A malformed bake_mask = "off" or a bake_simplification_distance = -5 parses with no warning and reaches no in-memory state, while strict reports it.

OmniLight3D

renders as a THREE.PointLight docs ↗ source ↗ unit-omni-light-3d.tscn ↗ Limitation
Godot render of OmniLight3D Our render of OmniLight3D
Godot 4.6.3 Ours

Godot's omnidirectional point light, emitting from a single point in every direction with distance attenuation. The previewer renders it as a THREE.PointLight inside the node's transform group, with energy scaled by PI to match Godot's brightness. Its highlight scales by twice light_specular, as Godot's does. light_size widens its lit side and its highlight by Godot's size term, so a large light near a surface reaches past the surface's horizon. In volumetric fog, it scatters light_volumetric_fog_energy times its light into the medium, under its shadow.

Linting

Strict parsing format-checks these OmniLight3D properties, plus 27 inherited from Light3D, 1 inherited from VisualInstance3D, 17 inherited from Node3D, 10 inherited from Node. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

PropertyAcceptsOut of range
omni_attenuationfloat
omni_rangefloat >= 0warning below
omni_shadow_modeenum 0-1 (DUAL_PARABOLOID/CUBE)warning
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-node3d-visibility (type-family match)valid-node3d-visibilityerror
valid-omnilight3d-propertiesomnilight3d-projector-without-shadowwarning
valid-light3d-scale (type-family match)light3d-non-unit-scalewarning

The linter warns (resource-type-excluded-by-hint) when light_projector holds a class its hint excludes, such as an AtlasTexture. Godot's editor never offers such a class, and the setter keeps it with a debug warning (light_3d.cpp:204-213).

The lenient parser falls back silently when omni_range or omni_attenuation is absent. When one is unparseable, it warns and falls back to 5.0 and 1.0. omni_shadow_mode goes through parseOptionalInt, so an absent or invalid value quietly becomes undefined.

Godot's positional shadow atlas gives the light two slots for the camera. As in Godot's default Cube mode, each slot holds one paraboloid of the shadow. A light that covers less of the view gets smaller slots and a coarser, softer shadow. When other lights fill the larger slots, a light earlier in the scene tree takes smaller slots, as in Godot. A sub-viewport gives its lights slots in its own atlas. Every omni and spot shadow lies in one atlas texture, so many shadowed lights fit beside a material with many textures. The soft edge takes the four taps of Godot's default Soft Low filter, with the same dither as Godot. The filter spans shadow_blur times two texels of the paraboloid. With a light_size and a shadow_blur, the shadow searches for blockers, as Godot's does. Its penumbra widens with the light's size and with the distance from the caster. shadow_bias and shadow_normal_bias move the receiver as Godot's lookup does, so the shadow edge sits where Godot puts it.

light_negative makes the light subtract with a negative three intensity, as in Godot. shadow_opacity mixes the shadow towards unshadowed through three's shadow.intensity. With distance_fade_enabled, the light and its shadow fade by Godot's smoothstep over the distance from the rendering camera. Each drops out past its fade end.

Known limitations

  • Approximated omni_shadow_mode Dual Paraboloid draws as Cube mode does, so the edge of a coarse caster's shadow can sit apart from Godot's.
  • Editor only The wireframe sphere gizmo appears only in Godot's editor, but here it is selection-gated.

OpenXRBindingModifierEditor

renders as nothing yet, not implemented docs ↗ source ↗ unit-open-xr-binding-modifier-editor.tscn ↗ Not implemented
Comparison images not captured yet for OpenXRBindingModifierEditor.

OpenXRBindingModifierEditor is editor-only UI for the OpenXR action-map inspector, which no exported game scene instantiates. The previewer parses and validates it like any Control, and draws nothing for it.

Linting

Strict parsing format-checks the inherited set (53 inherited from Control, 16 inherited from CanvasItem, 10 inherited from Node); OpenXRBindingModifierEditor declares none of its own. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-canvasitem-clip-ancestry (type-family match)canvasitem-ancestor-clips-childrenwarning
canvasitem-ancestor-is-canvasgroupwarning
valid-control-properties (type-family match)control-tooltip-ignored-by-mouse-filterwarning
control-property-orderwarning

The class binds no property of its own, so every key a .tscn can set on it is inherited from PanelContainer up. The lenient parser forwards to parseControl, so a malformed offset_left becomes undefined and is dropped silently.

Known limitations

  • Editor only Godot builds this panel only inside the editor, and the previewer draws nothing for it.

OpenXRCompositionLayerCylinder

renders as nothing yet, outside an OpenXR session Godot draws a curved cylinder section, the previewer does not docs ↗ source ↗ unit-open-xr-composition-layer-cylinder.tscn ↗ Not implemented
Comparison images not captured yet for OpenXRCompositionLayerCylinder.

Composites layer_viewport onto a cylinder section in the XR compositor during a live session. Outside one, Godot draws a fallback mesh shaped by radius, aspect_ratio and central_angle. The previewer draws a transform-only group, and its children still show.

Linting

Strict parsing format-checks these OpenXRCompositionLayerCylinder properties, plus 18 inherited from OpenXRCompositionLayer, 17 inherited from Node3D, 10 inherited from Node. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

PropertyAcceptsOut of range
aspect_ratiofloat > 0, <= 100error at or below 0, warning above 100
central_anglefloat > 0error at or below 0
fallback_segmentsinteger > 0error at or below 0
radiusfloat > 0error at or below 0
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-node3d-visibility (type-family match)valid-node3d-visibilityerror
valid-openxrcompositionlayer (type-family match)openxrcompositionlayer-parent-not-xrorigin3dwarning
openxrcompositionlayer-non-orthonormal-transformwarning
openxrcompositionlayer-hole-punch-sort-orderwarning

The lenient parser reuses parseNode3D, which reads only transform and visible. A malformed radius = -1 or fallback_segments = 0 is dropped without reaching any render path. Only the strict validators see these keys.

Known limitations

  • Not drawn Godot draws the fallback cylinder section outside an XR session, but the previewer draws nothing for it.

OpenXRCompositionLayerEquirect

renders as nothing yet, outside an OpenXR session Godot draws an equirectangular sphere section, the previewer does not docs ↗ source ↗ unit-open-xr-composition-layer-equirect.tscn ↗ Not implemented
Comparison images not captured yet for OpenXRCompositionLayerEquirect.

Composites layer_viewport onto a sphere section in the XR compositor during a live session. Outside one, Godot draws a fallback mesh shaped by radius and the vertical and horizontal angles. The previewer draws a transform-only group, and its children still show.

Linting

Strict parsing format-checks these OpenXRCompositionLayerEquirect properties, plus 18 inherited from OpenXRCompositionLayer, 17 inherited from Node3D, 10 inherited from Node. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

PropertyAcceptsOut of range
central_horizontal_anglefloat > 0error at or below 0
fallback_segmentsinteger > 0error at or below 0
lower_vertical_anglefloat > 0, <= 1.5707963267948966error at or below 0, error above 1.5707963267948966
radiusfloat > 0error at or below 0
upper_vertical_anglefloat > 0, <= 1.5707963267948966error at or below 0, error above 1.5707963267948966
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-node3d-visibility (type-family match)valid-node3d-visibilityerror
valid-openxrcompositionlayer (type-family match)openxrcompositionlayer-parent-not-xrorigin3dwarning
openxrcompositionlayer-non-orthonormal-transformwarning
openxrcompositionlayer-hole-punch-sort-orderwarning

The lenient parser reuses parseNode3D, which reads only transform and visible. A malformed upper_vertical_angle = 5 or radius = 0 is dropped without reaching any render path. Only the strict validators see these keys.

Known limitations

  • Not drawn Godot draws the fallback sphere section outside an XR session, but the previewer draws nothing for it.

OpenXRCompositionLayerQuad

renders as nothing yet, outside an OpenXR session Godot draws a flat quad, the previewer does not docs ↗ source ↗ unit-open-xr-composition-layer-quad.tscn ↗ Not implemented
Comparison images not captured yet for OpenXRCompositionLayerQuad.

Composites layer_viewport onto a flat quad in the XR compositor during a live session. Outside one, Godot draws a fallback mesh sized by quad_size. The previewer draws a transform-only group, and its children still show.

Linting

Strict parsing format-checks these OpenXRCompositionLayerQuad properties, plus 18 inherited from OpenXRCompositionLayer, 17 inherited from Node3D, 10 inherited from Node. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

PropertyAcceptsOut of range
quad_sizeVector2(x, y), or the Vector2i spelling Godot converts
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-node3d-visibility (type-family match)valid-node3d-visibilityerror
valid-openxrcompositionlayer (type-family match)openxrcompositionlayer-parent-not-xrorigin3dwarning
openxrcompositionlayer-non-orthonormal-transformwarning
openxrcompositionlayer-hole-punch-sort-orderwarning

The lenient parser reuses parseNode3D, which reads only transform and visible. A malformed quad_size or swapchain_state_min_filter = 99 is dropped without reaching any render path. Only the strict validators see these keys.

Known limitations

  • Not drawn Godot draws the fallback quad outside an XR session, but the previewer draws nothing for it.

OpenXRHand

renders as nothing yet, Godot poses hand bones from tracking, the previewer does not docs ↗ source ↗ unit-open-xr-hand.tscn ↗ Not implemented
No visual output — this node draws nothing to compare.

Drives a Skeleton3D's bone poses from OpenXR hand tracking. Only a live XR session feeds it, and the previewer runs no session, so the drive is a gap (ADR-0045). Its children show at the pose the scene file states.

Linting

Strict parsing format-checks these OpenXRHand properties, plus 17 inherited from Node3D, 10 inherited from Node. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

PropertyAcceptsOut of range
bone_updateenum 0-1 (Full/Rotation Only)error
handenum 0-1 (Left/Right)error
hand_skeletonNodePath("path/to/node")
motion_rangeenum 0-1 (Unobstructed/Conform to controller)error
skeleton_rigenum 0-1 (OpenXR/Humanoid)error
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-node3d-visibility (type-family match)valid-node3d-visibilityerror

The lenient parser reads OpenXRHand through parseNode3D, so a malformed hand, motion_range, skeleton_rig or bone_update is kept as opaque text with no substitution. There is no tracked pose to fall back to.

OpenXRInteractionProfileEditor

renders as nothing, editor-only UI that no exported game scene ever instantiates docs ↗ source ↗ unit-open-xr-interaction-profile-editor.tscn ↗ Not implemented
Comparison images not captured yet for OpenXRInteractionProfileEditor.

OpenXRInteractionProfileEditor is the editor's fallback tab for an OpenXR interaction profile, compiled only into editor builds. The previewer parses and validates it like any Control, and draws nothing for it.

Linting

Strict parsing format-checks the inherited set (1 inherited from BoxContainer, 53 inherited from Control, 16 inherited from CanvasItem, 10 inherited from Node); OpenXRInteractionProfileEditor declares none of its own. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032). OpenXRInteractionProfileEditor also REFUSES vertical, which its base declares but this class cannot carry.

PropertyAcceptsOut of range
verticalnot available on this type
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-canvasitem-clip-ancestry (type-family match)canvasitem-ancestor-clips-childrenwarning
canvasitem-ancestor-is-canvasgroupwarning
valid-control-properties (type-family match)control-tooltip-ignored-by-mouse-filterwarning
control-property-orderwarning

The class binds no property of its own, so strict checks the inherited HBoxContainer set and rejects vertical, which HBoxContainer removes. The lenient parser drops a malformed offset_right or modulate silently, since parseOptionalFloat and parseColorOrUndefined return undefined.

Known limitations

  • Editor only Godot builds this panel only inside the editor, and the previewer draws nothing for it.

OpenXRRenderModel

renders as nothing yet, Godot mounts the runtime's glTF model as a child, the previewer does not docs ↗ source ↗ unit-open-xr-render-model.tscn ↗ Not implemented
No visual output — this node draws nothing to compare.

Asks the OpenXR runtime for a glTF model of the device the player holds and adds it as a child at play time. Only a live XR session answers, and the previewer runs no session, so no model is mounted (ADR-0045).

Linting

Strict parsing format-checks the inherited set (17 inherited from Node3D, 10 inherited from Node); OpenXRRenderModel declares none of its own. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-node3d-visibility (type-family match)valid-node3d-visibilityerror
valid-openxrrendermodel-parentopenxrrendermodel-parent-not-origin-or-managerwarning

OpenXRRenderModel declares no validators, since its one member is a runtime RID. The lenient parser never substitutes a missing or wrong parent either. It renders the node wherever the tree puts it, and strict parsing reports the misplacement as a warning.

OpenXRRenderModelManager

renders as nothing yet, Godot spawns a render model per tracked device, the previewer does not docs ↗ source ↗ unit-open-xr-render-model-manager.tscn ↗ Not implemented
No visual output — this node draws nothing to compare.

Watches the OpenXR runtime for active devices and spawns OpenXRRenderModel children for them at runtime. Only a live XR session reports devices, and the previewer runs no session, so it spawns nothing (ADR-0045).

Linting

Strict parsing format-checks these OpenXRRenderModelManager properties, plus 17 inherited from Node3D, 10 inherited from Node. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

PropertyAcceptsOut of range
make_local_to_posequoted string, or the &"…" StringName or NodePath("…") it converts
trackerenum 0-3 (Any/None set/Left Hand/Right Hand)warning
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-node3d-visibility (type-family match)valid-node3d-visibilityerror
valid-openxrrendermodelmanager-configopenxrrendermodelmanager-tracker-required-for-local-posewarning
openxrrendermodelmanager-parent-not-xrorigin3dwarning

The lenient parser reads the node through parseNode3D, so a malformed tracker or an unquoted make_local_to_pose is kept as opaque text with no substitution. Strict parsing reports it as an error or warning.

OpenXRVisibilityMask

renders as invisible transform-only fallback docs ↗ source ↗ unit-open-xr-visibility-mask.tscn ↗ Not implemented
Comparison images not captured yet for OpenXRVisibilityMask.

Draws a stereo-correct mask that blacks out the part of the render hidden by lens distortion. The previewer parses and validates it but does not draw it, so it mounts as an invisible transform-only group.

Linting

Strict parsing format-checks the inherited set (1 inherited from VisualInstance3D, 17 inherited from Node3D, 10 inherited from Node); OpenXRVisibilityMask declares none of its own. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-node3d-visibility (type-family match)valid-node3d-visibilityerror
valid-openxrvisibilitymask-parentopenxrvisibilitymask-parent-not-xrcamera3dwarning

OpenXRVisibilityMask declares no property of its own. The lenient parser reuses parseNode3D, which reads only transform and visible, so an inherited layers = -1 is dropped and only VisualInstance3D's strict validator range-checks it.

Known limitations

  • Not drawn Godot blacks out the lens-distortion region in an XR session, but the previewer draws nothing for it.

OptionButton

renders as a collapsed dropdown box docs ↗ source ↗ unit-optionbutton.tscn ↗ Done
Godot render of OptionButton Our render of OptionButton
Godot 4.6.3 Ours

OptionButton is a dropdown that collapses to its selected item. The previewer draws that item's text and the theme's arrow inside the button's chrome.

Linting

Strict parsing format-checks these OptionButton properties, plus 13 inherited from Button, 10 inherited from BaseButton, 53 inherited from Control, 16 inherited from CanvasItem, 10 inherited from Node. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

PropertyAcceptsOut of range
allow_reselecttrue or false
fit_to_longest_itemtrue or false
item_countinteger >= 0error below
popup/item_#/*item
selectedinteger >= -1error below
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-canvasitem-clip-ancestry (type-family match)canvasitem-ancestor-clips-childrenwarning
canvasitem-ancestor-is-canvasgroupwarning
valid-control-properties (type-family match)control-tooltip-ignored-by-mouse-filterwarning
control-property-orderwarning
valid-button-group (type-family match)button-group-without-toggle-modewarning
valid-optionbutton-selectedoptionbutton-selected-out-of-rangewarning

An absent or unparseable selected becomes undefined and the control renders an empty label rather than item 0. An invalid popup/item_N/id falls back to the item's own index. linter.ts warns when selected names an index item_count never provides.

Known limitations

  • Approximated Under layout_direction = 3 or text_direction = 2, the label's glyphs keep left-to-right order for a right-to-left script or trailing punctuation, though layout_direction = 3 swaps the label, icon and chrome.

Panel

renders as a StyleBox quad docs ↗ source ↗ unit-panel.tscn ↗ Done
Godot render of Panel Our render of Panel
Godot 4.6.3 Ours

Panel is a bare rectangular Control that paints its theme_override_styles/panel StyleBox and holds free-anchored children. The previewer draws that StyleBox (fill, corner arcs and border ring) onto the canvas.

Linting

Strict parsing format-checks the inherited set (53 inherited from Control, 16 inherited from CanvasItem, 10 inherited from Node); Panel declares none of its own. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-canvasitem-clip-ancestry (type-family match)canvasitem-ancestor-clips-childrenwarning
canvasitem-ancestor-is-canvasgroupwarning
valid-control-properties (type-family match)control-tooltip-ignored-by-mouse-filterwarning
control-property-orderwarning

Panel adds no properties of its own and forwards straight to parseControl, so there is no Panel-specific lenient fallback beyond what Control covers.

PanelContainer

renders as a StyleBox panel around its child docs ↗ source ↗ unit-panel-container.tscn ↗ Done
Godot render of PanelContainer Our render of PanelContainer
Godot 4.6.3 Ours

PanelContainer draws its panel StyleBox and fits its single child inside the content margins.

Linting

Strict parsing format-checks the inherited set (53 inherited from Control, 16 inherited from CanvasItem, 10 inherited from Node); PanelContainer declares none of its own. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-canvasitem-clip-ancestry (type-family match)canvasitem-ancestor-clips-childrenwarning
canvasitem-ancestor-is-canvasgroupwarning
valid-control-properties (type-family match)control-tooltip-ignored-by-mouse-filterwarning
control-property-orderwarning

PanelContainer declares no validators of its own and delegates straight to parseControl, adding no properties. All lenient fallback behaviour for this node lives in the Control slice.

Parallax2D

renders as invisible transform-only fallback docs ↗ source ↗ unit-parallax-2d.tscn ↗ Not implemented
Comparison images not captured yet for Parallax2D.

Parallax2D repeats and scroll-offsets its children to fake camera depth. The previewer parses and validates it but applies no motion, so it renders as a transform-only fallback and its children show at their authored transform.

Linting

Strict parsing format-checks these Parallax2D properties, plus 12 inherited from Node2D, 16 inherited from CanvasItem, 10 inherited from Node. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

PropertyAcceptsOut of range
autoscrollVector2(x, y), or the Vector2i spelling Godot converts
follow_viewporttrue or false
ignore_camera_scrolltrue or false
limit_beginVector2(x, y), or the Vector2i spelling Godot converts
limit_endVector2(x, y), or the Vector2i spelling Godot converts
repeat_sizeVector2(x, y), each >= 0
repeat_timesinteger >= 1error below
screen_offsetVector2(x, y), or the Vector2i spelling Godot converts
scroll_offsetVector2(x, y), or the Vector2i spelling Godot converts
scroll_scaleVector2(x, y), or the Vector2i spelling Godot converts
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-canvasitem-clip-ancestry (type-family match)canvasitem-ancestor-clips-childrenwarning
canvasitem-ancestor-is-canvasgroupwarning

The lenient parser reuses parseNode2D unchanged, so none of the ten parallax keys is read. A malformed repeat_size or repeat_times is dropped with no fallback, the same as a well-formed one.

Known limitations

  • Not drawn The children draw once, at their authored transform, without the scroll offset and repeats Godot applies to them.

ParallaxBackground

renders as a viewport-anchored group holding its ParallaxLayer children docs ↗ source ↗ unit-parallax-background.tscn ↗ Done
Godot render of ParallaxBackground Our render of ParallaxBackground
Godot 4.6.3 Ours

ParallaxBackground is a CanvasLayer that lays its ParallaxLayer children out against the viewport. The previewer draws it as a group placed by the layer's own transform and ordered behind the default canvas by layer. Where a Camera2D frames the pass, the group anchors to its view rect. It is a canvas boundary for Controls as well: a Control under it draws on its canvas, at its layer, rather than on the viewport's.

Linting

Strict parsing format-checks these ParallaxBackground properties, plus 8 inherited from CanvasLayer, 10 inherited from Node. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

PropertyAcceptsOut of range
scroll_base_offsetVector2(x, y), or the Vector2i spelling Godot converts
scroll_base_scaleVector2(x, y), or the Vector2i spelling Godot converts
scroll_ignore_camera_zoomtrue or false
scroll_limit_beginVector2(x, y), or the Vector2i spelling Godot converts
scroll_limit_endVector2(x, y), or the Vector2i spelling Godot converts
scroll_offsetVector2(x, y), or the Vector2i spelling Godot converts
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo

A malformed transform falls back to the identity placement and an unreadable layer to Godot's class default -100. scroll_base_scale falls back to Vector2(1, 1), the other scroll_* vectors to Vector2(0, 0) and follow_viewport_scale to 1.

Scrolling under a Camera2D

In Godot and here, the scroll_* surface acts only while a Camera2D is current, inside a sub-viewport that frames through one. The camera sets scroll_offset before each scroll (parallax_background.cpp:48-52), so an authored scroll_offset never shows.

scroll_ignore_camera_zoom divides the camera zoom out of the scroll and draws each layer at scale 1. The parallax-ignore-camera-zoom golden puts a layer under a zoom-2 camera. Godot 4.6.3 draws its bar at its authored 80 by 30 pixels, and the previewer matches it.

ParallaxLayer

renders as a Node2D transform group, repeated once per mirrored axis docs ↗ source ↗ unit-parallax-layer.tscn ↗ Done
Godot render of ParallaxLayer Our render of ParallaxLayer
Godot 4.6.3 Ours

ParallaxLayer is a Node2D that its parent ParallaxBackground is allowed to move. The previewer keeps the authored pose on an ordinary Node2D and puts the scroll on a wrapper. It draws the subtree once more along each motion_mirroring axis.

Linting

Strict parsing format-checks these ParallaxLayer properties, plus 12 inherited from Node2D, 16 inherited from CanvasItem, 10 inherited from Node. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

PropertyAcceptsOut of range
motion_mirroringVector2(x, y), or the Vector2i spelling Godot converts
motion_offsetVector2(x, y), or the Vector2i spelling Godot converts
motion_scaleVector2(x, y), or the Vector2i spelling Godot converts
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-canvasitem-clip-ancestry (type-family match)canvasitem-ancestor-clips-childrenwarning
canvasitem-ancestor-is-canvasgroupwarning
valid-parallaxlayer-parentparallaxlayer-outside-parallaxbackgroundwarning

An unreadable motion_scale falls back to Vector2(1, 1), motion_offset and motion_mirroring to Vector2(0, 0), and a malformed transform to the identity. A negative motion_mirroring component is clamped to 0, as set_mirroring does.

Known limitations

  • Needs runtime motion_scale and motion_offset move the layer only while a Camera2D is current, so a still frame shows the authored pose, as in Godot.
  • Approximated Picking a mirrored copy, other than the last, selects the ParallaxLayer, not the copied child.

Path2D

renders as nothing at runtime, a selection-gated curve gizmo docs ↗ source ↗ unit-path2d.tscn ↗ Done
No visual output — this node draws nothing to compare.

Path2D carries a Curve2D for children to follow. It has no runtime visual. The previewer draws the curve only as a selection-gated white polyline (ADR-0018), so a plain capture is empty on both sides.

Linting

Strict parsing format-checks these Path2D properties, plus 12 inherited from Node2D, 16 inherited from CanvasItem, 10 inherited from Node. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

PropertyAcceptsOut of range
curvenull, SubResource("id"), ExtResource("id") or Resource("path")
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-canvasitem-clip-ancestry (type-family match)canvasitem-ancestor-clips-childrenwarning
canvasitem-ancestor-is-canvasgroupwarning
valid-path2dpath2d-missing-curveinfo
curve2d-loadableerror

The parser stores a malformed curve reference as-is, and it surfaces when the component fails to resolve it. curve2d-loadable reports a Curve2D whose _data Godot refuses, which loads with zero points.

Path3D

renders as a selection-gated curve gizmo docs ↗ source ↗ unit-path3d.tscn ↗ Done
Godot render of Path3D Our render of Path3D
Godot 4.6.3 Ours

Holds a Curve3D that its descendants can ride. Its only visual is the curve polyline, a selection-gated editor gizmo (ADR-0018), so a plain capture draws nothing for the path itself. The fixture's marker spheres trace the arch in both frames.

Linting

Strict parsing format-checks these Path3D properties, plus 17 inherited from Node3D, 10 inherited from Node. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

PropertyAcceptsOut of range
curvenull, SubResource("id"), ExtResource("id") or Resource("path")
debug_custom_colorColor(r, g, b, a), or the colour string or int it converts
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-node3d-visibility (type-family match)valid-node3d-visibilityerror
valid-path3dpath3d-requires-curveinfo
curve3d-loadableerror

curve is the only property, and the lenient parser copies the raw resource-reference string through with no format check. Absent, it stays unset with no default and no warning.

Known limitations

  • Editor only The curve polyline draws only for the selected node, and Godot draws no path line while running.

PathFollow2D

renders as a transform-only follower with a selection-gated dot docs ↗ source ↗ unit-pathfollow2d.tscn ↗ Done
Godot render of PathFollow2D Our render of PathFollow2D
Godot 4.6.3 Ours

PathFollow2D places its children along the parent Path2D's curve and draws nothing itself. Its follow-point dot is selection-gated (ADR-0018), and the previewer positions the children from progress alone, as Godot does on load.

Linting

Strict parsing format-checks these PathFollow2D properties, plus 12 inherited from Node2D, 16 inherited from CanvasItem, 10 inherited from Node. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

PropertyAcceptsOut of range
cubic_interptrue or false
h_offsetfloat
looptrue or false
progressfloat
progress_ratiofloat
rotatestrue or false
v_offsetfloat
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-canvasitem-clip-ancestry (type-family match)canvasitem-ancestor-clips-childrenwarning
canvasitem-ancestor-is-canvasgroupwarning
valid-pathfollow2dpathfollow2d-no-parentwarning
pathfollow2d-invalid-parentwarning
pathfollow2d-negative-progressinfo
pathfollow2d-progress-ratio-ignorederror

rotates, cubic_interp and loop fall back to true, h_offset and v_offset to 0. progress and progress_ratio stay undefined when absent but fall to 0 with a warning when unparseable.

PathFollow3D

renders as a curve-positioned transform group docs ↗ source ↗ unit-pathfollow-3d.tscn ↗ Limitation
Godot render of PathFollow3D Our render of PathFollow3D
Godot 4.6.3 Ours

Positions its children a set distance along its parent Path3D's curve. The previewer samples the curve and drives a transform group to that point. The orange box lands at the bottom of the U in both frames.

Linting

Strict parsing format-checks these PathFollow3D properties, plus 17 inherited from Node3D, 10 inherited from Node. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

PropertyAcceptsOut of range
cubic_interptrue or false
h_offsetfloat
looptrue or false
progressfloat
progress_ratiofloat
rotation_modeenum 0-4 (NONE/Y/XY/XYZ/ORIENTED)warning
tilt_enabledtrue or false
use_model_fronttrue or false
v_offsetfloat
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-node3d-visibility (type-family match)valid-node3d-visibilityerror
valid-pathfollow3dpathfollow3d-no-parentwarning
pathfollow3d-invalid-parentwarning
pathfollow3d-negative-progressinfo
pathfollow3d-progress-ratio-ignorederror
pathfollow3d-oriented-mode-requires-up-vectorwarning

h_offset and v_offset default to 0, and cubic_interp, loop and tilt_enabled default to true, with a warning when present but unparseable. rotation_mode reads through intOr, so 99 survives and only a non-number falls back to XYZ (3). progress and progress_ratio stay undefined when absent.

Known limitations

  • Editor only The follow-point gizmo draws only for the selected node.
  • Approximated Every rotation_mode except NONE turns the node to face along the curve in the same way, so Y, XY, XYZ and ORIENTED look alike.
  • Approximated The curve's per-point tilt is not applied, so a banked curve turns the node with no roll.

PhysicalBone2D

renders as a transform-only Node2D group docs ↗ source ↗ unit-physical-bone-2d.tscn ↗ Linter only
No visual output — this node draws nothing to compare.

A RigidBody2D that makes a Bone2D inside a Skeleton2D react to physics. It has no runtime visual, so the previewer mounts it as a transform-only Node2D group (ADR-0008).

Linting

Strict parsing format-checks these PhysicalBone2D properties, plus 23 inherited from RigidBody2D, 5 inherited from CollisionObject2D, 12 inherited from Node2D, 16 inherited from CanvasItem, 10 inherited from Node. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

PropertyAcceptsOut of range
auto_configure_jointtrue or false
bone2d_indexinteger 0-1000error below, warning above
bone2d_nodepathNodePath("path/to/node")
follow_bone_when_simulatingtrue or false
simulate_physicstrue or false
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-canvasitem-clip-ancestry (type-family match)canvasitem-ancestor-clips-childrenwarning
canvasitem-ancestor-is-canvasgroupwarning
valid-rigidbody2d (type-family match)rigidbody2d-max-contacts-without-monitorinfo
rigidbody2d-scale-overridden-at-runtimewarning
valid-collisionobject2d (type-family match)collisionobject2d-needs-collision-shapewarning
valid-physicalbone2dphysicalbone2d-missing-skeleton-parentwarning
physicalbone2d-missing-bone-indexwarning
physicalbone2d-missing-joint-childwarning

PhysicalBone2D reuses parseNode2D directly, so bone2d_nodepath, bone2d_index and the three flags are never read by the lenient parser. There is no substitution to describe.

PhysicalBone3D

renders as nothing (a transform-only group) docs ↗ source ↗ unit-physical-bone-3d.tscn ↗ Linter only
No visual output — this node draws nothing to compare.

A physics body that makes one bone of a Skeleton3D react to physics. It draws nothing at runtime, so the previewer renders it as a transform-only group (ADR-0008) and its children still show.

Linting

Strict parsing format-checks these PhysicalBone3D properties, plus 6 inherited from PhysicsBody3D, 6 inherited from CollisionObject3D, 17 inherited from Node3D, 10 inherited from Node. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

PropertyAcceptsOut of range
angular_dampfloat >= 0error below
angular_damp_modeenum 0-1 (COMBINE/REPLACE)warning
angular_velocityVector3(x, y, z), or the Vector3i spelling Godot converts
body_offsetTransform3D(12 floats)
bone_namequoted string or &"name"
bouncefloat 0-1error
can_sleeptrue or false
custom_integratortrue or false
frictionfloat 0-1error
gravity_scalefloat
joint_constraints/*joint-type-dependent constraint (float or bool — see PinJointData/ConeJointData/HingeJointData/SliderJointData/SixDOFJointData)
joint_offsetTransform3D(12 floats)
joint_rotationVector3(x, y, z), or the Vector3i spelling Godot converts
joint_typeenum 0-5 (NONE/PIN/CONE/HINGE/SLIDER/6DOF)warning
linear_dampfloat >= 0error below
linear_damp_modeenum 0-1 (COMBINE/REPLACE)warning
linear_velocityVector3(x, y, z), or the Vector3i spelling Godot converts
massfloat >= 0.01error at or below 0, warning below 0.01
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-node3d-visibility (type-family match)valid-node3d-visibilityerror
valid-collisionobject3d-scale (type-family match)collisionobject3d-non-uniform-scalewarning
valid-collisionobject3d (type-family match)collisionobject3d-needs-collision-shapewarning
valid-physicalbone3d-collision-shapephysicalbone3d-joint-constraint-without-jointerror
physicalbone3d-joint-constraint-wrong-joint-typeerror

PhysicalBone3D registers parseNode3D directly, which reads only transform and visible. A malformed joint_type or an unquoted bone_name is dropped rather than substituted or warned on, and survives only on rawProperties.

PhysicalBoneSimulator3D

renders as nothing yet, Godot drives its ragdoll through the physics server, the previewer does not docs ↗ source ↗ unit-physical-bone-simulator-3d.tscn ↗ Not implemented
No visual output — this node draws nothing to compare.

The ragdoll driver: it hands the PhysicalBone3D nodes beneath it to the physics server and writes their poses back onto a parent Skeleton3D each frame. Godot runs that loop, and the previewer does not simulate it (ADR-0045): the bones hold their rest pose.

Linting

Strict parsing format-checks the inherited set (2 inherited from SkeletonModifier3D, 17 inherited from Node3D, 10 inherited from Node); PhysicalBoneSimulator3D declares none of its own. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-node3d-visibility (type-family match)valid-node3d-visibilityerror
valid-skeletonmodifier3d-parent (type-family match)skeletonmodifier3d-parent-not-skeleton3dwarning

PhysicalBoneSimulator3D declares no validator of its own, and index.ts registers parseNode3D directly. A value strict rejects through the inherited set, such as an influence above 1, is dropped rather than substituted.

PinJoint2D

renders as nothing (a transform-only group) docs ↗ source ↗ unit-pin-joint-2d.tscn ↗ Linter only
No visual output — this node draws nothing to compare.

Attaches two 2D physics bodies at a single point and lets them rotate freely. Godot shows joints only as an editor gizmo, so the previewer renders it as a transform-only group (ADR-0008).

Linting

Strict parsing format-checks these PinJoint2D properties, plus 4 inherited from Joint2D, 12 inherited from Node2D, 16 inherited from CanvasItem, 10 inherited from Node. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

PropertyAcceptsOut of range
angular_limit_enabledtrue or false
angular_limit_lowerradians, -180° to 180°warning
angular_limit_upperradians, -180° to 180°warning
motor_enabledtrue or false
motor_target_velocityfloat
softnessfloat 0-16warning
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-canvasitem-clip-ancestry (type-family match)canvasitem-ancestor-clips-childrenwarning
canvasitem-ancestor-is-canvasgroupwarning
valid-joint (type-family match)joint-not-connectedwarning
joint-same-bodywarning

PinJoint2D reuses parseNode2D directly, so its own properties never reach the lenient parser. A bad softness is neither substituted nor defaulted, and only the strict parser reports it.

PinJoint3D

renders as nothing (a transform-only group) docs ↗ source ↗ unit-pin-joint-3d.tscn ↗ Linter only
No visual output — this node draws nothing to compare.

Pins two 3D physics bodies together at a point. It draws nothing at runtime, so the previewer renders it as a transform-only group (ADR-0008) and its children still show.

Linting

Strict parsing format-checks these PinJoint3D properties, plus 4 inherited from Joint3D, 17 inherited from Node3D, 10 inherited from Node. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

PropertyAcceptsOut of range
params/biasfloat 0.01-0.99warning
params/dampingfloat 0.01-8warning
params/impulse_clampfloat 0-64warning
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-node3d-visibility (type-family match)valid-node3d-visibilityerror
valid-joint (type-family match)joint-not-connectedwarning
joint-same-bodywarning

The lenient parser applies no substitution. The base Node3D parse has no notion of the params/* bounds, so a negative params/impulse_clamp is stored verbatim and only StrictTscnParser reports it.

PointLight2D

renders as the light's cookie multiplied into every CanvasItem beneath it docs ↗ source ↗ unit-pointlight2d.tscn ↗ Done

PointLight2D lights the canvas with a texture cookie tinted by color and energy, and draws nothing itself. The previewer accumulates each light into an offscreen buffer that every lit CanvasItem multiplies its albedo against, which is Godot's own arithmetic. The previewer samples the cookie clamped at its quad edge. Godot resolves a canvas item's default repeat to the viewport's disabled default (viewport.h:419-420, viewport.cpp:4009, renderer_canvas_render_rd.cpp:2344), and the light tap uses that item sampler (canvas.glsl:774-782).

Godot render of PointLight2D Our render of PointLight2D
Godot 4.6.3 Ours

Blend modes

Done
Godot render of Blend modes Our render of Blend modes
Godot 4.6.3 Ours

Three identical lights over one grey surface, one per blend_mode. ADD brightens, SUB darkens by the same cookie and MIX interpolates toward the light, each landing on Godot.

An inline gradient cookie, a canvas tint, and an unshaded item

Done
Godot render of An inline gradient cookie, a canvas tint, and an unshaded item Our render of An inline gradient cookie, a canvas tint, and an unshaded item
Godot 4.6.3 Ours

Two torches share one inline GradientTexture2D cookie under a CanvasModulate. The light_mode = 1 panel keeps its authored colour and stops the torch at its edge, as an unshaded item does in Godot.

Light Only items

Done
Godot render of Light Only items Our render of Light Only items
Godot 4.6.3 Ours

light_mode = 2 draws an item only where a light reaches it. The two lit panels keep their authored colour under the cookie, the unlit one draws nothing, and none of them takes the canvas tint.

Cull masks: which items a light reaches

Done
Godot render of Cull masks: which items a light reaches Our render of Cull masks: which items a light reaches
Godot 4.6.3 Ours

A light reaches an item only where range_item_cull_mask and the item's light_mask share a bit. Four panels under a warm and a cool light take the warm one, the cool one, both, or neither.

The z window: which z planes a light reaches

Done
Godot render of The z window: which z planes a light reaches Our render of The z window: which z planes a light reaches
Godot 4.6.3 Ours

A light reaches an item only while its accumulated z_index lies inside range_z_min to range_z_max, both ends inclusive. The panel at z_index = 5 stays at the bare canvas tint.

The layer window: which canvases a light reaches

Done
Godot render of The layer window: which canvases a light reaches Our render of The layer window: which canvases a light reaches
Godot 4.6.3 Ours

range_layer_min and range_layer_max default to 0, the world canvas, while a CanvasLayer defaults to 1. So an untouched light lights the world panel and never the HUD panel.

Soft shadows: shadow_filter and shadow_filter_smooth

Done
Godot render of Soft shadows: shadow_filter and shadow_filter_smooth Our render of Soft shadows: shadow_filter and shadow_filter_smooth
Godot 4.6.3 Ours

shadow_filter = PCF5 or PCF13 averages taps offset in angle across Godot's polar shadow map, so the boundary is a stepped ramp that widens with distance. The previewer builds the same map and taps it in the light's fragment shader (ADR-0030).

Shadow receivers: shadow_item_cull_mask

Done
Godot render of Shadow receivers: shadow_item_cull_mask Our render of Shadow receivers: shadow_item_cull_mask
Godot 4.6.3 Ours

shadow_item_cull_mask picks the occluders that cast and the items that take the shadow. The light reaches both panels, but only the upper panel's light_mask meets the mask, so the lower panel stays lit behind the bar.

Light order: a MIX light over a light of another mask

Done
Godot render of Light order: a MIX light over a light of another mask Our render of Light order: a MIX light over a light of another mask
Godot 4.6.3 Ours

Godot applies every light on an item's list in order, whatever each light's range_item_cull_mask (renderer_canvas_render_rd.cpp:2365-2384). The MIX light reaches the surface through mask 2 and the ADD light through mask 1. Where both reach, the MIX light mixes from what the ADD light left.

Many cull masks on one item

Done
Godot render of Many cull masks on one item Our render of Many cull masks on one item
Godot 4.6.3 Ours

Six lights, one mask bit each, reach one surface whose light_mask holds all six. Godot draws every light on the item's list, however many masks the canvas holds (renderer_canvas_render_rd.cpp:2366).

A MIX light with a shadow_color

Done
Godot render of A MIX light with a shadow_color Our render of A MIX light with a shadow_color
Godot 4.6.3 Ours

Where a MIX light is blocked, Godot mixes the colour under it toward shadow_color by shadow_color.a (canvas.glsl:544-546, :559-560). The ADD light under it dims there too, behind the bar on the right.

A MIX light over a tinted shadow

Done
Godot render of A MIX light over a tinted shadow Our render of A MIX light over a tinted shadow
Godot 4.6.3 Ours

A MIX light mixes the tinted shadow under it like any other colour. The green MIX light replaces the blue shadow_color of the light on the left where both reach.

At most 15 lights on one item

Done
Godot render of At most 15 lights on one item Our render of At most 15 lights on one item
Godot 4.6.3 Ours

An item takes at most 15 positional lights, in tree order. A light counts only where its rect meets the item's rect, and only while its rect meets the viewport. The green light reaches only the left panel, so the left panel fills its 15 lights before the red light. The right panel takes the red light.

Linting

Strict parsing format-checks these PointLight2D properties, plus 15 inherited from Light2D, 12 inherited from Node2D, 16 inherited from CanvasItem, 10 inherited from Node. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

PropertyAcceptsOut of range
heightfloat >= 0warning below
offsetVector2(x, y), or the Vector2i spelling Godot converts
texturenull, SubResource("id"), ExtResource("id") or Resource("path")
texture_scalefloat 0.01-50, never exactly 0warning
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-canvasitem-clip-ancestry (type-family match)canvasitem-ancestor-clips-childrenwarning
canvasitem-ancestor-is-canvasgroupwarning
valid-pointlight2d-rangespointlight2d-requires-texturewarning
pointlight2d-inverted-z-rangeinfo
pointlight2d-inverted-layer-rangeinfo

The linter warns (resource-type-excluded-by-hint) when texture holds a class its hint excludes, such as an AtlasTexture. Godot's editor never offers such a class, and the setter keeps it with a debug warning (light_2d.cpp:396-405).

enabled falls back to true, energy and texture_scale to 1.0, offset to (0, 0) and blend_mode to 0 (ADD), each with a warning. color falls back to opaque white silently. texture is stored with no reference check.

Known limitations

  • Shader missing A CanvasTexture.normal_texture is not read, so every surface takes the light head-on with no specular response.
  • Approximated Under a shadow_filter, a step of the penumbra can sit one polar bin from Godot's, so its stepped edge shifts slightly in places.

Polygon2D

renders as a filled, optionally textured mesh docs ↗ source ↗ unit-polygon2d.tscn ↗ Limitation
Godot render of Polygon2D Our render of Polygon2D
Godot 4.6.3 Ours

Polygon2D fills an outline on the canvas. The previewer triangulates it into an unlit mesh with one vertex per point and tints it with color. texture is sampled through the per-vertex uv with Godot's own UV formula.

Linting

Strict parsing format-checks these Polygon2D properties, plus 12 inherited from Node2D, 16 inherited from CanvasItem, 10 inherited from Node. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

PropertyAcceptsOut of range
antialiasedtrue or false
bonesArray literal [bone_path, PackedFloat32Array(weights), …]
colorColor(r, g, b, a), or the colour string or int it converts
internal_vertex_countinteger 0-1000warning
invert_borderfloat 0.1-16384warning
invert_enabledtrue or false
offsetVector2(x, y), or the Vector2i spelling Godot converts
polygonPackedVector2Array(x, y, …)
polygonsArray of PackedInt32Array(i0, i1, …) or bare [i0, i1, …] index lists
skeletonNodePath("path/to/node")
texturenull, SubResource("id"), ExtResource("id") or Resource("path")
texture_offsetVector2(x, y), or the Vector2i spelling Godot converts
texture_rotationfloat
texture_scaleVector2(x, y), or the Vector2i spelling Godot converts
uvPackedVector2Array(x, y, …)
vertex_colorsPackedColorArray(r, g, b, a, …)
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-canvasitem-clip-ancestry (type-family match)canvasitem-ancestor-clips-childrenwarning
canvasitem-ancestor-is-canvasgroupwarning

A non-numeric internal_vertex_count falls back to 0 and invert_border to 100, each with a warning. So do invert_enabled to false, offset and texture_offset to (0, 0) and texture_scale to (1, 1). A malformed color falls back to white silently. Malformed polygon, polygons, uv or vertex_colors warn and degrade to empty, which is Godot's own size-mismatch branch.

Known limitations

  • Approximated antialiased is ignored, so edges are marginally harder.

Popup

renders as nothing yet, not implemented docs ↗ source ↗ unit-popup.tscn ↗ Not implemented
Comparison images not captured yet for Popup.

The base of every popup window. The previewer parses and validates it but does not draw it. The base Node mounts under renderIntent: 'pending' as an empty group, and its children still show (ADR-0045).

Linting

Strict parsing format-checks the inherited set (45 inherited from Window, 47 inherited from Viewport, 10 inherited from Node); Popup declares none of its own. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-window-properties (type-family match)window-max-size-below-min-sizeinfo
window-size-clamped-by-limitswarning
window-content-scale-factor-flooredwarning

Popup declares no property of its own. The lenient parser registers the plain Node reader, which reads only the heading attributes and an optional transform. An inherited Window key such as size is never read or substituted.

Known limitations

  • Not drawn Godot displays the popup once shown, but the previewer draws nothing for it.

PopupMenu

renders as nothing yet, not implemented docs ↗ source ↗ unit-popup-menu.tscn ↗ Not implemented
Comparison images not captured yet for PopupMenu.

Godot's modal window for a list of options. The previewer parses and validates it, including the per-item item_<index>/<leaf> family, but does not draw it. The base Node mounts under renderIntent: 'pending' as an empty group, and its children still show (ADR-0045).

Linting

Strict parsing format-checks these PopupMenu properties, plus 45 inherited from Window, 47 inherited from Viewport, 10 inherited from Node. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

PropertyAcceptsOut of range
allow_searchtrue or false
hide_on_checkable_item_selectiontrue or false
hide_on_item_selectiontrue or false
hide_on_state_item_selectiontrue or false
item_#/*item_<index>/<leaf> (see popup_menu.cpp, PropertyListHelper-backed)
item_countinteger >= 0error below
prefer_native_menutrue or false
shrink_heighttrue or false
shrink_widthtrue or false
submenu_popup_delayfloat > 0error at or below 0
system_menu_idenum 0/2/3/4/5 (INVALID_MENU_ID/APPLICATION_MENU_ID/WINDOW_MENU_ID/HELP_MENU_ID/DOCK_MENU_ID)warning
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-window-properties (type-family match)window-max-size-below-min-sizeinfo
window-size-clamped-by-limitswarning
window-content-scale-factor-flooredwarning
valid-popupmenu-properties (type-family match)popupmenu-item-index-out-of-rangeerror

The lenient parser registers the generic parseNode, which never reads item_0/text or any other PopupMenu key. A bad value is carried in rawProperties and ignored by rendering, with no substitution or warning.

Known limitations

  • Not drawn Godot displays the menu once popped up, but the previewer draws nothing for it.

PopupPanel

renders as nothing yet, not implemented docs ↗ source ↗ unit-popup-panel.tscn ↗ Not implemented
Comparison images not captured yet for PopupPanel.

A popup with a themed panel background that stretches its children to fit. The previewer parses and validates it but does not draw it. The base Node mounts under renderIntent: 'pending' as an empty group, and its children still show (ADR-0045).

Linting

Strict parsing format-checks the inherited set (45 inherited from Window, 47 inherited from Viewport, 10 inherited from Node); PopupPanel declares none of its own. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-window-properties (type-family match)window-max-size-below-min-sizeinfo
window-size-clamped-by-limitswarning
window-content-scale-factor-flooredwarning

PopupPanel declares no property of its own. The lenient parser registers the plain Node reader. A negative inherited size component or an unquoted title is never read, substituted or reported on the lenient path.

Known limitations

  • Not drawn Godot displays the panel once shown, but the previewer draws nothing for it.

ProgressBar

renders as a background and ratio-filled StyleBox pair, with a percentage label docs ↗ source ↗ unit-progress-bar.tscn ↗ Unreviewed
Comparison images not captured yet for ProgressBar.

ProgressBar draws its background StyleBox across the whole control and its fill StyleBox windowed to the current value's ratio, in the direction fill_mode names. Unless indeterminate is set, it adds a centred percentage label with an optional outline.

Linting

Strict parsing format-checks these ProgressBar properties, plus 9 inherited from Range, 53 inherited from Control, 16 inherited from CanvasItem, 10 inherited from Node. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

PropertyAcceptsOut of range
editor_preview_indeterminatetrue or false
fill_modeenum 0-3 (FILL_BEGIN_TO_END/FILL_END_TO_BEGIN/FILL_TOP_TO_BOTTOM/FILL_BOTTOM_TO_TOP)error
indeterminatetrue or false
show_percentagetrue or false
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-canvasitem-clip-ancestry (type-family match)canvasitem-ancestor-clips-childrenwarning
canvasitem-ancestor-is-canvasgroupwarning
valid-control-properties (type-family match)control-tooltip-ignored-by-mouse-filterwarning
control-property-orderwarning
valid-range-bounds (type-family match)range-max-below-minerror
range-exp-edit-negative-minwarning

The lenient parser reads fill_mode, show_percentage, indeterminate and editor_preview_indeterminate alongside its Control and Range bases. A fill_mode outside 0-3 draws as FILL_BEGIN_TO_END: set_fill_mode's ERR_FAIL_INDEX refuses the out-of-range write, so the node keeps its class-default mode.

Known limitations

  • Approximated indeterminate never animates, so the previewer always draws Godot's static frame (the bar centred in the control), whatever editor_preview_indeterminate says.

Range

renders as nothing of its own docs ↗ source ↗ unit-range.tscn ↗ Unreviewed
Comparison images not captured yet for Range.

Range is the base that carries a bounded number, with step and page, behind sliders, scroll bars, spin boxes and progress bars. It draws nothing itself, because Godot's Range::_notification handles only accessibility, never NOTIFICATION_DRAW. It also overrides no minimum size or container layout. So the previewer's native painter is registered but empty, and its children still show.

Linting

Strict parsing format-checks these Range properties, plus 53 inherited from Control, 16 inherited from CanvasItem, 10 inherited from Node. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

PropertyAcceptsOut of range
allow_greatertrue or false
allow_lessertrue or false
exp_edittrue or false
max_valuefloat
min_valuefloat
pagefloat >= 0error below 0
roundedtrue or false
stepfloat
valuefloat
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-canvasitem-clip-ancestry (type-family match)canvasitem-ancestor-clips-childrenwarning
canvasitem-ancestor-is-canvasgroupwarning
valid-control-properties (type-family match)control-tooltip-ignored-by-mouse-filterwarning
control-property-orderwarning
valid-range-bounds (type-family match)range-max-below-minerror
range-exp-edit-negative-minwarning

Every own member format-checks as a plain float or bool, since range.cpp hints none of them. A max_value below min_value is an error, because Range::set_max clamps it up and the stored value differs from the file.

RayCast2D

renders as nothing (a transform-only group) docs ↗ source ↗ unit-ray-cast-2d.tscn ↗ Linter only
No visual output — this node draws nothing to compare.

Casts a ray each physics frame toward target_position and reports the first hit. Godot draws the ray only as a debug line, so the previewer renders it as a transform-only group (ADR-0008).

Linting

Strict parsing format-checks these RayCast2D properties, plus 12 inherited from Node2D, 16 inherited from CanvasItem, 10 inherited from Node. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

PropertyAcceptsOut of range
collide_with_areastrue or false
collide_with_bodiestrue or false
collision_mask32-bit layer mask (layers 1-32)
enabledtrue or false
exclude_parenttrue or false
hit_from_insidetrue or false
target_positionVector2(x, y), or the Vector2i spelling Godot converts
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-canvasitem-clip-ancestry (type-family match)canvasitem-ancestor-clips-childrenwarning
canvasitem-ancestor-is-canvasgroupwarning
valid-raycast2draycast2d-no-collide-targetinfo
raycast2d-zero-maskinfo

The lenient parser reuses parseNode2D, which reads only Node2D's transform keys, so a malformed collision_mask or a non-boolean hit_from_inside is ignored rather than substituted.

RayCast3D

renders as nothing (a transform-only group) docs ↗ source ↗ unit-ray-cast-3d.tscn ↗ Linter only
No visual output — this node draws nothing to compare.

Casts a ray each physics frame toward target_position and reports the first hit. It draws nothing at runtime, so the previewer renders it as a transform-only group (ADR-0008) and its children still show.

Linting

Strict parsing format-checks these RayCast3D properties, plus 17 inherited from Node3D, 10 inherited from Node. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

PropertyAcceptsOut of range
collide_with_areastrue or false
collide_with_bodiestrue or false
collision_mask32-bit layer mask (layers 1-32)
debug_shape_custom_colorColor(r, g, b, a), or the colour string or int it converts
debug_shape_thicknessinteger 1-5warning
enabledtrue or false
exclude_parenttrue or false
hit_back_facestrue or false
hit_from_insidetrue or false
target_positionVector3(x, y, z), or the Vector3i spelling Godot converts
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-node3d-visibility (type-family match)valid-node3d-visibilityerror
valid-raycast3draycast3d-no-collide-targetinfo
raycast3d-zero-maskinfo

The lenient parser reuses parseNode3D unmodified, which pulls only transform and visible off the property bag. A bad collision_mask = "all" or a two-component target_position is never read, so strict linting is the only path that sees it.

ReferenceRect

renders as a coloured border outline docs ↗ source ↗ unit-reference-rect.tscn ↗ Unreviewed
Comparison images not captured yet for ReferenceRect.

ReferenceRect draws a plain coloured border around its rect as a design-time aid. editor_only = false draws it unconditionally, as a running game does. The default (true) draws it only while the node is selected, where Godot's editor shows it always.

Linting

Strict parsing format-checks these ReferenceRect properties, plus 53 inherited from Control, 16 inherited from CanvasItem, 10 inherited from Node. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

PropertyAcceptsOut of range
border_colorColor(r, g, b, a), or the colour string or int it converts
border_widthfloat >= 0error below
editor_onlytrue or false
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-canvasitem-clip-ancestry (type-family match)canvasitem-ancestor-clips-childrenwarning
canvasitem-ancestor-is-canvasgroupwarning
valid-control-properties (type-family match)control-tooltip-ignored-by-mouse-filterwarning
control-property-orderwarning

border_color and editor_only carry no bound, so any format-valid literal passes both parsers. border_width is clamped to 0 by both. The strict parser flags a negative literal as an error, and the render-facing parser stores Godot's own floor (MAX(0, width)), as the setter does.

Known limitations

  • Editor only Godot's editor draws every ReferenceRect in the open scene at once, where here editor_only = true (the default) is selection-gated, as ADR-0018 does for Marker2D/Path2D.

ReflectionProbe

renders as a capture of the scene, baked into an atlas layer that lit surfaces in its box read docs ↗ source ↗ Unreviewed

Captures the scene around it in six directions and gives each lit surface inside its box the capture's reflection and ambient light. The previewer captures each probe once, after the scene's meshes and textures load.

Two overlapping probes

Unreviewed
Godot render of Two overlapping probes Our render of Two overlapping probes
Godot 4.6.3 Ours

Two probes that update ALWAYS share the floor. Each probe captures the blue background. The floor takes that capture as its ambient light and its reflection, so the floor and the shadow turn blue.

Box projection

Unreviewed
Godot render of Box projection Our render of Box projection
Godot 4.6.3 Ours

One probe that updates ONCE projects its reflection onto its box. The mirror sphere reflects the floor, the glowing box and the background where its reflection leaves the box.

Colour ambient

Unreviewed
Godot render of Colour ambient Our render of Colour ambient
Godot 4.6.3 Ours

One probe sets its ambient to red. The floor inside its box takes the red as its ambient light.

Linting

Strict parsing format-checks these ReflectionProbe properties, plus 1 inherited from VisualInstance3D, 17 inherited from Node3D, 10 inherited from Node. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

PropertyAcceptsOut of range
ambient_colorColor(r, g, b, a), or the colour string or int it converts
ambient_color_energyfloat 0-16warning
ambient_modeenum 0-2 (AMBIENT_DISABLED/AMBIENT_ENVIRONMENT/AMBIENT_COLOR)warning
blend_distancefloat >= 0warning below
box_projectiontrue or false
cull_mask32-bit layer mask (layers 1-32)
enable_shadowstrue or false
intensityfloat 0-1warning
interiortrue or false
max_distancefloat 0-262144error below 0, error above 262144
mesh_lod_thresholdfloat 0-1024warning
origin_offsetVector3(x, y, z), or the Vector3i spelling Godot converts
reflection_mask32-bit layer mask (layers 1-32)
sizeVector3(x, y, z), or the Vector3i spelling Godot converts
update_modeenum 0-1 (UPDATE_ONCE/UPDATE_ALWAYS)warning
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-node3d-visibility (type-family match)valid-node3d-visibilityerror
valid-reflectionprobe-propertiesreflectionprobe-ambient-color-no-effectinfo
reflectionprobe-origin-offset-clampedwarning

The lenient parser reads every property above. A malformed value keeps Godot's default, a max_distance above 262144 clamps to it, and an ambient_mode outside 0 to 2 reads as AMBIENT_DISABLED.

Known limitations

  • Approximated A probe that updates ALWAYS captures once, so it does not follow a moving node.

RemoteTransform2D

renders as nothing itself, it copies its transform onto its remote_path target docs ↗ source ↗ unit-remote-transform-2d.tscn ↗ Limitation
Godot render of RemoteTransform2D Our render of RemoteTransform2D
Godot 4.6.3 Ours

RemoteTransform2D draws nothing and copies its transform onto the node remote_path names. The previewer applies that once on load, the static enter-tree effect, so the target jumps to the relay's position.

Linting

Strict parsing format-checks these RemoteTransform2D properties, plus 12 inherited from Node2D, 16 inherited from CanvasItem, 10 inherited from Node. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

PropertyAcceptsOut of range
remote_pathNodePath("path/to/node")
update_positiontrue or false
update_rotationtrue or false
update_scaletrue or false
use_global_coordinatestrue or false
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-canvasitem-clip-ancestry (type-family match)canvasitem-ancestor-clips-childrenwarning
canvasitem-ancestor-is-canvasgroupwarning
valid-remotetransform2d-remote-pathremotetransform2d-invalid-remote-pathwarning

remote_path is stored as whatever string is present, with no NodePath check. update_position, update_rotation, update_scale and use_global_coordinates stay undefined when absent and otherwise become false for any value that does not read as true, with no warning.

Known limitations

  • Approximated use_global_coordinates = false is a no-op on a static load, so only the default global drive repositions the target.
  • Approximated A remote_path crossing into or out of an instanced sub-scene is left unresolved.
  • Approximated Relay chains resolve in document order, and a feedback loop is not iterated to a fixed point.

RemoteTransform3D

renders as nothing (a transform-only group that drives its target) docs ↗ source ↗ unit-remote-transform-3d.tscn ↗ Limitation
Godot render of RemoteTransform3D Our render of RemoteTransform3D
Godot 4.6.3 Ours

Pushes its own transform onto the node its remote_path names and has no visual of its own. The previewer applies the drive once at load, so the visible cube is the driven target sitting at the relay's position.

Linting

Strict parsing format-checks these RemoteTransform3D properties, plus 17 inherited from Node3D, 10 inherited from Node. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

PropertyAcceptsOut of range
remote_pathNodePath("path/to/node")
update_positiontrue or false
update_rotationtrue or false
update_scaletrue or false
use_global_coordinatestrue or false
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-node3d-visibility (type-family match)valid-node3d-visibilityerror
valid-remotetransform3d-remote-pathremotetransform3d-invalid-remote-pathwarning

remote_path is copied verbatim when present, with no NodePath validation. A malformed literal that strict rejects still parses and drives whatever target string was written. The update_* and use_global_coordinates flags use parseOptionalBool, so anything but the literal "true" becomes false silently.

Known limitations

  • Approximated The target sits apart from Godot's when the relay is inside an instanced scene, drives its own ancestor, or the target's parent rotates or scales.

ResourcePreloader

renders as nothing (a transform-only group) docs ↗ source ↗ unit-resource-preloader.tscn ↗ Linter only
No visual output — this node draws nothing to compare.

A resource cache that holds named references so they load with the scene. It draws nothing itself, so the previewer renders it as a transform-only group (ADR-0008) and its children still show.

Linting

Strict parsing format-checks these ResourcePreloader properties, plus 10 inherited from Node. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

PropertyAcceptsOut of range
resources[PackedStringArray(names...), [SubResource/ExtResource, …]] with matching, non-null entries
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo

index.ts registers the plain parseNode reader, which never looks at resources. A mismatched name count or a null entry is carried as inert text, and nothing about the rendered scene changes.

RetargetModifier3D

renders as nothing yet, Godot retargets poses onto child skeletons, the previewer does not docs ↗ source ↗ unit-retarget-modifier-3d.tscn ↗ Not implemented
No visual output — this node draws nothing to compare.

Copies the parent Skeleton3D's pose onto the Skeleton3D nodes beneath it, remapping through a SkeletonProfile so two rigs can share one animation. Godot runs that retarget each frame, and the previewer does not yet (ADR-0045): the bones hold their rest pose.

Linting

Strict parsing format-checks these RetargetModifier3D properties, plus 2 inherited from SkeletonModifier3D, 17 inherited from Node3D, 10 inherited from Node. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

PropertyAcceptsOut of range
enablebit mask of TRANSFORM_FLAG_POSITION (1) | TRANSFORM_FLAG_ROTATION (2) | TRANSFORM_FLAG_SCALE (4)
profilenull, SubResource("id"), ExtResource("id") or Resource("path")
use_global_posetrue or false
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-node3d-visibility (type-family match)valid-node3d-visibilityerror
valid-skeletonmodifier3d-parent (type-family match)skeletonmodifier3d-parent-not-skeleton3dwarning
valid-retargetmodifier3d-child-skeleton (type-family match)retargetmodifier3d-no-child-skeletonwarning

The retargetmodifier3d-no-child-skeleton rule stays silent when a child's class lives elsewhere. An instance= node, or a class the pinned catalog does not list, may be a Skeleton3D.

RetargetModifier3D registers parseNode3D directly, so profile, use_global_pose and enable are never read by the lenient parser. A malformed value is dropped rather than substituted. On the strict side, an enable bit past the three the inspector lists is only a warning.

RichTextLabel

renders as a run of shaped text with per-span styling docs ↗ source ↗ unit-rich-text-label.tscn ↗ Limitation
Godot render of RichTextLabel Our render of RichTextLabel
Godot 4.6.3 Ours

RichTextLabel lays out a run of rich text. With bbcode_enabled the previewer styles a subset of BBCode inline (ADR-0003).

Linting

Strict parsing format-checks these RichTextLabel properties, plus 53 inherited from Control, 16 inherited from CanvasItem, 10 inherited from Node. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

PropertyAcceptsOut of range
autowrap_modeenum 0-3 (AUTOWRAP_OFF/AUTOWRAP_ARBITRARY/AUTOWRAP_WORD/AUTOWRAP_WORD_SMART)warning
autowrap_trim_flagsbit mask of BREAK_TRIM_INDENT (32) | BREAK_TRIM_START_EDGE_SPACES (64) | BREAK_TRIM_END_EDGE_SPACES (128)
bbcode_enabledtrue or false
context_menu_enabledtrue or false
custom_effectsArray literal ([...] or ArrayRichTextEffect)
deselect_on_focus_loss_enabledtrue or false
drag_and_drop_selection_enabledtrue or false
fit_contenttrue or false
hint_underlinedtrue or false
horizontal_alignmentenum 0-3 (HORIZONTAL_ALIGNMENT_LEFT/HORIZONTAL_ALIGNMENT_CENTER/HORIZONTAL_ALIGNMENT_RIGHT/HORIZONTAL_ALIGNMENT_FILL)error
justification_flagsbit mask of JUSTIFICATION_KASHIDA (1) | JUSTIFICATION_WORD_BOUND (2) | JUSTIFICATION_AFTER_LAST_TAB (8) | JUSTIFICATION_SKIP_LAST_LINE (32) | JUSTIFICATION_SKIP_LAST_LINE_WITH_VISIBLE_CHARS (64) | JUSTIFICATION_DO_NOT_SKIP_SINGLE_LINE (128)
languagequoted string, or the &"…" StringName or NodePath("…") it converts
meta_underlinedtrue or false
progress_bar_delayinteger
scroll_activetrue or false
scroll_followingtrue or false
scroll_following_visible_characterstrue or false
selection_enabledtrue or false
shortcut_keys_enabledtrue or false
structured_text_bidi_overrideenum 0-6 (STRUCTURED_TEXT_DEFAULT/STRUCTURED_TEXT_URI/STRUCTURED_TEXT_FILE/STRUCTURED_TEXT_EMAIL/STRUCTURED_TEXT_LIST/STRUCTURED_TEXT_GDSCRIPT/STRUCTURED_TEXT_CUSTOM)warning
structured_text_bidi_override_optionsArray literal ([...] or ArrayT)
tab_sizeinteger 0-24warning
tab_stopsPackedFloat32Array(x, y, …)
textquoted string, or the &"…" StringName or NodePath("…") it converts
text_directionenum 0-3 (TEXT_DIRECTION_AUTO/TEXT_DIRECTION_LTR/TEXT_DIRECTION_RTL/TEXT_DIRECTION_INHERITED)error below -1, warning below 0, error above 3
threadedtrue or false
vertical_alignmentenum 0-3 (VERTICAL_ALIGNMENT_TOP/VERTICAL_ALIGNMENT_CENTER/VERTICAL_ALIGNMENT_BOTTOM/VERTICAL_ALIGNMENT_FILL)error
visible_charactersinteger -1-128000warning
visible_characters_behaviorenum 0-4 (VC_CHARS_BEFORE_SHAPING/VC_CHARS_AFTER_SHAPING/VC_GLYPHS_AUTO/VC_GLYPHS_LTR/VC_GLYPHS_RTL)warning
visible_ratiofloat 0-1warning
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-canvasitem-clip-ancestry (type-family match)canvasitem-ancestor-clips-childrenwarning
canvasitem-ancestor-is-canvasgroupwarning
valid-control-properties (type-family match)control-tooltip-ignored-by-mouse-filterwarning
control-property-orderwarning

bbcode_enabled and fit_content have no strict counterpart. Both compare the raw string against true, so an absent property or any other value silently resolves to false.

Known limitations

  • Approximated Only a subset of BBCode tags is styled, and a tag outside it renders as plain text.
  • Approximated A [b] run shows a light box behind some letters, where the synthesised bold glyphs overlap.
  • Approximated Fill alignment is not justified, so a filled paragraph keeps a ragged right edge instead of stretching to the box.
  • Not drawn [p dir=] and the right-to-left arms of _draw_line (rich_text_label.cpp:987-1014), which Godot reaches only off the default text_direction.
  • Not drawn The right-to-left scrollbar offset (:988-996,2093-2100), the loading bar's right-to-left fill (:2580-2588) and the reveal end of VC_GLYPHS_AUTO (:944-945), since none of their inputs is drawn.
  • Not drawn The clip to _get_text_rect() (rich_text_label.cpp:158,2594), so a line wider than its own box hangs past the control's edge, where Godot cuts it.

RigidBody2D

renders as a transform-only group docs ↗ source ↗ unit-rigidbody2d.tscn ↗ Linter only
No visual output — this node draws nothing to compare.

A 2D body the physics engine moves. Neither Godot nor the previewer draws it, and the previewer mounts it as a transform-only Node2D group (ADR-0008). A .tscn is a starting state, and nothing here steps it forward.

Linting

Strict parsing format-checks these RigidBody2D properties, plus 5 inherited from CollisionObject2D, 12 inherited from Node2D, 16 inherited from CanvasItem, 10 inherited from Node. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

PropertyAcceptsOut of range
angular_dampfloat >= -1error below
angular_damp_modeenum 0-1 (COMBINE/REPLACE)warning
angular_velocityfloat
can_sleeptrue or false
center_of_massVector2(x, y), or the Vector2i spelling Godot converts
center_of_mass_modeenum 0-1 (AUTO/CUSTOM)warning
constant_forceVector2(x, y), or the Vector2i spelling Godot converts
constant_torquefloat
contact_monitortrue or false
continuous_cdenum 0-2 (DISABLED/CAST_RAY/CAST_SHAPE)warning
custom_integratortrue or false
freezetrue or false
freeze_modeenum 0-1 (STATIC/KINEMATIC)warning
gravity_scalefloat
inertiafloat >= 0error below
linear_dampfloat >= -1error below
linear_damp_modeenum 0-1 (COMBINE/REPLACE)warning
linear_velocityVector2(x, y), or the Vector2i spelling Godot converts
lock_rotationtrue or false
massfloat >= 0.001error at or below 0, warning below 0.001
max_contacts_reportedinteger >= 0, < 4096error below 0, error at or above 4096
physics_material_overridenull, SubResource("id"), ExtResource("id") or Resource("path")
sleepingtrue or false
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-canvasitem-clip-ancestry (type-family match)canvasitem-ancestor-clips-childrenwarning
canvasitem-ancestor-is-canvasgroupwarning
valid-rigidbody2d (type-family match)rigidbody2d-max-contacts-without-monitorinfo
rigidbody2d-scale-overridden-at-runtimewarning
valid-collisionobject2d (type-family match)collisionobject2d-needs-collision-shapewarning

A non-positive mass is reported, because Godot's own setter refuses it. gravity_scale carries no range at all, since a negative value is a legitimate way to make a body fall upward. The lenient parser reads neither key.

RigidBody3D

renders as an invisible transform-only group docs ↗ source ↗ unit-rigidbody3d.tscn ↗ Linter only
Godot render of RigidBody3D Our render of RigidBody3D
Godot 4.6.3 Ours

A gravity-driven physics body. The previewer mounts it as a transform-only Node3D group (ADR-0008) and runs no simulation. The reddish crate on screen is its child MeshInstance3D, and the collision shape is a toggle-gated overlay.

Linting

Strict parsing format-checks these RigidBody3D properties, plus 6 inherited from PhysicsBody3D, 6 inherited from CollisionObject3D, 17 inherited from Node3D, 10 inherited from Node. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

PropertyAcceptsOut of range
angular_dampfloat >= 0error below
angular_damp_modeenum 0-1 (COMBINE/REPLACE)warning
angular_velocityVector3(x, y, z), or the Vector3i spelling Godot converts
can_sleeptrue or false
center_of_massVector3(x, y, z), or the Vector3i spelling Godot converts
center_of_mass_modeenum 0-1 (AUTO/CUSTOM)warning
constant_forceVector3(x, y, z), or the Vector3i spelling Godot converts
constant_torqueVector3(x, y, z), or the Vector3i spelling Godot converts
contact_monitortrue or false
continuous_cdtrue or false
custom_integratortrue or false
freezetrue or false
freeze_modeenum 0-1 (STATIC/KINEMATIC)warning
gravity_scalefloat
inertiaVector3(x, y, z), each float >= 0error below
linear_dampfloat >= 0error below
linear_damp_modeenum 0-1 (COMBINE/REPLACE)warning
linear_velocityVector3(x, y, z), or the Vector3i spelling Godot converts
lock_rotationtrue or false
massfloat >= 0.001error at or below 0, warning below 0.001
max_contacts_reportedinteger >= 0, < 4096error below 0, error at or above 4096
physics_material_overridenull, SubResource("id"), ExtResource("id") or Resource("path")
sleepingtrue or false
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-node3d-visibility (type-family match)valid-node3d-visibilityerror
valid-collisionobject3d-scale (type-family match)collisionobject3d-non-uniform-scalewarning
valid-rigidbody3d (type-family match)rigidbody3d-max-contacts-without-monitorinfo
rigidbody3d-scale-overridden-at-runtimewarning
valid-collisionobject3d (type-family match)collisionobject3d-needs-collision-shapewarning

RigidBody3D reuses parseNode3D directly, so mass, inertia, the centre-of-mass and damp settings and freeze_mode are never read by the lenient parser. The node renders as a transform-only group, so nothing needs substituting.

RootMotionView

renders as nothing (a transform-only group) docs ↗ source ↗ unit-root-motion-view.tscn ↗ Linter only
No visual output — this node draws nothing to compare.

An editor-only helper that draws a fading grid under an AnimationMixer to visualise root motion. Godot hides it in the running project, so the previewer renders it as a transform-only group (ADR-0008) and its children still show.

Linting

Strict parsing format-checks these RootMotionView properties, plus 1 inherited from VisualInstance3D, 17 inherited from Node3D, 10 inherited from Node. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

PropertyAcceptsOut of range
animation_pathNodePath("path/to/node")
cell_sizefloat >= 0.1warning below
colorColor(r, g, b, a), or the colour string or int it converts
radiusfloat >= 0.1warning below
zero_ytrue or false
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-node3d-visibility (type-family match)valid-node3d-visibilityerror

index.ts registers parseNode3D, which reads only transform and visible. A malformed cell_size = "banana" or an unquoted animation_path parses with no error and no substitution, and only strict reports it.

Known limitations

  • Editor only The root-motion grid appears only in Godot's editor, but here it is absent.

ScriptCreateDialog

renders as nothing yet, not implemented docs ↗ source ↗ unit-script-create-dialog.tscn ↗ Not implemented
Comparison images not captured yet for ScriptCreateDialog.

Godot's editor-only "Attach Node Script" popup, built on ConfirmationDialog. No shipped game scene carries it. The previewer parses and validates it but does not draw it. The base Node mounts under renderIntent: 'pending' as an empty group, and its children still show (ADR-0045).

Linting

Strict parsing format-checks the inherited set (1 inherited from ConfirmationDialog, 5 inherited from AcceptDialog, 45 inherited from Window, 47 inherited from Viewport, 10 inherited from Node); ScriptCreateDialog declares none of its own. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-window-properties (type-family match)window-max-size-below-min-sizeinfo
window-size-clamped-by-limitswarning
window-content-scale-factor-flooredwarning

ScriptCreateDialog declares no property of its own, so the lenient Node reader and the strict linter agree by construction. A bad inherited AcceptDialog or Window value is never read or substituted on the lenient path.

Known limitations

  • Not drawn Godot displays the dialog inside the editor, but the previewer draws nothing for it.

ScrollContainer

renders as a clipped content rect with themed scrollbars docs ↗ source ↗ unit-scroll-container.tscn ↗ Done
Godot render of ScrollContainer Our render of ScrollContainer
Godot 4.6.3 Ours

ScrollContainer clips its single child to its own rect and draws the theme's scrollbar on whichever axis overflows. scroll_hint_mode adds the theme's edge fade over the side the content continues past. draw_focus_border insets the content and both scrollbars by the focus style's margins. A right-to-left layout_direction moves the vertical scrollbar to the left edge and shifts the content past the strip it reserves.

Linting

Strict parsing format-checks these ScrollContainer properties, plus 53 inherited from Control, 16 inherited from CanvasItem, 10 inherited from Node. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

PropertyAcceptsOut of range
draw_focus_bordertrue or false
follow_focustrue or false
horizontal_scroll_modeenum 0-4 (DISABLED/AUTO/SHOW_ALWAYS/SHOW_NEVER/RESERVE)warning
scroll_deadzoneinteger
scroll_hint_modeenum 0-3 (DISABLED/ALL/TOP_AND_LEFT/BOTTOM_AND_RIGHT)warning
scroll_horizontalinteger >= 0error below
scroll_horizontal_custom_stepfloat -1-4096warning
scroll_verticalinteger >= 0error below
scroll_vertical_custom_stepfloat -1-4096warning
tile_scroll_hinttrue or false
vertical_scroll_modeenum 0-4 (DISABLED/AUTO/SHOW_ALWAYS/SHOW_NEVER/RESERVE)warning
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-canvasitem-clip-ancestry (type-family match)canvasitem-ancestor-clips-childrenwarning
canvasitem-ancestor-is-canvasgroupwarning
valid-control-properties (type-family match)control-tooltip-ignored-by-mouse-filterwarning
control-property-orderwarning
valid-scrollcontainer-single-childscrollcontainer-not-single-childwarning

horizontal_scroll_mode and vertical_scroll_mode go through the optional-int reader, which accepts any integer. An out-of-range value such as 99 falls through the component's switch to auto overflow, the same as an absent value.

Known limitations

  • Editor only The draw_focus_border border draws only while the container or a child holds keyboard focus, which a still frame never has, though its margins apply.

ShaderGlobalsOverride

renders as nothing yet, Godot re-shades every material that reads the overridden globals, the previewer does not docs ↗ source ↗ unit-shader-globals-override.tscn ↗ Not implemented
No visual output — this node draws nothing to compare.

Overrides the project's global shader parameters while it stays in the tree. Godot applies the override to every material that reads those globals, and the previewer does not yet (ADR-0045). Its children still show, and no material sees the override.

Linting

Strict parsing format-checks these ShaderGlobalsOverride properties, plus 10 inherited from Node. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

PropertyAcceptsOut of range
params/*any Variant — the type lives in project.godot, not the .tscn
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-shaderglobalsoverride-propertiesshaderglobalsoverride-multiple-in-scenewarning

index.ts registers the plain parseNode reader, which never looks at a params/* key. Every value is carried as inert text, since nothing here propagates global shader parameters into a THREE material.

Known limitations

  • Needs runtime Godot changes every material that reads a global a params/* key names, but here no material sees the override.

ShapeCast2D

renders as nothing (a transform-only group) docs ↗ source ↗ unit-shape-cast-2d.tscn ↗ Linter only
No visual output — this node draws nothing to compare.

Sweeps a Shape2D from its origin to target_position to detect collisions. Godot draws the swept shape only as a debug gizmo, so the previewer renders it as a transform-only group (ADR-0008).

Linting

Strict parsing format-checks these ShapeCast2D properties, plus 12 inherited from Node2D, 16 inherited from CanvasItem, 10 inherited from Node. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

PropertyAcceptsOut of range
collide_with_areastrue or false
collide_with_bodiestrue or false
collision_mask32-bit layer mask (layers 1-32)
enabledtrue or false
exclude_parenttrue or false
marginfloat 0-100warning
max_resultsinteger
shapenull, SubResource("id"), ExtResource("id") or Resource("path")
target_positionVector2(x, y), or the Vector2i spelling Godot converts
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-canvasitem-clip-ancestry (type-family match)canvasitem-ancestor-clips-childrenwarning
canvasitem-ancestor-is-canvasgroupwarning
valid-shapecast2dshapecast2d-no-collide-targetinfo
shapecast2d-zero-maskinfo
shapecast2d-missing-shapewarning

The lenient parser reuses parseNode2D, which reads only Node2D's own keys, so a malformed margin is ignored rather than substituted. The raw text survives on node.rawProperties, but nothing reads it back.

ShapeCast3D

renders as nothing (a transform-only group) docs ↗ source ↗ unit-shape-cast-3d.tscn ↗ Linter only
No visual output — this node draws nothing to compare.

Sweeps a Shape3D from its origin to target_position to detect collisions. Godot draws the swept shape only as a debug gizmo, so the previewer renders it as a transform-only group (ADR-0008).

Linting

Strict parsing format-checks these ShapeCast3D properties, plus 17 inherited from Node3D, 10 inherited from Node. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

PropertyAcceptsOut of range
collide_with_areastrue or false
collide_with_bodiestrue or false
collision_mask32-bit layer mask (layers 1-32)
debug_shape_custom_colorColor(r, g, b, a), or the colour string or int it converts
enabledtrue or false
exclude_parenttrue or false
marginfloat 0-100warning
max_resultsinteger
shapenull, SubResource("id"), ExtResource("id") or Resource("path")
target_positionVector3(x, y, z), or the Vector3i spelling Godot converts
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-node3d-visibility (type-family match)valid-node3d-visibilityerror
valid-shapecast3dshapecast3d-no-collide-targetinfo
shapecast3d-zero-maskinfo
shapecast3d-missing-shapewarning
shapecast3d-concave-shapewarning

The lenient parser reuses parseNode3D, which reads only Node3D's own keys, so a malformed margin is ignored rather than substituted. The raw text survives on node.rawProperties, but nothing reads it back.

Skeleton2D

renders as nothing yet, Godot runs its modification stack on the bones each frame, the previewer does not docs ↗ source ↗ unit-skeleton-2d.tscn ↗ Not implemented
No visual output — this node draws nothing to compare.

Skeleton2D is the root of a Bone2D chain. Godot runs its modification_stack on the bones each frame, and the previewer does not yet (ADR-0045). The bones hold their authored transforms, and everything visible belongs to its children.

Linting

Strict parsing format-checks these Skeleton2D properties, plus 12 inherited from Node2D, 16 inherited from CanvasItem, 10 inherited from Node. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

PropertyAcceptsOut of range
modification_stacknull, SubResource("id"), ExtResource("id") or Resource("path")
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-canvasitem-clip-ancestry (type-family match)canvasitem-ancestor-clips-childrenwarning
canvasitem-ancestor-is-canvasgroupwarning

Strict checks modification_stack for reference format only. The lenient parser reuses parseNode2D and never reads it, so a malformed value flows through untouched.

Known limitations

  • Needs runtime The modification_stack is never solved, so bones stay at their authored transforms where Godot's IK would move them each frame.

Skeleton3D

renders as nothing yet, Godot poses its bones and deforms bound meshes, the previewer does not docs ↗ source ↗ unit-skeleton3d.tscn ↗ Not implemented
No visual output — this node draws nothing to compare.

Holds the bone hierarchy that deforms attached meshes. Godot poses its bones and runs its modifiers each frame, deforming any mesh bound to it. The previewer does not yet (ADR-0045), so the bones hold the rest pose.

Linting

Strict parsing format-checks these Skeleton3D properties, plus 17 inherited from Node3D, 10 inherited from Node. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

PropertyAcceptsOut of range
animate_physical_bonestrue or false
bones/*leaf name (non-empty, no colon or slash), parent (int from -1, never the bone itself), rest (Transform3D), enabled (bool), position and scale (Vector3), rotation (Quaternion), bone_meta, or the 3.x pose and bound_children
modifier_callback_mode_processenum 0-2 (PHYSICS/IDLE/MANUAL)warning
motion_scalefloat >= 0.001error at or below 0, warning below 0.001
show_rest_onlytrue or false
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-node3d-visibility (type-family match)valid-node3d-visibilityerror
valid-skeleton3d-usageskeleton3d-debug-modeinfo
skeleton3d-deprecated-featurewarning
skeleton3d-deprecated-bone-posewarning
skeleton3d-bone-name-ordererror
skeleton3d-duplicate-bone-nameerror

Skeleton3D registers parseNode3D directly, so motion_scale, show_rest_only, animate_physical_bones, modifier_callback_mode_process and every bones/* key are never read by the lenient parser. Nothing warns and nothing substitutes a default.

Known limitations

  • Needs runtime Godot poses its bones each frame and deforms any mesh bound to it, but here the bones hold the rest pose.
  • Editor only The bone gizmo appears only in Godot's editor, but here it is absent.

SkeletonIK3D

renders as nothing yet, Godot solves its deprecated chain onto the target, the previewer does not docs ↗ source ↗ unit-skeleton-ik-3d.tscn ↗ Not implemented
No visual output — this node draws nothing to compare.

A deprecated FABRIK chain solver that stock 4.x builds still save and reload. It walks the bones from root_bone to tip_bone and drags the tip onto a target over up to max_iterations passes. Godot runs the solver each frame, and the previewer does not yet (ADR-0045). The bones hold their rest pose.

Linting

Strict parsing format-checks these SkeletonIK3D properties, plus 2 inherited from SkeletonModifier3D, 17 inherited from Node3D, 10 inherited from Node. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

PropertyAcceptsOut of range
magnetVector3(x, y, z), or the Vector3i spelling Godot converts
max_iterationsinteger
min_distancefloat
override_tip_basistrue or false
root_bonequoted string or &"name"
targetTransform3D(12 floats)
target_nodeNodePath("path/to/node")
tip_bonequoted string or &"name"
use_magnettrue or false
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-node3d-visibility (type-family match)valid-node3d-visibilityerror
valid-skeletonmodifier3d-parent (type-family match)skeletonmodifier3d-parent-not-skeleton3dwarning

The lenient parser reuses parseNode3D, so every key above is dropped rather than substituted, with no fallback to name. Strict checks only their format, since every setter in skeleton_ik_3d.cpp is a bare assignment. A negative max_iterations or a bone name that matches no bone passes.

SkeletonModifier3D

renders as nothing yet, Godot runs its bone-pose pass each frame, the previewer does not docs ↗ source ↗ unit-skeleton-modifier-3d.tscn ↗ Not implemented
No visual output — this node draws nothing to compare.

The base class custom skeleton modifiers derive from, feeding a parent Skeleton3D's bone poses each frame. Godot runs that pass, and the previewer does not yet (ADR-0045): the bones hold their rest pose.

Linting

Strict parsing format-checks these SkeletonModifier3D properties, plus 17 inherited from Node3D, 10 inherited from Node. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

PropertyAcceptsOut of range
activetrue or false
influencefloat 0-1warning
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-node3d-visibility (type-family match)valid-node3d-visibilityerror
valid-skeletonmodifier3d-parent (type-family match)skeletonmodifier3d-parent-not-skeleton3dwarning

SkeletonModifier3D registers parseNode3D directly, so active and influence are never read. An influence = 5.0 or an active = "maybe" is dropped silently, and only strict reports it.

Sky

renders as Godot's radiance layers as an octmap array + a THREE PMREM environment + background docs ↗ source ↗ Done

A Sky resource's sky_material is the source of the background and of the image-based ambient and reflection. Each of Godot's three material types renders here as a background and two light sources. Godot's radiance layers, baked as Godot bakes them into an octmap array with a mip chain per layer, give every reflection and the ambient light. Each read picks its mip from the screen derivatives of its direction, as Godot does. A small, strongly curved mirror reads a coarser mip than a large one. The radiance renders at the sky's radiance_size, so a small size blurs a mirror as in Godot. A size above 256 renders at 256, as Godot draws rough metal at 512 and at 256 alike.

ProceduralSkyMaterial

Done
Godot render of ProceduralSkyMaterial Our render of ProceduralSkyMaterial
Godot 4.6.3 Ours

A gradient sky from top, horizon and ground colours. The warm-top, green-horizon gradient and the sphere and floor it lights match Godot. Godot multiplies each sRGB colour by its energy multiplier before the linear conversion, and so does the previewer. The sky carries Godot's debanding noise, and use_debanding = false turns it off.

PanoramaSkyMaterial

Done
Godot render of PanoramaSkyMaterial Our render of PanoramaSkyMaterial
Godot 4.6.3 Ours

An equirectangular image wrapped onto the sky. The coloured calibration bands and the black grid confirm the U/V orientation matches Godot.

PhysicalSkyMaterial

Done
Godot render of PhysicalSkyMaterial Our render of PhysicalSkyMaterial
Godot 4.6.3 Ours

An atmospheric-scattering sky. The grey-blue gradient, the horizon band, and the sphere and ground it lights match Godot's. It carries the same debanding noise as the procedural sky.

Sun disc size

Done
Godot render of Sun disc size Our render of Sun disc size
Godot 4.6.3 Ours

A DirectionalLight3D's light_angular_distance sets the size of its sun disc in the sky, as Godot passes it to the sky shader in radians. This 3 degree sun draws a solid disc with a glow around it, as in Godot. A light with no angular distance draws a point sun.

Radiance size 32

Done
Godot render of Radiance size 32 Our render of Radiance size 32
Godot 4.6.3 Ours

A sky with radiance_size = 0 bakes from a radiance 32 texels wide, the smallest Godot allows. The mirror sphere reflects a coarse sky, and the rough sphere reads layers filtered from a 32-wide octmap and its short downsample chain. Both spheres and the ground they light match Godot's.

Real-Time process mode

Done
Godot render of Real-Time process mode Our render of Real-Time process mode
Godot 4.6.3 Ours

A sky with process_mode = 3 bakes its layers with Godot's fast filter, at a radiance size of 256 whatever radiance_size says. Its ambient reads layer 6, its roughest. The metallic sphere's reflection, the default sphere and the ground it lights match Godot's.

Linting

Strict parsing format-checks these Sky properties, plus 2 inherited from Resource. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

PropertyAcceptsOut of range
process_modeenum 0-3 (PROCESS_MODE_AUTOMATIC/PROCESS_MODE_QUALITY/PROCESS_MODE_INCREMENTAL/PROCESS_MODE_REALTIME)warning
radiance_sizeenum 0-6 (RADIANCE_SIZE_32/RADIANCE_SIZE_64/RADIANCE_SIZE_128/RADIANCE_SIZE_256/RADIANCE_SIZE_512/RADIANCE_SIZE_1024/RADIANCE_SIZE_2048)error
sky_materialnull, SubResource("id"), ExtResource("id") or Resource("path")
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-skyreal-time-sky-radiance-sizewarning

The lenient parser never rejects. An unreadable Sky property falls back to Godot's default through the shared value decoders. An unresolvable material or panorama leaves the background at its fallback rather than failing the scene.

Known limitations

  • Resource gap A ShaderMaterial sky or a CompressedCubemap panorama is not resolved, so the background falls back to a mid-blue solid and metals reflect near-black.

SliderJoint3D

renders as nothing (a transform-only group) docs ↗ source ↗ unit-slider-joint-3d.tscn ↗ Linter only
No visual output — this node draws nothing to compare.

A joint that restricts a body's movement to one axis relative to another body. It draws nothing at runtime, so the previewer renders it as a transform-only group (ADR-0008). Godot shows the slider only as an editor gizmo.

Linting

Strict parsing format-checks these SliderJoint3D properties, plus 4 inherited from Joint3D, 17 inherited from Node3D, 10 inherited from Node. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

PropertyAcceptsOut of range
angular_limit/dampingfloat 0-16warning
angular_limit/lower_angleradians, -180° to 180°warning
angular_limit/restitutionfloat 0.01-16warning
angular_limit/softnessfloat 0.01-16warning
angular_limit/upper_angleradians, -180° to 180°warning
angular_motion/dampingfloat 0-16warning
angular_motion/restitutionfloat 0.01-16warning
angular_motion/softnessfloat 0.01-16warning
angular_ortho/dampingfloat 0-16warning
angular_ortho/restitutionfloat 0.01-16warning
angular_ortho/softnessfloat 0.01-16warning
linear_limit/dampingfloat 0-16warning
linear_limit/lower_distancefloat -1024-1024warning
linear_limit/restitutionfloat 0.01-16warning
linear_limit/softnessfloat 0.01-16warning
linear_limit/upper_distancefloat -1024-1024warning
linear_motion/dampingfloat 0-16warning
linear_motion/restitutionfloat 0.01-16warning
linear_motion/softnessfloat 0.01-16warning
linear_ortho/dampingfloat 0-16warning
linear_ortho/restitutionfloat 0.01-16warning
linear_ortho/softnessfloat 0.01-16warning
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-node3d-visibility (type-family match)valid-node3d-visibilityerror
valid-joint (type-family match)joint-not-connectedwarning
joint-same-bodywarning

index.ts registers parseNode3D directly, which reads only transform and visible. An out-of-range linear_limit/upper_distance or a malformed angular_limit/upper_angle is dropped from the lenient tree rather than substituted or warned on.

SoftBody3D

renders as nothing yet, Godot draws a deformable mesh, the previewer does not docs ↗ source ↗ unit-soft-body-3d.tscn ↗ Not implemented
Comparison images not captured yet for SoftBody3D.

A deformable physics mesh that Godot draws as a simulated version of its own mesh. The previewer parses and validates it but does not draw it yet, so the GeometryInstance3D base mounts under renderIntent: 'pending' and its children still show.

Linting

Strict parsing format-checks these SoftBody3D properties, plus 5 inherited from MeshInstance3D, 18 inherited from GeometryInstance3D, 1 inherited from VisualInstance3D, 17 inherited from Node3D, 10 inherited from Node. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

PropertyAcceptsOut of range
attachments/*attachment
collision_layer32-bit layer mask (layers 1-32)
collision_mask32-bit layer mask (layers 1-32)
damping_coefficientfloat >= 0warning below
disable_modeenum 0-1 (REMOVE/KEEP_ACTIVE)warning
drag_coefficientfloat 0-1warning
linear_stiffnessfloat 0-1warning
parent_collision_ignoreNodePath("path/to/node")
pinned_pointsint array ([…] or PackedInt32Array(…))
pressure_coefficientfloat
ray_pickabletrue or false
shrinking_factorfloat
simulation_precisioninteger 1-100warning
total_massfloat >= 0error below 0
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-node3d-visibility (type-family match)valid-node3d-visibilityerror
valid-softbody3d-mesh (type-family match)valid-softbody3d-meshwarning
valid-geometryinstance3d-visibility-range (type-family match)geometryinstance3d-visibility-range-end-before-beginwarning
geometryinstance3d-visibility-range-begin-fade-without-marginwarning
geometryinstance3d-visibility-range-end-fade-without-marginwarning

The lenient parser reuses MeshInstance3D's parse. The scene cull measures the node by its mesh's box at rest, so its visibility range still decides its visibility dependants. An out-of-range simulation_precision or a non-boolean ray_pickable parses without complaint and has no effect, since nothing simulates it.

Known limitations

  • Not drawn Godot draws the soft mesh, but the previewer draws nothing for it.
  • Needs runtime Godot culls the body by its simulated points once physics moves them, but here the cull reads the mesh at rest.

SpinBox

renders as a LineEdit-style field plus two arrow stepper icons docs ↗ source ↗ unit-spin-box.tscn ↗ Unreviewed
Comparison images not captured yet for SpinBox.

SpinBox is a numeric text input over a Range, with prefix, suffix and arrow-button stepping. The previewer draws the internal field's chrome and its formatted value (value snapped to step, wrapped in prefix/suffix), and the up/down arrow icons. An arrow is dimmed once the value sits at its bound without allow_greater/ allow_lesser, and both are dimmed once editable is false.

Linting

Strict parsing format-checks these SpinBox properties, plus 9 inherited from Range, 53 inherited from Control, 16 inherited from CanvasItem, 10 inherited from Node. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

PropertyAcceptsOut of range
alignmentenum 0-3 (HORIZONTAL_ALIGNMENT_LEFT/HORIZONTAL_ALIGNMENT_CENTER/HORIZONTAL_ALIGNMENT_RIGHT/HORIZONTAL_ALIGNMENT_FILL)error
custom_arrow_roundtrue or false
custom_arrow_stepfloat >= 0warning below
editabletrue or false
prefixquoted string, or the &"…" StringName or NodePath("…") it converts
select_all_on_focustrue or false
suffixquoted string, or the &"…" StringName or NodePath("…") it converts
update_on_text_changedtrue or false
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-canvasitem-clip-ancestry (type-family match)canvasitem-ancestor-clips-childrenwarning
canvasitem-ancestor-is-canvasgroupwarning
valid-control-properties (type-family match)control-tooltip-ignored-by-mouse-filterwarning
control-property-orderwarning
valid-range-bounds (type-family match)range-max-below-minerror
range-exp-edit-negative-minwarning

The lenient parser reads every property in the table above (plus the inherited Range keys value/min_value/max_value/step/page/exp_edit/rounded/allow_greater/ allow_lesser), so a malformed one is absent from the parsed node.

Known limitations

  • Not drawn Hover, pressed and drag draw states for either arrow button: a static preview reaches none of them.
  • Not drawn up_down_buttons_separator, whose rect takes the zero buttons_vertical_separation theme constant (default_theme.cpp:646) because no per-node override for it is modelled.
  • Approximated The internal field draws the default-theme LineEdit StyleBox even where a project Theme styles its "SpinBoxInnerLineEdit" type variation, which still sets its font.

SplineIK3D

renders as nothing yet, Godot lays its bone chain along the path, the previewer does not docs ↗ source ↗ unit-spline-ik-3d.tscn ↗ Not implemented
No visual output — this node draws nothing to compare.

Aligns a chain of bones along a Path3D, laying each joint down the curve and twisting it to the curve's point tilt. Godot runs the solver each frame, and the previewer does not yet (ADR-0045): the bones hold their rest pose.

Linting

Strict parsing format-checks these SplineIK3D properties, plus 1 inherited from ChainIK3D, 1 inherited from IKModifier3D, 2 inherited from SkeletonModifier3D, 17 inherited from Node3D, 10 inherited from Node. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

PropertyAcceptsOut of range
setting_countinteger >= 0error below
settings/#/*per-setting spline fitting, plus ChainIK3D's bone chain setup
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-node3d-visibility (type-family match)valid-node3d-visibilityerror
valid-skeletonmodifier3d-parent (type-family match)skeletonmodifier3d-parent-not-skeleton3dwarning
valid-splineik3d-path-3d (type-family match)splineik3d-setting-without-path-3dwarning

The lenient parser reuses parseNode3D, so setting_count and every settings/<i>/ key is dropped with no fallback. Strict rejects setting_count = -1 and warns on a setting with no path_3d, which Godot abandons at solve time while the node looks configured.

SplitContainer

renders as two children split at a computed offset, along the vertical-chosen axis docs ↗ source ↗ unit-split-container.tscn ↗ Unreviewed
Comparison images not captured yet for SplitContainer.

SplitContainer is the base that arranges its children along one axis with a draggable split between each pair. split_offsets moves each split from the rest position that the children's expand flags give it. HSplitContainer and VSplitContainer fix the axis. This type reads vertical to pick it. A right-to-left layout_direction mirrors a horizontal split, so the first child takes the right band. A vertical split stays stacked the same way.

Linting

Strict parsing format-checks these SplitContainer properties, plus 53 inherited from Control, 16 inherited from CanvasItem, 10 inherited from Node. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

PropertyAcceptsOut of range
collapsedtrue or false
drag_area_highlight_in_editortrue or false
drag_area_margin_begininteger
drag_area_margin_endinteger
drag_area_offsetinteger
dragger_visibilityenum 0-2 (DRAGGER_VISIBLE/DRAGGER_HIDDEN/DRAGGER_HIDDEN_COLLAPSED)warning
dragging_enabledtrue or false
split_offsetinteger
split_offsetsint array (PackedInt32Array(…), Arrayint or […])
touch_dragger_enabledtrue or false
verticaltrue or false
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-canvasitem-clip-ancestry (type-family match)canvasitem-ancestor-clips-childrenwarning
canvasitem-ancestor-is-canvasgroupwarning
valid-control-properties (type-family match)control-tooltip-ignored-by-mouse-filterwarning
control-property-orderwarning

Strict format-checks all eleven of SplitContainer's own members. dragger_visibility is the one enum, and it warns outside 0..2, since the setter assigns unconditionally. No setter clamps, so strict and lenient agree on every value Godot writes. The lenient parser reads split_offset, collapsed, dragger_visibility and vertical for their scalar type only. An unparseable split_offset or dragger_visibility leaves the property undefined, and Godot's default applies. An unparseable collapsed or vertical reads as false, because a bool slot stores what it can and is never unset. An out-of-range dragger_visibility behaves as VISIBLE. The lenient parser also reads the split_offsets array, and replays a split_offset scalar onto its first entry in file order. A malformed split_offsets is skipped, so the next key or the default [0] applies.

SpotLight3D

renders as a THREE.SpotLight docs ↗ source ↗ unit-spot-light-3d.tscn ↗ Done
Godot render of SpotLight3D Our render of SpotLight3D
Godot 4.6.3 Ours

Godot's cone-shaped light, emitting from a point along its local -Z axis and fading toward the cone's rim and its range. The previewer renders it as a THREE.SpotLight with energy scaled by PI to match Godot's brightness. A shader patch gives it Godot's distance falloff and Godot's fade from the axis to the cone's rim, at the power spot_angle_attenuation sets. Its highlight scales by twice light_specular, as Godot's does. light_size widens its lit side and its highlight by Godot's size term, so a large light near a surface reaches past the surface's horizon. In volumetric fog, it scatters light_volumetric_fog_energy times its light into the medium, under its shadow.

Linting

Strict parsing format-checks these SpotLight3D properties, plus 27 inherited from Light3D, 1 inherited from VisualInstance3D, 17 inherited from Node3D, 10 inherited from Node. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

PropertyAcceptsOut of range
spot_anglefloat 0-180warning
spot_angle_attenuationfloat
spot_attenuationfloat
spot_rangefloat >= 0warning below
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-node3d-visibility (type-family match)valid-node3d-visibilityerror
valid-spotlight3d-propertiesspotlight3d-shadow-angle-too-widewarning
spotlight3d-projector-without-shadowwarning
valid-light3d-scale (type-family match)light3d-non-unit-scalewarning

The linter warns (resource-type-excluded-by-hint) when light_projector holds a class its hint excludes, such as an AtlasTexture. Godot's editor never offers such a class, and the setter keeps it with a debug warning (light_3d.cpp:204-213).

The lenient parser falls back silently when a key is absent. When a key is unparseable, it warns and falls back: spot_range to 5.0, spot_angle to 45.0, spot_attenuation to 1.0, spot_angle_attenuation to 1.0.

Godot's positional shadow atlas gives the light one slot for the camera, and the shadow takes it. A light that covers less of the view gets a smaller slot and a coarser, softer shadow. When other lights fill the larger slots, a light earlier in the scene tree takes a smaller slot, as in Godot. A sub-viewport gives its lights slots in its own atlas. Every omni and spot shadow lies in one atlas texture, so many shadowed lights fit beside a material with many textures. The soft edge takes the four taps of Godot's default Soft Low filter, with the same dither as Godot. The filter spans shadow_blur times two texels of the atlas. With a light_size and a shadow_blur, the shadow searches for blockers, as Godot's does. Its penumbra widens with the light's size and with the distance from the caster. shadow_bias and shadow_normal_bias move the receiver as Godot's lookup does, so the shadow edge sits where Godot puts it.

light_negative makes the light subtract with a negative three intensity, as in Godot. shadow_opacity mixes the shadow towards unshadowed through three's shadow.intensity. With distance_fade_enabled, the light and its shadow fade by Godot's smoothstep over the distance from the rendering camera. Each drops out past its fade end.

Known limitations

  • Editor only The wireframe cone gizmo appears only in Godot's editor, but here it is selection-gated.

SpringArm3D

renders as nothing yet, Godot places its children along the arm each physics frame, the previewer does not docs ↗ source ↗ unit-spring-arm-3d.tscn ↗ Not implemented
No visual output — this node draws nothing to compare.

Casts along its local Z axis each physics frame and moves its children to the hit point minus a margin. Godot runs that placement each physics frame, and the previewer does not yet (ADR-0045): the children hold their authored transforms.

Linting

Strict parsing format-checks these SpringArm3D properties, plus 17 inherited from Node3D, 10 inherited from Node. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

PropertyAcceptsOut of range
collision_mask32-bit layer mask (layers 1-32)
marginfloat
shapenull, SubResource("id"), ExtResource("id") or Resource("path")
spring_lengthfloat
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-node3d-visibility (type-family match)valid-node3d-visibilityerror

SpringArm3D registers parseNode3D directly, so collision_mask, shape, spring_length and margin are never read. An out-of-range collision_mask or a non-numeric spring_length is dropped rather than substituted or warned on.

Known limitations

  • Needs runtime Godot moves each child to spring_length along the arm or to the hit point minus margin, but here the children hold their authored transforms.

SpringBoneCollision3D

renders as nothing yet, Godot's spring solver collides bones with it, the previewer does not docs ↗ source ↗ unit-spring-bone-collision-3d.tscn ↗ Not implemented
No visual output — this node draws nothing to compare.

A collider a SpringBoneSimulator3D consults while resolving its spring bones each frame. The previewer runs no spring solver (ADR-0045), so the collider guards nothing, and the node mounts as its base with its children still showing.

Linting

Strict parsing format-checks these SpringBoneCollision3D properties, plus 17 inherited from Node3D, 10 inherited from Node. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

PropertyAcceptsOut of range
boneinteger
bone_namequoted string or &"name"
position_offsetVector3(x, y, z), or the Vector3i spelling Godot converts
rotation_offsetQuaternion(x, y, z, w)
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-node3d-visibility (type-family match)valid-node3d-visibilityerror
valid-springbonecollision3d-parent (type-family match)springbonecollision3d-outside-springbonesimulator3dwarning

SpringBoneCollision3D registers parseNode3D directly, so bone_name, bone, position_offset and rotation_offset are never read. An unquoted bone_name = Head or a non-numeric bone = abc is dropped silently, and only strict reports it.

Known limitations

  • Needs runtime Godot's SpringBoneSimulator3D resolves its bones against this collider each frame, but here the bones hold their rest pose.
  • Editor only The collider gizmo appears only in Godot's editor, but here it is absent.

SpringBoneCollisionCapsule3D

renders as nothing yet, Godot's spring solver collides bones with it, the previewer does not docs ↗ source ↗ unit-spring-bone-collision-capsule-3d.tscn ↗ Not implemented
No visual output — this node draws nothing to compare.

The capsule-shaped collider a SpringBoneSimulator3D consults while resolving its spring bones. The previewer runs no spring solver (ADR-0045), so the capsule guards nothing, and the node mounts as its base with its children still showing.

Linting

Strict parsing format-checks these SpringBoneCollisionCapsule3D properties, plus 4 inherited from SpringBoneCollision3D, 17 inherited from Node3D, 10 inherited from Node. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

PropertyAcceptsOut of range
heightfloat >= 0warning below
insidetrue or false
radiusfloat >= 0warning below
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-node3d-visibility (type-family match)valid-node3d-visibilityerror
valid-springbonecollision3d-parent (type-family match)springbonecollision3d-outside-springbonesimulator3dwarning
valid-springbonecollisioncapsule3d-shapespringbonecollisioncapsule3d-radius-exceeds-half-heighterror

SpringBoneCollisionCapsule3D registers parseNode3D directly, so radius, height and inside are never read and a malformed one is dropped silently. Strict warns when radius exceeds half of height. Godot's setters then rewrite the other property to restore that invariant, so the loaded capsule differs from the one on disk.

Known limitations

  • Needs runtime Godot's SpringBoneSimulator3D resolves its bones against this capsule each frame, but here the bones hold their rest pose.
  • Editor only The capsule gizmo appears only in Godot's editor, but here it is absent.

SpringBoneCollisionPlane3D

renders as nothing yet, Godot's spring solver pushes bones off its plane, the previewer does not docs ↗ source ↗ unit-spring-bone-collision-plane-3d.tscn ↗ Not implemented
No visual output — this node draws nothing to compare.

An infinite plane that pushes a SpringBoneSimulator3D's bones back along its normal, +Y after the node's rotation. The previewer runs no spring solver (ADR-0045), so the plane pushes nothing, and the node mounts as its base.

Linting

Strict parsing format-checks the inherited set (4 inherited from SpringBoneCollision3D, 17 inherited from Node3D, 10 inherited from Node); SpringBoneCollisionPlane3D declares none of its own. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-node3d-visibility (type-family match)valid-node3d-visibilityerror
valid-springbonecollision3d-parent (type-family match)springbonecollision3d-outside-springbonesimulator3dwarning

SpringBoneCollisionPlane3D binds no property of its own and registers parseNode3D directly. The lenient side never reads the inherited bone_name, bone, position_offset and rotation_offset. A malformed one is dropped silently, while strict reports it through SpringBoneCollision3D's validators.

Known limitations

  • Needs runtime Godot's SpringBoneSimulator3D pushes its bones off this plane each frame, but here the bones hold their rest pose.
  • Editor only The plane gizmo appears only in Godot's editor, but here it is absent.

SpringBoneCollisionSphere3D

renders as nothing yet, Godot's spring solver collides bones with it, the previewer does not docs ↗ source ↗ unit-spring-bone-collision-sphere-3d.tscn ↗ Not implemented
No visual output — this node draws nothing to compare.

The sphere collider a SpringBoneSimulator3D consults while resolving its spring bones. The previewer runs no spring solver (ADR-0045), so the sphere guards nothing, and the node mounts as its base with its children still showing.

Linting

Strict parsing format-checks these SpringBoneCollisionSphere3D properties, plus 4 inherited from SpringBoneCollision3D, 17 inherited from Node3D, 10 inherited from Node. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

PropertyAcceptsOut of range
insidetrue or false
radiusfloat >= 0warning below
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-node3d-visibility (type-family match)valid-node3d-visibilityerror
valid-springbonecollision3d-parent (type-family match)springbonecollision3d-outside-springbonesimulator3dwarning

SpringBoneCollisionSphere3D registers parseNode3D directly, so neither radius nor inside is ever read. A radius = wide or inside = 1 is dropped silently rather than substituted, and only strict reports it.

Known limitations

  • Needs runtime Godot's SpringBoneSimulator3D resolves its bones against this sphere each frame, but here the bones hold their rest pose.
  • Editor only The sphere gizmo appears only in Godot's editor, but here it is absent.

SpringBoneSimulator3D

renders as nothing yet, Godot wobbles its bone chains each frame, the previewer does not docs ↗ source ↗ unit-spring-bone-simulator-3d.tscn ↗ Not implemented
No visual output — this node draws nothing to compare.

A SkeletonModifier3D that gives bone chains inertial wobble for hair, cloth and tails. Godot settles the springs each frame, and the previewer runs no solver (ADR-0045): the bones hold their rest pose.

Linting

Strict parsing format-checks these SpringBoneSimulator3D properties, plus 2 inherited from SkeletonModifier3D, 17 inherited from Node3D, 10 inherited from Node. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

PropertyAcceptsOut of range
external_forceVector3(x, y, z), or the Vector3i spelling Godot converts
mutable_bone_axestrue or false
setting_countinteger >= 0error below
settings/*SpringBoneSimulator3D settings/<i>/ bone chain setup
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-node3d-visibility (type-family match)valid-node3d-visibilityerror
valid-skeletonmodifier3d-parent (type-family match)skeletonmodifier3d-parent-not-skeleton3dwarning
valid-springbonesimulator3d-settings (type-family match)springbonesimulator3d-setting-index-out-of-rangeerror
springbonesimulator3d-shared-config-ignorederror
springbonesimulator3d-joint-config-ignorederror
springbonesimulator3d-collision-list-ignorederror

The lenient parser reuses parseNode3D and keeps only the transform, so every settings/<i>/ key stays as a raw string in the property bag. Where strict rejects settings/0/gravity/direction = Vector3(0, 0, 0) or an index past setting_count, the lenient side falls back to nothing and draws the same empty group.

Sprite2D

renders as an unlit textured quad docs ↗ source ↗ unit-sprite2d.tscn ↗ Done
Godot render of Sprite2D Our render of Sprite2D
Godot 4.6.3 Ours

Sprite2D draws a texture as a flat quad on the canvas. The previewer renders it as an unlit plane at the texture's pixel size, tinted by modulate.

Linting

Strict parsing format-checks these Sprite2D properties, plus 12 inherited from Node2D, 16 inherited from CanvasItem, 10 inherited from Node. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

PropertyAcceptsOut of range
centeredtrue or false
flip_htrue or false
flip_vtrue or false
frameinteger >= 0error below
frame_coordsVector2i(x, y), both >= 0, or the Vector2 spelling Godot convertserror below
hframesinteger 1-16384error below, warning above
offsetVector2(x, y), or the Vector2i spelling Godot converts
region_enabledtrue or false
region_filter_clip_enabledtrue or false
region_rectRect2(x, y, w, h), or the Rect2i spelling Godot converts
texturenull, SubResource("id"), ExtResource("id") or Resource("path")
vframesinteger 1-16384error below, warning above
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-canvasitem-clip-ancestry (type-family match)canvasitem-ancestor-clips-childrenwarning
canvasitem-ancestor-is-canvasgroupwarning
valid-sprite2d-resourcessprite2d-requires-textureinfo
sprite2d-frame-rangeerror
sprite2d-frame-coords-rangeerror
sprite2d-frame-remappedwarning
sprite2d-region-configurationinfo

hframes, vframes, frame and frame_coords are replayed in file order as Godot's setters apply them. A refused frame stays 0, and a later hframes re-maps one that landed. centered falls back to true, flip_h, flip_v and region_enabled to false and offset to (0, 0). A region_rect that fails its grammar is left unset, and texture is stored with no reference check.

Sprite3D

renders as a textured THREE.Mesh quad docs ↗ source ↗ unit-sprite3d.tscn ↗ Limitation
Godot render of Sprite3D Our render of Sprite3D
Godot 4.6.3 Ours

Draws a 2D texture on a quad in 3D space. The previewer renders it as a textured plane sized by pixel_size times the texture, unlit by default and lit when shaded is on. modulate drives colour and opacity, and billboard takes the camera's axes each frame, as Godot's shader does.

The quad lies on the plane its axis faces, the XY plane by default. A centred quad centres on the node. An uncentred one puts its bottom-left corner there, and a positive offset.y moves it up, as Godot draws the 2D rect with its Y unflipped. The quad's AABB, grown as a billboard can turn it, places it for the visibility range.

The quad casts a shadow when Godot files its surface in the shadow pass (render_forward_clustered.cpp:4079-4089). That pass takes a cut or opaque surface, or an OPAQUE_PREPASS one, with its depth test on. An OPAQUE_PREPASS surface blends uncut, writes its depth in a depth prepass cut at 0.99, and cuts its shadow at 0.1 (render_forward_clustered.cpp:1791,2770). A blended sprite, the default, casts nothing. A hashed sprite hashes its shadow too. The quad receives shadows as every GeometryInstance3D does. The sprite3d-shadow golden pins this.

Linting

Strict parsing format-checks these Sprite3D properties, plus 20 inherited from SpriteBase3D, 18 inherited from GeometryInstance3D, 1 inherited from VisualInstance3D, 17 inherited from Node3D, 10 inherited from Node. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

PropertyAcceptsOut of range
frameinteger >= 0error below
frame_coordsVector2i(x, y), both >= 0, or the Vector2 spelling Godot convertserror below
hframesinteger 1-16384error below, warning above
region_enabledtrue or false
region_rectRect2(x, y, w, h), or the Rect2i spelling Godot converts
texturenull, SubResource("id"), ExtResource("id") or Resource("path")
vframesinteger 1-16384error below, warning above
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-node3d-visibility (type-family match)valid-node3d-visibilityerror
valid-sprite3d-resourcessprite3d-requires-textureinfo
sprite3d-frame-rangeerror
sprite3d-frame-coords-rangeerror
sprite3d-frame-remappedwarning
sprite3d-region-configurationinfo
valid-geometryinstance3d-visibility-range (type-family match)geometryinstance3d-visibility-range-end-before-beginwarning
geometryinstance3d-visibility-range-begin-fade-without-marginwarning
geometryinstance3d-visibility-range-end-fade-without-marginwarning

Most keys warn then fall back to their Godot defaults. billboard, alpha_cut and axis fall back to 0, 0 and 2, and pixel_size to 0.01. hframes and vframes fall back to 1, frame to 0 and offset to (0, 0). frame_coords and region_rect warn on a malformed literal and stay unset. modulate falls back to opaque white silently, since parseColor never logs, and texture is assigned verbatim whenever present. A malformed transparency keeps Godot's default (0) silently, which draws the sprite opaque.

Known limitations

  • Approximated Under msaa_3d Disabled, alpha to coverage cuts the edge at alpha 0.5, where Godot's driver picks its own one-sample mask.
  • Approximated Under msaa_3d, ALPHA_TO_COVERAGE_AND_TO_ONE stores the ramped alpha where Godot stores 1, so a transparent background shows the edge fainter.
  • Approximated ALPHA_HASH keeps about Godot's share of pixels but not the same pixels, as the ported hash's fract(1e4 * sin()) rounds differently on each GPU (scene_forward_aa_inc.glsl:3-39).

StandardMaterial3D

renders as a THREE.MeshStandardMaterial / MeshPhysicalMaterial docs ↗ source ↗ Limitation

Godot's default 3D surface. The scalar PBR base maps onto MeshStandardMaterial, and clearcoat, rim, anisotropy or refraction upgrade it to MeshPhysicalMaterial. Each section drives one feature from its own fixture.

Metallic / roughness

Done
Godot render of Metallic / roughness Our render of Metallic / roughness
Godot 4.6.3 Ours

A metallic = 1.0, roughness = 0.1 sphere reflects the preview sky. Both engines render the same blue-grey mirror. The preview glow blooms the sun's highlight into the same halo in both.

Metallic and roughness map channels

Done
Godot render of Metallic and roughness map channels Our render of Metallic and roughness map channels
Godot 4.6.3 Ours

Godot reads a roughness map and a metallic map from the channel that roughness_texture_channel and metallic_texture_channel name, red by default. One map holds red 20 and green and blue 235. The left sphere takes it as roughness from red, so it is glossy. The right sphere takes it as metallic from red, so it is a dielectric, as in Godot.

Emission

Done
Godot render of Emission Our render of Emission
Godot 4.6.3 Ours

An emissive sphere at emission_energy = 2.0 glows cyan in both, and the preview environment blooms it. emission_operator is honoured, including MULTIPLY with no texture, which emits nothing. emission_on_uv2 samples the mesh's UV2, and the glb-lightmap-uv2 golden draws it through a GLB's unwrapped UV2.

  • Approximated emission_intensity is ignored. emission_energy_multiplier alone drives the strength.
  • Approximated A PrimitiveMesh with add_uv2 gets no UV2 here, so emission_on_uv2 on one samples the map's top-left texel, where Godot reads the generated UV2.

Emission texture

Done
Godot render of Emission texture Our render of Emission texture
Godot 4.6.3 Ours

ADD emission with both a dark red colour and a texture. Godot emits (emission + texture) * energy (material.cpp:1788). The previewer adds the texel to the colour too, so the blue texel reads magenta and the green one amber.

ViewportTexture in another slot

Done
Godot render of ViewportTexture in another slot Our render of ViewportTexture in another slot
Godot 4.6.3 Ours

A SubViewport's target in the emission slot, over a black albedo. A material binds every slot by RID, so the target glows as it draws through the albedo in unit-sub-viewport-texture. A target in a pass cycle draws the missing-texture material from any slot.

Normal map

Done
Godot render of Normal map Our render of Normal map
Godot 4.6.3 Ours

normal_texture reads red and green only. Both engines rebuild blue from them (scene_forward_clustered.glsl:1437-1438). So a map with blue 0 shades its flat texel as the bare plane, and its tilted texel brighter. An RGTC import stores no blue, so this read is the only one that shades it. A glTF material reads its normal map the same way, as Godot imports it as a StandardMaterial3D.

  • Approximated The tilted texel shades darker than Godot's, while the flat texel matches.

Clearcoat

Done
Godot render of Clearcoat Our render of Clearcoat
Godot 4.6.3 Ours

A red sphere with a glossy clear coat. clearcoat maps to MeshPhysicalMaterial.clearcoat, and both engines show the same tight highlight over the red body. As in Godot, the coat dims only the sky's ambient light and reflection beneath it, not an omni, spot or directional light.

Rim

Limitation
Godot render of Rim Our render of Rim
Godot 4.6.3 Ours

Godot's rim is a Fresnel edge term on a dark sphere. It maps to sheen with a low sheenRoughness, and the body matches Godot.

  • Approximated The sheen is a crescent where view meets light, not an even ring round the silhouette.

Anisotropy

Limitation
Godot render of Anisotropy Our render of Anisotropy
Godot 4.6.3 Ours

anisotropy stretches the specular highlight along one direction. Both engines show a brushed-metal streak.

  • Approximated three derives the tangent frame per pixel from the UVs, not from the mesh's tangents, so the streak reads faceted and turned from Godot's ring.

Anisotropy flowmap

Limitation
Godot render of Anisotropy flowmap Our render of Anisotropy flowmap
Godot 4.6.3 Ours

anisotropy_flowmap carries direction in R/G and strength in alpha. The image is repacked alpha to blue before it reaches anisotropyMap, and both engines band the mapped sphere.

  • Approximated The bright lobe lands on the other side of centre, and band edges step hard where Godot's blur. The tangent frame comes from the UVs, not the mesh, and the glow blooms the misplaced lobe.
  • Approximated A hard seam runs down the large sphere, where Godot's surface is smooth.

Ambient occlusion

Done
Godot render of Ambient occlusion Our render of Ambient occlusion
Godot 4.6.3 Ours

The left plate reads a checkerboard AO map at ao_light_affect = 1.0, and the right plate has AO off. Both engines draw black occluded cells under the sun, since the map darkens direct light as well as ambient light. ao_texture_channel picks the map channel, and ao_on_uv2 samples the mesh's UV2.

  • Approximated A PrimitiveMesh with add_uv2 gets no UV2 here, so ao_on_uv2 on one samples the map's top-left texel, where Godot reads the generated UV2.

Diffuse mode

Done
Godot render of Diffuse mode Our render of Diffuse mode
Godot 4.6.3 Ours

diffuse_mode picks the light's diffuse term: Burley, Lambert, Lambert wrap and toon, left to right, lit from the right. Both engines brighten Burley's rim, wrap the light past Lambert's terminator and band the toon sphere. Godot's default material draws Lambert.

Specular mode

Done
Godot render of Specular mode Our render of Specular mode
Godot 4.6.3 Ours

specular_mode picks the light's specular term: SchlickGGX, toon and disabled, left to right. Both engines draw a soft highlight, a hard-edged toon disc and no highlight. Toon writes to the diffuse, so the albedo tints it.

  • Approximated The preview glow spreads the toon disc's halo less than Godot's.

Refraction

Limitation
Godot render of Refraction Our render of Refraction
Godot 4.6.3 Ours

Godot's refraction distorts the background, so the sphere reads bright. refraction_enabled maps to transmission plus thickness, which reads dark here. The forced opacity and depth write match Godot.

  • Approximated The screen-space distortion is not reproduced, and the surface is not dimmed by 1 - ref_amount, so it reads brighter than Godot's.

Height mapping

Done
Godot render of Height mapping Our render of Height mapping
Godot 4.6.3 Ours

Both engines shift every texture coordinate by the depth the heightmap reads, along the view direction in the surface's tangent frame. So the silhouette stays a smooth sphere. Deep parallax steps through Godot's layers, and the flips and the inverted texture follow Godot. Triplanar mapping turns height mapping off, and an unshaded material shifts its albedo too, as in Godot.

Texture filter

Done
Godot render of Texture filter Our render of Texture filter
Godot 4.6.3 Ours

texture_filter picks the sampler every texture slot reads through, and texture_repeat rides the same helper. Godot's repeat default is on while three's is clamp, so the applier states Repeat at bind time. An unauthored material tiles a clamped arrival on a source-shared clone. A ViewportTexture albedo samples through the same filter, repeat and UV transform in the material's program, because its render target is shared and never cloned.

  • Approximated Nearest sampling with anisotropy takes the property but not the anisotropy, since three skips it under NearestFilter.
  • Approximated texture_mipmap_bias is not applied. WebGL2 has no per-texture LOD bias.
  • Approximated anisotropic_filtering_level is pinned at 16x rather than read from the project.

Linting

Strict parsing format-checks the inherited set (131 inherited from BaseMaterial3D, 2 inherited from Material, 2 inherited from Resource); StandardMaterial3D declares none of its own. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo

The lenient parser never rejects. Each field falls back to Godot's default through the shared value decoders, so a malformed roughness renders with default roughness. A texture reference it cannot resolve leaves the slot empty, and the mesh renders untextured.

Known limitations

  • Approximated Under msaa_3d Disabled, alpha to coverage cuts the edge at alpha 0.5, where Godot's driver picks its own one-sample mask.
  • Approximated Under msaa_3d, ALPHA_TO_COVERAGE_AND_TO_ONE stores the ramped alpha where Godot stores 1, so a transparent background shows the edge fainter.
  • Approximated ALPHA_HASH keeps about Godot's share of pixels but not the same pixels, as the ported hash's fract(1e4 * sin()) rounds differently on each GPU (scene_forward_aa_inc.glsl:3-39).
  • Shader missing proximity_fade_* and distance_fade_* decide the pass but are not rendered, so the surface stays at full opacity.
  • Approximated Godot measures V from the image top and three from the bottom, so a non-integer uv1_scale.y or a non-zero uv1_offset.y shifts V differently.
  • Approximated Under uv1_world_triplanar, uv1_offset is in world units and is not converted.
  • Approximated Triplanar tiling density is exact on a PlaneMesh only, since curved, CSG, GridMap, ArrayMesh and GLB geometry tile by their own UVs.
  • Approximated A ViewportTexture outside the albedo slot ignores uv1_scale, uv1_offset, texture_repeat and a nearest texture_filter, as it samples its target clamped.
  • Approximated A patterned texture on a SphereMesh lands rotated, because Godot winds sphere UVs at a different phase than three.

StaticBody2D

renders as a transform-only group docs ↗ source ↗ unit-staticbody2d.tscn ↗ Linter only
No visual output — this node draws nothing to compare.

A non-moving 2D physics body with no visual of its own. The previewer mounts it as a transform-only Node2D group (ADR-0008), so the capture shows its children only.

Linting

Strict parsing format-checks these StaticBody2D properties, plus 5 inherited from CollisionObject2D, 12 inherited from Node2D, 16 inherited from CanvasItem, 10 inherited from Node. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

PropertyAcceptsOut of range
constant_angular_velocityfloat
constant_linear_velocityVector2(x, y), or the Vector2i spelling Godot converts
physics_material_overridenull, SubResource("id"), ExtResource("id") or Resource("path")
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-canvasitem-clip-ancestry (type-family match)canvasitem-ancestor-clips-childrenwarning
canvasitem-ancestor-is-canvasgroupwarning
valid-collisionobject2d (type-family match)collisionobject2d-needs-collision-shapewarning

Both collision keys go through layerBitmask, so a value outside a 32-bit mask is reported while any legal mask passes. The lenient parser keeps a malformed position as raw text rather than dropping the node.

StaticBody3D

renders as a transform-only group docs ↗ source ↗ unit-physics-bodies.tscn ↗ Linter only
Godot render of StaticBody3D Our render of StaticBody3D
Godot 4.6.3 Ours

A non-moving physics body with no runtime visual of its own. The previewer mounts it as a transform-only Node3D group (ADR-0005), and the blue slab both images show is its child GroundMesh.

Linting

Strict parsing format-checks these StaticBody3D properties, plus 6 inherited from PhysicsBody3D, 6 inherited from CollisionObject3D, 17 inherited from Node3D, 10 inherited from Node. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

PropertyAcceptsOut of range
constant_angular_velocityVector3(x, y, z), or the Vector3i spelling Godot converts
constant_linear_velocityVector3(x, y, z), or the Vector3i spelling Godot converts
physics_material_overridenull, SubResource("id"), ExtResource("id") or Resource("path")
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-node3d-visibility (type-family match)valid-node3d-visibilityerror
valid-collisionobject3d-scale (type-family match)collisionobject3d-non-uniform-scalewarning
valid-collisionobject3d (type-family match)collisionobject3d-needs-collision-shapewarning

StaticBody3D reuses parseNode3D directly, so physics_material_override, the constant velocities and the collision keys are never read by the lenient parser. There is no substitution to describe.

StatusIndicator

renders as nothing (a transform-only group) docs ↗ source ↗ unit-status-indicator.tscn ↗ Linter only
No visual output — this node draws nothing to compare.

An OS notification-area icon with no in-scene geometry to draw. The previewer renders it as a transform-only group (ADR-0008) and its children still show.

Linting

Strict parsing format-checks these StatusIndicator properties, plus 10 inherited from Node. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

PropertyAcceptsOut of range
iconnull, SubResource("id"), ExtResource("id") or Resource("path")
menuNodePath("path/to/node")
tooltipquoted string, or the &"…" StringName or NodePath("…") it converts
visibletrue or false
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo

index.ts registers the plain parseNode reader, which never looks at tooltip, icon, menu or visible. Every value, well-formed or not, is carried as inert text with no effect on what the previewer draws.

SubViewport

renders as an offscreen render target, plus a boundary that scopes its canvas subtree docs ↗ source ↗ unit-sub-viewport.tscn ↗ Limitation
Godot render of SubViewport Our render of SubViewport
Godot 4.6.3 Ours

A Viewport that renders its subtree into an offscreen target for a ViewportTexture to sample (ADR-0033). It draws nothing itself. Its Node3D descendants still draw in the parent's 3D view unless own_world_3d is set, and its CanvasItem descendants draw only in the target. A Control-only subtree renders through its own WebGL pass. Each target keeps its own positional shadow atlas, sized by positional_shadow_atlas_size and the four positional_shadow_atlas_quad_* keys, as each Godot viewport does. msaa_3d multisamples a 3D target and msaa_2d a canvas target. Each takes the closest count at or below the mode that the device supports for the target's own colour storage, as Godot's driver does (rendering_device_driver_vulkan.cpp:1999). A ViewportTexture on a .glb surface override resolves its viewport_path from the GLB instance, its local scene in Godot (packed_scene.cpp:707).

Linting

Strict parsing format-checks these SubViewport properties, plus 47 inherited from Viewport, 10 inherited from Node. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

PropertyAcceptsOut of range
render_target_clear_modeenum 0-2 (ALWAYS/NEVER/ONCE)warning
render_target_update_modeenum 0-4 (DISABLED/ONCE/WHEN_VISIBLE/WHEN_PARENT_VISIBLE/ALWAYS)warning
sizeVector2i(x, y), both >= 2, or the Vector2 spelling Godot convertserror below
size_2d_overrideVector2i(x, y), or the Vector2 spelling Godot converts
size_2d_override_stretchtrue or false
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo

Strict and lenient parsing diverge only on out-of-range enums. The lenient parser warns and falls back to Godot's default (render_target_update_mode 2, render_target_clear_mode 0, msaa_2d 0, msaa_3d 0, canvas_item_default_texture_filter 1), while the strict parser reports an error. A size Godot cannot read at all falls back to Vector2i(512, 512). A component below 2 is a strict error, because Viewport::_set_size raises it (viewport.cpp:1120).

Known limitations

  • Approximated A sub-viewport holding both 2D and 3D content shows its 3D half only, since the renderer draws one workspace at a time.
  • Approximated render_target_update_mode and render_target_clear_mode do not gate the pass, so the target is re-rendered and cleared every frame.
  • Approximated use_debanding and canvas_item_default_texture_filter do not affect the target, which renders at size with linear filtering.
  • Approximated A shared-world target takes the environment's tone curve and exposure but not its glow or adjustment_*, which Godot also runs inside the target.
  • Approximated An own_world_3d target's own Environment neither tonemaps nor glows it, where Godot tonemaps each viewport with its own world's Environment.
  • Approximated A multisampled 3D target resolves after the tone curve, where Godot resolves in linear HDR before it (render_forward_clustered.cpp:2402, :2514).
  • Approximated Selection highlights and gizmos leak into a shared-world target, because that target is a render of the main scene.
  • Approximated A consumer surface inside its own viewport's frustum samples a target still being written, with a driver-defined result.
  • Not drawn A TextureRect draws nothing for a ViewportTexture, which only a material's texture slots and Sprite2D.texture accept.
  • Approximated use_hdr_2d is not read, so an HDR canvas composites differently.
  • Needs runtime A viewport whose camera or world is assigned by script shows only its clear colour in 3D, and frames from the origin in 2D.
  • Shader missing A sub-viewport's 2D content draws unlit, so its own Light2D and LightOccluder2D nodes have no effect.

SubViewportContainer

renders as a clipped surface showing its SubViewport children's targets docs ↗ source ↗ unit-sub-viewport-container.tscn ↗ Limitation
Godot render of SubViewportContainer Our render of SubViewportContainer
Godot 4.6.3 Ours

SubViewportContainer shows its SubViewport children's render targets, drawn as a surface in the canvas (ADR-0033).

Linting

Strict parsing format-checks these SubViewportContainer properties, plus 53 inherited from Control, 16 inherited from CanvasItem, 10 inherited from Node. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

PropertyAcceptsOut of range
mouse_targettrue or false
stretchtrue or false
stretch_shrinkinteger >= 1error below
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-canvasitem-clip-ancestry (type-family match)canvasitem-ancestor-clips-childrenwarning
canvasitem-ancestor-is-canvasgroupwarning
valid-control-properties (type-family match)control-tooltip-ignored-by-mouse-filterwarning
control-property-orderwarning
valid-subviewportcontainer-childrensubviewportcontainer-no-viewportwarning
subviewportcontainer-non-arrow-cursorwarning

Strict errors on a stretch_shrink below 1, which Godot's setter refuses. The lenient parser warns and falls back to 1, and a non-boolean stretch falls back to false. The subviewportcontainer-no-viewport rule stays silent when a child's class lives elsewhere. That child is an instance= node, whose root the linter cannot inspect, or a class the pinned catalog does not list.

Known limitations

  • Needs runtime A sub-viewport a script fills when the game starts shows only what the scene file holds, so a shared-world split screen differs from Godot.

TabBar

renders as a row of per-tab StyleBox quads with icon/title/close-icon content docs ↗ source ↗ unit-tab-bar.tscn ↗ Unreviewed
Comparison images not captured yet for TabBar.

TabBar is the bare strip of tab headers, without the page switching a TabContainer adds. The previewer draws each tab's own tab_selected/tab_unselected/tab_disabled StyleBox, its icon and its title. It adds the close icon where tab_close_display_policy calls for it, and the scroll arrows once the tabs overflow a clipped bar.

Linting

Strict parsing format-checks these TabBar properties, plus 53 inherited from Control, 16 inherited from CanvasItem, 10 inherited from Node. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

PropertyAcceptsOut of range
clip_tabstrue or false
close_with_middle_mousetrue or false
current_tabinteger -1-4096error below, warning above
deselect_enabledtrue or false
drag_to_rearrange_enabledtrue or false
max_tab_widthinteger 0-99999error below, warning above
scroll_to_selectedtrue or false
scrolling_enabledtrue or false
select_with_rmbtrue or false
switch_on_drag_hovertrue or false
tab_#/*tab
tab_alignmentenum 0-2 (LEFT/CENTER/RIGHT)error
tab_close_display_policyenum 0-2 (SHOW_NEVER/SHOW_ACTIVE_ONLY/SHOW_ALWAYS)error
tab_countinteger >= 0error below
tabs_rearrange_groupinteger
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-canvasitem-clip-ancestry (type-family match)canvasitem-ancestor-clips-childrenwarning
canvasitem-ancestor-is-canvasgroupwarning
valid-control-properties (type-family match)control-tooltip-ignored-by-mouse-filterwarning
control-property-orderwarning
valid-tabbar-propertiestabbar-current-tab-out-of-rangeerror
tabbar-tab-index-out-of-rangeerror

The lenient parser reads current_tab, tab_alignment, tab_close_display_policy, max_tab_width, clip_tabs and the rest of the scalars. It walks a dense tab_<idx>/* family (title/tooltip/icon/disabled), aligned to tab_count like OptionButton's item_<idx>/* walk. The two linter.ts advisories compare a tab_<idx>/ index against tab_count and warn, since the engine drops the write.

Known limitations

  • Approximated Under layout_direction = 3, a tab title keeps left-to-right glyph order for a right-to-left script or trailing punctuation, while the tabs and their contents still mirror.
  • Not drawn The drag drop-mark, and the hover and pressed chrome of a tab, its close button and the scroll arrows, since each needs a pointer.
  • Approximated max_tab_width caps a tab's width as Godot does, but the title draws unclipped instead of with Godot's OVERRUN_TRIM_ELLIPSIS "…" truncation.

TabContainer

renders as a panel StyleBox behind the current page, topped by an internal TabBar strip docs ↗ source ↗ unit-tab-container.tscn ↗ Unreviewed
Comparison images not captured yet for TabContainer.

TabContainer arranges its children into a tabbed view, showing only the active tab's child. The previewer draws the panel StyleBox behind the content band and positions the current page below (or above) the strip. It draws the strip through the same painter TabBar uses.

Linting

Strict parsing format-checks these TabContainer properties, plus 53 inherited from Control, 16 inherited from CanvasItem, 10 inherited from Node. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

PropertyAcceptsOut of range
all_tabs_in_fronttrue or false
clip_tabstrue or false
current_tabinteger -1-4096error below, warning above
deselect_enabledtrue or false
drag_to_rearrange_enabledtrue or false
switch_on_drag_hovertrue or false
tab_#/*tab
tab_alignmentenum 0-2 (Left/Center/Right)error
tab_focus_modeenum 0-2 (None/Click/All)warning
tabs_positionenum 0-1 (Top/Bottom)error
tabs_rearrange_groupinteger
tabs_visibletrue or false
use_hidden_tabs_for_min_sizetrue or false
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-canvasitem-clip-ancestry (type-family match)canvasitem-ancestor-clips-childrenwarning
canvasitem-ancestor-is-canvasgroupwarning
valid-control-properties (type-family match)control-tooltip-ignored-by-mouse-filterwarning
control-property-orderwarning

The lenient parser reads the scalars above plus a sparse tab_<idx>/title,icon,disabled,hidden override map, keyed by whatever index the file names. TabContainer's own array_length_getter is its live child count, which is unknown at parse time. So, unlike TabBar's tab_count-sized walk, this one builds no dense array and applies no walk ceiling.

Known limitations

  • Approximated Under layout_direction = 3, a tab title in a right-to-left script keeps left-to-right glyph order, while the strip and its tabs still mirror.
  • Approximated tab_alignment = Right never reclaims the strip's side_margin gutter when its own tabs overflow and scroll, a narrow case Godot's own _update_margins special-cases.

TextEdit

renders as a multi-line text box docs ↗ source ↗ unit-text-edit.tscn ↗ Unreviewed
Comparison images not captured yet for TextEdit.

TextEdit is the multi-line text editor Control that CodeEdit builds on. The previewer draws its normal/read_only StyleBox, every buffer line shaped and wrapped per wrap_mode/autowrap_mode/indent_wrapped_lines, highlight_current_line's row band, and the draw_tabs/draw_spaces control-character glyphs. It is a still frame with no selection or IME (input method editor) state. The one caret a still frame can carry is the caret_draw_when_editable_disabled one, which draws without focus.

Linting

Strict parsing format-checks these TextEdit properties, plus 53 inherited from Control, 16 inherited from CanvasItem, 10 inherited from Node. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

PropertyAcceptsOut of range
autowrap_modeenum 1-3 (AUTOWRAP_ARBITRARY/AUTOWRAP_WORD/AUTOWRAP_WORD_SMART)warning
backspace_deletes_composite_character_enabledtrue or false
caret_blinktrue or false
caret_blink_intervalfloat 0.1-10error at or below 0, warning below 0.1, warning above 10
caret_draw_when_editable_disabledtrue or false
caret_mid_graphemetrue or false
caret_move_on_right_clicktrue or false
caret_multipletrue or false
caret_typeenum 0-1 (CARET_TYPE_LINE/CARET_TYPE_BLOCK)warning
context_menu_enabledtrue or false
custom_word_separatorsquoted string, or the &"…" StringName or NodePath("…") it converts
deselect_on_focus_loss_enabledtrue or false
drag_and_drop_selection_enabledtrue or false
draw_control_charstrue or false
draw_spacestrue or false
draw_tabstrue or false
editabletrue or false
emoji_menu_enabledtrue or false
empty_selection_clipboard_enabledtrue or false
highlight_all_occurrencestrue or false
highlight_current_linetrue or false
indent_wrapped_linestrue or false
languagequoted string, or the &"…" StringName or NodePath("…") it converts
middle_mouse_paste_enabledtrue or false
minimap_drawtrue or false
minimap_widthinteger
placeholder_textquoted string, or the &"…" StringName or NodePath("…") it converts
scroll_fit_content_heighttrue or false
scroll_fit_content_widthtrue or false
scroll_horizontalinteger >= 0error below
scroll_past_end_of_filetrue or false
scroll_smoothtrue or false
scroll_v_scroll_speedfloat >= 1error below
scroll_verticalfloat >= 0error below
selecting_enabledtrue or false
shortcut_keys_enabledtrue or false
structured_text_bidi_overrideenum 0-6 (STRUCTURED_TEXT_DEFAULT/STRUCTURED_TEXT_URI/STRUCTURED_TEXT_FILE/STRUCTURED_TEXT_EMAIL/STRUCTURED_TEXT_LIST/STRUCTURED_TEXT_GDSCRIPT/STRUCTURED_TEXT_CUSTOM)warning
structured_text_bidi_override_optionsArray literal ([...] or ArrayT)
syntax_highlighternull, SubResource("id"), ExtResource("id") or Resource("path")
tab_input_modetrue or false
textquoted string, or the &"…" StringName or NodePath("…") it converts
text_directionenum 0-3 (TEXT_DIRECTION_AUTO/TEXT_DIRECTION_LTR/TEXT_DIRECTION_RTL/TEXT_DIRECTION_INHERITED)error below -1, warning below 0, error above 3
use_custom_word_separatorstrue or false
use_default_word_separatorstrue or false
virtual_keyboard_enabledtrue or false
virtual_keyboard_show_on_focustrue or false
wrap_modeenum 0-1 (LINE_WRAPPING_NONE/LINE_WRAPPING_BOUNDARY)warning
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-canvasitem-clip-ancestry (type-family match)canvasitem-ancestor-clips-childrenwarning
canvasitem-ancestor-is-canvasgroupwarning
valid-control-properties (type-family match)control-tooltip-ignored-by-mouse-filterwarning
control-property-orderwarning

linterParser.ts format-checks all of TextEdit's own members. The registered lenient parser reads what a static frame shows: text, placeholder_text, editable, wrap_mode, autowrap_mode, draw_tabs, draw_spaces, highlight_current_line, scroll_fit_content_width, scroll_fit_content_height, minimap_draw, minimap_width and syntax_highlighter. A malformed wrap_mode/autowrap_mode/minimap_width reads as unset (NONE/WORD_SMART/80). A malformed boolean reads as false. The strict linter parses scroll_horizontal/scroll_vertical, but the previewer never reads them. The first draw forces both back to (0, 0), since caret 0 always sits at (line 0, column 0) and nothing in a .tscn can move it (nativeSolver.ts's own doc has the full trace).

syntax_highlighter resolves in this node's own scope (resources/useSubOrExtResource.ts, solveNode.resources, never useSceneResources()). A CodeHighlighter sub-resource or .tres decodes through resources/styles/codehighlighter/, and its _get_line_syntax_highlighting_impl line scanner (highlight.ts) colours every buffer line, one <TextRun> per colour run. Anything else the property can name (absent, unresolved, or a custom SyntaxHighlighter script) paints at the plain font_color.

indent_size (CodeEdit only, set_tab_size) re-aligns every tab glyph to a repeating stop indent_size space-widths wide (nativeSolver.ts's textEditTabStopsPx). A bare TextEdit has no .tscn property for it and always shapes at the class default of 4.

Known limitations

  • Not drawn The selection, IME composition, brace-match underline, word-highlight box, search-result box, minimap and scrollbars, which need state a .tscn cannot carry.
  • Approximated draw_tabs/draw_spaces overlay the tab/space theme icons at an unscaled size and a row-centred vertical offset, not Godot's own ascent-relative one (Component.tsx's own doc).
  • Not drawn The right-to-left mouse mirror (text_edit.cpp:2241,2516,4956), hit tests (:5024,8213-8215), empty-line caret (:1781) and end-of-line selection rect (:1517), which need pointer, caret or selection state.
  • Not drawn The minimap's RTL side (:1161-1165,1226-1235,1284-1286) and the per-line background rect's (:1396-1400): neither feature is drawn at all.
  • Not drawn shaped_text_set_direction at :3340,3396,3732,3761: it takes is_layout_rtl() only while text_direction is INHERITED, and the default is TEXT_DIRECTION_AUTO (text_edit.h:327).

Texture2D

renders as a THREE.DataTexture / CanvasTexture docs ↗ source ↗ Limitation

A material's texture slot can point at a Texture2D that the scene or a .tres describes. The previewer rasterises or windows a GradientTexture2D, CanvasTexture, AtlasTexture, NoiseTexture2D or saved ImageTexture on the client. Each reaches every consumer as a THREE.Texture.

GradientTexture2D

Limitation
Godot render of GradientTexture2D Our render of GradientTexture2D
Godot 4.6.3 Ours

A procedural gradient baked to a texture, here a radial white-to-transparent glow. The falloff and placement match Godot. With use_hdr, a channel above 1 survives, as in Godot's float image.

  • Approximated The additive glow reads a touch whiter where Godot's is a warmer gold.

CanvasTexture

Done
Godot render of CanvasTexture Our render of CanvasTexture
Godot 4.6.3 Ours

A Texture2D that wraps an image with optional normal and specular maps. The sprite renders identically to the sibling that references the image directly, in both engines. A CanvasTexture is a 2D object. In a material slot its RID names no texture, so Godot and the previewer bind a white texture in any slot.

AtlasTexture

Done
Godot render of AtlasTexture Our render of AtlasTexture
Godot 4.6.3 Ours

A Texture2D that windows a region of another texture. A 2D consumer draws the region. A material slot binds the whole sheet, as Godot does. A material reads a texture by its RID, and an AtlasTexture's RID is its sheet's (atlas_texture.cpp:55-58). The left quad names the top-left texel and draws all four. The right quad binds a CanvasTexture and draws white.

AtlasTexture mip chain

Done
Godot render of AtlasTexture mip chain Our render of AtlasTexture mip chain
Godot 4.6.3 Ours

A minified AtlasTexture samples the chain its sheet's import built. The sheet holds stripes leaning 0 and 90 degrees, imported as a normal map, so each level is renormalised. The left sprite draws the sheet and the right one a crop of all of it, at a quarter of its size. Both draw the 45-degree colour, as in Godot.

ImageTexture

Done
Godot render of ImageTexture Our render of ImageTexture
Godot 4.6.3 Ours

A texture whose pixels the scene or a .tres saves inline, as an Image sub-resource. The previewer decodes every uncompressed format Godot saves: the 8-bit, 16-bit, half and float formats, RGBA4444, RGB565 and RGBE9995. A float channel above 1 survives, as Godot's does. A colour slot reads RGB8 and RGBA8 as sRGB and every other uncompressed format raw, as Godot does. So the Lum8 strip draws brighter than the RGB8 strip of the same bytes. The same rule holds for a NoiseTexture2D, which is Lum8 without a colour ramp, and a GradientTexture2D, which is a float format with use_hdr.

Block-compressed Image

Done
Godot render of Block-compressed Image Our render of Block-compressed Image
Godot 4.6.3 Ours

An Image can also save the S3TC and RGTC blocks of a compressed texture. The previewer decodes DXT1, DXT3, DXT5, DXT5_RA_AS_RG, RGTC Red8 and RGTC RedGreen8 to RGBA8 as Godot's bcdec fallback does, then applies Godot's swizzle. So DXT1 draws opaque, RGTC draws blue 0, and DXT5_RA_AS_RG carries its alpha in green. A colour slot reads the four S3TC formats as sRGB and the two RGTC formats raw, as Godot does. Each sprite is one colour ramp in one format. The top-left block of the DXT1 sprite is in the three-colour mode, so its last texel draws black. A GPU that decodes the blocks itself can round an interpolated colour one step apart from bcdec.

Image file

Limitation
Godot render of Image file Our render of Image file
Godot 4.6.3 Ours

A scene names a PNG, JPEG, WebP or SVG file by path. Godot imports it as its .import sidecar says. A colour slot reads it through the format Godot imports it in, which comes from the file's own header and the sidecar's compress/mode. A greyscale PNG or JPEG imports as Lum8 or LumAlpha8 unless the sidecar asks for VRAM or Basis Universal compression, so it reads raw. The top strip is a greyscale PNG with no sidecar, the second is the same PNG VRAM compressed, and the third is an RGB PNG. The bottom strip is that RGB PNG imported as a VRAM compressed normal map. So it is RGTC, which keeps red and green raw and samples blue as 0. The sidecar also decides the mip chain, the alpha-border pass, the alpha premultiply, the normal map's green and an SVG's scale. standardmaterial3d/textureBinding.md has the rules and their cites.

Imported mip chain

Done
Godot render of Imported mip chain Our render of Imported mip chain
Godot 4.6.3 Ours

An image file whose sidecar sets mipmaps/generate samples the mip chain Godot's importer builds on the CPU. Each level averages the bytes of the level above, so an sRGB image averages its encoded values. Both strips tile an 8 × 8 image so densely that they sample its smallest levels. The top strip is a red and green checker, which averages to a dark yellow, as in Godot. The bottom strip is a normal map of stripes, imported as a normal map, so each level is renormalised and leans 45 degrees towards the light.

Roughness limiter

Done
Godot render of Roughness limiter Our render of Roughness limiter
Godot 4.6.3 Ours

A roughness map whose sidecar sets roughness/mode and roughness/src_normal runs Godot's roughness limiter on its mip chain. Each level gets rougher by the spread of the normals it covers in the named normal map. Both spheres tile the same smooth roughness map and bumpy normal map. The left map's sidecar names the normal map, so its minified highlight spreads and dims, as in Godot. The right map's sidecar turns the limiter off.

glTF image

Done
Godot render of glTF image Our render of glTF image
Godot 4.6.3 Ours

Godot imports a glTF image through the same texture importer, as the file it extracts the image to. That file's sidecar decides its texels and its format. The quad's image is a green square inside transparent magenta texels. The default alpha-border pass turns them green, so the blended edge fades green, not magenta.

NoiseTexture2D

A field baked from a FastNoiseLite, most often as a normal map. A seamless bake wraps its opposite edges and tiles. A plain one clamps, so UVs past the tile smear its edge texels. Under a StandardMaterial3D both tile, because texture_repeat defaults on (material.cpp:4005) and the sampler hint adds repeat_enable (material.cpp:760-765).

Linting

Strict parsing format-checks the inherited set (2 inherited from Resource); Texture2D declares none of its own. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo

The lenient parser never rejects a texture property. An unreadable value falls back to Godot's default through the shared value decoders. A reference it cannot resolve leaves the slot empty, so the consumer renders untextured.

Known limitations

  • Approximated An AtlasTexture's margin is not applied, so a trimmed-atlas layout sits off by the margin.
  • Approximated An AtlasTexture's filter_clip is not applied, so a filtered cell edge can bleed one texel from its neighbour.
  • Approximated A NoiseTexture2D slot draws empty on first load until its build finishes, where Godot waits and draws the texture on its first frame.
  • Approximated A VRAM-compressed or lossy image file draws its source texels, without the compression error Godot's import adds.
  • Approximated A file with no sidecar reads as a fresh import, not as the editor re-imports a texture it sees in 3D.
  • Approximated An imported image keeps its bytes and mip chain in memory after the upload for later readers (decals, crops, flowmaps, context loss), where Godot frees them.
  • Approximated An image file past the GPU's MAX_TEXTURE_SIZE cannot be read back, so its GPU-built chain averages an sRGB image in linear space.
  • Resource gap An ImageTexture saved in a BPTC, ETC, EAC, ASTC or integer format draws no texture.
  • Not drawn A NoiseTexture2D wider or taller than 16384 pixels draws no texture, where Godot draws one on a GPU that uploads larger textures.

TextureButton

renders as a textured quad, per stretch_mode docs ↗ source ↗ unit-texture-button.tscn ↗ Unreviewed
Comparison images not captured yet for TextureButton.

TextureButton is a sprite-based button with five texture slots, a click mask and a stretch mode. The previewer draws whichever texture the node's draw state selects (texture_normal/texture_pressed/texture_hover/texture_disabled), sized and positioned per stretch_mode, with flip_h/flip_v applied.

Linting

Strict parsing format-checks these TextureButton properties, plus 10 inherited from BaseButton, 53 inherited from Control, 16 inherited from CanvasItem, 10 inherited from Node. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

PropertyAcceptsOut of range
flip_htrue or false
flip_vtrue or false
ignore_texture_sizetrue or false
stretch_modeenum 0-6 (STRETCH_SCALE/STRETCH_TILE/STRETCH_KEEP/STRETCH_KEEP_CENTERED/STRETCH_KEEP_ASPECT/STRETCH_KEEP_ASPECT_CENTERED/STRETCH_KEEP_ASPECT_COVERED)warning
texture_click_masknull, SubResource("id"), ExtResource("id") or Resource("path")
texture_disablednull, SubResource("id"), ExtResource("id") or Resource("path")
texture_focusednull, SubResource("id"), ExtResource("id") or Resource("path")
texture_hovernull, SubResource("id"), ExtResource("id") or Resource("path")
texture_normalnull, SubResource("id"), ExtResource("id") or Resource("path")
texture_pressednull, SubResource("id"), ExtResource("id") or Resource("path")
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-canvasitem-clip-ancestry (type-family match)canvasitem-ancestor-clips-childrenwarning
canvasitem-ancestor-is-canvasgroupwarning
valid-control-properties (type-family match)control-tooltip-ignored-by-mouse-filterwarning
control-property-orderwarning
valid-button-group (type-family match)button-group-without-toggle-modewarning

The lenient parser reads each of TextureButton's own members except texture_click_mask, which stays in the untyped property bag. That mask affects hit-testing only, never pixels, and this previewer has no pointer input to hit-test. A stretch_mode = 12 still draws, because the switch's default branch resolves it as STRETCH_KEEP. That matches strict's warning, not error, for that key.

Known limitations

  • Not drawn texture_focused: a static preview with no pointer or keyboard never holds focus, so this slot never contributes a pixel.

TextureProgressBar

renders as three composited texture layers, the middle one ratio-windowed docs ↗ source ↗ unit-texture-progress-bar.tscn ↗ Unreviewed
Comparison images not captured yet for TextureProgressBar.

TextureProgressBar draws texture_under, texture_progress and texture_over in that order. texture_progress windows to the current ratio. It is a crop for a linear fill_mode, a triangle fan for a radial one, or a 9-patch grid once nine_patch_stretch is set (which also windows texture_under/texture_over at full size). Each layer multiplies its own tint_* onto the node's tint.

Linting

Strict parsing format-checks these TextureProgressBar properties, plus 9 inherited from Range, 53 inherited from Control, 16 inherited from CanvasItem, 10 inherited from Node. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

PropertyAcceptsOut of range
fill_modeenum 0-8 (FILL_LEFT_TO_RIGHT/FILL_RIGHT_TO_LEFT/FILL_TOP_TO_BOTTOM/FILL_BOTTOM_TO_TOP/FILL_CLOCKWISE/FILL_COUNTER_CLOCKWISE/FILL_BILINEAR_LEFT_AND_RIGHT/FILL_BILINEAR_TOP_AND_BOTTOM/FILL_CLOCKWISE_AND_COUNTER_CLOCKWISE)error
nine_patch_stretchtrue or false
radial_center_offsetVector2(x, y), or the Vector2i spelling Godot converts
radial_fill_degreesfloat 0-360error
radial_initial_anglefloat 0-360error
stretch_margin_bottominteger 0-16384warning
stretch_margin_leftinteger 0-16384warning
stretch_margin_rightinteger 0-16384warning
stretch_margin_topinteger 0-16384warning
texture_overnull, SubResource("id"), ExtResource("id") or Resource("path")
texture_progressnull, SubResource("id"), ExtResource("id") or Resource("path")
texture_progress_offsetVector2(x, y), or the Vector2i spelling Godot converts
texture_undernull, SubResource("id"), ExtResource("id") or Resource("path")
tint_overColor(r, g, b, a), or the colour string or int it converts
tint_progressColor(r, g, b, a), or the colour string or int it converts
tint_underColor(r, g, b, a), or the colour string or int it converts
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-canvasitem-clip-ancestry (type-family match)canvasitem-ancestor-clips-childrenwarning
canvasitem-ancestor-is-canvasgroupwarning
valid-control-properties (type-family match)control-tooltip-ignored-by-mouse-filterwarning
control-property-orderwarning
valid-range-bounds (type-family match)range-max-below-minerror
range-exp-edit-negative-minwarning

The lenient parser reads fill_mode, nine_patch_stretch, every radial_*, stretch_margin_*, texture_* and tint_* key alongside its Control and Range bases. A fill_mode outside 0-8 draws as FILL_LEFT_TO_RIGHT: set_fill_mode's ERR_FAIL_INDEX refuses the out-of-range write, so the node keeps its class-default mode. radial_fill_degrees outside [0, 360] clamps to that range. radial_initial_angle wraps into it, or falls back to 0 when non-finite. Both mirror their own setters.

TextureRect

renders as a textured quad in the control's rect docs ↗ source ↗ unit-texture-rect.tscn ↗ Done
Godot render of TextureRect Our render of TextureRect
Godot 4.6.3 Ours

TextureRect draws a Texture2D inside its rect, scaled and placed by expand_mode and stretch_mode.

Linting

Strict parsing format-checks these TextureRect properties, plus 53 inherited from Control, 16 inherited from CanvasItem, 10 inherited from Node. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

PropertyAcceptsOut of range
expand_modeenum 0-5 (EXPAND_KEEP_SIZE/EXPAND_IGNORE_SIZE/EXPAND_FIT_WIDTH/EXPAND_FIT_WIDTH_PROPORTIONAL/EXPAND_FIT_HEIGHT/EXPAND_FIT_HEIGHT_PROPORTIONAL)warning
flip_htrue or false
flip_vtrue or false
stretch_modeenum 0-6 (STRETCH_SCALE/STRETCH_TILE/STRETCH_KEEP/STRETCH_KEEP_CENTERED/STRETCH_KEEP_ASPECT/STRETCH_KEEP_ASPECT_CENTERED/STRETCH_KEEP_ASPECT_COVERED)warning
texturenull, SubResource("id"), ExtResource("id") or Resource("path")
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-canvasitem-clip-ancestry (type-family match)canvasitem-ancestor-clips-childrenwarning
canvasitem-ancestor-is-canvasgroupwarning
valid-control-properties (type-family match)control-tooltip-ignored-by-mouse-filterwarning
control-property-orderwarning

expand_mode and stretch_mode warn outside their enum range, since both setters assign straight through. At render time each goes through the optional-int reader, so an unparseable value becomes undefined and takes the switch default. flip_h and flip_v collapse to false for any value that does not read as true.

TileMap

renders as batched textured tile quads docs ↗ source ↗ unit-tile-map.tscn ↗ Limitation
Godot render of TileMap Our render of TileMap
Godot 4.6.3 Ours

TileMap draws each layer's cells as batched textured quads from its TileSet atlas. The previewer decodes the legacy layer_N/tile_data groups. It draws each layer's rendering quadrants in Godot's cell order, as on TileMapLayer (tile_map_layer.cpp:306-311, :412-566). A quadrant draws as one or more canvas items, a new one at each change of tile material or z_index. Each canvas item takes its own lights at its layer's z_index plus the tile's own. A tile samples its atlas as on TileMapLayer, with use_texture_padding honoured.

Linting

Strict parsing format-checks these TileMap properties, plus 12 inherited from Node2D, 16 inherited from CanvasItem, 10 inherited from Node. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

PropertyAcceptsOut of range
collision_animatabletrue or false
collision_visibility_modeenum 0-2 (DEFAULT/FORCE_SHOW/FORCE_HIDE)warning
formatINT-typed literal (a FLOAT or BOOL spelling is a dropped write, tile_map.cpp:689)
layer_#/*layer
navigation_visibility_modeenum 0-2 (DEFAULT/FORCE_SHOW/FORCE_HIDE)warning
rendering_quadrant_sizeinteger 1-128error below, warning above
tile_setnull, SubResource("id"), ExtResource("id") or Resource("path")
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-canvasitem-clip-ancestry (type-family match)canvasitem-ancestor-clips-childrenwarning
canvasitem-ancestor-is-canvasgroupwarning
valid-tilemaptilemap-deprecatedwarning
tilemap-y-sort-z-index-conflictwarning
tilemap-layer-y-sort-without-nodewarning
tilemap-node-y-sort-without-layerwarning
tilemap-requires-tilesetinfo
tilemap-unsupported-formaterror
tilemap-invalid-tile-dataerror

format falls back to 2, the current encoding, when absent or unreadable. Only format 2 decodes, so another value warns and drops that layer's tile_data. tile_set passes through as the raw reference string, so a dangling reference draws no tiles.

Known limitations

  • Approximated Y-sort is computed once for the static scene, so a Y change driven by an AnimationPlayer is not re-sorted.
  • Resource gap Scene-collection sources are skipped with a warning, animated tiles show their first frame, and legacy formats 0 and 1 draw nothing.

TileMapLayer

renders as batched textured tile quads docs ↗ source ↗ unit-tile-map-layer.tscn ↗ Limitation
Godot render of TileMapLayer Our render of TileMapLayer
Godot 4.6.3 Ours

TileMapLayer paints a grid of tiles from a TileSet atlas. The previewer decodes tile_map_data at parse time. It draws each rendering quadrant as one or more canvas items, a new one at each change of tile material or z_index. The quadrant's cells draw in Godot's order, x then y (tile_map_layer.cpp:306-311), with each run of cells from one atlas source batched into one quad mesh. Under use_texture_padding (the default), a tile samples only its own texels and repeats its edge texels outward, as Godot's padded atlas copy does. A filtered tile then shows no seam from its neighbour.

A rendering quadrant is a rendering_quadrant_size square of cells, or one tile row of a y-sorted layer. Each quadrant takes its own lights, so a large layer is not held to 15 positional lights in total.

Linting

Strict parsing format-checks these TileMapLayer properties, plus 12 inherited from Node2D, 16 inherited from CanvasItem, 10 inherited from Node. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

PropertyAcceptsOut of range
collision_enabledtrue or false
collision_visibility_modeenum 0-2 (DEFAULT/FORCE_SHOW/FORCE_HIDE)warning
enabledtrue or false
navigation_enabledtrue or false
navigation_visibility_modeenum 0-2 (DEFAULT/FORCE_SHOW/FORCE_HIDE)warning
occlusion_enabledtrue or false
physics_quadrant_sizeinteger >= 1error below
rendering_quadrant_sizeinteger >= 1error below
tile_map_dataPackedByteArray(…) int array of bytes, or a base64-quoted PackedByteArray("…") (decoded by the tilemaplayer-invalid-tile-data rule)
tile_setnull, SubResource("id"), ExtResource("id") or Resource("path")
use_kinematic_bodiestrue or false
x_draw_order_reversedtrue or false
y_sort_origininteger
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-canvasitem-clip-ancestry (type-family match)canvasitem-ancestor-clips-childrenwarning
canvasitem-ancestor-is-canvasgroupwarning
valid-tilemaplayertilemaplayer-requires-tilesetinfo
tilemaplayer-invalid-tile-dataerror

enabled falls back to true when absent or unparseable. tile_set passes through as the raw reference string, so a dangling reference draws no tiles. Malformed tile_map_data warns and drops every cell, leaving an empty layer.

Known limitations

  • Approximated Y-sort is computed once for the static scene, so a Y change driven by an AnimationPlayer is not re-sorted.
  • Resource gap Scene-collection sources are skipped with a warning, and animated tiles show their first frame.

Timer

renders as nothing (a countdown timer node) docs ↗ source ↗ unit-timer.tscn ↗ Linter only
No visual output — this node draws nothing to compare.

Counts down and emits timeout, a logic node with no runtime visual. The previewer draws nothing for it, so both images show only the empty preview environment.

Linting

Strict parsing format-checks these Timer properties, plus 10 inherited from Node. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

PropertyAcceptsOut of range
autostarttrue or false
ignore_time_scaletrue or false
one_shottrue or false
pausedtrue or false
process_callbackenum 0-1 (PHYSICS/IDLE)warning
wait_timefloat >= 0.001error at or below 0, warning below 0.001
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-timer-wait-timetimer-low-wait-timewarning

Every property reads through the parseOptional* family, which substitutes no default. wait_time and process_callback resolve to undefined when absent or unparseable, and the four flags resolve to false for anything but the literal true. process_callback is read as a bare int with no enum check.

TouchScreenButton

renders as invisible transform-only fallback docs ↗ source ↗ unit-touch-screen-button.tscn ↗ Not implemented
Comparison images not captured yet for TouchScreenButton.

TouchScreenButton is an on-screen button for touch input that draws texture_normal or texture_pressed. The previewer parses and validates it but does not draw it, so it renders as a transform-only fallback and its children still show.

Linting

Strict parsing format-checks these TouchScreenButton properties, plus 12 inherited from Node2D, 16 inherited from CanvasItem, 10 inherited from Node. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

PropertyAcceptsOut of range
actionquoted string or &"name"
bitmasknull, SubResource("id"), ExtResource("id") or Resource("path")
passby_presstrue or false
shapenull, SubResource("id"), ExtResource("id") or Resource("path")
shape_centeredtrue or false
shape_visibletrue or false
texture_normalnull, SubResource("id"), ExtResource("id") or Resource("path")
texture_pressednull, SubResource("id"), ExtResource("id") or Resource("path")
visibility_modeenum 0-1 (ALWAYS/TOUCHSCREEN_ONLY)warning
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-canvasitem-clip-ancestry (type-family match)canvasitem-ancestor-clips-childrenwarning
canvasitem-ancestor-is-canvasgroupwarning

The slice has no parser.ts. index.ts registers parseNode2D, which reads none of the nine keys, so an unquoted action or an out-of-range visibility_mode is carried through raw and never rendered.

Known limitations

  • Not drawn Godot draws the button's texture, but the previewer draws nothing for this node.

Tree

renders as an empty panel, with a blank header row when column_titles_visible docs ↗ source ↗ unit-tree.tscn ↗ Unreviewed
Comparison images not captured yet for Tree.

Tree is the hierarchical multi-column list Control, built from TreeItem objects at runtime. A .tscn Tree carries no TreeItem. The items and every column's title text exist only when a script creates them. So the previewer draws only the panel StyleBox and, when column_titles_visible is set, one blank-titled header cell per column. That empty panel is the whole truth of such a scene, not a limitation. A right-to-left Tree mirrors each header cell inside its own width (tree.cpp:5158-5160).

Linting

Strict parsing format-checks these Tree properties, plus 53 inherited from Control, 16 inherited from CanvasItem, 10 inherited from Node. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

PropertyAcceptsOut of range
allow_reselecttrue or false
allow_rmb_selecttrue or false
allow_searchtrue or false
auto_tooltiptrue or false
column_titles_visibletrue or false
columnsinteger >= 1error below
drop_mode_flagsbit mask of DROP_MODE_ON_ITEM (1) | DROP_MODE_INBETWEEN (2)
enable_drag_unfoldingtrue or false
enable_recursive_foldingtrue or false
hide_foldingtrue or false
hide_roottrue or false
scroll_hint_modeenum 0-3 (SCROLL_HINT_MODE_DISABLED/SCROLL_HINT_MODE_BOTH/SCROLL_HINT_MODE_TOP/SCROLL_HINT_MODE_BOTTOM)warning
scroll_horizontal_enabledtrue or false
scroll_vertical_enabledtrue or false
select_modeenum 0-2 (SELECT_SINGLE/SELECT_ROW/SELECT_MULTI)warning
tile_scroll_hinttrue or false
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-canvasitem-clip-ancestry (type-family match)canvasitem-ancestor-clips-childrenwarning
canvasitem-ancestor-is-canvasgroupwarning
valid-control-properties (type-family match)control-tooltip-ignored-by-mouse-filterwarning
control-property-orderwarning

linterParser.ts format-checks all of Tree's own members. The registered lenient parser reads only columns and column_titles_visible, the two this previewer's picture depends on. A malformed columns reads as unset (1). The strict linter format-checks every other property, and the previewer never reads it, since none changes what an item-less Tree draws. A script creates the rows and cells, so they never reach the .tscn.

Known limitations

  • Approximated Column titles get no right-to-left shaping, which never shows because no title is serialised and the header cells are blank.
  • Needs runtime The right-to-left arms of get_column_at_position (tree.cpp:6426), get_drop_section_at_position (:6458), get_item_at_position (:6508), get_tooltip (:6568) and gui_input (:3794,3812) need a live cursor or keyboard.

Truck Town

renders as Godot's Truck Town world through the scene's own camera demos/3d/truck_town/town/town_scene.tscn ↗ Limitation

Godot's Truck Town demo: the town, the largest scene in the corpus, and the two vehicles. The vehicles use Godot 4.2+ compressed ArrayMesh attributes across a whole body.

The town

Limitation
Godot render of The town Our render of The town
Godot 4.6.3 Ours

town_scene.tscn: a glTF town, ten instanced lamps, a CSG racetrack, a procedural sky with fog and AgX tonemapping, a shadow-casting sun and a Control UI. Neither automatic framing suits it, so both sides look through the scene's PreviewCamera.

It exercises:

  • A glTF scene instanced as a PackedScene, with nested glTF tree instances
  • The .gltf.import sidecar's root_scale (ADR-0028), which sizes the trees
  • A CSGPolygon3D racetrack swept along a Path3D
  • DirectionalLight3D shadows over open terrain
  • An external sky_material and sky ambient light
  • Material overrides on nodes inside the instanced glTF

Geometry, framing, tree scale, the sky, the fog, the ground and the override materials match.

  • Needs runtime The town has no vehicles. The game spawns them at runtime.

Trailer truck

Limitation
Godot render of Trailer truck Our render of Trailer truck
Godot 4.6.3 Ours

A cab and a trailer built from external compressed ArrayMeshes, with a livery decal and three blob-shadow decals. Every part sits where Godot puts it, and the shading matches.

  • Approximated The "GODOT" livery lettering is thinner and less blue than Godot's. WebGL2 has no texture LOD bias, so texture_mipmap_bias is not applied.

Tow truck

Done
Godot render of Tow truck Our render of Tow truck
Godot 4.6.3 Ours

A tow truck and the towed vehicle. One mesh mixes compressed and uncompressed surfaces. Every part sits where Godot puts it, and each blob shadow reaches the ground and never the bodywork (Decal.cull_mask). The shading and the grey metal chain links match.

Known limitations

  • Not drawn A typed node placed inside instanced content does not render, where a type-less override does, and the town uses only overrides.

TwoBoneIK3D

renders as nothing yet, Godot poses its two-bone chain onto the target, the previewer does not docs ↗ source ↗ unit-two-bone-ik-3d.tscn ↗ Not implemented
No visual output — this node draws nothing to compare.

A rotation-based two-bone IK solver. It builds a plane from the root, middle and end joints and a pole target. It then poses the skeleton so the end bone reaches the target. Godot runs it each frame, and the previewer does not yet (ADR-0045). The bones hold their rest pose.

Linting

Strict parsing format-checks these TwoBoneIK3D properties, plus 1 inherited from IKModifier3D, 2 inherited from SkeletonModifier3D, 17 inherited from Node3D, 10 inherited from Node. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

PropertyAcceptsOut of range
setting_countinteger >= 0error below
settings/*per-setting bone chain, pole direction and virtual end-bone setup
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-node3d-visibility (type-family match)valid-node3d-visibilityerror
valid-skeletonmodifier3d-parent (type-family match)skeletonmodifier3d-parent-not-skeleton3dwarning
valid-twoboneik3d-settings (type-family match)twoboneik3d-setting-index-out-of-rangeerror
twoboneik3d-pole-direction-vector-ignorederror
twoboneik3d-setting-missing-target-nodewarning

The lenient parser reuses parseNode3D, so setting_count and every settings/<i>/ value is dropped rather than substituted, with no fallback to name. Strict warns on a pole_direction outside 0-7 or an end_bone/direction outside 0-6, since Godot's setters assign whatever integer they are handed.

VBoxContainer

renders as children laid out down a column docs ↗ source ↗ unit-vbox-container.tscn ↗ Done
Godot render of VBoxContainer Our render of VBoxContainer
Godot 4.6.3 Ours

VBoxContainer stacks its children in a vertical column, spaced by separation and sized by each child's size_flags.

Linting

Strict parsing format-checks the inherited set (1 inherited from BoxContainer, 53 inherited from Control, 16 inherited from CanvasItem, 10 inherited from Node); VBoxContainer declares none of its own. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032). VBoxContainer also REFUSES vertical, which its base declares but this class cannot carry.

PropertyAcceptsOut of range
verticalnot available on this type
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-canvasitem-clip-ancestry (type-family match)canvasitem-ancestor-clips-childrenwarning
canvasitem-ancestor-is-canvasgroupwarning
valid-control-properties (type-family match)control-tooltip-ignored-by-mouse-filterwarning
control-property-orderwarning

alignment goes through parseOptionalInt, so an absent or unparseable value becomes undefined with no warning and maps to flex-start, Godot's BEGIN default. A missing theme_override_constants/separation takes the Component's default of 4 px, Godot's own.

VehicleBody3D

renders as an invisible transform-only group docs ↗ source ↗ unit-physics-vehicle.tscn ↗ Linter only
Godot render of VehicleBody3D Our render of VehicleBody3D
Godot 4.6.3 Ours

A RigidBody3D whose motion comes from its VehicleWheel3D children. It has no visual of its own in either engine, so the previewer mounts it as a transform-only group (ADR-0008). The chassis and wheels on screen are its children's meshes.

Linting

Strict parsing format-checks these VehicleBody3D properties, plus 23 inherited from RigidBody3D, 6 inherited from PhysicsBody3D, 6 inherited from CollisionObject3D, 17 inherited from Node3D, 10 inherited from Node. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

PropertyAcceptsOut of range
brakefloat
engine_forcefloat
steeringradians, -180° to 180°warning
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-node3d-visibility (type-family match)valid-node3d-visibilityerror
valid-collisionobject3d-scale (type-family match)collisionobject3d-non-uniform-scalewarning
valid-rigidbody3d (type-family match)rigidbody3d-max-contacts-without-monitorinfo
rigidbody3d-scale-overridden-at-runtimewarning
valid-collisionobject3d (type-family match)collisionobject3d-needs-collision-shapewarning
valid-vehiclebody3dvehiclebody3d-needs-wheelsinfo

VehicleBody3D reuses parseNode3D directly, so mass, engine_force, brake and steering are never read by the lenient parser. Its validator set is inherited: every RigidBody3D property is format-checked on a vehicle body too.

VehicleWheel3D

renders as a transform group with a selection-gated wheel gizmo docs ↗ source ↗ unit-physics-vehicle.tscn ↗ Done
Godot render of VehicleWheel3D Our render of VehicleWheel3D
Godot 4.6.3 Ours

VehicleWheel3D positions one wheel of a VehicleBody3D. It draws no geometry at runtime in either engine. The previewer mounts it as a transform group (ADR-0008) whose child mesh is the visible wheel. Each wheel lands at the same point in both frames.

Linting

Strict parsing format-checks these VehicleWheel3D properties, plus 17 inherited from Node3D, 10 inherited from Node. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

PropertyAcceptsOut of range
brakefloat
damping_compressionfloat
damping_relaxationfloat
engine_forcefloat
steeringradians, -180° to 180°warning
suspension_max_forcefloat
suspension_stiffnessfloat
suspension_travelfloat
use_as_steeringtrue or false
use_as_tractiontrue or false
wheel_friction_slipfloat
wheel_radiusfloat
wheel_rest_lengthfloat
wheel_roll_influencefloat
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-node3d-visibility (type-family match)valid-node3d-visibilityerror
valid-vehiclewheel3dvehiclewheel3d-not-under-vehicle-bodywarning

The lenient parser reads every strict-validated property, and an unauthored key stays undefined rather than taking Godot's default at parse time. The defaults are substituted where the value is consumed. The gizmo falls back to wheel_radius = 0.5 and wheel_rest_length = 0.15. The damping-pair rule compares against damping_compression = 0.83 and damping_relaxation = 0.88.

Known limitations

  • Editor only Godot's editor draws the wheel gizmo for every wheel, but here it draws only for the selected node (ADR-0018).

VFlowContainer

renders as children flowed down a column, wrapping to a new column docs ↗ source ↗ unit-v-flow-container.tscn ↗ Unreviewed
Comparison images not captured yet for VFlowContainer.

VFlowContainer is a FlowContainer fixed to the vertical axis. Children flow top to bottom and wrap to a new column when the current one runs out of height. It draws nothing itself. A right-to-left layout_direction mirrors the column order, and cancels with reverse_fill when both are set.

Linting

Strict parsing format-checks the inherited set (3 inherited from FlowContainer, 53 inherited from Control, 16 inherited from CanvasItem, 10 inherited from Node); VFlowContainer declares none of its own. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032). VFlowContainer also REFUSES vertical, which its base declares but this class cannot carry.

PropertyAcceptsOut of range
verticalnot available on this type
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-canvasitem-clip-ancestry (type-family match)canvasitem-ancestor-clips-childrenwarning
canvasitem-ancestor-is-canvasgroupwarning
valid-control-properties (type-family match)control-tooltip-ignored-by-mouse-filterwarning
control-property-orderwarning

index.ts reuses FlowContainer's parser directly, which never reads vertical. A scene carrying that key parses silently, with no error and no stored value. The solver reads this node's own type, not the property, to fix its orientation as vertical.

Known limitations

  • Approximated A TextureRect child with a Fit expand mode inside a multi-line flow is sized like any other child, where Godot keeps its previous frame's size.

VideoStreamPlayer

renders as nothing (no decoded frame ever reaches it) docs ↗ source ↗ unit-video-stream-player.tscn ↗ Unreviewed
Comparison images not captured yet for VideoStreamPlayer.

A Control that plays a VideoStream and draws the decoded frame into its rect. Nothing in this previewer decodes a VideoStream, so NOTIFICATION_DRAW's texture check never passes and the node draws nothing. Godot draws the same before a stream's first frame arrives. Its children still show.

Linting

Strict parsing format-checks these VideoStreamPlayer properties, plus 53 inherited from Control, 16 inherited from CanvasItem, 10 inherited from Node. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

PropertyAcceptsOut of range
audio_trackinteger 0-128warning
autoplaytrue or false
buffering_msecinteger 10-1000warning
busquoted string or &"name"
expandtrue or false
looptrue or false
pausedtrue or false
speed_scalefloat >= 0error below
streamnull, SubResource("id"), ExtResource("id") or Resource("path")
volume_dbfloat -80-24error below, warning above
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-canvasitem-clip-ancestry (type-family match)canvasitem-ancestor-clips-childrenwarning
canvasitem-ancestor-is-canvasgroupwarning
valid-control-properties (type-family match)control-tooltip-ignored-by-mouse-filterwarning
control-property-orderwarning

The lenient parser reads VideoStreamPlayer through parseControl. It keeps the layout keys and ignores all ten playback keys, so a malformed volume_db is dropped with no fallback and no warning.

Known limitations

  • Not drawn The previewer has no video decoder, so texture never resolves and the node draws nothing, not even a debug outline.

VisibleOnScreenEnabler2D

renders as nothing (a transform-only group) docs ↗ source ↗ unit-visible-on-screen-enabler-2d.tscn ↗ Linter only
No visual output — this node draws nothing to compare.

Switches another node's process_mode on and off as its rect enters and leaves the screen. It draws nothing at runtime in Godot either, so the previewer renders it as a transform-only group (ADR-0008) and its children still show.

Linting

Strict parsing format-checks these VisibleOnScreenEnabler2D properties, plus 2 inherited from VisibleOnScreenNotifier2D, 12 inherited from Node2D, 16 inherited from CanvasItem, 10 inherited from Node. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

PropertyAcceptsOut of range
enable_modeenum 0-2 (ENABLE_MODE_INHERIT/ENABLE_MODE_ALWAYS/ENABLE_MODE_WHEN_PAUSED)warning
enable_node_pathNodePath("path/to/node")
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-canvasitem-clip-ancestry (type-family match)canvasitem-ancestor-clips-childrenwarning
canvasitem-ancestor-is-canvasgroupwarning

The lenient parser reuses the base parser and keeps every key in rawProperties verbatim. A malformed enable_mode is neither substituted nor dropped, so it reaches the inspector exactly as written while strict reports it.

VisibleOnScreenEnabler3D

renders as nothing (a transform-only group) docs ↗ source ↗ unit-visible-on-screen-enabler-3d.tscn ↗ Linter only
No visual output — this node draws nothing to compare.

Switches another node's process_mode on and off as this node's box enters and leaves the screen. It draws nothing at runtime in Godot either, so the previewer renders it as a transform-only group (ADR-0008).

Linting

Strict parsing format-checks these VisibleOnScreenEnabler3D properties, plus 1 inherited from VisibleOnScreenNotifier3D, 1 inherited from VisualInstance3D, 17 inherited from Node3D, 10 inherited from Node. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

PropertyAcceptsOut of range
enable_modeenum 0-2 (ENABLE_MODE_INHERIT/ENABLE_MODE_ALWAYS/ENABLE_MODE_WHEN_PAUSED)warning
enable_node_pathNodePath("path/to/node")
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-node3d-visibility (type-family match)valid-node3d-visibilityerror

The lenient parser reuses the base parser and keeps every key in rawProperties verbatim, so a malformed enable_mode is neither substituted nor dropped. It survives into the inspector as written while the strict parser reports it.

VisibleOnScreenNotifier2D

renders as nothing (a transform-only group) docs ↗ source ↗ unit-visible-on-screen-notifier-2d.tscn ↗ Linter only
No visual output — this node draws nothing to compare.

Emits screen_entered and screen_exited as its rect enters and leaves the screen. It draws nothing at runtime, so the previewer renders it as a transform-only group (ADR-0008) and its children still show.

Linting

Strict parsing format-checks these VisibleOnScreenNotifier2D properties, plus 12 inherited from Node2D, 16 inherited from CanvasItem, 10 inherited from Node. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

PropertyAcceptsOut of range
rectRect2(x, y, w, h), or the Rect2i spelling Godot converts
show_recttrue or false
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-canvasitem-clip-ancestry (type-family match)canvasitem-ancestor-clips-childrenwarning
canvasitem-ancestor-is-canvasgroupwarning

The lenient parser (parseNode2D) never reads rect or show_rect, since neither affects rendering. A malformed value is ignored silently rather than substituted, and only strict reports it.

Known limitations

  • Editor only The translucent magenta rect fill appears only in Godot's editor, but here it is absent.

VisibleOnScreenNotifier3D

renders as nothing (a transform-only group) docs ↗ source ↗ unit-visible-on-screen-notifier-3d.tscn ↗ Linter only
No visual output — this node draws nothing to compare.

Reports whether its aabb is on screen through screen_entered and screen_exited signals. It draws nothing at runtime, so the previewer renders it as a transform-only group (ADR-0008). Unlike its 2D sibling, this class has no draw call at all.

Linting

Strict parsing format-checks these VisibleOnScreenNotifier3D properties, plus 1 inherited from VisualInstance3D, 17 inherited from Node3D, 10 inherited from Node. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

PropertyAcceptsOut of range
aabbAABB(x, y, z, w, h, d)
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-node3d-visibility (type-family match)valid-node3d-visibilityerror

The lenient parser (parseNode3D) never reads aabb, so a malformed value is ignored rather than substituted or reported. layers is inherited from VisualInstance3D and is covered on that sheet.

VisualInstance3D

renders as a transform-only group docs ↗ source ↗ unit-visual-instance-3d.tscn ↗ Linter only
No visual output — this node draws nothing to compare.

The base class every mesh-like 3D leaf inherits from. It gives them render layers and an AABB but draws nothing itself, so the previewer renders it as a transform-only group (ADR-0008).

Linting

Strict parsing format-checks these VisualInstance3D properties, plus 17 inherited from Node3D, 10 inherited from Node. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

PropertyAcceptsOut of range
layers32-bit layer mask (layers 1-32)
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-node3d-visibility (type-family match)valid-node3d-visibilityerror

A non-numeric or negative layers fails strict validation. The lenient parser reads layers on top of the Node3D fields. A malformed value keeps Godot's default, layer 1, with no warning. A Decal's cull_mask and a ReflectionProbe's cull_mask and reflection_mask test it.

VoxelGI

renders as an invisible transform-only fallback docs ↗ source ↗ unit-voxel-gi.tscn ↗ Not implemented
Comparison images not captured yet for VoxelGI.

A real-time global illumination probe that bakes indirect light from static geometry into an octree. The previewer parses and validates it but does not run the bake or draw the probe volume, so it mounts as an invisible transform-only group.

Linting

Strict parsing format-checks these VoxelGI properties, plus 1 inherited from VisualInstance3D, 17 inherited from Node3D, 10 inherited from Node. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

PropertyAcceptsOut of range
camera_attributesnull, SubResource("id"), ExtResource("id") or Resource("path")
datanull, SubResource("id"), ExtResource("id") or Resource("path")
sizeVector3(x, y, z), each float >= 1error below
subdivenum 0-3 (SUBDIV_64/SUBDIV_128/SUBDIV_256/SUBDIV_512)error
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-node3d-visibility (type-family match)valid-node3d-visibilityerror
valid-voxelgi-datavoxelgi-missing-datawarning

The lenient parser reuses parseNode3D, which reads only transform and visible. A malformed subdiv or size sits untouched in the raw property bag with no substitution, since nothing here draws from it.

Known limitations

  • Not drawn Godot lights dynamic objects from the baked probe, but the previewer applies no indirect light from it.

VScrollBar

renders as a vertical track with a rectangular grabber docs ↗ source ↗ unit-v-scroll-bar.tscn ↗ Done
Godot render of VScrollBar Our render of VScrollBar
Godot 4.6.3 Ours

A vertical scroll bar: a track with a draggable grabber, minimum at the top and maximum at the bottom. The previewer draws the track and the grabber, sized and positioned from this bar's own value, min_value, max_value and page. Godot's own default theme sets every increment and decrement icon to an empty texture, so neither Godot nor the previewer draws step buttons.

Linting

Strict parsing format-checks the inherited set (1 inherited from ScrollBar, 9 inherited from Range, 53 inherited from Control, 16 inherited from CanvasItem, 10 inherited from Node); VScrollBar declares none of its own. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-canvasitem-clip-ancestry (type-family match)canvasitem-ancestor-clips-childrenwarning
canvasitem-ancestor-is-canvasgroupwarning
valid-control-properties (type-family match)control-tooltip-ignored-by-mouse-filterwarning
control-property-orderwarning
valid-range-bounds (type-family match)range-max-below-minerror
range-exp-edit-negative-minwarning

The lenient parser is parseVScrollBar, which reuses the shared Range reader for value, min_value, max_value and page, plus its own custom_step. A malformed number becomes undefined and the bar falls back to Godot's own Range defaults: min 0, max 100, value 0, page 0. custom_step never reaches a draw formula, so a malformed one stays harmless here too.

VSeparator

renders as a thin vertical quad docs ↗ source ↗ unit-v-separator.tscn ↗ Unreviewed
Comparison images not captured yet for VSeparator.

VSeparator draws the default theme's separator StyleBoxLine (or a resolved theme_override_styles/separator override) as a thin vertical band, centred on the cross axis and sized by the separation theme constant.

Linting

Strict parsing format-checks the inherited set (53 inherited from Control, 16 inherited from CanvasItem, 10 inherited from Node); VSeparator declares none of its own. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-canvasitem-clip-ancestry (type-family match)canvasitem-ancestor-clips-childrenwarning
canvasitem-ancestor-is-canvasgroupwarning
valid-control-properties (type-family match)control-tooltip-ignored-by-mouse-filterwarning
control-property-orderwarning

VSeparator declares no property of its own, and index.ts reuses parseControl unchanged. The two theme overrides are Control's generic theme_override_* wildcards, so strict and lenient parsing agree on every key here.

VSlider

renders as a vertical track with a round grabber docs ↗ source ↗ unit-vslider.tscn ↗ Done
Godot render of VSlider Our render of VSlider
Godot 4.6.3 Ours

VSlider is a vertical slider over a Range, measured from the bottom: min_value puts the grabber at the bottom and the fill grows upward. The previewer draws the same four parts as HSlider.

Linting

Strict parsing format-checks the inherited set (5 inherited from Slider, 9 inherited from Range, 53 inherited from Control, 16 inherited from CanvasItem, 10 inherited from Node); VSlider declares none of its own. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-canvasitem-clip-ancestry (type-family match)canvasitem-ancestor-clips-childrenwarning
canvasitem-ancestor-is-canvasgroupwarning
valid-control-properties (type-family match)control-tooltip-ignored-by-mouse-filterwarning
control-property-orderwarning
valid-range-bounds (type-family match)range-max-below-minerror
range-exp-edit-negative-minwarning
vslider-property-ordervslider-property-orderwarning

The lenient parser has no strict counterpart for the Range and Slider keys. An unparseable value, min_value or max_value becomes undefined, and Godot's defaults of 0, 0 and 100 apply. A misspelt value then draws the grabber at the bottom. Out-of-range values are clamped silently, as the engine does.

VSplitContainer

renders as two children stacked, split at a computed offset docs ↗ source ↗ unit-split-container-vertical.tscn ↗ Done
Godot render of VSplitContainer Our render of VSplitContainer
Godot 4.6.3 Ours

VSplitContainer stacks its children, split where each entry of split_offsets puts that boundary, with the dragger's band between them.

Linting

Strict parsing format-checks the inherited set (10 inherited from SplitContainer, 53 inherited from Control, 16 inherited from CanvasItem, 10 inherited from Node); VSplitContainer declares none of its own. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032). VSplitContainer also REFUSES vertical, which its base declares but this class cannot carry.

PropertyAcceptsOut of range
verticalnot available on this type
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-canvasitem-clip-ancestry (type-family match)canvasitem-ancestor-clips-childrenwarning
canvasitem-ancestor-is-canvasgroupwarning
valid-control-properties (type-family match)control-tooltip-ignored-by-mouse-filterwarning
control-property-orderwarning

Identical to HSplitContainer's. The three properties SplitContainer adds are plain scalars Godot clamps or ignores at layout time. A malformed split_offset leaves the property undefined, and the Godot default of 0 applies.

Window

renders as nothing yet, not implemented docs ↗ source ↗ unit-window.tscn ↗ Not implemented
Comparison images not captured yet for Window.

The node that creates a window, and the base of AcceptDialog, ConfirmationDialog, Popup, PopupMenu, PopupPanel and FileDialog. The previewer parses and validates it but does not draw it. The base Node mounts under renderIntent: 'pending' as an empty group, and its children still show (ADR-0045).

Linting

Strict parsing format-checks these Window properties, plus 47 inherited from Viewport, 10 inherited from Node. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

PropertyAcceptsOut of range
accessibility_descriptionquoted string, or the &"…" StringName or NodePath("…") it converts
accessibility_namequoted string, or the &"…" StringName or NodePath("…") it converts
always_on_toptrue or false
borderlesstrue or false
content_scale_aspectenum 0-4 (IGNORE/KEEP/KEEP_WIDTH/KEEP_HEIGHT/EXPAND)warning
content_scale_factorfloat 0.5-8error at or below 0, warning below 0.5, warning above 8
content_scale_modeenum 0-2 (DISABLED/CANVAS_ITEMS/VIEWPORT)warning
content_scale_sizeVector2i(x, y), both >= 0, or the Vector2 spelling Godot convertserror below
content_scale_stretchenum 0-1 (FRACTIONAL/INTEGER)warning
current_screeninteger >= 0warning below
exclude_from_capturetrue or false
exclusivetrue or false
extend_to_titletrue or false
force_nativetrue or false
initial_positionenum 0-5 (ABSOLUTE/CENTER_PRIMARY_SCREEN/CENTER_MAIN_WINDOW_SCREEN/CENTER_OTHER_SCREEN/CENTER_SCREEN_WITH_MOUSE_FOCUS/CENTER_SCREEN_WITH_KEYBOARD_FOCUS)warning
keep_title_visibletrue or false
max_sizeVector2i(x, y), both >= 0, or the Vector2 spelling Godot convertserror below
maximize_disabledtrue or false
min_sizeVector2i(x, y), both >= 0, or the Vector2 spelling Godot convertserror below
minimize_disabledtrue or false
modeenum 0-4 (WINDOWED/MINIMIZED/MAXIMIZED/FULLSCREEN/EXCLUSIVE_FULLSCREEN)warning
mouse_passthroughtrue or false
mouse_passthrough_polygonPackedVector2Array(x, y, …)
nonclient_areaRect2i(x, y, w, h), or the Rect2 spelling Godot converts
popup_windowtrue or false
popup_wm_hinttrue or false
positionVector2i(x, y), or the Vector2 spelling Godot converts
sharp_cornerstrue or false
sizeVector2i(x, y), both >= 0, or the Vector2 spelling Godot convertserror below
themenull, SubResource("id"), ExtResource("id") or Resource("path")
theme_override_colors/*Color(r, g, b, a), or the colour string or int it converts
theme_override_constants/*integer -16384-16384warning
theme_override_font_sizes/*integer >= 1warning below
theme_override_fonts/*null, SubResource("id"), ExtResource("id") or Resource("path")
theme_override_icons/*null, SubResource("id"), ExtResource("id") or Resource("path")
theme_override_styles/*null, SubResource("id"), ExtResource("id") or Resource("path")
theme_type_variationquoted string or &"name"
titlequoted string, or the &"…" StringName or NodePath("…") it converts
transienttrue or false
transient_to_focusedtrue or false
transparenttrue or false
unfocusabletrue or false
unresizabletrue or false
visibletrue or false
wrap_controlstrue or false
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-window-properties (type-family match)window-max-size-below-min-sizeinfo
window-size-clamped-by-limitswarning
window-content-scale-factor-flooredwarning

The lenient parser registers the plain Node reader, which reads only the heading attributes and an optional transform. A malformed mode or any other Window key is never read, substituted or reported, and the node mounts as the same empty group either way.

Known limitations

  • Not drawn Godot displays the window and its Control children at runtime, but the previewer draws nothing for it.

WorldEnvironment

renders as the scene's background and environment lighting docs ↗ source ↗ unit-world-environment-basic.tscn ↗ Done
Godot render of WorldEnvironment Our render of WorldEnvironment
Godot 4.6.3 Ours

Applies the scene's Environment resource to the whole view and draws no geometry of its own. Here the Environment sets a flat dark-navy background and bluish volumetric fog, which hazes the background and washes out the boxes with distance. The previewer draws both and renders the node's children. The first WorldEnvironment with a valid Environment applies. One that names none, or a .tres that fails to load, leaves the view with no Environment: the project's clear colour under the LINEAR curve.

Linting

Strict parsing format-checks these WorldEnvironment properties, plus 10 inherited from Node. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

PropertyAcceptsOut of range
camera_attributesnull, SubResource("id"), ExtResource("id") or Resource("path")
compositornull, SubResource("id"), ExtResource("id") or Resource("path")
environmentnull, SubResource("id"), ExtResource("id") or Resource("path")
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-worldenvironmentworldenvironment-requires-environmentwarning
single-worldenvironmentwarning

Both properties are assigned straight from the raw string with no format or resource-existence check. An absent environment falls back to '' rather than raising strict's missing-environment warning, and an absent camera_attributes stays undefined.

XRAnchor3D

renders as nothing (a transform-only group) docs ↗ source ↗ unit-xr-anchor-3d.tscn ↗ Linter only
No visual output — this node draws nothing to compare.

An AR anchor that maps a real-world location into the game world. It draws nothing at runtime, so the previewer renders it as a transform-only group (ADR-0008) and its children still show.

Linting

Strict parsing format-checks the inherited set (3 inherited from XRNode3D, 17 inherited from Node3D, 10 inherited from Node); XRAnchor3D declares none of its own. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-node3d-visibility (type-family match)valid-node3d-visibilityerror
valid-xrnode3d (type-family match)xrnode3d-parent-not-xrorigin3dwarning
xrnode3d-no-pose-setwarning

XRAnchor3D reuses parseNode3D, which reads only transform and visible. A malformed inherited tracker, say with the quotes dropped, parses through silently, since nothing downstream reads the key.

XRBodyModifier3D

renders as nothing yet, Godot poses bones from an XR body tracker, the previewer does not docs ↗ source ↗ unit-xr-body-modifier-3d.tscn ↗ Not implemented
No visual output — this node draws nothing to compare.

Poses the bones of its parent Skeleton3D from an XRBodyTracker registered with XRServer. With no headset there is no tracker to read, so the drive is a gap here (ADR-0045).

Linting

Strict parsing format-checks these XRBodyModifier3D properties, plus 2 inherited from SkeletonModifier3D, 17 inherited from Node3D, 10 inherited from Node. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

PropertyAcceptsOut of range
body_trackerquoted string or &"name"
body_updatebit mask of BODY_UPDATE_UPPER_BODY (1) | BODY_UPDATE_LOWER_BODY (2) | BODY_UPDATE_HANDS (4)
bone_updateenum 0-1 (BONE_UPDATE_FULL/BONE_UPDATE_ROTATION_ONLY)error
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-node3d-visibility (type-family match)valid-node3d-visibilityerror
valid-skeletonmodifier3d-parent (type-family match)skeletonmodifier3d-parent-not-skeleton3dwarning

XRBodyModifier3D registers parseNode3D directly, so body_tracker, body_update and bone_update are never read by the lenient parser and a malformed value is dropped with no fallback. Strict errors on bone_update = 2, which Godot's setter refuses, and only warns on an unlisted body_update bit.

Known limitations

  • Needs runtime Godot poses the skeleton from a live XR body tracker, but here nothing moves.

XRCamera3D

renders as a selection-gated frustum gizmo, as Camera3D docs ↗ source ↗ unit-xr-camera-3d.tscn ↗ Unreviewed
No visual output — this node draws nothing to compare.

The headset's eye, which XRServer drives from tracking data at runtime. It is a Camera3D, and the previewer treats it as one: the same selection-gated frustum gizmo (ADR-0018) from the same component.

Linting

Strict parsing format-checks the inherited set (15 inherited from Camera3D, 17 inherited from Node3D, 10 inherited from Node); XRCamera3D declares none of its own. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-node3d-visibility (type-family match)valid-node3d-visibilityerror
valid-camera3d-properties (type-family match)camera3d-multiple-currentinfo
camera3d-invalid-clipping-planeserror
camera3d-zero-depth-rangewarning
valid-xrcamera3d-parentxrcamera3d-parent-not-xrorigin3dwarning

XRCamera3D has no linterParser.ts of its own, so strict parsing validates whatever Node3D and Camera3D declare. A malformed inherited transform is a strict error, while the lenient parseCamera3D, through parseNode3D, keeps rendering with the identity transform.

Known limitations

  • Editor only The frustum gizmo draws only for the selected node, so a plain capture shows nothing for the camera.

XRController3D

renders as nothing (a transform-only group) docs ↗ source ↗ unit-xr-controller-3d.tscn ↗ Linter only
No visual output — this node draws nothing to compare.

A helper node that tracks a spatially tracked controller and exposes its button and axis state. It draws nothing at runtime, so the previewer renders it as a transform-only group (ADR-0008) and its children still show.

Linting

Strict parsing format-checks the inherited set (3 inherited from XRNode3D, 17 inherited from Node3D, 10 inherited from Node); XRController3D declares none of its own. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-node3d-visibility (type-family match)valid-node3d-visibilityerror
valid-xrnode3d (type-family match)xrnode3d-parent-not-xrorigin3dwarning
xrnode3d-no-pose-setwarning

XRController3D reuses parseNode3D, which reads only transform and visible. A malformed inherited tracker, say with the quotes dropped, parses through silently, since nothing downstream reads the key.

XRFaceModifier3D

renders as nothing yet, Godot writes tracked face poses into blend shapes, the previewer does not docs ↗ source ↗ unit-xr-face-modifier-3d.tscn ↗ Not implemented
No visual output — this node draws nothing to compare.

Drives a MeshInstance3D's blend shapes from a live XRFaceTracker. Only a live XR session feeds it, and the previewer runs no session, so the drive is a gap (ADR-0045). The target mesh shows at the blend-shape values the scene file states.

Linting

Strict parsing format-checks these XRFaceModifier3D properties, plus 17 inherited from Node3D, 10 inherited from Node. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

PropertyAcceptsOut of range
face_trackerquoted string or &"name"
targetNodePath("path/to/node")
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-node3d-visibility (type-family match)valid-node3d-visibilityerror

The lenient parser reads the node through parseNode3D, so a malformed face_tracker or target is kept as opaque text with no substitution. There is no tracked blend weight to fall back to either way.

XRHandModifier3D

renders as nothing yet, Godot poses bones from an XR hand tracker, the previewer does not docs ↗ source ↗ unit-xr-hand-modifier-3d.tscn ↗ Not implemented
No visual output — this node draws nothing to compare.

Poses the bones of its parent Skeleton3D from an XRHandTracker's joint data. With no headset there is no tracker to read, so the drive is a gap here (ADR-0045). Its children show at the pose the scene file states.

Linting

Strict parsing format-checks these XRHandModifier3D properties, plus 2 inherited from SkeletonModifier3D, 17 inherited from Node3D, 10 inherited from Node. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

PropertyAcceptsOut of range
bone_updateenum 0-1 (FULL/ROTATION_ONLY)error
hand_trackerquoted string or &"name"
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-node3d-visibility (type-family match)valid-node3d-visibilityerror
valid-skeletonmodifier3d-parent (type-family match)skeletonmodifier3d-parent-not-skeleton3dwarning

XRHandModifier3D reuses parseNode3D, which reads only transform and visible, so hand_tracker and bone_update are never recorded and there is no fallback. A bone_update = 2 that Godot's setter refuses outright is carried through untouched, and only strict reports it.

Known limitations

  • Needs runtime Godot poses the hand from a live XR tracker, but here nothing moves.

XRNode3D

renders as nothing (a transform-only group) docs ↗ source ↗ unit-xr-node-3d.tscn ↗ Linter only
No visual output — this node draws nothing to compare.

The base for XR-tracked nodes. A tracker drives its transform at runtime, and it draws nothing itself. The previewer renders it as a transform-only group (ADR-0008), and its children still show.

Linting

Strict parsing format-checks these XRNode3D properties, plus 17 inherited from Node3D, 10 inherited from Node. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

PropertyAcceptsOut of range
posequoted string or &"name"
show_when_trackedtrue or false
trackerquoted string or &"name"
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-node3d-visibility (type-family match)valid-node3d-visibilityerror
valid-xrnode3d (type-family match)xrnode3d-parent-not-xrorigin3dwarning
xrnode3d-no-pose-setwarning

XRNode3D reuses parseNode3D, which reads only transform and visible. It never looks at tracker, pose or show_when_tracked, so a malformed tracker = left_hand with the quotes dropped parses through silently.

XROrigin3D

renders as nothing (a transform-only group) docs ↗ source ↗ unit-xr-origin-3d.tscn ↗ Linter only
No visual output — this node draws nothing to compare.

Maps the real-world tracking-space centre into the game world. Every XRCamera3D, XRController3D and XRAnchor3D should sit under it. It draws nothing itself, so the previewer renders it as a transform-only group (ADR-0008).

Linting

Strict parsing format-checks these XROrigin3D properties, plus 17 inherited from Node3D, 10 inherited from Node. A malformed value is always an error; a value that is merely outside a bound is an error only where Godot's setter refuses it, and a warning where only the property's inspector hint states the bound (ADR-0032).

PropertyAcceptsOut of range
currenttrue or false
world_scalefloat 0.01-1000error below 0.01, error above 1000
RuleReportsSeverity
binary-resource-reference (all nodes)binary-resource-referenceinfo
valid-node3d-visibility (type-family match)valid-node3d-visibilityerror
valid-xrorigin3dxrorigin3d-missing-camera-childwarning
xrorigin3d-unsupported-scalewarning

The xrorigin3d-missing-camera-child rule stays silent when a child's class lives elsewhere. An instance= node, or a class the pinned catalog does not list, may be an XRCamera3D.

world_scale is clamped to [0.01, 1000] by XRServer::set_world_scale, so a value past the clamp is a strict error. The lenient parseNode3D never reads world_scale or current, so a malformed or out-of-range value parses through silently.