Skip to content

Commit

Permalink
feature: add local props
Browse files Browse the repository at this point in the history
  • Loading branch information
emavitta-remago committed May 3, 2024
1 parent 3915215 commit b9192fb
Show file tree
Hide file tree
Showing 2 changed files with 49 additions and 8 deletions.
13 changes: 13 additions & 0 deletions playground/src/pages/abstractions/MouseParallaxDemo.vue
Original file line number Diff line number Diff line change
Expand Up @@ -27,4 +27,17 @@ const gl = {
<MouseParallax :factor="3" />
<TresAmbientLight :intensity="1" />
</TresCanvas>
<TresCanvas v-bind="gl">
<TresPerspectiveCamera
:position="[0, 0, 7.5]"
:fov="75"
:near="0.1"
:far="1000"
/>
<TorusKnot>
<TresMeshNormalMaterial />
</TorusKnot>
<MouseParallax :factor="3" local />
<TresAmbientLight :intensity="1" />
</TresCanvas>
</template>
44 changes: 36 additions & 8 deletions src/core/abstractions/MouseParallax.vue
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,8 @@
import { computed, ref, toRefs, watch } from 'vue'
import type { Group } from 'three'
import { useRenderLoop, useTresContext } from '@tresjs/core'
import { useMouse, useWindowSize } from '@vueuse/core'
import { useElementSize, useMouse, useWindowSize } from '@vueuse/core'
import type { UseMouseOptions } from '@vueuse/core'
export interface MouseParallaxProps {
/**
Expand All @@ -29,20 +30,38 @@ export interface MouseParallaxProps {
*
*/
ease?: number
/**
* Whether to apply the parallax effect to the local canvas.
* @type {boolean}
* @default false
* @memberof MouseParallaxProps
*
*/
local?: boolean
}
const props = withDefaults(defineProps<MouseParallaxProps>(), {
disabled: false,
factor: 2.5,
ease: 0.1,
local: false,
})
const { camera } = useTresContext()
const { camera, renderer } = useTresContext()
const { disabled, factor, ease, local } = toRefs(props)
const { disabled, factor, ease } = toRefs(props)
const mouseOptions: UseMouseOptions = {}
if (local.value) {
mouseOptions.target = renderer.value.domElement
mouseOptions.type = 'client'
}
const { x, y } = useMouse()
const { width, height } = useWindowSize()
const { x, y } = useMouse(mouseOptions)
const { width, height } = local.value
? useElementSize(renderer.value.domElement)
: useWindowSize()
const cameraGroupRef = ref<Group>()
Expand All @@ -52,9 +71,18 @@ const cursorY = computed(() => -(y.value / height.value - 0.5) * factor.value)
const { onLoop } = useRenderLoop()
onLoop(({ delta }) => {
if (disabled.value || !cameraGroupRef.value) { return }
cameraGroupRef.value.position.x += (cursorX.value - cameraGroupRef.value.position.x) * ease.value * delta
cameraGroupRef.value.position.y += (cursorY.value - cameraGroupRef.value.position.y) * ease.value * delta
if (
disabled.value
|| !cameraGroupRef.value
|| Number.isNaN(cursorX.value)
|| Number.isNaN(cursorY.value)
) {
return
}
cameraGroupRef.value.position.x
+= (cursorX.value - cameraGroupRef.value.position.x) * ease.value * delta
cameraGroupRef.value.position.y
+= (cursorY.value - cameraGroupRef.value.position.y) * ease.value * delta
})
watch(
Expand Down

0 comments on commit b9192fb

Please sign in to comment.