diff options
author | Andre Susano Pinto <andresusanopinto@gmail.com> | 2009-09-14 00:59:25 +0400 |
---|---|---|
committer | Andre Susano Pinto <andresusanopinto@gmail.com> | 2009-09-14 00:59:25 +0400 |
commit | f8657be654f89c6a4826ef8dd3e2275dfe2d4a5a (patch) | |
tree | 96c58351ce1ba0071cc6919155fb82c6de7d5ef7 /source/blender | |
parent | 732bf328c51d630bace201b40ab2bedcb314d96e (diff) |
*Ray counters (number of BB/primitive tests/hits and other raytrace counters) can now be enabled/disabled at compile-time.
#define RE_RAYCOUNTER (/source/blender/render/extern/include/RE_raytrace.h)
*Some other small organization on code
(will be disable as this only matters for testing and developping)
Diffstat (limited to 'source/blender')
-rw-r--r-- | source/blender/render/extern/include/RE_raytrace.h | 41 | ||||
-rw-r--r-- | source/blender/render/intern/include/raycounter.h | 66 | ||||
-rw-r--r-- | source/blender/render/intern/include/rayobject.h | 51 | ||||
-rw-r--r-- | source/blender/render/intern/raytrace/bvh.h | 1 | ||||
-rw-r--r-- | source/blender/render/intern/source/rayobject.c | 2 | ||||
-rw-r--r-- | source/blender/render/intern/source/rayobject_raycounter.c | 1 | ||||
-rw-r--r-- | source/blender/render/intern/source/rayshade.c | 6 | ||||
-rw-r--r-- | source/blender/render/intern/source/shadeinput.c | 5 |
8 files changed, 125 insertions, 48 deletions
diff --git a/source/blender/render/extern/include/RE_raytrace.h b/source/blender/render/extern/include/RE_raytrace.h index 8fc3a96ca99..0bdecb333e8 100644 --- a/source/blender/render/extern/include/RE_raytrace.h +++ b/source/blender/render/extern/include/RE_raytrace.h @@ -35,43 +35,12 @@ extern "C" { #endif +//#define RE_RAYCOUNTER /* enable counters per ray, usefull for measuring raytrace structures performance */ #define RE_RAY_LCTS_MAX_SIZE 256 #define RT_USE_LAST_HIT /* last shadow hit is reused before raycasting on whole tree */ //#define RT_USE_HINT /* last hit object is reused before raycasting on whole tree */ -#define RE_RAYCOUNTER - - -#ifdef RE_RAYCOUNTER - -typedef struct RayCounter RayCounter; -struct RayCounter -{ - - struct - { - unsigned long long test, hit; - - } faces, bb, simd_bb, raycast, raytrace_hint, rayshadow_last_hit; -}; - -/* #define RE_RC_INIT(isec, shi) (isec).count = re_rc_counter+(shi).thread */ -#define RE_RC_INIT(isec, shi) (isec).raycounter = &((shi).raycounter) -void RE_RC_INFO (RayCounter *rc); -void RE_RC_MERGE(RayCounter *rc, RayCounter *tmp); -#define RE_RC_COUNT(var) (var)++ - -extern RayCounter re_rc_counter[]; - -#else - -#define RE_RC_INIT(isec,shi) -#define RE_RC_INFO(rc) -#define RE_RC_MERGE(dest,src) -#define RE_RC_COUNT(var) - -#endif /* Internals about raycasting structures can be found on intern/raytree.h */ @@ -79,6 +48,7 @@ typedef struct RayObject RayObject; typedef struct Isect Isect; typedef struct RayHint RayHint; typedef struct RayTraceHint RayTraceHint; +typedef struct RayCounter RayCounter; struct DerivedMesh; struct Mesh; @@ -95,17 +65,17 @@ void RE_rayobject_hint_bb(RayObject *r, RayHint *hint, float *min, float *max); /* void RE_rayobject_hint_cone(RayObject *r, RayHint *hint, float *); */ /* RayObject constructors */ - RayObject* RE_rayobject_octree_create(int ocres, int size); RayObject* RE_rayobject_instance_create(RayObject *target, float transform[][4], void *ob, void *target_ob); RayObject* RE_rayobject_blibvh_create(int size); /* BLI_kdopbvh.c */ RayObject* RE_rayobject_bvh_create(int size); /* raytrace/rayobject_bvh.c */ RayObject* RE_rayobject_vbvh_create(int size); /* raytrace/rayobject_vbvh.c */ -RayObject* RE_rayobject_qbvh_create(int size); /* raytrace/rayobject_vbvh.c */ -RayObject* RE_rayobject_svbvh_create(int size); /* raytrace/rayobject_vbvh.c */ +RayObject* RE_rayobject_qbvh_create(int size); /* raytrace/rayobject_qbvh.c */ +RayObject* RE_rayobject_svbvh_create(int size); /* raytrace/rayobject_svbvh.c */ RayObject* RE_rayobject_bih_create(int size); /* rayobject_bih.c */ + typedef struct LCTSHint LCTSHint; struct LCTSHint { @@ -166,7 +136,6 @@ struct Isect #ifdef RE_RAYCOUNTER RayCounter *raycounter; #endif - }; /* ray types */ diff --git a/source/blender/render/intern/include/raycounter.h b/source/blender/render/intern/include/raycounter.h new file mode 100644 index 00000000000..06579b366ee --- /dev/null +++ b/source/blender/render/intern/include/raycounter.h @@ -0,0 +1,66 @@ +/** + * $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 ***** + */ +#ifndef RE_RAYCOUNTER_H +#define RE_RAYCOUNTER_H + +#include "RE_raytrace.h" + + +#ifdef RE_RAYCOUNTER + +typedef struct RayCounter RayCounter; +struct RayCounter +{ + + struct + { + unsigned long long test, hit; + + } faces, bb, simd_bb, raycast, raytrace_hint, rayshadow_last_hit; +}; + +/* #define RE_RC_INIT(isec, shi) (isec).count = re_rc_counter+(shi).thread */ +#define RE_RC_INIT(isec, shi) (isec).raycounter = &((shi).raycounter) +void RE_RC_INFO (RayCounter *rc); +void RE_RC_MERGE(RayCounter *rc, RayCounter *tmp); +#define RE_RC_COUNT(var) (var)++ + +extern RayCounter re_rc_counter[]; + +#else + +# define RE_RC_INIT(isec,shi) +# define RE_RC_INFO(rc) +# define RE_RC_MERGE(dest,src) +# define RE_RC_COUNT(var) + +#endif + + +#endif diff --git a/source/blender/render/intern/include/rayobject.h b/source/blender/render/intern/include/rayobject.h index 36b0d2692c0..2a9b42d22fe 100644 --- a/source/blender/render/intern/include/rayobject.h +++ b/source/blender/render/intern/include/rayobject.h @@ -67,7 +67,7 @@ extern "C" { 0 Self (reserved for each structure) 1 RayFace 2 RayObject (generic with API callbacks) - 3 unused + 3 RayObject_Vlak 0 means it's reserved and has it own meaning inside each ray acceleration structure (this way each structure can use the allign offset to determine if a node represents a @@ -77,6 +77,35 @@ extern "C" { described on RE_raytrace.h */ +/* used to align a given ray object */ +#define RE_rayobject_align(o) ((RayObject*)(((intptr_t)o)&(~3))) + +/* used to unalign a given ray object */ +#define RE_rayobject_unalignRayFace(o) ((RayObject*)(((intptr_t)o)|1)) +#define RE_rayobject_unalignRayAPI(o) ((RayObject*)(((intptr_t)o)|2)) +#define RE_rayobject_unalignRayVlak(o) ((RayObject*)(((intptr_t)o)|3)) + +/* used to test the type of ray object */ +#define RE_rayobject_isAligned(o) ((((intptr_t)o)&3) == 0) +#define RE_rayobject_isRayFace(o) ((((intptr_t)o)&3) == 1) +#define RE_rayobject_isRayAPI(o) ((((intptr_t)o)&3) == 2) +#define RE_rayobject_isRayVlak(o) ((((intptr_t)o)&3) == 3) + + +/* + * This ray object represents faces directly from a given VlakRen structure. + * Thus allowing to save memory, but making code dependant on render structures +typedef struct RayVlak +{ + struct ObjectInstanceRen *ob; + struct VlakRen *face; +} RayVlak; + */ + +/* + * This ray object represents a triangle or a quad face. + * All data needed to realize intersection is "localy" available. + */ typedef struct RayFace { float v1[4], v2[4], v3[4], v4[3]; @@ -87,7 +116,15 @@ typedef struct RayFace } RayFace; #define RE_rayface_isQuad(a) ((a)->quad) +/* Loads a VlakRen on a RayFace */ +void RE_rayface_from_vlak(RayFace *face, ObjectInstanceRen *obi, VlakRen *vlr); + + +/* + * This rayobject represents a generic object. With it's own callbacks for raytrace operations. + * It's suitable to implement things like LOD. + */ struct RayObject { struct RayObjectAPI *api; @@ -114,18 +151,8 @@ typedef struct RayObjectAPI } RayObjectAPI; -#define RE_rayobject_align(o) ((RayObject*)(((intptr_t)o)&(~3))) -#define RE_rayobject_unalignRayFace(o) ((RayObject*)(((intptr_t)o)|1)) -#define RE_rayobject_unalignRayAPI(o) ((RayObject*)(((intptr_t)o)|2)) -#define RE_rayobject_isAligned(o) ((((intptr_t)o)&3) == 0) -#define RE_rayobject_isRayFace(o) ((((intptr_t)o)&3) == 1) -#define RE_rayobject_isRayAPI(o) ((((intptr_t)o)&3) == 2) -/* - * Loads a VlakRen on a RayFace - */ -void RE_rayface_from_vlak(RayFace *face, ObjectInstanceRen *obi, VlakRen *vlr); /* * Extend min/max coords so that the rayobject is inside them @@ -152,6 +179,8 @@ int RE_rayobject_bb_intersect_test(const Isect *i, const float *bb); /* same as float RE_rayobject_cost(RayObject *r); + + #define ISECT_EPSILON ((float)FLT_EPSILON) diff --git a/source/blender/render/intern/raytrace/bvh.h b/source/blender/render/intern/raytrace/bvh.h index 7d3479e5331..f0302ddba3a 100644 --- a/source/blender/render/intern/raytrace/bvh.h +++ b/source/blender/render/intern/raytrace/bvh.h @@ -27,6 +27,7 @@ * ***** END GPL LICENSE BLOCK ***** */ #include "rayobject.h" +#include "raycounter.h" #include "MEM_guardedalloc.h" #include "rayobject_rtbuild.h" #include "rayobject_hint.h" diff --git a/source/blender/render/intern/source/rayobject.c b/source/blender/render/intern/source/rayobject.c index 73711272935..05308361fdb 100644 --- a/source/blender/render/intern/source/rayobject.c +++ b/source/blender/render/intern/source/rayobject.c @@ -34,7 +34,7 @@ #include "RE_raytrace.h" #include "render_types.h" #include "rayobject.h" - +#include "raycounter.h" /* * Determines the distance that the ray must travel to hit the bounding volume of the given node diff --git a/source/blender/render/intern/source/rayobject_raycounter.c b/source/blender/render/intern/source/rayobject_raycounter.c index b47df607c10..a82a21348c1 100644 --- a/source/blender/render/intern/source/rayobject_raycounter.c +++ b/source/blender/render/intern/source/rayobject_raycounter.c @@ -27,6 +27,7 @@ * ***** END GPL LICENSE BLOCK ***** */ #include "rayobject.h" +#include "raycounter.h" #ifdef RE_RAYCOUNTER diff --git a/source/blender/render/intern/source/rayshade.c b/source/blender/render/intern/source/rayshade.c index 8733b89b88a..7e2cb4c6992 100644 --- a/source/blender/render/intern/source/rayshade.c +++ b/source/blender/render/intern/source/rayshade.c @@ -58,6 +58,7 @@ #include "RE_raytrace.h" #include "rayobject.h" +#include "raycounter.h" #define RAY_TRA 1 #define RAY_TRAFLIP 2 @@ -338,6 +339,9 @@ void makeraytree(Render *re) { float min[3], max[3], sub[3]; int i; + + re->i.infostr= "Make raytree"; + re->stats_draw(re->sdh, &re->i); BENCH(makeraytree_single(re), tree_build); @@ -351,6 +355,8 @@ void makeraytree(Render *re) sub[i] = max[i]-min[i]; } re->maxdist = sqrt( sub[0]*sub[0] + sub[1]*sub[1] + sub[2]*sub[2] ); + + re->i.infostr= "Raytree finished"; } diff --git a/source/blender/render/intern/source/shadeinput.c b/source/blender/render/intern/source/shadeinput.c index 0da2f0b1c9d..496d187cf05 100644 --- a/source/blender/render/intern/source/shadeinput.c +++ b/source/blender/render/intern/source/shadeinput.c @@ -44,6 +44,7 @@ #include "BKE_node.h" /* local include */ +#include "raycounter.h" #include "renderpipeline.h" #include "render_types.h" #include "renderdatabase.h" @@ -175,7 +176,9 @@ void shade_input_do_shade(ShadeInput *shi, ShadeResult *shr) float alpha; /* ------ main shading loop -------- */ +#ifdef RE_RAYCOUNTER memset(&shi->raycounter, 0, sizeof(shi->raycounter)); +#endif if(shi->mat->nodetree && shi->mat->use_nodes) { ntreeShaderExecTree(shi->mat->nodetree, shi, shr); @@ -221,6 +224,7 @@ void shade_input_do_shade(ShadeInput *shi, ShadeResult *shr) shr->z= -shi->co[2]; /* RAYHITS */ +/* if(1 || shi->passflag & SCE_PASS_RAYHITS) { shr->rayhits[0] = (float)shi->raycounter.faces.test; @@ -229,6 +233,7 @@ void shade_input_do_shade(ShadeInput *shi, ShadeResult *shr) shr->rayhits[3] = 1.0; RE_RC_MERGE(&re_rc_counter[shi->thread], &shi->raycounter); } + */ } /* **************************************************************************** */ |