fad4006f60
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
115 lines
6.3 KiB
Markdown
115 lines
6.3 KiB
Markdown
---
|
|
id: "58"
|
|
title: "Stack gamedev ligero multi-plataforma + crypto (roadmap)"
|
|
status: pendiente
|
|
type: epic
|
|
domain:
|
|
- gamedev
|
|
scope: cross-stack
|
|
priority: media
|
|
depends: []
|
|
blocks: []
|
|
related: []
|
|
created: 2026-05-10
|
|
updated: 2026-05-17
|
|
tags:
|
|
- gamedev
|
|
- roadmap
|
|
---
|
|
|
|
## Contexto
|
|
|
|
Objetivo: poder publicar juegos 2D con shaders vistosos en **PC (Win/Lin/Mac), Web (WASM), Android, iOS** desde el mismo codigo C++17, integrando el `fn_registry` como librería de funciones y el patron de apps ImGui ya existente.
|
|
|
|
Restricciones duras del usuario:
|
|
- **Solo C/C++** o capa fina sobre C. NO Godot empotrado, NO Bevy, NO LOVE.
|
|
- **Paquetes finales lo mas ligeros posible** — WASM es prioritario para distribución web + integración con sistemas de criptomonedas (wallets, NFTs, pagos on-chain).
|
|
- **Editor visual propio** como app del registry (estilo `shaders_lab`/`chart_demo`), no editor externo.
|
|
- Mantener integración total con el registry (funciones componibles, dos SQLite DBs, agentes).
|
|
|
|
## Decision arquitectonica
|
|
|
|
Hibrido C++ minimo, sin engine empotrado:
|
|
|
|
| Capa | Eleccion | Razón |
|
|
|---|---|---|
|
|
| Windowing/input | **SDL3** | Cubre Win/Lin/Mac/Android/iOS/Emscripten, MIT, ~1-2MB |
|
|
| Graphics | **sokol_gfx** (single-header) | GL/GLES/WebGL2/Metal/D3D11 bajo una API. Encaja con cultura "single-file function" |
|
|
| Audio | **miniaudio** (single-header) | Todas las plataformas, MIT, ~200KB |
|
|
| Physics 2D | **box2d** | MIT, ~200KB |
|
|
| UI/editor/debug | **Dear ImGui** (ya en stack) | Backends SDL3 + sokol oficiales |
|
|
| Scripting (opcional) | **wren** o **lua** | ~50-100KB, hot reload |
|
|
| Crypto bridge | **Web3.js / ethers.js / @solana/web3.js** via Emscripten JS interop en WASM; **secp256k1** + **ed25519** standalone para firma offline en native | Sin libs Web3 nativas C++ maduras; mejor delegar a JS en web y firmar offline en mobile |
|
|
|
|
## Por qué NO motor desde cero
|
|
|
|
- Engine 4 plataformas = 1-2 años solo runtime.
|
|
- Box2D, sokol, miniaudio, SDL3, ImGui ya resuelven 80% del trabajo. Ensamblar > reescribir.
|
|
- Mantenemos la cultura registry: cada pieza es funcion en `cpp/functions/gfx/`, `cpp/functions/gamedev/`, etc.
|
|
|
|
## Por qué NO Godot empotrado
|
|
|
|
- Binario PC: ~60-90 MB. WASM Godot: ~20-40 MB. Hibrido propio: 5-15 MB PC, 2-5 MB WASM.
|
|
- GDScript fuera de la cultura del registry.
|
|
- Crypto integration en Godot existe pero requiere modulos custom GDExtension, perdiendo la "ventaja" inicial.
|
|
|
|
## Sub-issues (orden recomendado)
|
|
|
|
| # | Issue | Fase | Plataformas |
|
|
|---|-------|------|-------------|
|
|
| 0072a | SDL3 + sokol_gfx + ImGui smoke (`engine_smoke` app) | 0 — Reconocimiento | PC + WASM |
|
|
| 0072b | Runtime nucleo: sprite batcher, audio, input unificado, game loop | 1 — Runtime minimo | PC + WASM |
|
|
| 0072c | Asset pipeline: atlas packer, MSDF fonts, tilemap compile | 1 — Runtime minimo | (host) |
|
|
| 0072d | WASM build pipeline + size budget (emscripten, gzip < 2MB) | 1 — WASM-first | WASM |
|
|
| 0072e | Crypto bridge Web3 (wallets, sign tx) via JS interop en WASM | 2 — Crypto web | WASM |
|
|
| 0072f | Crypto on-chain: NFT asset loading, payments, leaderboards firmadas | 2 — Crypto integration | WASM + native |
|
|
| 0072g | Mobile Android: NDK build + touch input + virtual gamepad | 3 — Mobile | Android |
|
|
| 0072h | Mobile iOS: Xcode toolchain + Metal via sokol + safe area | 3 — Mobile | iOS |
|
|
| 0072i | Editor visual `game_editor` (scene tree, asset browser, inspector) | 4 — Tooling | PC |
|
|
| 0072j | Physics 2D: Box2D integration (`physics_world_cpp_gfx`) | 4 — Features | todas |
|
|
| 0072k | Demo plataformero `engine_demo` (referencia de stack completo) | 5 — Validacion | todas |
|
|
| 0072l | Scripting opcional (wren/lua) — diferido hasta validar necesidad | 6 — Diferido | todas |
|
|
|
|
## Presupuestos de tamaño (objetivos no negociables)
|
|
|
|
- WASM gzip: **< 2 MB** runtime + < 5 MB con assets minimos
|
|
- PC binario: **< 15 MB** stripped
|
|
- Android APK base: **< 20 MB**
|
|
- iOS IPA base: **< 25 MB**
|
|
|
|
Cada sub-issue declara su contribucion al budget. Si una feature no cabe, se discute trade-off antes de mergear.
|
|
|
|
## Reutilizacion del registry actual
|
|
|
|
Funciones que entran tal cual o con migracion mecanica:
|
|
- `cpp/functions/gfx/dag_*` (node editor shaders) → editor de shaders del juego
|
|
- `cpp/functions/gfx/uniform_*` → sigue valiendo
|
|
- `cpp/functions/gfx/gl_shader`, `gl_framebuffer`, `gl_texture_load` → marcar `cpp_legacy`, migrar a `sg_*` (sokol) progresivamente. NO borrar — apps desktop existentes siguen vivas
|
|
- `fn_framework` (app shell, layouts, panels) → forkear `fn_framework_mobile` con SDL3 backend; mismo API publico. Las apps PC siguen funcionando
|
|
|
|
Funciones nuevas (ver sub-issues):
|
|
- `sg_init_cpp_gfx`, `sg_shader_cpp_gfx`, `sg_pipeline_cpp_gfx`, `sg_buffer_cpp_gfx`, `sg_image_load_cpp_gfx`
|
|
- `sdl_window_cpp_gfx`, `sdl_input_state_cpp_gfx`, `input_unified_cpp_gfx` (touch + kb + gamepad → mismo struct)
|
|
- `sprite_batch_cpp_gfx`, `tilemap_render_cpp_gfx`, `particle_2d_cpp_gfx`
|
|
- `audio_play_cpp_gfx`, `audio_load_cpp_gfx`
|
|
- `game_loop_cpp_gfx` (fixed timestep)
|
|
- Asset pipeline: `sprite_atlas_pack_cpp_gfx`, `ttf_to_msdf_cpp_gfx`, `tilemap_compile_cpp_gfx`, `shader_translate_cpp_gfx`, `audio_encode_cpp_gfx`
|
|
- Crypto: `secp256k1_sign_cpp_crypto`, `ed25519_sign_cpp_crypto`, `web3_bridge_js_cpp_crypto` (WASM only)
|
|
|
|
## Riesgos identificados
|
|
|
|
1. **iOS sin mac** — bloqueante. Mitigacion: GitHub Actions con `macos-latest` runner.
|
|
2. **Crypto libs C++ maduras escasas** — secp256k1 (Bitcoin/ETH) y ed25519 (Solana) son single-file libs. El resto (RPC, encoding, EIP-712) se delega a JS en WASM o se reescribe minimo.
|
|
3. **Shader cross-compile** — GLSL→MSL/HLSL/WGSL via SPIRV-Cross funciona pero hay edge cases. Plan B: escribir solo en GLSL ES 300 (subset comun a sokol).
|
|
4. **WASM size creep** — cada lib añade KB. Vigilar con `wasm-objdump -h` y `twiggy` en cada PR.
|
|
5. **Crypto wallet UX en mobile** — WalletConnect deep links son fragil. Validar pronto.
|
|
|
|
## Salida esperada
|
|
|
|
Al cerrar todos los sub-issues:
|
|
- Una app `engine_demo` (plataformero) corriendo en PC, navegador, Android, iOS desde el mismo codebase.
|
|
- Una app `game_editor` (PC) que abre/edita/exporta proyectos.
|
|
- Funciones del registry reusables para futuros juegos.
|
|
- Pipeline de build: `build_pc_cpp_pipelines`, `build_wasm_cpp_pipelines`, `build_android_cpp_pipelines`, `build_ios_cpp_pipelines`.
|
|
- Documentacion: `cpp/GAMEDEV.md` con patrones especificos y `cpp/PATTERNS.md` actualizado.
|