@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
@@ -21,6 +21,10 @@ import { uploadCompressedArray } from './glCompressed.ts';
21
21
  import { SURFACE_EFFECT_TEXELS, packSurfaceEffects } from './surfaceEffects.ts';
22
22
  import type { SurfaceLayerEffect } from './surfaceEffects.ts';
23
23
  import type { CutoutMode } from './cutoutDither.ts';
24
+ import { isLightmapTexels } from './lightmap.ts';
25
+ import type { LightmapTexels } from './lightmap.ts';
26
+ import { isSceneCaptureTexels } from './sceneCapture.ts';
27
+ import type { SceneCaptureTexels } from './sceneCapture.ts';
24
28
 
25
29
  /**
26
30
  * How a texture behaves past its edges and between its texels.
@@ -110,6 +114,18 @@ export interface SurfaceMaterial<Texture = SurfaceTexture> {
110
114
  * without culling, and a back face is lit as its front, with the normal turned to the viewer.
111
115
  */
112
116
  doubleSided?: boolean;
117
+ /**
118
+ * The lighting channels this surface takes light from, a mask: 1, 2, 3 … 255. **1 by default**,
119
+ * which is every light's default too, so a scene that names no channel is lit as it always was.
120
+ *
121
+ * A point or spot light shades this surface only where its `PointLightSet.lightChannels` and this
122
+ * share a bit — Unreal's lighting channels. A character's own key and rim lights on channel 2,
123
+ * and the character's materials on 3, light the character and leave the floor around it as the
124
+ * stage's lights alone have it. **What it does not reach**: the sun, the sky and the probes, area
125
+ * lights, DriftLight's volume and the GPU-driven pipeline light every surface whatever its mask.
126
+ * A number that is not a whole mask from 1 to 255 is channel 1.
127
+ */
128
+ lightChannels?: number;
113
129
  /**
114
130
  * How hard the normal map turns the shading normal.
115
131
  *
@@ -158,6 +174,24 @@ export interface SurfaceMaterial<Texture = SurfaceTexture> {
158
174
  * that is not a colour.
159
175
  */
160
176
  modelMap?: Texture | null;
177
+ /**
178
+ * Whether a lamp's and the sun's highlight on this surface is GGX's own, `π · D · Vis · F · N·L`,
179
+ * as Unreal and this engine's skin and eye shade it, rather than the engine's lobe scaled to a
180
+ * peak of one. **False by default**, every surface as it was.
181
+ *
182
+ * The peak-normalised lobe is a look control: the specular attribute says how strong a highlight
183
+ * is and roughness how wide, apart. Physical, they are entangled as they are in a real surface —
184
+ * the peak is `1 / (4 α²)` of the light head-on, so a polished surface's highlight is many times
185
+ * the look's and a rough one's lower and broader — and the specular attribute is read as the
186
+ * reflectance at normal incidence, F0: Unreal's `0.08 × Specular`, 0.04 at its default. Fresnel
187
+ * then brightens every surface toward grazing, not only a metal. A rectangle's highlight is the
188
+ * lobe integrated over it with the attribute as F0 already, so it is unchanged either way.
189
+ *
190
+ * On the standard, lightmap and anisotropic models. Skin and the eye are physical already; hair
191
+ * keeps its own three lobes. **What it gives up**: the look's independence of strength and width,
192
+ * and an 8-bit frame clips the brighter peak without `hdrScene`.
193
+ */
194
+ physicalSpecular?: boolean;
161
195
  }
162
196
 
163
197
  export interface SurfaceTextureOptions {
@@ -267,11 +301,17 @@ export class SurfaceTexture {
267
301
  */
268
302
  constructor(
269
303
  gl: WebGL2RenderingContext,
270
- source: SurfaceSource | readonly SurfaceSource[],
304
+ source: SurfaceSource | readonly SurfaceSource[] | LightmapTexels | SceneCaptureTexels,
271
305
  options: SurfaceTextureOptions = {},
272
306
  compressed: readonly CompressedTextureFormat[] = [],
273
307
  ) {
274
- const listed = (Array.isArray(source) ? source : [source]) as readonly SurfaceSource[];
308
+ /* A scene capture's target: one empty layer the renderer draws into. See `sceneCapture.ts`. */
309
+ const capture = isSceneCaptureTexels(source) ? source : null;
310
+ /* A lightmap's page: two layers of bytes, uploaded as they are. See `lightmap.ts`. */
311
+ const baked = isLightmapTexels(source) ? source : null;
312
+ const listed = (
313
+ baked !== null || capture !== null ? [] : Array.isArray(source) ? source : [source]
314
+ ) as readonly SurfaceSource[];
275
315
  const blocks = compressedLayers(listed);
276
316
  this.srgb = (options.colorSpace ?? 'linear') === 'srgb';
277
317
  /* Refused before anything is allocated, so a refusal leaves no texture behind. */
@@ -282,7 +322,57 @@ export class SurfaceTexture {
282
322
  const wrap = (options.wrap ?? 'repeat') === 'repeat' ? gl.REPEAT : gl.CLAMP_TO_EDGE;
283
323
  gl.bindTexture(gl.TEXTURE_2D_ARRAY, texture);
284
324
 
285
- if (blocks !== null && plan !== null) {
325
+ if (capture !== null) {
326
+ /* Immutable storage, one level: a framebuffer attachment, and radiance read linear. */
327
+ this.layers = 1;
328
+ this.blockFormat = null;
329
+ this.mipmapped = false;
330
+ gl.texStorage3D(
331
+ gl.TEXTURE_2D_ARRAY,
332
+ 1,
333
+ capture.float ? gl.RGBA16F : gl.RGBA8,
334
+ capture.width,
335
+ capture.height,
336
+ 1,
337
+ );
338
+ } else if (baked !== null) {
339
+ /* No chain: a page is read at its own resolution, and a level of it would blend regions. */
340
+ this.layers = baked.layers.length;
341
+ this.blockFormat = null;
342
+ this.mipmapped = false;
343
+ /* A typed array refuses either flag set, so both are put down here rather than assumed. */
344
+ gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, false);
345
+ gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, false);
346
+ /* Bytes, and read by `texelFetch` alone: the shader decodes and filters. See `lightmap.ts`. */
347
+ gl.texImage3D(
348
+ gl.TEXTURE_2D_ARRAY,
349
+ 0,
350
+ gl.RGBA8,
351
+ baked.width,
352
+ baked.height,
353
+ this.layers,
354
+ 0,
355
+ gl.RGBA,
356
+ gl.UNSIGNED_BYTE,
357
+ null,
358
+ );
359
+ /* A layer at a time, so a page's arrays are uploaded where they lie rather than joined. */
360
+ for (let layer = 0; layer < this.layers; layer++) {
361
+ gl.texSubImage3D(
362
+ gl.TEXTURE_2D_ARRAY,
363
+ 0,
364
+ 0,
365
+ 0,
366
+ layer,
367
+ baked.width,
368
+ baked.height,
369
+ 1,
370
+ gl.RGBA,
371
+ gl.UNSIGNED_BYTE,
372
+ baked.layers[layer] as Uint8Array,
373
+ );
374
+ }
375
+ } else if (blocks !== null && plan !== null) {
286
376
  /* The stored chain, or level 0 alone where no chain was asked for. Nothing is generated:
287
377
  `generateMipmap` cannot write a compressed format. */
288
378
  this.layers = blocks.length;
@@ -390,6 +480,14 @@ export class SurfaceTexture {
390
480
  gl.bindTexture(gl.TEXTURE_2D_ARRAY, null);
391
481
  }
392
482
 
483
+ /**
484
+ * Attach the only layer as the bound framebuffer's colour: a scene capture's target, drawn into
485
+ * by `captureScene`. Engine-internal, as `bind` is.
486
+ */
487
+ attachColor(gl: WebGL2RenderingContext): void {
488
+ gl.framebufferTextureLayer(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, this.texture, 0, 0);
489
+ }
490
+
393
491
  /** Bind to a unit for sampling. Engine-internal: the renderer owns unit assignment. */
394
492
  bind(gl: WebGL2RenderingContext, unit: number): void {
395
493
  gl.activeTexture(gl.TEXTURE0 + unit);