forked from threlte/threlte
-
Notifications
You must be signed in to change notification settings - Fork 3
/
Mesh.svelte
81 lines (73 loc) · 2.22 KB
/
Mesh.svelte
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
<script lang="ts">
import { Mesh as ThreeMesh } from 'three'
import { useThrelte } from '../hooks/useThrelte'
import MeshInstance from '../instances/MeshInstance.svelte'
import type { MeshProperties } from '../types/components'
// MeshInstance
export let position: MeshProperties['position'] = undefined
export let scale: MeshProperties['scale'] = undefined
export let rotation: MeshProperties['rotation'] = undefined
export let viewportAware: MeshProperties['viewportAware'] = false
export let inViewport: MeshProperties['inViewport'] = false
export let castShadow: MeshProperties['castShadow'] = undefined
export let receiveShadow: MeshProperties['receiveShadow'] = undefined
export let frustumCulled: MeshProperties['frustumCulled'] = undefined
export let renderOrder: MeshProperties['renderOrder'] = undefined
export let visible: MeshProperties['visible'] = undefined
export let interactive: MeshProperties['interactive'] = false
export let ignorePointer: MeshProperties['ignorePointer'] = false
export let lookAt: MeshProperties['lookAt'] = undefined
// self
export let geometry: MeshProperties['geometry']
export let material: MeshProperties['material']
let previousMaterial = material
let previousGeometry = geometry
const { invalidate } = useThrelte()
export const mesh = new ThreeMesh(geometry, material)
const getMesh = () => mesh
$: {
if (material !== previousMaterial) {
getMesh().material = material
invalidate('Mesh: material changed')
} else {
invalidate('Mesh: material props changed')
}
previousMaterial = material
}
$: {
if (geometry !== previousGeometry) {
getMesh().geometry = geometry
invalidate('Mesh: geometry changed')
} else {
invalidate('Mesh: geometry props changed')
}
previousGeometry = geometry
}
</script>
<MeshInstance
{mesh}
{position}
{scale}
{rotation}
{lookAt}
{castShadow}
{receiveShadow}
{frustumCulled}
{renderOrder}
{visible}
{interactive}
{ignorePointer}
on:click
on:contextmenu
on:pointerup
on:pointerdown
on:pointerenter
on:pointerleave
on:pointermove
{viewportAware}
bind:inViewport
on:viewportenter
on:viewportleave
>
<slot />
</MeshInstance>