载入中...
搜索中...
未找到
ArtifactProvider.cpp
浏览该文件的文档.
87 return bounds.valid && std::isfinite(bounds.minX) && std::isfinite(bounds.minY) && std::isfinite(bounds.minZ) &&
95 if (!bounds || !readFloat(*bounds, "minX", output.minX) || !readFloat(*bounds, "minY", output.minY) ||
138 if (!integer || *integer < 0 || static_cast<std::uint64_t>(*integer) > std::numeric_limits<T>::max())
157bool validGeometry(const std::vector<float>& vertices, const std::vector<std::uint32_t>& indices) {
158 if (vertices.empty() || vertices.size() % 3u != 0u || indices.empty() || indices.size() % 3u != 0u ||
177eve::Result<std::unique_ptr<eve::artifact::PreparedPublication>> prepareFailure(eve::DiagnosticCode code,
238eve::Result<std::unique_ptr<eve::artifact::PreparedPublication>> PhysicsArtifactProvider::prepare(
241 return prepareFailure(eve::DiagnosticCode::Failed, "physics artifact prepare failure was injected");
244 publication.schemaVersion != 1 ? eve::DiagnosticCode::UnknownVersion : eve::DiagnosticCode::InvalidArgument,
247 return prepareFailure(eve::DiagnosticCode::Conflict, "physics artifact identity is already published");
251 if (part.kind == eve::artifact::PartKind::Collider && (part.role == "collider" || colliderPart == nullptr))
258 return prepareFailure(eve::DiagnosticCode::UnknownVersion, "physics collider schema version is unsupported");
298 return prepareFailure(eve::DiagnosticCode::Failed, "Box3D did not create the generated collider body");
302 return prepareFailure(eve::DiagnosticCode::Failed, "Box3D did not create the generated collider");
306 auto stage = std::make_unique<PhysicsArtifactStage>(*this, std::move(collider), std::move(world),
309 return eve::Result<std::unique_ptr<eve::artifact::PreparedPublication>>::success(std::move(stage));
318void PhysicsArtifactProvider::commit(PhysicsArtifactCollider collider, std::unique_ptr<World3D> world,
342void PhysicsArtifactProvider::release(PhysicsArtifactCollider& collider, std::unique_ptr<World3D>& world,
356const PhysicsArtifactCollider* PhysicsArtifactProvider::find(eve::PersistentId id) const noexcept {
362const PhysicsArtifactCollider* PhysicsArtifactProvider::find(PhysicsArtifactHandle handle) const noexcept {
379PhysicsArtifactRayHit PhysicsArtifactProvider::rayCast(eve::PersistentId id, float ox, float oy, float oz, float dx,
521 eve::Diagnostic::error(eve::DiagnosticCode::Failed, "physics artifact snapshot allocation failed"));
527 return eve::Result<void>::failure(eve::Diagnostic::error(eve::DiagnosticCode::Conflict, "cannot restore physics artifacts while a publication is staged"));
532 const auto* colliders = encodedColliders ? encodedColliders->getIf<eve::Value::Array>() : nullptr;
533 if (!object || !providerName || *providerName != "physics.box3d-collider" || !hasSupportedVersion(*object) ||
535 return eve::Result<void>::failure(eve::Diagnostic::error(eve::DiagnosticCode::ParseError, "invalid physics artifact provider state"));
537 return eve::Result<void>::failure(eve::Diagnostic::error(eve::DiagnosticCode::Unsupported, "restore into a shared physics world requires explicit republishing"));
552 if (!item || !readString(*item, "artifactId", idText) || !readString(*item, "buildKey", buildKey) ||
557 return eve::Result<void>::failure(eve::Diagnostic::error(eve::DiagnosticCode::ParseError, "invalid physics artifact collider state"));
563 return eve::Result<void>::failure(eve::Diagnostic::error(eve::DiagnosticCode::Unsupported, "physics artifact state has unsupported backend or geometry"));
566 return eve::Result<void>::failure(eve::Diagnostic::error(eve::DiagnosticCode::Failed, "physics artifact handle index exhausted during restore"));
580 return eve::Result<void>::failure(eve::Diagnostic::error(eve::DiagnosticCode::Failed, "Box3D did not recreate the restored collider body"));
582 auto shapeObject = std::unique_ptr<Shape3D>(body->newTriangleMeshShape(collider.vertices, mesh));
584 return eve::Result<void>::failure(eve::Diagnostic::error(eve::DiagnosticCode::Failed, "Box3D did not recreate a restored collider"));
595 return eve::Result<void>::failure(eve::Diagnostic::error(eve::DiagnosticCode::Failed, std::string("Box3D restore failed: ") + error.what()));
597 return eve::Result<void>::failure(eve::Diagnostic::error(eve::DiagnosticCode::Failed, "Box3D restore failed"));
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
static constexpr RuntimeHandle fromPacked(std::uint64_t value) noexcept
Reconstructs a handle from an explicit packed boundary value.
Definition RuntimeHandle.h:190
constexpr bool isValid() const noexcept
Returns whether both coordinates are usable handle values.
Definition RuntimeHandle.h:146
static constexpr index_type invalidIndex
Reserved index value shared by all invalid handles.
Definition RuntimeHandle.h:124
static constexpr RuntimeHandle invalid() noexcept
Returns the canonical invalid handle.
Definition RuntimeHandle.h:143
static Status success(StatusCode code=StatusCode::Ok)
Construct a successful status with an explicit non-error outcome.
Definition Status.h:81
const T * getIf() const noexcept
Return a typed pointer, or nullptr when the kind differs.
Definition Value.h:180
Value * find(const std::string &key) noexcept
Return an object member, or nullptr when absent.
Definition Value.cpp:124
A prepared consumer mutation with a non-throwing visibility boundary.
Definition ArtifactPublication.h:102
constexpr bool isNil() const noexcept
Returns whether this value is the all-zero nil ID.
Definition Identity.h:176
static std::optional< Id128 > parse(std::string_view text) noexcept
Parses canonical UUID text.
Definition Identity.h:151
Real physics-module provider for generated collider publication.
Definition ArtifactProvider.h:67
PhysicsArtifactRayHit rayCast(eve::PersistentId id, float ox, float oy, float oz, float dx, float dy, float dz) const noexcept
Ray query one collider through its live Box3D world.
Definition ArtifactProvider.cpp:379
bool emptyState() const noexcept override
Return whether the physics registry has no committed colliders.
Definition ArtifactProvider.cpp:486
eve::Result< void > unbindWorld(PhysicsWorldHandle world)
Remove an empty provider's matching shared-world binding.
Definition ArtifactProvider.cpp:456
eve::Result< void > restoreState(const eve::Value &state) override
Replace colliders from validated backend-neutral CPU geometry.
Definition ArtifactProvider.cpp:525
~PhysicsArtifactProvider() override
Release all staged/committed Box3D resources.
Definition ArtifactProvider.cpp:233
eve::Result< std::unique_ptr< eve::artifact::PreparedPublication > > prepare(const eve::artifact::PublicationView &publication) override
Stage and copy a collider leaf from a generated publication.
Definition ArtifactProvider.cpp:238
const PhysicsArtifactCollider * find(eve::PersistentId id) const noexcept
Find a committed collider by persistent identity.
Definition ArtifactProvider.cpp:356
eve::Result< eve::Value > snapshotState() const override
Export collider identity, build keys, handles and CPU geometry.
Definition ArtifactProvider.cpp:495
bool isSharedWorldBacked(eve::PersistentId id) const noexcept
Return whether the collider resolves to the currently live shared world binding.
Definition ArtifactProvider.cpp:480
void clear() noexcept
Remove all colliders while retiring their runtime handle slots; the world binding is retained.
Definition ArtifactProvider.cpp:488
eve::Result< void > bindWorld(World3D &world)
Bind future collider publications to a caller-owned shared world.
Definition ArtifactProvider.cpp:433
std::string backendName(eve::PersistentId id) const
Return the backend family for a committed collider, or empty.
Definition ArtifactProvider.cpp:418
PhysicsWorldHandle boundWorld() const noexcept
Return the live shared-world binding, or invalid for compatibility-private mode/stale binding.
Definition ArtifactProvider.cpp:473
std::size_t size() const noexcept
Return the number of committed physics colliders.
Definition ArtifactProvider.cpp:416
bool isHandleLive(PhysicsArtifactHandle handle) const noexcept
Return whether a generation-qualified artifact handle is live.
Definition ArtifactProvider.cpp:369
PhysicsArtifactProvider()
Construct an empty provider; all methods use the owner thread.
Definition ArtifactProvider.cpp:231
bool isBox3DBacked(eve::PersistentId id) const noexcept
Return whether a collider currently owns a valid Box3D shape.
Definition ArtifactProvider.cpp:423
Staged, owning Box3D construction for one provider mutation.
Definition ArtifactProvider.cpp:186
~PhysicsArtifactStage() override
Definition ArtifactProvider.cpp:197
void commit() noexcept override
Make the prepared mutation observable; the operation cannot fail.
Definition ArtifactProvider.cpp:199
PhysicsArtifactStage(PhysicsArtifactProvider &owner, PhysicsArtifactCollider collider, std::unique_ptr< World3D > world, std::unique_ptr< Body3D > body, std::unique_ptr< Shape3D > shape)
Definition ArtifactProvider.cpp:188
void rollback() noexcept override
Discard the prepared mutation; idempotent and non-throwing.
Definition ArtifactProvider.cpp:210
Box3D rigid-body world. Script coordinates are meters (Box3D native), unlike 2D World which uses pixe...
Definition World3D.h:63
PhysicsWorldHandle runtimeHandle() const noexcept
Process-local identity used by PhysicsLink; invalid after destruction.
Definition World3D.h:141
std::weak_ptr< const void > lifetimeToken() const noexcept
Return a weak lifetime token for owner-thread runtime integrations.
Definition World3D.h:150
Body3D * newBody(const std::string &bodyType, float x, float y, float z)
Creates a body in meter-space units.
Definition World3D.cpp:902
@ Collider
Result< float > readFloat(const Accessor &accessor, std::uint32_t element, std::uint32_t component)
Read one bounded finite FLOAT component.
Definition GltfDecode.cpp:221
bool hasSupportedVersion(const eve::Value::Object &object) noexcept
Definition ArtifactProvider.cpp:45
PhysicsArtifactProvider & physicsArtifactProvider() noexcept
Return the process-owned physics artifact provider singleton.
Definition ArtifactProvider.cpp:605
void registerPhysicsArtifactProvider()
Register the physics provider in the common capability registry.
Definition ArtifactProvider.cpp:610
eve::RuntimeHandle< PhysicsArtifactHandleTag > PhysicsArtifactHandle
Generation-qualified handle for a physics artifact collider.
Definition ArtifactProvider.h:29
eve::Value boundsValue(const eve::artifact::Bounds &bounds)
Definition ArtifactProvider.cpp:83
bool validBounds(const eve::artifact::Bounds &bounds) noexcept
Definition ArtifactProvider.cpp:27
bool readBounds(const eve::Value::Object &object, eve::artifact::Bounds &bounds)
Definition ArtifactProvider.cpp:74
@ InvalidArgument
@ NotFound
@ UnknownVersion
@ PreconditionViolation
@ Unsupported
@ Failed
@ ParseError
@ Conflict
@ NoOp
@ Applied
Definition Container.h:602
Physics-owned CPU collider provider for generated artifacts.
Backend-neutral axis-aligned bounds copied from a generated part.
Definition ArtifactPublication.h:37
Borrowed immutable view of one generated leaf.
Definition ArtifactPublication.h:61
std::span< const std::uint32_t > indices
Definition ArtifactPublication.h:71
std::span< const float > positions
Definition ArtifactPublication.h:68
std::uint64_t schemaVersion
Definition ArtifactPublication.h:65
Borrowed immutable view of one complete generated publication.
Definition ArtifactPublication.h:85
std::span< const PartView > parts
Definition ArtifactPublication.h:90
std::uint64_t schemaVersion
Definition ArtifactPublication.h:87
std::string_view buildKey
Definition ArtifactPublication.h:88
Queryable CPU collider resource owned by the physics module.
Definition ArtifactProvider.h:44
PhysicsWorldHandle world
Shared or compatibility-world identity that owns the live collider.
Definition ArtifactProvider.h:49
eve::artifact::Bounds bounds
Definition ArtifactProvider.h:53
std::string backend
Backend family that owns the live shape, normally box3d.
Definition ArtifactProvider.h:52
std::vector< std::uint32_t > indices
Definition ArtifactProvider.h:55
PhysicsArtifactHandle handle
Definition ArtifactProvider.h:47
std::vector< float > vertices
Definition ArtifactProvider.h:54
PhysicsArtifactCollider descriptor
Definition ArtifactProvider.cpp:31
std::weak_ptr< const void > worldLifetime
Definition ArtifactProvider.cpp:34
World3D * world
Definition ArtifactProvider.cpp:33
std::unique_ptr< World3D > ownedWorld
Definition ArtifactProvider.cpp:32
std::unique_ptr< Shape3D > shape
Definition ArtifactProvider.cpp:36
std::unique_ptr< Body3D > body
Definition ArtifactProvider.cpp:35
Owning runtime state for one published collider.
Definition ArtifactProvider.cpp:29
std::size_t pendingStages
Definition ArtifactProvider.cpp:40
std::vector< RuntimeCollider > records
Definition ArtifactProvider.cpp:39
Backend-neutral ray-query result used for parity tests.
Definition ArtifactProvider.h:32