public void ApplyTerrain() { //build arrays for shader int n = data.Length; Color[] colours = new Color[n]; float[] colourStrengths = new float[n]; float[] startHeights = new float[n]; float[] blendStrengths = new float[n]; float[] textureScales = new float[n]; for (int i = 0; i < n; i++) { colours[i] = data[i].tint; colourStrengths[i] = data[i].drawAsColour ? 1 : data[i].tintStrength; startHeights[i] = data[i].startHeight; blendStrengths[i] = !data[i].blendEnabled ? 0 : data[i].blendStrength; textureScales[i] = data[i].textureScale; } TerrainMat.SetInt("_DataCount", n); TerrainMat.SetColorArray("_DataColours", colours); TerrainMat.SetFloatArray("_DataColourStrengths", colourStrengths); TerrainMat.SetFloatArray("_DataStartHeights", startHeights); TerrainMat.SetFloatArray("_DataBlendStrengths", blendStrengths); TerrainMat.SetFloatArray("_DataTextureScales", textureScales); TerrainMat.SetFloat("_MaxHeight", TerrainGenerator.Instance.heightMultiplier); ApplyDesaturation(); ApplyWater(); }
/// Applying texture changes is slow - so keep it separate and only do it by request. public void ApplyTextures() { Texture2DArray array = new Texture2DArray(TEXTURE_SIZE, TEXTURE_SIZE, data.Length, TEXTURE_FORMAT, true); for (int i = 0; i < data.Length; i++) { array.SetPixels(data[i].texture.GetPixels(), i); } array.Apply(); TerrainMat.SetTexture("_DataTextures", array); }
private void ApplyDesaturation() { var maxDist = Mathf.Max(TerrainGenerator.Instance.mapSize.x, TerrainGenerator.Instance.mapSize.y) * desaturationDistance; TerrainMat.SetFloat("_MaxDistance", maxDist); TerrainMat.SetFloat("_MaxDesaturation", desaturationStrength); var propHandler = FindObjectOfType <PropPopulator>(); if (propHandler == null) { return; } foreach (var prop in propHandler.props) { foreach (var mat in prop.prefab.GetComponent <MeshRenderer>().sharedMaterials) { mat.SetFloat("_MaxDistance", maxDist); mat.SetFloat("_MaxDesaturation", desaturationStrength); } } }