import { checkPropTypes, UUIDRegex } from '../lib.js';
import { Reporter } from '../reporter/reporter.js';
import { BuildableComponent } from './component/buildable_component.js';
import { Component } from '../component/component.js';
import { EXR } from '../package/image/exr.js';
import { Project } from '../project.js';
/**
* Environment Map
* Can handle EXR => PMREM (Prefiltered, Mipmapped Radiance Environment Map )
* @link https://threejs.org/docs/#api/en/extras/PMREMGenerator
*/
class EnvironmentMap extends BuildableComponent {
/**
* @param {Reporter} reporter
* @param {Object} settings
* @param {UUID} [settings.id]
* @param {string} [settings.name]
*/
constructor(reporter, settings) {
checkPropTypes(
settings,
{
},
{
exr: EXR,
id: UUIDRegex,
name: "string",
}
);
super(reporter, settings);
}
static _exportName = {
singular: 'environmentMap',
plural: 'environmentMaps'
};
/**
* Build map
* @protected
* @method
* @param {LoadingQuality} quality
* @returns {Promise<Component>}
*/
async _build(part, quality) {
this.report({ msg: `Building ${quality} ${part}` });
switch (part) {
case 'UI':
if (this._settings.thumbnail) {
this._setContent('UI', quality, this._settings.thumbnail.content.main[quality]);
}
else {
this._setContent('UI', quality, Project.defaultImages.missing.cloneNode(true));
}
break;
case 'main':
if (this.exr) {
if (!this._tree) {
throw new Error('No ComponentTree set. Environment map needs renderer from Engine->Tree->Component.');
}
if (!this._tree.pmremGenerator) {
throw new Error('No pmremGenerator in ComponentTree, are you passing a renderer to the tree?');
}
this._tree.pmremGenerator.compileEquirectangularShader();
const exrCubeRenderTarget = this._tree.pmremGenerator.fromEquirectangular(this.exr.content.main[quality]);
this._setContent( 'main', quality, exrCubeRenderTarget.texture );
}
else {
throw new Error('Missing EXR map');
}
break;
default:
this._setContent(part, quality, null);
break;
}
return this
}
}
export { EnvironmentMap };