[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