UNPKG

@openhps/core

Version:

Open Hybrid Positioning System - Core component

95 lines (90 loc) 3.4 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.PointLightShadow = void 0; var _LightShadow = require("./LightShadow.js"); var _PerspectiveCamera = require("../cameras/PerspectiveCamera.js"); var _Matrix = require("../math/Matrix4.js"); var _Vector = require("../math/Vector2.js"); var _Vector2 = require("../math/Vector3.js"); var _Vector3 = require("../math/Vector4.js"); const _projScreenMatrix = /*@__PURE__*/new _Matrix.Matrix4(); const _lightPositionWorld = /*@__PURE__*/new _Vector2.Vector3(); const _lookTarget = /*@__PURE__*/new _Vector2.Vector3(); /** * Represents the shadow configuration of point lights. * * @augments LightShadow */ class PointLightShadow extends _LightShadow.LightShadow { /** * Constructs a new point light shadow. */ constructor() { super(new _PerspectiveCamera.PerspectiveCamera(90, 1, 0.5, 500)); /** * This flag can be used for type testing. * * @type {boolean} * @readonly * @default true */ this.isPointLightShadow = true; this._frameExtents = new _Vector.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 _Vector3.Vector4(2, 1, 1, 1), // negative X new _Vector3.Vector4(0, 1, 1, 1), // positive Z new _Vector3.Vector4(3, 1, 1, 1), // negative Z new _Vector3.Vector4(1, 1, 1, 1), // positive Y new _Vector3.Vector4(3, 0, 1, 1), // negative Y new _Vector3.Vector4(1, 0, 1, 1)]; this._cubeDirections = [new _Vector2.Vector3(1, 0, 0), new _Vector2.Vector3(-1, 0, 0), new _Vector2.Vector3(0, 0, 1), new _Vector2.Vector3(0, 0, -1), new _Vector2.Vector3(0, 1, 0), new _Vector2.Vector3(0, -1, 0)]; this._cubeUps = [new _Vector2.Vector3(0, 1, 0), new _Vector2.Vector3(0, 1, 0), new _Vector2.Vector3(0, 1, 0), new _Vector2.Vector3(0, 1, 0), new _Vector2.Vector3(0, 0, 1), new _Vector2.Vector3(0, 0, -1)]; } /** * Update the matrices for the camera and shadow, used internally by the renderer. * * @param {Light} light - The light for which the shadow is being rendered. * @param {number} [viewportIndex=0] - The viewport index. */ 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); } } exports.PointLightShadow = PointLightShadow;