Skip to content

Commit cd24a57

Browse files
Tinooooalvarosabu
andauthored
feat: native threejs effects (#121)
* added EffectComposer and some debugging files * wip * added composable * cleanup * added more props to native pixelation effect * restructured playground * added glitch Effect * added glitch effect * renamed folder * added check to prevent console warning * added smaa effect * added output pass * moved injectionKey * added prop to EffectComposer * added halftone effect * added unreal bloom effect * removed obsolete computed * added on demand rendering support * lint fixes * added enabled prop to effect composer component * removed obsolete code * eslint stuff * rebuilt pnpm lock file * moved files * type fixes and removed dependency * added renderer invalidation to glitch effects * added invalidation for noise effect * lint fix --------- Co-authored-by: Alvaro Saburido <[email protected]>
1 parent ec1bad1 commit cd24a57

Some content is hidden

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

60 files changed

+4486
-5809
lines changed

docs/.vitepress/config.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
import { defineConfig } from 'vitepress'
2-
import { resolve } from 'pathe'
31
import { templateCompilerOptions } from '@tresjs/core'
2+
import { resolve } from 'pathe'
3+
import { defineConfig } from 'vitepress'
44

55
// https://vitepress.dev/reference/site-config
66
export default defineConfig({

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

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
<script setup lang="ts">
2-
import { Color } from 'three'
3-
import { reactive } from 'vue'
42
import { TresCanvas } from '@tresjs/core'
5-
import { BlendFunction } from 'postprocessing'
63
import { Bloom, EffectComposer } from '@tresjs/post-processing'
4+
import { BlendFunction } from 'postprocessing'
5+
import { Color } from 'three'
6+
import { reactive } from 'vue'
77
88
import { useRouteDisposal } from '../composables/useRouteDisposal'
99

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

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
<script lang="ts" setup>
2-
import { ref } from 'vue'
3-
import { gsap } from 'gsap'
42
import { TresCanvas } from '@tresjs/core'
53
import { DepthOfField, EffectComposer } from '@tresjs/post-processing'
4+
import { gsap } from 'gsap'
5+
import { ref } from 'vue'
66
77
import { useRouteDisposal } from '../composables/useRouteDisposal'
88

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

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
<script setup lang="ts">
2-
import { Color } from 'three'
3-
import { TresCanvas } from '@tresjs/core'
42
import { Text3D } from '@tresjs/cientos'
5-
3+
import { TresCanvas } from '@tresjs/core'
64
import { EffectComposer, Glitch } from '@tresjs/post-processing'
75
6+
import { Color } from 'three'
7+
88
import { useRouteDisposal } from '../composables/useRouteDisposal'
99
1010
const gl = {

docs/.vitepress/theme/components/LoveVueThreeJS.vue

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,9 @@
22
/// <reference types="vite-svg-loader" />
33
import { gsap } from 'gsap'
44
import { onMounted, ref } from 'vue'
5-
import Triangle from '../assets/triangle.svg'
65
import SecondRow from '../assets/second-row.svg'
76
import ThirdRow from '../assets/third-row.svg'
7+
import Triangle from '../assets/triangle.svg'
88
99
const triangleRef = ref()
1010
const secondRowRef = ref()

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

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
<script setup lang="ts">
2+
import { OrbitControls } from '@tresjs/cientos'
23
import { TresCanvas } from '@tresjs/core'
3-
import { BasicShadowMap, NoToneMapping, SRGBColorSpace } from 'three'
44
import { EffectComposer, Noise } from '@tresjs/post-processing'
5-
import { OrbitControls } from '@tresjs/cientos'
65
import { BlendFunction } from 'postprocessing'
6+
import { BasicShadowMap, NoToneMapping, SRGBColorSpace } from 'three'
77
88
import { useRouteDisposal } from '../composables/useRouteDisposal'
99

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

+6-6
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,17 @@
11
<script lang="ts" setup>
2-
import { ref } from 'vue'
32
import type { Intersection, Object3D } from 'three'
4-
import { NoToneMapping } from 'three'
5-
import { TresCanvas } from '@tresjs/core'
63
import { OrbitControls } from '@tresjs/cientos'
4+
import { TresCanvas } from '@tresjs/core'
5+
import { TresLeches, useControls } from '@tresjs/leches'
76
import { EffectComposer, Outline } from '@tresjs/post-processing'
87
import { KernelSize } from 'postprocessing'
8+
import { NoToneMapping } from 'three'
99
10-
import { TresLeches, useControls } from '@tresjs/leches'
11-
import '@tresjs/leches/styles'
12-
10+
import { ref } from 'vue'
1311
import { useRouteDisposal } from '../composables/useRouteDisposal'
1412
13+
import '@tresjs/leches/styles'
14+
1515
const gl = {
1616
clearColor: '#121212',
1717
toneMapping: NoToneMapping,

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

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
<script lang="ts" setup>
2-
import { TresCanvas } from '@tresjs/core'
32
import { OrbitControls } from '@tresjs/cientos'
3+
import { TresCanvas } from '@tresjs/core'
44
import { EffectComposer, Pixelation } from '@tresjs/post-processing'
55
66
import { useRouteDisposal } from '../composables/useRouteDisposal'

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

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
<script setup lang="ts">
2-
import { TresCanvas } from '@tresjs/core'
3-
import { BasicShadowMap, NoToneMapping, SRGBColorSpace } from 'three'
42
import { OrbitControls } from '@tresjs/cientos'
3+
import { TresCanvas } from '@tresjs/core'
54
import { DepthOfField, EffectComposer, Vignette } from '@tresjs/post-processing'
5+
import { BasicShadowMap, NoToneMapping, SRGBColorSpace } from 'three'
66
77
import { useRouteDisposal } from '../composables/useRouteDisposal'
88

docs/.vitepress/theme/composables/useRouteDisposal.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
import { ref, watch } from 'vue'
2-
import { useRouter } from 'vitepress'
31
import type { EffectComposer } from '@tresjs/post-processing'
2+
import { useRouter } from 'vitepress'
3+
import { ref, watch } from 'vue'
44

55
export function useRouteDisposal() {
66
const router = useRouter()

docs/.vitepress/theme/index.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
// https://vitepress.dev/guide/custom-theme
2-
import 'uno.css'
32
import Theme from 'vitepress/theme'
3+
import TresLayout from './TresLayout.vue'
44
import './style.css'
55

6-
import TresLayout from './TresLayout.vue'
6+
import 'uno.css'
77

88
export default {
99
...Theme,

docs/guide/effects/noise.md

+2-2
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,9 @@ Noise is an effect that adds Gaussian noise to the scene. This can be used to si
1010

1111
```vue
1212
<script setup lang="ts">
13-
import { BlendFunction } from 'postprocessing'
14-
1513
import { Bloom, EffectComposer } from '@tresjs/post-processing'
14+
15+
import { BlendFunction } from 'postprocessing'
1616
</script>
1717
1818
<template>

docs/vite.config.ts

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
1-
import { defineConfig } from 'vite'
1+
import { templateCompilerOptions } from '@tresjs/core'
22
import Unocss from 'unocss/vite'
3-
import svgLoader from 'vite-svg-loader'
43
import Components from 'unplugin-vue-components/vite'
5-
import { templateCompilerOptions } from '@tresjs/core'
4+
import { defineConfig } from 'vite'
5+
import svgLoader from 'vite-svg-loader'
66

77
export default defineConfig({
88
plugins: [

package.json

+1-2
Original file line numberDiff line numberDiff line change
@@ -54,8 +54,7 @@
5454
},
5555
"dependencies": {
5656
"@vueuse/core": "^10.11.0",
57-
"postprocessing": "^6.36.0",
58-
"three-stdlib": "^2.30.5"
57+
"postprocessing": "^6.36.0"
5958
},
6059
"devDependencies": {
6160
"@release-it/conventional-changelog": "^8.0.1",

playground-nuxt/pages/index.vue

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
<script setup lang="ts">
2+
import { Bloom, EffectComposer } from '@tresjs/post-processing'
23
import { BlendFunction } from 'postprocessing'
34
import { BasicShadowMap, Color, NoToneMapping, SRGBColorSpace } from 'three'
45
import { reactive } from 'vue'
5-
import { Bloom, EffectComposer } from '@tresjs/post-processing'
66
77
const gl = {
88
clearColor: '#82DBC5',

playground/components.d.ts

+3
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,15 @@ export {}
77
/* prettier-ignore */
88
declare module 'vue' {
99
export interface GlobalComponents {
10+
BasicScene: typeof import('./src/components/BasicScene.vue')['default']
1011
BlenderCube: typeof import('./src/components/BlenderCube.vue')['default']
1112
copy: typeof import('./src/components/UnrealBloom copy.vue')['default']
13+
EffectListItem: typeof import('./src/components/EffectListItem.vue')['default']
1214
GlitchDemo: typeof import('./src/components/GlitchDemo.vue')['default']
1315
GraphPane: typeof import('./src/components/GraphPane.vue')['default']
1416
NoiseDemo: typeof import('./src/components/NoiseDemo.vue')['default']
1517
OutlineDemo: typeof import('./src/components/OutlineDemo.vue')['default']
18+
RouteListItem: typeof import('./src/components/RouteListItem.vue')['default']
1619
RouterLink: typeof import('vue-router')['RouterLink']
1720
RouterView: typeof import('vue-router')['RouterView']
1821
TheExperience: typeof import('./src/components/TheExperience.vue')['default']

playground/package.json

+2-2
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,8 @@
99
"preview": "vite preview"
1010
},
1111
"dependencies": {
12-
"@tresjs/cientos": "^3.9.0",
13-
"@tresjs/core": "4.0.2",
12+
"@tresjs/cientos": "^4.0.2",
13+
"@tresjs/core": "4.2.10",
1414
"vue-router": "^4.3.2"
1515
},
1616
"devDependencies": {
+40
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
<script lang="ts" setup>
2+
import { OrbitControls } from '@tresjs/cientos'
3+
import { TresCanvas } from '@tresjs/core'
4+
import { EffectComposerThree } from '@tresjs/post-processing'
5+
6+
defineProps<{
7+
wireframe?: boolean
8+
}>()
9+
</script>
10+
11+
<template>
12+
<TresCanvas render-mode="on-demand">
13+
<TresPerspectiveCamera
14+
:position="[5, 5, 5]"
15+
:look-at="[0, 0, 0]"
16+
/>
17+
<OrbitControls />
18+
<TresMesh
19+
:position="[-3.5, 1, 0]"
20+
>
21+
<TresConeGeometry :args="[1.25, 2, 4, 1, false, Math.PI * 0.25]" />
22+
<TresMeshNormalMaterial :wireframe="wireframe" />
23+
</TresMesh>
24+
25+
<TresMesh :position="[0, 1, 0]">
26+
<TresBoxGeometry :args="[2, 2, 2]" />
27+
<TresMeshNormalMaterial :wireframe="wireframe" />
28+
</TresMesh>
29+
30+
<TresMesh :position="[3.5, 1, 0]">
31+
<TresSphereGeometry />
32+
<TresMeshNormalMaterial :wireframe="wireframe" />
33+
</TresMesh>
34+
35+
<TresGridHelper />
36+
<EffectComposerThree>
37+
<slot name="effects"></slot>
38+
</EffectComposerThree>
39+
</TresCanvas>
40+
</template>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
<script lang="ts" setup>
2+
import type { RouteRecordRaw } from 'vue-router'
3+
4+
defineProps<{
5+
route: RouteRecordRaw
6+
}>()
7+
</script>
8+
9+
<template>
10+
<router-link
11+
:key="route.name"
12+
:to="route.path"
13+
class="p-4 leading-normal no-underline size-m weight-600 bg-zinc-50 rounded"
14+
>
15+
<div v-if="route.meta?.icon" class="inline-block p-2 p-x-3 m-b-3 text-2xl bg-zinc-200 rounded">
16+
{{ route.meta.icon }}
17+
</div>
18+
<h3 class="text-sm p-0 m-0 mb-1.5 font-semibold text-zinc-600">
19+
{{ route.meta?.name }}
20+
</h3>
21+
</router-link>
22+
</template>

playground/src/components/GraphPane.vue

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
<script lang="ts" setup>
2-
import { ref } from 'vue'
32
import { useRafFn } from '@vueuse/core'
3+
import { ref } from 'vue'
44
import { useState } from '../composables/state'
55
66
const width = 160

playground/src/components/OutlineDemo.vue

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
<script setup lang="ts">
2-
import { TresCanvas } from '@tresjs/core'
2+
import type { Intersection, Object3D } from 'three'
33
import { OrbitControls, useTweakPane } from '@tresjs/cientos'
4-
import { reactive, ref } from 'vue'
4+
import { TresCanvas } from '@tresjs/core'
55
import { EffectComposer, Outline } from '@tresjs/post-processing'
6-
import type { Intersection, Object3D } from 'three'
76
import { BasicShadowMap, NoToneMapping } from 'three'
7+
import { reactive, ref } from 'vue'
88
99
const gl = {
1010
alpha: false,

playground/src/main.ts

+8-1
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,18 @@
11
import { createApp } from 'vue'
2-
import './style.css'
32
import App from './App.vue'
43
import { router } from './router'
4+
import './style.css'
55
import 'uno.css'
66

77
const app = createApp(App)
88

99
app.use(router)
1010

1111
app.mount('#app')
12+
13+
const orginalWarn = console.warn
14+
console.warn = (...args: any[]) => {
15+
if (!args[0].includes('Component is missing template or render function')) {
16+
orginalWarn.apply(console, args)
17+
}
18+
}

playground/src/pages/index.vue

+19-50
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,17 @@
11
<script setup lang="ts">
22
import {
3-
advancedRoutes,
4-
routes,
3+
postProcessingRoutes,
4+
threeRoutes,
55
} from '../router'
66
7-
const [_home, ...restRoutes] = routes
8-
97
const sections = [
108
{
11-
icon: '🤓',
12-
title: 'Advanced',
13-
routes: advancedRoutes,
9+
title: 'three',
10+
routes: threeRoutes,
11+
},
12+
{
13+
title: 'postprocessing',
14+
routes: postProcessingRoutes,
1415
},
1516
]
1617
</script>
@@ -51,51 +52,19 @@ const sections = [
5152
</p>
5253
</div>
5354
</div>
54-
<div class="text-center sm:text-left sm:grid sm:grid-cols-2 md:grid-cols-3 gap-4">
55-
<router-link
56-
v-for="{ name, path, meta } in restRoutes"
57-
:key="name"
58-
:to="path"
59-
class="
60-
p-4 my-4 leading-normal no-underline size-m weight-600 bg-zinc-50 rounded
61-
sm:my-0
62-
"
63-
>
64-
<div class="inline-block p-2 p-x-3 m-b-3 text-2xl bg-zinc-200 rounded">
65-
{{ meta.icon }}
66-
</div>
67-
<h2 class="text-sm p-0 m-0 mb-1.5 font-semibold text-zinc-600">
68-
{{ name }}
69-
</h2>
70-
</router-link>
71-
<div
72-
v-for="{ title, routes: internalRoutes, icon } in sections"
73-
:key="title"
74-
class="
75-
p-4 my-4 leading-normal size-m weight-600 bg-zinc-50 rounded
76-
sm:my-0
77-
"
78-
>
79-
<div class="inline-block p-2 p-x-3 m-b-3 text-2xl bg-zinc-200 rounded">
80-
{{ icon }}
81-
</div>
82-
<h2 class="text-sm p-0 m-0 mb-1.5 font-semibold text-zinc-600">
83-
{{ title }}
84-
</h2>
85-
<div
86-
v-for="route in internalRoutes"
55+
<template v-for="(section, index) in sections" :key="index">
56+
<h2 class="text-2xl mb-4 font-semibold text-zinc-600">
57+
{{ section.title }}
58+
</h2>
59+
<div class="text-center sm:text-left sm:grid sm:grid-cols-2 md:grid-cols-3 gap-4">
60+
<EffectListItem
61+
v-for="route in section.routes"
8762
:key="route.name"
88-
class="link-wrapper"
89-
>
90-
<router-link
91-
class="no-underline text-zinc-700 visited:text-zinc-400 hover:text-cientos-blue"
92-
:to="route.path"
93-
>
94-
<span>{{ route.name }} </span>
95-
</router-link>
96-
</div>
63+
:route="route"
64+
class="my-4 sm:my-0"
65+
/>
9766
</div>
98-
</div>
67+
</template>
9968
</div>
10069
</div>
10170
</template>

0 commit comments

Comments
 (0)