constructor( data ) {

		/**
		 * The scene's camera.
		 *
		 * @type {Camera}
		 */
		this.camera = data.camera;

		/**
		 * The parent object, usually the scene.
		 *
		 * @type {Object3D}
		 */
		this.parent = data.parent;

		/**
		 * The number of cascades.
		 *
		 * @type {number}
		 * @default 3
		 */
		this.cascades = data.cascades || 3;

		/**
		 * The maximum far value.
		 *
		 * @type {number}
		 * @default 100000
		 */
		this.maxFar = data.maxFar || 100000;

		/**
		 * The frustum split mode.
		 *
		 * @type {('practical'|'uniform'|'logarithmic'|'custom')}
		 * @default 'practical'
		 */
		this.mode = data.mode || 'practical';

		/**
		 * The shadow map size.
		 *
		 * @type {number}
		 * @default 2048
		 */
		this.shadowMapSize = data.shadowMapSize || 2048;

		/**
		 * The shadow bias.
		 *
		 * @type {number}
		 * @default 0.000001
		 */
		this.shadowBias = data.shadowBias || 0.000001;

		/**
		 * The light direction.
		 *
		 * @type {Vector3}
		 */
		this.lightDirection = data.lightDirection || new Vector3( 1, - 1, 1 ).normalize();

		/**
		 * The light intensity.
		 *
		 * @type {number}
		 * @default 3
		 */
		this.lightIntensity = data.lightIntensity || 3;

		/**
		 * The light near value.
		 *
		 * @type {number}
		 * @default 1
		 */
		this.lightNear = data.lightNear || 1;

		/**
		 * The light far value.
		 *
		 * @type {number}
		 * @default 2000
		 */
		this.lightFar = data.lightFar || 2000;

		/**
		 * The light margin.
		 *
		 * @type {number}
		 * @default 200
		 */
		this.lightMargin = data.lightMargin || 200;

		/**
		 * Custom split callback when using `mode='custom'`.
		 *
		 * @type {Function}
		 */
		this.customSplitsCallback = data.customSplitsCallback;

		/**
		 * Whether to fade between cascades or not.
		 *
		 * @type {boolean}
		 * @default false
		 */
		this.fade = false;

		/**
		 * The main frustum.
		 *
		 * @type {CSMFrustum}
		 */
		this.mainFrustum = new CSMFrustum( { webGL: true } );

		/**
		 * An array of frustums representing the cascades.
		 *
		 * @type {Array<CSMFrustum>}
		 */
		this.frustums = [];

		/**
		 * An array of numbers in the range `[0,1]` the defines how the
		 * mainCSM frustum should be split up.
		 *
		 * @type {Array<number>}
		 */
		this.breaks = [];

		/**
		 * An array of directional lights which cast the shadows for
		 * the different cascades. There is one directional light for each
		 * cascade.
		 *
		 * @type {Array<DirectionalLight>}
		 */
		this.lights = [];

		/**
		 * A Map holding enhanced material shaders.
		 *
		 * @type {Map<Material,Object>}
		 */
		this.shaders = new Map();

		this._createLights();
		this.updateFrustums();
		this._injectInclude();

	}
Constructs a new CSM instance.

@param {CSM~Data} data - The CSM data.