s3m-three 0.3.7 → 0.3.8
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/dist/anim/Animator.d.ts +111 -0
- package/dist/anim/Animator.d.ts.map +1 -0
- package/dist/anim/Animator.js +382 -0
- package/dist/anim/Animator.js.map +1 -0
- package/dist/anim/Path.d.ts +30 -0
- package/dist/anim/Path.d.ts.map +1 -0
- package/dist/anim/Path.js +100 -0
- package/dist/anim/Path.js.map +1 -0
- package/dist/anim/easing.d.ts +70 -0
- package/dist/anim/easing.d.ts.map +1 -0
- package/dist/anim/easing.js +170 -0
- package/dist/anim/easing.js.map +1 -0
- package/dist/anim/index.d.ts +6 -0
- package/dist/anim/index.d.ts.map +1 -0
- package/dist/anim/index.js +4 -0
- package/dist/anim/index.js.map +1 -0
- package/dist/browser/s3m-three.iife.ext-three.js +48 -10
- package/dist/browser/s3m-three.iife.js +48 -10
- package/dist/core/types.d.ts +16 -0
- package/dist/core/types.d.ts.map +1 -1
- package/dist/index.d.ts +3 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/render/EdgeLines.d.ts +62 -14
- package/dist/render/EdgeLines.d.ts.map +1 -1
- package/dist/render/EdgeLines.js +97 -8
- package/dist/render/EdgeLines.js.map +1 -1
- package/dist/render/FeatureStyleManager.d.ts +17 -1
- package/dist/render/FeatureStyleManager.d.ts.map +1 -1
- package/dist/render/FeatureStyleManager.js +14 -4
- package/dist/render/FeatureStyleManager.js.map +1 -1
- package/dist/render/MergeVertices.d.ts +7 -0
- package/dist/render/MergeVertices.d.ts.map +1 -1
- package/dist/render/MergeVertices.js +10 -1
- package/dist/render/MergeVertices.js.map +1 -1
- package/dist/render/S3MViewer.d.ts +216 -9
- package/dist/render/S3MViewer.d.ts.map +1 -1
- package/dist/render/S3MViewer.js +763 -67
- package/dist/render/S3MViewer.js.map +1 -1
- package/dist/render/StyleMaterial.d.ts +19 -0
- package/dist/render/StyleMaterial.d.ts.map +1 -1
- package/dist/render/StyleMaterial.js +37 -0
- package/dist/render/StyleMaterial.js.map +1 -1
- package/dist/tileset/S3MTileset.d.ts.map +1 -1
- package/dist/tileset/S3MTileset.js +3 -1
- package/dist/tileset/S3MTileset.js.map +1 -1
- package/docs/ANIMATION.md +534 -0
- package/docs/API.md +2 -0
- package/package.json +1 -1
- package/src/anim/Animator.ts +460 -0
- package/src/anim/Path.ts +107 -0
- package/src/anim/easing.ts +195 -0
- package/src/anim/index.ts +10 -0
- package/src/core/types.ts +8 -0
- package/src/index.ts +10 -0
- package/src/render/EdgeLines.ts +131 -15
- package/src/render/FeatureStyleManager.ts +12 -4
- package/src/render/MergeVertices.ts +11 -1
- package/src/render/S3MViewer.ts +855 -64
- package/src/render/StyleMaterial.ts +54 -1
- package/src/tileset/S3MTileset.ts +3 -1
|
@@ -115,8 +115,23 @@ export interface S3MStyle {
|
|
|
115
115
|
roofThreshold?: number;
|
|
116
116
|
/** 是否与模型原色贴图叠加混合(0 = 纯色覆盖,1 = 叠乘原色贴图) */
|
|
117
117
|
texMix?: number;
|
|
118
|
+
/**
|
|
119
|
+
* 基础漫反射底色增益 / 直通自发光微调(0~1,默认 0.0,建议开启 TOP_SIDE 时可设 0.15~0.3)。
|
|
120
|
+
* 绕过光照夹角直接补偿表面暗部底色,让 TOP_SIDE / 自定义等模式下的背光阴影面保持通透、不至于过黑。
|
|
121
|
+
*/
|
|
122
|
+
ambientGain?: number;
|
|
118
123
|
/** 半透明时是否保持深度写入(默认 true,保持写入可彻底遮挡背面与内部棱线,避免背面透出) */
|
|
119
124
|
depthWrite?: boolean;
|
|
125
|
+
/**
|
|
126
|
+
* 新瓦片首次出现时的淡入时长(毫秒,0 = 关闭)。
|
|
127
|
+
*
|
|
128
|
+
* 只影响「刚加载进来」的瓦片,已经显示的不会被重播。LOD 细化换瓦片时也会淡入,
|
|
129
|
+
* 视觉上比「啪」一下换掉柔和得多。
|
|
130
|
+
*
|
|
131
|
+
* 注意代价:淡入期间该瓦片会进透明渲染队列(混合 + 前后排序),首次加载
|
|
132
|
+
* 几百块瓦片同时淡入时会有一小段额外开销,所以默认关闭、按需开启。
|
|
133
|
+
*/
|
|
134
|
+
fadeIn?: number;
|
|
120
135
|
}
|
|
121
136
|
|
|
122
137
|
export const DEFAULT_STYLE: S3MStyle = {
|
|
@@ -147,7 +162,9 @@ export const DEFAULT_STYLE: S3MStyle = {
|
|
|
147
162
|
edgeThreshold: 55,
|
|
148
163
|
roofThreshold: 0.65,
|
|
149
164
|
texMix: 0,
|
|
165
|
+
ambientGain: 0,
|
|
150
166
|
depthWrite: true,
|
|
167
|
+
fadeIn: 0,
|
|
151
168
|
};
|
|
152
169
|
|
|
153
170
|
export interface StyledMaterial extends THREE.MeshStandardMaterial {
|
|
@@ -157,6 +174,8 @@ export interface StyledMaterial extends THREE.MeshStandardMaterial {
|
|
|
157
174
|
uBatchTex: { value: THREE.Texture };
|
|
158
175
|
uBatchTexWidth: { value: number };
|
|
159
176
|
uBatchTexActive: { value: number };
|
|
177
|
+
/** 单块瓦片的淡入系数(1 = 完全显示) */
|
|
178
|
+
uTileFade: { value: number };
|
|
160
179
|
isStyled: true;
|
|
161
180
|
[key: string]: unknown;
|
|
162
181
|
};
|
|
@@ -205,9 +224,25 @@ export function createSharedUniforms(): StyleUniforms {
|
|
|
205
224
|
uRoofThreshold: { value: 0.65 },
|
|
206
225
|
/** 与模型原色贴图混合强度:0 = 纯色覆盖,1 = 叠乘原色贴图 */
|
|
207
226
|
uTexMix: { value: 0 },
|
|
227
|
+
/** 基础底色增益 / 暗部补偿(0~1,默认 0.0) */
|
|
228
|
+
uAmbientGain: { value: 0 },
|
|
229
|
+
/**
|
|
230
|
+
* 图层整体透明度:在片元里乘进 diffuseColor.a。
|
|
231
|
+
*
|
|
232
|
+
* 为什么不做成 `material.opacity`:那是逐材质写入,几百块瓦片就是 O(meshes),
|
|
233
|
+
* 而且跨 0.999 改 `material.transparent` 会换 program(`opaque` 参与缓存键)。
|
|
234
|
+
* 放到共享 uniform 里,透明度动画就退化成一次 float 赋值。
|
|
235
|
+
*/
|
|
236
|
+
uOpacity: { value: 1 },
|
|
237
|
+
/** 棱线淡入淡出乘子:setEdges 过渡期间 0→1,新插入的瓦片自动继承 */
|
|
238
|
+
uEdgeFade: { value: 1 },
|
|
239
|
+
/**
|
|
240
|
+
* 整体压暗乘子:`mode` 这类不可插值的切换用它做 fade-through
|
|
241
|
+
* (压暗 → 换模式 → 亮回来),比硬切自然得多。
|
|
242
|
+
*/
|
|
243
|
+
uFade: { value: 1 },
|
|
208
244
|
};
|
|
209
245
|
}
|
|
210
|
-
|
|
211
246
|
const VERT_PARS = /* glsl */ `
|
|
212
247
|
attribute float aBatchId;
|
|
213
248
|
attribute vec3 aColor;
|
|
@@ -391,6 +426,10 @@ const FRAG_PARS = /* glsl */ `
|
|
|
391
426
|
uniform float uSelWhole;
|
|
392
427
|
uniform float uRoofThreshold;
|
|
393
428
|
uniform float uTexMix;
|
|
429
|
+
uniform float uAmbientGain;
|
|
430
|
+
uniform float uOpacity;
|
|
431
|
+
uniform float uTileFade;
|
|
432
|
+
uniform float uFade;
|
|
394
433
|
varying float vBatchId;
|
|
395
434
|
varying vec3 vVertColor;
|
|
396
435
|
varying float vWorldZ;
|
|
@@ -430,6 +469,8 @@ const FRAG_PARS = /* glsl */ `
|
|
|
430
469
|
const FRAG_COLOR = /* glsl */ `
|
|
431
470
|
float s3mH = clamp( ( vWorldZ - uHeightMin ) / max( uHeightMax - uHeightMin, 0.001 ), 0.0, 1.0 );
|
|
432
471
|
vec3 s3mBase = diffuseColor.rgb; // 已含 diffuse × map
|
|
472
|
+
// 图层整体透明度(共享 uniform)+ 单瓦片淡入系数(逐材质),逐帧改都不产生重编译
|
|
473
|
+
diffuseColor.a *= uOpacity * uTileFade;
|
|
433
474
|
// 所有按单体取值(配色 / 状态纹理 / 选中判定)都走取整后的 id,避免插值噪声
|
|
434
475
|
float s3mBid = s3mBatchId();
|
|
435
476
|
|
|
@@ -531,6 +572,10 @@ const FRAG_COLOR = /* glsl */ `
|
|
|
531
572
|
} else {
|
|
532
573
|
diffuseColor.rgb *= mix( 1.0, uDimFactor, uDim );
|
|
533
574
|
}
|
|
575
|
+
|
|
576
|
+
// 压暗乘子放在最后:mode 分支会整体覆写 diffuseColor.rgb,
|
|
577
|
+
// 放在前面会被覆盖掉。setMode 的 fade-through 就靠它。
|
|
578
|
+
diffuseColor.rgb *= uFade;
|
|
534
579
|
`;
|
|
535
580
|
|
|
536
581
|
const FRAG_EMISSIVE = /* glsl */ `
|
|
@@ -539,6 +584,10 @@ const FRAG_EMISSIVE = /* glsl */ `
|
|
|
539
584
|
if ( uSelMode != 3 ) {
|
|
540
585
|
totalEmissiveRadiance += uSelColor * s3mSelE * uSelMix * ( uSelEmissive * 0.4 );
|
|
541
586
|
}
|
|
587
|
+
// 直通自发光微调 / 环境光底色提升:补偿背光阴影面(尤其 TOP_SIDE 立面),避免光照阴影面过暗
|
|
588
|
+
if ( uAmbientGain > 0.001 ) {
|
|
589
|
+
totalEmissiveRadiance += diffuseColor.rgb * uAmbientGain;
|
|
590
|
+
}
|
|
542
591
|
`;
|
|
543
592
|
|
|
544
593
|
const FRAG_BAKE = /* glsl */ `
|
|
@@ -596,6 +645,8 @@ export function createStyledMaterial(opts: StyledMaterialOptions): StyledMateria
|
|
|
596
645
|
const uBatchTex = { value: DUMMY_BATCH_TEX };
|
|
597
646
|
const uBatchTexWidth = { value: 1.0 };
|
|
598
647
|
const uBatchTexActive = { value: 0 };
|
|
648
|
+
/** 单块瓦片的淡入系数:逐材质独享(每块网格一份材质),默认 1 = 完全显示 */
|
|
649
|
+
const uTileFade = { value: 1 };
|
|
599
650
|
|
|
600
651
|
// 图集材质:只有几何确实带了 aAtlasRect 才开这个宏,否则缺属性会采到 (0,0) 的默认值
|
|
601
652
|
const atlas = !!opts.atlas && !!opts.map;
|
|
@@ -613,6 +664,7 @@ export function createStyledMaterial(opts: StyledMaterialOptions): StyledMateria
|
|
|
613
664
|
uBatchTex,
|
|
614
665
|
uBatchTexWidth,
|
|
615
666
|
uBatchTexActive,
|
|
667
|
+
uTileFade,
|
|
616
668
|
uSecMap: { value: secMap },
|
|
617
669
|
uAtlasDim,
|
|
618
670
|
uAtlasDim1,
|
|
@@ -656,6 +708,7 @@ export function createStyledMaterial(opts: StyledMaterialOptions): StyledMateria
|
|
|
656
708
|
mat.userData.uBatchTex = uBatchTex;
|
|
657
709
|
mat.userData.uBatchTexWidth = uBatchTexWidth;
|
|
658
710
|
mat.userData.uBatchTexActive = uBatchTexActive;
|
|
711
|
+
mat.userData.uTileFade = uTileFade;
|
|
659
712
|
mat.userData.isStyled = true;
|
|
660
713
|
return mat;
|
|
661
714
|
}
|
|
@@ -1178,7 +1178,9 @@ export class S3MTileset {
|
|
|
1178
1178
|
if (inRange) node.lastSeen = this._frame;
|
|
1179
1179
|
|
|
1180
1180
|
const childUrls = node.childUrls ?? (node.childUrl ? [node.childUrl] : []);
|
|
1181
|
-
|
|
1181
|
+
// 加入 8% 迟滞区间(Hysteresis Band),防止相机在 LOD 临界距离处发生父子瓦片逐帧来回横跳闪烁
|
|
1182
|
+
const hFactor = node.needRefine ? (byDistance ? 1.08 : 0.92) : 1.0;
|
|
1183
|
+
const needRefine = childUrls.length > 0 && (byDistance ? metric < threshold * hFactor : metric > threshold * hFactor);
|
|
1182
1184
|
node.needRefine = needRefine;
|
|
1183
1185
|
|
|
1184
1186
|
const dbgSeen = ((globalThis as { __S3M_LOD_SEEN?: Set<string> }).__S3M_LOD_SEEN ??= new Set<string>());
|