91 lines
4.2 KiB
C++
91 lines
4.2 KiB
C++
#pragma once
|
|
#include "Graphics/Buffer.h"
|
|
#include "Graphics/Descriptor.h"
|
|
#include "Graphics/Initializer.h"
|
|
#include "Graphics/RenderPass/RenderPass.h"
|
|
#include "Graphics/Resources.h"
|
|
#include "Math/Vector.h"
|
|
#include "Scene/Scene.h"
|
|
|
|
namespace Seele {
|
|
class SimulationComputePass : public RenderPass {
|
|
public:
|
|
SimulationComputePass(Gfx::PGraphics graphics, PScene scene);
|
|
virtual ~SimulationComputePass() override;
|
|
virtual void beginFrame(const Component::Camera& camera, const Seele::Component::Transform& transform) override;
|
|
virtual void render() override;
|
|
virtual void endFrame() override;
|
|
virtual void publishOutputs() override;
|
|
virtual void createRenderPass() override;
|
|
|
|
private:
|
|
UVector getDispatchSize(const UVector& gridSize, const UVector& threadGroupSize);
|
|
void setBoundsPass(Gfx::PShaderBuffer buffer, int b, UVector gridSize);
|
|
void linearSolvePass(Gfx::PShaderBuffer next, Seele::Gfx::PShaderBuffer current, Seele::Gfx::PShaderBuffer grid0, float a, float c, UVector gridSize);
|
|
void divergencePass(Gfx::PShaderBuffer divergence, Seele::Gfx::PShaderBuffer pressure, Seele::Gfx::PShaderBuffer velocityX,
|
|
Seele::Gfx::PShaderBuffer velocityY, Seele::Gfx::PShaderBuffer velocityZ, UVector gridSize);
|
|
void projectPass(Gfx::PShaderBuffer velocityX, Seele::Gfx::PShaderBuffer velocityY, Seele::Gfx::PShaderBuffer velocityZ,
|
|
Seele::Gfx::PShaderBuffer pressure, UVector gridSize);
|
|
void advectPass(Gfx::PShaderBuffer quantity, Seele::Gfx::PShaderBuffer quantity0, Seele::Gfx::PShaderBuffer velocityX,
|
|
Seele::Gfx::PShaderBuffer velocityY, Seele::Gfx::PShaderBuffer velocityZ, float dt, UVector gridSize);
|
|
void reinitializeLevelSetPass(Gfx::PShaderBuffer phi, Seele::Gfx::PShaderBuffer phi0, UVector gridSize);
|
|
struct SetBounds {
|
|
Gfx::OPipelineLayout pipelineLayout;
|
|
Gfx::ODescriptorLayout descriptorLayout;
|
|
Gfx::OComputeShader shader;
|
|
Gfx::PComputePipeline pipeline;
|
|
Gfx::OComputeShader shaderEdges;
|
|
Gfx::PComputePipeline pipelineEdges;
|
|
Gfx::OComputeShader shaderCorners;
|
|
Gfx::PComputePipeline pipelineCorners;
|
|
constexpr static UVector threadGroupSize = {32, 8, 1};
|
|
} setBounds;
|
|
struct LinearSolve {
|
|
Gfx::OPipelineLayout pipelineLayout;
|
|
Gfx::ODescriptorLayout descriptorLayout;
|
|
Gfx::OComputeShader shader;
|
|
Gfx::PComputePipeline pipeline;
|
|
constexpr static UVector threadGroupSize = {32, 8, 1};
|
|
} linearSolve;
|
|
struct ComputeDivergence {
|
|
Gfx::OPipelineLayout pipelineLayout;
|
|
Gfx::ODescriptorLayout descriptorLayout;
|
|
Gfx::OComputeShader shader;
|
|
Gfx::PComputePipeline pipeline;
|
|
constexpr static UVector threadGroupSize = {32, 8, 1};
|
|
} computeDivergence;
|
|
struct Project {
|
|
Gfx::OPipelineLayout pipelineLayout;
|
|
Gfx::ODescriptorLayout descriptorLayout;
|
|
Gfx::OComputeShader shader;
|
|
Gfx::PComputePipeline pipeline;
|
|
constexpr static UVector threadGroupSize = {32, 8, 1};
|
|
} project;
|
|
struct Advect {
|
|
Gfx::OPipelineLayout pipelineLayout;
|
|
Gfx::ODescriptorLayout descriptorLayout;
|
|
Gfx::OComputeShader shader;
|
|
Gfx::PComputePipeline pipeline;
|
|
constexpr static UVector threadGroupSize = {32, 8, 1};
|
|
} advect;
|
|
struct Reinitialize {
|
|
Gfx::OPipelineLayout pipelineLayout;
|
|
Gfx::ODescriptorLayout descriptorLayout;
|
|
Gfx::OComputeShader shader;
|
|
Gfx::PComputePipeline pipeline;
|
|
constexpr static UVector threadGroupSize = {32, 8, 1};
|
|
} reinitialize;
|
|
struct ApplyForces {
|
|
Gfx::OPipelineLayout pipelineLayout;
|
|
Gfx::ODescriptorLayout descriptorLayout;
|
|
Gfx::OComputeShader shader;
|
|
Gfx::PComputePipeline pipeline;
|
|
constexpr static UVector threadGroupSize = {32, 8, 1};
|
|
} applyForces;
|
|
void applyForcesPass(Gfx::PShaderBuffer velocityX, Gfx::PShaderBuffer velocityY, Gfx::PShaderBuffer velocityZ, Vector gravity, float dt, UVector gridSize);
|
|
Gfx::ODescriptorLayout gridSizeLayout;
|
|
Gfx::ODescriptorSet gridSizeSet;
|
|
PScene scene;
|
|
};
|
|
DEFINE_REF(SimulationComputePass)
|
|
} // namespace Seele
|