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
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 #define RE_RAY_COUNTER
35
36 /* Internals about raycasting structures can be found on intern/raytree.h */
37 typedef struct RayObject RayObject;
38 typedef struct Isect Isect;
39 typedef struct RayCounter RayCounter;
40 struct DerivedMesh;
41 struct Mesh;
42
43 int  RE_rayobject_raycast(RayObject *r, Isect *i);
44 void RE_rayobject_add    (RayObject *r, RayObject *);
45 void RE_rayobject_done(RayObject *r);
46 void RE_rayobject_free(RayObject *r);
47
48 /* RayObject constructors */
49
50 RayObject* RE_rayobject_octree_create(int ocres, int size);
51 RayObject* RE_rayobject_instance_create(RayObject *target, float transform[][4], void *ob, void *target_ob);
52
53 #define RE_rayobject_tree_create RE_rayobject_blibvh_create
54 RayObject* RE_rayobject_blibvh_create(int size);        /* BLI_kdopbvh.c   */
55 RayObject* RE_rayobject_bvh_create(int size);           /* rayobject_bvh.c */
56 RayObject* RE_rayobject_bih_create(int size);           /* rayobject_bih.c */
57
58
59 /* Ray Intersection */
60 struct Isect
61 {
62         float start[3];
63         float vec[3];
64         float labda;
65
66         /* length of vec, configured by RE_rayobject_raycast */
67         int   bv_index[6];
68         float idot_axis[3];
69         float dist;
70         
71
72 /*      float end[3];                    - not used */
73
74         float u, v;
75         
76         struct
77         {
78                 void *ob;
79                 void *face;
80 /*              RayObject *obj; */
81         }
82         hit, orig;
83         
84         RayObject *last_hit;    /* last hit optimization */
85         
86         short isect;                    /* which half of quad */
87         short mode;                             /* RE_RAY_SHADOW, RE_RAY_MIRROR, RE_RAY_SHADOW_TRA */
88         int lay;                                /* -1 default, set for layer lamps */
89         
90         int skip;                               /* RE_SKIP_CULLFACE */
91
92         float col[4];                   /* RGBA for shadow_tra */
93
94         void *userdata;
95         
96 #ifdef RE_RAY_COUNTER
97         RayCounter *count;
98 #endif
99         
100 };
101
102 #ifdef RE_RAYCOUNTER
103
104 struct RayCounter
105 {
106
107         struct
108         {
109                 unsigned long long test, hit;
110                 
111         } intersect_rayface, raycast;
112         
113         unsigned long long rayshadow_last_hit_optimization;
114 };
115
116 void RE_RC_INIT (RayCounter *rc);
117 void RE_RC_MERGE(RayCounter *rc, RayCounter *tmp);
118 #define RE_RC_COUNT(var) (var)++
119
120 #else
121
122 #define RE_RC_INIT(rc)
123 #define RE_RC_MERGE(dest,src)
124 #define RE_RC_COUNT(var)
125         
126 #endif
127
128
129 /* ray types */
130 #define RE_RAY_SHADOW 0
131 #define RE_RAY_MIRROR 1
132 #define RE_RAY_SHADOW_TRA 2
133
134 /* skip options */
135 #define RE_SKIP_CULLFACE                (1 << 0)
136
137 /* if using this flag then *face should be a pointer to a VlakRen */
138 #define RE_SKIP_VLR_NEIGHBOUR   (1 << 1)
139
140 /* TODO use: FLT_MAX? */
141 #define RE_RAYTRACE_MAXDIST     1e33
142
143
144 #endif /*__RE_RAYTRACE_H__*/