[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