UNPKG

cione-comp-lib

Version:

`$ yarn add cione-comp-lib` 或者 `$ npm i cione-comp-lib -S`

91 lines (90 loc) 2.75 kB
import Mesh from "../Mesh.mjs"; import CubeGeometry from "../geometry/Cube.mjs"; import Shader from "../Shader.mjs"; import Material from "../Material.mjs"; import Texture from "../Texture.mjs"; import PerspectiveCamera from "../camera/Perspective.mjs"; import Matrix4 from "../math/Matrix4.mjs"; import skyboxEssl from "../shader/source/skybox.glsl.mjs"; Shader.import(skyboxEssl); var Skybox = Mesh.extend(function() { var skyboxShader = new Shader({ vertex: Shader.source("clay.skybox.vertex"), fragment: Shader.source("clay.skybox.fragment") }); var material = new Material({ shader: skyboxShader, depthMask: false }); return { scene: null, geometry: new CubeGeometry(), material, environmentMap: null, culling: false, _dummyCamera: new PerspectiveCamera() }; }, function() { var scene = this.scene; if (scene) { this.attachScene(scene); } if (this.environmentMap) { this.setEnvironmentMap(this.environmentMap); } }, { attachScene: function(scene) { if (this.scene) { this.detachScene(); } scene.skybox = this; this.scene = scene; scene.on("beforerender", this._beforeRenderScene, this); }, detachScene: function() { if (this.scene) { this.scene.off("beforerender", this._beforeRenderScene); this.scene.skybox = null; } this.scene = null; }, dispose: function(renderer) { this.detachScene(); this.geometry.dispose(renderer); }, setEnvironmentMap: function(envMap) { if (envMap.textureType === "texture2D") { this.material.define("EQUIRECTANGULAR"); envMap.minFilter = Texture.LINEAR; } else { this.material.undefine("EQUIRECTANGULAR"); } this.material.set("environmentMap", envMap); }, getEnvironmentMap: function() { return this.material.get("environmentMap"); }, _beforeRenderScene: function(renderer, scene, camera) { this.renderSkybox(renderer, camera); }, renderSkybox: function(renderer, camera) { var dummyCamera = this._dummyCamera; dummyCamera.aspect = renderer.getViewportAspect(); dummyCamera.fov = camera.fov || 50; dummyCamera.updateProjectionMatrix(); Matrix4.invert(dummyCamera.invProjectionMatrix, dummyCamera.projectionMatrix); dummyCamera.worldTransform.copy(camera.worldTransform); dummyCamera.viewMatrix.copy(camera.viewMatrix); this.position.copy(camera.getWorldPosition()); this.update(); renderer.gl.disable(renderer.gl.BLEND); if (this.material.get("lod") > 0) { this.material.define("fragment", "LOD"); } else { this.material.undefine("fragment", "LOD"); } renderer.renderPass([this], dummyCamera); } }); var Skybox$1 = Skybox; export { Skybox$1 as default };