Exemplo n.º 1
0
 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;
     }
 }
Exemplo n.º 2
0
    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);
         * }
         */
    }
Exemplo n.º 3
0
    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");
    }
Exemplo n.º 4
0
    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);
    }