public bool PopulateLevel(int[,] level, float size, LevelMeshData data) { levelPrefabMap = level; levelWidth = levelPrefabMap.GetLength(0); levelHeight = levelPrefabMap.GetLength(1); sizeMultipler = size; levelMeshData = data; availibleLevel.Clear(); bigSpots.Clear(); mediumSpots.Clear(); smallSpots.Clear(); fences.Clear(); if (!FindSpots()) { return(false); } PlaceFences(); PopulateSpot(smallSpots, PrefabSize.Small); PopulateSpot(mediumSpots, PrefabSize.Medium); PopulateSpot(bigSpots, PrefabSize.Large); return(true); }
public bool GenerateLevel() { level = new int[width, height]; RandomFillLevel(); for (int i = 0; i < smoothAmount; i++) { SmoothLevel(); } ProcessLevel(); int borderSize = 1; int[,] borderedLevel = new int[width + borderSize * 2, height + borderSize * 2]; for (int x = 0; x < borderedLevel.GetLength(0); x++) { for (int y = 0; y < borderedLevel.GetLength(1); y++) { if (x >= borderSize && x < width + borderSize && y >= borderSize && y < height + borderSize) { borderedLevel[x, y] = level[x - borderSize, y - borderSize]; } else { borderedLevel[x, y] = 0; } } } LevelMeshGenerator meshGen = GetComponent <LevelMeshGenerator>(); levelMeshData = meshGen.GenerateMesh(borderedLevel, sizeMultiplier); LevelPopulation popGen = GetComponent <LevelPopulation>(); popGen.DepopulateLevel(); if (populateLevel) { if (!popGen.PopulateLevel(borderedLevel, sizeMultiplier, levelMeshData)) { fillAmount++; GenerateLevel(); } } if (generateGrid) { Grid pathfindingGrid = GetComponent <Grid>(); pathfindingGrid.CreateGrid(); } return(true); }
//18:45 EP4 public LevelMeshData GenerateMesh(int[,] level, float squareSize) { triangleDict.Clear(); outlines.Clear(); checkedVerts.Clear(); squareGrid = new SquareGrid(level, squareSize); vertices = new List <Vector3>(); triangles = new List <int>(); solidVertices = new List <int>(); solidEdgeVertices = new List <int>(); edgeTriangles = new List <int>(); for (int x = 0; x < squareGrid.squares.GetLength(0); x++) { for (int y = 0; y < squareGrid.squares.GetLength(1); y++) { TriangulateSquare(squareGrid.squares[x, y]); } } CalculateMeshOutlines(); Mesh mesh = new Mesh(); floor.GetComponent <MeshFilter>().mesh = mesh; mesh.vertices = vertices.ToArray(); mesh.triangles = triangles.ToArray(); mesh.RecalculateNormals(); mesh.RecalculateBounds(); Vector2[] uvs = new Vector2[vertices.Count]; for (int i = 0; i < uvs.Length; i++) { float percentX = Mathf.InverseLerp(-level.GetLength(0) / 2 * squareSize, level.GetLength(0) / 2 * squareSize, vertices[i].x) * tileAmountX; float percentY = Mathf.InverseLerp(-level.GetLength(1) / 2 * squareSize, level.GetLength(1) / 2 * squareSize, vertices[i].z) * tileAmountY; uvs[i] = new Vector2(percentX, percentY); } mesh.uv = uvs; if (generateColliders) { floor.GetComponent <MeshCollider>().sharedMesh = null; floor.GetComponent <MeshCollider>().sharedMesh = mesh; } Mesh edgeMesh = new Mesh(); edges.mesh = edgeMesh; edgeMesh.vertices = vertices.ToArray(); edgeMesh.triangles = edgeTriangles.ToArray(); edgeMesh.RecalculateNormals(); edgeMesh.RecalculateBounds(); List <int> edgeVertices = new List <int>(); Vector2[] edgeUVs = new Vector2[vertices.Count]; foreach (List <int> outline in outlines) { for (int i = 0; i < outline.Count; i++) { if (!solidVertices.Contains(outline[i])) { edgeVertices.Add(outline[i]); } //uvs[outline[i]] = new Vector2(0, 0); } } for (int i = 0; i < edgeVertices.Count; i++) { edgeUVs[edgeVertices[i]] = new Vector2(0, 1f); } edgeMesh.uv = uvs; edgeMesh.uv2 = edgeUVs; if (generateColliders) { edges.GetComponent <MeshCollider>().sharedMesh = null; edges.GetComponent <MeshCollider>().sharedMesh = edgeMesh; } CreateWallMesh(level, squareSize); LevelMeshData levelData = new LevelMeshData(); levelData.vertices = vertices; List <Vector3> solidVerts = new List <Vector3>(); foreach (int i in solidVertices) { solidVerts.Add(vertices[i]); } levelData.solidVertices = solidVerts; List <Vector3> edgeVerts = new List <Vector3>(); foreach (int i in edgeVertices) { edgeVerts.Add(vertices[i]); } List <Vector3> solidEdgeVerts = new List <Vector3>(); foreach (int i in solidEdgeVertices) { solidEdgeVerts.Add(vertices[i]); } levelData.solidEdgeVertices = solidEdgeVerts; levelData.edgeVertices = edgeVerts; return(levelData); }