Example #1
0
        private void RetrieveRenderTexturesSet()
        {
            var format = twoChannels ?
                         (highPrecision ? RenderTextureFormat.ARGBFloat : RenderTextureFormat.ARGBHalf) :
                         (highPrecision ? RenderTextureFormat.RGFloat : RenderTextureFormat.RGHalf);

            renderTexturesSet = RenderTexturesCache.GetCache(resolution << 1, resolution << 1, 0, format, true, usesUAV);
        }
Example #2
0
        private void ValidateResources()
        {
            if (windWaves.CopyFrom == null)
            {
                ValidateFFT(ref heightFFT, (renderedMaps & MapType.Displacement) != 0, false);
                ValidateFFT(ref displacementFFT, (renderedMaps & MapType.Displacement) != 0, true);
                ValidateFFT(ref slopeFFT, (renderedMaps & MapType.Slope) != 0, true);
            }

            if (displacementMaps == null || slopeMaps == null || displacedHeightMap == null)
            {
                bool flatten = (!water.Volume.Boundless && flattenMode == FlattenMode.Auto) || flattenMode == FlattenMode.ForcedOn;

                if (this.flatten != flatten)
                {
                    this.flatten = flatten;

                    if (displacedHeightMap != null)
                    {
                        displacedHeightMap.Destroy();
                        displacedHeightMap = null;
                    }
                }

                RenderTexture[] usedDisplacementMaps, usedSlopeMaps;
                RenderTexture   usedDisplacedHeightMap;

                if (windWaves.CopyFrom == null)
                {
                    int resolution = windWaves.FinalResolution;
                    int displacedHeightMapResolution = flatten ? resolution : (resolution >> 2);
                    int packResolution = resolution << 1;
                    singleTargetCache        = RenderTexturesCache.GetCache(packResolution, packResolution, 0, RenderTextureFormat.RHalf, true, heightFFT is Dx11FFT);
                    doubleTargetCache        = RenderTexturesCache.GetCache(packResolution, packResolution, 0, RenderTextureFormat.RGHalf, true, displacementFFT is Dx11FFT);
                    displacedHeightMapsCache = RenderTexturesCache.GetCache(displacedHeightMapResolution, displacedHeightMapResolution, 0, RenderTextureFormat.ARGBHalf, true, false, false);

                    if (displacementMaps == null && (renderedMaps & MapType.Displacement) != 0)
                    {
                        CreateRenderTextures(ref displacementMaps, RenderTextureFormat.ARGBHalf, 4, true);
                    }

                    if (slopeMaps == null && (renderedMaps & MapType.Slope) != 0)
                    {
                        CreateRenderTextures(ref slopeMaps, RenderTextureFormat.ARGBHalf, 2, true);
                    }

                    if (displacedHeightMap == null)
                    {
                        displacedHeightMap           = new RenderTexture(displacedHeightMapResolution, displacedHeightMapResolution, 0, RenderTextureFormat.ARGBHalf, RenderTextureReadWrite.Linear);
                        displacedHeightMap.hideFlags = HideFlags.DontSave;
                        displacedHeightMap.wrapMode  = TextureWrapMode.Repeat;

                        if (FloatingPointMipMapsSupport)
                        {
                            displacedHeightMap.filterMode       = FilterMode.Trilinear;
                            displacedHeightMap.useMipMap        = true;
                            displacedHeightMap.autoGenerateMips = true;
                        }
                        else
                        {
                            displacedHeightMap.filterMode = FilterMode.Bilinear;
                        }
                    }

                    usedDisplacementMaps   = displacementMaps;
                    usedSlopeMaps          = slopeMaps;
                    usedDisplacedHeightMap = displacedHeightMap;
                }
                else
                {
                    var copyFrom = windWaves.CopyFrom;

                    if (copyFrom.WaterWavesFFT.windWaves == null)
                    {
                        copyFrom.ResolveFinalSettings(WaterQualitySettings.Instance.CurrentQualityLevel);
                    }

                    copyFrom.WaterWavesFFT.ValidateResources();

                    usedDisplacementMaps   = copyFrom.WaterWavesFFT.displacementMaps;
                    usedSlopeMaps          = copyFrom.WaterWavesFFT.slopeMaps;
                    usedDisplacedHeightMap = copyFrom.WaterWavesFFT.displacedHeightMap;
                }

                for (int scaleIndex = 0; scaleIndex < 4; ++scaleIndex)
                {
                    string suffix = scaleIndex != 0 ? scaleIndex.ToString() : "";

                    if (usedDisplacementMaps != null)
                    {
                        water.WaterMaterial.SetTexture("_GlobalDisplacementMap" + suffix, usedDisplacementMaps[scaleIndex]);
                        water.WaterBackMaterial.SetTexture("_GlobalDisplacementMap" + suffix, usedDisplacementMaps[scaleIndex]);
                    }

                    if (scaleIndex < 2 && usedSlopeMaps != null)
                    {
                        water.WaterMaterial.SetTexture("_GlobalNormalMap" + suffix, usedSlopeMaps[scaleIndex]);
                        water.WaterBackMaterial.SetTexture("_GlobalNormalMap" + suffix, usedSlopeMaps[scaleIndex]);
                    }
                }

                water.WaterMaterial.SetTexture("_DisplacedHeightMaps", usedDisplacedHeightMap);
                water.WaterBackMaterial.SetTexture("_DisplacedHeightMaps", usedDisplacedHeightMap);
                water.WaterVolumeMaterial.SetTexture("_DisplacedHeightMaps", usedDisplacedHeightMap);

                if (ResourcesChanged != null)
                {
                    ResourcesChanged();
                }
            }
        }