Пример #1
0
 public void AddWaterSampleComputations(WaterSample computation)
 {
     lock (computations)
     {
         computations.Add(computation);
     }
 }
Пример #2
0
        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;
        }
Пример #3
0
        void Start()
        {
            initialPosition  = transform.position;
            previousPosition = initialPosition;

            if (water == null)
            {
                water = FindObjectOfType <Water>();
            }

            sample = new WaterSample(water, (WaterSample.DisplacementMode)displacementMode, precision);
        }
Пример #4
0
        public void RemoveWaterSampleComputations(WaterSample computation)
        {
            lock (computations)
            {
                int index = computations.IndexOf(computation);

                if (index == -1)
                {
                    return;
                }

                if (index < computationIndex)
                {
                    --computationIndex;
                }

                computations.RemoveAt(index);
            }
        }
Пример #5
0
        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;
                }
            }
        }
Пример #6
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;
            }
        }
Пример #7
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);
            }
        }