视觉加载事件与无骨骼模型动画状态

2026-09-20。将实际 Godot 静态模型加载过程接到 NativeRoomProperties 的加载前 / 加载后事件,并修正 owner 加载抑制时的旧模型释放及路径缓存顺序。

本批不是完整 622FB0 / CGenericModel 迁移:共享视觉模型池、完整渲染队列、骨骼动画播放和全地图注册仍待接入。武器构造覆盖仍为 1099 / 1419(273 阻塞、47 缺定义 / 创建等级),全武器目标未完成。

原版顺序与实现

重新核对原 622FB0、5A3350、5A2440、649690、624C10、624C30 和 5936B0。关键加载顺序:

  1. 路径与缓存完全相同时提前返回,不重新应用烘焙事件。
  2. 路径改变时先解除 / 释放旧视觉对象,再保存新路径并清空对象槽。
  3. 空路径直接结束。
  4. 然后检查 owner+388 指向对象的 byte+16 加载抑制门。
  5. 未抑制时,定义 NEVERBAKE 可以将视觉烘焙位清零、碰撞烘焙位置一。
  6. INVISIBLEBLOCKER 定义不创建可显示模型。
  7. 实际模型加载后,根据其动画状态应用加载后的烘焙转换。

因此,被抑制的一次新路径请求仍会释放旧模型、缓存新路径。之后解除抑制再请求同一路径,原相等判断仍然提前返回,不能擅自“补加载”。

NativeGodotModelInstance / NativeGodotRoomVisualBackend 现在按这些门连接实际释放、路径存储、加载和状态回调;HasVisualModel 在释放和成功加载时更新。清空、同路径、owner 抑制均不会多发加载前后事件。

现有严格预检仍属于迁移管线的 staging 边界:未导出 / 不支持的输入在破坏旧实例前报缺输入。不能把这个边界宣称为原 Ogre 所有加载失败、错误日志和异常行为的完整复刻。

原定义的 NEVERBAKE、INVISIBLEBLOCKER 已补入冻结元数据并通过原 DAT 源逐条核对。遮挡定义不会因为没有可显示资产导出而被误当作必须创建灰色模型的物件。

无动画状态必须有证据

不能因为同目录没有 ANIMATION 文件,或转换后的节点没有动画脚本,就报告原模型没有动画。

原正常 Room 构造路径的静态证据:

  • 5A3350 初始化 model+0x208 动画容器指针为 null,特殊 byte+0x256 为 false。
  • 5A2440 在正常模式下取 Entity 的 Skeleton;没有 Skeleton 时,跳过动画容器建立分支。
  • 622220 / 593720 的动画谓词读取实际容器指针及计数,不是文件名猜测。

新增 tools/build_native_visual_animation_facts.py,对已经准备好视觉导出的源 MESH 做结构预检:验证版本、chunk 边界、mesh skeletal flag 和 skeleton-link。只在受支持的 v1.40、明确无骨骼 flag 且无 skeleton-link 时,为正常新建 Room 模型提供无动画证明。

1181 个已准备视觉源数量处理
无骨骼证明成立1101可用于当前静态模型后端的零动画状态
带骨骼标志 / 引用73需要实际骨骼 / 动画运行时,不伪造 count=0
v1.41 网格7本扫描器尚未验证该版本,明确拒绝

7 个 v1.41 条目均为 Nether 资源。本批没有把它们改判为静态,也没有自动替换资产。

F2NativeVisualAnimationFacts 检查冻结视觉路径目录哈希、源模型哈希和证明条件。NativeGodotVisualCatalog 在创建静态实例前必须通过该证明;HasNativeAnimations 只对这个受支持路径返回 false,未知 / 外部释放的实例报错。

证明的范围是正常新建 Room CGenericModel,不包含特殊模式、之后外部修改 Skeleton、动画模型播放或完整原模型共享池。原 EXE / Ogre DLL 哈希写入报告并在生成时验证。

验证

  • 1792 条核心断言、382 项相关 Python 回归通过。
  • Godot C# 构建零 warning / error,coresimlint 通过。
  • 实际 GPU 生命周期检查从 26 项扩展至 33 项:同路径不重发烘焙事件、无骨骼源动画谓词、owner 抑制释放 / 缓存顺序、解除抑制后的同路径行为、变更请求后重新加载、实际 INVISIBLEBLOCKER、正式资源入口清空模型。
  • 实时碰撞属性探针 24 项重新通过,来源哈希已更新。
  • NEVERBAKE 字段与全部 4492 个现有定义一致;当前可用无骨骼视觉集合中没有原始 NEVERBAKE=true 资产,因此不宣称该分支已通过真实动画资产 GPU 验收。原字段转换和已有核心事件测试继续保留。

本轮重新查看 rock.webp、foliage.webp(build/native_visual_backend/,短边 512 / quality 80):纹理和叶片裁切可见,未见实心背景矩形。局部评分:COMP-FOCAL-SINGLE=2、COMP-SAFE-EDGE=2、COMP-NEG-SPACE=2、COMP-VALUE-GROUP=1、LIGHT-KEY-FILL=1、LIGHT-BLOOM-ABUSE=2;10/12,83.3%,B,无零分 / 硬门触发。暗部叶片分离偏弱属于受控预览照明;未调整正式地图光照。该核验不是原版全地图像素对拍。

产物与后续

主要代码:

  • tools/build_native_visual_animation_facts.py
  • core_sim.io/F2NativeVisualAnimationFacts.cs
  • torchlight-2-poc/NativeGodotVisualCatalog.cs
  • torchlight-2-poc/NativeGodotModelInstance.cs
  • tools/build_native_room_metadata.py / core_sim.io/F2RoomMetadata.cs

证据:build/f2/native_visual_animation_facts.json、build/native_visual_backend/result.json、build/native_live_room_result.json,以及 build/native_visual_bake_core.log、native_visual_bake_regression.log、native_visual_bake_build.log、native_visual_bake_lint.log、native_visual_bake_audit.log。

后续需要补真实共享 / 独占视觉模型生命周期、动画数据 / 播放与完整初始化事件,再组合条件分组和场景注册。当前仍不能把真实地图 LOS 或 TYPE201 / 204 标为完成。

按 godot-master 保持属性状态由逻辑所有者维护,显示后端只提供实际加载事件;补跑 GPU 图像验证。main 原地工作、未提交,没有 attach 原游戏。默认 warp_autosave.json SHA256 仍为 9840fe858b6e311c73f8c2d4ed49912d59d71365f6278392811730e012d32a7f。