Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
8.5 KiB
id, title, status, type, domain, scope, priority, depends, blocks, related, created, updated, tags
| id | title | status | type | domain | scope | priority | depends | blocks | related | created | updated | tags | |||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0072i | gamedev — editor visual `game_editor` (scene tree, asset browser, inspector) | pendiente | feature |
|
app-scoped | media |
|
2026-05-10 | 2026-05-17 |
|
Objetivo
App PC cpp/apps/game_editor/ estilo shaders_lab / chart_demo: editor visual basado en ImGui que abre/edita/exporta proyectos de juego usando los formatos del runtime (sub-issues 0072b, 0072c). NO es Godot empotrado — es un editor minimalista construido con las funciones del registry, hot-reloadable, integrado en el ecosistema fn.
Filosofia
| Concepto | Decision |
|---|---|
| Visual scripting | NO — todo en C++ con hot reload (dylib opcional) |
| Scene format | JSON o binario (mismo .pak del runtime) |
| Hot reload assets | Si — file watcher + reload en runtime conectado |
| Live preview | Si — el editor lanza el runtime como subprocess y se comunica via IPC |
| Multi-platform editor | NO — solo PC. Mobile no edita, solo ejecuta. |
Layout
┌─────────────────────────────────────────────────────────────┐
│ Menu: File · Edit · View · Build · Help │
├─────────┬───────────────────────────────────────┬───────────┤
│ Scene │ │ Inspector │
│ Tree │ │ │
│ │ Scene Viewport │ - Pos │
│ - Root │ (live runtime via IPC) │ - Sprite │
│ - Bg │ │ - Script │
│ - Pl │ │ ... │
│ - En │ │ │
├─────────┼───────────────────────────────────────┼───────────┤
│ Assets │ │ Layers │
│ Browser │ │ Anim │
│ │ │ Timeline │
└─────────┴───────────────────────────────────────┴───────────┘
Implementado con AppShell style + ImGui dockspace + paneles del registry.
Paneles a crear
Scene tree
cpp/functions/gamedev/scene_tree_panel.{cpp,h,md} (impure):
struct SceneNode {
std::string id;
std::string name;
std::string type; // "sprite", "tilemap", "particle", "audio", "trigger"
Vec2 pos, scale;
float rotation;
std::vector<std::string> children;
nlohmann::json props; // Type-specific data
};
void scene_tree_render(SceneTreeState& s, std::vector<SceneNode>& nodes,
std::string& selected);
Drag-reparent, multi-select, search, lock/visibility per node.
Inspector
cpp/functions/gamedev/inspector_panel.{cpp,h,md} (impure):
Inspecciona el nodo seleccionado, muestra sus props en widgets ImGui, escribe cambios en el modelo. Genera UI desde un schema JSON declarado por tipo de nodo:
{
"sprite": [
{ "name": "atlas", "type": "asset_ref", "asset": "atlas" },
{ "name": "frame", "type": "string" },
{ "name": "tint", "type": "color" },
{ "name": "z_order", "type": "int", "min": -100, "max": 100 }
]
}
Reusable: el mismo panel sirve para inspeccionar entities en otras apps. Generaliza params_schema del registry.
Asset browser
cpp/functions/gamedev/asset_browser_panel.{cpp,h,md} (impure):
Grid de thumbnails. Filtrable por tipo (sprite, sound, shader, script). Drag a la viewport o al inspector.
Backend: directorio del proyecto + watcher (fn::file_watcher ya existe en registry?).
Tilemap editor
cpp/functions/gamedev/tilemap_editor_panel.{cpp,h,md} (impure):
Edita layers de tilemap. Brush painting, eraser, fill bucket, picker. Edita formato compatible con tilemap_compile_cpp_gfx (de 0072c).
Animation timeline
cpp/functions/gamedev/anim_timeline_panel.{cpp,h,md} (impure):
Reusa cpp/functions/.../animation_curves (ya existe del issue 0031). Crea state machines simples: idle/walk/jump por sprite.
Shader graph
Reusa cpp/functions/gfx/dag_* (ya existe). Editor visual de shaders 2D que produce GLSL ES 300.
Live preview via IPC
El editor lanza el runtime como subprocess en una ventana separada y le envia comandos via stdin/stdout JSON-RPC (o socket local):
editor → runtime: { "method": "load_scene", "params": { "path": "/tmp/preview.json" } }
runtime → editor: { "result": { "ok": true } }
editor → runtime: { "method": "select_node", "params": { "id": "player" } }
editor → runtime: { "method": "set_prop", "params": { "id": "player", "key": "tint", "value": [1,0,0,1] } }
El runtime, al recibir un cambio, repinta el frame. Usuario ve cambios al instante.
Funciones nuevas:
cpp/functions/core/json_rpc_server.{cpp,h,md}(impure)cpp/functions/core/json_rpc_client.{cpp,h,md}(impure)
Si ya existe algo en el registry para IPC, reusarlo. Buscar en FTS5.
Project format
my_game/
project.json # Metadata, scenes, build targets
scenes/
main_menu.json
level_1.json
assets/
sprites/
player.png
enemy.png
sounds/
jump.wav
fonts/
Roboto.ttf
shaders/
bg_gradient.glsl
scripts/ # Si hay scripting (futuro)
build/ # Output del asset_compiler + binarios
project.json schema documentado en cpp/GAMEDEV.md.
Build button
Toolbar tiene botones:
- Build PC → invoca
build_pc_cpp_pipelines.shpara la app objetivo - Build WASM → invoca
build_wasm_cpp_pipelines.sh(issue 0072d) - Build Android → invoca
build_android_cpp_pipelines.sh(issue 0072g) - Build iOS → muestra mensaje "Build iOS requires mac" si no estamos en mac (0072h)
Output del build se streamea en un panel de log integrado.
Persistencia
project.json— formato del proyecto, versionado en git por el usuario.~/.fn_game_editor/recent.json— proyectos recientes.<exe_dir>/local_files/editor_settings.json— settings del editor (paneles abiertos, layout, etc.). Reusa convencionfn::local_path(vercpp_apps.md).
e2e_checks
e2e_checks:
- id: build
cmd: "cmake --build build --target game_editor -j"
- id: self_test
cmd: "./build/cpp/apps/game_editor/game_editor --self-test"
timeout_s: 30
- id: open_sample_project
cmd: "./build/cpp/apps/game_editor/game_editor --open samples/platformer/project.json --headless --quit-after 2s"
timeout_s: 30
Estructura
cpp/apps/game_editor/
CMakeLists.txt
app.md
main.cpp
data.{cpp,h} # Project / Scene CRUD
views.{cpp,h} # Composicion de paneles
ipc.{cpp,h} # JSON-RPC con runtime
samples/
platformer/ # Proyecto demo
project.json
scenes/...
Reusabilidad
Muchos paneles (scene_tree_panel, inspector_panel, asset_browser_panel) son utiles fuera de gamedev. Otras apps del registry (graph_explorer, kanban) podrian reusarlos. Diseñarlos parametrizables desde el dia 1.
Criterio de exito
game_editorabre, lista escenas, edita un sprite, exporta y se ve el cambio en runtime.- Live preview con IPC funciona (latencia < 100ms).
- Hot reload de assets cuando cambian en disco.
- Build PC + WASM desde el editor (botones funcionando).
- Sample project
platformerjugable end-to-end. - Paneles documentados como funciones del registry, reusables.
No-objetivos
- Editor mobile-friendly. Solo PC.
- Visual scripting. Codigo en C++ + scripting opcional (0072l).
- Multi-user collab.
- VCS integrado — usuario usa git fuera del editor.
- Asset store / marketplace.
Riesgos
- Inspector schema-driven — abstraccion potencialmente sobreingenierizada. Empezar concreto, abstraer cuando haya 3 tipos de nodos.
- IPC latency — JSON-RPC sobre stdin/stdout puede tener overhead. Si pasa, evaluar shared memory.
- Tilemap editor UX — no es trivial. Reservar tiempo. Reusar lo que se pueda de Tiled (formato
.tmx).