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; }