@opsydyn/effect-three-foldkit 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.
- package/CHANGELOG.md +18 -1
- package/README.md +2 -1
- package/dist/boxSelect.d.ts +150 -0
- package/dist/boxSelect.d.ts.map +1 -0
- package/dist/dom/webgl.d.ts.map +1 -1
- package/dist/dom/webgpu.d.ts.map +1 -1
- package/dist/element.d.ts +104 -2
- package/dist/element.d.ts.map +1 -1
- package/dist/index.d.ts +7 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +535 -32
- package/dist/index.js.map +13 -7
- package/dist/inspector.d.ts +24 -0
- package/dist/inspector.d.ts.map +1 -0
- package/dist/measuringTape.d.ts +76 -0
- package/dist/measuringTape.d.ts.map +1 -0
- package/dist/pivotControls.d.ts +106 -0
- package/dist/pivotControls.d.ts.map +1 -0
- package/dist/transformGizmo.d.ts +158 -0
- package/dist/transformGizmo.d.ts.map +1 -0
- package/dist/view.d.ts +7 -0
- package/dist/view.d.ts.map +1 -1
- package/dist/viewportGizmo.d.ts +146 -0
- package/dist/viewportGizmo.d.ts.map +1 -0
- package/package.json +2 -2
- package/src/boxSelect.ts +158 -0
- package/src/dom/webgl.ts +15 -0
- package/src/dom/webgpu.ts +15 -0
- package/src/element.ts +2 -0
- package/src/index.ts +7 -0
- package/src/inspector.ts +112 -0
- package/src/measuringTape.ts +124 -0
- package/src/pivotControls.ts +118 -0
- package/src/transformGizmo.ts +131 -0
- package/src/view.ts +9 -0
- package/src/viewportGizmo.ts +119 -0
package/dist/index.js
CHANGED
|
@@ -1,3 +1,86 @@
|
|
|
1
|
+
var __defProp = Object.defineProperty;
|
|
2
|
+
var __returnValue = (v) => v;
|
|
3
|
+
function __exportSetter(name, newValue) {
|
|
4
|
+
this[name] = __returnValue.bind(null, newValue);
|
|
5
|
+
}
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, {
|
|
9
|
+
get: all[name],
|
|
10
|
+
enumerable: true,
|
|
11
|
+
configurable: true,
|
|
12
|
+
set: __exportSetter.bind(all, name)
|
|
13
|
+
});
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
// src/boxSelect.ts
|
|
17
|
+
var exports_boxSelect = {};
|
|
18
|
+
__export(exports_boxSelect, {
|
|
19
|
+
Box: () => Box,
|
|
20
|
+
Message: () => Message,
|
|
21
|
+
Model: () => Model,
|
|
22
|
+
OutMessage: () => OutMessage,
|
|
23
|
+
claims: () => claims,
|
|
24
|
+
dragOf: () => dragOf,
|
|
25
|
+
drawing: () => drawing2,
|
|
26
|
+
init: () => init,
|
|
27
|
+
inside: () => inside,
|
|
28
|
+
rectangle: () => rectangle,
|
|
29
|
+
update: () => update
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
// src/measuringTape.ts
|
|
33
|
+
var exports_measuringTape = {};
|
|
34
|
+
__export(exports_measuringTape, {
|
|
35
|
+
Message: () => Message2,
|
|
36
|
+
Model: () => Model2,
|
|
37
|
+
OutMessage: () => OutMessage2,
|
|
38
|
+
init: () => init2,
|
|
39
|
+
label: () => label,
|
|
40
|
+
length: () => length,
|
|
41
|
+
nodes: () => nodes,
|
|
42
|
+
update: () => update2
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
// src/pivotControls.ts
|
|
46
|
+
var exports_pivotControls = {};
|
|
47
|
+
__export(exports_pivotControls, {
|
|
48
|
+
Message: () => Message3,
|
|
49
|
+
Model: () => Model3,
|
|
50
|
+
OutMessage: () => OutMessage3,
|
|
51
|
+
handleOf: () => handleOf,
|
|
52
|
+
held: () => held,
|
|
53
|
+
init: () => init3,
|
|
54
|
+
nodes: () => nodes2,
|
|
55
|
+
update: () => update3
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
// src/transformGizmo.ts
|
|
59
|
+
var exports_transformGizmo = {};
|
|
60
|
+
__export(exports_transformGizmo, {
|
|
61
|
+
Message: () => Message4,
|
|
62
|
+
Model: () => Model4,
|
|
63
|
+
OutMessage: () => OutMessage4,
|
|
64
|
+
handleOf: () => handleOf2,
|
|
65
|
+
held: () => held2,
|
|
66
|
+
init: () => init4,
|
|
67
|
+
nodes: () => nodes3,
|
|
68
|
+
update: () => update4
|
|
69
|
+
});
|
|
70
|
+
|
|
71
|
+
// src/viewportGizmo.ts
|
|
72
|
+
var exports_viewportGizmo = {};
|
|
73
|
+
__export(exports_viewportGizmo, {
|
|
74
|
+
Message: () => Message5,
|
|
75
|
+
Model: () => Model5,
|
|
76
|
+
OutMessage: () => OutMessage5,
|
|
77
|
+
axisOf: () => axisOf,
|
|
78
|
+
hud: () => hud,
|
|
79
|
+
init: () => init5,
|
|
80
|
+
nodes: () => nodes4,
|
|
81
|
+
update: () => update5
|
|
82
|
+
});
|
|
83
|
+
|
|
1
84
|
// src/assets.ts
|
|
2
85
|
import { Data, Effect } from "effect";
|
|
3
86
|
import {
|
|
@@ -556,6 +639,21 @@ var webglRendererFactory = (canvas, options = {}) => ({
|
|
|
556
639
|
scissored = true;
|
|
557
640
|
renderer.render(scene, camera);
|
|
558
641
|
},
|
|
642
|
+
renderOver: (scene, camera) => {
|
|
643
|
+
if (renderer.xr.isPresenting)
|
|
644
|
+
return;
|
|
645
|
+
if (scissored) {
|
|
646
|
+
const { width, height } = renderer.getSize(drawingSize);
|
|
647
|
+
renderer.setScissorTest(false);
|
|
648
|
+
renderer.setViewport(0, 0, width, height);
|
|
649
|
+
scissored = false;
|
|
650
|
+
}
|
|
651
|
+
const autoClear = renderer.autoClear;
|
|
652
|
+
renderer.autoClear = false;
|
|
653
|
+
renderer.clearDepth();
|
|
654
|
+
renderer.render(scene, camera);
|
|
655
|
+
renderer.autoClear = autoClear;
|
|
656
|
+
},
|
|
559
657
|
createTarget: (width, height) => createTarget(targets, width, height),
|
|
560
658
|
createEnvironment: () => createRoom(renderer),
|
|
561
659
|
configure: (settings) => {
|
|
@@ -783,6 +881,21 @@ var webgpuRendererFactory = (canvas, options = {}) => ({
|
|
|
783
881
|
scissored = true;
|
|
784
882
|
renderer.render(scene, camera);
|
|
785
883
|
},
|
|
884
|
+
renderOver: (scene, camera) => {
|
|
885
|
+
if (renderer.xr.isPresenting)
|
|
886
|
+
return;
|
|
887
|
+
if (scissored) {
|
|
888
|
+
const { width, height } = renderer.getSize(drawingSize2);
|
|
889
|
+
renderer.setScissorTest(false);
|
|
890
|
+
renderer.setViewport(0, 0, width, height);
|
|
891
|
+
scissored = false;
|
|
892
|
+
}
|
|
893
|
+
const autoClear = renderer.autoClear;
|
|
894
|
+
renderer.autoClear = false;
|
|
895
|
+
renderer.clearDepth();
|
|
896
|
+
renderer.render(scene, camera);
|
|
897
|
+
renderer.autoClear = autoClear;
|
|
898
|
+
},
|
|
786
899
|
createTarget: (width, height) => createTarget2(targets, width, height),
|
|
787
900
|
createEnvironment: () => createRoom2(renderer),
|
|
788
901
|
configure: (settings) => {
|
|
@@ -852,6 +965,7 @@ var sceneElement = CustomElement.define({
|
|
|
852
965
|
"scene-drag": SceneSchema.DragDetail,
|
|
853
966
|
"scene-drag-end": SceneSchema.DragDetail,
|
|
854
967
|
"scene-gesture": SceneSchema.GestureDetail,
|
|
968
|
+
"scene-gesture-end": SceneSchema.GestureEndDetail,
|
|
855
969
|
"scene-auto-rotated": SceneSchema.AutoRotatedDetail,
|
|
856
970
|
"scene-collision": SceneSchema.CollisionDetail,
|
|
857
971
|
"scene-contact-force": SceneSchema.ContactForceDetail,
|
|
@@ -883,6 +997,7 @@ var domEventName = {
|
|
|
883
997
|
Drag: "scene-drag",
|
|
884
998
|
DragEnd: "scene-drag-end",
|
|
885
999
|
Gesture: "scene-gesture",
|
|
1000
|
+
GestureEnd: "scene-gesture-end",
|
|
886
1001
|
AutoRotated: "scene-auto-rotated",
|
|
887
1002
|
Collision: "scene-collision",
|
|
888
1003
|
ContactForce: "scene-contact-force",
|
|
@@ -1633,6 +1748,52 @@ var makeEnvironment = (host, options = {}) => {
|
|
|
1633
1748
|
}
|
|
1634
1749
|
};
|
|
1635
1750
|
};
|
|
1751
|
+
// src/inspector.ts
|
|
1752
|
+
var axisNames = ["x", "y", "z"];
|
|
1753
|
+
var nameOf = (field) => field.path.filter((part) => typeof part === "string").join(" ") || field.label;
|
|
1754
|
+
var hex = (colour) => `#${colour.toString(16).padStart(6, "0")}`;
|
|
1755
|
+
var numberInput = (h, label, value, report) => h.input([
|
|
1756
|
+
h.Type("number"),
|
|
1757
|
+
h.Step("any"),
|
|
1758
|
+
h.Value(String(value)),
|
|
1759
|
+
h.AriaLabel(label),
|
|
1760
|
+
h.OnChange(report)
|
|
1761
|
+
]);
|
|
1762
|
+
var controlOf = (h, field, onEdit) => {
|
|
1763
|
+
const name = nameOf(field);
|
|
1764
|
+
switch (field._tag) {
|
|
1765
|
+
case "Number":
|
|
1766
|
+
return numberInput(h, name, field.value, (raw) => onEdit(field.path, Number(raw)));
|
|
1767
|
+
case "Text":
|
|
1768
|
+
return h.input([
|
|
1769
|
+
h.Type("text"),
|
|
1770
|
+
h.Value(field.value),
|
|
1771
|
+
h.AriaLabel(name),
|
|
1772
|
+
h.OnChange((raw) => onEdit(field.path, raw))
|
|
1773
|
+
]);
|
|
1774
|
+
case "Toggle":
|
|
1775
|
+
return h.input([
|
|
1776
|
+
h.Type("checkbox"),
|
|
1777
|
+
h.Checked(field.value),
|
|
1778
|
+
h.AriaLabel(name),
|
|
1779
|
+
h.OnClick(onEdit(field.path, !field.value))
|
|
1780
|
+
]);
|
|
1781
|
+
case "Choice":
|
|
1782
|
+
return h.select([h.AriaLabel(name), h.OnChange((raw) => onEdit(field.path, raw))], field.options.map((option) => h.option([h.Value(option), h.Selected(option === field.value)], [option])));
|
|
1783
|
+
case "Colour":
|
|
1784
|
+
return h.input([
|
|
1785
|
+
h.Type("color"),
|
|
1786
|
+
h.Value(hex(field.value)),
|
|
1787
|
+
h.AriaLabel(name),
|
|
1788
|
+
h.OnInput((raw) => onEdit(field.path, Number.parseInt(raw.slice(1), 16)))
|
|
1789
|
+
]);
|
|
1790
|
+
case "Vector":
|
|
1791
|
+
return h.span([h.Class("e3-inspector-vector")], field.value.map((component, index) => numberInput(h, `${name} ${axisNames[index] ?? index}`, component, (raw) => onEdit([...field.path, index], Number(raw)))));
|
|
1792
|
+
case "Fixed":
|
|
1793
|
+
return h.span([h.Class("e3-inspector-fixed")], [field.text]);
|
|
1794
|
+
}
|
|
1795
|
+
};
|
|
1796
|
+
var inspectorView = (h, fields, onEdit) => h.div([h.Class("e3-inspector")], fields.map((field) => h.keyed("label")(field.path.join("."), [h.Class("e3-inspector-row")], [h.span([h.Class("e3-inspector-name")], [nameOf(field)]), controlOf(h, field, onEdit)])));
|
|
1636
1797
|
// src/mount.ts
|
|
1637
1798
|
import {
|
|
1638
1799
|
createGatedFrames,
|
|
@@ -1945,8 +2106,343 @@ var makeSceneMount = (environment) => Mount.define("EffectThreeScene", {
|
|
|
1945
2106
|
messages: [SceneLifecycle.StartedScene, SceneLifecycle.FailedScene],
|
|
1946
2107
|
execute: mountScene(environment)
|
|
1947
2108
|
});
|
|
2109
|
+
// src/boxSelect.ts
|
|
2110
|
+
import { boxSelect, SceneSchema as SceneSchema3 } from "@opsydyn/effect-three";
|
|
2111
|
+
import { Option as Option2, Schema as Schema3 } from "effect";
|
|
2112
|
+
import { defineMessageUnion as defineMessageUnion2 } from "foldkit/message";
|
|
2113
|
+
var Corner = Schema3.Struct({ x: Schema3.Finite, y: Schema3.Finite });
|
|
2114
|
+
var Selectable = Schema3.Struct({ key: Schema3.String, at: SceneSchema3.Vec3 });
|
|
2115
|
+
var Box = Schema3.Struct({
|
|
2116
|
+
from: Corner,
|
|
2117
|
+
to: Corner,
|
|
2118
|
+
width: Schema3.Finite,
|
|
2119
|
+
height: Schema3.Finite
|
|
2120
|
+
});
|
|
2121
|
+
var Model = Schema3.Struct({ box: Schema3.Option(Box) });
|
|
2122
|
+
var Message = defineMessageUnion2({
|
|
2123
|
+
Dragged: {
|
|
2124
|
+
x: Schema3.Finite,
|
|
2125
|
+
y: Schema3.Finite,
|
|
2126
|
+
deltaX: Schema3.Finite,
|
|
2127
|
+
deltaY: Schema3.Finite,
|
|
2128
|
+
width: Schema3.Finite,
|
|
2129
|
+
height: Schema3.Finite
|
|
2130
|
+
},
|
|
2131
|
+
Ended: { camera: SceneSchema3.Camera, selectable: Schema3.Array(Selectable) },
|
|
2132
|
+
Cancelled: {}
|
|
2133
|
+
});
|
|
2134
|
+
var OutMessage = defineMessageUnion2({
|
|
2135
|
+
Selected: { keys: Schema3.Array(Schema3.String) }
|
|
2136
|
+
});
|
|
2137
|
+
var init = () => ({ box: Option2.none() });
|
|
2138
|
+
var moved = (box, deltaX, deltaY) => ({
|
|
2139
|
+
...box,
|
|
2140
|
+
to: { x: box.to.x + deltaX * 2 / box.width, y: box.to.y - deltaY * 2 / box.height }
|
|
2141
|
+
});
|
|
2142
|
+
var dragged = (model, message) => {
|
|
2143
|
+
const { x, y, deltaX, deltaY, width, height } = message;
|
|
2144
|
+
const start = { from: { x, y }, to: { x, y }, width, height };
|
|
2145
|
+
const box = Option2.getOrElse(model.box, () => start);
|
|
2146
|
+
return { box: Option2.some(moved(box, deltaX, deltaY)) };
|
|
2147
|
+
};
|
|
2148
|
+
var keysIn = (box, camera, selectable) => boxSelect(camera, box, box.from, box.to, selectable);
|
|
2149
|
+
var ended = (model, camera, selectable) => Option2.match(model.box, {
|
|
2150
|
+
onNone: () => ({ model }),
|
|
2151
|
+
onSome: (box) => ({
|
|
2152
|
+
model: init(),
|
|
2153
|
+
outMessage: OutMessage.Selected({ keys: keysIn(box, camera, selectable) })
|
|
2154
|
+
})
|
|
2155
|
+
});
|
|
2156
|
+
var update = (model, message) => Message.match(message, {
|
|
2157
|
+
Dragged: (drag) => ({ model: dragged(model, drag) }),
|
|
2158
|
+
Ended: ({ camera, selectable }) => ended(model, camera, selectable),
|
|
2159
|
+
Cancelled: () => ({ model: init() })
|
|
2160
|
+
});
|
|
2161
|
+
var drawing2 = (model) => Option2.isSome(model.box);
|
|
2162
|
+
var primaryButton = 0;
|
|
2163
|
+
var startsBox = (drag) => drag.button === primaryButton && drag.modifiers.shift && drag.key === undefined;
|
|
2164
|
+
var claims = (model, drag) => drawing2(model) || startsBox(drag);
|
|
2165
|
+
var dragOf = (gesture) => Message.Dragged({
|
|
2166
|
+
x: gesture.x,
|
|
2167
|
+
y: gesture.y,
|
|
2168
|
+
deltaX: gesture.deltaX,
|
|
2169
|
+
deltaY: gesture.deltaY,
|
|
2170
|
+
width: gesture.width,
|
|
2171
|
+
height: gesture.height
|
|
2172
|
+
});
|
|
2173
|
+
var inside = (model, camera, selectable) => Option2.match(model.box, {
|
|
2174
|
+
onNone: () => [],
|
|
2175
|
+
onSome: (box) => keysIn(box, camera, selectable)
|
|
2176
|
+
});
|
|
2177
|
+
var onCanvas = (box) => {
|
|
2178
|
+
const left = (Math.min(box.from.x, box.to.x) + 1) / 2 * box.width;
|
|
2179
|
+
const right = (Math.max(box.from.x, box.to.x) + 1) / 2 * box.width;
|
|
2180
|
+
const top = (1 - Math.max(box.from.y, box.to.y)) / 2 * box.height;
|
|
2181
|
+
const bottom = (1 - Math.min(box.from.y, box.to.y)) / 2 * box.height;
|
|
2182
|
+
return { left, top, width: right - left, height: bottom - top };
|
|
2183
|
+
};
|
|
2184
|
+
var rectangle = (model) => Option2.map(model.box, onCanvas);
|
|
2185
|
+
// src/measuringTape.ts
|
|
2186
|
+
import {
|
|
2187
|
+
clearTape,
|
|
2188
|
+
overlay,
|
|
2189
|
+
placeTapeEnd,
|
|
2190
|
+
pointTape,
|
|
2191
|
+
SceneSchema as SceneSchema4,
|
|
2192
|
+
tape,
|
|
2193
|
+
tapeLength,
|
|
2194
|
+
tapeMiddle,
|
|
2195
|
+
tapeNodes
|
|
2196
|
+
} from "@opsydyn/effect-three";
|
|
2197
|
+
import { Option as Option3, Schema as Schema4 } from "effect";
|
|
2198
|
+
import { defineMessageUnion as defineMessageUnion3 } from "foldkit/message";
|
|
2199
|
+
var Model2 = Schema4.Struct({
|
|
2200
|
+
key: Schema4.String,
|
|
2201
|
+
tape: SceneSchema4.Tape
|
|
2202
|
+
});
|
|
2203
|
+
var Message2 = defineMessageUnion3({
|
|
2204
|
+
Placed: { point: SceneSchema4.Vec3 },
|
|
2205
|
+
Pointed: { point: Schema4.NullOr(SceneSchema4.Vec3) },
|
|
2206
|
+
Cleared: {},
|
|
2207
|
+
ChoseSnap: { snap: SceneSchema4.Tape.fields.snap }
|
|
2208
|
+
});
|
|
2209
|
+
var OutMessage2 = defineMessageUnion3({
|
|
2210
|
+
Measured: { from: SceneSchema4.Vec3, to: SceneSchema4.Vec3, length: Schema4.Finite }
|
|
2211
|
+
});
|
|
2212
|
+
var init2 = (key, options = {}) => ({
|
|
2213
|
+
key,
|
|
2214
|
+
tape: tape(options)
|
|
2215
|
+
});
|
|
2216
|
+
var measured = (next) => Option3.match(Option3.all([Option3.fromNullishOr(next.tape.from), Option3.fromNullishOr(next.tape.to)]), {
|
|
2217
|
+
onNone: () => ({ model: next }),
|
|
2218
|
+
onSome: ([from, to]) => ({
|
|
2219
|
+
model: next,
|
|
2220
|
+
outMessage: OutMessage2.Measured({ from, to, length: tapeLength(next.tape) ?? 0 })
|
|
2221
|
+
})
|
|
2222
|
+
});
|
|
2223
|
+
var update2 = (model, message) => Message2.match(message, {
|
|
2224
|
+
Placed: ({ point }) => measured({ ...model, tape: placeTapeEnd(model.tape, point) }),
|
|
2225
|
+
Pointed: ({ point }) => ({ model: { ...model, tape: pointTape(model.tape, point) } }),
|
|
2226
|
+
Cleared: () => ({ model: { ...model, tape: clearTape(model.tape) } }),
|
|
2227
|
+
ChoseSnap: ({ snap }) => ({ model: { ...model, tape: { ...model.tape, snap } } })
|
|
2228
|
+
});
|
|
2229
|
+
var length = (model) => Option3.fromNullishOr(tapeLength(model.tape));
|
|
2230
|
+
var nodes = (model, look = {}) => tapeNodes(model.key, model.tape, look);
|
|
2231
|
+
var classOf = (h, className) => Option3.match(Option3.fromNullishOr(className), {
|
|
2232
|
+
onNone: () => [],
|
|
2233
|
+
onSome: (name) => [h.Class(name)]
|
|
2234
|
+
});
|
|
2235
|
+
var label = (model, h, options = {}) => Option3.match(Option3.all([length(model), Option3.fromNullishOr(tapeMiddle(model.tape))]), {
|
|
2236
|
+
onNone: () => [],
|
|
2237
|
+
onSome: ([measuredLength, middle]) => [
|
|
2238
|
+
{
|
|
2239
|
+
overlay: overlay({ key: `${model.key}:label`, position: middle, center: true }),
|
|
2240
|
+
content: h.span(classOf(h, options.className), [
|
|
2241
|
+
`${measuredLength.toFixed(2)} ${options.unit ?? "m"}`
|
|
2242
|
+
]),
|
|
2243
|
+
pointerEvents: "none"
|
|
2244
|
+
}
|
|
2245
|
+
]
|
|
2246
|
+
});
|
|
2247
|
+
// src/pivotControls.ts
|
|
2248
|
+
import {
|
|
2249
|
+
dragPivot,
|
|
2250
|
+
hoverPivot,
|
|
2251
|
+
pivot,
|
|
2252
|
+
pivotHandleOf,
|
|
2253
|
+
pivotNodes,
|
|
2254
|
+
pressPivot,
|
|
2255
|
+
releasePivot,
|
|
2256
|
+
SceneSchema as SceneSchema5
|
|
2257
|
+
} from "@opsydyn/effect-three";
|
|
2258
|
+
import { Option as Option4, Schema as Schema5 } from "effect";
|
|
2259
|
+
import { defineMessageUnion as defineMessageUnion4 } from "foldkit/message";
|
|
2260
|
+
var Model3 = Schema5.Struct({
|
|
2261
|
+
key: Schema5.String,
|
|
2262
|
+
pivot: SceneSchema5.Pivot,
|
|
2263
|
+
last: Schema5.Option(SceneSchema5.Placement)
|
|
2264
|
+
});
|
|
2265
|
+
var Handle = SceneSchema5.PivotHandle;
|
|
2266
|
+
var Message3 = defineMessageUnion4({
|
|
2267
|
+
Pressed: { handle: Handle, point: SceneSchema5.Vec3, placement: SceneSchema5.Placement },
|
|
2268
|
+
Dragged: { origin: SceneSchema5.Vec3, direction: SceneSchema5.Vec3, snap: Schema5.Boolean },
|
|
2269
|
+
Released: {},
|
|
2270
|
+
Hovered: { handle: Schema5.NullOr(Handle) }
|
|
2271
|
+
});
|
|
2272
|
+
var OutMessage3 = defineMessageUnion4({
|
|
2273
|
+
Moved: { placement: SceneSchema5.Placement },
|
|
2274
|
+
Finished: { placement: SceneSchema5.Placement }
|
|
2275
|
+
});
|
|
2276
|
+
var init3 = (key, options = {}) => ({
|
|
2277
|
+
key,
|
|
2278
|
+
pivot: pivot(options),
|
|
2279
|
+
last: Option4.none()
|
|
2280
|
+
});
|
|
2281
|
+
var withPivot = (model, next) => ({ ...model, pivot: next });
|
|
2282
|
+
var finished = (model) => ({
|
|
2283
|
+
model: { ...withPivot(model, releasePivot(model.pivot)), last: Option4.none() },
|
|
2284
|
+
...Option4.match(model.last, {
|
|
2285
|
+
onNone: () => ({}),
|
|
2286
|
+
onSome: (placement) => ({ outMessage: OutMessage3.Finished({ placement }) })
|
|
2287
|
+
})
|
|
2288
|
+
});
|
|
2289
|
+
var dragged2 = (model, origin, direction, snap) => {
|
|
2290
|
+
const placement = Option4.fromNullishOr(dragPivot(model.pivot, { origin, direction }, { snap }));
|
|
2291
|
+
return Option4.match(placement, {
|
|
2292
|
+
onNone: () => ({ model }),
|
|
2293
|
+
onSome: (placement) => ({
|
|
2294
|
+
model: { ...model, last: Option4.some(placement) },
|
|
2295
|
+
outMessage: OutMessage3.Moved({ placement })
|
|
2296
|
+
})
|
|
2297
|
+
});
|
|
2298
|
+
};
|
|
2299
|
+
var update3 = (model, message) => Message3.match(message, {
|
|
2300
|
+
Pressed: ({ handle, point, placement }) => ({
|
|
2301
|
+
model: {
|
|
2302
|
+
...withPivot(model, pressPivot(model.pivot, placement, handle, point)),
|
|
2303
|
+
last: Option4.none()
|
|
2304
|
+
}
|
|
2305
|
+
}),
|
|
2306
|
+
Dragged: ({ origin, direction, snap }) => dragged2(model, origin, direction, snap),
|
|
2307
|
+
Released: () => finished(model),
|
|
2308
|
+
Hovered: ({ handle }) => ({ model: withPivot(model, hoverPivot(model.pivot, handle)) })
|
|
2309
|
+
});
|
|
2310
|
+
var handleOf = (model, key) => Option4.fromNullishOr(pivotHandleOf(model.key, key));
|
|
2311
|
+
var held = (model) => model.pivot.grab !== null;
|
|
2312
|
+
var nodes2 = (model, placement) => pivotNodes(model.key, model.pivot, placement);
|
|
2313
|
+
// src/transformGizmo.ts
|
|
2314
|
+
import {
|
|
2315
|
+
dragGizmo,
|
|
2316
|
+
gizmo,
|
|
2317
|
+
gizmoHandleOf,
|
|
2318
|
+
gizmoNodes,
|
|
2319
|
+
hoverGizmo,
|
|
2320
|
+
pressGizmo,
|
|
2321
|
+
releaseGizmo,
|
|
2322
|
+
SceneSchema as SceneSchema6
|
|
2323
|
+
} from "@opsydyn/effect-three";
|
|
2324
|
+
import { Option as Option5, Schema as Schema6 } from "effect";
|
|
2325
|
+
import { defineMessageUnion as defineMessageUnion5 } from "foldkit/message";
|
|
2326
|
+
var Model4 = Schema6.Struct({
|
|
2327
|
+
key: Schema6.String,
|
|
2328
|
+
gizmo: SceneSchema6.Gizmo,
|
|
2329
|
+
last: Schema6.Option(SceneSchema6.Placement)
|
|
2330
|
+
});
|
|
2331
|
+
var Handle2 = Schema6.Literals(["x", "y", "z", "xy", "yz", "xz", "xyz"]);
|
|
2332
|
+
var Message4 = defineMessageUnion5({
|
|
2333
|
+
Pressed: {
|
|
2334
|
+
handle: Handle2,
|
|
2335
|
+
origin: SceneSchema6.Vec3,
|
|
2336
|
+
direction: SceneSchema6.Vec3,
|
|
2337
|
+
placement: SceneSchema6.Placement,
|
|
2338
|
+
camera: SceneSchema6.Camera
|
|
2339
|
+
},
|
|
2340
|
+
Dragged: { origin: SceneSchema6.Vec3, direction: SceneSchema6.Vec3 },
|
|
2341
|
+
Released: {},
|
|
2342
|
+
Hovered: { handle: Schema6.NullOr(Handle2) },
|
|
2343
|
+
ChoseMode: { mode: Schema6.Literals(["translate", "rotate", "scale"]) },
|
|
2344
|
+
ChoseSpace: { space: Schema6.Literals(["world", "local"]) }
|
|
2345
|
+
});
|
|
2346
|
+
var OutMessage4 = defineMessageUnion5({
|
|
2347
|
+
Moved: { placement: SceneSchema6.Placement },
|
|
2348
|
+
Finished: { placement: SceneSchema6.Placement }
|
|
2349
|
+
});
|
|
2350
|
+
var init4 = (key, options = {}) => ({
|
|
2351
|
+
key,
|
|
2352
|
+
gizmo: gizmo(options),
|
|
2353
|
+
last: Option5.none()
|
|
2354
|
+
});
|
|
2355
|
+
var withGizmo = (model, next) => ({ ...model, gizmo: next });
|
|
2356
|
+
var finished2 = (model) => ({
|
|
2357
|
+
model: { ...withGizmo(model, releaseGizmo(model.gizmo)), last: Option5.none() },
|
|
2358
|
+
...Option5.match(model.last, {
|
|
2359
|
+
onNone: () => ({}),
|
|
2360
|
+
onSome: (placement) => ({ outMessage: OutMessage4.Finished({ placement }) })
|
|
2361
|
+
})
|
|
2362
|
+
});
|
|
2363
|
+
var dragged3 = (model, origin, direction) => {
|
|
2364
|
+
const placement = Option5.fromNullishOr(dragGizmo(model.gizmo, { origin, direction }));
|
|
2365
|
+
return Option5.match(placement, {
|
|
2366
|
+
onNone: () => ({ model }),
|
|
2367
|
+
onSome: (placement) => ({
|
|
2368
|
+
model: { ...model, last: Option5.some(placement) },
|
|
2369
|
+
outMessage: OutMessage4.Moved({ placement })
|
|
2370
|
+
})
|
|
2371
|
+
});
|
|
2372
|
+
};
|
|
2373
|
+
var update4 = (model, message) => Message4.match(message, {
|
|
2374
|
+
Pressed: ({ handle, origin, direction, placement, camera }) => ({
|
|
2375
|
+
model: {
|
|
2376
|
+
...withGizmo(model, pressGizmo(model.gizmo, placement, handle, { origin, direction }, camera)),
|
|
2377
|
+
last: Option5.none()
|
|
2378
|
+
}
|
|
2379
|
+
}),
|
|
2380
|
+
Dragged: ({ origin, direction }) => dragged3(model, origin, direction),
|
|
2381
|
+
Released: () => finished2(model),
|
|
2382
|
+
Hovered: ({ handle }) => ({ model: withGizmo(model, hoverGizmo(model.gizmo, handle)) }),
|
|
2383
|
+
ChoseMode: ({ mode }) => ({ model: withGizmo(model, { ...model.gizmo, mode }) }),
|
|
2384
|
+
ChoseSpace: ({ space }) => ({ model: withGizmo(model, { ...model.gizmo, space }) })
|
|
2385
|
+
});
|
|
2386
|
+
var handleOf2 = (model, key) => Option5.fromNullishOr(gizmoHandleOf(model.key, key));
|
|
2387
|
+
var held2 = (model) => model.gizmo.grab !== null;
|
|
2388
|
+
var nodes3 = (model, placement, camera) => gizmoNodes(model.key, model.gizmo, placement, camera);
|
|
2389
|
+
// src/viewportGizmo.ts
|
|
2390
|
+
import {
|
|
2391
|
+
cameraAlong,
|
|
2392
|
+
hud as describeHud,
|
|
2393
|
+
SceneSchema as SceneSchema7,
|
|
2394
|
+
viewportAxisOf,
|
|
2395
|
+
viewportGizmoNodes
|
|
2396
|
+
} from "@opsydyn/effect-three";
|
|
2397
|
+
import { Option as Option6, Schema as Schema7 } from "effect";
|
|
2398
|
+
import { defineMessageUnion as defineMessageUnion6 } from "foldkit/message";
|
|
2399
|
+
var Axis = Schema7.Literals(["x", "y", "z", "-x", "-y", "-z"]);
|
|
2400
|
+
var Model5 = Schema7.Struct({
|
|
2401
|
+
key: Schema7.String,
|
|
2402
|
+
hovered: Schema7.NullOr(Axis),
|
|
2403
|
+
hideNegativeAxes: Schema7.Boolean
|
|
2404
|
+
});
|
|
2405
|
+
var Message5 = defineMessageUnion6({
|
|
2406
|
+
Entered: { key: Schema7.String },
|
|
2407
|
+
Left: { key: Schema7.String },
|
|
2408
|
+
Pressed: { key: Schema7.String, camera: SceneSchema7.Camera }
|
|
2409
|
+
});
|
|
2410
|
+
var OutMessage5 = defineMessageUnion6({
|
|
2411
|
+
Turned: { camera: SceneSchema7.Camera }
|
|
2412
|
+
});
|
|
2413
|
+
var init5 = (key, options = {}) => ({
|
|
2414
|
+
key,
|
|
2415
|
+
hovered: null,
|
|
2416
|
+
hideNegativeAxes: options.hideNegativeAxes ?? false
|
|
2417
|
+
});
|
|
2418
|
+
var axisOf = (model, key) => Option6.fromNullishOr(viewportAxisOf(model.key, key));
|
|
2419
|
+
var entered = (model, key) => Option6.match(axisOf(model, key), {
|
|
2420
|
+
onNone: () => model,
|
|
2421
|
+
onSome: (axis) => ({ ...model, hovered: axis })
|
|
2422
|
+
});
|
|
2423
|
+
var left = (model, key) => Option6.match(axisOf(model, key), {
|
|
2424
|
+
onNone: () => model,
|
|
2425
|
+
onSome: () => ({ ...model, hovered: null })
|
|
2426
|
+
});
|
|
2427
|
+
var pressed = (model, key, camera) => Option6.match(axisOf(model, key), {
|
|
2428
|
+
onNone: () => ({ model }),
|
|
2429
|
+
onSome: (axis) => ({
|
|
2430
|
+
model,
|
|
2431
|
+
outMessage: OutMessage5.Turned({ camera: cameraAlong(camera, axis) })
|
|
2432
|
+
})
|
|
2433
|
+
});
|
|
2434
|
+
var update5 = (model, message) => Message5.match(message, {
|
|
2435
|
+
Entered: ({ key }) => ({ model: entered(model, key) }),
|
|
2436
|
+
Left: ({ key }) => ({ model: left(model, key) }),
|
|
2437
|
+
Pressed: ({ key, camera }) => pressed(model, key, camera)
|
|
2438
|
+
});
|
|
2439
|
+
var nodes4 = (model, camera) => viewportGizmoNodes(model.key, camera, {
|
|
2440
|
+
hovered: model.hovered,
|
|
2441
|
+
hideNegativeAxes: model.hideNegativeAxes
|
|
2442
|
+
});
|
|
2443
|
+
var hud = (model, camera, placement = {}) => describeHud({ ...placement, children: [nodes4(model, camera)] });
|
|
1948
2444
|
// src/view.ts
|
|
1949
|
-
import { Array as Arr, Option as
|
|
2445
|
+
import { Array as Arr, Option as Option7 } from "effect";
|
|
1950
2446
|
import { Mount as Mount2 } from "foldkit";
|
|
1951
2447
|
|
|
1952
2448
|
// src/overlayView.ts
|
|
@@ -1973,39 +2469,40 @@ var overlayLayer = (h, overlays) => overlays.length === 0 ? [] : [
|
|
|
1973
2469
|
];
|
|
1974
2470
|
|
|
1975
2471
|
// src/view.ts
|
|
1976
|
-
var given =
|
|
2472
|
+
var given = Option7.fromNullishOr;
|
|
1977
2473
|
var view = (config, h) => {
|
|
1978
2474
|
const element = sceneElement.withMessage(h);
|
|
1979
2475
|
const optional = Arr.getSomes([
|
|
1980
|
-
|
|
1981
|
-
|
|
1982
|
-
|
|
1983
|
-
|
|
1984
|
-
|
|
1985
|
-
|
|
1986
|
-
|
|
1987
|
-
|
|
1988
|
-
|
|
1989
|
-
|
|
1990
|
-
|
|
1991
|
-
|
|
1992
|
-
|
|
1993
|
-
|
|
1994
|
-
|
|
1995
|
-
|
|
1996
|
-
|
|
1997
|
-
|
|
1998
|
-
|
|
1999
|
-
|
|
2000
|
-
|
|
2001
|
-
|
|
2002
|
-
|
|
2003
|
-
|
|
2004
|
-
|
|
2005
|
-
|
|
2006
|
-
|
|
2007
|
-
|
|
2008
|
-
|
|
2476
|
+
Option7.map(given(config.onClick), element.OnSceneClick),
|
|
2477
|
+
Option7.map(given(config.onDoubleClick), element.OnSceneDoubleClick),
|
|
2478
|
+
Option7.map(given(config.onContextMenu), element.OnSceneContextMenu),
|
|
2479
|
+
Option7.map(given(config.onPointerDown), element.OnScenePointerDown),
|
|
2480
|
+
Option7.map(given(config.onPointerUp), element.OnScenePointerUp),
|
|
2481
|
+
Option7.map(given(config.onPointerEnter), element.OnScenePointerEnter),
|
|
2482
|
+
Option7.map(given(config.onPointerMove), element.OnScenePointerMove),
|
|
2483
|
+
Option7.map(given(config.onPointerLeave), element.OnScenePointerLeave),
|
|
2484
|
+
Option7.map(given(config.onPointerMissed), element.OnScenePointerMissed),
|
|
2485
|
+
Option7.map(given(config.onWheel), element.OnSceneWheel),
|
|
2486
|
+
Option7.map(given(config.onDrag), element.OnSceneDrag),
|
|
2487
|
+
Option7.map(given(config.onDragEnd), element.OnSceneDragEnd),
|
|
2488
|
+
Option7.map(given(config.onCollision), element.OnSceneCollision),
|
|
2489
|
+
Option7.map(given(config.onContactForce), element.OnSceneContactForce),
|
|
2490
|
+
Option7.map(given(config.onMeasured), element.OnSceneMeasured),
|
|
2491
|
+
Option7.map(given(config.onLabelMeasured), element.OnSceneLabelMeasured),
|
|
2492
|
+
Option7.map(given(config.onXRSession), element.OnSceneXr),
|
|
2493
|
+
Option7.map(given(config.onXRStick), element.OnSceneXrStick),
|
|
2494
|
+
Option7.map(given(config.onXRButton), element.OnSceneXrButton),
|
|
2495
|
+
Option7.map(given(config.onXRSurface), element.OnSceneXrSurface),
|
|
2496
|
+
Option7.map(given(config.onXRMoved), element.OnSceneXrMoved),
|
|
2497
|
+
Option7.map(given(config.onXRPlanes), element.OnSceneXrPlanes),
|
|
2498
|
+
Option7.map(given(config.onXRMeshes), element.OnSceneXrMeshes),
|
|
2499
|
+
Option7.map(given(config.onAutoRotated), element.OnSceneAutoRotated),
|
|
2500
|
+
Option7.map(given(config.onGesture), (toMessage) => element.OnSceneGesture((detail) => toMessage(detail.gesture))),
|
|
2501
|
+
Option7.map(given(config.onGestureEnd), element.OnSceneGestureEnd),
|
|
2502
|
+
Option7.map(given(config.onPerformanceChange), element.OnScenePerformance),
|
|
2503
|
+
Option7.map(given(config.onError), element.OnSceneError),
|
|
2504
|
+
Option7.map(given(config.onReconciled), element.OnSceneReconciled),
|
|
2505
|
+
Option7.map(given(config.className), h.Class)
|
|
2009
2506
|
]);
|
|
2010
2507
|
const lifecycle = Mount2.mapMessage(config.mount(), config.onLifecycle);
|
|
2011
2508
|
const overlays = config.overlays ?? [];
|
|
@@ -2014,9 +2511,14 @@ var view = (config, h) => {
|
|
|
2014
2511
|
};
|
|
2015
2512
|
export {
|
|
2016
2513
|
AssetLoadError,
|
|
2514
|
+
exports_boxSelect as BoxSelect,
|
|
2515
|
+
exports_measuringTape as MeasuringTape,
|
|
2516
|
+
exports_pivotControls as PivotControls,
|
|
2017
2517
|
ReconciledDetail,
|
|
2018
2518
|
SceneError,
|
|
2019
2519
|
SceneLifecycle,
|
|
2520
|
+
exports_transformGizmo as TransformGizmo,
|
|
2521
|
+
exports_viewportGizmo as ViewportGizmo,
|
|
2020
2522
|
XrSessionDetail,
|
|
2021
2523
|
XrUnavailable,
|
|
2022
2524
|
animationFrameScheduler,
|
|
@@ -2024,6 +2526,7 @@ export {
|
|
|
2024
2526
|
claimsContextMenu,
|
|
2025
2527
|
defaultPixelRatio,
|
|
2026
2528
|
domEventName,
|
|
2529
|
+
inspectorView,
|
|
2027
2530
|
makeAssets,
|
|
2028
2531
|
makeEnvironment,
|
|
2029
2532
|
makeSceneMount,
|
|
@@ -2037,5 +2540,5 @@ export {
|
|
|
2037
2540
|
webgpuRendererFactory
|
|
2038
2541
|
};
|
|
2039
2542
|
|
|
2040
|
-
//# debugId=
|
|
2543
|
+
//# debugId=B27477F988FB686A64756E2164756E21
|
|
2041
2544
|
//# sourceMappingURL=index.js.map
|