Пример #1
0
        public void Render(Camera camera, WaterGeometryType geometryType)
        {
            if (water == null || water.WaterMaterial == null || !water.isActiveAndEnabled)
            {
                return;
            }

            if ((camera.cullingMask & (1 << water.gameObject.layer)) == 0)
            {
                return;
            }

            var waterCamera = WaterCamera.GetWaterCamera(camera);

            if ((!water.Volume.Boundless && water.Volume.HasRenderableAdditiveVolumes) && ((object)waterCamera == null || !waterCamera.RenderVolumes))
            {
                return;
            }

            MaterialPropertyBlock propertyBlock;

            if ((object)waterCamera == null || !waterCamera.IsEffectCamera || waterCamera.MainCamera == null)
            {
                propertyBlock = GetMaterialPropertyBlock(camera);
                //RenderMasks(camera, waterCamera, propertyBlock);
            }
            else
            {
                propertyBlock = GetMaterialPropertyBlock(waterCamera.MainCamera);
            }

            if ((object)waterCamera != null && water.ReceiveShadows)
            {
                Vector2 min = new Vector2(0.0f, 0.0f);
                Vector2 max = new Vector2(1.0f, 1.0f);
                waterCamera.ReportShadowedWaterMinMaxRect(min, max);
            }

            water.OnWaterRender(camera);

            Matrix4x4 matrix;
            var       meshes = water.Geometry.GetTransformedMeshes(camera, out matrix, geometryType, false, (object)waterCamera != null ? waterCamera.ForcedVertexCount : 0);

            for (int i = 0; i < meshes.Length; ++i)
            {
                Graphics.DrawMesh(meshes[i], matrix, water.WaterMaterial, water.gameObject.layer, camera, 0, propertyBlock, water.ShadowCastingMode, false, reflectionProbeAnchor == null ? water.transform : reflectionProbeAnchor);

                if ((object)waterCamera == null || (waterCamera.ContainingWater != null && !waterCamera.IsEffectCamera))
                {
                    Graphics.DrawMesh(meshes[i], matrix, water.WaterBackMaterial, water.gameObject.layer, camera, 0, propertyBlock, water.ShadowCastingMode, false, reflectionProbeAnchor == null ? water.transform : reflectionProbeAnchor);
                }
            }
        }
Пример #2
0
        public Mesh[] GetTransformedMeshes(Camera camera, out Matrix4x4 matrix, WaterGeometryType geometryType, bool volume, int vertexCount = 0)
        {
            if (vertexCount == 0)
            {
                vertexCount = this.ComputeVertexCountForCamera(camera);
            }
            if (this._Type == WaterGeometry.Type.CustomMeshes)
            {
                geometryType = WaterGeometryType.Auto;
            }
            switch (geometryType)
            {
            case WaterGeometryType.Auto:
                switch (this._Type)
                {
                case WaterGeometry.Type.RadialGrid:
                    return(this._RadialGrid.GetTransformedMeshes(camera, out matrix, vertexCount, volume));

                case WaterGeometry.Type.ProjectionGrid:
                    return(this._ProjectionGrid.GetTransformedMeshes(camera, out matrix, vertexCount, volume));

                case WaterGeometry.Type.UniformGrid:
                    return(this._UniformGrid.GetTransformedMeshes(camera, out matrix, vertexCount, volume));

                case WaterGeometry.Type.CustomMeshes:
                    return(this._CustomSurfaceMeshes.GetTransformedMeshes(null, out matrix, volume));

                default:
                    throw new InvalidOperationException("Unknown water geometry type.");
                }
                break;

            case WaterGeometryType.RadialGrid:
                return(this._RadialGrid.GetTransformedMeshes(camera, out matrix, vertexCount, volume));

            case WaterGeometryType.ProjectionGrid:
                return(this._ProjectionGrid.GetTransformedMeshes(camera, out matrix, vertexCount, volume));

            case WaterGeometryType.UniformGrid:
                return(this._UniformGrid.GetTransformedMeshes(camera, out matrix, vertexCount, volume));

            case WaterGeometryType.QuadGeometry:
                return(this._QuadGeometry.GetTransformedMeshes(camera, out matrix, vertexCount, volume));

            default:
                throw new InvalidOperationException("Unknown water geometry type.");
            }
        }
Пример #3
0
        public void Render(Camera camera, WaterGeometryType geometryType, CommandBuffer commandBuffer = null, Shader shader = null)
        {
            if (!this._Water.isActiveAndEnabled || (camera.cullingMask & 1 << this._Water.gameObject.layer) == 0)
            {
                return;
            }
            WaterCamera waterCamera = WaterCamera.GetWaterCamera(camera, false);
            bool        flag        = waterCamera != null;

            if (!flag || (!this._Water.Volume.Boundless && this._Water.Volume.HasRenderableAdditiveVolumes && !waterCamera.RenderVolumes))
            {
                return;
            }
            if (this._Water.ShaderSet.ReceiveShadows)
            {
                Vector2 min = new Vector2(0f, 0f);
                Vector2 max = new Vector2(1f, 1f);
                waterCamera.ReportShadowedWaterMinMaxRect(min, max);
            }
            if (!this._UseSharedMask)
            {
                this.RenderMasks(camera, waterCamera, this._PropertyBlock);
            }
            Matrix4x4 matrix;

            Mesh[] transformedMeshes = this._Water.Geometry.GetTransformedMeshes(camera, out matrix, geometryType, false, waterCamera.ForcedVertexCount);
            if (commandBuffer == null)
            {
                Camera camera2 = (waterCamera.RenderMode == WaterRenderMode.DefaultQueue) ? camera : waterCamera._WaterRenderCamera;
                for (int i = 0; i < transformedMeshes.Length; i++)
                {
                    Graphics.DrawMesh(transformedMeshes[i], matrix, this._Water.Materials.SurfaceMaterial, this._Water.gameObject.layer, camera2, 0, this._PropertyBlock, this._ShadowCastingMode, false, (!(this._ReflectionProbeAnchor != null)) ? this._Water.transform : this._ReflectionProbeAnchor, false);
                    if (waterCamera.ContainingWater != null && waterCamera.Type == WaterCamera.CameraType.Normal)
                    {
                        Graphics.DrawMesh(transformedMeshes[i], matrix, this._Water.Materials.SurfaceBackMaterial, this._Water.gameObject.layer, camera2, 0, this._PropertyBlock, this._ShadowCastingMode, false, (!(this._ReflectionProbeAnchor != null)) ? this._Water.transform : this._ReflectionProbeAnchor, false);
                    }
                }
            }
            else
            {
                Material variant = UtilityShaderVariants.Instance.GetVariant(shader, this._Water.Materials.UsedKeywords);
                for (int j = 0; j < transformedMeshes.Length; j++)
                {
                    commandBuffer.DrawMesh(transformedMeshes[j], matrix, variant, 0, 0, this._PropertyBlock);
                }
            }
        }
Пример #4
0
        public Mesh[] GetTransformedMeshes(Camera camera, out Matrix4x4 matrix, WaterGeometryType geometryType, bool volume, int vertexCount = 0)
        {
            if (vertexCount == 0)
            {
                if (adaptToResolution)
                {
                    vertexCount = Mathf.RoundToInt(thisSystemVertexCount * ((float)(camera.pixelWidth * camera.pixelHeight) / (1920 * 1080)));
                }
                else
                {
                    vertexCount = thisSystemVertexCount;
                }
            }

            switch (geometryType)
            {
            case WaterGeometryType.Auto:
            {
                switch (type)
                {
                case Type.RadialGrid: return(radialGrid.GetTransformedMeshes(camera, out matrix, vertexCount, volume));

                case Type.ProjectionGrid: return(projectionGrid.GetTransformedMeshes(camera, out matrix, vertexCount, volume));

                case Type.UniformGrid: return(uniformGrid.GetTransformedMeshes(camera, out matrix, vertexCount, volume));

                case Type.CustomMeshes: return(customSurfaceMeshes.GetTransformedMeshes(null, out matrix, volume));

                default: throw new System.InvalidOperationException("Unknown water geometry type.");
                }
            }

            case WaterGeometryType.RadialGrid: return(radialGrid.GetTransformedMeshes(camera, out matrix, vertexCount, volume));

            case WaterGeometryType.ProjectionGrid: return(projectionGrid.GetTransformedMeshes(camera, out matrix, vertexCount, volume));

            case WaterGeometryType.UniformGrid: return(uniformGrid.GetTransformedMeshes(camera, out matrix, vertexCount, volume));

            default: throw new System.InvalidOperationException("Unknown water geometry type.");
            }
        }
Пример #5
0
        public Mesh[] GetMeshes(WaterGeometryType geometryType, int vertexCount, bool volume)
        {
            if (geometryType == WaterGeometryType.ProjectionGrid)
            {
                throw new System.InvalidOperationException("Projection grid needs camera to be retrieved. Use GetTransformedMeshes instead.");
            }

            Matrix4x4 matrix;

            switch (geometryType)
            {
            case WaterGeometryType.Auto:
            {
                switch (type)
                {
                case Type.RadialGrid: return(radialGrid.GetTransformedMeshes(null, out matrix, vertexCount, volume));

                case Type.ProjectionGrid: return(projectionGrid.GetTransformedMeshes(null, out matrix, vertexCount, volume));

                case Type.UniformGrid: return(uniformGrid.GetTransformedMeshes(null, out matrix, vertexCount, volume));

                case Type.CustomMeshes: return(customSurfaceMeshes.GetTransformedMeshes(null, out matrix, volume));

                default: throw new System.InvalidOperationException("Unknown water geometry type.");
                }
            }

            case WaterGeometryType.RadialGrid: return(radialGrid.GetTransformedMeshes(null, out matrix, vertexCount, volume));

            case WaterGeometryType.ProjectionGrid: return(projectionGrid.GetTransformedMeshes(null, out matrix, vertexCount, volume));

            case WaterGeometryType.UniformGrid: return(uniformGrid.GetTransformedMeshes(null, out matrix, vertexCount, volume));

            default: throw new System.InvalidOperationException("Unknown water geometry type.");
            }
        }
Пример #6
0
        public Mesh[] GetMeshes(WaterGeometryType geometryType, int vertexCount, bool volume)
        {
            if (geometryType == WaterGeometryType.ProjectionGrid)
            {
                throw new InvalidOperationException("Projection grid needs camera to be retrieved. Use GetTransformedMeshes instead.");
            }
            if (this._Type == WaterGeometry.Type.CustomMeshes)
            {
                geometryType = WaterGeometryType.Auto;
            }
            switch (geometryType)
            {
            case WaterGeometryType.Auto:
                switch (this._Type)
                {
                case WaterGeometry.Type.RadialGrid:
                {
                    Matrix4x4 matrix4x;
                    return(this._RadialGrid.GetTransformedMeshes(null, out matrix4x, vertexCount, volume));
                }

                case WaterGeometry.Type.ProjectionGrid:
                {
                    Matrix4x4 matrix4x;
                    return(this._ProjectionGrid.GetTransformedMeshes(null, out matrix4x, vertexCount, volume));
                }

                case WaterGeometry.Type.UniformGrid:
                {
                    Matrix4x4 matrix4x;
                    return(this._UniformGrid.GetTransformedMeshes(null, out matrix4x, vertexCount, volume));
                }

                case WaterGeometry.Type.CustomMeshes:
                {
                    Matrix4x4 matrix4x;
                    return(this._CustomSurfaceMeshes.GetTransformedMeshes(null, out matrix4x, volume));
                }

                default:
                    throw new InvalidOperationException("Unknown water geometry type.");
                }
                break;

            case WaterGeometryType.RadialGrid:
            {
                Matrix4x4 matrix4x;
                return(this._RadialGrid.GetTransformedMeshes(null, out matrix4x, vertexCount, volume));
            }

            case WaterGeometryType.ProjectionGrid:
            {
                Matrix4x4 matrix4x;
                return(this._ProjectionGrid.GetTransformedMeshes(null, out matrix4x, vertexCount, volume));
            }

            case WaterGeometryType.UniformGrid:
            {
                Matrix4x4 matrix4x;
                return(this._UniformGrid.GetTransformedMeshes(null, out matrix4x, vertexCount, volume));
            }

            case WaterGeometryType.QuadGeometry:
            {
                Matrix4x4 matrix4x;
                return(this._QuadGeometry.GetTransformedMeshes(null, out matrix4x, vertexCount, volume));
            }

            default:
                throw new InvalidOperationException("Unknown water geometry type.");
            }
        }