pathtracer.h 3.88 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

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

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

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

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

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

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

43
			const core::TextureRGBA_32F &render(uint32_t width, uint32_t height);
Johannes Braun's avatar
Johannes Braun committed
44
			void draw(std::shared_ptr<core::GraphNode> node = core::state::graph_root);
unknown's avatar
unknown committed
45
46
47
			void saveRender(fs::path target) const;

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

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

			void reset();

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

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

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

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

96
97
			float getDistanceThreshold() const;
			void setDistanceThreshold(float distance_threshold);
98
99
			struct 
			{
100
101
102
103
104
105
106
107
				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
			struct
			{
				bool print_render_times = false;
			} debug;
112
113
114
115
116

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

117
118
119
			struct {
				float accuracy_threshold;
				float shadow_threshold;
120
				uint32_t bounce_thresholds;
121
				float distance_threshold;
122
			} m_linespace_config;
unknown's avatar
unknown committed
123

124
125
			std::array<uint8_t, 4> m_bounce_count_thresholds;
			std::array<uint8_t, 4> m_ls_bounce_count_thresholds;
unknown's avatar
unknown committed
126
				
unknown's avatar
unknown committed
127
128
129
			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
130
			std::unique_ptr<core::Program> m_render_shader;
unknown's avatar
unknown committed
131
132
133
			std::unique_ptr<core::Buffer<gl::BufferType::eShaderStorage>> m_trace_buffer;
			std::shared_ptr<core::Skybox> m_skybox;

134
			RayGeneratorType m_generator_type = RayGeneratorType::eTrace;
unknown's avatar
unknown committed
135
136
137
138
		};
	}
}

139
#endif //INCLUDE_PATHTRACER_H