原版碰撞代理解析告警核查

本批结论

282个待核查代理全部解疑。它们没有丢失顶点或索引,而是v1.40的M_MESH/M_SUBMESH声明长度超出实际EOF。全量2607个显式碰撞代理经独立OgreXMLConverter对照后,严格加载现为 2607模型/83986面/0个待解析核查,比前批增加282模型、9329面。

这只关闭了这批资源解析缺口,不代表整场景LOS或全武器已经完成。武器构造覆盖仍为 1053/1419(14成长);319个host/NG+处理待补、47个基础等级缺口保持不变。

为什么可放行

对前批282个文件的所有告警偏移直接读取原文件chunk头,得到:

异常chunk条数
M_MESH 0x3000164
M_SUBMESH 0x4000282
顶点/索引等叶子数据越界告警0

共446条容器长度异常,分布于282个文件。

Ogre v1-7-0 的 MeshSerializerImpl.cpp 中,v1.40继承的readMesh/readSubMesh通过子chunk类型与显式计数读取,不把容器声明末尾当作内容终点。readSubMesh先按indexCount读取索引;非共享顶点再读取自己的M_GEOMETRY。readGeometryVertexBuffer按vertexCount×vertexSize读取数据。

这说明容器长度异常不能直接等同于有效载荷缺失,但源码本身不能证明具体文件完整。因此另做全量实际文件交叉核对,不只是抽样放行。

例:CATACOMB_SKULL_CONVEX_01_COLLISION.MESH实际5914字节:

  • M_MESH从25开始,声明6072字节。
  • M_SUBMESH从5528开始,声明646字节。
  • 150个16位索引实际完整结束于5866。
  • 随后是0x4010、0x9000、0xA000;最终恰好到EOF。
  • OgreXMLConverter成功导出完整共享几何和50个面。

独立对照及精度边界

运行:

text
python -m tools.build_native_collision_cache --all-proxies
python -m tools.audit_collision_parser --all-proxies

审计工具为每个源资源显式指定build/collision_parser_review下的XML与日志路径,不改写原版MEDIA。

对全部2607个代理比较:

  • 顶点数、子网格数、材质名、索引序列:逐项完全一致。
  • 顶点坐标:按XML有限小数输出,rel_tol=6e-6、abs_tol=1e-6;不宣称浮点逐位一致。
  • XML侧独立解析共享/局部顶点并重定位局部索引,不复用我们的二进制解析器。
  • 结果:0个模型存在差异/转换失败
  • 报告保存转换器、审计脚本、解析器、manifest、每个源MESH、每个缓存及XML的SHA256;测试检查报告与当前产物一致,防止旧报告误通过。

转换器是仓库已有DEV-RELATED/OgreXMLConverter.exe,SHA256: 542a1e6fa4d65481705c11597896c3c2b59dbc321d0425ae838c194c61cb9dc0

限制:转换器不是正在运行的Torchlight2.exe;这是旧版官方读取契约加独立序列化器对照,不是原版游戏动态加载探针,也没有证明转换器与游戏自带Ogre DLL逐位同版。

代码修复与错误边界

parse_ogre_mesh_full增加可选strict模式,碰撞缓存构建固定启用:

  1. 仅v1.40的M_MESH/M_SUBMESH超出EOF归入container_length_anomalies,保留kind、chunk ID、偏移、声明长度和实际文件大小。
  2. 其他chunk越界、尾部残缺chunk头、短顶点声明/缓冲头/子网格头、顶点数据不足或大小不符,严格模式报错。
  3. 顶点位置数量不符、缺失或不支持的位置格式、越界索引,严格模式报错。
  4. parser_warnings仍独立保留;C#加载器继续拒绝任何未解决告警。没有用无条件忽略告警来提升覆盖率。
  5. 旧渲染调用保留四元组API与默认容错方式;新增诊断通过full接口返回,不改场景美术或存档。

这不是通用Ogre解析器的完整重写。现有扁平解析器对任意混合共享/局部几何、其他版本/扩展格式的支持仍不可由本次代理全集对照外推。新增strict校验是有效载荷完整性检查,不是完整格式规范验证。

验证与产物

  • build/collision_parser_review/report.json:2607模型,0失败;446条长度异常仍在缓存中可追溯。
  • build/collision_parser_core.log:1161条核心断言通过;2607代理/83986面严格加载和碰撞法线构建成功。
  • build/collision_parser_python.log:111项相关检查通过,含原地图解析回归。
  • 新增合成损坏夹具覆盖短顶点数据、索引缺失/越界、坏头、缺位置、额外缓冲数据、未知叶子越界;其他版本不享受v1.40容器豁免。
  • C#加载器以合成未解决告警缓存验证继续拒绝。
  • Godot C#构建0 warning/0 error;coresimlint通过。
  • main原地工作,未提交、未attach原版;默认存档SHA256仍为 9840fe858b6e311c73f8c2d4ed49912d59d71365f6278392811730e012d32a7f

按godot-master的数据/表现分层,本批只处理资源数据和加载验证,不以已有截图作为新运行时验证。

下一条实际链路

后续核查更新:Room Piece原版选择证实该类型没有隐式视觉回落;只取COLLISIONFILE列表。下方“代理/视觉回落”是当时待验证的问题,不是已确认的Room Piece规则。

继续查原版 代理/视觉网格回落的实例选择 → 实例局部变换 → 分区候选 → 房间/动态物件遮挡,再接攻击型proc和Line Emitter伤害。实际线程精度和完整场景全集仍需证据;资源导出数量不是全武器完成数量。