Repository navigation
Aura3D 4.3.0
Pre-releaseSuperseded. This version is deprecated. Upgrade to Aura3D 4.7.8.
-
Aura Diamond 3D: the batter stands on the ground and both hands are on the bat in every phase (solver level). Every athlete was placed at
y + 0.94althoughscaleMode: "fit"already grounds the model, so all of them hovered a metre above the dirt and the swing was built to hit a ball a metre too low. The top hand also used the right arm's bind directions (23 cm off the bat), the grip point was a stale estimate, and the engine's bone attachment let the bat drift 14 to 76 cm from the hands in fast segments. The solver and swing keys now live insrc/batter-pose.ts(pure functions,tests/unit/aura-diamond/batter-grip.test.tssweeps stance, load, stride, contact across the strike zone, follow-through and recovery), the bat is placed from the same solve as the arms, and the stance is a real ready position. Bone-level grip is 0.1 cm in every phase; the drawn hands still do not meet the bat because the Diamond athlete mesh is bound mid-stride to a straight skeleton (rebuild tracked by the rigs lane). Evidence:evidence/aura-diamond-3d/bat-fix/. -
Sun shadows are back in Shadowstep Gauntlet and Ion Circuit. Shadowstep Gauntlet (2 cascades, 90 m, village models, trees and actors cast, 127 draw calls against its 133 budget) and Ion Circuit (custom road, terrain and props receive through
a3d_shadow).?shadow=0restores the previous look. Mean luma with the shadow is within 2 points of the no-shadow frame in both. -
Sun shadows are back in Serpentine Sky Run (toon surfaces drop to the lowest band in shadow; 1 cascade, 80 m; luma within 0.1 of the no-shadow frame).
-
Large instanced shadow casters draw as one batch per cascade. Instances beyond the 64-matrix uniform array ride a per-instance vertex-attribute buffer: Shadowstep Gauntlet's village frame fell from 127 to 107 draw calls. Gameplay props and flat decals (strike targets, gates, cells, hazards, kickers) no longer cast in Ion Circuit (133 to 69 draw calls) and Saltwind Highway (215 to 110 with one cascade).
-
Sun shadows are back in Saltwind Highway and Craterline GP (custom road, terrain, track and prop surfaces receive through
a3d_shadow; mean luma within 0.1 of the no-shadow frame;?shadow=0restores the previous look). -
Fix: GL feedback loop (0x502) when a custom receiver and an alpha-masked caster shared a frame. The depth pass left
u_baseColorTextureunbound for alpha casters without a map, so it read texture unit 0, which a custom receiver program fills with the cascade's own depth texture. The depth pass now binds an empty texture. -
Consumers can bundle the engine without top-level await. The published solver init was a top-level
await, which broke esbuild/Vitees2020targets andiife/cjsoutput (and, reachable from an import cycle, produced "Unexpected reserved word"). The default build is unchanged (app.physicsstays synchronous); the newaura3d-no-tlabundler condition selects a lazy init, withensurePhysics()andphysicsInitModeexported from@aura3d/engine/physicsand@aura3d/physics.pnpm verify:no-tla(inverify:npm-release) fails on any other top-level await in shipped dist, andtests/unit/consumer-bundle/no-tla.test.tsbundles the built engine at es2020/es2022, esm/iife, with and without the condition. The prd13run.tsdev entry no longer awaits at the top level. -
The Hoops, Diamond and Links athletes pass
aura3d assets validate --skin. The Hoops and Diamond athletes had up to 31x stretched triangles in the clips their games play; every stretched or flap triangle now has its own rigidly skinned vertices (tools/aura-athletes/split-bridges.ts), the rest pose and clips are unchanged. The Links golfer's mesh was baked with folded arms and a welded club (73x); it is now the Diamond body in the Links palette. Theiraura.skin-allow.jsonentries are gone. -
Example dev server no longer serves an unparseable esbuild bundle. A game whose graph reaches
@aura3d/physics-rapier(top-levelawaitin an import cycle) gotawaitinside non-async wrappers and failed withUnexpected reserved word; the server now parses each bundle and falls back to per-module serving. dot-dash-3d now mounts in the harness; the deployed site was never affected. Newdot-dash-page-errorspec; luma shards fail on any page error. -
aura3d assets validate --skinandassets repair-skincatch and repair the rig defect that tore the Aura FC athletes. The check poses every rigged GLB through the clips it ships and fails on stretched triangles (SKIN_STRETCH), thin flaps (SKIN_FLAP), bad or distant weights, a mesh modelled in another pose than its skeleton (SKIN_BIND_MISMATCH) and impossible humanoid joint ranges, per material, with JSON output and stable codes.validate --release,check-deploy --releaseandtools/game-checks(new globalskincheck) run it; known defects ship inaura.skin-allow.jsonwith a required reason (11 Meshy rigs in 6 games today, F11 and F12 indocs/audit/game-leftovers.md).repair-skinoffers opt-in normalise, prune-distant, smooth-bridges and cut-stretch steps, and--rebuild-limbsrebuilds the legs of a recognised humanoid (the FC fix, generalised and scaled to the rig: it reproduces the shipped FC striker triangle counts). ExportsanalyzeSkin,repairSkin,rebuildLimbs. -
createHandBounceandmeasureHandBallin@aura3d/engine/game: a ball that is really dribbled by hand. Promoted from the Aura Hoops dribble. One phase cycle drives the ball (centre exactly atfloorY + ballRadiusat the bounce) and the palm target, positioned from the palm as rendered; standing and running profiles;overlay()returns upper-body-only bend (never leg bones);release()hands the ball over at the hand with its own velocity,pickup()takes a loose ball; fixed-step and deterministic,state()for probes.measureHandBallreports palm-to-ball at the meet and the floor contact, floor error and maximum distance against the Hoops limits. Aura Hoops now runs on the kit (behaviour and numbers unchanged). Docs:docs/api/motion-hand-bounce.md, recipe 6, build-a-game table, skill reference. -
PostGraph v2: chain frames tone-map and encode in the
OutputPass. A chain whose remaining descriptors are bloom and tone mapping now runs the HDR stages, an HDR bloom into a pooled rgba16f target (presentHdrBloom), then the sharedOutputPass(one operator, one sRGB encode, a linear-light vignette) instead of the fused native tone program. Software-WebGL2 three-scene mean luma equals the old route within 0.1, Aura Slam G3 passes (117 to 125 draw calls), and 25 games measured before and after differ by at most 3.9% on one animated frame (20 identical):evidence/post-graph-migration/.OutputPassgained a vignette and a full-coverage option. On chain frames the agx, neutral and cineon operators now use the same three.js r185 ports as the no-chain route (the fused program used approximations); aces, linear and reinhard are unchanged. Chains with a legacy colour-grade, FXAA, SSR or outline descriptor keep the fused present.effects.*is unchanged. -
Iron Crown: Boulder Kane, Seraph Lin and Sovereign no longer have photographic faces. Their baked atlases carried realistic faces (a recognisable-looking wrestler, a woman in a surgical mask, a helmeted knight).
tools/iron-crown-restyle/flatface.mjsnow gives each a flat stylised face (own skin, hair, brows, eyes, scar or lash lines) in the same style as Kenji and Mara; Seraph's mask and Sovereign's helmet keep their original material. Skeleton, the 10 fight clips and every non-head triangle are unchanged, and the GLBs got slightly smaller (the tool now prunes orphaned accessors). Jinx Oko keeps his painted mask face, which is already stylised. -
material.customreceives the sun shadow. SetreceiveShadow: trueon the spec (or#include <a3d_shadow>) and multiply the lit term bya3dSunShadowAuto(worldPos, normal);a3dSunShadow(worldPos, normal, toLight)takes the light direction yourself. The light's cascades, bias, normalBias and filter apply exactly as for PBR surfaces, and the factor is 1 with no shadow map. Serpentine Sky Run, Saltwind Highway, Ion Circuit and Craterline GP use it. -
Fix: a sky dome as a caster darkened the whole frame (Shadowstep Gauntlet's "shadow darkens everything" report). The 4000 m sky sphere cast into the sun cascades, so every receiver was shadowed. Non-instanced casters larger than 4 shadow distances (floor 100 m) are now skipped and reported as
shadow.caster.oversize:<label>indroppedFeatures. Measured on the real scene: mean luma with the sun shadow 157.46, identical to the no-shadow 157.46 (it was 142.79). -
Sun cascades fit the camera slice, not the casters. Casters no longer widen a cascade's x/y (a scene-spanning instanced set inflated every cascade to kilometres, so shadows were 1 m blobs); they only extend the depth range toward the light, capped at 8 slice radii (min 200 m). The cascade slice now uses the view-projection's own clip range when the caller's
near/fardisagree with it. -
Cumulus Dash: the hero's feet now plant at every running speed. The Meshy run clip plants a foot at 3.3 m/s while the sim runs 14.5 m/s (up to 19.6 boosted), so 4.2.0 still slid (planted-foot p95 3.4 to 8.5 m/s on the library
createFootSlideMeter).gait.tsdrives hips and both legs by two-bone IK from 2.2 m/s up: stance feet pinned to the ground, cadence from speed, a straight-up/zero-speed/straight-down swing foot, hip dip and lean; the arms stay locked to the stride, the finale walk runs the same gait at its real 8 m/s, and each side uses its own bone lengths (the Meshy skeleton is asymmetric). Planted-foot p95 is now 0.00 to 0.02 m/s at 4.2 to 19.6 m/s at 30, 60 and 120 Hz (threshold 0.15), with 27 to 140 planted samples per foot over 8 s so the feet really land. Sim values and replays unchanged. The unlistened part is the look: frames were read from the real game on software GL, not a real GPU. -
Shadowstep Gauntlet art pass: the placeholder scenery is replaced with ten generated models. Four house designs (stone cottage, timber townhouse added), market stalls, a two-tier teahouse, granite and sandstone valley cliffs, mossy boulders, shrubs, a forested horizon ridge and rail fences replace the box houses and stalls, flat-faceted cliff planes, cone tufts, low-poly rocks, sphere hills and stone-slab fences. Render-only (course, colliders and replay unchanged); draw calls go down by 2 to 4 per frame, model files grow from 17.5 to 28.3 MB (lazy loaded). Frames in
evidence/ninja-runner-port/art-pass/. -
warmProgramswaits for pending texture upgrades. A material that gains its texture switches to a textured program variant that compiles asynchronously, so a ground or facade could drop out of frames after the game believed it was settled. New optionswaitForTextures(default true) andtextureTimeoutMs, andtextureFrames/texturesReadyon the result, mirror the HDRI wait. Behaviour is unchanged when nothing is pending. Gridlock Courier also fixesroadPlane(cells), which mis-mapped the lane paint for most cell counts (the shipped single quad was right); the road-flip report itself did not reproduce, seeevidence/drift-and-deliver-port/road-fix/README.md. -
Teleoperator art pass: original vehicles and real buildings. The hero (a rounded driverless shuttle pod), hatch, notchback sedan, wedge coupe, van, pickup and box truck are regenerated through Meshy so none reads as a specific real car, with emblems the generator invented covered and checked on orthographic renders of every side. The 16 single-colour box buildings are now four generated building models (Victorian townhouse, brick mid-rise, glass tower, art-deco tower). GL draw calls per frame went from about 691 to 630; software-GL wall-clock per frame is higher (unreliable across workers, no real-GPU run). Render-only;
showcase-teleoperator-v2keeps box buildings. Provenance and numbers:evidence/teleoperator/art-pass/; recaptured screens and card inevidence/teleoperator/screens/final/. Meshy credits for theteleoperatortag went from 255 to 735 (uncapped by owner decision). -
Red Zone 3D is removed (25 live games). The football game had no real playable loop, so it is deleted rather than kept: the app, its route and card previews, its eight Meshy model entries (
rzQuarterbackMeshy,rzDefenderLinemanMeshyand the stadium props) inaura.assets.jsonandsrc/aura-assets.ts, their files inpublic/aura-assetsandaura-evidence/meshy, and its browser specs./apps/showcase-red-zone-3d/now redirects (308) to the homepage. The generated inventory, showcase index, sitemap andllms*.txtread 25 games. -
Aura Hoops dribble: the ball now stays with the hand and the floor. The cycle drove the ball from the IK target palm, but the arm (0.55 m reach) never got below about 1.0 m, so at the bounce the ball was about 0.9 m under a hand that stayed high. The handler now sinks into a crouch (hips 0.28 m with folded knees, feet planted) during the push and holds it until the ball has met the floor, the palm heights fit the arm's reach, and the ball rides, leaves and is caught by the palm as rendered (forearm bone). Floor contact is centre-at-radius.
?diag=1&qaDt=fixes the sim step for measurement; the beacon addshandProbe. New probe:tests/browser/hoops-dribble-probe.spec.ts. The running dribble gets an upper-body-only overlay (waist bend that deepens into each push, shorter period, lower apex, ball landing ahead of a low hand) that leaves legs and foot-slide on the run clip: palm 1.0 m to 0.61 m high at the floor contact, palm-to-ball 0.9 m to 0.54 m. -
Fix: frames with
effects.vignette()are no longer 25 to 40% darker. Measured on software WebGL2 (three scenes,tests/browser/post-luma.spec.ts,evidence/post-graph-migration/): bloom changes the mean luma of a frame by under 1%, tone mapping already ran once, and the darkening was the vignette, which multiplied display-referred bytes in the LDR tail after the tone map. It now multiplies linear light inside the single tone-map and encode stage (PostGraph v2OUT), soeffects.vignette({ intensity: 0.16, smoothness: 0.65 })costs about 6% to 18% of mean luma (was about 27%) and keeps more saturation. Frames with no vignette are unchanged (identical mean luma and chroma in the probe). Theeffects.*API is unchanged. Software-GL evidence only; check on a real GPU. -
Removed: the
POSTPROCESS_V2_UNMIGRATEDconsole warning and skip record. Any configured chain used to be labelled "unmigrated" even when PostGraph v2 ran it. A chain v2 cannot run (compat.post: "3.0",-post, WebGPU,cpu-deterministic, passes the fused LDR set cannot order) is now reported aspost-legacy-route:<reason>indiagnostics().output.postSkippedanddiagnostics().post.skipped(POSTPROCESS_LEGACY_ROUTE:<reason>), with no console output. -
Meshy spend is uncapped (owner decision, 2026-10-25) and
aura3d meshy ledgerreconciles against Kiro Prism. There is no default per-game or global cap: credits are tracked for visibility and the only automatic stop is a zero Prism balance. Caps are opt-in (--cap,--game-cap,--global-cap,AURA3D_MESHY_GAME_CAP,AURA3D_MESHY_GLOBAL_CAP,config --global-cap N|off) and, once set, hard-stop with the credits left and the flag that raises them;reserve --dry-run --op preview,refine,riggingprices a chain without writing;settle --exit-code 6 --error-textcounts a 429 on a poll (task exists) and not a 429 on a create;baselineandreconcilecompare the ledger with the Prism pool (--applybooks the delta);configstores or removes opt-in caps in the ledger. The ledger lives at~/.aura3d/meshy-ledger.jsonl, not/tmp. The reconciliation (ledger 4,530 vs Prism 4,855, +325) is indocs/audit/meshy-reconciliation.md; the game-checksmeshy-capcheck reads this ledger and prints credits per tag as information only (never a warning). -
Saltwind Highway (Roadster Hours) vehicles are back on
batched.mesh. All 68 traffic and lineup vehicles are batched instances again (one textured batched mesh per generated model, baked cars per material group, rigs in their own mesh); the per-modelinstances.customnodes and the instance pool are gone. Software WebGL2: 65 draw calls with every vehicle shown before and after, same GL frame, replay unchanged. Multi-draw needs the engine batching tier (A3D_QR_TIERS_BATCHING, off by default), so the spec bounds the vehicles at one draw per pooled geometry when it is off. -
Shadowstep Gauntlet sun shadows stay off, with the reason recorded. Re-enabling the cascaded sun shadow (111 draw calls against 56) darkened every lit receiver by about 8 mean luma points whatever the casters, cascades, fit, bias or filter (
evidence/ninja-runner-port/parity-closeout/); an engine-side directional receive defect, still open. -
aura3d meshy ledgeris now a hard stop and reconciles against Kiro Prism. A tag past its cap (default 420,--cap,--game-cap,AURA3D_MESHY_GAME_CAP) or the global cap is refused with the credits left and the flag that raises it;reserve --dry-run --op preview,refine,riggingprices a chain without writing;settle --exit-code 6 --error-textcounts a 429 on a poll (task exists) and not a 429 on a create;baselineandreconcilecompare the ledger with the Prism pool (--applybooks the delta);configstores the caps in the ledger. The ledger lives at~/.aura3d/meshy-ledger.jsonl, not/tmp. The reconciliation (ledger 4,530 vs Prism 4,855, +325) is indocs/audit/meshy-reconciliation.md; the game-checksmeshy-capcheck reads this ledger. -
Ports and index games use the library kits instead of local copies. Ten port model tables (Splat Rush, Drift and Deliver, HEATSINK, Cloud Runner, Last Train, Ninja Runner props, Serpentine Sky Run, Strange Orbit, Where the Wind Wanders, Silt and Signal) are declared with
defineModelAssets(same-origin URL, sha256, format, bounds and licence unchanged; a unit test compares every ref against the hand-written tables). The sharedapps/showcase-port-shared/blackframe.tsand Drift'sblackframe.tsare gone: every game importsinstallBlackFrameGuard,createBlackFrameWatch,healParamsandhealStagefrom@aura3d/debug(Drift keeps its own storage key). -
More port audio runs on
createCueBank: all eleven Roadster Hours effects, the seven Last Train event cues, five Ninja Runner effects and thirteen Strange Orbit tone cues, each with a parameter-level equivalence unit test (oscillator types, start times, gain envelopes, glides; noise filters and samples for Roadster Hours). Nobody listened to them. Noise-bearing, stereo-panned and continuous voices stay hand-written (docs/audit/game-leftovers.md). -
FC athletes rebuilt: intact shorts, straight believable legs and clean arms (striker and goalkeeper). The Meshy mesh was modelled mid-stride (knee bent, thigh swung forward, spine bent about 30 degrees, arms bent) but bound to a straight skeleton, so every clip rotated the legs and arms about joints 10 to 20 cm from the limbs and the shorts, thighs and sleeves tore into shards (the run-cycle joint ranges were never the cause).
tools/aura-fc/rebuild-legs.mjsrebuilds the lower body andrebuild-arms.mjsthe upper body in the straight pose: thigh, shin, forearm and upper-arm skin tubes, thigh shorts, pelvis skirt, ankle socks, shoulder caps, kit sleeves and mitten hands around the real bone axes with smooth hip, knee, ankle, shoulder and elbow weights, boots flattened under the shin, torso and head stood upright. No triangle of any material stretches past 1.6x in any of the 26 clips in the files (before: 327 past 1.6x on the striker, worst 120x); each athlete is still 6 materials and the GLBs shrank from 2.4 MB to 1.8 MB. Alsoraster.mjs(GPU-free posed silhouettes),gait-limits.mjs,swap-asset.mjs,bridge-cut.mjs. Hoops, Diamond and Links athletes have the same mismatch and are unchanged (docs/audit/game-leftovers.md F11).