载入中...
搜索中...
未找到
PhysicsTarget.h
浏览该文件的文档.
1#pragma once
2#include "common/Export.h"
3
4
9
10#include <map>
11#include <string>
12#include <vector>
13
14namespace eve::physics_editing {
15
19using editing::DomainOperation;
20using editing::EditRegion;
21using editing::IDomainOperationTarget;
22using editing::IDomainOperationTargetStaging;
23using editing::IEditableTarget;
24using editing::IPropertyProvider;
25using editing::PropertyDescriptor;
27using editing::PropertyPath;
28using editing::PropertyReadResult;
30using editing::PropertySchema;
33using editing::Result;
34using editing::RuleId;
35using editing::SelectionSnapshot;
36using editing::Status;
37using editing::TargetDescriptor;
39using editing::Value;
40
44
46
49 public virtual IEditableTarget,
52 public IPropertyProvider {
53public:
55 explicit PhysicsColliderTarget(std::string id, int dimensions = 3);
56
58 TargetId targetId() const override { return TargetId(id_); }
60 TargetDescriptor describe() const override;
63 void* queryCapability(const CapabilityId& capability) override;
65 Result<void> applyDomainOperation(const DomainOperation& operation) override;
67 [[nodiscard]] std::unique_ptr<IDomainOperationTarget> cloneDomainState() const override;
69 [[nodiscard]] Result<void> commitDomainState(std::unique_ptr<IDomainOperationTarget> candidate) override;
70
72 eve::Result<eve::Revision> currentRevision(const SelectionSnapshot& selection) const override;
74 PropertySchema schema(const SelectionSnapshot& selection) const override;
76 PropertyReadResult read(const SelectionSnapshot& selection, const PropertyPath& path) const override;
78 Result<DomainOperation> makeSet(const SelectionSnapshot& selection, const PropertyPath& path,
79 const EditorValue& value, PropertySetMode mode) const override;
81 Result<DomainOperation> makeReset(const SelectionSnapshot& selection,
82 const PropertyPath& path) const override;
83
85 EditorValue snapshotValue() const;
87 Result<void> loadSnapshot(const EditorValue& snapshot);
89 std::vector<EditorDiagnostic> validate() const;
90
91private:
93 PropertySchema colliderSchema() const;
94 std::map<std::string, EditorValue> defaults() const;
96 Result<void> validateAssignment(const PropertyDescriptor& descriptor, const EditorValue& value) const;
98 bool selectionMatches(const SelectionSnapshot& selection) const;
99
100 std::string id_;
101 int dimensions_ = 3;
102 std::map<std::string, EditorValue> values_;
103};
104
107public:
109 virtual ~IPhysicsColliderRuntimeSink() = default;
111 virtual Result<void> publish(const PhysicsColliderTarget& candidate) = 0;
112};
113
117public:
119 PhysicsColliderPublishingTarget(std::string id, int dimensions, IPhysicsColliderRuntimeSink* sink);
121 TargetId targetId() const override { return TargetId(document_.targetId()); }
123 std::uint64_t revision() const override { return document_.revision(); }
125 EditRegion dirtyRegion() const override { return document_.dirtyRegion(); }
127 void clearDirtyRegion() override { document_.clearDirtyRegion(); }
129 Result<void> applyDomainOperation(const DomainOperation& operation) override;
131 [[nodiscard]] std::unique_ptr<IDomainOperationTarget> cloneDomainState() const override;
133 [[nodiscard]] Result<void> commitDomainState(std::unique_ptr<IDomainOperationTarget> candidate) override;
135 PhysicsColliderTarget& authoringTarget() { return document_; }
137 const PhysicsColliderTarget& authoringTarget() const { return document_; }
138
139private:
140 PhysicsColliderTarget document_;
141 IPhysicsColliderRuntimeSink* sink_ = nullptr;
142 bool staging_ = false;
143};
144
147 public virtual IEditableTarget,
150 public IPropertyProvider {
151public:
153 explicit PhysicsJointTarget(std::string id);
154
156 TargetId targetId() const override { return TargetId(id_); }
158 TargetDescriptor describe() const override;
161 void* queryCapability(const CapabilityId& capability) override;
163 Result<void> applyDomainOperation(const DomainOperation& operation) override;
165 [[nodiscard]] std::unique_ptr<IDomainOperationTarget> cloneDomainState() const override;
167 [[nodiscard]] Result<void> commitDomainState(std::unique_ptr<IDomainOperationTarget> candidate) override;
169 eve::Result<eve::Revision> currentRevision(const SelectionSnapshot& selection) const override;
171 PropertySchema schema(const SelectionSnapshot& selection) const override;
173 PropertyReadResult read(const SelectionSnapshot& selection, const PropertyPath& path) const override;
175 Result<DomainOperation> makeSet(const SelectionSnapshot& selection, const PropertyPath& path,
176 const EditorValue& value, PropertySetMode mode) const override;
178 Result<DomainOperation> makeReset(const SelectionSnapshot& selection,
179 const PropertyPath& path) const override;
181 EditorValue snapshotValue() const;
183 std::vector<EditorDiagnostic> validate() const;
184
185private:
187 static PropertySchema jointSchema();
188 static std::map<std::string, EditorValue> defaults();
190 bool selectionMatches(const SelectionSnapshot& selection) const;
191
192 std::string id_;
193 std::map<std::string, EditorValue> values_;
194};
195
196} // namespace eve::physics_editing
197
198namespace eve::physics {
199class Body;
200class Body3D;
201class Fixture;
202class Shape3D;
203} // namespace eve::physics
204
205namespace eve::physics_editing {
206
209public:
211 Result<physics::Fixture*> build2D(const PhysicsColliderTarget& target, physics::Body* body) const;
213 Result<physics::Fixture*> build2D(const PhysicsColliderTarget& target, physics::Body* body,
214 const IPhysicsColliderAssetResolver& assets) const;
216 Result<physics::Shape3D*> build3D(const PhysicsColliderTarget& target, physics::Body3D* body) const;
218 Result<physics::Shape3D*> build3D(const PhysicsColliderTarget& target, physics::Body3D* body,
219 const IPhysicsColliderAssetResolver& assets) const;
220};
221
224public:
230 PhysicsCollider3DRuntimeSink(physics::Body3D* body, physics::Shape3D* current = nullptr,
231 const IPhysicsColliderAssetResolver* assets = nullptr)
233 : body_(body), current_(current), assets_(assets) {}
235 Result<void> publish(const PhysicsColliderTarget& candidate) override;
238 physics::Shape3D* shape() const { return current_; }
239
240private:
241 physics::Body3D* body_ = nullptr;
242 physics::Shape3D* current_ = nullptr;
243 const IPhysicsColliderAssetResolver* assets_ = nullptr;
244};
245
248public:
250 PhysicsCollider2DRuntimeSink(physics::Body* body, physics::Fixture* current = nullptr,
251 const IPhysicsColliderAssetResolver* assets = nullptr)
253 : body_(body), current_(current), assets_(assets) {}
255 Result<void> publish(const PhysicsColliderTarget& candidate) override;
258 physics::Fixture* fixture() const { return current_; }
259
260private:
261 physics::Body* body_ = nullptr;
262 physics::Fixture* current_ = nullptr;
263 const IPhysicsColliderAssetResolver* assets_ = nullptr;
264};
265
266} // namespace eve::physics_editing
LogicalId target
ActionParameterOperation operation
double value
std::string descriptor
#define EVENGINE_API_DOMAINS
Definition Export.h:110
ShaderImageInput shape
std::string path
Definition PlayHost.cpp:110
double current
std::string body
A structured explanation of a failed, degraded, or noteworthy result.
Definition Diagnostic.h:94
Move-only operation result carrying either a value or Status.
Definition Result.h:155
Dirty region and revision shared by every editable document target.
Optional candidate/publish capability for atomic domain operations.
Editable-target capability that applies owning domain operations.
IEditableTarget public API.
UI-independent property access for an immutable selection snapshot.
Dotted property path (layout.size) compared and persisted as text.
Definition EditingIds.h:78
Deterministic owning value tree shared by authoring hosts.
Storage-neutral resolver for immutable collider geometry artifacts.
Atomic runtime publication boundary for a complete collider candidate.
virtual ~IPhysicsColliderRuntimeSink()=default
Releases IPhysicsColliderRuntimeSink resources.
virtual Result< void > publish(const PhysicsColliderTarget &candidate)=0
Publish a candidate; failure must preserve the previous live collider.
Candidate-first collider target whose commit/undo publishes to a live sink.
EditRegion dirtyRegion() const override
Dirty region.
std::uint64_t revision() const override
Revision.
const PhysicsColliderTarget & authoringTarget() const
Immutable authoring target used by diagnostics and previews.
TargetId targetId() const override
Target id.
PhysicsColliderTarget & authoringTarget()
Mutable authoring target used by the component property binding.
void clearDirtyRegion() override
Clears dirty region.
Serializable, backend-neutral 2D/3D collider authoring target.
TargetId targetId() const override
Target id.
Serializable joint authoring target using stable body references.
TargetId targetId() const override
Target id.
eve::Severity DiagnosticSeverity
StrongId< TargetIdTag > TargetId
Definition EditingIds.h:57
eve::Diagnostic Diagnostic
PropertyType
PropertyType public API.
StrongId< RuleIdTag > RuleId
Definition EditingIds.h:60
PropertySetMode
PropertySetMode public API.
PropertyFlag
PropertyFlag public API.
eve::StatusCode Status
StrongId< CapabilityIdTag > CapabilityId
Definition EditingIds.h:61
eve::Result< T > Result
PropertyReadState
PropertyReadState public API.
eve::physics_editing::PhysicsCollider2DRuntimeSink PhysicsCollider2DRuntimeSink
eve::physics_editing::IPhysicsColliderRuntimeSink IPhysicsColliderRuntimeSink
eve::physics_editing::PhysicsCollider3DRuntimeSink PhysicsCollider3DRuntimeSink
eve::physics_editing::PhysicsColliderRuntimeBuilder PhysicsColliderRuntimeBuilder
eve::physics_editing::IPhysicsColliderAssetResolver IPhysicsColliderAssetResolver
Optional physics backend for vehicle mobility and body attach.
Definition Climbing.h:36
Result< int > publish(Heightmap &target, std::vector< float > candidate)
Publish.
StatusCode
Stable outcome category for an operation.
Definition Status.h:27
DomainOperation public API.
EditRegion public API.
PropertyDescriptor public API.
PropertyReadResult public API.
EVENGINE_API_PLATFORM public API.
SelectionSnapshot public API.
Stable discovery metadata exposed by every editable target.