mirror of
https://git.aaro.dev/VRCBoard/vrcboard-udon.git
synced 2026-03-17 04:49:45 +00:00
Add new meta files and initial implementations for VRCBoard components and materials
This commit is contained in:
116
Components/VRCBoardBaseComponent.cs
Normal file
116
Components/VRCBoardBaseComponent.cs
Normal file
@@ -0,0 +1,116 @@
|
||||
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();
|
||||
|
||||
// ReSharper disable once InconsistentNaming
|
||||
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 _OnImageLoaded(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
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user