Test input JSON schema · Widget fields and skins schema · Readable gameplay examples · Mouse-look project
Aether shared runtime 0.10.148
This is the shared editor/runtime version. Native Studio, Player, MCP and CAD binaries in the desktop packages retain their separate CP139 identity. A shared runtime update is not a new native engine build.
Upgrade existing 2D projects
Import or apply the saved project normally. Missing, null or empty widget IDs are assigned widget-1, widget-2, etc., in control order; suffixes avoid existing IDs. Read and save the returned project to retain the assigned IDs. Existing valid IDs remain unchanged. Duplicate explicit IDs remain an error because runtime nodes would have ambiguous targets. Projects created before widget-control nodes need no graph changes.
Widget visibility across actors
target selects the actor that handles the widget's action. visible_target selects the actor whose variable controls visibility; it defaults to target for compatibility. visible_var names a Boolean, Integer or Float declared on that actor's Blueprint. visible_when: false shows the control when that variable is zero/false. Actor names must be unambiguous. A visibility source that has been destroyed reads as zero/false, so a game-over menu can reappear. Cross-actor write nodes still require a live target.
{"id":"start","target":"Menu","visible_target":"Player","visible_var":"Alive","visible_when":false,"visible":true}
The visibility actor and variable can be chosen in the widget skin panel. ShowWidget and HideWidget use s as the control ID. SetWidgetVisible and SetWidgetEnabled take v:0/1 or a Boolean/numeric value on input 0. SetWidgetText and SetWidgetStyle take s2 or a String on input 0. Explicit visibility nodes override bindings until a new play session.
For cross-actor state, GetActorVar and SetActorVar use s for the target actor name and s2 for its declared variable name. SetActorVar takes the typed value on input 0. SetVar still refers to the current instance. Missing or ambiguous actors and unknown variables fail explicitly.
Saved skins
Set widget.theme for the project theme and widget.controls[].style for overrides. Presets are classic, neon, and flat. State keys are normal, hover, pressed, checked, and disabled. Colors, borders, corner radius, font, glow, and embedded sprite images are authored data and survive save/export. Keep changes in the project rather than appending scripts to generated HTML. The 2D widget runtime controls visibility, enabled state, text and styling during gameplay.
3D mouse controls
WebGL2 gameplay programs support Mouse0 (left), Mouse1 (middle), Mouse2 (right), Mouse3 and Mouse4 in key rules, controls and input.MouseN expressions. Pointer expressions are input.PointerX and input.PointerY (0–1 in the canvas), input.PointerDX, input.PointerDY and input.PointerWheel (pixels). Movement/wheel deltas accumulate until the next fixed step and are consumed once. Keys/buttons remain held until release or clear.
For FPS controls, declare yaw and pitch, and use ordered tick assignments:
yaw = yaw - input.PointerDX * 0.002
pitch = clamp(pitch - input.PointerDY * 0.002, -1.5, 1.5)
Bind the camera actor's rotation to [pitch,yaw,0], use camera mode follow, and set suitable eye-height offset and forward lookAt. Binding rotations are radians. Use a separate attached camera actor if the player's body should stay upright. Set camera.pointerLock: true to request pointer lock when the player clicks the canvas. Browser denial falls back to dragging; pointer lock requires a real user gesture. Escape pauses and releasing focus clears input.
Reproducible tests
aether_gameplay_test and aether_runtime_test use zero-based frame numbers at 120 fixed steps per second. Events at frame N run before step N. Maximums are 72,000 frames (10 minutes), 8,192 events and 10,000,000 estimated operations/script instructions. Expensive scenes can hit the work limit before the frame limit. Trace sampling defaults to at most 120 entries; request a larger traceEvery for long tests. Headless results do not certify rendering, audible output, physical touch or pointer-lock permission behavior.
{"frames":240,"events":[{"frame":0,"type":"pointer","x":0.5,"y":0.5,"dx":100,"dy":-20},{"frame":1,"type":"input","code":"Mouse0","pressed":true},{"frame":2,"type":"input","code":"Mouse0","pressed":false},{"frame":120,"type":"clear"}],"observe":["values.yaw"],"assertions":[{"path":"values.yaw","equals":-0.2,"tolerance":0.000001}]}
Custom events use {frame,type:"event",name,value}. Widget actions use {frame,type:"widget",name,value}; name is the 3D widget ID. The full JSON input schema is linked alongside this guide. Readable example calls and a mouse-look project are available without opening a tool response.
Browser export
Use aether_game_export with target:"web", renderer:"webgl2" for a single self-contained 3D HTML file. It contains the shared viewport, gameplay runtime, saved project and required assets. WebGL2, JavaScript and a browser willing to open local HTML are required. Some mobile file managers do not launch HTML as a web page; hosting the same HTML over HTTPS is an alternative.
The legacy aether_3d_project_export also defaults to single HTML. Append &format=zip to its returned download URL to request a static-host ZIP. web-wasm and desktop-project also retain ZIP packaging. WebGPU remains experimental and uses ZIP delivery. Mouse input is shared; automated checks cover both player runtimes. Physical GPU rendering remains unverified. Native-only Blueprints, Vulkan rendering and the full native physics API are not added by exporting a shared project.
Terrain textures are included only when a visible terrain actor uses the textured terrain material. HDR assets are included only when HDR is enabled. License/provenance files accompany any included demo assets. The required two-second “Created with Aether” splash remains.
Authoring boundaries
Browser Play executes supported 2D and 3D gameplay. Browser modeling includes mesh editing, composed model recipes and imports. Advanced native topology, retopology, CAD and native graph operations still require their documented paired desktop workspace; this release does not claim full native/browser parity.