@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.
Files changed (59) hide show
  1. package/dist/components/Entities/Entities.svelte +18 -25
  2. package/dist/components/Entities/Entities.svelte.d.ts +2 -17
  3. package/dist/components/Entities/Label.svelte +79 -13
  4. package/dist/components/Entities/Label.svelte.d.ts +2 -1
  5. package/dist/components/Entities/Labels.svelte +36 -0
  6. package/dist/components/Entities/Labels.svelte.d.ts +3 -0
  7. package/dist/components/Entities/LineDots.svelte +8 -3
  8. package/dist/components/Entities/labelLayout/applyTeleports.d.ts +9 -0
  9. package/dist/components/Entities/labelLayout/applyTeleports.js +39 -0
  10. package/dist/components/Entities/labelLayout/buildNeighborhood.d.ts +8 -0
  11. package/dist/components/Entities/labelLayout/buildNeighborhood.js +26 -0
  12. package/dist/components/Entities/labelLayout/cameraHash.d.ts +8 -0
  13. package/dist/components/Entities/labelLayout/cameraHash.js +25 -0
  14. package/dist/components/Entities/labelLayout/cost.d.ts +44 -0
  15. package/dist/components/Entities/labelLayout/cost.js +126 -0
  16. package/dist/components/Entities/labelLayout/createLabelLayout.d.ts +27 -0
  17. package/dist/components/Entities/labelLayout/createLabelLayout.js +194 -0
  18. package/dist/components/Entities/labelLayout/geometry.d.ts +20 -0
  19. package/dist/components/Entities/labelLayout/geometry.js +151 -0
  20. package/dist/components/Entities/labelLayout/labelStore.svelte.d.ts +17 -0
  21. package/dist/components/Entities/labelLayout/labelStore.svelte.js +28 -0
  22. package/dist/components/Entities/labelLayout/measure.d.ts +13 -0
  23. package/dist/components/Entities/labelLayout/measure.js +42 -0
  24. package/dist/components/Entities/labelLayout/slots.d.ts +11 -0
  25. package/dist/components/Entities/labelLayout/slots.js +47 -0
  26. package/dist/components/Entities/labelLayout/solve.d.ts +11 -0
  27. package/dist/components/Entities/labelLayout/solve.js +93 -0
  28. package/dist/components/Entities/labelLayout/spatialHash.d.ts +15 -0
  29. package/dist/components/Entities/labelLayout/spatialHash.js +53 -0
  30. package/dist/components/Entities/labelLayout/types.d.ts +105 -0
  31. package/dist/components/Entities/labelLayout/types.js +19 -0
  32. package/dist/components/Entities/labelLayout/writeBack.d.ts +20 -0
  33. package/dist/components/Entities/labelLayout/writeBack.js +51 -0
  34. package/dist/components/Scene.svelte +2 -1
  35. package/dist/components/SelectedTransformControls.svelte +65 -47
  36. package/dist/components/overlay/Details.svelte +198 -224
  37. package/dist/components/overlay/Details.svelte.d.ts +1 -1
  38. package/dist/components/overlay/Popover.svelte +6 -4
  39. package/dist/components/overlay/Popover.svelte.d.ts +6 -2
  40. package/dist/components/overlay/dashboard/Button.svelte +7 -2
  41. package/dist/components/overlay/dashboard/Button.svelte.d.ts +2 -1
  42. package/dist/components/overlay/details/AxesHelperDetails.svelte +32 -0
  43. package/dist/components/overlay/details/AxesHelperDetails.svelte.d.ts +7 -0
  44. package/dist/components/overlay/details/ColorDetails.svelte +35 -0
  45. package/dist/components/overlay/details/ColorDetails.svelte.d.ts +7 -0
  46. package/dist/components/overlay/details/GeometryDetails.svelte +104 -0
  47. package/dist/components/overlay/details/GeometryDetails.svelte.d.ts +7 -0
  48. package/dist/components/overlay/details/LineDetails/LineDetails.svelte +196 -0
  49. package/dist/components/overlay/details/LineDetails/LineDetails.svelte.d.ts +7 -0
  50. package/dist/components/overlay/details/LineDetails/linePositions.d.ts +3 -0
  51. package/dist/components/overlay/details/LineDetails/linePositions.js +30 -0
  52. package/dist/components/overlay/details/OpacityDetails.svelte +44 -0
  53. package/dist/components/overlay/details/OpacityDetails.svelte.d.ts +7 -0
  54. package/dist/components/overlay/details/PoseDetails.svelte +189 -0
  55. package/dist/components/overlay/details/PoseDetails.svelte.d.ts +14 -0
  56. package/dist/ecs/traits.d.ts +1 -1
  57. package/dist/ecs/traits.js +1 -1
  58. package/dist/hooks/useWorldState.svelte.js +39 -50
  59. package/package.json +3 -1
@@ -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").Trait<() => boolean>;
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`;
@@ -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(() => true);
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, createResourceStream, useResourceNames, } from '@viamrobotics/svelte-sdk';
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
- const toApply = pendingEvents;
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
- $effect(() => {
217
- if (changeStream?.data === undefined)
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
- const eventsByUUID = new Map();
220
- for (const event of changeStream.data) {
221
- if (!event.transform) {
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
- pendingEvents.push(...eventsByUUID.values());
262
- scheduleFlush();
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.0",
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",