|
@@ -1,9 +1,11 @@
|
|
|
-import { defineComponent, h, onUnmounted, PropType, ref, watchEffect } from 'vue'
|
|
|
+import { useRenderLoop } from '@tresjs/core'
|
|
|
+import { defineComponent, h, onUnmounted, PropType, provide, ref, watch, watchEffect } from 'vue'
|
|
|
/* eslint-disable vue/one-component-per-file */
|
|
|
import * as THREE from 'three'
|
|
|
import { ShadowMapType, TextureEncoding, ToneMapping } from 'three'
|
|
|
/* import { OrbitControls } from '@tresjs/cientos' */
|
|
|
-import { extend, createTres } from '/@/core/renderer'
|
|
|
+import { createTres } from '/@/core/renderer'
|
|
|
+import { useCamera, useRenderer, useTres } from '/@/composables'
|
|
|
|
|
|
export const TresCanvas = defineComponent({
|
|
|
name: 'TresCanvas',
|
|
@@ -30,12 +32,17 @@ export const TresCanvas = defineComponent({
|
|
|
clearColor: String,
|
|
|
windowSize: { type: Boolean, default: false },
|
|
|
},
|
|
|
- setup(props, { slots, attrs }) {
|
|
|
+ setup(props, { slots, attrs, expose }) {
|
|
|
const container = ref<HTMLElement>()
|
|
|
const canvas = ref<HTMLCanvasElement>()
|
|
|
+ const { state, setState } = useTres()
|
|
|
|
|
|
- watchEffect(() => {
|
|
|
- const renderer = new THREE.WebGLRenderer({
|
|
|
+ const { renderer, aspectRatio } = useRenderer(canvas, container, props)
|
|
|
+ const { activeCamera } = useCamera()
|
|
|
+
|
|
|
+ provide('aspect-ratio', aspectRatio)
|
|
|
+ provide('renderer', renderer)
|
|
|
+ /* const renderer = new THREE.WebGLRenderer({
|
|
|
canvas: canvas.value,
|
|
|
antialias: true,
|
|
|
alpha: true,
|
|
@@ -43,44 +50,44 @@ export const TresCanvas = defineComponent({
|
|
|
})
|
|
|
renderer.outputEncoding = THREE.sRGBEncoding
|
|
|
renderer.toneMapping = THREE.ACESFilmicToneMapping
|
|
|
- renderer.setSize(window.innerWidth, window.innerHeight)
|
|
|
+ renderer.setSize(window.innerWidth, window.innerHeight) */
|
|
|
|
|
|
- const camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight)
|
|
|
- camera.position.set(0, 2, 7)
|
|
|
+ /* const camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight)
|
|
|
+ camera.position.set(0, 2, 7) */
|
|
|
|
|
|
- /* const controls = new OrbitControls(camera, renderer.domElement)
|
|
|
+ /* const controls = new OrbitControls(camera, renderer.domElement)
|
|
|
controls.enableDamping = true */
|
|
|
|
|
|
- const scene = new THREE.Scene()
|
|
|
+ const scene = new THREE.Scene()
|
|
|
|
|
|
- window.addEventListener('resize', () => {
|
|
|
- renderer.setSize(window.innerWidth, window.innerHeight)
|
|
|
- camera.aspect = window.innerWidth / window.innerHeight
|
|
|
- camera.updateProjectionMatrix()
|
|
|
- })
|
|
|
+ const { onLoop } = useRenderLoop()
|
|
|
|
|
|
- renderer.setAnimationLoop(() => {
|
|
|
- /* controls.update() */
|
|
|
- renderer.render(scene, camera)
|
|
|
- })
|
|
|
+ onLoop(() => {
|
|
|
+ if (!activeCamera.value) return
|
|
|
+ renderer.value?.render(scene, activeCamera.value)
|
|
|
+ })
|
|
|
|
|
|
- const internal = slots?.default() || []
|
|
|
+ const internal = slots?.default() || []
|
|
|
|
|
|
- const internalComponent = defineComponent({
|
|
|
- name: 'Wrapper',
|
|
|
- setup() {
|
|
|
- return () => internal
|
|
|
- },
|
|
|
- })
|
|
|
+ const internalComponent = defineComponent({
|
|
|
+ name: 'Wrapper',
|
|
|
+ setup() {
|
|
|
+ return () => internal
|
|
|
+ },
|
|
|
+ })
|
|
|
|
|
|
- const app = createTres(internalComponent)
|
|
|
- app.mount(scene)
|
|
|
+ const app = createTres(internalComponent)
|
|
|
+ app.mount(scene)
|
|
|
|
|
|
- console.log(app)
|
|
|
+ console.log(scene)
|
|
|
|
|
|
- onUnmounted(() => {
|
|
|
- app.unmount()
|
|
|
- })
|
|
|
+ expose({
|
|
|
+ scene,
|
|
|
+ app,
|
|
|
+ })
|
|
|
+
|
|
|
+ onUnmounted(() => {
|
|
|
+ app.unmount()
|
|
|
})
|
|
|
|
|
|
return () => {
|