svn merge -r 22571:22800 https://svn.blender.org/svnroot/bf-blender/trunk/blender
[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 //#define RE_RAYCOUNTER                 /* enable counters per ray, usefull for measuring raytrace structures performance */
39
40 #define RE_RAY_LCTS_MAX_SIZE    256
41 #define RT_USE_LAST_HIT                 /* last shadow hit is reused before raycasting on whole tree */
42 //#define RT_USE_HINT                   /* last hit object is reused before raycasting on whole tree */
43
44
45
46 /* Internals about raycasting structures can be found on intern/raytree.h */
47 typedef struct RayObject RayObject;
48 typedef struct Isect Isect;
49 typedef struct RayHint RayHint;
50 typedef struct RayTraceHint RayTraceHint;
51 typedef struct RayCounter RayCounter;
52
53 struct DerivedMesh;
54 struct Mesh;
55
56 int  RE_rayobject_raycast(RayObject *r, Isect *i);
57 void RE_rayobject_add    (RayObject *r, RayObject *);
58 void RE_rayobject_done(RayObject *r);
59 void RE_rayobject_free(RayObject *r);
60
61 /* Extend min/max coords so that the rayobject is inside them */
62 void RE_rayobject_merge_bb(RayObject *ob, float *min, float *max);
63
64 /* initializes an hint for optiming raycast where it is know that a ray will pass by the given BB often the origin point */
65 void RE_rayobject_hint_bb(RayObject *r, RayHint *hint, float *min, float *max);
66
67 /* initializes an hint for optiming raycast where it is know that a ray will be contained inside the given cone*/
68 /* void RE_rayobject_hint_cone(RayObject *r, RayHint *hint, float *); */
69
70 /* RayObject constructors */
71 RayObject* RE_rayobject_octree_create(int ocres, int size);
72 RayObject* RE_rayobject_instance_create(RayObject *target, float transform[][4], void *ob, void *target_ob);
73
74 RayObject* RE_rayobject_blibvh_create(int size);        /* BLI_kdopbvh.c   */
75 RayObject* RE_rayobject_bvh_create(int size);           /* raytrace/rayobject_bvh.c */
76 RayObject* RE_rayobject_vbvh_create(int size);          /* raytrace/rayobject_vbvh.c */
77 RayObject* RE_rayobject_qbvh_create(int size);          /* raytrace/rayobject_qbvh.c */
78 RayObject* RE_rayobject_svbvh_create(int size);         /* raytrace/rayobject_svbvh.c */
79 RayObject* RE_rayobject_bih_create(int size);           /* rayobject_bih.c */
80
81
82 typedef struct LCTSHint LCTSHint;
83 struct LCTSHint
84 {
85         int size;
86         RayObject *stack[RE_RAY_LCTS_MAX_SIZE];
87 };
88
89 struct RayHint
90 {
91         union
92         {
93                 LCTSHint lcts;
94         } data;
95 };
96
97
98 /* Ray Intersection */
99 struct Isect
100 {
101         float start[3];
102         float vec[3];
103         float labda;
104
105         /* length of vec, configured by RE_rayobject_raycast */
106         int   bv_index[6];
107         float idot_axis[3];
108         float dist;
109
110 /*      float end[3];                    - not used */
111
112         float u, v;
113         
114         struct
115         {
116                 void *ob;
117                 void *face;
118         }
119         hit, orig;
120         
121         RayObject *last_hit;    /* last hit optimization */
122
123 #ifdef RT_USE_HINT
124         RayTraceHint *hint, *hit_hint;
125 #endif
126         
127         short isect;                    /* which half of quad */
128         short mode;                             /* RE_RAY_SHADOW, RE_RAY_MIRROR, RE_RAY_SHADOW_TRA */
129         int lay;                                /* -1 default, set for layer lamps */
130         
131         int skip;                               /* RE_SKIP_CULLFACE */
132
133         float col[4];                   /* RGBA for shadow_tra */
134
135         void *userdata;
136         
137         RayHint *hint;
138         
139 #ifdef RE_RAYCOUNTER
140         RayCounter *raycounter;
141 #endif
142 };
143
144 /* ray types */
145 #define RE_RAY_SHADOW 0
146 #define RE_RAY_MIRROR 1
147 #define RE_RAY_SHADOW_TRA 2
148
149 /* skip options */
150 #define RE_SKIP_CULLFACE                (1 << 0)
151
152 /* if using this flag then *face should be a pointer to a VlakRen */
153 #define RE_SKIP_VLR_NEIGHBOUR                   (1 << 1)
154 #define RE_SKIP_VLR_RENDER_CHECK                (1 << 2)
155 #define RE_SKIP_VLR_NON_SOLID_MATERIAL  (1 << 3)
156
157 /* TODO use: FLT_MAX? */
158 #define RE_RAYTRACE_MAXDIST     1e33
159
160 #ifdef __cplusplus
161 }
162 #endif
163
164
165 #endif /*__RE_RAYTRACE_H__*/