第 9 章:MSH0 区段
Directory Tag: MSH0 · 作用范围: Chunk 级 · 必须性: 可选 · Directory Codec: RAW8
MSH0(Mesh Edit Cache)是面向编辑器的面计划缓存。它保存从 VOX0 派生出的可合并外表面矩形,便于局部网格重建、选取和增量编辑。它不是权威数据;任何 MSH0 均可从对应 Chunk 的 VOX0 重新生成。
9.1 Payload Layout
Payload 由 48 字节 Header 和 faceCount 个 16 字节 Face Record 组成。
| Offset | Size | Type | Field | Description |
|---|---|---|---|---|
| 0 | 2 | uint16 | meshVersion | 必须为 1 |
| 2 | 2 | uint16 | headerSize | 必须为 48 |
| 4 | 4 | int32 | chunkId | 对应 CHIX Chunk |
| 8 | 4 | uint32 | faceCount | Face Record 数量 |
| 12 | 4 | uint32 | faceSize | 必须为 16 |
| 16 | 32 | uint8[32] | sourceHash | 生成时的权威 Source Hash |
Face Record:
| Offset | Size | Type | Field | Description |
|---|---|---|---|---|
| 0 | 1 | uint8 | axis | 法线方向:0=+X、1=-X、2=+Y、3=-Y、4=+Z、5=-Z |
| 1 | 1 | uint8 | paletteIndex | 对应 PAL0 索引 |
| 2 | 1 | uint8 | plane | 面所在局部平面坐标 |
| 3 | 1 | uint8 | u | 面二维坐标 U 起点 |
| 4 | 1 | uint8 | v | 面二维坐标 V 起点 |
| 5 | 1 | uint8 | width | U 方向尺寸,1..255 |
| 6 | 1 | uint8 | height | V 方向尺寸,1..255 |
| 7 | 1 | uint8 | flags | VFP 1.3 必须为 0 |
| 8 | 8 | uint8[8] | reserved | 必须为全零 |
Payload 总长度为 48 + faceCount × 16。
9.2 面坐标解释
Face Record 使用局部 Chunk 坐标。axis 决定 (plane,u,v) 映射:
| axis | plane 轴 | U 轴 | V 轴 |
|---|---|---|---|
| 0 / 1 | X | Z | Y |
| 2 / 3 | Y | X | Z |
| 4 / 5 | Z | X | Y |
Face 代表一张由 width × height 个同色、同朝向单位面合并而成的矩形。它必须完全位于对应 Chunk 的边界范围内;paletteIndex 必须为已定义的非零 PAL0 条目。
9.3 生成规则
生成器必须先从 VOX0 确定可见面:一个非空体素在某方向的相邻位置为空、越过 Chunk 边界或属于未加载但已知为空的邻居时,该方向产生候选面。对边界相邻 Chunk,生成器必须使用权威 VOX0,而不能仅依赖当前 Chunk 缓存。
随后按 axis、plane、paletteIndex 和二维扫描顺序执行确定性贪心合面。推荐扫描顺序为 axis 升序、plane 升序、v 升序、u 升序;在同一位置优先扩展 U,再扩展 V。相同 VOX0 输入和同一算法版本应生成相同的 MSH0。
9.4 验证与失效
读取器使用 MSH0 前必须检查 Header 的 chunkId、Source Hash、版本和长度。编辑一个 Chunk 或其相邻 Chunk 的边界体素时,受影响 Chunk 的 MSH0 必须失效。
验证器可选择重建 MSH0 并逐项比较;完整验证器必须至少确认:所有字段范围正确、面不越界、索引有效、Source Hash 匹配。MSH0 损坏或不匹配时必须丢弃并从 VOX0 重建,不影响资产权威性。
本章总结
MSH0 是可重复生成的编辑面计划。它优化“局部改一个方块后如何快速更新表面”,但永远不能代替 VOX0。