Skip to content

Commit 4878a95

Browse files
alvarosabuTinoooo
andauthored
fix: expose effectComposer (#83)
* fix: expose effectComposer * fixed types and restructured composable a bit * cleanup * fixed linting errors --------- Co-authored-by: Tino Koch <17991193+Tinoooo@users.noreply.github.com>
1 parent ccfa8fb commit 4878a95

15 files changed

+703
-471
lines changed
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
// .vitepress/config.ts
2+
import { defineConfig } from "file:///Users/alvarosabu/Projects/tres/post-processing/node_modules/.pnpm/vitepress@1.0.0-rc.25_@algolia+client-search@4.20.0_postcss@8.4.31_search-insights@2.10.0_typescript@5.2.2/node_modules/vitepress/dist/node/index.js";
3+
import { resolve } from "file:///Users/alvarosabu/Projects/tres/post-processing/node_modules/.pnpm/pathe@1.1.1/node_modules/pathe/dist/index.mjs";
4+
import { templateCompilerOptions } from "file:///Users/alvarosabu/Projects/tres/post-processing/node_modules/.pnpm/@tresjs+core@3.5.0_three@0.158.0_vue@3.3.8/node_modules/@tresjs/core/dist/tres.js";
5+
var __vite_injected_original_dirname = "/Users/alvarosabu/Projects/tres/post-processing/docs/.vitepress";
6+
var config_default = defineConfig({
7+
title: "Post-processing",
8+
description: "Post-processing effects for ViteJS",
9+
head: [["link", { rel: "icon", type: "image/svg", href: "/favicon.svg" }]],
10+
themeConfig: {
11+
logo: "/logo.svg",
12+
search: {
13+
provider: "local"
14+
},
15+
// https://vitepress.dev/reference/default-theme-config
16+
nav: [
17+
{ text: "Guide", link: "/guide/" },
18+
{ text: "Examples", link: "/examples" }
19+
],
20+
sidebar: [
21+
{
22+
text: "Guide",
23+
items: [{ text: "Introduction", link: "/guide/" }]
24+
},
25+
{
26+
text: "Effects",
27+
items: [
28+
{ text: "Bloom", link: "/guide/effects/bloom" },
29+
{ text: "Depth of Field", link: "/guide/effects/depth-of-field" },
30+
{ text: "Glitch", link: "/guide/effects/glitch" },
31+
{ text: "Noise", link: "/guide/effects/noise" },
32+
{ text: "Outline", link: "/guide/effects/outline" },
33+
{ text: "Pixelation", link: "/guide/effects/pixelation" },
34+
{ text: "Vignette", link: "/guide/effects/vignette" }
35+
]
36+
}
37+
],
38+
socialLinks: [
39+
{ icon: "twitter", link: "https://twitter.com/tresjs_dev" },
40+
{ icon: "discord", link: "https://discord.gg/UCr96AQmWn" }
41+
]
42+
},
43+
vite: {
44+
optimizeDeps: {
45+
exclude: ["vitepress"],
46+
include: ["three"]
47+
},
48+
server: {
49+
hmr: {
50+
overlay: false
51+
}
52+
},
53+
resolve: {
54+
alias: {
55+
"@tresjs/post-processing": resolve(__vite_injected_original_dirname, "../../dist/tres-postprocessing.js")
56+
},
57+
dedupe: ["three"]
58+
}
59+
},
60+
vue: {
61+
...templateCompilerOptions
62+
}
63+
});
64+
export {
65+
config_default as default
66+
};
67+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLnZpdGVwcmVzcy9jb25maWcudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImNvbnN0IF9fdml0ZV9pbmplY3RlZF9vcmlnaW5hbF9kaXJuYW1lID0gXCIvVXNlcnMvYWx2YXJvc2FidS9Qcm9qZWN0cy90cmVzL3Bvc3QtcHJvY2Vzc2luZy9kb2NzLy52aXRlcHJlc3NcIjtjb25zdCBfX3ZpdGVfaW5qZWN0ZWRfb3JpZ2luYWxfZmlsZW5hbWUgPSBcIi9Vc2Vycy9hbHZhcm9zYWJ1L1Byb2plY3RzL3RyZXMvcG9zdC1wcm9jZXNzaW5nL2RvY3MvLnZpdGVwcmVzcy9jb25maWcudHNcIjtjb25zdCBfX3ZpdGVfaW5qZWN0ZWRfb3JpZ2luYWxfaW1wb3J0X21ldGFfdXJsID0gXCJmaWxlOi8vL1VzZXJzL2FsdmFyb3NhYnUvUHJvamVjdHMvdHJlcy9wb3N0LXByb2Nlc3NpbmcvZG9jcy8udml0ZXByZXNzL2NvbmZpZy50c1wiO2ltcG9ydCB7IGRlZmluZUNvbmZpZyB9IGZyb20gJ3ZpdGVwcmVzcydcbmltcG9ydCBVbm9jc3MgZnJvbSAndW5vY3NzL3ZpdGUnXG5pbXBvcnQgc3ZnTG9hZGVyIGZyb20gJ3ZpdGUtc3ZnLWxvYWRlcidcbmltcG9ydCB7IHJlc29sdmUgfSBmcm9tICdwYXRoZSdcbmltcG9ydCB7IHRlbXBsYXRlQ29tcGlsZXJPcHRpb25zIH0gZnJvbSAnQHRyZXNqcy9jb3JlJ1xuXG4vLyBodHRwczovL3ZpdGVwcmVzcy5kZXYvcmVmZXJlbmNlL3NpdGUtY29uZmlnXG5leHBvcnQgZGVmYXVsdCBkZWZpbmVDb25maWcoe1xuICB0aXRsZTogJ1Bvc3QtcHJvY2Vzc2luZycsXG4gIGRlc2NyaXB0aW9uOiAnUG9zdC1wcm9jZXNzaW5nIGVmZmVjdHMgZm9yIFZpdGVKUycsXG4gIGhlYWQ6IFtbJ2xpbmsnLCB7IHJlbDogJ2ljb24nLCB0eXBlOiAnaW1hZ2Uvc3ZnJywgaHJlZjogJy9mYXZpY29uLnN2ZycgfV1dLFxuICB0aGVtZUNvbmZpZzoge1xuICAgIGxvZ286ICcvbG9nby5zdmcnLFxuICAgIHNlYXJjaDoge1xuICAgICAgcHJvdmlkZXI6ICdsb2NhbCcsXG4gICAgfSxcbiAgICAvLyBodHRwczovL3ZpdGVwcmVzcy5kZXYvcmVmZXJlbmNlL2RlZmF1bHQtdGhlbWUtY29uZmlnXG4gICAgbmF2OiBbXG4gICAgICB7IHRleHQ6ICdHdWlkZScsIGxpbms6ICcvZ3VpZGUvJyB9LFxuICAgICAgeyB0ZXh0OiAnRXhhbXBsZXMnLCBsaW5rOiAnL2V4YW1wbGVzJyB9LFxuICAgIF0sXG5cbiAgICBzaWRlYmFyOiBbXG4gICAgICB7XG4gICAgICAgIHRleHQ6ICdHdWlkZScsXG4gICAgICAgIGl0ZW1zOiBbeyB0ZXh0OiAnSW50cm9kdWN0aW9uJywgbGluazogJy9ndWlkZS8nIH1dLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgdGV4dDogJ0VmZmVjdHMnLFxuICAgICAgICBpdGVtczogW1xuICAgICAgICAgIHsgdGV4dDogJ0Jsb29tJywgbGluazogJy9ndWlkZS9lZmZlY3RzL2Jsb29tJyB9LFxuICAgICAgICAgIHsgdGV4dDogJ0RlcHRoIG9mIEZpZWxkJywgbGluazogJy9ndWlkZS9lZmZlY3RzL2RlcHRoLW9mLWZpZWxkJyB9LFxuICAgICAgICAgIHsgdGV4dDogJ0dsaXRjaCcsIGxpbms6ICcvZ3VpZGUvZWZmZWN0cy9nbGl0Y2gnIH0sXG4gICAgICAgICAgeyB0ZXh0OiAnTm9pc2UnLCBsaW5rOiAnL2d1aWRlL2VmZmVjdHMvbm9pc2UnIH0sXG4gICAgICAgICAgeyB0ZXh0OiAnT3V0bGluZScsIGxpbms6ICcvZ3VpZGUvZWZmZWN0cy9vdXRsaW5lJyB9LFxuICAgICAgICAgIHsgdGV4dDogJ1BpeGVsYXRpb24nLCBsaW5rOiAnL2d1aWRlL2VmZmVjdHMvcGl4ZWxhdGlvbicgfSxcbiAgICAgICAgICB7IHRleHQ6ICdWaWduZXR0ZScsIGxpbms6ICcvZ3VpZGUvZWZmZWN0cy92aWduZXR0ZScgfSxcbiAgICAgICAgXSxcbiAgICAgIH0sXG4gICAgXSxcblxuICAgIHNvY2lhbExpbmtzOiBbXG4gICAgICB7IGljb246ICd0d2l0dGVyJywgbGluazogJ2h0dHBzOi8vdHdpdHRlci5jb20vdHJlc2pzX2RldicgfSxcbiAgICAgIHsgaWNvbjogJ2Rpc2NvcmQnLCBsaW5rOiAnaHR0cHM6Ly9kaXNjb3JkLmdnL1VDcjk2QVFtV24nIH0sXG4gICAgXSxcbiAgfSxcbiAgdml0ZToge1xuICAgIG9wdGltaXplRGVwczoge1xuICAgICAgZXhjbHVkZTogWyd2aXRlcHJlc3MnXSxcbiAgICAgIGluY2x1ZGU6IFsndGhyZWUnXSxcbiAgICB9LFxuICAgIHNlcnZlcjoge1xuICAgICAgaG1yOiB7XG4gICAgICAgIG92ZXJsYXk6IGZhbHNlLFxuICAgICAgfSxcbiAgICB9LFxuICAgIHJlc29sdmU6IHtcbiAgICAgIGFsaWFzOiB7XG4gICAgICAgICdAdHJlc2pzL3Bvc3QtcHJvY2Vzc2luZyc6IHJlc29sdmUoX19kaXJuYW1lLCAnLi4vLi4vZGlzdC90cmVzLXBvc3Rwcm9jZXNzaW5nLmpzJyksXG4gICAgICB9LFxuICAgICAgZGVkdXBlOiBbJ3RocmVlJ10sXG4gICAgfSxcbiAgfSxcbiAgdnVlOiB7XG4gICAgLi4udGVtcGxhdGVDb21waWxlck9wdGlvbnMsXG4gIH0sXG59KVxuIl0sCiAgIm1hcHBpbmdzIjogIjtBQUFxVyxTQUFTLG9CQUFvQjtBQUdsWSxTQUFTLGVBQWU7QUFDeEIsU0FBUywrQkFBK0I7QUFKeEMsSUFBTSxtQ0FBbUM7QUFPekMsSUFBTyxpQkFBUSxhQUFhO0FBQUEsRUFDMUIsT0FBTztBQUFBLEVBQ1AsYUFBYTtBQUFBLEVBQ2IsTUFBTSxDQUFDLENBQUMsUUFBUSxFQUFFLEtBQUssUUFBUSxNQUFNLGFBQWEsTUFBTSxlQUFlLENBQUMsQ0FBQztBQUFBLEVBQ3pFLGFBQWE7QUFBQSxJQUNYLE1BQU07QUFBQSxJQUNOLFFBQVE7QUFBQSxNQUNOLFVBQVU7QUFBQSxJQUNaO0FBQUE7QUFBQSxJQUVBLEtBQUs7QUFBQSxNQUNILEVBQUUsTUFBTSxTQUFTLE1BQU0sVUFBVTtBQUFBLE1BQ2pDLEVBQUUsTUFBTSxZQUFZLE1BQU0sWUFBWTtBQUFBLElBQ3hDO0FBQUEsSUFFQSxTQUFTO0FBQUEsTUFDUDtBQUFBLFFBQ0UsTUFBTTtBQUFBLFFBQ04sT0FBTyxDQUFDLEVBQUUsTUFBTSxnQkFBZ0IsTUFBTSxVQUFVLENBQUM7QUFBQSxNQUNuRDtBQUFBLE1BQ0E7QUFBQSxRQUNFLE1BQU07QUFBQSxRQUNOLE9BQU87QUFBQSxVQUNMLEVBQUUsTUFBTSxTQUFTLE1BQU0sdUJBQXVCO0FBQUEsVUFDOUMsRUFBRSxNQUFNLGtCQUFrQixNQUFNLGdDQUFnQztBQUFBLFVBQ2hFLEVBQUUsTUFBTSxVQUFVLE1BQU0sd0JBQXdCO0FBQUEsVUFDaEQsRUFBRSxNQUFNLFNBQVMsTUFBTSx1QkFBdUI7QUFBQSxVQUM5QyxFQUFFLE1BQU0sV0FBVyxNQUFNLHlCQUF5QjtBQUFBLFVBQ2xELEVBQUUsTUFBTSxjQUFjLE1BQU0sNEJBQTRCO0FBQUEsVUFDeEQsRUFBRSxNQUFNLFlBQVksTUFBTSwwQkFBMEI7QUFBQSxRQUN0RDtBQUFBLE1BQ0Y7QUFBQSxJQUNGO0FBQUEsSUFFQSxhQUFhO0FBQUEsTUFDWCxFQUFFLE1BQU0sV0FBVyxNQUFNLGlDQUFpQztBQUFBLE1BQzFELEVBQUUsTUFBTSxXQUFXLE1BQU0sZ0NBQWdDO0FBQUEsSUFDM0Q7QUFBQSxFQUNGO0FBQUEsRUFDQSxNQUFNO0FBQUEsSUFDSixjQUFjO0FBQUEsTUFDWixTQUFTLENBQUMsV0FBVztBQUFBLE1BQ3JCLFNBQVMsQ0FBQyxPQUFPO0FBQUEsSUFDbkI7QUFBQSxJQUNBLFFBQVE7QUFBQSxNQUNOLEtBQUs7QUFBQSxRQUNILFNBQVM7QUFBQSxNQUNYO0FBQUEsSUFDRjtBQUFBLElBQ0EsU0FBUztBQUFBLE1BQ1AsT0FBTztBQUFBLFFBQ0wsMkJBQTJCLFFBQVEsa0NBQVcsbUNBQW1DO0FBQUEsTUFDbkY7QUFBQSxNQUNBLFFBQVEsQ0FBQyxPQUFPO0FBQUEsSUFDbEI7QUFBQSxFQUNGO0FBQUEsRUFDQSxLQUFLO0FBQUEsSUFDSCxHQUFHO0FBQUEsRUFDTDtBQUNGLENBQUM7IiwKICAibmFtZXMiOiBbXQp9Cg==

docs/.vitepress/theme/components/BloomDemo.vue

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
11
<script setup lang="ts">
22
import { Color } from 'three'
3-
import { reactive } from 'vue'
3+
import { reactive, ref } from 'vue'
44
import { TresCanvas } from '@tresjs/core'
55
import { BlendFunction } from 'postprocessing'
66
import { EffectComposer, Bloom } from '@tresjs/post-processing'
77
8+
import { useRouteDisposal } from '../composables/useRouteDisposal'
9+
810
const gl = {
911
clearColor: '#121212',
1012
shadows: true,
@@ -20,6 +22,9 @@ const bloomParams = reactive({
2022
disableRender: true,
2123
blendFunction: BlendFunction.ADD,
2224
})
25+
26+
// Need to dispose of the effect composer when the route changes because Vitepress doesnt unmount the components
27+
const { effectComposer } = useRouteDisposal()
2328
</script>
2429

2530
<template>
@@ -44,7 +49,7 @@ const bloomParams = reactive({
4449
:intensity="1"
4550
/>
4651
<Suspense>
47-
<EffectComposer>
52+
<EffectComposer ref="effectComposer">
4853
<Bloom v-bind="bloomParams" />
4954
</EffectComposer>
5055
</Suspense>

docs/.vitepress/theme/components/DepthOfFieldDemo.vue

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ import { gsap } from 'gsap'
44
import { TresCanvas } from '@tresjs/core'
55
import { EffectComposer, DepthOfField } from '@tresjs/post-processing'
66
7+
import { useRouteDisposal } from '../composables/useRouteDisposal'
8+
79
const dofEffect = ref<InstanceType<typeof DepthOfField> | null>(null)
810
911
const toggleFocusDistance = () => {
@@ -13,6 +15,9 @@ const toggleFocusDistance = () => {
1315
ease: 'power2',
1416
})
1517
}
18+
19+
// Need to dispose of the effect composer when the route changes because Vitepress doesnt unmount the components
20+
const { effectComposer } = useRouteDisposal()
1621
</script>
1722

1823
<template>
@@ -59,7 +64,7 @@ const toggleFocusDistance = () => {
5964
<TresMeshNormalMaterial />
6065
</TresMesh>
6166
<TresGridHelper />
62-
<EffectComposer>
67+
<EffectComposer ref="effectComposer">
6368
<DepthOfField
6469
ref="dofEffect"
6570
:focus-distance="0.0012"

docs/.vitepress/theme/components/GlitchDemo.vue

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,17 @@ import { Text3D } from '@tresjs/cientos'
55
66
import { EffectComposer, Glitch } from '@tresjs/post-processing'
77
8+
import { useRouteDisposal } from '../composables/useRouteDisposal'
9+
810
const gl = {
911
clearColor: '#121212',
1012
shadows: true,
1113
alpha: false,
1214
disableRender: true,
1315
}
16+
17+
// Need to dispose of the effect composer when the route changes because Vitepress doesnt unmount the components
18+
const { effectComposer } = useRouteDisposal()
1419
</script>
1520

1621
<template>
@@ -40,7 +45,7 @@ const gl = {
4045
:intensity="1"
4146
/>
4247
<Suspense>
43-
<EffectComposer>
48+
<EffectComposer ref="effectComposer">
4449
<Glitch />
4550
</EffectComposer>
4651
</Suspense>

docs/.vitepress/theme/components/NoiseDemo.vue

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,8 @@ import { BasicShadowMap, SRGBColorSpace, NoToneMapping } from 'three'
44
import { EffectComposer, Noise } from '@tresjs/post-processing'
55
import { OrbitControls } from '@tresjs/cientos'
66
import { BlendFunction } from 'postprocessing'
7-
import '@tresjs/leches/styles'
7+
8+
import { useRouteDisposal } from '../composables/useRouteDisposal'
89
910
const gl = {
1011
clearColor: '#82DBC5',
@@ -14,6 +15,9 @@ const gl = {
1415
outputColorSpace: SRGBColorSpace,
1516
toneMapping: NoToneMapping,
1617
}
18+
19+
// Need to dispose of the effect composer when the route changes because Vitepress doesnt unmount the components
20+
const { effectComposer } = useRouteDisposal()
1721
</script>
1822

1923
<template>
@@ -23,7 +27,7 @@ const gl = {
2327
<TresGridHelper />
2428
<TresAmbientLight :intensity="1" />
2529
<Suspense>
26-
<EffectComposer :depth-buffer="true">
30+
<EffectComposer ref="effectComposer">
2731
<Noise
2832
premultiply
2933
:blend-function="BlendFunction.SCREEN"

docs/.vitepress/theme/components/OutlineDemo.vue

Lines changed: 68 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,25 @@
11
<script lang="ts" setup>
2-
import { ref, shallowRef } from 'vue'
3-
import { watchOnce } from '@vueuse/core'
2+
import { ref } from 'vue'
3+
import type { Intersection, Object3D } from 'three'
4+
import { NoToneMapping } from 'three'
45
import { TresCanvas } from '@tresjs/core'
6+
import { OrbitControls } from '@tresjs/cientos'
7+
import { Outline, EffectComposer } from '@tresjs/post-processing'
58
import { KernelSize } from 'postprocessing'
6-
import { EffectComposer, Outline } from '@tresjs/post-processing'
7-
import type { Intersection, Object3D } from 'three'
8-
import { Color } from 'three'
99
10-
const boxWidth = 2
10+
import { TresLeches, useControls } from '@tresjs/leches'
11+
import '@tresjs/leches/styles'
12+
13+
import { useRouteDisposal } from '../composables/useRouteDisposal'
14+
15+
const gl = {
16+
clearColor: '#121212',
17+
toneMapping: NoToneMapping,
18+
disableRender: true,
19+
}
20+
21+
const { effectComposer } = useRouteDisposal()
22+
1123
const outlinedObjects = ref<Object3D[]>([])
1224
1325
const toggleMeshSelectionState = ({ object }: Intersection) => {
@@ -16,55 +28,71 @@ const toggleMeshSelectionState = ({ object }: Intersection) => {
1628
else outlinedObjects.value = [...outlinedObjects.value, object]
1729
}
1830
19-
const meshes = shallowRef<Object3D[] | null>(null)
20-
21-
watchOnce(meshes, () => {
22-
if (meshes.value?.[0]) outlinedObjects.value.push(meshes.value[0])
23-
if (meshes.value?.[2]) outlinedObjects.value.push(meshes.value[2])
31+
const { edgeStrength, pulseSpeed, visibleEdgeColor, blur, kernelSize } = useControls({
32+
edgeStrength: {
33+
value: 8000,
34+
min: 0,
35+
max: 8000,
36+
step: 10,
37+
},
38+
pulseSpeed: {
39+
value: 0,
40+
min: 0,
41+
max: 2,
42+
step: 0.01,
43+
},
44+
visibleEdgeColor: '#ffffff',
45+
blur: false,
46+
kernelSize: {
47+
value: 0,
48+
min: KernelSize.VERY_SMALL,
49+
max: KernelSize.VERY_LARGE,
50+
step: 1,
51+
},
2452
})
53+
54+
// Need to dispose of the effect composer when the route changes because Vitepress doesnt unmount the components
55+
useRouteDisposal(effectComposer)
2556
</script>
2657

2758
<template>
59+
<TresLeches />
2860
<TresCanvas
29-
clear-color="#121212"
30-
:alpha="false"
31-
:shadows="true"
61+
v-bind="gl"
3262
:disable-render="true"
3363
>
3464
<TresPerspectiveCamera
35-
:position="[3, 3, 4]"
36-
:look-at="[0, 0, 0]"
65+
:position="[1, 3, 3]"
66+
:look-at="[2, 2, 2]"
3767
/>
38-
<TresMesh
39-
v-for="i in 3"
40-
ref="meshes"
41-
:key="i.toString()"
42-
:position="[(i - 2) * boxWidth, 0.5, 1]"
43-
@click="toggleMeshSelectionState"
68+
<OrbitControls />
69+
<template
70+
v-for="i in 5"
71+
:key="i"
4472
>
45-
<TresBoxGeometry />
46-
<TresMeshStandardMaterial
47-
color="hotpink"
48-
:emissive="new Color('hotpink')"
49-
:emissive-intensity="1"
50-
/>
51-
</TresMesh>
73+
<TresMesh
74+
:position="[i * 1.1 - 2.8, 1, 0]"
75+
@click="toggleMeshSelectionState"
76+
>
77+
<TresBoxGeometry
78+
:width="4"
79+
:height="4"
80+
:depth="4"
81+
/>
82+
<TresMeshStandardMaterial color="hotpink" />
83+
</TresMesh>
84+
</template>
5285
<TresGridHelper />
5386
<TresAmbientLight :intensity="2" />
54-
<TresDirectionalLight
55-
:position="[-4, 4, 3]"
56-
:intensity="2"
57-
/>
58-
5987
<Suspense>
60-
<EffectComposer>
88+
<EffectComposer ref="effectComposer">
6189
<Outline
62-
blur
63-
:edge-glow="3"
64-
:kernel-size="KernelSize.LARGE"
65-
:edge-strength="20"
6690
:outlined-objects="outlinedObjects"
67-
visible-edge-color="#82DBC5"
91+
:blur="blur.value"
92+
:edge-strength="edgeStrength.value"
93+
:pulse-speed="pulseSpeed.value"
94+
:visible-edge-color="visibleEdgeColor.value"
95+
:kernel-size="kernelSize.value"
6896
/>
6997
</EffectComposer>
7098
</Suspense>

docs/.vitepress/theme/components/PixelationDemo.vue

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
11
<script lang="ts" setup>
2-
import { Color } from 'three'
32
import { TresCanvas } from '@tresjs/core'
43
import { OrbitControls } from '@tresjs/cientos'
54
import { EffectComposer, Pixelation } from '@tresjs/post-processing'
65
7-
const boxWidth = 2
6+
import { ref } from 'vue'
7+
import { useRouteDisposal } from '../composables/useRouteDisposal'
8+
9+
// Need to dispose of the effect composer when the route changes because Vitepress doesnt unmount the components
10+
const { effectComposer } = useRouteDisposal()
811
</script>
912

1013
<template>
@@ -45,7 +48,7 @@ const boxWidth = 2
4548
/>
4649

4750
<Suspense>
48-
<EffectComposer>
51+
<EffectComposer ref="effectComposer">
4952
<Pixelation :granularity="8" />
5053
</EffectComposer>
5154
</Suspense>

docs/.vitepress/theme/components/VignetteDemo.vue

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,9 @@ import { TresCanvas } from '@tresjs/core'
33
import { BasicShadowMap, SRGBColorSpace, NoToneMapping } from 'three'
44
import { OrbitControls } from '@tresjs/cientos'
55
import { EffectComposer, Vignette, DepthOfField } from '@tresjs/post-processing'
6+
7+
import { useRouteDisposal } from '../composables/useRouteDisposal'
8+
69
import BlenderCube from './BlenderCube.vue'
710
811
const gl = {
@@ -13,6 +16,9 @@ const gl = {
1316
outputColorSpace: SRGBColorSpace,
1417
toneMapping: NoToneMapping,
1518
}
19+
20+
// Need to dispose of the effect composer when the route changes because Vitepress doesnt unmount the components
21+
const { effectComposer } = useRouteDisposal()
1622
</script>
1723

1824
<template>
@@ -23,7 +29,7 @@ const gl = {
2329
<Suspense>
2430
<BlenderCube />
2531
</Suspense>
26-
<EffectComposer>
32+
<EffectComposer ref="effectComposer">
2733
<DepthOfField
2834
:focus-distance="0"
2935
:focal-length="0.02"
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
import { ref, watch } from 'vue'
2+
import { useRouter } from 'vitepress'
3+
import type { EffectComposer } from '@tresjs/post-processing'
4+
5+
export function useRouteDisposal() {
6+
const router = useRouter()
7+
8+
const effectComposer = ref<InstanceType<typeof EffectComposer> | null>(null)
9+
10+
watch(() => router.route.data.relativePath, () => {
11+
effectComposer.value?.composer.dispose()
12+
})
13+
14+
return {
15+
effectComposer,
16+
}
17+
}

0 commit comments

Comments
 (0)