Creating Entities

To place a custom entity in Blender, you first need to define and export it from your Godot project. This page covers both authoring paths and all the property and gizmo features available.


Two Authoring Paths

There are two ways to expose an entity to Blender. Both produce identical output.

Entity Wizard Code
How Create an EntityDefinition .tres and configure it in the wizard Override _export_entity_props() in the entity script
Best for Non-programmers, standalone assets, quick iteration Properties needing runtime logic, inline providers, tight script coupling
Stored in .tres file GDScript, version-controlled with the entity

Code-path entities still appear in the wizard sidebar, but as read-only entries. To edit them, open the source script.


Entity Wizard

The Entity Wizard lives in the Entities tab of the Godot main screen. It controls which properties an entity exposes to Blender and which gizmos are drawn for each instance in the viewport.

Entity Wizard overview

Step 1 - Pick a Source

Click New Definition in the toolbar and choose where to save the new EntityDefinition .tres.

Note

Save entity definitions inside paths scanned by Liminal during export. Configure these in Project Settings›Liminal Editor›Entity Directories.

Then pick one of three source modes:

Script and Scene modes store a UID reference internally, so the .tres stays valid even if the script or scene is moved.

Step 2 - Select Properties

The wizard lists every property found on the source. Check the ones to expose in Blender. Checked properties sort to the top of the list automatically, so frequently used props are always visible without scrolling.

Step 3 - Apply

Click Apply. The resource is saved and the manifest can be regenerated.


Property Types

All basic property types are supported. Blender's property inspector picks an appropriate widget for each.

Type Editor in Blender
bool Checkbox
int / float Number field
string Text field
Color Color picker
Vector3 Three-component number field
source Text field (the entity's name)
destination Text field with Pick button
choices Dropdown

Source and Destination

source and destination are special string types that link entities together.

When a destination property is set, Liminal draws a 3D arrow in the viewport from the source entity to the destination entity. This visualises the logic graph and keeps wiring legible at a glance.

The Pick button next to a destination field opens a dropdown listing every source name currently in the scene.

Example. A lever entity with a destination property pointing at a door entity. Pulling the lever in the game opens the door.

Note

Liminal does not impose any architecture on how gameplay mechanics consume these connections. The names travel into Godot as plain string properties; how to handle them is up to your gameplay code. See the Liminal Editor Showcase project for implementation examples.


Choices

A choices property shows a dropdown in Blender populated at export time. The dropdown is most useful for enums, but you can drive it with any provider that returns a list of label/value pairs.

When the .lm file is imported, Liminal resolves the stored label back to its Godot-native value using a snapshot baked into entities.json - no provider code runs at import time.

Built-in Providers

Provider What it returns
LMChoicesStatic A fixed, manually entered list. Good for states, modes, difficulty tiers, or any closed set
LMChoicesResourceType Every resource in a directory whose type matches a class name (built-in or custom). Subclasses included
LMChoicesFileGlob Every file in a directory matching one or more glob patterns. Returns either raw res:// paths or loads them as Resource

Example. An ambient sound entity exposes a clip property as choices. The provider scans an audio assets directory for .ogg and .wav files. Level designers pick a clip from the dropdown in Blender.

Custom Providers

Subclass LMChoicesProvider and override get_choices() to return an array of { "label": String, "value": Variant } dictionaries. Save as a .tres file and assign it to any choices property.

class_name MyCustomProvider extends LMChoicesProvider

func get_choices() -> Array[Dictionary]:
    var result: Array[Dictionary] = []
    for f in DirAccess.get_files_at("res://assets/sfx/"):
        result.append({ "label": f.get_basename(), "value": "res://assets/sfx/" + f })
    return result

Note

Providers are manifest-generation-only. They run when you export definitions from the Godot editor. The snapshot baked into entities.json is what the importer reads.


Gizmos

Gizmos are visual shapes drawn in the Blender viewport to represent an entity's spatial influence, range, or orientation. They are purely cosmetic - they help the level designer see what an entity does without cluttering the scene with real geometry.

Typical uses: a light's radius, a trigger zone's volume, a camera's frustum, a turret's aim cone, a label showing a live property value.

Gizmos live in the entity definition, not in the scene. Adding or changing a gizmo declaration and reloading the manifest in Blender updates every instance at once.

Defining Gizmos

In the wizard's right column, click + Add Gizmo to append a row. Each row has:

An entity can have any number of gizmos. They are drawn independently, each with its own type, size, color, and offset.


Gizmo Types

sphere

A wireframe sphere centred on the entity origin.

sphere gizmo

Field Default Description
radius 1.0 Sphere radius (units)

arrow

A line with an arrowhead pointing along the entity's forward direction (-Z in Godot / +Y in Blender). Use this for facing, aim direction, or signal targets.

arrow gizmo

Field Default Description
length 1.0 Arrow shaft length (units)

cone

A cone opening along the entity's forward direction. Useful for spotlights, view cones, and detection angles.

cone gizmo

Field Default Description
length 1.0 Cone depth (units)
angle 30.0 Half-angle (degrees)

box

A wireframe axis-aligned box centred on the entity origin (in local space).

box gizmo

Field Default Description
size 0.5 Half-size along each axis (uniform)

frustum

A camera-style frustum: near and far planes connected by four corner rays. Useful for cameras and projectors. Assumes a 16:9 aspect ratio.

frustum gizmo

Field Default Description
fov 60.0 Vertical FOV (degrees)
near 0.1 Near plane distance (units)
far 10.0 Far plane distance (units)

billboard

A square at the entity origin that always faces the viewport camera, whichever way you orbit. Use it for point lights, audio sources, spawn points and other entities with no direction of their own, where a sphere would swallow the space around them.

billboard gizmo

Field Default Description
size 0.3 Half-size of the square (units)
Texture none Image drawn on the square — any texture in your project
alpha 1.0 Opacity of that image (0–1)

Give it a Texture and the image is the gizmo: it fills the square and no outline is drawn around it, so a spawn point can carry a spawn icon and an ambient sound a speaker. Color tints the image, so a greyscale icon takes the class colour. Without a texture you get the plain square — wire, or translucent under Style solid.

The square keeps a fixed size in world units, so it shrinks with distance like every other gizmo.

volume

A translucent fill of the entity's own mesh body — not a procedural shape. It follows the actual geometry you author (including modifiers and edit-mode changes), so it's the right choice for trigger zones, ambient regions, and other brush-shaped volumes where you need to see the exact extent. Only renders for volume entities; on a non-volume entity it draws nothing. The wire outline comes from the object's own wireframe display.

volume gizmo

Field Default Description
color white Fill tint. Click to open a color picker, or bind it to a property
alpha 0.25 Fill opacity (0–1)
Texture none Tiling texture drawn over the fill — any texture in your project
Texels/m 128 Texture density in texels per metre

Volume textures. Pick any texture from your project and the fill carries it as a tiling label instead of a flat tint, so the volume announces what it is at a glance — a trigger brush reads TRIGGER from across the level. This belongs to the entity type, set once here: every volume of that class shows it, and level designers never assign anything.

The texture is projected from the volume's own object space and blended across all three axes, so it lands evenly on walls, floors and caps whatever shape the brush is, and stays locked to the brush when you rotate it.

Texels/m sets density in texels per metre rather than repeats, so the label comes out the same physical size on a doorway-sized trigger and a hangar-sized one. Lower the value to make the lettering larger.

The tint from color multiplies the texture, so per-class colour coding still works, and a greyscale tile takes the class colour cleanly. A volume with no texture set is unchanged.

Sync copies each texture a definition references into the Blender workspace, so any texture in your project works — including ones you keep with your own art.

Making your own labels. The plugin ships a set of ready volume textures (TRIGGER, CLIP, HURT, WATER, LADDER, SOUND, NAV BLOCK) under addons/liminal_editor/gizmo_textures/. For a label of your own, create a new LMIconTexture resource anywhere in your project and set its label — it generates the tile for you, so no image editor is involved:

Property Description
label The word stamped across the tile
size Tile resolution in pixels
ink_color Lettering colour — white by default so the gizmo colour tints it
text_fill How much of the tile width the lettering may use
text_border_width Halo drawn behind the letters, in pixels, clearing stripes underneath for readability; 0 disables it
text_border_color Halo colour
stripe_coverage Hazard stripe thickness; 0 removes the stripes
stripe_count Stripe repeats across the tile
stripe_color Stripe colour
stripe_flip Mirrors the diagonal
border Draws a frame inside the tile edge
border_color Border colour
border_width Border thickness in pixels
border_margin Gap between the tile edge and the border
background_alpha Opacity of the tile's base fill, behind the stripes and lettering

Keep your own resources outside addons/ — plugin folders are replaced when you update Liminal Editor.

text

A screen-space label drawn at the entity's location (offset by offset if set), in the gizmo's color.

text gizmo

Field Default Description
text - The string to display. Supports {{prop_name}} template tokens
size 11 Font size (pixels)

path

A polyline connecting the entity's child objects with line segments. Use it for patrol routes, waypoint chains, and any ordered sequence of points authored as children of the entity. Needs at least two children to draw anything; unlike the other gizmos it ignores offset/euler and instead reads each child's world position.

path gizmo

Field Default Description
mode hierarchy Child ordering. hierarchy follows the children's order in the scene; nearest walks greedily from the first child to the closest unvisited one each step
closed false When true (and there are at least three children), connects the last child back to the first to form a closed loop

Gizmo Bindings

Numeric and color gizmo fields can be bound to a checked entity property so the gizmo reflects the value set on each instance rather than a fixed literal.

Binding via Drag-and-Drop

Each gizmo property has a small white dot beside it.

In Godot

  1. Check the property you want to bind in the Properties column.
  2. In the Gizmos column, click and drag from the dot of the gizmo field.
  3. Drop onto the target property row. Valid drop targets highlight blue while you drag.

When a binding is active, the field's input control is replaced by a green → prop_name label. Click the × button to clear the binding and return to a literal value.

If the bound property does not exist on the object, or its value cannot be converted to the expected type, the field falls back to its default.

Text Template Tokens

The text gizmo's Text field uses {{prop_name}} template syntax instead of dot bindings. Any number of tokens can appear in the same string:

"Range: {{range}} m"          → "Range: 5.0 m"
"{{name}} ({{state}})"        → "door_01 (OPEN)"

If a referenced property does not exist on the object, the token is left as-is.


Code Path

For entities that manage their own exports in script, override _export_entity_props() and optionally _export_entity_gizmos():

func _export_entity_props() -> Array[Dictionary]:
    var ret = super()
    ret.append_array([
        { "name": "delay" },
        { "name": "target",     "type": "destination" },
        { "name": "targetname", "type": "source" },
        { "name": "sound_cue",  "choices": preload("res://my_sound_provider.tres") },
    ])
    return ret

func _export_entity_gizmos() -> Array:
    return [
        {"type": "sphere", "bindings": {"radius": "detection_range"}, "color": "#FF4400"},
        {"type": "arrow",  "length": "2.0"},
        {"type": "text",   "text": "Range: {{detection_range}}"},
    ]

Rules for _export_entity_props():


Applying Changes

Any change to an entity definition - via the wizard or in code - requires regenerating the manifest before Blender sees it.

In Godot

  1. In the Godot editor, click Export Definitions in the wizard toolbar (or Tools›Liminal Editor›Sync Workspace).

In Blender

  1. Open the LM Config panel and click Reload Manifest.