[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