sandbox
Loading...
Searching...
No Matches
blur_filter.hpp
1// SPDX-License-Identifier: MIT
2#ifndef LIBSBX_POST_FILTERS_BLUR_FILTER_HPP_
3#define LIBSBX_POST_FILTERS_BLUR_FILTER_HPP_
4
5#include <libsbx/utility/enum.hpp>
6
7#include <libsbx/math/vector2.hpp>
8
9#include <libsbx/post/filter.hpp>
10
11namespace sbx::post {
12
13enum class blur_type : std::uint32_t {
14 gaussian_5 = 0,
15 gaussian_9 = 1,
16 gaussian_13 = 2
17}; // enum class blur_type
18
19template<blur_type Type>
20class blur_filter final : public filter {
21
22 using base = filter;
23
24 static auto _specialization_info(const std::uint32_t id, const std::uint32_t value) -> const VkSpecializationInfo* {
25 static auto specialization_map_entry = VkSpecializationMapEntry{};
26 specialization_map_entry.constantID = id;
27 specialization_map_entry.offset = 0u;
28 specialization_map_entry.size = sizeof(std::uint32_t);
29
30 static auto specialization_data = std::uint32_t{value};
31
32 static auto specialization_info = VkSpecializationInfo{};
33 specialization_info.mapEntryCount = 1u;
34 specialization_info.pMapEntries = &specialization_map_entry;
35 specialization_info.dataSize = sizeof(std::uint32_t);
36 specialization_info.pData = &specialization_data;
37
38 return &specialization_info;
39 }
40
41public:
42
43 inline static constexpr auto type = Type;
44
45 blur_filter(const std::vector<graphics::attachment_description>& attachments, const std::filesystem::path& path, const std::string& attachment_name, const math::vector2& direction)
46 : base{attachments, path, base::default_pipeline_definition, _specialization_info(0u, utility::to_underlying(Type))},
47 _push_handler{base::pipeline()},
48 _attachment_name{attachment_name},
49 _direction{direction} { }
50
51 ~blur_filter() override = default;
52
53 auto render(graphics::command_buffer& command_buffer) -> void override {
54 EASY_BLOCK("blur_filter::render");
55
56 auto& pipeline = base::pipeline();
57 auto& descriptor_handler = base::descriptor_handler();
58
59 auto& graphics_module = core::engine::get_module<graphics::graphics_module>();
60
61 pipeline.bind(command_buffer);
62
63 _push_handler.push("direction", _direction);
64 // _push_handler.push("type", utility::to_underlying(type));
65
66 descriptor_handler.push("image", graphics_module.attachment(_attachment_name));
67
68 if (!descriptor_handler.update(pipeline)) {
69 return;
70 }
71
72 descriptor_handler.bind_descriptors(command_buffer);
73 _push_handler.bind(command_buffer);
74
75 command_buffer.draw(3, 1, 0, 0);
76 }
77
78private:
79
80 graphics::push_handler _push_handler;
81
82 std::string _attachment_name;
83 math::vector2 _direction;
84
85}; // class blur_filter
86
88
90
92
93} // namespace sbx::post
94
95#endif // LIBSBX_POST_FILTERS_BLUR_FILTER_HPP_
Definition: command_buffer.hpp:15
Definition: push_handler.hpp:18
A vector in two-dimensional space.
Definition: vector2.hpp:28
Definition: blur_filter.hpp:20
Definition: filter.hpp:19