|  | @@ -12,6 +12,7 @@ laBaseNodeType LA_IDN_SWITCH;
 | 
											
												
													
														|  |  laBaseNodeType LA_IDN_COMBINE;
 |  |  laBaseNodeType LA_IDN_COMBINE;
 | 
											
												
													
														|  |  laBaseNodeType LA_IDN_VALUES;
 |  |  laBaseNodeType LA_IDN_VALUES;
 | 
											
												
													
														|  |  laBaseNodeType LA_IDN_MATRIX;
 |  |  laBaseNodeType LA_IDN_MATRIX;
 | 
											
												
													
														|  | 
 |  | +laBaseNodeType LA_IDN_MATH;
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |  laPropContainer* LA_PC_IDN_GENERIC;
 |  |  laPropContainer* LA_PC_IDN_GENERIC;
 | 
											
												
													
														|  |  laPropContainer* LA_PC_IDN_KEYBOARD;
 |  |  laPropContainer* LA_PC_IDN_KEYBOARD;
 | 
											
										
											
												
													
														|  | @@ -23,6 +24,7 @@ laPropContainer* LA_PC_IDN_SWITCH;
 | 
											
												
													
														|  |  laPropContainer* LA_PC_IDN_COMBINE;
 |  |  laPropContainer* LA_PC_IDN_COMBINE;
 | 
											
												
													
														|  |  laPropContainer* LA_PC_IDN_VALUES;
 |  |  laPropContainer* LA_PC_IDN_VALUES;
 | 
											
												
													
														|  |  laPropContainer* LA_PC_IDN_MATRIX;
 |  |  laPropContainer* LA_PC_IDN_MATRIX;
 | 
											
												
													
														|  | 
 |  | +laPropContainer* LA_PC_IDN_MATH;
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |  #define LA_IDN_CONTROLLER_RESET_SOCKET(ns)\
 |  |  #define LA_IDN_CONTROLLER_RESET_SOCKET(ns)\
 | 
											
												
													
														|  |      {ns->IntVal[0]=0; ns->Out->DataType=LA_PROP_INT; ns->Offset=0; ns->Out->Data=&ns->IntVal;}
 |  |      {ns->IntVal[0]=0; ns->Out->DataType=LA_PROP_INT; ns->Offset=0; ns->Out->Data=&ns->IntVal;}
 | 
											
										
											
												
													
														|  | @@ -73,10 +75,11 @@ int IDN_ControllerEval(laInputControllerNode* n){
 | 
											
												
													
														|  |  }
 |  |  }
 | 
											
												
													
														|  |  void laui_ControllerNode(laUiList *uil, laPropPack *This, laPropPack *Extra, laColumn *UNUSED, int context){
 |  |  void laui_ControllerNode(laUiList *uil, laPropPack *This, laPropPack *Extra, laColumn *UNUSED, int context){
 | 
											
												
													
														|  |      laColumn* c=laFirstColumn(uil); laInputControllerNode*n=This->EndInstance;
 |  |      laColumn* c=laFirstColumn(uil); laInputControllerNode*n=This->EndInstance;
 | 
											
												
													
														|  | -    laColumn* cl,*cr; laSplitColumn(uil,c,0.3); cl=laLeftColumn(c,0); cr=laRightColumn(c,0);
 |  | 
 | 
											
												
													
														|  | 
 |  | +    laColumn* cl,*cr; 
 | 
											
												
													
														|  | 
 |  | +    LA_BASE_NODE_HEADER(uil,c,This);
 | 
											
												
													
														|  | 
 |  | +    laSplitColumn(uil,c,0.3); cl=laLeftColumn(c,0); cr=laRightColumn(c,0);
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |      laUiItem* b=laBeginRow(uil,c,0,0);
 |  |      laUiItem* b=laBeginRow(uil,c,0,0);
 | 
											
												
													
														|  | -    laShowHeightAdjuster(uil,c,This,"base.__gap",0);
 |  | 
 | 
											
												
													
														|  |      laShowItem(uil,c,This,"base.name")->Expand=1;
 |  |      laShowItem(uil,c,This,"base.name")->Expand=1;
 | 
											
												
													
														|  |      laShowItem(uil,c,This,"user_id");
 |  |      laShowItem(uil,c,This,"user_id");
 | 
											
												
													
														|  |      laEndRow(uil,b);
 |  |      laEndRow(uil,b);
 | 
											
										
											
												
													
														|  | @@ -101,7 +104,7 @@ void laui_ControllerNode(laUiList *uil, laPropPack *This, laPropPack *Extra, laC
 | 
											
												
													
														|  |  }
 |  |  }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |  void IDN_InputVisualizeInit(laInputVisualizerNode* n){
 |  |  void IDN_InputVisualizeInit(laInputVisualizerNode* n){
 | 
											
												
													
														|  | -    n->In=laCreateInSocket("in", 0);
 |  | 
 | 
											
												
													
														|  | 
 |  | +    n->In=laCreateInSocket("IN", 0);
 | 
											
												
													
														|  |      strSafeSet(&n->Base.Name,"Input Visualizer");
 |  |      strSafeSet(&n->Base.Name,"Input Visualizer");
 | 
											
												
													
														|  |  }
 |  |  }
 | 
											
												
													
														|  |  void IDN_InputVisualizeDestroy(laInputVisualizerNode* n){
 |  |  void IDN_InputVisualizeDestroy(laInputVisualizerNode* n){
 | 
											
										
											
												
													
														|  | @@ -131,9 +134,8 @@ int IDN_InputVisualizerEval(laInputVisualizerNode* n){
 | 
											
												
													
														|  |  }
 |  |  }
 | 
											
												
													
														|  |  void laui_InputVisualizeNode(laUiList *uil, laPropPack *This, laPropPack *Extra, laColumn *UNUSED, int context){
 |  |  void laui_InputVisualizeNode(laUiList *uil, laPropPack *This, laPropPack *Extra, laColumn *UNUSED, int context){
 | 
											
												
													
														|  |      laColumn* c=laFirstColumn(uil); laInputVisualizerNode*n=This->EndInstance;
 |  |      laColumn* c=laFirstColumn(uil); laInputVisualizerNode*n=This->EndInstance;
 | 
											
												
													
														|  | -    laColumn* cl,*cr; laSplitColumn(uil,c,0.4); cl=laLeftColumn(c,1); cr=laRightColumn(c,0);
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  |      LA_BASE_NODE_HEADER(uil,c,This);
 |  |      LA_BASE_NODE_HEADER(uil,c,This);
 | 
											
												
													
														|  | 
 |  | +    laColumn* cl,*cr; laSplitColumn(uil,c,0.4); cl=laLeftColumn(c,1); cr=laRightColumn(c,0);
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |      laShowNodeSocket(uil,cl,This,"in",0);
 |  |      laShowNodeSocket(uil,cl,This,"in",0);
 | 
											
												
													
														|  |      laUiItem* b2=laOnConditionThat(uil,cr,laEqual(laPropExpression(This,"in.data_type"),laIntExpression(LA_PROP_FLOAT)));{
 |  |      laUiItem* b2=laOnConditionThat(uil,cr,laEqual(laPropExpression(This,"in.data_type"),laIntExpression(LA_PROP_FLOAT)));{
 | 
											
										
											
												
													
														|  | @@ -157,7 +159,7 @@ void IDN_SplitDestroy(laSplitNode* n){
 | 
											
												
													
														|  |  }
 |  |  }
 | 
											
												
													
														|  |  int IDN_SplitVisit(laSplitNode* n, laListHandle* l){
 |  |  int IDN_SplitVisit(laSplitNode* n, laListHandle* l){
 | 
											
												
													
														|  |      LA_GUARD_THIS_NODE(n);
 |  |      LA_GUARD_THIS_NODE(n);
 | 
											
												
													
														|  | -    if(n->In->Source){ laBaseNode* sn=n->In->Source->Parent; LA_VISIT_NODE(sn); }
 |  | 
 | 
											
												
													
														|  | 
 |  | +    if(LA_SRC_AND_PARENT(n->In)){ laBaseNode* sn=n->In->Source->Parent; LA_VISIT_NODE(sn); }
 | 
											
												
													
														|  |      n->Base.Eval=LA_DAG_FLAG_PERM;
 |  |      n->Base.Eval=LA_DAG_FLAG_PERM;
 | 
											
												
													
														|  |      lstAppendPointer(l, n);
 |  |      lstAppendPointer(l, n);
 | 
											
												
													
														|  |      return LA_DAG_FLAG_PERM;
 |  |      return LA_DAG_FLAG_PERM;
 | 
											
										
											
												
													
														|  | @@ -188,8 +190,9 @@ void laui_SplitNode(laUiList *uil, laPropPack *This, laPropPack *Extra, laColumn
 | 
											
												
													
														|  |      LA_BASE_NODE_HEADER(uil,c,This);
 |  |      LA_BASE_NODE_HEADER(uil,c,This);
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |      laUiItem* b=laBeginRow(uil,c,0,0);
 |  |      laUiItem* b=laBeginRow(uil,c,0,0);
 | 
											
												
													
														|  | -    laShowNodeSocket(uil,c,This,"in",0);laShowSeparator(uil,c)->Expand=1;
 |  | 
 | 
											
												
													
														|  | 
 |  | +    laShowNodeSocket(uil,c,This,"in",0);
 | 
											
												
													
														|  |      laShowItemFull(uil,c,This,"array_length",LA_WIDGET_INT_PLAIN,0,0,0);
 |  |      laShowItemFull(uil,c,This,"array_length",LA_WIDGET_INT_PLAIN,0,0,0);
 | 
											
												
													
														|  | 
 |  | +    laShowLabel(uil,c,"🡲",0,0)->Expand=1;
 | 
											
												
													
														|  |      for(int i=0;i<8;i++){
 |  |      for(int i=0;i<8;i++){
 | 
											
												
													
														|  |          char* buf[128]; sprintf(buf,"out%d.out",i); laShowNodeSocket(uil,cr,This,buf,0);
 |  |          char* buf[128]; sprintf(buf,"out%d.out",i); laShowNodeSocket(uil,cr,This,buf,0);
 | 
											
												
													
														|  |      }
 |  |      }
 | 
											
										
											
												
													
														|  | @@ -256,7 +259,7 @@ void laui_SwitchNode(laUiList *uil, laPropPack *This, laPropPack *Extra, laColum
 | 
											
												
													
														|  |  }
 |  |  }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |  void IDN_CombineInit(laCombineNode* n){
 |  |  void IDN_CombineInit(laCombineNode* n){
 | 
											
												
													
														|  | -    n->Out=laCreateOutSocket(n,"out",0);n->OutInt=laCreateOutSocket(n,"out_int",0);n->OutEnum=laCreateOutSocket(n,"out_enum",0); strSafeSet(&n->Base.Name,"Combine");
 |  | 
 | 
											
												
													
														|  | 
 |  | +    n->Out=laCreateOutSocket(n,"F",0);n->OutInt=laCreateOutSocket(n,"I",0);n->OutEnum=laCreateOutSocket(n,"E",0); strSafeSet(&n->Base.Name,"Combine");
 | 
											
												
													
														|  |      for(int i=0;i<8;i++){ char str[4]; sprintf(str,"%d",i); n->In[i].In=laCreateInSocket(n,str); }
 |  |      for(int i=0;i<8;i++){ char str[4]; sprintf(str,"%d",i); n->In[i].In=laCreateInSocket(n,str); }
 | 
											
												
													
														|  |      n->Out->Data=n->Values; n->OutInt->Data=n->ValuesI; n->OutEnum->Data=n->ValuesI;
 |  |      n->Out->Data=n->Values; n->OutInt->Data=n->ValuesI; n->OutEnum->Data=n->ValuesI;
 | 
											
												
													
														|  |      n->Out->DataType=LA_PROP_FLOAT|LA_PROP_ARRAY; n->OutInt->DataType=LA_PROP_INT|LA_PROP_ARRAY; n->OutEnum->DataType=LA_PROP_ENUM|LA_PROP_ARRAY;
 |  |      n->Out->DataType=LA_PROP_FLOAT|LA_PROP_ARRAY; n->OutInt->DataType=LA_PROP_INT|LA_PROP_ARRAY; n->OutEnum->DataType=LA_PROP_ENUM|LA_PROP_ARRAY;
 | 
											
										
											
												
													
														|  | @@ -301,13 +304,10 @@ void laui_CombineNode(laUiList *uil, laPropPack *This, laPropPack *Extra, laColu
 | 
											
												
													
														|  |      laEndRow(uil,b);
 |  |      laEndRow(uil,b);
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |      b=laBeginRow(uil,c,0,0);
 |  |      b=laBeginRow(uil,c,0,0);
 | 
											
												
													
														|  | -    laShowSeparator(uil,c)->Expand=1; 
 |  | 
 | 
											
												
													
														|  | -    laShowLabel(uil,c,"E",0,0)->Flags|=LA_TEXT_ALIGN_RIGHT;
 |  | 
 | 
											
												
													
														|  | -    laShowNodeSocket(uil,c,This,"out_enum",0);
 |  | 
 | 
											
												
													
														|  | -    laShowLabel(uil,c,"I",0,0)->Flags|=LA_TEXT_ALIGN_RIGHT;
 |  | 
 | 
											
												
													
														|  | -    laShowNodeSocket(uil,c,This,"out_int",0);
 |  | 
 | 
											
												
													
														|  | -    laShowLabel(uil,c,"F",0,0)->Flags|=LA_TEXT_ALIGN_RIGHT;
 |  | 
 | 
											
												
													
														|  | -    laShowNodeSocket(uil,c,This,"out",0);
 |  | 
 | 
											
												
													
														|  | 
 |  | +    laUiItem* lu=laShowLabel(uil,c,"Combine 🡲",0,0); lu->Expand=1; lu->Flags|=LA_TEXT_ALIGN_RIGHT;
 | 
											
												
													
														|  | 
 |  | +    laShowNodeSocket(uil,c,This,"out_enum",0)->Flags|=LA_UI_SOCKET_LABEL_N;
 | 
											
												
													
														|  | 
 |  | +    laShowNodeSocket(uil,c,This,"out_int",0)->Flags|=LA_UI_SOCKET_LABEL_N;
 | 
											
												
													
														|  | 
 |  | +    laShowNodeSocket(uil,c,This,"out",0)->Flags|=LA_UI_SOCKET_LABEL_N;
 | 
											
												
													
														|  |      laEndRow(uil,b);
 |  |      laEndRow(uil,b);
 | 
											
												
													
														|  |  }
 |  |  }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
										
											
												
													
														|  | @@ -335,9 +335,9 @@ int IDN_ValuesEval(laValuesNode* n){
 | 
											
												
													
														|  |  }
 |  |  }
 | 
											
												
													
														|  |  void laui_ValuesNode(laUiList *uil, laPropPack *This, laPropPack *Extra, laColumn *UNUSED, int context){
 |  |  void laui_ValuesNode(laUiList *uil, laPropPack *This, laPropPack *Extra, laColumn *UNUSED, int context){
 | 
											
												
													
														|  |      laColumn* c=laFirstColumn(uil); laValuesNode*n=This->EndInstance;
 |  |      laColumn* c=laFirstColumn(uil); laValuesNode*n=This->EndInstance;
 | 
											
												
													
														|  | -    laColumn* cl,*cr; laSplitColumn(uil,c,0.4); cl=laLeftColumn(c,3); cr=laRightColumn(c,0);
 |  | 
 | 
											
												
													
														|  |      laUiItem*b,*b2;
 |  |      laUiItem*b,*b2;
 | 
											
												
													
														|  |      LA_BASE_NODE_HEADER(uil,c,This);
 |  |      LA_BASE_NODE_HEADER(uil,c,This);
 | 
											
												
													
														|  | 
 |  | +    laColumn* cl,*cr; laSplitColumn(uil,c,0.4); cl=laLeftColumn(c,3); cr=laRightColumn(c,0);
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |      for(int i=0;i<8;i++){
 |  |      for(int i=0;i<8;i++){
 | 
											
												
													
														|  |          char* bufm[32]; sprintf(bufm,"mode%d",i); laShowItem(uil,cl,This,bufm);
 |  |          char* bufm[32]; sprintf(bufm,"mode%d",i); laShowItem(uil,cl,This,bufm);
 | 
											
										
											
												
													
														|  | @@ -358,7 +358,7 @@ void laui_ValuesNode(laUiList *uil, laPropPack *This, laPropPack *Extra, laColum
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |  void IDN_MatrixInit(laMatrixNode* n){
 |  |  void IDN_MatrixInit(laMatrixNode* n){
 | 
											
												
													
														|  |      strSafeSet(&n->Base.Name,"Matrix");
 |  |      strSafeSet(&n->Base.Name,"Matrix");
 | 
											
												
													
														|  | -    n->InL=laCreateInSocket("l",0); n->InR=laCreateInSocket("r",0); n->Out=laCreateOutSocket(n,"out",LA_PROP_FLOAT|LA_PROP_ARRAY);
 |  | 
 | 
											
												
													
														|  | 
 |  | +    n->InL=laCreateInSocket("l",0); n->InR=laCreateInSocket("r",0); n->Out=laCreateOutSocket(n,"MAT",LA_PROP_FLOAT|LA_PROP_ARRAY);
 | 
											
												
													
														|  |      n->Out->ArrLen=16; n->Out->Data=n->Mat;
 |  |      n->Out->ArrLen=16; n->Out->Data=n->Mat;
 | 
											
												
													
														|  |  }
 |  |  }
 | 
											
												
													
														|  |  void IDN_MatrixDestroy(laMatrixNode* n){
 |  |  void IDN_MatrixDestroy(laMatrixNode* n){
 | 
											
										
											
												
													
														|  | @@ -398,28 +398,98 @@ void laui_MatrixNode(laUiList *uil, laPropPack *This, laPropPack *Extra, laColum
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |      b=laBeginRow(uil,c,0,0);
 |  |      b=laBeginRow(uil,c,0,0);
 | 
											
												
													
														|  |      laShowNodeSocket(uil,c,This,"in_l",0); laShowNodeSocket(uil,c,This,"in_r",0); laShowItem(uil,c,This,"operation");
 |  |      laShowNodeSocket(uil,c,This,"in_l",0); laShowNodeSocket(uil,c,This,"in_r",0); laShowItem(uil,c,This,"operation");
 | 
											
												
													
														|  | -    laShowSeparator(uil,c)->Expand=1; laShowNodeSocket(uil,c,This,"out",0);
 |  | 
 | 
											
												
													
														|  | 
 |  | +    laShowSeparator(uil,c)->Expand=1; laShowNodeSocket(uil,c,This,"out",0)->Flags|=LA_UI_SOCKET_LABEL_W;
 | 
											
												
													
														|  |      laEndRow(uil,b);
 |  |      laEndRow(uil,b);
 | 
											
												
													
														|  |  }
 |  |  }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | 
 |  | +void IDN_MathInit(laMathNode* n){
 | 
											
												
													
														|  | 
 |  | +    strSafeSet(&n->Base.Name,"Math");
 | 
											
												
													
														|  | 
 |  | +    n->InL=laCreateInSocket("l",0); n->InR=laCreateInSocket("r",0);
 | 
											
												
													
														|  | 
 |  | +    n->Out=laCreateOutSocket(n,"F",LA_PROP_FLOAT); n->OutInt=laCreateOutSocket(n,"I",LA_PROP_INT);
 | 
											
												
													
														|  | 
 |  | +    n->Out->Data=&n->Value; n->OutInt->Data=&n->ValueI;
 | 
											
												
													
														|  | 
 |  | +}
 | 
											
												
													
														|  | 
 |  | +void IDN_MathDestroy(laMathNode* n){
 | 
											
												
													
														|  | 
 |  | +    strSafeDestroy(&n->Base.Name); laDestroyInSocket(n->InL); laDestroyInSocket(n->InR); laDestroyOutSocket(n->Out); laDestroyOutSocket(n->OutInt);
 | 
											
												
													
														|  | 
 |  | +}
 | 
											
												
													
														|  | 
 |  | +int IDN_MathVisit(laMathNode* n, laListHandle* l){
 | 
											
												
													
														|  | 
 |  | +    LA_GUARD_THIS_NODE(n);
 | 
											
												
													
														|  | 
 |  | +    if(LA_SRC_AND_PARENT(n->InL)){ laBaseNode* bn=n->InL->Source->Parent; LA_VISIT_NODE(bn); }
 | 
											
												
													
														|  | 
 |  | +    if(LA_SRC_AND_PARENT(n->InR)){ laBaseNode* bn=n->InR->Source->Parent; LA_VISIT_NODE(bn); }
 | 
											
												
													
														|  | 
 |  | +    n->Base.Eval=LA_DAG_FLAG_PERM;
 | 
											
												
													
														|  | 
 |  | +    lstAppendPointer(l, n);
 | 
											
												
													
														|  | 
 |  | +    return LA_DAG_FLAG_PERM;
 | 
											
												
													
														|  | 
 |  | +}
 | 
											
												
													
														|  | 
 |  | +#define LA_GET_SRC_AS_FLOAT(var, socket)\
 | 
											
												
													
														|  | 
 |  | +    {if(socket->Source->DataType&LA_PROP_FLOAT) var=*((real*)socket->Source->Data);\
 | 
											
												
													
														|  | 
 |  | +    if(socket->Source->DataType&(LA_PROP_INT|LA_PROP_ENUM)) var=*((int*)socket->Source->Data);}
 | 
											
												
													
														|  | 
 |  | +int IDN_MathEval(laMathNode* n){
 | 
											
												
													
														|  | 
 |  | +    real vl=n->ValueL;real vr=n->ValueR;
 | 
											
												
													
														|  | 
 |  | +    int hasl=LA_SRC_AND_PARENT(n->InL),hasr=LA_SRC_AND_PARENT(n->InR);
 | 
											
												
													
														|  | 
 |  | +    if(hasl){ LA_GET_SRC_AS_FLOAT(vl,n->InL) } if(hasr){ LA_GET_SRC_AS_FLOAT(vr,n->InR) }
 | 
											
												
													
														|  | 
 |  | +    switch(n->Operation){
 | 
											
												
													
														|  | 
 |  | +    case LA_MATH_NODE_OP_ADD: default: n->Value=vl+vr; break;
 | 
											
												
													
														|  | 
 |  | +    case LA_MATH_NODE_OP_SUB: n->Value=vl-vr; break;
 | 
											
												
													
														|  | 
 |  | +    case LA_MATH_NODE_OP_MUL: n->Value=vl*vr; break;
 | 
											
												
													
														|  | 
 |  | +    case LA_MATH_NODE_OP_DIV: if(vr)n->Value=vl/vr;else n->Value=0; break;
 | 
											
												
													
														|  | 
 |  | +    case LA_MATH_NODE_OP_POW: n->Value=pow(vl,vr); break;
 | 
											
												
													
														|  | 
 |  | +    case LA_MATH_NODE_OP_LOG: n->Value=log2(vl)/log2(vr); break;
 | 
											
												
													
														|  | 
 |  | +    case LA_MATH_NODE_OP_SIN: n->Value=sin(vl); break;
 | 
											
												
													
														|  | 
 |  | +    case LA_MATH_NODE_OP_COS: n->Value=cos(vl); break;
 | 
											
												
													
														|  | 
 |  | +    case LA_MATH_NODE_OP_TAN: n->Value=tan(vl); break;
 | 
											
												
													
														|  | 
 |  | +    case LA_MATH_NODE_OP_ASIN: n->Value=asin(vl); break;
 | 
											
												
													
														|  | 
 |  | +    case LA_MATH_NODE_OP_ACOS: n->Value=acos(vl); break;
 | 
											
												
													
														|  | 
 |  | +    case LA_MATH_NODE_OP_ATAN: n->Value=atan(vl); break;
 | 
											
												
													
														|  | 
 |  | +    case LA_MATH_NODE_OP_ATAN2: n->Value=atan2(vl,vr); break;
 | 
											
												
													
														|  | 
 |  | +    }
 | 
											
												
													
														|  | 
 |  | +    n->ValueI=(int)n->Value;
 | 
											
												
													
														|  | 
 |  | +    return 1;
 | 
											
												
													
														|  | 
 |  | +}
 | 
											
												
													
														|  | 
 |  | +void laui_MathNode(laUiList *uil, laPropPack *This, laPropPack *Extra, laColumn *UNUSED, int context){
 | 
											
												
													
														|  | 
 |  | +    laColumn* c=laFirstColumn(uil); laMathNode*n=This->EndInstance;
 | 
											
												
													
														|  | 
 |  | +    laColumn* cl,*cr; laSplitColumn(uil,c,0.4); cl=laLeftColumn(c,3); cr=laRightColumn(c,0);
 | 
											
												
													
														|  | 
 |  | +    laUiItem*b,*b2;
 | 
											
												
													
														|  | 
 |  | +    LA_BASE_NODE_HEADER(uil,c,This);
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  | 
 |  | +    b=laBeginRow(uil,c,0,0);
 | 
											
												
													
														|  | 
 |  | +    laShowNodeSocket(uil,c,This,"in_l",0); b=laOnConditionThat(uil,c,laNot(laPropExpression(This,"in_l.source")));{ laShowItem(uil,c,This,"vl"); }laEndCondition(uil,b);
 | 
											
												
													
														|  | 
 |  | +    laShowSeparator(uil,c)->Expand=1; laShowItem(uil,c,This,"operation");
 | 
											
												
													
														|  | 
 |  | +    laEndRow(uil,b);
 | 
											
												
													
														|  | 
 |  | +    b=laBeginRow(uil,c,0,0);
 | 
											
												
													
														|  | 
 |  | +    laShowNodeSocket(uil,c,This,"in_r",0); b=laOnConditionThat(uil,c,laNot(laPropExpression(This,"in_r.source")));{ laShowItem(uil,c,This,"vr");}laEndCondition(uil,b);
 | 
											
												
													
														|  | 
 |  | +    laShowSeparator(uil,c)->Expand=1;
 | 
											
												
													
														|  | 
 |  | +    laShowNodeSocket(uil,c,This,"out_int",0)->Flags|=LA_UI_SOCKET_LABEL_N;
 | 
											
												
													
														|  | 
 |  | +    laShowNodeSocket(uil,c,This,"out",0)->Flags|=LA_UI_SOCKET_LABEL_N;
 | 
											
												
													
														|  | 
 |  | +    laEndRow(uil,b);
 | 
											
												
													
														|  | 
 |  | +}
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -int OPINV_AddInputMapperRack(laOperator* a, laEvent *e){
 |  | 
 | 
											
												
													
														|  | -    laNodeRack* pivot=a->This?a->This->EndInstance:0;
 |  | 
 | 
											
												
													
														|  | -    laNodeRack* ir=memAcquire(sizeof(laNodeRack));
 |  | 
 | 
											
												
													
														|  | 
 |  | +int OPINV_AddInputMapperPage(laOperator* a, laEvent *e){
 | 
											
												
													
														|  | 
 |  | +    laRackPage* dp=memAcquireHyper(sizeof(laRackPage));
 | 
											
												
													
														|  | 
 |  | +    strSafeSet(&dp->Name,"New Page");
 | 
											
												
													
														|  | 
 |  | +    lstAppendItem(&MAIN.InputMappingPages, dp); MAIN.CurrentInputMappingPage=dp;
 | 
											
												
													
														|  | 
 |  | +    laNotifyUsers("la.input_mapping_pages");
 | 
											
												
													
														|  | 
 |  | +    return LA_FINISHED;
 | 
											
												
													
														|  | 
 |  | +}
 | 
											
												
													
														|  | 
 |  | +int OPINV_AddNodesRack(laOperator* a, laEvent *e){
 | 
											
												
													
														|  | 
 |  | +    laRackPage* dp=a->This?a->This->EndInstance:0; if(!dp) return LA_FINISHED;
 | 
											
												
													
														|  | 
 |  | +    laNodeRack* ir=memAcquire(sizeof(laNodeRack)); 
 | 
											
												
													
														|  | 
 |  | +    char* type=strGetArgumentString(a->ExtraInstructionsP, "type");
 | 
											
												
													
														|  | 
 |  | +    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"); }
 | 
											
												
													
														|  | 
 |  | +    return LA_FINISHED;
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    if(strSame(strGetArgumentString(a->ExtraInstructionsP,"before"),"true")){
 |  | 
 | 
											
												
													
														|  | -        if(pivot){ lstInsertItemBefore(&MAIN.InputMappingRacks,ir,pivot); }else{ lstPushItem(&MAIN.InputMappingRacks,ir); }
 |  | 
 | 
											
												
													
														|  | -    }else { if(pivot){ lstInsertItemAfter(&MAIN.InputMappingRacks,ir,pivot); }else{ lstAppendItem(&MAIN.InputMappingRacks,ir); } }
 |  | 
 | 
											
												
													
														|  | -    laNotifyUsers("la.input_racks");
 |  | 
 | 
											
												
													
														|  | -    
 |  | 
 | 
											
												
													
														|  | 
 |  | +}
 | 
											
												
													
														|  | 
 |  | +int OPINV_RebuildInputMapping(laOperator* a, laEvent *e){
 | 
											
												
													
														|  | 
 |  | +    laMappingRequestRebuild();
 | 
											
												
													
														|  |      return LA_FINISHED;
 |  |      return LA_FINISHED;
 | 
											
												
													
														|  |  }
 |  |  }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |  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_racks");
 |  | 
 | 
											
												
													
														|  | 
 |  | +    laNotifyUsers("la.input_mapping_pages");
 | 
											
												
													
														|  |      return bn;
 |  |      return bn;
 | 
											
												
													
														|  |  }
 |  |  }
 | 
											
												
													
														|  |  void la_DestroyInputMapperNode(laBaseNode* bn){
 |  |  void la_DestroyInputMapperNode(laBaseNode* bn){
 | 
											
										
											
												
													
														|  | @@ -443,6 +513,7 @@ int OPINV_AddInputMapperNode(laOperator* a, laEvent *e){
 | 
											
												
													
														|  |      elif(strSame(type, "COMBINE")){ la_CreateInputMapperNode(ir, &LA_IDN_COMBINE); }
 |  |      elif(strSame(type, "COMBINE")){ la_CreateInputMapperNode(ir, &LA_IDN_COMBINE); }
 | 
											
												
													
														|  |      elif(strSame(type, "VALUES")){ la_CreateInputMapperNode(ir, &LA_IDN_VALUES); }
 |  |      elif(strSame(type, "VALUES")){ la_CreateInputMapperNode(ir, &LA_IDN_VALUES); }
 | 
											
												
													
														|  |      elif(strSame(type, "MATRIX")){ la_CreateInputMapperNode(ir, &LA_IDN_MATRIX); }
 |  |      elif(strSame(type, "MATRIX")){ la_CreateInputMapperNode(ir, &LA_IDN_MATRIX); }
 | 
											
												
													
														|  | 
 |  | +    elif(strSame(type, "MATH")){ la_CreateInputMapperNode(ir, &LA_IDN_MATH); }
 | 
											
												
													
														|  |      elif(MAIN.ExtraGetInputNodeType && (bnt=MAIN.ExtraGetInputNodeType(type))){ la_CreateInputMapperNode(ir, bnt); }
 |  |      elif(MAIN.ExtraGetInputNodeType && (bnt=MAIN.ExtraGetInputNodeType(type))){ la_CreateInputMapperNode(ir, bnt); }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |      return LA_FINISHED;
 |  |      return LA_FINISHED;
 | 
											
										
											
												
													
														|  | @@ -462,6 +533,7 @@ void laui_AddInputMapperNode(laUiList *uil, laPropPack *This, laPropPack *Extra,
 | 
											
												
													
														|  |      laShowItemFull(uil,c,This,"add_node_input",0,"type=COMBINE;text=Combine",0,0);
 |  |      laShowItemFull(uil,c,This,"add_node_input",0,"type=COMBINE;text=Combine",0,0);
 | 
											
												
													
														|  |      laShowItemFull(uil,c,This,"add_node_input",0,"type=VALUES;text=Values",0,0);
 |  |      laShowItemFull(uil,c,This,"add_node_input",0,"type=VALUES;text=Values",0,0);
 | 
											
												
													
														|  |      laShowLabel(uil,c,"Math:",0,0);
 |  |      laShowLabel(uil,c,"Math:",0,0);
 | 
											
												
													
														|  | 
 |  | +    laShowItemFull(uil,c,This,"add_node_input",0,"type=MATH;text=Math",0,0);
 | 
											
												
													
														|  |      laShowItemFull(uil,c,This,"add_node_input",0,"type=MATRIX;text=Matrix",0,0);
 |  |      laShowItemFull(uil,c,This,"add_node_input",0,"type=MATRIX;text=Matrix",0,0);
 | 
											
												
													
														|  |      laShowLabel(uil,c,"Visualizations:",0,0);
 |  |      laShowLabel(uil,c,"Visualizations:",0,0);
 | 
											
												
													
														|  |      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);
 | 
											
										
											
												
													
														|  | @@ -499,10 +571,11 @@ int laget_VisualizerArrayLength(laInputVisualizerNode* s){
 | 
											
												
													
														|  |      return s->In->ArrLen?s->In->ArrLen:1;
 |  |      return s->In->ArrLen?s->In->ArrLen:1;
 | 
											
												
													
														|  |  }
 |  |  }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -void laRegisterNode(laBaseNodeType* type, laPropContainer* pc, laBaseNodeInitF init, laBaseNodeDestroyF destroy, laBaseNodeVisitF visit, laBaseNodeEvalF eval, int nodesize){
 |  | 
 | 
											
												
													
														|  | 
 |  | +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*));
 | 
											
												
													
														|  |      type->Init = init; type->Destroy = destroy; type->Visit=visit; type->Eval=eval; type->NodeSize=nodesize; type->pc=pc;
 |  |      type->Init = init; type->Destroy = destroy; type->Visit=visit; type->Eval=eval; type->NodeSize=nodesize; type->pc=pc;
 | 
											
												
													
														|  |      MAIN.NodeTypes[MAIN.NodeTypeNext]=type; MAIN.NodeTypeNext++;
 |  |      MAIN.NodeTypes[MAIN.NodeTypeNext]=type; MAIN.NodeTypeNext++;
 | 
											
												
													
														|  | 
 |  | +    la_UDFAppendSharedTypePointer(udf_string, type);
 | 
											
												
													
														|  |  }
 |  |  }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |  void la_AddValuesNodeEnum(laProp* p){
 |  |  void la_AddValuesNodeEnum(laProp* p){
 | 
											
										
											
												
													
														|  | @@ -519,9 +592,11 @@ void la_RegisterInputMapperOperators(){
 | 
											
												
													
														|  |      laOperatorType *at;
 |  |      laOperatorType *at;
 | 
											
												
													
														|  |      laEnumProp *ep;
 |  |      laEnumProp *ep;
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    laCreateOperatorType("LA_add_input_mapper_rack", "Add Rack", "Add a rack for input mapper nodes", 0,0,0,OPINV_AddInputMapperRack,0,'+',0);
 |  | 
 | 
											
												
													
														|  | 
 |  | +    laCreateOperatorType("LA_add_input_mapping_page", "Add Page", "Add a page for inpur mapping", 0,0,0,OPINV_AddInputMapperPage,0,'+',0);
 | 
											
												
													
														|  | 
 |  | +    laCreateOperatorType("LA_add_rack", "Add Rack", "Add a rack for nodes", 0,0,0,OPINV_AddNodesRack,0,'+',0);
 | 
											
												
													
														|  |      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);
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |      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);
 | 
											
										
											
												
													
														|  | @@ -534,6 +609,7 @@ void la_RegisterInputMapperOperators(){
 | 
											
												
													
														|  |      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_InputNodeGap,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);
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |      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;
 | 
											
										
											
												
													
														|  | @@ -671,6 +747,30 @@ void la_RegisterInputMapperOperators(){
 | 
											
												
													
														|  |      laAddEnumItemAs(p,"MUL", "Multiply", "L x R", LA_MATRIX_NODE_OP_MUL, 0);
 |  |      laAddEnumItemAs(p,"MUL", "Multiply", "L x R", LA_MATRIX_NODE_OP_MUL, 0);
 | 
											
												
													
														|  |      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);
 | 
											
												
													
														|  | 
 |  | +    LA_PC_IDN_MATH=pc;
 | 
											
												
													
														|  | 
 |  | +    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, "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);
 | 
											
												
													
														|  | 
 |  | +    laAddSubGroup(pc,"in_l", "L","Left input","la_in_socket",0,0,0,offsetof(laMathNode, 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(laMathNode, InR),0,0,0,0,0,0,0,LA_UDF_SINGLE);
 | 
											
												
													
														|  | 
 |  | +    laAddSubGroup(pc,"out", "Out","Output value","la_out_socket",0,0,0,offsetof(laMathNode, Out),0,0,0,0,0,0,0,LA_UDF_SINGLE);
 | 
											
												
													
														|  | 
 |  | +    laAddSubGroup(pc,"out_int", "Out Int","Output value in Integer","la_out_socket",0,0,0,offsetof(laMathNode, OutInt),0,0,0,0,0,0,0,LA_UDF_SINGLE);
 | 
											
												
													
														|  | 
 |  | +    p=laAddEnumProperty(pc,"operation", "Operation", "Operation", 0,0,0,0,0,offsetof(laMathNode, Operation),0,0,0,0,0,0,0,0,0,0);
 | 
											
												
													
														|  | 
 |  | +    laAddEnumItemAs(p,"ADD", "Add", "L + R", LA_MATH_NODE_OP_ADD, 0);
 | 
											
												
													
														|  | 
 |  | +    laAddEnumItemAs(p,"SUB", "Subtract", "L - R", LA_MATH_NODE_OP_SUB, 0);
 | 
											
												
													
														|  | 
 |  | +    laAddEnumItemAs(p,"MUL", "Multiply", "L x R", LA_MATH_NODE_OP_MUL, 0);
 | 
											
												
													
														|  | 
 |  | +    laAddEnumItemAs(p,"DIV", "Divide", "L / R", LA_MATH_NODE_OP_DIV, 0);
 | 
											
												
													
														|  | 
 |  | +    laAddEnumItemAs(p,"POW", "Power", "pow(L,R)", LA_MATH_NODE_OP_POW, 0);
 | 
											
												
													
														|  | 
 |  | +    laAddEnumItemAs(p,"LOG", "Log", "log(L)base(R)", LA_MATH_NODE_OP_LOG, 0);
 | 
											
												
													
														|  | 
 |  | +    laAddEnumItemAs(p,"SIN", "Sine", "sin(L)", LA_MATH_NODE_OP_SIN, 0);
 | 
											
												
													
														|  | 
 |  | +    laAddEnumItemAs(p,"COS", "Cosine", "cos(L)", LA_MATH_NODE_OP_COS, 0);
 | 
											
												
													
														|  | 
 |  | +    laAddEnumItemAs(p,"TAN", "Tangent", "tan(L)", LA_MATH_NODE_OP_TAN, 0);
 | 
											
												
													
														|  | 
 |  | +    laAddEnumItemAs(p,"ASIN", "Arcsin", "asin(L)", LA_MATH_NODE_OP_ASIN, 0);
 | 
											
												
													
														|  | 
 |  | +    laAddEnumItemAs(p,"ACOS", "Arccosine", "acos(L)", LA_MATH_NODE_OP_ACOS, 0);
 | 
											
												
													
														|  | 
 |  | +    laAddEnumItemAs(p,"ATAN", "Arctangent", "atan(L)", LA_MATH_NODE_OP_ATAN, 0);
 | 
											
												
													
														|  | 
 |  | +    laAddEnumItemAs(p,"ATAN2", "Atan2", "atan2(L,R) where L or R can be zero", LA_MATH_NODE_OP_ATAN2, 0);
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  |      LA_IDN_REGISTER(LA_IDN_CONTROLLER,LA_PC_IDN_CONTROLLER, IDN_ControllerInit, IDN_ControllerDestroy, IDN_ControllerVisit, IDN_ControllerEval, laInputControllerNode);
 |  |      LA_IDN_REGISTER(LA_IDN_CONTROLLER,LA_PC_IDN_CONTROLLER, IDN_ControllerInit, IDN_ControllerDestroy, IDN_ControllerVisit, IDN_ControllerEval, laInputControllerNode);
 | 
											
												
													
														|  |      LA_IDN_REGISTER(LA_IDN_VISUALIZER,LA_PC_IDN_VISUALIZER, IDN_InputVisualizeInit, IDN_InputVisualizeDestroy, IDN_InputVisualizeVisit, IDN_InputVisualizerEval, laInputVisualizerNode);
 |  |      LA_IDN_REGISTER(LA_IDN_VISUALIZER,LA_PC_IDN_VISUALIZER, IDN_InputVisualizeInit, IDN_InputVisualizeDestroy, IDN_InputVisualizeVisit, IDN_InputVisualizerEval, laInputVisualizerNode);
 | 
											
												
													
														|  |      LA_IDN_REGISTER(LA_IDN_SPLIT,LA_PC_IDN_SPLIT, IDN_SplitInit, IDN_SplitDestroy, IDN_SplitVisit, IDN_SplitEval, laSplitNode);
 |  |      LA_IDN_REGISTER(LA_IDN_SPLIT,LA_PC_IDN_SPLIT, IDN_SplitInit, IDN_SplitDestroy, IDN_SplitVisit, IDN_SplitEval, laSplitNode);
 | 
											
										
											
												
													
														|  | @@ -678,6 +778,7 @@ void la_RegisterInputMapperOperators(){
 | 
											
												
													
														|  |      LA_IDN_REGISTER(LA_IDN_COMBINE,LA_PC_IDN_COMBINE, IDN_CombineInit, IDN_CombineDestroy, IDN_CombineVisit, IDN_CombineEval, laCombineNode);
 |  |      LA_IDN_REGISTER(LA_IDN_COMBINE,LA_PC_IDN_COMBINE, IDN_CombineInit, IDN_CombineDestroy, IDN_CombineVisit, IDN_CombineEval, laCombineNode);
 | 
											
												
													
														|  |      LA_IDN_REGISTER(LA_IDN_VALUES,LA_PC_IDN_VALUES, IDN_ValuesInit, IDN_ValuesDestroy, IDN_ValuesVisit, IDN_ValuesEval, laValuesNode);
 |  |      LA_IDN_REGISTER(LA_IDN_VALUES,LA_PC_IDN_VALUES, IDN_ValuesInit, IDN_ValuesDestroy, IDN_ValuesVisit, IDN_ValuesEval, laValuesNode);
 | 
											
												
													
														|  |      LA_IDN_REGISTER(LA_IDN_MATRIX,LA_PC_IDN_MATRIX, IDN_MatrixInit, IDN_MatrixDestroy, IDN_MatrixVisit, IDN_MatrixEval, laMatrixNode);
 |  |      LA_IDN_REGISTER(LA_IDN_MATRIX,LA_PC_IDN_MATRIX, IDN_MatrixInit, IDN_MatrixDestroy, IDN_MatrixVisit, IDN_MatrixEval, laMatrixNode);
 | 
											
												
													
														|  | 
 |  | +    LA_IDN_REGISTER(LA_IDN_MATH,LA_PC_IDN_MATH, IDN_MathInit, IDN_MathDestroy, IDN_MathVisit, IDN_MathEval, laMathNode);
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |  }
 |  |  }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
										
											
												
													
														|  | @@ -701,8 +802,8 @@ int la_RunInputMapping(){
 | 
											
												
													
														|  |  int la_RebuildInputMapping(){
 |  |  int la_RebuildInputMapping(){
 | 
											
												
													
														|  |      MAIN.MappingNeedRebuild = 0;
 |  |      MAIN.MappingNeedRebuild = 0;
 | 
											
												
													
														|  |      while(lstPopPointer(&MAIN.InputMappingEval));
 |  |      while(lstPopPointer(&MAIN.InputMappingEval));
 | 
											
												
													
														|  | -    laListHandle pending={0};
 |  | 
 | 
											
												
													
														|  | -    for(laNodeRack* ir=MAIN.InputMappingRacks.pFirst;ir;ir=ir->Item.pNext){
 |  | 
 | 
											
												
													
														|  | 
 |  | +    laListHandle pending={0}; laRackPage* rp=MAIN.CurrentInputMappingPage; if(!rp)return LA_DAG_FLAG_PERM;
 | 
											
												
													
														|  | 
 |  | +    for(laNodeRack* ir=rp->Racks.pFirst;ir;ir=ir->Item.pNext){
 | 
											
												
													
														|  |          for(laBaseNode*bn=ir->Nodes.pFirst;bn;bn=bn->Item.pNext){ 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;
 |