| 
														
															@@ -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; 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 } 
														 | 
														
														 | 
														
															 } 
														 |