Ejemplo n.º 1
0
    IEnumerator CreateADTObject()
    {
        float startTime = Time.time;

        // Get ADT Block Data //
        ADT.BlockDataType data    = ADT.AllBlockData.Dequeue();
        QueueItem         Gobject = currentLoadingBlocks.Dequeue();

        //////////////////////////////////////////////
        ///////////          WMO          ////////////
        //////////////////////////////////////////////
        if (ADTSettings.LoadWMOs)
        {
            GameObject WMO0 = new GameObject();
            WMO0.transform.parent = Gobject.Block.transform;

            // Create WMO Objects - Send work to the WMO thread //
            foreach (ADT.WMOPlacementInfo wmoInfo in data.WMOInfo)
            {
                if (!LoadedUniqueWMOs.Contains(wmoInfo.uniqueID))
                {
                    LoadedUniqueWMOs.Add(wmoInfo.uniqueID);
                    ADTBlockWMOParents.Add(wmoInfo.uniqueID, WMO0);
                    string  wmoPath     = data.WMOPaths[data.WMOOffsets[wmoInfo.nameID]];
                    Vector3 addPosition = new Vector3(wmoInfo.position.x + Gobject.Block.transform.position.x,
                                                      wmoInfo.position.y + Gobject.Block.transform.position.y,
                                                      wmoInfo.position.z + Gobject.Block.transform.position.z);
                    WMOHandler.AddToQueue(wmoPath, wmoInfo.uniqueID, addPosition, wmoInfo.rotation, Vector3.one);
                }
            }
        }
        //////////////////////////////////////////////
        ///////////       Terrain        /////////////
        //////////////////////////////////////////////

        Gobject.Block.name = Gobject.mapName + "_" + Gobject.x + "_" + Gobject.y;
        Gobject.Block.AddComponent <LODGroup>();
        LOD[]      lods      = new LOD[2];
        Renderer[] renderers = new Renderer[256];

        //////////////////////////////////////////////
        ///////////    Terrain LoD 0     /////////////
        //////////////////////////////////////////////

        // Create LoD0 Parent GameObject //
        GameObject LoD0 = new GameObject();

        LoD0.name = "LoD0";
        LoD0.transform.SetParent(Gobject.Block.transform);

        for (int i = 1; i <= 4; i++)
        {
            CreateChunkQuarter(i, data, LoD0, out renderers, renderers);
            yield return(null);
        }

        lods[0] = new LOD(1, renderers);
        lods[1] = new LOD(0.5f, renderers);
        Gobject.Block.GetComponent <LODGroup>().SetLODs(lods);
        Gobject.Block.GetComponent <LODGroup>().RecalculateBounds();

        finishedTime = Time.time - startTime;
    }
Ejemplo n.º 2
0
    public void CreateChunkQuarter(int Q, ADT.BlockDataType data, GameObject LoD0, out Renderer[] renderersOut, Renderer[] renderers)
    {
        // Create Terrain Chunks //
        for (int i = 64 * (Q - 1); i < 64 * Q; i++)
        {
            // Create GameObject //
            GameObject ChunkObj = Instantiate(ChunkPrefab, Vector3.zero, Quaternion.identity);
            ChunkObj.isStatic           = true;
            ChunkObj.name               = "Chunk_" + i.ToString();
            ChunkObj.transform.position = data.ChunksData[i].MeshPosition;
            ChunkObj.transform.SetParent(LoD0.transform);

            // Create Mesh //
            Mesh mesh = new Mesh();
            mesh.vertices  = data.ChunksData[i].VertexArray;
            mesh.triangles = data.ChunksData[i].TriangleArray;
            mesh.uv        = data.ChunksData[i].UVArray;
            mesh.normals   = data.ChunksData[i].VertexNormals;
            mesh.colors32  = data.ChunksData[i].VertexColors;
            ChunkObj.GetComponent <MeshFilter>().mesh = mesh;

            // LoD stuff //
            renderers[i] = ChunkObj.GetComponent <Renderer>();

            // Assign textures //
            float heightScale0  = 0f;
            float heightScale1  = 0f;
            float heightScale2  = 0f;
            float heightScale3  = 0f;
            float heightOffset0 = 0f;
            float heightOffset1 = 0f;
            float heightOffset2 = 0f;
            float heightOffset3 = 0f;

            for (int tl = 0; tl < data.ChunksData[i].NumberOfTextureLayers; tl++)
            {
                if (tl == 0)
                {
                    // Layer 0 Texture //
                    string textureName = data.terrainTexturePaths[data.ChunksData[i].textureIds[tl]];
                    if (!LoadedTerrainTextures.ContainsKey(textureName))
                    {
                        ADT.Texture2Ddata tdata = data.terrainTextures[textureName];
                        Texture2D         tex   = new Texture2D(tdata.width, tdata.height, tdata.textureFormat, tdata.hasMipmaps);
                        tex.LoadRawTextureData(tdata.TextureData);
                        tex.Apply();
                        LoadedTerrainTextures[textureName] = tex;
                    }
                    ChunkObj.GetComponent <Renderer>().material.SetTexture("_layer0", LoadedTerrainTextures[textureName]);
                    ChunkObj.GetComponent <Renderer>().material.SetTextureScale("_layer0", new Vector2(-1, -1));
                    // Layer 0 Height Texture //
                    if (data.terrainHTextures.ContainsKey(textureName))
                    {
                        if (!LoadedHTerrainTextures.ContainsKey(textureName))
                        {
                            ADT.Texture2Ddata tdata = data.terrainHTextures[textureName];
                            Texture2D         tex   = new Texture2D(tdata.width, tdata.height, tdata.textureFormat, tdata.hasMipmaps);
                            tex.LoadRawTextureData(tdata.TextureData);
                            tex.Apply();
                            LoadedHTerrainTextures[textureName] = tex;
                        }
                        ChunkObj.GetComponent <Renderer>().material.SetTexture("_height0", LoadedHTerrainTextures[textureName]);
                        ChunkObj.GetComponent <Renderer>().material.SetTextureScale("_height0", new Vector2(-1, -1));
                    }
                    data.heightScales.TryGetValue(textureName, out heightScale0);
                    data.heightOffsets.TryGetValue(textureName, out heightOffset0);
                }
                else if (tl == 1)
                {
                    // Layer 1 Texture //
                    string textureName = data.terrainTexturePaths[data.ChunksData[i].textureIds[tl]];
                    if (!LoadedTerrainTextures.ContainsKey(textureName))
                    {
                        ADT.Texture2Ddata tdata = data.terrainTextures[textureName];
                        Texture2D         tex   = new Texture2D(tdata.width, tdata.height, tdata.textureFormat, tdata.hasMipmaps);
                        tex.LoadRawTextureData(tdata.TextureData);
                        tex.Apply();
                        LoadedTerrainTextures[textureName] = tex;
                    }
                    ChunkObj.GetComponent <Renderer>().material.SetTexture("_layer1", LoadedTerrainTextures[textureName]);
                    ChunkObj.GetComponent <Renderer>().material.SetTextureScale("_layer1", new Vector2(4, 4));
                    // Layer 1 Height Texture //
                    if (data.terrainHTextures.ContainsKey(textureName))
                    {
                        if (!LoadedHTerrainTextures.ContainsKey(textureName))
                        {
                            ADT.Texture2Ddata tdata = data.terrainHTextures[textureName];
                            Texture2D         tex   = new Texture2D(tdata.width, tdata.height, tdata.textureFormat, tdata.hasMipmaps);
                            tex.LoadRawTextureData(tdata.TextureData);
                            tex.Apply();
                            LoadedHTerrainTextures[textureName] = tex;
                        }
                        ChunkObj.GetComponent <Renderer>().material.SetTexture("_height1", LoadedHTerrainTextures[textureName]);
                        ChunkObj.GetComponent <Renderer>().material.SetTextureScale("_height1", new Vector2(-1, -1));
                    }
                    data.heightScales.TryGetValue(textureName, out heightScale1);
                    data.heightOffsets.TryGetValue(textureName, out heightOffset1);
                    // Layer 1 Alpha //
                    if (data.ChunksData[i].alphaLayers.Count > 0)
                    {
                        if (data.ChunksData[i].alphaLayers[0] != null)
                        {
                            Texture2D textureAlpha = new Texture2D(64, 64, TextureFormat.Alpha8, false);
                            textureAlpha.LoadRawTextureData(data.ChunksData[i].alphaLayers[0]);
                            textureAlpha.wrapMode = TextureWrapMode.Clamp;
                            textureAlpha.Apply();
                            ChunkObj.GetComponent <Renderer>().material.SetTexture("_blend1", textureAlpha);
                        }
                    }
                }
                else if (tl == 2)
                {
                    // Layer 2 Texture //
                    string textureName = data.terrainTexturePaths[data.ChunksData[i].textureIds[tl]];
                    if (!LoadedTerrainTextures.ContainsKey(textureName))
                    {
                        ADT.Texture2Ddata tdata = data.terrainTextures[textureName];
                        Texture2D         tex   = new Texture2D(tdata.width, tdata.height, tdata.textureFormat, tdata.hasMipmaps);
                        tex.LoadRawTextureData(tdata.TextureData);
                        tex.Apply();
                        LoadedTerrainTextures[textureName] = tex;
                    }
                    ChunkObj.GetComponent <Renderer>().material.SetTexture("_layer2", LoadedTerrainTextures[textureName]);
                    ChunkObj.GetComponent <Renderer>().material.SetTextureScale("_layer2", new Vector2(4, 4));
                    // Layer 2 Height Texture //
                    if (data.terrainHTextures.ContainsKey(textureName))
                    {
                        if (!LoadedHTerrainTextures.ContainsKey(textureName))
                        {
                            ADT.Texture2Ddata tdata = data.terrainHTextures[textureName];
                            Texture2D         tex   = new Texture2D(tdata.width, tdata.height, tdata.textureFormat, tdata.hasMipmaps);
                            tex.LoadRawTextureData(tdata.TextureData);
                            tex.Apply();
                            LoadedHTerrainTextures[textureName] = tex;
                        }
                        ChunkObj.GetComponent <Renderer>().material.SetTexture("_height2", LoadedHTerrainTextures[textureName]);
                        ChunkObj.GetComponent <Renderer>().material.SetTextureScale("_height2", new Vector2(-1, -1));
                    }
                    data.heightScales.TryGetValue(textureName, out heightScale2);
                    data.heightOffsets.TryGetValue(textureName, out heightOffset2);
                    // Layer 2 Alpha //
                    if (data.ChunksData[i].alphaLayers.Count > 0)
                    {
                        if (data.ChunksData[i].alphaLayers[1] != null)
                        {
                            Texture2D textureAlpha = new Texture2D(64, 64, TextureFormat.Alpha8, false);
                            textureAlpha.LoadRawTextureData(data.ChunksData[i].alphaLayers[1]);
                            textureAlpha.Apply();
                            textureAlpha.wrapMode = TextureWrapMode.Clamp;
                            ChunkObj.GetComponent <Renderer>().material.SetTexture("_blend2", textureAlpha);
                        }
                    }
                }
                else if (tl == 3)
                {
                    // Layer 3 Texture //
                    string textureName = data.terrainTexturePaths[data.ChunksData[i].textureIds[tl]];
                    if (!LoadedTerrainTextures.ContainsKey(textureName))
                    {
                        ADT.Texture2Ddata tdata = data.terrainTextures[textureName];
                        Texture2D         tex   = new Texture2D(tdata.width, tdata.height, tdata.textureFormat, tdata.hasMipmaps);
                        tex.LoadRawTextureData(tdata.TextureData);
                        tex.Apply();
                        LoadedTerrainTextures[textureName] = tex;
                    }
                    ChunkObj.GetComponent <Renderer>().material.SetTexture("_layer3", LoadedTerrainTextures[textureName]);
                    ChunkObj.GetComponent <Renderer>().material.SetTextureScale("_layer3", new Vector2(4, 4));
                    // Layer 3 Height Texture //
                    if (data.terrainHTextures.ContainsKey(textureName))
                    {
                        if (!LoadedHTerrainTextures.ContainsKey(textureName))
                        {
                            ADT.Texture2Ddata tdata = data.terrainHTextures[textureName];
                            Texture2D         tex   = new Texture2D(tdata.width, tdata.height, tdata.textureFormat, tdata.hasMipmaps);
                            tex.LoadRawTextureData(tdata.TextureData);
                            tex.Apply();
                            LoadedHTerrainTextures[textureName] = tex;
                        }
                        ChunkObj.GetComponent <Renderer>().material.SetTexture("_height3", LoadedHTerrainTextures[textureName]);
                        ChunkObj.GetComponent <Renderer>().material.SetTextureScale("_height3", new Vector2(-1, -1));
                    }
                    data.heightScales.TryGetValue(textureName, out heightScale3);
                    data.heightOffsets.TryGetValue(textureName, out heightOffset3);
                    // Layer 3 Alpha //
                    if (data.ChunksData[i].alphaLayers.Count > 0)
                    {
                        if (data.ChunksData[i].alphaLayers[2] != null)
                        {
                            Texture2D textureAlpha = new Texture2D(64, 64, TextureFormat.Alpha8, false);
                            textureAlpha.LoadRawTextureData(data.ChunksData[i].alphaLayers[2]);
                            textureAlpha.Apply();
                            textureAlpha.wrapMode = TextureWrapMode.Clamp;
                            ChunkObj.GetComponent <Renderer>().material.SetTexture("_blend3", textureAlpha);
                        }
                    }
                }
            }
            if (data.MTXP)
            {
                ChunkObj.GetComponent <Renderer>().material.SetVector("heightScale", new Vector4(heightScale0, heightScale1, heightScale2, heightScale3));
                ChunkObj.GetComponent <Renderer>().material.SetVector("heightOffset", new Vector4(heightOffset0, heightOffset1, heightOffset2, heightOffset3));
            }

            // Shadow Map //
            if (ADTSettings.LoadShadowMaps)
            {
                if (data.ChunksData[i].shadowMapTexture.Length > 0)
                {
                    Texture2D textureAlpha = new Texture2D(64, 64, TextureFormat.Alpha8, false);
                    textureAlpha.LoadRawTextureData(data.ChunksData[i].shadowMapTexture);
                    Color32[] pixels = textureAlpha.GetPixels32();
                    pixels = ADT.RotateMatrix(pixels, 64);
                    textureAlpha.SetPixels32(pixels);
                    textureAlpha.Apply();
                    textureAlpha.wrapMode = TextureWrapMode.Clamp;
                    ChunkObj.GetComponent <Renderer>().material.SetTexture("_shadowMap", textureAlpha);

                    // need to enable in shader too //
                }
            }
        }

        renderersOut = renderers;
    }