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