第 18 章:编译器规范
编译器负责将 VF、编辑器内部模型或其他输入转换为合规 VFP。它的首要职责不是生成缓存,而是生成可被独立读取器无歧义恢复的权威资产。
18.1 VF 输入
VF 是推荐输入格式,通常为 JSON,但不是 VFP 的唯一来源。无论输入形式如何,编译器在进入 VFP 管线前必须得到下列规范化信息:
- 逻辑网格尺寸
gridSizeX/Y/Z; - 每个非空体素的整数坐标与颜色;
- 坐标系,或可转换为 VFP 右手坐标系的映射;
- 可选的资产 UUID、锚点、枢轴和展示建议。
编译器必须拒绝或明确修正:越界坐标、重复坐标、非有限数值、超过 255 的单轴尺寸、超过 255 种可引用颜色、无法确定的透明/空体素语义。不得静默截断、取模或依赖输入对象遍历顺序。
18.2 编译流程
合规编译器必须按逻辑依赖顺序完成:
- 解析输入并验证语义;
- 标准化坐标、空体素和颜色;
- 构建稳定 PAL0,保留索引 0 为空;
- 根据 META Chunk Size 切分网格并分配稳定 Chunk ID;
- 生成 CHIX 和每个 VOX0;
- 计算体素统计、META 和 Source Hash;
- 可选生成 SCNE、MSH0、VBUF、PMSH、RND0、ANM0、BORD、PRVW、THMB;
- 写入所有 Payload 并计算每个存储区段 CRC32;
- 写入 DIR0;
- 最后写入 Footer。
写入器应在写入完成后以独立读取逻辑重新验证 Header、Footer、Directory、权威区段、CRC32 和 Source Hash。
18.3 确定性生成
给定相同的规范化输入和编译选项,编译器应生成相同的权威区段字节和 Source Hash。至少必须固定:
- Palette 条目顺序;
- Chunk 切分和 Chunk ID 分配;
- CHIX Entry 排序;
- VOX0 线性顺序与 RAW8/RLE8 选择策略;
- Source Hash 输入;
- Directory Entry 排序(建议按 Payload Offset,再按 Tag/Chunk ID)。
资产 UUID、generator UUID、生成时间、缓存压缩实现和文件物理排列可不确定,但不得影响权威 Source Hash。若产品需要字节级可复现文件,应将这些字段固定或归零,并使用确定性缓存生成器。
18.4 输出要求
每个合规编译器必须至少输出 Header、META、PAL0、CHIX、全部 VOX0、DIR0 和 Footer。它必须:
- 将所有必需区段标记为
REQUIRED; - 按第 2 章执行 8 字节对齐;
- 为每个 Payload 与 Directory 写入正确 CRC32;
- 在 META 中写入与权威数据一致的统计和 Source Hash;
- 不引用未写入的区段或不存在的 Chunk;
- 在 Footer 中写入实际文件长度和当前 Directory 的精确位置。
输出缓存是可选的;输出任何缓存时,编译器必须写入适当的 Source Hash 关联并遵循对应区段规范。
本章总结
VFP 编译器把“可创作的体素描述”转为“可验证的体素资产包”。其最低成功标准是权威数据完整、可独立加载且可重建全部缓存。