@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.
- package/CHANGELOG.json +4392 -4250
- package/README.md +1 -1
- package/dist/index.d.ts +12 -4
- package/dist/index.js +12 -2
- package/dist/render/ambientHarmonics.d.ts +46 -0
- package/dist/render/ambientHarmonics.js +80 -0
- package/dist/render/anisotropicLobe.d.ts +10 -0
- package/dist/render/anisotropicLobe.js +19 -0
- package/dist/render/areaLights.d.ts +54 -0
- package/dist/render/areaLights.js +55 -0
- package/dist/render/backend/api.d.ts +43 -2
- package/dist/render/backend/webgl2/instanced.d.ts +2 -0
- package/dist/render/backend/webgl2/instanced.js +11 -2
- package/dist/render/backend/webgl2/renderer.d.ts +120 -11
- package/dist/render/backend/webgl2/renderer.js +356 -53
- package/dist/render/backend/webgl2/sceneCaptureTarget.d.ts +29 -0
- package/dist/render/backend/webgl2/sceneCaptureTarget.js +96 -0
- package/dist/render/backend/webgl2/skinScatter.d.ts +14 -0
- package/dist/render/backend/webgl2/skinScatter.js +88 -26
- package/dist/render/backend/webgpu/buffers.js +2 -1
- package/dist/render/backend/webgpu/clusterBinner.js +3 -2
- package/dist/render/backend/webgpu/flatPass.d.ts +7 -5
- package/dist/render/backend/webgpu/flatPass.js +15 -13
- package/dist/render/backend/webgpu/particlePass.d.ts +37 -4
- package/dist/render/backend/webgpu/particlePass.js +81 -12
- package/dist/render/backend/webgpu/postPass.d.ts +6 -1
- package/dist/render/backend/webgpu/postPass.js +7 -2
- package/dist/render/backend/webgpu/renderer.d.ts +93 -8
- package/dist/render/backend/webgpu/renderer.js +483 -93
- 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/shaders/clusterBin.wgsl.js +41 -1
- package/dist/render/backend/webgpu/skinPaletteRing.d.ts +40 -28
- package/dist/render/backend/webgpu/skinPaletteRing.js +69 -32
- package/dist/render/backend/webgpu/skinScatterPass.d.ts +10 -2
- package/dist/render/backend/webgpu/skinScatterPass.js +59 -9
- package/dist/render/backend/webgpu/surfaceTexturePass.d.ts +5 -1
- package/dist/render/backend/webgpu/surfaceTexturePass.js +45 -5
- package/dist/render/backend/webgpu/waterPass.d.ts +1 -1
- package/dist/render/bloomChain.d.ts +44 -0
- package/dist/render/bloomChain.js +28 -0
- package/dist/render/bloomPass.d.ts +3 -1
- package/dist/render/bloomPass.js +16 -2
- package/dist/render/clusteredLights.d.ts +78 -6
- package/dist/render/clusteredLights.js +214 -13
- 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/fixtureAtlas.js +1 -1
- package/dist/render/gi/bounceLights.d.ts +3 -2
- package/dist/render/gi/bounceLights.js +8 -3
- package/dist/render/instanceCull.js +12 -0
- package/dist/render/instances.d.ts +47 -11
- package/dist/render/instances.js +24 -9
- package/dist/render/lightBudget.d.ts +38 -2
- package/dist/render/lightBudget.js +48 -5
- package/dist/render/lightmap.d.ts +116 -0
- package/dist/render/lightmap.js +140 -0
- package/dist/render/mesh.js +2 -1
- package/dist/render/particleBatch.d.ts +59 -3
- package/dist/render/particleBatch.js +53 -2
- package/dist/render/particleMaterial.d.ts +6 -1
- package/dist/render/particleMaterial.js +10 -2
- package/dist/render/particlePool.d.ts +32 -0
- package/dist/render/particlePool.js +9 -0
- package/dist/render/particleSort.d.ts +34 -0
- package/dist/render/particleSort.js +96 -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/sceneTarget.d.ts +5 -0
- package/dist/render/sceneTarget.js +8 -1
- package/dist/render/screenSpaceReflection.d.ts +27 -1
- package/dist/render/screenSpaceReflection.js +9 -0
- package/dist/render/shaders/bloom.d.ts +8 -4
- package/dist/render/shaders/bloom.js +20 -3
- 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 +10 -0
- package/dist/render/shaders/flat/areaLight.js +142 -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 +46 -6
- 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 +158 -121
- package/dist/render/shaders/flat/models.d.ts +21 -6
- package/dist/render/shaders/flat/models.js +161 -17
- package/dist/render/shaders/flat/normalMap.d.ts +10 -0
- package/dist/render/shaders/flat/normalMap.js +25 -0
- package/dist/render/shaders/flat/preamble.js +84 -40
- package/dist/render/shaders/flat/skin.js +6 -5
- package/dist/render/shaders/generated/bloom.wgsl.d.ts +13 -3
- package/dist/render/shaders/generated/bloom.wgsl.js +13 -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 +1647 -2044
- package/dist/render/shaders/generated/flat.wgsl.js +1685 -2082
- package/dist/render/shaders/generated/particle.wgsl.d.ts +115 -1
- package/dist/render/shaders/generated/particle.wgsl.js +115 -1
- package/dist/render/shaders/generated/skinBlur.wgsl.d.ts +12 -2
- package/dist/render/shaders/generated/skinBlur.wgsl.js +12 -2
- 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/particle.d.ts +17 -1
- package/dist/render/shaders/particle.js +133 -1
- 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/skinBlur.js +25 -3
- 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/skinBlur.d.ts +8 -5
- package/dist/render/skinBlur.js +8 -5
- 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 +49 -8
- package/dist/render/surfaceModel.js +54 -8
- package/dist/render/surfaceTexture.d.ts +38 -1
- package/dist/render/surfaceTexture.js +37 -2
- package/package.json +6 -6
- package/src/index.ts +26 -3
- package/src/render/ambientHarmonics.ts +92 -0
- package/src/render/anisotropicLobe.ts +29 -0
- package/src/render/areaLights.ts +97 -0
- package/src/render/backend/api.ts +61 -1
- package/src/render/backend/webgl2/instanced.ts +12 -2
- package/src/render/backend/webgl2/renderer.ts +470 -59
- package/src/render/backend/webgl2/sceneCaptureTarget.ts +130 -0
- package/src/render/backend/webgl2/skinScatter.ts +120 -43
- package/src/render/backend/webgpu/buffers.ts +2 -1
- package/src/render/backend/webgpu/clusterBinner.ts +3 -1
- package/src/render/backend/webgpu/flatPass.ts +18 -13
- package/src/render/backend/webgpu/particlePass.ts +119 -12
- package/src/render/backend/webgpu/postPass.ts +7 -2
- package/src/render/backend/webgpu/renderer.ts +589 -113
- package/src/render/backend/webgpu/sceneCaptureTarget.ts +63 -0
- package/src/render/backend/webgpu/shaders/clusterBin.wgsl.ts +41 -1
- package/src/render/backend/webgpu/skinPaletteRing.ts +65 -33
- package/src/render/backend/webgpu/skinScatterPass.ts +59 -9
- package/src/render/backend/webgpu/surfaceTexturePass.ts +57 -6
- package/src/render/bloomChain.ts +69 -0
- package/src/render/bloomPass.ts +26 -2
- package/src/render/clusteredLights.ts +259 -12
- package/src/render/driftLight/bake.ts +3 -1
- package/src/render/driftLight/falloff.ts +13 -2
- package/src/render/fixtureAtlas.ts +1 -1
- package/src/render/gi/bounceLights.ts +12 -3
- package/src/render/instanceCull.ts +9 -0
- package/src/render/instances.ts +61 -12
- package/src/render/lightBudget.ts +88 -4
- package/src/render/lightmap.ts +243 -0
- package/src/render/mesh.ts +2 -1
- package/src/render/particleBatch.ts +95 -4
- package/src/render/particleMaterial.ts +11 -1
- package/src/render/particlePool.ts +36 -0
- package/src/render/particleSort.ts +133 -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/sceneTarget.ts +18 -1
- package/src/render/screenSpaceReflection.ts +33 -1
- package/src/render/shaders/bloom.ts +20 -3
- 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 +142 -0
- package/src/render/shaders/flat/glassTint.ts +9 -2
- package/src/render/shaders/flat/index.ts +51 -6
- package/src/render/shaders/flat/lobes.ts +50 -43
- package/src/render/shaders/flat/main.ts +158 -121
- package/src/render/shaders/flat/models.ts +170 -21
- package/src/render/shaders/flat/normalMap.ts +25 -0
- package/src/render/shaders/flat/preamble.ts +84 -40
- package/src/render/shaders/flat/skin.ts +6 -5
- package/src/render/shaders/generated/bloom.wgsl.ts +13 -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 +1685 -2082
- package/src/render/shaders/generated/particle.wgsl.ts +116 -1
- package/src/render/shaders/generated/skinBlur.wgsl.ts +12 -2
- 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/particle.ts +134 -1
- package/src/render/shaders/recon/motion.wgsl.ts +13 -2
- package/src/render/shaders/skinBlur.ts +25 -3
- package/src/render/shaders/ssrTrace.ts +20 -1
- package/src/render/shaders/water.ts +12 -3
- package/src/render/skinBlur.ts +8 -5
- package/src/render/skinScatter.ts +3 -1
- package/src/render/ssrPass.ts +1 -0
- package/src/render/surfaceModel.ts +82 -10
- 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
|
-
|
|
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 (
|
|
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);
|