simvx.core.nodes_2d.text

Text2D – 2D text drawn through the one 2D text builder.

Module Contents

Classes

Text2D

Text placed in the 2D world like any other node. Works in both 2D and 3D modes.

API

class simvx.core.nodes_2d.text.Text2D(**kwargs)[source]

Bases: simvx.core.nodes_2d.node2d.Node2D

Text placed in the 2D world like any other node. Works in both 2D and 3D modes.

Text2D draws through the ONE 2D text builder (renderer.text): the item path emits a native kerned MSDF GLYPH item, and the Draw2D _draw_recursive walk (editor play-mode / web) appends a matching TEXT op – both from the same layout, so they render identically.

The renderer maps the run through the node’s full world transform, as it maps every 2D node’s drawing, and the active Camera2D pans and zooms it: an ancestor’s rotation turns it, and its scale sizes it, a non-uniform scale stretching the glyphs as it stretches a sprite. Text meant to stay on the screen, a HUD, goes under a :class:CanvasLayer, which pins its subtree to the screen and keeps it at its authored colour after tonemapping; without one, text in a scene with post-processing is exposed and tonemapped like the rest of the world.

Sizing: font_scale is a multiplier on the 16px logical em (font_scale=1 -> 16 logical px), before the node’s world scale. The builder’s readable-pixel floor clamps tiny text up to ~10px; a scaled label opts out of it, so its glyphs and its rect box shrink together, and a label scaled to nothing is hidden, as a sprite is.

Common port patterns are first-class node Properties:

  • outline / outline_colour – a readable halo on any background.

  • rect – position + align inside a box instead of at a point.

  • fit_to_width – shrink font_scale so the text fits rect width.

Initialization

text

‘Property(…)’

font_scale

‘Property(…)’

colour

‘Colour(…)’

align

‘Property(…)’

outline

‘Property(…)’

outline_colour

‘Colour(…)’

rect

‘Property(…)’

fit_to_width

‘Property(…)’

on_draw(renderer) → None[source]
position

‘_SpatialVecProperty(…)’

rotation

‘Property(…)’

scale

‘_SpatialVecProperty(…)’

top_level

‘Property(…)’

z_index

‘Property(…)’

z_as_relative

‘Property(…)’

render_layer

‘Property(…)’

set_render_layer(index: int, enabled: bool = True) → None
is_on_render_layer(index: int) → bool
property absolute_z_index: int
property rotation_degrees: float
property world_position: simvx.core.math.types.Vec2
property world_rotation: float
property world_scale: simvx.core.math.types.Vec2
property world_transform: tuple[simvx.core.math.types.Vec2, simvx.core.math.types.Vec2, float]
property forward: simvx.core.math.types.Vec2
property right: simvx.core.math.types.Vec2
translate(offset: tuple[float, float] | numpy.ndarray)
rotate(radians: float)
rotate_deg(degrees: float)
look_at(target: tuple[float, float] | numpy.ndarray)
to_global(point) → simvx.core.math.types.Vec2
to_local(point) → simvx.core.math.types.Vec2
transform_points(points: list[simvx.core.math.types.Vec2]) → list[simvx.core.math.types.Vec2]
wrap_screen(margin: float = 20)
post_processed

‘Property(…)’

property transform_render_dirty: bool
strict_errors: ClassVar[bool]

True

dev_checks: ClassVar[bool]

None

dev_warnings: ClassVar[bool]

None

freeze_check_interval: ClassVar[float]

1.0

dynamic: bool

False

visible

‘Property(…)’

update_mode

‘Property(…)’

focus_mode

‘Property(…)’

drag_threshold

‘Property(…)’

focus_entered

‘Signal(…)’

focus_exited

‘Signal(…)’

__properties__: ClassVar[dict[str, simvx.core.descriptors.Property]]

None

classmethod __init_subclass__(**kwargs)
property name: str
property visible_in_tree: bool
property input_player: simvx.core.input.players.InputPlayer
property input_context: simvx.core.input.contexts.InputContext | None
reset_error() → None
add_child(node: simvx.core.node.T) → simvx.core.node.T
remove_child(node: simvx.core.node.Node) → None
reparent(new_parent: simvx.core.node.Node)
node_at(path, default=_NO_DEFAULT)
find(target, *, direct: bool = False)
find_all(target, *, direct: bool = False)
expect(target, *, direct: bool = False)
ancestor(target)
walk(*, include_self: bool = True) → collections.abc.Iterator[simvx.core.node.Node]
property path: str
property is_scene_root: bool
add_to_group(group: str)
remove_from_group(group: str)
is_in_group(group: str) → bool
on_ready() → None
on_enter_tree() → None
on_exit_tree() → None
on_update(dt: float) → None
on_fixed_update(dt: float) → None
on_draw_3d(gizmos) → None
on_picked(event: simvx.core.input.events.PickEvent) → bool | None
on_gui_input(event: simvx.core.input.events.GuiInputEvent) → bool | None
start_coroutine(gen: simvx.core.descriptors.Coroutine) → simvx.core.descriptors.CoroutineHandle
stop_coroutine(gen_or_handle)
property focused: bool
property focus_rect: tuple[float, float, float, float] | None
drag_threshold_for(pointer_type: simvx.core.input.enums.PointerType | str) → float
grab_focus() → None
release_focus() → None
capture_pointer(pointer_id: int | None = None) → None
release_pointer(pointer_id: int | None = None) → None
queue_redraw() → None
property render_dirty: bool
clear_children()
destroy()
property destroying: bool
property destroyed: bool
call_deferred(method: collections.abc.Callable[..., Any], *args: Any) → None
property app
property tree: simvx.core.scene_tree.SceneTree
property viewport_size: simvx.core.math.types.Vec2
property viewport_insets: tuple[float, float, float, float]
property physics
property physics_2d
__getitem__(key: str)
classmethod get_properties() → dict[str, simvx.core.descriptors.Property]
__repr__()