@openhps/core
Version:
Open Hybrid Positioning System - Core component
75 lines (72 loc) • 3.03 kB
JavaScript
import { CubeReflectionMapping, CubeRefractionMapping, EquirectangularReflectionMapping, EquirectangularRefractionMapping } from '../../constants.js';
import { PMREMGenerator } from '../../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 === EquirectangularReflectionMapping || mapping === EquirectangularRefractionMapping;
const isCubeMap = mapping === CubeReflectionMapping || mapping === 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(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(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
};
}
export { WebGLCubeUVMaps };