#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) \ { \ .scatter = scatter_reflective, \ .params = { .reflective = { .tint = { r, g, b } } }, \ } 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; } reflective_params_t; typedef union { lambertian_params_t lambertian; reflective_params_t reflective; } 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); #endif