mirror of
https://github.com/NotAKidoS/NAK_CVR_Mods.git
synced 2025-09-02 22:39:22 +00:00
Move many mods to Deprecated folder, fix spelling
This commit is contained in:
parent
5e822cec8d
commit
0042590aa6
539 changed files with 7475 additions and 3120 deletions
|
@ -0,0 +1,69 @@
|
|||
using System.Collections;
|
||||
using UnityEngine;
|
||||
using System.Text;
|
||||
using MelonLoader;
|
||||
|
||||
namespace NAK.LegacyContentMitigation.Debug;
|
||||
|
||||
public class CameraCallbackLogger
|
||||
{
|
||||
private static CameraCallbackLogger instance;
|
||||
private readonly List<string> frameCallbacks = new();
|
||||
private bool isListening;
|
||||
private readonly StringBuilder logBuilder = new();
|
||||
|
||||
public static CameraCallbackLogger Instance => instance ??= new CameraCallbackLogger();
|
||||
|
||||
private void RegisterCallbacks()
|
||||
{
|
||||
Camera.onPreCull += (cam) => LogCallback(cam, "OnPreCull");
|
||||
Camera.onPreRender += (cam) => LogCallback(cam, "OnPreRender");
|
||||
Camera.onPostRender += (cam) => LogCallback(cam, "OnPostRender");
|
||||
}
|
||||
|
||||
private void UnregisterCallbacks()
|
||||
{
|
||||
Camera.onPreCull -= (cam) => LogCallback(cam, "OnPreCull");
|
||||
Camera.onPreRender -= (cam) => LogCallback(cam, "OnPreRender");
|
||||
Camera.onPostRender -= (cam) => LogCallback(cam, "OnPostRender");
|
||||
}
|
||||
|
||||
public void LogCameraEvents()
|
||||
{
|
||||
MelonCoroutines.Start(LoggingCoroutine());
|
||||
}
|
||||
|
||||
private IEnumerator LoggingCoroutine()
|
||||
{
|
||||
yield return null; // idk at what point in frame start occurs
|
||||
|
||||
// First frame: Register and listen
|
||||
RegisterCallbacks();
|
||||
isListening = true;
|
||||
yield return null;
|
||||
|
||||
// Second frame: Log and cleanup
|
||||
isListening = false;
|
||||
PrintFrameLog();
|
||||
UnregisterCallbacks();
|
||||
}
|
||||
|
||||
private void LogCallback(Camera camera, string callbackName)
|
||||
{
|
||||
if (!isListening) return;
|
||||
frameCallbacks.Add($"{camera.name} - {callbackName} (Depth: {camera.depth})");
|
||||
}
|
||||
|
||||
private void PrintFrameLog()
|
||||
{
|
||||
logBuilder.Clear();
|
||||
logBuilder.AppendLine("\nCamera Callbacks for Frame:");
|
||||
|
||||
foreach (var callback in frameCallbacks)
|
||||
logBuilder.AppendLine(callback);
|
||||
|
||||
LegacyContentMitigationMod.Logger.Msg(logBuilder.ToString());
|
||||
|
||||
frameCallbacks.Clear();
|
||||
}
|
||||
}
|
100
.Deprecated/LegacyContentMitigation/Components/FaceMirror.cs
Normal file
100
.Deprecated/LegacyContentMitigation/Components/FaceMirror.cs
Normal file
|
@ -0,0 +1,100 @@
|
|||
using ABI_RC.Core;
|
||||
using ABI_RC.Core.Player;
|
||||
using ABI_RC.Core.Savior;
|
||||
using NAK.LegacyContentMitigation;
|
||||
using UnityEngine;
|
||||
using UnityEngine.Rendering;
|
||||
using UnityEngine.XR;
|
||||
|
||||
namespace LegacyContentMitigation.Components;
|
||||
|
||||
public class FaceMirror : MonoBehaviour
|
||||
{
|
||||
private Camera _parentCamera;
|
||||
private Camera _camera;
|
||||
public Rect shiftRect;
|
||||
private CommandBuffer _viewportBuffer;
|
||||
|
||||
private void Start() {
|
||||
_parentCamera = GetComponent<Camera>();
|
||||
_camera = new GameObject("Face Mirror").AddComponent<Camera>();
|
||||
_camera.transform.parent = transform;
|
||||
_camera.CopyFrom(_parentCamera);
|
||||
_camera.ResetReplacementShader();
|
||||
_camera.depth = 99;
|
||||
_camera.clearFlags = CameraClearFlags.Depth;
|
||||
_camera.transform.position += transform.forward * 0.5f;
|
||||
_camera.transform.rotation *= Quaternion.Euler(0, 180, 0);
|
||||
|
||||
// View only CVRLayers.PlayerLocal
|
||||
_camera.cullingMask = 1 << CVRLayers.PlayerLocal;
|
||||
|
||||
// Create and cache the command buffer
|
||||
_viewportBuffer = new CommandBuffer();
|
||||
_viewportBuffer.SetViewport(shiftRect);
|
||||
|
||||
_camera.AddCommandBuffer(CameraEvent.BeforeDepthTexture, _viewportBuffer);
|
||||
_camera.AddCommandBuffer(CameraEvent.BeforeForwardOpaque, _viewportBuffer);
|
||||
_camera.AddCommandBuffer(CameraEvent.BeforeForwardAlpha, _viewportBuffer);
|
||||
_camera.AddCommandBuffer(CameraEvent.BeforeImageEffects, _viewportBuffer);
|
||||
}
|
||||
|
||||
private void Update()
|
||||
{
|
||||
if (ModSettings.EntryUseFaceMirror.Value == false)
|
||||
{
|
||||
_camera.enabled = false;
|
||||
return;
|
||||
}
|
||||
_camera.enabled = true;
|
||||
|
||||
// Update camera distance
|
||||
_camera.transform.localPosition = Vector3.forward * ModSettings.EntryFaceMirrorDistance.Value;
|
||||
|
||||
// Get the display resolution based on VR status
|
||||
int displayWidth, displayHeight;
|
||||
if (MetaPort.Instance.isUsingVr)
|
||||
{
|
||||
displayWidth = XRSettings.eyeTextureWidth;
|
||||
displayHeight = XRSettings.eyeTextureHeight;
|
||||
}
|
||||
else
|
||||
{
|
||||
displayWidth = Screen.width;
|
||||
displayHeight = Screen.height;
|
||||
}
|
||||
|
||||
// Calculate pixel sizes first
|
||||
float pixelSizeX = ModSettings.EntryFaceMirrorSizeX.Value * displayWidth;
|
||||
float pixelSizeY = ModSettings.EntryFaceMirrorSizeY.Value * displayHeight;
|
||||
|
||||
// Calculate offsets from center
|
||||
float pixelOffsetX = (ModSettings.EntryFaceMirrorOffsetX.Value * displayWidth) - (pixelSizeX * 0.5f) + (displayWidth * 0.5f);
|
||||
float pixelOffsetY = (ModSettings.EntryFaceMirrorOffsetY.Value * displayHeight) - (pixelSizeY * 0.5f) + (displayHeight * 0.5f);
|
||||
|
||||
_camera.transform.localScale = Vector3.one * ModSettings.EntryFaceMirrorCameraScale.Value;
|
||||
|
||||
Vector3 playerup = PlayerSetup.Instance.transform.up;
|
||||
Vector3 cameraForward = _parentCamera.transform.forward;
|
||||
|
||||
// Check if playerup and cameraForward are nearly aligned
|
||||
if (Mathf.Abs(Vector3.Dot(playerup, cameraForward)) <= Mathf.Epsilon) {
|
||||
playerup = -_parentCamera.transform.forward;
|
||||
cameraForward = _parentCamera.transform.up;
|
||||
}
|
||||
|
||||
_camera.transform.rotation = Quaternion.LookRotation(-cameraForward, playerup);
|
||||
|
||||
// Create viewport rect with pixel values
|
||||
shiftRect = new Rect(
|
||||
pixelOffsetX,
|
||||
pixelOffsetY,
|
||||
pixelSizeX,
|
||||
pixelSizeY
|
||||
);
|
||||
|
||||
// Update the cached buffer's viewport
|
||||
_viewportBuffer.Clear();
|
||||
_viewportBuffer.SetViewport(shiftRect);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,230 @@
|
|||
using ABI_RC.Core;
|
||||
using ABI_RC.Core.Player;
|
||||
using ABI_RC.Systems.UI;
|
||||
using UnityEngine;
|
||||
using UnityEngine.Rendering;
|
||||
using UnityEngine.XR;
|
||||
|
||||
namespace NAK.LegacyContentMitigation;
|
||||
|
||||
public class FakeMultiPassHack : MonoBehaviour
|
||||
{
|
||||
private static readonly int s_WorldSpaceCameraPos = Shader.PropertyToID("_WorldSpaceCameraPos");
|
||||
|
||||
public static Action<bool> OnMultiPassActiveChanged;
|
||||
|
||||
#region Properties
|
||||
|
||||
public static FakeMultiPassHack Instance { get; set; }
|
||||
public bool IsActive => IsEnabled && isActiveAndEnabled;
|
||||
public bool IsEnabled { get; private set; }
|
||||
public Camera.MonoOrStereoscopicEye RenderingEye { get; private set; }
|
||||
|
||||
#endregion
|
||||
|
||||
#region Private Fields
|
||||
|
||||
private Camera _mainCamera;
|
||||
private Camera _leftEye;
|
||||
private Camera _rightEye;
|
||||
|
||||
private GameObject _leftEyeObject;
|
||||
private GameObject _rightEyeObject;
|
||||
|
||||
private RenderTexture _leftTexture;
|
||||
private RenderTexture _rightTexture;
|
||||
|
||||
private CommandBuffer _shaderGlobalBuffer;
|
||||
private CommandBuffer _leftEyeBuffer;
|
||||
|
||||
private int CachedCullingMask;
|
||||
private bool _isInitialized;
|
||||
|
||||
#endregion
|
||||
|
||||
#region Unity Lifecycle
|
||||
|
||||
private void OnEnable()
|
||||
{
|
||||
Camera.onPreRender += OnPreRenderCallback;
|
||||
if (IsEnabled) _mainCamera.cullingMask = 0;
|
||||
}
|
||||
|
||||
private void OnDisable()
|
||||
{
|
||||
Camera.onPreRender -= OnPreRenderCallback;
|
||||
if (IsEnabled) _mainCamera.cullingMask = CachedCullingMask;
|
||||
}
|
||||
|
||||
private void OnDestroy()
|
||||
{
|
||||
if (_leftEye != null) RemoveCameraFromWorldTransitionSystem(_leftEye);
|
||||
if (_rightEye != null) RemoveCameraFromWorldTransitionSystem(_rightEye);
|
||||
|
||||
if (_leftTexture != null) _leftTexture.Release();
|
||||
if (_rightTexture != null) _rightTexture.Release();
|
||||
_shaderGlobalBuffer?.Release();
|
||||
_leftEyeBuffer?.Release();
|
||||
|
||||
if (_leftEyeObject != null) Destroy(_leftEyeObject);
|
||||
if (_rightEyeObject != null) Destroy(_rightEyeObject);
|
||||
|
||||
return;
|
||||
void RemoveCameraFromWorldTransitionSystem(Camera cam)
|
||||
{
|
||||
if (cam.TryGetComponent(out WorldTransitionCamera effectCam)) Destroy(effectCam);
|
||||
WorldTransitionSystem.Cameras.Remove(cam);
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Public Methods
|
||||
|
||||
public void SetMultiPassActive(bool active)
|
||||
{
|
||||
if (active == IsEnabled) return;
|
||||
IsEnabled = active;
|
||||
|
||||
if (active && !_isInitialized) DoInitialSetup();
|
||||
|
||||
_mainCamera.cullingMask = IsActive ? 0 : CachedCullingMask;
|
||||
|
||||
OnMultiPassActiveChanged?.Invoke(active);
|
||||
}
|
||||
|
||||
public void OnMainCameraChanged()
|
||||
{
|
||||
if (!_isInitialized) return;
|
||||
|
||||
CachedCullingMask = _mainCamera.cullingMask;
|
||||
if (IsActive) _mainCamera.cullingMask = 0;
|
||||
|
||||
CVRTools.CopyToDestCam(_mainCamera, _leftEye);
|
||||
CVRTools.CopyToDestCam(_mainCamera, _rightEye);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Initialization
|
||||
|
||||
private void DoInitialSetup()
|
||||
{
|
||||
_mainCamera = GetComponent<Camera>();
|
||||
CachedCullingMask = _mainCamera.cullingMask;
|
||||
|
||||
_shaderGlobalBuffer = new CommandBuffer();
|
||||
_leftEyeBuffer = new CommandBuffer();
|
||||
|
||||
SetupEye("Left Eye", out _leftEyeObject, out _leftEye, _leftEyeBuffer);
|
||||
SetupEye("Right Eye", out _rightEyeObject, out _rightEye, null);
|
||||
|
||||
_isInitialized = true;
|
||||
|
||||
return;
|
||||
void SetupEye(string camName, out GameObject eyeObj, out Camera eye, CommandBuffer eyeBuffer)
|
||||
{
|
||||
eyeObj = new GameObject(camName);
|
||||
eyeObj.transform.parent = transform;
|
||||
eyeObj.transform.localScale = Vector3.one;
|
||||
eye = eyeObj.AddComponent<Camera>();
|
||||
eye.enabled = false;
|
||||
|
||||
// Correct camera world space pos (nameplate shader)
|
||||
eye.AddCommandBuffer(CameraEvent.BeforeDepthTexture, _shaderGlobalBuffer);
|
||||
eye.AddCommandBuffer(CameraEvent.BeforeForwardOpaque, _shaderGlobalBuffer);
|
||||
eye.AddCommandBuffer(CameraEvent.BeforeForwardAlpha, _shaderGlobalBuffer);
|
||||
|
||||
// normalizedViewport parameter is ignored, so we cannot draw mesh on right eye :)
|
||||
if (eyeBuffer != null)
|
||||
{
|
||||
eye.AddCommandBuffer(CameraEvent.BeforeDepthTexture, eyeBuffer);
|
||||
eye.AddCommandBuffer(CameraEvent.BeforeForwardOpaque, eyeBuffer);
|
||||
eye.AddCommandBuffer(CameraEvent.BeforeForwardAlpha, eyeBuffer);
|
||||
// notice how we pass fucked param vs UnityEngine.Rendering.XRUtils
|
||||
eyeBuffer.DrawOcclusionMesh(new RectInt(0, 0, 0, 0));
|
||||
}
|
||||
|
||||
WorldTransitionSystem.AddCamera(eye);
|
||||
CVRTools.CopyToDestCam(_mainCamera, eye);
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Rendering
|
||||
|
||||
private void OnPreRenderCallback(Camera cam)
|
||||
{
|
||||
if (!IsEnabled || !_isInitialized) return;
|
||||
|
||||
if (cam.CompareTag("MainCamera"))
|
||||
{
|
||||
EnsureRenderTexturesCreated();
|
||||
RenderEyePair();
|
||||
}
|
||||
}
|
||||
|
||||
private void EnsureRenderTexturesCreated()
|
||||
{
|
||||
int eyeWidth = XRSettings.eyeTextureWidth;
|
||||
int eyeHeight = XRSettings.eyeTextureHeight;
|
||||
|
||||
bool needsUpdate = _leftTexture == null || _rightTexture == null ||
|
||||
_leftTexture.width != eyeWidth || _leftTexture.height != eyeHeight;
|
||||
|
||||
if (!needsUpdate) return;
|
||||
|
||||
if (_leftTexture != null) _leftTexture.Release();
|
||||
if (_rightTexture != null) _rightTexture.Release();
|
||||
|
||||
_leftTexture = new RenderTexture(eyeWidth, eyeHeight, 24, RenderTextureFormat.ARGBHalf);
|
||||
_rightTexture = new RenderTexture(eyeWidth, eyeHeight, 24, RenderTextureFormat.ARGBHalf);
|
||||
}
|
||||
|
||||
private void RenderEyePair()
|
||||
{
|
||||
_shaderGlobalBuffer.Clear();
|
||||
_shaderGlobalBuffer.SetGlobalVector(s_WorldSpaceCameraPos, _mainCamera.transform.position);
|
||||
|
||||
Camera realVRCamera = PlayerSetup.Instance.vrCam;
|
||||
|
||||
RenderingEye = Camera.MonoOrStereoscopicEye.Left;
|
||||
PlayerSetup.Instance.vrCam = _leftEye; // so we trigger head hiding
|
||||
RenderEye(_leftEye, _leftTexture, Camera.StereoscopicEye.Left);
|
||||
|
||||
RenderingEye = Camera.MonoOrStereoscopicEye.Right;
|
||||
PlayerSetup.Instance.vrCam = _rightEye; // so we trigger head hiding
|
||||
RenderEye(_rightEye, _rightTexture, Camera.StereoscopicEye.Right);
|
||||
|
||||
RenderingEye = Camera.MonoOrStereoscopicEye.Mono; // bleh
|
||||
PlayerSetup.Instance.vrCam = realVRCamera; // reset back to real cam
|
||||
|
||||
return;
|
||||
void RenderEye(Camera eyeCamera, RenderTexture targetTexture, Camera.StereoscopicEye eye)
|
||||
{
|
||||
eyeCamera.CopyFrom(_mainCamera);
|
||||
eyeCamera.targetTexture = targetTexture;
|
||||
eyeCamera.cullingMask = CachedCullingMask;
|
||||
eyeCamera.stereoTargetEye = StereoTargetEyeMask.None;
|
||||
eyeCamera.cullingMatrix = _mainCamera.cullingMatrix;
|
||||
eyeCamera.projectionMatrix = _mainCamera.GetStereoProjectionMatrix(eye);
|
||||
eyeCamera.worldToCameraMatrix = _mainCamera.GetStereoViewMatrix(eye);
|
||||
eyeCamera.Render();
|
||||
eyeCamera.ResetCullingMatrix();
|
||||
}
|
||||
}
|
||||
|
||||
private void OnRenderImage(RenderTexture source, RenderTexture destination)
|
||||
{
|
||||
if (!IsEnabled || !_isInitialized || _leftTexture == null || _rightTexture == null)
|
||||
{
|
||||
Graphics.Blit(source, destination);
|
||||
return;
|
||||
}
|
||||
|
||||
Graphics.CopyTexture(_leftTexture, 0, destination, 0);
|
||||
Graphics.CopyTexture(_rightTexture, 0, destination, 1);
|
||||
}
|
||||
#endregion
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue