Trying to add fluid simulation
This commit is contained in:
@@ -0,0 +1,82 @@
|
||||
#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;
|
||||
PScene scene;
|
||||
constexpr static float dt = 0.1f;
|
||||
};
|
||||
DEFINE_REF(SimulationComputePass)
|
||||
} // namespace Seele
|
||||
Reference in New Issue
Block a user