Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndre Susano Pinto <andresusanopinto@gmail.com>2009-09-14 00:59:25 +0400
committerAndre Susano Pinto <andresusanopinto@gmail.com>2009-09-14 00:59:25 +0400
commitf8657be654f89c6a4826ef8dd3e2275dfe2d4a5a (patch)
tree96c58351ce1ba0071cc6919155fb82c6de7d5ef7 /source/blender
parent732bf328c51d630bace201b40ab2bedcb314d96e (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.h41
-rw-r--r--source/blender/render/intern/include/raycounter.h66
-rw-r--r--source/blender/render/intern/include/rayobject.h51
-rw-r--r--source/blender/render/intern/raytrace/bvh.h1
-rw-r--r--source/blender/render/intern/source/rayobject.c2
-rw-r--r--source/blender/render/intern/source/rayobject_raycounter.c1
-rw-r--r--source/blender/render/intern/source/rayshade.c6
-rw-r--r--source/blender/render/intern/source/shadeinput.c5
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);
}
+ */
}
/* **************************************************************************** */