示例#1
0
    IEnumerator AssembleHTBlock()
    {
        if (working && currentLoadingHTerrainBlock.Count > 0)
        {
            Area.AreaDataType areaData    = AreaData.areas.Dequeue();
            QueueItem         HTGroupItem = currentLoadingHTerrainBlock.Dequeue();
            if (HTGroupItem.Block != null)
            {
                HTGroupItem.Block.SetActive(false);
                loadedTerrainLoD1Materials.Add(new Material(terrainDefault));
                int frameSpread = 8; // spreading terrain chunks creation over multiple frames
                for (int i = 1; i <= frameSpread; i++)
                {
                    GenerateQuarterAreaTerrain(frameSpread, i, areaData, HTGroupItem.Block, HTGroupItem.mapName, HTGroupItem.x, HTGroupItem.y);
                    yield return(null);
                }
                HTGroupItem.Block.transform.SetParent(transform);
                HTGroupItem.Block.transform.localScale = new Vector3(-1, 1, -1);
                HTGroupItem.Block.SetActive(true);

                // LoD Material //
                TexFile   texFile    = new TexFile();
                string    mapName    = HTGroupItem.mapName;
                int       x          = HTGroupItem.x;
                int       y          = HTGroupItem.y;
                string    texPath    = @"AIDX\Map\" + mapName + @"\" + mapName + "." + x.ToString("X").ToLower() + y.ToString("X").ToLower() + ".tex";
                Texture2D LoDTexture = texFile.ReadToTexture2D(texPath);
                if (LoDTexture != null)
                {
                    loadedTerrainLoD1Materials[loadedTerrainLoD1Materials.Count - 1].mainTexture = LoDTexture;
                }
            }
        }
        frameBusy = false;
    }
示例#2
0
    public void GenerateQuarterAreaTerrain(int fS, int Q, Area.AreaDataType areaData, GameObject Block, string mapName, int x, int y)
    {
        // Area Terrain Object //
        Block.isStatic = true;
        for (int i = (256 / fS) * (Q - 1); i < (256 / fS) * Q; i++)
        {
            int chunkX = i % 16;
            int chunkY = i / 16;
            Area.SubChunkData subChunkData = areaData.subChunks[chunkX + chunkY * 16];

            if (subChunkData.flags.hasHeightmap)
            {
                // SubChunk Object //
                GameObject subChunkObj = Instantiate(subChunkPrefab);
                subChunkObj.name     = "SubChunk_" + chunkX + "_" + chunkY;
                subChunkObj.isStatic = true;
                subChunkObj.transform.SetParent(Block.transform);
                subChunkObj.transform.position = new Vector3(chunkX * 32 + Block.transform.position.x, Block.transform.position.y, chunkY * 32 + Block.transform.position.z);
                subChunkObj.transform.rotation = Quaternion.identity;

                // Mesh //
                Mesh mesh = new Mesh
                {
                    vertices  = Trim19x19to17x17(subChunkData.vertexData.position),
                    normals   = Trim19x19to17x17(subChunkData.vertexData.normal),
                    triangles = triangles17x17,
                    //uv = UVTemplate,
                    uv = UVTemplateLarge[chunkX + chunkY * 16]
                };
                //mesh.RecalculateTangents();
                //mesh.RecalculateBounds();
                MeshFilter meshFilter = subChunkObj.GetComponent <MeshFilter>();
                meshFilter.mesh = mesh;
                MeshRenderer renderer = subChunkObj.GetComponent <MeshRenderer>();
                renderer.sharedMaterial = loadedTerrainLoD1Materials[loadedTerrainLoD1Materials.Count - 1];

                // BlendMaterial //
                if (subChunkData.flags.hasColorMapDXT)
                {
                    // DXT
                    Texture2D colorMap = new Texture2D(65, 65, TextureFormat.DXT5, false);
                    colorMap.wrapMode = TextureWrapMode.Clamp;
                    colorMap.LoadRawTextureData(subChunkData.colorMap);
                    colorMap.Apply();
                    //renderer.material = new Material(terrainDefault);
                    //renderer.material.mainTexture = colorMap;
                    //renderer.material.SetTexture("_BlendTexAmount1", colorMap);
                }

                if (subChunkData.flags.hasBlendMapDXT)
                {
                    Texture2D blendMaps = new Texture2D(65, 65, TextureFormat.DXT1, false);
                    blendMaps.wrapMode = TextureWrapMode.Clamp;
                    blendMaps.LoadRawTextureData(subChunkData.blendMaps);
                    blendMaps.Apply();
                    //renderer.material = new Material(terrainDefault);
                    //renderer.material.mainTexture = blendMaps;
                }

                if (subChunkData.flags.unk13)
                {
                    Texture2D test = new Texture2D(65, 65, TextureFormat.DXT1, false);
                    test.wrapMode = TextureWrapMode.Clamp;
                    test.LoadRawTextureData(subChunkData.unknownData);
                    test.Apply();
                    //renderer.material = new Material(terrainDefault);
                    //renderer.material.mainTexture = test;
                }

                /*
                 * // PROPS //
                 * if (subChunkData.propEntries != null)
                 * {
                 *  foreach (UInt32 entry in subChunkData.propEntries)
                 *  {
                 *      Area.PropInfo propInfo = areaData.propInfoList[entry];
                 *
                 *      GameObject cube = GameObject.CreatePrimitive(PrimitiveType.Cube);
                 *      cube.transform.SetParent(subChunkObj.transform);
                 *      cube.transform.position = propInfo.Position;
                 *      cube.transform.localRotation = propInfo.Rotation;
                 *      cube.transform.localScale = new Vector3(propInfo.Scale, propInfo.Scale, propInfo.Scale);
                 *  }
                 * }
                 */
            }
        }
    }