@viamrobotics/motion-tools 1.7.0 → 1.9.1
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/dist/components/App.svelte +11 -6
- package/dist/components/CameraControls.svelte +1 -1
- package/dist/components/Focus.svelte +1 -1
- package/dist/components/Frame.svelte +1 -1
- package/dist/components/Geometry2.svelte +8 -5
- package/dist/components/HoveredEntities.svelte +19 -0
- package/dist/components/HoveredEntities.svelte.d.ts +3 -0
- package/dist/components/HoveredEntityTooltip.svelte +242 -0
- package/dist/components/HoveredEntityTooltip.svelte.d.ts +7 -0
- package/dist/components/Label.svelte +1 -1
- package/dist/components/{DotSprite.svelte → MeasureTool/MeasurePoint.svelte} +8 -18
- package/dist/components/MeasureTool/MeasurePoint.svelte.d.ts +8 -0
- package/dist/components/MeasureTool/MeasureTool.svelte +176 -0
- package/dist/components/Scene.svelte +1 -1
- package/dist/components/{Details.svelte → overlay/Details.svelte} +10 -10
- package/dist/components/{LiveUpdatesBanner.svelte → overlay/LiveUpdatesBanner.svelte} +2 -2
- package/dist/components/overlay/Popover.svelte +28 -0
- package/dist/components/overlay/Popover.svelte.d.ts +9 -0
- package/dist/components/overlay/ToggleGroup.svelte +60 -0
- package/dist/components/overlay/ToggleGroup.svelte.d.ts +13 -0
- package/dist/components/{__tests__ → overlay/__tests__}/__fixtures__/entity.js +1 -1
- package/dist/components/{dashboard → overlay/dashboard}/Button.svelte +8 -4
- package/dist/components/{dashboard → overlay/dashboard}/Button.svelte.d.ts +3 -2
- package/dist/components/{dashboard → overlay/dashboard}/Dashboard.svelte +2 -2
- package/dist/components/{Tree → overlay/left-pane}/AddFrames.svelte +2 -2
- package/dist/components/{Tree → overlay/left-pane}/Logs.svelte +1 -1
- package/dist/components/{RefreshRate.svelte → overlay/left-pane/RefreshRate.svelte} +1 -1
- package/dist/components/{Tree → overlay/left-pane}/Settings.svelte +12 -7
- package/dist/components/{Tree → overlay/left-pane}/Tree.svelte +3 -3
- package/dist/components/{Tree → overlay/left-pane}/TreeContainer.svelte +8 -8
- package/dist/components/{Tree → overlay/left-pane}/Widgets.svelte +3 -3
- package/dist/components/{Tree → overlay/left-pane}/buildTree.js +1 -1
- package/dist/components/{widgets → overlay/widgets}/ArmPositions.svelte +4 -4
- package/dist/components/{widgets → overlay/widgets}/Camera.svelte +5 -5
- package/dist/ecs/traits.d.ts +19 -12
- package/dist/ecs/traits.js +18 -11
- package/dist/ecs/useQuery.svelte.js +10 -10
- package/dist/hooks/useDrawAPI.svelte.js +1 -1
- package/dist/hooks/useFrames.svelte.js +1 -0
- package/dist/hooks/useGeometries.svelte.js +1 -1
- package/dist/hooks/useObjectEvents.svelte.d.ts +1 -0
- package/dist/hooks/useObjectEvents.svelte.js +24 -0
- package/dist/hooks/usePointcloudObjects.svelte.js +1 -1
- package/dist/hooks/usePointclouds.svelte.js +28 -41
- package/dist/hooks/usePose.svelte.js +1 -1
- package/dist/hooks/useSettings.svelte.d.ts +4 -0
- package/dist/hooks/useSettings.svelte.js +4 -0
- package/dist/hooks/useWorldState.svelte.js +1 -1
- package/dist/three/InstancedArrows/raycast.js +2 -6
- package/package.json +6 -2
- package/dist/components/DotSprite.svelte.d.ts +0 -10
- package/dist/components/MeasureTool.svelte +0 -123
- package/dist/components/null-states/Connection.svelte +0 -0
- package/dist/components/null-states/Connection.svelte.d.ts +0 -26
- /package/dist/components/{MeasureTool.svelte.d.ts → MeasureTool/MeasureTool.svelte.d.ts} +0 -0
- /package/dist/components/{Details.svelte.d.ts → overlay/Details.svelte.d.ts} +0 -0
- /package/dist/components/{LiveUpdatesBanner.svelte.d.ts → overlay/LiveUpdatesBanner.svelte.d.ts} +0 -0
- /package/dist/components/{shared → overlay}/Table.svelte +0 -0
- /package/dist/components/{shared → overlay}/Table.svelte.d.ts +0 -0
- /package/dist/components/{__tests__ → overlay/__tests__}/__fixtures__/entity.d.ts +0 -0
- /package/dist/components/{__tests__ → overlay/__tests__}/__fixtures__/resource.d.ts +0 -0
- /package/dist/components/{__tests__ → overlay/__tests__}/__fixtures__/resource.js +0 -0
- /package/dist/components/{dashboard → overlay/dashboard}/Dashboard.svelte.d.ts +0 -0
- /package/dist/components/{Tree → overlay/left-pane}/AddFrames.svelte.d.ts +0 -0
- /package/dist/components/{Tree → overlay/left-pane}/Drawer.svelte +0 -0
- /package/dist/components/{Tree → overlay/left-pane}/Drawer.svelte.d.ts +0 -0
- /package/dist/components/{Tree → overlay/left-pane}/Logs.svelte.d.ts +0 -0
- /package/dist/components/{RefreshRate.svelte.d.ts → overlay/left-pane/RefreshRate.svelte.d.ts} +0 -0
- /package/dist/components/{Tree → overlay/left-pane}/Settings.svelte.d.ts +0 -0
- /package/dist/components/{Tree → overlay/left-pane}/Tree.svelte.d.ts +0 -0
- /package/dist/components/{Tree → overlay/left-pane}/TreeContainer.svelte.d.ts +0 -0
- /package/dist/components/{Tree → overlay/left-pane}/Widgets.svelte.d.ts +0 -0
- /package/dist/components/{Tree → overlay/left-pane}/buildTree.d.ts +0 -0
- /package/dist/components/{Tree → overlay/left-pane}/useExpanded.svelte.d.ts +0 -0
- /package/dist/components/{Tree → overlay/left-pane}/useExpanded.svelte.js +0 -0
- /package/dist/components/{widgets → overlay/widgets}/ArmPositions.svelte.d.ts +0 -0
- /package/dist/components/{widgets → overlay/widgets}/Camera.svelte.d.ts +0 -0
|
@@ -2,6 +2,7 @@ import { useCursor } from '@threlte/extras';
|
|
|
2
2
|
import { useFocusedEntity, useSelectedEntity } from './useSelection.svelte';
|
|
3
3
|
import { useVisibility } from './useVisibility.svelte';
|
|
4
4
|
import { Vector2 } from 'three';
|
|
5
|
+
import { traits } from '../ecs';
|
|
5
6
|
export const useObjectEvents = (entity) => {
|
|
6
7
|
const down = new Vector2();
|
|
7
8
|
const selectedEntity = useSelectedEntity();
|
|
@@ -13,10 +14,32 @@ export const useObjectEvents = (entity) => {
|
|
|
13
14
|
const onpointerenter = (event) => {
|
|
14
15
|
event.stopPropagation();
|
|
15
16
|
cursor.onPointerEnter();
|
|
17
|
+
if (currentEntity && !currentEntity.has(traits.Hover)) {
|
|
18
|
+
currentEntity.add(traits.Hover({
|
|
19
|
+
index: -1,
|
|
20
|
+
x: event.point.x,
|
|
21
|
+
y: event.point.y,
|
|
22
|
+
z: event.point.z,
|
|
23
|
+
}));
|
|
24
|
+
}
|
|
25
|
+
};
|
|
26
|
+
const onpointermove = (event) => {
|
|
27
|
+
event.stopPropagation();
|
|
28
|
+
if (currentEntity && currentEntity.has(traits.Hover)) {
|
|
29
|
+
currentEntity.set(traits.Hover, {
|
|
30
|
+
index: event.index ?? -1,
|
|
31
|
+
x: event.point.x,
|
|
32
|
+
y: event.point.y,
|
|
33
|
+
z: event.point.z,
|
|
34
|
+
});
|
|
35
|
+
}
|
|
16
36
|
};
|
|
17
37
|
const onpointerleave = (event) => {
|
|
18
38
|
event.stopPropagation();
|
|
19
39
|
cursor.onPointerLeave();
|
|
40
|
+
if (currentEntity?.has(traits.Hover)) {
|
|
41
|
+
currentEntity.remove(traits.Hover);
|
|
42
|
+
}
|
|
20
43
|
};
|
|
21
44
|
const ondblclick = (event) => {
|
|
22
45
|
event.stopPropagation();
|
|
@@ -41,6 +64,7 @@ export const useObjectEvents = (entity) => {
|
|
|
41
64
|
return visible;
|
|
42
65
|
},
|
|
43
66
|
onpointerenter,
|
|
67
|
+
onpointermove,
|
|
44
68
|
onpointerleave,
|
|
45
69
|
ondblclick,
|
|
46
70
|
onpointerdown,
|
|
@@ -7,7 +7,7 @@ import { getContext, setContext } from 'svelte';
|
|
|
7
7
|
import { traits, useWorld } from '../ecs';
|
|
8
8
|
import { createBufferGeometry, updateBufferGeometry } from '../attribute';
|
|
9
9
|
import { useEnvironment } from './useEnvironment.svelte';
|
|
10
|
-
import { RefetchRates } from '../components/RefreshRate.svelte';
|
|
10
|
+
import { RefetchRates } from '../components/overlay/left-pane/RefreshRate.svelte';
|
|
11
11
|
import { createPose } from '../transform';
|
|
12
12
|
const key = Symbol('pointcloud-object-context');
|
|
13
13
|
export const providePointcloudObjects = (partID) => {
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { CameraClient } from '@viamrobotics/sdk';
|
|
2
|
-
import { setContext, getContext } from 'svelte';
|
|
2
|
+
import { setContext, getContext, untrack } from 'svelte';
|
|
3
3
|
import { createResourceClient, createResourceQuery, useResourceNames, } from '@viamrobotics/svelte-sdk';
|
|
4
4
|
import { parsePcdInWorker } from '../loaders/pcd';
|
|
5
5
|
import { RefreshRates, useMachineSettings } from './useMachineSettings.svelte';
|
|
6
6
|
import { useLogs } from './useLogs.svelte';
|
|
7
|
-
import { RefetchRates } from '../components/RefreshRate.svelte';
|
|
7
|
+
import { RefetchRates } from '../components/overlay/left-pane/RefreshRate.svelte';
|
|
8
8
|
import { traits, useWorld } from '../ecs';
|
|
9
9
|
import { useEnvironment } from './useEnvironment.svelte';
|
|
10
10
|
import { createBufferGeometry, updateBufferGeometry } from '../attribute';
|
|
@@ -59,7 +59,7 @@ export const providePointclouds = (partID) => {
|
|
|
59
59
|
}
|
|
60
60
|
});
|
|
61
61
|
const options = $derived({
|
|
62
|
-
refetchInterval: interval,
|
|
62
|
+
refetchInterval: interval === RefetchRates.MANUAL ? false : interval,
|
|
63
63
|
});
|
|
64
64
|
const queries = $derived(enabledClients.map((client) => [client.current.name, createResourceQuery(client, 'getPointCloud', () => options)]));
|
|
65
65
|
const queryMap = $derived(typeSafeObjectFromEntries(queries));
|
|
@@ -73,46 +73,33 @@ export const providePointclouds = (partID) => {
|
|
|
73
73
|
}
|
|
74
74
|
}
|
|
75
75
|
});
|
|
76
|
-
let pcObjects = $state.raw([]);
|
|
77
|
-
$effect(() => {
|
|
78
|
-
const binaries = [];
|
|
79
|
-
for (const [name, query] of queries) {
|
|
80
|
-
const { data } = query;
|
|
81
|
-
if (name && data) {
|
|
82
|
-
binaries.push([name, data]);
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
Promise.allSettled(binaries.map(async ([name, uint8array]) => {
|
|
86
|
-
const { positions, colors } = await parsePcdInWorker(new Uint8Array(uint8array));
|
|
87
|
-
return { name, positions, colors };
|
|
88
|
-
})).then((results) => {
|
|
89
|
-
const fulfilledResults = [];
|
|
90
|
-
for (const result of results) {
|
|
91
|
-
if (result.status === 'fulfilled') {
|
|
92
|
-
fulfilledResults.push(result.value);
|
|
93
|
-
}
|
|
94
|
-
else if (result.status === 'rejected') {
|
|
95
|
-
logs.add(result.reason, 'error');
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
pcObjects = fulfilledResults;
|
|
99
|
-
});
|
|
100
|
-
});
|
|
101
76
|
const entities = new Map();
|
|
102
77
|
$effect(() => {
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
78
|
+
for (const [name, query] of queries) {
|
|
79
|
+
untrack(() => {
|
|
80
|
+
$effect(() => {
|
|
81
|
+
const { data } = query;
|
|
82
|
+
if (!data || data.length === 0)
|
|
83
|
+
return;
|
|
84
|
+
parsePcdInWorker(data)
|
|
85
|
+
.then(({ positions, colors }) => {
|
|
86
|
+
const existing = entities.get(name);
|
|
87
|
+
if (existing) {
|
|
88
|
+
const geometry = existing.get(traits.BufferGeometry);
|
|
89
|
+
if (geometry) {
|
|
90
|
+
updateBufferGeometry(geometry, positions, colors);
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
const geometry = createBufferGeometry(positions, colors);
|
|
95
|
+
const entity = world.spawn(traits.Parent(name), traits.Name(`${name} pointcloud`), traits.BufferGeometry(geometry), traits.Points);
|
|
96
|
+
entities.set(name, entity);
|
|
97
|
+
})
|
|
98
|
+
.catch((error) => {
|
|
99
|
+
logs.add(error.reason, 'error');
|
|
100
|
+
});
|
|
101
|
+
});
|
|
102
|
+
});
|
|
116
103
|
}
|
|
117
104
|
// Clean up old entities
|
|
118
105
|
for (const [name, entity] of entities) {
|
|
@@ -6,7 +6,7 @@ import { useEnvironment } from './useEnvironment.svelte';
|
|
|
6
6
|
import { observe } from '@threlte/core';
|
|
7
7
|
import { untrack } from 'svelte';
|
|
8
8
|
import { useFrames } from './useFrames.svelte';
|
|
9
|
-
import { RefetchRates } from '../components/RefreshRate.svelte';
|
|
9
|
+
import { RefetchRates } from '../components/overlay/left-pane/RefreshRate.svelte';
|
|
10
10
|
import { useLogs } from './useLogs.svelte';
|
|
11
11
|
import { useResourceByName } from './useResourceByName.svelte';
|
|
12
12
|
import { useRefetchPoses } from './useRefetchPoses';
|
|
@@ -13,6 +13,9 @@ export interface Settings {
|
|
|
13
13
|
lineWidth: number;
|
|
14
14
|
lineDotSize: number;
|
|
15
15
|
enableMeasure: boolean;
|
|
16
|
+
enableMeasureAxisX: boolean;
|
|
17
|
+
enableMeasureAxisY: boolean;
|
|
18
|
+
enableMeasureAxisZ: boolean;
|
|
16
19
|
enableLabels: boolean;
|
|
17
20
|
enableKeybindings: boolean;
|
|
18
21
|
enableQueryDevtools: boolean;
|
|
@@ -21,6 +24,7 @@ export interface Settings {
|
|
|
21
24
|
openCameraWidgets: Record<string, string[]>;
|
|
22
25
|
renderStats: boolean;
|
|
23
26
|
renderArmModels: 'colliders' | 'colliders+model' | 'model';
|
|
27
|
+
renderSubEntityHoverDetail: boolean;
|
|
24
28
|
}
|
|
25
29
|
interface Context {
|
|
26
30
|
current: Settings;
|
|
@@ -16,6 +16,9 @@ const defaults = () => ({
|
|
|
16
16
|
lineWidth: 0.005,
|
|
17
17
|
lineDotSize: 0.01,
|
|
18
18
|
enableMeasure: false,
|
|
19
|
+
enableMeasureAxisX: true,
|
|
20
|
+
enableMeasureAxisY: true,
|
|
21
|
+
enableMeasureAxisZ: true,
|
|
19
22
|
enableLabels: false,
|
|
20
23
|
enableKeybindings: true,
|
|
21
24
|
enableQueryDevtools: false,
|
|
@@ -24,6 +27,7 @@ const defaults = () => ({
|
|
|
24
27
|
openCameraWidgets: {},
|
|
25
28
|
renderStats: false,
|
|
26
29
|
renderArmModels: 'colliders+model',
|
|
30
|
+
renderSubEntityHoverDetail: false,
|
|
27
31
|
});
|
|
28
32
|
export const provideSettings = () => {
|
|
29
33
|
let settings = $state(defaults());
|
|
@@ -80,7 +80,7 @@ const createWorldState = (client) => {
|
|
|
80
80
|
if (metadata.shape === 'arrow') {
|
|
81
81
|
entityTraits.push(traits.Arrow);
|
|
82
82
|
}
|
|
83
|
-
entityTraits.push(traits.Name(transform.referenceFrame), traits.Pose(pose), traits.WorldStateStoreAPI);
|
|
83
|
+
entityTraits.push(traits.Name(transform.referenceFrame), traits.Pose(pose), traits.ShowAxesHelper, traits.WorldStateStoreAPI);
|
|
84
84
|
const entity = world.spawn(...entityTraits);
|
|
85
85
|
entities.set(transform.uuidString, entity);
|
|
86
86
|
};
|
|
@@ -2,7 +2,6 @@ import { Object3D, BufferGeometry, Ray, Matrix4, Raycaster, Vector3, Box3, RawSh
|
|
|
2
2
|
const vec3 = new Vector3();
|
|
3
3
|
const inverseMatrix = new Matrix4();
|
|
4
4
|
const localRay = new Ray();
|
|
5
|
-
const ray = new Ray();
|
|
6
5
|
const box = new Box3();
|
|
7
6
|
const segmentStart = new Vector3();
|
|
8
7
|
const segmentEnd = new Vector3();
|
|
@@ -46,17 +45,14 @@ export function meshBoundsRaycast(raycaster, intersects) {
|
|
|
46
45
|
this.geometry.computeBoundingBox();
|
|
47
46
|
}
|
|
48
47
|
box.copy(this.geometry.boundingBox ?? box);
|
|
49
|
-
box.applyMatrix4(this.matrixWorld);
|
|
50
48
|
if (!raycaster.ray.intersectsBox(box)) {
|
|
51
49
|
return;
|
|
52
50
|
}
|
|
53
|
-
|
|
54
|
-
ray.copy(raycaster.ray).applyMatrix4(inverseMatrix);
|
|
51
|
+
raycaster.ray.intersectBox(box, vec3);
|
|
55
52
|
const distance = vec3.distanceTo(raycaster.ray.origin);
|
|
56
|
-
const point = vec3.clone();
|
|
57
53
|
intersects.push({
|
|
58
54
|
distance,
|
|
59
|
-
point,
|
|
55
|
+
point: vec3.clone(),
|
|
60
56
|
object: this,
|
|
61
57
|
});
|
|
62
58
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@viamrobotics/motion-tools",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.9.1",
|
|
4
4
|
"description": "Motion visualization with Viam",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"type": "module",
|
|
@@ -41,7 +41,9 @@
|
|
|
41
41
|
"@vitest/coverage-v8": "^3.2.4",
|
|
42
42
|
"@zag-js/collapsible": "1.22.1",
|
|
43
43
|
"@zag-js/floating-panel": "1.22.1",
|
|
44
|
+
"@zag-js/popover": "1.22.1",
|
|
44
45
|
"@zag-js/svelte": "1.22.1",
|
|
46
|
+
"@zag-js/toggle-group": "1.22.1",
|
|
45
47
|
"@zag-js/tree-view": "1.22.1",
|
|
46
48
|
"camera-controls": "3.1.0",
|
|
47
49
|
"eslint": "9.34.0",
|
|
@@ -87,7 +89,9 @@
|
|
|
87
89
|
"@zag-js/collapsible": ">=1",
|
|
88
90
|
"@zag-js/dialog": ">=1.31",
|
|
89
91
|
"@zag-js/floating-panel": ">=1",
|
|
92
|
+
"@zag-js/popover": ">=1",
|
|
90
93
|
"@zag-js/svelte": ">=1",
|
|
94
|
+
"@zag-js/toggle-group": ">=1",
|
|
91
95
|
"@zag-js/tree-view": ">=1",
|
|
92
96
|
"camera-controls": ">=3",
|
|
93
97
|
"idb-keyval": ">=6",
|
|
@@ -128,7 +132,7 @@
|
|
|
128
132
|
"@bufbuild/protobuf": "1.10.1",
|
|
129
133
|
"@neodrag/svelte": "^2.3.3",
|
|
130
134
|
"@tanstack/svelte-query-devtools": "^6.0.2",
|
|
131
|
-
"koota": "
|
|
135
|
+
"koota": "0.6.5",
|
|
132
136
|
"lodash-es": "4.17.23",
|
|
133
137
|
"uuid-tool": "^2.0.3"
|
|
134
138
|
},
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
import { type Props as ThrelteProps } from '@threlte/core';
|
|
2
|
-
import type { ColorRepresentation, Vector3Tuple, Group } from 'three';
|
|
3
|
-
interface Props extends ThrelteProps<typeof Group> {
|
|
4
|
-
position: Vector3Tuple;
|
|
5
|
-
color?: ColorRepresentation;
|
|
6
|
-
opacity?: number;
|
|
7
|
-
}
|
|
8
|
-
declare const DotSprite: import("svelte").Component<Props, {}, "ref">;
|
|
9
|
-
type DotSprite = ReturnType<typeof DotSprite>;
|
|
10
|
-
export default DotSprite;
|
|
@@ -1,123 +0,0 @@
|
|
|
1
|
-
<script lang="ts">
|
|
2
|
-
import { untrack } from 'svelte'
|
|
3
|
-
import { Vector3, type Intersection } from 'three'
|
|
4
|
-
import { T } from '@threlte/core'
|
|
5
|
-
import { HTML, MeshLineGeometry, MeshLineMaterial, Portal } from '@threlte/extras'
|
|
6
|
-
import { useSettings } from '../hooks/useSettings.svelte'
|
|
7
|
-
import Button from './dashboard/Button.svelte'
|
|
8
|
-
import DotSprite from './DotSprite.svelte'
|
|
9
|
-
import { useMouseRaycaster } from '../hooks/useMouseRaycaster.svelte'
|
|
10
|
-
import { useFocusedEntity } from '../hooks/useSelection.svelte'
|
|
11
|
-
|
|
12
|
-
const focusedEntity = useFocusedEntity()
|
|
13
|
-
const settings = useSettings()
|
|
14
|
-
|
|
15
|
-
const htmlPosition = new Vector3()
|
|
16
|
-
|
|
17
|
-
let step: 'idle' | 'p1' | 'p2' = 'idle'
|
|
18
|
-
|
|
19
|
-
let intersection = $state.raw<Intersection>()
|
|
20
|
-
let p1 = $state.raw<Vector3>()
|
|
21
|
-
let p2 = $state.raw<Vector3>()
|
|
22
|
-
|
|
23
|
-
const enabled = $derived(settings.current.enableMeasure)
|
|
24
|
-
|
|
25
|
-
const { onclick, onmove, raycaster } = useMouseRaycaster(() => ({
|
|
26
|
-
enabled,
|
|
27
|
-
}))
|
|
28
|
-
raycaster.firstHitOnly = true
|
|
29
|
-
raycaster.params.Points.threshold = 0.005
|
|
30
|
-
|
|
31
|
-
onmove((event) => {
|
|
32
|
-
intersection = event.intersections[0]
|
|
33
|
-
})
|
|
34
|
-
|
|
35
|
-
onclick(() => {
|
|
36
|
-
if (step === 'idle' && intersection) {
|
|
37
|
-
p1 = intersection.point.clone()
|
|
38
|
-
step = 'p1'
|
|
39
|
-
} else if (step === 'p1' && intersection) {
|
|
40
|
-
p2 = intersection.point.clone()
|
|
41
|
-
step = 'p2'
|
|
42
|
-
} else if (step === 'p2') {
|
|
43
|
-
p1 = undefined
|
|
44
|
-
p2 = undefined
|
|
45
|
-
step = 'idle'
|
|
46
|
-
}
|
|
47
|
-
})
|
|
48
|
-
|
|
49
|
-
const clear = () => {
|
|
50
|
-
p1 = undefined
|
|
51
|
-
p2 = undefined
|
|
52
|
-
step = 'idle'
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
$effect(() => {
|
|
56
|
-
// eslint-disable-next-line @typescript-eslint/no-unused-expressions
|
|
57
|
-
;(focusedEntity.current, enabled)
|
|
58
|
-
untrack(() => clear())
|
|
59
|
-
})
|
|
60
|
-
</script>
|
|
61
|
-
|
|
62
|
-
<Portal id="dashboard">
|
|
63
|
-
<fieldset>
|
|
64
|
-
<Button
|
|
65
|
-
active
|
|
66
|
-
icon="ruler"
|
|
67
|
-
class={enabled ? '' : 'text-gray-4!'}
|
|
68
|
-
description="{enabled ? 'Disable' : 'Enable'} measurement"
|
|
69
|
-
onclick={() => {
|
|
70
|
-
settings.current.enableMeasure = !settings.current.enableMeasure
|
|
71
|
-
}}
|
|
72
|
-
/>
|
|
73
|
-
</fieldset>
|
|
74
|
-
</Portal>
|
|
75
|
-
|
|
76
|
-
{#if enabled}
|
|
77
|
-
{#if intersection}
|
|
78
|
-
<DotSprite
|
|
79
|
-
position={intersection?.point.toArray()}
|
|
80
|
-
opacity={0.5}
|
|
81
|
-
/>
|
|
82
|
-
{/if}
|
|
83
|
-
|
|
84
|
-
{#if p1}
|
|
85
|
-
<DotSprite
|
|
86
|
-
position={p1.toArray()}
|
|
87
|
-
opacity={0.5}
|
|
88
|
-
/>
|
|
89
|
-
{/if}
|
|
90
|
-
|
|
91
|
-
{#if p2}
|
|
92
|
-
<DotSprite
|
|
93
|
-
position={p2.toArray()}
|
|
94
|
-
opacity={0.5}
|
|
95
|
-
/>
|
|
96
|
-
{/if}
|
|
97
|
-
|
|
98
|
-
{#if p1 && p2}
|
|
99
|
-
<T.Mesh
|
|
100
|
-
raycast={() => null}
|
|
101
|
-
bvh={{ enabled: false }}
|
|
102
|
-
renderOrder={1}
|
|
103
|
-
>
|
|
104
|
-
<MeshLineGeometry points={[p1, p2]} />
|
|
105
|
-
<MeshLineMaterial
|
|
106
|
-
width={2.5}
|
|
107
|
-
depthTest={false}
|
|
108
|
-
color="black"
|
|
109
|
-
opacity={0.5}
|
|
110
|
-
attenuate={false}
|
|
111
|
-
transparent
|
|
112
|
-
/>
|
|
113
|
-
</T.Mesh>
|
|
114
|
-
<HTML
|
|
115
|
-
center
|
|
116
|
-
position={htmlPosition.lerpVectors(p1, p2, 0.5).toArray()}
|
|
117
|
-
>
|
|
118
|
-
<div class="border border-black bg-white px-1 py-0.5 text-xs">
|
|
119
|
-
{p1.distanceTo(p2).toFixed(2)}<span class="text-subtle-2">m</span>
|
|
120
|
-
</div>
|
|
121
|
-
</HTML>
|
|
122
|
-
{/if}
|
|
123
|
-
{/if}
|
|
File without changes
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
export default Connection;
|
|
2
|
-
type Connection = SvelteComponent<{
|
|
3
|
-
[x: string]: never;
|
|
4
|
-
}, {
|
|
5
|
-
[evt: string]: CustomEvent<any>;
|
|
6
|
-
}, {}> & {
|
|
7
|
-
$$bindings?: string | undefined;
|
|
8
|
-
};
|
|
9
|
-
declare const Connection: $$__sveltets_2_IsomorphicComponent<{
|
|
10
|
-
[x: string]: never;
|
|
11
|
-
}, {
|
|
12
|
-
[evt: string]: CustomEvent<any>;
|
|
13
|
-
}, {}, {}, string>;
|
|
14
|
-
interface $$__sveltets_2_IsomorphicComponent<Props extends Record<string, any> = any, Events extends Record<string, any> = any, Slots extends Record<string, any> = any, Exports = {}, Bindings = string> {
|
|
15
|
-
new (options: import("svelte").ComponentConstructorOptions<Props>): import("svelte").SvelteComponent<Props, Events, Slots> & {
|
|
16
|
-
$$bindings?: Bindings;
|
|
17
|
-
} & Exports;
|
|
18
|
-
(internal: unknown, props: {
|
|
19
|
-
$$events?: Events;
|
|
20
|
-
$$slots?: Slots;
|
|
21
|
-
}): Exports & {
|
|
22
|
-
$set?: any;
|
|
23
|
-
$on?: any;
|
|
24
|
-
};
|
|
25
|
-
z_$$bindings?: Bindings;
|
|
26
|
-
}
|
|
File without changes
|
|
File without changes
|
/package/dist/components/{LiveUpdatesBanner.svelte.d.ts → overlay/LiveUpdatesBanner.svelte.d.ts}
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
/package/dist/components/{RefreshRate.svelte.d.ts → overlay/left-pane/RefreshRate.svelte.d.ts}
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|