|
@@ -3736,15 +3736,17 @@ void tnsEvaluateInstancerObject(tnsInstancer* o, tnsEvaluateData* ed){
|
|
int origid=ed->OverrideID; ed->OverrideID = o->Base.SelectID;
|
|
int origid=ed->OverrideID; ed->OverrideID = o->Base.SelectID;
|
|
tnsEvaluateEmptyObject(o,ed);
|
|
tnsEvaluateEmptyObject(o,ed);
|
|
int origoutline=ed->FillOutline; ed->FillOutline=0;
|
|
int origoutline=ed->FillOutline; ed->FillOutline=0;
|
|
- if(o->DefaultInstance){
|
|
+ if(o->Instance){
|
|
|
|
+ tnsObject* inst=o->Instance;
|
|
|
|
+ inst=tnsEnsurePlayDuplicate(inst);
|
|
tnsPushEvaluateMatrixWith(ed,o->Base.GlobalTransform);
|
|
tnsPushEvaluateMatrixWith(ed,o->Base.GlobalTransform);
|
|
- tnsEvaluateObjectTree(o->DefaultInstance, ed);
|
|
+ tnsEvaluateObjectTree(inst, ed, ed->SceneEvaluateMode);
|
|
tnsPopEvaluateMatrix(ed);
|
|
tnsPopEvaluateMatrix(ed);
|
|
}
|
|
}
|
|
ed->OverrideID=origid; ed->FillOutline=origoutline;
|
|
ed->OverrideID=origid; ed->FillOutline=origoutline;
|
|
}
|
|
}
|
|
void tnsEvaluateThisObject(tnsObject *o, tnsEvaluateData* ed){
|
|
void tnsEvaluateThisObject(tnsObject *o, tnsEvaluateData* ed){
|
|
- if(ed->EvaluateMode){ tnsEvaluateSyncNode(ed,o); }
|
|
+ if(ed->SceneEvaluateMode){ tnsEvaluateSyncNode(ed,o); }
|
|
if (!o->Show) return;
|
|
if (!o->Show) return;
|
|
switch (o->Type){
|
|
switch (o->Type){
|
|
case TNS_OBJECT_MESH: tnsEvaluateMeshObject(o, ed); break;
|
|
case TNS_OBJECT_MESH: tnsEvaluateMeshObject(o, ed); break;
|
|
@@ -3754,6 +3756,29 @@ void tnsEvaluateThisObject(tnsObject *o, tnsEvaluateData* ed){
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+tnsObject* tnsEnsurePlayDuplicate(tnsObject* o){
|
|
|
|
+ if(o->Flags&TNS_OBJECT_FLAGS_PLAY_DUPLICATE) return o;
|
|
|
|
+ if(o->PlayDuplicate) return o->PlayDuplicate;
|
|
|
|
+ int obsize=tnsSizeOfObject(o);
|
|
|
|
+ tnsObject* dup=memAcquireHyper(obsize);
|
|
|
|
+ memcpy(dup,o,obsize); o->PlayDuplicate=dup;
|
|
|
|
+ dup->ChildObjects.pFirst=dup->ChildObjects.pLast=0;
|
|
|
|
+ for(laListItemPointer* lip=o->ChildObjects.pFirst;lip;lip=lip->pNext){
|
|
|
|
+ tnsObject*co=lip->p; tnsEnsurePlayDuplicate(co);
|
|
|
|
+ lstAppendPointer(&dup->ChildObjects,co->PlayDuplicate);
|
|
|
|
+ co->PlayDuplicate->ParentObject=o->ParentObject?dup:0;
|
|
|
|
+ }
|
|
|
|
+ dup->Flags|=TNS_OBJECT_FLAGS_PLAY_DUPLICATE;
|
|
|
|
+ return o->PlayDuplicate;
|
|
|
|
+}
|
|
|
|
+void tnsFreePlayDuplicate(tnsObject* o){
|
|
|
|
+ for(laListItemPointer* lip=o->ChildObjects.pFirst;lip;lip=lip->pNext){
|
|
|
|
+ tnsFreePlayDuplicate(lip);
|
|
|
|
+ }
|
|
|
|
+ memFree(o->PlayDuplicate);
|
|
|
|
+ o->PlayDuplicate=0;
|
|
|
|
+}
|
|
|
|
+
|
|
void tnsAddEvaluatedInstance(tnsEvaluateData* ed, tnsObject* ob, tnsDrawEvaluatedInstanceF Draw, int Layer,
|
|
void tnsAddEvaluatedInstance(tnsEvaluateData* ed, tnsObject* ob, tnsDrawEvaluatedInstanceF Draw, int Layer,
|
|
int IsActive, int MeshSelectionType, int InstanceSelectionID){
|
|
int IsActive, int MeshSelectionType, int InstanceSelectionID){
|
|
tnsEvaluatedInstance* ei;
|
|
tnsEvaluatedInstance* ei;
|
|
@@ -3839,10 +3864,11 @@ void tnsPrintEvaluatedNode(tnsEvaluatedNode* en,int level){
|
|
}
|
|
}
|
|
if(level==0){printf("\n");}
|
|
if(level==0){printf("\n");}
|
|
}
|
|
}
|
|
-void tnsEvaluateObjectTree(tnsObject* from, tnsEvaluateData* UseED){
|
|
+void tnsEvaluateObjectTree(tnsObject* from, tnsEvaluateData* UseED, int EvaluatePlay){
|
|
if(!from) return;
|
|
if(!from) return;
|
|
- tnsEvaluateData* ed=UseED?UseED:(from->InRoot?(&from->InRoot->Evaluated):(&from->Evaluated));
|
|
+ tnsObject* UseRoot=from->InRoot?from->InRoot:from;
|
|
-
|
|
+ tnsEvaluateData* ed=UseED?UseED:(EvaluatePlay?&UseRoot->EvaluatedPlay:&UseRoot->Evaluated);
|
|
|
|
+ ed->SceneEvaluateMode=EvaluatePlay;
|
|
if(ed->Done) return;
|
|
if(ed->Done) return;
|
|
elif(!UseED){ ed->NextCommand=ed->NextOverlay=ed->NextSelection=ed->NextOutline=ed->NextMat=0;
|
|
elif(!UseED){ ed->NextCommand=ed->NextOverlay=ed->NextSelection=ed->NextOutline=ed->NextMat=0;
|
|
if(!ed->Commands) arrInitLength(&ed->Commands,16,&ed->MaxCommand,sizeof(tnsEvaluatedInstance));
|
|
if(!ed->Commands) arrInitLength(&ed->Commands,16,&ed->MaxCommand,sizeof(tnsEvaluatedInstance));
|
|
@@ -3853,21 +3879,25 @@ void tnsEvaluateObjectTree(tnsObject* from, tnsEvaluateData* UseED){
|
|
tnsLoadIdentity44d(ed->MatArr[0]); ed->NextMat=1;
|
|
tnsLoadIdentity44d(ed->MatArr[0]); ed->NextMat=1;
|
|
}
|
|
}
|
|
tnsEvaluatedNode* CP,*CC;
|
|
tnsEvaluatedNode* CP,*CC;
|
|
- if(ed->EvaluateMode){ if(!UseED){ tnsEnsureEvalueatedScene(ed,from); }
|
|
+ if(ed->SceneEvaluateMode){
|
|
|
|
+ from=tnsEnsurePlayDuplicate(from);
|
|
|
|
+ if(!UseED){ tnsEnsureEvalueatedScene(ed,from); }
|
|
CP=ed->Scene->CurrentParent; CC=ed->Scene->CurrentChild;
|
|
CP=ed->Scene->CurrentParent; CC=ed->Scene->CurrentChild;
|
|
}
|
|
}
|
|
|
|
|
|
tnsEvaluateThisObject(from, ed);
|
|
tnsEvaluateThisObject(from, ed);
|
|
|
|
|
|
- if(ed->EvaluateMode){ ed->Scene->CurrentParent=ed->Scene->CurrentChild; ed->Scene->CurrentChild=ed->Scene->CurrentParent->Children.pFirst; }
|
|
+ if(ed->SceneEvaluateMode){ ed->Scene->CurrentParent=ed->Scene->CurrentChild; ed->Scene->CurrentChild=ed->Scene->CurrentParent->Children.pFirst; }
|
|
|
|
|
|
for (laListItemPointer* lip=from->ChildObjects.pFirst;lip;lip=lip->pNext){
|
|
for (laListItemPointer* lip=from->ChildObjects.pFirst;lip;lip=lip->pNext){
|
|
- tnsObject *o=lip->p; if (o){ tnsEvaluateObjectTree(o,ed); }
|
|
+ tnsObject *o=lip->p; if (o){ tnsEvaluateObjectTree(o,ed,EvaluatePlay); }
|
|
- if(ed->EvaluateMode){ ed->Scene->CurrentChild=ed->Scene->CurrentChild?ed->Scene->CurrentChild->Item.pNext:0; }
|
|
+ if(ed->SceneEvaluateMode){ ed->Scene->CurrentChild=ed->Scene->CurrentChild?ed->Scene->CurrentChild->Item.pNext:0; }
|
|
}
|
|
}
|
|
|
|
|
|
- if(ed->EvaluateMode){ tnsEvaluateSyncNode(ed, 0); ed->Scene->CurrentParent=CP; ed->Scene->CurrentChild=CC; }
|
|
+ if(ed->SceneEvaluateMode){ tnsEvaluateSyncNode(ed, 0); ed->Scene->CurrentParent=CP; ed->Scene->CurrentChild=CC; }
|
|
- if(!UseED){ ed->Done=1; }
|
|
+ if(!UseED){ ed->Done=1;
|
|
|
|
+ if(ed->Scene){ tnsPrintEvaluatedNode(ed->Scene->Root,0);}
|
|
|
|
+ }
|
|
}
|
|
}
|
|
void tnsDrawLayer(tnsEvaluateData* ed,int Layer,void* CustomData){
|
|
void tnsDrawLayer(tnsEvaluateData* ed,int Layer,void* CustomData){
|
|
tnsEvaluatedInstance* ei; int next=0;
|
|
tnsEvaluatedInstance* ei; int next=0;
|
|
@@ -3883,9 +3913,10 @@ void tnsDrawLayer(tnsEvaluateData* ed,int Layer,void* CustomData){
|
|
ei++;
|
|
ei++;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
-void tnsDrawObjectTree(tnsObject* from, int Layers,void* CustomData){
|
|
+void tnsDrawObjectTree(tnsObject* from, int Layers,void* CustomData, int DrawRuntime){
|
|
if(!from) return;
|
|
if(!from) return;
|
|
- tnsEvaluateData* ed=&from->Evaluated; if(!ed->Done) return;
|
|
+ tnsEvaluateData* ed=DrawRuntime?&from->EvaluatedPlay:&from->Evaluated;
|
|
|
|
+ if(!ed->Done) return;
|
|
if(Layers&TNS_EVAL_LAYER_SOLID){ tnsDrawLayer(ed,TNS_EVAL_LAYER_SOLID,CustomData); }
|
|
if(Layers&TNS_EVAL_LAYER_SOLID){ tnsDrawLayer(ed,TNS_EVAL_LAYER_SOLID,CustomData); }
|
|
if(Layers&TNS_EVAL_LAYER_OUTLINE){ tnsDrawLayer(ed,TNS_EVAL_LAYER_OUTLINE,CustomData);}
|
|
if(Layers&TNS_EVAL_LAYER_OUTLINE){ tnsDrawLayer(ed,TNS_EVAL_LAYER_OUTLINE,CustomData);}
|
|
if(Layers&TNS_EVAL_LAYER_OVERLAY){ tnsDrawLayer(ed,TNS_EVAL_LAYER_OVERLAY,CustomData);}
|
|
if(Layers&TNS_EVAL_LAYER_OVERLAY){ tnsDrawLayer(ed,TNS_EVAL_LAYER_OVERLAY,CustomData);}
|