public static RenderGeometry CreateSphereGeometry(float radius, int segmentP, int segmentH, bool smoothH, bool smoothV, float cutTop = 0, float cutBottom = 0)
    {
        if (cutTop + cutBottom > 1)
        {
            return(new RenderGeometry());
        }

        RenderGeometry.FaceType  faceType = GetFaceType(smoothH, smoothV);
        StructureGeometry        structure = new StructureGeometry();
        SurfaceComponentGeometry upperPart, lowerPart, middlePart;

        if (cutTop != 0)
        {
            upperPart = SurfaceComponentGeometries.CreateRegularPolygonGeometry(radius * Mathf.Sqrt(4 * cutTop * (1 - cutTop)), segmentP, 2);
            upperPart.ApplyOffset(radius * (1 - 2 * cutTop) * Vector3.up);
        }
        else
        {
            float angle = cutBottom != 0 ? Mathf.Acos(-1 + cutBottom * 2) : Mathf.PI * (segmentH / 2) / segmentH;
            upperPart = SurfaceComponentGeometries.CreateSphereCapGeometry(radius, segmentP, cutBottom != 0 ? segmentH : segmentH / 2, 2 * angle, 0, 1, faceType);
        }
        if (cutBottom != 0)
        {
            lowerPart = SurfaceComponentGeometries.CreateRegularPolygonGeometry(radius * Mathf.Sqrt(4 * cutBottom * (1 - cutBottom)), segmentP, 2);
            lowerPart.ApplyOffset(radius * (1 - 2 * cutBottom) * Vector3.up);
            lowerPart.ApplyRotation(Quaternion.AngleAxis(180, Vector3.right));
        }
        else
        {
            float angle = cutTop != 0 ? Mathf.Acos(-1 + cutTop * 2) : Mathf.PI * ((segmentH + 1) / 2) / segmentH;
            lowerPart = SurfaceComponentGeometries.CreateSphereCapGeometry(radius, segmentP, cutTop != 0 ? segmentH : (segmentH + 1) / 2, 2 * angle, 0, 1, faceType);
            lowerPart.ApplyRotation(Quaternion.AngleAxis(180, Vector3.right));
        }
        if (cutTop != 0 && cutBottom != 0)
        {
            float angle1 = Mathf.Acos(1 - cutTop * 2);
            float angle2 = Mathf.Acos(-1 + cutBottom * 2);
            middlePart = SurfaceComponentGeometries.CreateSphereSideGeometry(radius, angle1, angle2, segmentP, segmentH, 0, 1, faceType);

            Vertex cornerUp   = structure.CreateVertex();
            Vertex cornerDown = structure.CreateVertex();
            structure.CreateFace(middlePart, false, cornerUp, cornerUp, cornerDown, cornerDown);
            structure.CreateFace(upperPart, false, cornerUp);
            structure.CreateFace(lowerPart, false, cornerDown);
        }
        else
        {
            Vertex corner = structure.CreateVertex();
            structure.CreateFace(upperPart, false, corner);
            structure.CreateFace(lowerPart, false, corner);
        }
        return(structure.Build());
    }
    public static RenderGeometry CreateCapsuleGeometry(float radius, float height, int segmentP, int segmentH1, int segmentH2, bool smoothH, bool smoothV)
    {
        StructureGeometry structure = new StructureGeometry();

        RenderGeometry.FaceType faceType = GetFaceType(smoothH, smoothV);

        SurfaceComponentGeometry side = SurfaceComponentGeometries.CreateCylinderSideGeometry(radius, height, segmentP, segmentH1, faceType: faceType);

        SurfaceComponentGeometry upperCap = SurfaceComponentGeometries.CreateSphereCapGeometry(radius, segmentP, segmentH2, faceType: faceType);
        SurfaceComponentGeometry lowerCap = SurfaceComponentGeometries.CreateSphereCapGeometry(radius, segmentP, segmentH2, faceType: faceType);

        lowerCap.ApplyRotation(Quaternion.AngleAxis(180, Vector3.right));

        Vertex cornerUp   = structure.CreateVertex(new Vector3(radius, height / 2, 0));
        Vertex cornerDown = structure.CreateVertex(new Vector3(radius, -height / 2, 0));

        structure.CreateFace(side, false, cornerUp, cornerUp, cornerDown, cornerDown);
        structure.CreateFace(upperCap, true, cornerUp);
        structure.CreateFace(lowerCap, true, cornerDown);
        return(structure.Build());
    }