|  | @@ -77,7 +77,7 @@ void IDN_ControllerDestroy(laInputControllerNode* n){
 | 
	
		
			
				|  |  |      for(int i=0;i<8;i++){ laDestroyOutSocket(n->Sockets[i].Out); }
 | 
	
		
			
				|  |  |      strSafeDestroy(&n->Base.Name);
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  | -int IDN_ControllerVisit(laInputControllerNode* n, laListHandle* l){
 | 
	
		
			
				|  |  | +int IDN_ControllerVisit(laInputControllerNode* n, laNodeVisitInfo* vi){
 | 
	
		
			
				|  |  |      laController* c=la_FindControllerWithID(n->UserID);
 | 
	
		
			
				|  |  |      if(!c){ for(int i=0;i<8;i++){ laInputControllerNodeSocket* ns=&n->Sockets[i]; LA_IDN_CONTROLLER_RESET_SOCKET(ns); } return LA_DAG_FLAG_PERM; }
 | 
	
		
			
				|  |  |      else{
 | 
	
	
		
			
				|  | @@ -95,8 +95,7 @@ int IDN_ControllerVisit(laInputControllerNode* n, laListHandle* l){
 | 
	
		
			
				|  |  |              ns->Offset=p->Offset;
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  | -    n->Base.Eval=LA_DAG_FLAG_PERM;
 | 
	
		
			
				|  |  | -    lstAppendPointer(l, n);
 | 
	
		
			
				|  |  | +    LA_ADD_THIS_NODE(n,vi);
 | 
	
		
			
				|  |  |      return LA_DAG_FLAG_PERM;
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  int IDN_ControllerEval(laInputControllerNode* n){
 | 
	
	
		
			
				|  | @@ -152,11 +151,10 @@ void IDN_InputVisualizeDestroy(laInputVisualizerNode* n){
 | 
	
		
			
				|  |  |      laDestroyInSocket(n->In);
 | 
	
		
			
				|  |  |      strSafeDestroy(&n->Base.Name);
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  | -int IDN_InputVisualizeVisit(laInputVisualizerNode* n, laListHandle* l){
 | 
	
		
			
				|  |  | -    n->Base.Eval=LA_DAG_FLAG_TEMP;
 | 
	
		
			
				|  |  | -    if(LA_SRC_AND_PARENT(n->In)){ laBaseNode* sn=n->In->Source->Parent;LA_VISIT_NODE(sn); }
 | 
	
		
			
				|  |  | -    n->Base.Eval=LA_DAG_FLAG_PERM;
 | 
	
		
			
				|  |  | -    lstAppendPointer(l, n);
 | 
	
		
			
				|  |  | +int IDN_InputVisualizeVisit(laInputVisualizerNode* n, laNodeVisitInfo* vi){
 | 
	
		
			
				|  |  | +    LA_GUARD_THIS_NODE(n,vi);
 | 
	
		
			
				|  |  | +    if(LA_SRC_AND_PARENT(n->In)){ laBaseNode* sn=n->In->Source->Parent;LA_VISIT_NODE(sn,vi); }
 | 
	
		
			
				|  |  | +    LA_ADD_THIS_NODE(n,vi);
 | 
	
		
			
				|  |  |      return LA_DAG_FLAG_PERM;
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  int IDN_InputVisualizerEval(laInputVisualizerNode* n){
 | 
	
	
		
			
				|  | @@ -199,11 +197,10 @@ void IDN_SplitDestroy(laSplitNode* n){
 | 
	
		
			
				|  |  |      laDestroyInSocket(n->In); strSafeDestroy(&n->Base.Name);
 | 
	
		
			
				|  |  |      for(int i=0;i<8;i++){ laDestroyOutSocket(n->Out[i].Out); }
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  | -int IDN_SplitVisit(laSplitNode* n, laListHandle* l){
 | 
	
		
			
				|  |  | -    LA_GUARD_THIS_NODE(n);
 | 
	
		
			
				|  |  | -    if(LA_SRC_AND_PARENT(n->In)){ laBaseNode* sn=n->In->Source->Parent; LA_VISIT_NODE(sn); }
 | 
	
		
			
				|  |  | -    n->Base.Eval=LA_DAG_FLAG_PERM;
 | 
	
		
			
				|  |  | -    lstAppendPointer(l, n);
 | 
	
		
			
				|  |  | +int IDN_SplitVisit(laSplitNode* n, laNodeVisitInfo* vi){
 | 
	
		
			
				|  |  | +    LA_GUARD_THIS_NODE(n,vi);
 | 
	
		
			
				|  |  | +    if(LA_SRC_AND_PARENT(n->In)){ laBaseNode* sn=n->In->Source->Parent; LA_VISIT_NODE(sn,vi); }
 | 
	
		
			
				|  |  | +    LA_ADD_THIS_NODE(n,vi);
 | 
	
		
			
				|  |  |      return LA_DAG_FLAG_PERM;
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  int IDN_SplitEval(laSplitNode* n){
 | 
	
	
		
			
				|  | @@ -250,19 +247,29 @@ void IDN_SwitchDestroy(laSwitchNode* n){
 | 
	
		
			
				|  |  |      laDestroyInSocket(n->SwitchIn); laDestroyOutSocket(n->Out); strSafeDestroy(&n->Base.Name);
 | 
	
		
			
				|  |  |      for(int i=0;i<8;i++){ laDestroyInSocket(n->In[i].In); }
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  | -int IDN_SwitchVisit(laSwitchNode* n, laListHandle* l){
 | 
	
		
			
				|  |  | -    LA_GUARD_THIS_NODE(n);
 | 
	
		
			
				|  |  | +int IDN_SwitchVisit(laSwitchNode* n, laNodeVisitInfo* vi){
 | 
	
		
			
				|  |  | +    LA_GUARD_THIS_NODE(n,vi); n->MaxUsed=0; n->Page=vi->Page;
 | 
	
		
			
				|  |  | +    for(int i=0;i<8;i++){ if(n->In[i].In->Source){ n->MaxUsed=i+2; } }
 | 
	
		
			
				|  |  | +    uint64_t OrigBranch=vi->Branch; int NextBranch=vi->NextBranch;
 | 
	
		
			
				|  |  | +    vi->NextBranch+=n->MaxUsed; n->BranchSW=(1<<(NextBranch-1));
 | 
	
		
			
				|  |  | +    if(OrigBranch==1){ lstAppendPointer(vi->br,n); }
 | 
	
		
			
				|  |  |      for(int i=0;i<8;i++){
 | 
	
		
			
				|  |  | -        if(n->In[i].In->Source){ laBaseNode* sn=n->In[i].In->Source->Parent; LA_VISIT_NODE(sn); }
 | 
	
		
			
				|  |  | +        if(n->In[i].In->Source){
 | 
	
		
			
				|  |  | +            vi->Branch=OrigBranch|(1<<(NextBranch+i));
 | 
	
		
			
				|  |  | +            laBaseNode* sn=n->In[i].In->Source->Parent; LA_VISIT_NODE(sn,vi);
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  | -    laBaseNode* sw=n->SwitchIn->Source?n->SwitchIn->Source->Parent:0; if(sw){ LA_VISIT_NODE(sw); }
 | 
	
		
			
				|  |  | -    n->Base.Eval=LA_DAG_FLAG_PERM;
 | 
	
		
			
				|  |  | -    lstAppendPointer(l, n);
 | 
	
		
			
				|  |  | +    vi->Branch=OrigBranch|n->BranchSW;
 | 
	
		
			
				|  |  | +    laBaseNode* sw=n->SwitchIn->Source?n->SwitchIn->Source->Parent:0; if(sw){ LA_VISIT_NODE(sw,vi); }
 | 
	
		
			
				|  |  | +    vi->Branch=OrigBranch;
 | 
	
		
			
				|  |  | +    LA_ADD_THIS_NODE(n,vi);
 | 
	
		
			
				|  |  |      return LA_DAG_FLAG_PERM;
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  int IDN_SwitchEval(laSwitchNode* n){
 | 
	
		
			
				|  |  |      int sw=n->Switch;
 | 
	
		
			
				|  |  | -    if(n->SwitchIn->Source){ laNodeOutSocket* os=n->SwitchIn->Source; int* id; real* fd;
 | 
	
		
			
				|  |  | +    if(n->SwitchIn->Source){
 | 
	
		
			
				|  |  | +        laRunPage(n->Page,n->BranchSW);
 | 
	
		
			
				|  |  | +        laNodeOutSocket* os=n->SwitchIn->Source; int* id; real* fd;
 | 
	
		
			
				|  |  |          switch(os->DataType){
 | 
	
		
			
				|  |  |          case LA_PROP_ARRAY|LA_PROP_ENUM:
 | 
	
		
			
				|  |  |              id=os->Data; for(int i=0;i<os->ArrLen;i++){ if(id[i]){sw=i; break;} } break;
 | 
	
	
		
			
				|  | @@ -273,6 +280,7 @@ int IDN_SwitchEval(laSwitchNode* n){
 | 
	
		
			
				|  |  |          default: sw=0; break;
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  | +    laRunPage(n->Page,(n->BranchSW<<(sw+1)));
 | 
	
		
			
				|  |  |      TNS_CLAMP(sw,0,7);
 | 
	
		
			
				|  |  |      laSwitchNodeInSocket *is=&n->In[sw];
 | 
	
		
			
				|  |  |      if(is->In->Source){ n->Out->Data=is->In->Source->Data; n->Out->DataType=is->In->Source->DataType; n->Out->ArrLen=is->In->Source->ArrLen; }
 | 
	
	
		
			
				|  | @@ -313,11 +321,10 @@ void IDN_CombineDestroy(laCombineNode* n){
 | 
	
		
			
				|  |  |      laDestroyOutSocket(n->Out);laDestroyOutSocket(n->OutInt);laDestroyOutSocket(n->OutEnum); strSafeDestroy(&n->Base.Name);
 | 
	
		
			
				|  |  |      for(int i=0;i<8;i++){ laDestroyInSocket(n->In[i].In); }
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  | -int IDN_CombineVisit(laCombineNode* n, laListHandle* l){
 | 
	
		
			
				|  |  | -    LA_GUARD_THIS_NODE(n);
 | 
	
		
			
				|  |  | -    for(int i=0;i<8;i++){ if(LA_SRC_AND_PARENT(n->In[i].In)){ laBaseNode* sn=n->In[i].In->Source->Parent; LA_VISIT_NODE(sn); } }
 | 
	
		
			
				|  |  | -    n->Base.Eval=LA_DAG_FLAG_PERM;
 | 
	
		
			
				|  |  | -    lstAppendPointer(l, n);
 | 
	
		
			
				|  |  | +int IDN_CombineVisit(laCombineNode* n, laNodeVisitInfo* vi){
 | 
	
		
			
				|  |  | +    LA_GUARD_THIS_NODE(n,vi);
 | 
	
		
			
				|  |  | +    for(int i=0;i<8;i++){ if(LA_SRC_AND_PARENT(n->In[i].In)){ laBaseNode* sn=n->In[i].In->Source->Parent; LA_VISIT_NODE(sn,vi); } }
 | 
	
		
			
				|  |  | +    LA_ADD_THIS_NODE(n,vi);
 | 
	
		
			
				|  |  |      return LA_DAG_FLAG_PERM;
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  int IDN_CombineEval(laCombineNode* n){
 | 
	
	
		
			
				|  | @@ -365,10 +372,9 @@ void IDN_ValuesDestroy(laValuesNode* n){
 | 
	
		
			
				|  |  |      strSafeDestroy(&n->Base.Name);
 | 
	
		
			
				|  |  |      for(int i=0;i<8;i++){ laDestroyOutSocket(n->Out[i].Out); }
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  | -int IDN_ValuesVisit(laValuesNode* n, laListHandle* l){
 | 
	
		
			
				|  |  | -    LA_GUARD_THIS_NODE(n);
 | 
	
		
			
				|  |  | -    n->Base.Eval=LA_DAG_FLAG_PERM;
 | 
	
		
			
				|  |  | -    lstAppendPointer(l, n);
 | 
	
		
			
				|  |  | +int IDN_ValuesVisit(laValuesNode* n, laNodeVisitInfo* vi){
 | 
	
		
			
				|  |  | +    LA_GUARD_THIS_NODE(n,vi);
 | 
	
		
			
				|  |  | +    LA_ADD_THIS_NODE(n,vi);
 | 
	
		
			
				|  |  |      return LA_DAG_FLAG_PERM;
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  int IDN_ValuesEval(laValuesNode* n){
 | 
	
	
		
			
				|  | @@ -413,12 +419,11 @@ void IDN_MatrixDestroy(laMatrixNode* n){
 | 
	
		
			
				|  |  |      strSafeDestroy(&n->Base.Name);
 | 
	
		
			
				|  |  |      laDestroyInSocket(n->InL); laDestroyInSocket(n->InR); laDestroyOutSocket(n->Out);
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  | -int IDN_MatrixVisit(laMatrixNode* n, laListHandle* l){
 | 
	
		
			
				|  |  | -    LA_GUARD_THIS_NODE(n);
 | 
	
		
			
				|  |  | -    if(LA_SRC_AND_PARENT(n->InL)){ laBaseNode* bn=n->InL->Source->Parent; LA_VISIT_NODE(bn); }
 | 
	
		
			
				|  |  | -    if(LA_SRC_AND_PARENT(n->InR)){ laBaseNode* bn=n->InR->Source->Parent; LA_VISIT_NODE(bn); }
 | 
	
		
			
				|  |  | -    n->Base.Eval=LA_DAG_FLAG_PERM;
 | 
	
		
			
				|  |  | -    lstAppendPointer(l, n);
 | 
	
		
			
				|  |  | +int IDN_MatrixVisit(laMatrixNode* n, laNodeVisitInfo* vi){
 | 
	
		
			
				|  |  | +    LA_GUARD_THIS_NODE(n,vi);
 | 
	
		
			
				|  |  | +    if(LA_SRC_AND_PARENT(n->InL)){ laBaseNode* bn=n->InL->Source->Parent; LA_VISIT_NODE(bn,vi); }
 | 
	
		
			
				|  |  | +    if(LA_SRC_AND_PARENT(n->InR)){ laBaseNode* bn=n->InR->Source->Parent; LA_VISIT_NODE(bn,vi); }
 | 
	
		
			
				|  |  | +    LA_ADD_THIS_NODE(n,vi);
 | 
	
		
			
				|  |  |      return LA_DAG_FLAG_PERM;
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  int IDN_MatrixEval(laMatrixNode* n){
 | 
	
	
		
			
				|  | @@ -461,12 +466,11 @@ void IDN_MathInit(laMathNode* n, int NoCreate){
 | 
	
		
			
				|  |  |  void IDN_MathDestroy(laMathNode* n){
 | 
	
		
			
				|  |  |      strSafeDestroy(&n->Base.Name); laDestroyInSocket(n->InL); laDestroyInSocket(n->InR); laDestroyOutSocket(n->Out); laDestroyOutSocket(n->OutInt);
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  | -int IDN_MathVisit(laMathNode* n, laListHandle* l){
 | 
	
		
			
				|  |  | -    LA_GUARD_THIS_NODE(n);
 | 
	
		
			
				|  |  | -    if(LA_SRC_AND_PARENT(n->InL)){ laBaseNode* bn=n->InL->Source->Parent; LA_VISIT_NODE(bn); }
 | 
	
		
			
				|  |  | -    if(LA_SRC_AND_PARENT(n->InR)){ laBaseNode* bn=n->InR->Source->Parent; LA_VISIT_NODE(bn); }
 | 
	
		
			
				|  |  | -    n->Base.Eval=LA_DAG_FLAG_PERM;
 | 
	
		
			
				|  |  | -    lstAppendPointer(l, n);
 | 
	
		
			
				|  |  | +int IDN_MathVisit(laMathNode* n, laNodeVisitInfo* vi){
 | 
	
		
			
				|  |  | +    LA_GUARD_THIS_NODE(n,vi);
 | 
	
		
			
				|  |  | +    if(LA_SRC_AND_PARENT(n->InL)){ laBaseNode* bn=n->InL->Source->Parent; LA_VISIT_NODE(bn,vi); }
 | 
	
		
			
				|  |  | +    if(LA_SRC_AND_PARENT(n->InR)){ laBaseNode* bn=n->InR->Source->Parent; LA_VISIT_NODE(bn,vi); }
 | 
	
		
			
				|  |  | +    LA_ADD_THIS_NODE(n,vi);
 | 
	
		
			
				|  |  |      return LA_DAG_FLAG_PERM;
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  #define LA_GET_SRC_AS_FLOAT(var, socket) \
 | 
	
	
		
			
				|  | @@ -541,15 +545,14 @@ void IDN_MapperDestroy(laMapperNode* n){
 | 
	
		
			
				|  |  |      laDestroyInSocket(n->InMin); laDestroyInSocket(n->InMax); laDestroyInSocket(n->OutMin); laDestroyInSocket(n->OutMax);
 | 
	
		
			
				|  |  |      laValueMapperDestroy(n->Mapper);
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  | -int IDN_MapperVisit(laMapperNode* n, laListHandle* l){
 | 
	
		
			
				|  |  | -    LA_GUARD_THIS_NODE(n);
 | 
	
		
			
				|  |  | -    if(LA_SRC_AND_PARENT(n->In)){ laBaseNode* bn=n->In->Source->Parent; LA_VISIT_NODE(bn); }
 | 
	
		
			
				|  |  | -    if(LA_SRC_AND_PARENT(n->InMin)){ laBaseNode* bn=n->InMin->Source->Parent; LA_VISIT_NODE(bn); }
 | 
	
		
			
				|  |  | -    if(LA_SRC_AND_PARENT(n->InMax)){ laBaseNode* bn=n->InMax->Source->Parent; LA_VISIT_NODE(bn); }
 | 
	
		
			
				|  |  | -    if(LA_SRC_AND_PARENT(n->OutMin)){ laBaseNode* bn=n->OutMin->Source->Parent; LA_VISIT_NODE(bn); }
 | 
	
		
			
				|  |  | -    if(LA_SRC_AND_PARENT(n->OutMax)){ laBaseNode* bn=n->OutMax->Source->Parent; LA_VISIT_NODE(bn); }
 | 
	
		
			
				|  |  | -    n->Base.Eval=LA_DAG_FLAG_PERM;
 | 
	
		
			
				|  |  | -    lstAppendPointer(l, n);
 | 
	
		
			
				|  |  | +int IDN_MapperVisit(laMapperNode* n, laNodeVisitInfo* vi){
 | 
	
		
			
				|  |  | +    LA_GUARD_THIS_NODE(n,vi);
 | 
	
		
			
				|  |  | +    if(LA_SRC_AND_PARENT(n->In)){ laBaseNode* bn=n->In->Source->Parent; LA_VISIT_NODE(bn,vi); }
 | 
	
		
			
				|  |  | +    if(LA_SRC_AND_PARENT(n->InMin)){ laBaseNode* bn=n->InMin->Source->Parent; LA_VISIT_NODE(bn,vi); }
 | 
	
		
			
				|  |  | +    if(LA_SRC_AND_PARENT(n->InMax)){ laBaseNode* bn=n->InMax->Source->Parent; LA_VISIT_NODE(bn,vi); }
 | 
	
		
			
				|  |  | +    if(LA_SRC_AND_PARENT(n->OutMin)){ laBaseNode* bn=n->OutMin->Source->Parent; LA_VISIT_NODE(bn,vi); }
 | 
	
		
			
				|  |  | +    if(LA_SRC_AND_PARENT(n->OutMax)){ laBaseNode* bn=n->OutMax->Source->Parent; LA_VISIT_NODE(bn,vi); }
 | 
	
		
			
				|  |  | +    LA_ADD_THIS_NODE(n,vi);
 | 
	
		
			
				|  |  |      return LA_DAG_FLAG_PERM;
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  int IDN_MapperEval(laMapperNode* n){
 | 
	
	
		
			
				|  | @@ -592,11 +595,11 @@ void IDN_RandomInit(laRandomNode* n, int NoCreate){
 | 
	
		
			
				|  |  |  void IDN_RandomDestroy(laRandomNode* n){
 | 
	
		
			
				|  |  |      strSafeDestroy(&n->Base.Name); laDestroyOutSocket(n->Out); laDestroyInSocket(n->InMin); laDestroyInSocket(n->InMax);
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  | -int IDN_RandomVisit(laRandomNode* n, laListHandle* l){
 | 
	
		
			
				|  |  | -    LA_GUARD_THIS_NODE(n);
 | 
	
		
			
				|  |  | -    if(LA_SRC_AND_PARENT(n->InMin)){ laBaseNode* bn=n->InMin->Source->Parent; LA_VISIT_NODE(bn); }
 | 
	
		
			
				|  |  | -    if(LA_SRC_AND_PARENT(n->InMax)){ laBaseNode* bn=n->InMax->Source->Parent; LA_VISIT_NODE(bn); }
 | 
	
		
			
				|  |  | -    n->Base.Eval=LA_DAG_FLAG_PERM; lstAppendPointer(l, n);
 | 
	
		
			
				|  |  | +int IDN_RandomVisit(laRandomNode* n, laNodeVisitInfo* vi){
 | 
	
		
			
				|  |  | +    LA_GUARD_THIS_NODE(n,vi);
 | 
	
		
			
				|  |  | +    if(LA_SRC_AND_PARENT(n->InMin)){ laBaseNode* bn=n->InMin->Source->Parent; LA_VISIT_NODE(bn,vi); }
 | 
	
		
			
				|  |  | +    if(LA_SRC_AND_PARENT(n->InMax)){ laBaseNode* bn=n->InMax->Source->Parent; LA_VISIT_NODE(bn,vi); }
 | 
	
		
			
				|  |  | +    LA_ADD_THIS_NODE(n,vi);
 | 
	
		
			
				|  |  |      return LA_DAG_FLAG_PERM;
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  int IDN_RandomEval(laRandomNode* n){
 | 
	
	
		
			
				|  | @@ -629,12 +632,11 @@ void IDN_VectorMathInit(laVectorMathNode* n, int NoCreate){
 | 
	
		
			
				|  |  |  void IDN_VectorMathDestroy(laVectorMathNode* n){
 | 
	
		
			
				|  |  |      strSafeDestroy(&n->Base.Name); laDestroyInSocket(n->InL); laDestroyInSocket(n->InR); laDestroyOutSocket(n->Out);
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  | -int IDN_VectorMathVisit(laVectorMathNode* n, laListHandle* l){
 | 
	
		
			
				|  |  | -    LA_GUARD_THIS_NODE(n);
 | 
	
		
			
				|  |  | -    if(LA_SRC_AND_PARENT(n->InL)){ laBaseNode* bn=n->InL->Source->Parent; LA_VISIT_NODE(bn); }
 | 
	
		
			
				|  |  | -    if(LA_SRC_AND_PARENT(n->InR)){ laBaseNode* bn=n->InR->Source->Parent; LA_VISIT_NODE(bn); }
 | 
	
		
			
				|  |  | -    n->Base.Eval=LA_DAG_FLAG_PERM;
 | 
	
		
			
				|  |  | -    lstAppendPointer(l, n);
 | 
	
		
			
				|  |  | +int IDN_VectorMathVisit(laVectorMathNode* n, laNodeVisitInfo* vi){
 | 
	
		
			
				|  |  | +    LA_GUARD_THIS_NODE(n,vi);
 | 
	
		
			
				|  |  | +    if(LA_SRC_AND_PARENT(n->InL)){ laBaseNode* bn=n->InL->Source->Parent; LA_VISIT_NODE(bn,vi); }
 | 
	
		
			
				|  |  | +    if(LA_SRC_AND_PARENT(n->InR)){ laBaseNode* bn=n->InR->Source->Parent; LA_VISIT_NODE(bn,vi); }
 | 
	
		
			
				|  |  | +    LA_ADD_THIS_NODE(n,vi);
 | 
	
		
			
				|  |  |      return LA_DAG_FLAG_PERM;
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  #define LA_GET_SRC_AS_FLOAT_THINGS(var, socket, maxlen) \
 | 
	
	
		
			
				|  | @@ -684,8 +686,10 @@ void IDN_CommentInit(laCommentNode* n, int NoCreate){
 | 
	
		
			
				|  |  |  void IDN_CommentDestroy(laCommentNode* n){
 | 
	
		
			
				|  |  |      strSafeDestroy(&n->Base.Name); strSafeDestroy(&n->Content); 
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  | -int IDN_CommentVisit(laCommentNode* n, laListHandle* l){
 | 
	
		
			
				|  |  | -    LA_GUARD_THIS_NODE(n); n->Base.Eval=LA_DAG_FLAG_PERM; lstAppendPointer(l, n);
 | 
	
		
			
				|  |  | +int IDN_CommentVisit(laCommentNode* n, laNodeVisitInfo* vi){
 | 
	
		
			
				|  |  | +    //LA_GUARD_THIS_NODE(n,vi); 
 | 
	
		
			
				|  |  | +    //LA_ADD_THIS_NODE(n,vi);
 | 
	
		
			
				|  |  | +    // No need to evaluate comments I guess?
 | 
	
		
			
				|  |  |      return LA_DAG_FLAG_PERM;
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  int IDN_CommentEval(laCommentNode* n){ return 1; }
 | 
	
	
		
			
				|  | @@ -713,11 +717,10 @@ void IDN_RGB2OKHSLDestroy(laRGB2OKHSLNode* n){
 | 
	
		
			
				|  |  |      strSafeDestroy(&n->Base.Name);
 | 
	
		
			
				|  |  |      laDestroyInSocket(n->In); laDestroyOutSocket(n->OutH); laDestroyOutSocket(n->OutS); laDestroyOutSocket(n->OutL);
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  | -int IDN_RGB2OKHSLVisit(laRGB2OKHSLNode* n, laListHandle* l){
 | 
	
		
			
				|  |  | -    LA_GUARD_THIS_NODE(n);
 | 
	
		
			
				|  |  | -    if(LA_SRC_AND_PARENT(n->In)){ laBaseNode* bn=n->In->Source->Parent; LA_VISIT_NODE(bn); }
 | 
	
		
			
				|  |  | -    n->Base.Eval=LA_DAG_FLAG_PERM;
 | 
	
		
			
				|  |  | -    lstAppendPointer(l, n);
 | 
	
		
			
				|  |  | +int IDN_RGB2OKHSLVisit(laRGB2OKHSLNode* n, laNodeVisitInfo* vi){
 | 
	
		
			
				|  |  | +    LA_GUARD_THIS_NODE(n,vi);
 | 
	
		
			
				|  |  | +    if(LA_SRC_AND_PARENT(n->In)){ laBaseNode* bn=n->In->Source->Parent; LA_VISIT_NODE(bn,vi); }
 | 
	
		
			
				|  |  | +    LA_ADD_THIS_NODE(n,vi);
 | 
	
		
			
				|  |  |      return LA_DAG_FLAG_PERM;
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  int IDN_RGB2OKHSLEval(laRGB2OKHSLNode* n){
 | 
	
	
		
			
				|  | @@ -757,13 +760,12 @@ void IDN_OKHSL2RGBDestroy(laOKHSL2RGBNode* n){
 | 
	
		
			
				|  |  |      strSafeDestroy(&n->Base.Name);
 | 
	
		
			
				|  |  |      laDestroyInSocket(n->InH); laDestroyInSocket(n->InS); laDestroyInSocket(n->InL); laDestroyOutSocket(n->Out);
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  | -int IDN_OKHSL2RGBVisit(laOKHSL2RGBNode* n, laListHandle* l){
 | 
	
		
			
				|  |  | -    LA_GUARD_THIS_NODE(n);
 | 
	
		
			
				|  |  | -    if(LA_SRC_AND_PARENT(n->InH)){ laBaseNode* bn=n->InH->Source->Parent; LA_VISIT_NODE(bn); }
 | 
	
		
			
				|  |  | -    if(LA_SRC_AND_PARENT(n->InS)){ laBaseNode* bn=n->InS->Source->Parent; LA_VISIT_NODE(bn); }
 | 
	
		
			
				|  |  | -    if(LA_SRC_AND_PARENT(n->InL)){ laBaseNode* bn=n->InL->Source->Parent; LA_VISIT_NODE(bn); }
 | 
	
		
			
				|  |  | -    n->Base.Eval=LA_DAG_FLAG_PERM;
 | 
	
		
			
				|  |  | -    lstAppendPointer(l, n);
 | 
	
		
			
				|  |  | +int IDN_OKHSL2RGBVisit(laOKHSL2RGBNode* n, laNodeVisitInfo* vi){
 | 
	
		
			
				|  |  | +    LA_GUARD_THIS_NODE(n,vi);
 | 
	
		
			
				|  |  | +    if(LA_SRC_AND_PARENT(n->InH)){ laBaseNode* bn=n->InH->Source->Parent; LA_VISIT_NODE(bn,vi); }
 | 
	
		
			
				|  |  | +    if(LA_SRC_AND_PARENT(n->InS)){ laBaseNode* bn=n->InS->Source->Parent; LA_VISIT_NODE(bn,vi); }
 | 
	
		
			
				|  |  | +    if(LA_SRC_AND_PARENT(n->InL)){ laBaseNode* bn=n->InL->Source->Parent; LA_VISIT_NODE(bn,vi); }
 | 
	
		
			
				|  |  | +    LA_ADD_THIS_NODE(n,vi);
 | 
	
		
			
				|  |  |      return LA_DAG_FLAG_PERM;
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  int IDN_OKHSL2RGBEval(laOKHSL2RGBNode* n){
 | 
	
	
		
			
				|  | @@ -1286,33 +1288,60 @@ typedef laMathNode laSmallMathNode;
 | 
	
		
			
				|  |  |      MAIN.tNodeOut=laCreateOutSocket(0,"TOUT",0);
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |  void laMappingRequestRebuild(){ MAIN.InputMapping->NeedRebuild=1; }
 | 
	
		
			
				|  |  |  void laMappingRequestEval(){ MAIN.InputMapping->NeedEval=1; }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -int la_RunInputMapping(){
 | 
	
		
			
				|  |  | -    MAIN.InputMapping->NeedEval = 0;
 | 
	
		
			
				|  |  | -    for(laListItemPointer*lip=MAIN.InputMapping->Eval.pFirst;lip;lip=lip->pNext){
 | 
	
		
			
				|  |  | -        laBaseNode* n=lip->p; if(!n->InitDone){ n->Type->Init(n,1); n->InitDone=1; } n->Type->Eval(n);
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -    return 1;
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | -int la_RebuildInputMapping(){
 | 
	
		
			
				|  |  | -    MAIN.InputMapping->NeedRebuild = 0;
 | 
	
		
			
				|  |  | -    while(lstPopPointer(&MAIN.InputMapping->Eval));
 | 
	
		
			
				|  |  | -    laListHandle pending={0}; laRackPage* rp=MAIN.InputMapping->CurrentPage; if(!rp)return LA_DAG_FLAG_PERM;
 | 
	
		
			
				|  |  | +int __DEBUG_PAGE_EVAL__=1;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +int laRebuildPageEval(laRackPage* rp){
 | 
	
		
			
				|  |  | +    if(!rp)return LA_DAG_FLAG_PERM;
 | 
	
		
			
				|  |  | +    while(lstPopPointer(&rp->Eval)); while(lstPopPointer(&rp->AlwaysBranchers));
 | 
	
		
			
				|  |  | +    laListHandle pending={0}; 
 | 
	
		
			
				|  |  |      for(laNodeRack* ir=rp->Racks.pFirst;ir;ir=ir->Item.pNext){
 | 
	
		
			
				|  |  | -        for(laBaseNode*bn=ir->Nodes.pFirst;bn;bn=bn->Item.pNext){ if(!bn->InitDone){ bn->Type->Init(bn,1); bn->InitDone=1; } lstAppendPointer(&pending,bn); bn->Eval=0; }
 | 
	
		
			
				|  |  | +        for(laBaseNode*bn=ir->Nodes.pFirst;bn;bn=bn->Item.pNext){ if(!bn->InitDone){ bn->Type->Init(bn,1); bn->InitDone=1; }
 | 
	
		
			
				|  |  | +            lstAppendPointer(&pending,bn); bn->Branch=0; bn->BranchTemp=0;
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  | -    laBaseNode*n;int result=LA_DAG_FLAG_PERM; laListItemPointer*NextLip;
 | 
	
		
			
				|  |  | +    laBaseNode*n; int result=LA_DAG_FLAG_PERM; laListItemPointer*NextLip;
 | 
	
		
			
				|  |  | +    laNodeVisitInfo vi;
 | 
	
		
			
				|  |  | +    vi.Branch=1; vi.NextBranch=2; vi.l=&rp->Eval; vi.br=&rp->AlwaysBranchers; vi.Page=rp;
 | 
	
		
			
				|  |  |      for(laListItemPointer*lip=pending.pFirst;lip;lip=NextLip){ n=lip->p; NextLip=lip->pNext;
 | 
	
		
			
				|  |  | -        if(n->Eval&LA_DAG_FLAG_PERM) continue;
 | 
	
		
			
				|  |  | -        result=n->Type->Visit(n,&MAIN.InputMapping->Eval); if(result==LA_DAG_FLAG_ERR){ while(lstPopPointer(&pending)); break; }
 | 
	
		
			
				|  |  | +        if(n->Branch & 1) continue;
 | 
	
		
			
				|  |  | +        result=n->Type->Visit(n,&vi); if(result==LA_DAG_FLAG_ERR){ while(lstPopPointer(&pending)); break; }
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  | -    if(result==LA_DAG_FLAG_ERR){ while(lstPopPointer(&MAIN.InputMapping->Eval)); return LA_DAG_FLAG_ERR; }
 | 
	
		
			
				|  |  | +    if(result==LA_DAG_FLAG_ERR){ while(lstPopPointer(&rp->Eval)); while(lstPopPointer(&rp->AlwaysBranchers)); return LA_DAG_FLAG_ERR; }
 | 
	
		
			
				|  |  |      return LA_DAG_FLAG_PERM;
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  | +int laRunPage(laRackPage* rp, uint64_t mask){
 | 
	
		
			
				|  |  | +    static uint64_t magic=3;
 | 
	
		
			
				|  |  | +    if(!rp || (!rp->Eval.pFirst && !rp->AlwaysBranchers.pFirst)) return 0;
 | 
	
		
			
				|  |  | +    if(__DEBUG_PAGE_EVAL__ && mask==1){ printf("Page eval %s\n",rp->Name->Ptr); }
 | 
	
		
			
				|  |  | +    if(mask==1){
 | 
	
		
			
				|  |  | +        for(laListItemPointer*lip=rp->AlwaysBranchers.pFirst;lip;lip=lip->pNext){
 | 
	
		
			
				|  |  | +            laBaseNode* n=lip->p; if(!n->InitDone){ n->Type->Init(n,1); n->InitDone=1; }
 | 
	
		
			
				|  |  | +            if(n->EvalMagic==magic) continue; if(__DEBUG_PAGE_EVAL__){ printf("  AB %.6x\n",n); }
 | 
	
		
			
				|  |  | +            n->EvalMagic=magic; n->Type->Eval(n);
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +    for(laListItemPointer*lip=rp->Eval.pFirst;lip;lip=lip->pNext){
 | 
	
		
			
				|  |  | +        laBaseNode* n=lip->p; if(!n->InitDone){ n->Type->Init(n,1); n->InitDone=1; }
 | 
	
		
			
				|  |  | +        if((!(n->Branch&mask)) || (mask==1&&n->Branch!=1) || n->EvalMagic==magic) continue;
 | 
	
		
			
				|  |  | +        if(__DEBUG_PAGE_EVAL__){ printf("  NN %d %s %.6x\n",mask,n->Type->Name,n); }
 | 
	
		
			
				|  |  | +        n->EvalMagic=magic; n->Type->Eval(n);
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +    if(__DEBUG_PAGE_EVAL__ && mask==1){ printf("End\n"); }
 | 
	
		
			
				|  |  | +    if(mask==1){ magic++; }
 | 
	
		
			
				|  |  | +    return 1;
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +int la_RunInputMapping(){
 | 
	
		
			
				|  |  | +    MAIN.InputMapping->NeedEval = 0;
 | 
	
		
			
				|  |  | +    return laRunPage(MAIN.InputMapping->CurrentPage, 1);
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +int la_RebuildInputMapping(){
 | 
	
		
			
				|  |  | +    MAIN.InputMapping->NeedRebuild = 0;
 | 
	
		
			
				|  |  | +    return laRebuildPageEval(MAIN.InputMapping->CurrentPage);
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  //==================================================================================================
 | 
	
		
			
				|  |  |  
 |