@openhps/core
Version:
Open Hybrid Positioning System - Core component
80 lines (76 loc) • 3.1 kB
JavaScript
;
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
};
}