--- 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, 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`).