SpiecsEngine
 
Loading...
Searching...
No Matches
ParticleRenderer.cpp
Go to the documentation of this file.
1/**
2* @file ParticleRenderer.cpp.
3* @brief The ParticleRenderer Class Implementation.
4* @author Spices.
5*/
6
7#include "Pchheader.h"
9
10namespace Spices {
11
13 {
15
16 RendererPassBuilder{ "Particle", this }
17 .AddSubPass("Particle")
20 }
21
23 {
25
26 if (!FrameInfo::Get().m_World)
27 {
28 DescriptorSetBuilder{ "Particle", this }
29 .AddStorageTexture(2, 0, VK_SHADER_STAGE_COMPUTE_BIT, { "Particle" }, VK_FORMAT_R32G32B32A32_SFLOAT)
30 .AddStorageBuffer(2, 1, sizeof(SpicesShader::Vertex), VK_SHADER_STAGE_COMPUTE_BIT)
31 .Build();
32
33 return;
34 }
35
36 std::shared_ptr<VulkanBuffer> buffer = nullptr;
37
38 IterWorldCompWithBreak<TagComponent>(FrameInfo::Get(), [&](int entityID, TransformComponent& tranComp, TagComponent& tagComp) {
39 if (tagComp.GetTag().find("Ground") != tagComp.GetTag().end())
40 {
41 auto& meshComp = FrameInfo::Get().m_World->GetRegistry().get<MeshComponent>((entt::entity)entityID);
42 const std::shared_ptr<MeshPack> meshPack = *meshComp.GetMesh()->GetPacks().first();
43 buffer = meshPack->GetResource().positions.buffer;
44 return true;
45 }
46 return false;
47 });
48
49 if (!buffer)
50 {
51 DescriptorSetBuilder{ "Particle", this }
52 .AddStorageTexture(2, 0, VK_SHADER_STAGE_COMPUTE_BIT, { "Particle" }, VK_FORMAT_R32G32B32A32_SFLOAT)
53 .AddStorageBuffer(2, 1, sizeof(SpicesShader::Vertex), VK_SHADER_STAGE_COMPUTE_BIT)
54 .Build();
55
56 return;
57 }
58
59 DescriptorSetBuilder{ "Particle", this }
60 .AddStorageTexture(2, 0, VK_SHADER_STAGE_COMPUTE_BIT, { "Particle" }, VK_FORMAT_R32G32B32A32_SFLOAT)
61 .AddStorageBuffer(2, 1, VK_SHADER_STAGE_COMPUTE_BIT, buffer)
62 .Build();
63 }
64
66 {
68
69 /**
70 * @breif ReCreate RenderPass, DescriptorSet and DefaultMaterial.
71 */
73 }
74
76 std::shared_ptr<Material> material ,
77 VkPipelineLayout& layout ,
78 std::shared_ptr<RendererSubPass> subPass
79 )
80 {
82
83 PipelineBuilder{ subPass, material, this }
84 .SetPipelineLayout(layout)
85 .BuildCompute();
86 }
87
89 {
91
92 ComputeRenderBehaveBuilder builder{ this ,frameInfo.m_FrameIndex, frameInfo.m_ImageIndex, m_VulkanState.m_ComputeCommandBuffer };
93
94 builder.Recording("Particle");
95
96 std::shared_ptr<VulkanBuffer> buffer = nullptr;
97
98 IterWorldCompWithBreak<TagComponent>(FrameInfo::Get(), [&](int entityID, TransformComponent& tranComp, TagComponent& tagComp) {
99 if (tagComp.GetTag().find("Ground") != tagComp.GetTag().end())
100 {
101 auto& meshComp = FrameInfo::Get().m_World->GetRegistry().get<MeshComponent>((entt::entity)entityID);
102 const std::shared_ptr<MeshPack> meshPack = *meshComp.GetMesh()->GetPacks().first();
103 buffer = meshPack->GetResource().positions.buffer;
104 return true;
105 }
106 return false;
107 });
108
109 if (!buffer) return;
110
111 builder.AddBarriers(buffer->Get(), 0, VK_ACCESS_SHADER_WRITE_BIT, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT);
112
113 builder.BindDescriptorSet(DescriptorSetManager::GetByName("PreRenderer"));
114
115 builder.BindDescriptorSet(DescriptorSetManager::GetByName({ m_Pass->GetName(), "Particle" }));
116
117 builder.BindPipeline("ParticleRenderer.Particle.Default");
118
119 builder.Dispatch(16 * 16, 1, 1);
120
121 //builder.ReleaseBarriers(buffer->Get(), VK_ACCESS_SHADER_WRITE_BIT, 0, VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT);
122
123 builder.EndRecording();
124 }
125}
#define SPICES_PROFILE_ZONE
uint32_t m_FrameIndex
FrameIndex, varying during 0 - (MaxFrameInFlight - 1). Used almost anywhere.
Definition FrameInfo.h:69
static FrameInfo & Get()
Get FrameInfo.
Definition FrameInfo.cpp:14
uint32_t m_ImageIndex
ImageIndex, varying during 0 - (MaxFrameInFlight - 1). Used in swapchain index and framebuffer index.
Definition FrameInfo.h:75
FrameInfo Class. This class defines the FrameInfo data.
Definition FrameInfo.h:32
Material Class. This class contains a branch of parameter and shader, also descriptor.
Definition Material.h:62
MeshPack Class. This class defines some basic behaves and variables. This class need to be inherited ...
Definition MeshPack.h:156
virtual void Render(TimeStep &ts, FrameInfo &frameInfo) override
The interface is inherited from Renderer.
virtual void CreateRendererPass() override
The interface is inherited from Renderer. Create Specific Renderer pass.
virtual void CreatePipeline(std::shared_ptr< Material > material, VkPipelineLayout &layout, std::shared_ptr< RendererSubPass > subPass) override
The interface is inherited from Renderer. Create Material Specific Pipeline.
virtual void CreateDescriptorSet() override
The interface is inherited from Renderer. Create specific descriptor set for sub pass.
virtual void OnMeshAddedWorld() override
ParticleRenderer Class. This class defines the particle render behaves.
This Class Combines some data relative to sub pass. Usually as a member variable of RendererPass.
void Dispatch(uint32_t x, uint32_t y, uint32_t z) const
Dispatch Compute Shader.
This class helps to bind pipeline and bind buffer. Specific for pure Compute Renderer....
Definition Renderer.h:1739
void EndRecording() const
End recording all this behaveS does.
Definition Renderer.cpp:561
void Recording(const std::string &caption) const
Recording all this behaves does.
Definition Renderer.cpp:551
RendererPassBuilder & EndSubPass()
End recording a sub pass.
void Build() const
Build the RendererPass.
RendererPassBuilder & AddSubPass(const std::string &subPassName, Querier::StatisticsFlags flags=Querier::ALL)
Add a new SubPass to Renderer Pass.
virtual void OnSystemInitialize()
This interface is called on render system is registered. Initialize the specific renderer's pipeline,...
Definition Renderer.cpp:38
VulkanState & m_VulkanState
This variable is passed while renderer instanced.
Definition Renderer.h:1992
Renderer Class. This class defines the basic behaves of renderer. When we add an new Renderer,...
Definition Renderer.h:57
TagComponent Class. This class defines the specific behaves of TagComponent.
This Class handles our engine time step during frames. Global Unique.
Definition TimeStep.h:22
TransformComponent Class. This class defines the specific behaves of TransformComponent.
This Class is a Wrapper of VulkanBuffer.