1- import { defineComponent , inject , onMounted , onUnmounted } from 'vue'
1+ import { defineComponent , inject , onMounted , onUnmounted , watch } from 'vue'
22import { LoadingManager } from 'three'
33import { BloomEffect , DepthOfFieldEffect , EdgeDetectionMode , GodRaysEffect , SMAAEffect , SMAAImageLoader , SMAAPreset } from 'postprocessing'
44import { EffectPassInjectionKey } from './EffectPass'
@@ -22,7 +22,7 @@ export default defineComponent({
2222 const effectIndex = effectPass . getEffectIndex ( )
2323
2424 const initEffect = ( params ) => {
25- effect = createEffect ( effectPass , props . type , props . options , params )
25+ effect = createEffect ( effectPass , props , params )
2626 if ( ! effect ) {
2727 console . error ( 'Invalid effect type' )
2828 return
@@ -52,34 +52,51 @@ export default defineComponent({
5252 render ( ) { return [ ] } ,
5353} )
5454
55- function createEffect ( effectPass , type , options , assets ) {
55+ function createEffect ( effectPass , props , assets ) {
5656 let effect
57- switch ( type ) {
57+ switch ( props . type ) {
5858 case 'bloom' :
59- effect = new BloomEffect ( options )
59+ effect = createBloomEffect ( props )
6060 break
6161 case 'dof' :
62- effect = new DepthOfFieldEffect ( effectPass . composer . renderer , options )
62+ effect = createDepthOfFieldEffect ( effectPass , props )
6363 break
6464 case 'godrays' :
65- effect = createGodraysEffect ( effectPass , options )
65+ effect = createGodraysEffect ( effectPass , props )
6666 break
6767 case 'smaa' :
68- effect = createSmaaEffect ( options , assets )
68+ effect = createSmaaEffect ( props , assets )
6969 break
7070 }
7171 return effect
7272}
7373
74- function createSmaaEffect ( options , assets ) {
74+ function createBloomEffect ( props ) {
75+ const effect = new BloomEffect ( props . options )
76+ watch ( ( ) => props . options . luminanceThreshold , ( value ) => { effect . luminanceMaterial . threshold = value } )
77+ watch ( ( ) => props . options . luminanceSmoothing , ( value ) => { effect . luminanceMaterial . smoothing = value } )
78+ watch ( ( ) => props . options . intensity , ( value ) => { effect . intensity = value } )
79+ return effect
80+ }
81+
82+ function createDepthOfFieldEffect ( effectPass , props ) {
83+ const effect = new DepthOfFieldEffect ( effectPass . composer . renderer , props . options )
84+ const uniforms = effect . circleOfConfusionMaterial . uniforms
85+ watch ( ( ) => props . options . focusDistance , ( value ) => { uniforms . focusDistance . value = value } )
86+ watch ( ( ) => props . options . focalLength , ( value ) => { uniforms . focalLength . value = value } )
87+ watch ( ( ) => props . options . bokehScale , ( value ) => { effect . bokehScale = value } )
88+ return effect
89+ }
90+
91+ function createSmaaEffect ( props , assets ) {
7592 const { smaaSearch, smaaArea } = assets
76- const params = [ options . preset ?? SMAAPreset . HIGH , options . edgeDetectionMode ?? EdgeDetectionMode . COLOR ]
93+ const params = [ props . options . preset ?? SMAAPreset . HIGH , props . options . edgeDetectionMode ?? EdgeDetectionMode . COLOR ]
7794 return new SMAAEffect ( smaaSearch , smaaArea , ...params )
7895}
7996
80- function createGodraysEffect ( effectPass , options ) {
81- const opts = { ...options }
82- const { lightSource } = options
97+ function createGodraysEffect ( effectPass , props ) {
98+ const opts = { ...props . options }
99+ const { lightSource } = props . options
83100 if ( typeof lightSource !== 'string' ) {
84101 console . error ( 'Invalid lightSource' )
85102 return
0 commit comments