Skip to content
Snippets Groups Projects
DiffuseMaterial.cpp 2.18 KiB
Newer Older
#define _USE_MATH_DEFINES
Postea's avatar
Postea committed
#include "DiffuseMaterial.h"
Yoel's avatar
Yoel committed

#include <math.h>

#include "../tools/Random.h"
#include "texture/Constant.h"
Postea's avatar
Postea committed

namespace material {
Yoel's avatar
Yoel committed
DiffuseMaterial::DiffuseMaterial(
    const std::shared_ptr<util::Sampler>& albedo_texture,
    const std::shared_ptr<util::Sampler>& emission_texture)
Yoel's avatar
Yoel committed
    : albedo_texture(albedo_texture), emission_profile({emission_texture}) {
}
DiffuseMaterial::DiffuseMaterial(
    const std::shared_ptr<util::Sampler>& albedo_texture,
    const std::shared_ptr<util::Sampler>& emission_texture,
    const util::Image& distribution)
    : albedo_texture(albedo_texture),
      emission_profile({emission_texture, distribution}) {
Yoel's avatar
Yoel committed
DiffuseMaterial::DiffuseMaterial(
    const std::shared_ptr<util::Sampler>& albedo_texture)
    : albedo_texture(albedo_texture),
Yoel's avatar
Yoel committed
      emission_profile(
          {std::make_shared<Constant>(Constant(util::Vec3(0, 0, 0)))}) {
}
DiffuseMaterial::DiffuseMaterial(const util::Vec3& color)
Yoel's avatar
Yoel committed
    : albedo_texture(std::make_shared<Constant>(Constant(color))),
Yoel's avatar
Yoel committed
      emission_profile(
          {std::make_shared<Constant>(Constant(util::Vec3(0, 0, 0)))}) {
util::Vec3 DiffuseMaterial::albedo(const std::pair<float, float>& uv) const {
	return albedo_texture->color(uv.first, uv.second);
util::Vec3 DiffuseMaterial::emission(const std::pair<float, float>& uv) const {
Yoel's avatar
Yoel committed
	return emission_profile.color(uv.first, uv.second);
}
std::pair<float, float> DiffuseMaterial::sampleEmissionProfile() const {
	return emission_profile.sample();
}

std::optional<float> DiffuseMaterial::emission_pdf(float u, float v) const {
	return emission_profile.pdf(u, v);
Yoel's avatar
Yoel committed
util::Vec3 DiffuseMaterial::scattered_d(const util::Vec3& d,
	util::Vec3 rand = util::rand_vec3_in_circle(1);
	util::Vec3 result = n + rand;
bool DiffuseMaterial::scatter(const util::Vec3& d, const util::Vec3& n) const {
Yoel's avatar
Yoel committed
	return true;
float DiffuseMaterial::calculateLightMultiplier(const util::Vec3& d_in,
                                                const util::Vec3& d_out,
                                                const util::Vec3& n) const {
	return M_1_PI;
Yoel's avatar
Yoel committed
}  // namespace material