87 lines
1.8 KiB
C
87 lines
1.8 KiB
C
#ifndef MATERIAL_H
|
|
#define MATERIAL_H
|
|
|
|
#include "ray.h"
|
|
#include "rng.h"
|
|
|
|
#define LAMBERTIAN(r, g, b) \
|
|
{ \
|
|
.scatter = scatter_lambertian, \
|
|
.params = { .lambertian = { .albedo = { r, g, b } } }, \
|
|
}
|
|
|
|
#define REFLECTIVE(r, g, b, f) \
|
|
{ \
|
|
.scatter = scatter_reflective, \
|
|
.params = { .reflective = { .tint = { r, g, b }, .fuzz = f } }, \
|
|
}
|
|
|
|
#define DIELECTRIC(e) \
|
|
{ \
|
|
.scatter = scatter_dielectric, \
|
|
.params = { .dielectric = { .eta = e } }, \
|
|
}
|
|
|
|
#define AREA_LIGHT(r, g, b, l) \
|
|
{ \
|
|
.scatter = scatter_area_light, \
|
|
.params = { \
|
|
.area_light = { .colour = { r, g, b }, .luminosity = l }, \
|
|
}, \
|
|
}
|
|
|
|
typedef struct {
|
|
vec3_t point, normal;
|
|
double t;
|
|
bool front;
|
|
} hit_t;
|
|
|
|
typedef struct {
|
|
vec3_t albedo;
|
|
} lambertian_params_t;
|
|
|
|
typedef struct {
|
|
vec3_t tint;
|
|
double fuzz;
|
|
} reflective_params_t;
|
|
|
|
typedef struct {
|
|
double eta;
|
|
} dielectric_params_t;
|
|
|
|
typedef struct {
|
|
vec3_t colour;
|
|
double luminosity;
|
|
} area_light_params_t;
|
|
|
|
typedef union {
|
|
lambertian_params_t lambertian;
|
|
reflective_params_t reflective;
|
|
dielectric_params_t dielectric;
|
|
area_light_params_t area_light;
|
|
} material_params_t;
|
|
|
|
typedef bool scatter_fn_t(
|
|
material_params_t params, hit_t hit, rng_t *rng, ray_t *ray,
|
|
vec3_t *atten_out);
|
|
|
|
typedef struct {
|
|
scatter_fn_t *scatter;
|
|
material_params_t params;
|
|
} material_t;
|
|
|
|
bool scatter_lambertian(
|
|
material_params_t params, hit_t hit, rng_t *rng, ray_t *ray,
|
|
vec3_t *atten_out);
|
|
bool scatter_reflective(
|
|
material_params_t params, hit_t hit, rng_t *rng, ray_t *ray,
|
|
vec3_t *atten_out);
|
|
bool scatter_dielectric(
|
|
material_params_t params, hit_t hit, rng_t *rng, ray_t *ray,
|
|
vec3_t *atten_out);
|
|
bool scatter_area_light(
|
|
material_params_t params, hit_t hit, rng_t *rng, ray_t *ray,
|
|
vec3_t *atten_out);
|
|
|
|
#endif
|