---
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.
