Files
batomorph/demo.c
2025-09-23 15:36:08 +01:00

81 lines
1.8 KiB
C

#include "camera.h"
#include "ff.h"
#include "obj.h"
#include "rng.h"
#include <unistd.h>
#define W 800
#define H 600
#define OBJ_COUNT 32
#define MAX_DIST 100.0
#define MAX_RAD 10.0
#define MIN_RAD 1.0
#define FOV 90
#define SAMPLES_PER_PIXEL 100
static const vec3_t camera_pos = { -100.0, 25.0, -100.0 };
static const vec3_t target = { 0.0, 0.0, 0.0 };
static const vec3_t sky = { 0.6, 0.7, 1.0 };
static const material_t floor = LAMBERTIAN(1.0, 0.94, 0.80);
static const material_t gold = REFLECTIVE(1.0, 0.9, 0.5, 0.0);
static const material_t silver = REFLECTIVE(0.9, 0.9, 0.9, 0.0);
static const material_t bronze = REFLECTIVE(0.9, 0.7, 0.5, 0.0);
static const material_t glass = DIELECTRIC(1.5);
static const material_t metals[] = { gold, silver, bronze };
static obj_t objs[OBJ_COUNT] = {
[0] = SPHERE(0.0, -100000.0, 0.0, 100000.0, floor),
};
static pix_t pixbuf[W * H];
static void rand_obj(obj_t *out, rng_t *rng)
{
material_t material;
const uint32_t rand = rng_uint32(rng);
if (rand % 2 == 0) {
const double r = rng_canon(rng);
const double g = rng_canon(rng);
const double b = rng_canon(rng);
material = (material_t)LAMBERTIAN(r, g, b);
} else if (rand % 3 == 0) {
material = glass;
} else {
material = metals[rng_uint32(rng) % 3];
}
const double r = MIN_RAD + (MAX_RAD - MIN_RAD) * rng_canon(rng);
const double x = MAX_DIST * rng_disc(rng);
const double z = MAX_DIST * rng_disc(rng);
*out = (obj_t)SPHERE(x, r, z, r, material);
}
int main()
{
rng_t rng = rng_init(0);
for (int i = 1; i < OBJ_COUNT; ++i)
rand_obj(objs + i, &rng);
img_t img = { .pix = pixbuf };
camera_t camera
= camera_init(camera_pos, target, FOV, W, H, SAMPLES_PER_PIXEL);
const scene_t scene = {
.sky_colour = sky,
.objs = objs,
.obj_count = OBJ_COUNT,
};
camera_render(&camera, &scene, &img);
ff_write(STDOUT_FILENO, img);
return 0;
}