@driftengine/core 4.8.7 → 4.9.0

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 (163) hide show
  1. package/CHANGELOG.json +61 -0
  2. package/README.md +1 -1
  3. package/dist/index.d.ts +5 -0
  4. package/dist/index.js +7 -0
  5. package/dist/render/atmosphere.d.ts +13 -0
  6. package/dist/render/atmosphere.js +9 -1
  7. package/dist/render/backend/api.d.ts +9 -1
  8. package/dist/render/backend/createRenderer.d.ts +6 -0
  9. package/dist/render/backend/createRenderer.js +4 -1
  10. package/dist/render/backend/webgl2/renderer.d.ts +90 -2
  11. package/dist/render/backend/webgl2/renderer.js +297 -16
  12. package/dist/render/backend/webgpu/device.d.ts +7 -1
  13. package/dist/render/backend/webgpu/device.js +31 -3
  14. package/dist/render/backend/webgpu/flatPass.d.ts +16 -1
  15. package/dist/render/backend/webgpu/flatPass.js +58 -26
  16. package/dist/render/backend/webgpu/postPass.d.ts +51 -9
  17. package/dist/render/backend/webgpu/postPass.js +16 -2
  18. package/dist/render/backend/webgpu/reflectionSurfacePass.d.ts +30 -0
  19. package/dist/render/backend/webgpu/reflectionSurfacePass.js +100 -0
  20. package/dist/render/backend/webgpu/renderer.d.ts +131 -2
  21. package/dist/render/backend/webgpu/renderer.js +586 -70
  22. package/dist/render/displayRange.d.ts +31 -0
  23. package/dist/render/displayRange.js +47 -0
  24. package/dist/render/filmicCurve.d.ts +74 -0
  25. package/dist/render/filmicCurve.js +203 -0
  26. package/dist/render/fog.d.ts +4 -1
  27. package/dist/render/fog.js +12 -2
  28. package/dist/render/frame/resources.d.ts +2 -2
  29. package/dist/render/frame/resources.js +6 -0
  30. package/dist/render/frameReflections.d.ts +40 -0
  31. package/dist/render/frameReflections.js +48 -0
  32. package/dist/render/pass.d.ts +49 -0
  33. package/dist/render/reflectionSurfaceTargets.d.ts +28 -0
  34. package/dist/render/reflectionSurfaceTargets.js +99 -0
  35. package/dist/render/renderQuality.d.ts +39 -8
  36. package/dist/render/renderQuality.js +4 -0
  37. package/dist/render/sceneTarget.d.ts +5 -0
  38. package/dist/render/sceneTarget.js +24 -1
  39. package/dist/render/screenSpaceReflection.d.ts +5 -0
  40. package/dist/render/screenSpaceReflection.js +5 -0
  41. package/dist/render/shaders/arcane.d.ts +1 -1
  42. package/dist/render/shaders/bolt.d.ts +1 -1
  43. package/dist/render/shaders/caustics.d.ts +1 -1
  44. package/dist/render/shaders/film.d.ts +1 -1
  45. package/dist/render/shaders/filmLook.js +2 -1
  46. package/dist/render/shaders/fire.d.ts +1 -1
  47. package/dist/render/shaders/flat/glassTint.d.ts +1 -1
  48. package/dist/render/shaders/flat/glassTint.js +2 -0
  49. package/dist/render/shaders/flat/index.d.ts +10 -0
  50. package/dist/render/shaders/flat/index.js +6 -0
  51. package/dist/render/shaders/flat/main.d.ts +1 -1
  52. package/dist/render/shaders/flat/main.js +28 -0
  53. package/dist/render/shaders/flat/overlay.d.ts +16 -0
  54. package/dist/render/shaders/flat/overlay.js +117 -0
  55. package/dist/render/shaders/flat/pointShadow.js +1 -1
  56. package/dist/render/shaders/flat/reflectionSurface.d.ts +21 -0
  57. package/dist/render/shaders/flat/reflectionSurface.js +61 -0
  58. package/dist/render/shaders/fog.d.ts +1 -1
  59. package/dist/render/shaders/fog.js +9 -2
  60. package/dist/render/shaders/fringe.d.ts +29 -0
  61. package/dist/render/shaders/fringe.js +55 -0
  62. package/dist/render/shaders/generated/arcane.wgsl.d.ts +1 -1
  63. package/dist/render/shaders/generated/arcane.wgsl.js +1 -1
  64. package/dist/render/shaders/generated/bolt.wgsl.d.ts +1 -1
  65. package/dist/render/shaders/generated/bolt.wgsl.js +1 -1
  66. package/dist/render/shaders/generated/caustics.wgsl.d.ts +1 -1
  67. package/dist/render/shaders/generated/caustics.wgsl.js +1 -1
  68. package/dist/render/shaders/generated/film.wgsl.d.ts +1 -1
  69. package/dist/render/shaders/generated/film.wgsl.js +1 -1
  70. package/dist/render/shaders/generated/fire.wgsl.d.ts +1 -1
  71. package/dist/render/shaders/generated/fire.wgsl.js +1 -1
  72. package/dist/render/shaders/generated/flat.wgsl.d.ts +176 -16
  73. package/dist/render/shaders/generated/flat.wgsl.js +214 -54
  74. package/dist/render/shaders/generated/line.wgsl.d.ts +1 -1
  75. package/dist/render/shaders/generated/line.wgsl.js +1 -1
  76. package/dist/render/shaders/generated/particle.wgsl.d.ts +4 -4
  77. package/dist/render/shaders/generated/particle.wgsl.js +4 -4
  78. package/dist/render/shaders/generated/rush.wgsl.d.ts +56 -26
  79. package/dist/render/shaders/generated/rush.wgsl.js +56 -26
  80. package/dist/render/shaders/generated/scatter.wgsl.d.ts +1 -1
  81. package/dist/render/shaders/generated/scatter.wgsl.js +1 -1
  82. package/dist/render/shaders/generated/smoke.wgsl.d.ts +1 -1
  83. package/dist/render/shaders/generated/smoke.wgsl.js +1 -1
  84. package/dist/render/shaders/generated/ssrResolve.wgsl.d.ts +29 -0
  85. package/dist/render/shaders/generated/ssrResolve.wgsl.js +29 -0
  86. package/dist/render/shaders/generated/ssrTrace.wgsl.d.ts +22 -2
  87. package/dist/render/shaders/generated/ssrTrace.wgsl.js +22 -2
  88. package/dist/render/shaders/generated/water.wgsl.d.ts +1 -1
  89. package/dist/render/shaders/generated/water.wgsl.js +1 -1
  90. package/dist/render/shaders/gpudriven/fog.wgsl.d.ts +2 -2
  91. package/dist/render/shaders/gpudriven/fog.wgsl.js +11 -3
  92. package/dist/render/shaders/line.d.ts +1 -1
  93. package/dist/render/shaders/particle.d.ts +3 -3
  94. package/dist/render/shaders/rush.js +54 -11
  95. package/dist/render/shaders/scatter.d.ts +1 -1
  96. package/dist/render/shaders/smoke.d.ts +1 -1
  97. package/dist/render/shaders/ssrResolve.d.ts +17 -0
  98. package/dist/render/shaders/ssrResolve.js +51 -0
  99. package/dist/render/shaders/ssrTrace.js +26 -0
  100. package/dist/render/shaders/water.d.ts +1 -1
  101. package/dist/render/ssrPass.d.ts +16 -0
  102. package/dist/render/ssrPass.js +106 -1
  103. package/dist/render/surfaceOverlay.d.ts +132 -0
  104. package/dist/render/surfaceOverlay.js +85 -0
  105. package/dist/render/surfaceTexture.d.ts +19 -0
  106. package/dist/render/surfaceTexture.js +69 -0
  107. package/dist/render/temporalAa.d.ts +14 -0
  108. package/dist/render/temporalAa.js +20 -0
  109. package/dist/render/vertexDefaults.d.ts +17 -0
  110. package/dist/render/vertexDefaults.js +24 -0
  111. package/package.json +6 -6
  112. package/src/index.ts +16 -0
  113. package/src/render/atmosphere.ts +22 -1
  114. package/src/render/backend/api.ts +9 -0
  115. package/src/render/backend/createRenderer.ts +18 -1
  116. package/src/render/backend/webgl2/renderer.ts +357 -13
  117. package/src/render/backend/webgpu/device.ts +42 -3
  118. package/src/render/backend/webgpu/flatPass.ts +63 -26
  119. package/src/render/backend/webgpu/postPass.ts +18 -0
  120. package/src/render/backend/webgpu/reflectionSurfacePass.ts +114 -0
  121. package/src/render/backend/webgpu/renderer.ts +735 -83
  122. package/src/render/displayRange.ts +61 -0
  123. package/src/render/filmicCurve.ts +229 -0
  124. package/src/render/fog.ts +19 -3
  125. package/src/render/frame/resources.ts +6 -0
  126. package/src/render/frameReflections.ts +72 -0
  127. package/src/render/pass.ts +53 -1
  128. package/src/render/reflectionSurfaceTargets.ts +105 -0
  129. package/src/render/renderQuality.ts +44 -8
  130. package/src/render/sceneTarget.ts +30 -2
  131. package/src/render/screenSpaceReflection.ts +5 -0
  132. package/src/render/shaders/filmLook.ts +2 -1
  133. package/src/render/shaders/flat/glassTint.ts +5 -1
  134. package/src/render/shaders/flat/index.ts +16 -0
  135. package/src/render/shaders/flat/main.ts +28 -0
  136. package/src/render/shaders/flat/overlay.ts +117 -0
  137. package/src/render/shaders/flat/pointShadow.ts +1 -1
  138. package/src/render/shaders/flat/reflectionSurface.ts +61 -0
  139. package/src/render/shaders/fog.ts +9 -2
  140. package/src/render/shaders/fringe.ts +59 -0
  141. package/src/render/shaders/generated/arcane.wgsl.ts +1 -1
  142. package/src/render/shaders/generated/bolt.wgsl.ts +1 -1
  143. package/src/render/shaders/generated/caustics.wgsl.ts +1 -1
  144. package/src/render/shaders/generated/film.wgsl.ts +1 -1
  145. package/src/render/shaders/generated/fire.wgsl.ts +1 -1
  146. package/src/render/shaders/generated/flat.wgsl.ts +214 -54
  147. package/src/render/shaders/generated/line.wgsl.ts +1 -1
  148. package/src/render/shaders/generated/particle.wgsl.ts +4 -4
  149. package/src/render/shaders/generated/rush.wgsl.ts +56 -26
  150. package/src/render/shaders/generated/scatter.wgsl.ts +1 -1
  151. package/src/render/shaders/generated/smoke.wgsl.ts +1 -1
  152. package/src/render/shaders/generated/ssrResolve.wgsl.ts +30 -0
  153. package/src/render/shaders/generated/ssrTrace.wgsl.ts +22 -2
  154. package/src/render/shaders/generated/water.wgsl.ts +1 -1
  155. package/src/render/shaders/gpudriven/fog.wgsl.ts +11 -3
  156. package/src/render/shaders/rush.ts +54 -11
  157. package/src/render/shaders/ssrResolve.ts +52 -0
  158. package/src/render/shaders/ssrTrace.ts +26 -0
  159. package/src/render/ssrPass.ts +138 -1
  160. package/src/render/surfaceOverlay.ts +195 -0
  161. package/src/render/surfaceTexture.ts +67 -0
  162. package/src/render/temporalAa.ts +20 -0
  163. package/src/render/vertexDefaults.ts +28 -0
@@ -110,7 +110,16 @@ export const OUTPUT_TRANSFORM_CODE = {
110
110
  srgb: 1,
111
111
  aces: 2,
112
112
  shoulder: 3,
113
+ filmic: 4,
113
114
  };
115
+ /**
116
+ * The code a **forward** pass grades with: the transform's own, except `filmic`, which only the
117
+ * composite carries the constants for, and which a pass grading itself therefore draws as `aces`.
118
+ * Both backends' `gradeCode` read this, so neither can hand a forward stage a code it lacks.
119
+ */
120
+ export function forwardTransformCode(transform) {
121
+ return transform === 'filmic' ? 2 : (OUTPUT_TRANSFORM_CODE[transform] ?? 0);
122
+ }
114
123
  /**
115
124
  * How far the speed rush reaches, and how far a motion-blurred pixel may travel, both in UV.
116
125
  *
@@ -119,3 +128,18 @@ export const OUTPUT_TRANSFORM_CODE = {
119
128
  */
120
129
  export const RUSH_REACH_UV = 0.012;
121
130
  export const MOTION_BLUR_MAX_UV = 0.03;
131
+ /**
132
+ * A longest smear as `setCameraMotionBlur` takes it: a share of the frame, above zero and at most
133
+ * half, and the default where the number is not one. Shared, so both backends cap one way.
134
+ */
135
+ export function clampMotionShare(share) {
136
+ return Number.isFinite(share) && share > 0 ? Math.min(share, 0.5) : MOTION_BLUR_MAX_UV;
137
+ }
138
+ /**
139
+ * Said once where a draw names where it was last frame and the frame blurs by motion, but keeps no
140
+ * motion target to blur that draw by: each object's own motion is drawn only under a
141
+ * reconstruction on WebGPU, and anywhere else the camera's motion alone smears the frame.
142
+ */
143
+ export const OBJECT_BLUR_UNKEPT = "[driftengine] motion blur follows each draw's own motion only under a reconstruction " +
144
+ "(DriftTR, WebGPU), which draws the motion target it reads; here the camera's motion alone " +
145
+ 'blurs the frame, and a moving object is smeared only as the camera moved past it.';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@driftengine/core",
3
- "version": "4.8.7",
3
+ "version": "4.9.0",
4
4
  "description": "The runtime of DriftEngine, a WebGPU game engine with a WebGL2 fallback: renderer, loop, input, cameras, scene graph and physics",
5
5
  "license": "Apache-2.0",
6
6
  "type": "module",
@@ -29,8 +29,8 @@
29
29
  ],
30
30
  "sideEffects": false,
31
31
  "dependencies": {
32
- "@driftengine/drft": "4.8.7",
33
- "@driftengine/physics": "4.8.7",
32
+ "@driftengine/drft": "4.9.0",
33
+ "@driftengine/physics": "4.9.0",
34
34
  "gl-matrix": "^3.4.3"
35
35
  },
36
36
  "author": "Drift Technologies",
@@ -67,8 +67,8 @@
67
67
  "prepack": "node ../../scripts/build.mjs @driftengine/core"
68
68
  },
69
69
  "devDependencies": {
70
- "@driftengine/nav": "4.8.7",
71
- "@driftengine/network": "4.8.7",
72
- "@driftengine/texture": "4.8.7"
70
+ "@driftengine/nav": "4.9.0",
71
+ "@driftengine/network": "4.9.0",
72
+ "@driftengine/texture": "4.9.0"
73
73
  }
74
74
  }
package/src/index.ts CHANGED
@@ -454,6 +454,8 @@ export type { ReflectionOptions, ReflectiveSample } from './render/gi/reflection
454
454
  */
455
455
  export { GRADE_PLACEHOLDER_SIZE, MAX_GRADE_SIZE, identityGradeLut } from './render/colourGrade.ts';
456
456
  export type { ColourGradeLut } from './render/colourGrade.ts';
457
+ export { DEFAULT_FILMIC_CURVE } from './render/filmicCurve.ts';
458
+ export type { FilmicCurve } from './render/filmicCurve.ts';
457
459
  /**
458
460
  * How bloom answers past its threshold — a ramp in place of the subtraction, and a tint for each
459
461
  * of the pyramid's `BLOOM_LEVELS` octaves — the third argument of `setBloom`.
@@ -513,6 +515,20 @@ export type {
513
515
  SurfaceModel,
514
516
  SurfaceModelKind,
515
517
  } from './render/surfaceModel.ts';
518
+ /*
519
+ * What a draw lays over its surface beyond its material — a rim of light, a dissolve, wrinkle
520
+ * normals by region — set per draw with `setSurfaceOverlay`, its images regions of one atlas.
521
+ */
522
+ /* Every opaque lit surface reflecting the frame by its own material: `screenSpaceReflections`. */
523
+ export { DEFAULT_FRAME_REFLECTIONS } from './render/frameReflections.ts';
524
+ export type { FrameReflections } from './render/frameReflections.ts';
525
+ export type {
526
+ OverlayRegion,
527
+ SurfaceDissolve,
528
+ SurfaceOverlay,
529
+ SurfaceRim,
530
+ SurfaceWrinkle,
531
+ } from './render/surfaceOverlay.ts';
516
532
  /*
517
533
  * A baked lightmap: the page a consumer decoded, which `createLightmap` uploads as a lightmapped
518
534
  * material's `modelMap`, and the region of it a material or an instance reads.
@@ -47,6 +47,19 @@ export interface Atmosphere {
47
47
  /** Linear mode only: where haze begins, and where it is total. */
48
48
  fogNear?: number;
49
49
  fogFar?: number;
50
+ /**
51
+ * The medium only: how far along the view ray it begins, in metres. Absent or 0 is at the
52
+ * camera, as every world before it was drawn.
53
+ *
54
+ * The air nearer than this is perfectly clear, and what lies beyond is fogged by the air past
55
+ * this point alone — so a faint, bright haze can lie over a distant crowd while the figures a
56
+ * few metres from the camera stay sharp, which no density can do when the medium starts at the
57
+ * eye: there it veils the whole frame, lifting the shadows and draining the colour before it
58
+ * reaches anything far enough to want it. Unlike `linear`'s `fogNear`, nothing past it is a
59
+ * ramp: it is the same extinction, integrated from further out. **What it gives up** is the air
60
+ * between the camera and the start, which a real medium has; that is the point of it.
61
+ */
62
+ fogStart?: number;
50
63
  underwater: UnderwaterAtmosphere | null;
51
64
  }
52
65
 
@@ -132,7 +145,15 @@ export function resolveAtmosphere(
132
145
  out.fogHeightFalloff = atmosphere.fogHeightFalloff;
133
146
  out.fogEyeY = cameraY;
134
147
  out.fogMode = atmosphere.fogMode === 'linear' ? 1 : 0;
135
- out.fogNear = atmosphere.fogNear ?? 0;
148
+ /*
149
+ * **One slot, two meanings, and never both**: the ramp's near distance in linear mode, and in
150
+ * the medium where it begins (`fogStart`), which the medium never read before — so a world that
151
+ * left a `fogNear` on an exponential fog starts nothing, and draws exactly as it did.
152
+ */
153
+ out.fogNear =
154
+ atmosphere.fogMode === 'linear'
155
+ ? (atmosphere.fogNear ?? 0)
156
+ : Math.max(0, Number.isFinite(atmosphere.fogStart) ? (atmosphere.fogStart ?? 0) : 0);
136
157
  out.fogFar = atmosphere.fogFar ?? 1;
137
158
  /*
138
159
  * The air medium stands in when nothing is submerged. The shaders multiply by the factor
@@ -7,6 +7,7 @@ import type { ProbeBakeOptions } from '../reflectionProbe.ts';
7
7
  import type { Renderer, TranslucentMeshOptions } from './webgl2/renderer.ts';
8
8
  import type { InstancedOptions, MeshInstances } from '../instances.ts';
9
9
  import type { SurfaceMaterial } from '../surfaceTexture.ts';
10
+ import type { SurfaceOverlay } from '../surfaceOverlay.ts';
10
11
  import type { SurfaceSource } from '../compressedSource.ts';
11
12
  import type { LightmapPage } from '../lightmap.ts';
12
13
  import type { DeviceParticles } from '../particlePool.ts';
@@ -311,6 +312,7 @@ export type RendererApi = Omit<
311
312
  | 'disposeSurfaceTexture'
312
313
  | 'setSurfaceTexture'
313
314
  | 'setMaterial'
315
+ | 'setSurfaceOverlay'
314
316
  | 'createClothBinding'
315
317
  | 'createClothParticles'
316
318
  | 'updateClothParticles'
@@ -341,6 +343,13 @@ export type RendererApi = Omit<
341
343
  setCloth(binding: ClothBindingHandle | null, particles?: ClothParticlesHandle | null): void;
342
344
  disposeClothBinding(binding: ClothBindingHandle): void;
343
345
  disposeClothParticles(particles: ClothParticlesHandle): void;
346
+ /**
347
+ * What the following draws lay over their surfaces beyond their materials — a rim of light, a
348
+ * dissolve with a glowing edge, wrinkle normals by region — or null for none, which every pass
349
+ * starts with. Per draw, so one character's whole set of materials changes together. Its images
350
+ * are regions of one atlas (`SurfaceOverlay.maps`). See `surfaceOverlay.ts`.
351
+ */
352
+ setSurfaceOverlay(overlay: SurfaceOverlay | null): void;
344
353
  /**
345
354
  * Upload a caller's image, or a BC image's blocks with their stored chain where
346
355
  * `compressedFormats` has the format. See `SurfaceTextureHandle` for the boundary this guards.
@@ -5,6 +5,7 @@ import { BACKEND_TIMEOUT_MS, forcedBackend, selectBackend } from './select.ts';
5
5
  import { TIMED_OUT, withDeadline } from './deadline.ts';
6
6
  import { mountSplash, type MountedSplash, type SplashOptions } from '../../ui/splash.ts';
7
7
  import { gpuDrivenRefusal, gpuDrivenSupported } from '../gpudriven/pipeline.ts';
8
+ import { browserHighDynamicRange, chooseDisplayRange } from '../displayRange.ts';
8
9
 
9
10
  /**
10
11
  * Which of the two pipelines is drawing.
@@ -149,6 +150,12 @@ export interface CreateRendererOptions {
149
150
  * badge is looked at on a deployed build.
150
151
  */
151
152
  readonly splash?: boolean | SplashOptions;
153
+ /**
154
+ * Whether the display shows a high dynamic range, asked only where `highDynamicRange` was. The
155
+ * browser's `(dynamic-range: high)` query by default; a host with no DOM, or one that knows
156
+ * better about its own display, answers instead. See `displayRange.ts`.
157
+ */
158
+ readonly highDynamicRangeDisplay?: () => boolean;
152
159
  }
153
160
 
154
161
  /** What was built, and which path built it. */
@@ -370,7 +377,17 @@ export async function createRenderer(
370
377
  const { createGpuSurface } = await import('./webgpu/device.ts');
371
378
  const { WebGPURenderer } = await import('./webgpu/renderer.ts');
372
379
  stage = 'creating the surface';
373
- const surface = createGpuSurface(canvas, device);
380
+ const profile = resolveRenderQuality(qualityFor('webgpu'));
381
+ const surface = createGpuSurface(
382
+ canvas,
383
+ device,
384
+ chooseDisplayRange(
385
+ profile.highDynamicRange,
386
+ profile.screenEffects && profile.hdrScene,
387
+ profile.highDynamicRange &&
388
+ (options.highDynamicRangeDisplay ?? browserHighDynamicRange)(),
389
+ ),
390
+ );
374
391
  stage = 'constructing the renderer';
375
392
  return { surface, WebGPURenderer };
376
393
  })();