载入中...
搜索中...
未找到
TrajectoryCollision.h
浏览该文件的文档.
1#pragma once
2#include "common/Export.h"
3
15#include "common/Result.h"
16#include "common/SubjectRef.h"
17#include "common/Time.h"
21
22#include <cstdint>
23#include <map>
24#include <memory>
25#include <string>
26#include <string_view>
27#include <tuple>
28#include <vector>
29
30namespace eve {
31class IAttachmentPointSource;
32}
33
34namespace eve::physics {
35class World3D;
36}
37
39
46
50 std::string colliderId;
51 PhysicsWorldHandle world = PhysicsWorldHandle::invalid();
52 PhysicsBodyHandle body = PhysicsBodyHandle::invalid();
53 PhysicsShapeHandle shape = PhysicsShapeHandle::invalid();
54 int bodyId = -1;
55 int shapeId = -1;
56 int shapeTag = 0;
57 int materialId = 0;
58 float x = 0.f, y = 0.f, z = 0.f;
59 float normalX = 0.f, normalY = 0.f, normalZ = 0.f;
61 float fraction = 1.f;
62};
63
69 SimulationTick tick = SimulationTick::zero();
71 std::vector<TrajectoryHit> hits;
72};
73
88public:
96
99
101 [[nodiscard]] Result<void> registerCollider(BoneColliderDefinition definition);
103 [[nodiscard]] Result<void> unregisterCollider(std::string_view colliderId);
104
110 [[nodiscard]] Result<void> bindPoseSource(SubjectRef subject, IAttachmentPointSource& source);
112 [[nodiscard]] Result<void> clearPoseSource(SubjectRef subject);
113
119 [[nodiscard]] Result<void> arm(SubjectRef subject, std::string_view colliderId);
121 [[nodiscard]] Result<void> disarm(SubjectRef subject, std::string_view colliderId);
122
127 [[nodiscard]] Result<TrajectoryFrame> advance(SimulationTick tick);
128
130 [[nodiscard]] Result<TrajectorySample> sampleArmed(SubjectRef subject,
131 std::string_view colliderId) const;
132
134 [[nodiscard]] std::size_t colliderCount() const noexcept { return colliders_.size(); }
136 [[nodiscard]] std::size_t armedCount() const noexcept { return armed_.size(); }
138 [[nodiscard]] std::size_t poseSourceCount() const noexcept { return poses_.size(); }
139
140private:
141 struct ArmedCollider {
143 std::string colliderId;
145 TrajectorySample current{};
146 bool hasSample = false;
147 };
148 using ArmedKey = std::tuple<std::string, std::string>;
149 using HitMemoryKey = std::tuple<std::string, std::string, int, int>;
150
151 [[nodiscard]] World3D* liveWorld() const noexcept;
152 [[nodiscard]] Result<TrajectorySample> sampleCollider(SubjectRef subject,
153 const BoneColliderDefinition& def) const;
154 [[nodiscard]] Result<void> sweepArmed(World3D& world, ArmedCollider& armed,
155 const BoneColliderDefinition& def,
156 std::vector<TrajectoryHit>& outHits);
157
158 World3D* world_ = nullptr;
159 std::weak_ptr<const void> worldLifetime_;
160 PhysicsWorldHandle worldHandle_ = PhysicsWorldHandle::invalid();
161 std::map<std::string, BoneColliderDefinition, std::less<>> colliders_;
162 std::map<std::string, IAttachmentPointSource*, std::less<>> poses_;
163 std::map<ArmedKey, ArmedCollider> armed_;
164 std::map<HitMemoryKey, bool> hitMemory_;
165 SimulationTick lastTick_ = SimulationTick::zero();
166};
167
168} // namespace eve::physics::trajectory
float y
Definition AnimClip.cpp:738
float x
Definition AnimClip.cpp:738
float z
Definition AnimClip.cpp:738
int subject
Definition AnimSmr.cpp:163
Authoring definitions for bone-bound collision proxies (UE5 Physics Asset style).
#define EVENGINE_API_DOMAINS
Definition Export.h:110
ShaderImageInput shape
graphics::Canvas * previous
Owning, generation-qualified results for cross-module 3D physics queries.
World3D * world
Process-local, generation-qualified handles owned by the physics domain.
Move-only, checked operation results for the common layer.
double current
Stable reference to a runtime gameplay subject.
LogicalId definition
SimulationTick tick
Common time values and an injectable deterministic simulation clock.
std::string body
const UnitySourceAsset & source
Read-only cross-module contract for sampling named animated attachment points. @ownership Implementat...
Move-only operation result carrying either a value or Status.
Definition Result.h:155
Strong, domain-neutral reference to a runtime subject.
Definition SubjectRef.h:26
Box3D rigid-body world. Script coordinates are meters (Box3D native), unlike 2D World which uses pixe...
Definition World3D.h:63
Owner-thread authority for bone-bound collider catalogs and continuous sweeps.
std::size_t poseSourceCount() const noexcept
Number of subjects with a bound pose source.
std::size_t colliderCount() const noexcept
Number of registered catalog entries.
TrajectoryCollisionRuntime(const TrajectoryCollisionRuntime &)=delete
std::size_t armedCount() const noexcept
Number of armed collider windows.
~TrajectoryCollisionRuntime()
Releases TrajectoryCollisionRuntime resources.
TrajectoryCollisionRuntime & operator=(const TrajectoryCollisionRuntime &)=delete
Optional physics backend for vehicle mobility and body attach.
Definition Climbing.h:36
Build metadata (engine git commit, build time, third-party version).
Definition Build.cpp:16
Plain world-space point shared by animation consumers without a math-library dependency.
Catalog entry that binds a sphere or capsule to named attachment points.
Owning result of one deterministic trajectory advance. @cost Linear in the number of unique World3D c...
std::vector< TrajectoryHit > hits
Unique contacts produced by armed collider sweeps this tick.
One confirmed World3D contact produced by a frame sweep.
World-space sample of one collider endpoint pair.