Esempio n. 1
0
        private void SetupCommandBufferForCamera(Camera camera)
        {
#if !UNITY_SERVER
            if (camera == null)
            {
                return;
            }

            WeatherMakerCameraProperties props      = GetCameraProperties(camera);
            WeatherMakerCameraType       cameraType = WeatherMakerScript.GetCameraType(camera);
            Camera baseCamera = WeatherMakerCommandBufferManagerScript.BaseCamera;
            UpdateDeferredShadingKeyword(camera);
            CalculateMatrixes(camera, baseCamera);
            CalculateFrustumCorners(camera);
            Shader.SetGlobalMatrixArray(WMS._WeatherMakerInverseView, inverseView);
            Shader.SetGlobalMatrixArray(WMS._WeatherMakerInverseProj, inverseProj);
            Shader.SetGlobalMatrixArray(WMS._WeatherMakerView, view);
            Shader.SetGlobalVectorArray(WMS._WeatherMakerCameraFrustumCorners, cameraFrustumCorners);
            Shader.SetGlobalVector(WMS._WeatherMakerCameraOriginOffset, props.OriginOffsetCumulative);
            Shader.SetGlobalVector(WMS._WeatherMakerCameraPosComputeShader, camera.transform.position);
            if (cameraType == WeatherMakerCameraType.CubeMap)
            {
                Shader.SetGlobalFloat(WMS._WeatherMakerCameraRenderMode, 2.0f);
            }
            else if (cameraType == WeatherMakerCameraType.Reflection)
            {
                Shader.SetGlobalFloat(WMS._WeatherMakerCameraRenderMode, 1.0f);
            }
            else
            {
                Shader.SetGlobalFloat(WMS._WeatherMakerCameraRenderMode, 0.0f);
            }
#endif
        }
Esempio n. 2
0
        /// <summary>
        /// Update global shader values for a compute shader
        /// </summary>
        /// <param name="shader">Compute shader</param>
        /// <param name="camera">Camera</param>
        public void UpdateShaderPropertiesForCamera(ComputeShader shader, Camera camera)
        {
#if !UNITY_SERVER
            if (shader == null || camera == null)
            {
                return;
            }
            WeatherMakerCameraProperties cameraProps = GetCameraProperties(camera);
            shader.SetVector(WMS._WeatherMakerCameraOriginOffset, cameraProps.OriginOffsetCumulative);
            shader.SetVector(WMS._WeatherMakerCameraPosComputeShader, camera.transform.position);
#endif
        }
Esempio n. 3
0
        private void CheckOriginOffset(Camera camera)
        {
            if (!Application.isPlaying || camera.cameraType != CameraType.Game ||
                WeatherMakerScript.GetCameraType(camera) != WeatherMakerCameraType.Normal || OriginOffsetDistance <= 0.0f || WeatherMakerScript.Instance == null)
            {
                return;
            }

            // check for a camera too far away from origin, when this happens adjust the camera close to the origin and
            //  move the root transform that contains the camera by the same offset
            WeatherMakerCameraProperties props = GetCameraProperties(camera);
            Vector3 pos          = camera.transform.position;
            Vector3 originOffset = Vector3.zero;

            if (Mathf.Abs(pos.x) > OriginOffsetDistance || Mathf.Abs(pos.y) > OriginOffsetDistance || Mathf.Abs(pos.z) > OriginOffsetDistance)
            {
                originOffset -= pos;
            }
            if (originOffset != Vector3.zero)
            {
                // temporal reprojections don't do well with a large jump in camera position, I think it is something with the change in view or projection
                // matrix, more research and debugging is needed, for now we force the next frame to do a full re-render
                foreach (WeatherMakerCommandBuffer buf in commandBuffers)
                {
                    if (buf.ReprojectionState != null)
                    {
                        buf.ReprojectionState.NeedsFirstFrameHandling = true;
                    }
                }
                props.OriginOffsetCumulative += originOffset;
                props.OriginOffsetCurrent     = originOffset;
                OriginOffsetChanged.Invoke(props);
                if (OriginOffsetAutoAdjustAll)
                {
                    for (int i = 0; i < UnityEngine.SceneManagement.SceneManager.sceneCount; i++)
                    {
                        UnityEngine.SceneManagement.SceneManager.GetSceneAt(i).GetRootGameObjects(rootObjects);
                        foreach (GameObject obj in rootObjects)
                        {
                            Transform t = obj.transform;
                            if (t.transform != WeatherMakerScript.Instance.transform && t.GetComponentInChildren <Canvas>() == null)
                            {
                                t.position += originOffset;
                            }
                        }
                        rootObjects.Clear();
                    }
                }
                UnityEngine.Debug.LogFormat("Adjusted origin offset, current: {0}, cumulative: {1}.", props.OriginOffsetCurrent, props.OriginOffsetCumulative);
            }
        }
Esempio n. 4
0
 /// <summary>
 /// Get weather maker camera properties
 /// </summary>
 /// <param name="camera">Camera</param>
 /// <returns>Properties or null if camera is null</returns>
 public WeatherMakerCameraProperties GetCameraProperties(Camera camera)
 {
     if (camera != null)
     {
         foreach (WeatherMakerCameraProperties props in cameraProps)
         {
             if (props.Camera == camera)
             {
                 return(props);
             }
         }
         WeatherMakerCameraProperties newProps = new WeatherMakerCameraProperties(camera);
         cameraProps.Add(newProps);
         return(newProps);
     }
     return(null);
 }