1
0
mirror of https://github.com/troisjs/trois.git synced 2024-11-24 04:12:02 +08:00

improve hmr (effects, mesh)

This commit is contained in:
Kevin Levron 2020-09-21 09:15:15 +02:00
parent 1611539d63
commit 16c21ef7f8
10 changed files with 70 additions and 39 deletions

View File

@ -25,14 +25,23 @@ Thanks to VueJS/ViteJS, **TroisJS use watchers and HMR to update ThreeJS objects
- [x] PerspectiveCamera : aspect, far, fov, near, position
- [x] Light : castShadow, color, intensity, position, target
- [x] SpotLight : angle, decay, distance, penumbra
- [ ] ...
- [x] Material : color, depthTest, depthWrite, fog, opacity, transparent
- [x] StandardMaterial : emissive, emissiveIntensity, metalness, roughness
- [x] Mesh : position, rotation, scale, castShadow, receiveShadow
- [ ] ...
- [x] Mesh : materialId, position, rotation, scale, castShadow, receiveShadow
- [x] Box (geometry replace) : size, width, height, depth
- [x] Plane (geometry replace) : width, height, widthSegments, heightSegments
- [x] Sphere (geometry replace) : radius, widthSegments, heightSegments
- [x] Text (geometry replace) : all props except fontSrc (wip)
- [ ] ...
- [ ] PostProcessing
- [x] BokehPass : focus, aperture, maxblur
- [x] FilmPass : noiseIntensity, scanlinesIntensity, scanlinesCount, grayscale
- [x] HalftonePass : shape, radius, rotateR, rotateG, rotateB, scatter
- [x] UnrealBloomPass : strength, radius, threshold
- [ ] ...
- [ ] ...
## Features

View File

@ -17,17 +17,11 @@ export default {
default: 0.01,
},
},
// watch: {
// focus() {
// this.pass.focus = this.focus;
// },
// aperture() {
// this.pass.aperture = this.aperture;
// },
// maxblur() {
// this.pass.maxblur = this.maxblur;
// },
// },
watch: {
focus() { this.pass.uniforms.focus.value = this.focus; },
aperture() { this.pass.uniforms.aperture.value = this.aperture; },
maxblur() { this.pass.uniforms.maxblur.value = this.maxblur; },
},
mounted() {
if (!this.three.scene) {
console.error('Missing Scene');

View File

@ -15,6 +15,7 @@ export default {
mounted() {
this.three.onAfterInit(() => {
this.composer = new EffectComposer(this.three.renderer);
this.three.renderer.autoClear = false;
this.passes.forEach(pass => {
this.composer.addPass(pass);
});

View File

@ -5,6 +5,9 @@ export default {
console.error('Missing parent EffectComposer');
}
},
unmounted() {
if (this.pass.dispose) this.pass.dispose();
},
render() {
return [];
},

View File

@ -0,0 +1,29 @@
import { HalftonePass } from 'three/examples/jsm/postprocessing/HalftonePass.js';
import { watch } from 'vue';
import EffectPass from './EffectPass.js';
export default {
extends: EffectPass,
props: {
shape: { type: Number, default: 1 },
radius: { type: Number, default: 4 },
rotateR: { type: Number, default: Math.PI / 12 * 1 },
rotateG: { type: Number, default: Math.PI / 12 * 2 },
rotateB: { type: Number, default: Math.PI / 12 * 3 },
scatter: { type: Number, default: 0 },
},
mounted() {
const pass = new HalftonePass(this.three.size.width, this.three.size.height, {});
['shape', 'radius', 'rotateR', 'rotateG', 'rotateB', 'scatter'].forEach(p => {
pass.uniforms[p].value = this[p];
watch(() => this[p], () => {
pass.uniforms[p].value = this[p];
});
});
this.passes.push(pass);
this.pass = pass;
},
__hmrId: 'HalftonePass',
};

View File

@ -5,30 +5,15 @@ import EffectPass from './EffectPass.js';
export default {
extends: EffectPass,
props: {
strength: {
type: Number,
default: 1.5,
strength: { type: Number, default: 1.5 },
radius: { type: Number, default: 0 },
threshold: { type: Number, default: 0 },
},
radius: {
type: Number,
default: 0,
watch: {
strength() { this.pass.strength = this.strength; },
radius() { this.pass.radius = this.radius; },
threshold() { this.pass.threshold = this.threshold; },
},
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);

View File

@ -2,4 +2,6 @@ export { default as EffectComposer } from './EffectComposer.js';
export { default as RenderPass } from './RenderPass.js';
export { default as BokehPass } from './BokehPass.js';
export { default as FilmPass } from './FilmPass.js';
export { default as HalftonePass } from './HalftonePass.js';
export { default as SAOPass } from './SAOPass.js';
export { default as UnrealBloomPass } from './UnrealBloomPass.js';

View File

@ -39,12 +39,15 @@ export default {
useBindProp(this, 'rotation', this.mesh.rotation);
useBindProp(this, 'scale', this.mesh.scale);
this.mesh.castShadow = this.castShadow;
this.mesh.receiveShadow = this.receiveShadow;
['castShadow', 'receiveShadow'].forEach(p => {
this.mesh[p] = this[p];
watch(() => this[p], () => { this.mesh[p] = this[p]; });
});
// watch(() => this.materialId, () => {
// this.mesh.material = this.three.materials[this.materialId];
// });
this.scene.add(this.mesh);
},
unmounted() {

View File

@ -37,12 +37,15 @@ export default {
useBindProp(this, 'rotation', this.mesh.rotation);
useBindProp(this, 'scale', this.mesh.scale);
this.mesh.castShadow = this.castShadow;
this.mesh.receiveShadow = this.receiveShadow;
['castShadow', 'receiveShadow'].forEach(p => {
this.mesh[p] = this[p];
watch(() => this[p], () => { this.mesh[p] = this[p]; });
});
watch(() => this.materialId, () => {
this.mesh.material = this.three.materials[this.materialId];
});
this.scene.add(this.mesh);
this.$emit('ready');
},

View File

@ -37,7 +37,9 @@ export const TroisJSVuePlugin = {
'BokehPass',
'EffectComposer',
'FilmPass',
'HalftonePass',
'RenderPass',
'SAOPass',
'UnrealBloomPass',
'GLTFViewer',