Files
SVSimServer/SVSim.BattleEngine/Engine/Wizard/QrCamera.cs
gamer147 0455ff649e feat(battle-engine): EffectType full enum + collection/card/vfx extension copies
Replaces partial EffectMgr.EffectType with all 226 decomp values; copies the
IsNotNullOrEmpty/EquelsID/FindFromCardId/GetAllFuncVfxResults extension files +
UI extensions; adds Renderer/MeshFilter shared-material/mesh/sortingOrder. Compile
loop then closed the revealed deps (3242 files). 9.1k -> 18 errors.
2026-06-05 20:38:56 -04:00

321 lines
9.7 KiB
C#

using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using Cute;
using SFB;
using UnityEngine;
namespace Wizard;
public class QrCamera : MonoBehaviour
{
private enum Mode
{
None,
Camera,
CameraRoll
}
[SerializeField]
private GameObject _cameraRoot;
[SerializeField]
private UITexture _halfTransparentTexture;
[SerializeField]
private UITexture _backGroundTexture;
[SerializeField]
private UITexture _cameraTexture;
[SerializeField]
private UISprite _blueFrameTexture;
[SerializeField]
private UITexture _cameraRollTexture;
private string _qrCodeCameraText;
[SerializeField]
private UIButton _backButton;
[SerializeField]
private UILabel _descriptionTextLabel;
private WebCamTexture _webCamTexture;
private Action _qrScanSuccessee;
private Action<string> _qrScanFailed;
private GameObject _qrCameraObject;
private const float DESCRIPTION_TEXT_OFFSET = 30f;
private ScreenOrientation _preScreenOrientation = ScreenOrientation.LandscapeLeft;
private List<string> _resourcePathList = new List<string>();
private const string HALF_TRANSPARENT_TEXTURE_PATH = "512black_82transparent";
private bool loadCameraRollImageCalled;
private CardMaster.CardMasterId _cardMasterId = CardMaster.CardMasterId.Default;
private bool webCameraSetSuccess;
private Mode _currentMode;
public UIButton backButton
{
get
{
return _backButton;
}
private set
{
_backButton = value;
}
}
private void Awake()
{
_cameraRoot.gameObject.SetActive(value: false);
}
public void SetCallBacks(Action qrScanSuccessee, Action<string> qrScanFailed)
{
_qrScanSuccessee = qrScanSuccessee;
_qrScanFailed = qrScanFailed;
}
public IEnumerator StartQRCamera(GameObject qrCameraObject, CardMaster.CardMasterId cardMasterId, Action onComplete, Action onFailed)
{
SetupWebCam();
_cardMasterId = cardMasterId;
if (!webCameraSetSuccess)
{
onFailed.Call();
yield break;
}
_cameraRoot.gameObject.SetActive(value: true);
_qrCameraObject = qrCameraObject;
_preScreenOrientation = Screen.orientation;
if (_preScreenOrientation == ScreenOrientation.LandscapeRight)
{
Vector3 localScale = _cameraTexture.transform.localScale;
localScale.x = 0f - localScale.x;
localScale.y = 0f - localScale.y;
_cameraTexture.transform.localScale = localScale;
}
_currentMode = Mode.Camera;
StartCoroutine(PlayCamera());
onComplete.Call();
}
public void StartGetQRCodeFromImageFile(GameObject qrCameraObject, CardMaster.CardMasterId cardMasterId)
{
_cameraRollTexture.gameObject.SetActive(value: true);
_cardMasterId = cardMasterId;
_qrCameraObject = qrCameraObject;
_currentMode = Mode.CameraRoll;
ExtensionFilter[] extensions = new ExtensionFilter[1]
{
new ExtensionFilter("Image Files", "png", "jpg", "jpeg")
};
string[] array = StandaloneFileBrowser.OpenFilePanel(Data.SystemText.Get("Card_0271"), "", extensions, multiselect: false);
if (array.Length != 0 && !string.IsNullOrEmpty(array[0]))
{
LoadCameraRollImage(array[0]);
}
else
{
UnityEngine.Object.Destroy(_qrCameraObject);
}
}
public void StopQRCamera()
{
_cameraRoot.gameObject.SetActive(value: false);
_currentMode = Mode.None;
Toolbox.ResourcesManager.RemoveAssetGroup(_resourcePathList);
_resourcePathList.Clear();
StopCamera();
}
private void Update()
{
if (_currentMode != Mode.Camera || !(_webCamTexture != null) || !_webCamTexture.isPlaying)
{
return;
}
if (_preScreenOrientation != Screen.orientation)
{
ChangeCameraTextrueDirection();
}
_qrCodeCameraText = QRCodeUtility.DecodeContentText(_webCamTexture);
if (!string.IsNullOrEmpty(_qrCodeCameraText))
{
StopCamera();
if (QRCodeUtility.SetDeckFromQRCodeText(_qrCodeCameraText, _cardMasterId))
{
_qrScanSuccessee.Call();
}
else
{
_qrScanFailed.Call(Data.SystemText.Get("Card_0267"));
}
UnityEngine.Object.Destroy(_qrCameraObject);
}
}
private void ChangeCameraTextrueDirection()
{
switch (Screen.orientation)
{
case ScreenOrientation.LandscapeLeft:
{
_preScreenOrientation = Screen.orientation;
Vector3 localScale2 = _cameraTexture.transform.localScale;
localScale2.x = 0f - localScale2.x;
localScale2.y = 0f - localScale2.y;
_cameraTexture.transform.localScale = localScale2;
break;
}
case ScreenOrientation.LandscapeRight:
{
_preScreenOrientation = Screen.orientation;
Vector3 localScale = _cameraTexture.transform.localScale;
localScale.x = 0f - localScale.x;
localScale.y = 0f - localScale.y;
_cameraTexture.transform.localScale = localScale;
break;
}
}
}
private void SetupWebCam()
{
ResourcesManager resMgr = Toolbox.ResourcesManager;
_resourcePathList.Add(resMgr.GetAssetTypePath("512black_82transparent", ResourcesManager.AssetLoadPathType.UiOtherTexture));
UIManager.GetInstance().StartCoroutine(Toolbox.ResourcesManager.LoadAssetGroupAsync(_resourcePathList, delegate
{
_halfTransparentTexture.mainTexture = resMgr.LoadObject(resMgr.GetAssetTypePath("512black_82transparent", ResourcesManager.AssetLoadPathType.UiOtherTexture, isfetch: true)) as Texture;
}));
WebCamDevice[] devices = WebCamTexture.devices;
if (devices != null && devices.Length != 0)
{
float num = (float)Screen.width / (float)Screen.height;
if (num != 1.7777778f)
{
float aspectRatio = _cameraTexture.aspectRatio;
float num2 = ((num < 1.7777778f) ? 1f : (num / aspectRatio));
float num3 = ((num < 1.7777778f) ? (aspectRatio / num) : 1f);
_halfTransparentTexture.SetDimensions(Mathf.CeilToInt((float)_halfTransparentTexture.width * num2), Mathf.CeilToInt((float)_halfTransparentTexture.height * num3));
_backGroundTexture.SetDimensions(Mathf.CeilToInt(_halfTransparentTexture.width), Mathf.CeilToInt(_halfTransparentTexture.height));
}
_webCamTexture = new WebCamTexture(devices[0].name, Screen.width, Screen.height, 30);
webCameraSetSuccess = true;
}
else
{
webCameraSetSuccess = false;
}
}
private IEnumerator PlayCamera()
{
if (!(_webCamTexture == null) && !_webCamTexture.isPlaying)
{
_halfTransparentTexture.ResizeCollider();
_backGroundTexture.ResizeCollider();
_cameraTexture.mainTexture = _webCamTexture;
_descriptionTextLabel.gameObject.SetActive(value: false);
_blueFrameTexture.gameObject.SetActive(value: false);
_cameraTexture.gameObject.SetActive(value: false);
_halfTransparentTexture.gameObject.SetActive(value: false);
_webCamTexture.Play();
while (_webCamTexture.width <= 16 && _webCamTexture.height <= 16)
{
yield return null;
}
float num = (float)_halfTransparentTexture.width / (float)_halfTransparentTexture.height;
float num2 = (float)_webCamTexture.width / (float)_webCamTexture.height;
if (num > num2)
{
_cameraTexture.SetDimensions(Mathf.CeilToInt((float)_halfTransparentTexture.height / (float)_webCamTexture.height * (float)_webCamTexture.width), _halfTransparentTexture.height);
}
else if (Mathf.Approximately(num, num2))
{
_cameraTexture.SetDimensions(_halfTransparentTexture.width, _halfTransparentTexture.height);
}
else
{
_cameraTexture.SetDimensions(_halfTransparentTexture.width, Mathf.CeilToInt((float)_halfTransparentTexture.width / (float)_webCamTexture.width * (float)_webCamTexture.height));
}
_cameraTexture.SetDimensions(Mathf.CeilToInt((float)_cameraTexture.width * 0.8f), Mathf.CeilToInt((float)_cameraTexture.height * 0.8f));
int num3 = Mathf.FloorToInt((float)Mathf.Min(_halfTransparentTexture.width, _halfTransparentTexture.height) * 0.5f);
_blueFrameTexture.SetDimensions(num3, num3);
_blueFrameTexture.gameObject.SetActive(value: true);
Vector3 localPosition = _descriptionTextLabel.transform.localPosition;
localPosition.y = (float)num3 * 0.5f;
localPosition.y += 30f;
_descriptionTextLabel.transform.localPosition = localPosition;
_descriptionTextLabel.gameObject.SetActive(value: true);
float num4 = (float)Screen.width / (float)Screen.height;
Rect uvRect = default(Rect);
if (num4 > 1f)
{
uvRect.height = 1.359375f;
uvRect.width = uvRect.height * num4;
uvRect.x = (1f - uvRect.width) * 0.5f;
uvRect.y = (1f - uvRect.height) * 0.5f;
}
else
{
uvRect.width = 1.359375f;
uvRect.height = uvRect.width / num4;
uvRect.x = (1f - uvRect.width) * 0.5f;
uvRect.y = (1f - uvRect.height) * 0.5f;
}
_halfTransparentTexture.uvRect = uvRect;
_halfTransparentTexture.gameObject.SetActive(value: true);
yield return null;
_cameraTexture.gameObject.SetActive(value: true);
}
}
private void StopCamera()
{
if (!(_webCamTexture == null) && _webCamTexture.isPlaying)
{
_webCamTexture.Stop();
}
}
private void LoadCameraRollImage(string path)
{
if (!loadCameraRollImageCalled)
{
loadCameraRollImageCalled = true;
byte[] data = File.ReadAllBytes(path);
Texture2D texture2D = new Texture2D(2, 2);
texture2D.LoadImage(data);
_qrCodeCameraText = QRCodeUtility.DecodeContentText(texture2D.GetPixels32(), texture2D.width, texture2D.height, isFromCamera: false);
bool flag = false;
if (!string.IsNullOrEmpty(_qrCodeCameraText) && QRCodeUtility.SetDeckFromQRCodeText(_qrCodeCameraText, _cardMasterId))
{
_qrScanSuccessee.Call();
flag = true;
}
if (!flag)
{
string arg = ((!string.IsNullOrEmpty(_qrCodeCameraText)) ? Data.SystemText.Get("Card_0267") : Data.SystemText.Get("Card_0268"));
_qrScanFailed.Call(arg);
}
UnityEngine.Object.Destroy(_qrCameraObject);
}
}
}