*/}}
Browse Source

nodes copy

YimingWu 1 year ago
parent
commit
21cddc40f6
2 changed files with 50 additions and 16 deletions
  1. 32 16
      ournodes.c
  2. 18 0
      ouroperations.c

+ 32 - 16
ournodes.c

@@ -87,6 +87,16 @@ int IDN_BrushSettingsEval(OurBrushSettingsNode* n){
     n->rCustom2 = Our->CurrentBrush->Custom2;
     return 1;
 }
+void IDN_BrushSettingsCopy(OurBrushSettingsNode* new, OurBrushSettingsNode* old, int DoRematch){
+    if(DoRematch){ return;}
+    LA_IDN_OLD_DUPL(Angle)       LA_IDN_OLD_DUPL(CanvasScale)
+    LA_IDN_OLD_DUPL(Color)       LA_IDN_OLD_DUPL(Custom1)
+    LA_IDN_OLD_DUPL(Custom2)     LA_IDN_OLD_DUPL(DabsPerSize)
+    LA_IDN_OLD_DUPL(Hardness)    LA_IDN_OLD_DUPL(Iteration)
+    LA_IDN_OLD_DUPL(Size)        LA_IDN_OLD_DUPL(Slender)
+    LA_IDN_OLD_DUPL(Smudge)      LA_IDN_OLD_DUPL(SmudgeLength)
+    LA_IDN_OLD_DUPL(Transparency)
+}
 void ui_BrushSettingsNode(laUiList *uil, laPropPack *This, laPropPack *Extra, laColumn *UNUSED, int context){
     laColumn* c=laFirstColumn(uil); OurBrushSettingsNode*n=This->EndInstance;
     laUiItem* b,*u;
@@ -146,18 +156,10 @@ int IDN_BrushOutputsVisit(OurBrushOutputsNode* n, laNodeVisitInfo* vi){
     LA_GUARD_THIS_NODE(n,vi);
 #define BRUSH_OUT_VISIT(a) \
     if(LA_SRC_AND_PARENT(n->a)){ laBaseNode*bn=n->a->Source->Parent; LA_VISIT_NODE(bn,vi); }
-    BRUSH_OUT_VISIT(Offset)
-    BRUSH_OUT_VISIT(Size)
-    BRUSH_OUT_VISIT(Transparency)
-    BRUSH_OUT_VISIT(Hardness)
-    BRUSH_OUT_VISIT(Smudge)
-    BRUSH_OUT_VISIT(SmudgeLength)
-    BRUSH_OUT_VISIT(DabsPerSize)
-    BRUSH_OUT_VISIT(Slender)
-    BRUSH_OUT_VISIT(Angle)
-    BRUSH_OUT_VISIT(Color)
-    BRUSH_OUT_VISIT(Repeats)
-    BRUSH_OUT_VISIT(Discard)
+    BRUSH_OUT_VISIT(Offset) BRUSH_OUT_VISIT(Size) BRUSH_OUT_VISIT(Transparency)
+    BRUSH_OUT_VISIT(Hardness) BRUSH_OUT_VISIT(Smudge) BRUSH_OUT_VISIT(SmudgeLength)
+    BRUSH_OUT_VISIT(DabsPerSize) BRUSH_OUT_VISIT(Slender) BRUSH_OUT_VISIT(Angle)
+    BRUSH_OUT_VISIT(Color) BRUSH_OUT_VISIT(Repeats) BRUSH_OUT_VISIT(Discard)
 #undef BRUSH_OUT_VISIT
     LA_ADD_THIS_NODE(n,vi);
     return LA_DAG_FLAG_PERM;
@@ -191,6 +193,15 @@ int IDN_BrushOutputsEval(OurBrushOutputsNode* n){
 #undef BRUSH_OUT_EVAL
     return 1;
 }
+void IDN_BrushOutputsCopy(OurBrushOutputsNode* new, OurBrushOutputsNode* old, int DoRematch){
+    if(DoRematch){
+        LA_IDN_NEW_LINK(Offset) LA_IDN_NEW_LINK(Size) LA_IDN_NEW_LINK(Transparency) LA_IDN_NEW_LINK(Hardness)
+        LA_IDN_NEW_LINK(Smudge) LA_IDN_NEW_LINK(SmudgeLength) LA_IDN_NEW_LINK(DabsPerSize) LA_IDN_NEW_LINK(Slender)
+        LA_IDN_NEW_LINK(Angle) LA_IDN_NEW_LINK(Color) LA_IDN_NEW_LINK(Repeats) LA_IDN_NEW_LINK(Discard)
+        return;
+    }
+    return;
+}
 void ui_BrushOutputsNode(laUiList *uil, laPropPack *This, laPropPack *Extra, laColumn *UNUSED, int context){
     laColumn* c=laFirstColumn(uil); OurBrushOutputsNode*n=This->EndInstance;
     laUiItem* b,*u;
@@ -258,6 +269,12 @@ int IDN_BrushDeviceEval(OurBrushDeviceNode* n){
     n->rLengthAccum = Our->CurrentBrush->EvalStrokeLengthAccum;
     return 1;
 }
+void IDN_BrushDeviceCopy(OurBrushDeviceNode* new, OurBrushDeviceNode* old, int DoRematch){
+    if(DoRematch){ return;}
+    LA_IDN_OLD_DUPL(Pressure) LA_IDN_OLD_DUPL(Tilt) LA_IDN_OLD_DUPL(Position)
+    LA_IDN_OLD_DUPL(IsEraser) LA_IDN_OLD_DUPL(Speed) LA_IDN_OLD_DUPL(Angle)
+    LA_IDN_OLD_DUPL(Length) LA_IDN_OLD_DUPL(LengthAccum)
+}
 void ui_BrushDeviceNode(laUiList *uil, laPropPack *This, laPropPack *Extra, laColumn *UNUSED, int context){
     laColumn* c=laFirstColumn(uil); OurBrushDeviceNode*n=This->EndInstance;
     laUiItem* b,*u;
@@ -284,7 +301,6 @@ int ourRebuildBrushEval(){
     return Our->CurrentBrush?laRebuildPageEval(Our->CurrentBrush->Rack):0;
 }
 
-
 void ourRegisterNodes(){
     laPropContainer *pc; laProp *p;
     laOperatorType *at;
@@ -335,9 +351,9 @@ void ourRegisterNodes(){
     laAddSubGroup(pc,"length","Length","Length of this brush stroke","la_out_socket",0,0,0,offsetof(OurBrushDeviceNode,Length),0,0,0,0,0,0,0,LA_UDF_SINGLE);
     laAddSubGroup(pc,"length_accum","Accumulated Length","Accumulated stroke length","la_out_socket",0,0,0,offsetof(OurBrushDeviceNode,LengthAccum),0,0,0,0,0,0,0,LA_UDF_SINGLE);
     
-    LA_IDN_REGISTER("Brush Settings",U'🖌',OUR_IDN_BRUSH_SETTINGS,OUR_PC_IDN_BRUSH_SETTINGS, IDN_BrushSettingsInit, IDN_BrushSettingsDestroy, IDN_BrushSettingsVisit, IDN_BrushSettingsEval, OurBrushSettingsNode);
-    LA_IDN_REGISTER("Brush Outputs",U'🖌',OUR_IDN_BRUSH_OUTPUTS,OUR_PC_IDN_BRUSH_OUTPUTS, IDN_BrushOutputsInit, IDN_BrushOutputsDestroy, IDN_BrushOutputsVisit, IDN_BrushOutputsEval, OurBrushOutputsNode);
-    LA_IDN_REGISTER("Brush Device",U'🖳',OUR_IDN_BRUSH_DEVICE,OUR_PC_IDN_BRUSH_DEVICE, IDN_BrushDeviceInit, IDN_BrushDeviceDestroy, IDN_BrushDeviceVisit, IDN_BrushDeviceEval, OurBrushDeviceNode);
+    LA_IDN_REGISTER("Brush Settings",U'🖌',OUR_IDN_BRUSH_SETTINGS,OUR_PC_IDN_BRUSH_SETTINGS, IDN_BrushSettings, OurBrushSettingsNode);
+    LA_IDN_REGISTER("Brush Outputs",U'🖌',OUR_IDN_BRUSH_OUTPUTS,OUR_PC_IDN_BRUSH_OUTPUTS, IDN_BrushOutputs, OurBrushOutputsNode);
+    LA_IDN_REGISTER("Brush Device",U'🖳',OUR_IDN_BRUSH_DEVICE,OUR_PC_IDN_BRUSH_DEVICE, IDN_BrushDevice, OurBrushDeviceNode);
     
     laNodeCategory* nc=laAddNodeCategory("Our Paint",0,LA_RACK_TYPE_DRIVER);
 

+ 18 - 0
ouroperations.c

@@ -148,6 +148,7 @@ void ourui_Brush(laUiList *uil, laPropPack *This, laPropPack *DetachedProps, laC
         b=laBeginRow(uil,c,0,0);
         laShowItem(uil,c,This,"remove")->Flags|=LA_UI_FLAGS_ICON;
         laShowItem(uil,c,This,"binding")->Expand=1;
+        laShowItem(uil,c,This,"duplicate")->Flags|=LA_UI_FLAGS_ICON;
         laShowItemFull(uil,c,This,"move",0,"direction=up;icon=🡱;",0,0)->Flags|=LA_UI_FLAGS_ICON;
         laShowItemFull(uil,c,This,"move",0,"direction=down;icon=🡳;",0,0)->Flags|=LA_UI_FLAGS_ICON;
         laEndRow(uil,b);
@@ -568,6 +569,15 @@ void our_RemoveBrush(OurBrush* b){
     memLeave(b->Rack); b->Rack=0;
     memLeave(b);
 }
+OurBrush* our_DuplicateBrush(OurBrush* b){
+    OurBrush* nb=memAcquireHyper(sizeof(OurBrush));
+    memcpy(nb,b,sizeof(OurBrush)); nb->Binding=-1; nb->Name=0; strSafePrint(&nb->Name,"%s Copy",b->Name?b->Name->Ptr:"New Brush");
+    nb->Rack=laDuplicateRackPage(0,b->Rack);
+    nb->Item.pNext=nb->Item.pPrev=0;
+    lstInsertItemAfter(&Our->Brushes,nb,b);
+    memAssignRef(Our, &Our->CurrentBrush, nb);
+    return nb;
+}
 
 int our_BufferAnythingVisible(uint16_t* buf, int elemcount){
     for(int i=0;i<elemcount;i++){
@@ -1509,6 +1519,12 @@ int ourinv_NewBrush(laOperator* a, laEvent* e){
     laNotifyUsers("our.tools.current_brush"); laNotifyUsers("our.tools.brushes"); laRecordInstanceDifferences(Our,"our_tools"); laPushDifferences("Add brush",0);
     return LA_FINISHED;
 }
+int ourinv_DuplicateBrush(laOperator* a, laEvent* e){
+    OurBrush* b=a->This?a->This->EndInstance:0; if(!b) return LA_CANCELED;
+    our_DuplicateBrush(b);
+    laNotifyUsers("our.tools.current_brush"); laNotifyUsers("our.tools.brushes"); laRecordInstanceDifferences(Our,"our_tools"); laPushDifferences("Duplicate brush",0);
+    return LA_FINISHED;
+}
 int ourinv_RemoveBrush(laOperator* a, laEvent* e){
     OurBrush* b=a->This?a->This->EndInstance:0; if(!b) return LA_CANCELED;
     our_RemoveBrush(b);
@@ -1837,6 +1853,7 @@ void ourRegisterEverything(){
 
     laCreateOperatorType("OUR_new_brush","New Brush","Create a new brush",0,0,0,ourinv_NewBrush,0,'+',0);
     laCreateOperatorType("OUR_remove_brush","Remove Brush","Remove this brush",0,0,0,ourinv_RemoveBrush,0,U'🗴',0);
+    laCreateOperatorType("OUR_duplicate_brush","Duplicate Brush","Duplicate this brush",0,0,0,ourinv_DuplicateBrush,0,U'⎘',0);
     laCreateOperatorType("OUR_move_brush","Move Brush","Remove this brush",0,0,0,ourinv_MoveBrush,0,0,0);
     laCreateOperatorType("OUR_brush_quick_switch","Brush Quick Switch","Brush quick switch",0,0,0,ourinv_BrushQuickSwitch,0,0,0);
     laCreateOperatorType("OUR_brush_resize","Brush Resize","Brush resize",0,0,0,ourinv_BrushResize,0,0,0);
@@ -1949,6 +1966,7 @@ void ourRegisterEverything(){
     
     laAddOperatorProperty(pc,"move","Move","Move brush","OUR_move_brush",0,0);
     laAddOperatorProperty(pc,"remove","Remove","Remove brush","OUR_remove_brush",U'🗴',0);
+    laAddOperatorProperty(pc,"duplicate","Duplicate","Duplicate brush","OUR_duplicate_brush",U'⎘',0);
 
     pc=laAddPropertyContainer("our_canvas","Our Canvas","OurPaint canvas",0,0,sizeof(OurPaint),0,0,1);
     laPropContainerExtraFunctions(pc,0,ourreset_Canvas,0,0,0);