[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [58270] trunk/blender/source/blender: Fix #36058: Displace Modifier errors using a baked Image and displace baking inconsistency between 2 .67/2.68RC and previous versions

Sergey Sharybin sergey.vfx at gmail.com
Mon Jul 15 16:47:58 CEST 2013


Revision: 58270
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=58270
Author:   nazgul
Date:     2013-07-15 14:47:58 +0000 (Mon, 15 Jul 2013)
Log Message:
-----------
Fix #36058: Displace Modifier errors using a baked Image and displace baking inconsistency between 2.67/2.68RC and previous versions

This was in fact really nasty bug, caused by multitex_nodes
function using global variable R (which is a copy of current
renderer). this variable is not initialized to anything
meaningful for until first rendering (preview or final)
happened.

Since multitex_nodes might be used outside of render pipeline,
made it so whether CM is on or off as an argument to functions
multitex_ext_safe and multitex_ext. Now multitex_nodes() is
only shall be used for stuff happening from render pipeline!

Also needed to make some changes to other places, so all the
usages of texture sampling knows for the fact whether CM is
on or off.

And one more change is related on behavior of dispalcement,
wave, warp, weightvg modifiers and smoke. They'll be always
using CM off since texture is used for influence, not for
color.

It's rather bigger patch, but it's mostly straightforward
changes, which we really need to be done.

Reviewed by Brecht, thanks!

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/BKE_dynamicpaint.h
    trunk/blender/source/blender/blenkernel/intern/brush.c
    trunk/blender/source/blender/blenkernel/intern/dynamicpaint.c
    trunk/blender/source/blender/blenkernel/intern/effect.c
    trunk/blender/source/blender/blenkernel/intern/pointcache.c
    trunk/blender/source/blender/blenkernel/intern/scene.c
    trunk/blender/source/blender/blenkernel/intern/smoke.c
    trunk/blender/source/blender/compositor/nodes/COM_TextureNode.cpp
    trunk/blender/source/blender/compositor/operations/COM_TextureOperation.cpp
    trunk/blender/source/blender/compositor/operations/COM_TextureOperation.h
    trunk/blender/source/blender/editors/physics/dynamicpaint_ops.c
    trunk/blender/source/blender/makesrna/intern/rna_dynamicpaint.c
    trunk/blender/source/blender/makesrna/intern/rna_texture_api.c
    trunk/blender/source/blender/modifiers/intern/MOD_displace.c
    trunk/blender/source/blender/modifiers/intern/MOD_util.c
    trunk/blender/source/blender/modifiers/intern/MOD_util.h
    trunk/blender/source/blender/modifiers/intern/MOD_warp.c
    trunk/blender/source/blender/modifiers/intern/MOD_wave.c
    trunk/blender/source/blender/modifiers/intern/MOD_weightvg_util.c
    trunk/blender/source/blender/render/extern/include/RE_shader_ext.h
    trunk/blender/source/blender/render/intern/source/render_texture.c

Modified: trunk/blender/source/blender/blenkernel/BKE_dynamicpaint.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_dynamicpaint.h	2013-07-15 14:33:19 UTC (rev 58269)
+++ trunk/blender/source/blender/blenkernel/BKE_dynamicpaint.h	2013-07-15 14:47:58 UTC (rev 58270)
@@ -29,6 +29,7 @@
 
 struct bContext;
 struct wmOperator;
+struct Scene;
 
 /* Actual surface point	*/
 typedef struct PaintSurfaceData {
@@ -69,8 +70,8 @@
 
 int dynamicPaint_createType(struct DynamicPaintModifierData *pmd, int type, struct Scene *scene);
 struct DynamicPaintSurface *dynamicPaint_createNewSurface(struct DynamicPaintCanvasSettings *canvas, struct Scene *scene);
-void dynamicPaint_clearSurface(struct DynamicPaintSurface *surface);
-int  dynamicPaint_resetSurface(struct DynamicPaintSurface *surface);
+void dynamicPaint_clearSurface(struct Scene *scene, struct DynamicPaintSurface *surface);
+int  dynamicPaint_resetSurface(struct Scene *scene, struct DynamicPaintSurface *surface);
 void dynamicPaint_freeSurface(struct DynamicPaintSurface *surface);
 void dynamicPaint_freeCanvas(struct DynamicPaintModifierData *pmd);
 void dynamicPaint_freeBrush(struct DynamicPaintModifierData *pmd);
@@ -85,7 +86,7 @@
 struct DynamicPaintSurface *get_activeSurface(struct DynamicPaintCanvasSettings *canvas);
 
 /* image sequence baking */
-int dynamicPaint_createUVSurface(struct DynamicPaintSurface *surface);
+int dynamicPaint_createUVSurface(struct Scene *scene, struct DynamicPaintSurface *surface);
 int dynamicPaint_calculateFrame(struct DynamicPaintSurface *surface, struct Scene *scene, struct Object *cObject, int frame);
 void dynamicPaint_outputSurfaceImage(struct DynamicPaintSurface *surface, char *filename, short output_layer);
 

Modified: trunk/blender/source/blender/blenkernel/intern/brush.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/brush.c	2013-07-15 14:33:19 UTC (rev 58269)
+++ trunk/blender/source/blender/blenkernel/intern/brush.c	2013-07-15 14:47:58 UTC (rev 58270)
@@ -993,7 +993,8 @@
 				co[2] = 0.0f;
 
 				/* This is copied from displace modifier code */
-				hasrgb = multitex_ext(mtex->tex, co, NULL, NULL, 0, &texres, NULL);
+				/* TODO(sergey): brush are always cacheing with CM enabled for now. */
+				hasrgb = multitex_ext(mtex->tex, co, NULL, NULL, 0, &texres, NULL, true);
 
 				/* if the texture gave an RGB value, we assume it didn't give a valid
 				 * intensity, so calculate one (formula from do_material_tex).

Modified: trunk/blender/source/blender/blenkernel/intern/dynamicpaint.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/dynamicpaint.c	2013-07-15 14:33:19 UTC (rev 58269)
+++ trunk/blender/source/blender/blenkernel/intern/dynamicpaint.c	2013-07-15 14:47:58 UTC (rev 58270)
@@ -1449,12 +1449,13 @@
 	MEM_freeN(temp_data);
 }
 
-static void dynamicPaint_setInitialColor(DynamicPaintSurface *surface)
+static void dynamicPaint_setInitialColor(Scene *scene, DynamicPaintSurface *surface)
 {
 	PaintSurfaceData *sData = surface->data;
 	PaintPoint *pPoint = (PaintPoint *)sData->type_data;
 	DerivedMesh *dm = surface->canvas->dm;
 	int i;
+	bool scene_color_manage = BKE_scene_check_color_management_enabled(scene);
 
 	if (surface->type != MOD_DPAINT_SURFACE_T_PAINT)
 		return;
@@ -1503,7 +1504,7 @@
 					uv[0] = tface[i].uv[j][0] * 2.0f - 1.0f;
 					uv[1] = tface[i].uv[j][1] * 2.0f - 1.0f;
 
-					multitex_ext_safe(tex, uv, &texres, pool);
+					multitex_ext_safe(tex, uv, &texres, pool, scene_color_manage);
 
 					if (texres.tin > pPoint[*vert].alpha) {
 						copy_v3_v3(pPoint[*vert].color, &texres.tr);
@@ -1536,9 +1537,9 @@
 				/* remap to -1.0 to 1.0 */
 				uv_final[0] = uv_final[0] * 2.0f - 1.0f;
 				uv_final[1] = uv_final[1] * 2.0f - 1.0f;
-					
-				multitex_ext_safe(tex, uv_final, &texres, NULL);
 
+				multitex_ext_safe(tex, uv_final, &texres, NULL, scene_color_manage);
+
 				/* apply color */
 				copy_v3_v3(pPoint[i].color, &texres.tr);
 				pPoint[i].alpha = texres.tin;
@@ -1596,7 +1597,7 @@
 }
 
 /* clears surface data back to zero */
-void dynamicPaint_clearSurface(DynamicPaintSurface *surface)
+void dynamicPaint_clearSurface(Scene *scene, DynamicPaintSurface *surface)
 {
 	PaintSurfaceData *sData = surface->data;
 	if (sData && sData->type_data) {
@@ -1613,7 +1614,7 @@
 
 		/* set initial color */
 		if (surface->type == MOD_DPAINT_SURFACE_T_PAINT)
-			dynamicPaint_setInitialColor(surface);
+			dynamicPaint_setInitialColor(scene, surface);
 
 		if (sData->bData)
 			sData->bData->clear = 1;
@@ -1621,7 +1622,7 @@
 }
 
 /* completely (re)initializes surface (only for point cache types)*/
-int dynamicPaint_resetSurface(DynamicPaintSurface *surface)
+int dynamicPaint_resetSurface(Scene *scene, DynamicPaintSurface *surface)
 {
 	int numOfPoints = dynamicPaint_surfaceNumOfPoints(surface);
 	/* free existing data */
@@ -1642,16 +1643,16 @@
 
 	/* set initial color */
 	if (surface->type == MOD_DPAINT_SURFACE_T_PAINT)
-		dynamicPaint_setInitialColor(surface);
+		dynamicPaint_setInitialColor(scene, surface);
 
 	return 1;
 }
 
 /* make sure allocated surface size matches current requirements */
-static int dynamicPaint_checkSurfaceData(DynamicPaintSurface *surface)
+static int dynamicPaint_checkSurfaceData(Scene *scene, DynamicPaintSurface *surface)
 {
 	if (!surface->data || ((dynamicPaint_surfaceNumOfPoints(surface) != surface->data->total_points))) {
-		return dynamicPaint_resetSurface(surface);
+		return dynamicPaint_resetSurface(scene, surface);
 	}
 	return 1;
 }
@@ -1953,7 +1954,7 @@
 
 			/* make sure surface is valid */
 			no_surface_data = surface->data == NULL;
-			if (!dynamicPaint_checkSurfaceData(surface)) continue;
+			if (!dynamicPaint_checkSurfaceData(scene, surface)) continue;
 
 			/* limit frame range */
 			CLAMP(current_frame, surface->start_frame, surface->end_frame);
@@ -2225,7 +2226,7 @@
 /*
  *	Create a surface for uv image sequence format
  */
-int dynamicPaint_createUVSurface(DynamicPaintSurface *surface)
+int dynamicPaint_createUVSurface(Scene *scene, DynamicPaintSurface *surface)
 {
 	/* Antialias jitter point relative coords	*/
 	float jitter5sample[10] =  {0.0f, 0.0f,
@@ -2676,7 +2677,7 @@
 		}
 
 #endif
-		dynamicPaint_setInitialColor(surface);
+		dynamicPaint_setInitialColor(scene, surface);
 	}
 
 	return (error == 0);

Modified: trunk/blender/source/blender/blenkernel/intern/effect.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/effect.c	2013-07-15 14:33:19 UTC (rev 58269)
+++ trunk/blender/source/blender/blenkernel/intern/effect.c	2013-07-15 14:47:58 UTC (rev 58270)
@@ -744,6 +744,7 @@
 	float nabla = eff->pd->tex_nabla;
 	int hasrgb;
 	short mode = eff->pd->tex_mode;
+	bool scene_color_manage;
 
 	if (!eff->pd->tex)
 		return;
@@ -763,8 +764,10 @@
 		mul_m4_v3(eff->ob->imat, tex_co);
 	}
 
-	hasrgb = multitex_ext(eff->pd->tex, tex_co, NULL, NULL, 0, result, NULL);
+	scene_color_manage = BKE_scene_check_color_management_enabled(eff->scene);
 
+	hasrgb = multitex_ext(eff->pd->tex, tex_co, NULL, NULL, 0, result, NULL, scene_color_manage);
+
 	if (hasrgb && mode==PFIELD_TEX_RGB) {
 		force[0] = (0.5f - result->tr) * strength;
 		force[1] = (0.5f - result->tg) * strength;
@@ -774,15 +777,15 @@
 		strength/=nabla;
 
 		tex_co[0] += nabla;
-		multitex_ext(eff->pd->tex, tex_co, NULL, NULL, 0, result+1, NULL);
+		multitex_ext(eff->pd->tex, tex_co, NULL, NULL, 0, result+1, NULL, scene_color_manage);
 
 		tex_co[0] -= nabla;
 		tex_co[1] += nabla;
-		multitex_ext(eff->pd->tex, tex_co, NULL, NULL, 0, result+2, NULL);
+		multitex_ext(eff->pd->tex, tex_co, NULL, NULL, 0, result+2, NULL, scene_color_manage);
 
 		tex_co[1] -= nabla;
 		tex_co[2] += nabla;
-		multitex_ext(eff->pd->tex, tex_co, NULL, NULL, 0, result+3, NULL);
+		multitex_ext(eff->pd->tex, tex_co, NULL, NULL, 0, result+3, NULL, scene_color_manage);
 
 		if (mode == PFIELD_TEX_GRAD || !hasrgb) { /* if we don't have rgb fall back to grad */
 			/* generate intensity if texture only has rgb value */

Modified: trunk/blender/source/blender/blenkernel/intern/pointcache.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/pointcache.c	2013-07-15 14:33:19 UTC (rev 58269)
+++ trunk/blender/source/blender/blenkernel/intern/pointcache.c	2013-07-15 14:47:58 UTC (rev 58270)
@@ -2800,7 +2800,7 @@
 			smokeModifier_reset_turbulence(pid->calldata);
 #endif
 		else if (pid->type == PTCACHE_TYPE_DYNAMICPAINT)
-			dynamicPaint_clearSurface((DynamicPaintSurface*)pid->calldata);
+			dynamicPaint_clearSurface(scene, (DynamicPaintSurface*)pid->calldata);
 	}
 	if (clear)
 		BKE_ptcache_id_clear(pid, PTCACHE_CLEAR_ALL, 0);

Modified: trunk/blender/source/blender/blenkernel/intern/scene.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/scene.c	2013-07-15 14:33:19 UTC (rev 58269)
+++ trunk/blender/source/blender/blenkernel/intern/scene.c	2013-07-15 14:47:58 UTC (rev 58270)
@@ -1479,6 +1479,16 @@
 
 int BKE_scene_check_color_management_enabled(const Scene *scene)
 {
+	/* TODO(sergey): shouldn't be needed. but we're currently far to close to the release,
+	 *               so better be extra-safe than sorry.
+	 *
+	 *               Will remove the check after the release.
+	 */
+	if (!scene) {
+		BLI_assert(!"Shouldn't happen!");
+		return TRUE;
+	}
+
 	return strcmp(scene->display_settings.display_device, "None") != 0;
 }
 

Modified: trunk/blender/source/blender/blenkernel/intern/smoke.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/smoke.c	2013-07-15 14:33:19 UTC (rev 58269)
+++ trunk/blender/source/blender/blenkernel/intern/smoke.c	2013-07-15 14:47:58 UTC (rev 58270)
@@ -1413,12 +1413,14 @@
 	}
 }
 
+/* TODO(sergey): de-duplicate with get_texture_value from modifier utils */
+/* NOTE: Skips color management, because result is only used for value now, not for color. */
 static void get_texture_value(Tex *texture, float tex_co[3], TexResult *texres)
 {
 	int result_type;
 
 	/* no node textures for now */
-	result_type = multitex_ext_safe(texture, tex_co, texres, NULL);
+	result_type = multitex_ext_safe(texture, tex_co, texres, NULL, false);
 

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list