Exemplo n.º 1
0
    private void ExtrudeWithCorners3(int indiceIndexTriangle, int[] cornersLevel, float ratio, bool fillGaps = true)
    {
        int i0 = m_triangles[indiceIndexTriangle + 0];
        int i1 = m_triangles[indiceIndexTriangle + 1];
        int i2 = m_triangles[indiceIndexTriangle + 2];

        Vector3 v0 = m_vertices[i0];
        Vector3 v1 = m_vertices[i1];
        Vector3 v2 = m_vertices[i2];

        Vector3 v01 = v0 + ratio * (v1 - v0);
        Vector3 v10 = v1 + ratio * (v0 - v1);
        Vector3 v12 = v1 + ratio * (v2 - v1);
        Vector3 v21 = v2 + ratio * (v1 - v2);
        Vector3 v20 = v2 + ratio * (v0 - v2);
        Vector3 v02 = v0 + ratio * (v2 - v0);
        Vector3 a   = v01 + (v02 - v0);
        Vector3 b   = v12 + (v10 - v1);
        Vector3 c   = v20 + (v21 - v2);

        Vector3[] viNormed = new[] { v0.normalized, v1.normalized, v2.normalized };

        Vector3[] v0Bis = new[] {
            (1f + cornersLevel[0] * icoPlanet.heightDelta) * viNormed[0],
            (1f + cornersLevel[1] * icoPlanet.heightDelta) * viNormed[0],
            (1f + cornersLevel[2] * icoPlanet.heightDelta) * viNormed[0]
        };
        Vector3[] v1Bis = new[] {
            (1f + cornersLevel[0] * icoPlanet.heightDelta) * viNormed[1],
            (1f + cornersLevel[1] * icoPlanet.heightDelta) * viNormed[1],
            (1f + cornersLevel[2] * icoPlanet.heightDelta) * viNormed[1]
        };
        Vector3[] v2Bis = new[] {
            (1f + cornersLevel[0] * icoPlanet.heightDelta) * viNormed[2],
            (1f + cornersLevel[1] * icoPlanet.heightDelta) * viNormed[2],
            (1f + cornersLevel[2] * icoPlanet.heightDelta) * viNormed[2]
        };

        Vector3 v01Bis = v0Bis[0] + ratio * (v1Bis[0] - v0Bis[0]);
        Vector3 v02Bis = v0Bis[0] + ratio * (v2Bis[0] - v0Bis[0]);
        Vector3 v10Bis = v1Bis[1] + ratio * (v0Bis[1] - v1Bis[1]);
        Vector3 v12Bis = v1Bis[1] + ratio * (v2Bis[1] - v1Bis[1]);
        Vector3 v21Bis = v2Bis[2] + ratio * (v1Bis[2] - v2Bis[2]);
        Vector3 v20Bis = v2Bis[2] + ratio * (v0Bis[2] - v2Bis[2]);



        int indexFirstVertice = m_vertices.Count;

        m_vertices.Add(v01);
        m_vertices.Add(v10);
        m_vertices.Add(v12);
        m_vertices.Add(v21);
        m_vertices.Add(v20);
        m_vertices.Add(v02);
        m_vertices.Add(a);
        m_vertices.Add(b);
        m_vertices.Add(c);
        m_vertices.Add(v01Bis);
        m_vertices.Add(v10Bis);
        m_vertices.Add(v12Bis);
        m_vertices.Add(v21Bis);
        m_vertices.Add(v20Bis);
        m_vertices.Add(v02Bis);

        for (int i = 0; i < 3; ++i)
        {
            if (SegmentTypeSelector.LoopLeftBelowLevel(this, (i) % 3, cornersLevel[i]))
            {
                m_vertices.Add((1f + cornersLevel[i] * icoPlanet.heightDelta) * viNormed[i]);
            }
            else
            {
                m_vertices.Add((1f + (cornersLevel[i] - 1) * icoPlanet.heightDelta) * viNormed[i]);
            }
        }



        int i01    = indexFirstVertice + 0;
        int i10    = indexFirstVertice + 1;
        int i12    = indexFirstVertice + 2;
        int i21    = indexFirstVertice + 3;
        int i20    = indexFirstVertice + 4;
        int i02    = indexFirstVertice + 5;
        int ia     = indexFirstVertice + 6;
        int ib     = indexFirstVertice + 7;
        int ic     = indexFirstVertice + 8;
        int i01Bis = indexFirstVertice + 9;
        int i10Bis = indexFirstVertice + 10;
        int i12Bis = indexFirstVertice + 11;
        int i21Bis = indexFirstVertice + 12;
        int i20Bis = indexFirstVertice + 13;
        int i02Bis = indexFirstVertice + 14;
        int i0Bis  = indexFirstVertice + 15;
        int i1Bis  = indexFirstVertice + 16;
        int i2Bis  = indexFirstVertice + 17;

        int min = Mathf.Min(cornersLevel);

        SetElevationTriangle(indiceIndexTriangle, min - 1);



        m_triangles[indiceIndexTriangle + 0] = ia;
        m_triangles[indiceIndexTriangle + 1] = ib;
        m_triangles[indiceIndexTriangle + 2] = ic;

        //top side
        AddTriangle(i01, i10, ia);
        AddTriangle(ia, i10, ib);
        //top side
        AddTriangle(i12, i21, ib);
        AddTriangle(ib, i21, ic);
        //top side
        AddTriangle(i20, i02, ic);
        AddTriangle(ic, i02, ia);

        //Corner
        AddTriangle(i20Bis, i20, i21);
        AddTriangle(i20Bis, i21, i21Bis);
        AddTriangle(i2Bis, i20Bis, i21Bis);//
        AddTriangle(i20, ic, i21);
        //Corner
        AddTriangle(i01Bis, i01, i02);
        AddTriangle(i01Bis, i02, i02Bis);
        AddTriangle(i0Bis, i01Bis, i02Bis);//
        AddTriangle(i01, ia, i02);
        //Corner
        AddTriangle(i12Bis, i12, i10);
        AddTriangle(i12Bis, i10, i10Bis);
        AddTriangle(i1Bis, i12Bis, i10Bis);//
        AddTriangle(i12, ib, i10);

        // mid side
        AddTriangle(i02, i20, i20Bis);
        AddTriangle(i02, i20Bis, i02Bis);
        // mid side
        AddTriangle(i10, i01, i01Bis);
        AddTriangle(i10, i01Bis, i10Bis);
        // mid side
        AddTriangle(i21, i12, i12Bis);
        AddTriangle(i21, i12Bis, i21Bis);

        if (fillGaps)
        {
            AddTriangle(i0, i0Bis, i02Bis);
            AddTriangle(i0, i02Bis, i20Bis);
            AddTriangle(i0, i20Bis, i2);
            AddTriangle(i2, i20Bis, i2Bis);

            AddTriangle(i1, i1Bis, i10Bis);
            AddTriangle(i1, i10Bis, i01Bis);
            AddTriangle(i1, i01Bis, i0);
            AddTriangle(i0, i01Bis, i0Bis);

            AddTriangle(i2, i2Bis, i21Bis);
            AddTriangle(i2, i21Bis, i12Bis);
            AddTriangle(i2, i12Bis, i1);
            AddTriangle(i1, i12Bis, i1Bis);
        }
    }
Exemplo n.º 2
0
    private void ExtrudeWithCorner1(int indiceIndexTriangle, int cornerIndex, float ratio, int cornerLevelUp, int cornerLevelDown, bool fillGaps = true)
    {
        int i0 = m_triangles[indiceIndexTriangle + (cornerIndex + 0) % 3];
        int i1 = m_triangles[indiceIndexTriangle + (cornerIndex + 1) % 3];
        int i2 = m_triangles[indiceIndexTriangle + (cornerIndex + 2) % 3];

        Vector3 v0 = m_vertices[i0];
        Vector3 v1 = m_vertices[i1];
        Vector3 v2 = m_vertices[i2];

        Vector3 v01 = v0 + ratio * (v1 - v0);
        Vector3 v02 = v0 + ratio * (v2 - v0);

        Vector3 v12 = v1 + ratio * (v2 - v1);
        Vector3 v21 = v2 + ratio * (v1 - v2);

        Vector3 a = v01 + (v02 - v0);


        Vector3[] viNormed = new[] { v0.normalized, v1.normalized, v2.normalized };
        Vector3[] v0Bis    = new[] {
            (1f + cornerLevelUp * icoPlanet.heightDelta) * viNormed[0],
            (1f + cornerLevelDown * icoPlanet.heightDelta) * viNormed[0],
        };
        Vector3[] v1Bis = new[] {
            (1f + cornerLevelUp * icoPlanet.heightDelta) * viNormed[1],
            (1f + cornerLevelDown * icoPlanet.heightDelta) * viNormed[1],
        };
        Vector3[] v2Bis = new[] {
            (1f + cornerLevelUp * icoPlanet.heightDelta) * viNormed[2],
            (1f + cornerLevelDown * icoPlanet.heightDelta) * viNormed[2],
        };


        v01 = v0Bis[0] + ratio * (v1Bis[0] - v0Bis[0]);
        v02 = v0Bis[0] + ratio * (v2Bis[0] - v0Bis[0]);
        Vector3 v01Bis = v0Bis[1] + ratio * (v1Bis[1] - v0Bis[1]);
        Vector3 v02Bis = v0Bis[1] + ratio * (v2Bis[1] - v0Bis[1]);


        if (SegmentTypeSelector.LoopLeftBelowLevel(this, cornerIndex, cornerLevelDown))
        {
            m_vertices[i0] = (1f + (cornerLevelDown) * icoPlanet.heightDelta) * viNormed[0];
        }
        else
        {
            m_vertices[i0] = (1f + (cornerLevelDown - 1) * icoPlanet.heightDelta) * viNormed[0];
        }

        m_vertices[i1] = v1Bis[1];
        m_vertices[i2] = v2Bis[1];


        int indexFirstVertice = m_vertices.Count;

        m_vertices.Add(v01);
        m_vertices.Add(v02);
        m_vertices.Add(v12);
        m_vertices.Add(v21);
        m_vertices.Add(a);
        m_vertices.Add(v01Bis);
        m_vertices.Add(v02Bis);
        m_vertices.Add(v0Bis[0]);
        m_vertices.Add(v1Bis[0]);
        m_vertices.Add(v2Bis[0]);

        int i01    = indexFirstVertice + 0;
        int i02    = indexFirstVertice + 1;
        int i12    = indexFirstVertice + 2;
        int i21    = indexFirstVertice + 3;
        int ia     = indexFirstVertice + 4;
        int i01Bis = indexFirstVertice + 5;
        int i02Bis = indexFirstVertice + 6;
        //int i0Bis = indexFirstVertice + 7;   problem ?
        int i1Bis = indexFirstVertice + 8;
        int i2Bis = indexFirstVertice + 9;

        m_triangles[indiceIndexTriangle + 0] = ia;
        m_triangles[indiceIndexTriangle + 1] = i12;
        m_triangles[indiceIndexTriangle + 2] = i21;

        //Top edges
        AddTriangle(i01, i1Bis, ia);
        AddTriangle(i1Bis, i12, ia);
        //Top edges
        AddTriangle(i02, ia, i21);
        AddTriangle(i21, i2Bis, i02);

        // corner triangles
        AddTriangle(i01, ia, i02);
        AddTriangle(i01Bis, i02Bis, i0);

        // Vertical sides
        AddTriangle(i0, i1, i01Bis);
        AddTriangle(i0, i02Bis, i2);

        if (fillGaps)
        {
            // front square
            AddTriangle(i01Bis, i01, i02);
            AddTriangle(i01Bis, i02, i02Bis);

            // Vertical sides
            AddTriangle(i1, i1Bis, i01);
            AddTriangle(i1, i01, i01Bis);

            AddTriangle(i2Bis, i2, i02);
            AddTriangle(i02, i2, i02Bis);
        }
    }
Exemplo n.º 3
0
    public void UpdateSegment(bool canUpdateNeighbours = false)
    {
        if (m_lastUpdateTime != Time.time)
        {
            m_lastUpdateTime = Time.time;

            heightLevel = Mathf.Clamp(heightLevel, 0, icoPlanet.nbLevels);
            GenerateBaseGeometry(ref m_vertices, ref m_triangles);

            SegmentType type;
            int         orientation;
            SegmentTypeSelector.FindSegmentType(this, out type, out orientation);

            switch (type)
            {
            case SegmentType.corner1:
                MakeCorner(orientation);
                break;

            case SegmentType.corner2:
                MakeCorner2(orientation);
                break;

            case SegmentType.corner3:
                MakeCorner3();
                break;

            case SegmentType.side1:
                MakeSide(orientation);
                break;

            case SegmentType.side2:
                MakeSide2(orientation);
                break;

            case SegmentType.side3:
                MakeSide3();
                break;

            case SegmentType.sidecorner:
                MakeCornerSide(orientation);
                break;

            case SegmentType.side3corner3:
                MakeSide3Corner3();
                break;

            case SegmentType.side2Corner:
                MakeSide2Corner(orientation);
                break;

            case SegmentType.side3corner2:
                MakeSide3Corner2(orientation);
                break;

            case SegmentType.full:
                break;

            default:
                print("error");
                break;
            }
            BakeMesh();

            SetCollider(m_vertices, m_triangles);
        }
    }