Files
2026-06-07 16:58:24 +01:00

367 lines
18 KiB
C#

using System;
using Unity.IL2CPP.CompilerServices;
using System.Collections.Generic;
using System.Diagnostics.CodeAnalysis;
using VRC.Udon.Common.Attributes;
using VRC.Udon.Common.Delegates;
using VRC.Udon.Common.Interfaces;
using VRC.Udon.Security.Interfaces;
using VRC.Udon.Wrapper.Modules;
#pragma warning disable CS0618 // Type or member is obsolete
// ReSharper disable NotAccessedField.Local
// ReSharper disable RedundantTypeArgumentsOfMethod
// ReSharper disable MemberCanBeMadeStatic.Local
// ReSharper disable BuiltInTypeReferenceStyle
// ReSharper disable InconsistentNaming
// ReSharper disable RedundantNameQualifier
// ReSharper disable StringLiteralTypo
[assembly: UdonWrapperModule(typeof(ExternUnityEngineInput))]
namespace VRC.Udon.Wrapper.Modules
{
[ExcludeFromCodeCoverage]
public class ExternUnityEngineInput : IUdonWrapperModule
{
public string Name => "UnityEngineInput";
public HashSet<Func<bool>> FreezeInputFuncs = new HashSet<Func<bool>>();
private enum FreezeInputState
{
NotFrozen = 0,
JustFrozen = 1,
Frozen = 2,
JustUnfrozen = 3
}
private int _lastFreezeInputCheckFrame = -1;
private FreezeInputState _lastFreezeState = FreezeInputState.NotFrozen;
private bool _lastShouldFreeze = false;
bool FreezeInput(out FreezeInputState frozenState) {
if (_lastFreezeInputCheckFrame == UnityEngine.Time.frameCount)
{
frozenState = _lastFreezeState;
return _lastShouldFreeze;
}
_lastFreezeInputCheckFrame = UnityEngine.Time.frameCount;
bool shouldFreeze = FreezeInputFuncs.Count > 0; //if no FreezeInputFuncs, should never freeze
foreach (var func in FreezeInputFuncs) //return false if ANY func returns false
{
if (!func())
{
shouldFreeze = false;
break;
}
}
if (shouldFreeze && !_lastShouldFreeze)
_lastFreezeState = FreezeInputState.JustFrozen;
else if (!shouldFreeze && _lastShouldFreeze)
_lastFreezeState = FreezeInputState.JustUnfrozen;
else if (shouldFreeze)
_lastFreezeState = FreezeInputState.Frozen;
else
_lastFreezeState = FreezeInputState.NotFrozen;
_lastShouldFreeze = shouldFreeze;
frozenState = _lastFreezeState;
return shouldFreeze;
}
private readonly Lazy<Dictionary<string, int>> _parameterCounts;
private readonly Lazy<Dictionary<string, UdonExternDelegate>> _functionDelegates;
private readonly IUdonComponentGetter _componentGetter;
private readonly IUdonSecurityFilter<UnityEngine.Object> _filter;
public ExternUnityEngineInput(IUdonComponentGetter componentGetter, IUdonSecurityFilter<UnityEngine.Object> filter)
{
_componentGetter = componentGetter;
_filter = filter;
_parameterCounts = new Lazy<Dictionary<string, int>>(() => new Dictionary<string, int>
{
{"__Equals__SystemObject__SystemBoolean", 3},
{"__GetAxisRaw__SystemString__SystemSingle", 2},
{"__GetAxis__SystemString__SystemSingle", 2},
{"__GetButtonDown__SystemString__SystemBoolean", 2},
{"__GetButtonUp__SystemString__SystemBoolean", 2},
{"__GetButton__SystemString__SystemBoolean", 2},
{"__GetHashCode__SystemInt32", 2},
{"__GetJoystickNames__SystemStringArray", 1},
{"__GetKeyDown__SystemString__SystemBoolean", 2},
{"__GetKeyDown__UnityEngineKeyCode__SystemBoolean", 2},
{"__GetKeyUp__SystemString__SystemBoolean", 2},
{"__GetKeyUp__UnityEngineKeyCode__SystemBoolean", 2},
{"__GetKey__SystemString__SystemBoolean", 2},
{"__GetKey__UnityEngineKeyCode__SystemBoolean", 2},
{"__GetMouseButtonDown__SystemInt32__SystemBoolean", 2},
{"__GetMouseButtonUp__SystemInt32__SystemBoolean", 2},
{"__GetMouseButton__SystemInt32__SystemBoolean", 2},
{"__GetType__SystemType", 2},
{"__ToString__SystemString", 2},
{"__ctor____UnityEngineInput", 1},
{"__get_anyKeyDown__SystemBoolean", 1},
{"__get_anyKey__SystemBoolean", 1},
{"__get_imeIsSelected__SystemBoolean", 1},
{"__get_inputString__SystemString", 1},
});
_functionDelegates = new Lazy<Dictionary<string, UdonExternDelegate>>(() => new Dictionary<string, UdonExternDelegate>()
{
{"__Equals__SystemObject__SystemBoolean", __Equals__SystemObject__SystemBoolean},
{"__GetAxisRaw__SystemString__SystemSingle", __GetAxisRaw__SystemString__SystemSingle},
{"__GetAxis__SystemString__SystemSingle", __GetAxis__SystemString__SystemSingle},
{"__GetButtonDown__SystemString__SystemBoolean", __GetButtonDown__SystemString__SystemBoolean},
{"__GetButtonUp__SystemString__SystemBoolean", __GetButtonUp__SystemString__SystemBoolean},
{"__GetButton__SystemString__SystemBoolean", __GetButton__SystemString__SystemBoolean},
{"__GetHashCode__SystemInt32", __GetHashCode__SystemInt32},
{"__GetJoystickNames__SystemStringArray", __GetJoystickNames__SystemStringArray},
{"__GetKeyDown__SystemString__SystemBoolean", __GetKeyDown__SystemString__SystemBoolean},
{"__GetKeyDown__UnityEngineKeyCode__SystemBoolean", __GetKeyDown__UnityEngineKeyCode__SystemBoolean},
{"__GetKeyUp__SystemString__SystemBoolean", __GetKeyUp__SystemString__SystemBoolean},
{"__GetKeyUp__UnityEngineKeyCode__SystemBoolean", __GetKeyUp__UnityEngineKeyCode__SystemBoolean},
{"__GetKey__SystemString__SystemBoolean", __GetKey__SystemString__SystemBoolean},
{"__GetKey__UnityEngineKeyCode__SystemBoolean", __GetKey__UnityEngineKeyCode__SystemBoolean},
{"__GetMouseButtonDown__SystemInt32__SystemBoolean", __GetMouseButtonDown__SystemInt32__SystemBoolean},
{"__GetMouseButtonUp__SystemInt32__SystemBoolean", __GetMouseButtonUp__SystemInt32__SystemBoolean},
{"__GetMouseButton__SystemInt32__SystemBoolean", __GetMouseButton__SystemInt32__SystemBoolean},
{"__GetType__SystemType", __GetType__SystemType},
{"__ToString__SystemString", __ToString__SystemString},
{"__ctor____UnityEngineInput", __ctor____UnityEngineInput},
{"__get_anyKeyDown__SystemBoolean", __get_anyKeyDown__SystemBoolean},
{"__get_anyKey__SystemBoolean", __get_anyKey__SystemBoolean},
{"__get_imeIsSelected__SystemBoolean", __get_imeIsSelected__SystemBoolean},
{"__get_inputString__SystemString", __get_inputString__SystemString},
});
}
public int GetExternFunctionParameterCount(string externFunctionSignature)
{
if(_parameterCounts.Value.TryGetValue(externFunctionSignature, out int numParameters))
{
return numParameters;
}
throw new System.NotSupportedException($"Function '{externFunctionSignature}' is not implemented yet");
}
public UdonExternDelegate GetExternFunctionDelegate(string externFunctionSignature)
{
if(_functionDelegates.Value.TryGetValue(externFunctionSignature, out UdonExternDelegate externDelegate))
{
return externDelegate;
}
throw new System.NotSupportedException($"Function '{externFunctionSignature}' is not implemented yet");
}
private void __Equals__SystemObject__SystemBoolean(IUdonHeap heap, Span<uint> parameterAddresses)
{
System.Object var_0 = heap.GetHeapVariable<System.Object>(parameterAddresses[0]);
#if !UDON_DISABLE_SECURITY
_filter.ApplyFilter(ref var_0);
#endif
System.Object var_1 = heap.GetHeapVariable<System.Object>(parameterAddresses[1]);
#if !UDON_DISABLE_SECURITY
_filter.ApplyFilter(ref var_1);
#endif
System.Boolean var_2 = var_0.Equals(var_1);
heap.SetHeapVariable(parameterAddresses[2], var_2);
}
private void __GetAxisRaw__SystemString__SystemSingle(IUdonHeap heap, Span<uint> parameterAddresses)
{
System.String var_0 = heap.GetHeapVariable<System.String>(parameterAddresses[0]);
System.Single var_1 = FreezeInput(out _) ? 0f : UnityEngine.Input.GetAxisRaw(var_0);
heap.SetHeapVariable(parameterAddresses[1], var_1);
}
private void __GetAxis__SystemString__SystemSingle(IUdonHeap heap, Span<uint> parameterAddresses)
{
System.String var_0 = heap.GetHeapVariable<System.String>(parameterAddresses[0]);
System.Single var_1 = FreezeInput(out _) ? 0f : UnityEngine.Input.GetAxis(var_0);
heap.SetHeapVariable(parameterAddresses[1], var_1);
}
private void __GetButtonDown__SystemString__SystemBoolean(IUdonHeap heap, Span<uint> parameterAddresses)
{
System.String var_0 = heap.GetHeapVariable<System.String>(parameterAddresses[0]);
System.Boolean var_1 = FreezeInput(out var freezeState) ? false : UnityEngine.Input.GetButtonDown(var_0) || (freezeState == FreezeInputState.JustUnfrozen && UnityEngine.Input.GetButton(var_0));
heap.SetHeapVariable(parameterAddresses[1], var_1);
}
private void __GetButtonUp__SystemString__SystemBoolean(IUdonHeap heap, Span<uint> parameterAddresses)
{
System.String var_0 = heap.GetHeapVariable<System.String>(parameterAddresses[0]);
System.Boolean var_1 = FreezeInput(out var freezeState) ? freezeState == FreezeInputState.JustFrozen && (UnityEngine.Input.GetButton(var_0) || UnityEngine.Input.GetButtonUp(var_0)) : UnityEngine.Input.GetButtonUp(var_0);
heap.SetHeapVariable(parameterAddresses[1], var_1);
}
private void __GetButton__SystemString__SystemBoolean(IUdonHeap heap, Span<uint> parameterAddresses)
{
System.String var_0 = heap.GetHeapVariable<System.String>(parameterAddresses[0]);
System.Boolean var_1 = FreezeInput(out _) ? false : UnityEngine.Input.GetButton(var_0);
heap.SetHeapVariable(parameterAddresses[1], var_1);
}
private void __GetHashCode__SystemInt32(IUdonHeap heap, Span<uint> parameterAddresses)
{
System.Object var_0 = heap.GetHeapVariable<System.Object>(parameterAddresses[0]);
#if !UDON_DISABLE_SECURITY
_filter.ApplyFilter(ref var_0);
#endif
System.Int32 var_1 = var_0.GetHashCode();
heap.SetHeapVariable(parameterAddresses[1], var_1);
}
private void __GetJoystickNames__SystemStringArray(IUdonHeap heap, Span<uint> parameterAddresses)
{
System.String[] var_0 = UnityEngine.Input.GetJoystickNames();
heap.SetHeapVariable(parameterAddresses[0], var_0);
}
private void __GetKeyDown__SystemString__SystemBoolean(IUdonHeap heap, Span<uint> parameterAddresses)
{
System.String var_0 = heap.GetHeapVariable<System.String>(parameterAddresses[0]);
System.Boolean var_1 = FreezeInput(out var freezeState) ? false : UnityEngine.Input.GetKeyDown(var_0) || (freezeState == FreezeInputState.JustUnfrozen && UnityEngine.Input.GetKey(var_0));
heap.SetHeapVariable(parameterAddresses[1], var_1);
}
private void __GetKeyDown__UnityEngineKeyCode__SystemBoolean(IUdonHeap heap, Span<uint> parameterAddresses)
{
UnityEngine.KeyCode var_0 = heap.GetHeapVariable<UnityEngine.KeyCode>(parameterAddresses[0]);
System.Boolean var_1 = FreezeInput(out var freezeState) ? false : UnityEngine.Input.GetKeyDown(var_0) || (freezeState == FreezeInputState.JustUnfrozen && UnityEngine.Input.GetKey(var_0));
heap.SetHeapVariable(parameterAddresses[1], var_1);
}
private void __GetKeyUp__SystemString__SystemBoolean(IUdonHeap heap, Span<uint> parameterAddresses)
{
System.String var_0 = heap.GetHeapVariable<System.String>(parameterAddresses[0]);
System.Boolean var_1 = FreezeInput(out var freezeState) ? freezeState == FreezeInputState.JustFrozen && (UnityEngine.Input.GetKey(var_0) || UnityEngine.Input.GetKeyUp(var_0)) : UnityEngine.Input.GetKeyUp(var_0);
heap.SetHeapVariable(parameterAddresses[1], var_1);
}
private void __GetKeyUp__UnityEngineKeyCode__SystemBoolean(IUdonHeap heap, Span<uint> parameterAddresses)
{
UnityEngine.KeyCode var_0 = heap.GetHeapVariable<UnityEngine.KeyCode>(parameterAddresses[0]);
System.Boolean var_1 = FreezeInput(out var freezeState) ? freezeState == FreezeInputState.JustFrozen && (UnityEngine.Input.GetKey(var_0) || UnityEngine.Input.GetKeyUp(var_0)) : UnityEngine.Input.GetKeyUp(var_0);
heap.SetHeapVariable(parameterAddresses[1], var_1);
}
private void __GetKey__SystemString__SystemBoolean(IUdonHeap heap, Span<uint> parameterAddresses)
{
System.String var_0 = heap.GetHeapVariable<System.String>(parameterAddresses[0]);
System.Boolean var_1 = FreezeInput(out _) ? false : UnityEngine.Input.GetKey(var_0);
heap.SetHeapVariable(parameterAddresses[1], var_1);
}
private void __GetKey__UnityEngineKeyCode__SystemBoolean(IUdonHeap heap, Span<uint> parameterAddresses)
{
UnityEngine.KeyCode var_0 = heap.GetHeapVariable<UnityEngine.KeyCode>(parameterAddresses[0]);
System.Boolean var_1 = FreezeInput(out _) ? false : UnityEngine.Input.GetKey(var_0);
heap.SetHeapVariable(parameterAddresses[1], var_1);
}
private void __GetMouseButtonDown__SystemInt32__SystemBoolean(IUdonHeap heap, Span<uint> parameterAddresses)
{
System.Int32 var_0 = heap.GetHeapVariable<System.Int32>(parameterAddresses[0]);
System.Boolean var_1 = FreezeInput(out var freezeState) ? false : UnityEngine.Input.GetMouseButtonDown(var_0) || (freezeState == FreezeInputState.JustUnfrozen && UnityEngine.Input.GetMouseButton(var_0));
heap.SetHeapVariable(parameterAddresses[1], var_1);
}
private void __GetMouseButtonUp__SystemInt32__SystemBoolean(IUdonHeap heap, Span<uint> parameterAddresses)
{
System.Int32 var_0 = heap.GetHeapVariable<System.Int32>(parameterAddresses[0]);
System.Boolean var_1 = FreezeInput(out var freezeState) ? freezeState == FreezeInputState.JustFrozen && (UnityEngine.Input.GetMouseButton(var_0) || UnityEngine.Input.GetMouseButtonUp(var_0)) : UnityEngine.Input.GetMouseButtonUp(var_0);
heap.SetHeapVariable(parameterAddresses[1], var_1);
}
private void __GetMouseButton__SystemInt32__SystemBoolean(IUdonHeap heap, Span<uint> parameterAddresses)
{
System.Int32 var_0 = heap.GetHeapVariable<System.Int32>(parameterAddresses[0]);
System.Boolean var_1 = FreezeInput(out _) ? false : UnityEngine.Input.GetMouseButton(var_0);
heap.SetHeapVariable(parameterAddresses[1], var_1);
}
private void __GetType__SystemType(IUdonHeap heap, Span<uint> parameterAddresses)
{
System.Object var_0 = heap.GetHeapVariable<System.Object>(parameterAddresses[0]);
#if !UDON_DISABLE_SECURITY
_filter.ApplyFilter(ref var_0);
#endif
System.Type var_1 = var_0.GetType();
heap.SetHeapVariable(parameterAddresses[1], var_1);
}
private void __ToString__SystemString(IUdonHeap heap, Span<uint> parameterAddresses)
{
System.Object var_0 = heap.GetHeapVariable<System.Object>(parameterAddresses[0]);
#if !UDON_DISABLE_SECURITY
_filter.ApplyFilter(ref var_0);
#endif
System.String var_1 = var_0.ToString();
heap.SetHeapVariable(parameterAddresses[1], var_1);
}
private void __ctor____UnityEngineInput(IUdonHeap heap, Span<uint> parameterAddresses)
{
UnityEngine.Input var_0 = new UnityEngine.Input();
heap.SetHeapVariable(parameterAddresses[0], var_0);
}
private void __get_anyKeyDown__SystemBoolean(IUdonHeap heap, Span<uint> parameterAddresses)
{
System.Boolean var_0 = FreezeInput(out var freezeState) ? false : FreezeInput(out _) ? false : UnityEngine.Input.anyKeyDown || (freezeState == FreezeInputState.JustUnfrozen && FreezeInput(out _) ? false : UnityEngine.Input.anyKey);
heap.SetHeapVariable(parameterAddresses[0], var_0);
}
private void __get_anyKey__SystemBoolean(IUdonHeap heap, Span<uint> parameterAddresses)
{
System.Boolean var_0 = FreezeInput(out _) ? false : UnityEngine.Input.anyKey;
heap.SetHeapVariable(parameterAddresses[0], var_0);
}
private void __get_imeIsSelected__SystemBoolean(IUdonHeap heap, Span<uint> parameterAddresses)
{
System.Boolean var_0 = UnityEngine.Input.imeIsSelected;
heap.SetHeapVariable(parameterAddresses[0], var_0);
}
private void __get_inputString__SystemString(IUdonHeap heap, Span<uint> parameterAddresses)
{
System.String var_0 = FreezeInput(out _) ? "" : UnityEngine.Input.inputString;
heap.SetHeapVariable(parameterAddresses[0], var_0);
}
}
}