UNPKG

@openhps/core

Version:

Open Hybrid Positioning System - Core component

162 lines (137 loc) 5.63 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.WebGLCubeRenderTarget = void 0; var _constants = require("../constants.js"); var _Mesh = require("../objects/Mesh.js"); var _BoxGeometry = require("../geometries/BoxGeometry.js"); var _ShaderMaterial = require("../materials/ShaderMaterial.js"); var _UniformsUtils = require("./shaders/UniformsUtils.js"); var _WebGLRenderTarget = require("./WebGLRenderTarget.js"); var _CubeCamera = require("../cameras/CubeCamera.js"); var _CubeTexture = require("../textures/CubeTexture.js"); /** * A cube render target used in context of {@link WebGLRenderer}. * * @augments WebGLRenderTarget */ class WebGLCubeRenderTarget extends _WebGLRenderTarget.WebGLRenderTarget { /** * Constructs a new cube render target. * * @param {number} [size=1] - The size of the render target. * @param {RenderTarget~Options} [options] - The configuration object. */ constructor(size = 1, options = {}) { super(size, size, options); /** * This flag can be used for type testing. * * @type {boolean} * @readonly * @default true */ this.isWebGLCubeRenderTarget = true; const image = { width: size, height: size, depth: 1 }; const images = [image, image, image, image, image, image]; /** * Overwritten with a different texture type. * * @type {DataArrayTexture} */ this.texture = new _CubeTexture.CubeTexture(images, options.mapping, options.wrapS, options.wrapT, options.magFilter, options.minFilter, options.format, options.type, options.anisotropy, options.colorSpace); // By convention -- likely based on the RenderMan spec from the 1990's -- cube maps are specified by WebGL (and three.js) // in a coordinate system in which positive-x is to the right when looking up the positive-z axis -- in other words, // in a left-handed coordinate system. By continuing this convention, preexisting cube maps continued to render correctly. // three.js uses a right-handed coordinate system. So environment maps used in three.js appear to have px and nx swapped // and the flag isRenderTargetTexture controls this conversion. The flip is not required when using WebGLCubeRenderTarget.texture // as a cube texture (this is detected when isRenderTargetTexture is set to true for cube textures). this.texture.isRenderTargetTexture = true; this.texture.generateMipmaps = options.generateMipmaps !== undefined ? options.generateMipmaps : false; this.texture.minFilter = options.minFilter !== undefined ? options.minFilter : _constants.LinearFilter; } /** * Converts the given equirectangular texture to a cube map. * * @param {WebGLRenderer} renderer - The renderer. * @param {Texture} texture - The equirectangular texture. * @return {WebGLCubeRenderTarget} A reference to this cube render target. */ fromEquirectangularTexture(renderer, texture) { this.texture.type = texture.type; this.texture.colorSpace = texture.colorSpace; this.texture.generateMipmaps = texture.generateMipmaps; this.texture.minFilter = texture.minFilter; this.texture.magFilter = texture.magFilter; const shader = { uniforms: { tEquirect: { value: null } }, vertexShader: /* glsl */` varying vec3 vWorldDirection; vec3 transformDirection( in vec3 dir, in mat4 matrix ) { return normalize( ( matrix * vec4( dir, 0.0 ) ).xyz ); } void main() { vWorldDirection = transformDirection( position, modelMatrix ); #include <begin_vertex> #include <project_vertex> } `, fragmentShader: /* glsl */` uniform sampler2D tEquirect; varying vec3 vWorldDirection; #include <common> void main() { vec3 direction = normalize( vWorldDirection ); vec2 sampleUV = equirectUv( direction ); gl_FragColor = texture2D( tEquirect, sampleUV ); } ` }; const geometry = new _BoxGeometry.BoxGeometry(5, 5, 5); const material = new _ShaderMaterial.ShaderMaterial({ name: 'CubemapFromEquirect', uniforms: (0, _UniformsUtils.cloneUniforms)(shader.uniforms), vertexShader: shader.vertexShader, fragmentShader: shader.fragmentShader, side: _constants.BackSide, blending: _constants.NoBlending }); material.uniforms.tEquirect.value = texture; const mesh = new _Mesh.Mesh(geometry, material); const currentMinFilter = texture.minFilter; // Avoid blurred poles if (texture.minFilter === _constants.LinearMipmapLinearFilter) texture.minFilter = _constants.LinearFilter; const camera = new _CubeCamera.CubeCamera(1, 10, this); camera.update(renderer, mesh); texture.minFilter = currentMinFilter; mesh.geometry.dispose(); mesh.material.dispose(); return this; } /** * Clears this cube render target. * * @param {WebGLRenderer} renderer - The renderer. * @param {boolean} [color=true] - Whether the color buffer should be cleared or not. * @param {boolean} [depth=true] - Whether the depth buffer should be cleared or not. * @param {boolean} [stencil=true] - Whether the stencil buffer should be cleared or not. */ clear(renderer, color = true, depth = true, stencil = true) { const currentRenderTarget = renderer.getRenderTarget(); for (let i = 0; i < 6; i++) { renderer.setRenderTarget(this, i); renderer.clear(color, depth, stencil); } renderer.setRenderTarget(currentRenderTarget); } } exports.WebGLCubeRenderTarget = WebGLCubeRenderTarget;