starry / backend /libs /three /lights /PointLightShadow.js
k-l-lambda's picture
feat: add Python ML services (CPU mode) with model download
2b7aae2
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 };