载入中...
搜索中...
未找到
VolumeFluidDiffuse.cpp
浏览该文件的文档.
8bool finite(glm::vec3 p) { return std::isfinite(p.x) && std::isfinite(p.y) && std::isfinite(p.z); }
10 return finite(p.position) && finite(p.velocity) && glm::length(p.velocity) <= 100.f && std::isfinite(p.life) &&
15 if (particles.size() > availableCapacity()) return Result<void>::failure(Diagnostic::error(DiagnosticCode::InvalidArgument, "Diffuse capacity exceeded", "fluids.volume.diffuse"));
17 if (!valid(particle)) return Result<void>::failure(Diagnostic::error(DiagnosticCode::InvalidArgument, "Invalid diffuse particle", "fluids.volume.diffuse"));
21Result<void> VolumeFluidDiffuse::advance(const VolumeFluid& fluid, float seconds, unsigned minimumNeighbors) {
22 if (!std::isfinite(seconds) || seconds <= 0.f || seconds > 1.f / 30.f || minimumNeighbors > 1000000)
23 return Result<void>::failure(Diagnostic::error(DiagnosticCode::InvalidArgument, "Invalid diffuse timestep or neighbor threshold", "fluids.volume.diffuse"));
47 if (!valid(particle)) return Result<void>::failure(Diagnostic::error(DiagnosticCode::InvalidArgument, "Invalid diffuse advection result", "fluids.volume.diffuse"));
58 if (snapshot.schema != "eve.volume-fluid-diffuse" || snapshot.version != 1 || snapshot.capacity == 0 ||
60 return Result<void>::failure(Diagnostic::error(DiagnosticCode::InvalidArgument, "Invalid diffuse snapshot", "fluids.volume.diffuse"));
62 if (!valid(p)) return Result<void>::failure(Diagnostic::error(DiagnosticCode::InvalidArgument, "Invalid diffuse snapshot particle", "fluids.volume.diffuse"));
static Diagnostic error(DiagnosticCode code, std::string message, std::string path={}, DiagnosticDetails details={}, std::string source={})
Construct an error diagnostic with the standard error severity.
Definition Diagnostic.h:125
static Result failure(Status status)
Construct a failed result from a structured status.
Definition Result.h:175
Result< void > advance(const VolumeFluid &fluid, float seconds, unsigned minimumNeighbors=4)
Advances once using current liquid/gas velocity, after the caller steps the fluid.
Definition VolumeFluidDiffuse.cpp:21
unsigned particleCount() const
Returns live count without copying particle data.
Definition VolumeFluidDiffuse.cpp:68
Result< void > emit(std::span< const VolumeFluidDiffuseParticle > particles)
Admits an entire batch or fails without mutation; finite speed must be <=100 m/s.
Definition VolumeFluidDiffuse.cpp:14
void clear()
Removes all particles, preserving configured capacity.
Definition VolumeFluidDiffuse.cpp:75
Result< void > restore(const VolumeFluidDiffuseSnapshot &snapshot)
Validates schema, capacity [1,65536] and all particles before replacing state.
Definition VolumeFluidDiffuse.cpp:57
unsigned availableCapacity() const
Returns remaining admission capacity without allocating.
Definition VolumeFluidDiffuse.cpp:69
VolumeFluidDiffuseSnapshot snapshot() const
Returns an owning snapshot; later mutation cannot change its values.
Definition VolumeFluidDiffuse.cpp:54
void copyRenderData(std::vector< glm::vec4 > &positionLife) const
Reuses caller storage to copy XY Z position and remaining life for rendering.
Definition VolumeFluidDiffuse.cpp:70
CPU position-based free-volume fluid with a bounded spatial grid. @ownership Owns all particle state;...
Definition VolumeFluid.h:517
@ InvalidArgument
Strict version-1 diffuse pool state; unknown fields and versions are rejected.
Definition VolumeFluidDiffuse.h:24
std::vector< VolumeFluidDiffuseParticle > particles
Definition VolumeFluidDiffuse.h:28
unsigned capacity
Definition VolumeFluidDiffuse.h:27