Spaces:
Running
Running
File size: 2,507 Bytes
2b7aae2 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 | 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 };
|