pathtracer.h 3.82 KB
Newer Older
1
2
#ifndef INCLUDE_PATHTRACER_H
#define INCLUDE_PATHTRACER_H
unknown's avatar
unknown committed
3

unknown's avatar
unknown committed
4
#include <array>
5
#include <filesystem>
unknown's avatar
unknown committed
6

7
8
9
#include <core/base/program.h>
#include <core/graph/node.h>
#include <core/objects/skybox.h>
unknown's avatar
unknown committed
10
#include <util/images.h>
11
#include <util/messaging.h>
unknown's avatar
unknown committed
12

13
14
#include <raytrace/data/local_bvh.h>
#include <raytrace/data/global_collector.h>
15
#include "raygenerator.h"
unknown's avatar
unknown committed
16
17
18

namespace glare
{
19
	namespace raytrace
unknown's avatar
unknown committed
20
21
22
	{
		namespace fs = std::experimental::filesystem;

unknown's avatar
unknown committed
23
24
		enum class EffectType
		{
25
26
27
28
			eDiffusion = 0,
			eReflection = 1,
			eTransmission = 2,
			eEmission = 3
unknown's avatar
unknown committed
29
30
		};

31
		class Pathtracer : public messaging::Receiver
unknown's avatar
unknown committed
32
33
		{
		public:
34
			Pathtracer();
35
			Pathtracer(std::shared_ptr<core::GraphNode> graph_root);
36
37
			Pathtracer(std::shared_ptr<core::GraphNode> graph_root, RayGeneratorType ray_generator);
			Pathtracer(RayGeneratorType ray_generator);
38
			Pathtracer(std::shared_ptr<SceneCollector> collector);
39
			Pathtracer(std::shared_ptr<SceneCollector> collector, RayGeneratorType ray_generator);
40
			~Pathtracer();
unknown's avatar
unknown committed
41

42
43
			void loadSettings(const fs::path &xml_file);

44
			const core::TextureRGBA_32F &render(uint32_t width, uint32_t height);
45
			void renderToScreen(uint32_t width, uint32_t height);
unknown's avatar
unknown committed
46
47
48
			void saveRender(fs::path target) const;

			//template<typename DataStruct>
49
50
			void setGenerator(RayGeneratorType generator);
			RayGeneratorType getGenerator() const;
unknown's avatar
unknown committed
51
			void initialize(std::shared_ptr<SceneCollector> collector);
52
			void reload(std::shared_ptr<core::GraphNode> graph_root);
unknown's avatar
unknown committed
53

54
			void handle(messaging::message_t &message) override;
unknown's avatar
unknown committed
55
56
57
58
59
60

			void reset();

			uint32_t width() const;
			uint32_t height() const;

Johannes Braun's avatar
Johannes Braun committed
61
			const core::Program& shader() const;
unknown's avatar
unknown committed
62
63
64
			core::Buffer<gl::BufferType::eShaderStorage>& traceBuffer() const;
			const core::TextureRGBA_32F& renderTarget() const;
			std::shared_ptr<SceneCollector> collector() const;
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
			unsigned currentSample() const;

			void setEffectBounces(EffectType type, uint8_t bounces);
			uint8_t getEffectBounces(EffectType type);

			void setLinespaceBounceThresholds(EffectType type, uint8_t bounces);
			uint8_t getLinespaceBounceThreshold(EffectType type);

			void setSkybox(std::shared_ptr<core::Skybox> skybox);
			std::shared_ptr<core::Skybox> Pathtracer::getSkybox() const;

			void setBounces(unsigned count);
			unsigned getBounces() const;

			void setMaxSamples(unsigned count);
			unsigned getMaxSamples() const;

			void setSamplesPerFrame(unsigned count);
			unsigned getSamplesPerFrame() const;

			float getClampDirect() const;
			void setClampDirect(float clamp_direct);
unknown's avatar
unknown committed
87

88
89
			float getClampIndirect() const;
			void setClampIndirect(float clamp_indirect);
90
			
91
92
			float getAccuracyThreshold() const;
			void setAccuracyThreshold(float accuracy_threshold);
93

94
95
			float getShadowThreshold() const;
			void setShadowThreshold(float shadow_threshold);
96

97
98
			float getDistanceThreshold() const;
			void setDistanceThreshold(float distance_threshold);
99
100
101
102
103
104
105
106
107
			struct {
				unsigned current_sample = 0;
				unsigned max_samples = 80000;
				unsigned samples_per_frame = 1;
				unsigned bounces = 1;
				float clamp_direct = 10.f;
				float clamp_indirect = 10.f;
			} m_render_config;

108
109
110
111
112

		private:
			uint32_t m_last_width = 0;
			uint32_t m_last_height = 0;

113
114
115
			struct {
				float accuracy_threshold;
				float shadow_threshold;
116
				uint32_t bounce_thresholds;
117
				float distance_threshold;
118
			} m_linespace_config;
unknown's avatar
unknown committed
119

120
121
			std::array<uint8_t, 4> m_bounce_count_thresholds;
			std::array<uint8_t, 4> m_ls_bounce_count_thresholds;
unknown's avatar
unknown committed
122
				
unknown's avatar
unknown committed
123
124
125
			std::shared_ptr<SceneCollector> m_collector;
			std::unique_ptr<core::TextureRGBA_32F> m_render_target;
			std::unique_ptr<core::TextureRGBA_32F> m_color_store;
Johannes Braun's avatar
Johannes Braun committed
126
			std::unique_ptr<core::Program> m_render_shader;
unknown's avatar
unknown committed
127
128
129
			std::unique_ptr<core::Buffer<gl::BufferType::eShaderStorage>> m_trace_buffer;
			std::shared_ptr<core::Skybox> m_skybox;

130
			RayGeneratorType m_generator_type = RayGeneratorType::eTrace;
unknown's avatar
unknown committed
131
132
133
134
		};
	}
}

135
#endif //INCLUDE_PATHTRACER_H