原版碰撞资源缓存与材质面标志
后续更新:解析告警核查已完成282项解疑。当前2607代理/83986面全部严格加载,原446条容器长度异常保留为可追溯诊断。下方2325/282数字为首次导出时的历史状态。
本批继续在 main,未创建 worktree、未提交、未 attach 原版游戏。按 godot-master 的数据/表现分层,新增的是原始碰撞数据导出和 CoreSim.IO 加载,不用探针面标签冒充生产材质数据。
本批结果
- 遍历全部 *2607个原版显式 _COLLISION.MESH 代理,提取 83986个面。
- 2325个代理、74657个面通过严格加载和原版法线构建。
- 282个文件有原解析器告警,保留数据和告警,但严格加载器拒绝把它们当作完整可信几何。
- 材质字符串、子网格序号、原始面标志DWORD、最终byte、原始索引、来源路径和SHA256全部保留。
- C#加载器按已验证的反序索引和法线算法构建碰撞面,要求显式法线缓存精度。
这不是所有场景碰撞已经接通:没有代理时的视觉网格回落可按单资源导出,但本批全量统计只覆盖显式代理;实例选择、变换、分区和282项告警仍在后续。 武器构造覆盖保持 1053/1419(14成长),319个host/NG+待补、47个基础等级缺口。全武器目标未完成。
原版面标志生成
源库:E:/Torchlight 2/Torchlight2.exe.i64。 EXE SHA256:186472c3057b38f4cdff4696959a943c396ae6166995f7418997b5ea853e8a5e。
684790按子网格顺序处理:
- 将材质名经686740的C toupper转大写。
- 初始面标志为子网格序号。
- 如果包含NOCOLLIDE,置100,优先于其余名字。
- 否则按固定表顺序查找十个子串,第一个匹配项取映射值。
- 把同一DWORD写给该子网格的所有完整索引三元组。
- 468C00把DWORD的低8位存进面标志数组。
| 名称子串 | 值 |
|---|---|
| COLLISIONDIRT | 0 |
| COLLISIONSTONE | 1 |
| COLLISIONGRASS | 2 |
| COLLISIONWATER | 3 |
| COLLISIONSNOW | 4 |
| COLLISIONMUD | 5 |
| COLLISIONWOOD | 6 |
| COLLISIONGRAVEL | 7 |
| COLLISIONSAND | 8 |
| COLLISIONMETAL | 9 |
表由1B1CEA0初始化,值表在218602C。虽然初始化器还有第11个字符串COLLISION,684790的循环界限是0x118=10×28,不会扫描它。 因此纯COLLISION名称仍回落到子网格序号,不能一律映射成0;同一名字包含METAL和DIRT时,优先DIRT,与子串在名字里的先后位置无关。 非ASCII材质名暂不采用Unicode大小写转换假装C locale一致,而是明确报需要额外证据。
NOCOLLIDE不等于永远删除几何
NOCOLLIDE被编码为面标志100。CCollisionList构造器468930的默认skip surface是 100000,并非100。 显式碰撞代理中的100号面仍可能参与查询,是否跳过由调用路径设置的过滤值决定。
原版ZRPHTOWN_WALL_01_COLLISION.MESH的材质就是 multi_collision/nocollide。 本批实际导出/加载/射线验证:默认skip=100000时命中该代理;明确skip=100时不命中。 所以不能根据字符串NOCOLLIDE在导出阶段永久丢掉三角形,否则会把原版专用代理删空。
产物与运行方式
python -m tools.build_native_collision_cache --all-proxies
python -m tools.build_native_collision_cache --mesh MEDIA/.../MODEL.MESH输出在 build/f2/native_collision/,包含逐资源JSON和manifest。 单资源入口也允许没有代理时使用的视觉MESH,但调用方仍必须证明为何选这个资源,不能按名字猜代理。
F2NativeCollision.Load 验证schema、索引、面数、字节截断、来源格式、hash格式及默认skip值。 NativeCollisionAsset.BuildFaces 在显式PC=24/53/64输入下构建已验证的碰撞法线,保留原版index2/index1/index0顺序;不拿渲染顶点法线替代碰撞法线。
解析告警不能隐藏
282个资源触发了已有Ogre解析器的告警,例如chunk长度越过文件末尾后被截断。 本批没有把“脚本返回了顶点”当成“全部文件结构无误”。告警进入每个资源的parser_warnings和manifest的needs_parser_review,严格加载报 native_collision_parser_review_pending。
这些文件的原始数据仍被保留,后续要核对原版序列化/读取行为,区分无害尾部差异和真实几何缺失;本批没有为通过率删除告警或凭经验批准它们。
验证
build/native_collision_cache_build.log:2607模型/83986面/282待解析核查/0个导出异常。build/native_collision_cache_core.log:2325模型/74657面严格加载和法线构建通过;累计 1160条核心断言通过。build/native_collision_cache_python.log:84项来源、分类、字节、目录与既有回归通过。- Godot C#零warning/error;coresimlint通过。
- 原版十项材质值表直接与PE字节核对,所有导出子网格按分类规则重新校验。
- 本批没有新增场景渲染行为,未以旧游戏截图证明整场景LOS或攻击型proc可用。
- 默认存档SHA256保持
9840fe858b6e311c73f8c2d4ed49912d59d71365f6278392811730e012d32a7f。
剩余:282项解析告警、代理/视觉回落的实例选择、实例变换、分区候选、动态物件与实际线程精度;完成后继续接查询和Line Emitter伤害。不把资源导出数量当作全武器完成数量。