123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147 |
- import { Matrix4 } from '../math/Matrix4.js';
- import { Vector2 } from '../math/Vector2.js';
- import { Vector3 } from '../math/Vector3.js';
- import { Vector4 } from '../math/Vector4.js';
- import { Frustum } from '../math/Frustum.js';
- const _projScreenMatrix = /*@__PURE__*/ new Matrix4();
- const _lightPositionWorld = /*@__PURE__*/ new Vector3();
- const _lookTarget = /*@__PURE__*/ new Vector3();
- class LightShadow {
- constructor( camera ) {
- this.camera = camera;
- this.bias = 0;
- this.normalBias = 0;
- this.radius = 1;
- this.blurSamples = 8;
- this.mapSize = new Vector2( 512, 512 );
- this.map = null;
- this.mapPass = null;
- this.matrix = new Matrix4();
- this.autoUpdate = true;
- this.needsUpdate = false;
- this._frustum = new Frustum();
- this._frameExtents = new Vector2( 1, 1 );
- this._viewportCount = 1;
- this._viewports = [
- new Vector4( 0, 0, 1, 1 )
- ];
- }
- getViewportCount() {
- return this._viewportCount;
- }
- getFrustum() {
- return this._frustum;
- }
- updateMatrices( light ) {
- const shadowCamera = this.camera;
- const shadowMatrix = this.matrix;
- _lightPositionWorld.setFromMatrixPosition( light.matrixWorld );
- shadowCamera.position.copy( _lightPositionWorld );
- _lookTarget.setFromMatrixPosition( light.target.matrixWorld );
- shadowCamera.lookAt( _lookTarget );
- shadowCamera.updateMatrixWorld();
- _projScreenMatrix.multiplyMatrices( shadowCamera.projectionMatrix, shadowCamera.matrixWorldInverse );
- this._frustum.setFromProjectionMatrix( _projScreenMatrix );
- shadowMatrix.set(
- 0.5, 0.0, 0.0, 0.5,
- 0.0, 0.5, 0.0, 0.5,
- 0.0, 0.0, 0.5, 0.5,
- 0.0, 0.0, 0.0, 1.0
- );
- shadowMatrix.multiply( _projScreenMatrix );
- }
- getViewport( viewportIndex ) {
- return this._viewports[ viewportIndex ];
- }
- getFrameExtents() {
- return this._frameExtents;
- }
- dispose() {
- if ( this.map ) {
- this.map.dispose();
- }
- if ( this.mapPass ) {
- this.mapPass.dispose();
- }
- }
- copy( source ) {
- this.camera = source.camera.clone();
- this.bias = source.bias;
- this.radius = source.radius;
- this.mapSize.copy( source.mapSize );
- return this;
- }
- clone() {
- return new this.constructor().copy( this );
- }
- toJSON() {
- const object = {};
- if ( this.bias !== 0 ) object.bias = this.bias;
- if ( this.normalBias !== 0 ) object.normalBias = this.normalBias;
- if ( this.radius !== 1 ) object.radius = this.radius;
- if ( this.mapSize.x !== 512 || this.mapSize.y !== 512 ) object.mapSize = this.mapSize.toArray();
- object.camera = this.camera.toJSON( false ).object;
- delete object.camera.matrix;
- return object;
- }
- }
- export { LightShadow };
|