Пример #1
0
        public void OnWaterCameraPreCull()
        {
            if (!this._EffectEnabled)
            {
                base.enabled = false;
                return;
            }
            if (this._HasWaterOverride)
            {
                base.enabled = true;
                this._RenderUnderwaterMask = true;
                return;
            }
            SubmersionState submersionState = this._LocalWaterCamera.SubmersionState;

            if (submersionState != SubmersionState.None)
            {
                if (submersionState != SubmersionState.Partial)
                {
                    if (submersionState == SubmersionState.Full)
                    {
                        base.enabled = true;
                        this._RenderUnderwaterMask = false;
                    }
                }
                else
                {
                    base.enabled = true;
                    this._RenderUnderwaterMask = true;
                }
            }
            else
            {
                base.enabled = false;
            }
            float num              = this._LocalCamera.nearClipPlane * Mathf.Tan(this._LocalCamera.fieldOfView * 0.5f * 0.0174532924f);
            float num2             = base.transform.position.y - this._LocalWaterCamera.WaterLevel;
            float effectsIntensity = (-num2 + num) * 0.25f;

            this.SetEffectsIntensity(effectsIntensity);
        }
Пример #2
0
        private void PrepareToRender()
        {
            // reset shadowed water rect
            shadowedWaterRect = new Rect(1.0f, 1.0f, -1.0f, -1.0f);

#if UNITY_EDITOR
            if (IsSceneViewCamera(thisCamera))
            {
                return;                                         // don't do any of the following stuff for editor cameras
            }
#endif

            // find containing water
            float waterEnterTolerance = thisCamera.nearClipPlane * Mathf.Tan(thisCamera.fieldOfView * 0.5f * Mathf.Deg2Rad) * 3.0f;
            var   newWater            = Water.FindWater(transform.position, waterEnterTolerance, out isInsideSubtractiveVolume, out isInsideAdditiveVolume);

            if (newWater != containingWater)
            {
                if (containingWater != null && submersionState != SubmersionState.None)
                {
                    submersionState = SubmersionState.None;
                    SubmersionStateChanged.Invoke(this);
                }

                containingWater = newWater;
                submersionState = SubmersionState.None;

                if (waterSample != null)
                {
                    waterSample.Stop();
                    waterSample = null;
                }

                if (newWater != null && newWater.Volume.Boundless)
                {
                    waterSample = new WaterSample(containingWater, WaterSample.DisplacementMode.Height, 0.4f);
                    waterSample.Start(transform.position);
                }
            }

            // determine submersion state
            SubmersionState newSubmersionState;

            if (waterSample != null)
            {
                waterLevel = waterSample.GetAndReset(transform.position, WaterSample.ComputationsMode.Normal).y;

                if (transform.position.y - waterEnterTolerance < waterLevel)
                {
                    if (transform.position.y + waterEnterTolerance < waterLevel)
                    {
                        newSubmersionState = SubmersionState.Full;
                    }
                    else
                    {
                        newSubmersionState = SubmersionState.Partial;
                    }
                }
                else
                {
                    newSubmersionState = SubmersionState.None;
                }
            }
            else
            {
                newSubmersionState = containingWater != null ? SubmersionState.Partial : SubmersionState.None;                                  // for non-boundless water always use Partial state as determining this would be too costly
            }

            if (newSubmersionState != submersionState)
            {
                submersionState = newSubmersionState;
                SubmersionStateChanged.Invoke(this);
            }
        }