// https://docs.unrealengine.com/latest/INT/Engine/Rendering/LightingAndShadows/AmbientCubemap/
import Light from '../Light';
import cubemapUtil from '../util/cubemap';
/**
* Ambient cubemap light provides specular parts of Image Based Lighting.
* Which is a basic requirement for Physically Based Rendering
* @constructor clay.light.AmbientCubemap
* @extends clay.Light
*/
var AmbientCubemapLight = Light.extend({
/**
* @type {clay.TextureCube}
* @memberOf clay.light.AmbientCubemap#
*/
cubemap: null,
// TODO
// range: 100,
castShadow: false,
_normalDistribution: null,
_brdfLookup: null
}, /** @lends clay.light.AmbientCubemap# */ {
type: 'AMBIENT_CUBEMAP_LIGHT',
/**
* Do prefitering the cubemap
* @param {clay.Renderer} renderer
* @param {number} [size=32]
*/
prefilter: function (renderer, size) {
if (!renderer.getGLExtension('EXT_shader_texture_lod')) {
console.warn('Device not support textureCubeLodEXT');
return;
}
if (!this._brdfLookup) {
this._normalDistribution = cubemapUtil.generateNormalDistribution();
this._brdfLookup = cubemapUtil.integrateBRDF(renderer, this._normalDistribution);
}
var cubemap = this.cubemap;
if (cubemap.__prefiltered) {
return;
}
var result = cubemapUtil.prefilterEnvironmentMap(
renderer, cubemap, {
encodeRGBM: true,
width: size,
height: size
}, this._normalDistribution, this._brdfLookup
);
this.cubemap = result.environmentMap;
this.cubemap.__prefiltered = true;
cubemap.dispose(renderer);
},
getBRDFLookup: function () {
return this._brdfLookup;
},
uniformTemplates: {
ambientCubemapLightColor: {
type: '3f',
value: function (instance) {
var color = instance.color;
var intensity = instance.intensity;
return [color[0]*intensity, color[1]*intensity, color[2]*intensity];
}
},
ambientCubemapLightCubemap: {
type: 't',
value: function (instance) {
return instance.cubemap;
}
},
ambientCubemapLightBRDFLookup: {
type: 't',
value: function (instance) {
return instance._brdfLookup;
}
}
}
/**
* @function
* @name clone
* @return {clay.light.AmbientCubemap}
* @memberOf clay.light.AmbientCubemap.prototype
*/
});
export default AmbientCubemapLight;