跳到主要内容

第 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 组成。

OffsetSizeTypeFieldDescription
02uint16meshVersion必须为 1
22uint16headerSize必须为 48
44int32chunkId对应 CHIX Chunk
84uint32faceCountFace Record 数量
124uint32faceSize必须为 16
1632uint8[32]sourceHash生成时的权威 Source Hash

Face Record:

OffsetSizeTypeFieldDescription
01uint8axis法线方向:0=+X1=-X2=+Y3=-Y4=+Z5=-Z
11uint8paletteIndex对应 PAL0 索引
21uint8plane面所在局部平面坐标
31uint8u面二维坐标 U 起点
41uint8v面二维坐标 V 起点
51uint8widthU 方向尺寸,1..255
61uint8heightV 方向尺寸,1..255
71uint8flagsVFP 1.3 必须为 0
88uint8[8]reserved必须为全零

Payload 总长度为 48 + faceCount × 16

9.2 面坐标解释

Face Record 使用局部 Chunk 坐标。axis 决定 (plane,u,v) 映射:

axisplane 轴U 轴V 轴
0 / 1XZY
2 / 3YXZ
4 / 5ZXY

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。