载入中...
搜索中...
未找到
VolumeFluidBindings.cpp
浏览该文件的文档.
8 std::function<VolumeFluidContactTracker*()>([] { return new VolumeFluidContactTracker(); }), true);
9 contactTracker.addFunc("advance", [vm](VolumeFluidContactTracker* self, VolumeFluid* fluid, float threshold) {
16 return script::projectStatusResult(vm, Status::success(), encodeVolumeFluidContactEvents(events.value()));
20 "VolumeFluidFoam", std::function<VolumeFluidFoam*()>([] { return new VolumeFluidFoam(); }), true);
22 return script::projectStatusResult(vm, Status::success(), encodeVolumeFluidFoam(self->snapshot()));
31 foam.addFunc("advance", [vm](VolumeFluidFoam* self, VolumeFluid* fluid, VolumeFluidDiffuse* pool, float dt) {
34 vm, Status::failure(Diagnostic::error(DiagnosticCode::InvalidArgument, "Missing foam source or pool",
40 foam.addFunc("advanceFromActor", [vm](VolumeFluidFoam* self, VolumeFluid* fluid, VolumeFluidDiffuse* pool, float dt,
60 auto emitted = self->advanceFromActorInterpolated(*fluid, *pool, dt, unsigned(actorGroup), alpha);
65 "VolumeFluidDiffuse", std::function<VolumeFluidDiffuse*()>([] { return new VolumeFluidDiffuse(); }), true);
67 return script::projectStatusResult(vm, Status::success(), encodeVolumeFluidDiffuse(self->snapshot()));
83 diffuse.addFunc("advance", [vm](VolumeFluidDiffuse* self, VolumeFluid* fluid, float dt, int minimumNeighbors) {
86 vm, Status::failure(Diagnostic::error(DiagnosticCode::InvalidArgument, "Missing fluid field source",
90 diffuse.addFunc("getParticleCount", [](VolumeFluidDiffuse* self) { return int(self->particleCount()); });
91 diffuse.addFunc("getAvailableCapacity", [](VolumeFluidDiffuse* self) { return int(self->availableCapacity()); });
94 "VolumeFluidCoupling", std::function<VolumeFluidCoupling*()>([] { return new VolumeFluidCoupling(); }), true);
95 coupling.addFunc("attach", [vm](VolumeFluidCoupling* self, physics::Body3D* body, ssq::Object object) {
108 coupling.addFunc("detach", [](VolumeFluidCoupling* self, int label) { self->detach(unsigned(label)); });
109 coupling.addFunc("setImpulseLimits", [vm](VolumeFluidCoupling* self, float linear, float angular) {
114 "step", [vm](VolumeFluidCoupling* self, physics::World3D* world, VolumeFluid* fluid, float dt, int substeps) {
123 coupling.addFunc("stepWithThermalContacts", [vm](VolumeFluidCoupling* self, physics::World3D* world,
125 const auto failure = [&](const Status& status) { return script::projectStatusResult(vm, status); };
138 "VolumeFluidJetEmitter", std::function<VolumeFluidJetEmitter*()>([] { return new VolumeFluidJetEmitter(); }),
142 "advanceMoving", [vm](VolumeFluidJetEmitter* self, VolumeFluid* solver, ssq::Object object, ssq::Object begin,
144 const auto failure = [&](const Status& status) { return script::projectStatusResult(vm, status); };
147 Diagnostic::error(DiagnosticCode::InvalidArgument, "Missing volume solver", "fluids.volume.jet")));
160 auto emitted = self->advanceMoving(*solver, emission.value(), firstPose.value(), lastPose.value(), dt,
165 jet.addFunc("advance", [vm](VolumeFluidJetEmitter* self, VolumeFluid* solver, ssq::Object object, float dt,
180 "VolumeFluidEmitter", std::function<VolumeFluidEmitter*()>([] { return new VolumeFluidEmitter(); }), true);
183 [vm](VolumeFluidEmitter* self, VolumeFluid* solver, ssq::Object object, float offset, float dt) {
196 emitter.addFunc("advance", [vm](VolumeFluidEmitter* self, VolumeFluid* solver, ssq::Object object, float dt,
210 emitter.addFunc("advanceBurst", [vm](VolumeFluidEmitter* self, VolumeFluid* solver, ssq::Object object, int count,
247 cls.addFunc("accumulateWindZones", [vm](VolumeFluid* self, ssq::Object object, float fixedTimeSeconds) {
254 cls.addFunc("accumulateExternalForceZones", [vm](VolumeFluid* self, ssq::Object object, float fixedTimeSeconds) {
259 return script::projectResult(vm, self->accumulateExternalForceZones(zones.value(), fixedTimeSeconds));
261 cls.addFunc("stepWithThermalContacts", [vm](VolumeFluid* self, float dt, int substeps, ssq::Object object) {
266 return script::projectResult(vm, self->stepWithThermalContacts(dt, unsigned(substeps), rules.value()));
300 Status::failure(Diagnostic::error(DiagnosticCode::InvalidArgument, "Particle index must be nonnegative",
317 cls.addFunc("bindDynamicParticles", [vm](VolumeFluid* self, ssq::Object object, int colliderLabel, float compliance,
351 return script::projectStatusResult(vm, Status::success(), encodeVolumeFluidFieldSamples(samples.value()));
364 encoded.push_back(Value::object({{"center", Value::array({cell.center.x, cell.center.y, cell.center.z})},
369 cls.addFunc("debugParticleFrames", [vm](VolumeFluid* self, int actorGroup, float size, int maxParticles) {
387 cls.addFunc("particleInstances", [vm](VolumeFluid* self, int actorGroup, float sx, float sy, float sz, float alpha,
394 auto copied = self->particleInstances(unsigned(actorGroup), {sx, sy, sz}, alpha, unsigned(maxInstances));
402 {"orientation", Value::array({instance.orientation.x, instance.orientation.y, instance.orientation.z,
405 {"color", Value::array({instance.color.x, instance.color.y, instance.color.z, instance.color.w})}}));
408 cls.addFunc("particleImpostors", [vm](VolumeFluid* self, int actorGroup, float radiusScale, float r, float g,
416 self->particleImpostors(unsigned(actorGroup), radiusScale, {r, g, b, a}, alpha, unsigned(maxInstances));
424 {"orientation", Value::array({instance.orientation.x, instance.orientation.y, instance.orientation.z,
427 {"color", Value::array({instance.color.x, instance.color.y, instance.color.z, instance.color.w})}}));
431 [vm](VolumeFluid* self, int colliderLabel, int axis, float slice, float maxDistance, int maxSamples) {
437 auto sampled = self->debugSdfSlice(unsigned(colliderLabel), VolumeFluidSdfSliceAxis(axis), slice,
463 return script::projectResult(vm, Result<void>::failure(Diagnostic::error(DiagnosticCode::InvalidArgument,
490 cls.addFunc("teleportActor", [vm](VolumeFluid* self, ssq::Object currentObject, ssq::Object targetObject) {
499 return script::projectResult(vm, self->teleportActor(current.value().position, current.value().rotation,
522 return script::projectResult(vm, self->setActorFilterCategory(unsigned(actorGroup), unsigned(category)));
524 cls.addFunc("setActorCollisionFilter", [vm](VolumeFluid* self, int actorGroup, int64_t collisionFilter) {
533 cls.addFunc("updateActorMaterial", [vm](VolumeFluid* self, int actorGroup, ssq::Object emissionObject) {
535 return script::projectStatusResult(vm, Status::failure(Diagnostic::error(DiagnosticCode::InvalidArgument,
542 return script::projectResult(vm, self->updateActorMaterial(unsigned(actorGroup), emission.value().prototype));
546 return script::projectStatusResult(vm, Status::failure(Diagnostic::error(DiagnosticCode::InvalidArgument,
559 cls.addFunc("applyParticleDrag", [vm](VolumeFluid* self, int particleIndex, float x, float y, float z,
568 cls.addFunc("grabContactParticles", [vm](VolumeFluid* self, int colliderLabel, float x, float y, float z, float qx,
573 Status::failure(Diagnostic::error(DiagnosticCode::InvalidArgument, "Collider label must be nonnegative",
576 vm, self->grabContactParticles(unsigned(colliderLabel), {x, y, z}, {qx, qy, qz, qw}, distanceThreshold),
579 cls.addFunc("updateGrabbedParticles", [vm](VolumeFluid* self, int colliderLabel, float x, float y, float z,
584 Status::failure(Diagnostic::error(DiagnosticCode::InvalidArgument, "Collider label must be nonnegative",
594 Status::failure(Diagnostic::error(DiagnosticCode::InvalidArgument, "Collider label must be nonnegative",
611 return script::projectStatusResult(vm, Status::success(), encodeVolumeFluidParticles(hits.value()));
613 cls.addFunc("paintSphere", [vm](VolumeFluid* self, float x, float y, float z, float radius, ssq::Object material) {
620 cls.addFunc("overlapBox", [vm](VolumeFluid* self, float x, float y, float z, float hx, float hy, float hz, float qx,
624 return script::projectStatusResult(vm, Status::success(), encodeVolumeFluidParticles(hits.value()));
626 cls.addFunc("raycast", [vm](VolumeFluid* self, float ox, float oy, float oz, float dx, float dy, float dz,
628 auto hits = self->raycast({ox, oy, oz}, {dx, dy, dz}, maxDistance, unsigned(maxHits), unsigned(phaseMask));
630 return script::projectStatusResult(vm, Status::success(), encodeVolumeFluidRayHits(hits.value()));
632 cls.addFunc("querySphere", [vm](VolumeFluid* self, float x, float y, float z, float radius, float contactOffset,
635 self->querySphere({x, y, z}, radius, contactOffset, maxDistance, unsigned(maxHits), unsigned(phaseMask));
637 return script::projectStatusResult(vm, Status::success(), encodeVolumeFluidDistanceHits(hits.value()));
640 [vm](VolumeFluid* self, float x, float y, float z, float hx, float hy, float hz, float qx, float qy,
642 auto hits = self->queryBox({x, y, z}, {hx, hy, hz}, {qx, qy, qz, qw}, contactOffset, maxDistance,
655 return script::projectStatusResult(vm, Status::success(), encodeVolumeFluidQueryHits(hits.value()));
657 cls.addFunc("applyQueryColors", [vm](VolumeFluid* self, ssq::Object queryObject, ssq::Object colorObject, float r,
667 auto counts = self->applyQueryColors(queries.value(), colors.value(), {r, g, b, a}, unsigned(maxHitsPerQuery));
675 [vm](VolumeFluid* self, ssq::Object queryObject, ssq::Object colorObject, int maxHitsPerQuery) {
699 cls.addFunc("querySimplexes", [vm](VolumeFluid* self, ssq::Object object, int maxHitsPerQuery) {
706 return script::projectStatusResult(vm, Status::success(), encodeVolumeFluidSimplexHits(hits.value()));
737 return script::projectStatusResult(vm, Status::success(), encodeVolumeFluidContacts(self->contacts()));
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 Status failure(StatusCode code, Diagnostic diagnostic)
Construct a failed status with one diagnostic.
Definition Status.h:84
static Status success(StatusCode code=StatusCode::Ok)
Construct a successful status with an explicit non-error outcome.
Definition Status.h:81
Explicit bounded contact lifecycle tracker; owns no solver reference.
Definition VolumeFluid.h:276
void reset()
Clears prior keys so the next contacts enter again.
Definition VolumeFluidContactTracker.cpp:57
Result< std::vector< VolumeFluidContactEvent > > advance(std::span< const VolumeFluidContact > contacts, float distanceThreshold=.01f)
Diffs latest contacts against the preceding successful call.
Definition VolumeFluidContactTracker.cpp:22
Process-local generation-checked bridge between fluid samples and rigid bodies. @ownership Owns local...
Definition VolumeFluidCoupling.h:25
unsigned lastClampedBodyCount() const
Returns how many linked bodies had a linear or angular impulse scaled in the last successful step.
Definition VolumeFluidCoupling.cpp:53
Bounded, one-way fluid-advected secondary particle pool. @ownership Owns particles and capacity; no f...
Definition VolumeFluidDiffuse.h:38
Bounded runtime stream controller with explicit snapshot/restore.
Definition VolumeFluidEmitter.h:207
Generates secondary particles at high-curl, low-density fluid source positions. @ownership Owns setti...
Definition VolumeFluidFoam.h:39
Spacing-driven planar/distribution jet controller with independent, owned stream phase.
Definition VolumeFluidEmitter.h:255
CPU position-based free-volume fluid with a bounded spatial grid. @ownership Owns all particle state;...
Definition VolumeFluid.h:517
std::vector< VolumeFluidContact > contacts() const
Returns owning events from the last completed step; no borrowed world pointers are stored.
Definition VolumeFluidColliders.cpp:291
3D rigid body (Box3D) in meter-space coordinates (+Y up by convention). Owned by a World3D; create pr...
Definition Body3D.h:24
Box3D rigid-body world. Script coordinates are meters (Box3D native), unlike 2D World which uses pixe...
Definition World3D.h:63
std::variant< std::monostate, std::int64_t, double, std::string, bool > Value
Definition Database.h:26
Value encodeVolumeFluid(const VolumeFluidSnapshot &snapshot)
Canonical schema-17 value projection, shared by JSON, scripts and authoring.
Definition VolumeFluidCodec.cpp:16
Result< std::vector< VolumeFluidViscosityColorKey > > decodeVolumeFluidViscosityColors(const Value &value)
Strict owning decode of at most 32 transient viscosity color keys; application validates domains.
Definition VolumeFluidCodec.cpp:171
Result< std::vector< VolumeFluidQueryShape > > decodeVolumeFluidQueries(const Value &value)
Strict owning decode of at most 256 transient mixed query descriptions.
Definition VolumeFluidCodec.cpp:86
Value encodeVolumeFluidContacts(const std::vector< VolumeFluidContact > &contacts)
Projects last-step contacts, including world-space point and opposite impulse.
Definition VolumeFluidCodec.cpp:168
VolumeFluidSdfSliceAxis
Local axis normal used by an explicit SDF diagnostic slice.
Definition VolumeFluid.h:241
Result< VolumeFluidMaterial > decodeVolumeFluidMaterial(const Value &value)
Strict transient material decode; paint validates numeric domains before mutation.
Definition VolumeFluidCodec.cpp:207
Value encodeVolumeFluidFieldSamples(const std::vector< VolumeFluidFieldSample > &samples)
Projects owning field samples, preserving query order.
Definition VolumeFluidCodec.cpp:59
Result< std::vector< VolumeFluidSdfPose > > decodeVolumeFluidSdfPoses(const Value &value)
Strict transient decode of at most 16 SDF transform-only updates.
Definition VolumeFluidCodec.cpp:134
Value encodeVolumeFluidSimplexHits(const std::vector< VolumeFluidSimplexHit > &hits)
Projects owning Fluid3D-compatible simplex query results.
Definition VolumeFluidCodec.cpp:63
void exposeVolumeFluidType(ssq::Table &table)
Registers the script-owned volume-fluid class on the VM thread.
Definition VolumeFluidBindings.cpp:4
Result< VolumeFluidNozzlePose > decodeVolumeFluidNozzlePose(const Value &value)
Strict transient pose-argument decode; advanceMoving validates the unit quaternion.
Definition VolumeFluidCodec.cpp:269
Result< std::vector< VolumeFluidSimplex > > decodeVolumeFluidSimplexes(const Value &value)
Strict owning decode of at most 65536 point, edge or triangle topology entries.
Definition VolumeFluidCodec.cpp:64
Result< std::vector< VolumeFluidWindZone > > decodeVolumeFluidWindZones(const Value &value)
Strict owning decode of at most 64 transient Fluid3D-style wind zones.
Definition VolumeFluidCodec.cpp:119
Value encodeVolumeFluidContactEvents(const std::vector< VolumeFluidContactEvent > &events)
Projects owning Enter/Stay/Exit contact lifecycle events.
Definition VolumeFluidCodec.cpp:169
Result< std::vector< glm::vec4 > > decodeVolumeFluidColors(const Value &value)
Strict owning decode of at most 256 transient linear RGBA colors.
Definition VolumeFluidCodec.cpp:97
Result< std::vector< VolumeFluidStitch > > decodeVolumeFluidStitches(const Value &value)
Strict owning decode of at most 65536 Fluid3DStitcher particle pairs.
Definition VolumeFluidCodec.cpp:75
Value encodeVolumeFluidParticles(const std::vector< VolumeFluidParticle > &particles)
Projects an owning particle batch without copying the live solver.
Definition VolumeFluidCodec.cpp:205
Value encodeVolumeFluidDiffuse(const VolumeFluidDiffuseSnapshot &snapshot)
Projects the owning version-1 secondary particle pool state.
Definition VolumeFluidCodec.cpp:31
Result< std::vector< VolumeFluidHeightFieldCollider > > decodeVolumeFluidHeightFieldColliders(const Value &value)
Strict owning decode of at most 16 regular sampled height fields.
Definition VolumeFluidCodec.cpp:156
Result< std::vector< VolumeFluidDiffuseParticle > > decodeVolumeFluidDiffuseParticles(const Value &value)
Strict transient batch decode of at most 65536 particles; emit validates domains.
Definition VolumeFluidCodec.cpp:48
Value encodeVolumeFluidQueryHits(const std::vector< VolumeFluidQueryHit > &hits)
Projects owning mixed-query hits with their source query indices.
Definition VolumeFluidCodec.cpp:62
Result< std::vector< glm::vec3 > > decodeVolumeFluidFieldPositions(const Value &value)
Strict owning decode of up to 65536 transient world-space field query positions.
Definition VolumeFluidCodec.cpp:108
Result< VolumeFluidFoamSnapshot > decodeVolumeFluidFoam(const Value &value)
Strict decode with atomic-controller validation; rejects unknown fields and versions.
Definition VolumeFluidCodec.cpp:18
Result< std::vector< VolumeFluidColorKey > > decodeVolumeFluidColorGradient(const Value &value)
Strict owning decode of a 2..32-key normalized linear RGBA gradient.
Definition VolumeFluidCodec.cpp:182
Result< VolumeFluidDiffuseSnapshot > decodeVolumeFluidDiffuse(const Value &value)
Strict bounded decode; validates the entire pool before returning owning state.
Definition VolumeFluidCodec.cpp:32
Result< VolumeFluidEmission > decodeVolumeFluidEmission(const Value &value)
Strict structural decode; nozzle/material domain validation occurs atomically at emission.
Definition VolumeFluidCodec.cpp:354
Result< std::vector< VolumeFluidSdfCollider > > decodeVolumeFluidSdfColliders(const Value &value)
Strict owning decode of at most 16 sampled SDF colliders.
Definition VolumeFluidCodec.cpp:145
Result< std::vector< VolumeFluidThermalRule > > decodeVolumeFluidThermalRules(const Value &value)
Strict owning decode of at most 1024 transient thermal rules; step validates domains.
Definition VolumeFluidCodec.cpp:194
Result< std::vector< VolumeFluidParticle > > decodeVolumeFluidParticles(const Value &value)
Decodes an owning emission batch without serializing the live solver; admission validates domains.
Definition VolumeFluidCodec.cpp:296
Value encodeVolumeFluidParticleEvents(const VolumeFluidParticleEventBatch &batch)
Projects one owning bounded particle lifecycle-event drain.
Definition VolumeFluidCodec.cpp:206
Value encodeVolumeFluidFoam(const VolumeFluidFoamSnapshot &snapshot)
Projects owning schema-1 foam settings, credit text and RNG state.
Definition VolumeFluidCodec.cpp:17
Value encodeVolumeFluidDistanceHits(const std::vector< VolumeFluidDistanceHit > &hits)
Projects owning signed-distance hits including captured particle values.
Definition VolumeFluidCodec.cpp:61
Result< std::vector< VolumeFluidCollider > > decodeVolumeFluidColliders(const Value &value)
Strict transient collider batch decode; setColliders validates geometry atomically.
Definition VolumeFluidCodec.cpp:257
Value encodeVolumeFluidRayHits(const std::vector< VolumeFluidRayHit > &hits)
Projects owning ray hits including captured particle values.
Definition VolumeFluidCodec.cpp:60
Result< unsigned > emitVolumeFluidBurst(VolumeFluid &solver, const VolumeFluidEmission &e, unsigned count)
Generates at most 4096 particles and admits the entire burst atomically.
Definition VolumeFluidEmitter.cpp:216
ssq::Table projectStatusResult(HSQUIRRELVM vm, const Status &status)
Project a checked native status that carries no payload.
Definition SquirrelBinding.cpp:454
ssq::Table projectResult(HSQUIRRELVM vm, Result< void > &&result)
Consume and project a void native Result using the common schema.
Definition SquirrelBinding.cpp:470
Result< Value > valueFromSquirrel(HSQUIRRELVM vm, SQInteger index, const SquirrelValueOptions &options)
Convert one Squirrel value into the canonical owning Value tree.
Definition SquirrelBinding.cpp:342
@ InvalidArgument