Files
PhotonMF/photon_tracer.hpp

104 lines
2.5 KiB
C++
Raw Normal View History

2017-02-21 17:00:49 -04:00
#pragma once
#ifndef PHOTON_TRACER_HPP
#define PHOTON_TRACER_HPP
#include "tracer.hpp"
//#include "kd_tree.hpp"
#include "photonmap.hpp"
#include "rgbe.hpp"
2017-02-21 17:00:49 -04:00
struct Vec3
{
float x;
float y;
float z;
Vec3(float _x = 0.0f, float _y = 0.0f, float _z = 0.0f): x(_x), y(_y), z(_z) { }
Vec3(const Vec3 & other) = default;
glm::vec3 toVec3() {
return glm::vec3(x, y, z);
}
inline bool equalFloat(const float x, const float y)
{
return (x - std::numeric_limits<float>::epsilon() <= y) && (x + std::numeric_limits<float>::epsilon() >= y);
}
inline bool operator<=(const Vec3 b)
{
return (x < b.x || (equalFloat(x, b.x) && (y < b.y || (equalFloat(y, b.y) && z <= b.z))));
}
inline bool operator>=(const Vec3 b)
{
return (x > b.x || (equalFloat(x, b.x) && (y > b.y || (equalFloat(y, b.y) && z >= b.z))));
}
inline friend std::ostream& operator<<(std::ostream& out, const Vec3& v)
{
return out << "X:" << v.x << " Y:" << v.y << " Z:" << v.z;
}
};
struct PhotonAux
{
Vec3 position;
Vec3 direction;
float ref_index;
unsigned char radiance[4];
float r, g, b;
PhotonAux(Vec3 _p = Vec3(), Vec3 _d = Vec3(), float red = 0.0f, float green = 0.0f, float blue = 0.0f, float _r = 1.0f):
position(_p),
direction(_d),
ref_index(_r),
r(red),
g(green),
b(blue)
{
float2rgbe(radiance, red, green, blue);
}
inline void getColor(float & red, float & green, float & blue) {
rgbe2float(red, green, blue, radiance);
}
};
class PhotonTracer: public Tracer {
2017-02-21 17:00:49 -04:00
public:
PhotonTracer():
Tracer(), m_h_radius(0.5f),
m_cone_filter_k(1.0f),
m_photon_map(7000000),
m_max_s_photons(5000)
{ }
PhotonTracer(unsigned int max_depth, float _r = 0.5f, float _k = 1.0f, const int max_photons = 7000000, const int max_search = 5000):
Tracer(max_depth),
m_h_radius(_r),
m_cone_filter_k(_k < 1.0f ? 1.0f : _k),
m_photon_map(max_photons),
m_max_s_photons(max_search)
{ };
2017-02-21 17:00:49 -04:00
virtual ~PhotonTracer();
virtual vec3 trace_ray(Ray & r, Scene * s, unsigned int rec_level) const;
2017-03-06 16:51:12 -04:00
void photon_tracing(Scene * s, const size_t n_photons_per_ligth = 10000, const bool specular = false);
2017-03-15 10:40:34 -04:00
void build_photon_map(const char * photons_file, const bool caustics = false);
void build_photon_map(const bool caustics = false);
2017-02-22 15:12:01 -04:00
private:
float m_h_radius;
2017-03-27 13:48:03 -04:00
float m_cone_filter_k;
/*kdTree m_photon_map;
kdTree m_caustics_map;*/
PhotonMap m_photon_map;
int m_max_s_photons;
void trace_photon(PhotonAux & ph, Scene * s, const unsigned int rec_level);
2017-02-21 17:00:49 -04:00
};
#endif