LambdaEd1th/badpiggies-editor
GitHub: LambdaEd1th/badpiggies-editor
基于 Rust 和 wgpu GPU 加速渲染的 Bad Piggies 关卡编辑器,支持二进制关卡解析、可视化编辑和多格式互转,同时提供原生桌面与浏览器端双平台运行能力。
Stars: 1 | Forks: 0
# Bad Piggies 编辑器
一款用于 **Bad Piggies** 手机游戏的原生桌面(及 WASM)关卡编辑器,使用 Rust 构建并采用 GPU 加速渲染。
[](https://www.rust-lang.org)
[](../LICENSE)
## 功能
- **关卡解析** — 完整的二进制 `.bytes` 关卡格式解析器,还原了原始的 Unity `LevelLoader.cs`
- **GPU 渲染** — 通过 [wgpu](https://wgpu.rs) 使用自定义 WGSL 着色器处理所有可视化图层
- **地形** — 使用 splat 映射纹理的填充网格和边缘/曲线网格
- **背景** — 10 种视差主题(Jungle、Forest、Plateau、Night、Halloween、MayaCave 等)
- **精灵图** — 支持使用 `RuntimeSpriteDatabase` 和 `CartoonFrameSprite` 进行图集渲染
- **复合对象** — 具有子精灵图合成功能的多部件对象(风扇、电机、铰链、箱子等)
- **性能** — 视锥体剔除与 GPU 绘制调用批处理(每种着色器类型每帧一次渲染通道)
- **属性面板** — 可编辑的对象属性及覆盖树
- **撤销 / 重做** — 完整的基于快照的撤销/重做历史记录 (⌘Z / Ctrl+Z, ⇧⌘Z / Ctrl+Y)
- **多格式 I/O** — 支持将关卡导入/导出为二进制 `.bytes`、YAML 或 TOML 格式
- **CLI** — 支持 `.bytes` / `.yaml` / `.toml` 之间的命令行格式转换
- **i18n** — 中英文用户界面,根据系统语言环境自动检测
- **跨平台** — 原生桌面 + WASM 浏览器构建
## 环境要求
- Rust 1.85+(2024 版本)
- 原生环境:支持 Vulkan / Metal / DirectX 12 / OpenGL ES 3.1 的 GPU
- WASM 环境:[Trunk](https://trunkrs.dev) — `cargo install trunk`
## 快速开始
### 原生环境
```
cargo run
```
发布版本构建:
```
cargo build --release
```
编辑器会在可执行文件旁边的 `assets/` 目录中查找游戏资源纹理。本代码库附带预先提取的 `assets/` 纹理。
### WASM(浏览器)
```
trunk serve
```
然后在浏览器中打开 `http://localhost:8080`。
## 使用方法
### 图形用户界面 (GUI)
1. **打开关卡** — `File → Open Level File…` 或将 `.bytes` / `.yaml` / `.toml` 文件拖放到画布上
2. **导航** — 滚动鼠标滚轮进行缩放,在空白画布上拖动进行平移
3. **选择对象** — 点击画布上的任何精灵图或地形
4. **编辑属性** — 使用右侧的属性面板修改对象字段和覆盖属性
5. **撤销 / 重做** — `Edit → Undo / Redo` 或使用键盘快捷键
6. **切换面板** — `View → Object List / Properties / Physics Ground`
7. **切换背景** — 按 `B` 键或点击 `View → Hide/Show Background`
8. **导出关卡** — `File → Export Level / Export as YAML / Export as TOML`
9. **导入文本格式** — `File → Import YAML/TOML…`
10. **切换语言** — `View → Switch to 中文 / English`
### CLI
该可执行文件同时也可作为命令行格式转换器:
```
# 将 binary 转换为 YAML
badpiggies-editor convert level.bytes level.yaml
# 将 YAML 转换为 TOML
badpiggies-editor convert level.yaml level.toml
# 将 TOML 转换回 binary
badpiggies-editor convert level.toml level.bytes
# 显示 help
badpiggies-editor --help
badpiggies-editor convert --help
```
CLI 消息会根据系统语言环境进行本地化。
## 项目结构
```
editor/
├── src/
│ ├── main.rs # Entry point (native + WASM)
│ ├── app.rs # egui application, menus, panels, dialogs
│ ├── locale.rs # i18n via fluent-bundle (zh-CN / en-US)
│ ├── parser.rs # Binary .bytes level file parser / serializer
│ ├── types.rs # Data structures (LevelData, TerrainData, PrefabInstance, …)
│ ├── assets.rs # Embedded asset loader (rust-embed)
│ ├── sprite_db.rs # Runtime sprite database
│ ├── bg_data.rs # Background theme data
│ ├── level_refs.rs # Level object reference tables
│ └── renderer/
│ ├── mod.rs # Main render loop, frustum culling, batch collection
│ ├── terrain.rs # Terrain mesh generation
│ ├── fill_shader.rs # Terrain fill wgpu shader + texture cache
│ ├── edge_shader.rs # Terrain edge/curve wgpu shader
│ ├── sprite_shader.rs # Transparent sprite batch shader
│ ├── opaque_shader.rs # Opaque (Props) sprite batch shader
│ ├── bg_shader.rs # Parallax background wgpu shader
│ ├── background.rs # Background layer rendering logic
│ ├── compounds.rs # Compound object sub-sprite definitions
│ ├── sprites.rs # Sprite atlas GPU resource management
│ └── grid.rs # Editor grid overlay
├── assets/ # Game assets — all embedded at compile time (rust-embed)
│ ├── bg/ # Background layer textures
│ ├── ground/ # Terrain fill textures
│ ├── props/ # Props atlas textures
│ ├── sky/ # Sky textures
│ ├── sprites/ # Sprite atlas textures
│ ├── particles/ # Particle textures
│ ├── bg-data.toml # Background theme metadata
│ ├── sprite-data.toml # Sprite atlas UV / sizing data
│ └── level-refs.toml # Level object reference tables
├── locales/ # Fluent translation files (embedded via include_str!)
│ ├── zh-CN.ftl # Chinese (Simplified)
│ └── en-US.ftl # English
├── index.html # WASM host page
└── Cargo.toml
```
## 技术细节
### 渲染管线
所有渲染均通过 `egui` 的 `PaintCallback` 机制完成,这使得自定义 wgpu 渲染通道能够与 egui UI 无缝集成。
| 着色器 | 用途 |
|---|---|
| `fill_shader` | 地形填充网格(平铺纹理,z = 0) |
| `edge_shader` | 地形边缘/曲线网格(alpha 混合,z = -0.01) |
| `sprite_shader` | 透明精灵图(批处理,每帧一次渲染通道) |
| `opaque_shader` | 不透明 Props 精灵图(预构建图集批次) |
| `bg_shader` | 视差背景图层 |
### 关卡二进制格式
`.bytes` 格式是 Unity 游戏使用的自定义二进制格式:
- 字符串为带有长度前缀的 UTF-8
- 坐标为 `f32` 小端序
- 颜色为 `u32` 打包的 RGBA(非 `float4`)
- 索引为 `i16`
- 父节点存储 `childCount + name + position`
- Prefab 实例存储完整的 `transform + data`
### Z 轴排序
- 纯 Z 轴深度,无排序图层
- 摄像机位于 Z = -15,采用正交投影
- 地形填充位于 Z = 0,边缘位于 Z = -0.01
- Z 值越小越靠近摄像机
## 键盘快捷键
| 按键 | 操作 |
|---|---|
| `B` | 切换背景显示 |
| `⌘Z` / `Ctrl+Z` | 撤销 |
| `⇧⌘Z` / `Ctrl+Y` | 重做 |
| 滚轮 | 放大 / 缩小 |
| 拖动(空白区域) | 平移视图 |
| 点击对象 | 选择对象 |
## 致谢
- [BP-Innovation/Bad-Piggies-Original](https://github.com/BP-Innovation/Bad-Piggies-Original) — 反编译的游戏源代码和资源引用,使得对关卡格式和渲染管线的逆向工程成为可能。
## 许可证
本项目基于 **GNU Affero General Public License v3.0** 授权 — 详见 [LICENSE](../LICENSE) 文件。
标签:Bad Piggies, CLI, DirectX 12, egui, GPU渲染, GUI应用, i18n, Metal, OpenGL ES, Rust, Sprite图集, TOML, Vulkan, WASM, WebAssembly, wgpu, WGSL着色器, WiFi技术, YAML, 中文支持, 二进制解析, 信息收集, 像素猪, 反序列化, 可视化界面, 国际化, 地图编辑器, 地图解析, 多格式IO, 安全库, 开源, 批处理渲染, 撤销重做, 桌面应用, 游戏关卡编辑器, 游戏开发, 版图编辑器, 网络流量审计, 视差背景, 视锥剔除, 通知系统