@opsydyn/effect-three 0.2.0 → 0.4.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 (134) hide show
  1. package/CHANGELOG.md +21 -1
  2. package/README.md +14 -1
  3. package/dist/{index-01kwfekm.js → index-h3vf50fn.js} +2418 -85
  4. package/dist/index-h3vf50fn.js.map +53 -0
  5. package/dist/index-ttwy0znv.js +145 -0
  6. package/dist/index-ttwy0znv.js.map +12 -0
  7. package/dist/index.js +543 -149
  8. package/dist/index.js.map +8 -6
  9. package/dist/kernel/behaviours.d.ts.map +1 -1
  10. package/dist/kernel/boxSelect.d.ts +22 -0
  11. package/dist/kernel/boxSelect.d.ts.map +1 -0
  12. package/dist/kernel/build.d.ts +197 -6
  13. package/dist/kernel/build.d.ts.map +1 -1
  14. package/dist/kernel/cameraMotion.d.ts +3 -1
  15. package/dist/kernel/cameraMotion.d.ts.map +1 -1
  16. package/dist/kernel/cameraShake.d.ts +33 -0
  17. package/dist/kernel/cameraShake.d.ts.map +1 -0
  18. package/dist/kernel/describeScene.d.ts +50 -0
  19. package/dist/kernel/describeScene.d.ts.map +1 -0
  20. package/dist/kernel/description.d.ts +240 -2
  21. package/dist/kernel/description.d.ts.map +1 -1
  22. package/dist/kernel/diff.d.ts +18 -1
  23. package/dist/kernel/diff.d.ts.map +1 -1
  24. package/dist/kernel/equality.d.ts +13 -1
  25. package/dist/kernel/equality.d.ts.map +1 -1
  26. package/dist/kernel/gizmo.d.ts +69 -0
  27. package/dist/kernel/gizmo.d.ts.map +1 -0
  28. package/dist/kernel/history.d.ts +61 -0
  29. package/dist/kernel/history.d.ts.map +1 -0
  30. package/dist/kernel/index.d.ts +13 -2
  31. package/dist/kernel/index.d.ts.map +1 -1
  32. package/dist/kernel/index.js +116 -3
  33. package/dist/kernel/index.js.map +1 -1
  34. package/dist/kernel/inspect.d.ts +85 -0
  35. package/dist/kernel/inspect.d.ts.map +1 -0
  36. package/dist/kernel/lineGeometry.d.ts +25 -0
  37. package/dist/kernel/lineGeometry.d.ts.map +1 -0
  38. package/dist/kernel/lockstep.d.ts +114 -0
  39. package/dist/kernel/lockstep.d.ts.map +1 -0
  40. package/dist/kernel/loop.d.ts.map +1 -1
  41. package/dist/kernel/materials.d.ts.map +1 -1
  42. package/dist/kernel/pivot.d.ts +54 -0
  43. package/dist/kernel/pivot.d.ts.map +1 -0
  44. package/dist/kernel/pointBuffers.d.ts +17 -0
  45. package/dist/kernel/pointBuffers.d.ts.map +1 -0
  46. package/dist/kernel/pointer.d.ts +12 -0
  47. package/dist/kernel/pointer.d.ts.map +1 -1
  48. package/dist/kernel/renderKit.d.ts +21 -1
  49. package/dist/kernel/renderKit.d.ts.map +1 -1
  50. package/dist/kernel/renderer.d.ts +6 -0
  51. package/dist/kernel/renderer.d.ts.map +1 -1
  52. package/dist/kernel/resources.d.ts.map +1 -1
  53. package/dist/kernel/sceneChanges.d.ts +87 -0
  54. package/dist/kernel/sceneChanges.d.ts.map +1 -0
  55. package/dist/kernel/sceneGraph.d.ts +6 -1
  56. package/dist/kernel/sceneGraph.d.ts.map +1 -1
  57. package/dist/kernel/seeded.d.ts +9 -0
  58. package/dist/kernel/seeded.d.ts.map +1 -0
  59. package/dist/kernel/shots.d.ts +26 -0
  60. package/dist/kernel/shots.d.ts.map +1 -0
  61. package/dist/kernel/tape.d.ts +38 -0
  62. package/dist/kernel/tape.d.ts.map +1 -0
  63. package/dist/kernel/trail.d.ts +31 -0
  64. package/dist/kernel/trail.d.ts.map +1 -0
  65. package/dist/kernel/viewportGizmo.d.ts +25 -0
  66. package/dist/kernel/viewportGizmo.d.ts.map +1 -0
  67. package/dist/runtime/Inspector.d.ts +20 -0
  68. package/dist/runtime/Inspector.d.ts.map +1 -0
  69. package/dist/runtime/SceneFile.d.ts +448 -0
  70. package/dist/runtime/SceneFile.d.ts.map +1 -0
  71. package/dist/runtime/SceneSchema.d.ts +614 -5
  72. package/dist/runtime/SceneSchema.d.ts.map +1 -1
  73. package/dist/runtime/errors.d.ts +9 -0
  74. package/dist/runtime/errors.d.ts.map +1 -1
  75. package/dist/runtime/index.d.ts +3 -1
  76. package/dist/runtime/index.d.ts.map +1 -1
  77. package/dist/webgl/index.d.ts.map +1 -1
  78. package/dist/webgl/index.js +228 -3
  79. package/dist/webgl/index.js.map +6 -4
  80. package/dist/webgl/line.d.ts +4 -0
  81. package/dist/webgl/line.d.ts.map +1 -0
  82. package/dist/webgl/points.d.ts +4 -0
  83. package/dist/webgl/points.d.ts.map +1 -0
  84. package/dist/webgpu/index.d.ts.map +1 -1
  85. package/dist/webgpu/index.js +206 -26
  86. package/dist/webgpu/index.js.map +6 -4
  87. package/dist/webgpu/line.d.ts +4 -0
  88. package/dist/webgpu/line.d.ts.map +1 -0
  89. package/dist/webgpu/points.d.ts +4 -0
  90. package/dist/webgpu/points.d.ts.map +1 -0
  91. package/package.json +2 -1
  92. package/src/kernel/behaviours.ts +5 -0
  93. package/src/kernel/bodySources.ts +1 -1
  94. package/src/kernel/boxSelect.ts +73 -0
  95. package/src/kernel/build.ts +430 -0
  96. package/src/kernel/cameraMotion.ts +3 -0
  97. package/src/kernel/cameraShake.ts +87 -0
  98. package/src/kernel/describeScene.ts +224 -0
  99. package/src/kernel/description.ts +266 -1
  100. package/src/kernel/diff.ts +46 -1
  101. package/src/kernel/equality.ts +148 -0
  102. package/src/kernel/gizmo.ts +478 -0
  103. package/src/kernel/history.ts +118 -0
  104. package/src/kernel/index.ts +102 -0
  105. package/src/kernel/inspect.ts +214 -0
  106. package/src/kernel/lineGeometry.ts +75 -0
  107. package/src/kernel/lockstep.ts +237 -0
  108. package/src/kernel/loop.ts +5 -0
  109. package/src/kernel/materials.ts +3 -0
  110. package/src/kernel/pivot.ts +418 -0
  111. package/src/kernel/pointBuffers.ts +115 -0
  112. package/src/kernel/pointer.ts +63 -12
  113. package/src/kernel/renderKit.ts +23 -1
  114. package/src/kernel/renderer.ts +6 -0
  115. package/src/kernel/resources.ts +69 -0
  116. package/src/kernel/sceneChanges.ts +265 -0
  117. package/src/kernel/sceneGraph.ts +461 -9
  118. package/src/kernel/seeded.ts +18 -0
  119. package/src/kernel/shots.ts +167 -0
  120. package/src/kernel/tape.ts +124 -0
  121. package/src/kernel/trail.ts +170 -0
  122. package/src/kernel/viewportGizmo.ts +194 -0
  123. package/src/runtime/Inspector.ts +43 -0
  124. package/src/runtime/SceneFile.ts +46 -0
  125. package/src/runtime/SceneSchema.ts +305 -4
  126. package/src/runtime/errors.ts +6 -0
  127. package/src/runtime/index.ts +3 -1
  128. package/src/webgl/index.ts +4 -0
  129. package/src/webgl/line.ts +66 -0
  130. package/src/webgl/points.ts +205 -0
  131. package/src/webgpu/index.ts +4 -0
  132. package/src/webgpu/line.ts +67 -0
  133. package/src/webgpu/points.ts +193 -0
  134. package/dist/index-01kwfekm.js.map +0 -40
@@ -1,6 +1,11 @@
1
1
  import {
2
2
  createContactShadowPasses
3
3
  } from "../index-4045wme0.js";
4
+ import {
5
+ drawable,
6
+ fillLineGeometry,
7
+ pointBuffers
8
+ } from "../index-ttwy0znv.js";
4
9
 
5
10
  // src/webgpu/contactShadows.ts
6
11
  import { NoBlending, Texture } from "three";
@@ -56,6 +61,179 @@ var webgpuShadowMaterials = {
56
61
  };
57
62
  var createContactShadows = (graph, renderer) => createContactShadowPasses(graph, renderer, webgpuShadowMaterials);
58
63
 
64
+ // src/webgpu/line.ts
65
+ import { Group } from "three";
66
+ import { LineGeometry } from "three/addons/lines/LineGeometry.js";
67
+ import { LineSegmentsGeometry } from "three/addons/lines/LineSegmentsGeometry.js";
68
+ import { Line2 } from "three/addons/lines/webgpu/Line2.js";
69
+ import { LineSegments2 } from "three/addons/lines/webgpu/LineSegments2.js";
70
+ import { Line2NodeMaterial } from "three/webgpu";
71
+ var style = (material, line) => {
72
+ material.color.setHex(line.vertexColors === null ? line.color : 16777215);
73
+ if (material.vertexColors !== (line.vertexColors !== null)) {
74
+ material.vertexColors = line.vertexColors !== null;
75
+ material.needsUpdate = true;
76
+ }
77
+ material.linewidth = line.width;
78
+ material.worldUnits = line.worldUnits;
79
+ material.dashed = line.dashed;
80
+ material.dashSize = line.dashSize;
81
+ material.gapSize = line.gapSize;
82
+ material.scale = line.dashScale;
83
+ material.dashOffset = line.dashOffset;
84
+ material.opacity = line.opacity;
85
+ material.transparent = line.transparent;
86
+ };
87
+ var draw = (line, material) => {
88
+ const drawn = line.segments ? new LineSegments2(fillLineGeometry(new LineSegmentsGeometry, line), material) : new Line2(fillLineGeometry(new LineGeometry, line), material);
89
+ drawn.computeLineDistances();
90
+ drawn.visible = drawable(line);
91
+ return drawn;
92
+ };
93
+ var hostLine = (first) => {
94
+ const object = new Group;
95
+ const material = new Line2NodeMaterial;
96
+ style(material, first);
97
+ let drawn = draw(first, material);
98
+ object.add(drawn);
99
+ return {
100
+ object,
101
+ update: (next) => {
102
+ style(material, next);
103
+ drawn.removeFromParent();
104
+ drawn.geometry.dispose();
105
+ drawn = draw(next, material);
106
+ object.add(drawn);
107
+ },
108
+ dispose: () => {
109
+ drawn.geometry.dispose();
110
+ material.dispose();
111
+ }
112
+ };
113
+ };
114
+
115
+ // src/webgpu/points.ts
116
+ import { AdditiveBlending, Group as Group2, InstancedBufferAttribute } from "three";
117
+ import {
118
+ cos,
119
+ distance,
120
+ exp,
121
+ float as float2,
122
+ fwidth,
123
+ instancedBufferAttribute,
124
+ modelWorldMatrix,
125
+ positionView,
126
+ sin,
127
+ smoothstep,
128
+ uniform as uniform2,
129
+ uv as uv2,
130
+ vec2 as vec22,
131
+ vec3,
132
+ vec4
133
+ } from "three/tsl";
134
+ import { PointsNodeMaterial, Sprite } from "three/webgpu";
135
+ var createTime = () => uniform2(0);
136
+ var vec3Attribute = (array) => instancedBufferAttribute(new InstancedBufferAttribute(array, 3), "vec3");
137
+ var floatAttribute = (array) => instancedBufferAttribute(new InstancedBufferAttribute(array, 1), "float");
138
+ var attributes = (buffers) => ({
139
+ position: vec3Attribute(buffers.positions),
140
+ color: vec3Attribute(buffers.colors),
141
+ size: floatAttribute(buffers.sizes)
142
+ });
143
+ var pointCoord = uv2();
144
+ var dotsMaterial = (look, given) => {
145
+ const material = new PointsNodeMaterial({
146
+ transparent: look.transparent,
147
+ sizeAttenuation: look.sizeAttenuation
148
+ });
149
+ material.positionNode = given.position;
150
+ material.colorNode = vec4(given.color, 1);
151
+ material.sizeNode = given.size.mul(look.size);
152
+ const cxy = pointCoord.mul(2).sub(1);
153
+ const r = cxy.dot(cxy);
154
+ const delta = fwidth(r);
155
+ const mask = float2(1).sub(smoothstep(float2(1).sub(delta), delta.add(1), r));
156
+ material.opacityNode = look.round ? mask.mul(look.opacity) : float2(look.opacity);
157
+ material.alphaTestNode = float2(0.01);
158
+ return material;
159
+ };
160
+ var sparklesMaterial = (buffers, given, time) => {
161
+ const speed = floatAttribute(buffers.speeds);
162
+ const opacity = floatAttribute(buffers.opacities);
163
+ const noise = vec3Attribute(buffers.noise);
164
+ const material = new PointsNodeMaterial({
165
+ transparent: true,
166
+ depthWrite: false,
167
+ sizeAttenuation: false
168
+ });
169
+ const worldX = modelWorldMatrix.mul(vec4(given.position, 1)).x;
170
+ const phase = time.mul(speed);
171
+ material.positionNode = given.position.add(vec3(cos(phase.add(worldX.mul(noise.z).mul(100))).mul(0.2), sin(phase.add(worldX.mul(noise.x).mul(100))).mul(0.2), cos(phase.add(worldX.mul(noise.y).mul(100))).mul(0.2)));
172
+ material.colorNode = vec4(given.color, 1);
173
+ material.sizeNode = given.size.mul(25).div(positionView.z.negate());
174
+ const strength = float2(0.05).div(distance(pointCoord, vec22(0.5, 0.5))).sub(0.1);
175
+ material.opacityNode = strength.mul(opacity).clamp(0, 1);
176
+ return material;
177
+ };
178
+ var starsMaterial = (look, given, time) => {
179
+ const material = new PointsNodeMaterial({
180
+ transparent: true,
181
+ depthWrite: false,
182
+ blending: AdditiveBlending,
183
+ sizeAttenuation: false
184
+ });
185
+ material.positionNode = given.position.mul(2);
186
+ material.colorNode = vec4(given.color, 1);
187
+ material.sizeNode = given.size.mul(float2(30).div(positionView.z.negate().mul(0.5))).mul(sin(time.add(100)).add(3));
188
+ const d = distance(pointCoord, vec22(0.5, 0.5));
189
+ const soft = float2(1).div(exp(d.sub(0.25).mul(16)).add(1));
190
+ material.opacityNode = look.fade ? soft : float2(1);
191
+ return material;
192
+ };
193
+ var materialFor = (look, buffers, given, time) => {
194
+ switch (look._tag) {
195
+ case "Dots":
196
+ return dotsMaterial(look, given);
197
+ case "Sparkles":
198
+ return sparklesMaterial(buffers, given, time);
199
+ case "Stars":
200
+ return starsMaterial(look, given, time);
201
+ }
202
+ };
203
+ var draw2 = (look, time) => {
204
+ const buffers = pointBuffers(look);
205
+ const material = materialFor(look, buffers, attributes(buffers), time);
206
+ const sprite = new Sprite(material);
207
+ sprite.count = buffers.count;
208
+ sprite.visible = buffers.count > 0;
209
+ sprite.frustumCulled = false;
210
+ return sprite;
211
+ };
212
+ var hostPoints = (first) => {
213
+ const object = new Group2;
214
+ const time = createTime();
215
+ let look = first.look;
216
+ let drawn = draw2(look, time);
217
+ object.add(drawn);
218
+ const free = () => {
219
+ drawn.material.dispose();
220
+ };
221
+ return {
222
+ object,
223
+ update: (next) => {
224
+ look = next.look;
225
+ drawn.removeFromParent();
226
+ free();
227
+ drawn = draw2(look, time);
228
+ object.add(drawn);
229
+ },
230
+ tick: (seconds) => {
231
+ time.value = look._tag === "Stars" ? seconds * look.speed : seconds;
232
+ },
233
+ dispose: free
234
+ };
235
+ };
236
+
59
237
  // src/webgpu/shaderGrid.ts
60
238
  import {
61
239
  BackSide,
@@ -69,55 +247,55 @@ import {
69
247
  } from "three";
70
248
  import {
71
249
  abs,
72
- distance,
73
- float as float2,
250
+ distance as distance2,
251
+ float as float3,
74
252
  fract,
75
- fwidth,
253
+ fwidth as fwidth2,
76
254
  min,
77
255
  mix,
78
- modelWorldMatrix,
256
+ modelWorldMatrix as modelWorldMatrix2,
79
257
  modelWorldMatrixInverse,
80
258
  positionGeometry,
81
259
  pow,
82
260
  select,
83
- uniform as uniform2,
261
+ uniform as uniform3,
84
262
  varying,
85
- vec4
263
+ vec4 as vec42
86
264
  } from "three/tsl";
87
265
  import { MeshBasicNodeMaterial as MeshBasicNodeMaterial2 } from "three/webgpu";
88
266
  var sides = { front: FrontSide, back: BackSide, double: DoubleSide };
89
267
  var createUniforms = () => ({
90
- cellSize: uniform2(0.5),
91
- cellThickness: uniform2(0.5),
92
- cellColor: uniform2(new Color),
93
- sectionSize: uniform2(1),
94
- sectionThickness: uniform2(1),
95
- sectionColor: uniform2(new Color),
96
- fadeDistance: uniform2(100),
97
- fadeStrength: uniform2(1),
98
- fadeFrom: uniform2(1),
99
- infinite: uniform2(0),
100
- followCamera: uniform2(0),
101
- cameraOnPlane: uniform2(new Vector3),
102
- planeOrigin: uniform2(new Vector3)
268
+ cellSize: uniform3(0.5),
269
+ cellThickness: uniform3(0.5),
270
+ cellColor: uniform3(new Color),
271
+ sectionSize: uniform3(1),
272
+ sectionThickness: uniform3(1),
273
+ sectionColor: uniform3(new Color),
274
+ fadeDistance: uniform3(100),
275
+ fadeStrength: uniform3(1),
276
+ fadeFrom: uniform3(1),
277
+ infinite: uniform3(0),
278
+ followCamera: uniform3(0),
279
+ cameraOnPlane: uniform3(new Vector3),
280
+ planeOrigin: uniform3(new Vector3)
103
281
  });
104
282
  var gridMaterial = (u) => {
105
283
  const material = new MeshBasicNodeMaterial2({ transparent: true });
106
284
  const lifted = positionGeometry.xzy.mul(select(u.infinite.greaterThan(0.5), u.fadeDistance.add(1), 1));
107
- const shift = modelWorldMatrixInverse.mul(vec4(u.cameraOnPlane.sub(u.planeOrigin), 0)).xyz;
285
+ const shift = modelWorldMatrixInverse.mul(vec42(u.cameraOnPlane.sub(u.planeOrigin), 0)).xyz;
108
286
  const local = select(u.followCamera.greaterThan(0.5), lifted.add(shift), lifted);
109
287
  material.positionNode = local;
110
288
  const gridPosition = varying(local);
111
- const worldPosition = varying(modelWorldMatrix.mul(vec4(local, 1)).xyz);
289
+ const worldPosition = varying(modelWorldMatrix2.mul(vec42(local, 1)).xyz);
112
290
  const lines = (spacing, thickness) => {
113
291
  const at = gridPosition.xz.div(spacing);
114
- const away = abs(fract(at.sub(0.5)).sub(0.5)).div(fwidth(at));
115
- return float2(1).sub(min(min(away.x, away.y).add(1).sub(thickness), 1));
292
+ const away = abs(fract(at.sub(0.5)).sub(0.5)).div(fwidth2(at));
293
+ return float3(1).sub(min(min(away.x, away.y).add(1).sub(thickness), 1));
116
294
  };
117
295
  const cell = lines(u.cellSize, u.cellThickness);
118
296
  const section = lines(u.sectionSize, u.sectionThickness);
119
- const away = distance(u.cameraOnPlane.mul(u.fadeFrom), worldPosition);
120
- const fade = pow(float2(1).sub(min(away.div(u.fadeDistance), 1)), u.fadeStrength);
297
+ const away = distance2(u.cameraOnPlane.mul(u.fadeFrom), worldPosition);
298
+ const fade = pow(float3(1).sub(min(away.div(u.fadeDistance), 1)), u.fadeStrength);
121
299
  const alpha = cell.add(section).mul(fade);
122
300
  material.colorNode = mix(u.cellColor, u.sectionColor, min(1, u.sectionThickness.mul(section)));
123
301
  material.opacityNode = mix(alpha.mul(0.75), alpha, section);
@@ -206,11 +384,13 @@ var webgpuKit = {
206
384
  shading: "tsl",
207
385
  sky: hostSky,
208
386
  shaderGrid: hostShaderGrid,
387
+ line: hostLine,
388
+ points: hostPoints,
209
389
  contactShadows: createContactShadows
210
390
  };
211
391
  export {
212
392
  webgpuKit
213
393
  };
214
394
 
215
- //# debugId=3D261B4594F0512A64756E2164756E21
395
+ //# debugId=D5FD3231EBAF40FE64756E2164756E21
216
396
  //# sourceMappingURL=index.js.map
@@ -1,13 +1,15 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../src/webgpu/contactShadows.ts", "../src/webgpu/shaderGrid.ts", "../src/webgpu/sky.ts", "../src/webgpu/index.ts"],
3
+ "sources": ["../src/webgpu/contactShadows.ts", "../src/webgpu/line.ts", "../src/webgpu/points.ts", "../src/webgpu/shaderGrid.ts", "../src/webgpu/sky.ts", "../src/webgpu/index.ts"],
4
4
  "sourcesContent": [
5
5
  "/**\n * The WebGPU kit's contact shadow materials, in TSL: the WebGL kit's shadow-from-depth\n * output (colour `color · depth · 2`, alpha `1 − depth`) and three's horizontal and\n * vertical blur shaders (nine taps, their weights). The passes themselves are the\n * kernel's.\n *\n * @module\n */\nimport { type Color, NoBlending, Texture } from 'three';\nimport { depth, float, texture, uniform, uv, vec2 } from 'three/tsl';\nimport { MeshBasicNodeMaterial } from 'three/webgpu';\n\nimport {\n type BlurPass,\n createContactShadowPasses,\n type ShadowMaterials,\n} from '../kernel/contactShadowPasses.ts';\nimport type { SceneRenderer } from '../kernel/renderer.ts';\nimport type { ContactShadowPasses, ShadowedScene } from '../kernel/renderKit.ts';\n\n/** A material writing exactly what its nodes say: no blending, depth or tone mapping. */\nconst plainMaterial = (): MeshBasicNodeMaterial => {\n const material = new MeshBasicNodeMaterial();\n material.transparent = true;\n material.blending = NoBlending;\n material.depthTest = false;\n material.depthWrite = false;\n material.toneMapped = false;\n return material;\n};\n\nconst depthMaterial = (color: Color): MeshBasicNodeMaterial => {\n const material = plainMaterial();\n // Darkest where an object touches the plane: `depth` is linear for the orthographic camera.\n material.colorNode = uniform(color).mul(depth).mul(2);\n material.opacityNode = float(1).sub(depth);\n return material;\n};\n\n/** three's `HorizontalBlurShader` and `VerticalBlurShader` taps: offset and weight. */\nconst taps = [\n [-4, 0.051],\n [-3, 0.0918],\n [-2, 0.12245],\n [-1, 0.1531],\n [0, 0.1633],\n [1, 0.1531],\n [2, 0.12245],\n [3, 0.0918],\n [4, 0.051],\n] as const;\n\nconst blur = (direction: 'horizontal' | 'vertical'): BlurPass => {\n const source = texture(new Texture());\n const step = uniform(0);\n const along = direction === 'horizontal' ? vec2(step, 0) : vec2(0, step);\n const [first, ...rest] = taps.map(([offset, weight]) =>\n source.sample(uv().add(along.mul(offset))).mul(weight),\n );\n const sum = rest.reduce((total, tap) => total.add(tap), first ?? source);\n const material = plainMaterial();\n material.colorNode = sum.rgb;\n material.opacityNode = sum.a;\n return {\n material,\n set: (map, amount) => {\n source.value = map;\n step.value = amount;\n },\n };\n};\n\nconst webgpuShadowMaterials: ShadowMaterials = {\n depth: depthMaterial,\n blur,\n flippedTargets: true,\n};\n\n/** Creates the contact shadow passes for one scene graph and renderer, in TSL. */\nexport const createContactShadows = (\n graph: ShadowedScene,\n renderer: SceneRenderer,\n): ContactShadowPasses => createContactShadowPasses(graph, renderer, webgpuShadowMaterials);\n",
6
+ "/**\n * The WebGPU kit's lines: three's fat lines for WebGPU (`Line2`, `LineSegments2` and `Line2NodeMaterial`,\n * the node-material twins of what Drei's `Line` uses), which size themselves to the viewport\n * before each draw.\n *\n * @module\n */\nimport { Group } from 'three';\nimport { LineGeometry } from 'three/addons/lines/LineGeometry.js';\nimport { LineSegmentsGeometry } from 'three/addons/lines/LineSegmentsGeometry.js';\nimport { Line2 } from 'three/addons/lines/webgpu/Line2.js';\nimport { LineSegments2 } from 'three/addons/lines/webgpu/LineSegments2.js';\nimport { Line2NodeMaterial } from 'three/webgpu';\n\nimport type { LineNode } from '../kernel/description.ts';\nimport { drawable, fillLineGeometry } from '../kernel/lineGeometry.ts';\nimport type { HostedLine } from '../kernel/renderKit.ts';\n\n/** The material's look from the description; vertex colours want white, as Drei sets. */\nconst style = (material: Line2NodeMaterial, line: LineNode): void => {\n material.color.setHex(line.vertexColors === null ? line.color : 0xffffff);\n if (material.vertexColors !== (line.vertexColors !== null)) {\n material.vertexColors = line.vertexColors !== null;\n material.needsUpdate = true;\n }\n material.linewidth = line.width;\n material.worldUnits = line.worldUnits;\n material.dashed = line.dashed;\n material.dashSize = line.dashSize;\n material.gapSize = line.gapSize;\n // The node material reads the dash scale as `scale`, as `LineDashedMaterial` names it.\n material.scale = line.dashScale;\n material.dashOffset = line.dashOffset;\n material.opacity = line.opacity;\n material.transparent = line.transparent;\n};\n\nconst draw = (line: LineNode, material: Line2NodeMaterial): LineSegments2 => {\n const drawn = line.segments\n ? new LineSegments2(fillLineGeometry(new LineSegmentsGeometry(), line), material)\n : new Line2(fillLineGeometry(new LineGeometry(), line), material);\n drawn.computeLineDistances();\n drawn.visible = drawable(line);\n return drawn;\n};\n\nexport const hostLine = (first: LineNode): HostedLine => {\n const object = new Group();\n const material = new Line2NodeMaterial();\n style(material, first);\n let drawn = draw(first, material);\n object.add(drawn);\n return {\n object,\n update: (next) => {\n style(material, next);\n drawn.removeFromParent();\n drawn.geometry.dispose();\n drawn = draw(next, material);\n object.add(drawn);\n },\n dispose: () => {\n drawn.geometry.dispose();\n material.dispose();\n },\n };\n};\n",
7
+ "/**\n * The WebGPU kit's points. WebGPU draws point primitives one pixel across, so sized\n * points are instanced sprites with three's `PointsNodeMaterial`, as three's WebGPU\n * examples draw them: a quad a point, `sizeNode` pixels across. Dots, sparkles and stars\n * port the WebGL kit's shaders (Drei's, `bf6f4ad`) to TSL, from the same kernel buffers:\n * the sprite's `uv` stands in for `gl_PointCoord`.\n *\n * Sparkles drift in the node's own space here (Drei moves them in world space), which\n * is the same unless the node is rotated or scaled.\n *\n * @module\n */\nimport { AdditiveBlending, Group, InstancedBufferAttribute } from 'three';\nimport {\n cos,\n distance,\n exp,\n float,\n fwidth,\n instancedBufferAttribute,\n modelWorldMatrix,\n positionView,\n sin,\n smoothstep,\n uniform,\n uv,\n vec2,\n vec3,\n vec4,\n} from 'three/tsl';\nimport { PointsNodeMaterial, Sprite } from 'three/webgpu';\n\nimport type { PointLook, PointsNode } from '../kernel/description.ts';\nimport { type PointBuffers, pointBuffers } from '../kernel/pointBuffers.ts';\nimport type { HostedPoints } from '../kernel/renderKit.ts';\n\n/** Scene time for sparkles and stars, a uniform the host sets each frame. */\nconst createTime = () => uniform(0);\ntype Time = ReturnType<typeof createTime>;\n\nconst vec3Attribute = (array: Float32Array) =>\n instancedBufferAttribute<'vec3'>(new InstancedBufferAttribute(array, 3), 'vec3');\nconst floatAttribute = (array: Float32Array) =>\n instancedBufferAttribute<'float'>(new InstancedBufferAttribute(array, 1), 'float');\n\ntype Attributes = {\n readonly position: ReturnType<typeof vec3Attribute>;\n readonly color: ReturnType<typeof vec3Attribute>;\n readonly size: ReturnType<typeof floatAttribute>;\n};\n\nconst attributes = (buffers: PointBuffers): Attributes => ({\n position: vec3Attribute(buffers.positions),\n color: vec3Attribute(buffers.colors),\n size: floatAttribute(buffers.sizes),\n});\n\n/** Where the sprite's fragment is across its point: `gl_PointCoord`. */\nconst pointCoord = uv();\n\n/** Dots: Drei's `PointMaterial`, round by its mask, a size factor a point. */\nconst dotsMaterial = (\n look: Extract<PointLook, { readonly _tag: 'Dots' }>,\n given: Attributes,\n): PointsNodeMaterial => {\n const material = new PointsNodeMaterial({\n transparent: look.transparent,\n sizeAttenuation: look.sizeAttenuation,\n });\n material.positionNode = given.position;\n material.colorNode = vec4(given.color, 1);\n material.sizeNode = given.size.mul(look.size);\n const cxy = pointCoord.mul(2).sub(1);\n const r = cxy.dot(cxy);\n const delta = fwidth(r);\n const mask = float(1).sub(smoothstep(float(1).sub(delta), delta.add(1), r));\n material.opacityNode = look.round ? mask.mul(look.opacity) : float(look.opacity);\n // Corners left out entirely, opaque or not.\n material.alphaTestNode = float(0.01);\n return material;\n};\n\n/** Drei's sparkles: motes swaying about their places, glowing from their middles. */\nconst sparklesMaterial = (\n buffers: PointBuffers,\n given: Attributes,\n time: Time,\n): PointsNodeMaterial => {\n const speed = floatAttribute(buffers.speeds);\n const opacity = floatAttribute(buffers.opacities);\n const noise = vec3Attribute(buffers.noise);\n const material = new PointsNodeMaterial({\n transparent: true,\n depthWrite: false,\n sizeAttenuation: false,\n });\n const worldX = modelWorldMatrix.mul(vec4(given.position, 1)).x;\n const phase = time.mul(speed);\n material.positionNode = given.position.add(\n vec3(\n cos(phase.add(worldX.mul(noise.z).mul(100))).mul(0.2),\n sin(phase.add(worldX.mul(noise.x).mul(100))).mul(0.2),\n cos(phase.add(worldX.mul(noise.y).mul(100))).mul(0.2),\n ),\n );\n material.colorNode = vec4(given.color, 1);\n // Drei's `size * 25 * pixelRatio / -viewZ`; the material multiplies in the pixel ratio.\n material.sizeNode = given.size.mul(25).div(positionView.z.negate());\n const strength = float(0.05)\n .div(distance(pointCoord, vec2(0.5, 0.5)))\n .sub(0.1);\n material.opacityNode = strength.mul(opacity).clamp(0, 1);\n return material;\n};\n\n/**\n * Drei's stars. Its shader places them at `vec4(position, 0.5)`: the same direction as\n * twice the position at full weight, half as far in clip space, so here they are drawn at\n * twice their positions, and sized by half the view depth.\n */\nconst starsMaterial = (\n look: Extract<PointLook, { readonly _tag: 'Stars' }>,\n given: Attributes,\n time: Time,\n): PointsNodeMaterial => {\n const material = new PointsNodeMaterial({\n transparent: true,\n depthWrite: false,\n blending: AdditiveBlending,\n sizeAttenuation: false,\n });\n material.positionNode = given.position.mul(2);\n material.colorNode = vec4(given.color, 1);\n material.sizeNode = given.size\n .mul(float(30).div(positionView.z.negate().mul(0.5)))\n .mul(sin(time.add(100)).add(3));\n const d = distance(pointCoord, vec2(0.5, 0.5));\n const soft = float(1).div(exp(d.sub(0.25).mul(16)).add(1));\n material.opacityNode = look.fade ? soft : float(1);\n return material;\n};\n\nconst materialFor = (\n look: PointLook,\n buffers: PointBuffers,\n given: Attributes,\n time: Time,\n): PointsNodeMaterial => {\n switch (look._tag) {\n case 'Dots':\n return dotsMaterial(look, given);\n case 'Sparkles':\n return sparklesMaterial(buffers, given, time);\n case 'Stars':\n return starsMaterial(look, given, time);\n }\n};\n\nconst draw = (look: PointLook, time: Time): Sprite => {\n const buffers = pointBuffers(look);\n const material = materialFor(look, buffers, attributes(buffers), time);\n const sprite = new Sprite(material);\n sprite.count = buffers.count;\n sprite.visible = buffers.count > 0;\n sprite.frustumCulled = false;\n return sprite;\n};\n\nexport const hostPoints = (first: PointsNode): HostedPoints => {\n const object = new Group();\n const time = createTime();\n let look = first.look;\n let drawn = draw(look, time);\n object.add(drawn);\n // Sprites share three's one quad geometry: only the material is this node's.\n const free = (): void => {\n drawn.material.dispose();\n };\n return {\n object,\n update: (next) => {\n look = next.look;\n drawn.removeFromParent();\n free();\n drawn = draw(look, time);\n object.add(drawn);\n },\n tick: (seconds) => {\n time.value = look._tag === 'Stars' ? seconds * look.speed : seconds;\n },\n dispose: free,\n };\n};\n",
6
8
  "/**\n * The WebGPU kit's shader grid: the WebGL kit's grid (Drei's `Grid`, `bf6f4ad`, MIT; after\n * Fyrestar's `THREE.InfiniteGridHelper` and threlte's `Grid`) written in TSL, so that\n * three's `WebGPURenderer` can draw it on either backend. Same lines, same fade, same\n * camera uniforms set in `onBeforeRender`.\n *\n * @module\n */\nimport {\n BackSide,\n Color,\n DoubleSide,\n FrontSide,\n Mesh,\n Plane,\n PlaneGeometry,\n type Side,\n Vector3,\n} from 'three';\nimport {\n abs,\n distance,\n float,\n fract,\n fwidth,\n min,\n mix,\n modelWorldMatrix,\n modelWorldMatrixInverse,\n positionGeometry,\n pow,\n select,\n uniform,\n varying,\n vec4,\n} from 'three/tsl';\nimport { MeshBasicNodeMaterial } from 'three/webgpu';\n\nimport type { MaterialSide, ShaderGridNode } from '../kernel/description.ts';\nimport type { HostedShaderGrid } from '../kernel/renderKit.ts';\n\nconst sides = { front: FrontSide, back: BackSide, double: DoubleSide } satisfies Record<\n MaterialSide,\n Side\n>;\n\n/** The grid's uniforms: one node each, written from the description. */\nconst createUniforms = () => ({\n cellSize: uniform(0.5),\n cellThickness: uniform(0.5),\n cellColor: uniform(new Color()),\n sectionSize: uniform(1),\n sectionThickness: uniform(1),\n sectionColor: uniform(new Color()),\n fadeDistance: uniform(100),\n fadeStrength: uniform(1),\n fadeFrom: uniform(1),\n infinite: uniform(0),\n followCamera: uniform(0),\n cameraOnPlane: uniform(new Vector3()),\n planeOrigin: uniform(new Vector3()),\n});\n\ntype Uniforms = ReturnType<typeof createUniforms>;\n\n/** The grid's material: the WebGL kit's vertex and fragment shaders, as TSL nodes. */\nconst gridMaterial = (u: Uniforms): MeshBasicNodeMaterial => {\n const material = new MeshBasicNodeMaterial({ transparent: true });\n // The plane geometry lies in XY; the grid lies in XZ. Infinite grids reach the fade.\n const lifted = positionGeometry.xzy.mul(\n select(u.infinite.greaterThan(0.5), u.fadeDistance.add(1), 1),\n );\n // Following the camera slides the plane by its foot's offset, in the grid's own space.\n const shift = modelWorldMatrixInverse.mul(vec4(u.cameraOnPlane.sub(u.planeOrigin), 0)).xyz;\n const local = select(u.followCamera.greaterThan(0.5), lifted.add(shift), lifted);\n material.positionNode = local;\n const gridPosition = varying(local);\n const worldPosition = varying(modelWorldMatrix.mul(vec4(local, 1)).xyz);\n // 1 on a line of a grid with this spacing, 0 between, antialiased over a pixel.\n const lines = (spacing: typeof u.cellSize, thickness: typeof u.cellThickness) => {\n const at = gridPosition.xz.div(spacing);\n const away = abs(fract(at.sub(0.5)).sub(0.5)).div(fwidth(at));\n return float(1).sub(min(min(away.x, away.y).add(1).sub(thickness), 1));\n };\n const cell = lines(u.cellSize, u.cellThickness);\n const section = lines(u.sectionSize, u.sectionThickness);\n const away = distance(u.cameraOnPlane.mul(u.fadeFrom), worldPosition);\n const fade = pow(float(1).sub(min(away.div(u.fadeDistance), 1)), u.fadeStrength);\n const alpha = cell.add(section).mul(fade);\n material.colorNode = mix(u.cellColor, u.sectionColor, min(1, u.sectionThickness.mul(section)));\n material.opacityNode = mix(alpha.mul(0.75), alpha, section);\n // Discard where there is no line, as the WebGL kit's shader does.\n material.alphaTest = 1e-4;\n return material;\n};\n\n/** Writes a node's settings into the uniforms and material. */\nconst writeUniforms = (\n u: Uniforms,\n material: MeshBasicNodeMaterial,\n node: ShaderGridNode,\n): void => {\n u.cellSize.value = node.cellSize;\n u.cellThickness.value = node.cellThickness;\n u.cellColor.value.setHex(node.cellColor);\n u.sectionSize.value = node.sectionSize;\n u.sectionThickness.value = node.sectionThickness;\n u.sectionColor.value.setHex(node.sectionColor);\n u.fadeDistance.value = node.fadeDistance;\n u.fadeStrength.value = node.fadeStrength;\n u.fadeFrom.value = node.fadeFrom;\n u.infinite.value = node.infinite ? 1 : 0;\n u.followCamera.value = node.followCamera ? 1 : 0;\n material.side = sides[node.side];\n};\n\nconst up = new Vector3(0, 1, 0);\nconst origin = new Vector3();\nconst plane = new Plane();\nconst cameraPosition = new Vector3();\n\n/** The WebGPU kit's shader grid: a plane with the grid material, placed and updated. */\nexport const hostShaderGrid = (node: ShaderGridNode): HostedShaderGrid => {\n const u = createUniforms();\n const material = gridMaterial(u);\n writeUniforms(u, material, node);\n const mesh = new Mesh(new PlaneGeometry(...node.size), material);\n // The shader moves vertices (infinite, following): the plane's own bounds mean nothing.\n mesh.frustumCulled = false;\n const place = (next: ShaderGridNode): void => {\n mesh.position.fromArray(next.position);\n mesh.rotation.fromArray([...next.rotation]);\n };\n place(node);\n mesh.onBeforeRender = (_renderer, _scene, camera) => {\n plane.setFromNormalAndCoplanarPoint(up, origin).applyMatrix4(mesh.matrixWorld);\n plane.projectPoint(\n cameraPosition.setFromMatrixPosition(camera.matrixWorld),\n u.cameraOnPlane.value,\n );\n u.planeOrigin.value.set(0, 0, 0).applyMatrix4(mesh.matrixWorld);\n };\n return {\n object: mesh,\n update: (previous, next) => {\n if (previous.size[0] !== next.size[0] || previous.size[1] !== next.size[1]) {\n mesh.geometry.dispose();\n mesh.geometry = new PlaneGeometry(...next.size);\n }\n writeUniforms(u, material, next);\n place(next);\n },\n dispose: () => {\n mesh.geometry.dispose();\n material.dispose();\n },\n };\n};\n",
7
9
  "/**\n * The WebGPU kit's sky: three.js's `SkyMesh` (`addons/objects/SkyMesh.js` at 0.186.1), the\n * same Preetham sky as the WebGL kit's `Sky`, written in TSL. Never picked.\n *\n * @module\n */\nimport { SkyMesh } from 'three/addons/objects/SkyMesh.js';\n\nimport type { Sky } from '../kernel/description.ts';\nimport type { HostedSky } from '../kernel/renderKit.ts';\n\n/** Writes a sky's description into the mesh's uniforms and scale. */\nconst writeSky = (mesh: SkyMesh, description: Sky): void => {\n mesh.turbidity.value = description.turbidity;\n mesh.rayleigh.value = description.rayleigh;\n mesh.mieCoefficient.value = description.mieCoefficient;\n mesh.mieDirectionalG.value = description.mieDirectionalG;\n mesh.cloudCoverage.value = description.clouds;\n mesh.sunPosition.value.fromArray(description.sunPosition);\n mesh.scale.setScalar(description.distance);\n};\n\n/** Creates the sky mesh; the scene graph adds it and writes its description. */\nexport const hostSky = (): HostedSky => {\n const mesh = new SkyMesh();\n mesh.raycast = () => undefined;\n return {\n object: mesh,\n update: (description) => writeSky(mesh, description),\n dispose: () => {\n mesh.geometry.dispose();\n mesh.material.dispose();\n },\n };\n};\n",
8
- "/**\n * The WebGPU render kit: the scene's shaded parts (the sky, the shader grid, contact\n * shadows) written in TSL, for three.js's `WebGPURenderer` on either of its backends.\n * The Foldkit adapter's `webgpuRendererFactory` carries it.\n *\n * @module\n */\nimport type { RenderKit } from '../kernel/renderKit.ts';\nimport { createContactShadows } from './contactShadows.ts';\nimport { hostShaderGrid } from './shaderGrid.ts';\nimport { hostSky } from './sky.ts';\n\nexport const webgpuKit: RenderKit = {\n // Node materials: label engines draw with their TSL implementation (`createTsl`).\n shading: 'tsl',\n sky: hostSky,\n shaderGrid: hostShaderGrid,\n contactShadows: createContactShadows,\n};\n"
10
+ "/**\n * The WebGPU render kit: the scene's shaded parts (the sky, the shader grid, contact\n * shadows) written in TSL, for three.js's `WebGPURenderer` on either of its backends.\n * The Foldkit adapter's `webgpuRendererFactory` carries it.\n *\n * @module\n */\nimport type { RenderKit } from '../kernel/renderKit.ts';\nimport { createContactShadows } from './contactShadows.ts';\nimport { hostLine } from './line.ts';\nimport { hostPoints } from './points.ts';\nimport { hostShaderGrid } from './shaderGrid.ts';\nimport { hostSky } from './sky.ts';\n\nexport const webgpuKit: RenderKit = {\n // Node materials: label engines draw with their TSL implementation (`createTsl`).\n shading: 'tsl',\n sky: hostSky,\n shaderGrid: hostShaderGrid,\n line: hostLine,\n points: hostPoints,\n contactShadows: createContactShadows,\n};\n"
9
11
  ],
10
- "mappings": "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",
11
- "debugId": "3D261B4594F0512A64756E2164756E21",
12
+ "mappings": "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",
13
+ "debugId": "D5FD3231EBAF40FE64756E2164756E21",
12
14
  "names": []
13
15
  }
@@ -0,0 +1,4 @@
1
+ import type { LineNode } from '../kernel/description.ts';
2
+ import type { HostedLine } from '../kernel/renderKit.ts';
3
+ export declare const hostLine: (first: LineNode) => HostedLine;
4
+ //# sourceMappingURL=line.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"line.d.ts","sourceRoot":"","sources":["../../src/webgpu/line.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AAEzD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AA8BzD,eAAO,MAAM,QAAQ,UAAW,QAAQ,KAAG,UAoB1C,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { PointsNode } from '../kernel/description.ts';
2
+ import type { HostedPoints } from '../kernel/renderKit.ts';
3
+ export declare const hostPoints: (first: PointsNode) => HostedPoints;
4
+ //# sourceMappingURL=points.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"points.d.ts","sourceRoot":"","sources":["../../src/webgpu/points.ts"],"names":[],"mappings":"AAgCA,OAAO,KAAK,EAAa,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAEtE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAsI3D,eAAO,MAAM,UAAU,UAAW,UAAU,KAAG,YAwB9C,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@opsydyn/effect-three",
3
- "version": "0.2.0",
3
+ "version": "0.4.0",
4
4
  "description": "Effect-native declarative Three.js scenes: scoped resources, keyed reconciliation, testable frame loop.",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -54,6 +54,7 @@
54
54
  "check": "bun run lint && bun run check:boundaries && bun run check:single-effect",
55
55
  "test": "bun test --pass-with-no-tests ./src ./test --coverage --coverage-reporter=lcov --coverage-dir=coverage && bun scripts/check-coverage.ts coverage/lcov.info",
56
56
  "build": "tsc -b && bun build ./src/index.ts ./src/kernel/index.ts ./src/webgl/index.ts ./src/webgpu/index.ts --root ./src --outdir ./dist --target browser --packages external --splitting --sourcemap=linked",
57
+ "scene:diff": "bun scripts/scene-diff.ts",
57
58
  "bench": "bun bench/index.ts",
58
59
  "bench:check": "bun bench/index.ts --check",
59
60
  "api:report": "api-extractor run --local",
@@ -21,6 +21,11 @@ export const writeRotation = (target: Euler, rotation: Rotation, elapsedSeconds:
21
21
  target.set(rotation.euler[0], rotation.euler[1], rotation.euler[2]);
22
22
  return;
23
23
  }
24
+ // The scene graph turns a billboard towards the camera each frame; until then, none.
25
+ if (rotation._tag === 'Billboard') {
26
+ target.set(0, 0, 0);
27
+ return;
28
+ }
24
29
  const angle = spinAngle(rotation, elapsedSeconds);
25
30
  switch (rotation.axis) {
26
31
  case 'x':
@@ -87,7 +87,7 @@ const scaleText = (from: Matrix4): string =>
87
87
  .join(',');
88
88
 
89
89
  const rotationText = (rotation: Rotation): string =>
90
- rotation._tag === 'Fixed' ? rotation.euler.join(',') : 'spin';
90
+ rotation._tag === 'Fixed' ? rotation.euler.join(',') : rotation._tag;
91
91
 
92
92
  /** A world pose written to an object in its parent's space, keeping its scale. */
93
93
  export const placeObject = (object: Object3D, pose: BodyPose): void => {
@@ -0,0 +1,73 @@
1
+ /**
2
+ * Box selection as data, after three.js's `SelectionBox` (0.186.1,
3
+ * `examples/jsm/interactive/SelectionBox.js`), which Drei's `Select` wraps. three's box
4
+ * walks the scene for meshes whose centres fall inside the frustum a rectangle on screen
5
+ * cuts from the camera; here the Model names the candidates and their centres, and
6
+ * `boxSelect` returns the keys inside, so a selection is a value the Model keeps.
7
+ *
8
+ * A point is inside when it projects into the rectangle, as three's side planes have it,
9
+ * and lies between the camera's near and far planes: what the camera can show. (three's
10
+ * perspective box reaches past far, and its orthographic box neither stops at far nor
11
+ * starts at near, `0.186.1`; a box here never selects what cannot be seen.)
12
+ *
13
+ * @module
14
+ */
15
+ import { OrthographicCamera, PerspectiveCamera, Vector3 } from 'three';
16
+
17
+ import type { Camera, Vec3 } from './description.ts';
18
+
19
+ /** A corner of the box, in the canvas's normalised coordinates: −1 to 1, y up. */
20
+ export type BoxCorner = { readonly x: number; readonly y: number };
21
+
22
+ /** Something that can be selected: its key, and the point that must fall in the box. */
23
+ export type Selectable = { readonly key: string; readonly at: Vec3 };
24
+
25
+ /** The canvas's size in CSS pixels, which sets the camera's aspect (or ortho frustum). */
26
+ export type CanvasSize = { readonly width: number; readonly height: number };
27
+
28
+ /** The three.js camera the description renders through, fitted to `size`. */
29
+ const hostCamera = (camera: Camera, size: CanvasSize): PerspectiveCamera | OrthographicCamera => {
30
+ const host =
31
+ camera._tag === 'Perspective'
32
+ ? new PerspectiveCamera(camera.fov, size.width / size.height, camera.near, camera.far)
33
+ : new OrthographicCamera(
34
+ size.width / -2,
35
+ size.width / 2,
36
+ size.height / 2,
37
+ size.height / -2,
38
+ camera.near,
39
+ camera.far,
40
+ );
41
+ if (host instanceof OrthographicCamera && camera._tag === 'Orthographic') {
42
+ host.zoom = camera.zoom;
43
+ }
44
+ host.position.set(...camera.position);
45
+ host.lookAt(...camera.lookAt);
46
+ host.updateMatrixWorld();
47
+ host.updateProjectionMatrix();
48
+ return host;
49
+ };
50
+
51
+ const between = (value: number, a: number, b: number): boolean =>
52
+ value >= Math.min(a, b) && value <= Math.max(a, b);
53
+
54
+ /**
55
+ * The keys of `candidates` whose points fall inside the box from corner `from` to corner
56
+ * `to`, seen through `camera` on a canvas of `size`, in the order given.
57
+ */
58
+ export const boxSelect = (
59
+ camera: Camera,
60
+ size: CanvasSize,
61
+ from: BoxCorner,
62
+ to: BoxCorner,
63
+ candidates: ReadonlyArray<Selectable>,
64
+ ): ReadonlyArray<string> => {
65
+ const host = hostCamera(camera, size);
66
+ // Projected, a point between near and far has a depth from −1 to 1; one behind the
67
+ // camera, above 1.
68
+ const inside = (candidate: Selectable): boolean => {
69
+ const seen = new Vector3(...candidate.at).project(host);
70
+ return between(seen.x, from.x, to.x) && between(seen.y, from.y, to.y) && between(seen.z, -1, 1);
71
+ };
72
+ return candidates.filter(inside).map((candidate) => candidate.key);
73
+ };