载入中...
搜索中...
未找到
VolumeFluidEmitter.h
浏览该文件的文档.
1#pragma once
2#include "common/Export.h"
3
4
5#include <cstdint>
6#include "common/Result.h"
8
9namespace eve::fluids {
10
13
17 float particleSize = 0.1f;
19 float particleMass = 1.f;
21 float smoothingRadius = 0.2f;
22};
23
26 unsigned capacity = 1000;
27 float resolution = 1.f, restDensity = 1000.f, smoothing = 2.f;
28 float viscosity = .05f, surfaceTension = 1.f;
29 float buoyancy = -1.f, atmosphericDrag = 0.f, atmosphericPressure = 0.f, vorticity = 0.f;
30 float diffusion = 0.f;
31 glm::vec4 diffusionData{0.f};
32};
33
36 unsigned capacity = 1000;
37 float resolution = 1.f, restDensity = 1000.f;
39 float randomness = 0.f;
40};
41
47 float resolution, float restDensity, float smoothing);
48
51 glm::vec3 position{0.f};
52 glm::vec4 color{1.f};
54 glm::vec3 direction{0.f, 0.f, 1.f};
55};
56
64 std::span<const glm::vec4> pixels, unsigned width, unsigned height, float pixelScale, float maximumSize,
65 float spacing, float alphaThreshold);
74 std::span<const glm::vec3> vertices, std::span<const uint32_t> indices, glm::vec3 scale, float spacing);
81 float radius, float spacing, bool surface);
88 glm::vec3 size, float spacing, bool surface);
95 float length, float spacing, float radialVelocityDegrees);
102 float radius, float spacing, bool edgeEmission);
103
107 glm::vec3 origin{0.f, 1.f, 0.f};
108 glm::vec3 direction{0.f, -1.f, 0.f};
110 glm::vec3 extent{0.1f};
112 float speed = 1.f, jitter = 0.f;
114 float randomVelocity = 0.f;
116 bool useShapeColor = true;
118 unsigned actorCapacity = 1000;
124 uint32_t seed = 1;
126 std::vector<VolumeFluidDistributionPoint> distribution;
127};
128
144 const VolumeFluidEmission& base, std::span<const VolumeFluidEmission> shapes);
145
152
160
167
173 const VolumeFluidEmission& emission,
174 unsigned count);
175
178 std::string schema = "eve.volume-fluid-emitter-state";
179 unsigned version = 1;
180 unsigned kind = 0;
182 std::string phase = "0";
183 uint32_t sequence = 0;
184 bool emitting = false;
185};
186
195
198 glm::vec3 position{0.f};
199 glm::vec4 rotation{0.f, 0.f, 0.f, 1.f};
200};
201
208public:
215 [[nodiscard]] Result<unsigned> emitParticle(VolumeFluid& solver, const VolumeFluidEmission& emission, float offset,
216 float dt);
223 [[nodiscard]] Result<unsigned> advance(VolumeFluid& solver, const VolumeFluidEmission& emission, float dt,
224 float rate, unsigned maxPerStep = 256, float minimumPoolFraction = 0.5f);
234 [[nodiscard]] Result<unsigned> advanceBurst(VolumeFluid& solver, const VolumeFluidEmission& emission,
235 unsigned count, float minimumPoolFraction = 0.5f);
237 [[nodiscard]] bool isEmitting() const noexcept { return emitting_; }
239 [[nodiscard]] VolumeFluidEmitterSnapshot snapshot() const;
241 [[nodiscard]] Result<void> restore(const VolumeFluidEmitterSnapshot& state);
242
243private:
244 double credit_ = 0.0;
245 uint32_t sequence_ = 0;
246 bool emitting_ = false;
247};
248
256public:
264 [[nodiscard]] Result<unsigned> advanceMoving(VolumeFluid& solver, const VolumeFluidEmission& emission,
266 float dt, unsigned maxPerStep = 256, float minimumPoolFraction = 0.5f,
267 float inheritVelocity = 0.f);
275 [[nodiscard]] Result<unsigned> advance(VolumeFluid& solver, const VolumeFluidEmission& emission, float dt,
276 unsigned maxPerStep = 256, float minimumPoolFraction = 0.5f);
278 [[nodiscard]] bool isEmitting() const noexcept { return emitting_; }
280 [[nodiscard]] VolumeFluidEmitterSnapshot snapshot() const;
282 [[nodiscard]] Result<void> restore(const VolumeFluidEmitterSnapshot& state);
283
284private:
286 std::vector<VolumeFluidDistributionPoint> layerPoints_;
287 double distance_ = 0.0;
288 uint32_t sequence_ = 0;
289 bool emitting_ = false;
290};
291
293[[nodiscard]] EVENGINE_API_DOMAINS VolumeFluidEmitterCheckpoint captureVolumeFluidEmitterCheckpoint(
294 const VolumeFluid& solver, const VolumeFluidEmission& emission, const VolumeFluidEmitter& controller);
296[[nodiscard]] EVENGINE_API_DOMAINS VolumeFluidEmitterCheckpoint captureVolumeFluidEmitterCheckpoint(
297 const VolumeFluid& solver, const VolumeFluidEmission& emission, const VolumeFluidJetEmitter& controller);
305 VolumeFluid& solver, VolumeFluidEmitter& controller, const VolumeFluidEmitterCheckpoint& checkpoint);
308 VolumeFluid& solver, VolumeFluidJetEmitter& controller, const VolumeFluidEmitterCheckpoint& checkpoint);
309
310} // namespace eve::fluids
float length
Definition CaveMesh.cpp:94
#define EVENGINE_API_DOMAINS
Definition Export.h:110
std::vector< std::uint32_t > indices
std::uint32_t height
std::uint32_t width
size_t offset
std::array< float, 3 > scale
std::vector< Point > vertices
float radius
float begin
uint8_t * pixels
Move-only, checked operation results for the common layer.
std::uint32_t count
int spacing
float size
Definition TreeMesh.cpp:156
Move-only operation result carrying either a value or Status.
Definition Result.h:155
Bounded runtime stream controller with explicit snapshot/restore.
bool isEmitting() const noexcept
Returns the current Fluid3DEmitter isEmitting state in O(1), without snapshot allocation.
Spacing-driven planar/distribution jet controller with independent, owned stream phase.
bool isEmitting() const noexcept
Returns whether the jet currently owns an active emission phase, without allocation.
CPU position-based free-volume fluid with a bounded spatial grid. @ownership Owns all particle state;...
GLSL compute kernels for the GPU surface-flow solver.
Definition FluidTarget.h:12
Result< std::vector< VolumeFluidDistributionPoint > > buildVolumeFluidEdgeDistribution(float length, float spacing, float radialVelocityDegrees)
Builds Fluid3D's edge lattice with per-sample radial velocity directions.
Result< std::vector< VolumeFluidDistributionPoint > > buildVolumeFluidCubeDistribution(glm::vec3 size, float spacing, bool surface)
Builds an Fluid3D-compatible box surface or volume lattice during setup.
VolumeFluidEmitterCheckpoint captureVolumeFluidEmitterCheckpoint(const VolumeFluid &solver, const VolumeFluidEmission &emission, const VolumeFluidEmitter &controller)
Captures one completed-step rate-emitter checkpoint without retaining references.
Result< void > restoreVolumeFluidEmitterCheckpoint(VolumeFluid &solver, VolumeFluidEmitter &controller, const VolumeFluidEmitterCheckpoint &checkpoint)
Atomically restores solver and rate controller after validating the complete owning candidate.
Result< std::vector< VolumeFluidDistributionPoint > > buildVolumeFluidDiskDistribution(float radius, float spacing, bool edgeEmission)
Builds Fluid3D's concentric disk or circumference-only distribution.
EVENGINE_API_DOMAINS Result< std::vector< VolumeFluidDistributionPoint > > buildVolumeFluidMeshDistribution(std::span< const glm::vec3 > vertices, std::span< const uint32_t > indices, glm::vec3 scale, float spacing)
Voxelizes indexed triangles, returning surface and enclosed interior cell centers.
Result< VolumeFluidEmission > composeVolumeFluidEmitterShapes(const VolumeFluidEmission &base, std::span< const VolumeFluidEmission > shapes)
Builds one emitter distribution from an ordered set of Fluid3D emitter shapes.
VolumeFluidEmissionShape
Local nozzle domain; disk/square lie in XY, edge lies on X.
Result< std::vector< VolumeFluidDistributionPoint > > buildVolumeFluidSphereDistribution(float radius, float spacing, bool surface)
Builds an Fluid3D-compatible spherical surface or volume lattice during setup.
Result< std::vector< VolumeFluidDistributionPoint > > buildVolumeFluidImageDistribution(std::span< const glm::vec4 > pixels, unsigned width, unsigned height, float pixelScale, float maximumSize, float spacing, float alphaThreshold)
Precomputes a bilinear alpha-masked image distribution on a spacing lattice.
Result< VolumeFluidEmitterBlueprintMetrics > evaluateVolumeFluidEmitterBlueprint3D(float resolution, float restDensity, float smoothing)
Evaluates Fluid3DEmitterBlueprintBase/Fluid3DEmitterBlueprint formulas in 3D.
Result< VolumeFluidEmitterBlueprintApplication3D > prepareVolumeFluidEmitterBlueprint3D(const VolumeFluidEmitterBlueprint3D &blueprint)
Atomically maps every Fluid3DEmitterBlueprint field to native 3D setup values.
Result< VolumeFluidEmitterBlueprintApplication3D > prepareVolumeGranularEmitterBlueprint3D(const VolumeGranularEmitterBlueprint3D &blueprint)
Atomically maps an Fluid3DGranularEmitterBlueprint to owned native 3D setup values.
Result< unsigned > emitVolumeFluidBurst(VolumeFluid &solver, const VolumeFluidEmission &e, unsigned count)
Generates at most 4096 particles and admits the entire burst atomically.
Owned precomputed local emission sample, including shape-specific color.
glm::vec3 direction
Local normalized emission direction; transformed by the nozzle pose.
Value-owned emission description; +Z is mapped to direction.
VolumeFluidParticle prototype
Material/color/data/lifetime copied to emitted particles; position/velocity are generated.
glm::vec3 extent
Half extents; disk/sphere use x as radius.
float speed
Nozzle speed and independent per-axis uniform native velocity jitter, m/s.
std::vector< VolumeFluidDistributionPoint > distribution
Precomputed shape points, used only by Distribution; maximum 4096, copied by value.
bool useShapeColor
Whether Distribution points replace prototype color, matching Fluid3DEmitter useShapeColor.
float randomVelocity
Fluid3D randomVelocity blend between the shape direction and a seeded unit vector,...
unsigned actorCapacity
Maximum live particles owned by this emitter actor, matching Fluid3DEmitterBlueprintBase capacity.
uint32_t seed
Explicit named emission RNG stream seed; never touches a global RNG.
float granularRadiusRandomness
Granular radius reduction percentage in [0,100]; zero preserves the prototype radius.
Owning Fluid3DEmitterBlueprint values used to prepare a native 3D emitter.
Fully owned native setup prepared from one Fluid3D-emitter blueprint.
Exact 3D metrics derived by Fluid3DEmitterBlueprintBase from resolution and density.
float particleMass
Per-particle rest mass in kilograms.
float smoothingRadius
Fluid support radius in metres.
float particleSize
Recommended solver rest spacing and particle diameter in metres.
Version-1 owning atomic checkpoint for a solver, emission description and controller.
Version-1 owning state for rate (kind 0) or jet (kind 1) controllers.
std::string phase
Decimal double text preserves phase across float32 scripting VMs.
Owning world-space nozzle pose; rotation is a unit quaternion in XYZW order.
Owning particle value with world position and velocity in SI units.
Definition VolumeFluid.h:96
Meter-space (+Y up) volume-fluid material and solver policy.
Definition VolumeFluid.h:82
Canonical version-20 owning state; older codecs migrate collider, attachment, stitch,...
Owning Fluid3DGranularEmitterBlueprint values used to prepare a native 3D emitter.
float randomness
Fluid3D radius-reduction percentage; runtime accepts the meaningful [0,100] range.