|
@@ -121,35 +121,37 @@ void our_RecordUndo(OurLayer* ol, real xmin,real xmax, real ymin,real ymax,int A
|
|
|
|
|
|
void our_CanvasAlphaOver(OUR_PIX_COMPACT* target, OUR_PIX_COMPACT* source, real alpha){
|
|
void our_CanvasAlphaOver(OUR_PIX_COMPACT* target, OUR_PIX_COMPACT* source, real alpha){
|
|
real a_1=(real)(OUR_PIX_MAX-source[3]*alpha)/OUR_PIX_MAX;
|
|
real a_1=(real)(OUR_PIX_MAX-source[3]*alpha)/OUR_PIX_MAX;
|
|
- int a=(int)(source[3])*alpha+(int)(target[3])*a_1; TNS_CLAMP(a,0,OUR_PIX_MAX);
|
|
|
|
- int r=(int)(source[0])*alpha+(int)(target[0])*a_1; TNS_CLAMP(r,0,OUR_PIX_MAX);
|
|
|
|
- int g=(int)(source[1])*alpha+(int)(target[1])*a_1; TNS_CLAMP(g,0,OUR_PIX_MAX);
|
|
|
|
- int b=(int)(source[2])*alpha+(int)(target[2])*a_1; TNS_CLAMP(b,0,OUR_PIX_MAX);
|
|
|
|
|
|
+ uint32_t a=(uint32_t)(source[3])*alpha+(uint32_t)(target[3])*a_1; TNS_CLAMP(a,0,OUR_PIX_MAX);
|
|
|
|
+ uint32_t r=(uint32_t)(source[0])*alpha+(uint32_t)(target[0])*a_1; TNS_CLAMP(r,0,OUR_PIX_MAX);
|
|
|
|
+ uint32_t g=(uint32_t)(source[1])*alpha+(uint32_t)(target[1])*a_1; TNS_CLAMP(g,0,OUR_PIX_MAX);
|
|
|
|
+ uint32_t b=(uint32_t)(source[2])*alpha+(uint32_t)(target[2])*a_1; TNS_CLAMP(b,0,OUR_PIX_MAX);
|
|
target[3]=a; target[0]=r; target[1]=g; target[2]=b;
|
|
target[3]=a; target[0]=r; target[1]=g; target[2]=b;
|
|
}
|
|
}
|
|
void our_CanvasAdd(OUR_PIX_COMPACT* target, OUR_PIX_COMPACT* source, real alpha){
|
|
void our_CanvasAdd(OUR_PIX_COMPACT* target, OUR_PIX_COMPACT* source, real alpha){
|
|
- int a=((int)source[3]*alpha+(int)target[3]); TNS_CLAMP(a,0,OUR_PIX_MAX);
|
|
|
|
- int r=((int)source[0]*alpha+(int)target[0]); TNS_CLAMP(r,0,OUR_PIX_MAX);
|
|
|
|
- int g=((int)source[1]*alpha+(int)target[1]); TNS_CLAMP(g,0,OUR_PIX_MAX);
|
|
|
|
- int b=((int)source[2]*alpha+(int)target[2]); TNS_CLAMP(b,0,OUR_PIX_MAX);
|
|
|
|
|
|
+ uint32_t a=((uint32_t)source[3]*alpha+(uint32_t)target[3]); TNS_CLAMP(a,0,OUR_PIX_MAX);
|
|
|
|
+ uint32_t r=((uint32_t)source[0]*alpha+(uint32_t)target[0]); TNS_CLAMP(r,0,OUR_PIX_MAX);
|
|
|
|
+ uint32_t g=((uint32_t)source[1]*alpha+(uint32_t)target[1]); TNS_CLAMP(g,0,OUR_PIX_MAX);
|
|
|
|
+ uint32_t b=((uint32_t)source[2]*alpha+(uint32_t)target[2]); TNS_CLAMP(b,0,OUR_PIX_MAX);
|
|
target[3]=a; target[0]=r; target[1]=g; target[2]=b;
|
|
target[3]=a; target[0]=r; target[1]=g; target[2]=b;
|
|
}
|
|
}
|
|
void our_CanvasAlphaOverStraight(OUR_PIX_COMPACT* target, OUR_PIX_COMPACT* source, real alpha){
|
|
void our_CanvasAlphaOverStraight(OUR_PIX_COMPACT* target, OUR_PIX_COMPACT* source, real alpha){
|
|
real a_1=(real)(OUR_PIX_MAX-source[3]*alpha)/OUR_PIX_MAX;
|
|
real a_1=(real)(OUR_PIX_MAX-source[3]*alpha)/OUR_PIX_MAX;
|
|
- int a=(int)(source[3])*alpha+(int)(target[3])*a_1; TNS_CLAMP(a,0,OUR_PIX_MAX);
|
|
|
|
- int r=((int)(source[0])*alpha*source[3]+(int)(target[0])*a_1*target[3])/(a); TNS_CLAMP(r,0,OUR_PIX_MAX);
|
|
|
|
- int g=((int)(source[1])*alpha*source[3]+(int)(target[1])*a_1*target[3])/(a); TNS_CLAMP(g,0,OUR_PIX_MAX);
|
|
|
|
- int b=((int)(source[2])*alpha*source[3]+(int)(target[2])*a_1*target[3])/(a); TNS_CLAMP(b,0,OUR_PIX_MAX);
|
|
|
|
|
|
+ uint64_t a=(uint64_t)(source[3])*alpha+(uint64_t)(target[3])*a_1; TNS_CLAMP(a,0,OUR_PIX_MAX);
|
|
|
|
+ uint64_t r=((uint64_t)(source[0])*alpha*source[3]+(uint64_t)(target[0])*a_1*target[3])/a; TNS_CLAMP(r,0,OUR_PIX_MAX);
|
|
|
|
+ uint64_t g=((uint64_t)(source[1])*alpha*source[3]+(uint64_t)(target[1])*a_1*target[3])/a; TNS_CLAMP(g,0,OUR_PIX_MAX);
|
|
|
|
+ uint64_t b=((uint64_t)(source[2])*alpha*source[3]+(uint64_t)(target[2])*a_1*target[3])/a; TNS_CLAMP(b,0,OUR_PIX_MAX);
|
|
target[3]=a; target[0]=r; target[1]=g; target[2]=b;
|
|
target[3]=a; target[0]=r; target[1]=g; target[2]=b;
|
|
}
|
|
}
|
|
void our_CanvasAddStraight(OUR_PIX_COMPACT* target, OUR_PIX_COMPACT* source, real alpha){
|
|
void our_CanvasAddStraight(OUR_PIX_COMPACT* target, OUR_PIX_COMPACT* source, real alpha){
|
|
- int a=((int)source[3]*alpha+(int)target[3]); TNS_CLAMP(a,0,OUR_PIX_MAX);
|
|
|
|
- int r=((int)source[0]*alpha+(int)target[0]); TNS_CLAMP(r,0,OUR_PIX_MAX);
|
|
|
|
- int g=((int)source[1]*alpha+(int)target[1]); TNS_CLAMP(g,0,OUR_PIX_MAX);
|
|
|
|
- int b=((int)source[2]*alpha+(int)target[2]); TNS_CLAMP(b,0,OUR_PIX_MAX);
|
|
|
|
|
|
+ uint64_t a=((uint64_t)source[3]*alpha+(uint64_t)target[3]); TNS_CLAMP(a,0,OUR_PIX_MAX);
|
|
|
|
+ uint64_t r=((uint64_t)source[0]*alpha*source[3]+(uint64_t)target[0]*target[3])/a; TNS_CLAMP(r,0,OUR_PIX_MAX);
|
|
|
|
+ uint64_t g=((uint64_t)source[1]*alpha*source[3]+(uint64_t)target[1]*target[3])/a; TNS_CLAMP(g,0,OUR_PIX_MAX);
|
|
|
|
+ uint64_t b=((uint64_t)source[2]*alpha*source[3]+(uint64_t)target[2]*target[3])/a; TNS_CLAMP(b,0,OUR_PIX_MAX);
|
|
target[3]=a; target[0]=r; target[1]=g; target[2]=b;
|
|
target[3]=a; target[0]=r; target[1]=g; target[2]=b;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+typedef void (*our_MixFuncRGBA)(OUR_PIX_COMPACT* target, OUR_PIX_COMPACT* source, real alpha);
|
|
|
|
+
|
|
void our_InitRGBProfile(int Linear,cmsCIExyYTRIPLE* primaries_pre_quantized, void** ptr, int* psize, char* copyright, char* manufacturer, char* description){
|
|
void our_InitRGBProfile(int Linear,cmsCIExyYTRIPLE* primaries_pre_quantized, void** ptr, int* psize, char* copyright, char* manufacturer, char* description){
|
|
cmsCIExyY d65_srgb_adobe_specs = {0.3127, 0.3290, 1.0};
|
|
cmsCIExyY d65_srgb_adobe_specs = {0.3127, 0.3290, 1.0};
|
|
cmsToneCurve*tonecurve; cmsToneCurve*curve[3];
|
|
cmsToneCurve*tonecurve; cmsToneCurve*curve[3];
|
|
@@ -767,6 +769,8 @@ void ourui_OurPreference(laUiList *uil, laPropPack *This, laPropPack *DetachedPr
|
|
laShowItem(uil,cr,0,"our.preferences.canvas_default_scale");
|
|
laShowItem(uil,cr,0,"our.preferences.canvas_default_scale");
|
|
laShowItem(uil,cl,0,"our.preferences.show_grid");
|
|
laShowItem(uil,cl,0,"our.preferences.show_grid");
|
|
laShowItem(uil,cr,0,"our.preferences.multithread_write");
|
|
laShowItem(uil,cr,0,"our.preferences.multithread_write");
|
|
|
|
+ laShowLabel(uil,c,"Pigment Display Method:",0,0);
|
|
|
|
+ laShowItem(uil,c,0,"our.preferences.pigment_display_method")->Flags|=LA_UI_FLAGS_EXPAND;
|
|
|
|
|
|
laShowSeparator(uil,c);
|
|
laShowSeparator(uil,c);
|
|
|
|
|
|
@@ -1146,9 +1150,9 @@ void our_CanvasDrawInit(laUiItem* ui){
|
|
logPrint("GPU max local work group invocations %i\n", work_grp_inv);
|
|
logPrint("GPU max local work group invocations %i\n", work_grp_inv);
|
|
}
|
|
}
|
|
void our_CanvasEnsureDrawBuffers(OurCanvasDraw* ocd, int W, int H){ laCanvasExtra*e=&ocd->Base;
|
|
void our_CanvasEnsureDrawBuffers(OurCanvasDraw* ocd, int W, int H){ laCanvasExtra*e=&ocd->Base;
|
|
- int format = Our->PigmentMode?GL_RGBA16UI:GL_RGBA16F; int RealW=W,RealH=H;
|
|
|
|
|
|
+ int format = Our->PigmentMode?GL_RGBA16UI:GL_RGBA16F; int RealW=W,RealH=H,texscale=1;
|
|
if(Our->PigmentMode){
|
|
if(Our->PigmentMode){
|
|
- glDisable(GL_BLEND); glDisable(GL_DITHER); W*=2; H*=2;
|
|
|
|
|
|
+ glDisable(GL_BLEND); glDisable(GL_DITHER); if(Our->PigmentDisplayMethod>=2){ W*=2; H*=2; texscale=2; }
|
|
}
|
|
}
|
|
if (!e->OffScr || e->OffScr->pColor[0]->Height != H || e->OffScr->pColor[0]->Width != W ||
|
|
if (!e->OffScr || e->OffScr->pColor[0]->Height != H || e->OffScr->pColor[0]->Width != W ||
|
|
e->OffScr->pColor[0]->GLTexBitsType!=format){
|
|
e->OffScr->pColor[0]->GLTexBitsType!=format){
|
|
@@ -1181,7 +1185,7 @@ void our_CanvasDrawCanvas(laBoxedTheme *bt, OurPaint *unused_c, laUiItem* ui){
|
|
if(Our->PigmentMode){
|
|
if(Our->PigmentMode){
|
|
uint val[4]={0};
|
|
uint val[4]={0};
|
|
glClearBufferuiv(GL_COLOR, 0,&val);
|
|
glClearBufferuiv(GL_COLOR, 0,&val);
|
|
- tnsEnableShaderv(Our->PigmentCompositionProgramT);
|
|
|
|
|
|
+ tnsEnableShaderv(Our->PigmentLayeringProgramT);
|
|
}else{
|
|
}else{
|
|
tnsClearColor(LA_COLOR3(Our->BackgroundColor),1); tnsClearAll();
|
|
tnsClearColor(LA_COLOR3(Our->BackgroundColor),1); tnsClearAll();
|
|
tnsUseImmShader(); tnsEnableShaderv(T->immShader);
|
|
tnsUseImmShader(); tnsEnableShaderv(T->immShader);
|
|
@@ -1197,16 +1201,28 @@ void our_CanvasDrawCanvas(laBoxedTheme *bt, OurPaint *unused_c, laUiItem* ui){
|
|
tnsFlush();
|
|
tnsFlush();
|
|
glEnable(GL_BLEND);
|
|
glEnable(GL_BLEND);
|
|
}
|
|
}
|
|
|
|
+void our_CanvasGetFragOffset(laUiItem* ui,int *x,int* y){
|
|
|
|
+ if(!x || !y) return; *x=0;*y=0;
|
|
|
|
+ laWindow* w=MAIN.CurrentWindow; if(!w) return;
|
|
|
|
+ if(w->MaximizedUi==ui) return;
|
|
|
|
+ laPanel* p=MAIN.CurrentPanel; if(!p) return;
|
|
|
|
+ *x=-ui->L; *y=ui->B-p->H;
|
|
|
|
+}
|
|
void our_CanvasDrawOverlayInit(laUiItem* ui){
|
|
void our_CanvasDrawOverlayInit(laUiItem* ui){
|
|
int W, H; W = ui->R - ui->L; H = ui->B - ui->U;
|
|
int W, H; W = ui->R - ui->L; H = ui->B - ui->U;
|
|
if(Our->PigmentMode){
|
|
if(Our->PigmentMode){
|
|
|
|
+ laCanvasExtra* e=ui->Extra;
|
|
tnsUseShader(Our->PigmentDisplayProgramT); tnsEnableShaderv(Our->PigmentDisplayProgramT);
|
|
tnsUseShader(Our->PigmentDisplayProgramT); tnsEnableShaderv(Our->PigmentDisplayProgramT);
|
|
OurPigmentData140 pd140; our_ToPigmentData140(&Our->CanvasLight.Emission,&Our->CanvasSurface.Reflectance,&pd140);
|
|
OurPigmentData140 pd140; our_ToPigmentData140(&Our->CanvasLight.Emission,&Our->CanvasSurface.Reflectance,&pd140);
|
|
glBindBufferBase(GL_UNIFORM_BUFFER, Our->uboCanvasPigmentLocation, Our->uboCanvasPigment);
|
|
glBindBufferBase(GL_UNIFORM_BUFFER, Our->uboCanvasPigmentLocation, Our->uboCanvasPigment);
|
|
glBindBuffer(GL_UNIFORM_BUFFER, Our->uboCanvasPigment);
|
|
glBindBuffer(GL_UNIFORM_BUFFER, Our->uboCanvasPigment);
|
|
glBufferSubData(GL_UNIFORM_BUFFER, 0, sizeof(OurPigmentData140), &pd140);
|
|
glBufferSubData(GL_UNIFORM_BUFFER, 0, sizeof(OurPigmentData140), &pd140);
|
|
glBindBuffer(GL_UNIFORM_BUFFER, 0);
|
|
glBindBuffer(GL_UNIFORM_BUFFER, 0);
|
|
- glUniform2ui(Our->uPigmentDisplaySize,W*2,H*2);
|
|
|
|
|
|
+ int size_multiply=(Our->PigmentDisplayMethod>=2)?2:1;
|
|
|
|
+ int ofx,ofy; our_CanvasGetFragOffset(ui,&ofx,&ofy);
|
|
|
|
+ glUniform2i(Our->uPigmentFragOffset,ofx,ofy);
|
|
|
|
+ glUniform1f(Our->uPigmentTextureScale,1.0f/e->ZoomX*(real)size_multiply);
|
|
|
|
+ glUniform1i(Our->uPigmentDisplayMode,Our->PigmentDisplayMethod);
|
|
}else{
|
|
}else{
|
|
tnsUseImmShader(); tnsEnableShaderv(T->immShader); tnsUniformColorMode(T->immShader,2);
|
|
tnsUseImmShader(); tnsEnableShaderv(T->immShader); tnsUniformColorMode(T->immShader,2);
|
|
tnsUniformOutputColorSpace(T->immShader, 0); tnsUniformColorComposing(T->immShader,0,0,0,0);
|
|
tnsUniformOutputColorSpace(T->immShader, 0); tnsUniformColorComposing(T->immShader,0,0,0,0);
|
|
@@ -1218,7 +1234,6 @@ void our_CanvasDrawOverlayInit(laUiItem* ui){
|
|
void our_CanvasDrawOverlayTexture(laUiItem* ui){
|
|
void our_CanvasDrawOverlayTexture(laUiItem* ui){
|
|
laCanvasExtra *e = ui->Extra; OurCanvasDraw* ocd=e;
|
|
laCanvasExtra *e = ui->Extra; OurCanvasDraw* ocd=e;
|
|
if(Our->PigmentMode){
|
|
if(Our->PigmentMode){
|
|
- tnsBindTexture(e->OffScr->pColor[0]);
|
|
|
|
tnsDraw2DTextureDirectly(e->OffScr->pColor[0], ui->L, ui->U, ui->R - ui->L, ui->B - ui->U);
|
|
tnsDraw2DTextureDirectly(e->OffScr->pColor[0], ui->L, ui->U, ui->R - ui->L, ui->B - ui->U);
|
|
}else{
|
|
}else{
|
|
tnsDraw2DTextureDirectly(e->OffScr->pColor[0], ui->L, ui->U, ui->R - ui->L, ui->B - ui->U);
|
|
tnsDraw2DTextureDirectly(e->OffScr->pColor[0], ui->L, ui->U, ui->R - ui->L, ui->B - ui->U);
|
|
@@ -1269,7 +1284,8 @@ void our_CanvasDrawOverlay(laUiItem* ui,int h){
|
|
for(int i=ui->U+delta;i<ui->B;i+=delta*2){ tnsVertex2d(ui->L,i); tnsVertex2d(ui->R,i); } tnsColor4d(0,0,0,0.5); tnsPackAs(GL_LINES);
|
|
for(int i=ui->U+delta;i<ui->B;i+=delta*2){ tnsVertex2d(ui->L,i); tnsVertex2d(ui->R,i); } tnsColor4d(0,0,0,0.5); tnsPackAs(GL_LINES);
|
|
for(int i=ui->U+delta*2;i<ui->B;i+=delta*2){ tnsVertex2d(ui->L,i); tnsVertex2d(ui->R,i); } tnsColor4d(1,1,1,0.5); tnsPackAs(GL_LINES);
|
|
for(int i=ui->U+delta*2;i<ui->B;i+=delta*2){ tnsVertex2d(ui->L,i); tnsVertex2d(ui->R,i); } tnsColor4d(1,1,1,0.5); tnsPackAs(GL_LINES);
|
|
}
|
|
}
|
|
- char buf[128]; sprintf(buf,"%.1lf%%",100.0f/e->ZoomX);
|
|
|
|
|
|
+ int texscale=Our->PigmentMode?2:1;
|
|
|
|
+ char buf[128]; sprintf(buf,"%.1lf%%",100.0f/e->ZoomX*texscale);
|
|
tnsDrawStringAuto(buf,colork,ui->L+LA_M+1,ui->R-LA_M,ui->B-LA_RH-LA_M+1,0);
|
|
tnsDrawStringAuto(buf,colork,ui->L+LA_M+1,ui->R-LA_M,ui->B-LA_RH-LA_M+1,0);
|
|
tnsDrawStringAuto(buf,colorw,ui->L+LA_M,ui->R-LA_M,ui->B-LA_RH-LA_M,0);
|
|
tnsDrawStringAuto(buf,colorw,ui->L+LA_M,ui->R-LA_M,ui->B-LA_RH-LA_M,0);
|
|
}
|
|
}
|
|
@@ -1565,7 +1581,7 @@ int our_MergeLayer(OurLayer* l){
|
|
if(Our->PigmentMode){
|
|
if(Our->PigmentMode){
|
|
Our->u=&Our->uPigment;
|
|
Our->u=&Our->uPigment;
|
|
}else{
|
|
}else{
|
|
- glUseProgram(Our->CompositionProgram);
|
|
|
|
|
|
+ glUseProgram(Our->AlphaMode?Our->CompositionStraightProgram:Our->CompositionProgram);
|
|
Our->u=&Our->uRGBA;
|
|
Our->u=&Our->uRGBA;
|
|
}
|
|
}
|
|
glUniform1i(OURU->uBlendMode, l->BlendMode);
|
|
glUniform1i(OURU->uBlendMode, l->BlendMode);
|
|
@@ -1834,18 +1850,18 @@ void our_TileTextureToImage(OurTexTile* ot, int SX, int SY, int composite, int B
|
|
tnsBindTexture(ot->Texture); glPixelStorei(GL_PACK_ALIGNMENT, 1);
|
|
tnsBindTexture(ot->Texture); glPixelStorei(GL_PACK_ALIGNMENT, 1);
|
|
tnsGet2DTextureSubImage(ot->Texture, seam, seam, width, width, OUR_CANVAS_GL_FORMAT, OUR_CANVAS_DATA_FORMAT, bufsize, ot->Data);
|
|
tnsGet2DTextureSubImage(ot->Texture, seam, seam, width, width, OUR_CANVAS_GL_FORMAT, OUR_CANVAS_DATA_FORMAT, bufsize, ot->Data);
|
|
OUR_PIX_COMPACT* image_buffer=Our->ImageBuffer;
|
|
OUR_PIX_COMPACT* image_buffer=Our->ImageBuffer;
|
|
|
|
+ our_MixFuncRGBA mixfunc;
|
|
|
|
+ if(Our->AlphaMode){
|
|
|
|
+ if(BlendMode==OUR_BLEND_NORMAL) mixfunc=our_CanvasAlphaOverStraight;
|
|
|
|
+ elif(BlendMode==OUR_BLEND_ADD) mixfunc=our_CanvasAddStraight;
|
|
|
|
+ }else{
|
|
|
|
+ if(BlendMode==OUR_BLEND_NORMAL) mixfunc=our_CanvasAlphaOver;
|
|
|
|
+ elif(BlendMode==OUR_BLEND_ADD) mixfunc=our_CanvasAdd;
|
|
|
|
+ }
|
|
if(composite){
|
|
if(composite){
|
|
for(int row=0;row<OUR_TILE_W_USE;row++){
|
|
for(int row=0;row<OUR_TILE_W_USE;row++){
|
|
for(int col=0;col<OUR_TILE_W_USE;col++){
|
|
for(int col=0;col<OUR_TILE_W_USE;col++){
|
|
- if(BlendMode==OUR_BLEND_NORMAL){
|
|
|
|
- if(Our->AlphaMode){
|
|
|
|
- our_CanvasAlphaOverStraight(&image_buffer[((int64_t)(SY+row)*Our->ImageW+SX+col)*4], &ot->Data[(row*OUR_TILE_W_USE+col)*4],alpha);
|
|
|
|
- }else{
|
|
|
|
- our_CanvasAlphaOver(&image_buffer[((int64_t)(SY+row)*Our->ImageW+SX+col)*4], &ot->Data[(row*OUR_TILE_W_USE+col)*4],alpha);
|
|
|
|
- }
|
|
|
|
- }elif(BlendMode==OUR_BLEND_ADD){
|
|
|
|
- our_CanvasAdd(&image_buffer[((int64_t)(SY+row)*Our->ImageW+SX+col)*4], &ot->Data[(row*OUR_TILE_W_USE+col)*4],alpha);
|
|
|
|
- }
|
|
|
|
|
|
+ mixfunc(&image_buffer[((int64_t)(SY+row)*Our->ImageW+SX+col)*4], &ot->Data[(row*OUR_TILE_W_USE+col)*4],alpha);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}else{
|
|
}else{
|
|
@@ -2551,8 +2567,9 @@ void our_ReadWidgetColor(laCanvasExtra*e,int x,int y){
|
|
glReadBuffer(GL_COLOR_ATTACHMENT0);
|
|
glReadBuffer(GL_COLOR_ATTACHMENT0);
|
|
glPixelStorei(GL_UNPACK_ALIGNMENT, 4);
|
|
glPixelStorei(GL_UNPACK_ALIGNMENT, 4);
|
|
if(Our->PigmentMode){
|
|
if(Our->PigmentMode){
|
|
|
|
+ int texscale=1; if(Our->PigmentDisplayMethod>=2){ texscale=2; }
|
|
u8bit pigment[32]={0}; x/=2;x*=2; y/=2; y*=2;
|
|
u8bit pigment[32]={0}; x/=2;x*=2; y/=2; y*=2;
|
|
- glReadPixels(x*2,y*2,2,2, GL_RGBA_INTEGER, GL_UNSIGNED_SHORT, pigment);
|
|
|
|
|
|
+ glReadPixels(x*texscale,y*texscale,2,2, GL_RGBA_INTEGER, GL_UNSIGNED_SHORT, pigment);
|
|
printf("read:\n");
|
|
printf("read:\n");
|
|
for(int i=0;i<16;i++) { printf("%03d ", pigment[i]); } printf("\n");
|
|
for(int i=0;i<16;i++) { printf("%03d ", pigment[i]); } printf("\n");
|
|
for(int i=16;i<32;i++){ printf("%03d ", pigment[i]); } printf("\n");
|
|
for(int i=16;i<32;i++){ printf("%03d ", pigment[i]); } printf("\n");
|
|
@@ -3843,6 +3860,9 @@ void ourget_PigmentInfo(OurPigmentData* pd,char* buf, char** copy){
|
|
void ourset_AlphaMode(void* unused, int a){
|
|
void ourset_AlphaMode(void* unused, int a){
|
|
Our->AlphaMode=a;
|
|
Our->AlphaMode=a;
|
|
}
|
|
}
|
|
|
|
+void ourset_PigmentDisplayMethod(void* unused, int a){
|
|
|
|
+ Our->PigmentDisplayMethod=a; laNotifyUsers("our.canvas");
|
|
|
|
+}
|
|
|
|
|
|
int ourget_CanvasVersion(void* unused){
|
|
int ourget_CanvasVersion(void* unused){
|
|
return OUR_VERSION_MAJOR*100+OUR_VERSION_MINOR*10+OUR_VERSION_SUB;
|
|
return OUR_VERSION_MAJOR*100+OUR_VERSION_MINOR*10+OUR_VERSION_SUB;
|
|
@@ -4278,6 +4298,11 @@ void ourRegisterEverything(){
|
|
laAddEnumItemAs(p,"TILT","Tilt","Brush direction line follows tilt direction",1,0);
|
|
laAddEnumItemAs(p,"TILT","Tilt","Brush direction line follows tilt direction",1,0);
|
|
laAddEnumItemAs(p,"TWIST","Twist","Brush direction line follows twist direction",2,0);
|
|
laAddEnumItemAs(p,"TWIST","Twist","Brush direction line follows twist direction",2,0);
|
|
laAddEnumItemAs(p,"AUTO","Auto","Brush direction line determines automatically whether to show tilt or twist",3,0);
|
|
laAddEnumItemAs(p,"AUTO","Auto","Brush direction line determines automatically whether to show tilt or twist",3,0);
|
|
|
|
+ p=laAddEnumProperty(pc,"pigment_display_method","Pigment Display Mode","How do display pigment canvas",0,0,0,0,0,offsetof(OurPaint,PigmentDisplayMethod),0,ourset_PigmentDisplayMethod,0,0,0,0,0,0,0,0);
|
|
|
|
+ laAddEnumItemAs(p,"SPEED","Speed","Draw the canvas with half resolution sampling",0,0);
|
|
|
|
+ laAddEnumItemAs(p,"DEBAYER","Debayer","Interpolate channels from pigment canvas to display color at pixel level resolution",1,0);
|
|
|
|
+ laAddEnumItemAs(p,"SHARP","Sharp","Using two times resolution for the view buffer to store converted color information",2,0);
|
|
|
|
+ laAddEnumItemAs(p,"QUALITY","Quality","Using two times resolution for the view buffer and do 4x supersampled debayer average",3,0);
|
|
|
|
|
|
pc=laAddPropertyContainer("our_tools","Our Tools","OurPaint tools",0,0,sizeof(OurPaint),0,0,1);
|
|
pc=laAddPropertyContainer("our_tools","Our Tools","OurPaint tools",0,0,sizeof(OurPaint),0,0,1);
|
|
laPropContainerExtraFunctions(pc,0,0,0,ourpropagate_Tools,0);
|
|
laPropContainerExtraFunctions(pc,0,0,0,ourpropagate_Tools,0);
|
|
@@ -4711,24 +4736,32 @@ int ourInit(){
|
|
|
|
|
|
|
|
|
|
Our->CompositionShader = glCreateShader(GL_COMPUTE_SHADER);
|
|
Our->CompositionShader = glCreateShader(GL_COMPUTE_SHADER);
|
|
|
|
+ Our->CompositionStraightShader = glCreateShader(GL_COMPUTE_SHADER);
|
|
const GLchar* source2 = strSub(OUR_COMPOSITION_SHADER,"#with OUR_SHADER_COMMON",OUR_SHADER_COMMON);
|
|
const GLchar* source2 = strSub(OUR_COMPOSITION_SHADER,"#with OUR_SHADER_COMMON",OUR_SHADER_COMMON);
|
|
- const GLchar* sources2[]={versionstr, source2};
|
|
|
|
- glShaderSource(Our->CompositionShader, 2, sources2, NULL); glCompileShader(Our->CompositionShader);
|
|
|
|
- tnsCheckShaderCompileStatus(Our->CompositionShader,"Canvas");
|
|
|
|
|
|
+ const GLchar* sources2[]= {versionstr, source2};
|
|
|
|
+ const GLchar* sources2a[]={versionstr, "#define OUR_STRAIGHT_ALPHA", source2};
|
|
|
|
+ glShaderSource(Our->CompositionShader, 2, sources2, NULL); glCompileShader(Our->CompositionShader);
|
|
|
|
+ glShaderSource(Our->CompositionStraightShader, 3, sources2a, NULL); glCompileShader(Our->CompositionStraightShader);
|
|
|
|
+ tnsCheckShaderCompileStatus(Our->CompositionShader,"Composition");
|
|
|
|
+ tnsCheckShaderCompileStatus(Our->CompositionStraightShader,"Composition Straight");
|
|
if(source2) free(source2);
|
|
if(source2) free(source2);
|
|
|
|
|
|
- Our->CompositionProgram = glCreateProgram();
|
|
|
|
- glAttachShader(Our->CompositionProgram, Our->CompositionShader); glLinkProgram(Our->CompositionProgram);
|
|
|
|
- tnsCheckProgramLinkStatus(Our->CompositionProgram,"Canvas");
|
|
|
|
|
|
+ Our->CompositionProgram = glCreateProgram();
|
|
|
|
+ Our->CompositionStraightProgram = glCreateProgram();
|
|
|
|
+ glAttachShader(Our->CompositionProgram, Our->CompositionShader); glLinkProgram(Our->CompositionProgram);
|
|
|
|
+ glAttachShader(Our->CompositionStraightProgram, Our->CompositionStraightShader); glLinkProgram(Our->CompositionStraightProgram);
|
|
|
|
+ tnsCheckProgramLinkStatus(Our->CompositionProgram,"Composition");
|
|
|
|
+ tnsCheckProgramLinkStatus(Our->CompositionStraightProgram,"Composition Straight");
|
|
|
|
|
|
- Our->PigmentCompositionShader = glCreateShader(GL_FRAGMENT_SHADER);
|
|
|
|
|
|
+ Our->PigmentLayeringShader = glCreateShader(GL_FRAGMENT_SHADER);
|
|
const GLchar* source3 = strSub(OUR_PIGMENT_TEXTURE_MIX_SHADER,"#with OUR_PIGMENT_COMMON",OUR_PIGMENT_COMMON);
|
|
const GLchar* source3 = strSub(OUR_PIGMENT_TEXTURE_MIX_SHADER,"#with OUR_PIGMENT_COMMON",OUR_PIGMENT_COMMON);
|
|
const GLchar* sources3[]={versionstr, source3};
|
|
const GLchar* sources3[]={versionstr, source3};
|
|
- glShaderSource(Our->PigmentCompositionShader, 2, sources3, NULL); glCompileShader(Our->PigmentCompositionShader);
|
|
|
|
- if(!tnsCheckShaderCompileStatus(Our->PigmentCompositionShader,"Pigment Composition")) exit(0);
|
|
|
|
|
|
+ glShaderSource(Our->PigmentLayeringShader, 2, sources3, NULL); glCompileShader(Our->PigmentLayeringShader);
|
|
|
|
+ if(!tnsCheckShaderCompileStatus(Our->PigmentLayeringShader,"Pigment Layering")) exit(0);
|
|
if(source3){free(source3);}
|
|
if(source3){free(source3);}
|
|
|
|
|
|
- Our->PigmentCompositionProgramT = tnsNewShaderProgram(T->immShader->vtShaderID,Our->PigmentCompositionShader,-1);
|
|
|
|
|
|
+ Our->PigmentLayeringProgramT = tnsNewShaderProgram(T->immShader->vtShaderID,Our->PigmentLayeringShader,-1);
|
|
|
|
+
|
|
|
|
|
|
Our->PigmentDisplayShader = glCreateShader(GL_FRAGMENT_SHADER);
|
|
Our->PigmentDisplayShader = glCreateShader(GL_FRAGMENT_SHADER);
|
|
const GLchar* source4 = strSub(OUR_PIGMENT_TEXTURE_DISPLAY_SHADER,"#with OUR_PIGMENT_COMMON",OUR_PIGMENT_COMMON);
|
|
const GLchar* source4 = strSub(OUR_PIGMENT_TEXTURE_DISPLAY_SHADER,"#with OUR_PIGMENT_COMMON",OUR_PIGMENT_COMMON);
|
|
@@ -4741,7 +4774,9 @@ int ourInit(){
|
|
int pid=Our->PigmentDisplayProgramT->glProgramID;
|
|
int pid=Our->PigmentDisplayProgramT->glProgramID;
|
|
Our->uboCanvasPigmentLocation=glGetUniformBlockIndex(pid, "CanvasPigmentBlock");
|
|
Our->uboCanvasPigmentLocation=glGetUniformBlockIndex(pid, "CanvasPigmentBlock");
|
|
glUniformBlockBinding(pid, Our->uboCanvasPigmentLocation, 0);
|
|
glUniformBlockBinding(pid, Our->uboCanvasPigmentLocation, 0);
|
|
- Our->uPigmentDisplaySize=glGetUniformLocation(pid, "display_size");
|
|
|
|
|
|
+ Our->uPigmentTextureScale=glGetUniformLocation(pid, "texture_scale");
|
|
|
|
+ Our->uPigmentDisplayMode=glGetUniformLocation(pid, "display_mode");
|
|
|
|
+ Our->uPigmentFragOffset=glGetUniformLocation(pid, "frag_offset");
|
|
|
|
|
|
glGenBuffers(1, &Our->uboBrushPigment);
|
|
glGenBuffers(1, &Our->uboBrushPigment);
|
|
glGenBuffers(1, &Our->uboCanvasPigment);
|
|
glGenBuffers(1, &Our->uboCanvasPigment);
|
|
@@ -4757,7 +4792,7 @@ int ourInit(){
|
|
Our->u = &Our->uRGBStraightA;
|
|
Our->u = &Our->uRGBStraightA;
|
|
ourGetUniforms(Our->CanvasStraightProgram,Our->CompositionProgram);
|
|
ourGetUniforms(Our->CanvasStraightProgram,Our->CompositionProgram);
|
|
Our->u = &Our->uPigment;
|
|
Our->u = &Our->uPigment;
|
|
- ourGetUniforms(Our->CanvasPigmentProgram,Our->PigmentCompositionProgramT->glProgramID); // XXXXX (?)
|
|
|
|
|
|
+ ourGetUniforms(Our->CanvasPigmentProgram,Our->PigmentLayeringProgramT->glProgramID); // XXXXX (?)
|
|
|
|
|
|
Our->X=-2800/2; Our->W=2800;
|
|
Our->X=-2800/2; Our->W=2800;
|
|
Our->Y=2400/2; Our->H=2400;
|
|
Our->Y=2400/2; Our->H=2400;
|