PixelBullet  0.0.1
A C++ game engine
Loading...
Searching...
No Matches
directional_shadow_scene_mesh_subrender_internal.h
1#pragma once
2
3#include "pixelbullet/private/graphics/rendering/buffers/buffer.h"
4#include "pixelbullet/private/graphics/rendering/buffers/morph_mesh_resource.h"
5#include "pixelbullet/private/graphics/rendering/buffers/skinned_mesh_resource.h"
6#include "pixelbullet/private/graphics/rendering/buffers/skinned_morph_mesh_resource.h"
7#include "pixelbullet/private/graphics/rendering/buffers/static_mesh_resource.h"
8#include "pixelbullet/private/graphics/rendering/buffers/storage_buffer.h"
9#include "pixelbullet/private/graphics/rendering/buffers/uniform_handler.h"
10#include "pixelbullet/private/graphics/rendering/descriptors/descriptors_handler.h"
11#include "pixelbullet/private/graphics/runtime_support/images/image_2d.h"
12#include "pixelbullet/private/graphics/rendering/pipelines/pipeline_graphics.h"
13#include "pixelbullet/graphics/subrender.h"
14#include "pixelbullet/private/scene/rendering/render_resource_resolver.h"
15#include "pixelbullet/scene/render_data.h"
16
17#include <cstddef>
18#include <memory>
19#include <optional>
20#include <string>
21#include <vector>
22
23namespace pixelbullet
24{
25enum class DirectionalShadowMeshDrawKind
26{
27 None,
28 Static,
29 Morph,
30 Skinned,
31 SkinnedMorph,
32};
33
34class Filesystem;
35class RenderDevice;
36class ResourceCache;
37
39{
40 std::shared_ptr<StaticMeshResource> static_mesh;
41 std::shared_ptr<MorphMeshResource> morph_mesh;
42 std::shared_ptr<SkinnedMeshResource> skinned_mesh;
43 std::shared_ptr<SkinnedMorphMeshResource> skinned_morph_mesh;
44 std::shared_ptr<Image2D> base_color_texture;
45 std::vector<std::unique_ptr<StorageBuffer>> joint_palette_buffers;
46 std::vector<std::unique_ptr<StorageBuffer>> morph_weights_buffers;
47
48 void ResetResolvedBindings() noexcept
49 {
50 static_mesh.reset();
51 morph_mesh.reset();
52 skinned_mesh.reset();
53 skinned_morph_mesh.reset();
54 base_color_texture.reset();
55 }
56
57 [[nodiscard]] StorageBuffer* GetJointPaletteBuffer(const uint32_t image_index) const noexcept
58 {
59 return image_index < joint_palette_buffers.size() ? joint_palette_buffers[image_index].get() : nullptr;
60 }
61
62 [[nodiscard]] StorageBuffer* GetMorphWeightsBuffer(const uint32_t image_index) const noexcept
63 {
64 return image_index < morph_weights_buffers.size() ? morph_weights_buffers[image_index].get() : nullptr;
65 }
66
67 [[nodiscard]] const Buffer* GetVertexBuffer() const noexcept
68 {
69 if (static_mesh)
70 {
71 return static_mesh->GetVertexBuffer();
72 }
73 if (morph_mesh)
74 {
75 return morph_mesh->GetVertexBuffer();
76 }
77 if (skinned_mesh)
78 {
79 return skinned_mesh->GetVertexBuffer();
80 }
81 if (skinned_morph_mesh)
82 {
83 return skinned_morph_mesh->GetVertexBuffer();
84 }
85 return nullptr;
86 }
87
88 [[nodiscard]] const Buffer* GetIndexBuffer() const noexcept
89 {
90 if (static_mesh)
91 {
92 return static_mesh->GetIndexBuffer();
93 }
94 if (morph_mesh)
95 {
96 return morph_mesh->GetIndexBuffer();
97 }
98 if (skinned_mesh)
99 {
100 return skinned_mesh->GetIndexBuffer();
101 }
102 if (skinned_morph_mesh)
103 {
104 return skinned_morph_mesh->GetIndexBuffer();
105 }
106 return nullptr;
107 }
108
109 [[nodiscard]] uint32_t GetIndexCount() const noexcept
110 {
111 if (static_mesh)
112 {
113 return static_mesh->GetIndexCount();
114 }
115 if (morph_mesh)
116 {
117 return morph_mesh->GetIndexCount();
118 }
119 if (skinned_mesh)
120 {
121 return skinned_mesh->GetIndexCount();
122 }
123 if (skinned_morph_mesh)
124 {
125 return skinned_morph_mesh->GetIndexCount();
126 }
127 return 0u;
128 }
129
130 [[nodiscard]] bool HasRenderableMesh() const noexcept
131 {
132 return GetVertexBuffer() != nullptr && GetIndexBuffer() != nullptr && GetIndexCount() > 0u;
133 }
134};
135
136struct DirectionalShadowSceneMeshSubrenderImpl
137{
138 DirectionalShadowSceneMeshSubrenderImpl(const Subrender::Stage& stage, RenderDevice& render_device, Filesystem& filesystem,
139 ResourceCache& resource_cache, const SceneRenderData& render_data);
140
141 void EnsureMeshCapacity(std::size_t mesh_count);
142 void InvalidateSlotState(std::size_t slot_index);
143 void ClearUnusedSlotState(std::size_t mesh_count);
144
145 const SceneRenderData* render_data = nullptr;
146 RenderDevice& render_device;
147 RenderResourceResolver resource_resolver;
148 PipelineGraphics culled_pipeline;
149 PipelineGraphics double_sided_pipeline;
150 PipelineGraphics morph_culled_pipeline;
151 PipelineGraphics morph_double_sided_pipeline;
152 PipelineGraphics skinned_culled_pipeline;
153 PipelineGraphics skinned_double_sided_pipeline;
154 PipelineGraphics skinned_morph_culled_pipeline;
155 PipelineGraphics skinned_morph_double_sided_pipeline;
156 std::optional<BufferLayout> mesh_layout;
157 UniformHandler scene_uniforms;
158 std::vector<UniformHandler> mesh_uniforms;
159 std::vector<DescriptorsHandler> mesh_descriptors;
160 std::vector<DirectionalShadowResolvedResources> resolved_resources;
161 std::vector<DirectionalShadowMeshDrawKind> slot_draw_kinds;
162 std::vector<std::optional<std::string>> slot_mesh_paths;
163};
164
165namespace directional_shadow_scene_mesh_internal
166{
167std::unique_ptr<DirectionalShadowSceneMeshSubrenderImpl> CreateImpl(const Subrender::Stage& stage, RenderDevice& render_device,
168 Filesystem& filesystem, ResourceCache& resource_cache,
169 const SceneRenderData& render_data);
170std::vector<std::size_t> CollectMatchingMeshSlotIndices(const std::vector<std::optional<std::string>>& slot_mesh_paths,
171 const std::vector<std::string>& changed_meshes);
172void Render(DirectionalShadowSceneMeshSubrenderImpl& impl, const RenderFrameContext& frame_context);
173std::size_t RefreshAllAssetCaches(DirectionalShadowSceneMeshSubrenderImpl& impl);
174std::size_t RefreshMeshCaches(DirectionalShadowSceneMeshSubrenderImpl& impl, const std::vector<std::string>& changed_meshes);
175} // namespace directional_shadow_scene_mesh_internal
176} // namespace pixelbullet
Definition filesystem.h:16
Definition render_device.h:15
Definition render_frame_context.h:17
Definition resource_cache.h:16
Definition directional_shadow_scene_mesh_subrender_internal.h:39
Definition directional_shadow_scene_mesh_subrender_internal.h:137
Definition render_data.h:117