21 int newWorld(
float gravityX,
float gravityY)
override {
22 auto *ph = eve::ModuleManager::getInstance<Physics>(
"Physics");
24 auto *
w = ph->newWorld(gravityX, gravityY);
27 return static_cast<int>(worlds_.size()) - 1;
30 int worldCount()
override {
32 for (
auto *
w : worlds_)
37 bool worldGravity(
int id,
float *gx,
float *gy)
override {
40 if (gx) *gx =
w->getGravityX();
41 if (gy) *gy =
w->getGravityY();
45 bool rayCast(
int id,
float x1,
float y1,
float x2,
float y2, RayHitInfo *out)
override {
47 if (!
w || !out)
return false;
48 w->rayCast(x1, y1, x2, y2);
49 out->hit =
w->hasRayHit();
51 out->bodyId =
w->getRayHitBodyId();
52 out->x =
w->getRayHitX();
53 out->y =
w->getRayHitY();
54 out->normalX =
w->getRayHitNormalX();
55 out->normalY =
w->getRayHitNormalY();
56 out->fraction =
w->getRayHitFraction();
61 bool removeWorld(
int id)
override {
62 if (
id < 0 ||
static_cast<size_t>(
id) >= worlds_.size())
return false;
63 delete worlds_[
static_cast<size_t>(
id)];
64 worlds_[
static_cast<size_t>(
id)] =
nullptr;
69 World *
world(
int id)
const {
70 if (
id < 0 ||
static_cast<size_t>(
id) >= worlds_.size())
return nullptr;
71 return worlds_[
static_cast<size_t>(
id)];
74 std::vector<World *> worlds_;
79 void add(World3D*
world, std::weak_ptr<const void>
lifetime) {
80 std::erase_if(worlds_, [](
const RegisteredWorld& entry) {
return entry.lifetime.expired(); });
81 const auto found = std::find_if(worlds_.begin(), worlds_.end(),
82 [
world](
const RegisteredWorld& entry) { return entry.world == world; });
86 bool sphereCast(
float fromX,
float fromY,
float fromZ,
float toX,
float toY,
float toZ,
87 float radius, uint64_t maskBits,
int ignoredBodyId,
90 if (!out)
return false;
91 for (
const RegisteredWorld& entry : worlds_) {
92 auto lifetime = entry.lifetime.lock();
95 CameraSphereHit3D
hit;
96 if (!
world->sphereCast(fromX, fromY, fromZ, toX, toY, toZ,
radius, maskBits,
115 struct RegisteredWorld {
120 std::vector<RegisteredWorld> worlds_;
123CameraObstructionQueryImpl& cameraObstructionQuery();
128 std::uint64_t maskBits)
override {
131 const bool found = cameraObstructionQuery().sphereCast(
132 x, maxY,
z,
x, minY,
z, 0.f, maskBits, -1, &
hit);
146CameraObstructionQueryImpl& cameraObstructionQuery() {
147 static CameraObstructionQueryImpl
impl;
151TargetingLineOfSightAdapter& targetingLineOfSightAdapter() {
152 static TargetingLineOfSightAdapter
impl;
159 static PhysicsQueryImpl
impl;
160 static ProcgenWorldQueryImpl procgenWorldQuery;
161 eve::cap::provide<eve::IPhysicsQuery>(&
impl);
162 eve::cap::provide<eve::IProcgenWorldQuery>(&procgenWorldQuery);
163 eve::cap::provide<eve::ICameraObstructionQuery>(&cameraObstructionQuery());
173 .ignore(
"physics line-of-sight space claim was refused");
181 return targetingLineOfSightAdapter().addWorld(
world);
One registered line-of-sight provider that dispatches to backends by coordinate space.
std::weak_ptr< const void > lifetime
Physics-to-sensing line-of-sight capability adapter.
Cross-module query used by camera without linking against physics.
2D physics world query surface (provided by the physics module).
Optional synchronous world-query capability for procedural generation.
Move-only operation result carrying either a value or Status.
static Result success(T value)
Construct a successful result owning value.
Box3D rigid-body world. Script coordinates are meters (Box3D native), unlike 2D World which uses pixe...
Optional physics backend for vehicle mobility and body attach.
eve::Result< void > registerTargetingLineOfSightWorld(World3D *world)
Registers a borrowed live World3D with the targeting LOS adapter.
void registerPhysicsArtifactProvider()
Register the physics provider in the common capability registry.
void registerPhysicsCapabilities()
Registers physics capabilities.
void registerCameraObstructionWorld(World3D *world)
Registers camera obstruction world.
Result< LineOfSightRouter * > ensureLineOfSightRouter()
The process-wide router, registered as the ILineOfSightQuery capability.
Physics-owned CPU collider provider for generated artifacts.
Closest hit returned by the optional camera-obstruction provider.
Value result for a procedural world-surface projection query.