Browse Source

add pointlightshadow class and move matrix calcs from webglshadows

supereggbert 6 years ago
parent
commit
fb61a88e06
1 changed files with 90 additions and 0 deletions
  1. 90 0
      src/lights/PointLightShadow.js

+ 90 - 0
src/lights/PointLightShadow.js

@@ -0,0 +1,90 @@
+import { LightShadow } from './LightShadow.js';
+import { PerspectiveCamera } from '../cameras/PerspectiveCamera.js';
+import { Vector2 } from '../math/Vector2.js';
+import { Vector3 } from '../math/Vector3.js';
+import { Vector4 } from '../math/Vector4.js';
+
+function PointLightShadow() {
+
+	LightShadow.call( this, 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 )
+	];
+
+}
+
+PointLightShadow.prototype = Object.assign( Object.create( LightShadow.prototype ), {
+
+	constructor: PointLightShadow,
+
+	isPointLightShadow: true,
+
+  updateMatrices: function ( light, viewCamera, viewportIndex ) { 
+
+    var camera = this.camera,
+      shadowMatrix = this.matrix,
+      lightPositionWorld = this._lightPositionWorld,
+      lookTarget = this._lookTarget,
+      shadowMatrix = this.matrix,
+      projScreenMatrix = this._projScreenMatrix;
+
+    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.setFromMatrix( projScreenMatrix );
+
+  }
+
+} );
+
+
+export { PointLightShadow };