[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [35266] trunk/blender/source/blender: Bug fix: Render and 3d view conflict over ob->imat

Janne Karhu jhkarh at gmail.com
Mon Feb 28 16:42:16 CET 2011


Revision: 35266
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=35266
Author:   jhk
Date:     2011-02-28 15:42:15 +0000 (Mon, 28 Feb 2011)
Log Message:
-----------
Bug fix: Render and 3d view conflict over ob->imat

* For rendering every object's inverse matrix "ob->imat" needs to
  be in render view coordinates, but for drawing in 3d view it needs
  to be in global coordinates. Originally (way back in historical
  times) ob->imat was only used for rendering, but over the years
  other uses came up too. Before 2.5 this wasn't a problem as
  rendering was a totally blocking operation, but with the new
  "interactive ui while rendering" the problems started. Basically
  any update that redrew the 3d view while rendering (like rotating
  the scene with mouse) updated the inverse matrix into global
  coordinates thus invalidating it for the render, leading to all
  kinds of strange discontinuities with textures and volumetrics.

* Problems were very easy to achieve using orco/object coordinates
  for pretty much any textures (bump, point density, volume, sky),
  for examples see bug reports 24906 and 25229. Render baking normals
  in object coordinates was wrong most of the time too.

* Now there is a separate inverse matrix ob->imat_ren that's
  calculated at the beginning of rendering and is used in all places
  inside render code where it's needed. This way the original ob->imat
  can change at will during rendering without causing problems.

Modified Paths:
--------------
    trunk/blender/source/blender/makesdna/DNA_object_types.h
    trunk/blender/source/blender/render/intern/source/convertblender.c
    trunk/blender/source/blender/render/intern/source/render_texture.c
    trunk/blender/source/blender/render/intern/source/rendercore.c
    trunk/blender/source/blender/render/intern/source/renderdatabase.c

Modified: trunk/blender/source/blender/makesdna/DNA_object_types.h
===================================================================
--- trunk/blender/source/blender/makesdna/DNA_object_types.h	2011-02-28 14:39:26 UTC (rev 35265)
+++ trunk/blender/source/blender/makesdna/DNA_object_types.h	2011-02-28 15:42:15 UTC (rev 35266)
@@ -145,8 +145,14 @@
 	float obmat[4][4];		/* final worldspace matrix with constraints & animsys applied */
 	float parentinv[4][4]; /* inverse result of parent, so that object doesn't 'stick' to parent */
 	float constinv[4][4]; /* inverse result of constraints. doesn't include effect of parent or object local transform */
-	float imat[4][4];	/* inverse matrix of 'obmat' for during render, old game engine, temporally: ipokeys of transform  */
+	float imat[4][4];	/* inverse matrix of 'obmat' for any other use than rendering! */
 	
+	/* Previously 'imat' was used at render time, but as other places use it too
+	 * the interactive ui of 2.5 creates problems. So now only 'imat_ren' should
+	 * be used when ever the inverse of ob->obmat * re->viewmat is needed! - jahka
+	 */
+	float imat_ren[4][4];
+	
 	unsigned int lay;				/* copy of Base */
 	
 	short flag;			/* copy of Base */

Modified: trunk/blender/source/blender/render/intern/source/convertblender.c
===================================================================
--- trunk/blender/source/blender/render/intern/source/convertblender.c	2011-02-28 14:39:26 UTC (rev 35265)
+++ trunk/blender/source/blender/render/intern/source/convertblender.c	2011-02-28 15:42:15 UTC (rev 35266)
@@ -4810,7 +4810,7 @@
 	ObjectInstanceRen *obi;
 	Scene *sce_iter;
 	float mat[4][4];
-	int lay, vectorlay, redoimat= 0;
+	int lay, vectorlay;
 
 	/* for duplis we need the Object texture mapping to work as if
 	 * untransformed, set_dupli_tex_mat sets the matrix to allow that
@@ -4821,7 +4821,8 @@
 		ob= base->object;
 		/* imat objects has to be done here, since displace can have texture using Object map-input */
 		mul_m4_m4m4(mat, ob->obmat, re->viewmat);
-		invert_m4_m4(ob->imat, mat);
+		invert_m4_m4(ob->imat_ren, mat);
+		copy_m4_m4(ob->imat, ob->imat_ren);
 		/* each object should only be rendered once */
 		ob->flag &= ~OB_DONE;
 		ob->transflag &= ~OB_RENDER_DUPLI;
@@ -4855,8 +4856,6 @@
 				DupliObject *dob;
 				ListBase *lb;
 
-				redoimat= 1;
-
 				/* create list of duplis generated by this object, particle
 				 * system need to have render settings set for dupli particles */
 				dupli_render_particle_set(re, ob, timeoffset, 0, 1);
@@ -4968,15 +4967,6 @@
 	for(group= re->main->group.first; group; group=group->id.next)
 		add_group_render_dupli_obs(re, group, nolamps, onlyselected, actob, timeoffset, renderlay, 0);
 
-	/* imat objects has to be done again, since groups can mess it up */
-	if(redoimat) {
-		for(SETLOOPER(re->scene, sce_iter, base)) {
-			ob= base->object;
-			mul_m4_m4m4(mat, ob->obmat, re->viewmat);
-			invert_m4_m4(ob->imat, mat);
-		}
-	}
-
 	if(!re->test_break(re->tbh))
 		RE_makeRenderInstances(re);
 }

Modified: trunk/blender/source/blender/render/intern/source/render_texture.c
===================================================================
--- trunk/blender/source/blender/render/intern/source/render_texture.c	2011-02-28 14:39:26 UTC (rev 35265)
+++ trunk/blender/source/blender/render/intern/source/render_texture.c	2011-02-28 15:42:15 UTC (rev 35266)
@@ -1830,8 +1830,8 @@
 		idv = (dv < 1e-5f) ? bf : (bf/dv);
 
 		if ((mtex->texco == TEXCO_ORCO) && shi->obr && shi->obr->ob) {
-			mul_mat3_m4_v3(shi->obr->ob->imat, tu);
-			mul_mat3_m4_v3(shi->obr->ob->imat, tv);
+			mul_mat3_m4_v3(shi->obr->ob->imat_ren, tu);
+			mul_mat3_m4_v3(shi->obr->ob->imat_ren, tv);
 			normalize_v3(tu);
 			normalize_v3(tv);
 		}
@@ -1840,8 +1840,8 @@
 			mul_mat3_m4_v3(R.viewinv, tv);
 		}
 		else if (mtex->texco == TEXCO_OBJECT && mtex->object) {
-			mul_mat3_m4_v3(mtex->object->imat, tu);
-			mul_mat3_m4_v3(mtex->object->imat, tv);
+			mul_mat3_m4_v3(mtex->object->imat_ren, tu);
+			mul_mat3_m4_v3(mtex->object->imat_ren, tv);
 			normalize_v3(tu);
 			normalize_v3(tv);
 		}
@@ -2177,12 +2177,12 @@
 					if(mtex->texflag & MTEX_OB_DUPLI_ORIG)
 						if(shi->obi && shi->obi->duplitexmat)
 							mul_m4_v3(shi->obi->duplitexmat, tempvec);
-					mul_m4_v3(ob->imat, tempvec);
+					mul_m4_v3(ob->imat_ren, tempvec);
 					if(shi->osatex) {
 						VECCOPY(dxt, shi->dxco);
 						VECCOPY(dyt, shi->dyco);
-						mul_mat3_m4_v3(ob->imat, dxt);
-						mul_mat3_m4_v3(ob->imat, dyt);
+						mul_mat3_m4_v3(ob->imat_ren, dxt);
+						mul_mat3_m4_v3(ob->imat_ren, dyt);
 					}
 				}
 				else {
@@ -2653,7 +2653,7 @@
 						if(shi->obi && shi->obi->duplitexmat)
 							mul_m4_v3(shi->obi->duplitexmat, co);					
 					} 
-					mul_m4_v3(ob->imat, co);
+					mul_m4_v3(ob->imat_ren, co);
 				}
 			}
 			/* not really orco, but 'local' */
@@ -2665,7 +2665,7 @@
 				else {
 					Object *ob= shi->obi->ob;
 					VECCOPY(co, xyz);
-					mul_m4_v3(ob->imat, co);
+					mul_m4_v3(ob->imat_ren, co);
 				}
 			}
 			else if(mtex->texco==TEXCO_GLOB) {							
@@ -3016,7 +3016,7 @@
 			case TEXCO_OBJECT:
 				if(mtex->object) {
 					VECCOPY(tempvec, lo);
-					mul_m4_v3(mtex->object->imat, tempvec);
+					mul_m4_v3(mtex->object->imat_ren, tempvec);
 					co= tempvec;
 				}
 				break;
@@ -3165,12 +3165,12 @@
 					dx= dxt;
 					dy= dyt;
 					VECCOPY(tempvec, shi->co);
-					mul_m4_v3(ob->imat, tempvec);
+					mul_m4_v3(ob->imat_ren, tempvec);
 					if(shi->osatex) {
 						VECCOPY(dxt, shi->dxco);
 						VECCOPY(dyt, shi->dyco);
-						mul_mat3_m4_v3(ob->imat, dxt);
-						mul_mat3_m4_v3(ob->imat, dyt);
+						mul_mat3_m4_v3(ob->imat_ren, dxt);
+						mul_mat3_m4_v3(ob->imat_ren, dyt);
 					}
 				}
 				else {

Modified: trunk/blender/source/blender/render/intern/source/rendercore.c
===================================================================
--- trunk/blender/source/blender/render/intern/source/rendercore.c	2011-02-28 14:39:26 UTC (rev 35265)
+++ trunk/blender/source/blender/render/intern/source/rendercore.c	2011-02-28 15:42:15 UTC (rev 35266)
@@ -2179,7 +2179,7 @@
 				mul_m3_v3(imat, nor);
 			}
 			else if(R.r.bake_normal_space == R_BAKE_SPACE_OBJECT)
-				mul_mat3_m4_v3(ob->imat, nor); /* ob->imat includes viewinv! */
+				mul_mat3_m4_v3(ob->imat_ren, nor); /* ob->imat_ren includes viewinv! */
 			else if(R.r.bake_normal_space == R_BAKE_SPACE_WORLD)
 				mul_mat3_m4_v3(R.viewinv, nor);
 

Modified: trunk/blender/source/blender/render/intern/source/renderdatabase.c
===================================================================
--- trunk/blender/source/blender/render/intern/source/renderdatabase.c	2011-02-28 14:39:26 UTC (rev 35265)
+++ trunk/blender/source/blender/render/intern/source/renderdatabase.c	2011-02-28 15:42:15 UTC (rev 35266)
@@ -1129,16 +1129,8 @@
 				;
 			}
 			else if(mtex->texco & TEXCO_OBJECT) {
-				if(mtex->object){
-					float imat[4][4];
-					/* imat should really be cached somewhere before this */
-					invert_m4_m4(imat,mtex->object->obmat);
-					mul_m4_v3(imat,texvec);
-				}
-				/* texvec[0]+= imatbase->ivec[0]; */
-				/* texvec[1]+= imatbase->ivec[1]; */
-				/* texvec[2]+= imatbase->ivec[2]; */
-				/* mul_m3_v3(imatbase->imat, texvec); */
+				if(mtex->object)
+					mul_m4_v3(mtex->object->imat_ren,texvec);
 			}
 			else if(mtex->texco & TEXCO_GLOB){
 				VECCOPY(texvec,vec);




More information about the Bf-blender-cvs mailing list