sandbox
Loading...
Searching...
No Matches
static_mesh_shadow_subrenderer.hpp
1// SPDX-License-Identifier: MIT
2#ifndef LIBSBX_MODELS_STATIC_MESH_SHADOW_SUBRENDERER_HPP_
3#define LIBSBX_MODELS_STATIC_MESH_SHADOW_SUBRENDERER_HPP_
4
5#include <filesystem>
6#include <unordered_map>
7#include <array>
8
9#include <vulkan/vulkan.h>
10
11#include <libsbx/memory/tracking_allocator.hpp>
12
13#include <libsbx/core/engine.hpp>
14
15#include <libsbx/graphics/subrenderer.hpp>
16#include <libsbx/graphics/graphics_module.hpp>
17#include <libsbx/graphics/pipeline/graphics_pipeline.hpp>
18#include <libsbx/graphics/buffers/push_handler.hpp>
19#include <libsbx/graphics/descriptor/descriptor_handler.hpp>
20
21#include <libsbx/assets/assets_module.hpp>
22#include <libsbx/scenes/scenes_module.hpp>
23
24#include <libsbx/models/models.hpp>
25#include <libsbx/models/material_draw_list.hpp>
26#include <libsbx/models/static_mesh_material_draw_list.hpp>
27
28namespace sbx::models {
29
31
32 inline static const auto pipeline_definition = graphics::pipeline_definition{
33 .depth = graphics::depth::read_write,
34 .uses_transparency = false,
35 .rasterization_state = graphics::rasterization_state{
36 .polygon_mode = graphics::polygon_mode::fill,
37 .cull_mode = graphics::cull_mode::none,
38 .front_face = graphics::front_face::counter_clockwise
39 }
40 };
41
42 inline static constexpr auto default_pipeline_path = std::string_view{"engine://shaders/shadow"};
43
44public:
45
46 static_mesh_shadow_subrenderer(const std::vector<graphics::attachment_description>& attachments, const std::filesystem::path& base_pipeline = default_pipeline_path);
47
49
50 auto render(graphics::command_buffer& command_buffer) -> void override;
51
52private:
53
54 struct pipeline_data {
55
57 graphics::push_handler push_handler;
58
59 pipeline_data(const graphics::graphics_pipeline_handle& handle);
60
61 }; // struct pipeline_data
62
63 struct descriptor_data {
64
65 graphics::descriptor_handler scene_descriptor_handler;
66 graphics::descriptor_handler sampler_descriptor_handler;
67 graphics::descriptor_handler image_descriptor_handler;
68
69 descriptor_data(const graphics::graphics_pipeline_handle& handle);
70
71 }; // struct descriptor_data
72
73 auto _get_or_create_pipeline(const models::material_key& key) -> pipeline_data&;
74
75 auto _get_or_create_descriptor_data(const graphics::graphics_pipeline_handle& handle) -> descriptor_data&;
76
77 inline static const auto _entry_point = std::array<std::string, 3u>{
78 "opaque_main", // alpha_mode::opaque
79 "mask_main", // alpha_mode::mask
80 "blend_main" // alpha_mode::blend
81 };
82
83 std::vector<graphics::attachment_description> _attachments;
84 std::filesystem::path _base_pipeline;
85
86 inline static std::unordered_map<models::material_key, pipeline_data, models::material_key_hash> _pipeline_cache{};
87
88 std::unordered_map<graphics::graphics_pipeline_handle, descriptor_data> _descriptor_cache{};
89
90}; // class shadow_subrenderer
91
92} // namespace sbx::shadows
93
94#endif // LIBSBX_MODELS_STATIC_MESH_SHADOW_SUBRENDERER_HPP_
Definition: command_buffer.hpp:15
Definition: descriptor_handler.hpp:26
Definition: push_handler.hpp:18
Definition: resource_storage.hpp:18
Definition: subrenderer.hpp:14
Definition: static_mesh_shadow_subrenderer.hpp:30
Definition: graphics_pipeline.hpp:106
Definition: graphics_pipeline.hpp:67
Definition: material.hpp:87