载入中...
搜索中...
未找到
SimulationBackend.h
浏览该文件的文档.
1#pragma once
2
12#include "common/Export.h"
13#include "common/Result.h"
14#include "common/Time.h"
15
16#include <cstdint>
17#include <memory>
18#include <ostream>
19#include <string_view>
20
21class b2World;
22
23namespace eve::physics {
24
33 Cpu,
34 Gpu,
36};
37
48
50[[nodiscard]] constexpr std::string_view simulationBackendDomainName(SimulationBackendDomain domain) noexcept {
51 switch (domain) {
52 case SimulationBackendDomain::World2D: return "world2d";
53 case SimulationBackendDomain::World3D: return "world3d";
54 case SimulationBackendDomain::Cloth2D: return "cloth2d";
55 case SimulationBackendDomain::Cloth3D: return "cloth3d";
56 case SimulationBackendDomain::Rope3D: return "rope3d";
57 case SimulationBackendDomain::SoftBody3D: return "softbody3d";
58 case SimulationBackendDomain::SurfaceFluid: return "surface_fluid";
59 }
60 return "unknown";
61}
62
72
74[[nodiscard]] constexpr std::string_view simulationBackendKindName(SimulationBackendKind kind) noexcept {
75 switch (kind) {
76 case SimulationBackendKind::Cpu: return "cpu";
77 case SimulationBackendKind::Gpu: return "gpu";
78 case SimulationBackendKind::MockAccelerator: return "mock_accelerator";
79 }
80 return "unknown";
81}
82
84[[nodiscard]] constexpr std::string_view simulationDeterminismName(SimulationDeterminism determinism) noexcept {
85 switch (determinism) {
86 case SimulationDeterminism::BitExact: return "bit_exact";
87 case SimulationDeterminism::ToleranceBounded: return "tolerance_bounded";
88 case SimulationDeterminism::ExplicitlyNondeterministic: return "explicitly_nondeterministic";
89 }
90 return "unknown";
91}
92
94inline std::ostream& operator<<(std::ostream& stream, SimulationBackendKind kind) {
96 return stream << simulationBackendKindName(kind);
97}
98
100inline std::ostream& operator<<(std::ostream& stream, SimulationDeterminism determinism) {
102 return stream << simulationDeterminismName(determinism);
103}
104
112
128
148
159public:
161 virtual ~ISimulationBackend() = default;
162
169 [[nodiscard("check the step outcome or explicitly ignore it")]]
171
176 [[nodiscard("inspect simulation progress or explicitly ignore it")]]
177 virtual SimulationObservation observation() const noexcept = 0;
178
183 [[nodiscard]] virtual SimulationBackendKind kind() const noexcept = 0;
184
189 [[nodiscard]] virtual SimulationDeterminism determinism() const noexcept = 0;
190
199 [[nodiscard("check backend observation restore")]]
200 virtual eve::Result<void> restoreObservation(const SimulationObservation& /*observation*/) {
203 eve::DiagnosticCode::Unsupported, "This simulation backend does not support observation restore",
204 "physics.simulationBackend.restoreObservation"));
205 }
206};
207
217public:
218 static constexpr const char* capabilityName = "eve.physics.IAcceleratorBackendProvider";
219
221 virtual ~IAcceleratorBackendProvider() = default;
222
228 [[nodiscard]] virtual bool supports(SimulationBackendDomain domain) const noexcept = 0;
229
236 [[nodiscard("inspect provider creation or explicitly fall back")]]
238};
239
281
290 std::unique_ptr<ISimulationBackend> backend;
292 SimulationBackendKind requestedKind = SimulationBackendKind::Cpu;
294 SimulationBackendKind actualKind = SimulationBackendKind::Cpu;
296 bool usedFallback = false;
297};
298
301 const SimulationSettings& settings) noexcept;
302
303namespace detail {
304
312[[nodiscard("check simulation-step validation")]]
315 const SimulationObservation& observation);
316
323[[nodiscard("check observation advancement")]]
326
333[[nodiscard("check observation validation")]]
334EVENGINE_API_BACKENDS eve::Result<void> validateSimulationObservation(const SimulationObservation& observation,
335 const char* path);
336
345[[nodiscard("retain the backend until its borrowed world is destroyed")]]
346EVENGINE_API_BACKENDS std::unique_ptr<ISimulationBackend> makeBox2DSimulationBackend(b2World* world);
347
356[[nodiscard("retain the backend while its callback state is live")]]
357EVENGINE_API_BACKENDS std::unique_ptr<ISimulationBackend> makeCallbackSimulationBackend(
359
364[[nodiscard("retain the mock backend for contract execution")]]
365EVENGINE_API_BACKENDS std::unique_ptr<ISimulationBackend> makeMockAcceleratorBackend();
366
376[[nodiscard("inspect the selected backend and fallback diagnostics")]]
378 SimulationBackendDomain domain, std::unique_ptr<ISimulationBackend> cpuBackend, void* state,
379 bool preferAccelerator = true);
380
381} // namespace detail
382} // namespace eve::physics
int priority
#define EVENGINE_API_BACKENDS
Definition Export.h:108
TokenKind kind
World3D * world
std::string path
Definition PlayHost.cpp:110
int detail
Move-only, checked operation results for the common layer.
double current
TerrainThermalSettings settings
Common time values and an injectable deterministic simulation clock.
float step
Definition TreeMesh.cpp:314
const VegetationPresetContext & context
ViewPreparation callback
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
Signed, fixed-resolution simulation duration in nanoseconds.
Definition Time.h:43
static constexpr Duration zero() noexcept
Return zero duration.
Definition Time.h:60
Move-only operation result carrying either a value or Status.
Definition Result.h:155
static Result failure(Status status)
Construct a failed result from a structured status.
Definition Result.h:175
static constexpr StrongUint64 zero() noexcept
Returns the zero value for this strong type.
Move-only lifetime token for one independently registered accelerator provider.
AcceleratorBackendProviderRegistration(const AcceleratorBackendProviderRegistration &)=delete
AcceleratorBackendProviderRegistration & operator=(const AcceleratorBackendProviderRegistration &)=delete
Interactive 3D cloth — Verlet particles + distance constraints. Meter space, +Y up,...
Definition Cloth3D.h:32
Optional provider that creates an accelerator backend for domain state.
virtual ~IAcceleratorBackendProvider()=default
Releases the provider; it does not own the domain state.
virtual eve::Result< std::unique_ptr< ISimulationBackend > > create(SimulationBackendDomain domain, void *state)=0
Creates an accelerator backend for a borrowed domain state.
static constexpr const char * capabilityName
virtual bool supports(SimulationBackendDomain domain) const noexcept=0
Reports whether this provider implements a domain.
Minimal observable contract for physics simulation providers.
virtual eve::Result< void > restoreObservation(const SimulationObservation &)
Restores progress metadata after the owner restores its state.
virtual SimulationObservation observation() const noexcept=0
Returns completed-step observables by value.
virtual ~ISimulationBackend()=default
Releases the backend; borrowed domain state is not destroyed.
virtual eve::Result< void > step(const eve::SimulationStep &step, const SimulationSettings &settings)=0
Advances the borrowed solver state by one checked fixed step.
virtual SimulationBackendKind kind() const noexcept=0
Identifies the provider family.
virtual SimulationDeterminism determinism() const noexcept=0
Returns the provider's replay/determinism guarantee.
Renderer-independent particle rope with XPBD stretch and bend constraints.
Definition Rope3D.h:38
Volumetric particle soft body using overlapping shape-matching clusters.
Definition SoftBody3D.h:27
Box3D rigid-body world. Script coordinates are meters (Box3D native), unlike 2D World which uses pixe...
Definition World3D.h:63
Optional physics backend for vehicle mobility and body attach.
Definition Climbing.h:36
constexpr std::string_view simulationBackendDomainName(SimulationBackendDomain domain) noexcept
Returns the stable diagnostic spelling for an accelerated simulation domain.
std::ostream & operator<<(std::ostream &stream, SimulationBackendKind kind)
Writes a backend kind for diagnostics.
void(*)(void *context, const eve::SimulationStep &step, const SimulationSettings &settings) noexcept SimulationStepCallback
Callback used by a domain-owned CPU or test backend adapter.
constexpr std::string_view simulationBackendKindName(SimulationBackendKind kind) noexcept
Returns the stable backend-kind spelling.
SimulationBackendKind
Kind of implementation that owns a simulation step.
SimulationBackendDomain
Domain state consumed by an accelerator provider.
SimulationDeterminism
Determinism guarantee made by a simulation backend.
@ ToleranceBounded
Results are equivalent within a documented numeric tolerance.
@ BitExact
Same inputs produce identical bits under the declared runtime.
@ ExplicitlyNondeterministic
Results may vary and are not suitable for replay equality.
constexpr std::string_view simulationDeterminismName(SimulationDeterminism determinism) noexcept
Returns the stable determinism-contract spelling.
Build metadata (engine git commit, build time, third-party version).
Definition Build.cpp:16
One deterministic fixed-step emitted by SimulationClock.
Definition Time.h:158
Result of choosing an optional accelerator or CPU alternate path.
std::unique_ptr< ISimulationBackend > backend
Owning selected backend; it borrows the supplied domain state.
Observable backend progress shared by CPU and accelerator providers.
eve::Duration simulatedDuration
Accumulated logical simulation time, never wall-clock time.
float lastDeltaSeconds
Duration consumed by the most recently completed step.
double simulatedSeconds
Accumulated logical simulation time in seconds.
eve::SimulationTick lastTick
Tick of the most recently completed step.
std::uint64_t stepCount
Number of completed steps since backend creation.
Validated solver policy for one simulation step.
int positionIterations
Positive rigid-body position iteration count.
int subStepCount
Positive specialized-solver substep count.
int velocityIterations
Positive rigid-body velocity iteration count.