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 }
/// <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 }
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); } }
/// <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); }