@meimu/mutracer 0.1.3 → 0.1.5
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 +4155 -4052
- package/docs/api.md +13 -10
- package/docs/materials.md +17 -26
- package/docs/threejs.md +35 -9
- package/docs/viewer.md +36 -3
- package/lib/Engine.js +18 -1
- package/lib/Engine.js.map +1 -1
- package/lib/main.d.ts +1 -1
- package/lib/main.js.map +1 -1
- 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 +10 -4
- package/lib/renderer/MaterialTable.js.map +1 -1
- package/lib/renderer/WGPUBloomPass.js +18 -18
- package/lib/renderer/WGPUFullQuadPass.js +6 -6
- package/lib/renderer/WGPUJNLMDenoiser.js +69 -69
- package/lib/renderer/WGPURayTraceOutput.js +14 -14
- package/lib/renderer/WGPURayTracePass.d.ts +2 -0
- package/lib/renderer/WGPURayTracePass.js +17 -9
- package/lib/renderer/WGPURayTracePass.js.map +1 -1
- package/lib/renderer/WGPURenderingPipeline.js +15 -15
- package/lib/renderer/WebGLJNLMDenoiser.js +69 -69
- package/lib/renderer/WebGLRayTraceOutputPass.js +4 -4
- package/lib/renderer/WebGLRayTracePass.d.ts +1 -0
- package/lib/renderer/WebGLRayTracePass.js +8 -1
- package/lib/renderer/WebGLRayTracePass.js.map +1 -1
- package/lib/renderer/envMapCreation.d.ts +5 -1
- package/lib/renderer/envMapCreation.js +42 -5
- package/lib/renderer/envMapCreation.js.map +1 -1
- package/lib/renderer/geometryUpdates.js +1 -1
- package/lib/renderer/geometryUpdates.js.map +1 -1
- package/lib/renderer/glsl/chunks/cameraRay.glsl.js +12 -12
- package/lib/renderer/glsl/chunks/envMap.glsl.js +66 -54
- package/lib/renderer/glsl/chunks/envMap.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/intersect.glsl.js +323 -315
- package/lib/renderer/glsl/chunks/intersect.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/materialBuffer.glsl.js +154 -121
- package/lib/renderer/glsl/chunks/materialBuffer.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/openPbrBsdf.glsl.js +434 -434
- package/lib/renderer/glsl/chunks/openPbrBsdf.glsl.js.map +1 -1
- 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 +42 -41
- package/lib/renderer/glsl/chunks/rayTraceCore.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/sampleLight.glsl.js +69 -69
- package/lib/renderer/glsl/chunks/sampleMaterial.glsl.js +84 -84
- package/lib/renderer/glsl/chunks/sampleMaterial.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/sampleShadowCatcher.glsl.js +12 -12
- package/lib/renderer/glsl/chunks/sampling.glsl.js +75 -75
- package/lib/renderer/glsl/chunks/sobol.glsl.js +61 -61
- package/lib/renderer/glsl/chunks/textureLinear.glsl.js +5 -5
- package/lib/renderer/glsl/chunks/uvProjection.glsl.js +11 -11
- package/lib/renderer/glsl/depthQuery.frag.js +5 -5
- package/lib/renderer/glsl/depthQuery.frag.js.map +1 -1
- package/lib/renderer/glsl/normalizeRayTraceOutput.frag.js +8 -8
- package/lib/renderer/glsl/rayTrace.frag.js +133 -133
- package/lib/renderer/glsl/rayTrace.frag.js.map +1 -1
- package/lib/renderer/glsl/shadowCatcher.frag.js +9 -9
- package/lib/renderer/glsl/shadowCatcher.frag.js.map +1 -1
- package/lib/renderer/glsl/webglPipeline.frag.js +52 -52
- package/lib/renderer/lightsUtil.js +6 -4
- package/lib/renderer/lightsUtil.js.map +1 -1
- package/lib/renderer/materialChanges.js +1 -1
- package/lib/renderer/materialChanges.js.map +1 -1
- package/lib/renderer/materialComparison.generated.js +36 -18
- package/lib/renderer/materialComparison.generated.js.map +1 -1
- package/lib/renderer/prepareMeshBVH.js +2 -2
- package/lib/renderer/prepareMeshBVH.js.map +1 -1
- package/lib/renderer/sceneChangeDetector.js +4 -1
- package/lib/renderer/sceneChangeDetector.js.map +1 -1
- package/lib/renderer/sceneLightChanges.js +3 -2
- package/lib/renderer/sceneLightChanges.js.map +1 -1
- package/lib/renderer/scratchSampling.js +18 -18
- package/lib/renderer/wgsl/chunks/common.wgsl.js +4 -4
- package/lib/renderer/wgsl/chunks/envMap.wgsl.d.ts +1 -1
- package/lib/renderer/wgsl/chunks/envMap.wgsl.js +39 -31
- package/lib/renderer/wgsl/chunks/envMap.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/intersect.wgsl.js +476 -470
- package/lib/renderer/wgsl/chunks/intersect.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.js +8 -8
- package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js +95 -60
- package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/openPbrBsdf.wgsl.js +469 -469
- package/lib/renderer/wgsl/chunks/pdm_displacement.wgsl.d.ts +1 -1
- package/lib/renderer/wgsl/chunks/pdm_displacement.wgsl.js +117 -120
- 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 +25 -22
- package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/sampleLight.wgsl.js +127 -127
- package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.js +136 -136
- package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.js +6 -6
- package/lib/renderer/wgsl/chunks/sampling.wgsl.js +73 -73
- package/lib/renderer/wgsl/chunks/sobol.wgsl.js +62 -62
- package/lib/renderer/wgsl/chunks/uvProjection.wgsl.js +11 -11
- package/lib/renderer/wgsl/compose.frag.wgsl.js +105 -105
- package/lib/renderer/wgsl/customDenoise.wgsl.js +10 -10
- package/lib/renderer/wgsl/depthQuery.wgsl.d.ts +1 -1
- package/lib/renderer/wgsl/depthQuery.wgsl.js +5 -5
- package/lib/renderer/wgsl/depthQuery.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/offlineAdaptive.compute.js +28 -28
- package/lib/renderer/wgsl/rayTrace.compute.js +251 -248
- package/lib/renderer/wgsl/rayTrace.compute.js.map +1 -1
- package/lib/scene/EnvironmentLight.d.ts +9 -3
- package/lib/scene/EnvironmentLight.js +9 -2
- package/lib/scene/EnvironmentLight.js.map +1 -1
- package/lib/scene/OpenPBRMaterial.d.ts +1 -1
- package/lib/scene/OpenPBRMaterial.js +1 -1
- package/lib/scene/OpenPBRMaterial.js.map +1 -1
- package/lib/scene/Scene.d.ts +4 -0
- package/lib/scene/Scene.js.map +1 -1
- package/lib/scene/SpotLight.d.ts +2 -2
- package/lib/scene/SpotLight.js +1 -1
- package/lib/scene/SpotLight.js.map +1 -1
- package/lib/scene/Texture.d.ts +17 -6
- package/lib/scene/Texture.js +13 -4
- package/lib/scene/Texture.js.map +1 -1
- package/lib/util/fromTHREE.js +151 -29
- 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 +1 -1
package/lib/main.d.ts
CHANGED
|
@@ -27,7 +27,7 @@ export type { OpenPBRMaterialParams } from './scene/OpenPBRMaterial.js';
|
|
|
27
27
|
export { default as OpenPBRMaterial } from './scene/OpenPBRMaterial.js';
|
|
28
28
|
export type { MaterialAlphaMode, UVProjection } from './scene/OpenPBRMaterial.js';
|
|
29
29
|
export { default as Texture } from './scene/Texture.js';
|
|
30
|
-
export type { TextureDataSource } from './scene/Texture.js';
|
|
30
|
+
export type { TextureDataSource, TextureWrapMode, TextureColorSpace } from './scene/Texture.js';
|
|
31
31
|
export type { ColorRGB, ColorRGBA, Vec2, Vec3, Mat4 } from './types.js';
|
|
32
32
|
export { default as AmbientLight } from './scene/AmbientLight.js';
|
|
33
33
|
export { default as DirectionalLight } from './scene/DirectionalLight.js';
|
package/lib/main.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"AAAA,uDAAuD;AAEvD;;;;;;;;;GASG;AACH,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAYvC,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAW1D,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,OAAO,IAAI,IAAI,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAEpE,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,EACL,OAAO,IAAI,QAAQ,EACnB,SAAS,IAAI,iBAAiB,EAC/B,MAAM,qBAAqB,CAAC;AAG7B,OAAO,EAAE,OAAO,IAAI,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAKxE,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAIxD,SAAS;AACT,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAClE,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAC1E,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAChE,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAC1E,OAAO,EACL,OAAO,IAAI,UAAU,EACrB,aAAa,EACb,eAAe,EAChB,MAAM,uBAAuB,CAAC;AAE/B,2BAA2B;AAC3B,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAOjF,mBAAmB;AACnB,OAAO,EACL,kBAAkB,EAClB,wBAAwB,EACxB,mBAAmB,EACnB,oBAAoB,EACrB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EACL,qBAAqB,EACrB,sBAAsB,EACvB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,wBAAwB,EAAE,MAAM,gBAAgB,CAAC;AAO1D,oCAAoC;AACpC,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,aAAa,CAAC;AAEhD,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,MAAM,cAAc,CAAC;AAElD,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,aAAa,CAAC;AAGhD,OAAO,EAAE,OAAO,IAAI,IAAI,EAAE,MAAM,WAAW,CAAC;AAC5C,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAGxD,OAAO,EAAC,8BAA8B,EAAC,MAAM,kCAAkC,CAAC","sourcesContent":["/// <reference types=\"@webgpu/types\" preserve=\"true\" />\n\n/**\n * MuTracer: a physically based WebGPU path tracer with a\n * WebGL 2 fallback.\n *\n * Build a {@link Scene} from {@link Mesh}es and lights (or convert a Three.js\n * scene with {@link fromTHREEScene}), then call {@link Engine.update} and {@link Render.refine} once\n * per animation frame.\n *\n * @packageDocumentation\n */\nexport { VERSION } from './version.js';\n\nexport type {\n AlphaBlendStrategy,\n ShaderCompilationDiagnostics,\n ToneMapping\n} from './renderer/RenderingPipeline.js';\nexport type {\n OfflineAdaptiveSamplingOptions,\n OfflineVarianceHistory\n} from './renderer/OfflineAdaptiveSampling.js';\nexport type { OIDNModel, OIDNEngine, OIDNPrecision, OIDNHDRTransfer, OIDNDynamicTileOptions, OIDNDynamicTileSetting, OIDNAuxiliaryModelUrls } from './oidn.js';\nexport { DEFAULT_JNLM_OPTIONS } from './renderer/jnlm.js';\nexport type { JNLMOptions } from './renderer/jnlm.js';\n\n// Scene description\nexport type {\n AnalyticLight,\n GroundedSkyboxBackground,\n Scene,\n SceneBackground,\n SceneLight\n} from './scene/Scene.js';\nexport { default as Camera } from './scene/Camera.js';\nexport { default as Mesh } from './scene/Mesh.js';\nexport { default as InstancedMesh } from './scene/InstancedMesh.js';\nexport type { InstancedMeshOptions } from './scene/InstancedMesh.js';\nexport { default as SceneNode } from './scene/SceneNode.js';\nexport {\n default as Geometry,\n Attribute as GeometryAttribute\n} from './scene/Geometry.js';\nexport type { GeometryInit } from './scene/Geometry.js';\nexport type { OpenPBRMaterialParams } from './scene/OpenPBRMaterial.js';\nexport { default as OpenPBRMaterial } from './scene/OpenPBRMaterial.js';\nexport type {\n MaterialAlphaMode,\n UVProjection\n} from './scene/OpenPBRMaterial.js';\nexport { default as Texture } from './scene/Texture.js';\nexport type { TextureDataSource } from './scene/Texture.js';\nexport type { ColorRGB, ColorRGBA, Vec2, Vec3, Mat4 } from './types.js';\n\n// Lights\nexport { default as AmbientLight } from './scene/AmbientLight.js';\nexport { default as DirectionalLight } from './scene/DirectionalLight.js';\nexport { default as RectLight } from './scene/RectLight.js';\nexport { default as SphereLight } from './scene/SphereLight.js';\nexport { default as SpotLight } from './scene/SpotLight.js';\nexport { default as EnvironmentLight } from './scene/EnvironmentLight.js';\nexport {\n default as IESProfile,\n IESParseError,\n parseIESProfile\n} from './scene/IESProfile.js';\n\n// Loaders and integrations\nexport { loadRGBE, parseRGBE } from './util/loadRGBE.js';\nexport { fromTHREECamera, fromTHREEScene, THREESync } from './util/fromTHREE.js';\nexport type {\n FromTHREESceneOptions,\n THREESyncOptions, THREEControls,\n FromTHREECameraOptions\n} from './util/fromTHREE.js';\n\n// Geometry helpers\nexport {\n createCubeGeometry,\n createCurvePlaneGeometry,\n createPlaneGeometry,\n createSphereGeometry\n} from './util/commonGeometry.js';\nexport {\n generateVertexNormals,\n generateVertexTangents\n} from './util/geometry.js';\nexport { computeMeshesBoundingBox } from './util/mesh.js';\n\n// BVH\nexport type { TinyBvhLayout } from './tinybvh/TinyBvhBuilder.js';\n\nexport type { SamplingPattern } from './renderer/sampling.js';\n\n// Independent rendering mechanisms.\nexport { default as Engine } from './Engine.js';\nexport type { EngineParams, EngineInfo, EngineDiagnostics, PrepareOptions, BVHBuilder, DepthSampleArea, TextureAtlasLimits } from './Engine.js';\nexport { default as Display } from './Display.js';\nexport type { BlobOptions, DisplayChannel, DisplaySettings, PostProcess, PostProcessContext } from './Display.js';\nexport { default as Render } from './Render.js';\nexport type { RenderOptions, RenderSettings, ConvergeOptions, ConvergeResult, DenoiserOptions, Denoiser, DenoiseInput, CustomDenoiserOptions, DenoiseSchedule, JNLMDenoiserOptions, OIDNDenoiserOptions, RenderStatus, SampleEvent } from './Render.js';\n\nexport { default as Sync } from './Sync.js';\nexport { default as RenderLoop } from './RenderLoop.js';\nexport type { RenderLoopOptions, RenderLoopStatus } from './RenderLoop.js';\n\nexport {getRecommendedDeviceDescriptor} from './renderer/deviceRequirements.js';\n"]}
|
|
1
|
+
{"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"AAAA,uDAAuD;AAEvD;;;;;;;;;GASG;AACH,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAYvC,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAW1D,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,OAAO,IAAI,IAAI,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAEpE,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,EACL,OAAO,IAAI,QAAQ,EACnB,SAAS,IAAI,iBAAiB,EAC/B,MAAM,qBAAqB,CAAC;AAG7B,OAAO,EAAE,OAAO,IAAI,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAKxE,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAIxD,SAAS;AACT,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAClE,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAC1E,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAChE,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAC1E,OAAO,EACL,OAAO,IAAI,UAAU,EACrB,aAAa,EACb,eAAe,EAChB,MAAM,uBAAuB,CAAC;AAE/B,2BAA2B;AAC3B,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAOjF,mBAAmB;AACnB,OAAO,EACL,kBAAkB,EAClB,wBAAwB,EACxB,mBAAmB,EACnB,oBAAoB,EACrB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EACL,qBAAqB,EACrB,sBAAsB,EACvB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,wBAAwB,EAAE,MAAM,gBAAgB,CAAC;AAO1D,oCAAoC;AACpC,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,aAAa,CAAC;AAEhD,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,MAAM,cAAc,CAAC;AAElD,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,aAAa,CAAC;AAGhD,OAAO,EAAE,OAAO,IAAI,IAAI,EAAE,MAAM,WAAW,CAAC;AAC5C,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAGxD,OAAO,EAAC,8BAA8B,EAAC,MAAM,kCAAkC,CAAC","sourcesContent":["/// <reference types=\"@webgpu/types\" preserve=\"true\" />\n\n/**\n * MuTracer: a physically based WebGPU path tracer with a\n * WebGL 2 fallback.\n *\n * Build a {@link Scene} from {@link Mesh}es and lights (or convert a Three.js\n * scene with {@link fromTHREEScene}), then call {@link Engine.update} and {@link Render.refine} once\n * per animation frame.\n *\n * @packageDocumentation\n */\nexport { VERSION } from './version.js';\n\nexport type {\n AlphaBlendStrategy,\n ShaderCompilationDiagnostics,\n ToneMapping\n} from './renderer/RenderingPipeline.js';\nexport type {\n OfflineAdaptiveSamplingOptions,\n OfflineVarianceHistory\n} from './renderer/OfflineAdaptiveSampling.js';\nexport type { OIDNModel, OIDNEngine, OIDNPrecision, OIDNHDRTransfer, OIDNDynamicTileOptions, OIDNDynamicTileSetting, OIDNAuxiliaryModelUrls } from './oidn.js';\nexport { DEFAULT_JNLM_OPTIONS } from './renderer/jnlm.js';\nexport type { JNLMOptions } from './renderer/jnlm.js';\n\n// Scene description\nexport type {\n AnalyticLight,\n GroundedSkyboxBackground,\n Scene,\n SceneBackground,\n SceneLight\n} from './scene/Scene.js';\nexport { default as Camera } from './scene/Camera.js';\nexport { default as Mesh } from './scene/Mesh.js';\nexport { default as InstancedMesh } from './scene/InstancedMesh.js';\nexport type { InstancedMeshOptions } from './scene/InstancedMesh.js';\nexport { default as SceneNode } from './scene/SceneNode.js';\nexport {\n default as Geometry,\n Attribute as GeometryAttribute\n} from './scene/Geometry.js';\nexport type { GeometryInit } from './scene/Geometry.js';\nexport type { OpenPBRMaterialParams } from './scene/OpenPBRMaterial.js';\nexport { default as OpenPBRMaterial } from './scene/OpenPBRMaterial.js';\nexport type {\n MaterialAlphaMode,\n UVProjection\n} from './scene/OpenPBRMaterial.js';\nexport { default as Texture } from './scene/Texture.js';\nexport type { TextureDataSource, TextureWrapMode, TextureColorSpace } from './scene/Texture.js';\nexport type { ColorRGB, ColorRGBA, Vec2, Vec3, Mat4 } from './types.js';\n\n// Lights\nexport { default as AmbientLight } from './scene/AmbientLight.js';\nexport { default as DirectionalLight } from './scene/DirectionalLight.js';\nexport { default as RectLight } from './scene/RectLight.js';\nexport { default as SphereLight } from './scene/SphereLight.js';\nexport { default as SpotLight } from './scene/SpotLight.js';\nexport { default as EnvironmentLight } from './scene/EnvironmentLight.js';\nexport {\n default as IESProfile,\n IESParseError,\n parseIESProfile\n} from './scene/IESProfile.js';\n\n// Loaders and integrations\nexport { loadRGBE, parseRGBE } from './util/loadRGBE.js';\nexport { fromTHREECamera, fromTHREEScene, THREESync } from './util/fromTHREE.js';\nexport type {\n FromTHREESceneOptions,\n THREESyncOptions, THREEControls,\n FromTHREECameraOptions\n} from './util/fromTHREE.js';\n\n// Geometry helpers\nexport {\n createCubeGeometry,\n createCurvePlaneGeometry,\n createPlaneGeometry,\n createSphereGeometry\n} from './util/commonGeometry.js';\nexport {\n generateVertexNormals,\n generateVertexTangents\n} from './util/geometry.js';\nexport { computeMeshesBoundingBox } from './util/mesh.js';\n\n// BVH\nexport type { TinyBvhLayout } from './tinybvh/TinyBvhBuilder.js';\n\nexport type { SamplingPattern } from './renderer/sampling.js';\n\n// Independent rendering mechanisms.\nexport { default as Engine } from './Engine.js';\nexport type { EngineParams, EngineInfo, EngineDiagnostics, PrepareOptions, BVHBuilder, DepthSampleArea, TextureAtlasLimits } from './Engine.js';\nexport { default as Display } from './Display.js';\nexport type { BlobOptions, DisplayChannel, DisplaySettings, PostProcess, PostProcessContext } from './Display.js';\nexport { default as Render } from './Render.js';\nexport type { RenderOptions, RenderSettings, ConvergeOptions, ConvergeResult, DenoiserOptions, Denoiser, DenoiseInput, CustomDenoiserOptions, DenoiseSchedule, JNLMDenoiserOptions, OIDNDenoiserOptions, RenderStatus, SampleEvent } from './Render.js';\n\nexport { default as Sync } from './Sync.js';\nexport { default as RenderLoop } from './RenderLoop.js';\nexport type { RenderLoopOptions, RenderLoopStatus } from './RenderLoop.js';\n\nexport {getRecommendedDeviceDescriptor} from './renderer/deviceRequirements.js';\n"]}
|
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.5/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.5/oidn/weights/rt_hdr_alb_nrm.tza";
|
|
2
|
+
export declare const smallWeightsUrl = "https://cdn.jsdelivr.net/npm/@meimu/mutracer@0.1.5/oidn/weights/rt_hdr_alb_nrm_small.tza";
|
|
@@ -50,6 +50,7 @@ export interface BufferData extends Record<MaterialTextureIndex, number[]> {
|
|
|
50
50
|
type: (typeof ShadowCatcherMaterial | typeof UnlitMaterial | 0)[];
|
|
51
51
|
mapInfo: number[];
|
|
52
52
|
mapTransform: number[];
|
|
53
|
+
mapWrap: number[];
|
|
53
54
|
mapUvChannel: number[];
|
|
54
55
|
mapColorLinear: number[];
|
|
55
56
|
mediumType: number[];
|
|
@@ -13,7 +13,7 @@ import { materialEmission } from './materialEmission.js';
|
|
|
13
13
|
import { Texture2DArray as WebGLTexture2DArray, constants, Texture2D } from './webgl.js';
|
|
14
14
|
import { materialAlphaModeConstants, resolveMaterialAlphaMode } from '../scene/OpenPBRMaterial.js';
|
|
15
15
|
import { mergeTexturesFromMaterials } from './texturesFromMaterials.js';
|
|
16
|
-
import { isTextureDataSource } from '../scene/Texture.js';
|
|
16
|
+
import { isTextureDataSource, textureWrapIndex } from '../scene/Texture.js';
|
|
17
17
|
import { commonNearestFloatProps, setDataTexture } from './dataTextureUtil.js';
|
|
18
18
|
export const DEFAULT_MAX_TEXTURE_ARRAY_BYTES = 384 * 1024 * 1024;
|
|
19
19
|
export function materialUsesMedium(material) {
|
|
@@ -169,6 +169,7 @@ function makeTextureArray(textures, sRGB = false, options = {}) {
|
|
|
169
169
|
mapTransform: [],
|
|
170
170
|
mapUvChannel: [],
|
|
171
171
|
mapColorLinear: [],
|
|
172
|
+
mapWrap: [],
|
|
172
173
|
stats: {
|
|
173
174
|
estimatedBytes: 0,
|
|
174
175
|
height: 1,
|
|
@@ -194,10 +195,12 @@ function makeTextureArray(textures, sRGB = false, options = {}) {
|
|
|
194
195
|
const dataBacked = textures.some((texture) => isTextureDataSource(texture.image));
|
|
195
196
|
const mapColorLinear = textures.map(texture => {
|
|
196
197
|
const image = texture.image;
|
|
197
|
-
return Number(isTextureDataSource(image) &&
|
|
198
|
+
return Number(texture.colorSpace ? texture.colorSpace === 'linear' : isTextureDataSource(image) &&
|
|
198
199
|
!(image.data instanceof Uint8Array) && !(image.data instanceof Uint8ClampedArray));
|
|
199
200
|
});
|
|
200
|
-
|
|
201
|
+
// Storage precision depends on the pixels, independently of their transfer function.
|
|
202
|
+
const floatStorage = textures.some(({ image }) => isTextureDataSource(image) &&
|
|
203
|
+
!(image.data instanceof Uint8Array) && !(image.data instanceof Uint8ClampedArray));
|
|
201
204
|
const bytesPerPixel = floatStorage ? 8 : 4;
|
|
202
205
|
const maxTextureArrayLayers = options.maxTextureArrayLayers ?? Infinity;
|
|
203
206
|
const maxTextureDimension2D = options.maxTextureDimension2D ?? Infinity;
|
|
@@ -288,6 +291,7 @@ function makeTextureArray(textures, sRGB = false, options = {}) {
|
|
|
288
291
|
texture.uvOffset[1]
|
|
289
292
|
]),
|
|
290
293
|
mapUvChannel: textures.map((texture) => texture.uvChannel),
|
|
294
|
+
mapWrap: textures.flatMap(texture => [textureWrapIndex(texture.wrapS), textureWrapIndex(texture.wrapT)]),
|
|
291
295
|
mapColorLinear,
|
|
292
296
|
stats: {
|
|
293
297
|
estimatedBytes: atlasWidth * atlasHeight * pages.length * bytesPerPixel,
|
|
@@ -416,11 +420,12 @@ class MaterialTable {
|
|
|
416
420
|
lightTexturesIndices.push(-1);
|
|
417
421
|
}
|
|
418
422
|
}
|
|
419
|
-
const { mapInfo, mapTransform, mapUvChannel, mapColorLinear, stats, texture } = makeTextureArray(allTextures, false, options);
|
|
423
|
+
const { mapInfo, mapTransform, mapUvChannel, mapColorLinear, mapWrap, stats, texture } = makeTextureArray(allTextures, false, options);
|
|
420
424
|
this.texture = texture;
|
|
421
425
|
this.textureAtlasStats = stats;
|
|
422
426
|
bufferData.mapInfo = mapInfo;
|
|
423
427
|
bufferData.mapTransform = mapTransform;
|
|
428
|
+
bufferData.mapWrap = mapWrap;
|
|
424
429
|
bufferData.mapUvChannel = mapUvChannel;
|
|
425
430
|
bufferData.mapColorLinear = mapColorLinear;
|
|
426
431
|
for (const slot of MATERIAL_TEXTURE_SLOTS) {
|
|
@@ -535,6 +540,7 @@ class MaterialTable {
|
|
|
535
540
|
pass.setUniform('map', this.texture || null);
|
|
536
541
|
pass.setUniform('mapInfo', this.bufferData.mapInfo);
|
|
537
542
|
pass.setUniform('mapTransform', this.bufferData.mapTransform);
|
|
543
|
+
pass.setUniform('mapWrap', this.bufferData.mapWrap);
|
|
538
544
|
pass.setUniform('mapUvChannel', this.bufferData.mapUvChannel);
|
|
539
545
|
pass.setUniform('mapColorLinear', this.bufferData.mapColorLinear);
|
|
540
546
|
pass.setUniforms({
|
|
@@ -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 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"]}
|
|
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, textureWrapIndex } 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 mapWrap: [] 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(texture.colorSpace ? texture.colorSpace === 'linear' : isTextureDataSource(image) &&\n !(image.data instanceof Uint8Array) && !(image.data instanceof Uint8ClampedArray));\n });\n // Storage precision depends on the pixels, independently of their transfer function.\n const floatStorage = textures.some(({image}) => isTextureDataSource(image) &&\n !(image.data instanceof Uint8Array) && !(image.data instanceof Uint8ClampedArray));\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 mapWrap: textures.flatMap(texture => [textureWrapIndex(texture.wrapS), textureWrapIndex(texture.wrapT)]),\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 mapWrap: 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, mapWrap, 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.mapWrap = mapWrap;\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('mapWrap', this.bufferData.mapWrap);\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 sD(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 eA = 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
|
+
eA = sD(sD(eA, s1, s2), s3, s4);
|
|
41
41
|
|
|
42
42
|
|
|
43
|
-
let lum = dot(
|
|
43
|
+
let lum = dot(eA.rgb, vec3f(0.2125, 0.7154, 0.0721));
|
|
44
44
|
var color: vec4f;
|
|
45
|
-
if (lum > threshold &&
|
|
46
|
-
color = vec4f(
|
|
45
|
+
if (lum > threshold && eA.a > 0.0) {
|
|
46
|
+
color = vec4f(eA.rgb * scale, eA.a);
|
|
47
47
|
} else {
|
|
48
48
|
|
|
49
|
-
color = vec4f(vec3(0.0),
|
|
49
|
+
color = vec4f(vec3(0.0), eA.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 vY(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 wc = 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 vR = vec2f(colorTexRegion());
|
|
103
|
+
let off = direction / vR * size;
|
|
104
104
|
|
|
105
105
|
var sum = vec4f(0.0);
|
|
106
|
-
var
|
|
106
|
+
var tg = 0.0;
|
|
107
107
|
for (var i = 0; i < 9; i++) {
|
|
108
|
-
let w =
|
|
108
|
+
let w = wc[i];
|
|
109
109
|
sum += sample_colorTex_linearSampler(uv2 + off * f32(i - 4)) * w;
|
|
110
|
-
|
|
110
|
+
tg += w;
|
|
111
111
|
}
|
|
112
|
-
output.color = sum / max(
|
|
112
|
+
output.color = sum / max(tg, 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 vZ = sample_colorTex1_linearSampler(uv2);
|
|
132
|
+
let wa = sample_colorTex2_linearSampler(uv2);
|
|
133
|
+
output.color = mix(vZ, wa, 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 pd {
|
|
277
277
|
${this._outputs
|
|
278
278
|
.map((name, idx) => `@location(${idx}) ${name}: vec4f,`)
|
|
279
279
|
.join('\n')}
|
|
@@ -282,11 +282,11 @@ ${scratchWGSLFunctions(this._reserveCapacity ? this._regionNames : inputs.filter
|
|
|
282
282
|
${this._fsDefine ?? ''}
|
|
283
283
|
@fragment
|
|
284
284
|
fn main(
|
|
285
|
-
@builtin(position)
|
|
286
|
-
) ->
|
|
287
|
-
let uv = vec2i(floor(
|
|
288
|
-
let uv2 =
|
|
289
|
-
var output:
|
|
285
|
+
@builtin(position) fH: vec4f
|
|
286
|
+
) -> pd {
|
|
287
|
+
let uv = vec2i(floor(fH.xy));
|
|
288
|
+
let uv2 = fH.xy / viewportSize;
|
|
289
|
+
var output: pd;
|
|
290
290
|
${this._fsMain}
|
|
291
291
|
return output;
|
|
292
292
|
}
|