Files
VRCBoard-Udon/Components/VRCBoardBaseComponent.cs

116 lines
3.7 KiB
C#

using UdonSharp;
using UnityEngine;
using VRC.SDK3.Data;
using UnityEditor;
namespace VRCBoard.Components
{
[UdonBehaviourSyncMode(BehaviourSyncMode.None)]
public abstract class VRCBoardBaseComponent : UdonSharpBehaviour
{
[HideInInspector] public VRCBoardManager manager;
protected abstract void OnRegister();
protected abstract void OnInitialize();
protected abstract void OnSupporterDataUpdate();
protected abstract void OnImageDataUpdate();
protected abstract void OnImageLoaded();
protected internal void _Register(VRCBoardManager _manager)
{
manager = _manager;
OnRegister();
}
private bool _imageInitialized;
private bool _dataInitialized;
private bool _initialized;
private void CheckInitialization()
{
if (_imageInitialized && _dataInitialized && !_initialized)
{
_initialized = true;
OnInitialize();
OnImageDataUpdate();
OnSupporterDataUpdate();
}
}
protected internal void _OnImageInfoUpdate()
{
if (_initialized) OnImageDataUpdate();
else
{
_imageInitialized = true;
CheckInitialization();
}
}
protected internal void _OnSupporterDataUpdate()
{
if (_initialized) OnSupporterDataUpdate();
else
{
_dataInitialized = true;
CheckInitialization();
}
}
protected internal void _OnAtlasImageLoaded(int atlasIndex = -1)
{
OnImageLoaded();
}
private DataDictionary GetImageIdInfo(string imageId) => manager._GetImageIdInfo(imageId);
internal bool GetImageAtlasTexture(string imageId, string uploader, out Texture2D texture,
out int position, out int size, out string type) {
return manager._GetImageAtlasTexture(imageId, uploader, out int atlasIndex, out texture, out position, out size,
out type);
}
internal string GetRandomUploader(string imageId)
{
DataDictionary imageInfo = GetImageIdInfo(imageId);
if (imageInfo == null) return null;
bool uploadsSuccess = imageInfo.TryGetValue("uploads", out DataToken uploadsToken);
if (!uploadsSuccess) return null;
if (uploadsToken.TokenType != TokenType.DataList) return null;
DataList uploads = uploadsToken.DataList;
if (uploads.Count == 0) return null;
int randomIndex = Random.Range(0, uploads.Count);
DataDictionary upload = uploads[randomIndex].DataDictionary;
if (upload == null) return null;
bool uploaderSuccess = upload.TryGetValue("a", out DataToken uploaderToken);
if (!uploaderSuccess) return null;
if (uploaderToken.TokenType != TokenType.String) return null;
return uploaderToken.String;
}
internal void RequestImageLoad(string imageId, string uploaderId = "")
{
manager._RequestImageLoad(imageId, uploaderId, this);
}
}
#if UNITY_EDITOR && !COMPILER_UDONSHARP
[CustomEditor(typeof(VRCBoardBaseComponent), true)]
public class VRCBoardBaseComponentEditor : Editor
{
public override void OnInspectorGUI()
{
if (Application.isPlaying)
{
EditorGUILayout.LabelField("Cannot edit a VRCBoard component while in play mode");
//return;
}
base.OnInspectorGUI();
}
}
#endif
}