|  | @@ -67,8 +67,8 @@ void IDN_BrushSettingsDestroy(OurBrushSettingsNode* n){
 | 
	
		
			
				|  |  |      laDestroyOutSocket(n->CanvasScale); laDestroyOutSocket(n->Iteration); laDestroyOutSocket(n->Custom1); laDestroyOutSocket(n->Custom2);
 | 
	
		
			
				|  |  |      strSafeDestroy(&n->Base.Name);
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  | -int IDN_BrushSettingsVisit(OurBrushSettingsNode* n, laListHandle* l){
 | 
	
		
			
				|  |  | -    LA_GUARD_THIS_NODE(n); n->Base.Eval=LA_DAG_FLAG_PERM; lstAppendPointer(l, n);
 | 
	
		
			
				|  |  | +int IDN_BrushSettingsVisit(OurBrushSettingsNode* n, laNodeVisitInfo* vi){
 | 
	
		
			
				|  |  | +    LA_GUARD_THIS_NODE(n,vi);  LA_ADD_THIS_NODE(n,vi);
 | 
	
		
			
				|  |  |      return LA_DAG_FLAG_PERM;
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  int IDN_BrushSettingsEval(OurBrushSettingsNode* n){
 | 
	
	
		
			
				|  | @@ -142,10 +142,10 @@ void IDN_BrushOutputsDestroy(OurBrushOutputsNode* n){
 | 
	
		
			
				|  |  |      laDestroyInSocket(n->Color); laDestroyInSocket(n->Repeats); laDestroyInSocket(n->Discard);
 | 
	
		
			
				|  |  |      strSafeDestroy(&n->Base.Name);
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  | -int IDN_BrushOutputsVisit(OurBrushOutputsNode* n, laListHandle* l){
 | 
	
		
			
				|  |  | -    LA_GUARD_THIS_NODE(n);
 | 
	
		
			
				|  |  | +int IDN_BrushOutputsVisit(OurBrushOutputsNode* n, laNodeVisitInfo* vi){
 | 
	
		
			
				|  |  | +    LA_GUARD_THIS_NODE(n,vi);
 | 
	
		
			
				|  |  |  #define BRUSH_OUT_VISIT(a) \
 | 
	
		
			
				|  |  | -    if(LA_SRC_AND_PARENT(n->a)){ laBaseNode*bn=n->a->Source->Parent; LA_VISIT_NODE(bn); }
 | 
	
		
			
				|  |  | +    if(LA_SRC_AND_PARENT(n->a)){ laBaseNode*bn=n->a->Source->Parent; LA_VISIT_NODE(bn,vi); }
 | 
	
		
			
				|  |  |      BRUSH_OUT_VISIT(Offset)
 | 
	
		
			
				|  |  |      BRUSH_OUT_VISIT(Size)
 | 
	
		
			
				|  |  |      BRUSH_OUT_VISIT(Transparency)
 | 
	
	
		
			
				|  | @@ -159,7 +159,7 @@ int IDN_BrushOutputsVisit(OurBrushOutputsNode* n, laListHandle* l){
 | 
	
		
			
				|  |  |      BRUSH_OUT_VISIT(Repeats)
 | 
	
		
			
				|  |  |      BRUSH_OUT_VISIT(Discard)
 | 
	
		
			
				|  |  |  #undef BRUSH_OUT_VISIT
 | 
	
		
			
				|  |  | -    n->Base.Eval=LA_DAG_FLAG_PERM; lstAppendPointer(l, n);
 | 
	
		
			
				|  |  | +    LA_ADD_THIS_NODE(n,vi);
 | 
	
		
			
				|  |  |      return LA_DAG_FLAG_PERM;
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  int IDN_BrushOutputsEval(OurBrushOutputsNode* n){
 | 
	
	
		
			
				|  | @@ -242,8 +242,8 @@ void IDN_BrushDeviceDestroy(OurBrushDeviceNode* n){
 | 
	
		
			
				|  |  |      laDestroyOutSocket(n->Angle); laDestroyOutSocket(n->Length); laDestroyOutSocket(n->LengthAccum); 
 | 
	
		
			
				|  |  |      strSafeDestroy(&n->Base.Name);
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  | -int IDN_BrushDeviceVisit(OurBrushDeviceNode* n, laListHandle* l){
 | 
	
		
			
				|  |  | -    LA_GUARD_THIS_NODE(n); n->Base.Eval=LA_DAG_FLAG_PERM; lstAppendPointer(l, n);
 | 
	
		
			
				|  |  | +int IDN_BrushDeviceVisit(OurBrushDeviceNode* n, laNodeVisitInfo* vi){
 | 
	
		
			
				|  |  | +    LA_GUARD_THIS_NODE(n,vi); LA_ADD_THIS_NODE(n,vi);
 | 
	
		
			
				|  |  |      return LA_DAG_FLAG_PERM;
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  int IDN_BrushDeviceEval(OurBrushDeviceNode* n){
 | 
	
	
		
			
				|  | @@ -278,25 +278,10 @@ void ui_BrushDeviceNode(laUiList *uil, laPropPack *This, laPropPack *Extra, laCo
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  int ourEvalBrush(){
 | 
	
		
			
				|  |  | -    for(laListItemPointer*lip=Our->BrushEval.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;
 | 
	
		
			
				|  |  | +    return Our->CurrentBrush?laRunPage(Our->CurrentBrush->Rack, 1):0;
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  int ourRebuildBrushEval(){
 | 
	
		
			
				|  |  | -    while(lstPopPointer(&Our->BrushEval));
 | 
	
		
			
				|  |  | -    if(!Our->CurrentBrush || !Our->CurrentBrush->Rack) return LA_DAG_FLAG_PERM;
 | 
	
		
			
				|  |  | -    laListHandle pending={0}; laRackPage* rp=Our->CurrentBrush->Rack; if(!rp)return LA_DAG_FLAG_PERM;
 | 
	
		
			
				|  |  | -    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; }
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -    laBaseNode*n;int result=LA_DAG_FLAG_PERM; laListItemPointer*NextLip;
 | 
	
		
			
				|  |  | -    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,&Our->BrushEval); 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; }
 | 
	
		
			
				|  |  | -    return LA_DAG_FLAG_PERM;
 | 
	
		
			
				|  |  | +    return Our->CurrentBrush?laRebuildPageEval(Our->CurrentBrush->Rack):0;
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  
 |