public static Vector2 GetSgtSphericalUV(Vector3 vertex) { return(VectorHelper.CartesianToPolarUV(vertex)); }
private void GenerateTerrain() { GameObject = new GameObject { name = "Patch_LOD_ " + SplitLevel + " : [" + Up + "]", layer = Sphere.gameObject.layer }; Mesh = new Mesh(); Data = new PatchData(PatchSettings.Vertices); var origin = Volume.Vertices[0]; var spacing = Size / (PatchSettings.VerticesPerSide - 1); for (ushort y = 0; y < PatchSettings.VerticesPerSide; y++) { var offset = origin; for (ushort x = 0; x < PatchSettings.VerticesPerSide; x++) { var vertex = offset; Data.Vertices.Add(vertex.NormalizeToRadius(Sphere.Radius)); Data.Normals.Add(vertex.normalized); Data.Volume.Add(offset); Data.UV1.Add(VectorHelper.CartesianToPolarUV(vertex)); Data.UV2.Add(new Vector2(0, 0)); offset += Right * spacing; } origin -= Front * spacing; } //update projected center MiddleProjected = MiddleProjected.NormalizeToRadius(Sphere.Radius); //save original parent transformations var parentPosition = Sphere.gameObject.transform.position; var parentRotation = Sphere.gameObject.transform.rotation; //reset parent transformations before assigning data (so our vertices will be centered on the parent transform) Sphere.gameObject.transform.position = Vector3.zero; Sphere.gameObject.transform.rotation = Quaternion.identity; //put this node as a child of parent GameObject.transform.parent = Sphere.gameObject.transform; var indices = Sphere.PatchManager.Patches[Edges]; //assign data to this node's mesh Mesh.SetVertices(Data.Vertices); Mesh.SetNormals(Data.Normals); Mesh.SetTriangles(indices, 0); Mesh.SetUVs(0, Data.UV1); Mesh.SetUVs(1, Data.UV2); Mesh.hideFlags = HideFlags.HideAndDontSave; Mesh.SolveTangents(ref indices, ref Data.Vertices, ref Data.Normals, ref Data.UV1); Mesh.RecalculateBounds(); //restore parent transformations Sphere.gameObject.transform.position = parentPosition; Sphere.gameObject.transform.rotation = parentRotation; NeedsTerrain = false; //discard parent's resources if (Parent != null) { Parent.DestroyNode(); } var patch = GameObject.AddComponent <Patch>(); var meshFilter = GameObject.AddComponent <MeshFilter>(); GameObject.AddComponent <MeshRenderer>(); GameObject.GetComponent <MeshRenderer>().sharedMaterial = MaterialHelper.CreateTemp(Sphere.Shader, "Patch"); meshFilter.mesh = Mesh; patch.PatchTree = this; }