42c14fae59
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
55 lines
2.3 KiB
Markdown
55 lines
2.3 KiB
Markdown
---
|
|
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`).
|