Runtime support for invocables in ScriptGroups

This also includes support for InvokeID

Change-Id: I5b59df166ea30b309b8dd9623825ac0e72d03856
diff --git a/rsScript.cpp b/rsScript.cpp
index 3059833..b89c96e 100644
--- a/rsScript.cpp
+++ b/rsScript.cpp
@@ -109,37 +109,25 @@
 }
 
 ScriptKernelID::ScriptKernelID(Context *rsc, Script *s, int slot, int sig)
-        : ObjectBase(rsc) {
-
-    mScript = s;
-    mSlot = slot;
+        : IDBase(rsc, s, slot) {
     mHasKernelInput = (sig & 1) != 0;
     mHasKernelOutput = (sig & 2) != 0;
 }
 
-ScriptKernelID::~ScriptKernelID() {
-
-}
-
-void ScriptKernelID::serialize(Context *rsc, OStream *stream) const {
-
-}
-
 RsA3DClassID ScriptKernelID::getClassId() const {
     return RS_A3D_CLASS_ID_SCRIPT_KERNEL_ID;
 }
 
-ScriptFieldID::ScriptFieldID(Context *rsc, Script *s, int slot) : ObjectBase(rsc) {
-    mScript = s;
-    mSlot = slot;
+ScriptInvokeID::ScriptInvokeID(Context *rsc, Script *s, int slot)
+    : IDBase(rsc, s, slot) {
 }
 
-ScriptFieldID::~ScriptFieldID() {
-
+RsA3DClassID ScriptInvokeID::getClassId() const {
+    return RS_A3D_CLASS_ID_SCRIPT_INVOKE_ID;
 }
 
-void ScriptFieldID::serialize(Context *rsc, OStream *stream) const {
-
+ScriptFieldID::ScriptFieldID(Context *rsc, Script *s, int slot) :
+    IDBase(rsc, s, slot) {
 }
 
 RsA3DClassID ScriptFieldID::getClassId() const {
@@ -156,6 +144,12 @@
     return kid;
 }
 
+RsScriptInvokeID rsi_ScriptInvokeIDCreate(Context *rsc, RsScript vs, uint32_t slot) {
+    ScriptInvokeID *iid = new ScriptInvokeID(rsc, (Script *)vs, slot);
+    iid->incUserRef();
+    return iid;
+}
+
 RsScriptFieldID rsi_ScriptFieldIDCreate(Context *rsc, RsScript vs, int slot) {
     ScriptFieldID *fid = new ScriptFieldID(rsc, (Script *)vs, slot);
     fid->incUserRef();