/*********************************************************************************************************************** * * Copyright (c) 2010 - 2025 by Tech Soft 3D, Inc. * The information contained herein is confidential and proprietary to Tech Soft 3D, Inc., and considered a trade secret * as defined under civil and criminal statutes. Tech Soft 3D shall pursue its civil and criminal remedies in the event * of unauthorized use or misappropriation of its trade secrets. Use of this information by anyone other than authorized * employees of Tech Soft 3D, Inc. is granted only under a written non-disclosure agreement, expressly prescribing the * scope and manner of such use. * ***********************************************************************************************************************/ #include "bounding_box.h" namespace utils { namespace geometry { void BoundingBox::reset() { min = glm::vec3(std::numeric_limits::max()); max = glm::vec3(std::numeric_limits::lowest()); } void BoundingBox::add_point(const glm::vec3& point) { min.x = std::min(min.x, point.x); min.y = std::min(min.y, point.y); min.z = std::min(min.z, point.z); max.x = std::max(max.x, point.x); max.y = std::max(max.y, point.y); max.z = std::max(max.z, point.z); }; void BoundingBox::add_box(const BoundingBox& box) { add_point(box.min); add_point(box.max); }; BoundingBox BoundingBox::transform(const glm::mat4& mat) const { glm::vec3 trsf_min = glm::vec3(mat * glm::vec4(min, 1.)); glm::vec3 trsf_max = glm::vec3(mat * glm::vec4(max, 1.)); BoundingBox new_box; new_box.add_point(trsf_min); new_box.add_point(trsf_max); return new_box; }; void BoundingBox::add_boxes(const BoundingBox& box, const std::vector& mat4s) { for (const auto& mat : mat4s) { add_box(box.transform(mat)); } }; glm::vec3 BoundingBox::diagonal() const { return max - min; } glm::vec3 BoundingBox::center() const { return ( max + min ) / 2.f; } double BoundingBox::size_max() const { double x = fabs(max.x - min.x); double y = fabs(max.y - min.y); double z = fabs(max.z - min.z); if (x > y) return x > z ? x : z; else return y > z ? y : z; } } }