@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.
- package/dist/assets/bvh.worker.js +1 -1
- package/dist/mutracer.umd.js +3525 -3484
- package/docs/materials.md +27 -7
- package/docs/threejs.md +13 -2
- package/docs/viewer.md +53 -0
- package/lib/oidn.d.ts +1 -1
- package/lib/oidnBundledWeights.cdn.d.ts +2 -2
- package/lib/renderer/MaterialTable.d.ts +1 -0
- package/lib/renderer/MaterialTable.js +2 -1
- package/lib/renderer/MaterialTable.js.map +1 -1
- package/lib/renderer/WGPUBloomPass.js +18 -18
- package/lib/renderer/WGPUFullQuadPass.js +3 -3
- package/lib/renderer/WGPUJNLMDenoiser.js +62 -62
- package/lib/renderer/WGPURayTraceOutput.js +14 -12
- package/lib/renderer/WGPURayTraceOutput.js.map +1 -1
- package/lib/renderer/WGPURayTracePass.js +2 -2
- package/lib/renderer/WGPURayTracePass.js.map +1 -1
- package/lib/renderer/WGPURenderingPipeline.js +20 -18
- package/lib/renderer/WGPURenderingPipeline.js.map +1 -1
- package/lib/renderer/WebGLJNLMDenoiser.js +61 -61
- package/lib/renderer/WebGLRayTraceOutputPass.js +4 -4
- package/lib/renderer/WebGLRayTracePass.js +3 -1
- package/lib/renderer/WebGLRayTracePass.js.map +1 -1
- package/lib/renderer/glsl/chunks/cameraRay.glsl.js +9 -9
- package/lib/renderer/glsl/chunks/envMap.glsl.js +45 -45
- package/lib/renderer/glsl/chunks/intersect.glsl.js +262 -262
- package/lib/renderer/glsl/chunks/materialBuffer.glsl.js +111 -111
- package/lib/renderer/glsl/chunks/openPbrBsdf.glsl.js +436 -436
- package/lib/renderer/glsl/chunks/rand.glsl.js +3 -3
- package/lib/renderer/glsl/chunks/random.glsl.js +3 -3
- package/lib/renderer/glsl/chunks/rayTraceCore.glsl.js +32 -32
- package/lib/renderer/glsl/chunks/sampleLight.glsl.js +54 -54
- package/lib/renderer/glsl/chunks/sampleMaterial.glsl.js +71 -71
- package/lib/renderer/glsl/chunks/sampleShadowCatcher.glsl.js +12 -12
- package/lib/renderer/glsl/chunks/sampling.glsl.js +64 -64
- package/lib/renderer/glsl/chunks/sobol.glsl.js +49 -49
- package/lib/renderer/glsl/chunks/textureLinear.glsl.js +5 -5
- package/lib/renderer/glsl/chunks/uvProjection.glsl.js +5 -5
- package/lib/renderer/glsl/depthQuery.frag.js +2 -2
- package/lib/renderer/glsl/normalizeRayTraceOutput.frag.js +8 -8
- package/lib/renderer/glsl/rayTrace.frag.js +128 -128
- package/lib/renderer/glsl/shadowCatcher.frag.js +12 -12
- package/lib/renderer/glsl/webglPipeline.frag.js +49 -49
- package/lib/renderer/lightsUtil.js +1 -1
- package/lib/renderer/lightsUtil.js.map +1 -1
- package/lib/renderer/materialComparison.generated.js +5 -0
- package/lib/renderer/materialComparison.generated.js.map +1 -1
- package/lib/renderer/materialLayout.js +2 -1
- package/lib/renderer/materialLayout.js.map +1 -1
- package/lib/renderer/prepareMeshBVH.d.ts +4 -2
- package/lib/renderer/prepareMeshBVH.js +44 -20
- package/lib/renderer/prepareMeshBVH.js.map +1 -1
- package/lib/renderer/scratchSampling.js +6 -6
- package/lib/renderer/wgsl/chunks/common.wgsl.js +4 -4
- package/lib/renderer/wgsl/chunks/envMap.wgsl.js +29 -29
- package/lib/renderer/wgsl/chunks/intersect.wgsl.js +376 -379
- package/lib/renderer/wgsl/chunks/intersect.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.js +5 -5
- package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js +51 -51
- package/lib/renderer/wgsl/chunks/openPbrBsdf.wgsl.js +453 -453
- package/lib/renderer/wgsl/chunks/pdm_displacement.wgsl.d.ts +1 -1
- package/lib/renderer/wgsl/chunks/pdm_displacement.wgsl.js +122 -117
- package/lib/renderer/wgsl/chunks/pdm_displacement.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/rand.wgsl.js +3 -3
- package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.js +13 -13
- package/lib/renderer/wgsl/chunks/sampleLight.wgsl.js +94 -94
- package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.js +119 -119
- package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.js +5 -5
- package/lib/renderer/wgsl/chunks/sampling.wgsl.js +62 -62
- package/lib/renderer/wgsl/chunks/shadowCatcherAccumulation.wgsl.d.ts +3 -3
- package/lib/renderer/wgsl/chunks/shadowCatcherAccumulation.wgsl.js +2 -2
- package/lib/renderer/wgsl/chunks/shadowCatcherAccumulation.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/sobol.wgsl.js +53 -53
- package/lib/renderer/wgsl/chunks/uvProjection.wgsl.js +5 -5
- package/lib/renderer/wgsl/compose.frag.wgsl.d.ts +2 -2
- package/lib/renderer/wgsl/compose.frag.wgsl.js +120 -92
- package/lib/renderer/wgsl/compose.frag.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/customDenoise.wgsl.js +10 -10
- package/lib/renderer/wgsl/depthQuery.wgsl.js +3 -3
- package/lib/renderer/wgsl/offlineAdaptive.compute.js +26 -26
- package/lib/renderer/wgsl/rayTrace.compute.js +220 -211
- package/lib/renderer/wgsl/rayTrace.compute.js.map +1 -1
- package/lib/scene/OpenPBRMaterial.d.ts +4 -2
- package/lib/scene/OpenPBRMaterial.js +4 -2
- package/lib/scene/OpenPBRMaterial.js.map +1 -1
- package/lib/scene/openPbrSchema.d.ts +7 -2
- package/lib/scene/openPbrSchema.js +2 -1
- package/lib/scene/openPbrSchema.js.map +1 -1
- package/lib/util/fromTHREE.d.ts +1 -0
- package/lib/util/fromTHREE.js +24 -6
- package/lib/util/fromTHREE.js.map +1 -1
- package/lib/version.d.ts +1 -1
- package/lib/version.js +1 -1
- package/lib/version.js.map +1 -1
- package/package.json +5 -4
package/docs/materials.md
CHANGED
|
@@ -198,13 +198,33 @@ start.
|
|
|
198
198
|
|
|
199
199
|
## Displacement
|
|
200
200
|
|
|
201
|
-
`displacementMap`
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
`
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
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
|
|
196
|
-
skinned/morph poses.
|
|
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.
|
|
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.
|
|
2
|
-
export declare const smallWeightsUrl = "https://cdn.jsdelivr.net/npm/@meimu/mutracer@0.1.
|
|
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
|
-
|
|
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
|
|
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
|
|
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
|
-
|
|
40
|
+
iX = st(st(iX, s1, s2), s3, s4);
|
|
41
41
|
|
|
42
42
|
|
|
43
|
-
let lum = dot(
|
|
43
|
+
let lum = dot(iX.rgb, vec3f(0.2125, 0.7154, 0.0721));
|
|
44
44
|
var color: vec4f;
|
|
45
|
-
if (lum > threshold &&
|
|
46
|
-
color = vec4f(
|
|
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),
|
|
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
|
|
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
|
|
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
|
|
103
|
-
let off = direction /
|
|
102
|
+
let vK = vec2f(colorTexRegion());
|
|
103
|
+
let off = direction / vK * size;
|
|
104
104
|
|
|
105
105
|
var sum = vec4f(0.0);
|
|
106
|
-
var
|
|
106
|
+
var sZ = 0.0;
|
|
107
107
|
for (var i = 0; i < 9; i++) {
|
|
108
|
-
let w =
|
|
108
|
+
let w = vV[i];
|
|
109
109
|
sum += sample_colorTex_linearSampler(uv2 + off * f32(i - 4)) * w;
|
|
110
|
-
|
|
110
|
+
sZ += w;
|
|
111
111
|
}
|
|
112
|
-
output.color = sum / max(
|
|
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
|
|
132
|
-
let
|
|
133
|
-
output.color = mix(
|
|
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
|
|
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
|
-
) ->
|
|
286
|
+
) -> oU {
|
|
287
287
|
let uv = vec2i(floor(fD.xy));
|
|
288
288
|
let uv2 = fD.xy / viewportSize;
|
|
289
|
-
var output:
|
|
289
|
+
var output: oU;
|
|
290
290
|
${this._fsMain}
|
|
291
291
|
return output;
|
|
292
292
|
}
|