Plane findPlane(Axis a, BoundingVolume const &bv) { int off{ 0 }; int smallest{ std::numeric_limits<int>::max() }; Vec3 min{ bv.min() }; Vec3 max{ bv.min() + bv.extent() }; // move candidate plane along axis switch (a) { case Axis::X: { svt::accum_delta next_offset(min.x, svt::delta.x); int pp{ next_offset() }; while (pp < max.x) { int diff{ diffSides( min, { min.x+pp, max.y, max.z }, { min.x+pp, min.y, min.z }, max ) }; std::cout << "X pp: " << pp << " diff: " << diff << "\n-----\n" ; //TODO: handle diff==smallest separately if (diff <= smallest) { smallest = diff; off = pp; } pp = next_offset(); } //for return Plane{ { min.x + off, min.y, min.z }, { min.x + off, max.y, max.z } }; } case Axis::Y: { svt::accum_delta next_offset(min.y, svt::delta.y); int pp{ next_offset() }; while(pp < max.y) { int diff{ diffSides( min, { max.x, min.y+pp, max.z }, { min.x, min.y+pp, min.z }, max ) }; std::cout << "Y pp: " << pp << " diff: " << diff << "\n-----\n" ; //TODO: handle diff==smallest separately if (diff <= smallest) { smallest = diff; off = pp; } pp = next_offset(); } //for return Plane{ { min.x, min.y + off, min.z }, { max.x, min.y + off, max.z } }; } case Axis::Z: { svt::accum_delta next_offset(min.z, svt::delta.z); int pp{ next_offset() }; while (pp < max.z) { int diff{ diffSides( min, { max.x, max.y, min.z+pp }, { min.x, min.y, min.z+pp }, max ) }; std::cout << "Z pp: " << pp << " diff: " << diff << "\n-----\n" ; //TODO: handle diff==smallest separately if (diff <= smallest) { smallest = diff; off = pp; } pp = next_offset(); } //for return Plane{ { min.x, min.y, min.z + off }, { max.x, max.y, min.z + off } }; } default: break; } return Plane{ { -1,-1,-1 }, { -1,-1,-1 } }; // The most interesting case. }