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_SIMACURVES		369 | ||||
| #define B_SIMARANGE			370 | ||||
| #define B_SIMA_USE_ALPHA	371 | ||||
| #define B_SIMA_SHOW_ALPHA	372 | ||||
| #define B_SIMA_SHOW_ZBUF	373 | ||||
|  | ||||
| /* BUTS: 400 */ | ||||
| #define B_BUTSHOME		401 | ||||
|   | ||||
| @@ -467,6 +467,9 @@ typedef struct SpaceImaSel { | ||||
| #define SI_PIXELSNAP	1024 | ||||
| #define SI_LSCM_LIVE	2048 | ||||
| #define SI_USE_ALPHA	4096 | ||||
| #define SI_SHOW_ALPHA	8192 | ||||
| #define SI_SHOW_ZBUF	16384 | ||||
|  | ||||
|  | ||||
| /* 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) | ||||
| { | ||||
| @@ -1128,8 +1160,9 @@ void drawimagespace(ScrArea *sa, void *spacedata) | ||||
| 	what_image(sima); | ||||
| 	 | ||||
| 	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); | ||||
| 			scrarea_queue_headredraw(sa);	/* update header for image options */ | ||||
| 		}	 | ||||
| 		tag_image_time(sima->image); | ||||
| 		ibuf= sima->image->ibuf; | ||||
| @@ -1208,14 +1241,22 @@ void drawimagespace(ScrArea *sa, void *spacedata) | ||||
| 				MEM_freeN(rect); | ||||
| 			} | ||||
| 			else { | ||||
| 				if(sima->flag & SI_USE_ALPHA) { | ||||
| 					sima_draw_alpha_backdrop(sima, x1, y1, (float)ibuf->x, (float)ibuf->y); | ||||
| 					glEnable(GL_BLEND); | ||||
| 				if(sima->flag & SI_SHOW_ALPHA) { | ||||
| 					sima_draw_alpha_pixels(x1, y1, ibuf->x, ibuf->y, 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) | ||||
| 						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) { | ||||
|   | ||||
| @@ -1398,7 +1398,7 @@ int minmax_tface_uv(float *min, float *max) | ||||
| 	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; | ||||
| 	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) | ||||
| 		ofs+= sprintf(str+ofs, "| R: %.3f G: %.3f B: %.3f A: %.3f ", fp[0], fp[1], fp[2], fp[3]); | ||||
| 	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); | ||||
| 	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) { | ||||
| 				float *fp= NULL; | ||||
| 				unsigned int *zp= NULL; | ||||
| 				int *zp= NULL; | ||||
| 				char *cp= NULL; | ||||
| 				 | ||||
| 				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; | ||||
| 			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 { | ||||
| 			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); | ||||
|   | ||||
| @@ -332,6 +332,21 @@ void do_image_buttons(unsigned short event) | ||||
| 			} | ||||
| 		} | ||||
| 		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"); | ||||
| 		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"); | ||||
| 		xco+= XIC+8; | ||||
| 		uiBlockBeginAlign(block); | ||||
| 		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 */ | ||||
|   | ||||
| @@ -326,16 +326,10 @@ static void renderwin_draw(RenderWin *rw, int just_clear) | ||||
| 	} else { | ||||
| 		glPixelZoom(rw->zoom, rw->zoom); | ||||
| 		if(rw->flags & RW_FLAGS_ALPHA) { | ||||
| 			char *rect= (char *)R.rectot; | ||||
| 			 | ||||
| 			glColorMask(1, 0, 0, 0); | ||||
| 			glaDrawPixelsSafe(disprect[0][0], disprect[0][1], R.rectx, R.recty, GL_UNSIGNED_BYTE, rect+3); | ||||
| 			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); | ||||
| 			 | ||||
| 			/* swap bytes, so alpha is most significant one, then just draw it as luminance int */ | ||||
| 			glPixelStorei(GL_UNPACK_SWAP_BYTES, 1); | ||||
| 			glaDrawPixelsSafe(disprect[0][0], disprect[0][1], R.rectx, R.recty, GL_UNSIGNED_INT, R.rectot); | ||||
| 			glPixelStorei(GL_UNPACK_SWAP_BYTES, 0); | ||||
| 		} | ||||
| 		else { | ||||
| 			glaDrawPixelsSafe(disprect[0][0], disprect[0][1], R.rectx, R.recty, GL_UNSIGNED_BYTE, R.rectot); | ||||
|   | ||||
		Reference in New Issue
	
	Block a user