Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
c6f218f
feat(post-processing): added effect analyzer agent
Tinoooo Feb 11, 2026
3f0f658
adjusted agent
Tinoooo Feb 11, 2026
2e95ef0
refactor(postprocessing): updated agent output format description for…
Tinoooo Feb 11, 2026
a95f515
feat(postprocessing): added effect component creator agent
Tinoooo Feb 11, 2026
238e4db
improved agent
Tinoooo Feb 11, 2026
5aed3f7
wip
Tinoooo Feb 12, 2026
b5a6361
fix: removed invalid reference
Tinoooo Feb 12, 2026
11ce021
feat(post-processing): added playground creator agent
Tinoooo Feb 12, 2026
009bd0c
added routing instructions and example for playground component
Tinoooo Feb 12, 2026
10b477e
feat(postprocessing): used agent to add playground page for film effect
Tinoooo Feb 12, 2026
f8f45b7
removed bloom effect, because it is not working
Tinoooo Feb 12, 2026
a990d66
feat(postprocessing): add SAO effect and update ESLint config
Tinoooo Feb 16, 2026
3ee5945
small fix in agent
Tinoooo Feb 16, 2026
e6896ad
feat(postprocessing): documentation writer agent
Tinoooo Feb 17, 2026
e967014
added orchestrator agent
Tinoooo Feb 17, 2026
4964c28
small name change
Tinoooo Feb 17, 2026
ac1f7ba
feat(postprocessing): added SAO documentation
Tinoooo Feb 17, 2026
68c380b
feat(postprocessing): enhance SAOThreeDemo with rotation and dual can…
Tinoooo Feb 17, 2026
79076d7
wip
Tinoooo Feb 17, 2026
1e621a8
Merge remote-tracking branch 'origin/main' into feat/1334-creation-of…
Tinoooo Mar 11, 2026
9f46bbd
chore: sorted postprocessing and pmndrs routes by name for consistent…
Tinoooo Mar 11, 2026
9e0a1f7
updated component suite creator instructions for parallel task execution
Tinoooo Mar 11, 2026
dd98692
feature: added Afterimage effect while tweaking the subagents
Tinoooo Mar 11, 2026
7d05d4e
enhanced BasicScene component to support renderMode prop and update u…
Tinoooo Mar 11, 2026
61da3b2
Merge branch 'main' into feat/1334-creation-of-effect-pass-components…
alvarosabu Mar 25, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -29,12 +29,14 @@ coverage

.env
.env.local
.claude
.worktrees

.nx/*
.nx/cache
.nx/workspace-data
.cursor/rules/nx-rules.mdc
.github/instructions/nx.instructions.md

.claude/*
!.claude/agents/
**/contents.sqlite
10 changes: 7 additions & 3 deletions apps/playground/src/components/BasicScene.vue
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,17 @@ import { OrbitControls } from '@tresjs/cientos'
import { TresCanvas } from '@tresjs/core'
import { EffectComposer } from '@tresjs/post-processing'

defineProps<{
withDefaults(defineProps<{
wireframe?: boolean
}>()
renderMode?: 'always' | 'on-demand' | 'manual'
}>(), {
wireframe: false,
renderMode: 'on-demand',
})
</script>

<template>
<TresCanvas render-mode="on-demand">
<TresCanvas :render-mode="renderMode">
<TresPerspectiveCamera
:position="[5, 5, 5]"
:look-at="[0, 0, 0]"
Expand Down
50 changes: 50 additions & 0 deletions apps/playground/src/pages/postprocessing/three/afterimage.vue
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
<script lang="ts" setup>
import { OrbitControls } from '@tresjs/cientos'
import { TresCanvas, useLoop } from '@tresjs/core'
import { TresLeches, useControls } from '@tresjs/leches'
import { Afterimage, EffectComposer } from '@tresjs/post-processing'
import { shallowRef } from 'vue'

const { damp, enabled } = useControls({
damp: { value: 0.96, min: 0, max: 1, step: 0.01 },
enabled: true,
}, {
uuid: 'postprocessing-three-afterimage',
})

const torusRef = shallowRef()

const RotateKnot = () => {
const { onBeforeRender } = useLoop()
onBeforeRender(({ elapsed }) => {
if (torusRef.value) {
torusRef.value.rotation.x = elapsed * 0.4
torusRef.value.rotation.y = elapsed * 0.6
}
})
}
</script>

<template>
<TresLeches uuid="postprocessing-three-afterimage" />
<TresCanvas render-mode="always">
<TresPerspectiveCamera
:position="[5, 5, 5]"
:look-at="[0, 0, 0]"
/>
<OrbitControls />

<TresMesh ref="torusRef">
<TresTorusKnotGeometry :args="[1.5, 0.5, 128, 32]" />
<TresMeshNormalMaterial />
</TresMesh>

<TresGridHelper />

<RotateKnot />

<EffectComposer>
<Afterimage v-if="enabled" :damp="damp" />
</EffectComposer>
</TresCanvas>
</template>
31 changes: 31 additions & 0 deletions apps/playground/src/pages/postprocessing/three/film.vue
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
<script lang="ts" setup>
import { Film } from '@tresjs/post-processing'
import BasicScene from '@/components/BasicScene.vue'
import { TresLeches, useControls } from '@tresjs/leches'

const { intensity, grayscale, enabled } = useControls({
intensity: {
value: 0.5,
min: 0,
max: 1,
step: 0.01,
},
grayscale: true,
enabled: true,
}, {
uuid: 'postprocessing-three-film',
})
</script>

<template>
<TresLeches uuid="postprocessing-three-film" />
<BasicScene render-mode="always">
<template #effects>
<Film
:intensity
:grayscale
:enabled
/>
</template>
</BasicScene>
</template>
117 changes: 117 additions & 0 deletions apps/playground/src/pages/postprocessing/three/sao.vue
Original file line number Diff line number Diff line change
@@ -0,0 +1,117 @@
<script lang="ts" setup>
import { OrbitControls } from '@tresjs/cientos'
import { TresCanvas, useLoop } from '@tresjs/core'
import { TresLeches, useControls } from '@tresjs/leches'
import { EffectComposer, Output, SAO } from '@tresjs/post-processing'
import { shallowRef } from 'vue'
import {
Color,
InstancedMesh,
MeshStandardMaterial,
Object3D,
SphereGeometry,
} from 'three'

const {
enabled,
output,
saoBias,
saoIntensity,
saoScale,
saoKernelRadius,
saoMinResolution,
saoBlur,
saoBlurRadius,
saoBlurStdDev,
saoBlurDepthCutoff,
} = useControls({
enabled: true,
output: { value: 0, min: 0, max: 2, step: 1 },
saoBias: { value: 0.5, min: -1, max: 1, step: 0.01 },
saoIntensity: { value: 0.18, min: 0, max: 1, step: 0.01 },
saoScale: { value: 1, min: 0, max: 10, step: 0.1 },
saoKernelRadius: { value: 100, min: 1, max: 100, step: 1 },
saoMinResolution: { value: 0, min: 0, max: 1, step: 0.01 },
saoBlur: true,
saoBlurRadius: { value: 8, min: 0, max: 200, step: 1 },
saoBlurStdDev: { value: 4, min: 0.5, max: 150, step: 0.5 },
saoBlurDepthCutoff: { value: 0.01, min: 0.0, max: 0.1, step: 0.001 },
}, {
uuid: 'postprocessing-three-sao',
})

// Create 120 random spheres as an InstancedMesh
const geometry = new SphereGeometry(3, 48, 24)
const material = new MeshStandardMaterial({ roughness: 0.5, metalness: 0 })
const spheres = new InstancedMesh(geometry, material, 120)
const dummy = new Object3D()
const color = new Color()

for (let i = 0; i < 120; i++) {
dummy.position.set(
Math.random() * 4 - 2,
Math.random() * 4 - 2,
Math.random() * 4 - 2,
)
dummy.rotation.set(Math.random(), Math.random(), Math.random())
const scale = Math.random() * 0.2 + 0.05
dummy.scale.set(scale, scale, scale)
dummy.updateMatrix()
spheres.setMatrixAt(i, dummy.matrix)
color.setHSL(Math.random(), 1.0, 0.3)
spheres.setColorAt(i, color)
}

const groupRef = shallowRef()

function RotateGroup() {
const { onBeforeRender } = useLoop()
onBeforeRender(({ elapsed }) => {
if (groupRef.value) {
groupRef.value.rotation.x = elapsed * 0.2
groupRef.value.rotation.y = elapsed * 0.1
}
})
}
</script>

<template>
<TresLeches uuid="postprocessing-three-sao" />
<TresCanvas render-mode="always">
<TresPerspectiveCamera
:position="[0, 0, 7]"
:fov="65"
:near="3"
:far="10"
/>
<OrbitControls auto-rotate />

<TresAmbientLight :color="0xFFFFFF" :intensity="0.2" />
<TresPointLight :color="0xEFFFEF" :intensity="500" :position="[-10, -10, 10]" />
<TresPointLight :color="0xFFEFEF" :intensity="500" :position="[-10, 10, 10]" />
<TresPointLight :color="0xEFEFFF" :intensity="500" :position="[10, -10, 10]" />

<TresGroup ref="groupRef">
<primitive :object="spheres" />
</TresGroup>

<RotateGroup />

<EffectComposer>
<SAO
:enabled="enabled"
:output="output"
:sao-bias="saoBias"
:sao-intensity="saoIntensity"
:sao-scale="saoScale"
:sao-kernel-radius="saoKernelRadius"
:sao-min-resolution="saoMinResolution"
:sao-blur="saoBlur"
:sao-blur-radius="saoBlurRadius"
:sao-blur-std-dev="saoBlurStdDev"
:sao-blur-depth-cutoff="saoBlurDepthCutoff"
/>
<Output />
</EffectComposer>
</TresCanvas>
</template>
7 changes: 5 additions & 2 deletions apps/playground/src/router/routes/postprocessing/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -23,12 +23,15 @@ const home: RouteRecordRaw = {
}

export const threeRoutes = [
makeRoute('Afterimage', '👻'),
makeRoute('Pixelation', '👾'),
makeRoute('Glitch', '📺'),
makeRoute('SMAA', '📐'),
makeRoute('Halftone', '🎨'),
makeRoute('Unreal Bloom', '🌼'),
]
makeRoute('Film', '🎞️'),
makeRoute('SAO', '🌑'),
].sort((a, b) => (a.meta?.name as string).localeCompare(b.meta?.name as string))

export const pmndrsRoutes = [
makeRoute('Outline', '🔲', false),
Expand Down Expand Up @@ -61,7 +64,7 @@ export const pmndrsRoutes = [
makeRoute('Barrel blur', '🌀', false),
makeRoute('Fish Eye', '👁️', false),
makeRoute('On-demand', '🔄', false),
]
].sort((a, b) => (a.meta?.name as string).localeCompare(b.meta?.name as string))

export const postProcessingRoutes = [
home,
Expand Down
3 changes: 3 additions & 0 deletions apps/postprocessing-docs-vitepress/.vitepress/config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -82,10 +82,13 @@ export default defineConfig({
{
text: 'Three',
items: [
{ text: 'Afterimage', link: '/guide/three/afterimage' },
{ text: 'Film', link: '/guide/three/film' },
{ text: 'Glitch', link: '/guide/three/glitch' },
{ text: 'Halftone', link: '/guide/three/halftone' },
{ text: 'Output', link: '/guide/three/output' },
{ text: 'Pixelation', link: '/guide/three/pixelation' },
{ text: 'SAO', link: '/guide/three/sao' },
{ text: 'SMAA', link: '/guide/three/smaa' },
{ text: 'Unreal Bloom', link: '/guide/three/unreal-bloom' },
].sort((a, b) => a.text.localeCompare(b.text)),
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
<script lang="ts" setup>
import { OrbitControls } from '@tresjs/cientos'
import { TresCanvas } from '@tresjs/core'
import { Afterimage, EffectComposer } from '@tresjs/post-processing'
import { Color } from 'three'

import { useRouteDisposal } from '../../composables/useRouteDisposal'

const { effectComposer } = useRouteDisposal()
</script>

<template>
<TresCanvas
clear-color="#121212"
:alpha="false"
:shadows="true"
>
<TresPerspectiveCamera
:position="[3, 4, 4]"
/>
<OrbitControls
auto-rotate
:auto-rotate-speed="2"
:target="[0, 1, 0]"
/>
<TresMesh :position="[0, 1, 0]">
<TresTorusKnotGeometry :args="[0.8, 0.3, 128, 32]" />
<TresMeshStandardMaterial
color="cyan"
:emissive="new Color('cyan')"
:emissive-intensity="0.2"
/>
</TresMesh>

<TresGridHelper />
<TresAmbientLight :intensity="1" />
<TresDirectionalLight
:position="[3, 5, 3]"
:intensity="1.5"
/>

<Suspense>
<EffectComposer ref="effectComposer">
<Afterimage :damp="0.98" />
</EffectComposer>
</Suspense>
</TresCanvas>
</template>
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
<script lang="ts" setup>
import { OrbitControls } from '@tresjs/cientos'
import { TresCanvas } from '@tresjs/core'
import { EffectComposer, Film } from '@tresjs/post-processing'

import { useRouteDisposal } from '../../composables/useRouteDisposal'

// Need to dispose of the effect composer when the route changes because Vitepress doesnt unmount the components
const { effectComposer } = useRouteDisposal()
</script>

<template>
<TresCanvas
clear-color="#121212"
:alpha="false"
:shadows="true"
>
<TresPerspectiveCamera
:position="[3, 2, 4]"
:look-at="[0, 0, 0]"
/>
<OrbitControls />
<TresMesh :position="[-1, 0.5, 0]">
<TresSphereGeometry :args="[0.8, 32, 32]" />
<TresMeshStandardMaterial color="#f0f0f0" />
</TresMesh>
<TresMesh :position="[1.2, 0.5, 0]">
<TresTorusGeometry :args="[0.5, 0.2, 16, 32]" />
<TresMeshStandardMaterial color="aqua" />
</TresMesh>

<TresGridHelper />
<TresAmbientLight :intensity="0.8" />
<TresDirectionalLight
:position="[-5, 5, 5]"
:intensity="1.5"
/>

<Suspense>
<EffectComposer ref="effectComposer">
<Film :intensity="1" />
</EffectComposer>
</Suspense>
</TresCanvas>
</template>
Loading
Loading