@opsydyn/effect-three 0.3.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.
- package/CHANGELOG.md +15 -0
- package/README.md +12 -0
- package/dist/{index-8cf8t6by.js → index-h3vf50fn.js} +2113 -83
- package/dist/index-h3vf50fn.js.map +53 -0
- package/dist/index-ttwy0znv.js +145 -0
- package/dist/index-ttwy0znv.js.map +12 -0
- package/dist/index.js +488 -147
- package/dist/index.js.map +8 -6
- package/dist/kernel/boxSelect.d.ts +22 -0
- package/dist/kernel/boxSelect.d.ts.map +1 -0
- package/dist/kernel/build.d.ts +142 -6
- package/dist/kernel/build.d.ts.map +1 -1
- package/dist/kernel/cameraShake.d.ts.map +1 -1
- package/dist/kernel/describeScene.d.ts +50 -0
- package/dist/kernel/describeScene.d.ts.map +1 -0
- package/dist/kernel/description.d.ts +155 -1
- package/dist/kernel/description.d.ts.map +1 -1
- package/dist/kernel/diff.d.ts +15 -0
- package/dist/kernel/diff.d.ts.map +1 -1
- package/dist/kernel/equality.d.ts +9 -1
- package/dist/kernel/equality.d.ts.map +1 -1
- package/dist/kernel/gizmo.d.ts +69 -0
- package/dist/kernel/gizmo.d.ts.map +1 -0
- package/dist/kernel/history.d.ts +61 -0
- package/dist/kernel/history.d.ts.map +1 -0
- package/dist/kernel/index.d.ts +13 -2
- package/dist/kernel/index.d.ts.map +1 -1
- package/dist/kernel/index.js +106 -3
- package/dist/kernel/index.js.map +1 -1
- package/dist/kernel/inspect.d.ts +85 -0
- package/dist/kernel/inspect.d.ts.map +1 -0
- package/dist/kernel/lineGeometry.d.ts +25 -0
- package/dist/kernel/lineGeometry.d.ts.map +1 -0
- package/dist/kernel/lockstep.d.ts +114 -0
- package/dist/kernel/lockstep.d.ts.map +1 -0
- package/dist/kernel/loop.d.ts.map +1 -1
- package/dist/kernel/materials.d.ts.map +1 -1
- package/dist/kernel/pivot.d.ts +54 -0
- package/dist/kernel/pivot.d.ts.map +1 -0
- package/dist/kernel/pointBuffers.d.ts +17 -0
- package/dist/kernel/pointBuffers.d.ts.map +1 -0
- package/dist/kernel/pointer.d.ts +12 -0
- package/dist/kernel/pointer.d.ts.map +1 -1
- package/dist/kernel/renderKit.d.ts +21 -1
- package/dist/kernel/renderKit.d.ts.map +1 -1
- package/dist/kernel/renderer.d.ts +6 -0
- package/dist/kernel/renderer.d.ts.map +1 -1
- package/dist/kernel/sceneChanges.d.ts +87 -0
- package/dist/kernel/sceneChanges.d.ts.map +1 -0
- package/dist/kernel/sceneGraph.d.ts +6 -0
- package/dist/kernel/sceneGraph.d.ts.map +1 -1
- package/dist/kernel/seeded.d.ts +9 -0
- package/dist/kernel/seeded.d.ts.map +1 -0
- package/dist/kernel/shots.d.ts +26 -0
- package/dist/kernel/shots.d.ts.map +1 -0
- package/dist/kernel/tape.d.ts +38 -0
- package/dist/kernel/tape.d.ts.map +1 -0
- package/dist/kernel/trail.d.ts +31 -0
- package/dist/kernel/trail.d.ts.map +1 -0
- package/dist/kernel/viewportGizmo.d.ts +25 -0
- package/dist/kernel/viewportGizmo.d.ts.map +1 -0
- package/dist/runtime/Inspector.d.ts +20 -0
- package/dist/runtime/Inspector.d.ts.map +1 -0
- package/dist/runtime/SceneFile.d.ts +448 -0
- package/dist/runtime/SceneFile.d.ts.map +1 -0
- package/dist/runtime/SceneSchema.d.ts +318 -0
- package/dist/runtime/SceneSchema.d.ts.map +1 -1
- package/dist/runtime/errors.d.ts +9 -0
- package/dist/runtime/errors.d.ts.map +1 -1
- package/dist/runtime/index.d.ts +3 -1
- package/dist/runtime/index.d.ts.map +1 -1
- package/dist/webgl/index.d.ts.map +1 -1
- package/dist/webgl/index.js +228 -3
- package/dist/webgl/index.js.map +6 -4
- package/dist/webgl/line.d.ts +4 -0
- package/dist/webgl/line.d.ts.map +1 -0
- package/dist/webgl/points.d.ts +4 -0
- package/dist/webgl/points.d.ts.map +1 -0
- package/dist/webgpu/index.d.ts.map +1 -1
- package/dist/webgpu/index.js +206 -26
- package/dist/webgpu/index.js.map +6 -4
- package/dist/webgpu/line.d.ts +4 -0
- package/dist/webgpu/line.d.ts.map +1 -0
- package/dist/webgpu/points.d.ts +4 -0
- package/dist/webgpu/points.d.ts.map +1 -0
- package/package.json +2 -1
- package/src/kernel/boxSelect.ts +73 -0
- package/src/kernel/build.ts +332 -0
- package/src/kernel/cameraShake.ts +3 -13
- package/src/kernel/describeScene.ts +224 -0
- package/src/kernel/description.ts +175 -0
- package/src/kernel/diff.ts +39 -0
- package/src/kernel/equality.ts +101 -0
- package/src/kernel/gizmo.ts +478 -0
- package/src/kernel/history.ts +118 -0
- package/src/kernel/index.ts +97 -0
- package/src/kernel/inspect.ts +214 -0
- package/src/kernel/lineGeometry.ts +75 -0
- package/src/kernel/lockstep.ts +237 -0
- package/src/kernel/loop.ts +5 -0
- package/src/kernel/materials.ts +3 -0
- package/src/kernel/pivot.ts +418 -0
- package/src/kernel/pointBuffers.ts +115 -0
- package/src/kernel/pointer.ts +55 -12
- package/src/kernel/renderKit.ts +23 -1
- package/src/kernel/renderer.ts +6 -0
- package/src/kernel/sceneChanges.ts +265 -0
- package/src/kernel/sceneGraph.ts +319 -8
- package/src/kernel/seeded.ts +18 -0
- package/src/kernel/shots.ts +167 -0
- package/src/kernel/tape.ts +124 -0
- package/src/kernel/trail.ts +170 -0
- package/src/kernel/viewportGizmo.ts +194 -0
- package/src/runtime/Inspector.ts +43 -0
- package/src/runtime/SceneFile.ts +46 -0
- package/src/runtime/SceneSchema.ts +247 -0
- package/src/runtime/errors.ts +6 -0
- package/src/runtime/index.ts +3 -1
- package/src/webgl/index.ts +4 -0
- package/src/webgl/line.ts +66 -0
- package/src/webgl/points.ts +205 -0
- package/src/webgpu/index.ts +4 -0
- package/src/webgpu/line.ts +67 -0
- package/src/webgpu/points.ts +193 -0
- package/dist/index-8cf8t6by.js.map +0 -41
package/dist/webgpu/index.js
CHANGED
|
@@ -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
|
|
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
|
|
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:
|
|
91
|
-
cellThickness:
|
|
92
|
-
cellColor:
|
|
93
|
-
sectionSize:
|
|
94
|
-
sectionThickness:
|
|
95
|
-
sectionColor:
|
|
96
|
-
fadeDistance:
|
|
97
|
-
fadeStrength:
|
|
98
|
-
fadeFrom:
|
|
99
|
-
infinite:
|
|
100
|
-
followCamera:
|
|
101
|
-
cameraOnPlane:
|
|
102
|
-
planeOrigin:
|
|
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(
|
|
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(
|
|
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(
|
|
115
|
-
return
|
|
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 =
|
|
120
|
-
const fade = pow(
|
|
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=
|
|
395
|
+
//# debugId=D5FD3231EBAF40FE64756E2164756E21
|
|
216
396
|
//# sourceMappingURL=index.js.map
|
package/dist/webgpu/index.js.map
CHANGED
|
@@ -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": "
|
|
12
|
+
"mappings": "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",
|
|
13
|
+
"debugId": "D5FD3231EBAF40FE64756E2164756E21",
|
|
12
14
|
"names": []
|
|
13
15
|
}
|
|
@@ -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 @@
|
|
|
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.
|
|
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",
|
|
@@ -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
|
+
};
|