pathtracer.h 3.68 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
#include <core/base/program.h>
Johannes Braun's avatar
Johannes Braun committed
9
#include <core/graph/scene_node.h>
10
#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
	class Pathtracer : public messaging::Receiver
	{
	public:
		Pathtracer();
Johannes Braun's avatar
Johannes Braun committed
32
33
		Pathtracer(std::shared_ptr<core::SceneNode> graph_root);
		Pathtracer(std::shared_ptr<core::SceneNode> graph_root, RayGeneratorType ray_generator);
34
35
36
37
38
39
40
41
		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);
Johannes Braun's avatar
Johannes Braun committed
42
		void draw(std::shared_ptr<core::SceneNode> node = core::state::graph_root);
43
44
45
46
47
		void saveRender(fs::path target) const;

		void setGenerator(RayGeneratorType generator);
		RayGeneratorType getGenerator() const;
		void initialize(std::shared_ptr<SceneCollector> collector);
Johannes Braun's avatar
Johannes Braun committed
48
		void reload(std::shared_ptr<core::SceneNode> graph_root);
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64

		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