三角形内部与完整单三角射线:原生机器码对照
本批继续在 main,未创建 worktree、未提交、未 attach 原版游戏。按 godot-master 将碰撞数值保留在 CoreSim;没有用 Godot 的近似射线替换尚未接齐的原版链路。
实际完成
- 移植466E90三角形内部判断,包括原版 Ogre Vector3 减法、叉乘、点乘及float写回位置。
- 在前批平面核之上组合包围盒、单面穿越、平面交点、三角形内部判断、Ogre length/x87 FSQRT和99999距离上限。
- 三种 x87 PC 精度下:9081次内部判断、5595次完整单三角网格射线对照,均0差异。
- 新增56个原版墙/桥/石头碰撞网格顶点样本;探针面法线为显式构造,原版预计算法线缓冲区导入仍独立待补。
- 完整场景候选、动态物件和Line Emitter执行尚未完成,不能把单三角核等同整场景LOS。
构造覆盖保持 1053/1419(14成长),319个host/NG+待补、47个基础等级缺口。全武器目标仍未完成。
两个独立原生对照工具
固定来源:
- Torchlight2.exe SHA256:
186472c3057b38f4cdff4696959a943c396ae6166995f7418997b5ea853e8a5e - OgreMain.dll SHA256:
974c1dc77ea2818276cc7eb94a8b95b2ccf8595e28fa3f14b2cd6d516fdb67a1
native_triangle_oracle.c 执行发行EXE的466E90,所调用的向量函数也来自发行OgreMain.dll的原始代码页;不是C重写向量运算。 native_mesh_ray_oracle.c 执行原版467600→467000完整单三角路径,包括原版包围盒与长度计算。
工具只在自己的32位进程里映射所需代码、常量和导入槽,不启动游戏,不加载整套Ogre/渲染器,不注入外部进程。 低地址曾与ASLR进程堆冲突,修复后将相关EXE代码区域一起平移0x30000000,保持相对CALL位移;机器码字节没有修改。绝对常量和导入槽保持原地址,导入槽指向拷贝的原始Ogre函数。
生成结果包含输入文件、测试程序及来源代码hash。生成失败不能用旧结果宣布通过。 本批遇到的映射冲突已实际重建重跑,最终结果来自成功的新运行。
python -m tools.build_native_ray_oracle
python -m tools.build_native_triangle_oracle
python -m tools.build_native_mesh_ray_oracle
dotnet run --project core_sim.tests三角形内部公式与写回
令三角形为a/b/c,原版缓存法线为n,待检验点为p。用原版Ogre运算顺序:
e1 = f32_vector(b - a)
e2 = f32_vector(c - a)
cross = f32_vector(n × e2)
den = f32(dot(e1, cross))
q = f32_vector(p - a)
u = dot(q, cross) // 先保留x87寄存器值参与比较
检验 0 <= u <= den
v = dot(n, f32_vector(q × e1))
检验 0 <= v 且 v + f32(u) <= den这里的 f32_vector 表示每个分量经过原版向量返回值写回。最终求和重新读取f32(u),不能直接使用前面未写回的u。
边/顶点是闭区间。内部判断本身不确认点在平面上,平面是前面的独立门;不能给这个函数偷偷增加平面epsilon判断。 无效/退化几何的AH条件码行为也不应被通用“安全修复”覆盖。原版比较在部分unordered中间值下会通过,测试包含有限输入导致内部Inf/NaN的情况。
测试输入使用明确提供的缓存法线,不以渲染网格的平滑顶点法线替代;也不把探针构造法线的方式声称为已完成原版预计算缓存导入。
完整单三角射线
467600先构造射线AABB,再进入467000:
- 三角形数量/网格整体AABB;
- 面过滤/面AABB;
- 683800分类与单面穿越门;
- 6838C0平面交点;
- 466E90内部判断;
- Ogre向量差写回、X²+Y²再加Z²、x87 FSQRT;
- 与当前最近距离比较,并写回float结果。
本批的组合核针对一张三角形、未跳过的面。完整多面循环、分区候选与材质/面标志仍要接。 原版最近距离的初始哨兵是99999,比较发生在距离float写回之前;因此多面情况下,不能简单比较两个已四舍五入的float结果来决定先后。本批未用这样的简化冒充完整多面查询。
输入1865组,包括距离99998/99999/100000的边界,对照总计5595次。返回命中状态、点坐标的32位模式与距离的32位模式均一致。
原版网格样本
样本直接读取:
| 原始资源 | 三角形数 |
|---|---|
| ZERAPHI_TOWN/ZRPHTOWN_WALL_01_COLLISION.MESH | 2 |
| ZERAPHI_TOWN/ZRPHTOWN_BRIDGE_MID_01_COLLISION.MESH | 42 |
| ZERAPHI_TOWN/ZRPHTOWN_STONE_03_COLLISION.MESH | 12 |
每条样本保存原始路径、SHA256及面序号。法线明确标记为 probe-generated reverse-cross normal。 这证明了组合核能处理这些真实顶点输入,不证明当前场景已经读取了全部原版碰撞代理/变换/法线与材质标志。
验证
build/native_triangle_core.log:累计 1151条核心断言通过。- 前批平面核9063次、内部判断9081次、完整单三角射线5595次原生对照均零差异。
- 内部判断的3027组输入中有527组随精度改变结果,不能用一种默认精度替代三种模式。
build/native_triangle_python.log:77项源码/机器码/F2/既有相关检查通过。- Godot C#零warning/error,coresimlint通过。
- 本批没有新增游戏画面行为,不以旧场景截图证明完整遮挡或闪电链已完成。
- 默认存档SHA256保持
9840fe858b6e311c73f8c2d4ed49912d59d71365f6278392811730e012d32a7f。
剩余:多面/分区遍历、真实碰撞数据及预计算法线、对象变换与面标志、实际线程精度、动态物件、完整激活输入及Line Emitter伤害。下一批继续整合,不把数学部件完成扩大成所有武器完成。