static void _ProcessBoundingBoxAABB(
        ref SharedMinBounding sharedMinBounding,
        Vector3[] vertices,
        bool[] usedVertices,
        Vector3 minCenter,
        Euler beginEuler,
        Euler endEuler,
        int stepEuler)
    {
        if (vertices == null || usedVertices == null)
        {
            return;
        }

        Matrix4x4   transform   = Matrix4x4.identity;
        MinBounding minBounding = new MinBounding();

        for (int rz = beginEuler.z; rz < endEuler.z; rz += stepEuler)
        {
            for (int ry = beginEuler.y; ry < endEuler.y; ry += stepEuler)
            {
                for (int rx = beginEuler.x; rx < endEuler.x; rx += stepEuler)
                {
                    transform.SetTRS(Vector3.zero, Quaternion.Euler(rx, ry, rz), Vector3.one);
                    Vector3 tempBoxA = Vector3.zero, tempBoxB = Vector3.zero;
                    _GetBoundingBoxAABB(vertices, usedVertices, ref tempBoxA, ref tempBoxB, ref minCenter, ref transform);
                    Vector3 v          = (tempBoxB - tempBoxA);
                    float   tempVolume = _GetVolume(v);
                    Euler   tempEuler  = new Euler(rx, ry, rz);
                    minBounding.Contain(tempBoxA, tempBoxB, tempEuler, tempVolume);
                }
            }
        }

        sharedMinBounding.Contain(ref minBounding);
    }
    void _GetMinBoundingBoxAABB(ref Vector3 minCenter, ref Vector3 minBoxA, ref Vector3 minBoxB, ref Vector3 minEular)
    {
        if (_centerEnabled)
        {
            minCenter = _center;
        }
        else
        {
            minCenter = _GetBoundingBoxCenterAABB();
        }
        //minCenter = Vector3.zero;

        if (_rotationEnabled)
        {
            minBoxA  = Vector3.zero;
            minBoxB  = Vector3.zero;
            minEular = Vector3.zero;
            Matrix4x4 transform = _RotationMatrix(InversedRotation(_rotation));
            _GetBoundingBoxAABB(ref minBoxA, ref minBoxB, ref minCenter, ref transform);
            return;
        }

                #if false
        {
            minBoxA  = Vector3.zero;
            minBoxB  = Vector3.zero;
            minEular = Vector3.zero;
            Matrix4x4 transform = Matrix4x4.identity;
            _GetBoundingBoxAABB(ref minBoxA, ref minBoxB, ref minCenter, ref transform);
        }
                #else
        int stepEuler  = 20;
        int stepEuler2 = 5;
        int stepEuler3 = 1;

        SharedMinBounding sharedMinBounding = new SharedMinBounding();

        {
            Euler beginEuler = new Euler(0, 0, 0);
            Euler endEuler   = new Euler(180, 180, 180);
            if (!_optimizeRotation.x)
            {
                beginEuler.x = 0; endEuler.x = 1;
            }
            if (!_optimizeRotation.y)
            {
                beginEuler.y = 0; endEuler.y = 1;
            }
            if (!_optimizeRotation.z)
            {
                beginEuler.z = 0; endEuler.z = 1;
            }

            _ProcessBoundingBoxAABB(
                ref sharedMinBounding,
                _vertexList,
                _usedVertexList,
                minCenter,
                beginEuler,
                endEuler,
                stepEuler);
        }

        {
            int   fx         = sharedMinBounding.minBounding.euler.x;
            int   fy         = sharedMinBounding.minBounding.euler.y;
            int   fz         = sharedMinBounding.minBounding.euler.z;
            Euler beginEuler = new Euler(fx - stepEuler, fy - stepEuler, fz - stepEuler);
            Euler endEuler   = new Euler(fx + stepEuler, fy + stepEuler, fz + stepEuler);
            if (!_optimizeRotation.x)
            {
                beginEuler.x = 0; endEuler.x = 1;
            }
            if (!_optimizeRotation.y)
            {
                beginEuler.y = 0; endEuler.y = 1;
            }
            if (!_optimizeRotation.z)
            {
                beginEuler.z = 0; endEuler.z = 1;
            }

            _ProcessBoundingBoxAABB(
                ref sharedMinBounding,
                _vertexList,
                _usedVertexList,
                minCenter,
                beginEuler,
                endEuler,
                stepEuler2);
        }

        {
            int   fx         = sharedMinBounding.minBounding.euler.x;
            int   fy         = sharedMinBounding.minBounding.euler.y;
            int   fz         = sharedMinBounding.minBounding.euler.z;
            Euler beginEuler = new Euler(fx - stepEuler2, fy - stepEuler2, fz - stepEuler2);
            Euler endEuler   = new Euler(fx + stepEuler2, fy + stepEuler2, fz + stepEuler2);
            if (!_optimizeRotation.x)
            {
                beginEuler.x = 0; endEuler.x = 1;
            }
            if (!_optimizeRotation.y)
            {
                beginEuler.y = 0; endEuler.y = 1;
            }
            if (!_optimizeRotation.z)
            {
                beginEuler.z = 0; endEuler.z = 1;
            }

            _ProcessBoundingBoxAABB(
                ref sharedMinBounding,
                _vertexList,
                _usedVertexList,
                minCenter,
                beginEuler,
                endEuler,
                stepEuler3);
        }

        Euler euler = sharedMinBounding.minBounding.euler;
        minBoxA  = sharedMinBounding.minBounding.boxA;
        minBoxB  = sharedMinBounding.minBounding.boxB;
        minEular = new Vector3((float)euler.x, (float)euler.y, (float)euler.z);
                #endif
    }