// Create the ground private void PopulateGround(List <Vector3> points) { GameObject ground = new GameObject(); ground.transform.parent = transform; int groundMaterialIndex = Random.Range(0, _groundMaterials.Length); MeshRenderer groundRendered = ground.AddComponent <MeshRenderer>(); groundRendered.material = _groundMaterials[groundMaterialIndex]; ground.transform.name = "Ground" + groundRendered.material.name; ground.tag = "Ground"; MeshCollider groundCollider = ground.AddComponent <MeshCollider>(); MeshFilter groundMeshFilter = ground.AddComponent <MeshFilter>(); PlaneRange range = new PlaneRange(0, 1f, 0, 0, 0, 1f); if (_missingFloor) { // TODO: Change to only render floor that exists groundMeshFilter.mesh = MeshTools.CreateMeshFromVectors(points, range); } else { groundMeshFilter.mesh = MeshTools.CreateMeshFromVectors(points, range); } groundCollider.sharedMesh = groundMeshFilter.mesh; }
/* * Add a ceiling to the room */ public void AddCeiling() { GameObject ceiling = new GameObject(); ceiling.transform.parent = transform; int ceilingMaterialIndex = Random.Range(0, _ceilingMaterials.Length); MeshRenderer ceilingRendered = ceiling.AddComponent <MeshRenderer>(); ceilingRendered.material = _ceilingMaterials[ceilingMaterialIndex]; ceiling.transform.name = "Ceiling" + ceilingRendered.material.name; MeshCollider ceilingCollider = ceiling.AddComponent <MeshCollider>(); MeshFilter ceilingMeshFilter = ceiling.AddComponent <MeshFilter>(); List <Vector3> ceilingPoints = new List <Vector3>(); LineRange groundRangeX = _ground.GetXRange(); LineRange groundRangeZ = _ground.GetZRange(); ceilingPoints.Add(new Vector3(groundRangeX.max * _wall.GetWallShrink(), _ceilingHeight, groundRangeZ.min * _wall.GetWallShrink())); ceilingPoints.Add(new Vector3(groundRangeX.min * _wall.GetWallShrink(), _ceilingHeight, groundRangeZ.min * _wall.GetWallShrink())); ceilingPoints.Add(new Vector3(groundRangeX.min * _wall.GetWallShrink(), _ceilingHeight, groundRangeZ.max * _wall.GetWallShrink())); ceilingPoints.Add(new Vector3(groundRangeX.max * _wall.GetWallShrink(), _ceilingHeight, groundRangeZ.max * _wall.GetWallShrink())); PlaneRange ceilingRange = new PlaneRange( 0, 1, 0, 0, 0, 1 ); ceilingMeshFilter.mesh = MeshTools.CreateMeshFromVectors(ceilingPoints, ceilingRange); ceilingCollider.sharedMesh = ceilingMeshFilter.mesh; }
/* * Creates a Mesh plane from the points * The plane range allows the texture mapping to be aplied. */ public static Mesh CreateMeshFromVectors(List <Vector3> points, PlaneRange planeRange) { List <int> tris = new List <int>(); // Every 3 ints represents a triangle in the ploygon List <Vector2> uvs = new List <Vector2>(); // Vertex position in 0-1 UV space (The material) int half = points.Count / 2; float realHalf = points.Count / 2f; for (int i = 1; i < half; i++) { tris.Add(i); tris.Add(points.Count - i); tris.Add(i + 1); tris.Add(i); int value = i == 1 ? 0 : (points.Count - i) + 1; tris.Add(value); tris.Add(points.Count - i); } if (Mathf.Floor(realHalf) != Mathf.Ceil(realHalf)) { Debug.Log("Odd number of points " + points.Count + "(" + realHalf + ")"); tris.Add(half); tris.Add(half + 1); tris.Add(half - 1); } for (int i = 0; i < points.Count; i++) { float[] uvRange = new float[2]; int index = 0; if (planeRange.XRange() > 0) { uvRange[index++] = (points[i].x - planeRange.minX) / planeRange.XRange(); } if (index < 1 || (planeRange.ZRange() > 0)) { uvRange[index++] = (points[i].z - planeRange.minX) / planeRange.ZRange(); } if (index < 2) { uvRange[index++] = (points[i].y - planeRange.minY) / planeRange.YRange(); } uvs.Add(new Vector2(uvRange[0], uvRange[1])); } Mesh mesh = new Mesh(); mesh.vertices = points.ToArray(); mesh.uv = uvs.ToArray(); mesh.triangles = tris.ToArray(); mesh.RecalculateNormals(); return(mesh); }
/* * Create the walls * Walls are slightly smaller than a bounding box of the chaparone area * We will in the area outside the chaparone area, but inside walls * with debris, furniture, ect */ public void AddWalls() { GameObject[] walls = new GameObject[4]; List <Vector3>[] wallPoints = new List <Vector3> [4]; PlaneRange[] wallRanges = new PlaneRange[4]; LineRange groundRangeX = _ground.GetXRange(); LineRange groundRangeZ = _ground.GetZRange(); _wallEmpty[0] = new List <LineRange>(); _wallEmpty[0].Add(new LineRange(_adjustment + groundRangeX.min * _shrinkWall, _adjustment + groundRangeX.max * _shrinkWall)); wallPoints[0] = new List <Vector3>(); wallPoints[0].Add(new Vector3(groundRangeX.min * _shrinkWall, 0, groundRangeZ.min * _shrinkWall)); wallPoints[0].Add(new Vector3(groundRangeX.min * _shrinkWall, _ceiling.GetHeight(), groundRangeZ.min * _shrinkWall)); wallPoints[0].Add(new Vector3(groundRangeX.max * _shrinkWall, _ceiling.GetHeight(), groundRangeZ.min * _shrinkWall)); wallPoints[0].Add(new Vector3(groundRangeX.max * _shrinkWall, 0, groundRangeZ.min * _shrinkWall)); wallRanges[0] = new PlaneRange( 0, 1, 0, 1, 0, 0 ); _wallEmpty[1] = new List <LineRange>(); _wallEmpty[1].Add(new LineRange(_adjustment + groundRangeZ.min * _shrinkWall, _adjustment + groundRangeZ.max * _shrinkWall)); _wallEmpty[1] = new List <LineRange>(); _wallEmpty[1].Add(new LineRange(_adjustment + groundRangeZ.min * _shrinkWall, _adjustment + groundRangeZ.max * _shrinkWall)); wallPoints[1] = new List <Vector3>(); wallPoints[1].Add(new Vector3(groundRangeX.max * _shrinkWall, 0, groundRangeZ.min * _shrinkWall)); wallPoints[1].Add(new Vector3(groundRangeX.max * _shrinkWall, _ceiling.GetHeight(), groundRangeZ.min * _shrinkWall)); wallPoints[1].Add(new Vector3(groundRangeX.max * _shrinkWall, _ceiling.GetHeight(), groundRangeZ.max * _shrinkWall)); wallPoints[1].Add(new Vector3(groundRangeX.max * _shrinkWall, 0, groundRangeZ.max * _shrinkWall)); wallRanges[1] = new PlaneRange( 0, 0, 0, 1, 0, 1 ); _wallEmpty[2] = new List <LineRange>(); _wallEmpty[2].Add(new LineRange(_adjustment + groundRangeX.min * _shrinkWall, _adjustment + groundRangeX.max * _shrinkWall)); wallPoints[2] = new List <Vector3>(); wallPoints[2].Add(new Vector3(groundRangeX.max * _shrinkWall, 0, groundRangeZ.max * _shrinkWall)); wallPoints[2].Add(new Vector3(groundRangeX.max * _shrinkWall, _ceiling.GetHeight(), groundRangeZ.max * _shrinkWall)); wallPoints[2].Add(new Vector3(groundRangeX.min * _shrinkWall, _ceiling.GetHeight(), groundRangeZ.max * _shrinkWall)); wallPoints[2].Add(new Vector3(groundRangeX.min * _shrinkWall, 0, groundRangeZ.max * _shrinkWall)); wallRanges[2] = new PlaneRange( 0, 1, 0, 1, 0, 0 ); _wallEmpty[3] = new List <LineRange>(); _wallEmpty[3].Add(new LineRange(_adjustment + groundRangeZ.min * _shrinkWall, _adjustment + groundRangeZ.max * _shrinkWall)); wallPoints[3] = new List <Vector3>(); wallPoints[3].Add(new Vector3(groundRangeX.min * _shrinkWall, 0, groundRangeZ.max * _shrinkWall)); wallPoints[3].Add(new Vector3(groundRangeX.min * _shrinkWall, _ceiling.GetHeight(), groundRangeZ.max * _shrinkWall)); wallPoints[3].Add(new Vector3(groundRangeX.min * _shrinkWall, _ceiling.GetHeight(), groundRangeZ.min * _shrinkWall)); wallPoints[3].Add(new Vector3(groundRangeX.min * _shrinkWall, 0, groundRangeZ.min * _shrinkWall)); int wallMaterialIndex = Random.Range(0, _wallMaterials.Length); wallRanges[3] = new PlaneRange( 0, 0, 0, 1, 0, 1 ); for (int wallIndex = 0; wallIndex < 4; wallIndex++) { GameObject wall = new GameObject(); wall.transform.parent = transform; MeshRenderer wallRendered = wall.AddComponent <MeshRenderer>(); wallRendered.material = _wallMaterials[wallMaterialIndex]; wall.transform.name = "Wall" + wallIndex + wallRendered.material.name; wall.tag = "Wall"; MeshCollider wallCollider = wall.AddComponent <MeshCollider>(); MeshFilter wallMeshFilter = wall.AddComponent <MeshFilter>(); wallMeshFilter.mesh = MeshTools.CreateMeshFromVectors(wallPoints[wallIndex], wallRanges[wallIndex]); wallCollider.sharedMesh = wallMeshFilter.mesh; _walls.Add(wall); CalculateAccessibleWall(wallIndex); } }