diff options
Diffstat (limited to 'VRCSDK3Worlds/Assets/Udon/WrapperModules')
| -rw-r--r-- | VRCSDK3Worlds/Assets/Udon/WrapperModules/ExternVRCInstantiate.cs | 76 | ||||
| -rw-r--r-- | VRCSDK3Worlds/Assets/Udon/WrapperModules/ExternVRCInstantiate.cs.meta | 11 |
2 files changed, 87 insertions, 0 deletions
diff --git a/VRCSDK3Worlds/Assets/Udon/WrapperModules/ExternVRCInstantiate.cs b/VRCSDK3Worlds/Assets/Udon/WrapperModules/ExternVRCInstantiate.cs new file mode 100644 index 00000000..70d22e78 --- /dev/null +++ b/VRCSDK3Worlds/Assets/Udon/WrapperModules/ExternVRCInstantiate.cs @@ -0,0 +1,76 @@ +#if !VRC_CLIENT +using System.Collections.Generic; +using UnityEngine; +using VRC.Udon; +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; + +[assembly: UdonWrapperModule(typeof(ExternVRCInstantiate))] + +namespace VRC.Udon.Wrapper.Modules +{ + public class ExternVRCInstantiate : IUdonWrapperModule + { + public string Name => "VRCInstantiate"; + + private readonly Dictionary<string, int> _parameterCounts; + private readonly Dictionary<string, UdonExternDelegate> _functionDelegates; + private readonly IUdonSecurityBlacklist _blacklist; + + //Passing unused parameter for consistent construction + // ReSharper disable once UnusedParameter.Local + public ExternVRCInstantiate(IUdonComponentGetter componentGetter, IUdonSecurityBlacklist blacklist) + { + _blacklist = blacklist; + _parameterCounts = new Dictionary<string, int> + { + {"__Instantiate__UnityEngineGameObject__UnityEngineGameObject", 2}, + }; + + _functionDelegates = new Dictionary<string, UdonExternDelegate> + { + {"__Instantiate__UnityEngineGameObject__UnityEngineGameObject", __Instantiate__UnityEngineGameObject__UnityEngineGameObject} + }; + } + + public int GetExternFunctionParameterCount(string externFunctionSignature) + { + if(_parameterCounts.TryGetValue(externFunctionSignature, out int numParameters)) + { + return numParameters; + } + + throw new System.NotSupportedException($"Function '{externFunctionSignature}' is not implemented yet"); + } + + public UdonExternDelegate GetExternFunctionDelegate(string externFunctionSignature) + { + if(_functionDelegates.TryGetValue(externFunctionSignature, out UdonExternDelegate externDelegate)) + { + return externDelegate; + } + + throw new System.NotSupportedException($"Function '{externFunctionSignature}' is not implemented yet"); + } + + private void __Instantiate__UnityEngineGameObject__UnityEngineGameObject(IUdonHeap heap, uint[] parameterAddresses) + { + GameObject original = heap.GetHeapVariable<GameObject>(parameterAddresses[0]); + #if !UDON_DISABLE_SECURITY + _blacklist.FilterBlacklisted(ref original); + #endif + + GameObject clone = Object.Instantiate(original); + foreach(UdonBehaviour udonBehaviour in clone.GetComponentsInChildren<UdonBehaviour>(true)) + { + UdonManager.Instance.RegisterUdonBehaviour(udonBehaviour); + } + + heap.SetHeapVariable(parameterAddresses[1], clone); + } + } +} +#endif diff --git a/VRCSDK3Worlds/Assets/Udon/WrapperModules/ExternVRCInstantiate.cs.meta b/VRCSDK3Worlds/Assets/Udon/WrapperModules/ExternVRCInstantiate.cs.meta new file mode 100644 index 00000000..75748d88 --- /dev/null +++ b/VRCSDK3Worlds/Assets/Udon/WrapperModules/ExternVRCInstantiate.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: f6cfa3d8ec4f885468d17f5b023d2529 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: |