Exemplo n.º 1
0
 public static void Load_hTextures()
 {
     if (ADT.blockData.MTXP)
     {
         ADT.blockData.terrainHTextures = new Dictionary <string, ADT.Texture2Ddata>();
         foreach (string texturePath in ADT.blockData.terrainTexturePaths)
         {
             string noExtension   = Path.GetFileNameWithoutExtension(texturePath);
             string directoryPath = Path.GetDirectoryName(texturePath);
             string hTexturePath  = directoryPath + @"\" + noExtension + "_h" + ".blp";
             if (Casc.FileExists(hTexturePath))
             {
                 string            extractedPath = Casc.GetFile(hTexturePath);
                 Stream            stream        = File.Open(extractedPath, FileMode.Open);
                 byte[]            data          = BLP.GetUncompressed(stream, true);
                 BLPinfo           info          = BLP.Info();
                 ADT.Texture2Ddata texture2Ddata = new ADT.Texture2Ddata();
                 texture2Ddata.hasMipmaps = info.hasMipmaps;
                 texture2Ddata.width      = info.width;
                 texture2Ddata.height     = info.height;
                 if (info.width != info.height) // Unity doesn't support nonsquare mipmaps // sigh
                 {
                     texture2Ddata.hasMipmaps = false;
                 }
                 texture2Ddata.textureFormat = info.textureFormat;
                 texture2Ddata.TextureData   = data;
                 ADT.blockData.terrainHTextures.Add(texturePath, texture2Ddata);
                 stream.Close();
                 stream = null;
             }
         }
     }
 }
Exemplo 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;
    }