summit/frontend/node_modules/three-stdlib/csm/CSM.cjs.map

1 line
15 KiB
Plaintext
Raw Normal View History

2025-12-08 16:31:30 +00:00
{"version":3,"file":"CSM.cjs","sources":["../../src/csm/CSM.js"],"sourcesContent":["import { Vector2, Vector3, DirectionalLight, MathUtils, ShaderChunk, Matrix4, Box3 } from 'three'\nimport { CSMFrustum } from './CSMFrustum'\nimport { CSMShader } from './CSMShader'\n\nconst _cameraToLightMatrix = /* @__PURE__ */ new Matrix4()\nconst _lightSpaceFrustum = /* @__PURE__ */ new CSMFrustum()\nconst _center = /* @__PURE__ */ new Vector3()\nconst _bbox = /* @__PURE__ */ new Box3()\nconst _uniformArray = []\nconst _logArray = []\n\nexport class CSM {\n constructor(data) {\n data = data || {}\n\n this.camera = data.camera\n this.parent = data.parent\n this.cascades = data.cascades || 3\n this.maxFar = data.maxFar || 100000\n this.mode = data.mode || 'practical'\n this.shadowMapSize = data.shadowMapSize || 2048\n this.shadowBias = data.shadowBias || 0.000001\n this.lightDirection = data.lightDirection || new Vector3(1, -1, 1).normalize()\n this.lightIntensity = data.lightIntensity || 1\n this.lightNear = data.lightNear || 1\n this.lightFar = data.lightFar || 2000\n this.lightMargin = data.lightMargin || 200\n this.customSplitsCallback = data.customSplitsCallback\n this.fade = false\n this.mainFrustum = new CSMFrustum()\n this.frustums = []\n this.breaks = []\n\n this.lights = []\n this.shaders = new Map()\n\n this.createLights()\n this.updateFrustums()\n this.injectInclude()\n }\n\n createLights() {\n for (let i = 0; i < this.cascades; i++) {\n const light = new DirectionalLight(0xffffff, this.lightIntensity)\n light.castShadow = true\n light.shadow.mapSize.width = this.shadowMapSize\n light.shadow.mapSize.height = this.shadowMapSize\n\n light.shadow.camera.near = this.lightNear\n light.shadow.camera.far = this.lightFar\n light.shadow.bias = this.shadowBias\n\n this.parent.add(light)\n this.parent.add(light.target)\n this.lights.push(light)\n }\n }\n\n initCascades() {\n const camera = this.camera\n camera.updateProjectionMatrix()\n this.mainFrustum.setFromProjectionMatrix(camera.projectionMatrix, this.maxFar)\n this.mainFrustum.split(this.breaks, this.frustums)\n }\n\n updateShadowBounds() {\n const frustums = this.frustums\n for (let i = 0; i < frustums.length; i++) {\n const light = this.lights[i]\n const shadowCam = light.shadow.camera\n const frustum = this.frustums[i]\n\n // Get the two points that represent that furthest points on the frustum assuming\n // that's either the diagonal across the far plane or the diagonal across the whole\n // frustum itself.\n const nearVerts = frustum.vertices.near\n const farVerts = frustum.vertices.far\n const point1 = farVerts[0]\n let point2\n if (point1.distanceTo(farVerts[2]) > point1.distanceTo(nearVerts[2])) {\n point2 = farVerts[2]\n } else {\n point2 = nearVerts[2]\n }\n\n let squaredBBWidth = point1.distanceTo(point2)\n if (this.fade) {\n // expand the shadow extents by the fade margin if fade is enabled.\n const camera = this.camera\n const far = Math.max(camera.far, this.maxFar)\n const linearDepth = frustum.vertices.far[0].z / (far - camera.near)\n const margin = 0.25 * Math.pow(linearDepth, 2.0) * (far - camera.near)\n\n squaredBBWidth += margin\n }\n\n shadowCam.left = -squaredBBWidth / 2\n shadowCam.right = squaredBBWidth / 2\n shadowCam.top = squaredBBWidth / 2\n shadowCam.bottom = -squaredBBWidth / 2\n shadowCam.updateProjectionMatrix()\n }\n }\n\n getBreaks() {\n const camera = this.camera\n const far = Math.min(camera.far, this.maxFar)\n this.breaks.length = 0\n\n switch (this.mode) {\n case 'uniform':\n uniformSplit(this.cascades, camera.near, far, this.breaks)\n break\n case 'logarithmic':\n logarithmicSplit(this.cascades, camera.near, far, this.breaks)\n break\n case 'practical':\n practicalSplit(