[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