[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [26516] trunk/blender/source/blender: Fix #20891: opengl animation render could mess up the view.

Brecht Van Lommel brecht at blender.org
Mon Feb 1 16:32:55 CET 2010


Revision: 26516
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=26516
Author:   blendix
Date:     2010-02-01 16:32:55 +0100 (Mon, 01 Feb 2010)

Log Message:
-----------
Fix #20891: opengl animation render could mess up the view.

The problem was that wmPushMatrix/wmOrtho/.. and similar functions did not
work well for offscreen rendering. It would have been possible to make a
fake subwindow for this, but I decided to just remove this extra layer as
it does not seem to have much purpose and has been quite confusing when
trying to fix other bugs. The relevant matrices are already stored in
RegionView3D so there will be no increase in calls to glGetFloat, which may
have been a performance reason to use this system in the past.

Modified Paths:
--------------
    trunk/blender/source/blender/editors/interface/interface.c
    trunk/blender/source/blender/editors/interface/view2d.c
    trunk/blender/source/blender/editors/screen/area.c
    trunk/blender/source/blender/editors/sculpt_paint/paint_vertex.c
    trunk/blender/source/blender/editors/space_node/drawnode.c
    trunk/blender/source/blender/editors/space_view3d/drawarmature.c
    trunk/blender/source/blender/editors/space_view3d/drawobject.c
    trunk/blender/source/blender/editors/space_view3d/drawvolume.c
    trunk/blender/source/blender/editors/space_view3d/space_view3d.c
    trunk/blender/source/blender/editors/space_view3d/view3d_draw.c
    trunk/blender/source/blender/editors/space_view3d/view3d_view.c
    trunk/blender/source/blender/editors/transform/transform_manipulator.c
    trunk/blender/source/blender/makesdna/DNA_view3d_types.h
    trunk/blender/source/blender/windowmanager/WM_api.h
    trunk/blender/source/blender/windowmanager/intern/wm_gesture.c
    trunk/blender/source/blender/windowmanager/intern/wm_subwindow.c

Modified: trunk/blender/source/blender/editors/interface/interface.c
===================================================================
--- trunk/blender/source/blender/editors/interface/interface.c	2010-02-01 15:13:05 UTC (rev 26515)
+++ trunk/blender/source/blender/editors/interface/interface.c	2010-02-01 15:32:55 UTC (rev 26516)
@@ -746,8 +746,11 @@
 	ui_but_to_pixelrect(&rect, ar, block, NULL);
 	
 	/* pixel space for AA widgets */
-	wmPushMatrix();
-	wmLoadIdentity();
+	glMatrixMode(GL_PROJECTION);
+	glPushMatrix();
+	glMatrixMode(GL_MODELVIEW);
+	glPushMatrix();
+	glLoadIdentity();
 	
 	wmOrtho2(-0.01f, ar->winx-0.01f, -0.01f, ar->winy-0.01f);
 	
@@ -765,7 +768,10 @@
 	}
 	
 	/* restore matrix */
-	wmPopMatrix();
+	glMatrixMode(GL_PROJECTION);
+	glPopMatrix();
+	glMatrixMode(GL_MODELVIEW);
+	glPopMatrix();
 	
 	ui_draw_links(block);
 }

Modified: trunk/blender/source/blender/editors/interface/view2d.c
===================================================================
--- trunk/blender/source/blender/editors/interface/view2d.c	2010-02-01 15:13:05 UTC (rev 26515)
+++ trunk/blender/source/blender/editors/interface/view2d.c	2010-02-01 15:32:55 UTC (rev 26516)
@@ -995,7 +995,7 @@
 	wmOrtho2(curmasked.xmin-xofs, curmasked.xmax-xofs, curmasked.ymin-yofs, curmasked.ymax-yofs);
 	
 	/* XXX is this necessary? */
-	wmLoadIdentity();
+	glLoadIdentity();
 }
 
 /* Set view matrices to only use one axis of 'cur' only
@@ -1024,7 +1024,7 @@
 		wmOrtho2(-xofs, ar->winx-xofs, curmasked.ymin-yofs, curmasked.ymax-yofs);
 		
 	/* XXX is this necessary? */
-	wmLoadIdentity();
+	glLoadIdentity();
 } 
 
 
@@ -1036,7 +1036,7 @@
 	int height= ar->winrct.ymax-ar->winrct.ymin+1;
 	
 	wmOrtho2(0.0f, (float)width, 0.0f, (float)height);
-	wmLoadIdentity();
+	glLoadIdentity();
 	
 	//	ED_region_pixelspace(CTX_wm_region(C));
 }
@@ -2040,7 +2040,10 @@
 {
 	View2DString *v2s;
 	
-	//	wmPushMatrix();
+	// glMatrixMode(GL_PROJECTION);
+	// glPushMatrix();
+	// glMatrixMode(GL_MODELVIEW);
+	// glPushMatrix();
 	ED_region_pixelspace(ar);
 	
 	for(v2s= strings.first; v2s; v2s= v2s->next) {
@@ -2062,7 +2065,10 @@
 		}
 	}
 	
-	//	wmPopMatrix();
+	// glMatrixMode(GL_PROJECTION);
+	// glPopMatrix();
+	// glMatrixMode(GL_MODELVIEW);
+	// glPopMatrix();
 	
 	if(strings.first) 
 		BLI_freelistN(&strings);

Modified: trunk/blender/source/blender/editors/screen/area.c
===================================================================
--- trunk/blender/source/blender/editors/screen/area.c	2010-02-01 15:13:05 UTC (rev 26515)
+++ trunk/blender/source/blender/editors/screen/area.c	2010-02-01 15:32:55 UTC (rev 26516)
@@ -106,7 +106,7 @@
 	int height= ar->winrct.ymax-ar->winrct.ymin+1;
 	
 	wmOrtho2(-0.375, (float)width-0.375, -0.375, (float)height-0.375);
-	wmLoadIdentity();
+	glLoadIdentity();
 }
 
 /* only exported for WM */
@@ -932,9 +932,8 @@
 	ar->winy= ar->winrct.ymax - ar->winrct.ymin + 1;
 	
 	/* UI convention */
-	wmLoadIdentity();
 	wmOrtho2(-0.01f, ar->winx-0.01f, -0.01f, ar->winy-0.01f);
-	
+	glLoadIdentity();
 }
 
 void ED_region_toggle_hidden(bContext *C, ARegion *ar)

Modified: trunk/blender/source/blender/editors/sculpt_paint/paint_vertex.c
===================================================================
--- trunk/blender/source/blender/editors/sculpt_paint/paint_vertex.c	2010-02-01 15:13:05 UTC (rev 26515)
+++ trunk/blender/source/blender/editors/sculpt_paint/paint_vertex.c	2010-02-01 15:32:55 UTC (rev 26516)
@@ -1474,9 +1474,7 @@
 	view3d_operator_needs_opengl(C);
 		
 	/* load projection matrix */
-	wmMultMatrix(ob->obmat);
-	wmGetSingleMatrix(mat);
-	wmLoadMatrix(vc->rv3d->viewmat);
+	mul_m4_m4m4(mat, ob->obmat, vc->rv3d->persmat);
 
 	flip = RNA_boolean_get(itemptr, "flip");
 	pressure = RNA_float_get(itemptr, "pressure");
@@ -1904,9 +1902,7 @@
 	view3d_operator_needs_opengl(C);
 			
 	/* load projection matrix */
-	wmMultMatrix(ob->obmat);
-	wmGetSingleMatrix(mat);
-	wmLoadMatrix(vc->rv3d->viewmat);
+	mul_m4_m4m4(mat, ob->obmat, vc->rv3d->persmat);
 
 	mval[0]-= vc->ar->winrct.xmin;
 	mval[1]-= vc->ar->winrct.ymin;

Modified: trunk/blender/source/blender/editors/space_node/drawnode.c
===================================================================
--- trunk/blender/source/blender/editors/space_node/drawnode.c	2010-02-01 15:13:05 UTC (rev 26515)
+++ trunk/blender/source/blender/editors/space_node/drawnode.c	2010-02-01 15:32:55 UTC (rev 26516)
@@ -1271,8 +1271,11 @@
 		if(ibuf) {
 			float x, y; 
 			
-			wmPushMatrix();
-			
+			glMatrixMode(GL_PROJECTION);
+			glPushMatrix();
+			glMatrixMode(GL_MODELVIEW);
+			glPushMatrix();
+
 			/* somehow the offset has to be calculated inverse */
 			
 			glaDefine2DArea(&ar->winrct);
@@ -1293,7 +1296,10 @@
 			if(ibuf->rect)
 				glaDrawPixelsSafe(x, y, ibuf->x, ibuf->y, ibuf->x, GL_RGBA, GL_UNSIGNED_BYTE, ibuf->rect);
 			
-			wmPopMatrix();
+			glMatrixMode(GL_PROJECTION);
+			glPopMatrix();
+			glMatrixMode(GL_MODELVIEW);
+			glPopMatrix();
 		}
 
 		BKE_image_release_ibuf(ima, lock);

Modified: trunk/blender/source/blender/editors/space_view3d/drawarmature.c
===================================================================
--- trunk/blender/source/blender/editors/space_view3d/drawarmature.c	2010-02-01 15:13:05 UTC (rev 26515)
+++ trunk/blender/source/blender/editors/space_view3d/drawarmature.c	2010-02-01 15:32:55 UTC (rev 26516)
@@ -1581,7 +1581,7 @@
 	/* precalc inverse matrix for drawing screen aligned */
 	if (arm->drawtype==ARM_ENVELOPE) {
 		/* precalc inverse matrix for drawing screen aligned */
-		wmGetMatrix(smat);
+		copy_m4_m4(smat, rv3d->viewmatob);
 		mul_mat3_m4_fl(smat, 1.0f/len_v3(ob->obmat[0]));
 		invert_m4_m4(imat, smat);
 		
@@ -1941,7 +1941,7 @@
 	/* envelope (deform distance) */
 	if(arm->drawtype==ARM_ENVELOPE) {
 		/* precalc inverse matrix for drawing screen aligned */
-		wmGetMatrix(smat);
+		copy_m4_m4(smat, rv3d->viewmatob);
 		mul_mat3_m4_fl(smat, 1.0f/len_v3(ob->obmat[0]));
 		invert_m4_m4(imat, smat);
 		

Modified: trunk/blender/source/blender/editors/space_view3d/drawobject.c
===================================================================
--- trunk/blender/source/blender/editors/space_view3d/drawobject.c	2010-02-01 15:13:05 UTC (rev 26515)
+++ trunk/blender/source/blender/editors/space_view3d/drawobject.c	2010-02-01 15:32:55 UTC (rev 26516)
@@ -554,7 +554,10 @@
 			for(a=0; a<6; a++)
 				glDisable(GL_CLIP_PLANE0+a);
 		
-		wmPushMatrix();
+		glMatrixMode(GL_PROJECTION);
+		glPushMatrix();
+		glMatrixMode(GL_MODELVIEW);
+		glPushMatrix();
 		ED_region_pixelspace(ar);
 		
 		if(depth_write) {
@@ -574,7 +577,10 @@
 		}
 		else glDepthMask(1);
 		
-		wmPopMatrix();
+		glMatrixMode(GL_PROJECTION);
+		glPopMatrix();
+		glMatrixMode(GL_MODELVIEW);
+		glPopMatrix();
 
 		if(rv3d->rflag & RV3D_CLIPPING)
 			for(a=0; a<6; a++)
@@ -851,7 +857,7 @@
 	
 	/* we first draw only the screen aligned & fixed scale stuff */
 	glPushMatrix();
-	wmLoadMatrix(rv3d->viewmat);
+	glLoadMatrixf(rv3d->viewmat);
 
 	/* lets calculate the scale: */
 	pixsize= rv3d->persmat[0][3]*ob->obmat[3][0]+ rv3d->persmat[1][3]*ob->obmat[3][1]+ rv3d->persmat[2][3]*ob->obmat[3][2]+ rv3d->persmat[3][3];
@@ -1065,7 +1071,7 @@
 	}
 	
 	/* and back to viewspace */
-	wmLoadMatrix(rv3d->viewmat);
+	glLoadMatrixf(rv3d->viewmat);
 	VECCOPY(vec, ob->obmat[3]);
 
 	setlinestyle(0);
@@ -1136,7 +1142,7 @@
 	/* a standing up pyramid with (0,0,0) as top */
 	Camera *cam;
 	World *wrld;
-	float vec[8][4], tmat[4][4], fac, facx, facy, depth;
+	float nobmat[4][4], vec[8][4], fac, facx, facy, depth;
 	int i;
 
 	if(G.f & G_RENDER_SHADOW)
@@ -1216,13 +1222,13 @@
 
 	if(flag==0) {
 		if(cam->flag & (CAM_SHOWLIMITS+CAM_SHOWMIST)) {
-			wmLoadMatrix(rv3d->viewmat);
-			copy_m4_m4(vec, ob->obmat);
-			normalize_m4(vec);
-			wmMultMatrix(vec);
+			/* draw in normalized object matrix space */
+			copy_m4_m4(nobmat, ob->obmat);
+			normalize_m4(nobmat);
 
-			swap_m4m4(rv3d->persmat, tmat);
-			wmGetSingleMatrix(rv3d->persmat);
+			glPushMatrix();
+			glLoadMatrixf(rv3d->viewmat);
+			glMultMatrixf(nobmat);
 
 			if(cam->flag & CAM_SHOWLIMITS) {
 				draw_limit_line(cam->clipsta, cam->clipend, 0x77FFFF);
@@ -1234,7 +1240,7 @@
 			if(cam->flag & CAM_SHOWMIST) 
 				if(wrld) draw_limit_line(wrld->miststa, wrld->miststa+wrld->mistdist, 0xFFFFFF);
 				
-			swap_m4m4(rv3d->persmat, tmat);
+			glPopMatrix();
 		}
 	}
 }
@@ -3355,7 +3361,7 @@
 	if( (base->flag & OB_FROMDUPLI) && (ob->flag & OB_FROMGROUP) ) {
 		float mat[4][4];
 		mul_m4_m4m4(mat, psys->imat, ob->obmat);
-		wmMultMatrix(mat);
+		glMultMatrixf(mat);
 	}
 
 	totpart=psys->totpart;
@@ -3856,7 +3862,7 @@
 	}
 
 	if( (base->flag & OB_FROMDUPLI) && (ob->flag & OB_FROMGROUP) )
-		wmLoadMatrix(rv3d->viewmat);
+		glLoadMatrixf(rv3d->viewmat);
 }
 
 static void draw_update_ptcache_edit(Scene *scene, Object *ob, PTCacheEdit *edit)
@@ -4692,7 +4698,7 @@
 	Object *ob= base->object;
 	MetaBall *mb;
 	MetaElem *ml;
-	float imat[4][4], tmat[4][4];
+	float imat[4][4];
 	int code= 1;
 	
 	mb= ob->data;
@@ -4717,8 +4723,7 @@
 	}
 	else UI_ThemeColor(TH_WIRE);
 
-	wmGetMatrix(tmat);
-	invert_m4_m4(imat, tmat);
+	invert_m4_m4(imat, rv3d->viewmatob);
 	normalize_v3(imat[0]);
 	normalize_v3(imat[1]);
 	
@@ -4753,7 +4758,7 @@
 	return 0;
 }
 
-static void draw_forcefield(Scene *scene, Object *ob)
+static void draw_forcefield(Scene *scene, Object *ob, RegionView3D *rv3d)
 {
 	PartDeflect *pd= ob->pd;
 	float imat[4][4], tmat[4][4];
@@ -4776,8 +4781,7 @@
 	else size = 1.0;
 	
 	/* calculus here, is reused in PFIELD_FORCE */
-	wmGetMatrix(tmat);
-	invert_m4_m4(imat, tmat);
+	invert_m4_m4(imat, rv3d->viewmatob);
 //	normalize_v3(imat[0]);		// we don't do this because field doesnt scale either... apart from wind!
 //	normalize_v3(imat[1]);
 	
@@ -5586,7 +5590,7 @@
 			break;
 		case OB_LAMP:
 			drawlamp(scene, v3d, rv3d, base, dt, flag);
-			if(dtx || (base->flag & SELECT)) wmMultMatrix(ob->obmat);
+			if(dtx || (base->flag & SELECT)) glMultMatrixf(ob->obmat);
 			break;
 		case OB_CAMERA:
 			drawcamera(scene, v3d, rv3d, ob, flag);
@@ -5609,17 +5613,17 @@
 		if ((sb= ob->soft)){
 			if(sb->solverflags & SBSO_ESTIMATEIPO){
 
-				wmLoadMatrix(rv3d->viewmat);
+				glLoadMatrixf(rv3d->viewmat);
 				copy_m3_m3(msc,sb->lscale);
 				copy_m3_m3(mrt,sb->lrot);
 				mul_m3_m3m3(mtr,mrt,msc); 
 				ob_draw_RE_motion(sb->lcom,mtr,tipw,tiph,drawsize);
-				wmMultMatrix(ob->obmat);
+				glMultMatrixf(ob->obmat);
 			}
 		}
 	}
 
-	if(ob->pd && ob->pd->forcefield) draw_forcefield(scene, ob);
+	if(ob->pd && ob->pd->forcefield) draw_forcefield(scene, ob, rv3d);
 

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list