#ifndef INCLUDED_MATERIAL_H #define INCLUDED_MATERIAL_H #include "arena.h" #include "ray.h" #include "texture.h" #include struct HitRecord; typedef enum MaterialType { MATERIAL_LAMBERTIAN, MATERIAL_METAL, MATERIAL_DIELECTRIC, MATERIAL_DIFFUSE_LIGHT, MATERIAL_ISOTROPIC, } MaterialType; typedef struct Lambertian { const Texture *albedo; } Lambertian; typedef struct Metal { const Texture *albedo; double fuzziness; } Metal; typedef struct Dielectric { double eta; } Dielectric; typedef struct DiffuseLight { const Texture *emit; } DiffuseLight; typedef struct Isotropic { const Texture *albedo; } Isotropic; typedef struct Material { MaterialType type; union { Lambertian lambertian; Metal metal; Dielectric dielectric; DiffuseLight diffuse_light; Isotropic isotropic; }; } Material; bool material_scatter(const Material *material, Ray r, const struct HitRecord *record, Color *attenuation, Ray *scattered); Color material_emitted(const Material *material, double u, double v, Point3 p); Material *material_create_lambertian(const Texture *albedo, Arena *arena); Material *material_create_lambertian_color(Color albedo, Arena *arena); Material *material_create_metal(const Texture *albedo, double fuzziness, Arena *arena); Material *material_create_metal_color(Color albedo, double fuzziness, Arena *arena); Material *material_create_dielectric(double eta, Arena *arena); Material *material_create_diffuse_light(const Texture *emit, Arena *arena); Material *material_create_diffuse_light_color(Color color, Arena *arena); Material *material_create_isotropic(const Texture *albedo, Arena *arena); #endif /* INCLUDED_MATERIAL_H */