载入中...
搜索中...
未找到
VolumeFluid.h
浏览该文件的文档.
1#pragma once
2#include "common/Export.h"
3
4
5#include "common/Result.h"
6#include "fluids/FluidSdf.h"
7
8#include <array>
9#include <cstdint>
10#include <glm/vec3.hpp>
11#include <glm/vec4.hpp>
12#include <memory>
13#include <span>
14#include <string>
15#include <vector>
16
17namespace eve::fluids {
18
20enum class VolumeFluidPhase : uint8_t { Liquid, Gas, Granular, Solid };
21
23enum class VolumeFluidMaterialCombineMode : uint8_t { Average = 0, Minimum = 1, Multiply = 2, Maximum = 3 };
24
66
70 float viscosity = 0.f;
72 glm::vec4 color{1.f};
73};
74
77 float coordinate = 0.f;
78 glm::vec4 color{1.f};
79};
80
84 unsigned capacity = 8192;
86 float spacing = 0.1f;
88 glm::vec3 gravity{0.f, -9.81f, 0.f};
90 glm::vec3 minimum{-2.f, 0.f, -1.f}, maximum{2.f, 3.f, 1.f};
92 unsigned iterations = 5;
93};
94
97 glm::vec3 position{0.f};
98 glm::vec3 velocity{0.f};
100 glm::vec3 angularVelocity{0.f};
102 glm::vec3 radii{0.f};
104 glm::vec4 orientation{0.f, 0.f, 0.f, 1.f};
108 glm::vec4 color{0.1f, 0.5f, 0.9f, 1.f}, data{0.f};
110 float life = 0.f;
112 unsigned collisionFilter = 0xffff0001u;
114 unsigned actorGroup = 0;
116 bool selfCollide = true;
117};
118
121
125 glm::vec3 center{0.f};
126 glm::vec3 direction{0.f, 0.f, 1.f};
127 float intensity = 0.f;
128 float turbulence = 0.f;
130 float turbulenceSeed = 0.f;
131 float radius = 5.f;
132 bool radial = true;
133};
134
137
177
202
205 unsigned label = 0;
207 std::vector<float> heights;
209 glm::ivec2 resolution{2, 2};
211 glm::vec3 size{1.f};
212 glm::vec3 position{0.f};
214 glm::vec4 rotation{0.f, 0.f, 0.f, 1.f};
215 glm::vec3 velocity{0.f};
216 glm::vec3 angularVelocity{0.f};
217 float friction = 0.2f;
218 float staticFriction = 0.2f;
219 float rollingFriction = 0.f;
220 float stickiness = 0.f;
221 float stickDistance = 0.f;
224 bool rollingContacts = false;
225 unsigned collisionFilter = 0xffff0001u;
227 bool isTrigger = false;
228};
229
232 unsigned label = 0;
233 glm::vec3 position{0.f};
234 glm::vec4 rotation{0.f, 0.f, 0.f, 1.f};
235 float scale = 1.f;
236 glm::vec3 velocity{0.f};
237 glm::vec3 angularVelocity{0.f};
238};
239
241enum class VolumeFluidSdfSliceAxis { X = 0, Y = 1, Z = 2 };
242
245 unsigned width = 0, height = 0;
247 glm::vec3 origin{0.f};
249 glm::vec3 stepX{0.f}, stepY{0.f};
251 std::vector<float> values;
252};
253
256 unsigned colliderLabel = 0;
257 glm::vec3 point{0.f}, normal{0.f}, impulse{0.f};
259 unsigned particleIndex = 0;
261 unsigned actorGroup = 0;
263 float distance = 0.f;
264};
265
267enum class VolumeFluidContactEventType : uint8_t { Enter, Stay, Exit };
268
274
277public:
285 [[nodiscard]] Result<std::vector<VolumeFluidContactEvent>> advance(std::span<const VolumeFluidContact> contacts,
286 float distanceThreshold = .01f);
288 void reset();
289
290private:
291 std::vector<VolumeFluidContact> previous_;
292 std::vector<VolumeFluidContact> scratch_;
293};
294
298 unsigned colliderLabel = 0;
300 glm::vec3 point{0.f};
302 glm::vec3 impulse{0.f};
304 glm::vec3 angularImpulse{0.f};
305};
306
309 unsigned colliderLabel = 0;
310 float rate = 0.f;
311 float minimumViscosity = 0.05f, maximumViscosity = 10.f;
312 float minimumCohesion = 0.5f, maximumCohesion = 2.f;
313};
314
318 glm::vec3 velocity{0.f};
320 glm::vec3 vorticity{0.f};
322 float density = 0.f;
324 unsigned neighborCount = 0;
325};
326
330 glm::vec3 center{0.f};
332 glm::vec3 size{0.f};
334 unsigned particleCount = 0;
335};
336
340 unsigned particleIndex = 0;
342 glm::vec3 origin{0.f};
344 glm::vec3 x{0.f}, y{0.f}, z{0.f};
345};
346
350 unsigned particleIndex = 0;
351 glm::vec3 position{0.f};
353 glm::vec4 orientation{0.f, 0.f, 0.f, 1.f};
355 glm::vec3 scale{1.f};
356 glm::vec4 color{1.f};
357};
358
361
372
375 std::vector<VolumeFluidParticleEvent> events;
377 uint64_t dropped = 0;
378};
379
383 float mass = 0.f;
385 glm::vec3 centerOfMass{0.f};
387 unsigned particleCount = 0;
388};
389
393 unsigned particleIndex = 0;
395 float distance = 0.f;
396 glm::vec3 point{0.f};
397 glm::vec3 normal{0.f, 1.f, 0.f};
400};
401
405 unsigned particleIndex = 0;
407 float distance = 0.f;
409 glm::vec3 queryPoint{0.f};
411 glm::vec3 normal{0.f, 1.f, 0.f};
414};
415
417enum class VolumeFluidQueryType : unsigned { Sphere = 0, Box = 1, Ray = 2 };
418
423 glm::vec3 center{0.f};
425 glm::vec3 size{0.f};
427 glm::vec4 rotation{0.f, 0.f, 0.f, 1.f};
428 float contactOffset = 0.f;
429 float maxDistance = 0.f;
430 unsigned phaseMask = 0x0f;
432 unsigned collisionFilter = 0xffff0001u;
433};
434
437 unsigned queryIndex = 0;
438 unsigned particleIndex = 0;
439 float distance = 0.f;
440 glm::vec3 queryPoint{0.f};
441 glm::vec3 normal{0.f, 1.f, 0.f};
443};
444
448 std::array<unsigned, 3> particleIndices{0, 0, 0};
449 unsigned size = 1;
450};
451
454 glm::vec4 simplexBary{1.f, 0.f, 0.f, 0.f};
455 glm::vec3 queryPoint{0.f};
456 glm::vec3 normal{0.f, 1.f, 0.f};
457 float distance = 0.f;
459 unsigned simplexIndex = 0;
460 unsigned queryIndex = 0;
461};
462
466 unsigned particleIndex = 0;
468 unsigned colliderLabel = 0;
470 glm::vec3 localPosition{0.f};
472 glm::vec4 localOrientation{0.f, 0.f, 0.f, 1.f};
476 bool dynamic = false;
478 float compliance = 0.f;
480 float breakThreshold = 1e12f;
481};
482
488 float compliance = 0.f;
489};
490
494 std::string schema = "eve.volume-fluid";
495 unsigned version = 20;
497 std::vector<VolumeFluidParticle> particles;
498 std::vector<VolumeFluidCollider> colliders;
499 std::vector<VolumeFluidSdfCollider> sdfColliders;
500 std::vector<VolumeFluidHeightFieldCollider> heightFieldColliders;
501 std::vector<VolumeFluidAttachment> attachments;
502 std::vector<VolumeFluidStitch> stitches;
504 std::vector<VolumeFluidSimplex> simplexes;
505};
506
518public:
520 [[nodiscard]] static Result<std::unique_ptr<VolumeFluid>> create(const VolumeFluidSettings& settings);
522 VolumeFluid(const VolumeFluid&) = delete;
524
526 [[nodiscard]] Result<void> emit(std::span<const VolumeFluidParticle> particles);
533 [[nodiscard]] Result<void> configureParticleEvents(unsigned capacity);
538 [[nodiscard]] VolumeFluidParticleEventBatch drainParticleEvents();
551 [[nodiscard]] Result<void> step(float seconds, unsigned substeps = 4);
558 [[nodiscard]] Result<void> setParticleWinds(std::span<const glm::vec3> winds);
564 [[nodiscard]] Result<void> setParticleExternalForces(std::span<const glm::vec3> forces);
574 [[nodiscard]] Result<void> accumulateWindZones(std::span<const VolumeFluidWindZone> zones, float fixedTimeSeconds);
579 [[nodiscard]] Result<void> accumulateExternalForceZones(std::span<const VolumeFluidWindZone> zones,
580 float fixedTimeSeconds);
589 [[nodiscard]] Result<void> stepWithThermalContacts(float seconds, unsigned substeps,
590 std::span<const VolumeFluidThermalRule> rules);
592 [[nodiscard]] Result<void> stepWithColliders(float seconds, unsigned substeps,
593 std::span<const VolumeFluidCollider> colliders,
594 std::span<const VolumeFluidThermalRule> rules = {});
596 [[nodiscard]] std::vector<VolumeFluidParticle> particles() const;
605 [[nodiscard]] std::span<const VolumeFluidParticle> particleView() const;
607 [[nodiscard]] size_t particleCount() const;
609 [[nodiscard]] size_t availableCapacity() const;
611 [[nodiscard]] float spacing() const;
619 [[nodiscard]] Result<void> setGravity(glm::vec3 gravity);
621 [[nodiscard]] glm::vec3 gravity() const;
625 [[nodiscard]] float copyRenderData(std::vector<glm::vec3>& positions, std::vector<glm::vec4>& colors) const;
634 [[nodiscard]] Result<void> copyInterpolatedPositions(float alpha, std::vector<glm::vec3>& positions) const;
636 [[nodiscard]] Result<float> copyInterpolatedRenderData(float alpha, std::vector<glm::vec3>& positions,
637 std::vector<glm::vec4>& colors) const;
649 [[nodiscard]] float copySurfaceRenderData(std::vector<glm::vec3>& positions, std::vector<glm::vec4>& colors,
650 std::vector<glm::vec3>& radii,
651 std::vector<glm::vec4>& orientations) const;
657 [[nodiscard]] Result<float> copyInterpolatedSurfaceRenderData(float alpha, std::vector<glm::vec3>& positions,
658 std::vector<glm::vec4>& colors,
659 std::vector<glm::vec3>& radii,
660 std::vector<glm::vec4>& orientations) const;
670 [[nodiscard]] size_t copyPhaseRenderData(VolumeFluidPhase phase, std::vector<glm::vec3>& positions,
671 std::vector<glm::vec4>& colors, size_t maxParticles) const;
679 [[nodiscard]] Result<void> setColliders(std::span<const VolumeFluidCollider> colliders);
681 [[nodiscard]] Result<void> setSdfColliders(std::span<const VolumeFluidSdfCollider> colliders);
690 [[nodiscard]] Result<void> setHeightFieldColliders(std::span<const VolumeFluidHeightFieldCollider> colliders);
701 [[nodiscard]] Result<unsigned> bindStaticParticles(std::span<const unsigned> particleIndices,
702 unsigned colliderLabel, bool constrainOrientation = false);
710 [[nodiscard]] Result<unsigned> bindDynamicParticles(std::span<const unsigned> particleIndices,
711 unsigned colliderLabel, float compliance, float breakThreshold,
712 bool constrainOrientation = false);
714 [[nodiscard]] Result<unsigned> unbindStaticParticles(std::span<const unsigned> particleIndices);
722 [[nodiscard]] Result<void> setStitches(std::span<const VolumeFluidStitch> stitches);
730 [[nodiscard]] Result<void> updateSdfColliderPoses(std::span<const VolumeFluidSdfPose> poses);
732 [[nodiscard]] std::vector<VolumeFluidContact> contacts() const;
740 [[nodiscard]] std::span<const VolumeFluidAttachmentReaction> attachmentReactions() const;
742 [[nodiscard]] Result<std::vector<VolumeFluidParticle>> overlap(glm::vec3 center, float radius) const;
750 [[nodiscard]] Result<std::vector<VolumeFluidParticle>> overlapBox(glm::vec3 center, glm::vec3 halfExtent,
751 glm::vec4 rotation) const;
765 [[nodiscard]] Result<std::vector<VolumeFluidRayHit>> raycast(glm::vec3 origin, glm::vec3 direction,
766 float maxDistance, unsigned maxHits = 64,
767 unsigned phaseMask = 0x0f) const;
780 [[nodiscard]] Result<std::vector<VolumeFluidDistanceHit>> querySphere(glm::vec3 center, float radius,
781 float contactOffset, float maxDistance,
782 unsigned maxHits = 64,
783 unsigned phaseMask = 0x0f,
784 unsigned collisionFilter = 0xffffffffu) const;
799 [[nodiscard]] Result<std::vector<VolumeFluidDistanceHit>> queryBox(glm::vec3 center, glm::vec3 halfExtent,
800 glm::vec4 rotation, float contactOffset,
801 float maxDistance, unsigned maxHits = 64,
802 unsigned phaseMask = 0x0f,
803 unsigned collisionFilter = 0xffffffffu) const;
816 [[nodiscard]] Result<std::vector<VolumeFluidQueryHit>> queryBatch(std::span<const VolumeFluidQueryShape> queries,
817 unsigned maxHitsPerQuery = 64) const;
829 [[nodiscard]] Result<std::vector<unsigned>> applyQueryColors(std::span<const VolumeFluidQueryShape> queries,
830 std::span<const glm::vec4> overlapColors,
831 glm::vec4 baseColor, unsigned maxHitsPerQuery = 4096);
842 [[nodiscard]] Result<std::vector<unsigned>> applyQueryColorsPreservingOutside(
843 std::span<const VolumeFluidQueryShape> queries, std::span<const glm::vec4> overlapColors,
844 unsigned maxHitsPerQuery = 4096);
853 [[nodiscard]] Result<std::vector<VolumeFluidSimplexHit>> querySimplexes(
854 std::span<const VolumeFluidQueryShape> queries, unsigned maxHitsPerQuery = 64) const;
861 [[nodiscard]] Result<void> setSimplexes(std::span<const VolumeFluidSimplex> simplexes);
863 [[nodiscard]] Result<void> paint(glm::vec3 center, float radius, const VolumeFluidMaterial& material);
875 [[nodiscard]] Result<void> applyMaterialChannels(std::span<const VolumeFluidViscosityColorKey> colorKeys = {});
884 [[nodiscard]] Result<void> applySolidColor(glm::vec4 color);
891 [[nodiscard]] Result<void> applyVelocityColors(float sensibility);
896 [[nodiscard]] Result<void> applyActorGroupColors();
903 [[nodiscard]] Result<void> applyDataColors(unsigned channel, std::span<const VolumeFluidColorKey> gradient);
909 [[nodiscard]] Result<void> applyRandomColors(std::span<const VolumeFluidColorKey> gradient, uint32_t seed);
918 [[nodiscard]] Result<void> addRandomVelocity(float intensity, uint32_t seed);
930 [[nodiscard]] Result<void> teleportActor(glm::vec3 currentPosition, glm::vec4 currentRotation,
931 glm::vec3 targetPosition, glm::vec4 targetRotation);
939 [[nodiscard]] Result<VolumeFluidMassProperties> actorMassProperties(unsigned actorGroup) const;
947 [[nodiscard]] Result<void> setActorFilterCategory(unsigned actorGroup, unsigned category);
955 [[nodiscard]] Result<void> setActorCollisionFilter(unsigned actorGroup, unsigned collisionFilter);
964 [[nodiscard]] Result<void> updateActorMaterial(unsigned actorGroup, const VolumeFluidParticle& prototype);
971 [[nodiscard]] Result<void> setActorSelfCollisions(unsigned actorGroup, bool enabled);
979 [[nodiscard]] Result<unsigned> killActorParticles(unsigned actorGroup);
986 [[nodiscard]] Result<unsigned> actorParticleCount(unsigned actorGroup) const;
991 [[nodiscard]] Result<void> killActorParticle(unsigned actorGroup, unsigned actorParticleIndex);
1002 [[nodiscard]] Result<void> applyParticleDrag(unsigned particleIndex, glm::vec3 targetPosition, float stiffness,
1003 float damping, float seconds);
1015 [[nodiscard]] Result<unsigned> grabContactParticles(unsigned colliderLabel, glm::vec3 position, glm::vec4 rotation,
1016 float distanceThreshold = .01f);
1022 [[nodiscard]] Result<unsigned> updateGrabbedParticles(unsigned colliderLabel, glm::vec3 position,
1023 glm::vec4 rotation);
1027 [[nodiscard]] Result<unsigned> releaseGrabbedParticles(unsigned colliderLabel);
1036 [[nodiscard]] Result<std::vector<VolumeFluidFieldSample>> sampleField(std::span<const glm::vec3> positions) const;
1044 [[nodiscard]] Result<std::vector<VolumeFluidGridCell>> debugParticleGrid(unsigned maxCells = 65536) const;
1053 [[nodiscard]] Result<std::vector<VolumeFluidParticleFrame>> debugParticleFrames(
1054 unsigned actorGroup, float size = 1.f, unsigned maxParticles = 65536) const;
1065 [[nodiscard]] Result<std::vector<VolumeFluidParticleInstance>> particleInstances(
1066 unsigned actorGroup, glm::vec3 instanceScale = glm::vec3(1.f), float alpha = 1.f,
1067 unsigned maxInstances = 65536) const;
1080 [[nodiscard]] Result<std::vector<VolumeFluidParticleInstance>> particleImpostors(
1081 unsigned actorGroup, float radiusScale, glm::vec4 tint = glm::vec4(1.f), float alpha = 1.f,
1082 unsigned maxInstances = 65536) const;
1095 [[nodiscard]] Result<void> copyParticleImpostors(unsigned actorGroup, float radiusScale, glm::vec4 tint,
1096 float alpha, unsigned maxInstances,
1097 std::vector<VolumeFluidParticleInstance>& instances) const;
1109 [[nodiscard]] Result<VolumeFluidSdfSlice> debugSdfSlice(unsigned colliderLabel, VolumeFluidSdfSliceAxis axis,
1110 float slice = .25f, float maxDistance = .5f,
1111 unsigned maxSamples = 65536) const;
1113 [[nodiscard]] VolumeFluidSnapshot snapshot() const;
1115 [[nodiscard]] Result<void> restore(const VolumeFluidSnapshot& snapshot);
1117 void clear();
1126 [[nodiscard]] Result<void> killParticle(unsigned particleIndex);
1127
1128private:
1129 friend class VolumeFluidFoam;
1131 struct Impl;
1132 [[nodiscard]] Result<unsigned> bindParticles(std::span<const unsigned> particleIndices, unsigned colliderLabel,
1133 bool constrainOrientation, bool dynamic, float compliance,
1134 float breakThreshold);
1135 [[nodiscard]] Result<void> accumulateForceZones(std::span<const VolumeFluidWindZone> zones, float fixedTimeSeconds,
1136 bool asWind);
1137 [[nodiscard]] glm::vec3 interpolatedPositionUnchecked(size_t particleIndex, float alpha) const;
1138 [[nodiscard]] Result<void> sampleFieldInto(std::span<const glm::vec3> positions,
1139 std::vector<VolumeFluidFieldSample>& samples) const;
1140 explicit VolumeFluid(const VolumeFluidSettings& settings);
1141 std::unique_ptr<Impl> impl_;
1142};
1143
1144} // namespace eve::fluids
std::vector< BuildingInstanceSnapshot > instances
float phase
Definition CaveMesh.cpp:58
Vec3 radii
Definition CaveMesh.cpp:56
#define EVENGINE_API_DOMAINS
Definition Export.h:110
std::uint32_t capacity
glm::vec4 tint
std::vector< float > positions
std::array< float, 4 > rotation
std::array< float, 3 > position
float radius
std::uint32_t seed
Definition PointSet.cpp:807
Material * material
Move-only, checked operation results for the common layer.
std::vector< float > colors
V3 origin
Definition RoadBake.cpp:138
RoadLaneDirection direction
double gravity
TerrainThermalSettings settings
int spacing
float step
Definition TreeMesh.cpp:314
float size
Definition TreeMesh.cpp:156
const char * category
Move-only operation result carrying either a value or Status.
Definition Result.h:155
Uniform signed-distance voxel field over a box.
Definition FluidSdf.h:28
Explicit bounded contact lifecycle tracker; owns no solver reference.
Bounded, one-way fluid-advected secondary particle pool. @ownership Owns particles and capacity; no f...
Generates secondary particles at high-curl, low-density fluid source positions. @ownership Owns setti...
CPU position-based free-volume fluid with a bounded spatial grid. @ownership Owns all particle state;...
VolumeFluid & operator=(const VolumeFluid &)=delete
VolumeFluid(const VolumeFluid &)=delete
GLSL compute kernels for the GPU surface-flow solver.
Definition FluidTarget.h:12
VolumeFluidPhase
Constitutive phase; solids are world-fixed or follow their owned collider attachment.
Definition VolumeFluid.h:20
VolumeFluidSdfSliceAxis
Local axis normal used by an explicit SDF diagnostic slice.
VolumeFluidQueryType
Shape kind for one bounded batched particle query.
VolumeFluidParticleEventType
Lifecycle kind matching Fluid3DEmitter OnEmitParticle/OnKillParticle.
VolumeFluidWindZoneType
Shape used by a transient Fluid3D-style wind force zone.
VolumeFluidMaterialCombineMode
Fluid3D collision-material coefficient combination, with package integer values.
Definition VolumeFluid.h:23
VolumeFluidContactEventType
Contact lifecycle classification matching Fluid3DContactEventDispatcher.
VolumeFluidColliderShape
Analytic obstacle geometry.
bool enabled
Opposite impulse produced by a prescribed solid-particle attachment constraint.
glm::vec3 impulse
World-space impulse to apply to the owning rigid body.
glm::vec3 point
World-space attachment point at the completed pose.
unsigned colliderLabel
Collider identity that owns the attachment.
glm::vec3 angularImpulse
World-space pure angular impulse from prescribed particle rotation.
Owned local anchor for a contact-frozen particle; indices refer to its snapshot particle array.
unsigned particleIndex
Snapshot-local particle index; remapped on lifetime removal, never a persistent entity ID.
float breakThreshold
Approximate constraint-force threshold in newtons; finite and positive.
glm::vec4 localOrientation
Particle-shape orientation in the collider's local frame, XYZW.
glm::vec3 localPosition
Point in the collider's rigid local frame; no external pointer is retained.
bool dynamic
Dynamic attachments use a compliant pin instead of a fixed inverse weight.
float compliance
XPBD compliance in inverse stiffness units; zero is rigid.
bool constrainOrientation
Whether the target rotation also drives the particle orientation.
unsigned colliderLabel
Application sample identity; removal detaches permanently, including after label reuse.
Owned obstacle sample; the caller updates moving obstacles before stepping.
float stickDistance
Maximum adhesive surface separation in meters, in [0,10].
float staticFriction
Static Coulomb friction in [0,1]; friction is the dynamic coefficient.
bool rollingContacts
Enables oriented rolling contact when either side requests it.
glm::vec4 rotation
Unit quaternion XYZW; box extents and the capsule's Y axis use this local frame.
glm::vec3 velocity
Surface velocity at the sampled center.
VolumeFluidColliderShape shape
Analytic primitive.
bool isTrigger
Generates contacts without applying projection, friction or material transfer.
glm::vec3 center
World center and box half extents; capsule halfExtent.y is half its total height.
unsigned label
Application label echoed by contacts; not a runtime object handle.
VolumeFluidMaterialCombineMode stickinessCombine
Fluid3D-compatible priority combine mode for stickiness.
glm::vec3 angularVelocity
World angular velocity in radians/second, sampled at the collider center.
float radius
Sphere or capsule radius.
float friction
Coulomb friction in [0,1].
unsigned collisionFilter
Collision filter: low 16 bits category, high 16 bits mask.
float stickiness
Adhesion strength in [0,1000].
bool solidify
Freezes contacts and enables one neighbor-contact wave per step from its attached solids.
VolumeFluidMaterialCombineMode frictionCombine
Fluid3D-compatible priority combine mode for all friction coefficients.
float rollingFriction
Rolling-friction coefficient in [0,1].
One strictly ordered [0,1] coordinate and linear RGBA gradient color.
Definition VolumeFluid.h:76
Owning deduplicated actor/collider contact lifecycle event.
VolumeFluidContactEventType type
Owned contact event; opposite impulse can be applied to the caller's rigid body.
unsigned actorGroup
Stable actor group copied from the contacting particle.
float distance
Signed pre-projection surface separation in meters.
unsigned particleIndex
Current dense particle index; stale after any particle mutation.
Owning signed surface-distance result for a native query shape.
VolumeFluidParticle particle
Owning particle value captured at query time.
glm::vec3 queryPoint
Nearest point on the query surface including its contact offset.
float distance
Signed separation; negative values mean surface overlap.
unsigned particleIndex
Current pool index; valid only until the next particle mutation.
glm::vec3 normal
Direction from the query shape toward the particle center.
Owned liquid/gas field sample for diffuse-particle emission and advection.
unsigned neighborCount
Liquid/gas samples strictly within twice the particle spacing.
float density
SPH mass density in kg/m3; no container boundary-support correction.
glm::vec3 vorticity
Curl of the normalized poly6 velocity interpolation, in inverse seconds.
glm::vec3 velocity
Poly6-weighted velocity in meters/second; zero without support.
Owning occupied-cell sample for Fluid3DParticleGridDebugger-style visualization.
unsigned particleCount
Number of current particles hashed into this cell.
glm::vec3 size
World-space full size of the cell.
glm::vec3 center
World-space center of the solver's uniform hash cell.
Owned regular-grid terrain collider matching Fluid3D height-field sample layout.
glm::vec3 size
Local terrain size; sample height is multiplied by size.y.
VolumeFluidMaterialCombineMode stickinessCombine
std::vector< float > heights
Row-major samples indexed as z * resolution.x + x, in normalized [0,1] height units.
bool isTrigger
Generates contacts without applying projection, friction or material transfer.
VolumeFluidMaterialCombineMode frictionCombine
glm::vec4 rotation
Unit local-to-world quaternion in XYZW order.
glm::ivec2 resolution
Grid vertex counts along local X and Z.
Owning mass summary for one Fluid3D-compatible actor group.
unsigned particleCount
Number of particles contributing to the summary.
float mass
Sum of particle rest masses in kilograms.
glm::vec3 centerOfMass
Rest-mass-weighted world-space center.
Per-particle material, copied at emission; densities enable multiphase buoyancy.
Definition VolumeFluid.h:26
float smoothing
SPH support-radius multiplier over solver spacing, in [1,4].
Definition VolumeFluid.h:30
float yield
Bingham yield rate; zero disables yield viscosity.
Definition VolumeFluid.h:44
float dynamicFriction
Dynamic particle-contact friction coefficient in [0,1].
Definition VolumeFluid.h:48
float stickDistance
Adhesion reach beyond contact in metres, in [0,10].
Definition VolumeFluid.h:58
float rollingFriction
Rolling-friction coefficient in [0,1].
Definition VolumeFluid.h:52
float cohesion
Cohesion acceleration, in [0,10].
Definition VolumeFluid.h:34
float staticFriction
Static particle-contact friction coefficient in [0,1].
Definition VolumeFluid.h:50
float atmosphericPressure
Ambient pressure acceleration along the inward SPH surface normal, in [0,1000].
Definition VolumeFluid.h:40
float viscosity
Viscous relaxation per second, in [0,100].
Definition VolumeFluid.h:32
bool rollingContacts
Enables angular contact velocity and rolling response for granular particles.
Definition VolumeFluid.h:54
float stickiness
Adhesion strength in [0,1000].
Definition VolumeFluid.h:56
VolumeFluidPhase phase
Constitutive phase.
Definition VolumeFluid.h:64
float vorticity
Vorticity confinement strength.
Definition VolumeFluid.h:46
VolumeFluidMaterialCombineMode frictionCombine
Combination mode for static, dynamic and rolling friction.
Definition VolumeFluid.h:60
VolumeFluidMaterialCombineMode stickinessCombine
Combination mode for stickiness.
Definition VolumeFluid.h:62
float density
Rest density in kg/m3, in [0.1,100000].
Definition VolumeFluid.h:28
float buoyancy
Gravity multiplier; negative values model rising gas.
Definition VolumeFluid.h:36
float drag
Linear air drag per second.
Definition VolumeFluid.h:38
float diffusion
Color and user-data diffusion per second.
Definition VolumeFluid.h:42
Owning result of one explicit particle lifecycle-event drain.
std::vector< VolumeFluidParticleEvent > events
uint64_t dropped
Events discarded since the preceding drain because the configured queue was full.
Owning particle lifecycle event captured before the dense pool changes again.
unsigned particleIndex
Dense index at event time; stale after any later particle mutation.
VolumeFluidParticle particle
Owning particle value at emission or immediately before removal.
unsigned actorGroup
Stable emitter/actor group copied from the particle.
VolumeFluidParticleEventType type
Owning local-axis sample for DebugParticleFrames-style visualization.
glm::vec3 origin
World-space ray origin.
unsigned particleIndex
Current dense particle index; invalidated by particle-pool mutation.
glm::vec3 x
World-space endpoints for the red, green and blue local-axis rays.
One owning mesh-instance transform/color row for Fluid3DInstancedParticleRenderer-style presentation.
glm::vec3 scale
Principal particle radii multiplied component-wise by the requested instance scale.
glm::vec4 orientation
Unit particle orientation in XYZW order.
unsigned particleIndex
Current dense particle index; invalidated by particle-pool mutation.
Owning particle value with world position and velocity in SI units.
Definition VolumeFluid.h:96
VolumeFluidMaterial material
Owned material parameters.
glm::vec3 angularVelocity
World angular velocity in radians/second; integrated for granular particles.
unsigned collisionFilter
Query collision filter: low 16 bits category, high 16 bits mask.
bool selfCollide
Allows interaction with particles in the same actor group.
glm::vec3 radii
Principal collision/query radii in meters; all zero resolves to spacing/2 on emission.
float life
Remaining lifetime in seconds; zero means unlimited.
glm::vec4 color
Linear RGBA color and four diffusing application channels.
unsigned actorGroup
Fluid3D-compatible actor group in [0, 0x00ffffff]; equal groups use selfCollide instead of filters.
glm::vec4 orientation
Unit particle-shape orientation in XYZW order.
Owning result from one entry in a mixed query batch.
Owning transient query description compatible with Fluid3D QueryShape semantics.
unsigned collisionFilter
Low 16 bits category and high 16 bits mask; both sides must match.
glm::vec4 rotation
Unit XYZW box rotation; ignored by sphere and ray queries.
glm::vec3 size
Sphere radius in x, full box size, or ray segment end.
glm::vec3 center
Sphere/box center or ray segment start.
Owning ray hit against one native oriented-ellipsoid volume-fluid particle.
float distance
World-space distance along the normalized ray, in meters.
unsigned particleIndex
Current pool index; valid only until the next particle mutation.
VolumeFluidParticle particle
Owning particle value captured at query time.
Owned sampled mesh/SDF collider with a uniform world transform.
bool inverted
When true, positive mesh exterior is solid and particles remain inside.
bool isTrigger
Generates contacts without applying projection, friction or material transfer.
MeshSdf sdf
Local signed field; negative values represent mesh solid.
VolumeFluidMaterialCombineMode stickinessCombine
VolumeFluidMaterialCombineMode frictionCombine
Transient transform update for one owned SDF collider, identified by stable label.
Owning normalized SDF slice plus its world-space sample lattice.
glm::vec3 origin
World position of sample (0,0).
std::vector< float > values
Row-major values remapped from [-maxDistance,+maxDistance] to [0,1].
glm::vec3 stepX
World displacement from one sample to the next along image X/Y.
Meter-space (+Y up) volume-fluid material and solver policy.
Definition VolumeFluid.h:82
unsigned capacity
Maximum live particles; admission fails atomically at capacity.
Definition VolumeFluid.h:84
glm::vec3 minimum
Inner container corners. Particle centers retain half-spacing clearance.
Definition VolumeFluid.h:90
unsigned iterations
Density projection iterations per substep, in [1,20].
Definition VolumeFluid.h:92
float spacing
Rest lattice separation in meters.
Definition VolumeFluid.h:86
glm::vec3 gravity
Applied acceleration, in meters per second squared.
Definition VolumeFluid.h:88
Owning Fluid3D-compatible nearest result for one simplex and query pair.
unsigned simplexIndex
Current topology index; stale after topology or particle mutation.
A point, edge or triangle over snapshot-local particle indices.
std::array< unsigned, 3 > particleIndices
First size entries are used; size must be in [1,3] and entries must be distinct.
Canonical version-20 owning state; older codecs migrate collider, attachment, stitch,...
std::vector< VolumeFluidCollider > colliders
std::vector< VolumeFluidSdfCollider > sdfColliders
std::vector< VolumeFluidAttachment > attachments
std::vector< VolumeFluidStitch > stitches
std::vector< VolumeFluidSimplex > simplexes
Explicit point/edge/triangle topology; empty means one implicit point simplex per particle.
std::vector< VolumeFluidParticle > particles
std::vector< VolumeFluidHeightFieldCollider > heightFieldColliders
One Fluid3DStitcher-compatible zero-distance particle-pair constraint.
float compliance
XPBD compliance in inverse stiffness units; zero is rigid.
unsigned particleIndex1
Snapshot-local distinct particle indices.
One-step contact transfer into user channels x/y; negative rate heats, positive cools.
Transient linear RGBA gradient key at an absolute material viscosity.
Definition VolumeFluid.h:68
float viscosity
Viscosity coordinate in [0,100]; keys must be strictly increasing.
Definition VolumeFluid.h:70
glm::vec4 color
Linear RGBA components in [0,1].
Definition VolumeFluid.h:72
Owning description of one transient ambient or spherical wind zone.
VolumeFluidWindZoneType type
glm::vec4 color