@viamrobotics/motion-tools 0.18.1 → 0.18.2
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.
|
@@ -8,8 +8,12 @@
|
|
|
8
8
|
import { useObjectEvents } from '../hooks/useObjectEvents.svelte'
|
|
9
9
|
import { Color, type Object3D } from 'three'
|
|
10
10
|
import Geometry from './Geometry.svelte'
|
|
11
|
+
import { useWeblabs } from '../hooks/useWeblabs.svelte'
|
|
11
12
|
import { useSelected } from '../hooks/useSelection.svelte'
|
|
13
|
+
import { useSettings } from '../hooks/useSettings.svelte'
|
|
14
|
+
import { use3DModels } from '../hooks/use3DModels.svelte'
|
|
12
15
|
import { colors, darkenColor } from '../color'
|
|
16
|
+
import { WEBLABS_EXPERIMENTS } from '../hooks/useWeblabs.svelte'
|
|
13
17
|
|
|
14
18
|
interface Props {
|
|
15
19
|
uuid: string
|
|
@@ -20,16 +24,34 @@
|
|
|
20
24
|
children?: Snippet<[{ ref: Object3D }]>
|
|
21
25
|
}
|
|
22
26
|
|
|
23
|
-
let { uuid, ...rest }: Props = $props()
|
|
27
|
+
let { uuid, name, ...rest }: Props = $props()
|
|
24
28
|
|
|
29
|
+
const settings = useSettings()
|
|
30
|
+
const componentModels = use3DModels()
|
|
25
31
|
const selected = useSelected()
|
|
32
|
+
const weblabs = useWeblabs()
|
|
26
33
|
const events = useObjectEvents(() => uuid)
|
|
27
34
|
|
|
28
35
|
const color = $derived(rest.metadata.color ?? colors.default)
|
|
36
|
+
|
|
37
|
+
const model = $derived.by(() => {
|
|
38
|
+
if (!weblabs.isActive(WEBLABS_EXPERIMENTS.MOTION_TOOLS_RENDER_ARM_MODELS)) {
|
|
39
|
+
return
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
const [componentName, id] = name.split(':')
|
|
43
|
+
if (!componentName || !id) {
|
|
44
|
+
return
|
|
45
|
+
}
|
|
46
|
+
return componentModels.current?.[componentName]?.[id]
|
|
47
|
+
})
|
|
29
48
|
</script>
|
|
30
49
|
|
|
31
50
|
<Geometry
|
|
32
51
|
{uuid}
|
|
52
|
+
{name}
|
|
53
|
+
{model}
|
|
54
|
+
renderMode={settings.current.renderArmModels}
|
|
33
55
|
color={selected.current === uuid
|
|
34
56
|
? `#${darkenColor(color, 75).getHexString()}`
|
|
35
57
|
: `#${colorUtil.set(color).getHexString()}`}
|
|
@@ -1,3 +1,9 @@
|
|
|
1
|
+
<!--
|
|
2
|
+
|
|
3
|
+
This component is consumed as a library export
|
|
4
|
+
and should remain pure, i.e. no hooks should be used.
|
|
5
|
+
|
|
6
|
+
-->
|
|
1
7
|
<script lang="ts">
|
|
2
8
|
import { T, type Props as ThrelteProps } from '@threlte/core'
|
|
3
9
|
import { type Snippet } from 'svelte'
|
|
@@ -10,14 +16,7 @@
|
|
|
10
16
|
import type { WorldObject } from '../WorldObject.svelte'
|
|
11
17
|
import { PLYLoader } from 'three/addons/loaders/PLYLoader.js'
|
|
12
18
|
|
|
13
|
-
import { WEBLABS_EXPERIMENTS } from '../hooks/useWeblabs.svelte'
|
|
14
|
-
import { useSettings } from '../hooks/useSettings.svelte'
|
|
15
|
-
import { useWeblabs } from '../hooks/useWeblabs.svelte'
|
|
16
|
-
import { use3DModels } from '../hooks/use3DModels.svelte'
|
|
17
|
-
const settings = useSettings()
|
|
18
19
|
const plyLoader = new PLYLoader()
|
|
19
|
-
const weblabs = useWeblabs()
|
|
20
|
-
const componentModels = use3DModels()
|
|
21
20
|
|
|
22
21
|
interface Props extends ThrelteProps<Group> {
|
|
23
22
|
uuid: string
|
|
@@ -25,8 +24,10 @@
|
|
|
25
24
|
geometry?: WorldObject['geometry']
|
|
26
25
|
pose: WorldObject['pose']
|
|
27
26
|
metadata: WorldObject['metadata']
|
|
28
|
-
children?: Snippet<[{ ref: Group }]>
|
|
29
27
|
color?: string
|
|
28
|
+
model?: Group
|
|
29
|
+
renderMode?: 'model' | 'colliders' | 'colliders+model'
|
|
30
|
+
children?: Snippet<[{ ref: Group }]>
|
|
30
31
|
}
|
|
31
32
|
|
|
32
33
|
let {
|
|
@@ -36,32 +37,15 @@
|
|
|
36
37
|
metadata,
|
|
37
38
|
pose,
|
|
38
39
|
color: overrideColor,
|
|
40
|
+
model,
|
|
41
|
+
renderMode = 'colliders',
|
|
39
42
|
children,
|
|
40
43
|
...rest
|
|
41
44
|
}: Props = $props()
|
|
42
45
|
|
|
43
|
-
const gltfModel = $derived.by(() => {
|
|
44
|
-
const [componentName, id] = name.split(':')
|
|
45
|
-
if (!componentName || !id) {
|
|
46
|
-
return undefined
|
|
47
|
-
}
|
|
48
|
-
return componentModels.current?.[componentName]?.[id]
|
|
49
|
-
})
|
|
50
|
-
|
|
51
46
|
const type = $derived(geometry?.geometryType?.case)
|
|
52
47
|
const color = $derived(overrideColor ?? metadata.color ?? colors.default)
|
|
53
48
|
|
|
54
|
-
const renderModels = $derived(
|
|
55
|
-
(settings.current.renderArmModels === 'model' ||
|
|
56
|
-
settings.current.renderArmModels === 'colliders+model') &&
|
|
57
|
-
gltfModel
|
|
58
|
-
)
|
|
59
|
-
const renderPrimitives = $derived(
|
|
60
|
-
settings.current.renderArmModels === 'colliders' ||
|
|
61
|
-
settings.current.renderArmModels === 'colliders+model' ||
|
|
62
|
-
!gltfModel
|
|
63
|
-
)
|
|
64
|
-
|
|
65
49
|
const group = new Group()
|
|
66
50
|
const mesh = $derived.by(() => {
|
|
67
51
|
if (type === undefined) {
|
|
@@ -76,16 +60,6 @@
|
|
|
76
60
|
return result
|
|
77
61
|
})
|
|
78
62
|
|
|
79
|
-
$effect.pre(() => {
|
|
80
|
-
if (
|
|
81
|
-
weblabs.isActive(WEBLABS_EXPERIMENTS.MOTION_TOOLS_RENDER_ARM_MODELS) &&
|
|
82
|
-
renderModels &&
|
|
83
|
-
!renderPrimitives
|
|
84
|
-
) {
|
|
85
|
-
geo = undefined
|
|
86
|
-
}
|
|
87
|
-
})
|
|
88
|
-
|
|
89
63
|
$effect.pre(() => {
|
|
90
64
|
if (geometry?.center && mesh) {
|
|
91
65
|
poseToObject3d(geometry.center, mesh)
|
|
@@ -139,11 +113,11 @@
|
|
|
139
113
|
{uuid}
|
|
140
114
|
bvh={{ enabled: false }}
|
|
141
115
|
>
|
|
142
|
-
{#if
|
|
143
|
-
<T is={
|
|
116
|
+
{#if model && renderMode.includes('model')}
|
|
117
|
+
<T is={model} />
|
|
144
118
|
{/if}
|
|
145
119
|
|
|
146
|
-
{#if
|
|
120
|
+
{#if renderMode.includes('colliders')}
|
|
147
121
|
{#if geometry.geometryType.case === 'bufferGeometry'}
|
|
148
122
|
<T
|
|
149
123
|
is={geometry.geometryType.value}
|
|
@@ -193,7 +167,7 @@
|
|
|
193
167
|
opacity={metadata.opacity ?? 0.7}
|
|
194
168
|
/>
|
|
195
169
|
|
|
196
|
-
{#if geo}
|
|
170
|
+
{#if geo && renderMode.includes('colliders')}
|
|
197
171
|
<T.LineSegments
|
|
198
172
|
raycast={() => null}
|
|
199
173
|
bvh={{ enabled: false }}
|
|
@@ -8,10 +8,12 @@ interface Props extends ThrelteProps<Group> {
|
|
|
8
8
|
geometry?: WorldObject['geometry'];
|
|
9
9
|
pose: WorldObject['pose'];
|
|
10
10
|
metadata: WorldObject['metadata'];
|
|
11
|
+
color?: string;
|
|
12
|
+
model?: Group;
|
|
13
|
+
renderMode?: 'model' | 'colliders' | 'colliders+model';
|
|
11
14
|
children?: Snippet<[{
|
|
12
15
|
ref: Group;
|
|
13
16
|
}]>;
|
|
14
|
-
color?: string;
|
|
15
17
|
}
|
|
16
18
|
declare const Geometry: import("svelte").Component<Props, {}, "">;
|
|
17
19
|
type Geometry = ReturnType<typeof Geometry>;
|