静态模型资源后端与真实材质上下文
语义更正:动态行走网格贡献与旧位置恢复确认 622C20 更新的是导航贡献,不是攻击射线世界注册。以下相关表述已更正;原批次资源加载结果仍有效。
本批结果
把真实静态网格/材质接到了原版资源生命周期和上一批的 Godot 节点后端,不再由“文件存在”模拟视觉模型加载成功。
新增:
- F2NativeVisualPaths:原始视觉路径到现有完整属性 ArrayMesh 的绑定。
- NativeGodotVisualCatalog:通过 Godot SceneState 读取指定地图的实际 Mesh/材质资源。
- NativeGodotModelInstance:实际 MeshInstance3D 的加载、路径缓存、替换、清除与查询分类位。
- NativeGodotRoomVisualBackend:连接 NativeRoomResourceLifecycle 与实际模型;动态行走贡献刷新必须另行提供真实回调,射线世界注册是独立环节。
- NativeGodotSceneBackend.ReleaseStoredObject:替换模型时释放挂载物,保留所属节点。
GPU 探针 19 项检查通过;从 echopass_lm.tscn 读取 181 个模型/材质原型,没有发现同键材质歧义。实际加载并观察了岩石与镂空灌木。核心累计 1,367 条断言、203 项相关 Python 回归通过,Godot C# 构建零警告、零错误,coresimlint 通过。
这是静态资源后端的进展,不是全部模型、全部地图或全武器完成。
全视觉路径清单
来自现有 4,492 个原版 Room Piece 定义的 FILE 列表,按原始完整路径去重:
| 状态 | 数量 | 含义 |
|---|---|---|
| prepared | 1,181 | 解包源文件与当前转换出的 ArrayMesh .res 都存在 |
| missing_export | 4,721 | 有解包源,但尚无对应完整属性 .res |
| missing_extracted_source | 555 | 当前解包目录没有对应源文件 |
| 总计 | 6,457 | 原版定义中的不同视觉路径 |
prepared 只是当前绑定可用,不是网格转换逐项等价、材质齐全或 GPU 全量验收。
missing_extracted_source 不能被当作原游戏 PAK 中不存在的证明,也不删除这些定义。后续需逐项核对原文件名、包内来源及遗留定义。
绑定直接复用 parse_layout 的完整相对路径规则,并锁定 .res。不会因缺少导出而退回丢失顶点属性的 OBJ,或创建灰色占位模型。记录源文件和转换资源 SHA256,运行时首次使用时复查资源指纹。
材质读取不执行地图脚本
NativeGodotVisualCatalog 使用 ResourceLoader 加载 PackedScene,再读取 SceneState,不实例化整张地图,因此不会为收集材质而执行地图逻辑、天气、单位或存档流程。
原型以“原版 GUID + 完整转换网格路径”为键,保留:
- 已导入的 Mesh 资源。
- 每个表面的实际覆盖材质,或网格自带材质。
- 来源地图和节点路径。
- 动画标记,用于明确拒绝尚未接入动画后端的模型。
不复制地图实例的点光源参数、位置或其他实例状态。材质仍来自明确的地图上下文,不能随意取另一区域的同名材质。
同键出现不同材质资源、整材质覆盖或 overlay 时标记歧义;缺少表面材质、缺动画后端、缺对应原型时明确报错。不能只拿第一个“看起来能用”的结果。
共享的 Mesh 和材质保持只读,新建的是实例节点。没有在此批重新实现或简化原材质编译器,因此已有 Room Piece FFP 着色器、镂空阈值和纹理采样设置得以保留。现有转换管线的已知局限也仍然存在,不能由一次成功加载推导为原版像素级等价。
真实加载和缓存
正常路径:
- GUID/VISUAL setter 更新定义与变体输入,不创建视觉节点。
- NativeRoomResourceLifecycle.Initialize 解析视觉选择。
- 静态模型后端查找明确的资源/材质上下文。
- 创建实际 MeshInstance3D 并挂到 NativeSceneAttachment 对应的节点。
- F2 资源宿主读取独立的 COLLISIONFILE。
- 设置模型查询分类位。
模型路径比较保持 ordinal。相同路径不会重新加载或替换实例;空路径清除视觉模型。替换时通过节点后端释放旧挂载物,而不是把陈旧对象继续留在 handle 表里。
未知导出/材质上下文属于移植端缺输入,会在破坏已有有效实例之前报错。这是明确的 staging 诊断边界,不是对原游戏资源加载失败及所有析构时机的等价声明。
已应用实际节点的 RENDERSHADOW 状态。完整 CModel 构造、动画、共享模型池、视觉烘焙和完整渲染队列映射仍需继续接入。
模型参数 +48 是查询分类位
本批沿原版继续确认:
- 6234B0 最后把定义 +48 传给 5936F0。
- 5936F0 写入 CModel +552,并调用实际 Entity 虚表 +140。
- Entity 的 MovableObject 主虚表地址为 1038A8F4,+140 指向 100A0B30。
- 100A0B30 是 MovableObject::setQueryFlags,写入对象 +64。
定义加载的 ROOM 值为 16,其他 COLLISIONTYPE 为 32。它不是渲染层,也不是渲染距离。
实际模型后端现在保留 uint 查询标记,并提供位掩码匹配。GPU 探针检查 ROOM 模型匹配 16、不匹配 32,同时 Godot 渲染 Layers 仍为 1,避免错误改变摄像机可见范围。
这仍不是完整世界查询:真正的世界对象集合、查询顺序、空间分区和后续精确碰撞测试必须一起接入。
碰撞数据加载不等于世界注册
原 622360 是碰撞模型的缓存/加载入口。它不会在末尾无条件调用 622C20;没有为了让测试“看起来完整”而插入额外刷新。
622C20 是动态导航贡献入口,涉及已应用字节 +453、所属 CLevel、可见性、旧位置和网格字节计数增减。5F4730/5F4AE0 内部还准备空间候选并查询几何;它们不是向射线世界注册物件。当前后端要求宿主显式提供该动作,不能缺省为成功空操作。
本批 GPU 案例确实经同一次资源初始化加载了 ROCK_03_COLLISION.MESH 的原生数据:42 顶点、14 面。替换到灌木时也按它自己的碰撞列表选择资源,而不是借用视觉网格。这里只证明资源数据链路,不证明已经参与世界攻击遮挡。
探针专门提供一个会抛出“缺导航贡献上下文”的回调,并验证异常会保留。报告中的 native_world_collision_registered 仍为 false,它与该回调是两项不同边界。
GPU 与生命周期检查
独立 GPU 进程使用原项目中的现有模型、纹理和着色器,不加载主场景或存档。
实际资源:
| 对象 | GUID | 网格 |
|---|---|---|
| rock_03 | 6649892616629195231 | meshes/props/z1tundra_props/rock_03.res |
| bush_dead_03 | -5306004450218798625 | meshes/props/z1tundra_props/bush_dead_03.res |
19 项检查包含:
- SceneState 收集不执行地图脚本。
- setter 与初始化时机分开。
- 真正创建可见的 MeshInstance3D,表面材质与指定原型一致。
- 实际 diffuse 纹理已绑定。
- 阴影开关和查询分类位正确落到模型。
- 对应碰撞资源实际读取。
- 同路径不重复加载。
- 缺导出时不破坏已有有效模型。
- 需要导航贡献刷新时不把缺上下文吞成成功。
- 模型替换释放旧对象;清空与最终清理不留下自有挂载物。
- 保留灌木的 scissor 着色器。
- 两次 GPU 截图均成功生成。
源指纹包含本次使用的场景、网格、着色器、纹理及纹理导入设置。它们服务于重复验证,仍不取代完整原版转换等价审计。
上一批节点后端的 21 项检查及 4,848 姿态案例也重新运行通过。
局部视觉核验
已实际查看:
- build/native_visual_backend/rock.webp。
- build/native_visual_backend/foliage.webp。
预算:短边 512,WebP quality 80。预览关闭 projector,并设置明确的测试光照,不把这套光照当作 ECHO PASS 的真实昼夜状态。
观察:岩石有棕黄纹理与底部苔色,未显示为灰色缺材质;灌木叶片轮廓镂空,背景可从叶间透出,没有不透明背景方块。单物体的明暗层次仍偏软,这是预览照明与原低分辨率贴图下的局部表现,不据此调整正式场景曝光。
Taste Receptor Atlas 局部评分:
| 项 | 分数 |
|---|---|
| COMP-FOCAL-SINGLE | 2 |
| COMP-NEG-SPACE | 2 |
| COMP-SAFE-EDGE | 2 |
| LIGHT-KEY-FILL | 1 |
| LIGHT-BLOOM-ABUSE | 2 |
9/10(90%,A);无零分项。TYPE/UI/战斗动效不存在于这些裁图中,未评分。此评分仅用于资源接线与局部可见性,不是原游戏对拍或整体美术验收。
验证产物
- build/f2/native_visual_paths.json。
- build/native_visual_backend/result.json、run.log。
- build/native_visual_backend/rock.webp、foliage.webp。
- build/native_visual_backend_core.log:1,367 断言。
- build/native_visual_backend_python.log:203 项相关 Python 回归。
- build/native_visual_backend_build.log:构建通过。
剩余
下一步继续 622C20 的动态导航贡献及其包围盒/查询依赖;射线世界对象集合、候选与分区另行接入。同时补齐未导出模型、动画模型和完整实例装载,随后继续攻击型 proc 与全武器验收。
本批没有替换正式地图,也没有将碰撞“已加载”标成“已注册”。武器可构造覆盖仍为 1,053/1,419,全武器目标未完成,快照 v29 未改。
godot-master 的资源分层与视觉核验要求使本批复用了现有完整材质资源,并加入真实 GPU 截图检查;没有引入一套简化 PBR 替代原渲染链。
main 原地工作,未提交、未 attach 原游戏。默认存档 SHA256 未变: 9840fe858b6e311c73f8c2d4ed49912d59d71365f6278392811730e012d32a7f。