@driftengine/core 4.8.6 → 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 (139) hide show
  1. package/CHANGELOG.json +71 -0
  2. package/README.md +1 -1
  3. package/dist/index.d.ts +2 -2
  4. package/dist/index.js +1 -1
  5. package/dist/render/anisotropicLobe.d.ts +10 -0
  6. package/dist/render/anisotropicLobe.js +19 -0
  7. package/dist/render/areaLights.d.ts +35 -0
  8. package/dist/render/areaLights.js +35 -0
  9. package/dist/render/backend/api.d.ts +33 -3
  10. package/dist/render/backend/webgl2/renderer.d.ts +50 -14
  11. package/dist/render/backend/webgl2/renderer.js +141 -30
  12. package/dist/render/backend/webgl2/sceneCaptureTarget.d.ts +29 -0
  13. package/dist/render/backend/webgl2/sceneCaptureTarget.js +96 -0
  14. package/dist/render/backend/webgpu/particlePass.js +2 -1
  15. package/dist/render/backend/webgpu/renderer.d.ts +35 -1
  16. package/dist/render/backend/webgpu/renderer.js +155 -16
  17. package/dist/render/backend/webgpu/sceneCaptureTarget.d.ts +24 -0
  18. package/dist/render/backend/webgpu/sceneCaptureTarget.js +59 -0
  19. package/dist/render/backend/webgpu/shaders/clusterBin.wgsl.d.ts +1 -1
  20. package/dist/render/backend/webgpu/surfaceTexturePass.d.ts +4 -1
  21. package/dist/render/backend/webgpu/surfaceTexturePass.js +34 -8
  22. package/dist/render/backend/webgpu/waterPass.d.ts +1 -1
  23. package/dist/render/clusteredLights.d.ts +23 -5
  24. package/dist/render/clusteredLights.js +35 -8
  25. package/dist/render/driftLight/bake.d.ts +2 -0
  26. package/dist/render/driftLight/bake.js +1 -1
  27. package/dist/render/driftLight/falloff.d.ts +4 -2
  28. package/dist/render/driftLight/falloff.js +8 -2
  29. package/dist/render/gi/bounceLights.d.ts +3 -2
  30. package/dist/render/gi/bounceLights.js +8 -3
  31. package/dist/render/instanceCull.js +5 -0
  32. package/dist/render/instances.d.ts +19 -5
  33. package/dist/render/instances.js +9 -3
  34. package/dist/render/lightBudget.d.ts +12 -1
  35. package/dist/render/lightBudget.js +23 -3
  36. package/dist/render/lightmap.d.ts +23 -9
  37. package/dist/render/lightmap.js +40 -18
  38. package/dist/render/particlePool.d.ts +21 -0
  39. package/dist/render/particlePool.js +7 -0
  40. package/dist/render/pointLightSelection.d.ts +13 -0
  41. package/dist/render/pointLightSelection.js +3 -1
  42. package/dist/render/renderQuality.d.ts +8 -7
  43. package/dist/render/rendererHarness.js +3 -0
  44. package/dist/render/rgb9e5.d.ts +22 -0
  45. package/dist/render/rgb9e5.js +47 -0
  46. package/dist/render/sceneCapture.d.ts +29 -0
  47. package/dist/render/sceneCapture.js +36 -0
  48. package/dist/render/screenSpaceReflection.d.ts +27 -1
  49. package/dist/render/screenSpaceReflection.js +9 -0
  50. package/dist/render/shaders/bolt.d.ts +1 -1
  51. package/dist/render/shaders/bolt.js +7 -1
  52. package/dist/render/shaders/depth.js +11 -0
  53. package/dist/render/shaders/flat/anisotropic.d.ts +1 -1
  54. package/dist/render/shaders/flat/anisotropic.js +37 -3
  55. package/dist/render/shaders/flat/areaLight.d.ts +1 -1
  56. package/dist/render/shaders/flat/areaLight.js +46 -0
  57. package/dist/render/shaders/flat/glassTint.d.ts +3 -2
  58. package/dist/render/shaders/flat/glassTint.js +3 -1
  59. package/dist/render/shaders/flat/index.d.ts +5 -0
  60. package/dist/render/shaders/flat/index.js +16 -2
  61. package/dist/render/shaders/flat/lobes.d.ts +6 -0
  62. package/dist/render/shaders/flat/lobes.js +49 -43
  63. package/dist/render/shaders/flat/main.d.ts +1 -1
  64. package/dist/render/shaders/flat/main.js +57 -22
  65. package/dist/render/shaders/flat/models.d.ts +5 -2
  66. package/dist/render/shaders/flat/models.js +100 -16
  67. package/dist/render/shaders/flat/preamble.js +10 -3
  68. package/dist/render/shaders/generated/bolt.wgsl.d.ts +1 -1
  69. package/dist/render/shaders/generated/bolt.wgsl.js +1 -1
  70. package/dist/render/shaders/generated/depth.wgsl.d.ts +4 -4
  71. package/dist/render/shaders/generated/depth.wgsl.js +4 -4
  72. package/dist/render/shaders/generated/flat.wgsl.d.ts +16 -0
  73. package/dist/render/shaders/generated/flat.wgsl.js +54 -38
  74. package/dist/render/shaders/generated/ssrTrace.wgsl.d.ts +11 -6
  75. package/dist/render/shaders/generated/ssrTrace.wgsl.js +11 -6
  76. package/dist/render/shaders/generated/water.wgsl.d.ts +23 -16
  77. package/dist/render/shaders/generated/water.wgsl.js +23 -16
  78. package/dist/render/shaders/gi/probeBake.wgsl.js +9 -5
  79. package/dist/render/shaders/recon/motion.wgsl.d.ts +1 -1
  80. package/dist/render/shaders/recon/motion.wgsl.js +13 -2
  81. package/dist/render/shaders/ssrTrace.js +20 -1
  82. package/dist/render/shaders/water.d.ts +1 -1
  83. package/dist/render/shaders/water.js +12 -3
  84. package/dist/render/skinScatter.d.ts +3 -1
  85. package/dist/render/skinScatter.js +3 -1
  86. package/dist/render/ssrPass.js +1 -0
  87. package/dist/render/surfaceModel.d.ts +29 -8
  88. package/dist/render/surfaceModel.js +33 -9
  89. package/dist/render/surfaceTexture.d.ts +25 -1
  90. package/dist/render/surfaceTexture.js +27 -5
  91. package/package.json +6 -6
  92. package/src/index.ts +6 -2
  93. package/src/render/anisotropicLobe.ts +29 -0
  94. package/src/render/areaLights.ts +58 -0
  95. package/src/render/backend/api.ts +49 -2
  96. package/src/render/backend/webgl2/renderer.ts +192 -38
  97. package/src/render/backend/webgl2/sceneCaptureTarget.ts +130 -0
  98. package/src/render/backend/webgpu/particlePass.ts +2 -1
  99. package/src/render/backend/webgpu/renderer.ts +194 -19
  100. package/src/render/backend/webgpu/sceneCaptureTarget.ts +63 -0
  101. package/src/render/backend/webgpu/surfaceTexturePass.ts +44 -14
  102. package/src/render/clusteredLights.ts +41 -8
  103. package/src/render/driftLight/bake.ts +3 -1
  104. package/src/render/driftLight/falloff.ts +13 -2
  105. package/src/render/gi/bounceLights.ts +12 -3
  106. package/src/render/instanceCull.ts +4 -0
  107. package/src/render/instances.ts +26 -6
  108. package/src/render/lightBudget.ts +40 -2
  109. package/src/render/lightmap.ts +64 -23
  110. package/src/render/particlePool.ts +23 -0
  111. package/src/render/pointLightSelection.ts +20 -1
  112. package/src/render/renderQuality.ts +8 -7
  113. package/src/render/rendererHarness.ts +3 -0
  114. package/src/render/rgb9e5.ts +52 -0
  115. package/src/render/sceneCapture.ts +56 -0
  116. package/src/render/screenSpaceReflection.ts +33 -1
  117. package/src/render/shaders/bolt.ts +7 -1
  118. package/src/render/shaders/depth.ts +11 -0
  119. package/src/render/shaders/flat/anisotropic.ts +37 -3
  120. package/src/render/shaders/flat/areaLight.ts +46 -0
  121. package/src/render/shaders/flat/glassTint.ts +9 -2
  122. package/src/render/shaders/flat/index.ts +21 -2
  123. package/src/render/shaders/flat/lobes.ts +50 -43
  124. package/src/render/shaders/flat/main.ts +57 -22
  125. package/src/render/shaders/flat/models.ts +100 -16
  126. package/src/render/shaders/flat/preamble.ts +10 -3
  127. package/src/render/shaders/generated/bolt.wgsl.ts +1 -1
  128. package/src/render/shaders/generated/depth.wgsl.ts +4 -4
  129. package/src/render/shaders/generated/flat.wgsl.ts +54 -38
  130. package/src/render/shaders/generated/ssrTrace.wgsl.ts +11 -6
  131. package/src/render/shaders/generated/water.wgsl.ts +23 -16
  132. package/src/render/shaders/gi/probeBake.wgsl.ts +9 -5
  133. package/src/render/shaders/recon/motion.wgsl.ts +13 -2
  134. package/src/render/shaders/ssrTrace.ts +20 -1
  135. package/src/render/shaders/water.ts +12 -3
  136. package/src/render/skinScatter.ts +3 -1
  137. package/src/render/ssrPass.ts +1 -0
  138. package/src/render/surfaceModel.ts +47 -10
  139. package/src/render/surfaceTexture.ts +69 -9
@@ -23,6 +23,8 @@ import type { SurfaceLayerEffect } from './surfaceEffects.ts';
23
23
  import type { CutoutMode } from './cutoutDither.ts';
24
24
  import { isLightmapTexels } from './lightmap.ts';
25
25
  import type { LightmapTexels } from './lightmap.ts';
26
+ import { isSceneCaptureTexels } from './sceneCapture.ts';
27
+ import type { SceneCaptureTexels } from './sceneCapture.ts';
26
28
 
27
29
  /**
28
30
  * How a texture behaves past its edges and between its texels.
@@ -172,6 +174,24 @@ export interface SurfaceMaterial<Texture = SurfaceTexture> {
172
174
  * that is not a colour.
173
175
  */
174
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;
175
195
  }
176
196
 
177
197
  export interface SurfaceTextureOptions {
@@ -281,14 +301,16 @@ export class SurfaceTexture {
281
301
  */
282
302
  constructor(
283
303
  gl: WebGL2RenderingContext,
284
- source: SurfaceSource | readonly SurfaceSource[] | LightmapTexels,
304
+ source: SurfaceSource | readonly SurfaceSource[] | LightmapTexels | SceneCaptureTexels,
285
305
  options: SurfaceTextureOptions = {},
286
306
  compressed: readonly CompressedTextureFormat[] = [],
287
307
  ) {
288
- /* A lightmap's page: half floats, uploaded as they are. See `lightmap.ts`. */
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`. */
289
311
  const baked = isLightmapTexels(source) ? source : null;
290
312
  const listed = (
291
- baked !== null ? [] : Array.isArray(source) ? source : [source]
313
+ baked !== null || capture !== null ? [] : Array.isArray(source) ? source : [source]
292
314
  ) as readonly SurfaceSource[];
293
315
  const blocks = compressedLayers(listed);
294
316
  this.srgb = (options.colorSpace ?? 'linear') === 'srgb';
@@ -300,26 +322,56 @@ export class SurfaceTexture {
300
322
  const wrap = (options.wrap ?? 'repeat') === 'repeat' ? gl.REPEAT : gl.CLAMP_TO_EDGE;
301
323
  gl.bindTexture(gl.TEXTURE_2D_ARRAY, texture);
302
324
 
303
- if (baked !== 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) {
304
339
  /* No chain: a page is read at its own resolution, and a level of it would blend regions. */
305
- this.layers = baked.layers;
340
+ this.layers = baked.layers.length;
306
341
  this.blockFormat = null;
307
342
  this.mipmapped = false;
308
343
  /* A typed array refuses either flag set, so both are put down here rather than assumed. */
309
344
  gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, false);
310
345
  gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, false);
346
+ /* Bytes, and read by `texelFetch` alone: the shader decodes and filters. See `lightmap.ts`. */
311
347
  gl.texImage3D(
312
348
  gl.TEXTURE_2D_ARRAY,
313
349
  0,
314
- gl.RGBA16F,
350
+ gl.RGBA8,
315
351
  baked.width,
316
352
  baked.height,
317
- baked.layers,
353
+ this.layers,
318
354
  0,
319
355
  gl.RGBA,
320
- gl.HALF_FLOAT,
321
- baked.texels,
356
+ gl.UNSIGNED_BYTE,
357
+ null,
322
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
+ }
323
375
  } else if (blocks !== null && plan !== null) {
324
376
  /* The stored chain, or level 0 alone where no chain was asked for. Nothing is generated:
325
377
  `generateMipmap` cannot write a compressed format. */
@@ -428,6 +480,14 @@ export class SurfaceTexture {
428
480
  gl.bindTexture(gl.TEXTURE_2D_ARRAY, null);
429
481
  }
430
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
+
431
491
  /** Bind to a unit for sampling. Engine-internal: the renderer owns unit assignment. */
432
492
  bind(gl: WebGL2RenderingContext, unit: number): void {
433
493
  gl.activeTexture(gl.TEXTURE0 + unit);