载入中...
搜索中...
未找到
FluidSimulation.h
浏览该文件的文档.
1#pragma once
2#include "common/Export.h"
3
4
15#include "fluids/FluidMath.h"
16#include "fluids/FluidSdf.h"
17
18#include <glm/glm.hpp>
19
20#include <vector>
21
22namespace eve::fluids {
23
25struct SimGrid {
27 glm::vec3 origin{0.f};
29 glm::ivec3 dims{0};
31 float cellSize = 1.f;
32
34 static SimGrid make(const MeshSdf& sdf, float cellSize);
35
38 int cellCount() const;
39
42 int cellIndex(int x, int y, int z) const;
43
46 bool inBounds(int x, int y, int z) const;
47
50 glm::ivec3 cellOf(const glm::vec3& p) const;
51};
52
55public:
61 explicit FluidSimulation(int maxParticles, const FluidParams& params = FluidParams{});
62
64 void setSdf(const MeshSdf& sdf);
65
68 const MeshSdf& sdf() const { return sdf_; }
69
71 void clear();
72
80 int spawnDrop(const glm::vec3& center, float radius, int count);
81
83 void step(float dt);
89 void step(float dt, int substeps);
90
93 int particleCount() const { return count_; }
94
97 int maxParticles() const { return maxParticles_; }
98
101 const std::vector<FluidParticle>& particles() const { return particles_; }
102
105 std::vector<FluidParticle>& particles() { return particles_; }
106
109 const std::vector<float>& densities() const { return densities_; }
110
113 std::vector<float>& densities() { return densities_; }
114
117 FluidParams& params() { return params_; }
118
121 const FluidParams& params() const { return params_; }
122
123private:
124 void rebuildGrid();
125 void computeDensitiesAndGrads();
126 void computeLambdas();
127 void applyPositionCorrections();
128 void integrate(float dt);
129
130 FluidParams params_;
131 MeshSdf sdf_;
132 SimGrid grid_;
133 int maxParticles_ = 0;
134 int count_ = 0;
135 std::vector<FluidParticle> particles_;
136 std::vector<float> densities_;
137 std::vector<float> lambdas_;
138 std::vector<glm::vec3> gradSums_;
139 std::vector<int> cellHead_;
140 std::vector<int> cellNext_;
141};
142
143} // namespace eve::fluids
float y
Definition AnimClip.cpp:738
float x
Definition AnimClip.cpp:738
float z
Definition AnimClip.cpp:738
glm::vec4 p[6]
#define EVENGINE_API_DOMAINS
Definition Export.h:110
float radius
std::uint32_t count
float step
Definition TreeMesh.cpp:314
CPU reference surface-flow solver.
int maxParticles() const
Max particles.
std::vector< float > & densities()
Densities.
const FluidParams & params() const
Params.
FluidParams & params()
Params.
int particleCount() const
Particle count.
const std::vector< FluidParticle > & particles() const
Particles.
const MeshSdf & sdf() const
Sdf.
const std::vector< float > & densities() const
Densities.
std::vector< FluidParticle > & particles()
Particles.
Uniform signed-distance voxel field over a box.
Definition FluidSdf.h:28
std::vector< ParamSpec > params
GLSL compute kernels for the GPU surface-flow solver.
Definition FluidTarget.h:12
Tuning knobs of one fluid simulation.
Definition FluidMath.h:26
Uniform grid used for neighbor queries.
bool inBounds(int x, int y, int z) const
In bounds.
static SimGrid make(const MeshSdf &sdf, float cellSize)
Build a grid covering the SDF domain plus one cell of padding.
float cellSize
Cell size in world units (== SPH support radius).
int cellCount() const
Cell count.
glm::vec3 origin
World position of cell (0,0,0).
glm::ivec3 cellOf(const glm::vec3 &p) const
Cell of.
int cellIndex(int x, int y, int z) const
Cell index.
glm::ivec3 dims
Cell counts per axis.