three-base 2.0.188 → 2.0.190

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.
@@ -100,7 +100,7 @@ export default class MktMesh extends Mesh<BufferGeometry, ShaderMaterial> {
100
100
  private _ossSizeDepKeys;
101
101
  /** 渲染器:由 `onBeforeRender` 每帧捕获,预上传走它的 `initTexture`;没捕获到就退回 three 的自绑路径(不报错) */
102
102
  private _glRenderer;
103
- /** ⭐ 32 瓦片(横 8 × 竖 4 切片)离屏拼合器:左右 2 槽纹理由它逐格拼出(每帧一张新纹理进 GPU + 已进 GPU 的逐格画)。
103
+ /** ⭐ 32 瓦片(横 8 × 竖 4 切片,每槽 4×4=16 格、槽纹理 6144×6144)离屏拼合器:左右 2 槽纹理由它逐格拼出(每帧一张新纹理进 GPU + 已进 GPU 的逐格画)。
104
104
  * 编辑器渲染器经 `panoStitcher` 复用同一实例(同一份槽纹理缓存,⛔ 不另建第二份显存)。
105
105
  * 皇上旨 2026-10-06「不用 canvas 2D 的 drawImage 拼合, 用一个 shader 一个一个渲染到 RT 上面去」
106
106
  * +「canvas 是什么意思, 按照我的想法, 不应该有 canvas 才对啊」⇒ **只此一份实现**:旧的 canvas 2D
@@ -113,7 +113,7 @@ export default class MktMesh extends Mesh<BufferGeometry, ShaderMaterial> {
113
113
  /** 纹理 OSS 缩放尺寸(1024 / 2048 / 空=原图),由外部 setOssSize 注入;默认 1024 保持旧行为。
114
114
  * 编辑器渲染器与预览渲染器各自把 store.ossSize 推下来,使全景球/预览按该尺寸加载。 */
115
115
  private _ossSize;
116
- /** 全景纹理形态:tiled=左右 2 槽各装一张**拼合槽纹理**(该点 32 片 横 8 × 竖 4 → 2 张 4096×4096,10-06 晚旨)
116
+ /** 全景纹理形态:tiled=左右 2 槽各装一张**拼合槽纹理**(该点 32 片 横 8 × 竖 4 → 2 张 6144×6144;形态是 10-06 晚立的,槽尺寸 10-26 起是 6144²,2026-10-27 的切档一字未动)
117
117
  * / whole=2 槽同为一张完整等距柱状原图。
118
118
  * 由外部 setPanoTexMode 注入(与 _ossSize 同一套注入路径),默认 tiled 保持改造前行为。 */
119
119
  private _panoTexMode;
@@ -150,7 +150,7 @@ export default class MktMesh extends Mesh {
150
150
  _ossSizeDepKeys = new Set();
151
151
  /** 渲染器:由 `onBeforeRender` 每帧捕获,预上传走它的 `initTexture`;没捕获到就退回 three 的自绑路径(不报错) */
152
152
  _glRenderer = null;
153
- /** ⭐ 32 瓦片(横 8 × 竖 4 切片)离屏拼合器:左右 2 槽纹理由它逐格拼出(每帧一张新纹理进 GPU + 已进 GPU 的逐格画)。
153
+ /** ⭐ 32 瓦片(横 8 × 竖 4 切片,每槽 4×4=16 格、槽纹理 6144×6144)离屏拼合器:左右 2 槽纹理由它逐格拼出(每帧一张新纹理进 GPU + 已进 GPU 的逐格画)。
154
154
  * 编辑器渲染器经 `panoStitcher` 复用同一实例(同一份槽纹理缓存,⛔ 不另建第二份显存)。
155
155
  * 皇上旨 2026-10-06「不用 canvas 2D 的 drawImage 拼合, 用一个 shader 一个一个渲染到 RT 上面去」
156
156
  * +「canvas 是什么意思, 按照我的想法, 不应该有 canvas 才对啊」⇒ **只此一份实现**:旧的 canvas 2D
@@ -167,7 +167,7 @@ export default class MktMesh extends Mesh {
167
167
  /** 纹理 OSS 缩放尺寸(1024 / 2048 / 空=原图),由外部 setOssSize 注入;默认 1024 保持旧行为。
168
168
  * 编辑器渲染器与预览渲染器各自把 store.ossSize 推下来,使全景球/预览按该尺寸加载。 */
169
169
  _ossSize = "1024";
170
- /** 全景纹理形态:tiled=左右 2 槽各装一张**拼合槽纹理**(该点 32 片 横 8 × 竖 4 → 2 张 4096×4096,10-06 晚旨)
170
+ /** 全景纹理形态:tiled=左右 2 槽各装一张**拼合槽纹理**(该点 32 片 横 8 × 竖 4 → 2 张 6144×6144;形态是 10-06 晚立的,槽尺寸 10-26 起是 6144²,2026-10-27 的切档一字未动)
171
171
  * / whole=2 槽同为一张完整等距柱状原图。
172
172
  * 由外部 setPanoTexMode 注入(与 _ossSize 同一套注入路径),默认 tiled 保持改造前行为。 */
173
173
  _panoTexMode = "tiled";
@@ -174,7 +174,7 @@ export default class MktMesh extends Mesh<BufferGeometry, ShaderMaterial> {
174
174
  private _ossSizeDepKeys: Set<string> = new Set();
175
175
  /** 渲染器:由 `onBeforeRender` 每帧捕获,预上传走它的 `initTexture`;没捕获到就退回 three 的自绑路径(不报错) */
176
176
  private _glRenderer: WebGLRenderer | null = null;
177
- /** ⭐ 32 瓦片(横 8 × 竖 4 切片)离屏拼合器:左右 2 槽纹理由它逐格拼出(每帧一张新纹理进 GPU + 已进 GPU 的逐格画)。
177
+ /** ⭐ 32 瓦片(横 8 × 竖 4 切片,每槽 4×4=16 格、槽纹理 6144×6144)离屏拼合器:左右 2 槽纹理由它逐格拼出(每帧一张新纹理进 GPU + 已进 GPU 的逐格画)。
178
178
  * 编辑器渲染器经 `panoStitcher` 复用同一实例(同一份槽纹理缓存,⛔ 不另建第二份显存)。
179
179
  * 皇上旨 2026-10-06「不用 canvas 2D 的 drawImage 拼合, 用一个 shader 一个一个渲染到 RT 上面去」
180
180
  * +「canvas 是什么意思, 按照我的想法, 不应该有 canvas 才对啊」⇒ **只此一份实现**:旧的 canvas 2D
@@ -191,7 +191,7 @@ export default class MktMesh extends Mesh<BufferGeometry, ShaderMaterial> {
191
191
  /** 纹理 OSS 缩放尺寸(1024 / 2048 / 空=原图),由外部 setOssSize 注入;默认 1024 保持旧行为。
192
192
  * 编辑器渲染器与预览渲染器各自把 store.ossSize 推下来,使全景球/预览按该尺寸加载。 */
193
193
  private _ossSize: "1024" | "2048" | "" = "1024";
194
- /** 全景纹理形态:tiled=左右 2 槽各装一张**拼合槽纹理**(该点 32 片 横 8 × 竖 4 → 2 张 4096×4096,10-06 晚旨)
194
+ /** 全景纹理形态:tiled=左右 2 槽各装一张**拼合槽纹理**(该点 32 片 横 8 × 竖 4 → 2 张 6144×6144;形态是 10-06 晚立的,槽尺寸 10-26 起是 6144²,2026-10-27 的切档一字未动)
195
195
  * / whole=2 槽同为一张完整等距柱状原图。
196
196
  * 由外部 setPanoTexMode 注入(与 _ossSize 同一套注入路径),默认 tiled 保持改造前行为。 */
197
197
  private _panoTexMode: PanoTexMode = "tiled";
@@ -1,9 +1,11 @@
1
1
  import { ShaderMaterial } from "three";
2
2
  /**
3
- * ⭐ 融合材质的全景点数**上限**:每点占 **3** 张拼合槽纹理(皇上旨 2026-10-23「全景的 RT 由原来的 2 个分成 3 个、
4
- * 每个 RT 上面 3×3=9 片」⇒ 原图切 6×3=18 片,按**半幅**分 2 槽)⇒ 点数 × 2 必须 ≤ sampler 硬顶。
3
+ * ⭐ 融合材质的全景点数**上限**:每点占 **2** 张拼合槽纹理(皇上旨 2026-10-23「全景的 RT 由原来的 2 个分成 3 个、
4
+ * 每个 RT 上面 3×3=9 片」那一版已被 10-26 收回 2 槽;现行 2026-10-27 需求「2 个 RT、每个 RT 上面 4×4=16 片」
5
+ * ⇒ 原图切 8×4=32 片,按**半幅**分 2 槽)⇒ 点数 × 2 必须 ≤ sampler 硬顶。
5
6
  * 本机 `MAX_TEXTURE_IMAGE_UNITS` 实测 **16**:每点 2 槽 ⇒ 取 ⌊16/2⌋ = **8** 点(10-23 那版每点 3 槽只能坐 5 点)
6
- * (8 × 2 = 16 正好用满)。2026-10-26 需求回到「2 个 RT / 每 RT 3×3」⇒ **同屏全景点数 5 → 8**。
7
+ * (8 × 2 = 16 正好用满)。2026-10-26 需求回到「2 个 RT / 每 RT 3×3」⇒ **同屏全景点数 5 → 8**;
8
+ * 2026-10-27 把每槽网格从 3×3 改成 4×4(片数 18 → 32)**不动这条账** —— 每点仍占 2 张槽纹理。
7
9
  *
8
10
  * ⭐⭐ 2026-10-09 皇上旨「MktMesh 只有映射一种,blend/selected 归编辑器」⇒ 该常量从 `mktShader.ts`
9
11
  * **搬到这里**(映射材质的所在地)。它同时是库与编辑器那份 blend 的**共同上限**,两边必须同值。
@@ -8,10 +8,12 @@
8
8
  import { BackSide, Matrix4, ShaderMaterial, Vector3 } from "three";
9
9
  import { createPlaceholderTexture, floorVertexShader, RT_STITCH_SLOT_COUNT } from "./mktShader";
10
10
  /**
11
- * ⭐ 融合材质的全景点数**上限**:每点占 **3** 张拼合槽纹理(皇上旨 2026-10-23「全景的 RT 由原来的 2 个分成 3 个、
12
- * 每个 RT 上面 3×3=9 片」⇒ 原图切 6×3=18 片,按**半幅**分 2 槽)⇒ 点数 × 2 必须 ≤ sampler 硬顶。
11
+ * ⭐ 融合材质的全景点数**上限**:每点占 **2** 张拼合槽纹理(皇上旨 2026-10-23「全景的 RT 由原来的 2 个分成 3 个、
12
+ * 每个 RT 上面 3×3=9 片」那一版已被 10-26 收回 2 槽;现行 2026-10-27 需求「2 个 RT、每个 RT 上面 4×4=16 片」
13
+ * ⇒ 原图切 8×4=32 片,按**半幅**分 2 槽)⇒ 点数 × 2 必须 ≤ sampler 硬顶。
13
14
  * 本机 `MAX_TEXTURE_IMAGE_UNITS` 实测 **16**:每点 2 槽 ⇒ 取 ⌊16/2⌋ = **8** 点(10-23 那版每点 3 槽只能坐 5 点)
14
- * (8 × 2 = 16 正好用满)。2026-10-26 需求回到「2 个 RT / 每 RT 3×3」⇒ **同屏全景点数 5 → 8**。
15
+ * (8 × 2 = 16 正好用满)。2026-10-26 需求回到「2 个 RT / 每 RT 3×3」⇒ **同屏全景点数 5 → 8**;
16
+ * 2026-10-27 把每槽网格从 3×3 改成 4×4(片数 18 → 32)**不动这条账** —— 每点仍占 2 张槽纹理。
15
17
  *
16
18
  * ⭐⭐ 2026-10-09 皇上旨「MktMesh 只有映射一种,blend/selected 归编辑器」⇒ 该常量从 `mktShader.ts`
17
19
  * **搬到这里**(映射材质的所在地)。它同时是库与编辑器那份 blend 的**共同上限**,两边必须同值。
@@ -26,7 +28,7 @@ export const MKT_PANO_MAX_SLOTS = 8;
26
28
  * 槽没绑好但序号命中会采到 vec3(0) 纯黑,深灰才是钦定兜底色)。
27
29
  */
28
30
  function buildFloorMappingFragment(maxPano) {
29
- // 每个全景点占 **2** 张拼合槽纹理(18 片 6×3 按半幅分:左半幅 / 右半幅,每槽 3×3=9 片)⇒ 8 × 2 = 16 = sampler 硬顶
31
+ // 每个全景点占 **2** 张拼合槽纹理(32 片 8×4 按半幅分:左半幅 / 右半幅,每槽 4×4=16 片)⇒ 8 × 2 = 16 = sampler 硬顶
30
32
  const tileCount = maxPano * RT_STITCH_SLOT_COUNT;
31
33
  let slotCalc = ""; // 每槽各自采样出 linK(weights[k]>0 才采;没绑好保持 0,由 facePick 的 weights 闸兜成深灰)
32
34
  let slotFacePick = ""; // 逐槽展开「panoIndices[k]==vPanoIndex 则取 lin{k}」(ANGLE 禁动态索引 ⇒ JS 常量展开)
@@ -56,7 +58,7 @@ function buildFloorMappingFragment(maxPano) {
56
58
  float lat = asin(clamp(dir.y, -1.0, 1.0));
57
59
  // 等距柱状线性 v(= 全图 UV),与 blend / 单全景分支**逐字同口径**
58
60
  float v = 0.5 + lat * 0.3183098861837907; // 1/PI
59
- // 两等分经度 -> 拼合槽下标 [左半幅=0, 右半幅=1](每槽 = 6×3 网格里左/右 3 列、3×3=9 片拼成,见 RT_STITCH_SLOT_TILES)
61
+ // 两等分经度 -> 拼合槽下标 [左半幅=0, 右半幅=1](每槽 = 8×4 网格里左/右 4 列、4×4=16 片拼成,见 RT_STITCH_SLOT_TILES)
60
62
  // ⭐ 10-06「竖着不再分块」继续成立、10-26 把横向 3 等分收回 2 等分 ⇒ 槽只随 u 走(与 blend / 单全景分支**逐字同口径**)
61
63
  int tileIdx = int(clamp(floor(u * ${RT_STITCH_SLOT_COUNT}.0), 0.0, ${RT_STITCH_SLOT_COUNT - 1}.0));
62
64
  float localU = u * ${RT_STITCH_SLOT_COUNT}.0 - float(tileIdx);
@@ -9,10 +9,12 @@ import { BackSide, Matrix4, ShaderMaterial, Vector3 } from "three";
9
9
  import { createPlaceholderTexture, floorVertexShader, RT_STITCH_SLOT_COUNT } from "./mktShader";
10
10
 
11
11
  /**
12
- * ⭐ 融合材质的全景点数**上限**:每点占 **3** 张拼合槽纹理(皇上旨 2026-10-23「全景的 RT 由原来的 2 个分成 3 个、
13
- * 每个 RT 上面 3×3=9 片」⇒ 原图切 6×3=18 片,按**半幅**分 2 槽)⇒ 点数 × 2 必须 ≤ sampler 硬顶。
12
+ * ⭐ 融合材质的全景点数**上限**:每点占 **2** 张拼合槽纹理(皇上旨 2026-10-23「全景的 RT 由原来的 2 个分成 3 个、
13
+ * 每个 RT 上面 3×3=9 片」那一版已被 10-26 收回 2 槽;现行 2026-10-27 需求「2 个 RT、每个 RT 上面 4×4=16 片」
14
+ * ⇒ 原图切 8×4=32 片,按**半幅**分 2 槽)⇒ 点数 × 2 必须 ≤ sampler 硬顶。
14
15
  * 本机 `MAX_TEXTURE_IMAGE_UNITS` 实测 **16**:每点 2 槽 ⇒ 取 ⌊16/2⌋ = **8** 点(10-23 那版每点 3 槽只能坐 5 点)
15
- * (8 × 2 = 16 正好用满)。2026-10-26 需求回到「2 个 RT / 每 RT 3×3」⇒ **同屏全景点数 5 → 8**。
16
+ * (8 × 2 = 16 正好用满)。2026-10-26 需求回到「2 个 RT / 每 RT 3×3」⇒ **同屏全景点数 5 → 8**;
17
+ * 2026-10-27 把每槽网格从 3×3 改成 4×4(片数 18 → 32)**不动这条账** —— 每点仍占 2 张槽纹理。
16
18
  *
17
19
  * ⭐⭐ 2026-10-09 皇上旨「MktMesh 只有映射一种,blend/selected 归编辑器」⇒ 该常量从 `mktShader.ts`
18
20
  * **搬到这里**(映射材质的所在地)。它同时是库与编辑器那份 blend 的**共同上限**,两边必须同值。
@@ -28,7 +30,7 @@ export const MKT_PANO_MAX_SLOTS = 8;
28
30
  * 槽没绑好但序号命中会采到 vec3(0) 纯黑,深灰才是钦定兜底色)。
29
31
  */
30
32
  function buildFloorMappingFragment(maxPano: number): string {
31
- // 每个全景点占 **2** 张拼合槽纹理(18 片 6×3 按半幅分:左半幅 / 右半幅,每槽 3×3=9 片)⇒ 8 × 2 = 16 = sampler 硬顶
33
+ // 每个全景点占 **2** 张拼合槽纹理(32 片 8×4 按半幅分:左半幅 / 右半幅,每槽 4×4=16 片)⇒ 8 × 2 = 16 = sampler 硬顶
32
34
  const tileCount = maxPano * RT_STITCH_SLOT_COUNT;
33
35
  let slotCalc = ""; // 每槽各自采样出 linK(weights[k]>0 才采;没绑好保持 0,由 facePick 的 weights 闸兜成深灰)
34
36
  let slotFacePick = ""; // 逐槽展开「panoIndices[k]==vPanoIndex 则取 lin{k}」(ANGLE 禁动态索引 ⇒ JS 常量展开)
@@ -60,7 +62,7 @@ function buildFloorMappingFragment(maxPano: number): string {
60
62
  float lat = asin(clamp(dir.y, -1.0, 1.0));
61
63
  // 等距柱状线性 v(= 全图 UV),与 blend / 单全景分支**逐字同口径**
62
64
  float v = 0.5 + lat * 0.3183098861837907; // 1/PI
63
- // 两等分经度 -> 拼合槽下标 [左半幅=0, 右半幅=1](每槽 = 6×3 网格里左/右 3 列、3×3=9 片拼成,见 RT_STITCH_SLOT_TILES)
65
+ // 两等分经度 -> 拼合槽下标 [左半幅=0, 右半幅=1](每槽 = 8×4 网格里左/右 4 列、4×4=16 片拼成,见 RT_STITCH_SLOT_TILES)
64
66
  // ⭐ 10-06「竖着不再分块」继续成立、10-26 把横向 3 等分收回 2 等分 ⇒ 槽只随 u 走(与 blend / 单全景分支**逐字同口径**)
65
67
  int tileIdx = int(clamp(floor(u * ${RT_STITCH_SLOT_COUNT}.0), 0.0, ${RT_STITCH_SLOT_COUNT - 1}.0));
66
68
  float localU = u * ${RT_STITCH_SLOT_COUNT}.0 - float(tileIdx);
@@ -110,43 +110,45 @@ export declare function setMktPanoPoints(material: ShaderMaterial | null | undef
110
110
  * 故「地板/墙体/立方体」共用这一个着色器,无需为立方体另写实例化版(消除原先的 instanced 分支)。
111
111
  * instanceColor(逐实例染色,选中高亮)同样用 USE_INSTANCING_COLOR 宏在顶点→片段间传递。
112
112
  */
113
- /** ⭐ 18 瓦片拼合(2026-10-26 需求:一张全景切 **横 6 × 竖 3 = 18 片**,每 **横 3 × 竖 3 = 9 片**离屏拼成
114
- * 1 张 **6144×6144** 槽纹理,**左/右 2 槽**组成完整全景;上一版是 10-23 的 3×3 = 9 片 / 按列 3 槽 4096×6144,
115
- * 再上一版 10-06 晚的 8×4 = 32 片 / 左右 2 槽 4096²,最早 09-29 的 4×4 = 16 片)的「槽虚拟地址」前缀。
113
+ /** ⭐ 32 瓦片拼合(2026-10-27 需求:一张全景切 **横 8 × 竖 4 = 32 片**,每 **横 4 × 竖 4 = 16 片**离屏拼成
114
+ * 1 张 **6144×6144** 槽纹理,**左/右 2 槽**组成完整全景)的「槽虚拟地址」前缀。
115
+ * 历史档位(作废,仅留档):09-29 的 4×4=16 片 → 10-06 晚的 8×4=32 片 / 左右 2 槽 4096² →
116
+ * 10-23 的 3×3=9 片 / 按列 3 槽 4096×6144 → 10-26 的 6×3=18 片 / 左右 2 槽 6144² → 本次回到 8×4=32。
116
117
  * 虚拟键不是真 URL,纹理由 `PanoTileStitcher` 用 shader 逐格画进 `WebGLRenderTarget` 提供,
117
118
  * 消费方(基类 `_ensurePanoTiles` / 编辑器 `_peekTileAt`)见前缀即走拼合器,⛔ 不得当 URL 下载。
118
119
  * ⚠️ 键协议 `rt:<batch>#<slot>` 与 `uPanoTiled` 这套对外接口**一字未改** —— 变的只有「每批几条地址」
119
120
  * 和「槽怎么分」;`slot` 取值 0..1,消费方一律用 `RT_STITCH_SLOT_COUNT` 取,不许写死。
120
- * ⚠️ 旧存档不兼容(与 10-06 / 10-23 同一口径):存档里 9 条(或历代 16/32/64 条)瓦片地址会因张数不符被判废
121
+ * ⚠️ 旧存档不兼容(与历代同一口径):存档里 18 条(或历代 9/16/32/64 条)瓦片地址会因张数不符被判废
121
122
  * ⇒ **老项目需重新上传**(本次已明确不兼容,用户会重传图片)。 */
122
123
  export declare const RT_STITCH_KEY_PREFIX = "rt:";
123
- /** 原图**横向**(经度方向 u)切几片(需求「横 6」) */
124
- export declare const RT_STITCH_COLS = 6;
125
- /** 原图**纵向**(纬度方向 v)切几片(需求「竖 3」)⇒ 一槽在纵向上装满整幅 3 片,横向才分左/右 */
126
- export declare const RT_STITCH_ROWS = 3;
127
- /** 一个批次(= 一个全景点)的瓦片总数 = 6 × 3 = 18;`tiles` 存档数组的硬上限 */
124
+ /** 原图**横向**(经度方向 u)切几片(需求「横 8」) */
125
+ export declare const RT_STITCH_COLS = 8;
126
+ /** 原图**纵向**(纬度方向 v)切几片(需求「竖 4」⇒ 一槽在纵向上装满整幅 4 片,横向才分左/右) */
127
+ export declare const RT_STITCH_ROWS = 4;
128
+ /** 一个批次(= 一个全景点)的瓦片总数 = 8 × 4 = 32;`tiles` 存档数组的硬上限 */
128
129
  export declare const RT_STITCH_TILES_PER_BATCH: number;
129
- /** 一个拼合槽**横向**几格(需求「每个 RT 上面 3×3=9」⇒ 一槽 = 原图左半幅/右半幅 = 横 3 格)*/
130
- export declare const RT_STITCH_SLOT_CELL_COLS = 3;
131
- /** 一个拼合槽**纵向**几格(同上 ⇒ 竖 3 格)
130
+ /** 一个拼合槽**横向**几格(需求「每个 RT 上面 4×4=16」⇒ 一槽 = 原图左半幅/右半幅 = 横 4 格)*/
131
+ export declare const RT_STITCH_SLOT_CELL_COLS = 4;
132
+ /** 一个拼合槽**纵向**几格(同上 ⇒ 竖 4 格)
132
133
  * ⚠️ 横竖**不再同数**是 10-23 起的口径(旧字段 `RT_STITCH_SLOT_GRID`「方形假设」已整条作废),
133
134
  * 格数、格位、quad 摆位一律分轴取(`rtStitchCellPos` / `PanoTileStitcher._stitchCell`)。 */
134
- export declare const RT_STITCH_SLOT_CELL_ROWS = 3;
135
- /** 一个拼合槽的格数 = 3 × 3 = 9(画满 9 格 = 这一槽齐活) */
135
+ export declare const RT_STITCH_SLOT_CELL_ROWS = 4;
136
+ /** 一个拼合槽的格数 = 4 × 4 = 16(画满 16 格 = 这一槽齐活) */
136
137
  export declare const RT_STITCH_CELLS_PER_SLOT: number;
137
- /** 拼合槽个数 = **左/右 2 槽**(需求「一个全景是 2 个 RT,每个 RT 上面 3×3=9」)⇒ 一个全景点占 **2 个 sampler**。
138
- * ⛔ 别以为 18 片就要 18 个 sampler:本机 `MAX_TEXTURE_IMAGE_UNITS` 实测 **16** 是硬顶,
139
- * 2 槽 × 同屏 8 景点 = 16 正好用满 ⇒ `MKT_PANO_MAX_SLOTS` 回到 **8**(上一版 3 槽只能坐 5 点)。
140
- * ⭐ 分块口径:槽 `s` = 原图**第 `3s`~`3s+2` 列**(行 0-2)⇒ 每槽覆盖 **横向 180° × 纵向 180°**,
141
- * 与「一槽横 3 格 × 竖 3 格」同一条口径(槽纹理尺寸见下 `RT_STITCH_SLOT_W/H`)。 */
138
+ /** 拼合槽个数 = **左/右 2 槽**(需求「一个全景是 2 个 RT,每个 RT 上面 4×4=16」)⇒ 一个全景点占 **2 个 sampler**。
139
+ * ⛔ 别以为 32 片就要 32 个 sampler:本机 `MAX_TEXTURE_IMAGE_UNITS` 实测 **16** 是硬顶,
140
+ * 2 槽 × 同屏 8 景点 = 16 正好用满 ⇒ `MKT_PANO_MAX_SLOTS` 取 **8**(3 槽那版只能坐 5 点)。
141
+ * ⭐ 分块口径:槽 `s` = 原图**第 `4s`~`4s+3` 列**(行 0-3)⇒ 每槽覆盖 **横向 180° × 纵向 180°**,
142
+ * 与「一槽横 4 格 × 竖 4 格」同一条口径(槽纹理尺寸见下 `RT_STITCH_SLOT_W/H`)。 */
142
143
  export declare const RT_STITCH_SLOT_COUNT = 2;
143
- /** 单槽像素尺寸 **6144×6144**(需求 2026-10-26「2 个 RT,每个 RT 上面 3×3=9」):
144
- * 2 槽 = 有效分辨率 **12288×6144**,与 6×3 切片的原图(12288×6144 ⇒ 每片 2048×2048)**逐像素 1:1**;
145
- * 单全景 RT 总量 2×6144² = 75.5 Mpx 与上一版 3×(4096×6144) **一字不差** ⇒ 片数翻倍而画质、显存都不变。
146
- * ⚠️ 每格 = 2048×2048(横竖**等**了,但摆格仍分轴取,见 `RT_STITCH_SLOT_CELL_COLS/ROWS`)。
147
- * ⚠️ 代价(与上一版同档):单全景常驻显存 ≈ 384MB(含 mipmap);同屏点数因每点只占 2 sampler 回到 8 ⇒
148
- * 8 点常驻 ≈ 3GB,那是「同屏点数」这一档带来的,⛔ 不许为此缩 RT。
149
- * ⚠️ 红线(「千万不要降低质量」):这两个数与「原图切几片」无关,⛔ 不许当成省显存的旋钮去缩。 */
144
+ /** 单槽像素尺寸 **6144×6144**:2 槽 = 有效分辨率 **12288×6144**,与 8×4 切片的原图(12288×6144 ⇒ 每片 1536×1536)
145
+ * **逐像素 1:1**;单全景 RT 总量 2×6144² = 75.5 Mpx ⇒ **与上一版 6×3=18 那片网格一字不差**
146
+ * (片数 18→32 只改「切几刀」,不改画质、不改显存,这是「千万不要降低质量」红线给的约束)。
147
+ * ⚠️ 为什么不取 10-06 那版的 4096²:那版每格 1024² ⇒ 有效分辨率 8192×4096,比现在少 2.25× 像素 = 降质,被禁令挡死。
148
+ * ⚠️ 为什么不取 8192²(每格 2048²):单槽 512MB、单全景 1GB+,且 8192 是不少设备的纹理硬顶,风险不对等。
149
+ * ⚠️ 每格 = 1536×1536(横竖**等**了,但摆格仍分轴取,见 `RT_STITCH_SLOT_CELL_COLS/ROWS`)。
150
+ * ⚠️ 代价(与上一版同档):单全景常驻显存 ≈ 384MB(含 mipmap);同屏 8 点常驻 ≈ 3GB,那是「同屏点数」这一档带来的,
151
+ * ⛔ 不许为此缩 RT。 */
150
152
  export declare const RT_STITCH_SLOT_W = 6144;
151
153
  export declare const RT_STITCH_SLOT_H = 6144;
152
154
  export declare const floorVertexShader = "\n #include <common>\n #include <logdepthbuf_pars_vertex>\n\n // \u6295\u5F71\u7A7A\u95F4\u9006\u77E9\u9635\uFF1A\u89C1\u5355\u5168\u666F\u9876\u70B9\u7740\u8272\u5668\u5904\u7684\u540C\u4E00\u6BB5\u8BF4\u660E\uFF08\u7687\u4E0A\u65E8 2026-09-19\uFF09\u3002\n // \u9ED8\u8BA4\u4FDD\u6301\u5355\u4F4D\u9635\uFF08\u5730\u677F / \u7ACB\u65B9\u4F53\u884C\u4E3A\u4E0E\u6539\u9020\u524D\u5B8C\u5168\u4E00\u81F4\uFF09\uFF1B\u7F16\u8F91\u5668\u5899\uFF08MktDevMesh\uFF09\u4E0E\u53D1\u5E03\u6001 MktMesh\n // \u4E00\u6837\u6BCF\u5E27\u5199\u5165 inverse(matrixWorld)\uFF0C\u6545\u5899\u4E0A\u7684\u7EB9\u7406\u540C\u6837\u4E0D\u968F\u6574\u4F53\u53D8\u6362\u6F02\u79FB\u3002\n uniform mat4 uProjInvMatrix;\n\n // \u5168\u666F\u5E8F\u53F7\u6620\u5C04\u6A21\u5F0F\uFF1A\u672C\u4E09\u89D2\u9762\u5F52\u5C5E\u7684\u5168\u5C40\u5168\u666F\u5E8F\u53F7\uFF08\u6765\u81EA geometry \u7684 aPanoIndex\uFF1B\u65E0\u6B64 attribute \u7684\u5BF9\u8C61\u6052\u4E3A 0\uFF0C\u4EC5 mode=1 \u65F6\u8BFB\u53D6\uFF09\n attribute float aPanoIndex;\n varying float vPanoIndex;\n\n varying vec3 vProjPos;\n // \u53D6\u56FE\u300C\u6B63\u9762\u5939\u89D2\u300D\u5224\u636E\u7528\uFF08\u7687\u4E0A\u65E8 2026-09-27 \u6DF1\u591C\uFF09\uFF1A\u51E0\u4F55\u6CD5\u7EBF\uFF0C\u53D8\u6362\u5230\u4E0E vProjPos **\u540C\u4E00\u7A7A\u95F4**\n // \uFF08uProjInvMatrix * modelMatrix * instanceMatrix \u7684\u65CB\u8F6C\u90E8\u5206\uFF09\uFF0C\u7247\u5143\u91CC\u4E0E\u300C\u70B9\u2192\u5168\u666F\u300D\u5411\u91CF\u70B9\u79EF\u7B97\u5939\u89D2\u3002\n // \u26D4 normal \u662F three.js \u81EA\u52A8\u6CE8\u5165\u7684\u6807\u51C6 attribute\uFF08\u5899=computeVertexNormals \u9010\u9762\u6CD5\u7EBF / \u5C01\u76D6=ShapeGeometry /\n // \u5730\u677F=PlaneGeometry / \u5BB6\u5177=BoxGeometry\uFF09\uFF0C\u6B64\u5904\u65E0\u9700\u81EA\u5DF1\u58F0\u660E\u3002\n varying vec3 vWNormal;\n #ifdef USE_INSTANCING_COLOR\n varying vec3 vInstanceColor;\n #endif\n\n void main() {\n // \u5B9E\u4F8B\u77E9\u9635\uFF1AInstancedMesh \u81EA\u52A8\u5B9A\u4E49 USE_INSTANCING \u5E76\u63D0\u4F9B instanceMatrix\uFF1B\n // \u666E\u901A Mesh\uFF08\u5899/\u5730\u677F\uFF09\u65E0\u5B9E\u4F8B\u77E9\u9635\uFF0C\u9000\u5316\u4E3A\u5355\u4F4D\u9635 \u2014\u2014 \u4E00\u4EFD\u7740\u8272\u5668\u540C\u65F6\u670D\u52A1\u5899/\u5730\u677F/\u7ACB\u65B9\u4F53\u3002\n #ifdef USE_INSTANCING\n mat4 im = instanceMatrix;\n #else\n mat4 im = mat4(1.0);\n #endif\n // \u6A21\u578B/\u5B9E\u4F8B\u5C40\u90E8\u5750\u6807\uFF1B\u7ACB\u65B9\u4F53\u5B9E\u4F8B\u7684\u53D8\u6362\u5728 instanceMatrix\uFF0C\u5899/\u5730\u677F\u5728 modelMatrix\n vec4 modelPos = im * vec4(position, 1.0);\n vProjPos = (uProjInvMatrix * modelMatrix * modelPos).xyz;\n // \u6CD5\u7EBF\u4E0E vProjPos \u8D70\u540C\u4E00\u6761\u77E9\u9635\u94FE\uFF08mat3 \u53D6\u65CB\u8F6C/\u7F29\u653E\u90E8\u5206\uFF0C\u7247\u5143\u91CC normalize \u62B5\u6D88\u7F29\u653E\uFF09\n vWNormal = mat3(uProjInvMatrix * modelMatrix * im) * normal;\n // \u5168\u666F\u5E8F\u53F7\u6620\u5C04\u6A21\u5F0F\uFF1A\u628A\u672C\u4E09\u89D2\u9762\u7684\u5F52\u5C5E\u5E8F\u53F7\u4F20\u7ED9\u7247\u5143\uFF08geometry \u65E0 aPanoIndex \u7684\u5BF9\u8C61\u6052\u4E3A 0\uFF0C\u4EC5 mode=1 \u65F6\u8BFB\u53D6\uFF09\n vPanoIndex = aPanoIndex;\n\n #ifdef USE_INSTANCING_COLOR\n vInstanceColor = instanceColor;\n #endif\n\n gl_Position = projectionMatrix * modelViewMatrix * modelPos;\n\n #include <logdepthbuf_vertex>\n }\n";
@@ -161,8 +163,8 @@ export declare function createPlaceholderTexture(): DataTexture;
161
163
  /**
162
164
  * 全景纹理形态(皇上旨 2026-09-22「全景球可以切成 4 片和一整片,两者效果很不一样,做个功能可以切换」)。
163
165
  *
164
- * "tiled" = 2 个 sampler 各装一张**离屏拼合好的槽纹理**(原图 **6×3 = 18 片**,每「横 3 × 竖 3」= 9 片拼一张;
165
- * 2026-10-26 需求;再早是 10-23 的 3×3 = 9 片 / 3 槽、10-06 晚的 8×4 = 32 片 / 2 槽、同日的 8×8 = 64 片 / 4 槽、09-29 的 4×4 = 16 片),
166
+ * "tiled" = 2 个 sampler 各装一张**离屏拼合好的槽纹理**(原图 **8×4 = 32 片**,每「横 4 × 竖 4」= 16 片拼一张;
167
+ * 2026-10-27 需求;历代档位:10-26 的 6×3 = 18 片、10-23 的 3×3 = 9 片 / 3 槽、10-06 晚的 8×4 = 32 片 / 2 槽 4096²、同日的 8×8 = 64 片 / 4 槽、09-29 的 4×4 = 16 片),
166
168
  * `uPanoTiled` 写 1;
167
169
  * "whole" = 2 个 sampler 都装**同一张完整等距柱状原图**,`uPanoTiled` 写 0(改用全图 UV)。
168
170
  *
@@ -170,18 +172,18 @@ export declare function createPlaceholderTexture(): DataTexture;
170
172
  * `test/panoVMapping.test.js` 的等价性数值证明)。所以线上若看着「很不一样」,差异只可能来自下面两条,
171
173
  * 与本切换功能无关、也不会被它修掉:
172
174
  * ① **分辨率**:`x-oss-process=image/resize,m_lfit,w_<ossSize>` 是**按 URL** 生效的,且 2026-09-23 皇上定
173
- * 「**切片的瓦片不走该尺寸档,默认用原图**」(每片本就只有原图的 1/6 宽 × 1/3 高,再按档缩是二次损失)⇒
175
+ * 「**切片的瓦片不走该尺寸档,默认用原图**」(每片本就只有原图的 1/8 宽 × 1/4 高,再按档缩是二次损失)⇒
174
176
  * 判据 = `mktPanoTiledFlag(...)===1`(喂地址与写 `uPanoTiled` 同源,见 `resolveOssUrl` 两处)。
175
177
  * 于是 tiled 态 = 拼合槽纹理**逐片取自原始分辨率**瓦片(合计像素≈整张原图,10-06 那版仍是 8192×4096 等效),
176
178
  * whole 态 = 整图按档(w_1024 ⇒ 等效 1024×512)。
177
179
  * ⚠️ 两档清晰度差**不是固定的倍数**,而取决于「原图宽 ÷ 所选档位」;又因 `m_lfit` 只缩不放,
178
180
  * 原图宽 ≤ 2×档位时 whole 态其实也没被缩,两态清晰度自然接近 —— 别把这当成「切换坏了」。
179
- * ② **瓦片边界**(10-06 晚切 32 片起这一条分两层,10-26 回到「2 槽 + 每槽 3×3」后两层口径又换一档):
181
+ * ② **瓦片边界**(10-06 晚切 32 片起这一条分两层,10-27 口径 =「2 槽 + 每槽 4×4」):
180
182
  * · **拼合槽之间**(u=1/2 那**一道**竖;⭐ v 方向不再有横缝 —— 每槽就是全高):2 张槽是 2 张独立纹理,
181
183
  * 各自 mip + ClampToEdge ⇒ 仍可能有细亮/细暗线,这一条**与 09-29 那版一字未变**,
182
184
  * `RT_STITCH_SEAM_MARGIN_PX` 管不到它(它治的是「同一张纹理内」的格子边界);
183
185
  * whole 态是同一张贴图,天然无此缝。
184
- * · **拼合槽内部**(每张 6144×6144 里 3×3 片 ⇒ 2 道横缝 + 2 道竖缝;上一版 4096×6144 只有 2 横 0 竖):
186
+ * · **拼合槽内部**(每张 6144×6144 里 4×4 片 ⇒ 3 道横缝 + 3 道竖缝;上一版 3×3 是 2 横 2 竖):
185
187
  * 靠「上传多切 `RT_STITCH_SEAM_MARGIN_PX` 像素 + 拼合只采中间那块」消掉,见该常量的说明。
186
188
  *
187
189
  * 旧数据 / 种子图没有 `tiles`(或只有 1 条)⇒ 两种形态都只能退回整图,`whole` 与 `tiled` 表现相同。
@@ -195,26 +197,26 @@ export declare function isPanoTexMode(v: unknown): v is PanoTexMode;
195
197
  export declare const MISSING_TILE_GRAY = "#767676";
196
198
  /** 接缝余量(**原图像素**,每片向四边各多切这么多;贴原图边那侧裁到剩多少算多少)。
197
199
  *
198
- * 10-26 每槽装 3×3 = 9 格 ⇒ 一张槽内部的接缝是 **2 横 2 竖**(上一版每槽一竖列时只有 2 横 0 竖),这一条是随之而来的画质护栏:
200
+ * 每槽装 4×4 = 16 格 ⇒ 一张槽内部的接缝是 **3 横 3 竖**(10-23 那版每槽一竖列时只有 2 横 0 竖),这一条是随之而来的画质护栏:
199
201
  * ① 上传时每片**向四边多切 M 像素**(`rtStitchTileRects`);
200
202
  * ② 拼合时**只采中间那块**(`rtStitchTileInset` 算出的 UV 内缩窗口),多切的那一圈**不画进格子**。
201
203
  *
202
204
  * 为什么这样就没了细亮/细暗线:缝的病根是「双线性 / mipmap 在瓦片边界外拿不到邻居像素,只能复制自己的
203
205
  * 边缘像素」(就是 `PanoTexMode` 文件头 ② 那条)。多带的 M 像素就是**真的邻居像素**,插值不再靠复制。
204
206
  *
205
- * M 取 8 够不够:一格 1024×1024px、一片原图 1488×1488px(横 W/8、竖 H/4)⇒ 两个方向都是 1.45× 缩小,
206
- * 三线性 mip 的 footprint 半径最大约
207
- * `2 × 1.45 ≈ 3` texel ⇒ 8px 有 ≈2.7 倍余量;再小一档(4px)也够用,取 8 是给「原图比 8192 窄 ⇒ 格子
208
- * 反而在放大」那类点留边界。**代价**:每片文件比「正好 1/8」宽 16px、高 16px(≈ +4% 面积),⛔ 不是降质。 */
207
+ * M 取 8 够不够:一格 1536×1536px(6144² ÷ 4),一片取自 12288×6144 那类原图正好也是 1536×1536(横 W/8、竖 H/4)
208
+ * ⇒ 一比一不缩,三线性 mip 的 footprint 只在原图更宽时才 >1 texel;按上一版同口径估:原图 1.45× 缩小时 footprint
209
+ * 半径约 `2 × 1.45 ≈ 3` texel ⇒ 8px 有 ≈2.7 倍余量,再小一档(4px)也够用,取 8 是给「原图比 12288 宽 ⇒ 格子在缩」
210
+ * 那类点留边界。**代价**:每片文件比「正好 1/8 × 1/4」宽 16px、高 16px(1536² 上 ≈ +2% 面积),⛔ 不是降质。 */
209
211
  export declare const RT_STITCH_SEAM_MARGIN_PX = 8;
210
212
  /**
211
213
  * 「一张图切成几张瓦片、瓦片怎么分组进拼合槽」的**网格描述** —— 皇上旨 2026-10-20「上传的这个图切成
212
- * 4*4=16 片吧,加载的时候,也是一帧载入一片」⇒ 拼合器从此要同时服务两种网格(全景 6×3 / 图片平面那一份),
214
+ * 4*4=16 片吧,加载的时候,也是一帧载入一片」⇒ 拼合器从此要同时服务两种网格(全景 8×4 / 图片平面那一份),
213
215
  * 于是这一组参数必须能**当数据传**,⛔ 不许在拼合器里再写死一遍全景那套数字(那就是两份实现)。
214
216
  * ⭐ 同一条参数化让 10-21 旨「平面切成 2*2=4 份,不用切成 16 份了」只需要改 `IMAGE_TILE_GRID` 一处。
215
217
  *
216
218
  * ⚠️ 只描述「格子怎么排」,不含槽纹理像素尺寸(那是 GL 资源,由拼合器按消费方给的 layout 建)。
217
- * ⚠️ `slotCellCols` / `slotCellRows` = **每槽横几格 / 竖几格**(10-23 起两个数独立,现行全景是每槽 3×3 = 原图左/右半幅;
219
+ * ⚠️ `slotCellCols` / `slotCellRows` = **每槽横几格 / 竖几格**(10-23 起两个数独立,现行全景是每槽 4×4 = 原图左/右半幅;
218
220
  * 旧的单一 `slotGrid`「横竖同数」假设已整条作废 ⇒ 格数 = `slotCellCols * slotCellRows`)。
219
221
  */
220
222
  export interface TileGridLayout {
@@ -258,7 +260,7 @@ export type TileLayout = TileGridLayout & {
258
260
  rtW: number;
259
261
  rtH: number;
260
262
  };
261
- /** 全景的标准布局(6×3 网格 / 2 槽 / 6144×6144 RT)—— 一槽 = 原图左/右半幅 */
263
+ /** 全景的标准布局(8×4 网格 / 2 槽 / 6144×6144 RT)—— 一槽 = 原图左/右半幅 */
262
264
  export declare const PANO_TILE_LAYOUT: TileLayout;
263
265
  /**
264
266
  * 图片平面的布局:2×2 网格 / 1 槽,RT 宽高比 = 原图宽高比,长边 4096(10-21 旨把 16 片改成 4 片,
@@ -267,27 +269,27 @@ export declare const PANO_TILE_LAYOUT: TileLayout;
267
269
  * 平面材质 UV [0,1]² ⇒ 不管平面尺寸多大都不会拉伸,RT 尺寸只跟原图走。
268
270
  */
269
271
  export declare function imageTileLayout(natW: number, natH: number): TileLayout;
270
- /** 18 瓦片批次的标识 = 第一条**非空**瓦片地址(同批上传 URL 前缀一致,足以唯一;
272
+ /** 32 瓦片批次的标识 = 第一条**非空**瓦片地址(同批上传 URL 前缀一致,足以唯一;
271
273
  * 09-29 晚旨「不足张数缺的地方涂灰」后批次里允许有空串占位 ⇒ 取首个非空,防首张缺失时键为空串互撞) */
272
274
  export declare function rtStitchBatchOf(tiles: string[]): string;
273
275
  /** 某一拼合槽的虚拟键:`rt:<batch>#<slot>` */
274
276
  export declare function rtStitchKey(batch: string, slot: number): string;
275
- /** 是否拼合槽(`rt:<batch>#<slot>`)的虚拟键 —— 16 / 32 / 64 / 9 片 / 现行 18 片**同一个前缀**,键本身不含片数信息 */
277
+ /** 是否拼合槽(`rt:<batch>#<slot>`)的虚拟键 —— 历代 16 / 32 / 64 / 9 / 18 片**同一个前缀**,键本身不含片数信息 */
276
278
  export declare function isRtStitchKey(key: string): boolean;
277
279
  /** 解析虚拟键 → { batch, slot };非 rt 键返回 null */
278
280
  export declare function rtStitchKeyParts(key: string): {
279
281
  batch: string;
280
282
  slot: number;
281
283
  } | null;
282
- /** 槽 slot 用哪 9 张瓦片(原图 **6 列 × 3 行 行优先**下标 `r*6+c`;**槽内格序 = 横 3 × 竖 3、图像左上起**):
283
- * 槽 0 = **左半幅**(列 0-2)→ `[0,1,2, 6,7,8, 12,13,14]`;槽 1 = **右半幅**(列 3-5)→ `[3,4,5, 9,10,11, 15,16,17]`。
284
- * ⭐ 只按 **u** 分槽(需求 2026-10-26「一个全景是 2 个 RT,每个 RT 上面 3×3=9」⇒ 一槽 = 原图半幅 = 横 180° × 全高 180°),
285
- * ⚠️ 表是**从上面那几个网格常数生成**的(⛔ 手抄 18 个数):正确性由护栏 `test/mktmesh.test.js` BE 组
284
+ /** 槽 slot 用哪 16 张瓦片(原图 **8 列 × 4 行 行优先**下标 `r*8+c`;**槽内格序 = 横 4 × 竖 4、图像左上起**):
285
+ * 槽 0 = **左半幅**(列 0-3)→ `[0,1,2,3, 8,9,10,11, 16,17,18,19, 24,25,26,27]`;槽 1 = **右半幅**(列 4-7)→ `[4,5,6,7, 12,13,14,15, 20,21,22,23, 28,29,30,31]`。
286
+ * ⭐ 只按 **u** 分槽(需求 2026-10-27「一个全景是 2 个 RT,每个 RT 上面 4×4=16」⇒ 一槽 = 原图半幅 = 横 180° × 全高 180°),
287
+ * ⚠️ 表是**从上面那几个网格常数生成**的(⛔ 手抄 32 个数):正确性由护栏 `test/mktmesh.test.js` BE 组
286
288
  * 对着手写死的字面量逐个数断言 —— 改了网格常数而护栏没跟着改,当场红。 */
287
289
  export declare const RT_STITCH_SLOT_TILES: ReadonlyArray<ReadonlyArray<number>>;
288
290
  /** 槽内第 cell 格在**图像方向**的位置 `[列, 行]`(0 起,与 `RT_STITCH_SLOT_TILES` 的格序同一口径)。
289
291
  * ⚠️ 这是「图像方向」(行 0 = 图像最上),GL 的 y 向上 ⇒ 画进 RT 时 y 要翻(拼合器里那句 `1 - (2*r+1)/n`)。
290
- * `slotCellCols` 默认全景那档(3 = 一槽就是原图半幅的三列);图片平面传 2。 */
292
+ * `slotCellCols` 默认全景那档(4 = 一槽就是原图半幅的左四列);图片平面传 2。 */
291
293
  export declare function rtStitchCellPos(cell: number, slotCellCols?: number): [number, number];
292
294
  /** 一片瓦片的切图矩形(原图像素)。`sx/sy/sw/sh` = **含多切余量**的实际切片区;
293
295
  * `ml/mt/mr/mb` = 四边各多切了多少(贴原图边那侧被裁 ⇒ 0)。 */
@@ -301,16 +303,16 @@ export interface RtStitchTileRect {
301
303
  mr: number;
302
304
  mb: number;
303
305
  }
304
- /** 18 片瓦片的切图矩形(行优先、图像左上起,下标 `i = r*6+c` 与 `RT_STITCH_SLOT_TILES` 同源;
305
- * ⭐ 10-26 需求「横 6 × 竖 3 = 18」:`r` 走 `RT_STITCH_ROWS`(3)、`c` 走 `RT_STITCH_COLS`(6)。
306
+ /** 32 片瓦片的切图矩形(行优先、图像左上起,下标 `i = r*8+c` 与 `RT_STITCH_SLOT_TILES` 同源;
307
+ * ⭐ 2026-10-27 需求「横 8 × 竖 4 = 32」:`r` 走 `RT_STITCH_ROWS`(4)、`c` 走 `RT_STITCH_COLS`(8)。
306
308
  *
307
309
  * ⭐ **上传侧(`panoramaUpload`)与拼合侧(`PanoTileStitcher`)必须共用这一份几何**:
308
310
  * 上传多切多少、拼合就内缩多少;两边各算一次就是「缝没治掉、反而把画面挤歪」。
309
- * 拼合侧拿不到原图尺寸(它只有 18 个 URL 和 18 张已解码纹理),所以它用 `rtStitchTileInset`
311
+ * 拼合侧拿不到原图尺寸(它只有 32 个 URL 和 32 张已解码纹理),所以它用 `rtStitchTileInset`
310
312
  * —— 那条只需「下标 + 该瓦片自己的像素尺寸」,两者等价的前提是「多切量 = 常数 M、只有贴边那几片被裁」,
311
313
  * 而「贴不贴边」纯由下标决定 ⇒ 护栏 BE 组用同一批 (W,H) 把两条算路对表钉死。 */
312
314
  export declare function rtStitchTileRects(w: number, h: number, grid?: TileGridLayout): RtStitchTileRect[];
313
- /** 这片瓦片有没有贴原图边界(6×3 ⇒ 18 片里外圈那 14 片至少贴一条边,只有中间那 4 片四边都不贴;贴边的**那一侧**多切量被裁成 0)。
315
+ /** 这片瓦片有没有贴原图边界(8×4 ⇒ 32 片里外圈那 20 片至少贴一条边,只有中间那 12 片四边都不贴;贴边的**那一侧**多切量被裁成 0)。
314
316
  * 拼合侧靠它 + 瓦片自己的像素尺寸还原内缩量 ⇒ 不必知道原图多大。
315
317
  * ⚠️ 下标拆分必须按 **列数 COLS**(`i = r*cols+c`),⛔ 不是 ROWS。 */
316
318
  export declare function rtStitchTileEdgeClip(i: number, grid?: TileGridLayout): {
@@ -333,15 +335,17 @@ export declare function rtStitchTileInset(i: number, tw: number, th: number, gri
333
335
  * 「这 `RT_STITCH_SLOT_COUNT`(2) 个纹理槽到底喂哪几个地址」。⚠️ **必须**与 `mktPanoTiledFlag` 同源、同一时机调用:
334
336
  * 只改标记不改地址(或反之)= 用整图 UV 去采一张瓦片 / 用瓦片内 UV 去采整图,画面立刻错乱。
335
337
  * 非 tiled 态(或该点压根没切过片)一律回退成「各槽同为一张整图」。
336
- * ⭐ 2026-10-26 需求「只支持 18 张(6×3)」:只要有瓦片(1~18 条)一律走拼合器(rt: 虚拟键),
337
- * 不足 18 张的位置由拼合器**涂灰**(一眼看出数据不全);3×3=9 张、8×4=32 张、8×8=64 张与 4×4=16 张那几版**都不做兼容**
338
- * (「无须兼容正常使用,有异常我会重传」⇒ 旧存档的 9 / 32 / 64 条地址张数不符被判废、重传即可)。
338
+ * ⭐ 2026-10-27 需求「只支持 32 张(8×4)」:只要有瓦片(1~32 条)一律走拼合器(rt: 虚拟键),
339
+ * 不足 32 张的位置由拼合器**涂灰**(一眼看出数据不全);6×3=18 张、3×3=9 张、8×8=64 张与 4×4=16 张那几版**都不做兼容**
340
+ * (「无须兼容正常使用,有异常我会重传」⇒ 旧存档的 18 / 9 / 64 / 16 条地址张数不符被判废、重传即可)。
341
+ * ⚠️ 唯一按张数**能混进来**的是 10-06 那版同样 32 片的存档:它的瓦片是 1024²,会被画进 1536² 的格子
342
+ * = 1.5× 放大 ⇒ 发虚但不报红。那种老点重传一次即可(顺序与槽分组两版一致,所以不会错位)。
339
343
  * ⚠️ 返回长度由 `RT_STITCH_SLOT_COUNT` 派生(⛔ 不许手写 2 个 rtStitchKey —— 槽数再变会漏改)。
340
344
  */
341
345
  export declare function mktPanoTexUrls(url: string, tiles: string[] | undefined, mode?: PanoTexMode): string[];
342
346
  /**
343
347
  * 「这 2 个纹理槽是不是真瓦片」的判据 —— **必须**与喂纹理处的回退式(`mktPanoTexUrls`)同源:
344
- * `tiles` 有 **任意 1~18 条**地址(不足 18 = 数据不全,缺的格子拼合时涂灰)**且**当前形态选的是 tiled = 是瓦片;
348
+ * `tiles` 有 **任意 1~32 条**地址(不足 32 = 数据不全,缺的格子拼合时涂灰)**且**当前形态选的是 tiled = 是瓦片;
345
349
  * 否则各槽同为一张整图(旧数据 / 种子图 / 用户切整片)。
346
350
  */
347
351
  export declare function mktPanoTiledFlag(tiles: string[] | undefined, mode?: PanoTexMode): 0 | 1;