Move camera initialisation into seperate module
This commit is contained in:
@@ -9,6 +9,7 @@ macro(configure_target target)
|
|||||||
endmacro()
|
endmacro()
|
||||||
|
|
||||||
add_library(batomorph
|
add_library(batomorph
|
||||||
|
src/camera.c
|
||||||
src/ff.c
|
src/ff.c
|
||||||
src/obj.c
|
src/obj.c
|
||||||
src/vec3.c
|
src/vec3.c
|
||||||
|
|||||||
41
demo.c
41
demo.c
@@ -1,3 +1,4 @@
|
|||||||
|
#include "camera.h"
|
||||||
#include "ff.h"
|
#include "ff.h"
|
||||||
#include "obj.h"
|
#include "obj.h"
|
||||||
#include "ray.h"
|
#include "ray.h"
|
||||||
@@ -11,35 +12,23 @@
|
|||||||
#define W 800
|
#define W 800
|
||||||
#define H 600
|
#define H 600
|
||||||
|
|
||||||
#define VP_H 2.0
|
#define FOCAL_LEN 1.0
|
||||||
#define VP_W (VP_H * W / H)
|
#define VIEWPORT_H 2.0
|
||||||
|
|
||||||
#define FOCLEN 1.0
|
|
||||||
|
|
||||||
#define NELEMS(arr) (sizeof(arr) / sizeof(arr[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 lightblue = { 0.4, 0.6, 1.0 };
|
||||||
static const vec3_t white = { 1.0, 1.0, 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 red = { 1.0, 0.1, 0.2 };
|
||||||
|
|
||||||
static const vec3_t camera = { 0, 0, 0 };
|
static const vec3_t camera_pos = { 0.0, 0.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 obj_t scene[] = {
|
static const obj_t scene[] = {
|
||||||
SPHERE(1.0, 0.0, -3.0, 1.0),
|
SPHERE(1.0, 0.0, -3.0, 1.0),
|
||||||
SPHERE(-2.0, 0.0, -5.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)
|
static vec3_t raycol(ray_t ray)
|
||||||
{
|
{
|
||||||
@@ -63,27 +52,23 @@ static void setpix(vec3_t col, pix_t *out)
|
|||||||
|
|
||||||
int main()
|
int main()
|
||||||
{
|
{
|
||||||
img_t img = { .w = W, .h = H, .pix = pix };
|
img_t img = { .w = W, .h = H, .pix = pixbuf };
|
||||||
|
camera_t camera = camera_init(camera_pos, FOCAL_LEN, VIEWPORT_H, W, H);
|
||||||
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));
|
|
||||||
|
|
||||||
for (unsigned y = 0; y < H; ++y) {
|
for (unsigned y = 0; y < H; ++y) {
|
||||||
fprintf(stderr, "\r[%3d/%3d]", y, H);
|
fprintf(stderr, "\r[%3d/%3d]", y, H);
|
||||||
fflush(stderr);
|
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) {
|
for (unsigned x = 0; x < W; ++x) {
|
||||||
|
const vec3_t pix = vec3_add(row, vec3_scale(camera.x_step, x));
|
||||||
const ray_t ray = {
|
const ray_t ray = {
|
||||||
.orig = camera,
|
.orig = camera.pos,
|
||||||
.dir = vec3_unit(vec3_add(row, vec3_scale(pix_x_step, x))),
|
.dir = vec3_unit(pix),
|
||||||
};
|
};
|
||||||
const vec3_t col = raycol(ray);
|
const vec3_t col = raycol(ray);
|
||||||
setpix(col, pix + (W * y + x));
|
setpix(col, img.pix + (W * y + x));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
17
include/camera.h
Normal file
17
include/camera.h
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
#ifndef CAMERA_H
|
||||||
|
#define CAMERA_H
|
||||||
|
|
||||||
|
#include "vec3.h"
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
vec3_t pos;
|
||||||
|
vec3_t pix_origin, x_step, y_step;
|
||||||
|
} camera_t;
|
||||||
|
|
||||||
|
camera_t camera_init(
|
||||||
|
vec3_t pos, double focal_len, double viewport_height, uint32_t img_width,
|
||||||
|
uint32_t img_height);
|
||||||
|
|
||||||
|
#endif
|
||||||
26
src/camera.c
Normal file
26
src/camera.c
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
#include "camera.h"
|
||||||
|
|
||||||
|
camera_t camera_init(
|
||||||
|
vec3_t pos, double focal_len, double viewport_height, uint32_t img_width,
|
||||||
|
uint32_t img_height)
|
||||||
|
{
|
||||||
|
const double aspect = (double)img_width / (double)img_height;
|
||||||
|
const double viewport_width = viewport_height * aspect;
|
||||||
|
const vec3_t viewport_disp = { 0, 0, focal_len };
|
||||||
|
const vec3_t u = { viewport_width, 0, 0 };
|
||||||
|
const vec3_t v = { 0, -viewport_height, 0 };
|
||||||
|
const vec3_t topleft = vec3_sub(
|
||||||
|
vec3_sub(pos, viewport_disp), vec3_scale(vec3_add(u, v), 0.5));
|
||||||
|
|
||||||
|
const vec3_t x_step = vec3_scale(u, 1.0 / (double)img_width);
|
||||||
|
const vec3_t y_step = vec3_scale(v, 1.0 / (double)img_height);
|
||||||
|
const vec3_t pix_origin
|
||||||
|
= vec3_add(topleft, vec3_scale(vec3_add(x_step, y_step), 0.5));
|
||||||
|
|
||||||
|
return (camera_t) {
|
||||||
|
.pos = pos,
|
||||||
|
.pix_origin = pix_origin,
|
||||||
|
.x_step = x_step,
|
||||||
|
.y_step = y_step,
|
||||||
|
};
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user