summaryrefslogtreecommitdiff
path: root/VRCSDK3Worlds/Assets/Udon/WrapperModules
diff options
context:
space:
mode:
Diffstat (limited to 'VRCSDK3Worlds/Assets/Udon/WrapperModules')
-rw-r--r--VRCSDK3Worlds/Assets/Udon/WrapperModules/ExternVRCInstantiate.cs76
-rw-r--r--VRCSDK3Worlds/Assets/Udon/WrapperModules/ExternVRCInstantiate.cs.meta11
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: