pathtracer.h 3.67 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
namespace glare::raytrace
unknown's avatar
unknown committed
17
{
18
19
20
	namespace fs = std::experimental::filesystem;

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

28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
	class Pathtracer : public messaging::Receiver
	{
	public:
		Pathtracer();
		Pathtracer(std::shared_ptr<core::GraphNode> graph_root);
		Pathtracer(std::shared_ptr<core::GraphNode> graph_root, RayGeneratorType ray_generator);
		Pathtracer(RayGeneratorType ray_generator);
		Pathtracer(std::shared_ptr<SceneCollector> collector);
		Pathtracer(std::shared_ptr<SceneCollector> collector, RayGeneratorType ray_generator);
		~Pathtracer();

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

		const core::TextureRGBA_32F &render(uint32_t width, uint32_t height);
		void draw(std::shared_ptr<core::GraphNode> node = core::state::graph_root);
		void saveRender(fs::path target) const;

		void setGenerator(RayGeneratorType generator);
		RayGeneratorType getGenerator() const;
		void initialize(std::shared_ptr<SceneCollector> collector);
		void reload(std::shared_ptr<core::GraphNode> graph_root);

		void handle(messaging::message_t &message) override;

		void reset();

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

		const core::Program& shader() const;
		core::Buffer<gl::BufferType::eShaderStorage>& traceBuffer() const;
		const core::TextureRGBA_32F& renderTarget() const;
		std::shared_ptr<SceneCollector> collector() const;
		unsigned currentSample() const;

		void setEffectBounces(EffectType type, uint8_t bounces);
		uint8_t getEffectBounces(EffectType type);
unknown's avatar
unknown committed
65

66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
		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);
		float getClampIndirect() const;
		void setClampIndirect(float clamp_indirect);
		float getAccuracyThreshold() const;
		void setAccuracyThreshold(float accuracy_threshold);
		float getShadowThreshold() const;
		void setShadowThreshold(float shadow_threshold);
		float getDistanceThreshold() const;
		void setDistanceThreshold(float distance_threshold);
Johannes Braun's avatar
Johannes Braun committed
88

89
90
91
92
93
94
95
96
97
98
99
		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;

		struct
unknown's avatar
unknown committed
100
		{
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
			bool print_render_times = false;
		} debug;

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

		struct {
			float accuracy_threshold;
			float shadow_threshold;
			uint32_t bounce_thresholds;
			float distance_threshold;
		} m_linespace_config;

		std::array<uint8_t, 4> m_bounce_count_thresholds;
		std::array<uint8_t, 4> m_ls_bounce_count_thresholds;

		std::shared_ptr<SceneCollector> m_collector;
		std::unique_ptr<core::TextureRGBA_32F> m_render_target;
		std::unique_ptr<core::Program> m_render_shader;
		std::unique_ptr<core::Buffer<gl::BufferType::eShaderStorage>> m_trace_buffer;
		std::shared_ptr<core::Skybox> m_skybox;

		RayGeneratorType m_generator_type = RayGeneratorType::eTrace;
	};
unknown's avatar
unknown committed
126
127
}

128
#endif //INCLUDE_PATHTRACER_H