Files
fn_registry/dev/issues/0072-gamedev-stack-roadmap.md
T

6.3 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
58 Stack gamedev ligero multi-plataforma + crypto (roadmap) pendiente epic
gamedev
cross-stack media
2026-05-10 2026-05-17
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.