载入中...
搜索中...
未找到
Fluids.h
浏览该文件的文档.
1#pragma once
2#include "common/Export.h"
3
4
15#include "common/Module.h"
16#include "fluids/FluidMath.h"
17#include "fluids/FluidSdf.h"
28
29#include <glm/glm.hpp>
30
31#include <memory>
32#include <vector>
33
34namespace eve::gpgpu {
35class ComputeShader;
36class Gpgpu;
37class GpuBuffer;
38class Sequence;
39} // namespace eve::gpgpu
40
41namespace eve::fluids {
42
45public:
52 FluidSimulator(int maxParticles, const FluidParams& params, bool preferGpu);
55
58
60 void setSdf(const MeshSdf& sdf);
61
64 const MeshSdf& sdf() const { return sim_.sdf(); }
65
73 int spawnDrop(const glm::vec3& center, float radius, int count);
74
76 void step(float dt);
77
79 [[nodiscard("check the fluid step outcome")]]
82 [[nodiscard]] eve::physics::SimulationObservation observation() const noexcept override { return observation_; }
92 [[nodiscard("check fluid observation restore")]]
93 eve::Result<void> restoreObservation(const eve::physics::SimulationObservation& observation) override;
94
96 [[nodiscard]] bool usedBackendFallback() const noexcept { return backendFallback_; }
98 [[nodiscard("inspect fluid backend selection diagnostics")]]
100 return backendSelectionStatus_;
101 }
102
105 int getParticleCount() const { return sim_.particleCount(); }
106
109 int getMaxParticles() const { return sim_.maxParticles(); }
110
113 bool usingGpu() const { return gpuOk_; }
114
116 void readPositions(std::vector<glm::vec3>& out) const;
117
119 void readDensities(std::vector<float>& out) const;
120
123 FluidParams& params() { return sim_.params(); }
124
127 const FluidParams& params() const { return sim_.params(); }
128
130 void setGravity(float x, float y, float z);
131
133 void setViscosity(float viscosity);
134
136 void setCohesion(float cohesion);
137
139 void setAdhesion(float adhesion);
140
142 void setPbfIterations(int passes);
143
145 void setDamping(float damping);
146
148 void setParticleRadius(float radius);
149
151 void setSupportRadius(float h);
152
161 void setSdfSphere(float cx, float cy, float cz, float radius, int res);
162
163private:
164 bool ensureGpu();
165 void stepSolver(float dt, int substeps);
166 void uploadSdf();
167 void uploadParticles();
168 void downloadParticles();
169 void setCommonConstants(gpgpu::ComputeShader* shader, float dt);
170
171 FluidSimulation sim_;
172 bool preferGpu_ = false;
173 bool gpuOk_ = false;
174 bool backendFallback_ = false;
175 bool sdfDirty_ = true;
177 eve::Status backendSelectionStatus_ = eve::Status::success();
178
179 eve::gpgpu::Gpgpu* gpgpu_ = nullptr;
180 eve::gpgpu::ComputeShader* shClear_ = nullptr;
181 eve::gpgpu::ComputeShader* shBuild_ = nullptr;
182 eve::gpgpu::ComputeShader* shDensityLambda_ = nullptr;
183 eve::gpgpu::ComputeShader* shDelta_ = nullptr;
184 eve::gpgpu::ComputeShader* shApply_ = nullptr;
185 eve::gpgpu::ComputeShader* shIntegrate_ = nullptr;
186 eve::gpgpu::ComputeShader* shAdvance_ = nullptr;
187 eve::gpgpu::GpuBuffer* bufPos_ = nullptr;
188 eve::gpgpu::GpuBuffer* bufVel_ = nullptr;
189 eve::gpgpu::GpuBuffer* bufHead_ = nullptr;
190 eve::gpgpu::GpuBuffer* bufNext_ = nullptr;
191 eve::gpgpu::GpuBuffer* bufDens_ = nullptr;
192 eve::gpgpu::GpuBuffer* bufLambda_ = nullptr;
193 eve::gpgpu::GpuBuffer* bufGrad_ = nullptr;
194 eve::gpgpu::GpuBuffer* bufSdf_ = nullptr;
195 eve::gpgpu::GpuBuffer* stagePos_ = nullptr;
196 eve::gpgpu::GpuBuffer* stageVel_ = nullptr;
197 eve::gpgpu::GpuBuffer* stageDens_ = nullptr;
198 eve::gpgpu::Sequence* seq_ = nullptr;
199 SimGrid grid_;
200};
201
204public:
209 ~Fluids() override;
210
211 // The two `vector<unique_ptr<...>>` members make the implicit copy operations
212 // ill-formed (C2280) the moment a class-level dllexport instantiates them;
213 // spell the four out so the export surface stays defined. Semantics unchanged:
214 // a module instance was never copyable or assignable in practice.
215 Fluids(const Fluids&) = delete;
216 Fluids& operator=(const Fluids&) = delete;
218 Fluids(Fluids&&) = default;
220 Fluids& operator=(Fluids&&) = default;
221
227 FluidSimulator* newSimulator(int maxParticles = 8192);
228
241 FluidSurfaceRenderer* newSurfaceRenderer(int width = 160, int height = 160);
242
245 int getSimulatorCount() const;
246
249 int getRendererCount() const;
250
251private:
252 std::vector<std::unique_ptr<FluidSimulator>> simulators_;
253 std::vector<std::unique_ptr<FluidSurfaceRenderer>> renderers_;
254};
255
256} // namespace eve::fluids
float y
Definition AnimClip.cpp:738
float x
Definition AnimClip.cpp:738
float z
Definition AnimClip.cpp:738
float cx
Definition CardTypes.cpp:33
float cy
Definition CardTypes.cpp:34
#define EVENGINE_API_DOMAINS
Definition Export.h:110
int h
std::uint32_t height
std::uint32_t width
float radius
Shader * shader
Backend-neutral, observable fixed-step contract for physics domains.
std::uint32_t count
Domain contracts separating surface simulation, constraints, and SSF presentation.
TerrainThermalSettings settings
float step
Definition TreeMesh.cpp:314
EVENGINE_API_FOUNDATION public API.
Definition Module.h:46
Move-only operation result carrying either a value or Status.
Definition Result.h:155
Structured status and zero or more diagnostics for an operation.
Definition Status.h:68
static Status success(StatusCode code=StatusCode::Ok)
Construct a successful status with an explicit non-error outcome.
Definition Status.h:81
CPU reference surface-flow solver.
GPU-backed surface fluid simulator (falls back to the CPU solver).
Definition Fluids.h:44
bool usedBackendFallback() const noexcept
Whether optional accelerator selection fell back to CPU.
Definition Fluids.h:96
FluidParams & params()
Params.
Definition Fluids.h:123
FluidSimulator(const FluidSimulator &)=delete
eve::physics::SimulationObservation observation() const noexcept override
Returns completed tick/time observables.
Definition Fluids.h:82
bool usingGpu() const
Using gpu.
Definition Fluids.h:113
eve::physics::SimulationBackendKind kind() const noexcept override
Reports the actual CPU or production GPU path selected.
Definition Fluids.h:84
const MeshSdf & sdf() const
Sdf.
Definition Fluids.h:64
eve::physics::SimulationDeterminism determinism() const noexcept override
CPU/GPGPU particle results are equivalent within a numeric tolerance.
Definition Fluids.h:88
FluidSimulator & operator=(const FluidSimulator &)=delete
int getParticleCount() const
Returns the particle count.
Definition Fluids.h:105
const FluidParams & params() const
Params.
Definition Fluids.h:127
int getMaxParticles() const
Returns the max particles.
Definition Fluids.h:109
eve::Status backendSelectionStatus() const
Selection status, including observable provider/degraded-path diagnostics.
Definition Fluids.h:99
Buffer-level screen-space fluid renderer.
Fluids module — factory + script binding.
Definition Fluids.h:203
Fluids & operator=(const Fluids &)=delete
Fluids(Fluids &&)=default
Fluids.
Fluids(const Fluids &)=delete
~Fluids() override
Fluids.
Fluids & operator=(Fluids &&)=default
Operator =.
Uniform signed-distance voxel field over a box.
Definition FluidSdf.h:28
Backend-agnostic compute program. Bind storage buffers then dispatch via Gpgpu::dispatch....
GPGPU module — compute shaders + storage buffers via the active Graphics backend. Uses the graphics q...
Definition Gpgpu.h:23
Backend-agnostic GPU buffer for compute (storage) or CPU staging transfers. Squirrel-owned; derived c...
Definition GpuBuffer.h:18
EVENGINE_API_WORLD public API.
Definition Sequence.h:41
Minimal observable contract for physics simulation providers.
std::vector< ParamSpec > params
GLSL compute kernels for the GPU surface-flow solver.
Definition FluidTarget.h:12
Fluids module — interactive surface fluid simulation.
Definition Fluids.h:34
SimulationBackendKind
Kind of implementation that owns a simulation step.
SimulationDeterminism
Determinism guarantee made by a simulation backend.
@ ToleranceBounded
Results are equivalent within a documented numeric tolerance.
One deterministic fixed-step emitted by SimulationClock.
Definition Time.h:158
Tuning knobs of one fluid simulation.
Definition FluidMath.h:26
Uniform grid used for neighbor queries.
Observable backend progress shared by CPU and accelerator providers.
Validated solver policy for one simulation step.