void doneRendering(ChunkMeshObject cmo) { ApplyMeshObject(cmo); go.GetComponent <MeshRenderer> ().material = world.chunkMaterial; if (go.transform.Find("ChunkWater") != null) { go.transform.Find("ChunkWater").GetComponent <MeshRenderer> ().material = world.waterMaterial; } }
void ApplyMeshObject(ChunkMeshObject _cmo) { cmo = _cmo; MonoBehaviour.Destroy(go); go = new GameObject("Chunk"); go.transform.position = new Vector3(posX * Chunk.width, 0f, posZ * Chunk.width); Mesh m = new Mesh(); m.vertices = cmo.verts.ToArray(); m.triangles = cmo.tris.ToArray(); m.uv = cmo.uvs.ToArray(); m.RecalculateBounds(); m.RecalculateNormals(); go.AddComponent <MeshFilter>().mesh = m; go.AddComponent <MeshRenderer>(); if (cmo.hasWater) { Mesh n = new Mesh(); n.vertices = cmo.waterVerts.ToArray(); n.triangles = cmo.waterTris.ToArray(); n.uv = cmo.waterUvs.ToArray(); n.RecalculateBounds(); n.RecalculateNormals(); GameObject g = new GameObject("ChunkWater"); g.transform.parent = go.transform; g.transform.localPosition = Vector3.zero; g.AddComponent <MeshFilter> ().mesh = n; g.AddComponent <MeshRenderer> (); } AddColliders(); /* * GameObject col = new GameObject("Collider"); * col.transform.parent = go.transform; * col.transform.localPosition = Vector3.zero; * col.AddComponent<MeshCollider> ().sharedMesh = m; */ /* * GameObject col = new GameObject("Colliders"); * col.transform.parent = go.transform; * * for(int i = 0; i < cmo.colliderPositions.Count; i++) { * col.AddComponent<BoxCollider> ().center = cmo.colliderPositions [i] + (Vector3.one * 0.5f) + new Vector3 (posX * Chunk.width, 0f, posZ * Chunk.width); * } */ }
IEnumerator RenderChunk() { //Debug.Log ("Rendering chunk..."); bool isDone = false; ChunkMeshObject cmo = null; Thread t = new Thread(() => { cmo = ChunkBuilder.BuildChunk(this); isDone = true; }); t.Start(); while (!isDone) { yield return(null); } Mesh m = new Mesh(); m.name = "ChunkMesh-" + x + "-" + y; m.vertices = cmo.verts.ToArray(); m.triangles = cmo.tris.ToArray(); m.uv = cmo.uvs.ToArray(); m.RecalculateBounds(); m.RecalculateNormals(); m.RecalculateTangents(); if (GetComponent <MeshFilter> () == null) { this.gameObject.AddComponent <MeshFilter> ().mesh = m; this.gameObject.AddComponent <MeshRenderer> ().material = World.instance.material; } else { GetComponent <MeshFilter> ().mesh = m; } //Debug.Log ("Chunk " + x + "," + y + " renderered"); }
IEnumerator buildMesh(Chunk c, Chunk.renderChunkDelegate callback) { /* #region CoroutineObject No Stacking * List<CoroutineObject> others = new List<CoroutineObject> (0); * foreach (GameObject g in GameObject.FindGameObjectsWithTag("CoroutineObject")) { * if (g != this.gameObject) { * others.Add(g.GetComponent<CoroutineObject>()); * } * } * bool needsToWait = true; * while(needsToWait) { * int numRunning = 0; * foreach(CoroutineObject co in others) { * if(co.isRunning) { * numRunning++; * } * } * * if(numRunning > maxNumRunning) { * needsToWait = true; * } else { * needsToWait = false; * } * * if(needsToWait) { * yield return null; * } * } #endregion */ isRunning = true; float time = 0.0f; ChunkMeshObject cmo = null; bool done = false; Thread thread = new Thread(() => { cmo = ChunkMeshBuilder.BuildMesh(c); done = true; }); thread.Start(); while (!done && time < timeout) { yield return(new WaitForEndOfFrame()); time += Time.deltaTime; } if (time >= timeout) { BuildMesh(c, callback); thread.Abort(); print("CoroutineObject timed out building mesh. Retrying..."); yield break; } callback.Invoke(cmo); Destroy(this.gameObject); }