feat(examples): add the scene representation, camera and intersection
Sphere and plane records, camera ray generation from field of view and aspect ratio, and the nearest-hit search across the scene.
This commit is contained in:
3 files changed
+137
No files matched your search
@@ -0,0 +1,67 @@
|
||||
#ifndef RT_SCENE_H
|
||||
#define RT_SCENE_H
|
||||
|
||||
#include "rt.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
typedef struct {
|
||||
vec3 origin, dir;
|
||||
} ray;
|
||||
|
||||
typedef enum { MAT_LAMBERT = 0, MAT_METAL = 1, MAT_LIGHT = 2 } mat_kind;
|
||||
|
||||
typedef struct {
|
||||
mat_kind kind;
|
||||
vec3 albedo;
|
||||
double fuzz;
|
||||
} material;
|
||||
|
||||
typedef struct {
|
||||
vec3 center;
|
||||
double radius;
|
||||
material mat;
|
||||
} sphere;
|
||||
|
||||
typedef struct {
|
||||
const sphere *spheres;
|
||||
int count;
|
||||
vec3 background;
|
||||
} scene;
|
||||
|
||||
typedef struct {
|
||||
vec3 origin, lower_left, horizontal, vertical;
|
||||
} camera;
|
||||
|
||||
typedef struct {
|
||||
double t;
|
||||
vec3 point, normal;
|
||||
material mat;
|
||||
int front;
|
||||
} hit;
|
||||
|
||||
camera camera_make(vec3 look_from, vec3 look_at, vec3 up, double fov_deg, double aspect);
|
||||
ray camera_ray(const camera *c, double u, double v);
|
||||
|
||||
int scene_hit(const scene *s, ray r, double tmin, double tmax, hit *out);
|
||||
vec3 ray_colour(const scene *s, ray r, int depth, rng *rng_state);
|
||||
|
||||
typedef struct {
|
||||
const scene *sc;
|
||||
const camera *cam;
|
||||
unsigned char *rgb;
|
||||
int width, height, samples, max_depth;
|
||||
int row_next;
|
||||
int threads;
|
||||
} render_job;
|
||||
|
||||
/* Returns the number of worker threads actually used. */
|
||||
int render_run(render_job *job);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
Reference in new issue
Block a user