public void AddWaterSampleComputations(WaterSample computation) { lock (computations) { computations.Add(computation); } }
void OnDisable() { if (!isEffectCamera) { enabledWaterCameras.Remove(this); } DisableEffects(); if (effectCamera != null) { effectCamera.gameObject.Destroy(); effectCamera = null; } if (depthMixerMaterial != null) { depthMixerMaterial.Destroy(); depthMixerMaterial = null; } if (waterSample != null) { waterSample.Stop(); waterSample = null; } containingWater = null; }
void Start() { initialPosition = transform.position; previousPosition = initialPosition; if (water == null) { water = FindObjectOfType <Water>(); } sample = new WaterSample(water, (WaterSample.DisplacementMode)displacementMode, precision); }
public void RemoveWaterSampleComputations(WaterSample computation) { lock (computations) { int index = computations.IndexOf(computation); if (index == -1) { return; } if (index < computationIndex) { --computationIndex; } computations.RemoveAt(index); } }
private void CreateWaterSamplers() { if (samples == null || samples.Length != sampleCount) { samples = new WaterSample[sampleCount]; } var affectingWater = AffectingWater; for (int i = 0; i < sampleCount; ++i) { samples[i] = new WaterSample(affectingWater, WaterSample.DisplacementMode.HeightAndForces, precision); samples[i].Start(cachedSamplePositions[cachedSampleIndex]); if (++cachedSampleIndex >= cachedSampleCount) { cachedSampleIndex = 0; } } }
private void RunSamplingTask() { try { while (run) { WaterSample computation = null; lock (computations) { if (computations.Count != 0) { if (computationIndex >= computations.Count) { computationIndex = 0; } computation = computations[computationIndex++]; } } if (computation == null) { Thread.Sleep(2); continue; } lock (computation) { computation.ComputationStep(); } } } catch (System.Exception e) { threadException = e; } }
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); } }