mirror of
https://github.com/troisjs/trois.git
synced 2024-11-24 04:12:02 +08:00
add effects
This commit is contained in:
parent
047dd1543f
commit
6040b6f44d
@ -60,7 +60,8 @@ export default {
|
|||||||
|
|
||||||
if (this.three.init(params)) {
|
if (this.three.init(params)) {
|
||||||
this.three.renderer.shadowMap.enabled = this.shadow;
|
this.three.renderer.shadowMap.enabled = this.shadow;
|
||||||
this.animate();
|
if (this.three.composer) this.animateC();
|
||||||
|
else this.animate();
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
beforeUnmount() {
|
beforeUnmount() {
|
||||||
@ -78,6 +79,10 @@ export default {
|
|||||||
if (this.raf) requestAnimationFrame(this.animate);
|
if (this.raf) requestAnimationFrame(this.animate);
|
||||||
this.three.render();
|
this.three.render();
|
||||||
},
|
},
|
||||||
|
animateC() {
|
||||||
|
if (this.raf) requestAnimationFrame(this.animateC);
|
||||||
|
this.three.renderC();
|
||||||
|
},
|
||||||
},
|
},
|
||||||
render() {
|
render() {
|
||||||
return h(
|
return h(
|
||||||
|
@ -33,6 +33,7 @@ export default function useThree() {
|
|||||||
};
|
};
|
||||||
|
|
||||||
// handlers
|
// handlers
|
||||||
|
const afterInitHandlers = [];
|
||||||
const afterResizeHandlers = [];
|
const afterResizeHandlers = [];
|
||||||
const beforeRenderHandlers = [];
|
const beforeRenderHandlers = [];
|
||||||
|
|
||||||
@ -55,7 +56,9 @@ export default function useThree() {
|
|||||||
init,
|
init,
|
||||||
dispose,
|
dispose,
|
||||||
render,
|
render,
|
||||||
|
renderC,
|
||||||
setSize,
|
setSize,
|
||||||
|
onAfterInit,
|
||||||
onAfterResize,
|
onAfterResize,
|
||||||
onBeforeRender,
|
onBeforeRender,
|
||||||
};
|
};
|
||||||
@ -108,9 +111,32 @@ export default function useThree() {
|
|||||||
obj.mouse_move_element.addEventListener('mouseleave', onMouseleave);
|
obj.mouse_move_element.addEventListener('mouseleave', onMouseleave);
|
||||||
}
|
}
|
||||||
|
|
||||||
return obj;
|
afterInitHandlers.forEach(c => c());
|
||||||
|
|
||||||
|
return true;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* add after init handler
|
||||||
|
*/
|
||||||
|
function onAfterInit(callback) {
|
||||||
|
afterInitHandlers.push(callback);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* add after resize handler
|
||||||
|
*/
|
||||||
|
function onAfterResize(callback) {
|
||||||
|
afterResizeHandlers.push(callback);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* add before render handler
|
||||||
|
*/
|
||||||
|
function onBeforeRender(callback) {
|
||||||
|
beforeRenderHandlers.push(callback);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* default render
|
* default render
|
||||||
*/
|
*/
|
||||||
@ -121,10 +147,12 @@ export default function useThree() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* add before render handler
|
* composer render
|
||||||
*/
|
*/
|
||||||
function onBeforeRender(callback) {
|
function renderC() {
|
||||||
beforeRenderHandlers.push(callback);
|
if (obj.orbitCtrl) obj.orbitCtrl.update();
|
||||||
|
beforeRenderHandlers.forEach(c => c());
|
||||||
|
obj.composer.render();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -180,13 +208,6 @@ export default function useThree() {
|
|||||||
afterResizeHandlers.forEach(c => c());
|
afterResizeHandlers.forEach(c => c());
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* add after resize handler
|
|
||||||
*/
|
|
||||||
function onAfterResize(callback) {
|
|
||||||
afterResizeHandlers.push(callback);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* update renderer size and camera
|
* update renderer size and camera
|
||||||
*/
|
*/
|
||||||
@ -199,6 +220,10 @@ export default function useThree() {
|
|||||||
obj.camera.aspect = size.ratio;
|
obj.camera.aspect = size.ratio;
|
||||||
obj.camera.updateProjectionMatrix();
|
obj.camera.updateProjectionMatrix();
|
||||||
|
|
||||||
|
if (obj.composer) {
|
||||||
|
obj.composer.setSize(width, height);
|
||||||
|
}
|
||||||
|
|
||||||
const wsize = getCameraSize();
|
const wsize = getCameraSize();
|
||||||
size.wWidth = wsize[0]; size.wHeight = wsize[1];
|
size.wWidth = wsize[0]; size.wHeight = wsize[1];
|
||||||
}
|
}
|
||||||
|
43
src/effects/BokehPass.js
Normal file
43
src/effects/BokehPass.js
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
import { BokehPass } from 'three/examples/jsm/postprocessing/BokehPass.js';
|
||||||
|
import EffectPass from './EffectPass.js';
|
||||||
|
|
||||||
|
export default {
|
||||||
|
extends: EffectPass,
|
||||||
|
props: {
|
||||||
|
focus: {
|
||||||
|
type: Number,
|
||||||
|
default: 1,
|
||||||
|
},
|
||||||
|
aperture: {
|
||||||
|
type: Number,
|
||||||
|
default: 0.025,
|
||||||
|
},
|
||||||
|
maxblur: {
|
||||||
|
type: Number,
|
||||||
|
default: 0.01,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
// watch: {
|
||||||
|
// focus() {
|
||||||
|
// this.pass.focus = this.focus;
|
||||||
|
// },
|
||||||
|
// aperture() {
|
||||||
|
// this.pass.aperture = this.aperture;
|
||||||
|
// },
|
||||||
|
// maxblur() {
|
||||||
|
// this.pass.maxblur = this.maxblur;
|
||||||
|
// },
|
||||||
|
// },
|
||||||
|
mounted() {
|
||||||
|
if (!this.three.scene) {
|
||||||
|
console.error('Missing Scene');
|
||||||
|
}
|
||||||
|
if (!this.three.camera) {
|
||||||
|
console.error('Missing Camera');
|
||||||
|
}
|
||||||
|
const params = { ...this.$props, width: this.three.size.width, height: this.three.size.height };
|
||||||
|
const pass = new BokehPass(this.three.scene, this.three.camera, params);
|
||||||
|
this.passes.push(pass);
|
||||||
|
this.pass = pass;
|
||||||
|
},
|
||||||
|
};
|
27
src/effects/EffectComposer.js
Normal file
27
src/effects/EffectComposer.js
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
import { EffectComposer } from 'three/examples/jsm/postprocessing/EffectComposer.js';
|
||||||
|
|
||||||
|
export default {
|
||||||
|
setup() {
|
||||||
|
return {
|
||||||
|
passes: [],
|
||||||
|
};
|
||||||
|
},
|
||||||
|
inject: ['three'],
|
||||||
|
provide() {
|
||||||
|
return {
|
||||||
|
passes: this.passes,
|
||||||
|
};
|
||||||
|
},
|
||||||
|
mounted() {
|
||||||
|
this.three.onAfterInit(() => {
|
||||||
|
this.composer = new EffectComposer(this.three.renderer);
|
||||||
|
this.passes.forEach(pass => {
|
||||||
|
this.composer.addPass(pass);
|
||||||
|
});
|
||||||
|
this.three.composer = this.composer;
|
||||||
|
});
|
||||||
|
},
|
||||||
|
render() {
|
||||||
|
return this.$slots.default();
|
||||||
|
},
|
||||||
|
};
|
11
src/effects/EffectPass.js
Normal file
11
src/effects/EffectPass.js
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
export default {
|
||||||
|
inject: ['three', 'passes'],
|
||||||
|
beforeMount() {
|
||||||
|
if (!this.passes) {
|
||||||
|
console.error('Missing parent EffectComposer');
|
||||||
|
}
|
||||||
|
},
|
||||||
|
render() {
|
||||||
|
return [];
|
||||||
|
},
|
||||||
|
};
|
17
src/effects/RenderPass.js
Normal file
17
src/effects/RenderPass.js
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
import { RenderPass } from 'three/examples/jsm/postprocessing/RenderPass.js';
|
||||||
|
import EffectPass from './EffectPass.js';
|
||||||
|
|
||||||
|
export default {
|
||||||
|
extends: EffectPass,
|
||||||
|
mounted() {
|
||||||
|
if (!this.three.scene) {
|
||||||
|
console.error('Missing Scene');
|
||||||
|
}
|
||||||
|
if (!this.three.camera) {
|
||||||
|
console.error('Missing Camera');
|
||||||
|
}
|
||||||
|
const pass = new RenderPass(this.three.scene, this.three.camera);
|
||||||
|
this.passes.push(pass);
|
||||||
|
this.pass = pass;
|
||||||
|
},
|
||||||
|
};
|
38
src/effects/UnrealBloomPass.js
Normal file
38
src/effects/UnrealBloomPass.js
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
import { Vector2 } from 'three';
|
||||||
|
import { UnrealBloomPass } from 'three/examples/jsm/postprocessing/UnrealBloomPass.js';
|
||||||
|
import EffectPass from './EffectPass.js';
|
||||||
|
|
||||||
|
export default {
|
||||||
|
extends: EffectPass,
|
||||||
|
props: {
|
||||||
|
strength: {
|
||||||
|
type: Number,
|
||||||
|
default: 1.5,
|
||||||
|
},
|
||||||
|
radius: {
|
||||||
|
type: Number,
|
||||||
|
default: 0,
|
||||||
|
},
|
||||||
|
threshold: {
|
||||||
|
type: Number,
|
||||||
|
default: 0,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
// watch: {
|
||||||
|
// strength() {
|
||||||
|
// this.pass.strength = this.strength;
|
||||||
|
// },
|
||||||
|
// radius() {
|
||||||
|
// this.pass.strength = this.radius;
|
||||||
|
// },
|
||||||
|
// threshold() {
|
||||||
|
// this.pass.strength = this.threshold;
|
||||||
|
// },
|
||||||
|
// },
|
||||||
|
mounted() {
|
||||||
|
const size = new Vector2(this.three.size.width, this.three.size.height);
|
||||||
|
const pass = new UnrealBloomPass(size, this.strength, this.radius, this.threshold);
|
||||||
|
this.passes.push(pass);
|
||||||
|
this.pass = pass;
|
||||||
|
},
|
||||||
|
};
|
4
src/effects/index.js
Normal file
4
src/effects/index.js
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
export { default as EffectComposer } from './EffectComposer.js';
|
||||||
|
export { default as RenderPass } from './RenderPass.js';
|
||||||
|
export { default as BokehPass } from './BokehPass.js';
|
||||||
|
export { default as UnrealBloomPass } from './UnrealBloomPass.js';
|
@ -4,3 +4,5 @@ export * from './lights/index.js';
|
|||||||
export * from './materials/index.js';
|
export * from './materials/index.js';
|
||||||
export * from './meshes/index.js';
|
export * from './meshes/index.js';
|
||||||
export * from './tools.js';
|
export * from './tools.js';
|
||||||
|
|
||||||
|
export * from './effects/index.js';
|
||||||
|
Loading…
Reference in New Issue
Block a user