|  | @@ -466,18 +466,18 @@ void laui_MathNode(laUiList *uil, laPropPack *This, laPropPack *Extra, laColumn
 | 
											
												
													
														|  |  int OPINV_AddInputMapperPage(laOperator* a, laEvent *e){
 |  |  int OPINV_AddInputMapperPage(laOperator* a, laEvent *e){
 | 
											
												
													
														|  |      laRackPage* dp=memAcquireHyper(sizeof(laRackPage));
 |  |      laRackPage* dp=memAcquireHyper(sizeof(laRackPage));
 | 
											
												
													
														|  |      strSafeSet(&dp->Name,"New Page");
 |  |      strSafeSet(&dp->Name,"New Page");
 | 
											
												
													
														|  | -    lstAppendItem(&MAIN.InputMappingPages, dp); MAIN.CurrentInputMappingPage=dp;
 |  | 
 | 
											
												
													
														|  | -    laNotifyUsers("la.input_mapping_pages");
 |  | 
 | 
											
												
													
														|  | 
 |  | +    lstAppendItem(&MAIN.InputMapping->Pages, dp); MAIN.InputMapping->CurrentPage=dp;
 | 
											
												
													
														|  | 
 |  | +    laNotifyUsers("la.input_mapping"); laRecordAndPush(0,"la.input_mapping","Add Page", 0);
 | 
											
												
													
														|  |      return LA_FINISHED;
 |  |      return LA_FINISHED;
 | 
											
												
													
														|  |  }
 |  |  }
 | 
											
												
													
														|  |  int OPINV_AddNodesRack(laOperator* a, laEvent *e){
 |  |  int OPINV_AddNodesRack(laOperator* a, laEvent *e){
 | 
											
												
													
														|  |      laRackPage* dp=a->This?a->This->EndInstance:0; if(!dp) return LA_FINISHED;
 |  |      laRackPage* dp=a->This?a->This->EndInstance:0; if(!dp) return LA_FINISHED;
 | 
											
												
													
														|  | -    laNodeRack* ir=memAcquire(sizeof(laNodeRack)); 
 |  | 
 | 
											
												
													
														|  | 
 |  | +    laNodeRack* ir=memAcquire(sizeof(laNodeRack));
 | 
											
												
													
														|  |      char* type=strGetArgumentString(a->ExtraInstructionsP, "type");
 |  |      char* type=strGetArgumentString(a->ExtraInstructionsP, "type");
 | 
											
												
													
														|  |      strSafeSet(&ir->Name,"New Rack");
 |  |      strSafeSet(&ir->Name,"New Rack");
 | 
											
												
													
														|  | -    lstAppendItem(&dp->Racks, ir);
 |  | 
 | 
											
												
													
														|  | -    if(strSame(type,"DRIVER")){ ir->RackType=LA_RACK_TYPE_DRIVER; laNotifyUsers("la.driver_pages"); }
 |  | 
 | 
											
												
													
														|  | -    else{ ir->RackType=LA_RACK_TYPE_INPUT; laNotifyUsers("la.input_mapping_pages"); }
 |  | 
 | 
											
												
													
														|  | 
 |  | +    lstAppendItem(&dp->Racks, ir); ir->ParentPage=dp;
 | 
											
												
													
														|  | 
 |  | +    if(strSame(type,"DRIVER")){ ir->RackType=LA_RACK_TYPE_DRIVER; laNotifyUsers("la.drivers"); laRecordAndPush(0,"la.drivers","Add rack", 0); }
 | 
											
												
													
														|  | 
 |  | +    else{ ir->RackType=LA_RACK_TYPE_INPUT; laNotifyUsers("la.input_mapping"); laRecordAndPush(0,"la.input_mapping","Add rack", 0); }
 | 
											
												
													
														|  |      return LA_FINISHED;
 |  |      return LA_FINISHED;
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |  }
 |  |  }
 | 
											
										
											
												
													
														|  | @@ -489,12 +489,12 @@ int OPINV_RebuildInputMapping(laOperator* a, laEvent *e){
 | 
											
												
													
														|  |  laBaseNode* la_CreateInputMapperNode(laNodeRack* ir, laBaseNodeType* NodeType){
 |  |  laBaseNode* la_CreateInputMapperNode(laNodeRack* ir, laBaseNodeType* NodeType){
 | 
											
												
													
														|  |      laBaseNode* bn=memAcquire(NodeType->NodeSize);
 |  |      laBaseNode* bn=memAcquire(NodeType->NodeSize);
 | 
											
												
													
														|  |      bn->Type=NodeType; NodeType->Init(bn); lstAppendItem(&ir->Nodes, bn); bn->InRack=ir;
 |  |      bn->Type=NodeType; NodeType->Init(bn); lstAppendItem(&ir->Nodes, bn); bn->InRack=ir;
 | 
											
												
													
														|  | -    laNotifyUsers("la.input_mapping_pages");
 |  | 
 | 
											
												
													
														|  | 
 |  | +    laNotifyUsers("la.input_mapping"); laRecordAndPush(0,"la.input_mapping","Add node", 0);
 | 
											
												
													
														|  |      return bn;
 |  |      return bn;
 | 
											
												
													
														|  |  }
 |  |  }
 | 
											
												
													
														|  |  void la_DestroyInputMapperNode(laBaseNode* bn){
 |  |  void la_DestroyInputMapperNode(laBaseNode* bn){
 | 
											
												
													
														|  |      lstRemoveItem(bn->InRack, bn); bn->Type->Destroy(bn);
 |  |      lstRemoveItem(bn->InRack, bn); bn->Type->Destroy(bn);
 | 
											
												
													
														|  | -    laNotifyUsers("la.input_racks");
 |  | 
 | 
											
												
													
														|  | 
 |  | +    laNotifyUsers("la.input_racks"); laRecordAndPush(0,"la.input_mapping","Delete node", 0);
 | 
											
												
													
														|  |      memFree(bn);
 |  |      memFree(bn);
 | 
											
												
													
														|  |  }
 |  |  }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
										
											
												
													
														|  | @@ -539,22 +539,87 @@ void laui_AddInputMapperNode(laUiList *uil, laPropPack *This, laPropPack *Extra,
 | 
											
												
													
														|  |      laShowItemFull(uil,c,This,"add_node_input",0,"type=VISUALIZER;text=Visualizer",0,0);
 |  |      laShowItemFull(uil,c,This,"add_node_input",0,"type=VISUALIZER;text=Visualizer",0,0);
 | 
											
												
													
														|  |  }
 |  |  }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | 
 |  | +int OPINV_MoveNodeToRack(laOperator* a, laEvent *e){
 | 
											
												
													
														|  | 
 |  | +    laBaseNode* n=a->This?a->This->EndInstance:0; if(!n||!n->InRack) return LA_CANCELED;
 | 
											
												
													
														|  | 
 |  | +    laBaseNodeType* bnt=0; laNodeRack* target;
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +    char* direction=strGetArgumentString(a->ExtraInstructionsP,"direction");
 | 
											
												
													
														|  | 
 |  | +    
 | 
											
												
													
														|  | 
 |  | +    if(n->InRack->RackType==LA_RACK_TYPE_DRIVER){ laNotifyUsers("la.drivers"); }
 | 
											
												
													
														|  | 
 |  | +    else{ laNotifyUsers("la.input_mapping"); }
 | 
											
												
													
														|  | 
 |  | +    if(strSame(direction,"left")) target=n->InRack->Item.pPrev; else target=n->InRack->Item.pNext;
 | 
											
												
													
														|  | 
 |  | +    if(!target) return LA_CANCELED;
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +    lstRemoveItem(&n->InRack->Nodes, n); lstAppendItem(&target->Nodes,n); n->InRack=target;
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +    return LA_FINISHED;
 | 
											
												
													
														|  | 
 |  | +}
 | 
											
												
													
														|  | 
 |  | +int OPINV_DeleteNode(laOperator* a, laEvent *e){
 | 
											
												
													
														|  | 
 |  | +    laBaseNode* n=a->This?a->This->EndInstance:0; if(!n||!n->InRack) return LA_CANCELED;
 | 
											
												
													
														|  | 
 |  | +    laBaseNodeType* bnt=0; laNodeRack* target;
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +    if(n->InRack->RackType==LA_RACK_TYPE_DRIVER){ laDriverRequestRebuild(); laNotifyUsers("la.drivers"); }
 | 
											
												
													
														|  | 
 |  | +    else{ laMappingRequestRebuild(); laNotifyUsers("la.input_mapping"); }
 | 
											
												
													
														|  | 
 |  | +    lstRemoveItem(&n->InRack->Nodes, n); n->Type->Destroy(n); memLeave(n);
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +    return LA_FINISHED;
 | 
											
												
													
														|  | 
 |  | +}
 | 
											
												
													
														|  | 
 |  | +int OPINV_MoveRack(laOperator* a, laEvent *e){
 | 
											
												
													
														|  | 
 |  | +    laNodeRack* r=a->This?a->This->EndInstance:0; if(!r) return LA_CANCELED;
 | 
											
												
													
														|  | 
 |  | +    char* direction=strGetArgumentString(a->ExtraInstructionsP,"direction");
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +    if(strSame(direction,"left")) lstMoveUp(&r->ParentPage->Racks,r); else lstMoveDown(&r->ParentPage->Racks,r);
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +    if(r->RackType==LA_RACK_TYPE_DRIVER){ laNotifyUsers("la.drivers");  laRecordAndPush(0,"la.drivers","Move rack", 0); }
 | 
											
												
													
														|  | 
 |  | +    else{ laNotifyUsers("la.input_mapping"); laRecordAndPush(0,"la.input_mapping","Move rack", 0); }
 | 
											
												
													
														|  | 
 |  | +    return LA_FINISHED;
 | 
											
												
													
														|  | 
 |  | +}
 | 
											
												
													
														|  | 
 |  | +int OPINV_InsertRack(laOperator* a, laEvent *e){
 | 
											
												
													
														|  | 
 |  | +    laNodeRack* rr=a->This?a->This->EndInstance:0; if(!rr) return LA_CANCELED;
 | 
											
												
													
														|  | 
 |  | +    laNodeRack* r=memAcquire(sizeof(laNodeRack));
 | 
											
												
													
														|  | 
 |  | +    strSafeSet(&r->Name,"New Rack");
 | 
											
												
													
														|  | 
 |  | +    lstInsertItemAfter(&rr->ParentPage->Racks,r,rr); r->ParentPage=rr->ParentPage; r->RackType=rr->RackType;
 | 
											
												
													
														|  | 
 |  | +    if(r->RackType==LA_RACK_TYPE_DRIVER){ laNotifyUsers("la.drivers"); laRecordAndPush(0,"la.drivers","Insert rack", 0); }
 | 
											
												
													
														|  | 
 |  | +    else{ laNotifyUsers("la.input_mapping"); laRecordAndPush(0,"la.input_mapping","Insert rack", 0); }
 | 
											
												
													
														|  | 
 |  | +    return LA_FINISHED;
 | 
											
												
													
														|  | 
 |  | +}
 | 
											
												
													
														|  | 
 |  | +int OPINV_DeleteRack(laOperator* a, laEvent *e){
 | 
											
												
													
														|  | 
 |  | +    laNodeRack* rr=a->This?a->This->EndInstance:0; if(!rr) return LA_CANCELED;
 | 
											
												
													
														|  | 
 |  | +    if(strSame(strGetArgumentString(a->ExtraInstructionsP,"confirm"),"true")){
 | 
											
												
													
														|  | 
 |  | +        laBaseNode* n; while(n=lstPopItem(&rr->Nodes)){ n->Type->Destroy(n); memLeave(n); }
 | 
											
												
													
														|  | 
 |  | +        strSafeDestroy(&rr->Name); lstRemoveItem(&rr->ParentPage->Racks, rr); memLeave(rr);
 | 
											
												
													
														|  | 
 |  | +        if(rr->RackType==LA_RACK_TYPE_DRIVER){ laNotifyUsers("la.drivers"); laRecordAndPush(0,"la.input_mapping","Delete rack", 0); }
 | 
											
												
													
														|  | 
 |  | +        else{ laNotifyUsers("la.input_mapping"); laRecordAndPush(0,"la.input_mapping","Delete rack", 0); }
 | 
											
												
													
														|  | 
 |  | +        return LA_FINISHED;
 | 
											
												
													
														|  | 
 |  | +    }
 | 
											
												
													
														|  | 
 |  | +    laEnableOperatorPanel(a,a->This,e->x,e->y,200,200,0,0,0,0,0,0,0,0,e);
 | 
											
												
													
														|  | 
 |  | +    return LA_RUNNING;
 | 
											
												
													
														|  | 
 |  | +}
 | 
											
												
													
														|  | 
 |  | +void laui_DeleteRack(laUiList *uil, laPropPack *This, laPropPack *Extra, laColumn *UNUSED, int context){
 | 
											
												
													
														|  | 
 |  | +    laColumn* c=laFirstColumn(uil);
 | 
											
												
													
														|  | 
 |  | +    laShowItemFull(uil,c,This,"delete",0,"confirm=true;",0,0);
 | 
											
												
													
														|  | 
 |  | +}
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  |  laPropContainer* laget_BaseNodeType(laBaseNode* bn){
 |  |  laPropContainer* laget_BaseNodeType(laBaseNode* bn){
 | 
											
												
													
														|  |      for(int i=0;i<MAIN.NodeTypeNext;i++){ if(bn->Type==MAIN.NodeTypes[i]) return MAIN.NodeTypes[i]->pc; }
 |  |      for(int i=0;i<MAIN.NodeTypeNext;i++){ if(bn->Type==MAIN.NodeTypes[i]) return MAIN.NodeTypes[i]->pc; }
 | 
											
												
													
														|  |      return LA_PC_IDN_GENERIC;
 |  |      return LA_PC_IDN_GENERIC;
 | 
											
												
													
														|  |  }
 |  |  }
 | 
											
												
													
														|  | -int laget_InputNodeGap(laNodeRack* rack_unused, laBaseNode* n){
 |  | 
 | 
											
												
													
														|  | 
 |  | +int laget_BaseNodeGap(laNodeRack* rack_unused, laBaseNode* n){
 | 
											
												
													
														|  |      return n->Gap;
 |  |      return n->Gap;
 | 
											
												
													
														|  |  }
 |  |  }
 | 
											
												
													
														|  | -void laset_InputNodeGap(laBaseNode* n, int gap){
 |  | 
 | 
											
												
													
														|  | -    if(gap<0){
 |  | 
 | 
											
												
													
														|  | -        int done=0;
 |  | 
 | 
											
												
													
														|  | -        laBaseNode* nn=n; while(nn){ if(nn->Gap>0){ nn->Gap--; done=1; break; } nn=nn->Item.pPrev; }
 |  | 
 | 
											
												
													
														|  | 
 |  | +void laset_BaseNodeGap(laBaseNode* n, int gap){
 | 
											
												
													
														|  | 
 |  | +    laBaseNode* nn;
 | 
											
												
													
														|  | 
 |  | +    if(gap==-1){
 | 
											
												
													
														|  | 
 |  | +        int done=0; nn=n; while(nn){ if(nn->Gap>0){ nn->Gap--; done=1; break; } nn=nn->Item.pPrev; }
 | 
											
												
													
														|  |          if(done){ nn=n->Item.pNext; while(nn){ if(nn->Gap>0){ nn->Gap++; break; } nn=nn->Item.pNext; } }
 |  |          if(done){ nn=n->Item.pNext; while(nn){ if(nn->Gap>0){ nn->Gap++; break; } nn=nn->Item.pNext; } }
 | 
											
												
													
														|  | -    }
 |  | 
 | 
											
												
													
														|  | -    if(gap>0){
 |  | 
 | 
											
												
													
														|  | -        n->Gap+=gap;
 |  | 
 | 
											
												
													
														|  | -        laBaseNode* nn=n->Item.pNext; while(nn){ if(nn->Gap>0){ nn->Gap--; break; } nn=nn->Item.pNext; }
 |  | 
 | 
											
												
													
														|  | 
 |  | +    }elif(gap==1){
 | 
											
												
													
														|  | 
 |  | +        n->Gap+=gap; nn=n->Item.pNext; while(nn){ if(nn->Gap>0){ nn->Gap--; break; } nn=nn->Item.pNext; }
 | 
											
												
													
														|  | 
 |  | +    }elif(gap==-2){
 | 
											
												
													
														|  | 
 |  | +        if(n->Gap){ n->Gap--; if(nn=n->Item.pNext){ nn->Gap++; } }
 | 
											
												
													
														|  | 
 |  | +        elif(nn=n->Item.pPrev){ n->Gap=nn->Gap; nn->Gap=0; lstRemoveItem(&n->InRack->Nodes,n); lstInsertItemBefore(&n->InRack->Nodes,n,nn); }
 | 
											
												
													
														|  | 
 |  | +    }elif(gap==2){
 | 
											
												
													
														|  | 
 |  | +        if(nn=n->Item.pNext){ if(!nn->Gap){ nn->Gap=n->Gap; n->Gap=0; lstRemoveItem(&n->InRack->Nodes,n); lstInsertItemAfter(&n->InRack->Nodes,n,nn); }else{ nn->Gap--; n->Gap++; } }
 | 
											
												
													
														|  | 
 |  | +        else n->Gap++;
 | 
											
												
													
														|  |      }
 |  |      }
 | 
											
												
													
														|  |  }
 |  |  }
 | 
											
												
													
														|  |  void laset_InputNodeUserID(laInputControllerNode* n, int i){
 |  |  void laset_InputNodeUserID(laInputControllerNode* n, int i){
 | 
											
										
											
												
													
														|  | @@ -570,6 +635,9 @@ int laget_SocketEnumArrayLength(laInputControllerNodeSocket* s){
 | 
											
												
													
														|  |  int laget_VisualizerArrayLength(laInputVisualizerNode* s){
 |  |  int laget_VisualizerArrayLength(laInputVisualizerNode* s){
 | 
											
												
													
														|  |      return s->In->ArrLen?s->In->ArrLen:1;
 |  |      return s->In->ArrLen?s->In->ArrLen:1;
 | 
											
												
													
														|  |  }
 |  |  }
 | 
											
												
													
														|  | 
 |  | +laBoxedTheme* laget_NodeGetTheme(laNodeRack* rack_unused, laBaseNode* n){
 | 
											
												
													
														|  | 
 |  | +    return 0;
 | 
											
												
													
														|  | 
 |  | +}
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |  void laRegisterNode(laBaseNodeType* type, laPropContainer* pc, laBaseNodeInitF init, laBaseNodeDestroyF destroy, laBaseNodeVisitF visit, laBaseNodeEvalF eval, int nodesize, char* udf_string){
 |  |  void laRegisterNode(laBaseNodeType* type, laPropContainer* pc, laBaseNodeInitF init, laBaseNodeDestroyF destroy, laBaseNodeVisitF visit, laBaseNodeEvalF eval, int nodesize, char* udf_string){
 | 
											
												
													
														|  |      arrEnsureLength(&MAIN.NodeTypes, MAIN.NodeTypeNext, &MAIN.NodeTypeMax, sizeof(laBaseNode*));
 |  |      arrEnsureLength(&MAIN.NodeTypes, MAIN.NodeTypeNext, &MAIN.NodeTypeMax, sizeof(laBaseNode*));
 | 
											
										
											
												
													
														|  | @@ -597,22 +665,36 @@ void la_RegisterInputMapperOperators(){
 | 
											
												
													
														|  |      at=laCreateOperatorType("LA_add_input_mapper_node", "Add Node", "Add a input mapper node",0,0,0,OPINV_AddInputMapperNode,OPMOD_FinishOnData,'+',0);
 |  |      at=laCreateOperatorType("LA_add_input_mapper_node", "Add Node", "Add a input mapper node",0,0,0,OPINV_AddInputMapperNode,OPMOD_FinishOnData,'+',0);
 | 
											
												
													
														|  |      at->UiDefine=laui_AddInputMapperNode;
 |  |      at->UiDefine=laui_AddInputMapperNode;
 | 
											
												
													
														|  |      laCreateOperatorType("LA_input_mapping_rebuild", "Rebuild Input Mapping", "Rebuild input mapping for evaluation",0,0,0,OPINV_RebuildInputMapping,0,L'⭮',0);
 |  |      laCreateOperatorType("LA_input_mapping_rebuild", "Rebuild Input Mapping", "Rebuild input mapping for evaluation",0,0,0,OPINV_RebuildInputMapping,0,L'⭮',0);
 | 
											
												
													
														|  | 
 |  | +    laCreateOperatorType("LA_move_node_to_rack", "Move Node", "Move node to another rack",0,0,0,OPINV_MoveNodeToRack,0,0,0);
 | 
											
												
													
														|  | 
 |  | +    laCreateOperatorType("LA_delete_node", "Delete Node", "Delete this node",0,0,0,OPINV_DeleteNode,0,0,0);
 | 
											
												
													
														|  | 
 |  | +    laCreateOperatorType("LA_move_rack", "Move Rack", "Move this rack",0,0,0,OPINV_MoveRack,0,0,0);
 | 
											
												
													
														|  | 
 |  | +    laCreateOperatorType("LA_insert_rack", "Insert Rack", "Insert a new rack",0,0,0,OPINV_InsertRack,0,0,0);
 | 
											
												
													
														|  | 
 |  | +    at=laCreateOperatorType("LA_delete_rack", "Delete Rack", "Delete a rack",0,0,0,OPINV_DeleteRack,OPMOD_FinishOnData,L'❌',0);
 | 
											
												
													
														|  | 
 |  | +    at->UiDefine=laui_DeleteRack;
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |      pc=laAddPropertyContainer("la_node_rack", "Input Rack", "Input rack for putting input mapping nodes",0,0,sizeof(laNodeRack),0,0,1);
 |  |      pc=laAddPropertyContainer("la_node_rack", "Input Rack", "Input rack for putting input mapping nodes",0,0,sizeof(laNodeRack),0,0,1);
 | 
											
												
													
														|  |      laAddStringProperty(pc,"name","Name","Name of this rack",0,0,0,0,1,offsetof(laNodeRack,Name),0,0,0,0,LA_AS_IDENTIFIER);
 |  |      laAddStringProperty(pc,"name","Name","Name of this rack",0,0,0,0,1,offsetof(laNodeRack,Name),0,0,0,0,LA_AS_IDENTIFIER);
 | 
											
												
													
														|  |      p=laAddSubGroup(pc,"nodes","Nodes","Nodes under this rack","la_base_node",laget_BaseNodeType,0,0,-1,0,0,0,0,0,0,offsetof(laNodeRack,Nodes),0);
 |  |      p=laAddSubGroup(pc,"nodes","Nodes","Nodes under this rack","la_base_node",laget_BaseNodeType,0,0,-1,0,0,0,0,0,0,offsetof(laNodeRack,Nodes),0);
 | 
											
												
													
														|  | -    laSubGroupExtraFunctions(p,0,0,laget_InputNodeGap);
 |  | 
 | 
											
												
													
														|  | 
 |  | +    laSubGroupExtraFunctions(p,0,laget_NodeGetTheme,laget_BaseNodeGap);
 | 
											
												
													
														|  | 
 |  | +    laAddSubGroup(pc,"parent_page","Parent Page","Parent page of this rack","la_rack_page",0,0,0,offsetof(laNodeRack,ParentPage),0,0,0,0,0,0,0,LA_UDF_REFER);
 | 
											
												
													
														|  | 
 |  | +    laAddIntProperty(pc,"type", "Type", "Type of the rack", 0,0,0,0,0,0,0,0,offsetof(laNodeRack,RackType),0,0,0,0,0,0,0,0,0,0,LA_READ_ONLY);
 | 
											
												
													
														|  |      laAddOperatorProperty(pc,"add_node_input","Add Node","Add a node into this rack","LA_add_input_mapper_node",'+',0);
 |  |      laAddOperatorProperty(pc,"add_node_input","Add Node","Add a node into this rack","LA_add_input_mapper_node",'+',0);
 | 
											
												
													
														|  |      laAddOperatorProperty(pc,"add_node_driver","Add Node","Add a node into this rack","LA_add_driver_node",'+',0);
 |  |      laAddOperatorProperty(pc,"add_node_driver","Add Node","Add a node into this rack","LA_add_driver_node",'+',0);
 | 
											
												
													
														|  | 
 |  | +    laAddOperatorProperty(pc,"insert_rack","Insert Rack","Insert a rack","LA_insert_rack",'+',0);
 | 
											
												
													
														|  | 
 |  | +    laAddOperatorProperty(pc,"move","Move Rack","Move this rack","LA_move_rack",0,0);
 | 
											
												
													
														|  | 
 |  | +    laAddOperatorProperty(pc,"delete","Delete Rack","Delete this rack","LA_delete_rack",0,0);
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |      pc=laAddPropertyContainer("la_base_node", "Input Node", "Input logic node",0,0,sizeof(laBaseNode),0,0,1);
 |  |      pc=laAddPropertyContainer("la_base_node", "Input Node", "Input logic node",0,0,sizeof(laBaseNode),0,0,1);
 | 
											
												
													
														|  |      LA_PC_IDN_GENERIC=pc;
 |  |      LA_PC_IDN_GENERIC=pc;
 | 
											
												
													
														|  |      laAddStringProperty(pc,"name","Name","Name of this input node",0,0,0,0,1,offsetof(laBaseNode,Name),0,0,0,0,LA_AS_IDENTIFIER);
 |  |      laAddStringProperty(pc,"name","Name","Name of this input node",0,0,0,0,1,offsetof(laBaseNode,Name),0,0,0,0,LA_AS_IDENTIFIER);
 | 
											
												
													
														|  | -    laAddIntProperty(pc,"__gap", "Gap", "Gap of the node", 0,0,0,0,0,0,0,0,offsetof(laBaseNode,Gap),0,laset_InputNodeGap,0,0,0,0,0,0,0,0,0);
 |  | 
 | 
											
												
													
														|  | 
 |  | +    laAddIntProperty(pc,"__gap", "Gap", "Gap of the node", 0,0,0,0,0,0,0,0,offsetof(laBaseNode,Gap),0,laset_BaseNodeGap,0,0,0,0,0,0,0,0,0);
 | 
											
												
													
														|  |      laAddSubGroup(pc,"internal_type","Internal Type","Internal node type","any_pointer",0,0,0,offsetof(laBaseNode,Type),0,0,0,0,0,0,0,LA_READ_ONLY|LA_UDF_REFER);
 |  |      laAddSubGroup(pc,"internal_type","Internal Type","Internal node type","any_pointer",0,0,0,offsetof(laBaseNode,Type),0,0,0,0,0,0,0,LA_READ_ONLY|LA_UDF_REFER);
 | 
											
												
													
														|  | 
 |  | +    laAddOperatorProperty(pc,"move","Move","Move node across racks","LA_move_node_to_rack",0,0);
 | 
											
												
													
														|  | 
 |  | +    laAddOperatorProperty(pc,"delete","Delete","Delete node","LA_delete_node",0,0);
 | 
											
												
													
														|  | 
 |  | +    laAddSubGroup(pc,"in_rack","In Rack","The rack this node is in","la_node_rack",0,0,0,offsetof(laBaseNode,InRack),0,0,0,0,0,0,0,LA_UDF_REFER);
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |      pc=laAddPropertyContainer("la_input_controller_node", "Controller output", "Output controller values",0,laui_ControllerNode,sizeof(laInputControllerNode),0,0,1);
 |  |      pc=laAddPropertyContainer("la_input_controller_node", "Controller output", "Output controller values",0,laui_ControllerNode,sizeof(laInputControllerNode),0,0,1);
 | 
											
												
													
														|  | -    LA_PC_IDN_CONTROLLER=pc;
 |  | 
 | 
											
												
													
														|  | 
 |  | +    LA_PC_IDN_CONTROLLER=pc; laPropContainerExtraFunctions(pc,0,0,0,laui_DefaultNodeOperationsPropUiDefine);
 | 
											
												
													
														|  |      laAddSubGroup(pc,"base","Base","Base node","la_base_node",0,0,0,0,0,0,0,0,0,0,0,LA_UDF_LOCAL);
 |  |      laAddSubGroup(pc,"base","Base","Base node","la_base_node",0,0,0,0,0,0,0,0,0,0,0,LA_UDF_LOCAL);
 | 
											
												
													
														|  |      laAddIntProperty(pc,"user_id", "User ID", "Which controller should the data come from", 0,0,0,0,0,0,0,0,offsetof(laInputControllerNode,UserID),0,0,0,0,0,0,0,0,0,0,0);
 |  |      laAddIntProperty(pc,"user_id", "User ID", "Which controller should the data come from", 0,0,0,0,0,0,0,0,offsetof(laInputControllerNode,UserID),0,0,0,0,0,0,0,0,0,0,0);
 | 
											
												
													
														|  |      laAddSubGroup(pc,"out0","Out 0","Output 0","la_input_controller_node_socket",0,0,0,offsetof(laInputControllerNode, Sockets[0]),0,0,0,0,0,0,0,LA_UDF_LOCAL);
 |  |      laAddSubGroup(pc,"out0","Out 0","Output 0","la_input_controller_node_socket",0,0,0,offsetof(laInputControllerNode, Sockets[0]),0,0,0,0,0,0,0,LA_UDF_LOCAL);
 | 
											
										
											
												
													
														|  | @@ -634,7 +716,7 @@ void la_RegisterInputMapperOperators(){
 | 
											
												
													
														|  |      laAddSubGroup(pc, "out", "Out","Output value","la_out_socket",0,0,0,offsetof(laInputControllerNodeSocket,Out),0,0,0,0,0,0,0,LA_UDF_SINGLE);
 |  |      laAddSubGroup(pc, "out", "Out","Output value","la_out_socket",0,0,0,offsetof(laInputControllerNodeSocket,Out),0,0,0,0,0,0,0,LA_UDF_SINGLE);
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |      pc=laAddPropertyContainer("la_input_visualizer_node", "Visualizer", "Visualizer node",0,laui_InputVisualizeNode,sizeof(laInputVisualizerNode),0,0,1);
 |  |      pc=laAddPropertyContainer("la_input_visualizer_node", "Visualizer", "Visualizer node",0,laui_InputVisualizeNode,sizeof(laInputVisualizerNode),0,0,1);
 | 
											
												
													
														|  | -    LA_PC_IDN_VISUALIZER=pc;
 |  | 
 | 
											
												
													
														|  | 
 |  | +    LA_PC_IDN_VISUALIZER=pc; laPropContainerExtraFunctions(pc,0,0,0,laui_DefaultNodeOperationsPropUiDefine);
 | 
											
												
													
														|  |      laAddSubGroup(pc,"base","Base","Base node","la_base_node",0,0,0,0,0,0,0,0,0,0,0,LA_UDF_LOCAL);
 |  |      laAddSubGroup(pc,"base","Base","Base node","la_base_node",0,0,0,0,0,0,0,0,0,0,0,LA_UDF_LOCAL);
 | 
											
												
													
														|  |      laAddSubGroup(pc, "in", "In","Input value","la_in_socket",0,0,0,offsetof(laInputVisualizerNode,In),0,0,0,0,0,0,0,LA_UDF_SINGLE);
 |  |      laAddSubGroup(pc, "in", "In","Input value","la_in_socket",0,0,0,offsetof(laInputVisualizerNode,In),0,0,0,0,0,0,0,LA_UDF_SINGLE);
 | 
											
												
													
														|  |      laAddFloatProperty(pc,"axis", "🡘", "Axis value", LA_WIDGET_VALUE_METER,0,0,1,-1,0,0,0,offsetof(laInputVisualizerNode,RealVal),0,0,0,0,0,0,0,0,0,0,LA_READ_ONLY);
 |  |      laAddFloatProperty(pc,"axis", "🡘", "Axis value", LA_WIDGET_VALUE_METER,0,0,1,-1,0,0,0,offsetof(laInputVisualizerNode,RealVal),0,0,0,0,0,0,0,0,0,0,LA_READ_ONLY);
 | 
											
										
											
												
													
														|  | @@ -644,7 +726,7 @@ void la_RegisterInputMapperOperators(){
 | 
											
												
													
														|  |      laAddEnumItemAs(p,"ACTIVE", "Active", "Button is pressed", 1, 0);
 |  |      laAddEnumItemAs(p,"ACTIVE", "Active", "Button is pressed", 1, 0);
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |      pc=laAddPropertyContainer("la_split_node", "Split", "Split node",0,laui_SplitNode,sizeof(laSplitNode),0,0,1);
 |  |      pc=laAddPropertyContainer("la_split_node", "Split", "Split node",0,laui_SplitNode,sizeof(laSplitNode),0,0,1);
 | 
											
												
													
														|  | -    LA_PC_IDN_SPLIT=pc;
 |  | 
 | 
											
												
													
														|  | 
 |  | +    LA_PC_IDN_SPLIT=pc; laPropContainerExtraFunctions(pc,0,0,0,laui_DefaultNodeOperationsPropUiDefine);
 | 
											
												
													
														|  |      laAddSubGroup(pc,"base","Base","Base node","la_base_node",0,0,0,0,0,0,0,0,0,0,0,LA_UDF_LOCAL);
 |  |      laAddSubGroup(pc,"base","Base","Base node","la_base_node",0,0,0,0,0,0,0,0,0,0,0,LA_UDF_LOCAL);
 | 
											
												
													
														|  |      laAddSubGroup(pc,"in", "In","Input value","la_in_socket",0,0,0,offsetof(laSplitNode,In),0,0,0,0,0,0,0,LA_UDF_SINGLE);
 |  |      laAddSubGroup(pc,"in", "In","Input value","la_in_socket",0,0,0,offsetof(laSplitNode,In),0,0,0,0,0,0,0,LA_UDF_SINGLE);
 | 
											
												
													
														|  |      laAddSubGroup(pc,"out0","Out 0","Output 0","la_split_node_out_socket",0,0,0,offsetof(laSplitNode, Out[0]),0,0,0,0,0,0,0,LA_UDF_LOCAL);
 |  |      laAddSubGroup(pc,"out0","Out 0","Output 0","la_split_node_out_socket",0,0,0,offsetof(laSplitNode, Out[0]),0,0,0,0,0,0,0,LA_UDF_LOCAL);
 | 
											
										
											
												
													
														|  | @@ -661,7 +743,7 @@ void la_RegisterInputMapperOperators(){
 | 
											
												
													
														|  |      laAddSubGroup(pc, "out", "Out","Output value","la_out_socket",0,0,0,offsetof(laSplitNodeOutSocket,Out),0,0,0,0,0,0,0,LA_UDF_SINGLE);
 |  |      laAddSubGroup(pc, "out", "Out","Output value","la_out_socket",0,0,0,offsetof(laSplitNodeOutSocket,Out),0,0,0,0,0,0,0,LA_UDF_SINGLE);
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |      pc=laAddPropertyContainer("la_switch_node", "Switch", "Switch node",0,laui_SwitchNode,sizeof(laSwitchNode),0,0,1);
 |  |      pc=laAddPropertyContainer("la_switch_node", "Switch", "Switch node",0,laui_SwitchNode,sizeof(laSwitchNode),0,0,1);
 | 
											
												
													
														|  | -    LA_PC_IDN_SWITCH=pc;
 |  | 
 | 
											
												
													
														|  | 
 |  | +    LA_PC_IDN_SWITCH=pc; laPropContainerExtraFunctions(pc,0,0,0,laui_DefaultNodeOperationsPropUiDefine);
 | 
											
												
													
														|  |      laAddSubGroup(pc,"base","Base","Base node","la_base_node",0,0,0,0,0,0,0,0,0,0,0,LA_UDF_LOCAL);
 |  |      laAddSubGroup(pc,"base","Base","Base node","la_base_node",0,0,0,0,0,0,0,0,0,0,0,LA_UDF_LOCAL);
 | 
											
												
													
														|  |      laAddSubGroup(pc,"out", "Out","Output value","la_out_socket",0,0,0,offsetof(laSwitchNode, Out),0,0,0,0,0,0,0,LA_UDF_SINGLE);
 |  |      laAddSubGroup(pc,"out", "Out","Output value","la_out_socket",0,0,0,offsetof(laSwitchNode, Out),0,0,0,0,0,0,0,LA_UDF_SINGLE);
 | 
											
												
													
														|  |      laAddSubGroup(pc,"in0","In 0","Input 0","la_switch_node_in_socket",0,0,0,offsetof(laSwitchNode, In[0]),0,0,0,0,0,0,0,LA_UDF_LOCAL);
 |  |      laAddSubGroup(pc,"in0","In 0","Input 0","la_switch_node_in_socket",0,0,0,offsetof(laSwitchNode, In[0]),0,0,0,0,0,0,0,LA_UDF_LOCAL);
 | 
											
										
											
												
													
														|  | @@ -679,7 +761,7 @@ void la_RegisterInputMapperOperators(){
 | 
											
												
													
														|  |      laAddSubGroup(pc, "in", "In","Input value","la_in_socket",0,0,0,offsetof(laSwitchNodeInSocket,In),0,0,0,0,0,0,0,LA_UDF_SINGLE);
 |  |      laAddSubGroup(pc, "in", "In","Input value","la_in_socket",0,0,0,offsetof(laSwitchNodeInSocket,In),0,0,0,0,0,0,0,LA_UDF_SINGLE);
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |      pc=laAddPropertyContainer("la_combine_node", "Combine", "Combine node",0,laui_CombineNode,sizeof(laCombineNode),0,0,1);
 |  |      pc=laAddPropertyContainer("la_combine_node", "Combine", "Combine node",0,laui_CombineNode,sizeof(laCombineNode),0,0,1);
 | 
											
												
													
														|  | -    LA_PC_IDN_COMBINE=pc;
 |  | 
 | 
											
												
													
														|  | 
 |  | +    LA_PC_IDN_COMBINE=pc; laPropContainerExtraFunctions(pc,0,0,0,laui_DefaultNodeOperationsPropUiDefine);
 | 
											
												
													
														|  |      laAddSubGroup(pc,"base","Base","Base node","la_base_node",0,0,0,0,0,0,0,0,0,0,0,LA_UDF_LOCAL);
 |  |      laAddSubGroup(pc,"base","Base","Base node","la_base_node",0,0,0,0,0,0,0,0,0,0,0,LA_UDF_LOCAL);
 | 
											
												
													
														|  |      laAddSubGroup(pc,"out", "Out","Output value","la_out_socket",0,0,0,offsetof(laCombineNode, Out),0,0,0,0,0,0,0,LA_UDF_SINGLE);
 |  |      laAddSubGroup(pc,"out", "Out","Output value","la_out_socket",0,0,0,offsetof(laCombineNode, Out),0,0,0,0,0,0,0,LA_UDF_SINGLE);
 | 
											
												
													
														|  |      laAddSubGroup(pc,"out_int", "Out Int","Output value in int format","la_out_socket",0,0,0,offsetof(laCombineNode, OutInt),0,0,0,0,0,0,0,LA_UDF_SINGLE);
 |  |      laAddSubGroup(pc,"out_int", "Out Int","Output value in int format","la_out_socket",0,0,0,offsetof(laCombineNode, OutInt),0,0,0,0,0,0,0,LA_UDF_SINGLE);
 | 
											
										
											
												
													
														|  | @@ -694,7 +776,7 @@ void la_RegisterInputMapperOperators(){
 | 
											
												
													
														|  |      laAddSubGroup(pc,"in7","In 7","Input 7","la_switch_node_in_socket",0,0,0,offsetof(laCombineNode, In[7]),0,0,0,0,0,0,0,LA_UDF_LOCAL);
 |  |      laAddSubGroup(pc,"in7","In 7","Input 7","la_switch_node_in_socket",0,0,0,offsetof(laCombineNode, In[7]),0,0,0,0,0,0,0,LA_UDF_LOCAL);
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |      pc=laAddPropertyContainer("la_values_node", "Values", "Values node",0,laui_ValuesNode,sizeof(laValuesNode),0,0,1);
 |  |      pc=laAddPropertyContainer("la_values_node", "Values", "Values node",0,laui_ValuesNode,sizeof(laValuesNode),0,0,1);
 | 
											
												
													
														|  | -    LA_PC_IDN_VALUES=pc;
 |  | 
 | 
											
												
													
														|  | 
 |  | +    LA_PC_IDN_VALUES=pc; laPropContainerExtraFunctions(pc,0,0,0,laui_DefaultNodeOperationsPropUiDefine);
 | 
											
												
													
														|  |      laAddSubGroup(pc,"base","Base","Base node","la_base_node",0,0,0,0,0,0,0,0,0,0,0,LA_UDF_LOCAL);
 |  |      laAddSubGroup(pc,"base","Base","Base node","la_base_node",0,0,0,0,0,0,0,0,0,0,0,LA_UDF_LOCAL);
 | 
											
												
													
														|  |      laAddSubGroup(pc,"out0","Out 0","Output 0","la_split_node_out_socket",0,0,0,offsetof(laValuesNode, Out[0]),0,0,0,0,0,0,0,LA_UDF_LOCAL);
 |  |      laAddSubGroup(pc,"out0","Out 0","Output 0","la_split_node_out_socket",0,0,0,offsetof(laValuesNode, Out[0]),0,0,0,0,0,0,0,LA_UDF_LOCAL);
 | 
											
												
													
														|  |      laAddSubGroup(pc,"out1","Out 1","Output 1","la_split_node_out_socket",0,0,0,offsetof(laValuesNode, Out[1]),0,0,0,0,0,0,0,LA_UDF_LOCAL);
 |  |      laAddSubGroup(pc,"out1","Out 1","Output 1","la_split_node_out_socket",0,0,0,offsetof(laValuesNode, Out[1]),0,0,0,0,0,0,0,LA_UDF_LOCAL);
 | 
											
										
											
												
													
														|  | @@ -738,7 +820,7 @@ void la_RegisterInputMapperOperators(){
 | 
											
												
													
														|  |      p=laAddEnumProperty(pc,"valuee7","SW","Enum Value 7",LA_WIDGET_ENUM_CYCLE,0,0,0,0,offsetof(laValuesNode, ValuesE[7]),0,0,0,0,0,0,0,0,0,0);la_AddValuesNodeEnumValue(p);
 |  |      p=laAddEnumProperty(pc,"valuee7","SW","Enum Value 7",LA_WIDGET_ENUM_CYCLE,0,0,0,0,offsetof(laValuesNode, ValuesE[7]),0,0,0,0,0,0,0,0,0,0);la_AddValuesNodeEnumValue(p);
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |      pc=laAddPropertyContainer("la_matrix_node", "Matrix", "Matrix node",0,laui_MatrixNode,sizeof(laMatrixNode),0,0,1);
 |  |      pc=laAddPropertyContainer("la_matrix_node", "Matrix", "Matrix node",0,laui_MatrixNode,sizeof(laMatrixNode),0,0,1);
 | 
											
												
													
														|  | -    LA_PC_IDN_MATRIX=pc;
 |  | 
 | 
											
												
													
														|  | 
 |  | +    LA_PC_IDN_MATRIX=pc; laPropContainerExtraFunctions(pc,0,0,0,laui_DefaultNodeOperationsPropUiDefine);
 | 
											
												
													
														|  |      laAddSubGroup(pc,"base","Base","Base node","la_base_node",0,0,0,0,0,0,0,0,0,0,0,LA_UDF_LOCAL);
 |  |      laAddSubGroup(pc,"base","Base","Base node","la_base_node",0,0,0,0,0,0,0,0,0,0,0,LA_UDF_LOCAL);
 | 
											
												
													
														|  |      laAddSubGroup(pc,"in_l", "L","Left input","la_in_socket",0,0,0,offsetof(laMatrixNode, InL),0,0,0,0,0,0,0,LA_UDF_SINGLE);
 |  |      laAddSubGroup(pc,"in_l", "L","Left input","la_in_socket",0,0,0,offsetof(laMatrixNode, InL),0,0,0,0,0,0,0,LA_UDF_SINGLE);
 | 
											
												
													
														|  |      laAddSubGroup(pc,"in_r", "R","Right input","la_in_socket",0,0,0,offsetof(laMatrixNode, InR),0,0,0,0,0,0,0,LA_UDF_SINGLE);
 |  |      laAddSubGroup(pc,"in_r", "R","Right input","la_in_socket",0,0,0,offsetof(laMatrixNode, InR),0,0,0,0,0,0,0,LA_UDF_SINGLE);
 | 
											
										
											
												
													
														|  | @@ -748,7 +830,7 @@ void la_RegisterInputMapperOperators(){
 | 
											
												
													
														|  |      laAddEnumItemAs(p,"INV", "Invert", "Invert L or R", LA_MATRIX_NODE_OP_INV, 0);
 |  |      laAddEnumItemAs(p,"INV", "Invert", "Invert L or R", LA_MATRIX_NODE_OP_INV, 0);
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |      pc=laAddPropertyContainer("la_math_node", "Math", "Math node",0,laui_MathNode,sizeof(laMathNode),0,0,1);
 |  |      pc=laAddPropertyContainer("la_math_node", "Math", "Math node",0,laui_MathNode,sizeof(laMathNode),0,0,1);
 | 
											
												
													
														|  | -    LA_PC_IDN_MATH=pc;
 |  | 
 | 
											
												
													
														|  | 
 |  | +    LA_PC_IDN_MATH=pc; laPropContainerExtraFunctions(pc,0,0,0,laui_DefaultNodeOperationsPropUiDefine);
 | 
											
												
													
														|  |      laAddSubGroup(pc,"base","Base","Base node","la_base_node",0,0,0,0,0,0,0,0,0,0,0,LA_UDF_LOCAL);
 |  |      laAddSubGroup(pc,"base","Base","Base node","la_base_node",0,0,0,0,0,0,0,0,0,0,0,LA_UDF_LOCAL);
 | 
											
												
													
														|  |      laAddFloatProperty(pc, "vl", "L", "Left value", 0,0,0,0,0,0,0,0,offsetof(laMathNode, ValueL),0,0,0,0,0,0,0,0,0,0,0);
 |  |      laAddFloatProperty(pc, "vl", "L", "Left value", 0,0,0,0,0,0,0,0,offsetof(laMathNode, ValueL),0,0,0,0,0,0,0,0,0,0,0);
 | 
											
												
													
														|  |      laAddFloatProperty(pc, "vr", "R", "Right value", 0,0,0,0,0,0,0,0,offsetof(laMathNode, ValueR),0,0,0,0,0,0,0,0,0,0,0);
 |  |      laAddFloatProperty(pc, "vr", "R", "Right value", 0,0,0,0,0,0,0,0,offsetof(laMathNode, ValueR),0,0,0,0,0,0,0,0,0,0,0);
 | 
											
										
											
												
													
														|  | @@ -789,28 +871,28 @@ void laSetExtraNodeFunctions(laUiDefineFunc AddInputNodes, laUiDefineFunc AddDri
 | 
											
												
													
														|  |      MAIN.ExtraGetInputNodeType=GetInputNodeType; MAIN.ExtraGetDriverNodeType=GetDriverNodeType;
 |  |      MAIN.ExtraGetInputNodeType=GetInputNodeType; MAIN.ExtraGetDriverNodeType=GetDriverNodeType;
 | 
											
												
													
														|  |  }
 |  |  }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -void laMappingRequestRebuild(){ MAIN.MappingNeedRebuild=1; }
 |  | 
 | 
											
												
													
														|  | -void laMappingRequestEval(){ MAIN.MappingNeedEval=1; }
 |  | 
 | 
											
												
													
														|  | 
 |  | +void laMappingRequestRebuild(){ MAIN.InputMapping->NeedRebuild=1; }
 | 
											
												
													
														|  | 
 |  | +void laMappingRequestEval(){ MAIN.InputMapping->NeedEval=1; }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |  int la_RunInputMapping(){
 |  |  int la_RunInputMapping(){
 | 
											
												
													
														|  | -    MAIN.MappingNeedEval = 0;
 |  | 
 | 
											
												
													
														|  | -    for(laListItemPointer*lip=MAIN.InputMappingEval.pFirst;lip;lip=lip->pNext){
 |  | 
 | 
											
												
													
														|  | 
 |  | +    MAIN.InputMapping->NeedEval = 0;
 | 
											
												
													
														|  | 
 |  | +    for(laListItemPointer*lip=MAIN.InputMapping->Eval.pFirst;lip;lip=lip->pNext){
 | 
											
												
													
														|  |          laBaseNode* n=lip->p; n->Type->Eval(n);
 |  |          laBaseNode* n=lip->p; n->Type->Eval(n);
 | 
											
												
													
														|  |      }
 |  |      }
 | 
											
												
													
														|  |      return 1;
 |  |      return 1;
 | 
											
												
													
														|  |  }
 |  |  }
 | 
											
												
													
														|  |  int la_RebuildInputMapping(){
 |  |  int la_RebuildInputMapping(){
 | 
											
												
													
														|  | -    MAIN.MappingNeedRebuild = 0;
 |  | 
 | 
											
												
													
														|  | -    while(lstPopPointer(&MAIN.InputMappingEval));
 |  | 
 | 
											
												
													
														|  | -    laListHandle pending={0}; laRackPage* rp=MAIN.CurrentInputMappingPage; if(!rp)return LA_DAG_FLAG_PERM;
 |  | 
 | 
											
												
													
														|  | 
 |  | +    MAIN.InputMapping->NeedRebuild = 0;
 | 
											
												
													
														|  | 
 |  | +    while(lstPopPointer(&MAIN.InputMapping->Eval));
 | 
											
												
													
														|  | 
 |  | +    laListHandle pending={0}; laRackPage* rp=MAIN.InputMapping->CurrentPage; if(!rp)return LA_DAG_FLAG_PERM;
 | 
											
												
													
														|  |      for(laNodeRack* ir=rp->Racks.pFirst;ir;ir=ir->Item.pNext){
 |  |      for(laNodeRack* ir=rp->Racks.pFirst;ir;ir=ir->Item.pNext){
 | 
											
												
													
														|  |          for(laBaseNode*bn=ir->Nodes.pFirst;bn;bn=bn->Item.pNext){ lstAppendPointer(&pending,bn); bn->Eval=0; }
 |  |          for(laBaseNode*bn=ir->Nodes.pFirst;bn;bn=bn->Item.pNext){ lstAppendPointer(&pending,bn); bn->Eval=0; }
 | 
											
												
													
														|  |      }
 |  |      }
 | 
											
												
													
														|  |      laBaseNode*n;int result=LA_DAG_FLAG_PERM; laListItemPointer*NextLip;
 |  |      laBaseNode*n;int result=LA_DAG_FLAG_PERM; laListItemPointer*NextLip;
 | 
											
												
													
														|  |      for(laListItemPointer*lip=pending.pFirst;lip;lip=NextLip){ n=lip->p; NextLip=lip->pNext;
 |  |      for(laListItemPointer*lip=pending.pFirst;lip;lip=NextLip){ n=lip->p; NextLip=lip->pNext;
 | 
											
												
													
														|  |          if(n->Eval&LA_DAG_FLAG_PERM) continue;
 |  |          if(n->Eval&LA_DAG_FLAG_PERM) continue;
 | 
											
												
													
														|  | -        result=n->Type->Visit(n,&MAIN.InputMappingEval); if(result==LA_DAG_FLAG_ERR){ while(lstPopPointer(&pending)); break; }
 |  | 
 | 
											
												
													
														|  | 
 |  | +        result=n->Type->Visit(n,&MAIN.InputMapping->Eval); if(result==LA_DAG_FLAG_ERR){ while(lstPopPointer(&pending)); break; }
 | 
											
												
													
														|  |      }
 |  |      }
 | 
											
												
													
														|  | -    if(result==LA_DAG_FLAG_ERR){ while(lstPopPointer(&MAIN.InputMappingEval)); return LA_DAG_FLAG_ERR; }
 |  | 
 | 
											
												
													
														|  | 
 |  | +    if(result==LA_DAG_FLAG_ERR){ while(lstPopPointer(&MAIN.InputMapping->Eval)); return LA_DAG_FLAG_ERR; }
 | 
											
												
													
														|  |      return LA_DAG_FLAG_PERM;
 |  |      return LA_DAG_FLAG_PERM;
 | 
											
												
													
														|  |  }
 |  |  }
 |