Exemple #1
0
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.
}