// // Created by Иван Ильин on 04.11.2021. // #include #include "HitBox.h" HitBox::HitBox(const Mesh &mesh) { _hitBox.reserve(mesh.triangles().size() * 3); for(const auto& t : mesh.triangles()) { for(int i = 0; i < 3; i++) { // we dont need to add the same points in hit box _addIfUnique(Vec3D(t[i])); } } _hitBox.shrink_to_fit(); } void HitBox::_addIfUnique(Vec3D &&point) { auto check = [&point](const auto& p) { return p == point; }; if (std::find_if(_hitBox.rbegin(), _hitBox.rend(), check) == _hitBox.rend()) { _hitBox.push_back(point); } } HitBox HitBox::Box(const Mesh &mesh) { HitBox result; double maxX = -std::numeric_limits::max(); double maxY = -std::numeric_limits::max(); double maxZ = -std::numeric_limits::max(); double minX = std::numeric_limits::max(); double minY = std::numeric_limits::max(); double minZ = std::numeric_limits::max(); for(const auto& t : mesh.triangles()) { for(int i = 0; i < 3; i++) { auto point = Vec3D(t[i]); if(point.x() > maxX) { maxX = point.x(); } if(point.y() > maxY) { maxY = point.y(); } if(point.z() > maxZ) { maxZ = point.z(); } if(point.x() < minX) { minX = point.x(); } if(point.y() < minY) { minY = point.y(); } if(point.z() < minZ) { minZ = point.z(); } } } result._hitBox.emplace_back(minX, minY, minZ); result._hitBox.emplace_back(minX, maxY, minZ); result._hitBox.emplace_back(maxX, minY, minZ); result._hitBox.emplace_back(maxX, maxY, minZ); result._hitBox.emplace_back(minX, minY, maxZ); result._hitBox.emplace_back(minX, maxY, maxZ); result._hitBox.emplace_back(maxX, minY, maxZ); result._hitBox.emplace_back(maxX, maxY, maxZ); return result; }