| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596 |
- import { LightShadow } from './LightShadow.js';
- import { PerspectiveCamera } from '../cameras/PerspectiveCamera.js';
- import { Matrix4 } from '../math/Matrix4.js';
- import { Vector2 } from '../math/Vector2.js';
- import { Vector3 } from '../math/Vector3.js';
- import { Vector4 } from '../math/Vector4.js';
- const _projScreenMatrix = /*@__PURE__*/ new Matrix4();
- const _lightPositionWorld = /*@__PURE__*/ new Vector3();
- const _lookTarget = /*@__PURE__*/ new Vector3();
- class PointLightShadow extends LightShadow {
- constructor() {
- super( new PerspectiveCamera( 90, 1, 0.5, 500 ) );
- this._frameExtents = new Vector2( 4, 2 );
- this._viewportCount = 6;
- this._viewports = [
- // These viewports map a cube-map onto a 2D texture with the
- // following orientation:
- //
- // xzXZ
- // y Y
- //
- // X - Positive x direction
- // x - Negative x direction
- // Y - Positive y direction
- // y - Negative y direction
- // Z - Positive z direction
- // z - Negative z direction
- // positive X
- new Vector4( 2, 1, 1, 1 ),
- // negative X
- new Vector4( 0, 1, 1, 1 ),
- // positive Z
- new Vector4( 3, 1, 1, 1 ),
- // negative Z
- new Vector4( 1, 1, 1, 1 ),
- // positive Y
- new Vector4( 3, 0, 1, 1 ),
- // negative Y
- new Vector4( 1, 0, 1, 1 )
- ];
- this._cubeDirections = [
- new Vector3( 1, 0, 0 ), new Vector3( - 1, 0, 0 ), new Vector3( 0, 0, 1 ),
- new Vector3( 0, 0, - 1 ), new Vector3( 0, 1, 0 ), new Vector3( 0, - 1, 0 )
- ];
- this._cubeUps = [
- new Vector3( 0, 1, 0 ), new Vector3( 0, 1, 0 ), new Vector3( 0, 1, 0 ),
- new Vector3( 0, 1, 0 ), new Vector3( 0, 0, 1 ), new Vector3( 0, 0, - 1 )
- ];
- }
- updateMatrices( light, viewportIndex = 0 ) {
- const camera = this.camera;
- const shadowMatrix = this.matrix;
- const far = light.distance || camera.far;
- if ( far !== camera.far ) {
- camera.far = far;
- camera.updateProjectionMatrix();
- }
- _lightPositionWorld.setFromMatrixPosition( light.matrixWorld );
- camera.position.copy( _lightPositionWorld );
- _lookTarget.copy( camera.position );
- _lookTarget.add( this._cubeDirections[ viewportIndex ] );
- camera.up.copy( this._cubeUps[ viewportIndex ] );
- camera.lookAt( _lookTarget );
- camera.updateMatrixWorld();
- shadowMatrix.makeTranslation( - _lightPositionWorld.x, - _lightPositionWorld.y, - _lightPositionWorld.z );
- _projScreenMatrix.multiplyMatrices( camera.projectionMatrix, camera.matrixWorldInverse );
- this._frustum.setFromProjectionMatrix( _projScreenMatrix );
- }
- }
- PointLightShadow.prototype.isPointLightShadow = true;
- export { PointLightShadow };
|