hilo3d 2.0.0-alpha.3 → 2.0.0-alpha.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,3 +1,313 @@
1
+ # Unreleased
2
+
3
+ ### Breaking changes
4
+
5
+ - Integrate typed particle parameters into emission and spawn initialization across CPU, stateless,
6
+ and stateful WebGPU command generation; runtime value changes no longer require recompilation.
7
+ Apply `ParticleBudgetManager` decisions directly to live capacity, spawn rate, sorting, soft
8
+ particles, collision, and ribbon work. Connect the bounded stateless WebGPU generator to Render
9
+ Graph compute, indirect storage raster, and device-loss regeneration, with explicit CPU fallback
10
+ for unsupported definitions and manual emission. Explicit stateful GPU emitters now reject
11
+ `replace-oldest`; unsupported module/backend pairs fail compilation instead of doing nothing.
12
+ - Replace the mutable `Material` monolith with immutable `MaterialDefinition` plus
13
+ `MaterialInstance`. Remove legacy topology mutation, WebGL-style blend/side fields, material-owned
14
+ render order and shadow participation, material display transforms, shared UV matrices, shadow
15
+ proxy materials, `onBeforeCompile`, and `shaderCacheId`. Move object ordering and shadow flags to
16
+ `Mesh`; require construction-time topology, explicit coverage/compositing, typed
17
+ `MaterialAttributeSemantic`/`MaterialUniformSemantic`/`MaterialTextureSemantic` bindings, and
18
+ explicit pass pipeline state. This is a direct migration with no compatibility adapter.
19
+ - Split per-texture-slot std140 metadata out of `MaterialBlock` into the fixed
20
+ `MaterialTextureBlock`. The material scalar block is now 448 bytes and includes
21
+ `u_temporalReactiveFactor`; the texture-slot block is 1,920 bytes, WebGPU material textures begin
22
+ at binding 2, and custom uniform block registrations begin after ten built-in WebGL2 binding
23
+ points.
24
+ - Advance the shared GPU PBR material record to `builtin-pbr-storage-v3`. The byte length is
25
+ unchanged, but the third surface vector's formerly reserved W component now stores authored
26
+ temporal reactivity for the fused GPU Scene depth/motion pass.
27
+ - Expand the fixed Camera/Model/Skinning/Morph/Instance std140 ABI with current/previous transforms,
28
+ stable and jittered camera projections, render origins, and per-domain history/depth flags. Custom
29
+ shaders that redeclare built-in blocks must use the updated field order and capacities.
30
+ - Make forward feature color encoding explicit. `replaceColor()` now requires `linear` or `srgb`,
31
+ and the default Forward pipeline always routes surface presentation through the Render Graph so
32
+ the final output transfer is owned by the output stage rather than individual materials.
33
+ - Replace the Forward-specific color-encoding type with the shared `RenderColorEncoding`. Manual
34
+ RenderTarget presentation now accepts an explicit `colorEncoding`; linear inputs receive the final
35
+ sRGB transfer, while display-transformed `srgb` inputs are preserved without a second conversion.
36
+
37
+ ### Changes
38
+
39
+ - Update the standalone `hilo3d-game` skill for immutable material topology, Mesh-owned ordering and
40
+ shadow participation, and the completed portable/WebGPU particle authoring workflow.
41
+ - Normalize managed particle textures through the shared top-left UV boundary for CPU and WebGPU
42
+ sprite, mesh, motion-vector, ribbon, and trail shaders. Fix WebGPU 2D Sprite orientation when
43
+ `Texture.flipY` is false, and extend the asymmetric row-direction fixture across WebGL 2/WebGPU
44
+ render targets, ordinary materials, 2D Sprites, particles, and cube textures.
45
+
46
+ - Add the versioned public `ParticleSystemDefinition`/`ParticleSystem` API through P0-P3. Compile
47
+ immutable fixed modules into liveness-based SoA layouts with deterministic counter RNG and shared
48
+ curve/gradient LUTs; provide portable CPU fixed-step simulation with one interleaved instanced
49
+ sprite draw on WebGL 2/WebGPU; and add renderer-owned stateful WebGPU simulation, alive/dead
50
+ compaction, spawn commands, indirect arguments, Bitonic/distance-bucket sorting, recovery-aware
51
+ commit/rollback, and constrained storage-aware sprite raster through the default Forward Render
52
+ Graph. Keep the existing specialized compute-particle showcase unchanged until the remaining
53
+ particle phases are complete. Add stateless eligibility metadata and asset-level diagnostics,
54
+ absolute-time CPU reconstruction, a no-state Naga-validated WebGPU renderer-data generator,
55
+ deterministic live budget/quality application, and reusable short-effect system pooling.
56
+ - Extend the particle runtime through P4 with analytic collision and triggers, WebGPU scene-depth
57
+ collision, sampled-depth soft sprites with fragment depth comparison, compact bounded CPU events,
58
+ typed `ParticleEventChannel`, asynchronous aggregate reads, and GPU-resident event
59
+ capture/sub-emitter routing without count or state readback. Allow constrained storage graphics
60
+ shaders to specialize ordinary GLSL numeric depth samplers into WGSL depth textures.
61
+ - Complete particle P5 with portable mesh instancing and per-mesh buckets, ribbon/trail topology and
62
+ dense segment streams, WebGPU mesh scatter plus per-asset indirect draws, per-view GPU ribbon
63
+ topology sorting/segment compaction/indirect raster, ambient plus bounded directional Lambert
64
+ lighting, soft ribbons, explicit Bloom/TAA composition semantics, and opt-in motion vectors for
65
+ supported portable opaque/masked mesh output. Add fail-closed advanced quality gates instead of
66
+ silently degrading unsupported tiers. Allow the built-in opaque GPU particle boundary to request
67
+ opaque/transparent Forward splitting only on frames that actually draw eligible particles.
68
+ - Add the first particle P6 authoring slice with normalized versioned JSON serialization, strict
69
+ parsing and compiler validation, sequential application-owned upgrades, document-local shared
70
+ parameter identities, and stable application-resolved Texture/Geometry references. Reject future
71
+ versions, missing or skipped upgrades, unknown schema fields/tags, and unresolved or wrong-kind
72
+ resources before runtime construction.
73
+ - Add versioned reusable in-memory particle simulation checkpoints. Capture and restore CPU SoA,
74
+ fixed-step scheduler, pending manual emission, bounded events, playback/budget/culling state, and
75
+ stateless GPU absolute time without production-loop readback. Bind checkpoints to definition,
76
+ compiled plan, seed, parameter identity/revision, and event capacity; reject stateful GPU capture
77
+ until an explicit asynchronous device-state transfer contract exists.
78
+ - Add bounded deterministic particle baking APIs. Export stable-ID/generation-sorted frame-major
79
+ mesh instance caches with motion/orientation inputs and bounds, and pack application-rendered,
80
+ tightly packed render-target readbacks into native-format flipbook atlases. Restore the caller's
81
+ simulation checkpoint after success or failure, bound frame/particle/atlas work, and reject
82
+ stateful GPU baking rather than introducing synchronous device-state readback.
83
+ - Complete particle P6 external authoring with a published fixed-module graph JSON Schema,
84
+ deterministic definition-to-graph conversion, strict ownership/compiler validation,
85
+ node-addressable diagnostics, normalized inspector IR, and a versioned preview controller for
86
+ compile/play/pause/restart/seek/step/inspect/dispose without GPU particle readback.
87
+ - Allow a Forward feature runtime to request sampled single-sample scene depth per frame before
88
+ attachment allocation, so scene-dependent effects do not force unrelated RenderTarget frames
89
+ through an intermediate depth path.
90
+ - Add an integrated WebGPU physical atmosphere and weather chain to Clustered Forward+: cached
91
+ Rayleigh/Mie/ozone transmittance and multiple-scattering LUTs, a per-frame sky-view LUT, aerial
92
+ perspective, physical sun disc, procedural weather map, quality-tier Perlin/Worley volumetric
93
+ cloud ray marching, blue-noise sampling, representative-depth temporal reprojection, cloud shadows
94
+ for registered PBR directional light and froxel scattering, and storm lightning/sun-shaft
95
+ lighting. Add GPU histogram percentile exposure with asymmetric eye adaptation, on-demand
96
+ diagnostics, and submission-aware `rgba16float` exposure history; add configurable filmic Color
97
+ Uber and Clustered display transforms. Add the interactive Stormfront Observatory WebGPU example
98
+ with solar time, cloud, wind, storm, quality, debug, and camera controls.
99
+ - Add production dynamic resolution and authored reactive masks to `TemporalAA` and the integrated
100
+ Clustered Forward+ temporal path. Dynamic resolution is explicitly gated by WebGPU
101
+ `timestamp-query`, consumes asynchronous Render Graph GPU pass durations without stalling the
102
+ frame, and applies EWMA smoothing, hysteresis, quantized steps, warmup, settling, min/max bounds,
103
+ duplicate-sample rejection, and fail-closed handling for unavailable, failed, or saturated
104
+ timings. Resolution changes synchronously resize scene color/depth/motion/reactive, Hi-Z,
105
+ clusters, GTAO/SSGI/SSR, volumetric, atmosphere and cloud resources while invalidating
106
+ size-dependent history; color/depth history, transparent/UI composition and presentation remain
107
+ output resolution. Add `MaterialInstance.temporalReactiveFactor`, write it through a second
108
+ `r8unorm` motion MRT in ordinary Forward and the fused GPU Scene prepass, conservatively dilate it
109
+ 3×3, and combine it with luminance reactivity during TAA/TAAU rejection. Expose single-runtime
110
+ Forward diagnostics and Clustered scale/GPU-time diagnostics, with tests for controller stability,
111
+ ABI validation, material revisions, shared GPU packing, fallback and resource requirements.
112
+ - Complete the native GPU Scene/Clustered Forward+ coverage slice for alpha-masked PBR, shared
113
+ shadows, and area lights. Alpha coverage now uses base-color/opacity slot transforms, channels,
114
+ encodings, factors, and cutoff consistently in indirect depth, motion, material-attribute, and
115
+ color passes. Directional, spot, and point lights keep GPU Scene objects on the clustered path
116
+ while sampling the renderer's exact shared shadow-atlas graph texture with standard/reversed-depth
117
+ 3×3 PCF, cascades, slope bias, shadow strength, and per-mesh `receiveShadows`. Area lights use the
118
+ ordinary Forward LTC LUTs as global storage-light records with explicit-LOD WebGPU sampling rather
119
+ than point-light approximation or whole-camera fallback. `RenderPipelineContext.recordShadows()`
120
+ now returns frame-scoped atlas, light order, bias, cascade, and matrix data for custom pipelines;
121
+ the atlas remains renderer-owned, recovery-aware, and submission-tracked.
122
+ - Add production screen-space diffuse global illumination to ordinary Forward on WebGPU/WebGL 2 and
123
+ to the WebGPU Clustered Forward+ profile. The opt-in path reuses GTAO/GPU Scene material
124
+ attributes and motion/log-depth when available, traces configurable stochastic view-space
125
+ hemisphere rays against opaque depth, transports bounded linear HDR scene radiance, applies
126
+ motion/depth/normal history rejection with YCoCg variance clipping, runs one to three
127
+ depth/normal/luminance-aware a-trous filters, performs bilateral full-resolution upsampling, and
128
+ composites before transparent, Bloom, and display. Keep per-camera history submission-aware across
129
+ cuts, resize, discarded frames and recovery; use explicit-LOD sampling so translated WGSL remains
130
+ valid in non-uniform ray/filter control flow; and keep the disabled path resource- and pass-free.
131
+ Add the dual-backend Prismatic Vespers procedural chapel with cyan, vermilion, violet, and warm
132
+ emissive architecture, same-view on/off controls, responsive editorial UI, and WebGL 2/WebGPU
133
+ render-health and GPU-validation coverage.
134
+ - Add production WebGPU high-end froxel volumetric lighting to
135
+ `ClusteredForwardPlusPipelineFactory`. The opt-in path expands the bounded local-light allocator
136
+ from surface depth ranges to the complete camera cluster volume, tiles logarithmic Z slices into a
137
+ dimension-validated `rgba16float` atlas, injects directional/point/spot radiance plus exponential
138
+ height and sphere/box local fog, cumulatively integrates each froxel column once, reconstructs
139
+ depth-bounded radiance/transmittance in constant texture-fetch cost, and performs previous-view
140
+ reprojection, depth/reactive temporal rejection, neighborhood clamping, and linear HDR
141
+ transmittance/scattering composition before TAA/TAAU, transparent fallback, Bloom, and display.
142
+ Add bounded screen-space light visibility, low/medium/high/ultra budgets, radiance/transmittance
143
+ debug views, submission-aware diagnostics, camera-cut/resize/failure/device-recovery history, and
144
+ fail-closed storage/format/texture-dimension requirements. Keep explicit shadow-atlas and
145
+ transparent-volume participation as documented future ABIs rather than silently approximating
146
+ either contract. Add Neon Reliquary around the repository-bundled Khronos Sponza with a cinematic
147
+ 40px surface grid, 0.375-scale froxel XY/20-slice volume, 0.72-scale TAAU, animated chromatic
148
+ spotlights, seven local fog fields, camera/debug controls, and a physical-WebGPU
149
+ stability/on-off/GPU-validation gate.
150
+ - Add production ground-truth ambient occlusion to ordinary Forward on WebGPU/WebGL 2 and to the
151
+ WebGPU Clustered Forward+ profile. The opt-in path records shared depth/material-attribute/motion
152
+ producers, configurable rotated horizon search, bent-normal visibility, submission-aware temporal
153
+ rejection, two edge-aware filters, and bounded depth/normal upsampling before applying the result
154
+ only to PBR ambient/IBL. Keep direct lights and emission unoccluded, reset or roll back per-camera
155
+ history across cuts, resize, discarded frames and recovery, and keep the disabled path resource-
156
+ and pass-free. Add The Silent Dragon museum study around the repository-bundled 1.2 MB Stanford
157
+ Dragon, with same-page GTAO A/B switching, responsive art direction, and real WebGPU/WebGL 2
158
+ non-black and on/off pixel coverage. Keep the deployed glTF beside its external binary payload,
159
+ and make the site link gate validate nested glTF buffer, image, and extension URIs before publish.
160
+ - Add production WebGPU high-end screen-space reflections to `ClusteredForwardPlusPipelineFactory`.
161
+ The opt-in path adds a strict built-in `material-attributes` `rgba16float` ABI, GPU Scene MRT and
162
+ ordinary Forward fallback coverage, RG32F min/max Hi-Z, hierarchical coarse-to-fine tracing,
163
+ roughness radiance cones, edge/distance/roughness confidence, motion/log-depth temporal rejection
164
+ and confidence-aware depth/normal à-trous filtering before HDR composition and TAA/TAAU. Keep the
165
+ disabled path allocation- and pass-free, fail closed without Hi-Z or TemporalAA, and reset history
166
+ across camera cuts/identity changes, resize, discarded frames and device recovery. Feed ordinary
167
+ Forward opaque through a `depth-only` fallback prepass before current Hi-Z construction so layered
168
+ PBR objects are present in both the radiance source and hierarchical depth trace. Add `rg32float`
169
+ to the public compute storage-texture formats, add the repository-bundled Khronos Car Concept to
170
+ the dedicated Afterimage SSR showcase, and cover real WebGPU on/off pixels plus GPU validation.
171
+ The existing Temporal Observatory remains focused on TAA/TAAU.
172
+ - Add the `TemporalAA` Forward feature with native-resolution TAA and fixed-scale TAAU. Built-in
173
+ opaque/masked materials now expose a strict single-sample `rgba16float` motion pass containing
174
+ current-to-previous UV velocity, expected previous logarithmic view depth, and current logarithmic
175
+ view depth. Camera, model, instance, skin, morph, visibility, and failed-frame history are
176
+ submission-aware. TAA runs after opaque and before transparent/Bloom with `rgba16float` color
177
+ history, `r32float` logarithmic-depth history, conservative depth rejection, YCoCg variance
178
+ clipping, motion/luminance-reactive history weight, resolve-only sharpening,
179
+ projection-cut/resize/device-loss invalidation, and deterministic jitter rollback. Clustered
180
+ Forward+ can opt into the same resolve; GPU Scene fuses motion output into its existing depth
181
+ prepass, double-buffers visibility, and composes ordinary Forward fallback opaque before TAA and
182
+ fallback transparent afterward. Add the WebGPU Temporal Observatory example and real-pixel
183
+ convergence/camera-cut/GPU-validation coverage. `TemporalAAOptions.renderScale` accepts 0.5–1;
184
+ sub-native modes render opaque color, depth, motion, Clustered Forward+ Hi-Z, and cluster sizing
185
+ at the fixed internal scale, then reconstruct Catmull-Rom current color into output-resolution
186
+ color/depth history and a full-resolution depth attachment before transparent composition. Dynamic
187
+ resolution, authored reactive masks, and transparent history remain deferred.
188
+
189
+ - Add canonical built-in material definitions, stable material IDs and revisions, explicit
190
+ forward/depth-only/shadow-caster/picking roles, role-aware shader variants, per-slot texture/UV
191
+ transform/encoding/channel data, and deterministic coverage/transmission/compositing ownership.
192
+ Shadow rendering now requests the original material's shadow role, glTF constructs layered PBR
193
+ topology and all texture transforms before instantiation, and display conversion remains solely in
194
+ post-processing/output.
195
+ - Add the renderer-local shared GPU Material Database. Deduplicate material identities into stable
196
+ family/layout handles, coalesce revision-driven dirty record uploads, commit texture slot state
197
+ only after valid submission, retry discarded frames, and retain recovery through the
198
+ renderer-owned CPU shadow. Migrate Clustered Forward+ from its private per-bucket PBR table so GPU
199
+ Scene objects keep independent geometry-bucket and shared-material indices.
200
+ - Complete the Forward+/Clustered/Hi-Z/batching remediation audit. Preserve one global direct/batch
201
+ draw order, pack per-slot PBR texture metadata, use a single compact visible table with aligned
202
+ per-bucket storage offsets and zero indirect `firstInstance`, make overflow membership
203
+ deterministic, keep directional lights global, route AreaLight and shadow-enabled lights through
204
+ exact Forward fallback, restrict previous-frame Hi-Z to stable conservative LOD bounds, compose
205
+ fallback in linear HDR before separable Bloom/display, elide Bloom resources and passes at zero
206
+ strength, cache static batch normal matrices, and separate CPU record timing from GPU completion
207
+ in the 110k-object scale fixture.
208
+ - Add a repository-bundled Khronos Sponza Clustered Forward+ lighting lab with 202 animated local
209
+ lights, including 10 slow chromatic runners that curve through a wall-height central volume, GPU
210
+ Scene diagnostics, HDR bloom, a multi-region OrbitControls camera tour, responsive controls, and
211
+ an offline-friendly asset path with native WebGPU release coverage.
212
+ - Avoid repeated scene traversal, camera refresh, LightManager packing, and built-in semantic-block
213
+ activation while preparing resource-only compute, GPU-driven, and fullscreen passes. Their shared
214
+ buffer/texture/resource-use transaction remains submission-aware; scene passes activate semantics
215
+ only when an actual renderer list or mesh draw needs them. Clustered Forward+ now also batches all
216
+ fixed-bucket depth draws and all color draws into one native render pass each while retaining
217
+ independent indirect arguments, pipelines, bindings, and graph-declared dependencies.
218
+ - Make previous-frame Hi-Z occlusion conservative for moving and stationary cameras. Disable it for
219
+ the first frame after a view-projection or depth change, project bounds from the sphere's nearest
220
+ depth and all eight corners of its view-space bounding cube, select a mip covering the full
221
+ projected extent, and cover the full configured viewport with a specialized pyramid of up to
222
+ thirteen levels. Only transform- and bounds-stable objects consume previous history. The current
223
+ pyramid is still retained so culling resumes immediately on the next stable frame without temporal
224
+ disocclusion holes, off-axis under-bounds, or large-geometry false positives. GPU Scene frustum
225
+ culling now tests the exact view-space side-plane radius instead of underestimating large spheres
226
+ near a screen edge, and honors each mesh's `frustumTest` opt-out.
227
+ - Keep GPU Scene depth-prepass and color-pass clip-space transforms byte-identical so reversed-depth
228
+ testing remains stable while the camera moves instead of exposing stippled, checkerboard, or large
229
+ missing regions from cross-program floating-point rounding.
230
+ - Keep default Forward lighting, clear colors, transparent blending, and intermediate effects in
231
+ linear space, then apply one exact linear-to-sRGB transfer at the browser surface. Multi-camera
232
+ load/blend stays in a renderer-owned linear composition target, while already transformed Color
233
+ Uber output is presented without a second conversion. Single-camera MSAA resolves into the
234
+ persistent single-sample composition target; multi-camera stacks use one single-sample
235
+ color/depth/stencil composition contract so later cameras can load prior contents exactly.
236
+ - Keep ShaderMaterial scene output linear and make custom pipeline presentation encoding explicit.
237
+ ShaderToy now relies on the shared Forward output transfer, while the compute particle field and
238
+ crystal path tracer declare their display-referred output so their authored grading is not
239
+ transferred twice.
240
+ - Advance the RHI benchmark manifest to schema 4 and model fixed surface-output draws separately
241
+ from primary scene and post-process draws; immutable snapshots from earlier schemas remain
242
+ historical evidence and are not rewritten.
243
+ - Route opaque-composited transmission surfaces through the after-opaque forward queue so their
244
+ scene-color dependency is satisfied without conflating transmission with alpha blending. Apply
245
+ texture-slot encoding consistently to 2D, cube, and environment samples, including explicit sRGB
246
+ decoding for the LDR studio IBL. WebGPU shader lowering now retains the managed material sampler
247
+ for single-UV shaders instead of bypassing texture transforms, decoding, and channel remapping,
248
+ restoring WebGL2/WebGPU material parity.
249
+ - Add the `high-end` rendering profile, per-camera standard/reversed depth modes, finite/infinite
250
+ reversed-Z projection, depth-convention-aware surfaces, render targets, shadows, storage graphics,
251
+ and GPU picking. Add optional camera-relative GPU transforms while preserving CPU world identity,
252
+ plus submission-transactional current/previous camera, mesh, instance, skinning, and morph state.
253
+ `Node.invalidateTransformHistory()` resets discontinuous motion deterministically.
254
+ - Add the WebGPU-only `ClusteredForwardPlusPipelineFactory` high-end opaque-scene slice. Registered
255
+ ordinary Mesh buckets now use stable dirty GPU Scene records, full-viewport previous-frame Hi-Z
256
+ occlusion, projected-size LOD compaction, fixed indexed-indirect draws, depth-driven logarithmic
257
+ 3D clusters, a bounded count/prefix/write light allocator, storage GGX PBR, HDR Bloom, ACES
258
+ display, and on-demand visibility/overflow diagnostics. Add real WebGPU renderer coverage for the
259
+ compute/dispatch/indirect-draw path. Make Hi-Z conservative for both standard and reversed depth,
260
+ use the committed previous view/projection/depth convention for temporal occlusion, preserve the
261
+ depth prepass during color shading, and use inverse-transpose object normal matrices. Registered
262
+ buckets now migrate at runtime between the GPU path and a shared Forward compatibility path for
263
+ material/geometry replacement, alpha, transparency, skinning, morphing, unregistered meshes, and
264
+ object-capacity overflow; the fallback preserves normal opaque/transparent sorting, shadows, and
265
+ transmission scene-color input without double-drawing GPU-managed meshes. Device limit
266
+ requirements cover every configured geometry/cluster buffer and dispatch dimension. Add a real
267
+ WebGPU 100k-static + 10k-dynamic + 256-light scale/recovery acceptance fixture and deterministic
268
+ cluster-overflow coverage. Share metallic/roughness surface evaluation and the BRDF between
269
+ ordinary Forward and clustered storage shaders so Forward+ replaces only light-list iteration. Add
270
+ native GPU Scene base-color, metallic, roughness, combined metallic-roughness, occlusion,
271
+ emission, and normal maps with UV0/UV1, UV matrices, tangent streams, sampler mutation, runtime
272
+ texture replacement, and device-recovery coverage; incompatible alpha/layered/deformed inputs
273
+ continue to use the Forward fallback.
274
+ - Let scriptable pipeline factories create persistent renderer-owned storage buffers, stage dirty
275
+ writes before graph import, and commit or discard CPU temporal state at the actual submission
276
+ boundary through `frameSubmitted()` and `frameDiscarded()`. Pipeline-owned buffers retain normal
277
+ device-loss recipes and submission-aware destruction. Frame completion still runs when a
278
+ post-submission pipeline callback throws, so presentation, events, diagnostics, and temporal
279
+ cleanup are not skipped after GPU work has already been submitted.
280
+ - Let scriptable render graphs import engine-managed `Texture` objects as sampled persistent
281
+ resources while preserving renderer upload/recovery/submission ownership. Expose the public
282
+ per-stage sampler limit alongside the existing sampled-texture limit.
283
+
284
+ - Add modern WebGPU capability discovery for `subgroups`, adapter subgroup-size limits,
285
+ `shader-f16`, and `timestamp-query`; expose renderer feature queries for explicit f32/workgroup
286
+ fallback selection. Direct WGSL f16 now preserves the exact native artifact while completing Naga
287
+ validation through an equivalent f32 specialization. Compute buffer `minBindingSize` is derived
288
+ from WGSL store types, including the required one-element runtime-array minimum.
289
+ - Add submission-aware timestamp QuerySets, pass timestamp writes, explicit resolves, and validated
290
+ debug groups/markers to the portable RHI. Opt-in renderer diagnostics now publish Render Graph
291
+ record/compile/prepare/execute CPU timing, per-pass asynchronous GPU timing, and compiled resource
292
+ lifetime intervals through a non-blocking three-slot readback ring; the default diagnostics-off
293
+ path creates no query resources.
294
+ - Add explicit Render Graph texture views for mip, array-layer, dimension, compatible-format, and
295
+ depth/stencil-aspect access across sampled, storage, attachment, and copy paths. Add
296
+ renderer-owned double/triple-buffer history textures whose recipes survive device recovery, whose
297
+ contents invalidate on descriptor or device-generation changes, and whose current/history rotation
298
+ commits only after a successful submitted writer frame. History recipes initially accept one
299
+ single-sample 2D color mip/layer so slot validity always means complete initialization.
300
+ - Add camera-relative cascaded shadows for directional lights on the shared WebGL 2/WebGPU shadow
301
+ atlas path. `DirectionalLight.shadow` now supports one to four cascades, practical split
302
+ weighting, a maximum shadow distance, cross-cascade blending, and texel stabilization while
303
+ preserving the existing single-shadow default. Filtered directional shadow contrast is
304
+ art-directable through `shadowStrength`. Add an interactive pastel sunset geometry-garden example
305
+ with live cascade count, stabilization, orbit controls, split, blend, strength, distance, and 4×
306
+ MSAA.
307
+ - Promote `OrbitControls` from an example helper to the public `src/controls` API, add constrained
308
+ `setView()` support for scripted tours, and make maintained examples reuse the engine control
309
+ instead of carrying local camera gesture implementations.
310
+
1
311
  # 2.0.0-alpha.2 (2026-07-26)
2
312
 
3
313
  ### Breaking changes
@@ -46,6 +356,8 @@
46
356
 
47
357
  ### Fixes
48
358
 
359
+ - Preserve GLSL comparison shadow samplers during storage-graphics WGSL lowering instead of
360
+ incorrectly sending already translated depth textures through numeric-depth specialization.
49
361
  - Keep float scene-color variants linear by suppressing material-local gamma encoding and legacy
50
362
  per-material tone mapping until the final display transform. Preserve HDR Bloom energy with
51
363
  normalized Karis weights, remove the non-physical far-distance light floor, and use refracted
@@ -58,6 +370,9 @@
58
370
  storage rows, pointer input, and readback. Apply it to Bloom, Color Uber, graph present,
59
371
  transmission, ShaderToy, Life Game, the compute particle field, the compute path tracer, and
60
372
  built-in material/environment sampling so WebGL 2 and WebGPU retain the same Y orientation.
373
+ - Keep shared Shadow Atlas rectangles in positive top-left coordinates and convert light-space UVs
374
+ through the portable render-target helper. WebGL 2 no longer samples a vertically mirrored depth
375
+ atlas that made moving shadows appear to rotate opposite their casters.
61
376
  - Correct `SpriteFrame`'s top-left atlas-row offset for `flipY` textures on both backends. Full
62
377
  textures were unaffected, but subframes previously selected the vertically opposite source row,
63
378
  swapping nine-slice top/bottom pieces and requiring reversed character-direction maps. Use a
@@ -86,9 +401,10 @@
86
401
 
87
402
  ### Changes
88
403
 
89
- - Add a portable `build-hilo3d-games` Agent Skill with strict TypeScript/Vite starters for 2D, 3D,
90
- and hybrid games, stable-first `2.0.0` dependency resolution, focused public-API references, and
91
- repository checks that keep bundled examples and version-selection behavior valid.
404
+ - Add a portable `hilo3d-game` Agent Skill under `skills/` with strict TypeScript/Vite starters for
405
+ 2D, 3D, and hybrid games, stable-first `2.0.0` dependency resolution, focused public-API
406
+ references, and repository checks that keep bundled examples and version-selection behavior valid
407
+ without treating the skill as repository-scoped Codex guidance.
92
408
  - Separate the full release gate from npm's publish lifecycle: `npm run release:check` retains the
93
409
  complete validation matrix, while `prepublishOnly` performs only fast deterministic checks before
94
410
  `prepack` builds the tarball, avoiding repeated browser suites and expired publish OTPs.
@@ -149,19 +465,21 @@
149
465
  forces, boundary physics, GPU-authored indirect arguments, and three particle raster layers stay
150
466
  on the public Render Graph/RHI path. Its deterministic test mode drives real pointer input without
151
467
  reading particle state back to the CPU.
152
- - Keep first-release compute textures limited to complete 2D graph resources, with transient
153
- write-only storage textures and no persistent storage-texture or layer/mip-view API. Persistent
154
- state uses externally owned renderer `StorageBuffer` objects imported per frame; each Renderer
155
- accepts one pending storage-buffer readback. `cpu-shadow` recovery restores CPU bytes rather than
156
- later GPU mutations, and Direct WGSL `f16` remains fail-closed until the Naga validation path can
157
- validate it end to end. Storage-aware graphics retains broader Material/Scene texture reflection,
158
- while `GPUDrivenRenderPass` rejects non-2D graph texture bindings before backend execution.
468
+ - Keep storage texture writes write-only and complete for the selected single-mip view; overlapping
469
+ sampled/write feedback remains invalid. Persistent texture state uses renderer-owned history
470
+ recipes, while persistent buffer state uses externally owned renderer `StorageBuffer` objects
471
+ imported per frame; each Renderer accepts one pending storage-buffer readback. `cpu-shadow`
472
+ recovery restores CPU bytes rather than later GPU mutations, and Direct WGSL `f16` remains
473
+ fail-closed until the Naga validation path can validate it end to end. Storage-aware graphics
474
+ retains broader Material/Scene texture reflection, while `GPUDrivenRenderPass` validates explicit
475
+ graph view dimension, format, and sample type before backend execution.
159
476
  - Expose the built-in forward culling results to features, reject feature runtimes shared across
160
477
  Renderers, and preserve selected RenderTarget color/depth/stencil clear/load/store operations
161
478
  across feature-enabled scene, intermediate-color, and output passes.
162
- - Reject pre-opaque scene-color sampling and keep the built-in forward feature's `sampledDepth`
163
- option fail-closed; a custom SRP can explicitly compose depth prepass, compute culling, and a
164
- storage-aware Scene pass for Forward+.
479
+ - Reject pre-opaque scene-color sampling and support built-in Forward `sampledDepth` through
480
+ single-sample sampleable depth plus portable non-filtering fullscreen bindings. A custom SRP can
481
+ still explicitly compose depth prepass, compute culling, and a storage-aware Scene pass for
482
+ Forward+.
165
483
  - Add backend-neutral `Renderer.waitForIdle()` for application completion fences. Native WebGL 2 or
166
484
  WebGPU interoperability is opt-in through `Renderer.getExtension()` instead of public `gl` or
167
485
  `gpuDevice` fields.