#pragma once #include #include #include #include #include #include #include #include #include #include "film.hpp" // #include #include "scene.hpp" /* size of screen tiles */ #define TILE_SIZE_X 8 #define TILE_SIZE_Y 8 struct Sample { embree::Vec3fa P; embree::Vec3fa Ng; embree::Vec3fa Ns; }; struct Data { RenderScene* scene; Grid* densityGrid; Grid* tempGrid; int spp; int max_path_length; /* accumulation buffer */ Film film; unsigned int accu_count; unsigned int frame_count = 0; RTCScene g_scene; }; inline void Data_Constructor(Data* This, int spp, int max_path_length) { This->g_scene = nullptr; This->scene = nullptr; This->spp = spp; This->max_path_length = max_path_length; This->accu_count = 0; } inline void Data_Destructor(Data* This) { rtcReleaseScene(This->g_scene); This->g_scene = nullptr; } struct RayStats { int numRays; int pad[32 - 1]; }; __forceinline void RayStats_addRay(RayStats &stats) { stats.numRays++; } __forceinline void RayStats_addShadowRay(RayStats &stats) { stats.numRays++; } template struct Averaged { Averaged(size_t N, double dt) : N(N), dt(dt) { } void add(double v) { values.push_front(std::make_pair(embree::getSeconds(), v)); if (values.size() > N) values.resize(N); } Ty get() const { if (values.size() == 0) return embree::zero; double t_begin = values[0].first - dt; Ty sum(embree::zero); size_t num(0); for (size_t i = 0; i < values.size(); i++) { if (values[i].first >= t_begin) { sum += values[i].second; num++; } } if (num == 0) return 0; else return sum / Ty(num); } std::deque> values; size_t N; double dt; };