snoopy/src/material.h

57 lines
1.2 KiB
C
Raw Normal View History

2020-06-07 00:59:30 +02:00
#pragma once
#include "rtweekend.h"
#include "hittable.h"
class material
{
public:
virtual bool scatter(
const ray& r_in,
const hit_record& rec,
colour& attenuation,
ray& scattered) const = 0;
};
class lambertian : public material
{
public:
lambertian(const colour& a) : albedo_(a) {}
virtual bool scatter(
const ray& r_in,
const hit_record& rec,
colour& attenuation,
ray& scattered) const
{
vec3 scatter_direction = rec.normal + random_unit_vector();
scattered = ray(rec.p, scatter_direction);
attenuation = albedo_;
return true;
}
private:
colour albedo_;
};
class metal : public material
{
public:
metal(const colour& a) : albedo_(a) {}
virtual bool scatter(
const ray& r_in,
const hit_record& rec,
colour& attenuation,
ray& scattered) const
{
vec3 reflected = reflect(unit_vector(r_in.direction()), rec.normal);
scattered = ray(rec.p, reflected);
attenuation = albedo_;
return dot(scattered.direction(), rec.normal) > 0;
}
private:
colour albedo_;
};