s3m-three 0.1.0 → 0.1.1

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/src/core/types.ts CHANGED
@@ -1,222 +1,222 @@
1
- /**
2
- * 公共数据类型
3
- *
4
- * 这里只放「跨模块共享」的结构定义。模块内部的私有类型各自就近声明。
5
- */
6
- import type { Color } from 'three';
7
-
8
- /* ------------------------------------------------------------------ 数学 */
9
-
10
- export interface Vec3 {
11
- x: number;
12
- y: number;
13
- z: number;
14
- }
15
-
16
- export interface BoundingBox {
17
- center: Vec3;
18
- xExtent: Vec3;
19
- yExtent: Vec3;
20
- zExtent: Vec3;
21
- }
22
-
23
- /* ------------------------------------------------------------------ 几何 */
24
-
25
- export type AttrDType = 'f32' | 'u8' | 'u16' | 'u32';
26
-
27
- export interface VertexAttribute {
28
- semantic: string;
29
- /** 原始字节视图,生命周期绑定底层 buffer */
30
- data: Uint8Array;
31
- components: number;
32
- stride: number;
33
- offsetInBytes: number;
34
- /** 非 0 表示实例属性 */
35
- divisor?: number;
36
- dtype: AttrDType;
37
- }
38
-
39
- export interface IndexPackage {
40
- indexCount: number;
41
- /** 0 = UNSIGNED_SHORT,1/3 = UNSIGNED_INT */
42
- indexType: number;
43
- useIndex: number;
44
- /** 4 = TRIANGLES */
45
- primitiveType: number;
46
- indices: Uint8Array | null;
47
- passNames: string[];
48
- }
49
-
50
- export interface VertexPackage {
51
- verticesCount: number;
52
- vertexAttributes: VertexAttribute[];
53
- /** semantic → 在 vertexAttributes 中的下标 */
54
- attrLocation: Record<string, number>;
55
- instanceCount: number;
56
- /** 16 = 只有矩阵,17/29 = 矩阵 + 颜色 */
57
- instanceMode: number;
58
- /** -1 表示非实例化 */
59
- instanceIndex: number;
60
- instanceBuffer?: Uint8Array;
61
- /**
62
- * 实例化几何的逐实例控制位(长度 = instanceCount),-1 表示该实例不属于任何单体。
63
- * 注意顶点数 ≠ 实例数,所以它不能当逐顶点属性用,构建几何时要做成 InstancedBufferAttribute。
64
- */
65
- instanceBatchIds?: Float32Array;
66
- compressOptions?: number;
67
- customVertexAttribute?: unknown;
68
- textureCoordIsW?: boolean;
69
- }
70
-
71
- export interface PickSegment {
72
- vertexOffset: number;
73
- vertexCount: number;
74
- }
75
-
76
- export interface PickEntry {
77
- /** 顶点区间型单体:控制位(写进 `aBatchId`) */
78
- batchId?: number;
79
- segments?: PickSegment[];
80
- /** 实例化单体:落在哪几个实例上(一个单体可能对应多个实例) */
81
- instanceIds?: number[];
82
- /** 实例化单体:控制位(写进 `aInstanceBatchId`),等于 pickInfo 里的枚举序 */
83
- instanceBatchId?: number;
84
- }
85
-
86
- export interface GeoPackageEntry {
87
- name: string;
88
- vertexPackage: VertexPackage;
89
- indexPackages: IndexPackage[];
90
- /** SMID → batchId + 顶点区间(单体化信息) */
91
- pickInfo?: Record<number, PickEntry>;
92
- }
93
-
94
- /* ------------------------------------------------------------------ LOD 树 */
95
-
96
- export interface Geode {
97
- /** 列主序 4×4,平移在 [12][13][14] */
98
- matrix: number[];
99
- skeletonNames: string[];
100
- }
101
-
102
- export interface PageLOD {
103
- rangeValue: number;
104
- /** 0 = 视点距离,1 = 屏幕像素,2 = 几何误差 */
105
- rangeMode: number;
106
- boundingSphere: { center: Vec3; radius: number };
107
- obb?: BoundingBox;
108
- childTile: string;
109
- geodes: Geode[];
110
- }
111
-
112
- export interface GroupNode {
113
- pageLods: PageLOD[];
114
- }
115
-
116
- /* ------------------------------------------------------------------ 纹理 */
117
-
118
- export interface S3MTexture {
119
- code: string;
120
- level: number;
121
- width: number;
122
- height: number;
123
- compressType: number;
124
- pixelFormat: number;
125
- data: Uint8Array;
126
- }
127
-
128
- /* ------------------------------------------------------------------ 瓦片 */
129
-
130
- export interface ParsedTile {
131
- version: number;
132
- compressedType: number;
133
- options: number;
134
- groupNode: GroupNode;
135
- geoPackage: Record<string, GeoPackageEntry>;
136
- textures: Record<string, S3MTexture>;
137
- materials: unknown;
138
- pickInfo: unknown;
139
- extensions?: unknown;
140
- /** 实际消费的字节数,应与 bytesTotal 相等 */
141
- bytesRead: number;
142
- bytesTotal: number;
143
- }
144
-
145
- /* ------------------------------------------------------------------ 配置 */
146
-
147
- export interface Anchor {
148
- lon: number;
149
- lat: number;
150
- /** 锚点椭球高(米) */
151
- height: number;
152
- }
153
-
154
- export interface Stats {
155
- tiles: number;
156
- loading: number;
157
- failed: number;
158
- meshes: number;
159
- vertices: number;
160
- triangles: number;
161
- datasets: number;
162
- }
163
-
164
- /* ------------------------------------------------------------------ 单体属性 */
165
-
166
- export interface FeatureAttributes {
167
- smid: number | null;
168
- /** 建筑高度(米),单体包围盒 z 跨度 */
169
- height?: number;
170
- /** 基底高程(米),相对数据集锚点 */
171
- baseElevation?: number;
172
- /** 外接盒平面尺寸 [宽, 深](米) */
173
- size?: [number, number];
174
- /** 外接盒底面积(㎡),异形建筑会偏大 */
175
- bboxArea?: number;
176
- /** 楼层估算 = 高度 / 层高 */
177
- floors?: number;
178
- /** 本单体自身的三角面数 */
179
- triangles?: number;
180
- vertices?: number;
181
- /** 单体局部包围盒 [[minX,minY,minZ],[maxX,maxY,maxZ]](米) */
182
- bbox?: [[number, number, number], [number, number, number]];
183
- }
184
-
185
- export interface SegmentBox {
186
- minX: number;
187
- minY: number;
188
- minZ: number;
189
- maxX: number;
190
- maxY: number;
191
- maxZ: number;
192
- count: number;
193
- triangles: number;
194
- }
195
-
196
- /* ------------------------------------------------------------------ 着色 */
197
-
198
- /** 全局共享 uniform:所有材质引用同一批对象,改 .value 即全场景生效 */
199
- export interface StyleUniforms {
200
- uMode: { value: number };
201
- uColorA: { value: Color };
202
- uColorB: { value: Color };
203
- uColorC: { value: Color };
204
- uTime: { value: number };
205
- uHeightMin: { value: number };
206
- uHeightMax: { value: number };
207
- uFloorHeight: { value: number };
208
- uDim: { value: number };
209
- uDimFactor?: { value: number };
210
- uSelColor: { value: Color };
211
- uSelMix: { value: number };
212
- uSelMode?: { value: number };
213
- uSelOpacity?: { value: number };
214
- uSelEmissive?: { value: number };
215
- uSelElevation?: { value: number };
216
- uFilterMinZ?: { value: number };
217
- uFilterMaxZ?: { value: number };
218
- uFilterHeightActive?: { value: number };
219
- uRoofThreshold?: { value: number };
220
- uTexMix?: { value: number };
221
- [key: string]: { value: unknown } | undefined;
222
- }
1
+ /**
2
+ * 公共数据类型
3
+ *
4
+ * 这里只放「跨模块共享」的结构定义。模块内部的私有类型各自就近声明。
5
+ */
6
+ import type { Color } from 'three';
7
+
8
+ /* ------------------------------------------------------------------ 数学 */
9
+
10
+ export interface Vec3 {
11
+ x: number;
12
+ y: number;
13
+ z: number;
14
+ }
15
+
16
+ export interface BoundingBox {
17
+ center: Vec3;
18
+ xExtent: Vec3;
19
+ yExtent: Vec3;
20
+ zExtent: Vec3;
21
+ }
22
+
23
+ /* ------------------------------------------------------------------ 几何 */
24
+
25
+ export type AttrDType = 'f32' | 'u8' | 'u16' | 'u32';
26
+
27
+ export interface VertexAttribute {
28
+ semantic: string;
29
+ /** 原始字节视图,生命周期绑定底层 buffer */
30
+ data: Uint8Array;
31
+ components: number;
32
+ stride: number;
33
+ offsetInBytes: number;
34
+ /** 非 0 表示实例属性 */
35
+ divisor?: number;
36
+ dtype: AttrDType;
37
+ }
38
+
39
+ export interface IndexPackage {
40
+ indexCount: number;
41
+ /** 0 = UNSIGNED_SHORT,1/3 = UNSIGNED_INT */
42
+ indexType: number;
43
+ useIndex: number;
44
+ /** 4 = TRIANGLES */
45
+ primitiveType: number;
46
+ indices: Uint8Array | null;
47
+ passNames: string[];
48
+ }
49
+
50
+ export interface VertexPackage {
51
+ verticesCount: number;
52
+ vertexAttributes: VertexAttribute[];
53
+ /** semantic → 在 vertexAttributes 中的下标 */
54
+ attrLocation: Record<string, number>;
55
+ instanceCount: number;
56
+ /** 16 = 只有矩阵,17/29 = 矩阵 + 颜色 */
57
+ instanceMode: number;
58
+ /** -1 表示非实例化 */
59
+ instanceIndex: number;
60
+ instanceBuffer?: Uint8Array;
61
+ /**
62
+ * 实例化几何的逐实例控制位(长度 = instanceCount),-1 表示该实例不属于任何单体。
63
+ * 注意顶点数 ≠ 实例数,所以它不能当逐顶点属性用,构建几何时要做成 InstancedBufferAttribute。
64
+ */
65
+ instanceBatchIds?: Float32Array;
66
+ compressOptions?: number;
67
+ customVertexAttribute?: unknown;
68
+ textureCoordIsW?: boolean;
69
+ }
70
+
71
+ export interface PickSegment {
72
+ vertexOffset: number;
73
+ vertexCount: number;
74
+ }
75
+
76
+ export interface PickEntry {
77
+ /** 顶点区间型单体:控制位(写进 `aBatchId`) */
78
+ batchId?: number;
79
+ segments?: PickSegment[];
80
+ /** 实例化单体:落在哪几个实例上(一个单体可能对应多个实例) */
81
+ instanceIds?: number[];
82
+ /** 实例化单体:控制位(写进 `aInstanceBatchId`),等于 pickInfo 里的枚举序 */
83
+ instanceBatchId?: number;
84
+ }
85
+
86
+ export interface GeoPackageEntry {
87
+ name: string;
88
+ vertexPackage: VertexPackage;
89
+ indexPackages: IndexPackage[];
90
+ /** SMID → batchId + 顶点区间(单体化信息) */
91
+ pickInfo?: Record<number, PickEntry>;
92
+ }
93
+
94
+ /* ------------------------------------------------------------------ LOD 树 */
95
+
96
+ export interface Geode {
97
+ /** 列主序 4×4,平移在 [12][13][14] */
98
+ matrix: number[];
99
+ skeletonNames: string[];
100
+ }
101
+
102
+ export interface PageLOD {
103
+ rangeValue: number;
104
+ /** 0 = 视点距离,1 = 屏幕像素,2 = 几何误差 */
105
+ rangeMode: number;
106
+ boundingSphere: { center: Vec3; radius: number };
107
+ obb?: BoundingBox;
108
+ childTile: string;
109
+ geodes: Geode[];
110
+ }
111
+
112
+ export interface GroupNode {
113
+ pageLods: PageLOD[];
114
+ }
115
+
116
+ /* ------------------------------------------------------------------ 纹理 */
117
+
118
+ export interface S3MTexture {
119
+ code: string;
120
+ level: number;
121
+ width: number;
122
+ height: number;
123
+ compressType: number;
124
+ pixelFormat: number;
125
+ data: Uint8Array;
126
+ }
127
+
128
+ /* ------------------------------------------------------------------ 瓦片 */
129
+
130
+ export interface ParsedTile {
131
+ version: number;
132
+ compressedType: number;
133
+ options: number;
134
+ groupNode: GroupNode;
135
+ geoPackage: Record<string, GeoPackageEntry>;
136
+ textures: Record<string, S3MTexture>;
137
+ materials: unknown;
138
+ pickInfo: unknown;
139
+ extensions?: unknown;
140
+ /** 实际消费的字节数,应与 bytesTotal 相等 */
141
+ bytesRead: number;
142
+ bytesTotal: number;
143
+ }
144
+
145
+ /* ------------------------------------------------------------------ 配置 */
146
+
147
+ export interface Anchor {
148
+ lon: number;
149
+ lat: number;
150
+ /** 锚点椭球高(米) */
151
+ height: number;
152
+ }
153
+
154
+ export interface Stats {
155
+ tiles: number;
156
+ loading: number;
157
+ failed: number;
158
+ meshes: number;
159
+ vertices: number;
160
+ triangles: number;
161
+ datasets: number;
162
+ }
163
+
164
+ /* ------------------------------------------------------------------ 单体属性 */
165
+
166
+ export interface FeatureAttributes {
167
+ smid: number | null;
168
+ /** 建筑高度(米),单体包围盒 z 跨度 */
169
+ height?: number;
170
+ /** 基底高程(米),相对数据集锚点 */
171
+ baseElevation?: number;
172
+ /** 外接盒平面尺寸 [宽, 深](米) */
173
+ size?: [number, number];
174
+ /** 外接盒底面积(㎡),异形建筑会偏大 */
175
+ bboxArea?: number;
176
+ /** 楼层估算 = 高度 / 层高 */
177
+ floors?: number;
178
+ /** 本单体自身的三角面数 */
179
+ triangles?: number;
180
+ vertices?: number;
181
+ /** 单体局部包围盒 [[minX,minY,minZ],[maxX,maxY,maxZ]](米) */
182
+ bbox?: [[number, number, number], [number, number, number]];
183
+ }
184
+
185
+ export interface SegmentBox {
186
+ minX: number;
187
+ minY: number;
188
+ minZ: number;
189
+ maxX: number;
190
+ maxY: number;
191
+ maxZ: number;
192
+ count: number;
193
+ triangles: number;
194
+ }
195
+
196
+ /* ------------------------------------------------------------------ 着色 */
197
+
198
+ /** 全局共享 uniform:所有材质引用同一批对象,改 .value 即全场景生效 */
199
+ export interface StyleUniforms {
200
+ uMode: { value: number };
201
+ uColorA: { value: Color };
202
+ uColorB: { value: Color };
203
+ uColorC: { value: Color };
204
+ uTime: { value: number };
205
+ uHeightMin: { value: number };
206
+ uHeightMax: { value: number };
207
+ uFloorHeight: { value: number };
208
+ uDim: { value: number };
209
+ uDimFactor?: { value: number };
210
+ uSelColor: { value: Color };
211
+ uSelMix: { value: number };
212
+ uSelMode?: { value: number };
213
+ uSelOpacity?: { value: number };
214
+ uSelEmissive?: { value: number };
215
+ uSelElevation?: { value: number };
216
+ uFilterMinZ?: { value: number };
217
+ uFilterMaxZ?: { value: number };
218
+ uFilterHeightActive?: { value: number };
219
+ uRoofThreshold?: { value: number };
220
+ uTexMix?: { value: number };
221
+ [key: string]: { value: unknown } | undefined;
222
+ }