From f602479316ff03de8bcde888e6e548ea267c94d7 Mon Sep 17 00:00:00 2001 From: ExeVirus Date: Tue, 11 Jun 2024 15:42:21 -0400 Subject: [PATCH] Add Appgurueu Integrations and Fixes --- irr/include/vector3d.h | 24 ++++++++++++++++++++++++ src/collision.cpp | 15 +++++++++++---- src/server/activeobjectmgr.cpp | 9 ++++----- src/server/serveractiveobject.cpp | 3 ++- src/serverenvironment.cpp | 6 ++++-- 5 files changed, 45 insertions(+), 12 deletions(-) diff --git a/irr/include/vector3d.h b/irr/include/vector3d.h index a69f17e16..99cddef2c 100644 --- a/irr/include/vector3d.h +++ b/irr/include/vector3d.h @@ -7,6 +7,7 @@ #include "irrMath.h" #include +#include namespace irr { @@ -32,6 +33,9 @@ class vector3d //! Constructor with the same value for all elements explicit constexpr vector3d(T n) : X(n), Y(n), Z(n) {} + //! Array - vector conversion + constexpr vector3d(const std::array& arr) : + X(arr[0]), Y(arr[1]), Z(arr[2]) {} // operators @@ -181,6 +185,26 @@ class vector3d return *this; } + std::array toArray() const { + return { X, Y, Z }; + } + + vector3d min(const T min_component) const { + return vector3d( + std::min(X, min_component), + std::min(Y, min_component), + std::min(Z, min_component) + ); + } + + vector3d max(const T max_component) const { + return vector3d( + std::max(X, max_component), + std::max(Y, max_component), + std::max(Z, max_component) + ); + } + //! Get length of the vector. T getLength() const { return core::squareroot(X * X + Y * Y + Z * Z); } diff --git a/src/collision.cpp b/src/collision.cpp index d804f7f0d..a273ce9a2 100644 --- a/src/collision.cpp +++ b/src/collision.cpp @@ -281,13 +281,15 @@ static void add_object_boxes(Environment *env, } }; - // Calculate distance by speed, add own extent and 1.5m of tolerance - const f32 distance = speed_f.getLength() * dtime + - box_0.getExtent().getLength() + 1.5f * BS; + const f32 tolerance = 1.5f * BS; // TODO increase tolerance #ifndef SERVER ClientEnvironment *c_env = dynamic_cast(env); if (c_env) { + // Calculate distance by speed, add own extent and 1.5m of tolerance + const f32 distance = speed_f.getLength() * dtime + + box_0.getExtent().getLength() + 1.5f * BS; + std::vector clientobjects; c_env->getActiveObjects(pos_f, distance, clientobjects); @@ -326,9 +328,14 @@ static void add_object_boxes(Environment *env, return false; }; + // Calculate distance by speed, add own extent and tolerance + const v3f movement = speed_f * dtime; + const v3f min = pos_f + box_0.MinEdge - v3f(tolerance) + movement.min(0); + const v3f max = pos_f + box_0.MaxEdge + v3f(tolerance) + movement.max(0); + // nothing is put into this vector std::vector s_objects; - s_env->getObjectsInsideRadius(s_objects, pos_f, distance, include_obj_cb); + s_env->getObjectsInArea(s_objects, aabb3f(min, max), include_obj_cb); } } } diff --git a/src/server/activeobjectmgr.cpp b/src/server/activeobjectmgr.cpp index 8ca61a61b..19c31840b 100644 --- a/src/server/activeobjectmgr.cpp +++ b/src/server/activeobjectmgr.cpp @@ -47,8 +47,7 @@ void ActiveObjectMgr::clearIf(const std::functiongetBasePosition()); - m_active_objects.remove(it.first); + removeObject(it.first); } } } @@ -95,10 +94,10 @@ bool ActiveObjectMgr::registerObject(std::unique_ptr obj) return false; } - if (objectpos_over_limit(obj->getBasePosition())) { - v3f p = obj->getBasePosition(); + const v3f pos = obj->getBasePosition(); + if (objectpos_over_limit(pos)) { warningstream << "Server::ActiveObjectMgr::addActiveObjectRaw(): " - << "object position (" << p.X << "," << p.Y << "," << p.Z + << "object position (" << pos.X << "," << pos.Y << "," << pos.Z << ") outside maximum range" << std::endl; return false; } diff --git a/src/server/serveractiveobject.cpp b/src/server/serveractiveobject.cpp index db6d55269..fb0e8d0eb 100644 --- a/src/server/serveractiveobject.cpp +++ b/src/server/serveractiveobject.cpp @@ -33,7 +33,8 @@ ServerActiveObject::ServerActiveObject(ServerEnvironment *env, v3f pos): } void ServerActiveObject::setBasePosition(const v3f &pos) { - if(getEnv()) + bool changed = m_base_position != pos; + if (changed && getEnv()) getEnv()->updateObjectPosition(getId(), m_base_position, pos); m_base_position = pos; } diff --git a/src/serverenvironment.cpp b/src/serverenvironment.cpp index 87bb39d4c..f8142160f 100644 --- a/src/serverenvironment.cpp +++ b/src/serverenvironment.cpp @@ -1871,10 +1871,12 @@ void ServerEnvironment::getSelectedActiveObjects( return false; }; + aabb3f search_area(shootline_on_map.start - 5 * BS, shootline_on_map.end + 5 * BS); + search_area.repair(); + // Use "logic in callback" pattern to avoid useless vector filling std::vector tmp; - getObjectsInsideRadius(tmp, shootline_on_map.getMiddle(), - 0.5 * shootline_on_map.getLength() + 5 * BS, process); + getObjectsInArea(tmp, search_area, process); } /*