[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [56874] trunk/blender/source/blender: 3D Viewport rendering (Blender Internal)

Ton Roosendaal ton at blender.org
Fri May 17 13:13:46 CEST 2013


Revision: 56874
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=56874
Author:   ton
Date:     2013-05-17 11:13:46 +0000 (Fri, 17 May 2013)
Log Message:
-----------
3D Viewport rendering (Blender Internal)

Added incremental re-render on view changes. That means all data preprocessing
only needs to be done once on view changes, quite faster that way.

Also fixed a bug in raytracing strands with soft shadows, was wrongly changing
coordinates in a static array.

Note: proper signals for re-renders is still on the todo. Many button options
don't signal a re-render yet. Work around: press G+ESC for quick full renders.

Modified Paths:
--------------
    trunk/blender/source/blender/editors/render/render_internal.c
    trunk/blender/source/blender/render/intern/include/envmap.h
    trunk/blender/source/blender/render/intern/include/rayintersection.h
    trunk/blender/source/blender/render/intern/include/renderdatabase.h
    trunk/blender/source/blender/render/intern/source/convertblender.c
    trunk/blender/source/blender/render/intern/source/envmap.c
    trunk/blender/source/blender/render/intern/source/rayshade.c

Modified: trunk/blender/source/blender/editors/render/render_internal.c
===================================================================
--- trunk/blender/source/blender/editors/render/render_internal.c	2013-05-17 11:08:50 UTC (rev 56873)
+++ trunk/blender/source/blender/editors/render/render_internal.c	2013-05-17 11:13:46 UTC (rev 56874)
@@ -718,6 +718,8 @@
 	Main *bmain;
 	RenderEngine *engine;
 	
+	float viewmat[4][4];
+	
 	int keep_data;
 } RenderPreview;
 
@@ -828,7 +830,7 @@
 	rp->stop = stop;
 	rp->do_update = do_update;
 
-//	printf("Enter previewrender\n");
+	// printf("Enter previewrender\n");
 	
 	/* ok, are we rendering all over? */
 	sprintf(name, "View3dPreview %p", (void *)rp->ar);
@@ -884,14 +886,14 @@
 			lay |= rp->v3d->lay;
 		else lay = rp->v3d->lay;
 		
-		RE_SetView(re, rp->rv3d->viewmat);
+		RE_SetView(re, rp->viewmat);
 		
 		RE_Database_FromScene(re, rp->bmain, rp->scene, lay, 0);		// 0= dont use camera view
-//		printf("dbase update\n");
+		// printf("dbase update\n");
 	}
 	else {
-//		printf("dbase rotate\n");
-		RE_DataBase_IncrementalView(re, rp->rv3d->viewmat, 0);
+		// printf("dbase rotate\n");
+		RE_DataBase_IncrementalView(re, rp->viewmat, 0);
 		restore = 1;
 	}
 
@@ -900,15 +902,13 @@
 	/* OK, can we enter render code? */
 	if (rstats->convertdone) {
 		RE_TileProcessor(re);
-//		printf("tile processor\n");
 		
+		/* always rotate back */
 		if (restore)
-			RE_DataBase_IncrementalView(re, rp->rv3d->viewmat, 1);
-		
+			RE_DataBase_IncrementalView(re, rp->viewmat, 1);
+
 		rp->engine->flag &= ~RE_ENGINE_DO_UPDATE;
 	}
-
-//	printf("done\n\n");
 }
 
 static void render_view3d_free(void *customdata)
@@ -943,6 +943,7 @@
 	rp->rv3d = CTX_wm_region_view3d(C);
 	rp->bmain = CTX_data_main(C);
 	rp->keep_data = keep_data;
+	copy_m4_m4(rp->viewmat, rp->rv3d->viewmat);
 	
 	/* dont alloc in threads */
 	if (engine->text == NULL)
@@ -992,13 +993,9 @@
 		if (engine->resolution_x != ar->winx || engine->resolution_y != ar->winy)
 			update |= PR_UPDATE_RENDERSIZE;
 
-		/* view updating fails on raytrace */
 		RE_GetView(re, mat);
 		if (compare_m4m4(mat, rv3d->viewmat, 0.00001f) == 0) {
-			if ((scene->r.mode & R_RAYTRACE) == 0)
-				update |= PR_UPDATE_VIEW;
-			else
-				engine->flag |= RE_ENGINE_DO_UPDATE;
+			update |= PR_UPDATE_VIEW;
 		}
 		
 		render_view3d_get_rects(ar, v3d, rv3d, &viewplane, engine, &clipsta, &clipend, &orth);
@@ -1013,8 +1010,8 @@
 		
 		if (update)
 			engine->flag |= RE_ENGINE_DO_UPDATE;
-//		if (update)
-//			printf("changed ma %d res %d view %d\n", update & PR_UPDATE_MATERIAL, update & PR_UPDATE_RENDERSIZE, update & PR_UPDATE_VIEW);
+		//if (update)
+		//	printf("changed ma %d res %d view %d\n", update & PR_UPDATE_MATERIAL, update & PR_UPDATE_RENDERSIZE, update & PR_UPDATE_VIEW);
 	}
 	
 	return update;

Modified: trunk/blender/source/blender/render/intern/include/envmap.h
===================================================================
--- trunk/blender/source/blender/render/intern/include/envmap.h	2013-05-17 11:08:50 UTC (rev 56873)
+++ trunk/blender/source/blender/render/intern/include/envmap.h	2013-05-17 11:13:46 UTC (rev 56874)
@@ -48,7 +48,7 @@
 
 void make_envmaps(struct Render *re);
 int envmaptex(struct Tex *tex, const float texvec[3], float dxt[3], float dyt[3], int osatex, struct TexResult *texres, struct ImagePool *pool);
-void env_rotate_scene(struct Render *re, float mat[4][4], int mode);
+void env_rotate_scene(struct Render *re, float mat[4][4], int do_rotate);
 
 #endif /* __ENVMAP_H__ */
 

Modified: trunk/blender/source/blender/render/intern/include/rayintersection.h
===================================================================
--- trunk/blender/source/blender/render/intern/include/rayintersection.h	2013-05-17 11:08:50 UTC (rev 56873)
+++ trunk/blender/source/blender/render/intern/include/rayintersection.h	2013-05-17 11:13:46 UTC (rev 56874)
@@ -64,6 +64,10 @@
 	float dir[3];
 	float dist;
 
+	/* for envmap and incremental view update renders */
+	float origstart[3];
+	float origdir[3];
+	
 	/* precomputed values to accelerate bounding box intersection */
 	int bv_index[6];
 	float idot_axis[3];

Modified: trunk/blender/source/blender/render/intern/include/renderdatabase.h
===================================================================
--- trunk/blender/source/blender/render/intern/include/renderdatabase.h	2013-05-17 11:08:50 UTC (rev 56873)
+++ trunk/blender/source/blender/render/intern/include/renderdatabase.h	2013-05-17 11:13:46 UTC (rev 56874)
@@ -140,6 +140,9 @@
 
 void RE_set_customdata_names(struct ObjectRen *obr, struct CustomData *data);
 
+void area_lamp_vectors(struct LampRen *lar);
+
+
 /* haloren->type: flags */
 #define HA_ONLYSKY		1
 #define HA_VECT			2

Modified: trunk/blender/source/blender/render/intern/source/convertblender.c
===================================================================
--- trunk/blender/source/blender/render/intern/source/convertblender.c	2013-05-17 11:08:50 UTC (rev 56873)
+++ trunk/blender/source/blender/render/intern/source/convertblender.c	2013-05-17 11:13:46 UTC (rev 56874)
@@ -3765,7 +3765,7 @@
 	shb->compressthresh= lar->compressthresh;
 }
 
-static void area_lamp_vectors(LampRen *lar)
+void area_lamp_vectors(LampRen *lar)
 {
 	float xsize= 0.5f*lar->area_size, ysize= 0.5f*lar->area_sizey, multifac;
 

Modified: trunk/blender/source/blender/render/intern/source/envmap.c
===================================================================
--- trunk/blender/source/blender/render/intern/source/envmap.c	2013-05-17 11:08:50 UTC (rev 56873)
+++ trunk/blender/source/blender/render/intern/source/envmap.c	2013-05-17 11:13:46 UTC (rev 56874)
@@ -45,6 +45,7 @@
 
 #include "DNA_group_types.h"
 #include "DNA_image_types.h"
+#include "DNA_lamp_types.h"
 #include "DNA_object_types.h"
 #include "DNA_scene_types.h"
 #include "DNA_texture_types.h"
@@ -163,6 +164,7 @@
 	/* view stuff in env render */
 	viewscale = (env->type == ENV_PLANE) ? env->viewscale : 1.0f;
 	RE_SetEnvmapCamera(envre, env->object, viewscale, env->clipsta, env->clipend);
+	copy_m4_m4(envre->viewmat_orig, re->viewmat_orig);
 	
 	/* callbacks */
 	envre->display_draw = re->display_draw;
@@ -265,23 +267,27 @@
 
 /* ------------------------------------------------------------------------- */
 
-void env_rotate_scene(Render *re, float mat[4][4], int mode)
+void env_rotate_scene(Render *re, float mat[4][4], int do_rotate)
 {
 	GroupObject *go;
 	ObjectRen *obr;
 	ObjectInstanceRen *obi;
 	LampRen *lar = NULL;
 	HaloRen *har = NULL;
-	float imat[3][3], pmat[4][4], smat[4][4], tmat[4][4], cmat[3][3], tmpmat[4][4];
+	float imat[3][3], mat_inverse[4][4], smat[4][4], tmat[4][4], cmat[3][3], tmpmat[4][4];
 	int a;
 	
-	if (mode == 0) {
+	if (do_rotate == 0) {
 		invert_m4_m4(tmat, mat);
 		copy_m3_m4(imat, tmat);
+		
+		copy_m4_m4(mat_inverse, mat);
 	}
 	else {
 		copy_m4_m4(tmat, mat);
 		copy_m3_m4(imat, mat);
+		
+		invert_m4_m4(mat_inverse, tmat);
 	}
 
 	for (obi = re->instancetable.first; obi; obi = obi->next) {
@@ -290,7 +296,7 @@
 			copy_m4_m4(tmpmat, obi->mat);
 			mult_m4_m4m4(obi->mat, tmat, tmpmat);
 		}
-		else if (mode == 1)
+		else if (do_rotate == 1)
 			copy_m4_m4(obi->mat, tmat);
 		else
 			unit_m4(obi->mat);
@@ -300,10 +306,12 @@
 		transpose_m3(obi->nmat);
 
 		/* indicate the renderer has to use transform matrices */
-		if (mode == 0)
+		if (do_rotate == 0)
 			obi->flag &= ~R_ENV_TRANSFORMED;
-		else
+		else {
 			obi->flag |= R_ENV_TRANSFORMED;
+			copy_m4_m4(obi->imat, mat_inverse);
+		}
 	}
 	
 
@@ -319,32 +327,50 @@
 	for (go = re->lights.first; go; go = go->next) {
 		lar = go->lampren;
 		
-		/* removed here some horrible code of someone in NaN who tried to fix
-		 * prototypes... just solved by introducing a correct cmat[3][3] instead
-		 * of using smat. this works, check square spots in reflections  (ton) */
-		copy_m3_m3(cmat, lar->imat); 
-		mul_m3_m3m3(lar->imat, cmat, imat); 
+		/* copy from add_render_lamp */
+		if (do_rotate == 1)
+			mult_m4_m4m4(tmpmat, re->viewmat, go->ob->obmat);
+		else
+			mult_m4_m4m4(tmpmat, re->viewmat_orig, go->ob->obmat);
+		invert_m4_m4(go->ob->imat, tmpmat);
+		
+		copy_m3_m4(lar->mat, tmpmat);
+		
+		copy_m3_m4(lar->imat, go->ob->imat);
 
-		mul_m3_v3(imat, lar->vec);
-		mul_m4_v3(tmat, lar->co);
+		lar->vec[0]= -tmpmat[2][0];
+		lar->vec[1]= -tmpmat[2][1];
+		lar->vec[2]= -tmpmat[2][2];
+		normalize_v3(lar->vec);
+		lar->co[0]= tmpmat[3][0];
+		lar->co[1]= tmpmat[3][1];
+		lar->co[2]= tmpmat[3][2];
 
-		lar->sh_invcampos[0] = -lar->co[0];
-		lar->sh_invcampos[1] = -lar->co[1];
-		lar->sh_invcampos[2] = -lar->co[2];
-		mul_m3_v3(lar->imat, lar->sh_invcampos);
-		lar->sh_invcampos[2] *= lar->sh_zfac;
+		if (lar->type == LA_AREA) {
+			area_lamp_vectors(lar);
+		}
+		else if (lar->type == LA_SPOT) {
+			normalize_v3(lar->imat[0]);
+			normalize_v3(lar->imat[1]);
+			normalize_v3(lar->imat[2]);
 		
-		if (lar->shb) {
-			if (mode == 1) {
-				invert_m4_m4(pmat, mat);
-				mult_m4_m4m4(smat, lar->shb->viewmat, pmat);
-				mult_m4_m4m4(lar->shb->persmat, lar->shb->winmat, smat);
+			lar->sh_invcampos[0] = -lar->co[0];
+			lar->sh_invcampos[1] = -lar->co[1];
+			lar->sh_invcampos[2] = -lar->co[2];
+			mul_m3_v3(lar->imat, lar->sh_invcampos);
+			lar->sh_invcampos[2] *= lar->sh_zfac;
+		
+			if (lar->shb) {
+				if (do_rotate == 1) {
+					mult_m4_m4m4(smat, lar->shb->viewmat, mat_inverse);
+					mult_m4_m4m4(lar->shb->persmat, lar->shb->winmat, smat);
+				}
+				else mult_m4_m4m4(lar->shb->persmat, lar->shb->winmat, lar->shb->viewmat);
 			}
-			else mult_m4_m4m4(lar->shb->persmat, lar->shb->winmat, lar->shb->viewmat);
 		}
 	}
 	
-	if (mode) {
+	if (do_rotate) {
 		init_render_world(re);
 		env_set_imats(re);
 	}

Modified: trunk/blender/source/blender/render/intern/source/rayshade.c
===================================================================
--- trunk/blender/source/blender/render/intern/source/rayshade.c	2013-05-17 11:08:50 UTC (rev 56873)
+++ trunk/blender/source/blender/render/intern/source/rayshade.c	2013-05-17 11:13:46 UTC (rev 56874)
@@ -499,7 +499,37 @@
 	
 }
 
+/* four functions to facilitate envmap rotation for raytrace */
+static void ray_env_rotate_start(Isect *is, float imat[4][4])
+{
+	copy_v3_v3(is->origstart, is->start);
+	mul_m4_v3(imat, is->start);
+}
 
+static void ray_env_rotate_dir(Isect *is, float imat[4][4])
+{
+	float end[3];
+	
+	copy_v3_v3(is->origdir, is->dir);
+	add_v3_v3v3(end, is->origstart, is->dir);
+	
+	mul_m4_v3(imat, end);
+	sub_v3_v3v3(is->dir, end, is->start);
+}
+

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list