Appearance
World labels through public Blueprint features
InterfaceForge uses Unreal's Widget Component for world rendering. Set World Entry, Refresh World Entry, and Clear World Entry connect it to the same IFEntry/data/theme contracts as screen widgets. No actor search, gameplay tick, distance policy or interaction authority is added to core.
Connect an offset marker to its subject
An offset marker may clear a HUD panel but look detached from its actor. Use Get World Entry Widget Point and Update World Entry Link to draw a caller-owned connection without adding an entity scanner or requiring a special widget subclass.
- Add a normal Static Mesh Component to your label actor, assign a mesh such as the engine Cube, and provide your own material. Disable collision and shadow casting for a passive UI connection. The mesh's local X axis runs along the line; its measured Y/Z bounds determine width. Non-centered mesh bounds are accounted for.
- Obtain the actual widget to attach to, such as your progress bar. Get World Entry Widget Point takes your Widget Component, that widget, and Alignment=(.5,1) for bottom-center. It returns World Position and a success Boolean. It resolves cached rendered geometry; retry after the first layout/render if false. Widgets in another entry, screen-space/cylindrical components and missing geometry return false. Alignment clamps to0–1.
- On success, call Update World Entry Link with Link=your Static Mesh Component, From=World Position, To=your actor's chosen world anchor, Width=your desired world-unit thickness. Success updates transform but preserves your visibility policy. Invalid/coincident endpoints, missing mesh or unusable mesh bounds hide the connection and return false.
- Set the connection's visibility using the same flow/range/marker-validity policy as the label. Hide it when the entry is cleared, paused or its anchor ends. You own updates; call from your placement event or selected-marker update policy. Neither node polls actors, installs a tick nor owns gameplay data.
flowchart LR
W[Rendered bar or custom widget] --> P[Get World Entry Widget Point]
C[World Widget Component] --> P
P -->|Success / World Position| L[Update World Entry Link]
A[Your actor anchor position] --> L
M[Your Static Mesh Component / material] --> L
V[Your flow / range / validity policy] --> S[Set Visibility on the link]
L --> S
The saved RPG BP_ForgeWorldReadout uses these public nodes through its example placement adapter. Link Widget Name defaults to ProductionProgress; Anchor Link Offset, Anchor Link Width, Anchor Link Color and Show Anchor Link are editable Blueprint properties. The actor retains weak anchor/player references. The two example markers update at30Hz to follow the small party smoothly; this is not a large-population policy supplied by the plugin. You can call the same nodes entirely in your Actor Blueprint with your own mesh, entry and cadence. Planar world components are supported; other geometry needs your own projection adapter.
Actual endpoint/engine coordinate round-trip, model update, invalid points/tree, range/pause/clear/anchor-lifetime and rendered source/package scope are recorded in Evidence/WORLD_LINK_RUNTIME.md. Physical device, split-screen, large population, occlusion and arbitrary camera/geometry support remain separate gates.
A working label in Blueprint
- Add a normal Widget component to your Actor Blueprint. Choose Space=World, Draw Size appropriate to your tree, and a Pivot such as(.5,1). For a passive label disable Window Focusable and Receive Hardware Input, and use no collision. Leave Widget Class empty; Set World Entry creates the owning-player-aware body.
- Create a Widget Blueprint using IFEntryWidget, or a UserWidget implementing IFEntry. On Entry Refreshed → Cast Entry Data to IFPresentationData → Set Text(Title) / Set Fraction(Fraction) updates your label/bar. On Entry Released clears custom references and presentation. The convenience base subscribes to Notify Data Changed and unbinds on release. A plain interface implementation owns its subscriptions and must make release safe to repeat.
- From your actor's initialization, call Set World Entry (InterfaceForge | World): Component=your Widget component, Local Player=the actual local PlayerController, Entry Class=your widget, Data=your stable model. It returns the created UserWidget, or None for invalid input. Keep gameplay/model authority in your provider. In a multiplayer game create local presentation from legitimate replicated data; this function implements no network rules.
- On owner/anchor cleanup call Clear World Entry. It releases the old IFEntry binding, removes the body and clears the component's automatic Widget Class so Init Widget cannot recreate stale UI. Invalid Set inputs leave the existing body unchanged; a valid replacement releases it before initializing the new body. Nested Set/Clear mutations during the same component's release/initialization are rejected.
flowchart LR A[Actor initialization] --> B[Stable presentation model] B --> C[Set World Entry] D[Local PlayerController] --> C E[Engine Widget Component] --> C C --> F[Custom Blueprint IFEntry] B -->|Notify Data Changed| F G[Actor End Play / anchor destroyed] --> H[Clear World Entry]
The helper creates the widget with the explicit PlayerController before Slate construction, then sets the component's Owner Player. IFText/IFSurface/progress bind to that local player's theme. Changing Set Theme updates the body without copying/rebuilding the widget tree. Core requires a valid local controller in the same world and rejects dedicated-server creation, abstract/deprecated classes, invalid data and classes without IFEntry.
Inspect the playable example
Emberwatch creates two BP_ForgeWorldReadout instances for its party. Open the saved Blueprint's Event Create Readout graph: Display and Entry Class property getters plus Player/Data pins feed the actual Set World Entry node. The native example actor supplies placement/lifetime/visibility only, with a convenience fallback using the identical public node. It is not a required plugin subclass: the four steps above also work on an ordinary Actor Blueprint.
WBP_ForgeWorldStatus is a saved custom IFEntryWidget Designer/graph, with a one-line IFText accent title and a themed linear bar. WorldTitleFit is an ordinary Scale Box: Scale To Fit, Down Only. Its title has Auto Wrap Text=false. Model Title and Fraction drive the same public nodes; release clears text and fraction. The fit-down title keeps the entire compact name/percentage within the fixed render target when text size increases. Supply a short localized world-label title; use a contextual screen/tooltip for lengthy descriptions rather than shrinking arbitrary paragraphs into a world marker.
The example uses a160×64 world render target, scale1.8, pivot(.5,1), one-sided world rendering, and configurable World Offset, Camera Side Offset, Maximum Camera Distance and Entry Class. Its orthographic arrangement moves labels into the gap between HUD cards and raises them above scene props. Replace these example placement choices in Blueprint for your camera/game. Ward updates the shared Hero/Companion models, so both HUD and world labels show restored vitality. Begin reveals them; pause/modal suppresses them; resume restores them; return hides them. A destroyed anchor releases and destroys its example presenter immediately. A separate fixture actor demonstrates the same binding with a standalone model and no RPG provider.
Placement checks in this small example use only each known anchor/camera at a1/30-second actor interval so the two connections follow moving subjects smoothly; flow visibility changes only when pause state changes. It performs no population search in a widget. This is not a scalable thousands-of-markers manager or a10kentity performance result. For larger populations, select relevant anchors centrally and pool/budget presentations in your adapter.
Rendering, scaling and input choices
World space uses a rendered world surface and normal scene occlusion. Screen space uses an actor-anchored screen layer without world occlusion. Draw Size controls the world render target; actor/component scale controls its world extent. Neither is a second viewport user-scale pass. IFText still respects the shared text-size preference. Choose readable physical sizes for your camera distance. Unreal documents Widget Component space, target size, redraw and focus controls.
Default automatic redraw permits live theme/data/text updates. With Manually Redraw enabled, call Refresh World Entry after model/theme/preference changes; it executes Refresh Entry and Request Render Update. This helper does not silently subscribe to arbitrary data sources or schedule redraws. Animate/dynamic labels need an appropriate engine redraw/tick policy. Draw at Desired Size can resize the render target frequently; prefer a stable target and responsive tree when practical.
Passive labels do not join the CommonUI menu focus tree. An interactive world terminal needs explicit focus/routing and a project-owned Widget Interaction Component. Set World Entry does not make a passive label a tested VR/touch/controller terminal. Keep screen dialogs/settings in the existing screen stacks.
Each component body has one owning player. For different per-player themes/visibility in split-screen, use separate per-player presenters or a suitable centralized screen-marker adapter. A single world surface should not be advertised as independently styled for every viewer. Engine screen-layer ordering, occlusion, camera changes, split-screen and physical devices require project testing. Runtime record states the actual tested scope.