---
name: camera_2d
kind: function
lang: cpp
domain: gamedev
version: "0.1.0"
purity: pure
signature: "world_to_screen(Camera2D, Vec2) -> Vec2; screen_to_world(Camera2D, Vec2) -> Vec2; visible_world_rect(Camera2D) -> Rect; view_proj_matrix(Camera2D, float[16])"
description: "Camara ortografica 2D pura: pos (centro), zoom, rotacion (rad) y viewport en pixeles. Conversiones world<->screen, AABB visible y matriz view-projection 4x4 column-major lista para cualquier renderer (sokol_gfx, OpenGL, WebGPU). Fast-path sin trig si rotation==0. Issue 0072b."
tags: [gamedev-engine, camera, 2d, math, pure]
uses_functions: []
uses_types: ["Vec2_cpp_core", "Rect_cpp_core"]
returns: []
returns_optional: false
error_type: ""
imports: []
example: |
  fn::cam::Camera2D cam;
  cam.pos = {100, 50};
  cam.zoom = 2.0f;
  cam.viewport_w = 1280;
  cam.viewport_h = 720;
  // mouse picking:
  fn::math2d::Vec2 world = fn::cam::screen_to_world(cam, {input.mx, input.my});
  // upload to shader:
  float mvp[16];
  fn::cam::view_proj_matrix(cam, mvp);
tested: false
tests: []
test_file_path: ""
file_path: "cpp/functions/gamedev/camera_2d.cpp"
params:
  - name: camera
    desc: "Camera2D con pos (centro mundo), zoom (>1 acerca), rotation (radianes) y viewport_w/h (pixeles)."
  - name: world
    desc: "Punto en world space (Vec2) para world_to_screen."
  - name: screen
    desc: "Punto en screen/pixel space (Vec2) para screen_to_world."
  - name: out
    desc: "Buffer de 16 floats donde escribir la matriz column-major en view_proj_matrix."
output: "Vec2 (transformaciones), Rect (AABB visible) o matriz column-major 4x4 (mapa world->clip [-1,1])."
---

# camera_2d

Camara 2D minima y pura. Zero estado global, zero I/O — apta para reusar en N renderers (sokol_gfx, OpenGL, WebGPU) y para correr en tests headless.

Convencion:
- `pos` es el centro de la camara en world coords.
- Eje Y en world apunta hacia ARRIBA. La proyeccion mapea `pos.y + hh` a top de clip (y=+1).
- Zoom multiplicativo: `zoom=2` muestra la mitad del area mundial en el mismo viewport.
- Rotation en radianes, sentido antihorario en world (la matriz invierte para clip).
- `visible_world_rect` para rotation != 0 devuelve el AABB ENVOLVENTE (no el rect rotado), util para frustum culling barato.
- `view_proj_matrix` es column-major (compatible con sokol_gfx / OpenGL `glUniformMatrix4fv` con `transpose=GL_FALSE`).
