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); | 				} | ||||||
|  | 				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) | ||||||
|  | 						glDisable(GL_BLEND); | ||||||
| 				} | 				} | ||||||
| 				glaDrawPixelsSafe(x1, y1, ibuf->x, ibuf->y, GL_UNSIGNED_BYTE, ibuf->rect); |  | ||||||
| 				 |  | ||||||
| 				if(sima->flag & SI_USE_ALPHA) |  | ||||||
| 					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