[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [26128] trunk/blender/source/blender: Durian request: Added 'Color Balance' node to compositor.

Matt Ebb matt at mke3.net
Wed Jan 20 05:19:57 CET 2010


Revision: 26128
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=26128
Author:   broken
Date:     2010-01-20 05:19:55 +0100 (Wed, 20 Jan 2010)

Log Message:
-----------
Durian request: Added 'Color Balance' node to compositor. uses Lift/Gamma/Gain 
similar to sequence editor.

--> http://mke3.net/blender/devel/2.5/color_balance_node.jpg

Also added 0 key (zero key) shortcut when mouse is over a button, to reset it to its default value.
Same as the RMB menu ->Reset to Default, except for color wheels, it only resets the hue/sat/value
components that that widget affects.

Peter/Xavier: The existing color balance code can generate NaNs (fractional power of a negative),
which causes havoc along the image pipeline. I added a check in the node code to prevent this.

Still plenty of potential for lots of better colour correction tools in the compositor, just needs time...

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/BKE_node.h
    trunk/blender/source/blender/blenkernel/intern/node.c
    trunk/blender/source/blender/blenlib/BLI_math_color.h
    trunk/blender/source/blender/blenlib/intern/math_color.c
    trunk/blender/source/blender/editors/interface/interface.c
    trunk/blender/source/blender/editors/interface/interface_handlers.c
    trunk/blender/source/blender/editors/interface/interface_intern.h
    trunk/blender/source/blender/editors/space_image/space_image.c
    trunk/blender/source/blender/editors/space_node/drawnode.c
    trunk/blender/source/blender/makesdna/DNA_node_types.h
    trunk/blender/source/blender/makesrna/intern/rna_nodetree.c
    trunk/blender/source/blender/makesrna/intern/rna_nodetree_types.h
    trunk/blender/source/blender/nodes/CMP_node.h
    trunk/blender/source/blender/nodes/intern/node_util.h

Modified: trunk/blender/source/blender/blenkernel/BKE_node.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_node.h	2010-01-20 03:46:28 UTC (rev 26127)
+++ trunk/blender/source/blender/blenkernel/BKE_node.h	2010-01-20 04:19:55 UTC (rev 26128)
@@ -354,6 +354,7 @@
 #define CMP_NODE_DIST_MATTE	257
 #define CMP_NODE_VIEW_LEVELS    258
 #define CMP_NODE_COLOR_MATTE 259
+#define CMP_NODE_COLORBALANCE 260
 
 #define CMP_NODE_GLARE		301
 #define CMP_NODE_TONEMAP	302

Modified: trunk/blender/source/blender/blenkernel/intern/node.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/node.c	2010-01-20 03:46:28 UTC (rev 26127)
+++ trunk/blender/source/blender/blenkernel/intern/node.c	2010-01-20 04:19:55 UTC (rev 26128)
@@ -2983,6 +2983,7 @@
 	nodeRegisterType(ntypelist, &cmp_node_invert);
 	nodeRegisterType(ntypelist, &cmp_node_alphaover);
 	nodeRegisterType(ntypelist, &cmp_node_zcombine);
+	nodeRegisterType(ntypelist, &cmp_node_colorbalance);
 	
 	nodeRegisterType(ntypelist, &cmp_node_normal);
 	nodeRegisterType(ntypelist, &cmp_node_curve_vec);

Modified: trunk/blender/source/blender/blenlib/BLI_math_color.h
===================================================================
--- trunk/blender/source/blender/blenlib/BLI_math_color.h	2010-01-20 03:46:28 UTC (rev 26127)
+++ trunk/blender/source/blender/blenlib/BLI_math_color.h	2010-01-20 04:19:55 UTC (rev 26128)
@@ -73,7 +73,11 @@
 
 int constrain_rgb(float *r, float *g, float *b);
 void minmax_rgb(short c[3]);
+	
+/***************** lift/gamma/gain / ASC-CDL conversion *****************/
 
+void lift_gamma_gain_to_asc_cdl(float *lift, float *gamma, float *gain, float *offset, float *slope, float *power);
+
 void rgb_byte_to_float(char *in, float *out);
 void rgb_float_to_byte(float *in, char *out);
 

Modified: trunk/blender/source/blender/blenlib/intern/math_color.c
===================================================================
--- trunk/blender/source/blender/blenlib/intern/math_color.c	2010-01-20 03:46:28 UTC (rev 26127)
+++ trunk/blender/source/blender/blenlib/intern/math_color.c	2010-01-20 04:19:55 UTC (rev 26128)
@@ -386,3 +386,17 @@
     return 0;                         /* Color within RGB gamut */
 }
 
+/* ********************************* lift/gamma/gain / ASC-CDL conversion ********************************* */
+
+void lift_gamma_gain_to_asc_cdl(float *lift, float *gamma, float *gain, float *offset, float *slope, float *power)
+{
+	int c;
+	for(c=0; c<3; c++) {
+		offset[c]= lift[c]*gain[c];
+		slope[c]=  gain[c]*(1.0f-lift[c]);
+		if(gamma[c] == 0)
+			power[c]= FLT_MAX;
+		else
+			power[c]= 1.0f/gamma[c];
+	}
+}

Modified: trunk/blender/source/blender/editors/interface/interface.c
===================================================================
--- trunk/blender/source/blender/editors/interface/interface.c	2010-01-20 03:46:28 UTC (rev 26127)
+++ trunk/blender/source/blender/editors/interface/interface.c	2010-01-20 04:19:55 UTC (rev 26128)
@@ -1626,6 +1626,17 @@
 	return 0;
 }
 
+void ui_set_but_default(bContext *C, uiBut *but)
+{
+	/* if there is a valid property that is editable... */
+	if (but->rnapoin.data && but->rnaprop && RNA_property_editable(&but->rnapoin, but->rnaprop)) {
+		if(RNA_property_reset(&but->rnapoin, but->rnaprop, -1)) {
+			/* perform updates required for this property */
+			RNA_property_update(C, &but->rnapoin, but->rnaprop);
+		}
+	}
+}
+
 static double soft_range_round_up(double value, double max)
 {
 	/* round up to .., 0.1, 0.2, 0.5, 1, 2, 5, 10, 20, 50, .. */

Modified: trunk/blender/source/blender/editors/interface/interface_handlers.c
===================================================================
--- trunk/blender/source/blender/editors/interface/interface_handlers.c	2010-01-20 03:46:28 UTC (rev 26127)
+++ trunk/blender/source/blender/editors/interface/interface_handlers.c	2010-01-20 04:19:55 UTC (rev 26128)
@@ -2781,6 +2781,34 @@
 			
 			return WM_UI_HANDLER_BREAK;
 		}
+		else if (event->type == ZEROKEY && event->val == KM_PRESS) {
+			if (but->a1==9){
+				float rgb[3], hsv[3], def_hsv[3];
+				float *def;
+				int len;
+				
+				/* reset only value */
+				
+				len= RNA_property_array_length(&but->rnapoin, but->rnaprop);
+				if (len >= 3) {
+					def= MEM_callocN(sizeof(float)*len, "reset_defaults - float");
+					
+					RNA_property_float_get_default_array(&but->rnapoin, but->rnaprop, def);
+					rgb_to_hsv(def[0], def[1], def[2], def_hsv, def_hsv+1, def_hsv+2);
+					
+					ui_get_but_vectorf(but, rgb);
+					rgb_to_hsv(rgb[0], rgb[1], rgb[2], hsv, hsv+1, hsv+2);
+					
+					hsv_to_rgb(hsv[0], hsv[1], def_hsv[2], rgb, rgb+1, rgb+2);
+					ui_set_but_vectorf(but, rgb);
+					
+					RNA_property_update(C, &but->rnapoin, but->rnaprop);
+					
+					MEM_freeN(def);
+				}
+				return WM_UI_HANDLER_BREAK;
+			}
+		}
 	}
 	else if(data->state == BUTTON_STATE_NUM_EDITING) {
 		if(event->type == ESCKEY) {
@@ -2849,6 +2877,32 @@
 			
 			return WM_UI_HANDLER_BREAK;
 		}
+		else if (event->type == ZEROKEY && event->val == KM_PRESS) {
+			float rgb[3], hsv[3], def_hsv[3];
+			float *def;
+			int len;
+			
+			/* reset only saturation */
+			
+			len= RNA_property_array_length(&but->rnapoin, but->rnaprop);
+			if (len >= 3) {
+				def= MEM_callocN(sizeof(float)*len, "reset_defaults - float");
+				
+				RNA_property_float_get_default_array(&but->rnapoin, but->rnaprop, def);
+				rgb_to_hsv(def[0], def[1], def[2], def_hsv, def_hsv+1, def_hsv+2);
+				
+				ui_get_but_vectorf(but, rgb);
+				rgb_to_hsv(rgb[0], rgb[1], rgb[2], hsv, hsv+1, hsv+2);
+				
+				hsv_to_rgb(hsv[0], def_hsv[1], hsv[2], rgb, rgb+1, rgb+2);
+				ui_set_but_vectorf(but, rgb);
+				
+				RNA_property_update(C, &but->rnapoin, but->rnaprop);
+				
+				MEM_freeN(def);
+			}
+			return WM_UI_HANDLER_BREAK;
+		}
 	}
 	else if(data->state == BUTTON_STATE_NUM_EDITING) {
 		if(event->type == ESCKEY) {
@@ -3724,6 +3778,11 @@
 			
 			return WM_UI_HANDLER_BREAK;
 		}
+		/* reset to default */
+		else if(event->type == ZEROKEY && event->val == KM_PRESS) {
+			if (!(ELEM(but->type, HSVCIRCLE, HSVCUBE)))
+				ui_set_but_default(C, but);
+		}
 		/* handle menu */
 		else if(event->type == RIGHTMOUSE && event->val == KM_PRESS) {
 			/* RMB has two options now */

Modified: trunk/blender/source/blender/editors/interface/interface_intern.h
===================================================================
--- trunk/blender/source/blender/editors/interface/interface_intern.h	2010-01-20 03:46:28 UTC (rev 26127)
+++ trunk/blender/source/blender/editors/interface/interface_intern.h	2010-01-20 04:19:55 UTC (rev 26128)
@@ -345,6 +345,8 @@
 extern int ui_set_but_string(struct bContext *C, uiBut *but, const char *str);
 extern int ui_get_but_string_max_length(uiBut *but);
 
+extern void ui_set_but_default(struct bContext *C, uiBut *but);
+
 extern void ui_set_but_soft_range(uiBut *but, double value);
 
 extern void ui_check_but(uiBut *but);

Modified: trunk/blender/source/blender/editors/space_image/space_image.c
===================================================================
--- trunk/blender/source/blender/editors/space_image/space_image.c	2010-01-20 03:46:28 UTC (rev 26127)
+++ trunk/blender/source/blender/editors/space_image/space_image.c	2010-01-20 04:19:55 UTC (rev 26128)
@@ -75,7 +75,229 @@
 
 #include "image_intern.h"
 
+/**************************** common state *****************************/
 
+/* note; image_panel_properties() uses pointer to sima->image directly */
+Image *ED_space_image(SpaceImage *sima)
+{
+	return sima->image;
+}
+
+/* called to assign images to UV faces */
+void ED_space_image_set(bContext *C, SpaceImage *sima, Scene *scene, Object *obedit, Image *ima)
+{
+	ED_uvedit_assign_image(scene, obedit, ima, sima->image);
+	
+	/* change the space ima after because uvedit_face_visible uses the space ima
+	 * to check if the face is displayed in UV-localview */
+	sima->image= ima;
+	
+	if(ima == NULL || ima->type==IMA_TYPE_R_RESULT || ima->type==IMA_TYPE_COMPOSITE)
+		sima->flag &= ~SI_DRAWTOOL;
+	
+	if(sima->image)
+		BKE_image_signal(sima->image, &sima->iuser, IMA_SIGNAL_USER_NEW_IMAGE);
+	
+	if(sima->image && sima->image->id.us==0)
+		sima->image->id.us= 1;
+	
+	if(C) {
+		if(obedit)
+			WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
+		
+		ED_area_tag_redraw(CTX_wm_area(C));
+	}
+}
+
+ImBuf *ED_space_image_acquire_buffer(SpaceImage *sima, void **lock_r)
+{
+	ImBuf *ibuf;
+	
+	if(sima && sima->image) {
+#if 0
+		if(sima->image->type==IMA_TYPE_R_RESULT && BIF_show_render_spare())
+			return BIF_render_spare_imbuf();
+		else
+#endif
+			ibuf= BKE_image_acquire_ibuf(sima->image, &sima->iuser, lock_r);
+		
+		if(ibuf && (ibuf->rect || ibuf->rect_float))
+			return ibuf;
+	}
+	
+	return NULL;
+}
+
+void ED_space_image_release_buffer(SpaceImage *sima, void *lock)
+{
+	if(sima && sima->image)
+		BKE_image_release_ibuf(sima->image, lock);
+}
+
+int ED_space_image_has_buffer(SpaceImage *sima)
+{
+	ImBuf *ibuf;
+	void *lock;
+	int has_buffer;
+	
+	ibuf= ED_space_image_acquire_buffer(sima, &lock);
+	has_buffer= (ibuf != NULL);
+	ED_space_image_release_buffer(sima, lock);
+	
+	return has_buffer;
+}
+
+void ED_image_size(Image *ima, int *width, int *height)
+{
+	ImBuf *ibuf= NULL;
+	void *lock;
+	
+	if(ima)
+		ibuf= BKE_image_acquire_ibuf(ima, NULL, &lock);
+	
+	if(ibuf && ibuf->x > 0 && ibuf->y > 0) {
+		*width= ibuf->x;
+		*height= ibuf->y;
+	}
+	else {
+		*width= 256;
+		*height= 256;
+	}
+	
+	if(ima)
+		BKE_image_release_ibuf(ima, lock);
+}
+
+void ED_space_image_size(SpaceImage *sima, int *width, int *height)
+{
+	Scene *scene= sima->iuser.scene;
+	ImBuf *ibuf;
+	void *lock;
+	
+	ibuf= ED_space_image_acquire_buffer(sima, &lock);
+	
+	if(ibuf && ibuf->x > 0 && ibuf->y > 0) {
+		*width= ibuf->x;
+		*height= ibuf->y;
+	}
+	else if(sima->image && sima->image->type==IMA_TYPE_R_RESULT && scene) {
+		/* not very important, just nice */
+		*width= (scene->r.xsch*scene->r.size)/100;
+		*height= (scene->r.ysch*scene->r.size)/100;
+	}
+	/* I know a bit weak... but preview uses not actual image size */
+	// XXX else if(image_preview_active(sima, width, height));
+	else {
+		*width= 256;
+		*height= 256;
+	}
+	
+	ED_space_image_release_buffer(sima, lock);
+}
+
+void ED_image_aspect(Image *ima, float *aspx, float *aspy)
+{
+	*aspx= *aspy= 1.0;
+	
+	if((ima == NULL) || (ima->type == IMA_TYPE_R_RESULT) || (ima->type == IMA_TYPE_COMPOSITE) ||

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list