Fix situation around aabbox3d default constructor (#15586)

Co-authored-by: JosiahWI <41302989+JosiahWI@users.noreply.github.com>
This commit is contained in:
sfan5 2024-12-29 14:36:30 +01:00 committed by GitHub
parent cca65fde08
commit f2b1cc3e61
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
34 changed files with 67 additions and 53 deletions

@ -134,7 +134,7 @@ public:
//! Index buffer //! Index buffer
SIndexBuffer *Indices; SIndexBuffer *Indices;
//! Bounding box of this meshbuffer. //! Bounding box of this meshbuffer.
core::aabbox3d<f32> BoundingBox; core::aabbox3d<f32> BoundingBox{{0, 0, 0}};
//! Primitive type used for rendering (triangles, lines, ...) //! Primitive type used for rendering (triangles, lines, ...)
E_PRIMITIVE_TYPE PrimitiveType; E_PRIMITIVE_TYPE PrimitiveType;
}; };

@ -108,7 +108,7 @@ public:
if (!mesh) if (!mesh)
return true; return true;
bool result = true; bool result = true;
core::aabbox3df bufferbox; core::aabbox3df bufferbox{{0, 0, 0}};
for (u32 i = 0; i < mesh->getMeshBufferCount(); ++i) { for (u32 i = 0; i < mesh->getMeshBufferCount(); ++i) {
result &= apply(func, mesh->getMeshBuffer(i), boundingBoxUpdate); result &= apply(func, mesh->getMeshBuffer(i), boundingBoxUpdate);
if (boundingBoxUpdate) { if (boundingBoxUpdate) {
@ -136,7 +136,7 @@ protected:
if (!buffer) if (!buffer)
return true; return true;
core::aabbox3df bufferbox; core::aabbox3df bufferbox{{0, 0, 0}};
for (u32 i = 0; i < buffer->getVertexCount(); ++i) { for (u32 i = 0; i < buffer->getVertexCount(); ++i) {
switch (buffer->getVertexType()) { switch (buffer->getVertexType()) {
case video::EVT_STANDARD: { case video::EVT_STANDARD: {

@ -154,7 +154,7 @@ struct SAnimatedMesh final : public IAnimatedMesh
std::vector<IMesh *> Meshes; std::vector<IMesh *> Meshes;
//! The bounding box of this mesh //! The bounding box of this mesh
core::aabbox3d<f32> Box; core::aabbox3d<f32> Box{{0.0f, 0.0f, 0.0f}};
//! Default animation speed of this mesh. //! Default animation speed of this mesh.
f32 FramesPerSecond; f32 FramesPerSecond;

@ -133,7 +133,7 @@ struct SMesh final : public IMesh
std::vector<u32> TextureSlots; std::vector<u32> TextureSlots;
//! The bounding box of this mesh //! The bounding box of this mesh
core::aabbox3d<f32> BoundingBox; core::aabbox3d<f32> BoundingBox{{0, 0, 0}};
}; };
} // end namespace scene } // end namespace scene

@ -228,7 +228,7 @@ public:
video::SMaterial Material; video::SMaterial Material;
video::E_VERTEX_TYPE VertexType; video::E_VERTEX_TYPE VertexType;
core::aabbox3d<f32> BoundingBox; core::aabbox3d<f32> BoundingBox{{0, 0, 0}};
//! Primitive type used for rendering (triangles, lines, ...) //! Primitive type used for rendering (triangles, lines, ...)
E_PRIMITIVE_TYPE PrimitiveType; E_PRIMITIVE_TYPE PrimitiveType;

@ -117,7 +117,7 @@ struct SViewFrustum
core::plane3d<f32> planes[VF_PLANE_COUNT]; core::plane3d<f32> planes[VF_PLANE_COUNT];
//! bounding box around the view frustum //! bounding box around the view frustum
core::aabbox3d<f32> boundingBox; core::aabbox3d<f32> boundingBox{{0, 0, 0}};
private: private:
//! Hold a copy of important transform matrices //! Hold a copy of important transform matrices

@ -137,7 +137,7 @@ public:
//! Moves the mesh into static position. //! Moves the mesh into static position.
void resetAnimation(); void resetAnimation();
virtual void updateBoundingBox(); void updateBoundingBox();
//! Recovers the joints from the mesh //! Recovers the joints from the mesh
void recoverJointsFromMesh(std::vector<IBoneSceneNode *> &jointChildSceneNodes); void recoverJointsFromMesh(std::vector<IBoneSceneNode *> &jointChildSceneNodes);
@ -370,7 +370,7 @@ protected:
// doesn't allow taking a reference to individual elements. // doesn't allow taking a reference to individual elements.
std::vector<std::vector<char>> Vertices_Moved; std::vector<std::vector<char>> Vertices_Moved;
core::aabbox3d<f32> BoundingBox; core::aabbox3d<f32> BoundingBox{{0, 0, 0}};
f32 EndFrame; f32 EndFrame;
f32 FramesPerSecond; f32 FramesPerSecond;

@ -20,9 +20,7 @@ template <class T>
class aabbox3d class aabbox3d
{ {
public: public:
//! Default Constructor. constexpr aabbox3d() = delete;
constexpr aabbox3d() :
MinEdge(-1, -1, -1), MaxEdge(1, 1, 1) {}
//! Constructor with min edge and max edge. //! Constructor with min edge and max edge.
constexpr aabbox3d(const vector3d<T> &min, const vector3d<T> &max) : constexpr aabbox3d(const vector3d<T> &min, const vector3d<T> &max) :
MinEdge(min), MaxEdge(max) {} MinEdge(min), MaxEdge(max) {}

@ -145,7 +145,7 @@ private:
void beginTransition(); void beginTransition();
core::array<video::SMaterial> Materials; core::array<video::SMaterial> Materials;
core::aabbox3d<f32> Box; core::aabbox3d<f32> Box{{0.0f, 0.0f, 0.0f}};
IAnimatedMesh *Mesh; IAnimatedMesh *Mesh;
f32 StartFrame; f32 StartFrame;

@ -104,7 +104,7 @@ private:
/** Note that we can't use the real boundingbox for culling because at that point /** Note that we can't use the real boundingbox for culling because at that point
the camera which is used to calculate the billboard is not yet updated. So we only the camera which is used to calculate the billboard is not yet updated. So we only
know the real boundingbox after rendering - which is too late for culling. */ know the real boundingbox after rendering - which is too late for culling. */
core::aabbox3d<f32> BBoxSafe; core::aabbox3d<f32> BBoxSafe{{0.0f, 0.0f, 0.0f}};
scene::SMeshBuffer *Buffer; scene::SMeshBuffer *Buffer;
}; };

@ -60,7 +60,7 @@ private:
u32 BoneIndex; u32 BoneIndex;
core::aabbox3d<f32> Box; core::aabbox3d<f32> Box{-1.0f, -1.0f, -1.0f, 1.0f, 1.0f, 1.0f};
E_BONE_ANIMATION_MODE AnimationMode; E_BONE_ANIMATION_MODE AnimationMode;
E_BONE_SKINNING_SPACE SkinningSpace; E_BONE_SKINNING_SPACE SkinningSpace;

@ -48,7 +48,7 @@ private:
void setPosition(const core::vector3df &newpos) override; void setPosition(const core::vector3df &newpos) override;
core::matrix4 RelativeTransformationMatrix; core::matrix4 RelativeTransformationMatrix;
core::aabbox3d<f32> Box; core::aabbox3d<f32> Box{{0, 0, 0}};
}; };
} // end namespace scene } // end namespace scene

@ -33,7 +33,7 @@ public:
ISceneNode *clone(ISceneNode *newParent = 0, ISceneManager *newManager = 0) override; ISceneNode *clone(ISceneNode *newParent = 0, ISceneManager *newManager = 0) override;
private: private:
core::aabbox3d<f32> Box; core::aabbox3d<f32> Box{{0, 0, 0}};
}; };
} // end namespace scene } // end namespace scene

@ -72,7 +72,7 @@ protected:
void copyMaterials(); void copyMaterials();
core::array<video::SMaterial> Materials; core::array<video::SMaterial> Materials;
core::aabbox3d<f32> Box; core::aabbox3d<f32> Box{{0, 0, 0}};
video::SMaterial ReadOnlyMaterial; video::SMaterial ReadOnlyMaterial;
IMesh *Mesh; IMesh *Mesh;

@ -307,7 +307,7 @@ const core::aabbox3d<f32> &CSceneManager::getBoundingBox() const
{ {
_IRR_DEBUG_BREAK_IF(true) // Bounding Box of Scene Manager should never be used. _IRR_DEBUG_BREAK_IF(true) // Bounding Box of Scene Manager should never be used.
static const core::aabbox3d<f32> dummy; static const core::aabbox3d<f32> dummy{{0.0f, 0.0f, 0.0f}};
return dummy; return dummy;
} }

@ -573,7 +573,7 @@ SkinnedMesh *SkinnedMeshBuilder::finalize()
return this; return this;
} }
void SkinnedMesh::updateBoundingBox(void) void SkinnedMesh::updateBoundingBox()
{ {
if (!SkinningBuffers) if (!SkinningBuffers)
return; return;

@ -101,7 +101,7 @@ std::vector<DistanceSortedActiveObject> ActiveObjectMgr::getActiveSelectableObje
if (!obj) if (!obj)
continue; continue;
aabb3f selection_box; aabb3f selection_box{{0.0f, 0.0f, 0.0f}};
if (!obj->getSelectionBox(&selection_box)) if (!obj->getSelectionBox(&selection_box))
continue; continue;

@ -430,7 +430,7 @@ void ClientEnvironment::getSelectedActiveObjects(
for (const auto &allObject : allObjects) { for (const auto &allObject : allObjects) {
ClientActiveObject *obj = allObject.obj; ClientActiveObject *obj = allObject.obj;
aabb3f selection_box; aabb3f selection_box{{0.0f, 0.0f, 0.0f}};
if (!obj->getSelectionBox(&selection_box)) if (!obj->getSelectionBox(&selection_box))
continue; continue;

@ -160,7 +160,7 @@ private:
// Was the mesh ever generated? // Was the mesh ever generated?
bool m_mesh_valid = false; bool m_mesh_valid = false;
aabb3f m_box; aabb3f m_box{{0.0f, 0.0f, 0.0f}};
v2f m_origin; v2f m_origin;
u16 m_cloud_radius_i; u16 m_cloud_radius_i;
u32 m_seed; u32 m_seed;

@ -3200,7 +3200,7 @@ PointedThing Game::updatePointedThing(
hud->pointing_at_object = true; hud->pointing_at_object = true;
runData.selected_object = client->getEnv().getActiveObject(result.object_id); runData.selected_object = client->getEnv().getActiveObject(result.object_id);
aabb3f selection_box; aabb3f selection_box{{0.0f, 0.0f, 0.0f}};
if (show_entity_selectionbox && runData.selected_object->doShowSelectionBox() && if (show_entity_selectionbox && runData.selected_object->doShowSelectionBox() &&
runData.selected_object->getSelectionBox(&selection_box)) { runData.selected_object->getSelectionBox(&selection_box)) {
v3f pos = runData.selected_object->getPosition(); v3f pos = runData.selected_object->getPosition();

@ -75,10 +75,8 @@ static aabb3f getNodeBoundingBox(const std::vector<aabb3f> &nodeboxes)
if (nodeboxes.empty()) if (nodeboxes.empty())
return aabb3f(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f); return aabb3f(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f);
aabb3f b_max; auto it = nodeboxes.begin();
aabb3f b_max(it->MinEdge, it->MaxEdge);
std::vector<aabb3f>::const_iterator it = nodeboxes.begin();
b_max = aabb3f(it->MinEdge, it->MaxEdge);
++it; ++it;
for (; it != nodeboxes.end(); ++it) for (; it != nodeboxes.end(); ++it)

@ -105,8 +105,7 @@ void scaleMesh(scene::IMesh *mesh, v3f scale)
if (mesh == NULL) if (mesh == NULL)
return; return;
aabb3f bbox; aabb3f bbox{{0.0f, 0.0f, 0.0f}};
bbox.reset(0, 0, 0);
u32 mc = mesh->getMeshBufferCount(); u32 mc = mesh->getMeshBufferCount();
for (u32 j = 0; j < mc; j++) { for (u32 j = 0; j < mc; j++) {
@ -134,8 +133,7 @@ void translateMesh(scene::IMesh *mesh, v3f vec)
if (mesh == NULL) if (mesh == NULL)
return; return;
aabb3f bbox; aabb3f bbox{{0.0f, 0.0f, 0.0f}};
bbox.reset(0, 0, 0);
u32 mc = mesh->getMeshBufferCount(); u32 mc = mesh->getMeshBufferCount();
for (u32 j = 0; j < mc; j++) { for (u32 j = 0; j < mc; j++) {
@ -296,8 +294,7 @@ void rotateMeshBy6dFacedir(scene::IMesh *mesh, u8 facedir)
void recalculateBoundingBox(scene::IMesh *src_mesh) void recalculateBoundingBox(scene::IMesh *src_mesh)
{ {
aabb3f bbox; aabb3f bbox{{0.0f, 0.0f, 0.0f}};
bbox.reset(0,0,0);
for (u16 j = 0; j < src_mesh->getMeshBufferCount(); j++) { for (u16 j = 0; j < src_mesh->getMeshBufferCount(); j++) {
scene::IMeshBuffer *buf = src_mesh->getMeshBuffer(j); scene::IMeshBuffer *buf = src_mesh->getMeshBuffer(j);
buf->recalculateBoundingBox(); buf->recalculateBoundingBox();

@ -619,15 +619,22 @@ const core::aabbox3df &ParticleBuffer::getBoundingBox() const
if (!m_bounding_box_dirty) if (!m_bounding_box_dirty)
return m_mesh_buffer->BoundingBox; return m_mesh_buffer->BoundingBox;
core::aabbox3df box; core::aabbox3df box{{0, 0, 0}};
bool first = true;
for (u16 i = 0; i < m_count; i++) { for (u16 i = 0; i < m_count; i++) {
// check if this index is used // check if this index is used
static_assert(quad_indices[1] != 0); static_assert(quad_indices[1] != 0);
if (m_mesh_buffer->getIndices()[6 * i + 1] == 0) if (m_mesh_buffer->getIndices()[6 * i + 1] == 0)
continue; continue;
for (u16 j = 0; j < 4; j++) for (u16 j = 0; j < 4; j++) {
box.addInternalPoint(m_mesh_buffer->getPosition(i * 4 + j)); const auto pos = m_mesh_buffer->getPosition(i * 4 + j);
if (first)
box.reset(pos);
else
box.addInternalPoint(pos);
first = false;
}
} }
m_mesh_buffer->BoundingBox = box; m_mesh_buffer->BoundingBox = box;

@ -50,8 +50,6 @@ Sky::Sky(s32 id, RenderingEngine *rendering_engine, ITextureSource *tsrc, IShade
m_seed = (u64)myrand() << 32 | myrand(); m_seed = (u64)myrand() << 32 | myrand();
setAutomaticCulling(scene::EAC_OFF); setAutomaticCulling(scene::EAC_OFF);
m_box.MaxEdge.set(0, 0, 0);
m_box.MinEdge.set(0, 0, 0);
m_sky_params = SkyboxDefaults::getSkyDefaults(); m_sky_params = SkyboxDefaults::getSkyDefaults();
m_sun_params = SkyboxDefaults::getSunDefaults(); m_sun_params = SkyboxDefaults::getSunDefaults();

@ -122,7 +122,7 @@ public:
} }
private: private:
aabb3f m_box; aabb3f m_box{{0.0f, 0.0f, 0.0f}};
video::SMaterial m_materials[SKY_MATERIAL_COUNT]; video::SMaterial m_materials[SKY_MATERIAL_COUNT];
// How much sun & moon transition should affect horizon color // How much sun & moon transition should affect horizon color
float m_horizon_blend() float m_horizon_blend()

@ -195,8 +195,7 @@ WieldMeshSceneNode::WieldMeshSceneNode(scene::ISceneManager *mgr, s32 id):
else else
g_extrusion_mesh_cache->grab(); g_extrusion_mesh_cache->grab();
// Disable bounding box culling for this scene node // This class doesn't render anything, so disable culling.
// since we won't calculate the bounding box.
setAutomaticCulling(scene::EAC_OFF); setAutomaticCulling(scene::EAC_OFF);
// Create the child scene node // Create the child scene node

@ -134,7 +134,7 @@ private:
// Bounding box culling is disabled for this type of scene node, // Bounding box culling is disabled for this type of scene node,
// so this variable is just required so we can implement // so this variable is just required so we can implement
// getBoundingBox() and is set to an empty box. // getBoundingBox() and is set to an empty box.
aabb3f m_bounding_box; aabb3f m_bounding_box{{0, 0, 0}};
ShadowRenderer *m_shadow; ShadowRenderer *m_shadow;
}; };

@ -262,7 +262,7 @@ static void add_object_boxes(Environment *env,
{ {
auto process_object = [&cinfo] (ActiveObject *object) { auto process_object = [&cinfo] (ActiveObject *object) {
if (object && object->collideWithObjects()) { if (object && object->collideWithObjects()) {
aabb3f box; aabb3f box{{0.0f, 0.0f, 0.0f}};
if (object->getCollisionBox(&box)) if (object->getCollisionBox(&box))
cinfo.emplace_back(object, 0, box); cinfo.emplace_back(object, 0, box);
} }

@ -121,7 +121,7 @@ void NodeBox::deSerialize(std::istream &is)
case NODEBOX_LEVELED: { case NODEBOX_LEVELED: {
u16 fixed_count = readU16(is); u16 fixed_count = readU16(is);
while(fixed_count--) { while(fixed_count--) {
aabb3f box; aabb3f box{{0.0f, 0.0f, 0.0f}};
box.MinEdge = readV3F32(is); box.MinEdge = readV3F32(is);
box.MaxEdge = readV3F32(is); box.MaxEdge = readV3F32(is);
fixed.push_back(box); fixed.push_back(box);

@ -115,9 +115,9 @@ struct NodeBox
// NODEBOX_FIXED // NODEBOX_FIXED
std::vector<aabb3f> fixed; std::vector<aabb3f> fixed;
// NODEBOX_WALLMOUNTED // NODEBOX_WALLMOUNTED
aabb3f wall_top; aabb3f wall_top = dummybox;
aabb3f wall_bottom; aabb3f wall_bottom = dummybox;
aabb3f wall_side; // being at the -X side aabb3f wall_side = dummybox; // being at the -X side
// NODEBOX_CONNECTED // NODEBOX_CONNECTED
// (kept externally to not bloat the structure) // (kept externally to not bloat the structure)
std::shared_ptr<NodeBoxConnected> connected; std::shared_ptr<NodeBoxConnected> connected;
@ -139,6 +139,10 @@ struct NodeBox
void reset(); void reset();
void serialize(std::ostream &os, u16 protocol_version) const; void serialize(std::ostream &os, u16 protocol_version) const;
void deSerialize(std::istream &is); void deSerialize(std::istream &is);
private:
/// @note the actual defaults are in reset(), see nodedef.cpp
static constexpr aabb3f dummybox = aabb3f({0, 0, 0});
}; };
struct MapNode; struct MapNode;
@ -810,14 +814,14 @@ private:
* The union of all nodes' selection boxes. * The union of all nodes' selection boxes.
* Might be larger if big nodes are removed from the manager. * Might be larger if big nodes are removed from the manager.
*/ */
aabb3f m_selection_box_union; aabb3f m_selection_box_union{{0.0f, 0.0f, 0.0f}};
/*! /*!
* The smallest box in integer node coordinates that * The smallest box in integer node coordinates that
* contains all nodes' selection boxes. * contains all nodes' selection boxes.
* Might be larger if big nodes are removed from the manager. * Might be larger if big nodes are removed from the manager.
*/ */
core::aabbox3d<s16> m_selection_box_int_union; core::aabbox3d<s16> m_selection_box_int_union{{0, 0, 0}};
/*! /*!
* NodeResolver instances to notify once node registration has finished. * NodeResolver instances to notify once node registration has finished.

@ -302,7 +302,7 @@ private:
v3s16 m_start; /**< source position */ v3s16 m_start; /**< source position */
v3s16 m_destination; /**< destination position */ v3s16 m_destination; /**< destination position */
core::aabbox3d<s16> m_limits; /**< position limits in real map coordinates */ core::aabbox3d<s16> m_limits{{0, 0, 0}}; /**< position limits in real map coordinates */
/** contains all map data already collected and analyzed. /** contains all map data already collected and analyzed.
Access it via the getIndexElement/getIdxElem methods. */ Access it via the getIndexElement/getIdxElem methods. */

@ -326,7 +326,8 @@ bool is_color_table(lua_State *L, int index)
aabb3f read_aabb3f(lua_State *L, int index, f32 scale) aabb3f read_aabb3f(lua_State *L, int index, f32 scale)
{ {
aabb3f box; // default value for accidental/historical reasons
aabb3f box{-1.0f, -1.0f, -1.0f, 1.0f, 1.0f, 1.0f};
if(lua_istable(L, index)){ if(lua_istable(L, index)){
lua_rawgeti(L, index, 1); lua_rawgeti(L, index, 1);
box.MinEdge.X = lua_tonumber(L, -1) * scale; box.MinEdge.X = lua_tonumber(L, -1) * scale;

@ -85,7 +85,19 @@ bool read_color (lua_State *L, int index,
video::SColor *color); video::SColor *color);
bool is_color_table (lua_State *L, int index); bool is_color_table (lua_State *L, int index);
/**
* Read a floating-point axis-aligned box from Lua.
*
* @param L the Lua state
* @param index the index of the Lua variable to read the box from. The
* variable must contain a table of the form
* {minx, miny, minz, maxx, maxy, maxz}.
* @param scale factor to scale the bounding box by
*
* @return the box corresponding to lua table
*/
aabb3f read_aabb3f (lua_State *L, int index, f32 scale); aabb3f read_aabb3f (lua_State *L, int index, f32 scale);
v3s16 read_v3s16 (lua_State *L, int index); v3s16 read_v3s16 (lua_State *L, int index);
std::vector<aabb3f> read_aabb3f_vector (lua_State *L, int index, f32 scale); std::vector<aabb3f> read_aabb3f_vector (lua_State *L, int index, f32 scale);
size_t read_stringlist (lua_State *L, int index, size_t read_stringlist (lua_State *L, int index,

@ -1847,7 +1847,7 @@ void ServerEnvironment::getSelectedActiveObjects(
auto process = [&] (ServerActiveObject *obj) -> bool { auto process = [&] (ServerActiveObject *obj) -> bool {
if (obj->isGone()) if (obj->isGone())
return false; return false;
aabb3f selection_box; aabb3f selection_box{{0.0f, 0.0f, 0.0f}};
if (!obj->getSelectionBox(&selection_box)) if (!obj->getSelectionBox(&selection_box))
return false; return false;