Пример #1
0
        private SubmersionState Evaluate()
        {
            int   num  = 0;
            float num2 = WaterCameraSubmersion.CalculateNearPlaneHeight(this._Camera.CameraComponent);
            float num3 = num2 * this._Radius;

            WaterCameraSubmersion.CreatePlanePoints(this._Camera.CameraComponent, this._Subdivisions, this._Points);
            for (int i = 0; i < this._Samples.Count; i++)
            {
                Vector3 origin   = this._Points[i];
                Vector3 andReset = this._Samples[i].GetAndReset(origin, WaterSample.ComputationsMode.Normal);
                if (origin.y + num3 <= andReset.y)
                {
                    num++;
                }
                if (origin.y + num3 >= andReset.y && origin.y - num3 <= andReset.y)
                {
                    return(SubmersionState.Partial);
                }
            }
            if (num == this._Samples.Count)
            {
                return(SubmersionState.Full);
            }
            if (num == 0)
            {
                return(SubmersionState.None);
            }
            return(SubmersionState.Partial);
        }
Пример #2
0
        private static void CreatePlanePoints(Camera camera, int subdivisions, List <Vector3> result)
        {
            result.Clear();
            float   num             = WaterCameraSubmersion.CalculateNearPlaneHeight(camera);
            float   num2            = num * camera.aspect;
            Vector3 nearPlaneCenter = WaterCameraSubmersion.GetNearPlaneCenter(camera);

            if (subdivisions == 0)
            {
                result.Add(nearPlaneCenter);
                return;
            }
            subdivisions--;
            Vector3 b       = 0.5f * num * camera.transform.up;
            Vector3 b2      = 0.5f * num2 * camera.transform.right;
            Vector3 vector  = nearPlaneCenter - b - b2;
            Vector3 vector2 = nearPlaneCenter + b - b2;
            Vector3 vector3 = nearPlaneCenter + b + b2;
            Vector3 vector4 = nearPlaneCenter - b + b2;

            result.Add(vector);
            result.Add(vector2);
            result.Add(vector3);
            result.Add(vector4);
            for (int i = 0; i < subdivisions; i++)
            {
                float t = ((float)i + 1f) / ((float)subdivisions + 1f);
                result.Add(Vector3.Lerp(vector, vector2, t));
                result.Add(Vector3.Lerp(vector2, vector3, t));
                result.Add(Vector3.Lerp(vector3, vector4, t));
                result.Add(Vector3.Lerp(vector4, vector, t));
            }
        }
Пример #3
0
        public void OnDrawGizmos()
        {
            Camera cameraComponent = this._Camera.CameraComponent;
            float  num             = WaterCameraSubmersion.CalculateNearPlaneHeight(cameraComponent);

            WaterCameraSubmersion.CreatePlanePoints(cameraComponent, this._Subdivisions, this._Points);
            Gizmos.color = new Color(0f, 1f, 1f, 0.2f);
            for (int i = 0; i < this._Points.Count; i++)
            {
                Gizmos.DrawSphere(this._Points[i], num * this._Radius);
            }
        }
Пример #4
0
        public void Create()
        {
            if (this._Samples != null)
            {
                this.Destroy();
            }
            Water containingWater = this._Camera._ContainingWater;

            if (containingWater != null)
            {
                Camera cameraComponent = this._Camera.CameraComponent;
                this._Samples = new List <WaterSample>();
                WaterCameraSubmersion.CreatePlanePoints(cameraComponent, this._Subdivisions, this._Points);
                for (int i = 0; i < this._Points.Count; i++)
                {
                    WaterSample waterSample = new WaterSample(containingWater, WaterSample.DisplacementMode.Height, 0.4f);
                    waterSample.Start(this._Points[i]);
                    this._Samples.Add(waterSample);
                }
            }
        }