@driftengine/core 4.8.5 → 4.8.7

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 (214) hide show
  1. package/CHANGELOG.json +4392 -4250
  2. package/README.md +1 -1
  3. package/dist/index.d.ts +12 -4
  4. package/dist/index.js +12 -2
  5. package/dist/render/ambientHarmonics.d.ts +46 -0
  6. package/dist/render/ambientHarmonics.js +80 -0
  7. package/dist/render/anisotropicLobe.d.ts +10 -0
  8. package/dist/render/anisotropicLobe.js +19 -0
  9. package/dist/render/areaLights.d.ts +54 -0
  10. package/dist/render/areaLights.js +55 -0
  11. package/dist/render/backend/api.d.ts +43 -2
  12. package/dist/render/backend/webgl2/instanced.d.ts +2 -0
  13. package/dist/render/backend/webgl2/instanced.js +11 -2
  14. package/dist/render/backend/webgl2/renderer.d.ts +120 -11
  15. package/dist/render/backend/webgl2/renderer.js +356 -53
  16. package/dist/render/backend/webgl2/sceneCaptureTarget.d.ts +29 -0
  17. package/dist/render/backend/webgl2/sceneCaptureTarget.js +96 -0
  18. package/dist/render/backend/webgl2/skinScatter.d.ts +14 -0
  19. package/dist/render/backend/webgl2/skinScatter.js +88 -26
  20. package/dist/render/backend/webgpu/buffers.js +2 -1
  21. package/dist/render/backend/webgpu/clusterBinner.js +3 -2
  22. package/dist/render/backend/webgpu/flatPass.d.ts +7 -5
  23. package/dist/render/backend/webgpu/flatPass.js +15 -13
  24. package/dist/render/backend/webgpu/particlePass.d.ts +37 -4
  25. package/dist/render/backend/webgpu/particlePass.js +81 -12
  26. package/dist/render/backend/webgpu/postPass.d.ts +6 -1
  27. package/dist/render/backend/webgpu/postPass.js +7 -2
  28. package/dist/render/backend/webgpu/renderer.d.ts +93 -8
  29. package/dist/render/backend/webgpu/renderer.js +483 -93
  30. package/dist/render/backend/webgpu/sceneCaptureTarget.d.ts +24 -0
  31. package/dist/render/backend/webgpu/sceneCaptureTarget.js +59 -0
  32. package/dist/render/backend/webgpu/shaders/clusterBin.wgsl.d.ts +1 -1
  33. package/dist/render/backend/webgpu/shaders/clusterBin.wgsl.js +41 -1
  34. package/dist/render/backend/webgpu/skinPaletteRing.d.ts +40 -28
  35. package/dist/render/backend/webgpu/skinPaletteRing.js +69 -32
  36. package/dist/render/backend/webgpu/skinScatterPass.d.ts +10 -2
  37. package/dist/render/backend/webgpu/skinScatterPass.js +59 -9
  38. package/dist/render/backend/webgpu/surfaceTexturePass.d.ts +5 -1
  39. package/dist/render/backend/webgpu/surfaceTexturePass.js +45 -5
  40. package/dist/render/backend/webgpu/waterPass.d.ts +1 -1
  41. package/dist/render/bloomChain.d.ts +44 -0
  42. package/dist/render/bloomChain.js +28 -0
  43. package/dist/render/bloomPass.d.ts +3 -1
  44. package/dist/render/bloomPass.js +16 -2
  45. package/dist/render/clusteredLights.d.ts +78 -6
  46. package/dist/render/clusteredLights.js +214 -13
  47. package/dist/render/driftLight/bake.d.ts +2 -0
  48. package/dist/render/driftLight/bake.js +1 -1
  49. package/dist/render/driftLight/falloff.d.ts +4 -2
  50. package/dist/render/driftLight/falloff.js +8 -2
  51. package/dist/render/fixtureAtlas.js +1 -1
  52. package/dist/render/gi/bounceLights.d.ts +3 -2
  53. package/dist/render/gi/bounceLights.js +8 -3
  54. package/dist/render/instanceCull.js +12 -0
  55. package/dist/render/instances.d.ts +47 -11
  56. package/dist/render/instances.js +24 -9
  57. package/dist/render/lightBudget.d.ts +38 -2
  58. package/dist/render/lightBudget.js +48 -5
  59. package/dist/render/lightmap.d.ts +116 -0
  60. package/dist/render/lightmap.js +140 -0
  61. package/dist/render/mesh.js +2 -1
  62. package/dist/render/particleBatch.d.ts +59 -3
  63. package/dist/render/particleBatch.js +53 -2
  64. package/dist/render/particleMaterial.d.ts +6 -1
  65. package/dist/render/particleMaterial.js +10 -2
  66. package/dist/render/particlePool.d.ts +32 -0
  67. package/dist/render/particlePool.js +9 -0
  68. package/dist/render/particleSort.d.ts +34 -0
  69. package/dist/render/particleSort.js +96 -0
  70. package/dist/render/pointLightSelection.d.ts +13 -0
  71. package/dist/render/pointLightSelection.js +3 -1
  72. package/dist/render/renderQuality.d.ts +8 -7
  73. package/dist/render/rendererHarness.js +3 -0
  74. package/dist/render/rgb9e5.d.ts +22 -0
  75. package/dist/render/rgb9e5.js +47 -0
  76. package/dist/render/sceneCapture.d.ts +29 -0
  77. package/dist/render/sceneCapture.js +36 -0
  78. package/dist/render/sceneTarget.d.ts +5 -0
  79. package/dist/render/sceneTarget.js +8 -1
  80. package/dist/render/screenSpaceReflection.d.ts +27 -1
  81. package/dist/render/screenSpaceReflection.js +9 -0
  82. package/dist/render/shaders/bloom.d.ts +8 -4
  83. package/dist/render/shaders/bloom.js +20 -3
  84. package/dist/render/shaders/bolt.d.ts +1 -1
  85. package/dist/render/shaders/bolt.js +7 -1
  86. package/dist/render/shaders/depth.js +11 -0
  87. package/dist/render/shaders/flat/anisotropic.d.ts +1 -1
  88. package/dist/render/shaders/flat/anisotropic.js +37 -3
  89. package/dist/render/shaders/flat/areaLight.d.ts +10 -0
  90. package/dist/render/shaders/flat/areaLight.js +142 -0
  91. package/dist/render/shaders/flat/glassTint.d.ts +3 -2
  92. package/dist/render/shaders/flat/glassTint.js +3 -1
  93. package/dist/render/shaders/flat/index.d.ts +5 -0
  94. package/dist/render/shaders/flat/index.js +46 -6
  95. package/dist/render/shaders/flat/lobes.d.ts +6 -0
  96. package/dist/render/shaders/flat/lobes.js +49 -43
  97. package/dist/render/shaders/flat/main.d.ts +1 -1
  98. package/dist/render/shaders/flat/main.js +158 -121
  99. package/dist/render/shaders/flat/models.d.ts +21 -6
  100. package/dist/render/shaders/flat/models.js +161 -17
  101. package/dist/render/shaders/flat/normalMap.d.ts +10 -0
  102. package/dist/render/shaders/flat/normalMap.js +25 -0
  103. package/dist/render/shaders/flat/preamble.js +84 -40
  104. package/dist/render/shaders/flat/skin.js +6 -5
  105. package/dist/render/shaders/generated/bloom.wgsl.d.ts +13 -3
  106. package/dist/render/shaders/generated/bloom.wgsl.js +13 -3
  107. package/dist/render/shaders/generated/bolt.wgsl.d.ts +1 -1
  108. package/dist/render/shaders/generated/bolt.wgsl.js +1 -1
  109. package/dist/render/shaders/generated/depth.wgsl.d.ts +4 -4
  110. package/dist/render/shaders/generated/depth.wgsl.js +4 -4
  111. package/dist/render/shaders/generated/flat.wgsl.d.ts +1647 -2044
  112. package/dist/render/shaders/generated/flat.wgsl.js +1685 -2082
  113. package/dist/render/shaders/generated/particle.wgsl.d.ts +115 -1
  114. package/dist/render/shaders/generated/particle.wgsl.js +115 -1
  115. package/dist/render/shaders/generated/skinBlur.wgsl.d.ts +12 -2
  116. package/dist/render/shaders/generated/skinBlur.wgsl.js +12 -2
  117. package/dist/render/shaders/generated/ssrTrace.wgsl.d.ts +11 -6
  118. package/dist/render/shaders/generated/ssrTrace.wgsl.js +11 -6
  119. package/dist/render/shaders/generated/water.wgsl.d.ts +23 -16
  120. package/dist/render/shaders/generated/water.wgsl.js +23 -16
  121. package/dist/render/shaders/gi/probeBake.wgsl.js +9 -5
  122. package/dist/render/shaders/particle.d.ts +17 -1
  123. package/dist/render/shaders/particle.js +133 -1
  124. package/dist/render/shaders/recon/motion.wgsl.d.ts +1 -1
  125. package/dist/render/shaders/recon/motion.wgsl.js +13 -2
  126. package/dist/render/shaders/skinBlur.js +25 -3
  127. package/dist/render/shaders/ssrTrace.js +20 -1
  128. package/dist/render/shaders/water.d.ts +1 -1
  129. package/dist/render/shaders/water.js +12 -3
  130. package/dist/render/skinBlur.d.ts +8 -5
  131. package/dist/render/skinBlur.js +8 -5
  132. package/dist/render/skinScatter.d.ts +3 -1
  133. package/dist/render/skinScatter.js +3 -1
  134. package/dist/render/ssrPass.js +1 -0
  135. package/dist/render/surfaceModel.d.ts +49 -8
  136. package/dist/render/surfaceModel.js +54 -8
  137. package/dist/render/surfaceTexture.d.ts +38 -1
  138. package/dist/render/surfaceTexture.js +37 -2
  139. package/package.json +6 -6
  140. package/src/index.ts +26 -3
  141. package/src/render/ambientHarmonics.ts +92 -0
  142. package/src/render/anisotropicLobe.ts +29 -0
  143. package/src/render/areaLights.ts +97 -0
  144. package/src/render/backend/api.ts +61 -1
  145. package/src/render/backend/webgl2/instanced.ts +12 -2
  146. package/src/render/backend/webgl2/renderer.ts +470 -59
  147. package/src/render/backend/webgl2/sceneCaptureTarget.ts +130 -0
  148. package/src/render/backend/webgl2/skinScatter.ts +120 -43
  149. package/src/render/backend/webgpu/buffers.ts +2 -1
  150. package/src/render/backend/webgpu/clusterBinner.ts +3 -1
  151. package/src/render/backend/webgpu/flatPass.ts +18 -13
  152. package/src/render/backend/webgpu/particlePass.ts +119 -12
  153. package/src/render/backend/webgpu/postPass.ts +7 -2
  154. package/src/render/backend/webgpu/renderer.ts +589 -113
  155. package/src/render/backend/webgpu/sceneCaptureTarget.ts +63 -0
  156. package/src/render/backend/webgpu/shaders/clusterBin.wgsl.ts +41 -1
  157. package/src/render/backend/webgpu/skinPaletteRing.ts +65 -33
  158. package/src/render/backend/webgpu/skinScatterPass.ts +59 -9
  159. package/src/render/backend/webgpu/surfaceTexturePass.ts +57 -6
  160. package/src/render/bloomChain.ts +69 -0
  161. package/src/render/bloomPass.ts +26 -2
  162. package/src/render/clusteredLights.ts +259 -12
  163. package/src/render/driftLight/bake.ts +3 -1
  164. package/src/render/driftLight/falloff.ts +13 -2
  165. package/src/render/fixtureAtlas.ts +1 -1
  166. package/src/render/gi/bounceLights.ts +12 -3
  167. package/src/render/instanceCull.ts +9 -0
  168. package/src/render/instances.ts +61 -12
  169. package/src/render/lightBudget.ts +88 -4
  170. package/src/render/lightmap.ts +243 -0
  171. package/src/render/mesh.ts +2 -1
  172. package/src/render/particleBatch.ts +95 -4
  173. package/src/render/particleMaterial.ts +11 -1
  174. package/src/render/particlePool.ts +36 -0
  175. package/src/render/particleSort.ts +133 -0
  176. package/src/render/pointLightSelection.ts +20 -1
  177. package/src/render/renderQuality.ts +8 -7
  178. package/src/render/rendererHarness.ts +3 -0
  179. package/src/render/rgb9e5.ts +52 -0
  180. package/src/render/sceneCapture.ts +56 -0
  181. package/src/render/sceneTarget.ts +18 -1
  182. package/src/render/screenSpaceReflection.ts +33 -1
  183. package/src/render/shaders/bloom.ts +20 -3
  184. package/src/render/shaders/bolt.ts +7 -1
  185. package/src/render/shaders/depth.ts +11 -0
  186. package/src/render/shaders/flat/anisotropic.ts +37 -3
  187. package/src/render/shaders/flat/areaLight.ts +142 -0
  188. package/src/render/shaders/flat/glassTint.ts +9 -2
  189. package/src/render/shaders/flat/index.ts +51 -6
  190. package/src/render/shaders/flat/lobes.ts +50 -43
  191. package/src/render/shaders/flat/main.ts +158 -121
  192. package/src/render/shaders/flat/models.ts +170 -21
  193. package/src/render/shaders/flat/normalMap.ts +25 -0
  194. package/src/render/shaders/flat/preamble.ts +84 -40
  195. package/src/render/shaders/flat/skin.ts +6 -5
  196. package/src/render/shaders/generated/bloom.wgsl.ts +13 -3
  197. package/src/render/shaders/generated/bolt.wgsl.ts +1 -1
  198. package/src/render/shaders/generated/depth.wgsl.ts +4 -4
  199. package/src/render/shaders/generated/flat.wgsl.ts +1685 -2082
  200. package/src/render/shaders/generated/particle.wgsl.ts +116 -1
  201. package/src/render/shaders/generated/skinBlur.wgsl.ts +12 -2
  202. package/src/render/shaders/generated/ssrTrace.wgsl.ts +11 -6
  203. package/src/render/shaders/generated/water.wgsl.ts +23 -16
  204. package/src/render/shaders/gi/probeBake.wgsl.ts +9 -5
  205. package/src/render/shaders/particle.ts +134 -1
  206. package/src/render/shaders/recon/motion.wgsl.ts +13 -2
  207. package/src/render/shaders/skinBlur.ts +25 -3
  208. package/src/render/shaders/ssrTrace.ts +20 -1
  209. package/src/render/shaders/water.ts +12 -3
  210. package/src/render/skinBlur.ts +8 -5
  211. package/src/render/skinScatter.ts +3 -1
  212. package/src/render/ssrPass.ts +1 -0
  213. package/src/render/surfaceModel.ts +82 -10
  214. package/src/render/surfaceTexture.ts +101 -3
@@ -27,6 +27,54 @@ export const EMISSIVE_SHADOW_SHARE = 0.55;
27
27
  * deliberately not this.
28
28
  */
29
29
  export const MIN_LOBE_ALPHA = 0.01;
30
+ /**
31
+ * Karis's fit to the split-sum environment BRDF, as GLSL: the lit stage's, and the screen-space
32
+ * reflection's when a surface asks for its Fresnel (`ReflectiveSurface.fresnel`). One text, so the
33
+ * two cannot drift.
34
+ */
35
+ export const ENV_BRDF_GLSL = `/**
36
+ * The other half of the split-sum approximation: what fraction of an environment a surface returns.
37
+ *
38
+ * The convolution decides *what* a surface reflects at a given roughness; this decides *how much*.
39
+ * Before it the amount was fresnel times one-minus-roughness, which is a curve somebody chose
40
+ * standing in for an integral.
41
+ *
42
+ * Karis's analytic fit to the environment BRDF, so there is **no lookup texture and no texture
43
+ * unit**: a few multiply-adds against roughness and the view angle. x scales the surface's own
44
+ * reflectance at normal incidence and y is the additive grazing term, so a smooth dielectric at
45
+ * f0 0.04 returns about 0.046 head-on and approaches 1 at the edge, which is what a dielectric
46
+ * does. At roughness 1 it returns about 0.016 rather than the zero one-minus-roughness gave, which
47
+ * is the substantive difference: a fully rough dielectric does reflect its surroundings.
48
+ *
49
+ * **It replaces the Fresnel factor as well as the thinning**, because the fit already contains the
50
+ * angular dependence; multiplying by a separate Fresnel term would apply it twice.
51
+ *
52
+ * **How much this is worth was measured, and it is worth less than it looks on a dark room.**
53
+ * On demo/dev/ibl.html?ladder=1 the whole ladder moved by at most 0.2 of 255 when the old term was
54
+ * replaced. That is not the term failing: at high roughness the surface reads the coarsest levels
55
+ * of the chain, and in a room of five dark walls and one bright one those levels are dark, so a
56
+ * weight three times larger against a near-zero radiance is still near zero. It is worth much more
57
+ * against a bright environment, which is what a loaded sky is and what no captured room here is.
58
+ *
59
+ * **A warning about reading that page, paid for once.** The ladder falls about five-fold from
60
+ * mirror to rough, and that reads as energy being lost. It is not: a mirror concentrates the one
61
+ * bright wall into a sharp image and a rough surface averages it against five dark ones, so the
62
+ * falloff is the room's own content. The normalised falloff also happens to track one-minus-
63
+ * roughness closely, which made the old term look like the cause — and removing that term entirely
64
+ * changed nothing, which is what settled it. Perturb before believing a match.
65
+ *
66
+ * **What it costs** is a fit rather than the integral: the published error is around one per cent
67
+ * of the tabulated term, far below what an eight-bit frame can show. **What would make it wrong**
68
+ * is a material model this shader does not have — a clearcoat or a sheen lobe carries its own BRDF
69
+ * and its own integral, and this fit is Trowbridge-Reitz with Smith masking and nothing else.
70
+ */
71
+ vec2 envBrdfApprox(float ndv, float roughness) {
72
+ const vec4 c0 = vec4(-1.0, -0.0275, -0.572, 0.022);
73
+ const vec4 c1 = vec4(1.0, 0.0425, 1.04, -0.04);
74
+ vec4 r = roughness * c0 + c1;
75
+ float a004 = min(r.x * r.x, exp2(-9.28 * ndv)) * r.x + r.y;
76
+ return vec2(-1.04, 1.04) * a004 + r.zw;
77
+ }`;
30
78
  export const LOBES_GLSL = `float shadowReach(float distance, float maxDistance) {
31
79
  return 1.0 - smoothstep(
32
80
  maxDistance * ${POINT_SHADOW_FADE_START.toFixed(2)},
@@ -153,49 +201,7 @@ float sphereLobe(float ndh, float roughness, float sourceRadius, float dist) {
153
201
  return energy * (w2 * w2) / max(d * d, 1e-8);
154
202
  }
155
203
 
156
- /**
157
- * The other half of the split-sum approximation: what fraction of an environment a surface returns.
158
- *
159
- * The convolution decides *what* a surface reflects at a given roughness; this decides *how much*.
160
- * Before it the amount was fresnel times one-minus-roughness, which is a curve somebody chose
161
- * standing in for an integral.
162
- *
163
- * Karis's analytic fit to the environment BRDF, so there is **no lookup texture and no texture
164
- * unit**: a few multiply-adds against roughness and the view angle. x scales the surface's own
165
- * reflectance at normal incidence and y is the additive grazing term, so a smooth dielectric at
166
- * f0 0.04 returns about 0.046 head-on and approaches 1 at the edge, which is what a dielectric
167
- * does. At roughness 1 it returns about 0.016 rather than the zero one-minus-roughness gave, which
168
- * is the substantive difference: a fully rough dielectric does reflect its surroundings.
169
- *
170
- * **It replaces the Fresnel factor as well as the thinning**, because the fit already contains the
171
- * angular dependence; multiplying by a separate Fresnel term would apply it twice.
172
- *
173
- * **How much this is worth was measured, and it is worth less than it looks on a dark room.**
174
- * On demo/dev/ibl.html?ladder=1 the whole ladder moved by at most 0.2 of 255 when the old term was
175
- * replaced. That is not the term failing: at high roughness the surface reads the coarsest levels
176
- * of the chain, and in a room of five dark walls and one bright one those levels are dark, so a
177
- * weight three times larger against a near-zero radiance is still near zero. It is worth much more
178
- * against a bright environment, which is what a loaded sky is and what no captured room here is.
179
- *
180
- * **A warning about reading that page, paid for once.** The ladder falls about five-fold from
181
- * mirror to rough, and that reads as energy being lost. It is not: a mirror concentrates the one
182
- * bright wall into a sharp image and a rough surface averages it against five dark ones, so the
183
- * falloff is the room's own content. The normalised falloff also happens to track one-minus-
184
- * roughness closely, which made the old term look like the cause — and removing that term entirely
185
- * changed nothing, which is what settled it. Perturb before believing a match.
186
- *
187
- * **What it costs** is a fit rather than the integral: the published error is around one per cent
188
- * of the tabulated term, far below what an eight-bit frame can show. **What would make it wrong**
189
- * is a material model this shader does not have — a clearcoat or a sheen lobe carries its own BRDF
190
- * and its own integral, and this fit is Trowbridge-Reitz with Smith masking and nothing else.
191
- */
192
- vec2 envBrdfApprox(float ndv, float roughness) {
193
- const vec4 c0 = vec4(-1.0, -0.0275, -0.572, 0.022);
194
- const vec4 c1 = vec4(1.0, 0.0425, 1.04, -0.04);
195
- vec4 r = roughness * c0 + c1;
196
- float a004 = min(r.x * r.x, exp2(-9.28 * ndv)) * r.x + r.y;
197
- return vec2(-1.04, 1.04) * a004 + r.zw;
198
- }
204
+ ${ENV_BRDF_GLSL}
199
205
 
200
206
  /**
201
207
  * How much of a prefiltered environment a surface returns, with the light that bounces more than