[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [26612] branches/render25: Render Branch: some lowres geometry raytracing test code, just a test

Brecht Van Lommel brecht at blender.org
Thu Feb 4 22:00:16 CET 2010


Revision: 26612
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=26612
Author:   blendix
Date:     2010-02-04 22:00:16 +0100 (Thu, 04 Feb 2010)

Log Message:
-----------
Render Branch: some lowres geometry raytracing test code, just a test
that is far from usable but might as well commit it.

Modified Paths:
--------------
    branches/render25/release/scripts/ui/properties_object.py
    branches/render25/source/blender/makesdna/DNA_object_types.h
    branches/render25/source/blender/makesrna/intern/rna_object.c
    branches/render25/source/blender/render/intern/include/object.h
    branches/render25/source/blender/render/intern/include/object_mesh.h
    branches/render25/source/blender/render/intern/source/convertblender.c
    branches/render25/source/blender/render/intern/source/object.c
    branches/render25/source/blender/render/intern/source/object_mesh.c
    branches/render25/source/blender/render/intern/source/rayshade.c
    branches/render25/source/blender/render/intern/source/texture_envmap.c
    branches/render25/source/blender/render/intern/source/zbuf.c

Modified: branches/render25/release/scripts/ui/properties_object.py
===================================================================
--- branches/render25/release/scripts/ui/properties_object.py	2010-02-04 20:48:35 UTC (rev 26611)
+++ branches/render25/release/scripts/ui/properties_object.py	2010-02-04 21:00:16 UTC (rev 26612)
@@ -220,6 +220,7 @@
         col.prop(ob, "x_ray", text="X-Ray")
         col.prop(ob, "draw_transparent", text="Transparency")
 
+        layout.prop(ob, "displacement_bound")
 
 class OBJECT_PT_duplication(ObjectButtonsPanel):
     bl_label = "Duplication"

Modified: branches/render25/source/blender/makesdna/DNA_object_types.h
===================================================================
--- branches/render25/source/blender/makesdna/DNA_object_types.h	2010-02-04 20:48:35 UTC (rev 26611)
+++ branches/render25/source/blender/makesdna/DNA_object_types.h	2010-02-04 21:00:16 UTC (rev 26612)
@@ -188,6 +188,8 @@
 	char empty_drawtype, pad1[3];
 	float empty_drawsize;
 	float dupfacesca;	/* dupliface scale */
+	float displacebound;		/* displacement bound */
+	float pad3;
 	
 	ListBase prop;
 	ListBase sensors;

Modified: branches/render25/source/blender/makesrna/intern/rna_object.c
===================================================================
--- branches/render25/source/blender/makesrna/intern/rna_object.c	2010-02-04 20:48:35 UTC (rev 26611)
+++ branches/render25/source/blender/makesrna/intern/rna_object.c	2010-02-04 21:00:16 UTC (rev 26612)
@@ -1922,6 +1922,13 @@
 	RNA_def_property_boolean_sdna(prop, NULL, "dtx", OB_DRAWXRAY);
 	RNA_def_property_ui_text(prop, "X-Ray", "Makes the object draw in front of others.");
 	RNA_def_property_update(prop, NC_OBJECT|ND_DRAW, NULL);
+
+	/* displacement bound */
+	prop= RNA_def_property(srna, "displacement_bound", PROP_FLOAT, PROP_TRANSLATION);
+	RNA_def_property_float_sdna(prop, NULL, "displacebound");
+	RNA_def_property_range(prop, 0, FLT_MAX);
+	RNA_def_property_ui_text(prop, "Displacement Bound", "Maximum displacement offset for rendering.");
+	RNA_def_property_update(prop, NC_OBJECT|ND_DRAW, "rna_Object_update");
 	
 	/* Grease Pencil */
 	prop= RNA_def_property(srna, "grease_pencil", PROP_POINTER, PROP_NONE);

Modified: branches/render25/source/blender/render/intern/include/object.h
===================================================================
--- branches/render25/source/blender/render/intern/include/object.h	2010-02-04 20:48:35 UTC (rev 26611)
+++ branches/render25/source/blender/render/intern/include/object.h	2010-02-04 21:00:16 UTC (rev 26612)
@@ -77,6 +77,8 @@
 	struct Scene *sce;
 	int index, psysindex, flag, lay;
 
+	struct ObjectRen *lowres;
+
 	float boundbox[2][3];
 
 	int totvert, totvlak, totstrand, tothalo;
@@ -127,12 +129,15 @@
 
 /* objectren->flag */
 #define R_INSTANCEABLE		1
+#define R_LOWRES			2
+#define R_HIGHRES			4
 
 /* objectinstance->flag */
 #define R_DUPLI_TRANSFORMED	1
 #define R_ENV_TRANSFORMED	2
 #define R_TRANSFORMED		(1|2)
 #define R_NEED_VECTORS		4
+#define R_HIDDEN			8
 
 /* data layer size */
 #define RE_STICKY_ELEMS		2

Modified: branches/render25/source/blender/render/intern/include/object_mesh.h
===================================================================
--- branches/render25/source/blender/render/intern/include/object_mesh.h	2010-02-04 20:48:35 UTC (rev 26611)
+++ branches/render25/source/blender/render/intern/include/object_mesh.h	2010-02-04 21:00:16 UTC (rev 26612)
@@ -36,8 +36,8 @@
 
 /* Find/Add/Copy Verts and Faces */
 
+struct VertRen *render_object_vert_get(struct ObjectRen *obr, int nr);
 struct VlakRen *render_object_vlak_get(struct ObjectRen *obr, int nr);
-struct VertRen *render_object_vert_get(struct ObjectRen *obr, int nr);
 
 struct VertRen *render_object_vert_copy(struct ObjectRen *obr, struct VertRen *ver);
 struct VlakRen *render_object_vlak_copy(struct ObjectRen *obr, struct VlakRen *vlr);
@@ -107,7 +107,7 @@
 
 /* vlakren->flag (vlak = face in dutch) char!!! */
 #define R_SMOOTH		1
-#define R_HIDDEN		2
+#define R_UNUSED_FLAG	2
 #define R_STRAND		4 /* strand flag, means special handling */
 #define R_NOPUNOFLIP	8
 #define R_FULL_OSA		16

Modified: branches/render25/source/blender/render/intern/source/convertblender.c
===================================================================
--- branches/render25/source/blender/render/intern/source/convertblender.c	2010-02-04 20:48:35 UTC (rev 26611)
+++ branches/render25/source/blender/render/intern/source/convertblender.c	2010-02-04 21:00:16 UTC (rev 26612)
@@ -370,7 +370,7 @@
 static void add_render_object(Render *re, Object *ob, Object *par, DupliObject *dob, int timeoffset, int vectorlay)
 {
 	ObjectRen *obr;
-	ObjectInstanceRen *obi;
+	ObjectInstanceRen *obi= NULL;
 	ParticleSystem *psys;
 	int show_emitter, allow_render= 1, index, psysindex, i;
 
@@ -408,12 +408,25 @@
 		}
 		else
 			find_dupli_instances(re, obr);
-			
+
 		for (i=1; i<=ob->totcol; i++) {
 			Material* ma = give_render_material(re, ob, i);
 			if (ma && ma->material_type == MA_TYPE_VOLUME)
 				add_volume(re, obr, ma);
 		}
+
+		/* create low resolution version */
+		if(ob->displacebound > 0.0f) {
+			obr->flag |= R_HIGHRES;
+
+			obr->lowres= render_object_create(&re->db, ob, par, index, 0, ob->lay);
+			obr= obr->lowres;
+			obr->flag |= R_LOWRES;
+
+			if(obr->lay & vectorlay)
+				obr->flag |= R_NEED_VECTORS;
+			init_render_object_data(re, obr, timeoffset);
+		}
 	}
 
 	/* and one render object per particle system */

Modified: branches/render25/source/blender/render/intern/source/object.c
===================================================================
--- branches/render25/source/blender/render/intern/source/object.c	2010-02-04 20:48:35 UTC (rev 26611)
+++ branches/render25/source/blender/render/intern/source/object.c	2010-02-04 21:00:16 UTC (rev 26612)
@@ -178,6 +178,8 @@
 	obr->psysindex= psysindex;
 	obr->lay= lay;
 
+	obr->lowres= obr;
+
 	return obr;
 }
 

Modified: branches/render25/source/blender/render/intern/source/object_mesh.c
===================================================================
--- branches/render25/source/blender/render/intern/source/object_mesh.c	2010-02-04 20:48:35 UTC (rev 26611)
+++ branches/render25/source/blender/render/intern/source/object_mesh.c	2010-02-04 21:00:16 UTC (rev 26612)
@@ -3148,7 +3148,11 @@
 		if(need_orco)
 			mask |= CD_MASK_ORCO;
 
-	dm= mesh_create_derived_render(re->db.scene, ob, mask);
+	if(obr->flag & R_LOWRES)
+		dm= mesh_get_derived_final(re->db.scene, ob, mask);
+	else
+		dm= mesh_create_derived_render(re->db.scene, ob, mask);
+
 	if(dm==NULL) return;	/* in case duplicated object fails? */
 
 	if(mask & CD_MASK_ORCO) {
@@ -3380,7 +3384,7 @@
 			/* the emitter mesh wasn't rendered so the modifier stack wasn't
 			 * evaluated with render settings */
 			DerivedMesh *dm;
-			dm = mesh_create_derived_render(re->db.scene, ob,	CD_MASK_BAREMESH|CD_MASK_MTFACE|CD_MASK_MCOL);
+			dm = mesh_create_derived_render(re->db.scene, ob, CD_MASK_BAREMESH|CD_MASK_MTFACE|CD_MASK_MCOL);
 			dm->release(dm);
 		}
 

Modified: branches/render25/source/blender/render/intern/source/rayshade.c
===================================================================
--- branches/render25/source/blender/render/intern/source/rayshade.c	2010-02-04 20:48:35 UTC (rev 26611)
+++ branches/render25/source/blender/render/intern/source/rayshade.c	2010-02-04 21:00:16 UTC (rev 26612)
@@ -83,6 +83,56 @@
 	return re->cb.test_break(re->cb.tbh);
 }
 
+static int re_object_raycast(RayObject *rayob, Isect *isec, ShadeInput *shi)
+{
+	ObjectRen *obr= shi->primitive.obr;
+	float *vn= shi->geometry.vn;
+	float dist= 1.0f, minlambda= 1.0f, offset;
+	int a, hit= 0;
+
+	if(!(obr->flag & R_HIGHRES))
+		return RE_rayobject_raycast(rayob, isec);
+	
+	offset= obr->ob->displacebound;
+
+	for(a=0; a<2; a++) {
+		Isect subisec;
+		VlakRen *vlr;
+		float direction= (a == 0)? -1.0f: 1.0f;
+
+		memset(&subisec, 0, sizeof(subisec));
+		subisec.skip = RE_SKIP_VLR_RENDER_CHECK;
+		subisec.labda = 1.0f;
+		subisec.mode = RE_RAY_MIRROR;
+		subisec.lay = isec->lay;
+
+		copy_v3_v3(subisec.start, isec->start);
+		mul_v3_v3fl(subisec.vec, isec->vec, direction*offset/len_v3(isec->vec));
+
+		if(!RE_rayobject_raycast(rayob, &subisec))
+			continue;
+
+		vlr= subisec.hit.face;
+		if(dot_v3v3(vlr->n, vn) < 0.0f) /* face normal is flipped */
+			continue;
+
+		if(subisec.labda < minlambda) {
+			minlambda= subisec.labda;
+
+			isec->orig.ob= subisec.hit.ob;
+			isec->orig.face= subisec.hit.face;
+			dist= direction*subisec.labda*offset;
+
+			hit= 1;
+		}
+	}
+
+	if(hit)
+		madd_v3_v3fl(isec->start, isec->vec, dist/len_v3(isec->vec));
+
+	return RE_rayobject_raycast(rayob, isec);
+}
+
 static void RE_rayobject_config_control(RayObject *r, Render *re)
 {
 	if(RE_rayobject_isRayAPI(r))
@@ -164,7 +214,7 @@
 
 	for(obi=rdb->instancetable.first; obi; obi=obi->next)
 	{
-		ObjectRen *obr = obi->obr;
+		ObjectRen *obr = obi->obr->lowres;
 		if(obr->raytree)
 		{
 			RE_rayobject_free(obr->raytree);
@@ -185,8 +235,8 @@
 #ifdef RE_RAYCOUNTER
 	{
 		RayCounter sum;
+		int i;
 		memset( &sum, 0, sizeof(sum) );
-		int i;
 		for(i=0; i<BLENDER_MAX_THREADS; i++)
 			RE_RC_MERGE(&sum, re_rc_counter+i);
 		RE_RC_INFO(&sum);
@@ -206,7 +256,7 @@
 static int is_raytraceable(Render *re, ObjectInstanceRen *obi)
 {
 	int v;
-	ObjectRen *obr = obi->obr;
+	ObjectRen *obr = obi->obr->lowres;
 
 	if(re->db.excludeob && obr->ob == re->db.excludeob)
 		return 0;
@@ -227,7 +277,7 @@
 	// out-of-memory safeproof
 	// break render
 	// update render stats
-	ObjectRen *obr = obi->obr;
+	ObjectRen *obr = obi->obr->lowres;
 	
 	if(obr->raytree == NULL)
 	{
@@ -286,19 +336,19 @@
 		if((obi->flag & R_TRANSFORMED) && obi->raytree == NULL)
 		{
 			obi->transform_primitives = 0;
-			obi->raytree = RE_rayobject_instance_create( obr->raytree, obi->mat, obi, obi->obr->rayobi );
+			obi->raytree = RE_rayobject_instance_create( obr->raytree, obi->mat, obi, obr->rayobi );
 		}
 	}
 	
 	if(obi->raytree) return obi->raytree;
-	return obi->obr->raytree;
+	return obr->raytree;
 }
 
 static int has_special_rayobject(Render *re, ObjectInstanceRen *obi)
 {
 	if( (obi->flag & R_TRANSFORMED) && (re->params.r.raytrace_options & R_RAYTRACE_USE_INSTANCES) )
 	{
-		ObjectRen *obr = obi->obr;
+		ObjectRen *obr = obi->obr->lowres;
 		int v, faces = 0;
 		
 		for(v=0;v<obr->totvlak;v++)
@@ -329,7 +379,7 @@
 	if(is_raytraceable(re, obi))
 	{
 		int v;
-		ObjectRen *obr = obi->obr;
+		ObjectRen *obr = obi->obr->lowres;
 		obs++;
 		

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list