Exemplo n.º 1
0
        public void SetVertex(IndexedVertex inVertex)
#endif // EXPANDED_REFS
        {
            CheckDisposed();

            ushort index = inVertex.Index;

            if (index >= m_VertexCount)
            {
                throw new ArgumentOutOfRangeException("inVertex.Index");
            }

            UnsafeSetVertex(index, inVertex.Attributes);
            m_Dirty = true;
        }
Exemplo n.º 2
0
    void UndoLastMove()
    {
        if (removedVertices.Count > 0)
        {
            PolygonVertexPair toReplace = removedVertices.Pop();
            TestPolygon       toAddTo   = toReplace.poly;
            IndexedVertex     vertToAdd = toReplace.vertex;
            Debug.Log("toaddto " + toAddTo);
            Debug.Log("vertoAdd " + vertToAdd);
            Debug.Log("vertices list? " + toAddTo.verticesList);

            toAddTo.verticesList.Insert(vertToAdd.index, vertToAdd.coords);
            toAddTo.ReDraw();
            gm.numToRemove += 1;
            gm.UpdateRemoveText();
        }
    }
Exemplo n.º 3
0
    void OnMouseDown()
    {
        if (mouseControlEnabled)
        {
            //if highlighter is highlighting something
            //remove the vertex its highlighting
            if (highlightedOne)
            {
                TestPolygon highlightedPoly = highlightGO.GetComponent <HighlightVertex>().GetPolygon();
                if (highlightedPoly.verticesList.Count > 3)
                {
                    int           removeIndex = highlightGO.GetComponent <HighlightVertex>().removalIndex;
                    IndexedVertex indVert     = highlightedPoly.GetIndexedVertex(removeIndex);
                    highlightedPoly.RemoveVertex(removeIndex);
                    //add removal info to the stack
                    removedVertices.Push(new PolygonVertexPair(highlightedPoly, indVert));

                    numRemoved     += 1;
                    gm.numToRemove -= 1;
                    gm.UpdateRemoveText();
                    //if we've removed the correct amount and it matches, speed up wall to finish shape
                    if (gm.numToRemove == 0)
                    {
                        bool success = false;
                        //reworked so that it accounts for all holes
                        foreach (TestPolygon tp in polygon.GetComponentsInChildren <TestPolygon>())
                        {
                            TestPolygon hole = tp.holeToMatch;
                            bool        individualsuccess = gm.VerticesAreSame(hole, tp);
                            if (!individualsuccess)
                            {
                                success = false;
                                break;
                            }
                            success = true;
                        }
                        //all checked were success, so speed up wall
                        if (success)
                        {
                            GameObject.FindObjectOfType <Wall>().speedingup = true;
                        }
                    }
                }
            }
        }
    }
Exemplo n.º 4
0
    void TryRemoveVertex(TestPolygon tp)
    {
        if (tp.verticesList.Count > 3)
        {
            Debug.Log("vertices at least 3");
            int           removeIndex = highlightGO.GetComponent <HighlightVertex>().removalIndex;
            IndexedVertex indVert     = tp.GetIndexedVertex(removeIndex);
            tp.RemoveVertex(removeIndex);
            //add removal info to the stack
            removedVertices.Push(new PolygonVertexPair(tp, indVert));

            numRemoved     += 1;
            gm.numToRemove -= 1;
            gm.UpdateRemoveText();
            //if we've removed all and it matches, speed up wall to finish shape
            if (gm.numToRemove == 0)
            {
                bool success = false;
                //reworked so that it accounts for all holes
                foreach (TestPolygon p in polygon.GetComponentsInChildren <TestPolygon>())
                {
                    TestPolygon hole = p.holeToMatch;
                    bool        individualsuccess = gm.VerticesAreSame(hole, p);
                    if (!individualsuccess)
                    {
                        success = false;
                        break;
                    }
                    success = true;
                }
                if (success)
                {
                    GameObject.FindObjectOfType <Wall>().speedingup = true;
                }
            }
        }
    }
Exemplo n.º 5
0
    public void Regenerate()
    {
        Mesh mountainMesh = mountain.meshFilter.sharedMesh;

        // Find side vertices
        IndexedVertex[] sideA = mountainMesh.vertices
                                .Select((vertex, index) => { return(new IndexedVertex(index, vertex)); })
                                .Where(iv => mountain.generator.IndexToX(iv.index) == 0)
                                .ToArray();
        IndexedVertex[] sideB = mountainMesh.vertices
                                .Select((vertex, index) => { return(new IndexedVertex(index, vertex)); })
                                .Where(iv => mountain.generator.IndexToX(iv.index) == mountain.generator.width - 1)
                                .ToArray();

        // Create Vertices
        int numberOfVertices = sideA.Length * sideWidth * 2;

        Vector3[] vertices = new Vector3[numberOfVertices];
        Vector2[] uv       = new Vector2[numberOfVertices];
        for (int sideI = 0; sideI < 2; sideI++)
        {
            float           sideDirection = sideI == 1 ? -1 : 1;
            IndexedVertex[] side          = sideI == 0 ? sideA : sideB;
            for (int x = 0; x < sideWidth; x++)
            {
                for (int y = 0; y < side.Length; y++)
                {
                    IndexedVertex mountainSideVertex = side[y];

                    int   index              = ((numberOfVertices / 2) * sideI) + y * sideWidth + x;
                    float widthT             = x / (float)(sideWidth - 1);
                    float mountainSideHeight = mountainSideVertex.vertex.y;
                    float height             = baseY + (mountainSideHeight - baseY) * sideCurve.Evaluate(widthT);
                    float halfMountainWidth  = sideWidthScale + mountain.generator.widthScale / 2;
                    float vertexX            = (sideDirection * widthT * sideWidthScale) - (halfMountainWidth * sideDirection) + -sideI;
                    vertices[index] = new Vector3(vertexX, height, mountainSideVertex.vertex.z);
                    uv[index]       = mountainMesh.uv[mountainSideVertex.index];
                    uv[index].x     = sideCurve.Evaluate(widthT);
                }
            }
        }

        // Create Triangles
        List <int> triangles = new List <int>();

        for (int i = sideWidth; i < numberOfVertices - 1; i += 1)
        {
            int x = i % sideWidth;
            if (x == sideWidth - 1)
            {
                continue;
            }

            // Skip the center line
            int y = (i - x) / sideWidth;
            if (y == sideA.Length)
            {
                continue;
            }

            bool overHalfway = y > sideA.Length;

            // Triangle A
            triangles.Add(i);
            if (!overHalfway)
            {
                triangles.Add(i + 1);
            }
            triangles.Add(i - sideWidth);
            if (overHalfway)
            {
                triangles.Add(i + 1);
            }

            // Triangle B
            triangles.Add(i + 1);
            if (!overHalfway)
            {
                triangles.Add(i - sideWidth + 1);
            }
            triangles.Add(i - sideWidth);
            if (overHalfway)
            {
                triangles.Add(i - sideWidth + 1);
            }
        }

        Mesh mesh = new Mesh();

        mesh.vertices  = vertices;
        mesh.triangles = triangles.ToArray();
        mesh.uv        = uv;
        mesh.RecalculateNormals();
        mesh.RecalculateBounds();
        meshFilter.sharedMesh   = mesh;
        meshCollider.sharedMesh = mesh;
    }
Exemplo n.º 6
0
 public PolygonVertexPair(TestPolygon p, IndexedVertex v)
 {
     poly   = p;
     vertex = v;
 }
Exemplo n.º 7
0
    public void Regenerate()
    {
        Mesh mountainMesh     = mountain.meshFilter.sharedMesh;
        Mesh mountainSideMesh = mountainSide.meshFilter.sharedMesh;

        // Find side vertices of mountain and sides (in correct order)
        List <IndexedVertex> side = new List <IndexedVertex>();
        // 1) Add mountainSide A frontSide
        int mountainSideA_Y = mountain.generator.length - 1;

        for (int mountainSideA_X = 0; mountainSideA_X < mountainSide.sideWidth; mountainSideA_X++)
        {
            int mountainSideA_Index = mountainSideA_Y * mountainSide.sideWidth + mountainSideA_X;
            side.Add(new IndexedVertex(mountainSideMesh, mountainSideA_Index, mountainSideMesh.vertices[mountainSideA_Index]));
        }

        // 2) Add mountain frontSide
        int mountainY = mountain.generator.length - 1;

        for (int mountainX = 0; mountainX < mountain.generator.width; mountainX++)
        {
            int mountainIndex = mountain.generator.XYToIndex(mountainX, mountainY);
            side.Add(new IndexedVertex(mountainMesh, mountainIndex, mountainMesh.vertices[mountainIndex]));
        }
        // 3) Add mountainSide B frontSide
        int mountainSideB_Y = mountain.generator.length - 1;

        for (int mountainSideB_X = mountainSide.sideWidth - 1; mountainSideB_X >= 0; mountainSideB_X--)
        {
            int half = mountainSide.sideWidth * mountain.generator.length;
            int mountainSideB_Index = half + mountainSideB_Y * mountainSide.sideWidth + mountainSideB_X;
            side.Add(new IndexedVertex(mountainSideMesh, mountainSideB_Index, mountainSideMesh.vertices[mountainSideB_Index]));
        }

        // Create Vertices (with uv) of this mesh
        int numberOfVertices = side.Count * length;

        Vector3[] vertices = new Vector3[numberOfVertices];
        Vector2[] uv       = new Vector2[numberOfVertices];
        for (int x = 0; x < length; x++)
        {
            for (int y = 0; y < side.Count; y++)
            {
                IndexedVertex sideVertex = side[y];

                int   index      = y * length + x;
                float lengthT    = 1 - (x / (float)(length - 1));
                float evalT      = lengthCurve.Evaluate(lengthT);
                float sideHeight = sideVertex.vertex.y;

                float height  = mountainSide.baseY + (sideHeight - mountainSide.baseY) * evalT;
                float vertexZ = lengthT * lengthScale;
                vertices[index] = new Vector3(sideVertex.vertex.x, height, vertexZ + mountain.generator.length - 1);
                uv[index]       = sideVertex.mesh.uv[sideVertex.index];
                uv[index].y     = evalT;
            }
        }

        // Create Triangles
        List <int> triangles = new List <int>();

        for (int i = length; i < numberOfVertices - 1; i += 1)
        {
            int x = i % length;
            if (x == length - 1)
            {
                continue;
            }

            // Triangle A
            triangles.Add(i);
            triangles.Add(i + 1);
            triangles.Add(i - length);

            // Triangle B
            triangles.Add(i + 1);
            triangles.Add(i - length + 1);
            triangles.Add(i - length);
        }

        // Create the Mesh
        Mesh mesh = new Mesh();

        mesh.vertices  = vertices;
        mesh.triangles = triangles.ToArray();
        mesh.uv        = uv;
        mesh.RecalculateNormals();
        mesh.RecalculateBounds();
        meshFilter.sharedMesh   = mesh;
        meshCollider.sharedMesh = mesh;
    }