Beispiel #1
0
    // Assemble high resolution textures //
    IEnumerator AssembleHTextures()
    {
        if (working && currentLoadingHTextureBlock.Count > 0)
        {
            float startTimeAssembleHTextures = Time.time;

            ADTTexData.TextureBlockData HTexData = ADTTexData.TextureBlockDataQueue.Dequeue();
            QueueItem HTextureItem = currentLoadingHTextureBlock.Dequeue();
            if (HTextureItem.Block != null)
            {
                HTextureItem.Block.name = HTextureItem.mapName + "_" + HTextureItem.x + "_" + HTextureItem.y;

                // generate mesh objects //
                int frameSpread = 8; // spreading terrain chunks creation over multiple frames
                for (int i = 1; i <= frameSpread; i++)
                {
                    CreateHTextureQuarter(frameSpread, i, HTexData, HTextureItem.Block);
                    yield return(null);
                }
            }
            frameBusy = false;
            finishedTimeAssembleHTextures = Time.time - startTimeAssembleHTextures;
        }
    }
Beispiel #2
0
    // Create a part of the ADT block textures //
    private void CreateHTextureQuarter(int fS, int Q, ADTTexData.TextureBlockData data, GameObject Block)
    {
        if (working)
        {
            if (Block != null)
            {
                StreamTools s = new StreamTools();
                for (int i = (256 / fS) * (Q - 1); i < (256 / fS) * Q; i++)
                {
                    //////////////////////////////
                    #region Textures
                    //////////////////////////////

                    float[]  HeightScales  = new float[4];
                    float[]  heightOffsets = new float[4];
                    string[] DiffuseLayers = new string[4];
                    string[] HeightLayers  = new string[4];
                    Flags.TerrainTextureFlag[] TextureFlags = new Flags.TerrainTextureFlag[4];
                    Texture2D[] AlphaLayers = new Texture2D[4];
                    Texture2D   ShadowMap   = null;

                    for (int layer = 0; layer < data.textureChunksData[i].NumberOfTextureLayers; layer++)
                    {
                        // Diffuse Texture //
                        string textureName = data.terrainTexturePaths[data.textureChunksData[i].textureIds[layer]];
                        if (!LoadedTerrainTextures.ContainsKey(textureName))
                        {
                            ADTTexData.Texture2Ddata tdata = data.terrainTextures[textureName];
                            Texture2D tex = new Texture2D(tdata.width, tdata.height, tdata.textureFormat, tdata.hasMipmaps);
                            tex.LoadRawTextureData(tdata.TextureData);
                            tex.mipMapBias = Settings.highMipMapBias;
                            tex.Apply();
                            LoadedTerrainTextures[textureName] = tex;
                        }
                        DiffuseLayers[layer] = textureName;

                        // Height Texture //
                        if (data.terrainHTextures.ContainsKey(textureName))
                        {
                            if (!LoadedHTerrainTextures.ContainsKey(textureName))
                            {
                                ADTTexData.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;
                            }
                            HeightLayers[layer] = textureName;
                        }
                        // Height Values //
                        data.heightScales.TryGetValue(textureName, out HeightScales[layer]);
                        data.heightOffsets.TryGetValue(textureName, out heightOffsets[layer]);
                        data.textureFlags.TryGetValue(textureName, out TextureFlags[layer]);

                        // Alpha Texture //
                        if (data.textureChunksData[i].alphaLayers.Count > 0 && layer > 0)
                        {
                            if (data.textureChunksData[i].alphaLayers[0] != null)
                            {
                                AlphaLayers[layer] = new Texture2D(64, 64, TextureFormat.Alpha8, false);
                                AlphaLayers[layer].LoadRawTextureData(data.textureChunksData[i].alphaLayers[layer - 1]);
                                AlphaLayers[layer].wrapMode = TextureWrapMode.Clamp;
                                AlphaLayers[layer].Apply();
                            }
                        }
                    }
                    #endregion

                    //////////////////////////////
                    #region Shadow Maps
                    //////////////////////////////

                    if (SettingsTerrainImport.LoadShadowMaps)
                    {
                        if (data.textureChunksData[i].shadowMapTexture.Length > 0)
                        {
                            ShadowMap = new Texture2D(64, 64, TextureFormat.Alpha8, false);
                            ShadowMap.LoadRawTextureData(data.textureChunksData[i].shadowMapTexture);
                            //Color32[] pixels = ShadowMap.GetPixels32();
                            //pixels = s.RotateMatrix(pixels, 64);
                            //ShadowMap.SetPixels32(pixels);
                            ShadowMap.Apply();
                            ShadowMap.wrapMode = TextureWrapMode.Clamp;
                            // need to enable in shader too //
                        }
                    }
                    #endregion

                    //////////////////////////////
                    #region Material
                    //////////////////////////////

                    Material mat = new Material(shaderWoWTerrainHigh);

                    for (int ln = 0; ln < 4; ln++)
                    {
                        if (DiffuseLayers[ln] != null)
                        {
                            mat.SetTexture("_layer" + ln, LoadedTerrainTextures[DiffuseLayers[ln]]);
                        }
                        mat.SetTextureScale("_layer" + ln, new Vector2(1, 1));
                        if (HeightLayers[ln] != null)
                        {
                            mat.SetTexture("_height" + ln, LoadedHTerrainTextures[HeightLayers[ln]]);
                        }
                        mat.SetTextureScale("_height" + ln, new Vector2(1, 1));
                        if (ln > 0 && AlphaLayers[ln] != null)
                        {
                            mat.SetTexture("_blend" + ln, AlphaLayers[ln]);
                        }
                        if (data.MTXP)
                        {
                            mat.SetFloat("layer" + ln + "scale", TextureFlags[ln].texture_scale);
                        }
                    }
                    if (data.MTXP)
                    {
                        mat.SetVector("heightScale", new Vector4(HeightScales[0], HeightScales[1], HeightScales[2], HeightScales[3]));
                        mat.SetVector("heightOffset", new Vector4(heightOffsets[0], heightOffsets[1], heightOffsets[2], heightOffsets[3]));
                    }
                    if (SettingsTerrainImport.LoadShadowMaps)
                    {
                        mat.SetTexture("_shadowMap", ShadowMap);
                    }
                    Block.transform.GetChild(i).GetComponent <ADTChunk>().MaterialReady(0, mat);

                    #endregion
                }
            }
        }
    }