[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [51511] trunk/blender/source/blender: Fix #32930: texture colors in material nodes (blender internal) are brighter than normal

Sergey Sharybin sergey.vfx at gmail.com
Mon Oct 22 19:34:06 CEST 2012


Revision: 51511
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=51511
Author:   nazgul
Date:     2012-10-22 17:34:06 +0000 (Mon, 22 Oct 2012)
Log Message:
-----------
Fix #32930: texture colors in material nodes (blender internal) are brighter than normal

There was a missing byte buffer linearization for shader nodes.

Also fixed incorrect image input color space refresh when image is packed.

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/BKE_image.h
    trunk/blender/source/blender/blenkernel/intern/image.c
    trunk/blender/source/blender/imbuf/IMB_colormanagement.h
    trunk/blender/source/blender/imbuf/intern/colormanagement.c
    trunk/blender/source/blender/makesrna/intern/rna_color.c
    trunk/blender/source/blender/nodes/shader/nodes/node_shader_tex_environment.c
    trunk/blender/source/blender/nodes/shader/nodes/node_shader_tex_image.c
    trunk/blender/source/blender/nodes/shader/nodes/node_shader_texture.c
    trunk/blender/source/blender/render/intern/source/render_texture.c

Modified: trunk/blender/source/blender/blenkernel/BKE_image.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_image.h	2012-10-22 17:33:53 UTC (rev 51510)
+++ trunk/blender/source/blender/blenkernel/BKE_image.h	2012-10-22 17:34:06 UTC (rev 51511)
@@ -127,6 +127,7 @@
 #define IMA_SIGNAL_SRC_CHANGE       5
 /* image-user gets a new image, check settings */
 #define IMA_SIGNAL_USER_NEW_IMAGE   6
+#define IMA_SIGNAL_COLORMANAGE      7
 
 #define IMA_CHAN_FLAG_BW    1
 #define IMA_CHAN_FLAG_RGB   2

Modified: trunk/blender/source/blender/blenkernel/intern/image.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/image.c	2012-10-22 17:33:53 UTC (rev 51510)
+++ trunk/blender/source/blender/blenkernel/intern/image.c	2012-10-22 17:34:06 UTC (rev 51511)
@@ -2142,6 +2142,15 @@
 				}
 			}
 			break;
+		case IMA_SIGNAL_COLORMANAGE:
+			image_free_buffers(ima);
+
+			ima->ok = 1;
+
+			if (iuser)
+				iuser->ok = 1;
+
+			break;
 	}
 
 	/* don't use notifiers because they are not 100% sure to succeeded

Modified: trunk/blender/source/blender/imbuf/IMB_colormanagement.h
===================================================================
--- trunk/blender/source/blender/imbuf/IMB_colormanagement.h	2012-10-22 17:33:53 UTC (rev 51510)
+++ trunk/blender/source/blender/imbuf/IMB_colormanagement.h	2012-10-22 17:34:06 UTC (rev 51511)
@@ -62,6 +62,8 @@
 void IMB_colormanagement_assign_float_colorspace(struct ImBuf *ibuf, const char *name);
 void IMB_colormanagement_assign_rect_colorspace(struct ImBuf *ibuf, const char *name);
 
+int IMB_colormanagement_colorspace_is_data(const char *name);
+
 /* ** Color space transformation functions ** */
 void IMB_colormanagement_transform(float *buffer, int width, int height, int channels,
                                    const char *from_colorspace, const char *to_colorspace, int predivide);

Modified: trunk/blender/source/blender/imbuf/intern/colormanagement.c
===================================================================
--- trunk/blender/source/blender/imbuf/intern/colormanagement.c	2012-10-22 17:33:53 UTC (rev 51510)
+++ trunk/blender/source/blender/imbuf/intern/colormanagement.c	2012-10-22 17:34:06 UTC (rev 51511)
@@ -1113,6 +1113,13 @@
 		ibuf->colormanage_flag &= ~IMB_COLORMANAGE_IS_DATA;
 }
 
+int IMB_colormanagement_colorspace_is_data(const char *name)
+{
+	ColorSpace *colorspace = colormanage_colorspace_get_named(name);
+
+	return colorspace->is_data;
+}
+
 /*********************** Threaded display buffer transform routines *************************/
 
 typedef struct DisplayBufferThread {

Modified: trunk/blender/source/blender/makesrna/intern/rna_color.c
===================================================================
--- trunk/blender/source/blender/makesrna/intern/rna_color.c	2012-10-22 17:33:53 UTC (rev 51510)
+++ trunk/blender/source/blender/makesrna/intern/rna_color.c	2012-10-22 17:34:06 UTC (rev 51511)
@@ -474,8 +474,10 @@
 	if (GS(id->name) == ID_IM) {
 		Image *ima = (Image *) id;
 
-		BKE_image_signal(ima, NULL, IMA_SIGNAL_RELOAD);
+		DAG_id_tag_update(&ima->id, 0);
 
+		BKE_image_signal(ima, NULL, IMA_SIGNAL_COLORMANAGE);
+
 		WM_main_add_notifier(NC_IMAGE | ND_DISPLAY, &ima->id);
 		WM_main_add_notifier(NC_IMAGE | NA_EDITED, &ima->id);
 	}

Modified: trunk/blender/source/blender/nodes/shader/nodes/node_shader_tex_environment.c
===================================================================
--- trunk/blender/source/blender/nodes/shader/nodes/node_shader_tex_environment.c	2012-10-22 17:33:53 UTC (rev 51510)
+++ trunk/blender/source/blender/nodes/shader/nodes/node_shader_tex_environment.c	2012-10-22 17:34:06 UTC (rev 51511)
@@ -27,6 +27,8 @@
 
 #include "../node_shader_util.h"
 
+#include "IMB_colormanagement.h"
+
 /* **************** OUTPUT ******************** */
 
 static bNodeSocketTemplate sh_node_tex_environment_in[] = {
@@ -60,6 +62,7 @@
 	ImageUser *iuser= NULL;
 	NodeTexImage *tex = node->storage;
 	int ncd = tex->color_space == SHD_COLORSPACE_NONE;
+	int ret;
 
 	if (!ima)
 		return GPU_stack_link(mat, "node_tex_environment_empty", in, out);
@@ -69,10 +72,17 @@
 
 	node_shader_gpu_tex_mapping(mat, node, in, out);
 
-	if (out[0].link && GPU_material_do_color_management(mat))
-		GPU_link(mat, "srgb_to_linearrgb", out[0].link, &out[0].link);
+	ret = GPU_stack_link(mat, "node_tex_environment", in, out, GPU_image(ima, iuser, ncd));
 
-	return GPU_stack_link(mat, "node_tex_environment", in, out, GPU_image(ima, iuser, ncd));
+	if (ret) {
+		if (GPU_material_do_color_management(mat) &&
+		    IMB_colormanagement_colorspace_is_data(ima->colorspace_settings.name) == FALSE)
+		{
+			GPU_link(mat, "srgb_to_linearrgb", out[0].link, &out[0].link);
+		}
+	}
+
+	 return ret;
 }
 
 /* node type definition */

Modified: trunk/blender/source/blender/nodes/shader/nodes/node_shader_tex_image.c
===================================================================
--- trunk/blender/source/blender/nodes/shader/nodes/node_shader_tex_image.c	2012-10-22 17:33:53 UTC (rev 51510)
+++ trunk/blender/source/blender/nodes/shader/nodes/node_shader_tex_image.c	2012-10-22 17:34:06 UTC (rev 51511)
@@ -27,6 +27,8 @@
 
 #include "../node_shader_util.h"
 
+#include "IMB_colormanagement.h"
+
 /* **************** OUTPUT ******************** */
 
 static bNodeSocketTemplate sh_node_tex_image_in[] = {
@@ -60,6 +62,7 @@
 	ImageUser *iuser= NULL;
 	NodeTexImage *tex = node->storage;
 	int ncd = tex->color_space == SHD_COLORSPACE_NONE;
+	int ret;
 
 	if (!ima)
 		return GPU_stack_link(mat, "node_tex_image_empty", in, out);
@@ -69,10 +72,17 @@
 
 	node_shader_gpu_tex_mapping(mat, node, in, out);
 
-	if (out[0].link && GPU_material_do_color_management(mat))
-		GPU_link(mat, "srgb_to_linearrgb", out[0].link, &out[0].link);
+	ret = GPU_stack_link(mat, "node_tex_image", in, out, GPU_image(ima, iuser, ncd));
 
-	return GPU_stack_link(mat, "node_tex_image", in, out, GPU_image(ima, iuser, ncd));
+	if (ret) {
+		if (GPU_material_do_color_management(mat) &&
+		    IMB_colormanagement_colorspace_is_data(ima->colorspace_settings.name) == FALSE)
+		{
+			GPU_link(mat, "srgb_to_linearrgb", out[0].link, &out[0].link);
+		}
+	}
+
+	return ret;
 }
 
 /* node type definition */

Modified: trunk/blender/source/blender/nodes/shader/nodes/node_shader_texture.c
===================================================================
--- trunk/blender/source/blender/nodes/shader/nodes/node_shader_texture.c	2012-10-22 17:33:53 UTC (rev 51510)
+++ trunk/blender/source/blender/nodes/shader/nodes/node_shader_texture.c	2012-10-22 17:34:06 UTC (rev 51511)
@@ -32,6 +32,8 @@
 
 #include "DNA_texture_types.h"
 
+#include "IMB_colormanagement.h"
+
 #include "node_shader_util.h"
 
 /* **************** TEXTURE ******************** */
@@ -122,8 +124,18 @@
 	Tex *tex = (Tex*)node->id;
 
 	if (tex && tex->type == TEX_IMAGE && tex->ima) {
-		GPUNodeLink *texlink = GPU_image(tex->ima, NULL, FALSE);
-		return GPU_stack_link(mat, "texture_image", in, out, texlink);
+		GPUNodeLink *texlink = GPU_image(tex->ima, &tex->iuser, FALSE);
+		int ret = GPU_stack_link(mat, "texture_image", in, out, texlink);
+
+		if (ret) {
+			if (GPU_material_do_color_management(mat) &&
+			    IMB_colormanagement_colorspace_is_data(tex->ima->colorspace_settings.name) == FALSE)
+			{
+				GPU_link(mat, "srgb_to_linearrgb", out[1].link, &out[1].link);
+			}
+		}
+
+		return ret;
 	}
 	else
 		return 0;

Modified: trunk/blender/source/blender/render/intern/source/render_texture.c
===================================================================
--- trunk/blender/source/blender/render/intern/source/render_texture.c	2012-10-22 17:33:53 UTC (rev 51510)
+++ trunk/blender/source/blender/render/intern/source/render_texture.c	2012-10-22 17:34:06 UTC (rev 51511)
@@ -1262,6 +1262,14 @@
 			
 			do_2d_mapping(&localmtex, texvec_l, NULL, NULL, dxt_l, dyt_l);
 			rgbnor= multitex(tex, texvec_l, dxt_l, dyt_l, osatex, texres, thread, which_output);
+
+			{
+				ImBuf *ibuf = BKE_image_get_ibuf(tex->ima, &tex->iuser);
+
+				/* don't linearize float buffers, assumed to be linear */
+				if (ibuf && !(ibuf->rect_float) && R.scene_color_manage)
+					IMB_colormanagement_colorspace_to_scene_linear_v3(&texres->tr, ibuf->rect_colorspace);
+			}
 		}
 
 		return rgbnor;




More information about the Bf-blender-cvs mailing list