示例#1
0
    /*!
     * The number of triangle recursions in this chunk.
     *
     * @param a - Top
     * @param b - Bottom Right
     * @param c - Bottom Left
     */
    private void SubdivideFace(int _top, int _bottomRight, int _bottomLeft, int n)
    {
        vertices.Add(SphereUtils.GetMidPointVertex(vertices[_top], vertices[_bottomRight]));
        vertices.Add(SphereUtils.GetMidPointVertex(vertices[_bottomRight], vertices[_bottomLeft]));
        vertices.Add(SphereUtils.GetMidPointVertex(vertices[_bottomLeft], vertices[_top]));

        var middleRight  = vertices.Count - 3;
        var middleBottom = vertices.Count - 2;
        var middleLeft   = vertices.Count - 1;

        // Only draw the last recursion
        if (n == 1)
        {
            triangles.AddRange(new List <int> {
                _top, middleRight, middleLeft
            });                                                                  // Upper Top
            triangles.AddRange(new List <int> {
                middleLeft, middleBottom, _bottomLeft
            });                                                                          // Lower Left
            triangles.AddRange(new List <int> {
                middleBottom, middleLeft, middleRight
            });                                                                          // Lower Mid
            triangles.AddRange(new List <int> {
                middleRight, _bottomRight, middleBottom
            });                                                                            // Lower Right

            return;
        }

        SubdivideFace(_top, middleRight, middleLeft, n - 1);
        SubdivideFace(middleLeft, middleBottom, _bottomLeft, n - 1);
        SubdivideFace(middleBottom, middleLeft, middleRight, n - 1);
        SubdivideFace(middleRight, _bottomRight, middleBottom, n - 1);
    }
    /*!
     * The number of chunk recursions per base face.
     */
    private void GenerateChunks(List <Vector3> _vertices, int n)
    {
        _vertices.Add(SphereUtils.GetMidPointVertex(_vertices[0], _vertices[1])); // Right Middle (3)
        _vertices.Add(SphereUtils.GetMidPointVertex(_vertices[1], _vertices[2])); // Bottom Middle (4)
        _vertices.Add(SphereUtils.GetMidPointVertex(_vertices[2], _vertices[0])); // Left middle (5)

        // Only draw the last recursion
        if (n == 1)
        {
            GenerateChunk(new List <Vector3> {
                _vertices[0], _vertices[3], _vertices[5]
            });                                                                            // Top
            GenerateChunk(new List <Vector3> {
                _vertices[5], _vertices[4], _vertices[2]
            });                                                                            // Bottom Left
            GenerateChunk(new List <Vector3> {
                _vertices[4], _vertices[5], _vertices[3]
            });                                                                            // Bottom Middle
            GenerateChunk(new List <Vector3> {
                _vertices[3], _vertices[1], _vertices[4]
            });                                                                            // Bottom Right

            return;
        }

        GenerateChunks(new List <Vector3> {
            _vertices[0], _vertices[3], _vertices[5]
        }, n - 1);                                                                             // Top
        GenerateChunks(new List <Vector3> {
            _vertices[5], _vertices[4], _vertices[2]
        }, n - 1);                                                                             // Bottom Left
        GenerateChunks(new List <Vector3> {
            _vertices[4], _vertices[5], _vertices[3]
        }, n - 1);                                                                             // Bottom Middle
        GenerateChunks(new List <Vector3> {
            _vertices[3], _vertices[1], _vertices[4]
        }, n - 1);                                                                             // Bottom Right
    }