UNPKG

@openhps/core

Version:

Open Hybrid Positioning System - Core component

80 lines (76 loc) 3.1 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.WebGLCubeUVMaps = WebGLCubeUVMaps; var _constants = require("../../constants.js"); var _PMREMGenerator = require("../../extras/PMREMGenerator.js"); function WebGLCubeUVMaps(renderer) { let cubeUVmaps = new WeakMap(); let pmremGenerator = null; function get(texture) { if (texture && texture.isTexture) { const mapping = texture.mapping; const isEquirectMap = mapping === _constants.EquirectangularReflectionMapping || mapping === _constants.EquirectangularRefractionMapping; const isCubeMap = mapping === _constants.CubeReflectionMapping || mapping === _constants.CubeRefractionMapping; // equirect/cube map to cubeUV conversion if (isEquirectMap || isCubeMap) { let renderTarget = cubeUVmaps.get(texture); const currentPMREMVersion = renderTarget !== undefined ? renderTarget.texture.pmremVersion : 0; if (texture.isRenderTargetTexture && texture.pmremVersion !== currentPMREMVersion) { if (pmremGenerator === null) pmremGenerator = new _PMREMGenerator.PMREMGenerator(renderer); renderTarget = isEquirectMap ? pmremGenerator.fromEquirectangular(texture, renderTarget) : pmremGenerator.fromCubemap(texture, renderTarget); renderTarget.texture.pmremVersion = texture.pmremVersion; cubeUVmaps.set(texture, renderTarget); return renderTarget.texture; } else { if (renderTarget !== undefined) { return renderTarget.texture; } else { const image = texture.image; if (isEquirectMap && image && image.height > 0 || isCubeMap && image && isCubeTextureComplete(image)) { if (pmremGenerator === null) pmremGenerator = new _PMREMGenerator.PMREMGenerator(renderer); renderTarget = isEquirectMap ? pmremGenerator.fromEquirectangular(texture) : pmremGenerator.fromCubemap(texture); renderTarget.texture.pmremVersion = texture.pmremVersion; cubeUVmaps.set(texture, renderTarget); texture.addEventListener('dispose', onTextureDispose); return renderTarget.texture; } else { // image not yet ready. try the conversion next frame return null; } } } } } return texture; } function isCubeTextureComplete(image) { let count = 0; const length = 6; for (let i = 0; i < length; i++) { if (image[i] !== undefined) count++; } return count === length; } function onTextureDispose(event) { const texture = event.target; texture.removeEventListener('dispose', onTextureDispose); const cubemapUV = cubeUVmaps.get(texture); if (cubemapUV !== undefined) { cubeUVmaps.delete(texture); cubemapUV.dispose(); } } function dispose() { cubeUVmaps = new WeakMap(); if (pmremGenerator !== null) { pmremGenerator.dispose(); pmremGenerator = null; } } return { get: get, dispose: dispose }; }