File size: 2,558 Bytes
3aea7c6
18b0fa5
 
 
 
 
 
 
 
3aea7c6
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
18b0fa5
3aea7c6
 
 
 
 
 
 
 
 
 
ca4340e
 
3aea7c6
 
 
 
18b0fa5
 
3aea7c6
ca4340e
18b0fa5
3aea7c6
 
 
 
 
 
 
 
 
 
18b0fa5
3aea7c6
ca4340e
18b0fa5
3aea7c6
 
 
 
 
 
 
 
 
 
18b0fa5
3aea7c6
 
ca4340e
18b0fa5
3aea7c6
 
 
 
 
 
 
 
 
 
18b0fa5
3aea7c6
 
 
 
18b0fa5
3aea7c6
18b0fa5
3aea7c6
 
18b0fa5
3aea7c6
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
<script lang="ts">
	import type { IUrdfVisual } from "../interfaces/IUrdfVisual";
	import { numberArrayToColor } from "../utils/helper";
	import DAE from "../mesh/DAE.svelte";
	import OBJ from "../mesh/OBJ.svelte";
	import STL from "../mesh/STL.svelte";
	import { T } from "@threlte/core";
	import { type InteractivityProps } from "@threlte/extras";
	import { DoubleSide, type Side } from "three";

	type Props = InteractivityProps & {
		visual: IUrdfVisual;
		defaultColor?: string;
		position?: [number, number, number];
		rotation?: [number, number, number];
		castShadow?: boolean;
		receiveShadow?: boolean;
		opacity?: number;
		isInteractive?: boolean;
		wireframe?: boolean;
		side?: Side;
	};

	let {
		visual,
		opacity = 1.0,
		defaultColor = "#000000",
		position = [0, 0, 0],
		rotation = [0, 0, 0],
		castShadow = true,
		receiveShadow = true,
		isInteractive = false,
		wireframe = false,
		side = DoubleSide,
		...restProps
	}: Props = $props();

	// Use context color only when hovering, otherwise use original logic
	const baseColor = visual?.color_rgba
		? numberArrayToColor(visual.color_rgba.slice(0, 3) as [number, number, number])
		: defaultColor;
</script>

{#if visual.type === "mesh"}
	{#if visual.geometry.type === "stl"}
		<STL
			color={baseColor}
			{opacity}
			filename={visual.geometry.filename}
			scale={visual.geometry.scale}
			{position}
			{rotation}
			{castShadow}
			{receiveShadow}
			{wireframe}
			{side}
			{...restProps}
		/>
	{:else if visual.geometry.type === "obj"}
		<OBJ
			color={baseColor}
			{opacity}
			scale={visual.geometry.scale}
			filename={visual.geometry.filename}
			{position}
			{rotation}
			{castShadow}
			{receiveShadow}
			{wireframe}
			{side}
			{...restProps}
		/>
	{:else if visual.geometry.type === "dae"}
		<DAE
			filename={visual.geometry.filename}
			color={baseColor}
			{opacity}
			scale={visual.geometry.scale}
			{position}
			{rotation}
			{castShadow}
			{receiveShadow}
			{wireframe}
			{side}
			{...restProps}
		/>
	{/if}
{:else if visual.type === "cylinder"}
	<T.Mesh castShadow receiveShadow rotation={[Math.PI / 2, 0, 0]} {onclick}>
		<T.CylinderGeometry
			args={[visual.geometry.radius, visual.geometry.radius, visual.geometry.length]}
		/>
		<T.MeshBasicMaterial color={baseColor} {opacity} transparent={opacity < 1.0} />
	</T.Mesh>
{:else if visual.type === "box"}
	<T.Mesh castShadow receiveShadow scale={visual.geometry.size} {onclick}>
		<T.BoxGeometry />
		<T.MeshBasicMaterial color={baseColor} {opacity} transparent={opacity < 1.0} />
	</T.Mesh>
{/if}