@driftengine/core 4.9.0 → 4.10.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 (135) hide show
  1. package/CHANGELOG.json +62 -11
  2. package/README.md +43 -38
  3. package/dist/index.d.ts +3 -1
  4. package/dist/index.js +4 -3
  5. package/dist/render/ambientHarmonics.d.ts +1 -1
  6. package/dist/render/ambientHarmonics.js +1 -1
  7. package/dist/render/areaLights.d.ts +4 -4
  8. package/dist/render/areaLights.js +1 -1
  9. package/dist/render/backend/api.d.ts +10 -3
  10. package/dist/render/backend/select.js +11 -5
  11. package/dist/render/backend/webgl2/boneAnimations.d.ts +29 -0
  12. package/dist/render/backend/webgl2/boneAnimations.js +80 -0
  13. package/dist/render/backend/webgl2/instanced.d.ts +5 -1
  14. package/dist/render/backend/webgl2/instanced.js +13 -1
  15. package/dist/render/backend/webgl2/renderer.d.ts +90 -2
  16. package/dist/render/backend/webgl2/renderer.js +253 -24
  17. package/dist/render/backend/webgl2/skinPaletteTexture.d.ts +5 -3
  18. package/dist/render/backend/webgl2/skinPaletteTexture.js +6 -4
  19. package/dist/render/backend/webgpu/boneAnimations.d.ts +34 -0
  20. package/dist/render/backend/webgpu/boneAnimations.js +76 -0
  21. package/dist/render/backend/webgpu/buffers.d.ts +19 -4
  22. package/dist/render/backend/webgpu/buffers.js +18 -11
  23. package/dist/render/backend/webgpu/compressedUpload.d.ts +0 -1
  24. package/dist/render/backend/webgpu/compressedUpload.js +53 -8
  25. package/dist/render/backend/webgpu/depthPass.d.ts +59 -3
  26. package/dist/render/backend/webgpu/depthPass.js +49 -14
  27. package/dist/render/backend/webgpu/drawCommand.d.ts +18 -4
  28. package/dist/render/backend/webgpu/drawCommand.js +10 -3
  29. package/dist/render/backend/webgpu/flatPass.d.ts +85 -42
  30. package/dist/render/backend/webgpu/flatPass.js +136 -20
  31. package/dist/render/backend/webgpu/instanced.d.ts +14 -1
  32. package/dist/render/backend/webgpu/instanced.js +24 -1
  33. package/dist/render/backend/webgpu/materialStore.d.ts +101 -0
  34. package/dist/render/backend/webgpu/materialStore.js +265 -0
  35. package/dist/render/backend/webgpu/pipelineCache.d.ts +6 -0
  36. package/dist/render/backend/webgpu/pipelineCache.js +7 -0
  37. package/dist/render/backend/webgpu/renderer.d.ts +152 -35
  38. package/dist/render/backend/webgpu/renderer.js +787 -142
  39. package/dist/render/backend/webgpu/skinPaletteRing.d.ts +7 -3
  40. package/dist/render/backend/webgpu/skinPaletteRing.js +13 -7
  41. package/dist/render/backend/webgpu/skinPaletteTexture.d.ts +6 -0
  42. package/dist/render/backend/webgpu/skinPaletteTexture.js +7 -1
  43. package/dist/render/backend/webgpu/staticBundles.d.ts +125 -0
  44. package/dist/render/backend/webgpu/staticBundles.js +241 -0
  45. package/dist/render/backend/webgpu/surfaceTexturePass.d.ts +10 -3
  46. package/dist/render/backend/webgpu/surfaceTexturePass.js +20 -2
  47. package/dist/render/backend/webgpu/uniformRing.d.ts +21 -0
  48. package/dist/render/backend/webgpu/uniformRing.js +9 -1
  49. package/dist/render/bloomChain.d.ts +3 -3
  50. package/dist/render/boneAnimation.d.ts +92 -0
  51. package/dist/render/boneAnimation.js +133 -0
  52. package/dist/render/compressedSource.d.ts +33 -13
  53. package/dist/render/compressedSource.js +70 -25
  54. package/dist/render/glCompressed.js +83 -0
  55. package/dist/render/instances.d.ts +26 -0
  56. package/dist/render/lightBudget.d.ts +10 -0
  57. package/dist/render/lightBudget.js +10 -0
  58. package/dist/render/lightmap.d.ts +1 -1
  59. package/dist/render/mesh.d.ts +5 -0
  60. package/dist/render/mesh.js +6 -0
  61. package/dist/render/pointLightSelection.d.ts +4 -4
  62. package/dist/render/screenSpaceReflection.d.ts +2 -1
  63. package/dist/render/shaders/boneAnimation.d.ts +19 -0
  64. package/dist/render/shaders/boneAnimation.js +63 -0
  65. package/dist/render/shaders/depth.d.ts +7 -0
  66. package/dist/render/shaders/depth.js +35 -10
  67. package/dist/render/shaders/flat/index.d.ts +6 -0
  68. package/dist/render/shaders/flat/index.js +27 -5
  69. package/dist/render/shaders/flat/main.d.ts +1 -1
  70. package/dist/render/shaders/flat/main.js +15 -5
  71. package/dist/render/shaders/flat/models.js +1 -1
  72. package/dist/render/shaders/flat/overlay.js +1 -1
  73. package/dist/render/shaders/flat/pointShadow.js +2 -2
  74. package/dist/render/shaders/flat/preamble.js +38 -24
  75. package/dist/render/shaders/generated/depth.wgsl.d.ts +93 -0
  76. package/dist/render/shaders/generated/depth.wgsl.js +93 -0
  77. package/dist/render/shaders/generated/flat.wgsl.d.ts +3077 -2903
  78. package/dist/render/shaders/generated/flat.wgsl.js +3100 -2925
  79. package/dist/render/shaders/outputTransform.d.ts +7 -0
  80. package/dist/render/shaders/outputTransform.js +28 -14
  81. package/dist/render/shaders/vertexChannel.d.ts +7 -0
  82. package/dist/render/shaders/vertexChannel.js +26 -0
  83. package/dist/render/staticDraws.d.ts +47 -0
  84. package/dist/render/staticDraws.js +43 -0
  85. package/dist/render/surfaceTexture.d.ts +38 -7
  86. package/dist/render/surfaceTexture.js +56 -17
  87. package/package.json +6 -6
  88. package/src/index.ts +8 -2
  89. package/src/render/ambientHarmonics.ts +1 -1
  90. package/src/render/areaLights.ts +4 -4
  91. package/src/render/backend/api.ts +13 -3
  92. package/src/render/backend/select.ts +10 -5
  93. package/src/render/backend/webgl2/boneAnimations.ts +105 -0
  94. package/src/render/backend/webgl2/instanced.ts +20 -1
  95. package/src/render/backend/webgl2/renderer.ts +315 -24
  96. package/src/render/backend/webgl2/skinPaletteTexture.ts +6 -4
  97. package/src/render/backend/webgpu/boneAnimations.ts +97 -0
  98. package/src/render/backend/webgpu/buffers.ts +42 -16
  99. package/src/render/backend/webgpu/compressedUpload.ts +59 -9
  100. package/src/render/backend/webgpu/depthPass.ts +51 -10
  101. package/src/render/backend/webgpu/drawCommand.ts +22 -4
  102. package/src/render/backend/webgpu/flatPass.ts +187 -14
  103. package/src/render/backend/webgpu/instanced.ts +32 -1
  104. package/src/render/backend/webgpu/materialStore.ts +276 -0
  105. package/src/render/backend/webgpu/pipelineCache.ts +7 -0
  106. package/src/render/backend/webgpu/renderer.ts +928 -155
  107. package/src/render/backend/webgpu/skinPaletteRing.ts +13 -7
  108. package/src/render/backend/webgpu/skinPaletteTexture.ts +7 -1
  109. package/src/render/backend/webgpu/staticBundles.ts +363 -0
  110. package/src/render/backend/webgpu/surfaceTexturePass.ts +29 -3
  111. package/src/render/backend/webgpu/uniformRing.ts +10 -1
  112. package/src/render/bloomChain.ts +3 -3
  113. package/src/render/boneAnimation.ts +223 -0
  114. package/src/render/compressedSource.ts +121 -29
  115. package/src/render/glCompressed.ts +83 -0
  116. package/src/render/instances.ts +27 -0
  117. package/src/render/lightBudget.ts +11 -0
  118. package/src/render/lightmap.ts +1 -1
  119. package/src/render/mesh.ts +6 -0
  120. package/src/render/pointLightSelection.ts +4 -4
  121. package/src/render/screenSpaceReflection.ts +2 -1
  122. package/src/render/shaders/boneAnimation.ts +63 -0
  123. package/src/render/shaders/depth.ts +45 -10
  124. package/src/render/shaders/flat/index.ts +33 -5
  125. package/src/render/shaders/flat/main.ts +15 -5
  126. package/src/render/shaders/flat/models.ts +1 -1
  127. package/src/render/shaders/flat/overlay.ts +1 -1
  128. package/src/render/shaders/flat/pointShadow.ts +2 -2
  129. package/src/render/shaders/flat/preamble.ts +38 -24
  130. package/src/render/shaders/generated/depth.wgsl.ts +95 -0
  131. package/src/render/shaders/generated/flat.wgsl.ts +3100 -2925
  132. package/src/render/shaders/outputTransform.ts +30 -14
  133. package/src/render/shaders/vertexChannel.ts +27 -0
  134. package/src/render/staticDraws.ts +95 -0
  135. package/src/render/surfaceTexture.ts +94 -27
@@ -0,0 +1,105 @@
1
+ /**
2
+ * A bone animation's textures on this backend, and a batch's clocks: what
3
+ * `shaders/boneAnimation.ts` reads with `texelFetch`, made once and never filtered. The twin of
4
+ * `webgpu/boneAnimations.ts`, at the same formats for the same reason: a turn in half floats jitters
5
+ * a crowd's hands at the frame's rate.
6
+ */
7
+ import {
8
+ CLOCK_TEXTURE_WIDTH,
9
+ type BoneAnimationHandle,
10
+ type BoneAnimationTexels,
11
+ } from '../../boneAnimation.ts';
12
+
13
+ /**
14
+ * A float texture read by index: one level, nearest, clamped. Bound on unit 0, chosen rather than
15
+ * inherited, for the reason `oitPass.ts` gives: `bindTexture` binds to whatever unit is active, and
16
+ * a frame leaves that wherever its last pass finished.
17
+ */
18
+ function floatTexture(
19
+ gl: WebGL2RenderingContext,
20
+ internal: number,
21
+ width: number,
22
+ height: number,
23
+ ): WebGLTexture {
24
+ const texture = gl.createTexture();
25
+ if (texture === null) throw new Error('boneAnimations: createTexture failed');
26
+ gl.activeTexture(gl.TEXTURE0);
27
+ gl.bindTexture(gl.TEXTURE_2D, texture);
28
+ gl.texStorage2D(gl.TEXTURE_2D, 1, internal, width, height);
29
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);
30
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);
31
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
32
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
33
+ return texture;
34
+ }
35
+
36
+ /** A clip on the device, from `createBoneAnimation`. */
37
+ export class GlBoneAnimation implements BoneAnimationHandle {
38
+ readonly bones: number;
39
+ readonly frames: number;
40
+ readonly framesPerSecond: number;
41
+ readonly boneScale: number;
42
+ readonly places: WebGLTexture;
43
+ readonly turns: WebGLTexture;
44
+ disposed = false;
45
+
46
+ constructor(gl: WebGL2RenderingContext, texels: BoneAnimationTexels) {
47
+ this.bones = texels.bones;
48
+ this.frames = texels.frames;
49
+ this.framesPerSecond = texels.framesPerSecond;
50
+ this.boneScale = texels.boneScale;
51
+ const make = (data: Float32Array): WebGLTexture => {
52
+ const texture = floatTexture(gl, gl.RGBA32F, texels.bones, texels.frames);
53
+ gl.texSubImage2D(
54
+ gl.TEXTURE_2D,
55
+ 0,
56
+ 0,
57
+ 0,
58
+ texels.bones,
59
+ texels.frames,
60
+ gl.RGBA,
61
+ gl.FLOAT,
62
+ data,
63
+ );
64
+ return texture;
65
+ };
66
+ this.places = make(texels.places);
67
+ this.turns = make(texels.turns);
68
+ gl.bindTexture(gl.TEXTURE_2D, null);
69
+ }
70
+
71
+ dispose(gl: WebGL2RenderingContext): void {
72
+ this.disposed = true;
73
+ gl.deleteTexture(this.places);
74
+ gl.deleteTexture(this.turns);
75
+ }
76
+ }
77
+
78
+ /** A batch's clocks: two floats an instance, wrapped onto rows `CLOCK_TEXTURE_WIDTH` wide. */
79
+ export class GlInstanceClocks {
80
+ readonly texture: WebGLTexture;
81
+ readonly staging: Float32Array;
82
+ private readonly width: number;
83
+
84
+ constructor(gl: WebGL2RenderingContext, capacity: number) {
85
+ this.width = Math.max(1, Math.min(capacity, CLOCK_TEXTURE_WIDTH));
86
+ const rows = Math.max(1, Math.ceil(capacity / this.width));
87
+ this.staging = new Float32Array(this.width * rows * 2);
88
+ this.texture = floatTexture(gl, gl.RG32F, this.width, rows);
89
+ gl.bindTexture(gl.TEXTURE_2D, null);
90
+ }
91
+
92
+ /** The rows that hold the first `count` instances, from `staging`. */
93
+ upload(gl: WebGL2RenderingContext, count: number): void {
94
+ if (count <= 0) return;
95
+ const rows = Math.ceil(count / this.width);
96
+ gl.activeTexture(gl.TEXTURE0);
97
+ gl.bindTexture(gl.TEXTURE_2D, this.texture);
98
+ gl.texSubImage2D(gl.TEXTURE_2D, 0, 0, 0, this.width, rows, gl.RG, gl.FLOAT, this.staging);
99
+ gl.bindTexture(gl.TEXTURE_2D, null);
100
+ }
101
+
102
+ dispose(gl: WebGL2RenderingContext): void {
103
+ gl.deleteTexture(this.texture);
104
+ }
105
+ }
@@ -8,6 +8,8 @@ import {
8
8
  import type { MeshInstances } from '../../instances.ts';
9
9
  import type { Mesh } from '../../mesh.ts';
10
10
  import type { FrustumPlanes } from '../../../math/frustum.ts';
11
+ import { packInstanceClocks } from '../../boneAnimation.ts';
12
+ import { GlInstanceClocks, type GlBoneAnimation } from './boneAnimations.ts';
11
13
 
12
14
  /**
13
15
  * One batch of a mesh: its per-instance buffer and a vertex array of its own.
@@ -42,10 +44,22 @@ export class InstancedBatch {
42
44
  readonly instances: MeshInstances;
43
45
  } | null;
44
46
 
45
- constructor(gl: WebGL2RenderingContext, mesh: Mesh, capacity: number, cull = false) {
47
+ /** The bone animation every instance plays, and its clocks; null for a batch that plays none. */
48
+ readonly animation: GlBoneAnimation | null;
49
+ readonly clocks: GlInstanceClocks | null;
50
+
51
+ constructor(
52
+ gl: WebGL2RenderingContext,
53
+ mesh: Mesh,
54
+ capacity: number,
55
+ cull = false,
56
+ animation: GlBoneAnimation | null = null,
57
+ ) {
46
58
  this.mesh = mesh;
47
59
  this.capacity = capacity;
48
60
  this.cull = cull;
61
+ this.animation = animation;
62
+ this.clocks = animation === null ? null : new GlInstanceClocks(gl, capacity);
49
63
  this.staging = new Float32Array(capacity * INSTANCE_FLOATS);
50
64
  this.buffer = allocate(gl, capacity);
51
65
  this.vao = mesh.createInstanceArray(gl, this.buffer, INSTANCE_STRIDE);
@@ -68,6 +82,10 @@ export class InstancedBatch {
68
82
  packInstances(data, this.staging);
69
83
  gl.bindBuffer(gl.ARRAY_BUFFER, this.buffer);
70
84
  gl.bufferSubData(gl.ARRAY_BUFFER, 0, this.staging, 0, count * INSTANCE_FLOATS);
85
+ if (this.clocks !== null) {
86
+ packInstanceClocks(data, this.clocks.staging);
87
+ this.clocks.upload(gl, count);
88
+ }
71
89
  }
72
90
 
73
91
  /** Draw the first `count` uploaded instances: every draw but a culling camera draw. */
@@ -102,6 +120,7 @@ export class InstancedBatch {
102
120
  dispose(gl: WebGL2RenderingContext): void {
103
121
  gl.deleteVertexArray(this.vao);
104
122
  gl.deleteBuffer(this.buffer);
123
+ this.clocks?.dispose(gl);
105
124
  if (this.kept !== null) {
106
125
  gl.deleteVertexArray(this.kept.vao);
107
126
  gl.deleteBuffer(this.kept.buffer);