cione-comp-lib
Version:
`$ yarn add cione-comp-lib` 或者 `$ npm i cione-comp-lib -S`
91 lines (90 loc) • 2.75 kB
JavaScript
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 };