Source: package/environment_map.js

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 };