From 4d836d892d2ed82c1357dfc3284e918e6287a6b9 Mon Sep 17 00:00:00 2001 From: Aeroluna <40481393+Aeroluna@users.noreply.github.com> Date: Fri, 8 Nov 2024 00:02:39 -0700 Subject: [PATCH] fix dumb stupid shit again --- .../HarmonyPatches/AddComponentsToCamera.cs | 8 + Vivify/HarmonyPatches/CameraEffectApplier.cs | 66 +--- .../CullingTextureController.cs | 4 + .../PostProcessingController.cs | 358 ++++++++++-------- 4 files changed, 220 insertions(+), 216 deletions(-) diff --git a/Vivify/HarmonyPatches/AddComponentsToCamera.cs b/Vivify/HarmonyPatches/AddComponentsToCamera.cs index cdb6f68..0c63e55 100644 --- a/Vivify/HarmonyPatches/AddComponentsToCamera.cs +++ b/Vivify/HarmonyPatches/AddComponentsToCamera.cs @@ -32,6 +32,14 @@ private void AddComponents(MainEffectController __instance) SafeAddComponent(gameObject); } + [AffinityPrefix] + [AffinityPatch(typeof(ImageEffectController), nameof(ImageEffectController.OnRenderImage))] + private bool StopRenderImage(RenderTexture src, RenderTexture dest) + { + Graphics.Blit(src, dest); + return false; + } + private void SafeAddComponent(GameObject gameObject) where T : Component { diff --git a/Vivify/HarmonyPatches/CameraEffectApplier.cs b/Vivify/HarmonyPatches/CameraEffectApplier.cs index 0e7ab72..9a8acb9 100644 --- a/Vivify/HarmonyPatches/CameraEffectApplier.cs +++ b/Vivify/HarmonyPatches/CameraEffectApplier.cs @@ -70,66 +70,24 @@ private void Reset() [AffinityPrefix] [AffinityPatch(typeof(MainEffectController), nameof(MainEffectController.ImageEffectControllerCallback))] - private bool ApplyVivifyEffect(MainEffectController __instance, RenderTexture src, RenderTexture dest) + private void ApplyVivifyEffect(MainEffectController __instance, RenderTexture src, RenderTexture dest) { - if (!_postProcessingControllers.TryGetValue(__instance, out PostProcessingController? postProcessingController)) + if (_postProcessingControllers.TryGetValue(__instance, out PostProcessingController? postProcessingController)) { - postProcessingController = __instance.GetComponent(); - if (postProcessingController == null) - { - return true; - } - - _postProcessingControllers[__instance] = postProcessingController; - postProcessingController.CameraDatas = CameraDatas; - postProcessingController.DeclaredTextureDatas = DeclaredTextureDatas; - postProcessingController.PrewarmCameras(_prewarmCount); + return; } - RenderTextureDescriptor descriptor = src.descriptor; - postProcessingController.CreateDeclaredTextures(descriptor); - RenderTexture main = src; - if (PreEffects.Count > 0) + postProcessingController = __instance.GetComponent(); + if (postProcessingController == null) { - main = postProcessingController.RenderImage(main, PreEffects); + return; } - MainEffectSO mainEffect = __instance._mainEffectContainer.mainEffect; - - if (PostEffects.Count > 0) - { - RenderTexture temp = RenderTexture.GetTemporary(descriptor); - mainEffect.Render(main, temp, __instance._fadeValue); - if (main != src) - { - RenderTexture.ReleaseTemporary(main); - } - - if (postProcessingController.MainEffect) - { - main = postProcessingController.RenderImage(temp, PostEffects); - if (temp != main) - { - RenderTexture.ReleaseTemporary(temp); - } - } - else - { - main = temp; - } - - Graphics.Blit(main, dest); - RenderTexture.ReleaseTemporary(main); - } - else - { - mainEffect.Render(main, dest, __instance._fadeValue); - if (main != src) - { - RenderTexture.ReleaseTemporary(main); - } - } - - return false; + _postProcessingControllers[__instance] = postProcessingController; + postProcessingController.CameraDatas = CameraDatas; + postProcessingController.DeclaredTextureDatas = DeclaredTextureDatas; + postProcessingController.PreEffects = PreEffects; + postProcessingController.PostEffects = PostEffects; + postProcessingController.PrewarmCameras(_prewarmCount); } } diff --git a/Vivify/PostProcessing/CullingTextureController.cs b/Vivify/PostProcessing/CullingTextureController.cs index de45978..66fa2e1 100644 --- a/Vivify/PostProcessing/CullingTextureController.cs +++ b/Vivify/PostProcessing/CullingTextureController.cs @@ -66,6 +66,9 @@ protected override void OnPreCull() transform1.localPosition = Vector3.zero; transform1.localRotation = Quaternion.identity; camera.cullingMatrix = other.projectionMatrix * other.worldToCameraMatrix; + camera.projectionMatrix = other.projectionMatrix; + camera.nonJitteredProjectionMatrix = other.nonJitteredProjectionMatrix; + camera.worldToCameraMatrix = other.worldToCameraMatrix; } // very simple comparison @@ -100,6 +103,7 @@ private void RefreshCamera() // copyfrom lags for some reason ////Camera.CopyFrom(_postProcessingController.Camera); Camera other = _postProcessingController.Camera; + Camera.stereoTargetEye = other.stereoTargetEye; Camera.fieldOfView = other.fieldOfView; Camera.aspect = other.aspect; Camera.depth = other.depth - 1; diff --git a/Vivify/PostProcessing/PostProcessingController.cs b/Vivify/PostProcessing/PostProcessingController.cs index 402b8eb..6a4be3d 100644 --- a/Vivify/PostProcessing/PostProcessingController.cs +++ b/Vivify/PostProcessing/PostProcessingController.cs @@ -28,10 +28,16 @@ internal class PostProcessingController : CullingCameraController private SiraLog _log = null!; private IInstantiator _instantiator = null!; + private ImageEffectController _imageEffectController = null!; + internal Dictionary CameraDatas { get; set; } = new(); internal Dictionary DeclaredTextureDatas { get; set; } = new(); + internal List PreEffects { get; set; } = []; + + internal List PostEffects { get; set; } = []; + internal override int DefaultCullingMask => _defaultCullingMask ?? Camera.cullingMask; // TODO: make this create the render textures as well @@ -44,7 +50,177 @@ internal void PrewarmCameras(int count) } } - internal void CreateDeclaredTextures(RenderTextureDescriptor descriptor) + protected override void OnPreCull() + { + base.OnPreCull(); + + foreach ((CreateCameraData textureData, string id) in _activeCreateCameraDatas) + { + if (CameraDatas.ContainsValue(textureData)) + { + continue; + } + + if (_cullingCameraControllers.TryGetValue(id, out CullingCameraController cameraController) && + cameraController is CullingTextureController cullingTextureController2) + { + cullingTextureController2.gameObject.SetActive(false); + _disabledCullingCameraControllers.Push(cullingTextureController2); + } + + _cullingCameraControllers.Remove(id); + _reusableCameraKeys.Add(textureData); + } + + foreach (CreateCameraData createCameraData in _reusableCameraKeys) + { + _activeCreateCameraDatas.Remove(createCameraData); + } + + _reusableCameraKeys.Clear(); + + foreach ((string textureName, CreateCameraData cameraData) in CameraDatas) + { + if (_activeCreateCameraDatas.ContainsKey(cameraData)) + { + continue; + } + + _activeCreateCameraDatas[cameraData] = textureName; + + CullingTextureController finalController = _disabledCullingCameraControllers.Count > 0 + ? _disabledCullingCameraControllers.Pop() + : CreateCamera(); + + finalController.Init(cameraData); + finalController.gameObject.SetActive(true); + _cullingCameraControllers[textureName] = finalController; + } + + // delete old declared textures + foreach ((CreateScreenTextureData value, string textureName) in _activeDeclaredTextures) + { + if (DeclaredTextureDatas.ContainsValue(value)) + { + continue; + } + + foreach (RenderTexture? renderTexture in _declaredTextures[textureName].Textures.Values) + { + if (renderTexture != null) + { + renderTexture.Release(); + } + } + + _declaredTextures.Remove(textureName); + _reusableDeclaredKeys.Add(value); + } + + foreach (CreateScreenTextureData declareRenderTextureData in _reusableDeclaredKeys) + { + _activeDeclaredTextures.Remove(declareRenderTextureData); + } + + _reusableDeclaredKeys.Clear(); + + // instantiate RenderTextureHolders + foreach ((string textureName, CreateScreenTextureData declareRenderTextureData) in DeclaredTextureDatas) + { + if (_activeDeclaredTextures.ContainsKey(declareRenderTextureData)) + { + continue; + } + + _declaredTextures.Add(textureName, new RenderTextureHolder(declareRenderTextureData)); + _activeDeclaredTextures.Add(declareRenderTextureData, textureName); + } + } + + // Cool method for copying serialized fields + // if i was smart, i would've used this for chroma components + private static void CopyComponent(T original, GameObject destination) + where T : MonoBehaviour + where TDerived : T + { + Type type = typeof(T); + MonoBehaviour copy = destination.AddComponent(); + FieldInfo[] fields = type.GetFields(BindingFlags.NonPublic | BindingFlags.Instance); + foreach (FieldInfo field in fields) + { + if (Attribute.IsDefined(field, typeof(SerializeField))) + { + field.SetValue(copy, field.GetValue(original)); + } + } + } + + private void OnRenderImage(RenderTexture src, RenderTexture dst) + { + RenderTextureDescriptor descriptor = src.descriptor; + CreateDeclaredTextures(descriptor); + RenderTexture temp = RenderTexture.GetTemporary(descriptor); + RenderImage(src, temp, PreEffects); + + ImageEffectController.RenderImageCallback? callback = _imageEffectController._renderImageCallback; + if (callback != null && _imageEffectController.isActiveAndEnabled) + { + RenderTexture temp2 = RenderTexture.GetTemporary(descriptor); + callback(temp, temp2); + RenderTexture.ReleaseTemporary(temp); + temp = temp2; + } + + RenderImage(temp, dst, PostEffects); + RenderTexture.ReleaseTemporary(temp); + } + + private void OnPreRender() + { + Camera.MonoOrStereoscopicEye stereoActiveEye = Camera.stereoActiveEye; + + foreach (CullingCameraController controller in _cullingCameraControllers.Values) + { + if (controller is not CullingTextureController cullingTextureController) + { + continue; + } + + Camera camera = cullingTextureController.Camera; + if (camera.enabled == false) + { + camera.Render(); + } + + if (cullingTextureController.Key != null && + cullingTextureController.RenderTextures.TryGetValue( + stereoActiveEye, + out RenderTexture colorTexture)) + { + Shader.SetGlobalTexture(cullingTextureController.Key.Value, colorTexture); + } + + if (cullingTextureController.DepthKey != null && + cullingTextureController.RenderTexturesDepth.TryGetValue( + stereoActiveEye, + out RenderTexture depthTexture)) + { + Shader.SetGlobalTexture(cullingTextureController.DepthKey.Value, depthTexture); + } + } + + // set declared texture properties + foreach (RenderTextureHolder value in _declaredTextures.Values) + { + CreateScreenTextureData data = value.Data; + if (value.Textures.TryGetValue(stereoActiveEye, out RenderTexture texture)) + { + Shader.SetGlobalTexture(data.PropertyId, texture); + } + } + } + + private void CreateDeclaredTextures(RenderTextureDescriptor descriptor) { Camera.MonoOrStereoscopicEye stereoActiveEye = Camera.stereoActiveEye; @@ -80,13 +256,20 @@ internal void CreateDeclaredTextures(RenderTextureDescriptor descriptor) } } - internal RenderTexture RenderImage(RenderTexture src, List materials) + private void RenderImage(RenderTexture src, RenderTexture dst, List materials) { RenderTextureDescriptor descriptor = src.descriptor; Camera.MonoOrStereoscopicEye stereoActiveEye = Camera.stereoActiveEye; + if (materials.Count == 0) + { + Graphics.Blit(src, dst); + return; + } + // blit all passes - RenderTexture main = src; + RenderTexture main = RenderTexture.GetTemporary(descriptor); + Graphics.Blit(src, main); for (int i = materials.Count - 1; i >= 0; i--) { MaterialData materialData = materials[i]; @@ -111,11 +294,7 @@ internal RenderTexture RenderImage(RenderTexture src, List materia RenderTexture temp = RenderTexture.GetTemporary(descriptor); Graphics.Blit(main, temp, material, materialData.Pass); - if (main != src) - { - RenderTexture.ReleaseTemporary(main); - } - + RenderTexture.ReleaseTemporary(main); main = temp; } else @@ -150,14 +329,13 @@ internal RenderTexture RenderImage(RenderTexture src, List materia { if (material == null) { - continue; + return; } RenderTexture temp = RenderTexture.GetTemporary(source!.descriptor); temp.filterMode = source.filterMode; Graphics.Blit(source, temp, material, materialData.Pass); - Graphics.CopyTexture(temp, source); // somehow not laggy but blit is? - ////Graphics.Blit(temp, source); + Graphics.Blit(temp, source); RenderTexture.ReleaseTemporary(temp); continue; @@ -225,157 +403,8 @@ static void Blit(RenderTexture? blitSrc, RenderTexture? blitDst, Material? blitM } } - return main; - } - - protected override void OnPreCull() - { - base.OnPreCull(); - - foreach ((CreateCameraData textureData, string id) in _activeCreateCameraDatas) - { - if (CameraDatas.ContainsValue(textureData)) - { - continue; - } - - if (_cullingCameraControllers.TryGetValue(id, out CullingCameraController cameraController) && - cameraController is CullingTextureController cullingTextureController2) - { - cullingTextureController2.gameObject.SetActive(false); - _disabledCullingCameraControllers.Push(cullingTextureController2); - } - - _cullingCameraControllers.Remove(id); - _reusableCameraKeys.Add(textureData); - } - - foreach (CreateCameraData createCameraData in _reusableCameraKeys) - { - _activeCreateCameraDatas.Remove(createCameraData); - } - - _reusableCameraKeys.Clear(); - - foreach ((string textureName, CreateCameraData cameraData) in CameraDatas) - { - if (_activeCreateCameraDatas.ContainsKey(cameraData)) - { - continue; - } - - _activeCreateCameraDatas[cameraData] = textureName; - - CullingTextureController finalController = _disabledCullingCameraControllers.Count > 0 - ? _disabledCullingCameraControllers.Pop() - : CreateCamera(); - - finalController.Init(cameraData); - finalController.gameObject.SetActive(true); - _cullingCameraControllers[textureName] = finalController; - } - - // delete old declared textures - foreach ((CreateScreenTextureData value, string textureName) in _activeDeclaredTextures) - { - if (DeclaredTextureDatas.ContainsValue(value)) - { - continue; - } - - foreach (RenderTexture? renderTexture in _declaredTextures[textureName].Textures.Values) - { - if (renderTexture != null) - { - renderTexture.Release(); - } - } - - _declaredTextures.Remove(textureName); - _reusableDeclaredKeys.Add(value); - } - - foreach (CreateScreenTextureData declareRenderTextureData in _reusableDeclaredKeys) - { - _activeDeclaredTextures.Remove(declareRenderTextureData); - } - - _reusableDeclaredKeys.Clear(); - - // instantiate RenderTextureHolders - foreach ((string textureName, CreateScreenTextureData declareRenderTextureData) in DeclaredTextureDatas) - { - if (_activeDeclaredTextures.ContainsKey(declareRenderTextureData)) - { - continue; - } - - _declaredTextures.Add(textureName, new RenderTextureHolder(declareRenderTextureData)); - _activeDeclaredTextures.Add(declareRenderTextureData, textureName); - } - } - - // Cool method for copying serialized fields - // if i was smart, i would've used this for chroma components - private static void CopyComponent(T original, GameObject destination) - where T : MonoBehaviour - where TDerived : T - { - Type type = typeof(T); - MonoBehaviour copy = destination.AddComponent(); - FieldInfo[] fields = type.GetFields(BindingFlags.NonPublic | BindingFlags.Instance); - foreach (FieldInfo field in fields) - { - if (Attribute.IsDefined(field, typeof(SerializeField))) - { - field.SetValue(copy, field.GetValue(original)); - } - } - } - - private void OnPreRender() - { - Camera.MonoOrStereoscopicEye stereoActiveEye = Camera.stereoActiveEye; - - foreach (CullingCameraController controller in _cullingCameraControllers.Values) - { - if (controller is not CullingTextureController cullingTextureController) - { - continue; - } - - Camera camera = cullingTextureController.Camera; - if (camera.enabled == false) - { - camera.Render(); - } - - if (cullingTextureController.Key != null && - cullingTextureController.RenderTextures.TryGetValue( - stereoActiveEye, - out RenderTexture colorTexture)) - { - Shader.SetGlobalTexture(cullingTextureController.Key.Value, colorTexture); - } - - if (cullingTextureController.DepthKey != null && - cullingTextureController.RenderTexturesDepth.TryGetValue( - stereoActiveEye, - out RenderTexture depthTexture)) - { - Shader.SetGlobalTexture(cullingTextureController.DepthKey.Value, depthTexture); - } - } - - // set declared texture properties - foreach (RenderTextureHolder value in _declaredTextures.Values) - { - CreateScreenTextureData data = value.Data; - if (value.Textures.TryGetValue(stereoActiveEye, out RenderTexture texture)) - { - Shader.SetGlobalTexture(data.PropertyId, texture); - } - } + Graphics.Blit(main, dst); + RenderTexture.ReleaseTemporary(main); } private CullingTextureController CreateCamera() @@ -397,6 +426,11 @@ private void Construct(SiraLog log, IInstantiator instantiator) _instantiator = instantiator; } + private void Awake() + { + _imageEffectController = GetComponent(); + } + private void Start() { _defaultCullingMask = Camera.cullingMask;