Revision: 20510 http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=20510 Author: jaguarandi Date: 2009-05-30 00:55:06 +0200 (Sat, 30 May 2009)
Log Message: ----------- Linked bvhkdop with raytrace api Modified Paths: -------------- branches/soc-2009-jaguarandi/source/blender/render/intern/source/rayobject_octree.c Added Paths: ----------- branches/soc-2009-jaguarandi/source/blender/render/intern/source/rayobject_bvh.c Added: branches/soc-2009-jaguarandi/source/blender/render/intern/source/rayobject_bvh.c =================================================================== --- branches/soc-2009-jaguarandi/source/blender/render/intern/source/rayobject_bvh.c (rev 0) +++ branches/soc-2009-jaguarandi/source/blender/render/intern/source/rayobject_bvh.c 2009-05-29 22:55:06 UTC (rev 20510) @@ -0,0 +1,124 @@ +/** + * $Id$ + * + * ***** BEGIN GPL LICENSE BLOCK ***** + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * The Original Code is Copyright (C) 2009 Blender Foundation. + * All rights reserved. + * + * The Original Code is: all of this file. + * + * Contributor(s): André Pinto. + * + * ***** END GPL LICENSE BLOCK ***** + */ +#include <assert.h> + +#include "MEM_guardedalloc.h" +#include "BKE_utildefines.h" +#include "BLI_kdopbvh.h" +#include "BLI_arithb.h" +#include "RE_raytrace.h" +#include "render_types.h" +#include "rayobject.h" + +static int RayObject_bvh_intersect(RayObject *o, Isect *isec); +static void RayObject_bvh_add(RayObject *o, RayObject *ob); +static void RayObject_bvh_done(RayObject *o); +static void RayObject_bvh_free(RayObject *o); +static void RayObject_bvh_bb(RayObject *o, float *min, float *max); + +static RayObjectAPI bvh_api = +{ + RayObject_bvh_intersect, + RayObject_bvh_add, + RayObject_bvh_done, + RayObject_bvh_free, + RayObject_bvh_bb +}; + +typedef struct BVHObject +{ + RayObject rayobj; + BVHTree *bvh; + +} BVHObject; + + +RayObject *RE_rayobject_bvh_create(int size) +{ + BVHObject *obj= (BVHObject*)MEM_callocN(sizeof(BVHObject), "BVHObject"); + assert( RayObject_isAligned(obj) ); /* RayObject API assumes real data to be 4-byte aligned */ + + obj->rayobj.api = &bvh_api; + obj->bvh = BLI_bvhtree_new(size, 0.0, 4, 6); + + return RayObject_unalign((RayObject*) obj); +} + +static void bvh_callback(void *userdata, int index, const BVHTreeRay *ray, BVHTreeRayHit *hit) +{ + Isect *isect = (Isect*)userdata; + RayObject *face = (RayObject*)index; + + if(RE_rayobject_intersect(face,isect)) + { + hit->index = index; +// hit.distance = TODO + } +} + +static int RayObject_bvh_intersect(RayObject *o, Isect *isec) +{ + BVHObject *obj = (BVHObject*)o; + float dir[3]; + VECCOPY( dir, isec->vec ); + Normalize( dir ); + + //BLI_bvhtree_ray_cast returns -1 on non hit (in case we dont give a Hit structure + return BLI_bvhtree_ray_cast(obj->bvh, isec->start, dir, 0.0, NULL, bvh_callback, isec) != -1; +} + +static void RayObject_bvh_add(RayObject *o, RayObject *ob) +{ + BVHObject *obj = (BVHObject*)o; + float min_max[6]; + INIT_MINMAX(min_max, min_max+3); + RE_rayobject_merge_bb(ob, min_max, min_max+3); + BLI_bvhtree_insert(obj->bvh, (int)ob, min_max, 2 ); +} + +static void RayObject_bvh_done(RayObject *o) +{ + BVHObject *obj = (BVHObject*)o; + BLI_bvhtree_balance(obj->bvh); +} + +static void RayObject_bvh_free(RayObject *o) +{ + BVHObject *obj = (BVHObject*)o; + + if(obj->bvh) + BLI_bvhtree_free(obj->bvh); + + MEM_freeN(obj); +} + +static void RayObject_bvh_bb(RayObject *o, float *min, float *max) +{ + assert(0); +} Property changes on: branches/soc-2009-jaguarandi/source/blender/render/intern/source/rayobject_bvh.c ___________________________________________________________________ Name: svn:keywords + Author Date Id Revision Name: svn:eol-style + native Modified: branches/soc-2009-jaguarandi/source/blender/render/intern/source/rayobject_octree.c =================================================================== --- branches/soc-2009-jaguarandi/source/blender/render/intern/source/rayobject_octree.c 2009-05-29 21:32:52 UTC (rev 20509) +++ branches/soc-2009-jaguarandi/source/blender/render/intern/source/rayobject_octree.c 2009-05-29 22:55:06 UTC (rev 20510) @@ -694,7 +694,7 @@ if( (ov->ocx & ocval.ocx) && (ov->ocy & ocval.ocy) && (ov->ocz & ocval.ocz) ) { - if( RE_rayobject_raycast(face,is) ) + if( RE_rayobject_intersect(face,is) ) if(isect.labda<is->labda) { *is= isect; found= 1; _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org http://lists.blender.org/mailman/listinfo/bf-blender-cvs