Revision: 20131
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=20131
Author:   jaguarandi
Date:     2009-05-10 23:02:58 +0200 (Sun, 10 May 2009)

Log Message:
-----------

*new generic raytrace API
*Adapted octree to a more generic raytrace API
*ray shadow works (other untested stuff disabled atm)

On the scene tested the user-cpu time got from 1:24 to 1:19/20
probably because of removed callbacks or sligtly diferente memory usage

Modified Paths:
--------------
    branches/soc-2009-jaguarandi/source/blender/editors/armature/meshlaplacian.c
    
branches/soc-2009-jaguarandi/source/blender/render/extern/include/RE_raytrace.h
    
branches/soc-2009-jaguarandi/source/blender/render/intern/include/render_types.h
    branches/soc-2009-jaguarandi/source/blender/render/intern/source/rayshade.c
    
branches/soc-2009-jaguarandi/source/blender/render/intern/source/rendercore.c

Added Paths:
-----------
    
branches/soc-2009-jaguarandi/source/blender/render/intern/include/rayobject.h
    branches/soc-2009-jaguarandi/source/blender/render/intern/source/rayobject.c
    
branches/soc-2009-jaguarandi/source/blender/render/intern/source/rayobject_mesh.c
    
branches/soc-2009-jaguarandi/source/blender/render/intern/source/rayobject_octree.c

Removed Paths:
-------------
    branches/soc-2009-jaguarandi/source/blender/render/intern/source/raytrace.c

Modified: 
branches/soc-2009-jaguarandi/source/blender/editors/armature/meshlaplacian.c
===================================================================
--- 
branches/soc-2009-jaguarandi/source/blender/editors/armature/meshlaplacian.c    
    2009-05-10 20:53:58 UTC (rev 20130)
+++ 
branches/soc-2009-jaguarandi/source/blender/editors/armature/meshlaplacian.c    
    2009-05-10 21:02:58 UTC (rev 20131)
@@ -30,6 +30,7 @@
 
 #include <math.h>
 #include <string.h>
+#include <assert.h>
 
 #include "MEM_guardedalloc.h"
 
@@ -105,7 +106,7 @@
                float *p;                       /* values from all p vectors */
                float *mindist;         /* minimum distance to a bone for all 
vertices */
                
-               RayTree *raytree;       /* ray tracing acceleration structure */
+               RayObject *raytree;     /* ray tracing acceleration structure */
                MFace **vface;          /* a face that the vertex belongs to */
        } heat;
 
@@ -394,77 +395,31 @@
 #define DISTANCE_EPSILON       1e-4f
 
 /* Raytracing for vertex to bone visibility */
-
-static LaplacianSystem *HeatSys = NULL;
-
-static void heat_ray_coords_func(RayFace *face, float **v1, float **v2, float 
**v3, float **v4)
-{
-       MFace *mface= (MFace*)face;
-       float (*verts)[3]= HeatSys->heat.verts;
-
-       *v1= verts[mface->v1];
-       *v2= verts[mface->v2];
-       *v3= verts[mface->v3];
-       *v4= (mface->v4)? verts[mface->v4]: NULL;
-}
-
-static int heat_ray_check_func(Isect *is, int ob, RayFace *face)
-{
-       float *v1, *v2, *v3, *v4, nor[3];
-
-       /* don't intersect if the ray faces along the face normal */
-       heat_ray_coords_func(face, &v1, &v2, &v3, &v4);
-
-       if(v4) CalcNormFloat4(v1, v2, v3, v4, nor);
-       else CalcNormFloat(v1, v2, v3, nor);
-
-       return (INPR(nor, is->vec) < 0);
-}
-
 static void heat_ray_tree_create(LaplacianSystem *sys)
 {
        Mesh *me = sys->heat.mesh;
-       RayTree *tree;
        MFace *mface;
-       float min[3], max[3];
        int a;
 
-       /* create a raytrace tree from the mesh */
-       INIT_MINMAX(min, max);
+       sys->heat.raytree = RayObject_mesh_create(me, me);
 
-       for(a=0; a<me->totvert; a++)
-               DO_MINMAX(sys->heat.verts[a], min, max);
-
-       tree= RE_ray_tree_create(64, me->totface, min, max,
-               heat_ray_coords_func, heat_ray_check_func, NULL, NULL);
-       
-       sys->heat.vface= MEM_callocN(sizeof(MFace*)*me->totvert, "HeatVFaces");
-
-       HeatSys= sys;
-
+       sys->heat.vface = MEM_callocN(sizeof(MFace*)*me->totvert, "HeatVFaces");
        for(a=0, mface=me->mface; a<me->totface; a++, mface++) {
-               RE_ray_tree_add_face(tree, 0, mface);
-
                sys->heat.vface[mface->v1]= mface;
                sys->heat.vface[mface->v2]= mface;
                sys->heat.vface[mface->v3]= mface;
                if(mface->v4) sys->heat.vface[mface->v4]= mface;
        }
-
-       HeatSys= NULL;
-       
-       RE_ray_tree_done(tree);
-
-       sys->heat.raytree= tree;
 }
 
 static int heat_ray_bone_visible(LaplacianSystem *sys, int vertex, int bone)
 {
        Isect isec;
        MFace *mface;
-       float dir[3];
+       float end[3];
        int visible;
 
+       assert( 0 );
        mface= sys->heat.vface[vertex];
        if(!mface)
                return 1;
@@ -473,22 +428,24 @@
        memset(&isec, 0, sizeof(isec));
        isec.mode= RE_RAY_SHADOW;
        isec.lay= -1;
-       isec.face_last= NULL;
-       isec.faceorig= mface;
+       isec.orig.face = mface;
+       isec.skip = RE_SKIP_CULLFACE;
 
        VECCOPY(isec.start, sys->heat.verts[vertex]);
-       PclosestVL3Dfl(isec.end, isec.start,
-               sys->heat.root[bone], sys->heat.tip[bone]);
+       PclosestVL3Dfl(end, isec.start, sys->heat.root[bone], 
sys->heat.tip[bone]);
 
+       VECSUB(isec.vec, end, isec.start);
+       isec.labda = 1.0f;
+
+#if 0
+       TODO
        /* add an extra offset to the start position to avoid self intersection 
*/
-       VECSUB(dir, isec.end, isec.start);
+       VECCOPY(dir, isec.vec);
        Normalize(dir);
        VecMulf(dir, 1e-5);
        VecAddf(isec.start, isec.start, dir);
-       
-       HeatSys= sys;
-       visible= !RE_ray_tree_intersect(sys->heat.raytree, &isec);
-       HeatSys= NULL;
+#endif 
+       visible= !RayObject_raycast(sys->heat.raytree, &isec);
 
        return visible;
 }
@@ -752,7 +709,7 @@
        /* free */
        if(vertsflipped) MEM_freeN(vertsflipped);
 
-       RE_ray_tree_free(sys->heat.raytree);
+       RayObject_free(sys->heat.raytree);
        MEM_freeN(sys->heat.vface);
 
        MEM_freeN(sys->heat.mindist);
@@ -1049,7 +1006,7 @@
        int *varidx;
 
        /* raytrace */
-       RayTree *raytree;
+       RayObject *raytree;
 } MeshDeformBind;
 
 /* ray intersection */
@@ -1173,7 +1130,7 @@
 static int meshdeform_intersect(MeshDeformBind *mdb, Isect *isec)
 {
        MFace *mface;
-       float face[4][3], co[3], uvw[3], len, nor[3];
+       float face[4][3], co[3], uvw[3], len, nor[3], end[3];
        int f, hit, is= 0, totface;
 
        isec->labda= 1e10;
@@ -1181,6 +1138,8 @@
        mface= mdb->cagedm->getFaceArray(mdb->cagedm);
        totface= mdb->cagedm->getNumFaces(mdb->cagedm);
 
+       VECADDFAC( end, isec->start, isec->vec, isec->labda );
+
        for(f=0; f<totface; f++, mface++) {
                VECCOPY(face[0], mdb->cagecos[mface->v1]);
                VECCOPY(face[1], mdb->cagecos[mface->v2]);
@@ -1188,26 +1147,26 @@
 
                if(mface->v4) {
                        VECCOPY(face[3], mdb->cagecos[mface->v4]);
-                       hit= meshdeform_tri_intersect(isec->start, isec->end, 
face[0], face[1], face[2], co, uvw);
+                       hit = meshdeform_tri_intersect(isec->start, end, 
face[0], face[1], face[2], co, uvw);
 
                        if(hit) {
                                CalcNormFloat(face[0], face[1], face[2], nor);
                        }
                        else {
-                               hit= meshdeform_tri_intersect(isec->start, 
isec->end, face[0], face[2], face[3], co, uvw);
+                               hit= meshdeform_tri_intersect(isec->start, end, 
face[0], face[2], face[3], co, uvw);
                                CalcNormFloat(face[0], face[2], face[3], nor);
                        }
                }
                else {
-                       hit= meshdeform_tri_intersect(isec->start, isec->end, 
face[0], face[1], face[2], co, uvw);
+                       hit= meshdeform_tri_intersect(isec->start, end, 
face[0], face[1], face[2], co, uvw);
                        CalcNormFloat(face[0], face[1], face[2], nor);
                }
 
                if(hit) {
-                       len= VecLenf(isec->start, co)/VecLenf(isec->start, 
isec->end);
+                       len= VecLenf(isec->start, co)/VecLenf(isec->start, end);
                        if(len < isec->labda) {
                                isec->labda= len;
-                               isec->face= mface;
+                               isec->hit.face = mface;
                                isec->isect= (INPR(isec->vec, nor) <= 0.0f);
                                is= 1;
                        }
@@ -1223,20 +1182,18 @@
        Isect isec;
        float (*cagecos)[3];
        MFace *mface;
-       float vert[4][3], len;
+       float vert[4][3], len, end[3];
        static float epsilon[3]= {0, 0, 0}; //1e-4, 1e-4, 1e-4};
 
        /* setup isec */
        memset(&isec, 0, sizeof(isec));
        isec.mode= RE_RAY_MIRROR; /* we want the closest intersection */
        isec.lay= -1;
-       isec.face_last= NULL;
-       isec.faceorig= NULL;
        isec.labda= 1e10f;
 
        VECADD(isec.start, co1, epsilon);
-       VECADD(isec.end, co2, epsilon);
-       VECSUB(isec.vec, isec.end, isec.start);
+       VECADD(end, co2, epsilon);
+       VECSUB(isec.vec, end, isec.start);
 
 #if 0
        /*if(RE_ray_tree_intersect(mdb->raytree, &isec)) {*/
@@ -1244,7 +1201,7 @@
 
        if(meshdeform_intersect(mdb, &isec)) {
                len= isec.labda;
-               mface= isec.face;
+               mface=(MFace*)isec.hit.face;
 
                /* create MDefBoundIsect */
                isect= BLI_memarena_alloc(mdb->memarena, sizeof(*isect));

Modified: 
branches/soc-2009-jaguarandi/source/blender/render/extern/include/RE_raytrace.h
===================================================================
--- 
branches/soc-2009-jaguarandi/source/blender/render/extern/include/RE_raytrace.h 
    2009-05-10 20:53:58 UTC (rev 20130)
+++ 
branches/soc-2009-jaguarandi/source/blender/render/extern/include/RE_raytrace.h 
    2009-05-10 21:02:58 UTC (rev 20131)
@@ -22,7 +22,7 @@
  *
  * The Original Code is: all of this file.
  *
- * Contributor(s): none yet.
+ * Contributor(s): André Pinto.
  *
  * ***** END GPL LICENSE BLOCK *****
  * RE_raytrace.h: ray tracing api, can be used independently from the 
renderer. 
@@ -31,84 +31,64 @@
 #ifndef RE_RAYTRACE_H
 #define RE_RAYTRACE_H
 
-/* ray types */
-#define RE_RAY_SHADOW 0
-#define RE_RAY_MIRROR 1
-#define RE_RAY_SHADOW_TRA 2
 
-/* spatial tree for raytracing acceleration */
-typedef void RayTree;
-/* abstraction of face type */
-typedef void RayFace;
+/* Internals about raycasting structures can be found on intern/raytree.h */
+typedef struct RayObject RayObject;
+typedef struct Isect Isect;
+struct DerivedMesh;
+struct Mesh;
 
-/* object numbers above this are transformed */
-#define RE_RAY_TRANSFORM_OFFS 0x8000000
+int  RayObject_raycast(RayObject *r, Isect *i);
+void RayObject_add    (RayObject *r, RayObject *);
+void RayObject_done(RayObject *r);
+void RayObject_free(RayObject *r);
 
-/* convert from pointer to index in array and back, with offset if the
- * instance is transformed */
-#define RAY_OBJECT_SET(re, obi) \
-       ((obi == NULL)? 0: \
-       ((obi - (re)->objectinstance) + ((obi->flag & R_TRANSFORMED)? 
RE_RAY_TRANSFORM_OFFS: 0)))
+/* RayObject constructors */
+RayObject* RayObject_octree_create(int ocres, int size);
 
-#define RAY_OBJECT_GET(re, i) \
-       ((re)->objectinstance + ((i >= RE_RAY_TRANSFORM_OFFS)? 
i-RE_RAY_TRANSFORM_OFFS: i))
+//RayObject* RayObject_derivedmesh_create(struct DerivedMesh*, void *ob);
+RayObject* RayObject_mesh_create(struct Mesh*, void *ob);
 
-
-/* struct for intersection data */
-typedef struct Isect {
-       float start[3];                 /* start+vec = end, in 
ray_tree_intersect */
+/* Ray Intersection */
+struct Isect
+{
+       float start[3];
        float vec[3];
-       float end[3];                   
+/*     float end[3];                    - not used */
 
-       float labda, u, v;              /* distance to hitpoint, uv weights */
-
-       RayFace *face;                  /* face is where to intersect with */
-       int ob;
-       RayFace *faceorig;              /* start face */
-       int oborig;
-       RayFace *face_last;             /* for shadow optimize, last 
intersected face */
-       int ob_last;
-
+       float labda, u, v;
+       
+       struct
+       {
+               void *ob;
+               void *face;
+/*             RayObject *obj; */
+       }
+       hit, orig;
+       
+       RayObject *last_hit;    /* last hit optimization */
+       
        short isect;                    /* which half of quad */
        short mode;                             /* RE_RAY_SHADOW, 
RE_RAY_MIRROR, RE_RAY_SHADOW_TRA */
        int lay;                                /* -1 default, set for layer 
lamps */
+       
+       int skip;                               /* RE_SKIP_CULLFACE */
 
-       /* only used externally */
        float col[4];                   /* RGBA for shadow_tra */
-
-       /* octree only */
-       RayFace *facecontr;
-       int obcontr;
-       float ddalabda;
-       short faceisect;                /* flag if facecontr was done or not */
-
-       /* custom pointer to be used in the RayCheckFunc */
+       
        void *userdata;
-} Isect;
+};
 
-/* function callbacks for face type abstraction */
-typedef void (*RayCoordsFunc)(RayFace *face,
-       float **v1, float **v2, float **v3, float **v4);
-typedef int (*RayCheckFunc)(Isect *is, int ob, RayFace *face);
-typedef float *(*RayObjectTransformFunc)(void *userdata, int ob);
+/* ray types */
+#define RE_RAY_SHADOW 0
+#define RE_RAY_MIRROR 1
+#define RE_RAY_SHADOW_TRA 2
 
-/* tree building and freeing */
-RayTree *RE_ray_tree_create(int ocres, int totface, float *min, float *max,
-       RayCoordsFunc coordfunc, RayCheckFunc checkfunc,
-       RayObjectTransformFunc transformfunc, void *userdata);

@@ Diff output truncated at 10240 characters. @@

_______________________________________________
Bf-blender-cvs mailing list
Bf-blender-cvs@blender.org
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to