Files
batomorph/include/material.h

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