*Added support to "BB hints" (which works like a BB version of LCTS - longest common...
[blender-staging.git] / source / blender / render / extern / include / RE_raytrace.h
1 /**
2  * $Id$
3  *
4  * ***** BEGIN GPL LICENSE BLOCK *****
5  *
6  * This program is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU General Public License
8  * as published by the Free Software Foundation; either version 2
9  * of the License, or (at your option) any later version. 
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software Foundation,
18  * Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
19  *
20  * The Original Code is Copyright (C) 2007 Blender Foundation.
21  * All rights reserved.
22  *
23  * The Original Code is: all of this file.
24  *
25  * Contributor(s): AndrĂ© Pinto.
26  *
27  * ***** END GPL LICENSE BLOCK *****
28  * RE_raytrace.h: ray tracing api, can be used independently from the renderer. 
29  */
30
31 #ifndef RE_RAYTRACE_H
32 #define RE_RAYTRACE_H
33
34 #ifdef __cplusplus
35 extern "C" {
36 #endif
37
38
39 #define RE_RAY_LCTS_MAX_SIZE    256
40 #define RT_USE_LAST_HIT /* last shadow hit is reused before raycasting on whole tree */
41 //#define RT_USE_HINT                   /* last hit object is reused before raycasting on whole tree */
42
43 #define RE_RAYCOUNTER
44
45
46 #ifdef RE_RAYCOUNTER
47
48 typedef struct RayCounter RayCounter;
49 struct RayCounter
50 {
51
52         struct
53         {
54                 unsigned long long test, hit;
55                 
56         } faces, bb, raycast, raytrace_hint, rayshadow_last_hit;
57 };
58
59 /* #define RE_RC_INIT(isec, shi) (isec).count = re_rc_counter+(shi).thread */
60 #define RE_RC_INIT(isec, shi) (isec).raycounter = &((shi).raycounter)
61 void RE_RC_INFO (RayCounter *rc);
62 void RE_RC_MERGE(RayCounter *rc, RayCounter *tmp);
63 #define RE_RC_COUNT(var) (var)++
64
65 extern RayCounter re_rc_counter[];
66
67 #else
68
69 #define RE_RC_INIT(isec,shi)
70 #define RE_RC_INFO(rc)
71 #define RE_RC_MERGE(dest,src)
72 #define RE_RC_COUNT(var)
73         
74 #endif
75
76
77 /* Internals about raycasting structures can be found on intern/raytree.h */
78 typedef struct RayObject RayObject;
79 typedef struct Isect Isect;
80 typedef struct RayHint RayHint;
81 typedef struct RayTraceHint RayTraceHint;
82
83 struct DerivedMesh;
84 struct Mesh;
85
86 int  RE_rayobject_raycast(RayObject *r, Isect *i);
87 void RE_rayobject_add    (RayObject *r, RayObject *);
88 void RE_rayobject_done(RayObject *r);
89 void RE_rayobject_free(RayObject *r);
90
91 /* initializes an hint for optiming raycast where it is know that a ray will pass by the given BB often the origin point */
92 void RE_rayobject_hint_bb(RayObject *r, RayHint *hint, float *min, float *max);
93
94 /* initializes an hint for optiming raycast where it is know that a ray will be contained inside the given cone*/
95 /* void RE_rayobject_hint_cone(RayObject *r, RayHint *hint, float *); */
96
97 /* RayObject constructors */
98
99 RayObject* RE_rayobject_octree_create(int ocres, int size);
100 RayObject* RE_rayobject_instance_create(RayObject *target, float transform[][4], void *ob, void *target_ob);
101
102 RayObject* RE_rayobject_blibvh_create(int size);        /* BLI_kdopbvh.c   */
103 RayObject* RE_rayobject_bvh_create(int size);           /* raytrace/rayobject_bvh.c */
104 RayObject* RE_rayobject_vbvh_create(int size);          /* raytrace/rayobject_vbvh.c */
105 RayObject* RE_rayobject_bih_create(int size);           /* rayobject_bih.c */
106
107 typedef struct LCTSHint LCTSHint;
108 struct LCTSHint
109 {
110         int size;
111         RayObject *stack[RE_RAY_LCTS_MAX_SIZE];
112 };
113
114 struct RayHint
115 {
116         union
117         {
118                 LCTSHint lcts;
119         } data;
120 };
121
122
123 /* Ray Intersection */
124 struct Isect
125 {
126         float start[3];
127         float vec[3];
128         float labda;
129
130         /* length of vec, configured by RE_rayobject_raycast */
131         int   bv_index[6];
132         float idot_axis[3];
133         float dist;
134
135 /*      float end[3];                    - not used */
136
137         float u, v;
138         
139         struct
140         {
141                 void *ob;
142                 void *face;
143         }
144         hit, orig;
145         
146         RayObject *last_hit;    /* last hit optimization */
147
148 #ifdef RT_USE_HINT
149         RayTraceHint *hint, *hit_hint;
150 #endif
151         
152         short isect;                    /* which half of quad */
153         short mode;                             /* RE_RAY_SHADOW, RE_RAY_MIRROR, RE_RAY_SHADOW_TRA */
154         int lay;                                /* -1 default, set for layer lamps */
155         
156         int skip;                               /* RE_SKIP_CULLFACE */
157
158         float col[4];                   /* RGBA for shadow_tra */
159
160         void *userdata;
161         
162         RayHint *hint;
163         
164 #ifdef RE_RAYCOUNTER
165         RayCounter *raycounter;
166 #endif
167         
168 };
169
170 /* ray types */
171 #define RE_RAY_SHADOW 0
172 #define RE_RAY_MIRROR 1
173 #define RE_RAY_SHADOW_TRA 2
174
175 /* skip options */
176 #define RE_SKIP_CULLFACE                (1 << 0)
177
178 /* if using this flag then *face should be a pointer to a VlakRen */
179 #define RE_SKIP_VLR_NEIGHBOUR   (1 << 1)
180
181 /* TODO use: FLT_MAX? */
182 #define RE_RAYTRACE_MAXDIST     1e33
183
184 #ifdef __cplusplus
185 }
186 #endif
187
188
189 #endif /*__RE_RAYTRACE_H__*/