[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [12747] trunk/blender/source/blender:

Brecht Van Lommel brechtvanlommel at pandora.be
Sat Dec 1 20:29:50 CET 2007


Revision: 12747
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=12747
Author:   blendix
Date:     2007-12-01 20:29:50 +0100 (Sat, 01 Dec 2007)

Log Message:
-----------

For the OpenGL render option in the 3d view, if a camera is active,
it now sets the viewport exactly the same as if rendering.

Modified Paths:
--------------
    trunk/blender/source/blender/include/BSE_drawview.h
    trunk/blender/source/blender/render/extern/include/RE_pipeline.h
    trunk/blender/source/blender/render/intern/source/initrender.c
    trunk/blender/source/blender/src/drawview.c
    trunk/blender/source/blender/src/renderwin.c

Modified: trunk/blender/source/blender/include/BSE_drawview.h
===================================================================
--- trunk/blender/source/blender/include/BSE_drawview.h	2007-12-01 19:19:49 UTC (rev 12746)
+++ trunk/blender/source/blender/include/BSE_drawview.h	2007-12-01 19:29:50 UTC (rev 12747)
@@ -58,7 +58,7 @@
 unsigned int sample_backbuf_rect(short mval[2], int size, unsigned int min, unsigned int max, int *dist, short strict, unsigned int (*indextest)(unsigned int index));
 
 void drawview3dspace(struct ScrArea *sa, void *spacedata);
-void drawview3d_render(struct View3D *v3d, int winx, int winy);
+void drawview3d_render(struct View3D *v3d, int winx, int winy, float winmat[][4]);
 
 int update_time(void);
 void calc_viewborder(struct View3D *v3d, struct rctf *viewborder_r);

Modified: trunk/blender/source/blender/render/extern/include/RE_pipeline.h
===================================================================
--- trunk/blender/source/blender/render/extern/include/RE_pipeline.h	2007-12-01 19:19:49 UTC (rev 12746)
+++ trunk/blender/source/blender/render/extern/include/RE_pipeline.h	2007-12-01 19:29:50 UTC (rev 12747)
@@ -213,6 +213,7 @@
 void RE_Database_Baking(struct Render *re, struct Scene *scene, int type, struct Object *actob);
 
 void RE_DataBase_GetView(struct Render *re, float mat[][4]);
+void RE_GetCameraWindow(struct Render *re, struct Object *camera, int frame, float mat[][4]);
 
 #endif /* RE_PIPELINE_H */
 

Modified: trunk/blender/source/blender/render/intern/source/initrender.c
===================================================================
--- trunk/blender/source/blender/render/intern/source/initrender.c	2007-12-01 19:19:49 UTC (rev 12746)
+++ trunk/blender/source/blender/render/intern/source/initrender.c	2007-12-01 19:29:50 UTC (rev 12747)
@@ -543,7 +543,7 @@
 	
 	re->viewdx= pixsize;
 	re->viewdy= re->ycor*pixsize;
-	
+
 	if(re->r.mode & R_ORTHO)
 		RE_SetOrtho(re, &viewplane, clipsta, clipend);
 	else 
@@ -557,6 +557,13 @@
 	re->viewdy= re->ycor*pixsize;
 }
 
+void RE_GetCameraWindow(struct Render *re, struct Object *camera, int frame, float mat[][4])
+{
+	re->r.cfra= frame;
+	RE_SetCamera(re, camera);
+	Mat4CpyMat4(mat, re->winmat);
+}
+
 /* ~~~~~~~~~~~~~~~~ part (tile) calculus ~~~~~~~~~~~~~~~~~~~~~~ */
 
 

Modified: trunk/blender/source/blender/src/drawview.c
===================================================================
--- trunk/blender/source/blender/src/drawview.c	2007-12-01 19:19:49 UTC (rev 12746)
+++ trunk/blender/source/blender/src/drawview.c	2007-12-01 19:29:50 UTC (rev 12747)
@@ -3090,22 +3090,25 @@
 }
 
 
-void drawview3d_render(struct View3D *v3d, int winx, int winy)
+void drawview3d_render(struct View3D *v3d, int winx, int winy, float winmat[][4])
 {
 	Base *base;
 	Scene *sce;
-	float winmat[4][4];
+	float v3dwinmat[4][4];
 	
-	update_for_newframe_muted();	/* first, since camera can be animated */
-
-	setwinmatrixview3d(winx, winy, NULL);
-	
 	setviewmatrixview3d();
 	myloadmatrix(v3d->viewmat);
+
+	/* when winmat is not NULL, it overrides the regular window matrix */
 	glMatrixMode(GL_PROJECTION);
-	mygetmatrix(winmat);
+	if(winmat)
+		myloadmatrix(winmat);
+	else
+		setwinmatrixview3d(winx, winy, NULL);
+	mygetmatrix(v3dwinmat);
 	glMatrixMode(GL_MODELVIEW);
-	Mat4MulMat4(v3d->persmat, v3d->viewmat, winmat);
+
+	Mat4MulMat4(v3d->persmat, v3d->viewmat, v3dwinmat);
 	Mat4Invert(v3d->persinv, v3d->persmat);
 	Mat4Invert(v3d->viewinv, v3d->viewmat);
 

Modified: trunk/blender/source/blender/src/renderwin.c
===================================================================
--- trunk/blender/source/blender/src/renderwin.c	2007-12-01 19:19:49 UTC (rev 12746)
+++ trunk/blender/source/blender/src/renderwin.c	2007-12-01 19:29:50 UTC (rev 12747)
@@ -1241,6 +1241,21 @@
 	if (G.f & G_DOSCRIPTLINKS) BPY_do_all_scripts(SCRIPT_POSTRENDER);
 }
 
+void do_ogl_view3d_render(Render *re, View3D *v3d, int winx, int winy)
+{
+	float winmat[4][4];
+
+	update_for_newframe_muted();	/* here, since camera can be animated */
+
+	if(v3d->camera) {
+		/* in camera view, use actual render winmat */
+		RE_GetCameraWindow(re, v3d->camera, CFRA, winmat);
+		drawview3d_render(v3d, winx, winy, winmat);
+	}
+	else
+		drawview3d_render(v3d, winx, winy, NULL);
+}
+
 /* set up display, render the current area view in an image */
 /* the RE_Render is only used to make sure we got the picture in the result */
 void BIF_do_ogl_render(View3D *v3d, int anim)
@@ -1256,7 +1271,7 @@
 	winy= (G.scene->r.size*G.scene->r.ysch)/100;
 	
 	RE_InitState(re, &G.scene->r, winx, winy, NULL);
-	
+
 	/* for now, result is defaulting to floats still... */
 	rr= RE_GetResult(re);
 	if(rr->rect32==NULL)
@@ -1282,7 +1297,8 @@
 			/* user event can close window */
 			if(render_win==NULL)
 				break;
-			drawview3d_render(v3d, winx, winy);
+
+			do_ogl_view3d_render(re, v3d, winx, winy);
 			glReadPixels(0, 0, winx, winy, GL_RGBA, GL_UNSIGNED_BYTE, rr->rect32);
 			BKE_stamp_buf((unsigned char *)rr->rect32, rr->rectf, rr->rectx, rr->recty);
 			window_swap_buffers(render_win->win);
@@ -1322,7 +1338,7 @@
 		CFRA= cfrao;
 	}
 	else {
-		drawview3d_render(v3d, winx, winy);
+		do_ogl_view3d_render(re, v3d, winx, winy);
 		glReadPixels(0, 0, winx, winy, GL_RGBA, GL_UNSIGNED_BYTE, rr->rect32);
 		BKE_stamp_buf((unsigned char *)rr->rect32, rr->rectf, rr->rectx, rr->recty);
 		window_swap_buffers(render_win->win);





More information about the Bf-blender-cvs mailing list