载入中...
搜索中...
未找到
VolumeFluidTools.cpp
浏览该文件的文档.
20Result<void> VolumeFluid::paint(glm::vec3 center, float radius, const VolumeFluidMaterial& material) {
37Result<void> VolumeFluid::applyMaterialChannels(std::span<const VolumeFluidViscosityColorKey> colorKeys) {
39 if (colorKeys.size() < 2 || colorKeys.size() > 32) return invalid("Viscosity gradient requires 2..32 keys");
126 if (!range(key.coordinate, 0.f, 1.f) || key.coordinate <= previous || !range(key.color.x, 0.f, 1.f) ||
127 !range(key.color.y, 0.f, 1.f) || !range(key.color.z, 0.f, 1.f) || !range(key.color.w, 0.f, 1.f))
152Result<void> VolumeFluid::applyDataColors(unsigned channel, std::span<const VolumeFluidColorKey> gradient) {
153 if (channel > 3 || !validColorGradient(gradient)) return invalid("Invalid data color channel or gradient");
158Result<void> VolumeFluid::applyRandomColors(std::span<const VolumeFluidColorKey> gradient, uint32_t seed) {
160 for (auto& particle : impl_->state) particle.color = sampleColorGradient(gradient, colorRandom(seed));
177Result<void> VolumeFluid::teleportActor(glm::vec3 currentPosition, glm::vec4 currentRotation, glm::vec3 targetPosition,
180 return finite(position) && finite(rotation) && std::abs(glm::dot(rotation, rotation) - 1.f) <= .001f;
184 const glm::quat from(currentRotation.w, currentRotation.x, currentRotation.y, currentRotation.z);
194 const glm::quat orientation(particle.orientation.w, particle.orientation.x, particle.orientation.y,
213 DiagnosticCode::InvalidArgument, "Actor group exceeds 24-bit range", "fluids.volume.actorMass"));
235 if (actorGroup > 0x00ffffffu || category > 15u) return invalid("Invalid actor group or filter category");
239 Diagnostic::error(DiagnosticCode::NotFound, "Actor group has no live particles", "fluids.volume.filter"));
247Result<void> VolumeFluid::setActorCollisionFilter(unsigned actorGroup, unsigned collisionFilter) {
253 Diagnostic::error(DiagnosticCode::NotFound, "Actor group has no live particles", "fluids.volume.filter"));
259Result<void> VolumeFluid::updateActorMaterial(unsigned actorGroup, const VolumeFluidParticle& prototype) {
264 if (actorGroup > 0x00ffffffu || !validMaterial(prototype.material) || !finite(prototype.data) ||
269 return Result<void>::failure(Diagnostic::error(DiagnosticCode::NotFound, "Actor group has no live particles",
288 return Result<void>::failure(Diagnostic::error(DiagnosticCode::NotFound, "Actor group has no live particles",
295Result<void> VolumeFluid::applyParticleDrag(unsigned particleIndex, glm::vec3 targetPosition, float stiffness,
297 if (particleIndex >= impl_->state.size() || !finite(targetPosition) || !range(stiffness, 0.f, 10000.f) ||
298 !range(damping, 0.f, 10000.f) || !range(seconds, std::numeric_limits<float>::min(), 1.f / 30.f))
301 const auto acceleration = (targetPosition - particle.position) * stiffness - particle.velocity * damping;
303 if (!finite(velocity) || glm::length(velocity) > 1000.f) return invalid("Particle drag exceeds speed limit");
308Result<unsigned> VolumeFluid::grabContactParticles(unsigned colliderLabel, glm::vec3 position, glm::vec4 rotation,
314 if (!finite(position) || !finite(rotation) || std::abs(glm::dot(rotation, rotation) - 1.f) > .001f ||
317 if (!impl_->hasColliderLabel(colliderLabel)) return failure("Unknown contact-grabber collider label");
356Result<unsigned> VolumeFluid::updateGrabbedParticles(unsigned colliderLabel, glm::vec3 position, glm::vec4 rotation) {
395Result<std::vector<VolumeFluidFieldSample>> VolumeFluid::sampleField(std::span<const glm::vec3> positions) const {
408 if (positions.size() > 65536 || std::any_of(positions.begin(), positions.end(), [](auto p) { return !finite(p); }))
459Result<std::vector<VolumeFluidGridCell>> VolumeFluid::debugParticleGrid(unsigned maxCells) const {
462 DiagnosticCode::InvalidArgument, "Invalid particle-grid debug cell budget", "fluids.volume.gridDebug"));
465 for (size_t i = 0; i < impl_->state.size(); ++i) indices[i] = impl_->index(impl_->cell(impl_->state[i].position));
476 DiagnosticCode::InvalidArgument, "Particle-grid debug cell budget exceeded", "fluids.volume.gridDebug"));
495Result<std::vector<VolumeFluidParticleFrame>> VolumeFluid::debugParticleFrames(unsigned actorGroup, float size,
501 if (actorGroup > 0x00ffffffu || !range(size, std::numeric_limits<float>::min(), 100.f) || maxParticles == 0 ||
507 if (count > maxParticles) return failure(DiagnosticCode::InvalidArgument, "Particle-frame debug budget exceeded");
520Result<std::vector<VolumeFluidParticleInstance>> VolumeFluid::particleInstances(unsigned actorGroup,
529 glm::any(glm::greaterThan(instanceScale, glm::vec3(10000.f))) || !range(alpha, 0.f, 1.f) || maxInstances == 0 ||
534 if (count == 0) return failure(DiagnosticCode::NotFound, "Particle-instance actor group was not found");
548Result<std::vector<VolumeFluidParticleInstance>> VolumeFluid::particleImpostors(unsigned actorGroup, float radiusScale,
552 auto copied = copyParticleImpostors(actorGroup, radiusScale, tint, alpha, maxInstances, instances);
557Result<void> VolumeFluid::copyParticleImpostors(unsigned actorGroup, float radiusScale, glm::vec4 tint, float alpha,
561 return Result<void>::failure(Diagnostic::error(code, message, "fluids.volume.particleImpostors"));
563 if (actorGroup > 0x00ffffffu || !range(radiusScale, std::numeric_limits<float>::min(), 10000.f) || !finite(tint) ||
564 glm::any(glm::lessThan(tint, glm::vec4(0.f))) || glm::any(glm::greaterThan(tint, glm::vec4(1.f))) ||
569 if (count == 0) return failure(DiagnosticCode::NotFound, "Particle-impostor actor group was not found");
583Result<VolumeFluidSdfSlice> VolumeFluid::debugSdfSlice(unsigned colliderLabel, VolumeFluidSdfSliceAxis axis,
586 return Result<VolumeFluidSdfSlice>::failure(Diagnostic::error(code, message, "fluids.volume.sdfSliceDebug"));
590 !range(maxDistance, std::numeric_limits<float>::min(), 10000.f) || maxSamples == 0 || maxSamples > 1000000)
656 if (snapshot.attachments.size() > snapshot.particles.size()) return invalid("Too many particle attachments");
663 if (a.particleIndex >= snapshot.particles.size() || attached[a.particleIndex] || !finite(a.localPosition) ||
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 > setSimplexes(std::span< const VolumeFluidSimplex > simplexes)
Atomically replaces point/edge/triangle topology over current particle indices.
Definition VolumeFluidTools.cpp:4
static Result< std::unique_ptr< VolumeFluid > > create(const VolumeFluidSettings &settings)
Validates settings before allocating an owning solver; errors publish no state.
Definition VolumeFluid.cpp:7
Result< void > applyActorGroupColors()
Applies Fluid3D's 26-color alphabet by actorGroup modulo 26.
Definition VolumeFluidTools.cpp:90
Result< void > restore(const VolumeFluidSnapshot &snapshot)
Validates a complete candidate before replacing state; failures preserve the current solver.
Definition VolumeFluidTools.cpp:642
Result< void > applyRandomColors(std::span< const VolumeFluidColorKey > gradient, uint32_t seed)
Applies a deterministic Fluid3D ColorRandomizer-style gradient sample to every particle.
Definition VolumeFluidTools.cpp:158
Result< void > applyParticleDrag(unsigned particleIndex, glm::vec3 targetPosition, float stiffness, float damping, float seconds)
Applies one fixed-step Fluid3DParticleDragger spring response.
Definition VolumeFluidTools.cpp:295
Result< std::vector< VolumeFluidParticleInstance > > particleInstances(unsigned actorGroup, glm::vec3 instanceScale=glm::vec3(1.f), float alpha=1.f, unsigned maxInstances=65536) const
Copies one actor group's interpolated mesh instances for batched particle rendering.
Definition VolumeFluidTools.cpp:520
Result< std::vector< VolumeFluidGridCell > > debugParticleGrid(unsigned maxCells=65536) const
Returns occupied particle-grid cells for explicit debug visualization.
Definition VolumeFluidTools.cpp:459
Result< void > paint(glm::vec3 center, float radius, const VolumeFluidMaterial &material)
Atomically changes the material of particles in a sphere (supports melting/solidifying).
Definition VolumeFluidTools.cpp:20
Result< void > copyParticleImpostors(unsigned actorGroup, float radiusScale, glm::vec4 tint, float alpha, unsigned maxInstances, std::vector< VolumeFluidParticleInstance > &instances) const
Writes Fluid3DParticleRenderer-style instances into caller-owned reusable storage.
Definition VolumeFluidTools.cpp:557
Result< std::vector< VolumeFluidParticleInstance > > particleImpostors(unsigned actorGroup, float radiusScale, glm::vec4 tint=glm::vec4(1.f), float alpha=1.f, unsigned maxInstances=65536) const
Copies one actor group's Fluid3DParticleRenderer-style anisotropic impostor instances.
Definition VolumeFluidTools.cpp:548
Result< void > applyVelocityColors(float sensibility)
Applies Fluid3D ColorFromVelocity RGB mapping to all particles in place.
Definition VolumeFluidTools.cpp:81
Result< void > addRandomVelocity(float intensity, uint32_t seed)
Applies one deterministic random velocity impulse to the whole actor.
Definition VolumeFluidTools.cpp:164
Result< void > setActorSelfCollisions(unsigned actorGroup, bool enabled)
Applies Fluid3DEmitter::SetSelfCollisions to all live particles in one actor group.
Definition VolumeFluidTools.cpp:284
Result< void > setActorCollisionFilter(unsigned actorGroup, unsigned collisionFilter)
Applies Fluid3DEmitter.Filter to every live particle in one actor group.
Definition VolumeFluidTools.cpp:247
Result< void > applySolidColor(glm::vec4 color)
Assigns a linear RGBA color to all current solid particles in place.
Definition VolumeFluidTools.cpp:72
Result< VolumeFluidSdfSlice > debugSdfSlice(unsigned colliderLabel, VolumeFluidSdfSliceAxis axis, float slice=.25f, float maxDistance=.5f, unsigned maxSamples=65536) const
Samples one owned SDF collider slice for Fluid3DDistanceFieldRenderer-style diagnostics.
Definition VolumeFluidTools.cpp:583
Result< std::vector< VolumeFluidParticleFrame > > debugParticleFrames(unsigned actorGroup, float size=1.f, unsigned maxParticles=65536) const
Returns particle-local XYZ rays for one actor group.
Definition VolumeFluidTools.cpp:495
Result< unsigned > releaseGrabbedParticles(unsigned colliderLabel)
Releases one grabber label and restores normal particle dynamics.
Definition VolumeFluidTools.cpp:385
Result< std::vector< VolumeFluidFieldSample > > sampleField(std::span< const glm::vec3 > positions) const
Samples the current liquid/gas field at up to 65536 finite world positions.
Definition VolumeFluidTools.cpp:395
VolumeFluidSnapshot snapshot() const
Returns complete owning state; scratch grids and last-step contacts are derived and omitted.
Definition VolumeFluidTools.cpp:629
Result< void > applyMaterialChannels(std::span< const VolumeFluidViscosityColorKey > colorKeys={})
Atomically maps user data x/y to material viscosity/cohesion for all particles.
Definition VolumeFluidTools.cpp:37
Result< void > teleportActor(glm::vec3 currentPosition, glm::vec4 currentRotation, glm::vec3 targetPosition, glm::vec4 targetRotation)
Teleports the whole fluid actor between explicit world poses.
Definition VolumeFluidTools.cpp:177
Result< void > updateActorMaterial(unsigned actorGroup, const VolumeFluidParticle &prototype)
Applies Fluid3DEmitter::UpdateParticleMaterial to one live actor group.
Definition VolumeFluidTools.cpp:259
std::vector< VolumeFluidParticle > particles() const
Returns an owning snapshot, independent of subsequent mutation or destruction.
Definition VolumeFluid.cpp:622
Result< unsigned > grabContactParticles(unsigned colliderLabel, glm::vec3 position, glm::vec4 rotation, float distanceThreshold=.01f)
Freezes current contacts for one Fluid3DContactGrabber-compatible collider.
Definition VolumeFluidTools.cpp:308
Result< void > setActorFilterCategory(unsigned actorGroup, unsigned category)
Applies Fluid3D SetFilterCategory to all particles in one actor group.
Definition VolumeFluidTools.cpp:234
Result< VolumeFluidMassProperties > actorMassProperties(unsigned actorGroup) const
Computes mass and world-space center for one actor group.
Definition VolumeFluidTools.cpp:210
Result< unsigned > updateGrabbedParticles(unsigned colliderLabel, glm::vec3 position, glm::vec4 rotation)
Moves all particles owned by one contact grabber to a new world pose.
Definition VolumeFluidTools.cpp:356
Result< void > applyDataColors(unsigned channel, std::span< const VolumeFluidColorKey > gradient)
Colors particles by one normalized application-data channel.
Definition VolumeFluidTools.cpp:152
VolumeFluidSdfSliceAxis
Local axis normal used by an explicit SDF diagnostic slice.
Definition VolumeFluid.h:241
@ InvalidArgument
@ NotFound
Owning mass summary for one Fluid3D-compatible actor group.
Definition VolumeFluid.h:381
Per-particle material, copied at emission; densities enable multiphase buoyancy.
Definition VolumeFluid.h:26
Owning particle value with world position and velocity in SI units.
Definition VolumeFluid.h:96
unsigned collisionFilter
Query collision filter: low 16 bits category, high 16 bits mask.
Definition VolumeFluid.h:112
bool selfCollide
Allows interaction with particles in the same actor group.
Definition VolumeFluid.h:116
glm::vec3 radii
Principal collision/query radii in meters; all zero resolves to spacing/2 on emission.
Definition VolumeFluid.h:102
Owning normalized SDF slice plus its world-space sample lattice.
Definition VolumeFluid.h:244
Canonical version-20 owning state; older codecs migrate collider, attachment, stitch,...
Definition VolumeFluid.h:493
std::vector< VolumeFluidCollider > colliders
Definition VolumeFluid.h:498
std::vector< VolumeFluidSdfCollider > sdfColliders
Definition VolumeFluid.h:499
std::vector< VolumeFluidAttachment > attachments
Definition VolumeFluid.h:501
std::vector< VolumeFluidStitch > stitches
Definition VolumeFluid.h:502
std::vector< VolumeFluidSimplex > simplexes
Explicit point/edge/triangle topology; empty means one implicit point simplex per particle.
Definition VolumeFluid.h:504
std::vector< VolumeFluidParticle > particles
Definition VolumeFluid.h:497
std::vector< VolumeFluidHeightFieldCollider > heightFieldColliders
Definition VolumeFluid.h:500