|
@@ -1,7 +1,8 @@
|
|
<script setup lang="ts">
|
|
<script setup lang="ts">
|
|
-import { Camera, Object3D, Scene, WebGLRenderer } from 'three'
|
|
|
|
|
|
+import { useTres } from '@tresjs/core'
|
|
|
|
+import { Camera, Object3D, Scene, WebGLRenderer, type Event } from 'three'
|
|
import { TransformControls as TransformControlsImp } from 'three-stdlib'
|
|
import { TransformControls as TransformControlsImp } from 'three-stdlib'
|
|
-import { inject, computed, type Ref, unref, watch, shallowRef, ShallowRef } from 'vue'
|
|
|
|
|
|
+import { inject, computed, type Ref, unref, watch, shallowRef, ShallowRef, onUnmounted } from 'vue'
|
|
import { pick } from '../utils'
|
|
import { pick } from '../utils'
|
|
|
|
|
|
const props = withDefaults(
|
|
const props = withDefaults(
|
|
@@ -24,27 +25,48 @@ const props = withDefaults(
|
|
},
|
|
},
|
|
)
|
|
)
|
|
|
|
|
|
-let controls: ShallowRef<TransformControlsImp | undefined> = shallowRef()
|
|
|
|
|
|
+const emit = defineEmits(['dragging', 'change', 'mouseDown', 'mouseUp', 'objectChange'])
|
|
|
|
|
|
-const transformOnlyProps = [
|
|
|
|
- 'enabled',
|
|
|
|
- 'axis',
|
|
|
|
- 'mode',
|
|
|
|
- 'translationSnap',
|
|
|
|
- 'rotationSnap',
|
|
|
|
- 'scaleSnap',
|
|
|
|
- 'space',
|
|
|
|
- 'size',
|
|
|
|
- 'showX',
|
|
|
|
- 'showY',
|
|
|
|
- 'showZ',
|
|
|
|
-]
|
|
|
|
|
|
+let controls: ShallowRef<TransformControlsImp | undefined> = shallowRef()
|
|
|
|
|
|
const camera = inject<Ref<Camera>>('camera')
|
|
const camera = inject<Ref<Camera>>('camera')
|
|
const renderer = inject<Ref<WebGLRenderer>>('renderer')
|
|
const renderer = inject<Ref<WebGLRenderer>>('renderer')
|
|
const scene = inject<Ref<Scene>>('local-scene')
|
|
const scene = inject<Ref<Scene>>('local-scene')
|
|
|
|
|
|
-const transformProps = computed(() => pick(props, transformOnlyProps))
|
|
|
|
|
|
+const transformProps = computed(() =>
|
|
|
|
+ pick(props, [
|
|
|
|
+ 'enabled',
|
|
|
|
+ 'axis',
|
|
|
|
+ 'mode',
|
|
|
|
+ 'translationSnap',
|
|
|
|
+ 'rotationSnap',
|
|
|
|
+ 'scaleSnap',
|
|
|
|
+ 'space',
|
|
|
|
+ 'size',
|
|
|
|
+ 'showX',
|
|
|
|
+ 'showY',
|
|
|
|
+ 'showZ',
|
|
|
|
+ ]),
|
|
|
|
+)
|
|
|
|
+const { state } = useTres()
|
|
|
|
+
|
|
|
|
+const onChange = () => emit('change', controls.value)
|
|
|
|
+const onMouseDown = () => emit('mouseDown', controls.value)
|
|
|
|
+const onMouseUp = () => emit('mouseUp', controls.value)
|
|
|
|
+const onObjectChange = () => emit('objectChange', controls.value)
|
|
|
|
+
|
|
|
|
+const onDragingChange = (e: Event) => {
|
|
|
|
+ if (state.controls) state.controls.enabled = !e.value
|
|
|
|
+ emit('dragging', e.value)
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+function addEventListeners(controls: TransformControlsImp) {
|
|
|
|
+ controls.addEventListener('dragging-changed', onDragingChange)
|
|
|
|
+ controls.addEventListener('change', onChange)
|
|
|
|
+ controls.addEventListener('mouseDown', onMouseDown)
|
|
|
|
+ controls.addEventListener('mouseUp', onMouseUp)
|
|
|
|
+ controls.addEventListener('objectChange', onObjectChange)
|
|
|
|
+}
|
|
|
|
|
|
watch(
|
|
watch(
|
|
[camera, renderer],
|
|
[camera, renderer],
|
|
@@ -54,6 +76,8 @@ watch(
|
|
|
|
|
|
controls.value.attach(unref(props.object))
|
|
controls.value.attach(unref(props.object))
|
|
scene.value.add(unref(controls) as TransformControlsImp)
|
|
scene.value.add(unref(controls) as TransformControlsImp)
|
|
|
|
+
|
|
|
|
+ addEventListeners(unref(controls) as TransformControlsImp)
|
|
}
|
|
}
|
|
},
|
|
},
|
|
{
|
|
{
|
|
@@ -65,7 +89,6 @@ watch(
|
|
[transformProps, controls],
|
|
[transformProps, controls],
|
|
// TODO: properly type this
|
|
// TODO: properly type this
|
|
([value, controlsValue]: [any, any]) => {
|
|
([value, controlsValue]: [any, any]) => {
|
|
- console.log([value, controlsValue])
|
|
|
|
if (value && controlsValue) {
|
|
if (value && controlsValue) {
|
|
for (const key in value) {
|
|
for (const key in value) {
|
|
const methodName = `set${key[0].toUpperCase()}${key.slice(1)}`
|
|
const methodName = `set${key[0].toUpperCase()}${key.slice(1)}`
|
|
@@ -80,6 +103,16 @@ watch(
|
|
immediate: true,
|
|
immediate: true,
|
|
},
|
|
},
|
|
)
|
|
)
|
|
|
|
+
|
|
|
|
+onUnmounted(() => {
|
|
|
|
+ if (controls.value) {
|
|
|
|
+ controls.value.removeEventListener('dragging-changed', onDragingChange)
|
|
|
|
+ controls.value.removeEventListener('change', onChange)
|
|
|
|
+ controls.value.removeEventListener('mouseDown', onMouseDown)
|
|
|
|
+ controls.value.removeEventListener('mouseUp', onMouseUp)
|
|
|
|
+ controls.value.removeEventListener('objectChange', onObjectChange)
|
|
|
|
+ }
|
|
|
|
+})
|
|
</script>
|
|
</script>
|
|
<template>
|
|
<template>
|
|
<slot />
|
|
<slot />
|