@navaramap/three-csm 0.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/LICENSE ADDED
@@ -0,0 +1,8 @@
1
+ Copyright (c) 2026 MapLibre contributors
2
+
3
+ This project is dual-licensed under either of
4
+
5
+ - Apache License, Version 2.0 (see LICENSE-APACHE)
6
+ - MIT license (see LICENSE-MIT)
7
+
8
+ at your option.
package/README.md ADDED
@@ -0,0 +1,5 @@
1
+ # @navaramap/three-csm
2
+
3
+ This is a library to extend Three.js to enable Cascaded Shadow Map(CSM).
4
+
5
+ Research & development by https://github.com/takram-design-engineering.
@@ -0,0 +1,197 @@
1
+ import { Camera } from 'three';
2
+ import { Color } from 'three';
3
+ import { ColorRepresentation } from 'three';
4
+ import { DirectionalLight } from 'three';
5
+ import { Group } from 'three';
6
+ import { Material } from 'three';
7
+ import { Matrix4 } from 'three';
8
+ import { Object3D } from 'three';
9
+ import { OrthographicCamera } from 'three';
10
+ import { PerspectiveCamera } from 'three';
11
+ import { Vector2 } from 'three';
12
+ import { Vector3 } from 'three';
13
+
14
+ export declare class CascadedDirectionalLights extends Object3D {
15
+ readonly mainLight: DirectionalLight;
16
+ readonly cascadedLights: DirectionalLight[];
17
+ direction: Vector3;
18
+ constructor(color?: ColorRepresentation, intensity?: number);
19
+ setCount(value: number): this;
20
+ dispose(): void;
21
+ copy(source: this, _recursive?: boolean): this;
22
+ }
23
+
24
+ export declare class CascadedShadowMaps {
25
+ readonly mainCamera: PerspectiveCamera | OrthographicCamera;
26
+ needsUpdateFrusta: boolean;
27
+ readonly directionalLights: CascadedDirectionalLights;
28
+ readonly materialStates: MaterialStates;
29
+ readonly mainFrustum: FrustumCorners;
30
+ readonly cascadedFrusta: FrustumCorners[];
31
+ readonly splits: number[];
32
+ readonly cascades: Vector2[];
33
+ private _far;
34
+ private _mode;
35
+ private _lambda;
36
+ private _margin;
37
+ private _fade;
38
+ private _disableLastCascadeCutoff;
39
+ constructor(mainCamera: PerspectiveCamera | OrthographicCamera, params?: CascadedShadowMapsOptions);
40
+ dispose(): void;
41
+ setupMaterial<T extends Material>(material: T): T;
42
+ rollbackMaterial<T extends Material>(material: T): T;
43
+ setupMaterials<T extends readonly Material[]>(materials: T): () => void;
44
+ private updateCascades;
45
+ private getFrustumRadius;
46
+ private updateShadowBounds;
47
+ updateFrusta(): void;
48
+ update(): void;
49
+ get cascadeCount(): number;
50
+ set cascadeCount(value: number);
51
+ get mapSize(): number;
52
+ set mapSize(value: number);
53
+ get far(): number;
54
+ set far(value: number);
55
+ get mode(): FrustumSplitMode;
56
+ set mode(value: FrustumSplitMode);
57
+ get lambda(): number;
58
+ set lambda(value: number);
59
+ get margin(): number;
60
+ set margin(value: number);
61
+ get fade(): boolean;
62
+ set fade(value: boolean);
63
+ get disableLastCascadeCutoff(): boolean;
64
+ set disableLastCascadeCutoff(value: boolean);
65
+ get intensity(): number;
66
+ set intensity(value: number);
67
+ get shadowIntensity(): number;
68
+ set shadowIntensity(value: number);
69
+ get color(): Color;
70
+ set color(value: Color);
71
+ get bias(): number;
72
+ set bias(value: number);
73
+ get normalBias(): number;
74
+ set normalBias(value: number);
75
+ get radius(): number;
76
+ set radius(value: number);
77
+ get blurSamples(): number;
78
+ set blurSamples(value: number);
79
+ }
80
+
81
+ export declare type CascadedShadowMapsOptions = {
82
+ /**
83
+ * Number of shadow cascades. More cascades provide better shadow quality
84
+ * distribution but require more GPU resources.
85
+ * @default 4
86
+ */
87
+ cascadeCount?: number;
88
+ /**
89
+ * Resolution of shadow maps (one per cascade). Higher values provide better
90
+ * shadow quality but require more GPU memory.
91
+ * @default 2048
92
+ */
93
+ mapSize?: number;
94
+ /**
95
+ * Frustum far plane distance. Shadows will not be visible farther than this
96
+ * distance from the camera.
97
+ * @default 5000
98
+ */
99
+ far?: number;
100
+ /**
101
+ * Defines the split scheme for the camera frustum:
102
+ * - "uniform": Linear split distribution
103
+ * - "logarithmic": Logarithmic split distribution (better for large scenes)
104
+ * - "practical": Hybrid approach balancing quality and performance (recommended)
105
+ * @default "practical"
106
+ */
107
+ mode?: FrustumSplitMode;
108
+ /**
109
+ * Lambda parameter for "practical" split mode. Controls the blend between
110
+ * uniform (0.0) and logarithmic (1.0) split schemes.
111
+ * @default 0.5
112
+ */
113
+ lambda?: number;
114
+ /**
115
+ * Defines how far the shadow camera is positioned behind the cascade frustum.
116
+ * Larger values help prevent shadow clipping but may reduce precision.
117
+ * @default 200
118
+ */
119
+ margin?: number;
120
+ /**
121
+ * Enables smooth transitions between shadow cascades to reduce visible seams.
122
+ * @default true
123
+ */
124
+ fade?: boolean;
125
+ /**
126
+ * Disables cutting off the last cascade at the far plane, providing better
127
+ * shadow coverage for distant objects.
128
+ * @default false
129
+ */
130
+ disableLastCascadeCutoff?: boolean;
131
+ };
132
+
133
+ export declare const cascadedShadowMapsOptionsDefaults: {
134
+ cascadeCount: number;
135
+ mapSize: number;
136
+ far: number;
137
+ mode: "practical";
138
+ lambda: number;
139
+ margin: number;
140
+ fade: true;
141
+ disableLastCascadeCutoff: false;
142
+ };
143
+
144
+ export declare class CSMHelper extends Group {
145
+ private readonly csm;
146
+ displayFrustum: boolean;
147
+ displayPlanes: boolean;
148
+ displayShadowBounds: boolean;
149
+ private frustumLines;
150
+ private cascadeLines;
151
+ private cascadePlanes;
152
+ private shadowLines;
153
+ constructor(csm: CascadedShadowMaps);
154
+ updateVisibility(): void;
155
+ update(): void;
156
+ }
157
+
158
+ declare class FrustumCorners {
159
+ readonly near: Vector3[];
160
+ readonly far: Vector3[];
161
+ constructor();
162
+ constructor(camera: Camera, far: number);
163
+ clone(): FrustumCorners;
164
+ copy(other: FrustumCorners): this;
165
+ setFromCamera(camera: Camera & {
166
+ isOrthographicCamera?: boolean;
167
+ }, far: number): this;
168
+ split(clipDepths: readonly number[], result?: FrustumCorners[]): FrustumCorners[];
169
+ applyMatrix4(matrix: Matrix4): this;
170
+ }
171
+
172
+ export declare type FrustumSplitFunction = (length: number, near: number, far: number, lambda?: number, result?: number[]) => number[];
173
+
174
+ export declare type FrustumSplitFunctions = {
175
+ uniform: FrustumSplitFunction;
176
+ logarithmic: FrustumSplitFunction;
177
+ practical: FrustumSplitFunction;
178
+ };
179
+
180
+ export declare const frustumSplitFunctions: FrustumSplitFunctions;
181
+
182
+ export declare type FrustumSplitMode = keyof FrustumSplitFunctions;
183
+
184
+ declare class MaterialStates {
185
+ private readonly map;
186
+ setup<T extends Material>(material: T, csm: CascadedShadowMaps): T;
187
+ update(csm: CascadedShadowMaps): void;
188
+ rollback<T extends Material>(material: T): T;
189
+ private rollbackToState;
190
+ dispose(): void;
191
+ }
192
+
193
+ export declare function overrideFragmentShaderForCSM(fragmentShader: string): string;
194
+
195
+ export declare function splitFrustum(mode: FrustumSplitMode, count: number, near: number, far: number, lambda?: number, result?: number[]): number[];
196
+
197
+ export { }