import Light from '../Light'; import Vector3 from '../math/Vector3'; /** * @constructor clay.light.Spot * @extends clay.Light */ var SpotLight = Light.extend(/**@lends clay.light.Spot */ { /** * @type {number} */ range: 20, /** * @type {number} */ umbraAngle: 30, /** * @type {number} */ penumbraAngle: 45, /** * @type {number} */ falloffFactor: 2.0, /** * @type {number} */ shadowBias: 0.001, /** * @type {number} */ shadowSlopeScale: 2.0 }, { type: 'SPOT_LIGHT', uniformTemplates: { spotLightPosition: { type: '3f', value: function (instance) { return instance.getWorldPosition().array; } }, spotLightRange: { type: '1f', value: function (instance) { return instance.range; } }, spotLightUmbraAngleCosine: { type: '1f', value: function (instance) { return Math.cos(instance.umbraAngle * Math.PI / 180); } }, spotLightPenumbraAngleCosine: { type: '1f', value: function (instance) { return Math.cos(instance.penumbraAngle * Math.PI / 180); } }, spotLightFalloffFactor: { type: '1f', value: function (instance) { return instance.falloffFactor; } }, spotLightDirection: { type: '3f', value: function (instance) { instance.__dir = instance.__dir || new Vector3(); // Direction is target to eye return instance.__dir.copy(instance.worldTransform.z).negate().array; } }, spotLightColor: { type: '3f', value: function (instance) { var color = instance.color; var intensity = instance.intensity; return [color[0] * intensity, color[1] * intensity, color[2] * intensity]; } } }, /** * @return {clay.light.Spot} * @memberOf clay.light.Spot.prototype */ clone: function () { var light = Light.prototype.clone.call(this); light.range = this.range; light.umbraAngle = this.umbraAngle; light.penumbraAngle = this.penumbraAngle; light.falloffFactor = this.falloffFactor; light.shadowBias = this.shadowBias; light.shadowSlopeScale = this.shadowSlopeScale; return light; } }); export default SpotLight;