@viamrobotics/motion-tools 1.33.0 → 1.33.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/Entities/Entities.svelte +18 -25
- package/dist/components/Entities/Entities.svelte.d.ts +2 -17
- package/dist/components/Entities/Label.svelte +79 -13
- package/dist/components/Entities/Label.svelte.d.ts +2 -1
- package/dist/components/Entities/Labels.svelte +36 -0
- package/dist/components/Entities/Labels.svelte.d.ts +3 -0
- package/dist/components/Entities/LineDots.svelte +8 -3
- package/dist/components/Entities/labelLayout/applyTeleports.d.ts +9 -0
- package/dist/components/Entities/labelLayout/applyTeleports.js +39 -0
- package/dist/components/Entities/labelLayout/buildNeighborhood.d.ts +8 -0
- package/dist/components/Entities/labelLayout/buildNeighborhood.js +26 -0
- package/dist/components/Entities/labelLayout/cameraHash.d.ts +8 -0
- package/dist/components/Entities/labelLayout/cameraHash.js +25 -0
- package/dist/components/Entities/labelLayout/cost.d.ts +44 -0
- package/dist/components/Entities/labelLayout/cost.js +126 -0
- package/dist/components/Entities/labelLayout/createLabelLayout.d.ts +27 -0
- package/dist/components/Entities/labelLayout/createLabelLayout.js +194 -0
- package/dist/components/Entities/labelLayout/geometry.d.ts +20 -0
- package/dist/components/Entities/labelLayout/geometry.js +151 -0
- package/dist/components/Entities/labelLayout/labelStore.svelte.d.ts +17 -0
- package/dist/components/Entities/labelLayout/labelStore.svelte.js +28 -0
- package/dist/components/Entities/labelLayout/measure.d.ts +13 -0
- package/dist/components/Entities/labelLayout/measure.js +42 -0
- package/dist/components/Entities/labelLayout/slots.d.ts +11 -0
- package/dist/components/Entities/labelLayout/slots.js +47 -0
- package/dist/components/Entities/labelLayout/solve.d.ts +11 -0
- package/dist/components/Entities/labelLayout/solve.js +93 -0
- package/dist/components/Entities/labelLayout/spatialHash.d.ts +15 -0
- package/dist/components/Entities/labelLayout/spatialHash.js +53 -0
- package/dist/components/Entities/labelLayout/types.d.ts +105 -0
- package/dist/components/Entities/labelLayout/types.js +19 -0
- package/dist/components/Entities/labelLayout/writeBack.d.ts +20 -0
- package/dist/components/Entities/labelLayout/writeBack.js +51 -0
- package/dist/components/Scene.svelte +2 -1
- package/dist/components/SelectedTransformControls.svelte +65 -47
- package/dist/components/overlay/Details.svelte +198 -224
- package/dist/components/overlay/Details.svelte.d.ts +1 -1
- package/dist/components/overlay/Popover.svelte +6 -4
- package/dist/components/overlay/Popover.svelte.d.ts +6 -2
- package/dist/components/overlay/dashboard/Button.svelte +7 -2
- package/dist/components/overlay/dashboard/Button.svelte.d.ts +2 -1
- package/dist/components/overlay/details/AxesHelperDetails.svelte +32 -0
- package/dist/components/overlay/details/AxesHelperDetails.svelte.d.ts +7 -0
- package/dist/components/overlay/details/ColorDetails.svelte +35 -0
- package/dist/components/overlay/details/ColorDetails.svelte.d.ts +7 -0
- package/dist/components/overlay/details/GeometryDetails.svelte +104 -0
- package/dist/components/overlay/details/GeometryDetails.svelte.d.ts +7 -0
- package/dist/components/overlay/details/LineDetails/LineDetails.svelte +196 -0
- package/dist/components/overlay/details/LineDetails/LineDetails.svelte.d.ts +7 -0
- package/dist/components/overlay/details/LineDetails/linePositions.d.ts +3 -0
- package/dist/components/overlay/details/LineDetails/linePositions.js +30 -0
- package/dist/components/overlay/details/OpacityDetails.svelte +44 -0
- package/dist/components/overlay/details/OpacityDetails.svelte.d.ts +7 -0
- package/dist/components/overlay/details/PoseDetails.svelte +189 -0
- package/dist/components/overlay/details/PoseDetails.svelte.d.ts +14 -0
- package/dist/ecs/traits.d.ts +1 -1
- package/dist/ecs/traits.js +1 -1
- package/dist/hooks/useWorldState.svelte.js +39 -50
- package/package.json +3 -1
package/dist/ecs/traits.d.ts
CHANGED
|
@@ -71,7 +71,7 @@ export declare const Invisible: import("koota").Trait<() => boolean>;
|
|
|
71
71
|
* `details-extensions` portal target (e.g. gizmo plugin entities) opt in by
|
|
72
72
|
* adding this trait.
|
|
73
73
|
*/
|
|
74
|
-
export declare const CustomDetails: import("koota").
|
|
74
|
+
export declare const CustomDetails: import("koota").TagTrait;
|
|
75
75
|
/**
|
|
76
76
|
* True when the entity itself, or any of its parents up the `ChildOf`
|
|
77
77
|
* chain, has `Invisible`. Maintained by `provideInheritedInvisible`;
|
package/dist/ecs/traits.js
CHANGED
|
@@ -68,7 +68,7 @@ export const Invisible = trait(() => true);
|
|
|
68
68
|
* `details-extensions` portal target (e.g. gizmo plugin entities) opt in by
|
|
69
69
|
* adding this trait.
|
|
70
70
|
*/
|
|
71
|
-
export const CustomDetails = trait(
|
|
71
|
+
export const CustomDetails = trait();
|
|
72
72
|
/**
|
|
73
73
|
* True when the entity itself, or any of its parents up the `ChildOf`
|
|
74
74
|
* chain, has `Invisible`. Maintained by `provideInheritedInvisible`;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { useThrelte } from '@threlte/core';
|
|
2
2
|
import { Struct, TransformChangeType, WorldStateStoreClient, } from '@viamrobotics/sdk';
|
|
3
|
-
import { createResourceClient, createResourceQuery,
|
|
3
|
+
import { createResourceClient, createResourceQuery, useResourceNames, } from '@viamrobotics/svelte-sdk';
|
|
4
4
|
import { Matrix4 } from 'three';
|
|
5
5
|
import { asFloat32Array, inMeters } from '../buffer';
|
|
6
6
|
import { createChunkLoader } from '../chunking';
|
|
@@ -161,14 +161,12 @@ const createWorldState = (client) => {
|
|
|
161
161
|
};
|
|
162
162
|
let initialized = false;
|
|
163
163
|
let flushScheduled = false;
|
|
164
|
+
let rafId = 0;
|
|
164
165
|
let pendingEvents = [];
|
|
165
166
|
const listUUIDs = createResourceQuery(client, 'listUUIDs');
|
|
166
167
|
const getTransformQueries = $derived(listUUIDs.data?.map((uuid) => {
|
|
167
168
|
return createResourceQuery(client, 'getTransform', () => [uuid], () => ({ refetchInterval: false }));
|
|
168
169
|
}));
|
|
169
|
-
const changeStream = createResourceStream(client, 'streamTransformChanges', {
|
|
170
|
-
refetchMode: 'replace',
|
|
171
|
-
});
|
|
172
170
|
const applyEvents = (events) => {
|
|
173
171
|
for (const event of events) {
|
|
174
172
|
if (event.changeType === TransformChangeType.ADDED) {
|
|
@@ -190,11 +188,12 @@ const createWorldState = (client) => {
|
|
|
190
188
|
if (flushScheduled)
|
|
191
189
|
return;
|
|
192
190
|
flushScheduled = true;
|
|
193
|
-
requestAnimationFrame(() => {
|
|
194
|
-
|
|
195
|
-
applyEvents(toApply);
|
|
191
|
+
rafId = requestAnimationFrame(() => {
|
|
192
|
+
rafId = 0;
|
|
196
193
|
flushScheduled = false;
|
|
194
|
+
const toApply = pendingEvents;
|
|
197
195
|
pendingEvents = [];
|
|
196
|
+
applyEvents(toApply);
|
|
198
197
|
});
|
|
199
198
|
};
|
|
200
199
|
$effect(() => {
|
|
@@ -213,55 +212,45 @@ const createWorldState = (client) => {
|
|
|
213
212
|
invalidate();
|
|
214
213
|
initialized = true;
|
|
215
214
|
});
|
|
216
|
-
|
|
217
|
-
|
|
215
|
+
/**
|
|
216
|
+
* Consumes the `streamTransformChanges` server stream directly.
|
|
217
|
+
* Transform changes are write-once into the ECS world, so we drain
|
|
218
|
+
* each event into `pendingEvents` (cleared every flush) and never
|
|
219
|
+
* retain history. Mirrors `useDrawService`'s stream consumption.
|
|
220
|
+
*/
|
|
221
|
+
const consumeChanges = async (signal) => {
|
|
222
|
+
const activeClient = client.current;
|
|
223
|
+
if (!activeClient)
|
|
218
224
|
return;
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
continue;
|
|
223
|
-
}
|
|
224
|
-
const uuid = event.transform.uuidString;
|
|
225
|
-
const existing = eventsByUUID.get(uuid);
|
|
226
|
-
if (!existing) {
|
|
227
|
-
eventsByUUID.set(uuid, event);
|
|
228
|
-
continue;
|
|
229
|
-
}
|
|
230
|
-
switch (event.changeType) {
|
|
231
|
-
case TransformChangeType.REMOVED: {
|
|
232
|
-
eventsByUUID.set(uuid, event);
|
|
233
|
-
break;
|
|
234
|
-
}
|
|
235
|
-
case TransformChangeType.ADDED: {
|
|
236
|
-
if (existing.changeType !== TransformChangeType.REMOVED) {
|
|
237
|
-
eventsByUUID.set(uuid, event);
|
|
238
|
-
}
|
|
239
|
-
break;
|
|
240
|
-
}
|
|
241
|
-
case TransformChangeType.UPDATED: {
|
|
242
|
-
// merge with existing updated event
|
|
243
|
-
if (existing.changeType === TransformChangeType.UPDATED) {
|
|
244
|
-
existing.updatedFields ??= { paths: [] };
|
|
245
|
-
const paths = event.updatedFields?.paths ?? [];
|
|
246
|
-
for (const path of paths) {
|
|
247
|
-
if (existing.updatedFields.paths.includes(path)) {
|
|
248
|
-
continue;
|
|
249
|
-
}
|
|
250
|
-
existing.updatedFields.paths.push(path);
|
|
251
|
-
}
|
|
252
|
-
existing.transform = event.transform;
|
|
253
|
-
}
|
|
254
|
-
else {
|
|
255
|
-
eventsByUUID.set(uuid, event);
|
|
256
|
-
}
|
|
225
|
+
try {
|
|
226
|
+
for await (const event of activeClient.streamTransformChanges(undefined, { signal })) {
|
|
227
|
+
if (signal.aborted)
|
|
257
228
|
break;
|
|
258
|
-
|
|
229
|
+
if (!event.transform)
|
|
230
|
+
continue;
|
|
231
|
+
pendingEvents.push(event);
|
|
232
|
+
scheduleFlush();
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
catch (error) {
|
|
236
|
+
if (!signal.aborted) {
|
|
237
|
+
console.error('World state transform stream error:', error);
|
|
259
238
|
}
|
|
260
239
|
}
|
|
261
|
-
|
|
262
|
-
|
|
240
|
+
};
|
|
241
|
+
$effect(() => {
|
|
242
|
+
if (!client.current)
|
|
243
|
+
return;
|
|
244
|
+
const controller = new AbortController();
|
|
245
|
+
void consumeChanges(controller.signal);
|
|
246
|
+
return () => {
|
|
247
|
+
controller.abort();
|
|
248
|
+
};
|
|
263
249
|
});
|
|
264
250
|
return () => {
|
|
251
|
+
if (rafId)
|
|
252
|
+
cancelAnimationFrame(rafId);
|
|
253
|
+
pendingEvents = [];
|
|
265
254
|
chunkLoader.dispose();
|
|
266
255
|
for (const [, entity] of entities) {
|
|
267
256
|
if (world.has(entity)) {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@viamrobotics/motion-tools",
|
|
3
|
-
"version": "1.33.
|
|
3
|
+
"version": "1.33.1",
|
|
4
4
|
"description": "Motion visualization with Viam",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"type": "module",
|
|
@@ -33,6 +33,7 @@
|
|
|
33
33
|
"@threlte/rapier": "3.4.1",
|
|
34
34
|
"@threlte/xr": "1.6.0",
|
|
35
35
|
"@types/bun": "1.2.21",
|
|
36
|
+
"@types/d3-force": "^3.0.10",
|
|
36
37
|
"@types/earcut": "^3.0.0",
|
|
37
38
|
"@types/lodash-es": "4.17.12",
|
|
38
39
|
"@types/node": "^25.6.0",
|
|
@@ -163,6 +164,7 @@
|
|
|
163
164
|
"dependencies": {
|
|
164
165
|
"@bufbuild/protobuf": "1.10.1",
|
|
165
166
|
"@neodrag/svelte": "^2.3.3",
|
|
167
|
+
"d3-force": "^3.0.0",
|
|
166
168
|
"filtrex": "^3.1.0",
|
|
167
169
|
"koota": "0.6.5",
|
|
168
170
|
"lodash-es": "4.18.1",
|