| | |
| | | import { EffectComposer } from 'three/examples/jsm/postprocessing/EffectComposer'; |
| | | import { RenderPass } from 'three/examples/jsm/postprocessing/RenderPass'; |
| | | import { OutlinePass } from 'three/examples/jsm/postprocessing/OutlinePass'; |
| | | import { ShaderPass } from 'three/examples/jsm/postprocessing/ShaderPass'; |
| | | import { FXAAShader } from 'three/examples/jsm/shaders/FXAAShader'; |
| | | |
| | | |
| | | const help = false; |
| | | |
| | |
| | | } |
| | | |
| | | render = () => { |
| | | this.renderer.shadowMap.enabled = true; |
| | | // this.renderer.render(this.scene, this.camera); |
| | | this.composer.render(); // use special effects |
| | | this.stats.update(); |
| | |
| | | initScene = () => { |
| | | const scene = new THREE.Scene(); |
| | | // scene.background = new THREE.Color(0xf0f0f0); |
| | | scene.background = new THREE.Color(0x333333); |
| | | // scene.background = new THREE.Color(0x333333); |
| | | |
| | | // scene.background = new THREE.Color(0xf8f8f8); |
| | | scene.background = new THREE.Color(0x7a7a7a); |
| | | if (help) { |
| | | scene.add(new THREE.AxesHelper(1000)); |
| | | } |
| | |
| | | const composer = new EffectComposer(this.renderer); |
| | | const renderPass = new RenderPass(this.scene, this.camera); |
| | | composer.addPass(renderPass); |
| | | // pixel ratio |
| | | const pixelRatio = this.renderer.getPixelRatio(); |
| | | const newWidth = Math.floor(this.getFullWidth() * pixelRatio) || 1; |
| | | const newHeight = Math.floor(this.getFullHeight() * pixelRatio) || 1; |
| | | composer.setSize(newWidth, newHeight); |
| | | // antialias |
| | | const effectFXAA = new ShaderPass(FXAAShader); |
| | | effectFXAA.uniforms['resolution'].value.set(1 / newWidth, 1 / newHeight); |
| | | composer.addPass(effectFXAA); |
| | | // outline |
| | | this.outlinePass = new OutlinePass(new THREE.Vector2(this.getFullWidth(), this.getFullHeight()), this.scene, this.camera); |
| | | this.outlinePass.visibleEdgeColor.set('#ffffff'); // outline color |
| | | this.outlinePass.edgeStrength = 10; // outline weight |
| | | composer.addPass(this.outlinePass); |
| | | return composer; |
| | | } |
| | |
| | | raycaster.setFromCamera(mouse, this.camera); |
| | | let intersects = raycaster.intersectObjects(this.objects, true); |
| | | if (intersects.length === 0) { |
| | | this.outlinePass.selectedObjects = []; |
| | | return; |
| | | } |
| | | this.outlinePass.selectedObjects = [intersects[0].object]; |
| | |
| | | |
| | | generateMesh = (fn) => { |
| | | fn(this.addObject); |
| | | } |
| | | |
| | | setNewSelectedMesh = (objName) => { |
| | | for(const mesh of this.objects) { |
| | | if (mesh.name === objName) { |
| | | this.outlinePass.selectedObjects = [mesh]; |
| | | break; |
| | | } |
| | | } |
| | | } |
| | | |
| | | destroy = () => { |
| | |
| | | |
| | | const initLight = (scene) => { |
| | | const directionalLight = new THREE.DirectionalLight(0xffffff, 8); |
| | | directionalLight.position.set(-300, 300, 300); |
| | | directionalLight.position.set(1, 1, 1); |
| | | scene.add(directionalLight); |
| | | |
| | | const ambientLight = new THREE.AmbientLight(0xf0f0f0, 8); |
| | | const ambientLight = new THREE.AmbientLight(0xf0f0f0, 18); |
| | | scene.add(ambientLight); |
| | | |
| | | const spotLight = new THREE.SpotLight(0xffffff, 8); |