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; }
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(); } }
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; } } } } } }
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; } } } }
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; }
public PolygonVertexPair(TestPolygon p, IndexedVertex v) { poly = p; vertex = v; }
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; }