@meimu/mutracer 0.1.1 → 0.1.3

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.
Files changed (95) hide show
  1. package/dist/assets/bvh.worker.js +1 -1
  2. package/dist/mutracer.umd.js +3525 -3484
  3. package/docs/materials.md +27 -7
  4. package/docs/threejs.md +13 -2
  5. package/docs/viewer.md +53 -0
  6. package/lib/oidn.d.ts +1 -1
  7. package/lib/oidnBundledWeights.cdn.d.ts +2 -2
  8. package/lib/renderer/MaterialTable.d.ts +1 -0
  9. package/lib/renderer/MaterialTable.js +2 -1
  10. package/lib/renderer/MaterialTable.js.map +1 -1
  11. package/lib/renderer/WGPUBloomPass.js +18 -18
  12. package/lib/renderer/WGPUFullQuadPass.js +3 -3
  13. package/lib/renderer/WGPUJNLMDenoiser.js +62 -62
  14. package/lib/renderer/WGPURayTraceOutput.js +14 -12
  15. package/lib/renderer/WGPURayTraceOutput.js.map +1 -1
  16. package/lib/renderer/WGPURayTracePass.js +2 -2
  17. package/lib/renderer/WGPURayTracePass.js.map +1 -1
  18. package/lib/renderer/WGPURenderingPipeline.js +20 -18
  19. package/lib/renderer/WGPURenderingPipeline.js.map +1 -1
  20. package/lib/renderer/WebGLJNLMDenoiser.js +61 -61
  21. package/lib/renderer/WebGLRayTraceOutputPass.js +4 -4
  22. package/lib/renderer/WebGLRayTracePass.js +3 -1
  23. package/lib/renderer/WebGLRayTracePass.js.map +1 -1
  24. package/lib/renderer/glsl/chunks/cameraRay.glsl.js +9 -9
  25. package/lib/renderer/glsl/chunks/envMap.glsl.js +45 -45
  26. package/lib/renderer/glsl/chunks/intersect.glsl.js +262 -262
  27. package/lib/renderer/glsl/chunks/materialBuffer.glsl.js +111 -111
  28. package/lib/renderer/glsl/chunks/openPbrBsdf.glsl.js +436 -436
  29. package/lib/renderer/glsl/chunks/rand.glsl.js +3 -3
  30. package/lib/renderer/glsl/chunks/random.glsl.js +3 -3
  31. package/lib/renderer/glsl/chunks/rayTraceCore.glsl.js +32 -32
  32. package/lib/renderer/glsl/chunks/sampleLight.glsl.js +54 -54
  33. package/lib/renderer/glsl/chunks/sampleMaterial.glsl.js +71 -71
  34. package/lib/renderer/glsl/chunks/sampleShadowCatcher.glsl.js +12 -12
  35. package/lib/renderer/glsl/chunks/sampling.glsl.js +64 -64
  36. package/lib/renderer/glsl/chunks/sobol.glsl.js +49 -49
  37. package/lib/renderer/glsl/chunks/textureLinear.glsl.js +5 -5
  38. package/lib/renderer/glsl/chunks/uvProjection.glsl.js +5 -5
  39. package/lib/renderer/glsl/depthQuery.frag.js +2 -2
  40. package/lib/renderer/glsl/normalizeRayTraceOutput.frag.js +8 -8
  41. package/lib/renderer/glsl/rayTrace.frag.js +128 -128
  42. package/lib/renderer/glsl/shadowCatcher.frag.js +12 -12
  43. package/lib/renderer/glsl/webglPipeline.frag.js +49 -49
  44. package/lib/renderer/lightsUtil.js +1 -1
  45. package/lib/renderer/lightsUtil.js.map +1 -1
  46. package/lib/renderer/materialComparison.generated.js +5 -0
  47. package/lib/renderer/materialComparison.generated.js.map +1 -1
  48. package/lib/renderer/materialLayout.js +2 -1
  49. package/lib/renderer/materialLayout.js.map +1 -1
  50. package/lib/renderer/prepareMeshBVH.d.ts +4 -2
  51. package/lib/renderer/prepareMeshBVH.js +44 -20
  52. package/lib/renderer/prepareMeshBVH.js.map +1 -1
  53. package/lib/renderer/scratchSampling.js +6 -6
  54. package/lib/renderer/wgsl/chunks/common.wgsl.js +4 -4
  55. package/lib/renderer/wgsl/chunks/envMap.wgsl.js +29 -29
  56. package/lib/renderer/wgsl/chunks/intersect.wgsl.js +376 -379
  57. package/lib/renderer/wgsl/chunks/intersect.wgsl.js.map +1 -1
  58. package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.js +5 -5
  59. package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js +51 -51
  60. package/lib/renderer/wgsl/chunks/openPbrBsdf.wgsl.js +453 -453
  61. package/lib/renderer/wgsl/chunks/pdm_displacement.wgsl.d.ts +1 -1
  62. package/lib/renderer/wgsl/chunks/pdm_displacement.wgsl.js +122 -117
  63. package/lib/renderer/wgsl/chunks/pdm_displacement.wgsl.js.map +1 -1
  64. package/lib/renderer/wgsl/chunks/rand.wgsl.js +3 -3
  65. package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.js +13 -13
  66. package/lib/renderer/wgsl/chunks/sampleLight.wgsl.js +94 -94
  67. package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.js +119 -119
  68. package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.js +5 -5
  69. package/lib/renderer/wgsl/chunks/sampling.wgsl.js +62 -62
  70. package/lib/renderer/wgsl/chunks/shadowCatcherAccumulation.wgsl.d.ts +3 -3
  71. package/lib/renderer/wgsl/chunks/shadowCatcherAccumulation.wgsl.js +2 -2
  72. package/lib/renderer/wgsl/chunks/shadowCatcherAccumulation.wgsl.js.map +1 -1
  73. package/lib/renderer/wgsl/chunks/sobol.wgsl.js +53 -53
  74. package/lib/renderer/wgsl/chunks/uvProjection.wgsl.js +5 -5
  75. package/lib/renderer/wgsl/compose.frag.wgsl.d.ts +2 -2
  76. package/lib/renderer/wgsl/compose.frag.wgsl.js +120 -92
  77. package/lib/renderer/wgsl/compose.frag.wgsl.js.map +1 -1
  78. package/lib/renderer/wgsl/customDenoise.wgsl.js +10 -10
  79. package/lib/renderer/wgsl/depthQuery.wgsl.js +3 -3
  80. package/lib/renderer/wgsl/offlineAdaptive.compute.js +26 -26
  81. package/lib/renderer/wgsl/rayTrace.compute.js +220 -211
  82. package/lib/renderer/wgsl/rayTrace.compute.js.map +1 -1
  83. package/lib/scene/OpenPBRMaterial.d.ts +4 -2
  84. package/lib/scene/OpenPBRMaterial.js +4 -2
  85. package/lib/scene/OpenPBRMaterial.js.map +1 -1
  86. package/lib/scene/openPbrSchema.d.ts +7 -2
  87. package/lib/scene/openPbrSchema.js +2 -1
  88. package/lib/scene/openPbrSchema.js.map +1 -1
  89. package/lib/util/fromTHREE.d.ts +1 -0
  90. package/lib/util/fromTHREE.js +24 -6
  91. package/lib/util/fromTHREE.js.map +1 -1
  92. package/lib/version.d.ts +1 -1
  93. package/lib/version.js +1 -1
  94. package/lib/version.js.map +1 -1
  95. package/package.json +5 -4
package/docs/materials.md CHANGED
@@ -198,13 +198,33 @@ start.
198
198
 
199
199
  ## Displacement
200
200
 
201
- `displacementMap` (red channel) with `displacementScale` (local units)
202
- ray-marches the height field in the shader. `displacementStepSize` controls the
203
- ray-marching step (default `0.01`). No extra triangles are generated.
204
- `displacementUvProjection` (default `'none'`) and `displacementUvProjectionScale`
205
- (default `1`) control height-map coordinates.
206
-
207
- The remaining `displacement*` properties are documented in the type declarations.
201
+ Assign a `displacementMap` and adjust `displacementScale` (height) and
202
+ `displacementBias`. The red channel supplies linear height; the offset along
203
+ the normal is `red × displacementScale + displacementBias`. Bias defaults to
204
+ `0`, so black leaves the surface in place and white uses the full height.
205
+ For centered displacement, use a bias of `-displacementScale / 2`. Displacement
206
+ requires WebGPU; WebGL 2 renders the original surface. No extra triangles are
207
+ generated.
208
+
209
+ `displacementScale` defaults to `0.1`; both height and bias use mesh-local
210
+ units. Height `0` removes map variation while bias still offsets the surface;
211
+ set both to `0` or remove the map to disable displacement. The offset follows
212
+ the mesh transform, like Three.js displacement or Blender's Object Space mode:
213
+ scaling an object also scales its displacement.
214
+ Baking a scale into vertex positions requires scaling both `displacementScale`
215
+ and `displacementBias` by the same amount to preserve the result.
216
+
217
+ `displacementStepSize` defaults to `0`, which automatically uses 1/32 of the
218
+ absolute displacement height. A positive value sets a fixed step in mesh-local
219
+ units. Smaller steps capture finer detail at a higher rendering cost; set
220
+ `0.01` explicitly to retain the previous fixed-step default. When baking an
221
+ object scale into vertices, scale an explicit step by the same amount; an
222
+ automatic step follows the height. `displacementUvProjection` (default `'none'`)
223
+ and `displacementUvProjectionScale` (default `1`) control height-map coordinates.
224
+
225
+ Choose the height for your model's local dimensions. The library does not infer
226
+ physical units or resize the model. Changing displacement settings can trigger
227
+ an expensive [full mesh update](updates.md#full-mesh-updates).
208
228
 
209
229
  ## Known limitations
210
230
 
package/docs/threejs.md CHANGED
@@ -104,6 +104,16 @@ Meshes without UVs get automatic triplanar texture and displacement
104
104
  projection; explicit
105
105
  `mutracerUvProjection` settings take precedence.
106
106
 
107
+ Three.js `displacementScale` and `displacementBias` retain their local-unit
108
+ semantics. Without a displacement map, Three.js's inactive default height of `1`
109
+ is replaced by MuTracer's default `0.1`; other explicitly configured heights
110
+ are preserved. `userData.mutracerOpenPBR.displacementScale` can explicitly set
111
+ any height, including `1`, before a map is assigned; `displacementBias` in the
112
+ same metadata overrides the Three.js bias. The same metadata object's
113
+ `displacementStepSize` overrides marching quality: `0` uses automatic steps,
114
+ and a positive value is a fixed local-unit step. See
115
+ [displacement](materials.md#displacement) for scaling and cost.
116
+
107
117
  ## Skinning and morph targets
108
118
 
109
119
  The initial conversion and each `sync.update()` evaluate morph targets and
@@ -192,8 +202,9 @@ MuTracer transform; source rotation alone does not specify their direction.
192
202
  Construction subscribes to control events. The first update converts and writes
193
203
  sources to the engine. `scene` exposes the retained converted scene, or undefined
194
204
  when no source was supplied. A camera-only sync preserves a MuTracer-built scene.
195
- `active` covers start/end interaction, camera movement, damping and changing
196
- skinned/morph poses. OrbitControls damping stays consistent across render frame
205
+ `active` covers gestures once the camera moves, damping and changing
206
+ skinned/morph poses. Clicking or holding a stationary view preserves accumulated
207
+ samples. OrbitControls damping stays consistent across render frame
197
208
  rates, and final refinement resumes when motion settles. Use
198
209
  `updateControls: false` when your application already updates the controls.
199
210
 
package/docs/viewer.md ADDED
@@ -0,0 +1,53 @@
1
+ # Sharing viewer settings
2
+
3
+ Add settings to a viewer link to override the recipient's saved preferences.
4
+ For example, open the viewer with HDR output enabled:
5
+
6
+ ```text
7
+ https://mutracer.meimu-studio.com/viewer/?hdrOutputEnabled=true
8
+ ```
9
+
10
+ Combine settings with `&`, and use `#model=…` to choose an example:
11
+
12
+ ```text
13
+ https://mutracer.meimu-studio.com/viewer/?hdrOutputEnabled=true&maxSamples=128#model=dragon
14
+ ```
15
+
16
+ The viewer updates the URL as lighting, render and display settings change.
17
+ Copy the address bar to share those settings and the selected example model.
18
+ Settings also work in the hash, such as `#model=dragon&hdrOutputEnabled=true`.
19
+
20
+ ## Options
21
+
22
+ Parameter names match the viewer settings and are case-sensitive:
23
+
24
+ | Group | Parameters |
25
+ | --- | --- |
26
+ | Lighting | `lighting`, `studioPreset`, `studioIntensity`, `studioRotation`, `studioSize`, `studioAmbient`, `studioAmbientColor`, `envId`, `envIntensity`, `envRotation`, `envResolution` |
27
+ | Background and ground | `background`, `backgroundColor`, `groundedHeight`, `groundedRadius`, `groundShadow`, `groundOpacity` |
28
+ | Quality | `maxSamples`, `bounces`, `resolutionScale`, `samplingPattern`, `bvhBuilder`, `clamping`, `previewEnabled`, `previewMaxResolutionScale` |
29
+ | Denoising | `denoise`, `denoiseModel`, `denoiseWhileConverging`, `jnlmStrength`, `jnlmSearchRadius`, `jnlmPatchRadius`, `jnlmAlbedoBandwidth`, `jnlmNormalBandwidth`, `jnlmIterations`, `oidnModel`, `oidnMaxTileSize` |
30
+ | Display | `hdrOutputEnabled`, `toneMapping`, `exposure`, `contrast`, `saturation`, `temperature`, `tint`, `bloomIntensity`, `bloomThreshold`, `bloomRadius`, `vignette`, `output` |
31
+
32
+ Booleans accept `true`/`false` or `1`/`0`. Numbers must be finite and within
33
+ the setting's supported range. Colors use URL-encoded hex, for example
34
+ `backgroundColor=%232a2b30`. Use `null` for automatic `groundedHeight` or
35
+ `groundedRadius`. Choices use the setting's value, for example
36
+ `toneMapping=agx`, `envResolution=2k` or `denoiseModel=jnlm`.
37
+
38
+ Valid query parameters take priority over hash parameters, then saved local
39
+ preferences, then defaults. Unknown parameters and invalid values are ignored.
40
+ Explicit defaults such as `hdrOutputEnabled=false` remain in the link so they
41
+ can override a recipient's different preference. When the viewer updates the
42
+ address, settings move into the hash; unrelated query parameters, including
43
+ `?webgl`, are preserved.
44
+
45
+ ## Caveats
46
+
47
+ HDR output requires WebGPU, an HDR display and a compatible browser. Unsupported
48
+ devices fall back to SDR. `?webgl` forces WebGL 2, which does not support HDR output.
49
+
50
+ Links do not include uploaded models or environments, camera state, material
51
+ edits, object visibility or panel layout. Camera state continues to follow the
52
+ locally saved view for the current model. URL settings are applied on page load;
53
+ reload after editing parameters in the address bar.
package/lib/oidn.d.ts CHANGED
@@ -40,6 +40,6 @@ export declare const DEFAULT_OIDN_WEIGHTS_PACKAGE_BASE_URL = "https://cdn.jsdeli
40
40
  * Fallback for bundled standard/small weights when application assets fail.
41
41
  * Defaults to jsDelivr's `@meimu/mutracer@VERSION/oidn/weights/` directory.
42
42
  */
43
- export declare const DEFAULT_OIDN_WEIGHTS_BASE_URL = "https://cdn.jsdelivr.net/npm/@meimu/mutracer@0.1.1/oidn/weights/";
43
+ export declare const DEFAULT_OIDN_WEIGHTS_BASE_URL = "https://cdn.jsdelivr.net/npm/@meimu/mutracer@0.1.3/oidn/weights/";
44
44
  export declare function resolveOIDNModelUrl(model: OIDNModel, weightsBaseUrl?: string | URL): string;
45
45
  export declare function resolveOIDNAuxiliaryModelUrls(weightsBaseUrl?: string | URL): OIDNAuxiliaryModelUrls;
@@ -1,2 +1,2 @@
1
- export declare const standardWeightsUrl = "https://cdn.jsdelivr.net/npm/@meimu/mutracer@0.1.1/oidn/weights/rt_hdr_alb_nrm.tza";
2
- export declare const smallWeightsUrl = "https://cdn.jsdelivr.net/npm/@meimu/mutracer@0.1.1/oidn/weights/rt_hdr_alb_nrm_small.tza";
1
+ export declare const standardWeightsUrl = "https://cdn.jsdelivr.net/npm/@meimu/mutracer@0.1.3/oidn/weights/rt_hdr_alb_nrm.tza";
2
+ export declare const smallWeightsUrl = "https://cdn.jsdelivr.net/npm/@meimu/mutracer@0.1.3/oidn/weights/rt_hdr_alb_nrm_small.tza";
@@ -62,6 +62,7 @@ export interface BufferData extends Record<MaterialTextureIndex, number[]> {
62
62
  displacementUvProjection: number[];
63
63
  displacementUvProjectionScale: number[];
64
64
  displacementStepSize: number[];
65
+ displacementBias: number[];
65
66
  alpha: number[];
66
67
  alphaMode: number[];
67
68
  alphaCutoff: number[];
@@ -478,7 +478,8 @@ class MaterialTable {
478
478
  uvScale: materials.map((m) => m.uvProjectionScale || [1, 1]),
479
479
  displacementUvProjection: materials.map((m) => uvProjectionConstants[m.displacementUvProjection] || 0),
480
480
  displacementUvProjectionScale: materials.map((m) => m.displacementUvProjectionScale || 1),
481
- displacementStepSize: materials.map((m) => m.displacementStepSize || 0.01),
481
+ displacementBias: materials.map((m) => m.displacementBias),
482
+ displacementStepSize: materials.map((m) => Number.isFinite(m.displacementStepSize) && m.displacementStepSize > 0 ? m.displacementStepSize : 0),
482
483
  // Alpha
483
484
  alpha: materials.map((m) => m.opacity),
484
485
  alphaMode: materials.map((m) => materialAlphaModeConstants[resolveMaterialAlphaMode(m)]),
@@ -1 +1 @@
1
- {"version":3,"file":"MaterialTable.js","sourceRoot":"","sources":["../../src/renderer/MaterialTable.ts"],"names":[],"mappings":"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","sourcesContent":["import { specularAnisotropyModelIndex, finiteAnisotropySource } from '../scene/anisotropyParameters.js';\nimport { finiteFilmThickness, thinFilmMapChannelIndex } from '../scene/thinFilmParameters.js';\nimport { MATERIAL_TEXTURE_NAMES, MATERIAL_TEXTURE_SLOTS, type MaterialTextureIndex } from './materialTextureSlots.js';\nimport { packMaterialBuffer } from './materialLayout.js';\nimport { float16Bits } from './float16.js';\nimport {createCanvas} from '../util/canvas.js';\nimport { mapAlphaUsageConstants } from './materialConstants.js';\n// Portions adapted from ray-tracing-renderer@0.10.15\n// (https://github.com/hoverinc/ray-tracing-renderer).\n// Copyright (c) 2019 HOVER, MIT license; see LICENSES/RayTracingRenderer-MIT.txt.\n\nimport { ShadowCatcherMaterial, UnlitMaterial } from '../constants.js';\nimport { vec2 } from '../math.js';\nimport { materialEmission } from './materialEmission.js';\nimport {\n Texture2DArray as WebGLTexture2DArray,\n constants,\n Texture2D,\n type TexturePixelSource\n} from './webgl.js';\nimport OpenPBRMaterial, {\n materialAlphaModeConstants,\n resolveMaterialAlphaMode\n} from '../scene/OpenPBRMaterial.js';\nimport { ColorRGB } from '../types.js';\nimport { mergeTexturesFromMaterials } from './texturesFromMaterials.js';\nimport Texture, { isTextureDataSource } from '../scene/Texture.js';\nimport { commonNearestFloatProps, setDataTexture } from './dataTextureUtil.js';\nimport { SceneLight } from '../scene/Scene.js';\n\nexport const DEFAULT_MAX_TEXTURE_ARRAY_BYTES = 384 * 1024 * 1024;\n\nexport interface MaterialTableOptions {\n maxTextureArrayBytes?: number;\n maxTextureArrayLayers?: number;\n maxTextureDimension2D?: number;\n}\n\nexport interface TextureAtlasStats {\n estimatedBytes: number;\n height: number;\n layers: number;\n packTimeMs: number;\n scale: number;\n sourcePixels: number;\n textureCount: number;\n width: number;\n}\n\nexport function materialUsesMedium(material: OpenPBRMaterial): boolean {\n return !material.thinWalled && (\n (material.transmissionWeight > 0 && material.transmissionDepth > 0) ||\n material.subsurfaceWeight > 0\n );\n}\n\nexport const uvProjectionConstants = {\n none: 0,\n spherical: 1,\n cylindrical: 2,\n triplanar: 3\n};\n\ninterface AtlasPlacement {\n height: number;\n index: number;\n layer: number;\n width: number;\n x: number;\n y: number;\n}\n\ninterface AtlasShelf {\n height: number;\n x: number;\n y: number;\n}\n\ninterface AtlasPage {\n nextY: number;\n placements: AtlasPlacement[];\n shelves: AtlasShelf[];\n}\n\n/**\n * Packs material textures into a small 2D-array atlas.\n *\n * The input rectangles are sorted from tallest/largest to smallest, then\n * placed with a shelf allocator. Each atlas layer contains horizontal shelves;\n * a texture is inserted into the first shelf with enough remaining width, or a\n * new shelf is opened below the existing ones. A new array layer is allocated\n * only when none of the current layers has enough room.\n *\n * `makeTextureArray` first tries this packing at full resolution. If the result\n * exceeds the adapter layer limit or the configured memory budget, it performs\n * a binary search for the largest uniform scale that fits. This preserves full\n * resolution whenever packing alone is sufficient and degrades predictably on\n * constrained hardware.\n *\n * The returned placements keep the original logical texture indices. Shaders\n * use per-texture atlas metadata instead of treating the logical index as the\n * physical array layer.\n */\nfunction packTextureAtlas(\n textures: Texture[],\n pageSize: number,\n scale: number\n) {\n const pages: AtlasPage[] = [];\n const placements = new Array<AtlasPlacement>(textures.length);\n const items = textures\n .map((texture, index) => ({\n height: Math.max(1, Math.floor(texture.image.height * scale)),\n index,\n width: Math.max(1, Math.floor(texture.image.width * scale))\n }))\n .sort((a, b) => b.height - a.height || b.width - a.width);\n\n for (const item of items) {\n let placement: AtlasPlacement | undefined;\n for (let layer = 0; layer < pages.length && !placement; layer++) {\n const page = pages[layer];\n for (const shelf of page.shelves) {\n if (\n item.height <= shelf.height &&\n shelf.x + item.width <= pageSize\n ) {\n placement = {\n ...item,\n layer,\n x: shelf.x,\n y: shelf.y\n };\n shelf.x += item.width;\n break;\n }\n }\n if (!placement && page.nextY + item.height <= pageSize) {\n placement = {\n ...item,\n layer,\n x: 0,\n y: page.nextY\n };\n page.shelves.push({\n height: item.height,\n x: item.width,\n y: page.nextY\n });\n page.nextY += item.height;\n }\n }\n\n if (!placement) {\n const layer = pages.length;\n placement = { ...item, layer, x: 0, y: 0 };\n pages.push({\n nextY: item.height,\n placements: [],\n shelves: [{ height: item.height, x: item.width, y: 0 }]\n });\n }\n pages[placement.layer].placements.push(placement);\n placements[item.index] = placement;\n }\n\n return { pages, placements };\n}\n\nfunction createAtlasCanvas(width: number, height: number) {\n return createCanvas(width, height);\n}\n\nfunction createDataAtlasPage(\n width: number,\n height: number,\n page: ReturnType<typeof packTextureAtlas>['pages'][number],\n textures: Texture[],\n floatStorage: boolean\n): TexturePixelSource {\n const data = floatStorage ? new Uint16Array(width * height * 4) : new Uint8Array(width * height * 4);\n // Retain the same Canvas composition for DOM layers, including straight-alpha\n // readback. Raw sources never pass through Canvas or its color conversion.\n const domPlacements = page.placements.filter(p => !isTextureDataSource(textures[p.index].image));\n if (domPlacements.length) {\n const canvas = createAtlasCanvas(width, height);\n const context = canvas.getContext('2d');\n if (!context) throw new Error('Unable to create a canvas for the texture atlas.');\n for (const placement of domPlacements) drawAtlasImage(context, placement, textures[placement.index]);\n const pixels = context.getImageData(0, 0, width, height).data;\n for (let i = 0; i < pixels.length; i++) data[i] = floatStorage ? float16Bits(pixels[i] / 255) : pixels[i];\n }\n for (const placement of page.placements) {\n const texture = textures[placement.index];\n const source = texture.image;\n if (!isTextureDataSource(source)) continue;\n const bytes = source.data instanceof Uint8Array || source.data instanceof Uint8ClampedArray;\n if (!bytes && !(source.data instanceof Float32Array) && !(source.data instanceof Int32Array)) {\n throw new Error('Material texture data must be Uint8Array, Uint8ClampedArray, Float32Array or Int32Array.');\n }\n if (source.data.length !== source.width * source.height * 4) {\n throw new Error('Material texture RGBA source length does not match its dimensions.');\n }\n for (let y = 0; y < placement.height; y++) {\n let sourceY = Math.min(source.height - 1, Math.floor(((y + 0.5) * source.height) / placement.height));\n if (texture.flipY) sourceY = source.height - 1 - sourceY;\n for (let x = 0; x < placement.width; x++) {\n const sourceX = Math.min(source.width - 1, Math.floor(((x + 0.5) * source.width) / placement.width));\n const sourceOffset = (sourceY * source.width + sourceX) * 4;\n const targetOffset = ((placement.y + y) * width + placement.x + x) * 4;\n for (let c = 0; c < 4; c++) {\n const value = source.data[sourceOffset + c];\n data[targetOffset + c] = floatStorage ? float16Bits(bytes ? value / 255 : value) : value;\n }\n }\n }\n }\n return { data, width, height };\n}\n\nfunction drawAtlasImage(\n context: CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D,\n placement: AtlasPlacement,\n texture: Texture\n) {\n if (texture.flipY) {\n context.save();\n context.translate(placement.x, placement.y + placement.height);\n context.scale(1, -1);\n context.drawImage(texture.image as CanvasImageSource, 0, 0, placement.width, placement.height);\n context.restore();\n } else {\n context.drawImage(texture.image as CanvasImageSource, placement.x, placement.y, placement.width, placement.height);\n }\n}\n\nfunction makeTextureArray(\n textures: Texture[],\n sRGB = false,\n options: MaterialTableOptions = {}\n) {\n const packStart = performance.now();\n if (!textures.length) {\n return {\n mapInfo: [] as number[],\n mapTransform: [] as number[],\n mapUvChannel: [] as number[],\n mapColorLinear: [] as number[],\n stats: {\n estimatedBytes: 0,\n height: 1,\n layers: 0,\n packTimeMs: performance.now() - packStart,\n scale: 1,\n sourcePixels: 0,\n textureCount: 0,\n width: 1\n } satisfies TextureAtlasStats,\n texture: new WebGLTexture2DArray({\n width: 1,\n height: 1,\n sRGB,\n source: [],\n minFilter: constants.LINEAR,\n magFilter: constants.LINEAR,\n wrapS: constants.CLAMP_TO_EDGE,\n wrapT: constants.CLAMP_TO_EDGE\n })\n };\n }\n\n const dataBacked = textures.some((texture) =>\n isTextureDataSource(texture.image)\n );\n const mapColorLinear = textures.map(texture => {\n const image = texture.image;\n return Number(isTextureDataSource(image) &&\n !(image.data instanceof Uint8Array) && !(image.data instanceof Uint8ClampedArray));\n });\n const floatStorage = mapColorLinear.some(Boolean);\n const bytesPerPixel = floatStorage ? 8 : 4;\n\n const maxTextureArrayLayers = options.maxTextureArrayLayers ?? Infinity;\n const maxTextureDimension2D = options.maxTextureDimension2D ?? Infinity;\n const maxTextureArrayBytes =\n options.maxTextureArrayBytes ?? DEFAULT_MAX_TEXTURE_ARRAY_BYTES;\n const sourcePixels = textures.reduce(\n (sum, texture) => sum + texture.image.width * texture.image.height,\n 0\n );\n const maxSourceDimension = textures.reduce(\n (max, texture) =>\n Math.max(max, texture.image.width, texture.image.height),\n 1\n );\n const maxPageSizeFromBudget = Math.max(\n 1,\n Math.floor(Math.sqrt(maxTextureArrayBytes / bytesPerPixel))\n );\n const pageSize = Math.max(\n 1,\n Math.floor(\n Math.min(\n maxSourceDimension,\n maxTextureDimension2D,\n maxPageSizeFromBudget\n )\n )\n );\n const pageBytes = pageSize * pageSize * bytesPerPixel;\n const maxPageCount = Math.max(\n 1,\n Math.min(\n maxTextureArrayLayers,\n Math.floor(maxTextureArrayBytes / pageBytes)\n )\n );\n const maxScale = Math.min(1, pageSize / maxSourceDimension);\n let packed = packTextureAtlas(textures, pageSize, maxScale);\n let scale = maxScale;\n\n if (packed.pages.length > maxPageCount) {\n let low = 0;\n let high = maxScale;\n let bestPacked: ReturnType<typeof packTextureAtlas> | undefined;\n let bestScale = 0;\n for (let i = 0; i < 14; i++) {\n const candidateScale = (low + high) / 2;\n const candidate = packTextureAtlas(\n textures,\n pageSize,\n candidateScale\n );\n if (candidate.pages.length <= maxPageCount) {\n low = candidateScale;\n bestScale = candidateScale;\n bestPacked = candidate;\n } else {\n high = candidateScale;\n }\n }\n if (!bestPacked) {\n throw new Error(\n `Unable to fit ${textures.length} textures into ${maxPageCount} atlas layers.`\n );\n }\n packed = bestPacked;\n scale = bestScale;\n }\n\n const atlasWidth = Math.max(\n 1,\n ...packed.placements.map((placement) => placement.x + placement.width)\n );\n const atlasHeight = Math.max(\n 1,\n ...packed.placements.map((placement) => placement.y + placement.height)\n );\n const pages = packed.pages.map((page) => {\n if (dataBacked) {\n return createDataAtlasPage(atlasWidth, atlasHeight, page, textures, floatStorage);\n }\n const canvas = createAtlasCanvas(atlasWidth, atlasHeight);\n const context = canvas.getContext('2d');\n if (!context) {\n throw new Error('Unable to create a canvas for the texture atlas.');\n }\n for (const placement of page.placements) drawAtlasImage(context, placement, textures[placement.index]);\n return canvas;\n });\n\n if (scale < 0.999) {\n console.warn(\n `Texture atlas downscaled to ${(scale * 100).toFixed(1)}% to fit the GPU budget.`\n );\n }\n\n // mapInfo = [uvScale.x, uvScale.y, layer + uvOffset.x, uvOffset.y].\n // Packing layer and X offset into one float keeps the shader metadata to one\n // vec4 per logical texture; floor(z) restores the layer and fract(z) the X.\n const mapInfo = packed.placements.flatMap((placement) => {\n const offsetX = (placement.x + 0.5) / atlasWidth;\n const offsetY = (placement.y + 0.5) / atlasHeight;\n return [\n Math.max(placement.width - 1, 0) / atlasWidth,\n Math.max(placement.height - 1, 0) / atlasHeight,\n placement.layer + offsetX,\n offsetY\n ];\n });\n\n const texture = new WebGLTexture2DArray({\n width: atlasWidth,\n height: atlasHeight,\n sRGB,\n type: floatStorage ? constants.HALF_FLOAT : constants.UNSIGNED_BYTE,\n source: pages,\n flipY: false,\n flipYArray: pages.map(() => false),\n minFilter: constants.LINEAR,\n magFilter: constants.LINEAR,\n wrapS: constants.CLAMP_TO_EDGE,\n wrapT: constants.CLAMP_TO_EDGE\n });\n\n return {\n texture,\n mapInfo,\n mapTransform: textures.flatMap((texture) => [\n texture.uvScale[0],\n texture.uvScale[1],\n texture.uvOffset[0],\n texture.uvOffset[1]\n ]),\n mapUvChannel: textures.map((texture) => texture.uvChannel),\n mapColorLinear,\n stats: {\n estimatedBytes: atlasWidth * atlasHeight * pages.length * bytesPerPixel,\n height: atlasHeight,\n layers: pages.length,\n packTimeMs: performance.now() - packStart,\n scale,\n sourcePixels,\n textureCount: textures.length,\n width: atlasWidth\n } satisfies TextureAtlasStats\n };\n}\n\nexport interface BufferData extends Record<MaterialTextureIndex, number[]> {\n color: ColorRGB[];\n roughness: number[];\n metallic: number[];\n emission: ColorRGB[];\n ior: number[];\n transmission: number[];\n dispersion: number[];\n thinFilmThickness: number[];\n thinFilmThicknessMinimum: number[];\n thinFilmMapChannel: number[];\n thinFilmIor: number[];\n anisotropy: number[];\n thin: number[];\n doubleSided: number[];\n bevelSize: number[];\n mapAlphaUsage: number[];\n\n normalScale: vec2.Vec2Array[];\n\n type: (typeof ShadowCatcherMaterial | typeof UnlitMaterial | 0)[];\n mapInfo: number[];\n mapTransform: number[];\n mapUvChannel: number[];\n mapColorLinear: number[];\n\n mediumType: number[];\n specularAnisotropyModel: number[];\n specularAnisotropyRotation: number[];\n coatAnisotropyRotation: number[];\n coatNormalScale: vec2.Vec2Array[];\n\n uvProjection: number[];\n uvScale: vec2.Vec2Array[];\n\n displacementUvProjection: number[];\n displacementUvProjectionScale: number[];\n\n // For PDM displacement.\n displacementStepSize: number[];\n\n // Alpha\n alpha: number[];\n alphaMode: number[];\n alphaCutoff: number[];\n\n baseWeight: number[];\n baseDiffuseRoughness: number[];\n specularWeight: number[];\n specularColor: ColorRGB[];\n transmissionColor: ColorRGB[];\n transmissionDepth: number[];\n transmissionScatter: ColorRGB[];\n transmissionScatterAnisotropy: number[];\n subsurfaceWeight: number[];\n subsurfaceColor: ColorRGB[];\n subsurfaceRadius: number[];\n subsurfaceRadiusScale: ColorRGB[];\n subsurfaceScatterAnisotropy: number[];\n fuzzWeight: number[];\n fuzzColor: ColorRGB[];\n fuzzRoughness: number[];\n coatWeight: number[];\n coatColor: ColorRGB[];\n coatRoughness: number[];\n coatAnisotropy: number[];\n coatIor: number[];\n coatDarkening: number[];\n thinFilmWeight: number[];\n dispersionAbbeNumber: number[];\n mediumExtinction: ColorRGB[];\n mediumScattering: ColorRGB[];\n mediumAnisotropy: number[];\n}\n\nfunction clampColor(color: ArrayLike<number>, fallback = 0): ColorRGB {\n return [0, 1, 2].map((channel) => {\n const value = Number(color[channel]);\n return Number.isFinite(value) ? Math.min(1, Math.max(0, value)) : fallback;\n }) as ColorRGB;\n}\n\ntype OpenPbrMedium = {\n anisotropy: number;\n extinction: ColorRGB;\n scattering: ColorRGB;\n};\n\nfunction emptyOpenPbrMedium(): OpenPbrMedium {\n return {\n anisotropy: 0,\n extinction: [0, 0, 0],\n scattering: [0, 0, 0]\n };\n}\n\nfunction transmissionMedium(material: OpenPBRMaterial) {\n const weight = Math.min(1, Math.max(0, material.transmissionWeight));\n const depth = Math.max(0, material.transmissionDepth);\n if (weight <= 0 || depth <= 0 || material.thinWalled) return undefined;\n\n const color = clampColor(material.transmissionColor, 1);\n const scatterColor = clampColor(material.transmissionScatter);\n const extinction = color.map((channel) =>\n Math.max(0, -Math.log(Math.max(channel, 1e-6)) / depth)\n ) as ColorRGB;\n const scattering = scatterColor.map((channel, index) =>\n extinction[index] * channel\n ) as ColorRGB;\n return {\n anisotropy: Math.min(\n 0.999,\n Math.max(-0.999, material.transmissionScatterAnisotropy)\n ),\n extinction,\n scattering\n } satisfies OpenPbrMedium;\n}\n\nfunction subsurfaceMedium(material: OpenPBRMaterial) {\n const weight = Math.min(1, Math.max(0, material.subsurfaceWeight));\n if (weight <= 0 || material.thinWalled) return undefined;\n\n // OpenPBR's radius is the extinction mean free path. The van de Hulst\n // mapping converts the artist-facing multiple-scattering color to a\n // single-scattering albedo while compensating for phase anisotropy.\n const radius = Math.max(material.subsurfaceRadius, 1e-3);\n const radiusScale = clampColor(material.subsurfaceRadiusScale, 1);\n const color = clampColor(material.subsurfaceColor);\n const anisotropy = Math.min(\n 0.999,\n Math.max(-0.999, material.subsurfaceAnisotropy)\n );\n const extinction = radiusScale.map(\n (scale) => 1 / Math.max(radius * scale, 1e-3)\n ) as ColorRGB;\n const scattering = color.map((channel, index) => {\n const s = 4.09712 + 4.20863 * channel - Math.sqrt(\n 9.59217 + 41.6808 * channel + 17.7126 * channel * channel\n );\n const sSquared = s * s;\n const albedo = Math.min(\n 1,\n Math.max(0, (1 - sSquared) / (1 - anisotropy * sSquared))\n );\n return extinction[index] * albedo;\n }) as ColorRGB;\n return { anisotropy, extinction, scattering } satisfies OpenPbrMedium;\n}\n\nfunction combineOpenPbrMedia(\n material: OpenPBRMaterial,\n transmission: OpenPbrMedium | undefined,\n subsurface: OpenPbrMedium | undefined\n) {\n const transmissionFraction = transmission\n ? Math.min(1, Math.max(0, material.transmissionWeight))\n : 0;\n const subsurfaceFraction = subsurface\n ? (1 - transmissionFraction)\n * Math.min(1, Math.max(0, material.subsurfaceWeight))\n : 0;\n const total = transmissionFraction + subsurfaceFraction;\n if (total <= 0) return undefined;\n\n const transmissionWeight = transmissionFraction / total;\n const subsurfaceWeight = subsurfaceFraction / total;\n const extinction = [0, 1, 2].map((channel) => {\n const transmissionAbsorption = transmission\n ? transmission.extinction[channel] - transmission.scattering[channel]\n : 0;\n const subsurfaceAbsorption = subsurface\n ? subsurface.extinction[channel] - subsurface.scattering[channel]\n : 0;\n const absorption = transmissionAbsorption * transmissionWeight\n + subsurfaceAbsorption * subsurfaceWeight;\n const scattering = (transmission?.scattering[channel] || 0)\n * transmissionWeight\n + (subsurface?.scattering[channel] || 0) * subsurfaceWeight;\n return Math.max(0, absorption + scattering);\n }) as ColorRGB;\n const scattering = [0, 1, 2].map((channel) =>\n (transmission?.scattering[channel] || 0) * transmissionWeight\n + (subsurface?.scattering[channel] || 0) * subsurfaceWeight\n ) as ColorRGB;\n const anisotropy = (transmission?.anisotropy || 0) * transmissionWeight\n + (subsurface?.anisotropy || 0) * subsurfaceWeight;\n return { anisotropy, extinction, scattering } satisfies OpenPbrMedium;\n}\n\nfunction openPbrMedium(material: OpenPBRMaterial) {\n const volume = combineOpenPbrMedia(\n material,\n transmissionMedium(material),\n subsurfaceMedium(material)\n );\n return volume ?? emptyOpenPbrMedium();\n}\n\nclass MaterialTable {\n texture: WebGLTexture2DArray | undefined;\n textureAtlasStats: TextureAtlasStats;\n\n defines: Record<string, string | number> = {};\n\n bufferData: BufferData;\n\n private _matBufferTex = new Texture2D(commonNearestFloatProps);\n private _materialBufferColumnsLog: number = 0;\n\n private _displacementMaps: Texture[] = [];\n private _lightTexturesIndices: number[] = [];\n\n constructor(\n materials: OpenPBRMaterial[],\n lights: SceneLight[],\n options: MaterialTableOptions = {}\n ) {\n const maps = mergeTexturesFromMaterials(materials, MATERIAL_TEXTURE_NAMES);\n this._displacementMaps =\n maps.indices.displacementMap\n .map((idx) => {\n return maps.textures[idx];\n })\n .filter((a) => !!a);\n\n const bufferData = this._packParams(materials);\n\n const allTextures = maps.textures.slice();\n const lightTexturesIndices: number[] = [];\n for (let i = 0; i < lights.length; i++) {\n const light = lights[i];\n if (light.type === 'RectLight' && light.texture) {\n lightTexturesIndices.push(allTextures.length);\n allTextures.push(light.texture);\n } else {\n lightTexturesIndices.push(-1);\n }\n }\n const { mapInfo, mapTransform, mapUvChannel, mapColorLinear, stats, texture } = makeTextureArray(\n allTextures,\n false,\n options\n );\n\n this.texture = texture;\n this.textureAtlasStats = stats;\n bufferData.mapInfo = mapInfo;\n bufferData.mapTransform = mapTransform;\n bufferData.mapUvChannel = mapUvChannel;\n bufferData.mapColorLinear = mapColorLinear;\n for (const slot of MATERIAL_TEXTURE_SLOTS) {\n bufferData[slot.index] = maps.indices[slot.property];\n }\n\n this.bufferData = bufferData;\n\n this._lightTexturesIndices = lightTexturesIndices;\n\n function countMaps(indices: number[]) {\n return indices.filter((idx) => idx >= 0).length;\n }\n\n this.defines = {\n NUM_MAPS: allTextures.length,\n ...Object.fromEntries(MATERIAL_TEXTURE_SLOTS.flatMap(slot => slot.define\n ? [[slot.define, countMaps(maps.indices[slot.property])]] : []))\n };\n\n this._updateBuffer();\n }\n\n private _packParams(materials: OpenPBRMaterial[]) {\n const media = materials.map(openPbrMedium);\n return {\n color: materials.map((m) => m.baseColor.slice(0, 3) as ColorRGB),\n roughness: materials.map(m => m.specularAnisotropyModel === 'gltf' ? finiteAnisotropySource(m.specularRoughness, 0.3) : m.specularRoughness),\n emission: materials.map(materialEmission),\n metallic: materials.map((m) => m.baseMetalness),\n ior: materials.map((m) => m.specularIor),\n dispersion: materials.map((m) => m.transmissionDispersionScale),\n thin: materials.map((m) => +m.thinWalled),\n bevelSize: materials.map((m) => m.bevelSize),\n transmission: materials.map((m) => m.transmissionWeight),\n anisotropy: materials.map(m => m.specularAnisotropyModel === 'gltf' ? finiteAnisotropySource(m.specularAnisotropy, 0) : m.specularAnisotropy),\n specularAnisotropyModel: materials.map(m => specularAnisotropyModelIndex(m.specularAnisotropyModel)),\n thinFilmThickness: materials.map((m) => finiteFilmThickness(m.thinFilmThickness, 0.5)),\n thinFilmThicknessMinimum: materials.map((m) => finiteFilmThickness(m.thinFilmThicknessMinimum, 0)),\n thinFilmMapChannel: materials.map((m) => thinFilmMapChannelIndex(m.thinFilmMapChannel)),\n thinFilmIor: materials.map((m) => m.thinFilmIor),\n normalScale: materials.map((m) => m.normalScale),\n mapAlphaUsage: materials.map((m) => mapAlphaUsageConstants[m.mapAlphaUsage]),\n type: materials.map((m) => {\n if (m.shadowCatcher) {\n return ShadowCatcherMaterial;\n }\n if (m.unlit) {\n return UnlitMaterial;\n }\n // Standard material\n return 0;\n }),\n // Retain mediumType until both legacy readers are migrated; the\n // direction and coat-normal inputs are reserved for later C1 steps.\n mediumType: materials.map((m) => Number(materialUsesMedium(m))),\n specularAnisotropyRotation: materials.map(m => Number.isFinite(m.specularAnisotropyRotation) ? m.specularAnisotropyRotation : 0),\n coatAnisotropyRotation: materials.map(m => Number.isFinite(m.coatAnisotropyRotation) ? m.coatAnisotropyRotation : 0),\n coatNormalScale: materials.map(m => m.coatNormalScale),\n uvProjection: materials.map(\n (m) => uvProjectionConstants[m.uvProjection] || 0\n ),\n uvScale: materials.map((m) => m.uvProjectionScale || [1, 1]),\n\n displacementUvProjection: materials.map(\n (m) => uvProjectionConstants[m.displacementUvProjection] || 0\n ),\n displacementUvProjectionScale: materials.map((m) => m.displacementUvProjectionScale || 1),\n displacementStepSize: materials.map(\n (m) => m.displacementStepSize || 0.01\n ),\n\n // Alpha\n alpha: materials.map((m) => m.opacity),\n alphaMode: materials.map(\n (m) => materialAlphaModeConstants[resolveMaterialAlphaMode(m)]\n ),\n alphaCutoff: materials.map((m) => Math.max(0, m.alphaCutoff)),\n doubleSided: materials.map((m) => Number(m.doubleSided)),\n\n baseWeight: materials.map((m) => m.baseWeight),\n baseDiffuseRoughness: materials.map((m) => m.baseDiffuseRoughness),\n specularWeight: materials.map((m) => m.specularWeight),\n specularColor: materials.map((m) => clampColor(m.specularColor, 1)),\n transmissionColor: materials.map((m) => clampColor(m.transmissionColor, 1)),\n transmissionDepth: materials.map((m) => Math.max(0, m.transmissionDepth)),\n transmissionScatter: materials.map((m) => clampColor(m.transmissionScatter)),\n transmissionScatterAnisotropy: materials.map((m) => m.transmissionScatterAnisotropy),\n subsurfaceWeight: materials.map((m) => m.subsurfaceWeight),\n subsurfaceColor: materials.map((m) => clampColor(m.subsurfaceColor)),\n subsurfaceRadius: materials.map((m) => Math.max(0, m.subsurfaceRadius)),\n subsurfaceRadiusScale: materials.map((m) => clampColor(m.subsurfaceRadiusScale)),\n subsurfaceScatterAnisotropy: materials.map((m) => m.subsurfaceAnisotropy),\n fuzzWeight: materials.map((m) => m.fuzzWeight),\n fuzzColor: materials.map((m) => clampColor(m.fuzzColor, 1)),\n fuzzRoughness: materials.map((m) => m.fuzzRoughness),\n coatWeight: materials.map((m) => m.coatWeight),\n coatColor: materials.map((m) => clampColor(m.coatColor, 1)),\n coatRoughness: materials.map((m) => m.coatRoughness),\n coatAnisotropy: materials.map((m) => m.coatAnisotropy),\n coatIor: materials.map((m) => m.coatIor),\n coatDarkening: materials.map((m) => m.coatDarkening),\n thinFilmWeight: materials.map((m) => m.thinFilmWeight),\n dispersionAbbeNumber: materials.map((m) => m.transmissionDispersionAbbeNumber),\n mediumExtinction: media.map((medium) => medium.extinction),\n mediumScattering: media.map((medium) => medium.scattering),\n mediumAnisotropy: media.map((medium) => medium.anisotropy),\n\n } as BufferData;\n }\n\n /** Repack parameters with the same material slots and unchanged texture metadata. */\n repackParams(materials: OpenPBRMaterial[]) {\n Object.assign(this.bufferData, this._packParams(materials));\n this._updateBuffer();\n }\n\n getBufferArray() {\n return packMaterialBuffer(this.bufferData);\n }\n\n getDisplacementMaps() {\n return this._displacementMaps;\n }\n\n getLightTexturesIndices() {\n return this._lightTexturesIndices;\n }\n\n private _updateBuffer() {\n this._materialBufferColumnsLog = setDataTexture(\n this._matBufferTex,\n this.getBufferArray(),\n 4\n ).columnsLog;\n }\n\n setToPass(pass: {\n setUniform(label: string, value: unknown): unknown;\n setUniforms(values: Record<string, unknown>): void;\n }) {\n pass.setUniform('map', this.texture || null);\n pass.setUniform('mapInfo', this.bufferData.mapInfo);\n pass.setUniform('mapTransform', this.bufferData.mapTransform);\n pass.setUniform('mapUvChannel', this.bufferData.mapUvChannel);\n pass.setUniform('mapColorLinear', this.bufferData.mapColorLinear);\n pass.setUniforms({\n materialBuffer: this._matBufferTex,\n materialBufferColumns: this._materialBufferColumnsLog\n });\n }\n\n dispose(gl: WebGL2RenderingContext) {\n this.texture?.dispose(gl);\n this._matBufferTex.dispose(gl);\n }\n}\n\nexport default MaterialTable;\n"]}
1
+ {"version":3,"file":"MaterialTable.js","sourceRoot":"","sources":["../../src/renderer/MaterialTable.ts"],"names":[],"mappings":"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","sourcesContent":["import { specularAnisotropyModelIndex, finiteAnisotropySource } from '../scene/anisotropyParameters.js';\nimport { finiteFilmThickness, thinFilmMapChannelIndex } from '../scene/thinFilmParameters.js';\nimport { MATERIAL_TEXTURE_NAMES, MATERIAL_TEXTURE_SLOTS, type MaterialTextureIndex } from './materialTextureSlots.js';\nimport { packMaterialBuffer } from './materialLayout.js';\nimport { float16Bits } from './float16.js';\nimport {createCanvas} from '../util/canvas.js';\nimport { mapAlphaUsageConstants } from './materialConstants.js';\n// Portions adapted from ray-tracing-renderer@0.10.15\n// (https://github.com/hoverinc/ray-tracing-renderer).\n// Copyright (c) 2019 HOVER, MIT license; see LICENSES/RayTracingRenderer-MIT.txt.\n\nimport { ShadowCatcherMaterial, UnlitMaterial } from '../constants.js';\nimport { vec2 } from '../math.js';\nimport { materialEmission } from './materialEmission.js';\nimport {\n Texture2DArray as WebGLTexture2DArray,\n constants,\n Texture2D,\n type TexturePixelSource\n} from './webgl.js';\nimport OpenPBRMaterial, {\n materialAlphaModeConstants,\n resolveMaterialAlphaMode\n} from '../scene/OpenPBRMaterial.js';\nimport { ColorRGB } from '../types.js';\nimport { mergeTexturesFromMaterials } from './texturesFromMaterials.js';\nimport Texture, { isTextureDataSource } from '../scene/Texture.js';\nimport { commonNearestFloatProps, setDataTexture } from './dataTextureUtil.js';\nimport { SceneLight } from '../scene/Scene.js';\n\nexport const DEFAULT_MAX_TEXTURE_ARRAY_BYTES = 384 * 1024 * 1024;\n\nexport interface MaterialTableOptions {\n maxTextureArrayBytes?: number;\n maxTextureArrayLayers?: number;\n maxTextureDimension2D?: number;\n}\n\nexport interface TextureAtlasStats {\n estimatedBytes: number;\n height: number;\n layers: number;\n packTimeMs: number;\n scale: number;\n sourcePixels: number;\n textureCount: number;\n width: number;\n}\n\nexport function materialUsesMedium(material: OpenPBRMaterial): boolean {\n return !material.thinWalled && (\n (material.transmissionWeight > 0 && material.transmissionDepth > 0) ||\n material.subsurfaceWeight > 0\n );\n}\n\nexport const uvProjectionConstants = {\n none: 0,\n spherical: 1,\n cylindrical: 2,\n triplanar: 3\n};\n\ninterface AtlasPlacement {\n height: number;\n index: number;\n layer: number;\n width: number;\n x: number;\n y: number;\n}\n\ninterface AtlasShelf {\n height: number;\n x: number;\n y: number;\n}\n\ninterface AtlasPage {\n nextY: number;\n placements: AtlasPlacement[];\n shelves: AtlasShelf[];\n}\n\n/**\n * Packs material textures into a small 2D-array atlas.\n *\n * The input rectangles are sorted from tallest/largest to smallest, then\n * placed with a shelf allocator. Each atlas layer contains horizontal shelves;\n * a texture is inserted into the first shelf with enough remaining width, or a\n * new shelf is opened below the existing ones. A new array layer is allocated\n * only when none of the current layers has enough room.\n *\n * `makeTextureArray` first tries this packing at full resolution. If the result\n * exceeds the adapter layer limit or the configured memory budget, it performs\n * a binary search for the largest uniform scale that fits. This preserves full\n * resolution whenever packing alone is sufficient and degrades predictably on\n * constrained hardware.\n *\n * The returned placements keep the original logical texture indices. Shaders\n * use per-texture atlas metadata instead of treating the logical index as the\n * physical array layer.\n */\nfunction packTextureAtlas(\n textures: Texture[],\n pageSize: number,\n scale: number\n) {\n const pages: AtlasPage[] = [];\n const placements = new Array<AtlasPlacement>(textures.length);\n const items = textures\n .map((texture, index) => ({\n height: Math.max(1, Math.floor(texture.image.height * scale)),\n index,\n width: Math.max(1, Math.floor(texture.image.width * scale))\n }))\n .sort((a, b) => b.height - a.height || b.width - a.width);\n\n for (const item of items) {\n let placement: AtlasPlacement | undefined;\n for (let layer = 0; layer < pages.length && !placement; layer++) {\n const page = pages[layer];\n for (const shelf of page.shelves) {\n if (\n item.height <= shelf.height &&\n shelf.x + item.width <= pageSize\n ) {\n placement = {\n ...item,\n layer,\n x: shelf.x,\n y: shelf.y\n };\n shelf.x += item.width;\n break;\n }\n }\n if (!placement && page.nextY + item.height <= pageSize) {\n placement = {\n ...item,\n layer,\n x: 0,\n y: page.nextY\n };\n page.shelves.push({\n height: item.height,\n x: item.width,\n y: page.nextY\n });\n page.nextY += item.height;\n }\n }\n\n if (!placement) {\n const layer = pages.length;\n placement = { ...item, layer, x: 0, y: 0 };\n pages.push({\n nextY: item.height,\n placements: [],\n shelves: [{ height: item.height, x: item.width, y: 0 }]\n });\n }\n pages[placement.layer].placements.push(placement);\n placements[item.index] = placement;\n }\n\n return { pages, placements };\n}\n\nfunction createAtlasCanvas(width: number, height: number) {\n return createCanvas(width, height);\n}\n\nfunction createDataAtlasPage(\n width: number,\n height: number,\n page: ReturnType<typeof packTextureAtlas>['pages'][number],\n textures: Texture[],\n floatStorage: boolean\n): TexturePixelSource {\n const data = floatStorage ? new Uint16Array(width * height * 4) : new Uint8Array(width * height * 4);\n // Retain the same Canvas composition for DOM layers, including straight-alpha\n // readback. Raw sources never pass through Canvas or its color conversion.\n const domPlacements = page.placements.filter(p => !isTextureDataSource(textures[p.index].image));\n if (domPlacements.length) {\n const canvas = createAtlasCanvas(width, height);\n const context = canvas.getContext('2d');\n if (!context) throw new Error('Unable to create a canvas for the texture atlas.');\n for (const placement of domPlacements) drawAtlasImage(context, placement, textures[placement.index]);\n const pixels = context.getImageData(0, 0, width, height).data;\n for (let i = 0; i < pixels.length; i++) data[i] = floatStorage ? float16Bits(pixels[i] / 255) : pixels[i];\n }\n for (const placement of page.placements) {\n const texture = textures[placement.index];\n const source = texture.image;\n if (!isTextureDataSource(source)) continue;\n const bytes = source.data instanceof Uint8Array || source.data instanceof Uint8ClampedArray;\n if (!bytes && !(source.data instanceof Float32Array) && !(source.data instanceof Int32Array)) {\n throw new Error('Material texture data must be Uint8Array, Uint8ClampedArray, Float32Array or Int32Array.');\n }\n if (source.data.length !== source.width * source.height * 4) {\n throw new Error('Material texture RGBA source length does not match its dimensions.');\n }\n for (let y = 0; y < placement.height; y++) {\n let sourceY = Math.min(source.height - 1, Math.floor(((y + 0.5) * source.height) / placement.height));\n if (texture.flipY) sourceY = source.height - 1 - sourceY;\n for (let x = 0; x < placement.width; x++) {\n const sourceX = Math.min(source.width - 1, Math.floor(((x + 0.5) * source.width) / placement.width));\n const sourceOffset = (sourceY * source.width + sourceX) * 4;\n const targetOffset = ((placement.y + y) * width + placement.x + x) * 4;\n for (let c = 0; c < 4; c++) {\n const value = source.data[sourceOffset + c];\n data[targetOffset + c] = floatStorage ? float16Bits(bytes ? value / 255 : value) : value;\n }\n }\n }\n }\n return { data, width, height };\n}\n\nfunction drawAtlasImage(\n context: CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D,\n placement: AtlasPlacement,\n texture: Texture\n) {\n if (texture.flipY) {\n context.save();\n context.translate(placement.x, placement.y + placement.height);\n context.scale(1, -1);\n context.drawImage(texture.image as CanvasImageSource, 0, 0, placement.width, placement.height);\n context.restore();\n } else {\n context.drawImage(texture.image as CanvasImageSource, placement.x, placement.y, placement.width, placement.height);\n }\n}\n\nfunction makeTextureArray(\n textures: Texture[],\n sRGB = false,\n options: MaterialTableOptions = {}\n) {\n const packStart = performance.now();\n if (!textures.length) {\n return {\n mapInfo: [] as number[],\n mapTransform: [] as number[],\n mapUvChannel: [] as number[],\n mapColorLinear: [] as number[],\n stats: {\n estimatedBytes: 0,\n height: 1,\n layers: 0,\n packTimeMs: performance.now() - packStart,\n scale: 1,\n sourcePixels: 0,\n textureCount: 0,\n width: 1\n } satisfies TextureAtlasStats,\n texture: new WebGLTexture2DArray({\n width: 1,\n height: 1,\n sRGB,\n source: [],\n minFilter: constants.LINEAR,\n magFilter: constants.LINEAR,\n wrapS: constants.CLAMP_TO_EDGE,\n wrapT: constants.CLAMP_TO_EDGE\n })\n };\n }\n\n const dataBacked = textures.some((texture) =>\n isTextureDataSource(texture.image)\n );\n const mapColorLinear = textures.map(texture => {\n const image = texture.image;\n return Number(isTextureDataSource(image) &&\n !(image.data instanceof Uint8Array) && !(image.data instanceof Uint8ClampedArray));\n });\n const floatStorage = mapColorLinear.some(Boolean);\n const bytesPerPixel = floatStorage ? 8 : 4;\n\n const maxTextureArrayLayers = options.maxTextureArrayLayers ?? Infinity;\n const maxTextureDimension2D = options.maxTextureDimension2D ?? Infinity;\n const maxTextureArrayBytes =\n options.maxTextureArrayBytes ?? DEFAULT_MAX_TEXTURE_ARRAY_BYTES;\n const sourcePixels = textures.reduce(\n (sum, texture) => sum + texture.image.width * texture.image.height,\n 0\n );\n const maxSourceDimension = textures.reduce(\n (max, texture) =>\n Math.max(max, texture.image.width, texture.image.height),\n 1\n );\n const maxPageSizeFromBudget = Math.max(\n 1,\n Math.floor(Math.sqrt(maxTextureArrayBytes / bytesPerPixel))\n );\n const pageSize = Math.max(\n 1,\n Math.floor(\n Math.min(\n maxSourceDimension,\n maxTextureDimension2D,\n maxPageSizeFromBudget\n )\n )\n );\n const pageBytes = pageSize * pageSize * bytesPerPixel;\n const maxPageCount = Math.max(\n 1,\n Math.min(\n maxTextureArrayLayers,\n Math.floor(maxTextureArrayBytes / pageBytes)\n )\n );\n const maxScale = Math.min(1, pageSize / maxSourceDimension);\n let packed = packTextureAtlas(textures, pageSize, maxScale);\n let scale = maxScale;\n\n if (packed.pages.length > maxPageCount) {\n let low = 0;\n let high = maxScale;\n let bestPacked: ReturnType<typeof packTextureAtlas> | undefined;\n let bestScale = 0;\n for (let i = 0; i < 14; i++) {\n const candidateScale = (low + high) / 2;\n const candidate = packTextureAtlas(\n textures,\n pageSize,\n candidateScale\n );\n if (candidate.pages.length <= maxPageCount) {\n low = candidateScale;\n bestScale = candidateScale;\n bestPacked = candidate;\n } else {\n high = candidateScale;\n }\n }\n if (!bestPacked) {\n throw new Error(\n `Unable to fit ${textures.length} textures into ${maxPageCount} atlas layers.`\n );\n }\n packed = bestPacked;\n scale = bestScale;\n }\n\n const atlasWidth = Math.max(\n 1,\n ...packed.placements.map((placement) => placement.x + placement.width)\n );\n const atlasHeight = Math.max(\n 1,\n ...packed.placements.map((placement) => placement.y + placement.height)\n );\n const pages = packed.pages.map((page) => {\n if (dataBacked) {\n return createDataAtlasPage(atlasWidth, atlasHeight, page, textures, floatStorage);\n }\n const canvas = createAtlasCanvas(atlasWidth, atlasHeight);\n const context = canvas.getContext('2d');\n if (!context) {\n throw new Error('Unable to create a canvas for the texture atlas.');\n }\n for (const placement of page.placements) drawAtlasImage(context, placement, textures[placement.index]);\n return canvas;\n });\n\n if (scale < 0.999) {\n console.warn(\n `Texture atlas downscaled to ${(scale * 100).toFixed(1)}% to fit the GPU budget.`\n );\n }\n\n // mapInfo = [uvScale.x, uvScale.y, layer + uvOffset.x, uvOffset.y].\n // Packing layer and X offset into one float keeps the shader metadata to one\n // vec4 per logical texture; floor(z) restores the layer and fract(z) the X.\n const mapInfo = packed.placements.flatMap((placement) => {\n const offsetX = (placement.x + 0.5) / atlasWidth;\n const offsetY = (placement.y + 0.5) / atlasHeight;\n return [\n Math.max(placement.width - 1, 0) / atlasWidth,\n Math.max(placement.height - 1, 0) / atlasHeight,\n placement.layer + offsetX,\n offsetY\n ];\n });\n\n const texture = new WebGLTexture2DArray({\n width: atlasWidth,\n height: atlasHeight,\n sRGB,\n type: floatStorage ? constants.HALF_FLOAT : constants.UNSIGNED_BYTE,\n source: pages,\n flipY: false,\n flipYArray: pages.map(() => false),\n minFilter: constants.LINEAR,\n magFilter: constants.LINEAR,\n wrapS: constants.CLAMP_TO_EDGE,\n wrapT: constants.CLAMP_TO_EDGE\n });\n\n return {\n texture,\n mapInfo,\n mapTransform: textures.flatMap((texture) => [\n texture.uvScale[0],\n texture.uvScale[1],\n texture.uvOffset[0],\n texture.uvOffset[1]\n ]),\n mapUvChannel: textures.map((texture) => texture.uvChannel),\n mapColorLinear,\n stats: {\n estimatedBytes: atlasWidth * atlasHeight * pages.length * bytesPerPixel,\n height: atlasHeight,\n layers: pages.length,\n packTimeMs: performance.now() - packStart,\n scale,\n sourcePixels,\n textureCount: textures.length,\n width: atlasWidth\n } satisfies TextureAtlasStats\n };\n}\n\nexport interface BufferData extends Record<MaterialTextureIndex, number[]> {\n color: ColorRGB[];\n roughness: number[];\n metallic: number[];\n emission: ColorRGB[];\n ior: number[];\n transmission: number[];\n dispersion: number[];\n thinFilmThickness: number[];\n thinFilmThicknessMinimum: number[];\n thinFilmMapChannel: number[];\n thinFilmIor: number[];\n anisotropy: number[];\n thin: number[];\n doubleSided: number[];\n bevelSize: number[];\n mapAlphaUsage: number[];\n\n normalScale: vec2.Vec2Array[];\n\n type: (typeof ShadowCatcherMaterial | typeof UnlitMaterial | 0)[];\n mapInfo: number[];\n mapTransform: number[];\n mapUvChannel: number[];\n mapColorLinear: number[];\n\n mediumType: number[];\n specularAnisotropyModel: number[];\n specularAnisotropyRotation: number[];\n coatAnisotropyRotation: number[];\n coatNormalScale: vec2.Vec2Array[];\n\n uvProjection: number[];\n uvScale: vec2.Vec2Array[];\n\n displacementUvProjection: number[];\n displacementUvProjectionScale: number[];\n\n // For PDM displacement.\n displacementStepSize: number[];\n displacementBias: number[];\n\n // Alpha\n alpha: number[];\n alphaMode: number[];\n alphaCutoff: number[];\n\n baseWeight: number[];\n baseDiffuseRoughness: number[];\n specularWeight: number[];\n specularColor: ColorRGB[];\n transmissionColor: ColorRGB[];\n transmissionDepth: number[];\n transmissionScatter: ColorRGB[];\n transmissionScatterAnisotropy: number[];\n subsurfaceWeight: number[];\n subsurfaceColor: ColorRGB[];\n subsurfaceRadius: number[];\n subsurfaceRadiusScale: ColorRGB[];\n subsurfaceScatterAnisotropy: number[];\n fuzzWeight: number[];\n fuzzColor: ColorRGB[];\n fuzzRoughness: number[];\n coatWeight: number[];\n coatColor: ColorRGB[];\n coatRoughness: number[];\n coatAnisotropy: number[];\n coatIor: number[];\n coatDarkening: number[];\n thinFilmWeight: number[];\n dispersionAbbeNumber: number[];\n mediumExtinction: ColorRGB[];\n mediumScattering: ColorRGB[];\n mediumAnisotropy: number[];\n}\n\nfunction clampColor(color: ArrayLike<number>, fallback = 0): ColorRGB {\n return [0, 1, 2].map((channel) => {\n const value = Number(color[channel]);\n return Number.isFinite(value) ? Math.min(1, Math.max(0, value)) : fallback;\n }) as ColorRGB;\n}\n\ntype OpenPbrMedium = {\n anisotropy: number;\n extinction: ColorRGB;\n scattering: ColorRGB;\n};\n\nfunction emptyOpenPbrMedium(): OpenPbrMedium {\n return {\n anisotropy: 0,\n extinction: [0, 0, 0],\n scattering: [0, 0, 0]\n };\n}\n\nfunction transmissionMedium(material: OpenPBRMaterial) {\n const weight = Math.min(1, Math.max(0, material.transmissionWeight));\n const depth = Math.max(0, material.transmissionDepth);\n if (weight <= 0 || depth <= 0 || material.thinWalled) return undefined;\n\n const color = clampColor(material.transmissionColor, 1);\n const scatterColor = clampColor(material.transmissionScatter);\n const extinction = color.map((channel) =>\n Math.max(0, -Math.log(Math.max(channel, 1e-6)) / depth)\n ) as ColorRGB;\n const scattering = scatterColor.map((channel, index) =>\n extinction[index] * channel\n ) as ColorRGB;\n return {\n anisotropy: Math.min(\n 0.999,\n Math.max(-0.999, material.transmissionScatterAnisotropy)\n ),\n extinction,\n scattering\n } satisfies OpenPbrMedium;\n}\n\nfunction subsurfaceMedium(material: OpenPBRMaterial) {\n const weight = Math.min(1, Math.max(0, material.subsurfaceWeight));\n if (weight <= 0 || material.thinWalled) return undefined;\n\n // OpenPBR's radius is the extinction mean free path. The van de Hulst\n // mapping converts the artist-facing multiple-scattering color to a\n // single-scattering albedo while compensating for phase anisotropy.\n const radius = Math.max(material.subsurfaceRadius, 1e-3);\n const radiusScale = clampColor(material.subsurfaceRadiusScale, 1);\n const color = clampColor(material.subsurfaceColor);\n const anisotropy = Math.min(\n 0.999,\n Math.max(-0.999, material.subsurfaceAnisotropy)\n );\n const extinction = radiusScale.map(\n (scale) => 1 / Math.max(radius * scale, 1e-3)\n ) as ColorRGB;\n const scattering = color.map((channel, index) => {\n const s = 4.09712 + 4.20863 * channel - Math.sqrt(\n 9.59217 + 41.6808 * channel + 17.7126 * channel * channel\n );\n const sSquared = s * s;\n const albedo = Math.min(\n 1,\n Math.max(0, (1 - sSquared) / (1 - anisotropy * sSquared))\n );\n return extinction[index] * albedo;\n }) as ColorRGB;\n return { anisotropy, extinction, scattering } satisfies OpenPbrMedium;\n}\n\nfunction combineOpenPbrMedia(\n material: OpenPBRMaterial,\n transmission: OpenPbrMedium | undefined,\n subsurface: OpenPbrMedium | undefined\n) {\n const transmissionFraction = transmission\n ? Math.min(1, Math.max(0, material.transmissionWeight))\n : 0;\n const subsurfaceFraction = subsurface\n ? (1 - transmissionFraction)\n * Math.min(1, Math.max(0, material.subsurfaceWeight))\n : 0;\n const total = transmissionFraction + subsurfaceFraction;\n if (total <= 0) return undefined;\n\n const transmissionWeight = transmissionFraction / total;\n const subsurfaceWeight = subsurfaceFraction / total;\n const extinction = [0, 1, 2].map((channel) => {\n const transmissionAbsorption = transmission\n ? transmission.extinction[channel] - transmission.scattering[channel]\n : 0;\n const subsurfaceAbsorption = subsurface\n ? subsurface.extinction[channel] - subsurface.scattering[channel]\n : 0;\n const absorption = transmissionAbsorption * transmissionWeight\n + subsurfaceAbsorption * subsurfaceWeight;\n const scattering = (transmission?.scattering[channel] || 0)\n * transmissionWeight\n + (subsurface?.scattering[channel] || 0) * subsurfaceWeight;\n return Math.max(0, absorption + scattering);\n }) as ColorRGB;\n const scattering = [0, 1, 2].map((channel) =>\n (transmission?.scattering[channel] || 0) * transmissionWeight\n + (subsurface?.scattering[channel] || 0) * subsurfaceWeight\n ) as ColorRGB;\n const anisotropy = (transmission?.anisotropy || 0) * transmissionWeight\n + (subsurface?.anisotropy || 0) * subsurfaceWeight;\n return { anisotropy, extinction, scattering } satisfies OpenPbrMedium;\n}\n\nfunction openPbrMedium(material: OpenPBRMaterial) {\n const volume = combineOpenPbrMedia(\n material,\n transmissionMedium(material),\n subsurfaceMedium(material)\n );\n return volume ?? emptyOpenPbrMedium();\n}\n\nclass MaterialTable {\n texture: WebGLTexture2DArray | undefined;\n textureAtlasStats: TextureAtlasStats;\n\n defines: Record<string, string | number> = {};\n\n bufferData: BufferData;\n\n private _matBufferTex = new Texture2D(commonNearestFloatProps);\n private _materialBufferColumnsLog: number = 0;\n\n private _displacementMaps: Texture[] = [];\n private _lightTexturesIndices: number[] = [];\n\n constructor(\n materials: OpenPBRMaterial[],\n lights: SceneLight[],\n options: MaterialTableOptions = {}\n ) {\n const maps = mergeTexturesFromMaterials(materials, MATERIAL_TEXTURE_NAMES);\n this._displacementMaps =\n maps.indices.displacementMap\n .map((idx) => {\n return maps.textures[idx];\n })\n .filter((a) => !!a);\n\n const bufferData = this._packParams(materials);\n\n const allTextures = maps.textures.slice();\n const lightTexturesIndices: number[] = [];\n for (let i = 0; i < lights.length; i++) {\n const light = lights[i];\n if (light.type === 'RectLight' && light.texture) {\n lightTexturesIndices.push(allTextures.length);\n allTextures.push(light.texture);\n } else {\n lightTexturesIndices.push(-1);\n }\n }\n const { mapInfo, mapTransform, mapUvChannel, mapColorLinear, stats, texture } = makeTextureArray(\n allTextures,\n false,\n options\n );\n\n this.texture = texture;\n this.textureAtlasStats = stats;\n bufferData.mapInfo = mapInfo;\n bufferData.mapTransform = mapTransform;\n bufferData.mapUvChannel = mapUvChannel;\n bufferData.mapColorLinear = mapColorLinear;\n for (const slot of MATERIAL_TEXTURE_SLOTS) {\n bufferData[slot.index] = maps.indices[slot.property];\n }\n\n this.bufferData = bufferData;\n\n this._lightTexturesIndices = lightTexturesIndices;\n\n function countMaps(indices: number[]) {\n return indices.filter((idx) => idx >= 0).length;\n }\n\n this.defines = {\n NUM_MAPS: allTextures.length,\n ...Object.fromEntries(MATERIAL_TEXTURE_SLOTS.flatMap(slot => slot.define\n ? [[slot.define, countMaps(maps.indices[slot.property])]] : []))\n };\n\n this._updateBuffer();\n }\n\n private _packParams(materials: OpenPBRMaterial[]) {\n const media = materials.map(openPbrMedium);\n return {\n color: materials.map((m) => m.baseColor.slice(0, 3) as ColorRGB),\n roughness: materials.map(m => m.specularAnisotropyModel === 'gltf' ? finiteAnisotropySource(m.specularRoughness, 0.3) : m.specularRoughness),\n emission: materials.map(materialEmission),\n metallic: materials.map((m) => m.baseMetalness),\n ior: materials.map((m) => m.specularIor),\n dispersion: materials.map((m) => m.transmissionDispersionScale),\n thin: materials.map((m) => +m.thinWalled),\n bevelSize: materials.map((m) => m.bevelSize),\n transmission: materials.map((m) => m.transmissionWeight),\n anisotropy: materials.map(m => m.specularAnisotropyModel === 'gltf' ? finiteAnisotropySource(m.specularAnisotropy, 0) : m.specularAnisotropy),\n specularAnisotropyModel: materials.map(m => specularAnisotropyModelIndex(m.specularAnisotropyModel)),\n thinFilmThickness: materials.map((m) => finiteFilmThickness(m.thinFilmThickness, 0.5)),\n thinFilmThicknessMinimum: materials.map((m) => finiteFilmThickness(m.thinFilmThicknessMinimum, 0)),\n thinFilmMapChannel: materials.map((m) => thinFilmMapChannelIndex(m.thinFilmMapChannel)),\n thinFilmIor: materials.map((m) => m.thinFilmIor),\n normalScale: materials.map((m) => m.normalScale),\n mapAlphaUsage: materials.map((m) => mapAlphaUsageConstants[m.mapAlphaUsage]),\n type: materials.map((m) => {\n if (m.shadowCatcher) {\n return ShadowCatcherMaterial;\n }\n if (m.unlit) {\n return UnlitMaterial;\n }\n // Standard material\n return 0;\n }),\n // Retain mediumType until both legacy readers are migrated; the\n // direction and coat-normal inputs are reserved for later C1 steps.\n mediumType: materials.map((m) => Number(materialUsesMedium(m))),\n specularAnisotropyRotation: materials.map(m => Number.isFinite(m.specularAnisotropyRotation) ? m.specularAnisotropyRotation : 0),\n coatAnisotropyRotation: materials.map(m => Number.isFinite(m.coatAnisotropyRotation) ? m.coatAnisotropyRotation : 0),\n coatNormalScale: materials.map(m => m.coatNormalScale),\n uvProjection: materials.map(\n (m) => uvProjectionConstants[m.uvProjection] || 0\n ),\n uvScale: materials.map((m) => m.uvProjectionScale || [1, 1]),\n\n displacementUvProjection: materials.map(\n (m) => uvProjectionConstants[m.displacementUvProjection] || 0\n ),\n displacementUvProjectionScale: materials.map((m) => m.displacementUvProjectionScale || 1),\n displacementBias: materials.map((m) => m.displacementBias),\n displacementStepSize: materials.map(\n (m) => Number.isFinite(m.displacementStepSize) && m.displacementStepSize > 0 ? m.displacementStepSize : 0\n ),\n\n // Alpha\n alpha: materials.map((m) => m.opacity),\n alphaMode: materials.map(\n (m) => materialAlphaModeConstants[resolveMaterialAlphaMode(m)]\n ),\n alphaCutoff: materials.map((m) => Math.max(0, m.alphaCutoff)),\n doubleSided: materials.map((m) => Number(m.doubleSided)),\n\n baseWeight: materials.map((m) => m.baseWeight),\n baseDiffuseRoughness: materials.map((m) => m.baseDiffuseRoughness),\n specularWeight: materials.map((m) => m.specularWeight),\n specularColor: materials.map((m) => clampColor(m.specularColor, 1)),\n transmissionColor: materials.map((m) => clampColor(m.transmissionColor, 1)),\n transmissionDepth: materials.map((m) => Math.max(0, m.transmissionDepth)),\n transmissionScatter: materials.map((m) => clampColor(m.transmissionScatter)),\n transmissionScatterAnisotropy: materials.map((m) => m.transmissionScatterAnisotropy),\n subsurfaceWeight: materials.map((m) => m.subsurfaceWeight),\n subsurfaceColor: materials.map((m) => clampColor(m.subsurfaceColor)),\n subsurfaceRadius: materials.map((m) => Math.max(0, m.subsurfaceRadius)),\n subsurfaceRadiusScale: materials.map((m) => clampColor(m.subsurfaceRadiusScale)),\n subsurfaceScatterAnisotropy: materials.map((m) => m.subsurfaceAnisotropy),\n fuzzWeight: materials.map((m) => m.fuzzWeight),\n fuzzColor: materials.map((m) => clampColor(m.fuzzColor, 1)),\n fuzzRoughness: materials.map((m) => m.fuzzRoughness),\n coatWeight: materials.map((m) => m.coatWeight),\n coatColor: materials.map((m) => clampColor(m.coatColor, 1)),\n coatRoughness: materials.map((m) => m.coatRoughness),\n coatAnisotropy: materials.map((m) => m.coatAnisotropy),\n coatIor: materials.map((m) => m.coatIor),\n coatDarkening: materials.map((m) => m.coatDarkening),\n thinFilmWeight: materials.map((m) => m.thinFilmWeight),\n dispersionAbbeNumber: materials.map((m) => m.transmissionDispersionAbbeNumber),\n mediumExtinction: media.map((medium) => medium.extinction),\n mediumScattering: media.map((medium) => medium.scattering),\n mediumAnisotropy: media.map((medium) => medium.anisotropy),\n\n } as BufferData;\n }\n\n /** Repack parameters with the same material slots and unchanged texture metadata. */\n repackParams(materials: OpenPBRMaterial[]) {\n Object.assign(this.bufferData, this._packParams(materials));\n this._updateBuffer();\n }\n\n getBufferArray() {\n return packMaterialBuffer(this.bufferData);\n }\n\n getDisplacementMaps() {\n return this._displacementMaps;\n }\n\n getLightTexturesIndices() {\n return this._lightTexturesIndices;\n }\n\n private _updateBuffer() {\n this._materialBufferColumnsLog = setDataTexture(\n this._matBufferTex,\n this.getBufferArray(),\n 4\n ).columnsLog;\n }\n\n setToPass(pass: {\n setUniform(label: string, value: unknown): unknown;\n setUniforms(values: Record<string, unknown>): void;\n }) {\n pass.setUniform('map', this.texture || null);\n pass.setUniform('mapInfo', this.bufferData.mapInfo);\n pass.setUniform('mapTransform', this.bufferData.mapTransform);\n pass.setUniform('mapUvChannel', this.bufferData.mapUvChannel);\n pass.setUniform('mapColorLinear', this.bufferData.mapColorLinear);\n pass.setUniforms({\n materialBuffer: this._matBufferTex,\n materialBufferColumns: this._materialBufferColumnsLog\n });\n }\n\n dispose(gl: WebGL2RenderingContext) {\n this.texture?.dispose(gl);\n this._matBufferTex.dispose(gl);\n }\n}\n\nexport default MaterialTable;\n"]}
@@ -21,7 +21,7 @@ function createBrightPass(device) {
21
21
  }
22
22
  ],
23
23
  fsDefine: /*wgsl*/ `
24
- fn sm(a: vec4f, b: vec4f, c: vec4f) -> vec4f {
24
+ fn st(a: vec4f, b: vec4f, c: vec4f) -> vec4f {
25
25
  return a + b + c - min(min(a, b), c) - max(max(a, b), c);
26
26
  }
27
27
  `,
@@ -32,21 +32,21 @@ ${''
32
32
  }
33
33
  let d = vec3i(1, 1, 0);
34
34
 
35
- var iW = load_colorTex(uv, 0);
35
+ var iX = load_colorTex(uv, 0);
36
36
  let s1 = load_colorTex(uv - d.xz, 0);
37
37
  let s2 = load_colorTex(uv + d.xz, 0);
38
38
  let s3 = load_colorTex(uv - d.zy, 0);
39
39
  let s4 = load_colorTex(uv + d.zy, 0);
40
- iW = sm(sm(iW, s1, s2), s3, s4);
40
+ iX = st(st(iX, s1, s2), s3, s4);
41
41
 
42
42
 
43
- let lum = dot(iW.rgb, vec3f(0.2125, 0.7154, 0.0721));
43
+ let lum = dot(iX.rgb, vec3f(0.2125, 0.7154, 0.0721));
44
44
  var color: vec4f;
45
- if (lum > threshold && iW.a > 0.0) {
46
- color = vec4f(iW.rgb * scale, iW.a);
45
+ if (lum > threshold && iX.a > 0.0) {
46
+ color = vec4f(iX.rgb * scale, iX.a);
47
47
  } else {
48
48
 
49
- color = vec4f(vec3(0.0), iW.a);
49
+ color = vec4f(vec3(0.0), iX.a);
50
50
  }
51
51
  output.color = color;
52
52
  `
@@ -61,7 +61,7 @@ function createDownsamplePass(device) {
61
61
  linearSampler: device.createSampler(linearSamplerDescriptor)
62
62
  },
63
63
  fsDefine: /*wgsl*/ `
64
- fn vL(c: vec3f) -> f32 {
64
+ fn vR(c: vec3f) -> f32 {
65
65
  return max(max(c.r, c.g), c.b);
66
66
  }
67
67
  `,
@@ -96,20 +96,20 @@ function createGaussianPass(device) {
96
96
  linearSampler: device.createSampler(linearSamplerDescriptor)
97
97
  },
98
98
  fsDefine: /*wgsl*/ `
99
- const vP = array<f32, 9>(0.07, 0.09, 0.12, 0.14, 0.16, 0.14, 0.12, 0.09, 0.07);
99
+ const vV = array<f32, 9>(0.07, 0.09, 0.12, 0.14, 0.16, 0.14, 0.12, 0.09, 0.07);
100
100
  `,
101
101
  fsMain: /*wgsl*/ `
102
- let vE = vec2f(colorTexRegion());
103
- let off = direction / vE * size;
102
+ let vK = vec2f(colorTexRegion());
103
+ let off = direction / vK * size;
104
104
 
105
105
  var sum = vec4f(0.0);
106
- var sU = 0.0;
106
+ var sZ = 0.0;
107
107
  for (var i = 0; i < 9; i++) {
108
- let w = vP[i];
108
+ let w = vV[i];
109
109
  sum += sample_colorTex_linearSampler(uv2 + off * f32(i - 4)) * w;
110
- sU += w;
110
+ sZ += w;
111
111
  }
112
- output.color = sum / max(sU, 0.01);
112
+ output.color = sum / max(sZ, 0.01);
113
113
  `
114
114
  });
115
115
  }
@@ -128,9 +128,9 @@ function createBlendPass(device) {
128
128
  linearSampler: device.createSampler(linearSamplerDescriptor)
129
129
  },
130
130
  fsMain: /*wgsl*/ `
131
- let vM = sample_colorTex1_linearSampler(uv2);
132
- let vN = sample_colorTex2_linearSampler(uv2);
133
- output.color = mix(vM, vN, weight);
131
+ let vS = sample_colorTex1_linearSampler(uv2);
132
+ let vT = sample_colorTex2_linearSampler(uv2);
133
+ output.color = mix(vS, vT, weight);
134
134
  `
135
135
  });
136
136
  }
@@ -273,7 +273,7 @@ ${hasInputs
273
273
  ${this._uniforms
274
274
  .map((uniform, idx) => `@group(${hasInputs ? 1 : 0}) @binding(${idx}) var<uniform> ${uniform.label}: ${uniform.type};`)
275
275
  .join('\n')}
276
- struct oQ {
276
+ struct oU {
277
277
  ${this._outputs
278
278
  .map((name, idx) => `@location(${idx}) ${name}: vec4f,`)
279
279
  .join('\n')}
@@ -283,10 +283,10 @@ ${this._fsDefine ?? ''}
283
283
  @fragment
284
284
  fn main(
285
285
  @builtin(position) fD: vec4f
286
- ) -> oQ {
286
+ ) -> oU {
287
287
  let uv = vec2i(floor(fD.xy));
288
288
  let uv2 = fD.xy / viewportSize;
289
- var output: oQ;
289
+ var output: oU;
290
290
  ${this._fsMain}
291
291
  return output;
292
292
  }