70 lines
1.4 KiB
C
70 lines
1.4 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 } }, \
|
|
}
|
|
|
|
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 union {
|
|
lambertian_params_t lambertian;
|
|
reflective_params_t reflective;
|
|
dielectric_params_t dielectric;
|
|
} 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);
|
|
|
|
#endif
|