svn merge -r 21301:21372 https://svn.blender.org/svnroot/bf-blender/branches/blender2...
[blender-staging.git] / source / blender / render / extern / include / RE_raytrace.h
index 8f429f7dd906f9a0eae9be6b5dbf74f981e7f83d..f2fb8c5277a0381c4c08929d9ce642636ce16a7e 100644 (file)
@@ -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. 
 #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
+#define RE_RAY_COUNTER
 
-/* 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;
+typedef struct RayCounter RayCounter;
+struct DerivedMesh;
+struct Mesh;
 
-/* object numbers above this are transformed */
-#define RE_RAY_TRANSFORM_OFFS 0x8000000
+int  RE_rayobject_raycast(RayObject *r, Isect *i);
+void RE_rayobject_add    (RayObject *r, RayObject *);
+void RE_rayobject_done(RayObject *r);
+void RE_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 */
 
-#define RAY_OBJECT_GET(re, i) \
-       ((re)->objectinstance + ((i >= RE_RAY_TRANSFORM_OFFS)? i-RE_RAY_TRANSFORM_OFFS: i))
-
-
-/* struct for intersection data */
-typedef struct Isect {
-       float start[3];                 /* start+vec = end, in ray_tree_intersect */
-       float vec[3];
-       float end[3];                   
+RayObject* RE_rayobject_octree_create(int ocres, int size);
+RayObject* RE_rayobject_instance_create(RayObject *target, float transform[][4], void *ob, void *target_ob);
 
-       float labda, u, v;              /* distance to hitpoint, uv weights */
+#define RE_rayobject_tree_create RE_rayobject_blibvh_create
+RayObject* RE_rayobject_blibvh_create(int size);       /* BLI_kdopbvh.c   */
+RayObject* RE_rayobject_bvh_create(int size);          /* rayobject_bvh.c */
+RayObject* RE_rayobject_bih_create(int size);          /* rayobject_bih.c */
 
-       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;
 
+/* Ray Intersection */
+struct Isect
+{
+       float start[3];
+       float vec[3];
+       float labda;
+
+       /* length of vec, configured by RE_rayobject_raycast */
+       int   bv_index[6];
+       float idot_axis[3];
+       float dist;
+       
+
+/*     float end[3];                    - not used */
+
+       float 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);
-
-/* 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);
-void RE_ray_tree_add_face(RayTree *tree, int ob, RayFace *face);
-void RE_ray_tree_done(RayTree *tree);
-void RE_ray_tree_free(RayTree *tree);
-
-/* intersection with full tree and single face */
-int RE_ray_tree_intersect(RayTree *tree, Isect *is);
-int RE_ray_tree_intersect_check(RayTree *tree, Isect *is, RayCheckFunc check);
-int RE_ray_face_intersection(Isect *is, RayObjectTransformFunc transformfunc,
-       RayCoordsFunc coordsfunc);
-
-/* retrieve the diameter of the tree structure, for setting intersection
-   end distance */
-float RE_ray_tree_max_size(RayTree *tree);
+       
+#ifdef RE_RAY_COUNTER
+       RayCounter *count;
+#endif
+       
+};
 
-#endif /*__RE_RAYTRACE_H__*/
+#ifdef RE_RAYCOUNTER
+
+struct RayCounter
+{
+
+       struct
+       {
+               unsigned long long test, hit;
+               
+       } intersect_rayface, raycast;
+       
+       unsigned long long rayshadow_last_hit_optimization;
+};
+
+void RE_RC_INIT (RayCounter *rc);
+void RE_RC_MERGE(RayCounter *rc, RayCounter *tmp);
+#define RE_RC_COUNT(var) (var)++
 
+#else
+
+#define RE_RC_INIT(rc)
+#define RE_RC_MERGE(dest,src)
+#define        RE_RC_COUNT(var)
+       
+#endif
+
+
+/* ray types */
+#define RE_RAY_SHADOW 0
+#define RE_RAY_MIRROR 1
+#define RE_RAY_SHADOW_TRA 2
+
+/* skip options */
+#define RE_SKIP_CULLFACE               (1 << 0)
+
+/* if using this flag then *face should be a pointer to a VlakRen */
+#define RE_SKIP_VLR_NEIGHBOUR  (1 << 1)
+
+/* TODO use: FLT_MAX? */
+#define RE_RAYTRACE_MAXDIST    1e33
+
+
+#endif /*__RE_RAYTRACE_H__*/