Orange: ImageWindow goodies
- options to show with alpha-over (checkered backdrop), only alpha (BW) and when available: the zbuffer. Note: it's icons in the header, I just re-used existing ones, no time now for fancy design. :) Also: recoded the way alpha-only draws, also in renderwindow. Mucho faster! Oh, and sampling the buffer with LMB now displays z values in float range of 0.0 to 1.0. Note that we still save signed int in files for Z...
This commit is contained in:
@@ -312,6 +312,9 @@
|
|||||||
#define B_SIMANOTHING 368
|
#define B_SIMANOTHING 368
|
||||||
#define B_SIMACURVES 369
|
#define B_SIMACURVES 369
|
||||||
#define B_SIMARANGE 370
|
#define B_SIMARANGE 370
|
||||||
|
#define B_SIMA_USE_ALPHA 371
|
||||||
|
#define B_SIMA_SHOW_ALPHA 372
|
||||||
|
#define B_SIMA_SHOW_ZBUF 373
|
||||||
|
|
||||||
/* BUTS: 400 */
|
/* BUTS: 400 */
|
||||||
#define B_BUTSHOME 401
|
#define B_BUTSHOME 401
|
||||||
|
|||||||
@@ -467,6 +467,9 @@ typedef struct SpaceImaSel {
|
|||||||
#define SI_PIXELSNAP 1024
|
#define SI_PIXELSNAP 1024
|
||||||
#define SI_LSCM_LIVE 2048
|
#define SI_LSCM_LIVE 2048
|
||||||
#define SI_USE_ALPHA 4096
|
#define SI_USE_ALPHA 4096
|
||||||
|
#define SI_SHOW_ALPHA 8192
|
||||||
|
#define SI_SHOW_ZBUF 16384
|
||||||
|
|
||||||
|
|
||||||
/* SpaceText flags (moved from DNA_text_types.h) */
|
/* SpaceText flags (moved from DNA_text_types.h) */
|
||||||
|
|
||||||
|
|||||||
@@ -1099,6 +1099,38 @@ static void sima_draw_alpha_backdrop(SpaceImage *sima, float x1, float y1, float
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void sima_draw_alpha_pixels(float x1, float y1, int rectx, int recty, unsigned int *recti)
|
||||||
|
{
|
||||||
|
char *rect= (char *)recti;
|
||||||
|
|
||||||
|
/* swap bytes, so alpha is most significant one, then just draw it as luminance int */
|
||||||
|
glPixelStorei(GL_UNPACK_SWAP_BYTES, 1);
|
||||||
|
glaDrawPixelsSafe(x1, y1, rectx, recty, GL_UNSIGNED_INT, recti);
|
||||||
|
glPixelStorei(GL_UNPACK_SWAP_BYTES, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void sima_draw_zbuf_pixels(float x1, float y1, int rectx, int recty, int *recti)
|
||||||
|
{
|
||||||
|
if(recti==NULL)
|
||||||
|
return;
|
||||||
|
|
||||||
|
/* zbuffer values are signed, so we need to shift color range */
|
||||||
|
glPixelTransferf(GL_RED_SCALE, 0.5f);
|
||||||
|
glPixelTransferf(GL_GREEN_SCALE, 0.5f);
|
||||||
|
glPixelTransferf(GL_BLUE_SCALE, 0.5f);
|
||||||
|
glPixelTransferf(GL_RED_BIAS, 0.5f);
|
||||||
|
glPixelTransferf(GL_GREEN_BIAS, 0.5f);
|
||||||
|
glPixelTransferf(GL_BLUE_BIAS, 0.5f);
|
||||||
|
|
||||||
|
glaDrawPixelsSafe(x1, y1, rectx, recty, GL_INT, recti);
|
||||||
|
|
||||||
|
glPixelTransferf(GL_RED_SCALE, 1.0f);
|
||||||
|
glPixelTransferf(GL_GREEN_SCALE, 1.0f);
|
||||||
|
glPixelTransferf(GL_BLUE_SCALE, 1.0f);
|
||||||
|
glPixelTransferf(GL_RED_BIAS, 0.0f);
|
||||||
|
glPixelTransferf(GL_GREEN_BIAS, 0.0f);
|
||||||
|
glPixelTransferf(GL_BLUE_BIAS, 0.0f);
|
||||||
|
}
|
||||||
|
|
||||||
void drawimagespace(ScrArea *sa, void *spacedata)
|
void drawimagespace(ScrArea *sa, void *spacedata)
|
||||||
{
|
{
|
||||||
@@ -1128,8 +1160,9 @@ void drawimagespace(ScrArea *sa, void *spacedata)
|
|||||||
what_image(sima);
|
what_image(sima);
|
||||||
|
|
||||||
if(sima->image) {
|
if(sima->image) {
|
||||||
if(sima->image->ibuf==0) {
|
if(sima->image->ibuf==NULL) {
|
||||||
load_image(sima->image, IB_rect, G.sce, G.scene->r.cfra);
|
load_image(sima->image, IB_rect, G.sce, G.scene->r.cfra);
|
||||||
|
scrarea_queue_headredraw(sa); /* update header for image options */
|
||||||
}
|
}
|
||||||
tag_image_time(sima->image);
|
tag_image_time(sima->image);
|
||||||
ibuf= sima->image->ibuf;
|
ibuf= sima->image->ibuf;
|
||||||
@@ -1208,14 +1241,22 @@ void drawimagespace(ScrArea *sa, void *spacedata)
|
|||||||
MEM_freeN(rect);
|
MEM_freeN(rect);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
if(sima->flag & SI_USE_ALPHA) {
|
if(sima->flag & SI_SHOW_ALPHA) {
|
||||||
sima_draw_alpha_backdrop(sima, x1, y1, (float)ibuf->x, (float)ibuf->y);
|
sima_draw_alpha_pixels(x1, y1, ibuf->x, ibuf->y, ibuf->rect);
|
||||||
glEnable(GL_BLEND);
|
|
||||||
}
|
}
|
||||||
glaDrawPixelsSafe(x1, y1, ibuf->x, ibuf->y, GL_UNSIGNED_BYTE, ibuf->rect);
|
else if(sima->flag & SI_SHOW_ZBUF) {
|
||||||
|
sima_draw_zbuf_pixels(x1, y1, ibuf->x, ibuf->y, ibuf->zbuf);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if(sima->flag & SI_USE_ALPHA) {
|
||||||
|
sima_draw_alpha_backdrop(sima, x1, y1, (float)ibuf->x, (float)ibuf->y);
|
||||||
|
glEnable(GL_BLEND);
|
||||||
|
}
|
||||||
|
glaDrawPixelsSafe(x1, y1, ibuf->x, ibuf->y, GL_UNSIGNED_BYTE, ibuf->rect);
|
||||||
|
|
||||||
if(sima->flag & SI_USE_ALPHA)
|
if(sima->flag & SI_USE_ALPHA)
|
||||||
glDisable(GL_BLEND);
|
glDisable(GL_BLEND);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(Gip.current == IMAGEPAINT_CLONE) {
|
if(Gip.current == IMAGEPAINT_CLONE) {
|
||||||
|
|||||||
@@ -1398,7 +1398,7 @@ int minmax_tface_uv(float *min, float *max)
|
|||||||
return sel;
|
return sel;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void sima_show_info(int x, int y, char *cp, float *fp, unsigned int *zp)
|
static void sima_show_info(int x, int y, char *cp, float *fp, int *zp)
|
||||||
{
|
{
|
||||||
short ofs;
|
short ofs;
|
||||||
char str[256];
|
char str[256];
|
||||||
@@ -1409,7 +1409,7 @@ static void sima_show_info(int x, int y, char *cp, float *fp, unsigned int *zp)
|
|||||||
if(fp)
|
if(fp)
|
||||||
ofs+= sprintf(str+ofs, "| R: %.3f G: %.3f B: %.3f A: %.3f ", fp[0], fp[1], fp[2], fp[3]);
|
ofs+= sprintf(str+ofs, "| R: %.3f G: %.3f B: %.3f A: %.3f ", fp[0], fp[1], fp[2], fp[3]);
|
||||||
if(zp)
|
if(zp)
|
||||||
ofs+= sprintf(str+ofs, "| Z: %x ", *zp);
|
ofs+= sprintf(str+ofs, "| Z: %.4f ", 0.5+0.5*( ((float)*zp)/(float)0x7fffffff));
|
||||||
|
|
||||||
glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
|
glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
|
||||||
glEnable(GL_BLEND);
|
glEnable(GL_BLEND);
|
||||||
@@ -1447,7 +1447,7 @@ void sima_sample_color(void)
|
|||||||
|
|
||||||
if(fx>=0.0 && fy>=0.0 && fx<1.0 && fy<1.0) {
|
if(fx>=0.0 && fy>=0.0 && fx<1.0 && fy<1.0) {
|
||||||
float *fp= NULL;
|
float *fp= NULL;
|
||||||
unsigned int *zp= NULL;
|
int *zp= NULL;
|
||||||
char *cp= NULL;
|
char *cp= NULL;
|
||||||
|
|
||||||
int x= (int) (fx*ibuf->x);
|
int x= (int) (fx*ibuf->x);
|
||||||
|
|||||||
@@ -343,6 +343,10 @@ void glaDrawPixelsSafe(float x, float y, int img_w, int img_h, int format, void
|
|||||||
float *f_rect= (float *)rect;
|
float *f_rect= (float *)rect;
|
||||||
glDrawPixels(draw_w, draw_h, GL_RGBA, GL_FLOAT, f_rect + (off_y*img_w + off_x)*4);
|
glDrawPixels(draw_w, draw_h, GL_RGBA, GL_FLOAT, f_rect + (off_y*img_w + off_x)*4);
|
||||||
}
|
}
|
||||||
|
else if(format==GL_INT || format==GL_UNSIGNED_INT) {
|
||||||
|
int *i_rect= (int *)rect;
|
||||||
|
glDrawPixels(draw_w, draw_h, GL_LUMINANCE, format, i_rect + (off_y*img_w + off_x));
|
||||||
|
}
|
||||||
else {
|
else {
|
||||||
unsigned char *uc_rect= (unsigned char *) rect;
|
unsigned char *uc_rect= (unsigned char *) rect;
|
||||||
glDrawPixels(draw_w, draw_h, GL_RGBA, GL_UNSIGNED_BYTE, uc_rect + (off_y*img_w + off_x)*4);
|
glDrawPixels(draw_w, draw_h, GL_RGBA, GL_UNSIGNED_BYTE, uc_rect + (off_y*img_w + off_x)*4);
|
||||||
|
|||||||
@@ -332,6 +332,21 @@ void do_image_buttons(unsigned short event)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case B_SIMA_USE_ALPHA:
|
||||||
|
G.sima->flag &= ~(SI_SHOW_ALPHA|SI_SHOW_ZBUF);
|
||||||
|
scrarea_queue_winredraw(curarea);
|
||||||
|
scrarea_queue_headredraw(curarea);
|
||||||
|
break;
|
||||||
|
case B_SIMA_SHOW_ALPHA:
|
||||||
|
G.sima->flag &= ~(SI_USE_ALPHA|SI_SHOW_ZBUF);
|
||||||
|
scrarea_queue_winredraw(curarea);
|
||||||
|
scrarea_queue_headredraw(curarea);
|
||||||
|
break;
|
||||||
|
case B_SIMA_SHOW_ZBUF:
|
||||||
|
G.sima->flag &= ~(SI_SHOW_ALPHA|SI_USE_ALPHA);
|
||||||
|
scrarea_queue_winredraw(curarea);
|
||||||
|
scrarea_queue_headredraw(curarea);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1166,8 +1181,19 @@ void image_buttons(void)
|
|||||||
uiDefIconButBitS(block, TOG, SI_DRAWTOOL, B_SIMAGEPAINTTOOL, ICON_TPAINT_HLT, xco,0,XIC,YIC, &G.sima->flag, 0, 0, 0, 0, "Enables painting textures on the image with left mouse button");
|
uiDefIconButBitS(block, TOG, SI_DRAWTOOL, B_SIMAGEPAINTTOOL, ICON_TPAINT_HLT, xco,0,XIC,YIC, &G.sima->flag, 0, 0, 0, 0, "Enables painting textures on the image with left mouse button");
|
||||||
xco+= XIC+8;
|
xco+= XIC+8;
|
||||||
|
|
||||||
uiDefIconButBitS(block, TOG, SI_USE_ALPHA, B_REDR, ICON_TRANSP_HLT, xco,0,XIC,YIC, &G.sima->flag, 0, 0, 0, 0, "Draws image with alpha");
|
uiBlockBeginAlign(block);
|
||||||
xco+= XIC+8;
|
uiDefIconButBitS(block, TOG, SI_USE_ALPHA, B_SIMA_USE_ALPHA, ICON_TRANSP_HLT, xco,0,XIC,YIC, &G.sima->flag, 0, 0, 0, 0, "Draws image with alpha");
|
||||||
|
xco+= XIC;
|
||||||
|
uiDefIconButBitS(block, TOG, SI_SHOW_ALPHA, B_SIMA_SHOW_ALPHA, ICON_DOT, xco,0,XIC,YIC, &G.sima->flag, 0, 0, 0, 0, "Draws only alpha");
|
||||||
|
xco+= XIC;
|
||||||
|
if(G.sima->image->ibuf && G.sima->image->ibuf->zbuf) {
|
||||||
|
uiDefIconButBitS(block, TOG, SI_SHOW_ZBUF, B_SIMA_SHOW_ZBUF, ICON_SOLID, xco,0,XIC,YIC, &G.sima->flag, 0, 0, 0, 0, "Draws zbuffer values");
|
||||||
|
xco+= XIC;
|
||||||
|
}
|
||||||
|
else G.sima->flag &= ~SI_SHOW_ZBUF; /* no confusing display for non-zbuf images */
|
||||||
|
|
||||||
|
uiBlockEndAlign(block);
|
||||||
|
xco+= 8;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* draw LOCK */
|
/* draw LOCK */
|
||||||
|
|||||||
@@ -326,16 +326,10 @@ static void renderwin_draw(RenderWin *rw, int just_clear)
|
|||||||
} else {
|
} else {
|
||||||
glPixelZoom(rw->zoom, rw->zoom);
|
glPixelZoom(rw->zoom, rw->zoom);
|
||||||
if(rw->flags & RW_FLAGS_ALPHA) {
|
if(rw->flags & RW_FLAGS_ALPHA) {
|
||||||
char *rect= (char *)R.rectot;
|
/* swap bytes, so alpha is most significant one, then just draw it as luminance int */
|
||||||
|
glPixelStorei(GL_UNPACK_SWAP_BYTES, 1);
|
||||||
glColorMask(1, 0, 0, 0);
|
glaDrawPixelsSafe(disprect[0][0], disprect[0][1], R.rectx, R.recty, GL_UNSIGNED_INT, R.rectot);
|
||||||
glaDrawPixelsSafe(disprect[0][0], disprect[0][1], R.rectx, R.recty, GL_UNSIGNED_BYTE, rect+3);
|
glPixelStorei(GL_UNPACK_SWAP_BYTES, 0);
|
||||||
glColorMask(0, 1, 0, 0);
|
|
||||||
glaDrawPixelsSafe(disprect[0][0], disprect[0][1], R.rectx, R.recty, GL_UNSIGNED_BYTE, rect+2);
|
|
||||||
glColorMask(0, 0, 1, 0);
|
|
||||||
glaDrawPixelsSafe(disprect[0][0], disprect[0][1], R.rectx, R.recty, GL_UNSIGNED_BYTE, rect+1);
|
|
||||||
glColorMask(1, 1, 1, 1);
|
|
||||||
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
glaDrawPixelsSafe(disprect[0][0], disprect[0][1], R.rectx, R.recty, GL_UNSIGNED_BYTE, R.rectot);
|
glaDrawPixelsSafe(disprect[0][0], disprect[0][1], R.rectx, R.recty, GL_UNSIGNED_BYTE, R.rectot);
|
||||||
|
|||||||
Reference in New Issue
Block a user