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