@meimu/mutracer 0.1.3 → 0.1.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (118) hide show
  1. package/dist/assets/bvh.worker.js +1 -1
  2. package/dist/mutracer.umd.js +4114 -4015
  3. package/docs/api.md +11 -9
  4. package/docs/threejs.md +30 -4
  5. package/lib/Engine.js +18 -1
  6. package/lib/Engine.js.map +1 -1
  7. package/lib/main.d.ts +1 -1
  8. package/lib/main.js.map +1 -1
  9. package/lib/oidn.d.ts +1 -1
  10. package/lib/oidnBundledWeights.cdn.d.ts +2 -2
  11. package/lib/renderer/MaterialTable.d.ts +1 -0
  12. package/lib/renderer/MaterialTable.js +10 -4
  13. package/lib/renderer/MaterialTable.js.map +1 -1
  14. package/lib/renderer/WGPUBloomPass.js +18 -18
  15. package/lib/renderer/WGPUFullQuadPass.js +6 -6
  16. package/lib/renderer/WGPUJNLMDenoiser.js +69 -69
  17. package/lib/renderer/WGPURayTraceOutput.js +14 -14
  18. package/lib/renderer/WGPURayTracePass.d.ts +2 -0
  19. package/lib/renderer/WGPURayTracePass.js +12 -6
  20. package/lib/renderer/WGPURayTracePass.js.map +1 -1
  21. package/lib/renderer/WGPURenderingPipeline.js +15 -15
  22. package/lib/renderer/WebGLJNLMDenoiser.js +69 -69
  23. package/lib/renderer/WebGLRayTraceOutputPass.js +4 -4
  24. package/lib/renderer/WebGLRayTracePass.d.ts +1 -0
  25. package/lib/renderer/WebGLRayTracePass.js +7 -1
  26. package/lib/renderer/WebGLRayTracePass.js.map +1 -1
  27. package/lib/renderer/envMapCreation.d.ts +5 -1
  28. package/lib/renderer/envMapCreation.js +42 -5
  29. package/lib/renderer/envMapCreation.js.map +1 -1
  30. package/lib/renderer/geometryUpdates.js +1 -1
  31. package/lib/renderer/geometryUpdates.js.map +1 -1
  32. package/lib/renderer/glsl/chunks/cameraRay.glsl.js +12 -12
  33. package/lib/renderer/glsl/chunks/envMap.glsl.js +66 -54
  34. package/lib/renderer/glsl/chunks/envMap.glsl.js.map +1 -1
  35. package/lib/renderer/glsl/chunks/intersect.glsl.js +316 -310
  36. package/lib/renderer/glsl/chunks/intersect.glsl.js.map +1 -1
  37. package/lib/renderer/glsl/chunks/materialBuffer.glsl.js +151 -119
  38. package/lib/renderer/glsl/chunks/materialBuffer.glsl.js.map +1 -1
  39. package/lib/renderer/glsl/chunks/openPbrBsdf.glsl.js +414 -414
  40. package/lib/renderer/glsl/chunks/rand.glsl.js +3 -3
  41. package/lib/renderer/glsl/chunks/random.glsl.js +3 -3
  42. package/lib/renderer/glsl/chunks/rayTraceCore.glsl.js +40 -39
  43. package/lib/renderer/glsl/chunks/rayTraceCore.glsl.js.map +1 -1
  44. package/lib/renderer/glsl/chunks/sampleLight.glsl.js +69 -69
  45. package/lib/renderer/glsl/chunks/sampleMaterial.glsl.js +78 -78
  46. package/lib/renderer/glsl/chunks/sampleShadowCatcher.glsl.js +12 -12
  47. package/lib/renderer/glsl/chunks/sampling.glsl.js +75 -75
  48. package/lib/renderer/glsl/chunks/sobol.glsl.js +61 -61
  49. package/lib/renderer/glsl/chunks/textureLinear.glsl.js +5 -5
  50. package/lib/renderer/glsl/chunks/uvProjection.glsl.js +11 -11
  51. package/lib/renderer/glsl/depthQuery.frag.js +5 -5
  52. package/lib/renderer/glsl/depthQuery.frag.js.map +1 -1
  53. package/lib/renderer/glsl/normalizeRayTraceOutput.frag.js +8 -8
  54. package/lib/renderer/glsl/rayTrace.frag.js +133 -133
  55. package/lib/renderer/glsl/rayTrace.frag.js.map +1 -1
  56. package/lib/renderer/glsl/shadowCatcher.frag.js +9 -9
  57. package/lib/renderer/glsl/shadowCatcher.frag.js.map +1 -1
  58. package/lib/renderer/glsl/webglPipeline.frag.js +52 -52
  59. package/lib/renderer/lightsUtil.js +6 -4
  60. package/lib/renderer/lightsUtil.js.map +1 -1
  61. package/lib/renderer/materialChanges.js +1 -1
  62. package/lib/renderer/materialChanges.js.map +1 -1
  63. package/lib/renderer/materialComparison.generated.js +36 -18
  64. package/lib/renderer/materialComparison.generated.js.map +1 -1
  65. package/lib/renderer/prepareMeshBVH.js +2 -2
  66. package/lib/renderer/prepareMeshBVH.js.map +1 -1
  67. package/lib/renderer/sceneChangeDetector.js +4 -1
  68. package/lib/renderer/sceneChangeDetector.js.map +1 -1
  69. package/lib/renderer/sceneLightChanges.js +3 -2
  70. package/lib/renderer/sceneLightChanges.js.map +1 -1
  71. package/lib/renderer/scratchSampling.js +18 -18
  72. package/lib/renderer/wgsl/chunks/common.wgsl.js +4 -4
  73. package/lib/renderer/wgsl/chunks/envMap.wgsl.d.ts +1 -1
  74. package/lib/renderer/wgsl/chunks/envMap.wgsl.js +39 -31
  75. package/lib/renderer/wgsl/chunks/envMap.wgsl.js.map +1 -1
  76. package/lib/renderer/wgsl/chunks/intersect.wgsl.js +475 -469
  77. package/lib/renderer/wgsl/chunks/intersect.wgsl.js.map +1 -1
  78. package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.js +8 -8
  79. package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js +93 -59
  80. package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js.map +1 -1
  81. package/lib/renderer/wgsl/chunks/openPbrBsdf.wgsl.js +469 -469
  82. package/lib/renderer/wgsl/chunks/pdm_displacement.wgsl.d.ts +1 -1
  83. package/lib/renderer/wgsl/chunks/pdm_displacement.wgsl.js +117 -120
  84. package/lib/renderer/wgsl/chunks/pdm_displacement.wgsl.js.map +1 -1
  85. package/lib/renderer/wgsl/chunks/rand.wgsl.js +3 -3
  86. package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.js +25 -22
  87. package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.js.map +1 -1
  88. package/lib/renderer/wgsl/chunks/sampleLight.wgsl.js +127 -127
  89. package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.js +136 -136
  90. package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.js +6 -6
  91. package/lib/renderer/wgsl/chunks/sampling.wgsl.js +73 -73
  92. package/lib/renderer/wgsl/chunks/sobol.wgsl.js +62 -62
  93. package/lib/renderer/wgsl/chunks/uvProjection.wgsl.js +11 -11
  94. package/lib/renderer/wgsl/compose.frag.wgsl.js +105 -105
  95. package/lib/renderer/wgsl/customDenoise.wgsl.js +10 -10
  96. package/lib/renderer/wgsl/depthQuery.wgsl.d.ts +1 -1
  97. package/lib/renderer/wgsl/depthQuery.wgsl.js +5 -5
  98. package/lib/renderer/wgsl/depthQuery.wgsl.js.map +1 -1
  99. package/lib/renderer/wgsl/offlineAdaptive.compute.js +28 -28
  100. package/lib/renderer/wgsl/rayTrace.compute.js +251 -248
  101. package/lib/renderer/wgsl/rayTrace.compute.js.map +1 -1
  102. package/lib/scene/EnvironmentLight.d.ts +9 -3
  103. package/lib/scene/EnvironmentLight.js +9 -2
  104. package/lib/scene/EnvironmentLight.js.map +1 -1
  105. package/lib/scene/Scene.d.ts +4 -0
  106. package/lib/scene/Scene.js.map +1 -1
  107. package/lib/scene/SpotLight.d.ts +2 -2
  108. package/lib/scene/SpotLight.js +1 -1
  109. package/lib/scene/SpotLight.js.map +1 -1
  110. package/lib/scene/Texture.d.ts +17 -6
  111. package/lib/scene/Texture.js +13 -4
  112. package/lib/scene/Texture.js.map +1 -1
  113. package/lib/util/fromTHREE.js +151 -29
  114. package/lib/util/fromTHREE.js.map +1 -1
  115. package/lib/version.d.ts +1 -1
  116. package/lib/version.js +1 -1
  117. package/lib/version.js.map +1 -1
  118. package/package.json +1 -1
@@ -16,33 +16,33 @@ ${shadowCatcherAccumulationWGSL}
16
16
  override outputWidth: f32;
17
17
  override outputHeight: f32;
18
18
 
19
- struct oU {
19
+ struct pd {
20
20
  ${layers ? `@location(0) foreground: vec4f,
21
21
  @location(1) catcherBackground: vec4f` : `@location(0) color: vec4f,
22
22
  @location(1) normal: vec4f,
23
23
  @location(2) albedo: vec4f${catcher ? ',\n @location(3) shadowCatcher: vec4f' : ''}`}
24
24
  }
25
25
  @fragment
26
- fn main(@builtin(position) fD: vec4f) -> oU {
26
+ fn main(@builtin(position) fG: vec4f) -> pd {
27
27
  let size = vec2u(u32(outputWidth), u32(outputHeight));
28
- let fM = vec2u(u32(fD.x), size.y - u32(fD.y) - 1u);
29
- var idx = fM.x + fM.y * size.x;
28
+ let fP = vec2u(u32(fG.x), size.y - u32(fG.y) - 1u);
29
+ var idx = fP.x + fP.y * size.x;
30
30
 
31
31
 
32
32
 
33
33
 
34
34
  if (sampleCount < 1.0 && normalBuffer[idx].a <= 0.0) {
35
- let uV = max(sampleTileGrid, vec2u(1u));
36
- let uF = min(
37
- ((fM + uV / 2u) / uV) * uV,
38
- ((size - vec2u(1u)) / uV) * uV
35
+ let vc = max(sampleTileGrid, vec2u(1u));
36
+ let uM = min(
37
+ ((fP + vc / 2u) / vc) * vc,
38
+ ((size - vec2u(1u)) / vc) * vc
39
39
  );
40
- let sz = uF.x + uF.y * size.x;
41
- if (normalBuffer[sz].a > 0.0) {
42
- idx = sz;
40
+ let sH = uM.x + uM.y * size.x;
41
+ if (normalBuffer[sH].a > 0.0) {
42
+ idx = sH;
43
43
  }
44
44
  }
45
- var output: oU;
45
+ var output: pd;
46
46
  if (normalBuffer[idx].a <= 0.0) {
47
47
  ${layers ? `output.foreground = vec4f(0.0);
48
48
  output.catcherBackground = vec4f(0.0);` : `output.color = vec4f(0.0);
@@ -62,12 +62,12 @@ let hit = albedo.a;
62
62
  let total = max(normal.a, 1.0);
63
63
  ${layers ? `
64
64
  let shadow = shadowCatcherBuffer[idx];
65
- let iQ = max(hit - shadow.mask.b, 0.0);
65
+ let iV = max(hit - shadow.mask.b, 0.0);
66
66
 
67
67
 
68
68
  output.foreground = vec4f(
69
69
  (color.rgb - shadow.background.rgb)
70
- / select(total, iQ, iQ > 0.0),
70
+ / select(total, iV, iV > 0.0),
71
71
  clamp((color.a - shadow.mask.g) / total, 0.0, 1.0)
72
72
  );
73
73
  output.catcherBackground = shadow.background / total;
@@ -57,6 +57,8 @@ export declare function makeRayTraceUniform(): {
57
57
  sequenceSeed: Uint32Array<ArrayBuffer>;
58
58
  zSobolLogSPP: Uint32Array<ArrayBuffer>;
59
59
  sampleSequenceOffset: Uint32Array<ArrayBuffer>;
60
+ environmentRotation: Float32Array<ArrayBuffer>;
61
+ backgroundMapTransform: Float32Array<ArrayBuffer>;
60
62
  };
61
63
  };
62
64
  export declare function packAnalyticsLightsToBuffer(lights: AnalyticLight[], texturesIndices: number[], selectionPmfs: number[], iesProfileTexelOffsets?: ArrayLike<number>): Float32Array<ArrayBuffer>;
@@ -24,7 +24,7 @@ import { WGPU_SCENE_FEATURE_BITS, wgpuSceneFeatureFlags } from './WGPUSceneFeatu
24
24
  import { mat4 } from '../math.js';
25
25
  import MaterialTable, { DEFAULT_MAX_TEXTURE_ARRAY_BYTES, materialUsesMedium } from './MaterialTable.js';
26
26
  import { numberArraysEqual } from './util.js';
27
- import { generateBackgroundMapFromSceneBackground } from './envMapCreation.js';
27
+ import { generateBackgroundMapFromSceneBackground, environmentRotation, backgroundMapTransform } from './envMapCreation.js';
28
28
  import rayTraceCompute, { WORKGROUP_SIZE } from './wgsl/rayTrace.compute.js';
29
29
  import { CONSTANT_DIRECTIONAL_LIGHT, CONSTANT_RECT_LIGHT, CONSTANT_SPHERE_LIGHT, CONSTANT_SPOT_LIGHT } from './lightsUtil.js';
30
30
  import { envMapDistribution, environmentMapSourcesMatch } from './envMapDistribution.js';
@@ -89,7 +89,7 @@ export function isWebGPUPipelineSpecializationFailure(...errors) {
89
89
  /** CPU-side views over the `RayTraceUniform` WGSL struct. */
90
90
  export function makeRayTraceUniform() {
91
91
  // Created from https://webgpufundamentals.org/webgpu/lessons/resources/wgsl-offset-computer.html
92
- const RayTraceUniformValues = new ArrayBuffer(176);
92
+ const RayTraceUniformValues = new ArrayBuffer(256);
93
93
  const RayTraceUniformViews = {
94
94
  outputSize: new Float32Array(RayTraceUniformValues, 0, 2),
95
95
  sampleCount: new Float32Array(RayTraceUniformValues, 8, 1),
@@ -119,11 +119,15 @@ export function makeRayTraceUniform() {
119
119
  sceneFeatureFlags: new Uint32Array(RayTraceUniformValues, 152, 1),
120
120
  sequenceSeed: new Uint32Array(RayTraceUniformValues, 156, 1),
121
121
  zSobolLogSPP: new Uint32Array(RayTraceUniformValues, 160, 1),
122
- sampleSequenceOffset: new Uint32Array(RayTraceUniformValues, 164, 1)
122
+ sampleSequenceOffset: new Uint32Array(RayTraceUniformValues, 164, 1),
123
+ environmentRotation: new Float32Array(RayTraceUniformValues, 176, 16),
124
+ backgroundMapTransform: new Float32Array(RayTraceUniformValues, 240, 4)
123
125
  };
124
126
  // Fixed runtime trip bounds discourage thin-film loop unrolling. Keep 4 for
125
127
  // 2 polarizations/substrates and 3 channels, independent of BSDF budgets.
126
128
  RayTraceUniformViews.loopUnrollGuard[0] = 4;
129
+ RayTraceUniformViews.environmentRotation.set(environmentRotation([]));
130
+ RayTraceUniformViews.backgroundMapTransform.set(backgroundMapTransform());
127
131
  RayTraceUniformViews.bevel[0] = 1;
128
132
  RayTraceUniformViews.dispersionWavelengths[0] = 3;
129
133
  return {
@@ -179,7 +183,7 @@ export function packAnalyticsLightsToBuffer(lights, texturesIndices, selectionPm
179
183
  data[(off + 2) * 4 + 3] = light.radius;
180
184
  packVec3(off + 3, [
181
185
  Math.cos((light.outerAngle * Math.PI) / 180),
182
- Math.min(1, Math.max(0, 1 - light.innerAngle / light.outerAngle)),
186
+ Math.cos((Math.min(light.innerAngle, light.outerAngle) * Math.PI) / 180),
183
187
  0
184
188
  ]);
185
189
  }
@@ -792,8 +796,6 @@ class WGPURayTracePass {
792
796
  ...MATERIAL_TEXTURE_DEFINES,
793
797
  'USE_ANISOTROPY_DIRECTIONS',
794
798
  'USE_COAT_NORMAL_FRAMES',
795
- 'COLOR_OFF',
796
- 'USE_VERTEX_COLOR',
797
799
  'HAS_ALPHA_BLEND',
798
800
  'HAS_ALPHA_MASK'
799
801
  ];
@@ -1621,6 +1623,7 @@ ${rayTraceCompute({
1621
1623
  return true;
1622
1624
  }
1623
1625
  setBackground(background) {
1626
+ this._rtUniform.views.backgroundMapTransform.set(backgroundMapTransform(background));
1624
1627
  this._constants.USE_BACKGROUND = !!background;
1625
1628
  const backgroundImage = background && !Array.isArray(background)
1626
1629
  ? generateBackgroundMapFromSceneBackground(background)
@@ -2119,6 +2122,8 @@ ${rayTraceCompute({
2119
2122
  for (let i = 0; i < mapUvChannel.length; i++) {
2120
2123
  mapInfoData[numMaps * 8 + i * 4] = mapUvChannel[i];
2121
2124
  mapInfoData[numMaps * 8 + i * 4 + 1] = mapColorLinear[i];
2125
+ mapInfoData[numMaps * 8 + i * 4 + 2] = materialData.bufferData.mapWrap[i * 2];
2126
+ mapInfoData[numMaps * 8 + i * 4 + 3] = materialData.bufferData.mapWrap[i * 2 + 1];
2122
2127
  }
2123
2128
  let mapInfoUniform = this._mapInfoUniform;
2124
2129
  if (!mapInfoUniform || mapInfoUniform.size !== mapInfoData.byteLength) {
@@ -2186,6 +2191,7 @@ ${rayTraceCompute({
2186
2191
  const analyticLights = allAnalyticLights.slice(0, FIXED_LIGHT_COUNT);
2187
2192
  const numAnalyticLights = analyticLights.length;
2188
2193
  const envImage = this._sceneEnvironment.update(lights);
2194
+ this._rtUniform.views.environmentRotation.set(environmentRotation(lights));
2189
2195
  this._rtUniform.views.lightsCount[0] = numAnalyticLights;
2190
2196
  this._setEnvMap(envImage);
2191
2197
  const lightTexturesChanged = this._rectLightTextures.update(analyticLights);