Skip to content

Group F: compressed-format tables, BMP/ICO suffixes, sprite MRT and ZLIB KTX2 (LOW-N36, LOW-N37, LOW-N38, ME-83) - #633

Merged
Exoridus merged 4 commits into
mainfrom
review/group-f-texture-followups
Aug 28, 2026
Merged

Group F: compressed-format tables, BMP/ICO suffixes, sprite MRT and ZLIB KTX2 (LOW-N36, LOW-N37, LOW-N38, ME-83)#633
Exoridus merged 4 commits into
mainfrom
review/group-f-texture-followups

Conversation

@Exoridus

Copy link
Copy Markdown
Owner

Four follow-ups from the Group D review, all in the compressed-texture and render-target seams they share. One commit per point.

Complete the ASTC and signed BC format tables (LOW-N38)

Both backends implement the full LDR ASTC set; the engine exposed 4 of 14 block sizes, missing exactly the 8x6 and 10x8 steps a mobile VRAM budget is met with. Adds the ten missing sizes plus bc4-r-snorm, bc5-rg-snorm and bc6h-rgb-float to the enum, the block table, the preference order, both backend tables and the KTX2 vkFormat map. The -srgb twins stay out: trivial code, undecided colour-space contract.

Claim .bmp and .ico for the texture type (LOW-N37)

The load path and the MIME sniffer already handled both; only the suffix list was missing, so a bare icon.ico resolved to no asset type. Which resolution the browser picks out of a multi-resolution ICO is documented as belonging to the runtime rather than settled by a bespoke parser.

Let a SpriteMaterial write every colour attachment (ME-83)

A G-buffer could only be authored from meshes while a 2D scene is sprites. The custom sprite pipeline now keys on the whole format list and declares one target per attachment, exactly like the mesh path. Not extended to the built-in shaders, and a sprite without a material is still refused.

Read ZLIB-supercompressed KTX2 (LOW-N36)

Scheme 3 is a plain zlib stream per level, which DecompressionStream inflates natively - no decoder, no bundle cost. Inflation runs ahead of the parser so parseKtx2 stays synchronous and testable without I/O; BasisLZ and Zstandard stay refused.

Validation

pnpm lanes --run selection green via the pre-push hook (typecheck, lint, sync, pnpm test, test:alloc, WebGL2/WebGPU/build/assets browser lanes, gates site). New cells verified red before the change for ME-83 and the format tables. API docs regenerated; guide sections for render targets and device variants corrected.

Exoridus added 4 commits August 28, 2026 05:36
…bles

Both backends already implement the full LDR ASTC set, but the engine exposed
four of the fourteen block sizes - leaving out 8x6 and 10x8, the two steps a
mobile VRAM budget is usually met with. The signed BC variants were missing for
the same reason: same blocks, different interpretation, and tangent-space normal
maps need the [-1, 1] range rather than a shader-side "v * 2 - 1".

Adds the ten missing ASTC sizes plus bc4-r-snorm, bc5-rg-snorm and
bc6h-rgb-float to the format enum, the block-geometry table, the preference
order, both backend format tables and the KTX2 vkFormat mapping.

The sRGB twins stay out: the code would be trivial, the decision is not - they
belong to an engine-wide color space contract.
The load path already served both: decodeImageBlob hands the blob to
createImageBitmap, which decodes BMP and ICO in every browser, and the MIME
sniffer already carried their magic bytes. Only the suffix list was missing, so
a bare "icon.ico" path resolved to no asset type at all.

An .ico container may hold several resolutions and which one the browser picks
is unspecified. That is documented as belonging to the runtime rather than
resolved by a bespoke ICO parser: the format is practically absent as a game
asset, and parsing it ourselves would cost more than it settles.
A G-buffer could only be authored from meshes, while a 2D scene is sprites - so
exactly the case multiple render targets exist for (deferred lighting, normal
mapping, selection ids) was unreachable in the form the scene already has.

It is the same seam and mechanically the same change as on the mesh side: the
custom sprite pipeline built a fixed single-entry target list and keyed on one
format, and now keys on the whole format list from renderTargetFormats and
declares one target per attachment. WebGL2 needs nothing beyond letting the
refusal guard through - it has no pipeline object.

Deliberately not extended to the built-in shaders: sprite, text, nine-slice,
repeating and video all declare exactly one output, and minting pipeline
variants that never write slot 1 is the unused API surface the multi-attachment
work package set out to avoid. A sprite WITHOUT a material is still refused.
Scheme 3 stores every mip level as a plain zlib stream, which
DecompressionStream inflates natively in every browser we target - no decoder,
no dependency, no bundle cost. Refusing it alongside BasisLZ and Zstandard,
which genuinely need a WASM transcoder, cost download bytes for nothing.

The inflation happens ahead of the parser rather than inside it:
DecompressionStream is a stream and parseKtx2 is synchronous, and keeping it
that way keeps the parser testable without I/O. inflateKtx2Levels rewrites the
container into an equivalent scheme-0 one - level index patched, everything the
header points at by absolute offset copied verbatim - and hands back the input
untouched when there is nothing to inflate. A level whose inflated size is not
the one the container declares is refused rather than uploaded short.
@Exoridus
Exoridus enabled auto-merge (squash) August 28, 2026 04:06
@codecov

codecov Bot commented Aug 28, 2026

Copy link
Copy Markdown

Bundle Report

Changes will increase total bundle size by 50.18kB (0.11%) ⬆️. This is within the configured threshold ✅

Detailed changes
Bundle name Size Change
exo-esm-esm 1.09MB 4.78kB (0.44%) ⬆️
exo-esm-modules-esm 3.11MB 9.61kB (0.31%) ⬆️
exo-iife-min-Exo-iife 1.09MB 4.79kB (0.44%) ⬆️
site-server-esm 31.49MB 4.22kB (0.01%) ⬆️
exo-full-iife-Exo-iife 4.75MB 11.2kB (0.24%) ⬆️
exo-iife-Exo-iife 3.01MB 9.79kB (0.33%) ⬆️
exo-full-iife-min-Exo-iife 1.74MB 5.79kB (0.33%) ⬆️

Affected Assets, Files, and Routes:

view changes for bundle: exo-full-iife-Exo-iife

Assets Changed:

Asset Name Size Change Total Size Change (%)
exo.full.iife.js 11.2kB 4.75MB 0.24%

Files in exo.full.iife.js:

  • ./src/rendering/texture/CompressedTextureFormat.ts → Total Size: 4.9kB
view changes for bundle: exo-full-iife-min-Exo-iife

Assets Changed:

Asset Name Size Change Total Size Change (%)
exo.full.iife.min.js 5.79kB 1.74MB 0.33%

Files in exo.full.iife.min.js:

  • ./src/rendering/texture/CompressedTextureFormat.ts → Total Size: 4.9kB
view changes for bundle: site-server-esm

Assets Changed:

Asset Name Size Change Total Size Change (%)
chunks/_astro_data-layer-content_DEgEa6Yc.mjs (New) 6.4MB 6.4MB 100.0% 🚀
prerender-entry.GbaitccD.mjs (New) 235.04kB 235.04kB 100.0% 🚀
chunks/audio-basics_UawjMlok.mjs (New) 107.94kB 107.94kB 100.0% 🚀
chunks/gamepad_QkHUblwE.mjs (New) 100.0kB 100.0kB 100.0% 🚀
chunks/graphics_BtIDkhDJ.mjs (New) 75.46kB 75.46kB 100.0% 🚀
chunks/debugging-and-inspection_tol931Gr.mjs (New) 67.4kB 67.4kB 100.0% 🚀
chunks/sprites_6pLqLuDp.mjs (New) 65.21kB 65.21kB 100.0% 🚀
chunks/render-targets_CfbYL4Dw.mjs (New) 58.77kB 58.77kB 100.0% 🚀
chunks/_virtual_astro_get-image_Bz--08zk.mjs (New) 55.26kB 55.26kB 100.0% 🚀
chunks/keyboard-and-actions_4Hv5P0r6.mjs (New) 52.88kB 52.88kB 100.0% 🚀
chunks/ui-and-widgets_CpG2Xs88.mjs (New) 49.31kB 49.31kB 100.0% 🚀
chunks/resize-dpr-and-canvas_D8fMtJH3.mjs (New) 39.66kB 39.66kB 100.0% 🚀
chunks/device-variants_iNxkCU7q.mjs (New) 37.6kB 37.6kB 100.0% 🚀
chunks/scenes-and-lifecycle_h1yDnuOq.mjs (New) 35.13kB 35.13kB 100.0% 🚀
chunks/performance_wyMs-lNP.mjs (New) 28.89kB 28.89kB 100.0% 🚀
chunks/_astro_content_ByAnn1kl.mjs (New) 25.36kB 25.36kB 100.0% 🚀
chunks/build-orb-dodge_CZovBLaz.mjs (New) 23.02kB 23.02kB 100.0% 🚀
chunks/your-first-scene_D5N3loji.mjs (New) 21.01kB 21.01kB 100.0% 🚀
chunks/ApiSymbolPage_O3XPOgcL.mjs (New) 15.4kB 15.4kB 100.0% 🚀
chunks/GuideChapterPage_Dx-z9t_L.mjs (New) 13.12kB 13.12kB 100.0% 🚀
chunks/ApiAllPage_yLxJ_H4x.mjs (New) 12.01kB 12.01kB 100.0% 🚀
chunks/GuideIndexPage_*.mjs (New) 8.36kB 8.36kB 100.0% 🚀
chunks/ApiIndexPage_D7RNrr5r.mjs (New) 8.28kB 8.28kB 100.0% 🚀
chunks/content-modules_D5Gqexy2.mjs (New) 6.32kB 6.32kB 100.0% 🚀
chunks/sharp_BpNvd5r1.mjs (New) 5.39kB 5.39kB 100.0% 🚀
chunks/TryIt_BTBU-_94.mjs (New) 2.81kB 2.81kB 100.0% 🚀
chunks/GuidePartRedirect_BgJgqPcK.mjs (New) 1.94kB 1.94kB 100.0% 🚀
chunks/index_DESwrVSA.mjs (New) 1.61kB 1.61kB 100.0% 🚀
chunks/index_Sl9VUYL5.mjs (New) 1.61kB 1.61kB 100.0% 🚀
chunks/index_0qN-K5F1.mjs (New) 1.41kB 1.41kB 100.0% 🚀
chunks/index_DtnBk13h.mjs (New) 1.41kB 1.41kB 100.0% 🚀
chunks/_symbol__Llc4iQUS.mjs (New) 1.41kB 1.41kB 100.0% 🚀
chunks/_symbol___8I14_ye.mjs (New) 1.41kB 1.41kB 100.0% 🚀
chunks/index_Dh5bbJek.mjs (New) 957 bytes 957 bytes 100.0% 🚀
chunks/index_ouTygyf6.mjs (New) 957 bytes 957 bytes 100.0% 🚀
chunks/index_CISox_9N.mjs (New) 935 bytes 935 bytes 100.0% 🚀
chunks/index_Sa1s7Ati.mjs (New) 935 bytes 935 bytes 100.0% 🚀
chunks/all_B85HlSSZ.mjs (New) 919 bytes 919 bytes 100.0% 🚀
chunks/all_CU7g1mBX.mjs (New) 919 bytes 919 bytes 100.0% 🚀
chunks/debugging-and-inspection_sFu60qUM.mjs (New) 377 bytes 377 bytes 100.0% 🚀
chunks/resize-dpr-and-canvas_pfA06Hbc.mjs (New) 377 bytes 377 bytes 100.0% 🚀
chunks/scenes-and-lifecycle_DQ9VgEGU.mjs (New) 367 bytes 367 bytes 100.0% 🚀
chunks/your-first-scene_CO2Hwzc-.mjs (New) 367 bytes 367 bytes 100.0% 🚀
chunks/keyboard-and-actions_CEkDl5GP.mjs (New) 365 bytes 365 bytes 100.0% 🚀
chunks/build-orb-dodge_BX_4BGHk.mjs (New) 357 bytes 357 bytes 100.0% 🚀
chunks/render-targets_BkDV0qdX.mjs (New) 357 bytes 357 bytes 100.0% 🚀
chunks/device-variants_B6OL92c6.mjs (New) 356 bytes 356 bytes 100.0% 🚀
chunks/ui-and-widgets_B-Ddnoel.mjs (New) 355 bytes 355 bytes 100.0% 🚀
chunks/performance_BbmJk1a-.mjs (New) 351 bytes 351 bytes 100.0% 🚀
chunks/audio-basics_Bev_z2gx.mjs (New) 349 bytes 349 bytes 100.0% 🚀
chunks/graphics_ClzvZdpb.mjs (New) 345 bytes 345 bytes 100.0% 🚀
chunks/sprites_CAogEBmT.mjs (New) 343 bytes 343 bytes 100.0% 🚀
chunks/gamepad_D7JrFCgz.mjs (New) 339 bytes 339 bytes 100.0% 🚀
chunks/_astro_data-layer-content_yj_b69zi.mjs (Deleted) -6.39MB 0 bytes -100.0% 🗑️
prerender-entry.zG-wdc4t.mjs (Deleted) -235.04kB 0 bytes -100.0% 🗑️
chunks/audio-basics_lVHzcDth.mjs (Deleted) -107.94kB 0 bytes -100.0% 🗑️
chunks/gamepad_DK4iJBuZ.mjs (Deleted) -100.0kB 0 bytes -100.0% 🗑️
chunks/graphics_C8xm75a4.mjs (Deleted) -75.46kB 0 bytes -100.0% 🗑️
chunks/debugging-and-inspection_XHfUG2l-.mjs (Deleted) -67.4kB 0 bytes -100.0% 🗑️
chunks/sprites_BXlywL2d.mjs (Deleted) -65.21kB 0 bytes -100.0% 🗑️
chunks/render-targets_B-jfUTcZ.mjs (Deleted) -58.39kB 0 bytes -100.0% 🗑️
chunks/_virtual_astro_get-image_DshNPJsz.mjs (Deleted) -55.26kB 0 bytes -100.0% 🗑️
chunks/keyboard-and-actions_BT2kzYtJ.mjs (Deleted) -52.88kB 0 bytes -100.0% 🗑️
chunks/ui-and-widgets_C-zuIP9p.mjs (Deleted) -49.31kB 0 bytes -100.0% 🗑️
chunks/resize-dpr-and-canvas_v57WZjRk.mjs (Deleted) -39.66kB 0 bytes -100.0% 🗑️
chunks/device-variants_B9HG4M06.mjs (Deleted) -37.27kB 0 bytes -100.0% 🗑️
chunks/scenes-and-lifecycle_9xZ4m91Y.mjs (Deleted) -35.13kB 0 bytes -100.0% 🗑️
chunks/performance_Ca_JUeY4.mjs (Deleted) -28.89kB 0 bytes -100.0% 🗑️
chunks/_astro_content_CEOj6HTY.mjs (Deleted) -25.36kB 0 bytes -100.0% 🗑️
chunks/build-orb-dodge_Ct99KnBO.mjs (Deleted) -23.02kB 0 bytes -100.0% 🗑️
chunks/your-first-scene_t3XN75XX.mjs (Deleted) -21.01kB 0 bytes -100.0% 🗑️
chunks/ApiSymbolPage_B01K-_6T.mjs (Deleted) -15.4kB 0 bytes -100.0% 🗑️
chunks/GuideChapterPage_4Bw6ijzs.mjs (Deleted) -13.12kB 0 bytes -100.0% 🗑️
chunks/ApiAllPage_CfKcKbM0.mjs (Deleted) -12.01kB 0 bytes -100.0% 🗑️
chunks/GuideIndexPage_CF2IKqxd.mjs (Deleted) -8.36kB 0 bytes -100.0% 🗑️
chunks/ApiIndexPage_C9pIKxsR.mjs (Deleted) -8.28kB 0 bytes -100.0% 🗑️
chunks/content-modules_BIxRZbtD.mjs (Deleted) -6.32kB 0 bytes -100.0% 🗑️
chunks/sharp_DRSAfjMH.mjs (Deleted) -5.39kB 0 bytes -100.0% 🗑️
chunks/TryIt_8emhlUb_.mjs (Deleted) -2.81kB 0 bytes -100.0% 🗑️
chunks/GuidePartRedirect_B2H50oPd.mjs (Deleted) -1.94kB 0 bytes -100.0% 🗑️
chunks/index_CkTYMEWW.mjs (Deleted) -1.61kB 0 bytes -100.0% 🗑️
chunks/index_Ckq2HJdY.mjs (Deleted) -1.61kB 0 bytes -100.0% 🗑️
chunks/index_BL-qsDtK.mjs (Deleted) -1.41kB 0 bytes -100.0% 🗑️
chunks/index_DbCsmxDF.mjs (Deleted) -1.41kB 0 bytes -100.0% 🗑️
chunks/_symbol__CxZG9-81.mjs (Deleted) -1.41kB 0 bytes -100.0% 🗑️
chunks/_symbol__DTZIrkQu.mjs (Deleted) -1.41kB 0 bytes -100.0% 🗑️
chunks/index_B9-H2EJc.mjs (Deleted) -957 bytes 0 bytes -100.0% 🗑️
chunks/index_db3Aneao.mjs (Deleted) -957 bytes 0 bytes -100.0% 🗑️
chunks/index_DNEWK1lh.mjs (Deleted) -935 bytes 0 bytes -100.0% 🗑️
chunks/index_DU13OFcp.mjs (Deleted) -935 bytes 0 bytes -100.0% 🗑️
chunks/all_BX8VMv2i.mjs (Deleted) -919 bytes 0 bytes -100.0% 🗑️
chunks/all_Cu-sc--A.mjs (Deleted) -919 bytes 0 bytes -100.0% 🗑️
chunks/debugging-and-inspection_DUFPf5ZZ.mjs (Deleted) -377 bytes 0 bytes -100.0% 🗑️
chunks/resize-dpr-and-canvas_eYiztUWu.mjs (Deleted) -377 bytes 0 bytes -100.0% 🗑️
chunks/scenes-and-lifecycle_CE_LM42B.mjs (Deleted) -367 bytes 0 bytes -100.0% 🗑️
chunks/your-first-scene_C4MKR4Pk.mjs (Deleted) -367 bytes 0 bytes -100.0% 🗑️
chunks/keyboard-and-actions_DIkCLe_h.mjs (Deleted) -365 bytes 0 bytes -100.0% 🗑️
chunks/build-orb-dodge_eLMqDdIi.mjs (Deleted) -357 bytes 0 bytes -100.0% 🗑️
chunks/render-targets_ANsvuvCL.mjs (Deleted) -357 bytes 0 bytes -100.0% 🗑️
chunks/device-variants_DnL0NhPw.mjs (Deleted) -356 bytes 0 bytes -100.0% 🗑️
chunks/ui-and-widgets_DMB0QQOs.mjs (Deleted) -355 bytes 0 bytes -100.0% 🗑️
chunks/performance_DUTuSaNe.mjs (Deleted) -351 bytes 0 bytes -100.0% 🗑️
chunks/audio-basics_zxAElbZE.mjs (Deleted) -349 bytes 0 bytes -100.0% 🗑️
chunks/graphics_IFlgfdTm.mjs (Deleted) -345 bytes 0 bytes -100.0% 🗑️
chunks/sprites_DGmHHIJL.mjs (Deleted) -343 bytes 0 bytes -100.0% 🗑️
chunks/gamepad_DyHwJLyB.mjs (Deleted) -339 bytes 0 bytes -100.0% 🗑️

Files in chunks/render-targets_CfbYL4Dw.mjs:

  • ./src/content/guide/rendering/render-targets.mdx → Total Size: 58.35kB

Files in chunks/device-variants_iNxkCU7q.mjs:

  • ./src/content/guide/assets/device-variants.mdx → Total Size: 37.35kB
view changes for bundle: exo-esm-esm

Assets Changed:

Asset Name Size Change Total Size Change (%)
exo.esm.js 4.78kB 1.09MB 0.44%

Files in exo.esm.js:

  • ./src/rendering/multiAttachmentGuard.ts → Total Size: 2.19kB

  • ./src/assets/types/textureType.ts → Total Size: 1.57kB

  • ./src/assets/factories/TextureFactory.ts → Total Size: 1.71kB

  • ./src/assets/factories/ktx2.ts → Total Size: 11.71kB

  • ./src/rendering/webgpu/WebGpuSpriteRenderer.ts → Total Size: 51.21kB

  • ./src/rendering/texture/CompressedTextureFormat.ts → Total Size: 9.67kB

  • ./src/rendering/webgpu/webgpuCompressedFormat.ts → Total Size: 2.59kB

  • ./src/rendering/webgl2/webgl2CompressedFormat.ts → Total Size: 2.32kB

view changes for bundle: exo-iife-min-Exo-iife

Assets Changed:

Asset Name Size Change Total Size Change (%)
exo.iife.min.js 4.79kB 1.09MB 0.44%

Files in exo.iife.min.js:

  • ./src/rendering/multiAttachmentGuard.ts → Total Size: 2.23kB

  • ./src/assets/types/textureType.ts → Total Size: 1.62kB

  • ./src/assets/factories/ktx2.ts → Total Size: 11.99kB

  • ./src/rendering/webgpu/webgpuCompressedFormat.ts → Total Size: 2.66kB

  • ./src/rendering/webgpu/WebGpuSpriteRenderer.ts → Total Size: 52.41kB

  • ./src/rendering/texture/CompressedTextureFormat.ts → Total Size: 9.96kB

  • ./src/assets/factories/TextureFactory.ts → Total Size: 1.74kB

  • ./src/rendering/webgl2/webgl2CompressedFormat.ts → Total Size: 2.4kB

view changes for bundle: exo-iife-Exo-iife

Assets Changed:

Asset Name Size Change Total Size Change (%)
exo.iife.js 9.79kB 3.01MB 0.33%

Files in exo.iife.js:

  • ./src/rendering/multiAttachmentGuard.ts → Total Size: 2.23kB

  • ./src/rendering/webgpu/WebGpuSpriteRenderer.ts → Total Size: 52.41kB

  • ./src/rendering/texture/CompressedTextureFormat.ts → Total Size: 9.96kB

  • ./src/rendering/webgpu/webgpuCompressedFormat.ts → Total Size: 2.66kB

  • ./src/assets/factories/ktx2.ts → Total Size: 11.99kB

  • ./src/assets/factories/TextureFactory.ts → Total Size: 1.74kB

  • ./src/assets/types/textureType.ts → Total Size: 1.62kB

  • ./src/rendering/webgl2/webgl2CompressedFormat.ts → Total Size: 2.4kB

view changes for bundle: exo-esm-modules-esm

Assets Changed:

Asset Name Size Change Total Size Change (%)
rendering/webgpu/WebGpuSpriteRenderer.js 39 bytes 53.24kB 0.07%
assets/factories/ktx2.js 5.33kB 11.94kB 80.72% ⚠️
rendering/texture/CompressedTextureFormat.js 2.84kB 9.93kB 40.02% ⚠️
rendering/webgpu/webgpuCompressedFormat.js 541 bytes 2.82kB 23.71% ⚠️
rendering/webgl2/webgl2CompressedFormat.js 394 bytes 2.52kB 18.57% ⚠️
rendering/multiAttachmentGuard.js 92 bytes 2.44kB 3.92%
assets/factories/TextureFactory.js 50 bytes 2.15kB 2.39%
assets/types/textureType.js 320 bytes 1.94kB 19.7% ⚠️

Files in rendering/webgpu/WebGpuSpriteRenderer.js:

  • ./src/rendering/webgpu/WebGpuSpriteRenderer.ts → Total Size: 51.16kB

Files in assets/factories/ktx2.js:

  • ./src/assets/factories/ktx2.ts → Total Size: 11.68kB

Files in rendering/texture/CompressedTextureFormat.js:

  • ./src/rendering/texture/CompressedTextureFormat.ts → Total Size: 9.67kB

Files in rendering/webgpu/webgpuCompressedFormat.js:

  • ./src/rendering/webgpu/webgpuCompressedFormat.ts → Total Size: 2.59kB

Files in rendering/webgl2/webgl2CompressedFormat.js:

  • ./src/rendering/webgl2/webgl2CompressedFormat.ts → Total Size: 2.32kB

Files in rendering/multiAttachmentGuard.js:

  • ./src/rendering/multiAttachmentGuard.ts → Total Size: 2.19kB

Files in assets/factories/TextureFactory.js:

  • ./src/assets/factories/TextureFactory.ts → Total Size: 1.71kB

Files in assets/types/textureType.js:

  • ./src/assets/types/textureType.ts → Total Size: 1.57kB

@codecov

codecov Bot commented Aug 28, 2026

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 92.92929% with 7 lines in your changes missing coverage. Please review.
✅ All tests successful. No failed tests found.

Files with missing lines Patch % Lines
src/assets/factories/ktx2.ts 92.50% 6 Missing ⚠️
src/assets/factories/TextureFactory.ts 0.00% 1 Missing ⚠️

📢 Thoughts on this report? Let us know!

@Exoridus
Exoridus merged commit 982dc1d into main Aug 28, 2026
21 checks passed
@Exoridus
Exoridus deleted the review/group-f-texture-followups branch August 28, 2026 04:17
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant