Skip to content

Commit db65f3f

Browse files
Tinooooalvarosabu
andauthored
feat!: useLoop and useRenderLoop refactoring (#1035)
BREAKING CHANGE: onAfterRender has been renamed to onRender * refactor: type improvements in createPriorityEventHook * wip * wip * improved test * added context to useCreateRenderLoop and tests * fixed typing * added clock * wip * refactor: remove deprecated loop implementation and update related composables - Removed the old `useCreateRenderLoop` and its associated tests. - Updated `useLoop` to utilize the new `useRenderLoop` for better event handling. - Commented out `OrbitControls` in relevant Vue components for potential future use. - Cleaned up unused code and comments in `useTresContextProvider`. * added some todos * refactor: removed redundant eventhook * refactor: simplify renderer setup by removing loop parameter * refactor: enhance useRenderLoop to accept notifyFrameRendered callback * chore: removed obsolete comment * chore: made TresCanvas use correct event hook * refactor!: omitted frame in render manager return * refactor: restored renderEventHook * chore: added comments after meeting * refactor: made render loop more generic in it's naming * refactor: made useLoop use useTres context * chore: added jsdoc description for useLoop * refactor: rename LoopContext to RafLoopContext and update related references * refactor: replaced setTimeout with useTimeout * refactor: update useLoop tests to use useCreateRafLoop and adjust rendering logic * test: enhance useLoop tests with fake timers and add new callback functionality * chore: removed debug code * fix: initialize frames based on renderMode to ensure correct rendering behavior * refactor: fixed multiple playgrounds * feat: added loop and beforeLoop events to canvas * fix: fixed playground experience rafactor: renamed replaceCycleFunction to replaceLoopFunction * fix: fixed some more playgrounds * fixed some more playgrounds * refactor!: renamed onBeforeRender to onBeforeLoop and onRender to onLoop fix: fixed playgrounds * fixed test * refactor: tiny code styling improvement * refactor: omitted export of useCreateRafLoop * linting fixes * refactor: tiny improvement for fbo demo * refactor: rename fboRef to groupRef for clarity in FBO demo * refactor: renamed onBeforeLoop back to onBeforeRender and onLoop back to onRender * restored usage of orbit controls * more restoring of orbitcontrols usages * refactor: updated loop handling by renaming onLoop to onRender in TakeOverRenderExperience.vue and adjusted related emit definitions in TresCanvas.vue * removed obsolete comment * chore(playground): fixed related playgrounds (#1039) * refactor!: TresCanvas: changed type of event "render" to TresContext. --------- Co-authored-by: Alvaro Saburido <[email protected]>
1 parent 314182c commit db65f3f

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

41 files changed

+494
-952
lines changed

playground/vue/src/App.vue

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,6 @@ function setBodyClass(routeName: string) {
1010
}
1111
watch([route], () => setBodyClass(route.name?.toString() ?? ''))
1212
provide('v-route', route)
13-
provide('useTres', {
14-
message: `Im not the real useTres, but I can provide you with some data!`,
15-
})
1613
</script>
1714

1815
<template>

playground/vue/src/components/AnimatedObjectUseUpdate.vue

Lines changed: 0 additions & 65 deletions
This file was deleted.

playground/vue/src/components/BlenderCube.vue

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,22 @@
11
<script setup lang="ts">
22
import { useGLTF } from '@tresjs/cientos'
3+
import { whenever } from '@vueuse/core'
34
4-
const { nodes } = useGLTF('https://raw.githubusercontent.com/Tresjs/assets/main/models/gltf/blender-cube.glb', { draco: true })
5+
const emit = defineEmits<{
6+
ready: []
7+
}>()
8+
const { nodes, isReady } = useGLTF('https://raw.githubusercontent.com/Tresjs/assets/main/models/gltf/blender-cube.glb', { draco: true })
59
const model = computed(() => nodes.value.BlenderCube)
610
711
defineExpose({
812
model,
913
})
14+
15+
whenever(
16+
isReady,
17+
() => emit('ready'),
18+
{ once: true },
19+
)
1020
</script>
1121

1222
<template>

playground/vue/src/components/LocalOrbitControls.vue

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -298,7 +298,7 @@ const {
298298
mouseButtons,
299299
} = toRefs(props)
300300
301-
const { camera: activeCamera, renderer, extend, controls, invalidate } = useTresContext()
301+
const { camera: activeCamera, renderer, extend, controls } = useTresContext()
302302
303303
const controlsRef = shallowRef<OrbitControls | null>(null)
304304
@@ -317,7 +317,7 @@ watch(controlsRef, (value) => {
317317
function addEventListeners() {
318318
useEventListener(controlsRef.value as any, 'change', () => {
319319
emit('change', controlsRef.value)
320-
invalidate()
320+
renderer.invalidate()
321321
})
322322
useEventListener(controlsRef.value as any, 'start', () => emit('start', controlsRef.value))
323323
useEventListener(controlsRef.value as any, 'end', () => emit('end', controlsRef.value))
@@ -370,6 +370,6 @@ defineExpose({ instance: controlsRef })
370370
:enable-rotate="enableRotate"
371371
:rotate-speed="rotateSpeed"
372372
:mouse-buttons="mouseButtons"
373-
:args="[camera || activeCamera, domElement || renderer.domElement]"
373+
:args="[camera || activeCamera, domElement || renderer.instance.domElement]"
374374
/>
375375
</template>

playground/vue/src/components/TheSphere.vue

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,10 @@ const sphereRef = ref()
66
77
const { onBeforeRender } = useLoop()
88
9-
onBeforeRender((state) => {
9+
onBeforeRender(({ invalidate, elapsed }) => {
1010
if (!sphereRef.value) { return }
11-
sphereRef.value.position.y += Math.sin(state.elapsed) * 0.01
12-
state.invalidate()
11+
sphereRef.value.position.y += Math.sin(elapsed) * 0.01
12+
invalidate()
1313
})
1414
</script>
1515

playground/vue/src/pages/advanced/fbo/FBOCube.vue

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ watchEffect(() => {
2020
<TresMesh>
2121
<TresBoxGeometry :args="[1, 1, 1]" />
2222
<TresMeshBasicMaterial
23+
v-if="fboTarget"
2324
:color="0xFF8833"
2425
:map="fboTarget.texture ?? null"
2526
/>
Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,31 @@
11
<script setup lang="ts">
22
import { OrbitControls } from '@tresjs/cientos'
33
import { TresCanvas } from '@tresjs/core'
4-
import { BasicShadowMap, NoToneMapping, SRGBColorSpace } from 'three'
54
import FBOCube from './FBOCube.vue'
65
import '@tresjs/leches/styles'
76
8-
const gl = {
9-
clearColor: '#82DBC5',
10-
shadows: true,
11-
alpha: false,
12-
shadowMapType: BasicShadowMap,
13-
outputColorSpace: SRGBColorSpace,
14-
toneMapping: NoToneMapping,
7+
const groupRef = ref()
8+
9+
const onLoop = ({ elapsed }: { elapsed: number }) => {
10+
groupRef.value.position.y = Math.sin(elapsed)
1511
}
1612
</script>
1713

1814
<template>
19-
<TresCanvas v-bind="gl">
20-
<TresPerspectiveCamera :position="[3, 3, 3]" />
15+
<TresCanvas clear-color="#82DBC5" @loop="onLoop">
16+
<TresPerspectiveCamera :position="[3, 3, 3]" :look-at="[0, 0, 0]" />
2117
<OrbitControls />
22-
<!-- <Fbo
23-
ref="fboRef"
24-
v-bind="state"
25-
/> -->
26-
27-
<FBOCube />
28-
<AnimatedObjectUseUpdate />
18+
<TresGroup ref="groupRef">
19+
<FBOCube />
20+
</TresGroup>
21+
<TresMesh :position="[4, 0, 0]">
22+
<TresTorusKnotGeometry />
23+
<TresMeshNormalMaterial />
24+
</TresMesh>
25+
<TresMesh :position="[-4, 0, 0]">
26+
<TresTorusGeometry />
27+
<TresMeshNormalMaterial />
28+
</TresMesh>
2929
<TresAmbientLight :intensity="1" />
3030
</TresCanvas>
3131
</template>

playground/vue/src/pages/advanced/fbo/useFBO.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
import type { Camera } from 'three'
21
import type { Ref } from 'vue'
32
/* eslint-disable no-console */
43
import { useLoop, useTres } from '@tresjs/core'
@@ -75,7 +74,9 @@ export function useFBO(options: FboOptions) {
7574
logBefore()
7675
renderer.setRenderTarget(target.value)
7776
renderer.clear()
78-
renderer.render(scene, camera as Camera)
77+
if (camera.value) {
78+
renderer.render(scene.value, camera.value)
79+
}
7980
renderer.setRenderTarget(null)
8081
}, Number.POSITIVE_INFINITY)
8182

playground/vue/src/pages/advanced/manual/experience.vue

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ onMounted(() => {
1515
:position="[5, 5, 5]"
1616
:look-at="[0, 0, 0]"
1717
/>
18-
<BlenderCube />
18+
<BlenderCube @ready="advance" />
1919

2020
<TresGridHelper />
2121
<OrbitControls @change="advance" />
Lines changed: 24 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -1,54 +1,43 @@
11
<script setup lang="ts">
22
import { OrbitControls } from '@tresjs/cientos'
33
4-
import { useLoop } from '@tresjs/core'
4+
import { useLoop, useTres } from '@tresjs/core'
55
import { useControls } from '@tresjs/leches'
6+
import type { Mesh } from 'three'
67
7-
const { render, pauseRender, resumeRender } = useLoop()
8+
const { render, onRender } = useLoop()
9+
const { renderer, scene, camera } = useTres()
810
9-
const { off } = render(({ renderer, scene, camera }) => {
10-
renderer.instance.render(scene, camera)
11+
const { shouldRender } = useControls({
12+
shouldRender: true,
1113
})
1214
13-
const { isRenderPaused, unregisterRender } = useControls({
14-
isRenderPaused: {
15-
value: false,
16-
type: 'boolean',
17-
label: 'Pause Render',
18-
},
19-
unregisterRender: {
20-
value: false,
21-
type: 'boolean',
22-
label: 'Unregister render callback',
23-
},
24-
})
25-
26-
watchEffect(() => {
27-
if (unregisterRender.value) {
28-
off()
15+
render((notifySuccess) => {
16+
if (shouldRender.value && camera.value) {
17+
renderer.render(scene.value, camera.value)
18+
notifySuccess()
2919
}
3020
})
3121
32-
watchEffect(() => {
33-
if (isRenderPaused.value) {
34-
pauseRender()
35-
}
36-
else {
37-
resumeRender()
22+
const boxRef = ref<Mesh>()
23+
24+
onRender(() => {
25+
if (boxRef.value) {
26+
boxRef.value.rotation.y += 0.01
3827
}
3928
})
40-
41-
const showGrid = ref(true)
42-
43-
setTimeout(() => {
44-
showGrid.value = false
45-
}, 10000)
4629
</script>
4730

4831
<template>
49-
<TresPerspectiveCamera :position="[3, 3, 3]" />
32+
<TresPerspectiveCamera :position="[3, 3, 3]" :look-at="[0, 0, 0]" />
5033
<OrbitControls make-default />
51-
<AnimatedObjectUseUpdate />
52-
<TresGridHelper v-if="showGrid" />
34+
<TresMesh
35+
ref="boxRef"
36+
:position="[0, 0, 0]"
37+
cast-shadow
38+
>
39+
<TresBoxGeometry />
40+
<TresMeshNormalMaterial />
41+
</TresMesh>
5342
<TresAmbientLight :intensity="1" />
5443
</template>

0 commit comments

Comments
 (0)