private void AddFace(WaterFace face) { // TODO if ((face.Flags & WaterFlags.Visible) != WaterFlags.Visible) { return; } var obj = Instantiate(WaterPrefab); obj.transform.SetParent(transform); var mid = obj.transform.position = face.Vertices.Aggregate(Vector3.zero, (s, x) => s + x.Position) / face.Vertices.Length; obj.name = string.Format("WaterFace ({0})", mid); var mesh = new Mesh(); mesh.vertices = face.Vertices.Select(x => x.Position - mid).ToArray(); mesh.normals = face.Vertices.Select(x => Vector3.up).ToArray(); var indices = new int[(face.Vertices.Length - 2) * 3]; for (var i = 0; i < face.Vertices.Length - 2; ++i) { var flip = i & 1; indices[i * 3 + 0] = i + 1 - flip; indices[i * 3 + 1] = i + 0 + flip; indices[i * 3 + 2] = i + 2; } mesh.SetIndices(indices, MeshTopology.Triangles, 0); obj.GetComponent <MeshFilter>().sharedMesh = mesh; }
private WaterFace[] CreateWaterFaces() { // Create a local variable for the new faces. var faces = new WaterFace[6]; // Set the center of this planet in the shader. var center = transform.position; // Create a face for each direction. for (var i = 0; i < directions.Length; i++) { if (waterMeshFilters[i] == null) { var waterObj = new GameObject("water mesh " + directions[i]); waterObj.transform.parent = transform; waterObj.AddComponent <MeshRenderer>().sharedMaterial = this.WaterMaterial; waterMeshFilters[i] = waterObj.AddComponent <MeshFilter>(); waterMeshFilters[i].sharedMesh = new Mesh(); } faces[i] = new WaterFace(waterMeshFilters[i].sharedMesh, directions[i], settings); } return(faces); }