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; }
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); * } * } */ } } }