Particle system WIP

This commit is contained in:
Brandon Mak 2023-02-24 21:46:01 +08:00
parent 1c066f4cbd
commit fe27f8752b
7 changed files with 240 additions and 9 deletions

View File

@ -59,6 +59,12 @@ namespace SHADE
{SHPredefinedDescriptorTypes::STATIC_DATA, 0}, {SHPredefinedDescriptorTypes::STATIC_DATA, 0},
{SHPredefinedDescriptorTypes::CAMERA, 1}, {SHPredefinedDescriptorTypes::CAMERA, 1},
}); });
perSystemData[SHUtilities::ConvertEnum(SystemType::PARTICLE_RENEDERING)].descMappings.AddMappings
({
{SHPredefinedDescriptorTypes::STATIC_DATA, 0},
{SHPredefinedDescriptorTypes::CAMERA, 1},
});
} }
void SHGraphicsPredefinedData::InitDummyPipelineLayouts(Handle<SHVkLogicalDevice> logicalDevice) noexcept void SHGraphicsPredefinedData::InitDummyPipelineLayouts(Handle<SHVkLogicalDevice> logicalDevice) noexcept
@ -235,6 +241,12 @@ namespace SHADE
SHGraphicsPredefinedData::PredefinedDescSetLayoutTypes::STATIC_DATA | SHGraphicsPredefinedData::PredefinedDescSetLayoutTypes::STATIC_DATA |
SHGraphicsPredefinedData::PredefinedDescSetLayoutTypes::CAMERA SHGraphicsPredefinedData::PredefinedDescSetLayoutTypes::CAMERA
); );
perSystemData[SHUtilities::ConvertEnum(SystemType::PARTICLE_RENEDERING)].descSetLayouts = GetPredefinedDescSetLayouts
(
SHGraphicsPredefinedData::PredefinedDescSetLayoutTypes::STATIC_DATA |
SHGraphicsPredefinedData::PredefinedDescSetLayoutTypes::CAMERA
);
} }
void SHGraphicsPredefinedData::InitPredefinedVertexInputState(void) noexcept void SHGraphicsPredefinedData::InitPredefinedVertexInputState(void) noexcept

View File

@ -39,6 +39,7 @@ namespace SHADE
TEXT_RENDERING, TEXT_RENDERING,
RENDER_GRAPH_NODE_COMPUTE, RENDER_GRAPH_NODE_COMPUTE,
TRAJECTORY_RENDERING, TRAJECTORY_RENDERING,
PARTICLE_RENEDERING,
NUM_TYPES NUM_TYPES
}; };
static constexpr int SYSTEM_TYPE_COUNT = static_cast<int>(SystemType::NUM_TYPES); static constexpr int SYSTEM_TYPE_COUNT = static_cast<int>(SystemType::NUM_TYPES);

View File

@ -0,0 +1,23 @@
#include "SHParticleEmitterComponent.h"
namespace SHADE
{
void SHParticleEmitterComponent::OnCreate(void)
{
timeBeforeEmission = emissionInterval;
// initialize all buffers here
}
void SHParticleEmitterComponent::OnDestroy(void)
{
}
void SHParticleEmitterComponent::Emit(void) noexcept
{
}
}

View File

@ -0,0 +1,95 @@
#pragma once
#include "Resource/SHHandle.h"
#include "Math/Vector/SHVec4.h"
#include "ECS_Base/Components/SHComponent.h"
namespace SHADE
{
class SHVkBuffer;
class SHParticleEmitterComponent : public SHComponent
{
private:
struct GPUEmitterStruct
{
//! Minimum emitting angular range
SHVec4 angularMin;
//! Maximum emitting angular range
SHVec4 angularMax;
//! Spawn lifetime and size range (min and max)
SHVec4 lifeAndSizeRange;
};
struct GPUParticleStruct
{
//! Position of the particle
SHVec4 position;
//! Rotation of the particle
SHVec4 rotation;
//! Velocity of the particle
SHVec4 velocity;
//! Acceleration of the particle
SHVec4 acceleration;
//! Scale of the texture
float scale;
//! Life of the particle
float life;
//! life decay rate
float lifeDecayRate;
//! Texture into the desc array that the particle is using
uint32_t textureIndex;
};
//! Max number of particles of this emitter
uint32_t maxParticles;
//! emission count per emit
uint32_t emissionCount;
//! emission interval of the emitter
float emissionInterval;
//! Counter that decreases to 0 from emissionInterval. When 0, emit particles.
float timeBeforeEmission;
//! Data for the emitter
Handle<SHVkBuffer> emitterData;
//! GPU Particle data
Handle<SHVkBuffer> particleData;
//! Freelist data
Handle<SHVkBuffer> freelistData;
//! Freelist data
Handle<SHVkBuffer> indicesData;
//! Freelist data
Handle<SHVkBuffer> drawCallData;
//! Emitter's data on the CPU side. To be copied to GPU.
GPUEmitterStruct emitterDataCPU;
//! If passive, emitter emits particles based on timer above.
bool isPassive;
public:
void OnCreate(void) override final;
void OnDestroy(void) override final;
void Emit (void) noexcept;
friend class SHParticleSubSystem;
};
}

View File

@ -0,0 +1,84 @@
#include "SHpch.h"
#include "SHParticleSubSustem.h"
#include "Graphics/Pipeline/SHPipelineLayoutParams.h"
#include "Graphics/MiddleEnd/GlobalData/SHGraphicsPredefinedData.h"
#include "Graphics/Devices/SHVkLogicalDevice.h"
#include "Graphics/MiddleEnd/Particles/SHParticleEmitterComponent.h"
#include "ECS_Base/Managers/SHComponentManager.h"
namespace SHADE
{
void SHParticleSubSystem::Init(Handle<SHVkLogicalDevice> device, Handle<SHVkRenderpass> compatibleRenderpass, Handle<SHSubpass> subpass, Handle<SHVkShaderModule> VS, Handle<SHVkShaderModule> FS, Handle<SHVkShaderModule> emitCS, Handle<SHVkShaderModule> defaultUpdateCS) noexcept
{
/*-----------------------------------------------------------------------*/
/* INITIALIZE ALL PIPELINES */
/*-----------------------------------------------------------------------*/
SHPipelineLayoutParams plParams
{
.shaderModules = {VS, FS},
.predefinedDescSetLayouts = SHGraphicsPredefinedData::GetSystemData(SHGraphicsPredefinedData::SystemType::PARTICLE_RENEDERING).descSetLayouts
};
renderingPipelineData.pipelineLayout = logicalDevice->CreatePipelineLayout(plParams);
renderingPipelineData.pipeline = logicalDevice->CreateGraphicsPipeline(renderingPipelineData.pipelineLayout, nullptr, compatibleRenderpass, subpass);
SHPipelineLayoutParams emitPlParams
{
.shaderModules = {emitCS},
.predefinedDescSetLayouts = SHGraphicsPredefinedData::GetSystemData(SHGraphicsPredefinedData::SystemType::PARTICLE_RENEDERING).descSetLayouts
};
emittingPipelineData.pipelineLayout = logicalDevice->CreatePipelineLayout(emitPlParams);
emittingPipelineData.pipeline = logicalDevice->CreateComputePipeline(emittingPipelineData.pipelineLayout);
SHPipelineLayoutParams defaultUpdatePlParams
{
.shaderModules = {defaultUpdateCS},
.predefinedDescSetLayouts = SHGraphicsPredefinedData::GetSystemData(SHGraphicsPredefinedData::SystemType::PARTICLE_RENEDERING).descSetLayouts
};
defaultUpdatePipelineData.pipelineLayout = logicalDevice->CreatePipelineLayout(defaultUpdatePlParams);
defaultUpdatePipelineData.pipeline = logicalDevice->CreateComputePipeline(defaultUpdatePipelineData.pipelineLayout);
/*-----------------------------------------------------------------------*/
/* OTHER INITIALIZATION */
/*-----------------------------------------------------------------------*/
SHComponentManager::CreateComponentSparseSet<SHParticleEmitterComponent>();
}
void SHParticleSubSystem::Run(Handle<SHVkCommandBuffer> cmdBuffer, uint32_t frameIndex, float dt) noexcept
{
auto& emitters = SHComponentManager::GetDense<SHParticleEmitterComponent>();
for (auto& emitter : emitters)
{
// Emit emitters here if there are ready to be emitted
if (emitter.isPassive)
{
// decrement emission timer
emitter.timeBeforeEmission -= dt;
// Check if time to emit
if (emitter.timeBeforeEmission <= 0.0f)
{
// reset timer
emitter.timeBeforeEmission = emitter.emissionInterval;
// Call dispatch here to emit particles
}
}
}
}
void SHParticleSubSystem::Render(Handle<SHVkCommandBuffer> cmdBuffer, Handle<SHRenderer> renderer, uint32_t frameIndex) noexcept
{
auto& emitters = SHComponentManager::GetDense<SHParticleEmitterComponent>();
}
void SHParticleSubSystem::Exit(void) noexcept
{
}
}

View File

@ -25,14 +25,37 @@ namespace SHADE
class SHParticleSubSystem class SHParticleSubSystem
{ {
private: private:
// To hold data for a pipeline and pipeline layout.
// We want this here because particles require 3 pipeline sets:
// - Rendering
// - Emit Compute
// - Update Compute
struct PipelineData
{
//! Pipeline
Handle<SHVkPipeline> pipeline;
//! Pipeline layout for pipeline creation
Handle<SHVkPipelineLayout> pipelineLayout;
};
//! Logical device for creation and destruction
Handle<SHVkLogicalDevice> logicalDevice; Handle<SHVkLogicalDevice> logicalDevice;
//! Pipeline data for rendering particles
PipelineData renderingPipelineData;
//! Pipeline data for emitting particles
PipelineData emittingPipelineData;
//! Pipeline data for updating particles
PipelineData defaultUpdatePipelineData;
public: public:
void Init(Handle<SHVkLogicalDevice> device, Handle<SHVkRenderpass> compatibleRenderpass, Handle<SHSubpass> subpass) noexcept; void Init(Handle<SHVkLogicalDevice> device, Handle<SHVkRenderpass> compatibleRenderpass, Handle<SHSubpass> subpass, Handle<SHVkShaderModule> VS, Handle<SHVkShaderModule> FS, Handle<SHVkShaderModule> emitCS, Handle<SHVkShaderModule> defaultUpdateCS) noexcept;
void Run(uint32_t frameIndex) noexcept; void Run(Handle<SHVkCommandBuffer> cmdBuffer, uint32_t frameIndex, float dt) noexcept;
void Render(Handle<SHVkCommandBuffer> cmdBuffer, Handle<SHRenderer> renderer, uint32_t frameIndex) noexcept; void Render(Handle<SHVkCommandBuffer> cmdBuffer, Handle<SHRenderer> renderer, uint32_t frameIndex) noexcept;
void Exit(void) noexcept; void Exit(void) noexcept;

View File

@ -1,7 +0,0 @@
#include "SHpch.h"
#include "SHParticleSubSustem.h"
namespace SHADE
{
}