*/}}
Browse Source

Able to run driver pages in object

YimingWu 3 months ago
parent
commit
65e74f3020
2 changed files with 27 additions and 2 deletions
  1. 24 0
      la_tns_kernel.c
  2. 3 2
      resources/la_tns_drivers.c

+ 24 - 0
la_tns_kernel.c

@@ -3870,6 +3870,14 @@ eval_inst_cleanup:
     ed->OverrideID=origid; ed->FillOutline=origoutline;
 }
 
+void tnsRunNode(tnsEvaluatedNode* en, char* func, tnsObject* root){
+    tnsObject* ob=root; // should be the same as en->Target.
+    for(laRackPage* rp=ob->Drivers->Pages.pFirst;rp;rp=rp->Item.pNext){
+        if(!rp->Eval.pFirst) continue;
+        laRunPage(rp, 1);
+    }
+}
+
 #ifdef LA_WITH_LUAJIT
 void tnsLuaEnsureNode(lua_State* L,int index,tnsObject* o);
 void tnsLuaRunNode(lua_State* L, tnsEvaluatedNode* en, char* func, tnsObject* root);
@@ -3883,6 +3891,7 @@ void tnsEvaluateThisObject(tnsObject *o, tnsEvaluateData* ed){
             ed->Scene->CurrentParent=ed->Scene->CurrentChild; ed->Scene->CurrentChild=ed->Scene->CurrentParent->Children.pFirst;
         }
         if(o->Type==TNS_OBJECT_ROOT){ tnsEvaluatedNode* en=ed->Scene->CurrentChild;
+            tnsRunNode(en,"any",o);
 #ifdef LA_WITH_LUAJIT
             tnsLuaEnsureNode(ed->L,en->LuaID,o);
             tnsLuaRunNode(ed->L,en,"run",o);
@@ -3902,8 +3911,15 @@ void tnsEvaluateThisObject(tnsObject *o, tnsEvaluateData* ed){
     }
 }
 
+void tnsClearDriversEval(tnsObject* o){
+    if(!o->Drivers) return;
+    for(laRackPage* rp=o->Drivers->Pages.pFirst;rp;rp=rp->Item.pNext){
+        while(lstPopPointer(&rp->Eval)); while(lstPopPointer(&rp->AlwaysBranchers));
+    }
+}
 void tnsClearPlayDuplicate(tnsObject* o){
     if(!o || !o->PlayDuplicate) return;
+    tnsClearDriversEval(o);
     while(lstPopPointer(&o->PlayDuplicate->ChildObjects));
     for(laListItemPointer* lip=o->ChildObjects.pFirst;lip;lip=lip->pNext){
         tnsObject*co=lip->p; tnsClearPlayDuplicate(co);
@@ -3931,7 +3947,14 @@ void tnsClearPlayState(tnsObject* o){
     if(o->EvaluatedPlay.Commands) tnsFreeEvaluatedArray(&o->EvaluatedPlay);
     tnsFreeEvaluatedScene(&o->EvaluatedPlay);
 }
+void tnsEnsureDriversEval(tnsObject* o){
+    if(!o->Drivers) return;
+    for(laRackPage* rp=o->Drivers->Pages.pFirst;rp;rp=rp->Item.pNext){
+        laRebuildPageEval(rp);
+    }
+}
 tnsObject* tnsEnsurePlayDuplicate(tnsObject* o){
+    tnsEnsureDriversEval(o);
     if(o->Flags&TNS_OBJECT_FLAGS_PLAY_DUPLICATE) return o;
     if(o->PlayDuplicate) return o->PlayDuplicate;
     int obsize=tnsSizeOfObject(o);
@@ -4025,6 +4048,7 @@ void tnsLuaRunNode(lua_State* L, tnsEvaluatedNode* en, char* func, tnsObject* ro
 }
 
 #endif //luajit
+
 void tnsAddEvaluatedInstance(tnsEvaluateData* ed, tnsObject* ob, tnsDrawEvaluatedInstanceF Draw, int Layer, 
     int IsActive, int MeshSelectionType, int InstanceSelectionID){
     tnsEvaluatedInstance* ei;

+ 3 - 2
resources/la_tns_drivers.c

@@ -41,10 +41,11 @@ int IDN_TransformVisit(tnsTransformNode* n, laNodeVisitInfo* vi){
 }
 int IDN_TransformEval(tnsTransformNode* n){
     if(!n->Target) return 0;
+    tnsObject* ob=n->Target; if(ob->PlayDuplicate){ ob=ob->PlayDuplicate; }
     if((!n->Mat->Source) || (n->Mat->Source->DataType!=(LA_PROP_FLOAT|LA_PROP_ARRAY)) || (n->Mat->Source->ArrLen!=16)){
-        tnsLoadIdentity44d(n->Target->DeltaTransform); tnsSelfMatrixChanged(n->Target, 1);
+        tnsLoadIdentity44d(ob->DeltaTransform); tnsSelfMatrixChanged(ob, 1);
     }else{
-        memcpy(n->Target->DeltaTransform, n->Mat->Source->Data, sizeof(tnsMatrix44d)); tnsSelfMatrixChanged(n->Target, 1);
+        memcpy(ob->DeltaTransform, n->Mat->Source->Data, sizeof(tnsMatrix44d)); tnsSelfMatrixChanged(ob, 1);
     }
     laNotifyInstanceUsers(n->Target);
     return 1;