*/}}
浏览代码

pigment support structures

YimingWu 9 月之前
父节点
当前提交
9aeaa0e966
共有 2 个文件被更改,包括 187 次插入2 次删除
  1. 167 2
      ouroperations.c
  2. 20 0
      ourpaint.h

+ 167 - 2
ouroperations.c

@@ -469,6 +469,26 @@ void ourui_BrushPage(laUiList *uil, laPropPack *This, laPropPack *DetachedProps,
         laShowItemFull(uil,c,0,"our.tools.current_brush.rack_page",LA_WIDGET_COLLECTION_SINGLE,0,0,0)->Flags|=LA_UI_FLAGS_NO_DECAL;
     }laEndCondition(uil,b);
 }
+void ourui_PigmentItem(laUiList *uil, laPropPack *This, laPropPack *DetachedProps, laColumn *extras, int context){
+    laColumn* c=extras?extras:laFirstColumn(uil),*cl,*cr; laSplitColumn(uil,c,0.3);cl=laLeftColumn(c,0);cr=laRightColumn(c,0);
+    laColumn* cll,*clr; laSplitColumn(uil,cl,0.3);cll=laLeftColumn(cl,1);clr=laRightColumn(cl,0);
+    laShowItem(uil,cll,This,"__move");
+    laShowItem(uil,clr,This,"name");
+    laUiItem* r=laBeginRow(uil,clr,0,0);
+    laShowItem(uil,clr,This,"remove")->Flags|=LA_UI_FLAGS_ICON;
+    laEndRow(uil,r);
+    laUiItem* ui=laShowItemFull(uil,cr,This,"reflectivities",0,0,0,0); ui->Flags|=LA_UI_FLAGS_VALUE_METER; ui->Extra->HeightCoeff=3;
+    laShowItemFull(uil,cr,This,"opaqueness",0,0,0,0);
+}
+void ourui_PigmentsPanel(laUiList *uil, laPropPack *This, laPropPack *DetachedProps, laColumn *UNUSED, int context){
+    laColumn* c=laFirstColumn(uil),*cl,*cr; laSplitColumn(uil,c,0.3);cl=laLeftColumn(c,0);cr=laRightColumn(c,0);
+    laColumn* cll,*clr; laSplitColumn(uil,cl,0.3);cll=laLeftColumn(cl,1);clr=laRightColumn(cl,0);
+    laUiItem* r=laBeginRow(uil,c,0,0);
+    laShowItem(uil,c,0,"OUR_new_pigment");
+    laEndRow(uil,r);
+    laShowColumnAdjuster(uil,c);
+    laShowItemFull(uil,c,0,"our.tools.pigments",0,0,ourui_PigmentItem,0)->Flags|=LA_UI_FLAGS_NO_DECAL;
+}
 void ourui_AboutAuthor(laUiList *uil, laPropPack *This, laPropPack *DetachedProps, laColumn *UNUSED, int context){
     laColumn* c=laFirstColumn(uil); laUiItem* g; laUiList* gu; laColumn* gc;
     g = laMakeGroup(uil, c, "Our Paint", 0);
@@ -560,6 +580,34 @@ void ourui_OurPreference(laUiList *uil, laPropPack *This, laPropPack *DetachedPr
     laShowLabel(uil,c,"Developer:",0,0);
     laShowItem(uil,cl,0,"our.preferences.show_debug_tiles");
 }
+void ourui_DiplayResponseItem(laUiList *uil, laPropPack *This, laPropPack *DetachedProps, laColumn *extras, int context){
+    laColumn* c=extras?extras:laFirstColumn(uil),*cl,*cr; cl=laLeftColumn(c,0);cr=laRightColumn(c,0);
+    laColumn* cll,*clr; cll=laLeftColumn(cl,1);clr=laRightColumn(cl,0);
+    laShowItem(uil,cll,This,"__move");
+    laShowItem(uil,clr,This,"name");
+    laUiItem* r=laBeginRow(uil,clr,0,0);
+    laShowItem(uil,clr,This,"remove")->Flags|=LA_UI_FLAGS_ICON;
+    laEndRow(uil,r);
+    laUiItem* ui;
+#define MAKE_ROW(label,prop)\
+    r=laBeginRow(uil,cr,0,0); laShowLabel(uil,cr,label,0,0); \
+    ui=laShowItemFull(uil,cr,This,prop,0,0,0,0);ui->Expand=1;ui->Flags|=LA_UI_FLAGS_VALUE_METER; ui->Extra->HeightCoeff=3; \
+    laEndRow(uil,r);
+    
+    MAKE_ROW("R","red");
+    MAKE_ROW("G","green");
+    MAKE_ROW("B","blue");
+#undef MAKE_ROW
+}
+void ourui_DisplayResponses(laUiList *uil, laPropPack *This, laPropPack *DetachedProps, laColumn *UNUSED, int context){
+    laColumn* c=laFirstColumn(uil),*cl,*cr; laSplitColumn(uil,c,0.3);cl=laLeftColumn(c,0);cr=laRightColumn(c,0);
+    laColumn* cll,*clr; laSplitColumn(uil,cl,0.3);cll=laLeftColumn(cl,1);clr=laRightColumn(cl,0);
+    laUiItem* r=laBeginRow(uil,c,0,0);
+    laShowItem(uil,c,0,"OUR_new_display_response");
+    laEndRow(uil,r);
+    laShowColumnAdjuster(uil,c);
+    laShowItemFull(uil,c,0,"our.preferences.display_responses",0,0,ourui_DiplayResponseItem,0)->Flags|=LA_UI_FLAGS_NO_DECAL;
+}
 void ourui_SplashPanel(laUiList *uil, laPropPack *This, laPropPack *DetachedProps, laColumn *UNUSED, int context){
     laColumn* c = laFirstColumn(uil),*cl,*cr; laSplitColumn(uil,c,0.5);cl=laLeftColumn(c,0);cr=laRightColumn(c,0);
     if(MAIN.CurrentWindow->CW>2500){
@@ -1013,6 +1061,27 @@ OurBrush* our_DuplicateBrush(OurBrush* b){
     return nb;
 }
 
+OurPigment* our_NewPigment(char* name){
+    OurPigment* p=memAcquireHyper(sizeof(OurPigment)); strSafeSet(&p->Name,name); lstPushItem(&Our->Pigments, p);
+    laNotifyUsers("our.tools.pigments"); 
+    return p;
+}
+void our_RemovePigment(OurPigment* p){
+    lstRemoveItem(&Our->Pigments,p);memFree(p);
+    laNotifyUsers("our.tools.pigments"); 
+}
+OurDisplayResponse* our_NewDisplayResponse(char* name){
+    OurDisplayResponse* dr=memAcquireHyper(sizeof(OurDisplayResponse)); strSafeSet(&dr->Name,name); lstPushItem(&Our->DisplayResponses, dr);
+    memAssignRef(Our,&Our->CurrentDisplayResponse,dr);
+    laNotifyUsers("our.preferences.display_responses"); 
+    return dr;
+}
+void our_RemoveDisplayResponse(OurDisplayResponse* dr){
+    OurDisplayResponse* nextdr=dr->Item.pNext?dr->Item.pNext:dr->Item.pPrev;
+    lstRemoveItem(&Our->DisplayResponses,dr); memFree(dr); memAssignRef(Our,&Our->CurrentDisplayResponse,nextdr);
+    laNotifyUsers("our.preferences.display_responses"); 
+}
+
 int our_BufferAnythingVisible(uint16_t* buf, int elemcount){
     for(int i=0;i<elemcount;i++){
         uint16_t* rgba=&buf[i*4]; if(rgba[3]) return 1;
@@ -2467,6 +2536,49 @@ int ourinv_PalletteRemoveColor(laOperator* a, laEvent* e){
     return LA_FINISHED;
 }
 
+int ourinv_NewPigment(laOperator* a, laEvent* e){
+    our_NewPigment("Our Pigment"); laRecordInstanceDifferences(Our,"our_tools"); laPushDifferences("Add pigment",0);
+    return LA_FINISHED;
+}
+int ourinv_RemovePigment(laOperator* a, laEvent* e){
+    OurPigment* p=0; if(a->This && a->This->EndInstance){ p=a->This->EndInstance; }
+    if(!p) return LA_FINISHED;
+    char buf[512]; sprintf(buf,"Will remove pigment \"%s\"",SSTR(p->Name));
+    laEnableYesNoPanel(a,0,"Remove Pigment",buf,e->x,e->y,200,e);
+    return LA_RUNNING;
+}
+int ourmod_RemovePigment(laOperator* a, laEvent* e){
+    OurPigment* p=0; if(a->This && a->This->EndInstance){ p=a->This->EndInstance; }
+    if(!p) return LA_FINISHED;
+    if(a->ConfirmData){
+        if(a->ConfirmData->Mode==LA_CONFIRM_OK){
+            our_RemovePigment(p); laRecordInstanceDifferences(Our,"our_tools"); laPushDifferences("Remove pigment",0);
+        }
+        return LA_FINISHED;
+    }
+}
+int ourinv_NewDisplayResponse(laOperator* a, laEvent* e){
+    our_NewDisplayResponse("My RGB");
+    return LA_FINISHED;
+}
+int ourinv_RemoveDisplayResponse(laOperator* a, laEvent* e){
+    OurDisplayResponse* dr=0; if(a->This && a->This->EndInstance){ dr=a->This->EndInstance; }
+    if(!dr) return LA_FINISHED;
+    char buf[512]; sprintf(buf,"Will remove display response \"%s\"",SSTR(dr->Name));
+    laEnableYesNoPanel(a,0,"Remove...",buf,e->x,e->y,200,e);
+    return LA_RUNNING;
+}
+int ourmod_RemoveDisplayResponse(laOperator* a, laEvent* e){
+    OurDisplayResponse* dr=0; if(a->This && a->This->EndInstance){ dr=a->This->EndInstance; }
+    if(!dr) return LA_FINISHED;
+    if(a->ConfirmData){
+        if(a->ConfirmData->Mode==LA_CONFIRM_OK){
+            our_RemoveDisplayResponse(dr);
+        }
+        return LA_FINISHED;
+    }
+}
+
 int our_TileHasPixels(OurTexTile* ot){
     if(!ot || !ot->Texture) return 0;
     int bufsize=OUR_TILE_W*OUR_TILE_W*OUR_CANVAS_PIXEL_SIZE;
@@ -2828,6 +2940,18 @@ void ourpost_Canvas(void* unused){
     if(Our->CanvasVersion<20){ Our->BackgroundFactor=0; Our->BackgroundType=0; }
 }
 
+void ourset_PigmentMove(OurPigment* p, int move){
+    if(move<0 && p->Item.pPrev){ lstMoveUp(&Our->Pigments, p); laNotifyUsers("our.tools.pigments"); }
+    elif(move>0 && p->Item.pNext){ lstMoveDown(&Our->Pigments, p); laNotifyUsers("our.tools.pigments"); }
+}
+void ourset_DisplayResponseMove(OurDisplayResponse* dr, int move){
+    if(move<0 && dr->Item.pPrev){ lstMoveUp(&Our->DisplayResponses, dr); laNotifyUsers("our.preferences.display_responses"); }
+    elif(move>0 && dr->Item.pNext){ lstMoveDown(&Our->DisplayResponses, dr); laNotifyUsers("our.preferences.display_responses"); }
+}
+void* ourget_FirstPigment(void* unused, void* unused1){
+    return Our->Pigments.pFirst;
+}
+
 #define OUR_ADD_PRESSURE_SWITCH(p) \
     laAddEnumItemAs(p,"NONE","None","Not using pressure",0,0);\
     laAddEnumItemAs(p,"ENABLED","Enabled","Using pressure",1,0);
@@ -3076,6 +3200,11 @@ void ourRegisterEverything(){
     laCreateOperatorType("OUR_pallette_new_color","New Color","New color in this pallette",0,0,0,ourinv_PalletteNewColor,0,'+',0);
     laCreateOperatorType("OUR_pallette_remove_color","Remove Color","Remove this color from the pallette",0,0,0,ourinv_PalletteRemoveColor,0,U'🗴',0);
 
+    laCreateOperatorType("OUR_new_pigment","New Pigment","New pigment",0,0,0,ourinv_NewPigment,0,'+',0);
+    laCreateOperatorType("OUR_remove_pigment","Remove Pigment","Remove pigment",0,0,0,ourinv_RemovePigment,ourmod_RemovePigment,U'🗴',0);
+    laCreateOperatorType("OUR_new_display_response","New Display Response","New display response",0,0,0,ourinv_NewDisplayResponse,0,'+',0);
+    laCreateOperatorType("OUR_remove_display_response","Remove Display Response","Remove display response",0,0,0,ourinv_RemoveDisplayResponse,ourmod_RemoveDisplayResponse,U'🗴',0);
+
     laCreateOperatorType("OUR_clear_empty_tiles","Clear Empty Tiles","Clear empty tiles in this image",0,0,0,ourinv_ClearEmptyTiles,0,U'🧹',0);
 
     laCreateOperatorType("OUR_register_file_associations","Register File Associations","Register file associations to current user",0,0,0,ourinv_RegisterFileAssociations,0,0,0);
@@ -3089,6 +3218,7 @@ void ourRegisterEverything(){
     laRegisterUiTemplate("panel_pallettes", "Pallettes", ourui_PallettesPanel, 0, 0,0, GL_RGBA16F,0,0);
     laRegisterUiTemplate("panel_brush_nodes", "Brush Nodes", ourui_BrushPage, 0, 0,0, 0,25,30);
     laRegisterUiTemplate("panel_notes", "Notes", ourui_NotesPanel, 0, 0,0, 0,15,15);
+    laRegisterUiTemplate("panel_pigments", "Pigments", ourui_PigmentsPanel, 0, 0,0, 0,20,20);
     
     pc=laDefineRoot();
     laAddSubGroup(pc,"our","Our","OurPaint main","our_paint",0,0,0,-1,ourget_our,0,0,0,0,0,0,LA_UDF_SINGLE);
@@ -3175,6 +3305,7 @@ void ourRegisterEverything(){
     p=laAddEnumProperty(pc,"file_registered","File Registered","Whether Our Paint is registered in the system",0,0,0,0,0,offsetof(OurPaint,FileRegistered),0,0,0,0,0,0,0,0,0,LA_READ_ONLY|LA_UDF_IGNORE);
     laAddEnumItemAs(p,"FALSE","Not registered","File association isn't registered",0,0);
     laAddEnumItemAs(p,"TRUE","Registered","File association is registered",1,0);
+    laAddSubGroup(pc,"display_responses","Display Responses","Display responses from pigments","our_display_response",0,0,0,-1,0,0,0,0,0,0,offsetof(OurPaint,DisplayResponses),0);
 
     pc=laAddPropertyContainer("our_tools","Our Tools","OurPaint tools",0,0,sizeof(OurPaint),0,0,1);
     laPropContainerExtraFunctions(pc,0,0,0,ourpropagate_Tools,0);
@@ -3184,7 +3315,8 @@ void ourRegisterEverything(){
     sp=laAddSubGroup(pc,"pallettes","Pallettes","Pallettes","our_pallette",0,0,ourui_Pallette,offsetof(OurPaint,CurrentPallette),0,0,0,ourset_CurrentPallette,ourgetstate_Pallette,0,offsetof(OurPaint,Pallettes),0);
     //sp->UiFilter=ourfilter_BrushInPage;
     laAddSubGroup(pc,"current_pallette","Current Pallette","Current pallette","our_pallette",0,0,0,offsetof(OurPaint,CurrentPallette),ourget_FirstPallette,0,laget_ListNext,ourset_CurrentPallette,0,0,0,LA_UDF_REFER);
-    
+    laAddSubGroup(pc,"pigments","Pigments","Pigments in Our Paint","our_pigment",0,0,0,-1,0,0,0,0,0,0,offsetof(OurPaint,Pigments),0);
+
     pc=laAddPropertyContainer("our_brush","Our Brush","OurPaint brush",0,0,sizeof(OurBrush),0,0,2);
     laAddStringProperty(pc,"name","Name","Name of the brush",0,0,0,0,1,offsetof(OurBrush,Name),0,0,0,0,LA_AS_IDENTIFIER);
     laAddIntProperty(pc,"__move","Move Slider","Move Slider",LA_WIDGET_HEIGHT_ADJUSTER,0,0,0,0,0,0,0,0,0,ourset_BrushMove,0,0,0,0,0,0,0,0,LA_UDF_IGNORE);
@@ -3302,6 +3434,23 @@ void ourRegisterEverything(){
     laAddEnumItemAs(p,"NORMAL","Normal","Show sketch layers as normal layers",0,0);
     laAddEnumItemAs(p,"FULL","Full","Show sketch layers in full opacity",1,0);
     laAddEnumItemAs(p,"NONE","None","Show double page spread",2,0);
+    laAddSubGroup(pc,"pigment0","Pigment 0","Pigment 0","our_pigment",0,0,laui_IdentifierOnly,offsetof(OurPaint,CanvasPigments[0]),ourget_FirstPigment,0,laget_ListNext,0,0,0,0,LA_UDF_REFER);
+    laAddSubGroup(pc,"pigment1","Pigment 1","Pigment 1","our_pigment",0,0,laui_IdentifierOnly,offsetof(OurPaint,CanvasPigments[1]),ourget_FirstPigment,0,laget_ListNext,0,0,0,0,LA_UDF_REFER);
+    laAddSubGroup(pc,"pigment2","Pigment 2","Pigment 2","our_pigment",0,0,laui_IdentifierOnly,offsetof(OurPaint,CanvasPigments[2]),ourget_FirstPigment,0,laget_ListNext,0,0,0,0,LA_UDF_REFER);
+    laAddSubGroup(pc,"pigment3","Pigment 3","Pigment 3","our_pigment",0,0,laui_IdentifierOnly,offsetof(OurPaint,CanvasPigments[3]),ourget_FirstPigment,0,laget_ListNext,0,0,0,0,LA_UDF_REFER);
+    laAddSubGroup(pc,"pigment4","Pigment 4","Pigment 4","our_pigment",0,0,laui_IdentifierOnly,offsetof(OurPaint,CanvasPigments[4]),ourget_FirstPigment,0,laget_ListNext,0,0,0,0,LA_UDF_REFER);
+    laAddSubGroup(pc,"pigment5","Pigment 5","Pigment 5","our_pigment",0,0,laui_IdentifierOnly,offsetof(OurPaint,CanvasPigments[5]),ourget_FirstPigment,0,laget_ListNext,0,0,0,0,LA_UDF_REFER);
+    laAddSubGroup(pc,"pigment6","Pigment 6","Pigment 6","our_pigment",0,0,laui_IdentifierOnly,offsetof(OurPaint,CanvasPigments[6]),ourget_FirstPigment,0,laget_ListNext,0,0,0,0,LA_UDF_REFER);
+    laAddSubGroup(pc,"pigment7","Pigment 7","Pigment 7","our_pigment",0,0,laui_IdentifierOnly,offsetof(OurPaint,CanvasPigments[7]),ourget_FirstPigment,0,laget_ListNext,0,0,0,0,LA_UDF_REFER);
+    laAddSubGroup(pc,"pigment8","Pigment 8","Pigment 8","our_pigment",0,0,laui_IdentifierOnly,offsetof(OurPaint,CanvasPigments[8]),ourget_FirstPigment,0,laget_ListNext,0,0,0,0,LA_UDF_REFER);
+    laAddSubGroup(pc,"pigment9","Pigment 9","Pigment 9","our_pigment",0,0,laui_IdentifierOnly,offsetof(OurPaint,CanvasPigments[9]),ourget_FirstPigment,0,laget_ListNext,0,0,0,0,LA_UDF_REFER);
+    laAddSubGroup(pc,"pigment10","Pigment 10","Pigment 10","our_pigment",0,0,laui_IdentifierOnly,offsetof(OurPaint,CanvasPigments[10]),ourget_FirstPigment,0,laget_ListNext,0,0,0,0,LA_UDF_REFER);
+    laAddSubGroup(pc,"pigment11","Pigment 11","Pigment 11","our_pigment",0,0,laui_IdentifierOnly,offsetof(OurPaint,CanvasPigments[11]),ourget_FirstPigment,0,laget_ListNext,0,0,0,0,LA_UDF_REFER);
+    laAddSubGroup(pc,"pigment12","Pigment 12","Pigment 12","our_pigment",0,0,laui_IdentifierOnly,offsetof(OurPaint,CanvasPigments[12]),ourget_FirstPigment,0,laget_ListNext,0,0,0,0,LA_UDF_REFER);
+    laAddSubGroup(pc,"pigment13","Pigment 13","Pigment 13","our_pigment",0,0,laui_IdentifierOnly,offsetof(OurPaint,CanvasPigments[13]),ourget_FirstPigment,0,laget_ListNext,0,0,0,0,LA_UDF_REFER);
+    laAddSubGroup(pc,"pigment14","Pigment 14","Pigment 14","our_pigment",0,0,laui_IdentifierOnly,offsetof(OurPaint,CanvasPigments[14]),ourget_FirstPigment,0,laget_ListNext,0,0,0,0,LA_UDF_REFER);
+    laAddSubGroup(pc,"pigment15","Pigment 15","Pigment 15","our_pigment",0,0,laui_IdentifierOnly,offsetof(OurPaint,CanvasPigments[15]),ourget_FirstPigment,0,laget_ListNext,0,0,0,0,LA_UDF_REFER);
+    laAddSubGroup(pc,"pigment16","Pigment 16","Pigment 16","our_pigment",0,0,laui_IdentifierOnly,offsetof(OurPaint,CanvasPigments[16]),ourget_FirstPigment,0,laget_ListNext,0,0,0,0,LA_UDF_REFER);
 
     pc=laAddPropertyContainer("our_layer","Our Layer","OurPaint layer",0,0,sizeof(OurLayer),0,0,1);
     laPropContainerExtraFunctions(pc,ourbeforefree_Layer,ourbeforefree_Layer,0,0,0);
@@ -3329,7 +3478,22 @@ void ourRegisterEverything(){
     p=laAddEnumProperty(pc,"as_sketch","As Sketch","As sketch layer (for quick toggle)",0,0,0,0,0,offsetof(OurLayer,AsSketch),0,ourset_LayerAsSketch,0,0,0,0,0,0,0,0);
     laAddEnumItemAs(p,"NORMAL","Normal","Layer is normal",0,U'🖌');
     laAddEnumItemAs(p,"SKETCH","Sketch","Layer is a sketch layer",1,U'🖉');
-    
+
+    pc=laAddPropertyContainer("our_pigment","Our Pigment","OurPaint pigment",0,0,sizeof(OurPigment),0,0,2);
+    laAddStringProperty(pc,"name","Name","Name of the pigment",0,0,0,0,1,offsetof(OurPigment,Name),0,0,0,0,LA_AS_IDENTIFIER);
+    laAddIntProperty(pc,"__move","Move Slider","Move Slider",LA_WIDGET_HEIGHT_ADJUSTER,0,0,0,0,0,0,0,0,0,ourset_PigmentMove,0,0,0,0,0,0,0,0,LA_UDF_IGNORE);
+    laAddFloatProperty(pc,"reflectivities","Reflectivities","Reflectivities across visible wavelengths",0,0,0,1,0,0.01,1,0,offsetof(OurPigment,Reflectivities),0,0,12,0,0,0,0,0,0,0,0);
+    laAddFloatProperty(pc,"opaqueness","Opaqueness","Opaqeness of this pigment",0,0,0,1,0,0.01,1,0,offsetof(OurPigment,Opaqueness),0,0,0,0,0,0,0,0,0,0,0);
+    laAddOperatorProperty(pc,"remove","Remove","Remove pigment","OUR_remove_pigment",0,0);
+
+    pc=laAddPropertyContainer("our_display_response","Our Display Response","OurPaint display response",0,0,sizeof(OurDisplayResponse),0,0,2);
+    laAddStringProperty(pc,"name","Name","Name of the response characteristics",0,0,0,0,1,offsetof(OurDisplayResponse,Name),0,0,0,0,LA_AS_IDENTIFIER);
+    laAddIntProperty(pc,"__move","Move Slider","Move Slider",LA_WIDGET_HEIGHT_ADJUSTER,0,0,0,0,0,0,0,0,0,ourset_DisplayResponseMove,0,0,0,0,0,0,0,0,LA_UDF_IGNORE);
+    laAddFloatProperty(pc,"red","Red Responses","Red display element responses to wavelengths input",0,0,0,1,0,0.01,1,0,offsetof(OurDisplayResponse,RedResponses),0,0,12,0,0,0,0,0,0,0,0);
+    laAddFloatProperty(pc,"green","Green Responses","Green display element responses to wavelengths input",0,0,0,1,0,0.01,1,0,offsetof(OurDisplayResponse,GreenResponses),0,0,12,0,0,0,0,0,0,0,0);
+    laAddFloatProperty(pc,"blue","Blue Responses","Blue display element responses to wavelengths input",0,0,0,1,0,0.01,1,0,offsetof(OurDisplayResponse,BlueResponses),0,0,12,0,0,0,0,0,0,0,0);
+    laAddOperatorProperty(pc,"remove","Remove","Remove display response","OUR_remove_display_response",0,0);
+
     laCanvasTemplate* ct=laRegisterCanvasTemplate("our_CanvasDraw", "our_canvas", ourextramod_Canvas, our_CanvasDrawCanvas, our_CanvasDrawOverlay, our_CanvasDrawInit, la_CanvasDestroy);
     pc = laCanvasHasExtraProps(ct,sizeof(OurCanvasDraw),2);
     km = &ct->KeyMapper;
@@ -3425,6 +3589,7 @@ void ourRegisterEverything(){
     laAddExtraExtension(LA_FILETYPE_UDF,"ourpaint","ourbrush",0ll);
     laAddExtraPreferencePath("our.preferences");
     laAddExtraPreferencePage("Our Paint",ourui_OurPreference);
+    laAddExtraPreferencePage("Pigment",ourui_DisplayResponses);
 
     laSetAboutTemplates(ourui_AboutContent,ourui_AboutVersion,ourui_AboutAuthor);
 

+ 20 - 0
ourpaint.h

@@ -359,6 +359,20 @@ STRUCTURE(OurThreadImportPNGDataMain){
     SYSLOCK lock;
 };
 
+STRUCTURE(OurPigment){
+    laListItem Item;
+    laSafeString* Name;
+    real Reflectivities[12];
+    real Opaqueness;
+};
+STRUCTURE(OurDisplayResponse){
+    laListItem Item;
+    laSafeString* Name;
+    real RedResponses[12];
+    real GreenResponses[12];
+    real BlueResponses[12];
+};
+
 STRUCTURE(OurPaint){
     real pad;
 
@@ -373,6 +387,12 @@ STRUCTURE(OurPaint){
     laListHandle Pallettes;
     OurColorPallette* CurrentPallette;
 
+    laListHandle Pigments;
+    laListHandle DisplayResponses;
+    OurDisplayResponse* CurrentDisplayResponse;
+    OurPigment* CanvasPigments[16];
+    real CurrentPigments[16];
+
     laListHandle Layers;
     OurLayer*    CurrentLayer;
     laListHandle Brushes;