一款基于浏览器的《瑞奇与叮当》 (PS4, 2016) 关卡编辑器,完全基于逆向工程的游戏格式构建。
Python 工具将零售版 dump 解码为 glTF/PNG;Vite + Three.js 应用程序负责对其进行渲染、检查和编辑——并将修改写回游戏中。
## 图库
| | |
|:--:|:--:|
|  |  |
| **Veldin** — 完整的美术 + 玩法层,真实天空盒 | **Metropolis (Kerwan)** — 9 万个实例,剔除后呈现可游玩的城市景观 |
|  |  |
| **Pokitaru** — 主题半透明海洋 | **PS2 · Novalis** — *2002 原版* 游戏,同样包含在文件中 |
|  |  |
| **语义叠加层** — 碰撞体(绿色)、按用途分类的体积、滑索样条线 | **检查器 + 设置** — 对象变量、Gizmo、质量控制 |
更多 — 解码、编辑与导入
| | |
|:--:|:--:|
|  |  |
| `.model` → glTF(顶点、法线、UV、LOD、193 个关节) | `.texture` → PNG(BC7/BC5,PS4 untiling,mip 流) |
|  |  |
| 生成并使用 Gizmo 变换任何 actor,保存至 mod overlay | 导入 OBJ/FBX — 在游戏中生成真实的 `.model` + `.texture` |
## 功能说明
- **渲染全部 29 个发布关卡** — 包含 17 个重制版星球(美术 + 玩法 + 天空盒)、Veldin 被删减的早期布局,以及内置于 PS4 文件中的 **11 个 PS2 原版**关卡 — 全部基于零售版 dump,在浏览器中以 60 fps 运行。
- **忠实还原视觉效果** — 解码模型与纹理、逐实例视锥体/距离剔除、mipmap + 各向异性过滤 + 可选的 SSAA、跟随相机的天空盒,以及语义着色(碰撞体、水域/岩浆/滑索体积、白盒网格、生成点)。
- **全面检查** — 点击任意对象即可查看其 transform、模型、材质、烘焙光照色调,以及游戏自带的带类型**变量**(板条箱螺栓数量、供应商升级标志、检查点名称、传送目标等)。
- **真实编辑** — transform gizmo、可搜索的变量编辑器、可从整个 actor 目录中进行复制/生成、带有自动纹理映射的 OBJ/FBX 导入,以及带有表面标志的**生成的 Havok 碰撞体** — 所有这些都会被写回一个非破坏性的 **mod overlay**(`toc` + `mods000`)中,游戏会像加载原生资产一样加载它。原始 dump 绝不会被修改。
一切都经过了端到端验证:编辑、生成、导入和碰撞体均通过游戏自带的 TOC 解析路径实现字节级精确的往返。
## 快速开始
你需要自行提供游戏文件(一份解密后的零售版 PS4 dump — 即包含 `layout.csv`、`toc` 和归档文件的 `asset_archive/`)。将 `tools/rcdb.py` 中的 `DEFAULT_ROOT` 指向该目录。
```
# Python codecs (Python 3.11+)
pip install lz4 pillow texture2ddecoder numpy
# 导出关卡库 -> GLBs + picker 索引
cd rcedit
python -m tools.export_all editor/public/data
# 运行编辑器
cd editor
npm install
npm run dev # http://localhost:5173
# (可选)编辑后端 — 启用 Save mod / Import / 变量
python -m tools.serve_api # http://localhost:8791
```
**视口:** 鼠标左键旋转 · 鼠标右键平移 · 滚轮缩放 · WASDQE 飞行(Shift = 加速) · 点击选择 · **G/R/X** gizmo · **V** 复制 · **F** 聚焦。
**设置 ⚙:** 叠加层(默认关闭,可按类型开启)、mipmap、LOD/剔除、天空盒、抗锯齿 (SSAA)、绘制距离 — 所有设置均可持久化保存。
## 工作原理
分为三层,以及一个通用容器:
1. **归档 + TOC。** 资产存放于大型归档文件中,由 zlib 压缩的 `toc`(magic 为 `AF 12 AF 77`)进行索引。dump 中的 `layout.csv` 将资产路径映射到 归档/偏移量/大小。
2. **单资产压缩。** 每个构建好的资产都是位于 `0x24` 字节头(类型哈希、解压后大小、次要大小)之后的标准 **LZ4 block**。
3. **DAT1 容器。** 每个解压后的资产 — `.level`、`.zone`、`.model`、`.texture`、`.material`、`.actor`、`.animset` — 都是一个 `1TAD` 分区容器。以 CRC32 哈希命名的分区(在 `tools/*.py` 中进行了映射)使得单一解析器即可解锁所有文件类型。
**`.level`** 是区域/范围/链接的清单;而 **`.zone`** 包含实际内容 — 模型实例(4×4 transform、模型索引、色调、逐顶点烘焙光照)、actor 放置、触发体积、脚本变量,以及路径/滑索控制点。
### 已逆向并实现的功能
| 领域 | 状态 |
|---|---|
| 模型 | ✅ 顶点(int16 ÷ 定点指数)、法线、半精度浮点 UV、u16 索引、LOD 表、材质、193 个关节 |
| 纹理 | ✅ BC7 / BC5 / BC1 / BC4 / RGBA8,PS4 1D-thin untiling,`.stream` 高清 mip |
| 区域 | ✅ 模型实例、actor 放置、带类型的体积、路径样条线、烘焙光照色调 |
| 配置数据 | ✅ 递归类型字典 (`prius`) 解析器 — 每个游戏变量均可检查并进行标量编辑 |
| Havok 碰撞体 | ✅ **完整的** `hkBinaryPackfile` 解析器(字节精确往返) + 一个将真实已烘焙碰撞体重新映射到 AABB 的写入器,并带有表面标志 |
| 动画集 / 影视动画 | ✅ 通过 CRC 进行片段枚举 + 基础姿势四元数 + 关键时间(逐帧曲线插值为 WIP) |
| 重新打包 | ✅ 非破坏性 mod overlay(LZ4-HC → `mods000` + 修补后的 `toc`),已通过 TOC 路径验证 |
| 导入 | ✅ OBJ (+MTL) & 二进制 FBX → 真实的 `.model` / RGBA8 `.texture`,已在游戏中放置并生成碰撞 |
完整的完整技术日志请见 [`docs/FORMATS.md`](docs/FORMATS.md)。
## 仓库布局
```
rcedit/
tools/ Python codecs & CLIs (python -m tools.
)
rcdb.py layout.csv index + archive reader + LZ4 decompress
dat1.py DAT1 ('1TAD') container parser
model.py .model decoder texture.py .texture decoder
zone.py .zone decoder prius.py typed-dict (variables) parser
havok.py Havok packfile reader + collision writer
anim.py animset / cinematic clip decoder
toc.py repack.py assetid.py archive index + mod overlay + asset-id resolution
zone_edit.py spawn / clone / grow zones import_mesh.py OBJ/FBX import
export_*.py model/zone/level -> glTF serve_api.py editing HTTP bridge
test_*.py repack / spawn / import verification suites
editor/ Vite + Three.js app ("RCEdit")
src/main.js renderer, culling, gizmos, overlays, settings
public/data/ exported GLBs + index.json (git-ignored)
docs/ logo, screenshots, format notes
```
## 路线图 / 已知缺漏
- 逐帧动画与影视动画曲线插值(基础姿势已解码;增量流为 WIP)。
- Materialgraph 多层混合(目前仅支持主 albedo 槽位)。
- 烘焙光照是基于实例的色调;完整的逐顶点 GI 重映射是基于实例的样本集,尚未解码。
- 铸造*全新*的资产 ID(运行时的 路径→id 哈希是 Insomniac 专有的哈希算法;新内容通过 donor-overlay 机制发布)。
- 编辑器内的 transform gizmo → mod 已连通;完整的时间轴/过场动画创作 UI 属于未来的工作。