@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.
- package/CHANGELOG.json +71 -0
- package/README.md +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.js +1 -1
- package/dist/render/anisotropicLobe.d.ts +10 -0
- package/dist/render/anisotropicLobe.js +19 -0
- package/dist/render/areaLights.d.ts +35 -0
- package/dist/render/areaLights.js +35 -0
- package/dist/render/backend/api.d.ts +33 -3
- package/dist/render/backend/webgl2/renderer.d.ts +50 -14
- package/dist/render/backend/webgl2/renderer.js +141 -30
- package/dist/render/backend/webgl2/sceneCaptureTarget.d.ts +29 -0
- package/dist/render/backend/webgl2/sceneCaptureTarget.js +96 -0
- package/dist/render/backend/webgpu/particlePass.js +2 -1
- package/dist/render/backend/webgpu/renderer.d.ts +35 -1
- package/dist/render/backend/webgpu/renderer.js +155 -16
- package/dist/render/backend/webgpu/sceneCaptureTarget.d.ts +24 -0
- package/dist/render/backend/webgpu/sceneCaptureTarget.js +59 -0
- package/dist/render/backend/webgpu/shaders/clusterBin.wgsl.d.ts +1 -1
- package/dist/render/backend/webgpu/surfaceTexturePass.d.ts +4 -1
- package/dist/render/backend/webgpu/surfaceTexturePass.js +34 -8
- package/dist/render/backend/webgpu/waterPass.d.ts +1 -1
- package/dist/render/clusteredLights.d.ts +23 -5
- package/dist/render/clusteredLights.js +35 -8
- package/dist/render/driftLight/bake.d.ts +2 -0
- package/dist/render/driftLight/bake.js +1 -1
- package/dist/render/driftLight/falloff.d.ts +4 -2
- package/dist/render/driftLight/falloff.js +8 -2
- package/dist/render/gi/bounceLights.d.ts +3 -2
- package/dist/render/gi/bounceLights.js +8 -3
- package/dist/render/instanceCull.js +5 -0
- package/dist/render/instances.d.ts +19 -5
- package/dist/render/instances.js +9 -3
- package/dist/render/lightBudget.d.ts +12 -1
- package/dist/render/lightBudget.js +23 -3
- package/dist/render/lightmap.d.ts +23 -9
- package/dist/render/lightmap.js +40 -18
- package/dist/render/particlePool.d.ts +21 -0
- package/dist/render/particlePool.js +7 -0
- package/dist/render/pointLightSelection.d.ts +13 -0
- package/dist/render/pointLightSelection.js +3 -1
- package/dist/render/renderQuality.d.ts +8 -7
- package/dist/render/rendererHarness.js +3 -0
- package/dist/render/rgb9e5.d.ts +22 -0
- package/dist/render/rgb9e5.js +47 -0
- package/dist/render/sceneCapture.d.ts +29 -0
- package/dist/render/sceneCapture.js +36 -0
- package/dist/render/screenSpaceReflection.d.ts +27 -1
- package/dist/render/screenSpaceReflection.js +9 -0
- package/dist/render/shaders/bolt.d.ts +1 -1
- package/dist/render/shaders/bolt.js +7 -1
- package/dist/render/shaders/depth.js +11 -0
- package/dist/render/shaders/flat/anisotropic.d.ts +1 -1
- package/dist/render/shaders/flat/anisotropic.js +37 -3
- package/dist/render/shaders/flat/areaLight.d.ts +1 -1
- package/dist/render/shaders/flat/areaLight.js +46 -0
- package/dist/render/shaders/flat/glassTint.d.ts +3 -2
- package/dist/render/shaders/flat/glassTint.js +3 -1
- package/dist/render/shaders/flat/index.d.ts +5 -0
- package/dist/render/shaders/flat/index.js +16 -2
- package/dist/render/shaders/flat/lobes.d.ts +6 -0
- package/dist/render/shaders/flat/lobes.js +49 -43
- package/dist/render/shaders/flat/main.d.ts +1 -1
- package/dist/render/shaders/flat/main.js +57 -22
- package/dist/render/shaders/flat/models.d.ts +5 -2
- package/dist/render/shaders/flat/models.js +100 -16
- package/dist/render/shaders/flat/preamble.js +10 -3
- package/dist/render/shaders/generated/bolt.wgsl.d.ts +1 -1
- package/dist/render/shaders/generated/bolt.wgsl.js +1 -1
- package/dist/render/shaders/generated/depth.wgsl.d.ts +4 -4
- package/dist/render/shaders/generated/depth.wgsl.js +4 -4
- package/dist/render/shaders/generated/flat.wgsl.d.ts +16 -0
- package/dist/render/shaders/generated/flat.wgsl.js +54 -38
- package/dist/render/shaders/generated/ssrTrace.wgsl.d.ts +11 -6
- package/dist/render/shaders/generated/ssrTrace.wgsl.js +11 -6
- package/dist/render/shaders/generated/water.wgsl.d.ts +23 -16
- package/dist/render/shaders/generated/water.wgsl.js +23 -16
- package/dist/render/shaders/gi/probeBake.wgsl.js +9 -5
- package/dist/render/shaders/recon/motion.wgsl.d.ts +1 -1
- package/dist/render/shaders/recon/motion.wgsl.js +13 -2
- package/dist/render/shaders/ssrTrace.js +20 -1
- package/dist/render/shaders/water.d.ts +1 -1
- package/dist/render/shaders/water.js +12 -3
- package/dist/render/skinScatter.d.ts +3 -1
- package/dist/render/skinScatter.js +3 -1
- package/dist/render/ssrPass.js +1 -0
- package/dist/render/surfaceModel.d.ts +29 -8
- package/dist/render/surfaceModel.js +33 -9
- package/dist/render/surfaceTexture.d.ts +25 -1
- package/dist/render/surfaceTexture.js +27 -5
- package/package.json +6 -6
- package/src/index.ts +6 -2
- package/src/render/anisotropicLobe.ts +29 -0
- package/src/render/areaLights.ts +58 -0
- package/src/render/backend/api.ts +49 -2
- package/src/render/backend/webgl2/renderer.ts +192 -38
- package/src/render/backend/webgl2/sceneCaptureTarget.ts +130 -0
- package/src/render/backend/webgpu/particlePass.ts +2 -1
- package/src/render/backend/webgpu/renderer.ts +194 -19
- package/src/render/backend/webgpu/sceneCaptureTarget.ts +63 -0
- package/src/render/backend/webgpu/surfaceTexturePass.ts +44 -14
- package/src/render/clusteredLights.ts +41 -8
- package/src/render/driftLight/bake.ts +3 -1
- package/src/render/driftLight/falloff.ts +13 -2
- package/src/render/gi/bounceLights.ts +12 -3
- package/src/render/instanceCull.ts +4 -0
- package/src/render/instances.ts +26 -6
- package/src/render/lightBudget.ts +40 -2
- package/src/render/lightmap.ts +64 -23
- package/src/render/particlePool.ts +23 -0
- package/src/render/pointLightSelection.ts +20 -1
- package/src/render/renderQuality.ts +8 -7
- package/src/render/rendererHarness.ts +3 -0
- package/src/render/rgb9e5.ts +52 -0
- package/src/render/sceneCapture.ts +56 -0
- package/src/render/screenSpaceReflection.ts +33 -1
- package/src/render/shaders/bolt.ts +7 -1
- package/src/render/shaders/depth.ts +11 -0
- package/src/render/shaders/flat/anisotropic.ts +37 -3
- package/src/render/shaders/flat/areaLight.ts +46 -0
- package/src/render/shaders/flat/glassTint.ts +9 -2
- package/src/render/shaders/flat/index.ts +21 -2
- package/src/render/shaders/flat/lobes.ts +50 -43
- package/src/render/shaders/flat/main.ts +57 -22
- package/src/render/shaders/flat/models.ts +100 -16
- package/src/render/shaders/flat/preamble.ts +10 -3
- package/src/render/shaders/generated/bolt.wgsl.ts +1 -1
- package/src/render/shaders/generated/depth.wgsl.ts +4 -4
- package/src/render/shaders/generated/flat.wgsl.ts +54 -38
- package/src/render/shaders/generated/ssrTrace.wgsl.ts +11 -6
- package/src/render/shaders/generated/water.wgsl.ts +23 -16
- package/src/render/shaders/gi/probeBake.wgsl.ts +9 -5
- package/src/render/shaders/recon/motion.wgsl.ts +13 -2
- package/src/render/shaders/ssrTrace.ts +20 -1
- package/src/render/shaders/water.ts +12 -3
- package/src/render/skinScatter.ts +3 -1
- package/src/render/ssrPass.ts +1 -0
- package/src/render/surfaceModel.ts +47 -10
- 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
|
|
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 (
|
|
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.
|
|
350
|
+
gl.RGBA8,
|
|
315
351
|
baked.width,
|
|
316
352
|
baked.height,
|
|
317
|
-
|
|
353
|
+
this.layers,
|
|
318
354
|
0,
|
|
319
355
|
gl.RGBA,
|
|
320
|
-
gl.
|
|
321
|
-
|
|
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);
|