Move camera initialisation into seperate module

This commit is contained in:
Camden Dixie O'Brien
2025-09-23 15:35:26 +01:00
parent 08f1a2a4dc
commit 77723aefa0
4 changed files with 57 additions and 28 deletions

41
demo.c
View File

@@ -1,3 +1,4 @@
#include "camera.h"
#include "ff.h"
#include "obj.h"
#include "ray.h"
@@ -11,35 +12,23 @@
#define W 800
#define H 600
#define VP_H 2.0
#define VP_W (VP_H * W / H)
#define FOCLEN 1.0
#define FOCAL_LEN 1.0
#define VIEWPORT_H 2.0
#define NELEMS(arr) (sizeof(arr) / sizeof(arr[0]))
typedef struct {
vec3_t centre;
double rad;
} sphere_t;
static const vec3_t lightblue = { 0.4, 0.6, 1.0 };
static const vec3_t white = { 1.0, 1.0, 1.0 };
static const vec3_t red = { 1.0, 0.1, 0.2 };
static const vec3_t camera = { 0, 0, 0 };
static const vec3_t vp_disp = { 0, 0, FOCLEN };
static const vec3_t vp_u = { VP_W, 0, 0 };
static const vec3_t vp_v = { 0, -VP_H, 0 };
static const vec3_t pix_x_step = { VP_W / W, 0, 0 };
static const vec3_t pix_y_step = { 0, -VP_H / H, 0 };
static const vec3_t camera_pos = { 0.0, 0.0, 0.0 };
static const obj_t scene[] = {
SPHERE(1.0, 0.0, -3.0, 1.0),
SPHERE(-2.0, 0.0, -5.0, 1.0),
};
static pix_t pix[W * H];
static pix_t pixbuf[W * H];
static vec3_t raycol(ray_t ray)
{
@@ -63,27 +52,23 @@ static void setpix(vec3_t col, pix_t *out)
int main()
{
img_t img = { .w = W, .h = H, .pix = pix };
const vec3_t vp_topleft = vec3_sub(
vec3_sub(vec3_sub(camera, vp_disp), vec3_scale(vp_u, 0.5)),
vec3_scale(vp_v, 0.5));
const vec3_t pix_orig = vec3_add(
vec3_add(vp_topleft, vec3_scale(pix_x_step, 0.5)),
vec3_scale(pix_y_step, 0.5));
img_t img = { .w = W, .h = H, .pix = pixbuf };
camera_t camera = camera_init(camera_pos, FOCAL_LEN, VIEWPORT_H, W, H);
for (unsigned y = 0; y < H; ++y) {
fprintf(stderr, "\r[%3d/%3d]", y, H);
fflush(stderr);
const vec3_t row = vec3_add(pix_orig, vec3_scale(pix_y_step, y));
const vec3_t row
= vec3_add(camera.pix_origin, vec3_scale(camera.y_step, y));
for (unsigned x = 0; x < W; ++x) {
const vec3_t pix = vec3_add(row, vec3_scale(camera.x_step, x));
const ray_t ray = {
.orig = camera,
.dir = vec3_unit(vec3_add(row, vec3_scale(pix_x_step, x))),
.orig = camera.pos,
.dir = vec3_unit(pix),
};
const vec3_t col = raycol(ray);
setpix(col, pix + (W * y + x));
setpix(col, img.pix + (W * y + x));
}
}