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. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to