mirror of https://github.com/hykilpikonna/AquaDX
79 lines
2.8 KiB
C#
79 lines
2.8 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Collections;
|
|
using System.Linq;
|
|
using HarmonyLib;
|
|
using Manager;
|
|
using MelonLoader;
|
|
using UnityEngine;
|
|
|
|
namespace AquaMai.CustomCameraId;
|
|
|
|
public class Enable
|
|
{
|
|
private static readonly Dictionary<string, string> CameraTypeMap = new Dictionary<string, string>
|
|
{
|
|
["LeftQrCamera"] = "QRLeft",
|
|
["RightQrCamera"] = "QRRight",
|
|
["PhotoCamera"] = "Photo",
|
|
["ChimeCamera"] = "Chime",
|
|
};
|
|
|
|
[HarmonyPrefix]
|
|
[HarmonyPatch(typeof(CameraManager), "CameraInitialize")]
|
|
public static bool CameraInitialize(CameraManager __instance, ref IEnumerator __result)
|
|
{
|
|
__result = CameraInitialize(__instance);
|
|
return false;
|
|
}
|
|
|
|
private static IEnumerator CameraInitialize(CameraManager __instance)
|
|
{
|
|
var textureCache = new WebCamTexture[WebCamTexture.devices.Length];
|
|
SortedDictionary<CameraManager.CameraTypeEnum, WebCamTexture> webCamTextures = [];
|
|
foreach (var (configEntry, cameraTypeName) in CameraTypeMap)
|
|
{
|
|
int deviceId = Traverse.Create(AquaMai.AppConfig.CustomCameraId).Field(configEntry).GetValue<int>();
|
|
if (deviceId < 0 || deviceId >= WebCamTexture.devices.Length)
|
|
{
|
|
MelonLogger.Warning($"[CustomCameraId] Ignoring custom camera {configEntry}: camera ID {deviceId} out of range");
|
|
continue;
|
|
}
|
|
|
|
if (!Enum.TryParse<CameraManager.CameraTypeEnum>(cameraTypeName, out var cameraType))
|
|
{
|
|
MelonLogger.Warning($"[CustomCameraId] Ignoring custom camera {configEntry}: camera type {cameraTypeName} not present");
|
|
continue;
|
|
}
|
|
|
|
if (textureCache[deviceId] != null)
|
|
{
|
|
webCamTextures[cameraType] = textureCache[deviceId];
|
|
}
|
|
else
|
|
{
|
|
var webCamTexture = new WebCamTexture(WebCamTexture.devices[deviceId].name);
|
|
webCamTextures[cameraType] = webCamTexture;
|
|
textureCache[deviceId] = webCamTexture;
|
|
}
|
|
}
|
|
|
|
int textureCount = webCamTextures.Count;
|
|
__instance.isAvailableCamera = new bool[textureCount];
|
|
__instance.cameraProcMode = new CameraManager.CameraProcEnum[textureCount];
|
|
|
|
int textureIndex = 0;
|
|
foreach (var (cameraType, webCamTexture) in webCamTextures)
|
|
{
|
|
__instance.isAvailableCamera[textureIndex] = true;
|
|
__instance.cameraProcMode[textureIndex] = CameraManager.CameraProcEnum.Good;
|
|
CameraManager.DeviceId[(int)cameraType] = textureIndex;
|
|
textureIndex++;
|
|
}
|
|
Traverse.Create(__instance).Field("_webcamtex").SetValue(webCamTextures.Values.ToArray());
|
|
|
|
CameraManager.IsReady = true;
|
|
yield break;
|
|
}
|
|
}
|