8f429f7dd906f9a0eae9be6b5dbf74f981e7f83d
[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): none yet.
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 /* ray types */
35 #define RE_RAY_SHADOW 0
36 #define RE_RAY_MIRROR 1
37 #define RE_RAY_SHADOW_TRA 2
38
39 /* spatial tree for raytracing acceleration */
40 typedef void RayTree;
41 /* abstraction of face type */
42 typedef void RayFace;
43
44 /* object numbers above this are transformed */
45 #define RE_RAY_TRANSFORM_OFFS 0x8000000
46
47 /* convert from pointer to index in array and back, with offset if the
48  * instance is transformed */
49 #define RAY_OBJECT_SET(re, obi) \
50         ((obi == NULL)? 0: \
51         ((obi - (re)->objectinstance) + ((obi->flag & R_TRANSFORMED)? RE_RAY_TRANSFORM_OFFS: 0)))
52
53 #define RAY_OBJECT_GET(re, i) \
54         ((re)->objectinstance + ((i >= RE_RAY_TRANSFORM_OFFS)? i-RE_RAY_TRANSFORM_OFFS: i))
55
56
57 /* struct for intersection data */
58 typedef struct Isect {
59         float start[3];                 /* start+vec = end, in ray_tree_intersect */
60         float vec[3];
61         float end[3];                   
62
63         float labda, u, v;              /* distance to hitpoint, uv weights */
64
65         RayFace *face;                  /* face is where to intersect with */
66         int ob;
67         RayFace *faceorig;              /* start face */
68         int oborig;
69         RayFace *face_last;             /* for shadow optimize, last intersected face */
70         int ob_last;
71
72         short isect;                    /* which half of quad */
73         short mode;                             /* RE_RAY_SHADOW, RE_RAY_MIRROR, RE_RAY_SHADOW_TRA */
74         int lay;                                /* -1 default, set for layer lamps */
75
76         /* only used externally */
77         float col[4];                   /* RGBA for shadow_tra */
78
79         /* octree only */
80         RayFace *facecontr;
81         int obcontr;
82         float ddalabda;
83         short faceisect;                /* flag if facecontr was done or not */
84
85         /* custom pointer to be used in the RayCheckFunc */
86         void *userdata;
87 } Isect;
88
89 /* function callbacks for face type abstraction */
90 typedef void (*RayCoordsFunc)(RayFace *face,
91         float **v1, float **v2, float **v3, float **v4);
92 typedef int (*RayCheckFunc)(Isect *is, int ob, RayFace *face);
93 typedef float *(*RayObjectTransformFunc)(void *userdata, int ob);
94
95 /* tree building and freeing */
96 RayTree *RE_ray_tree_create(int ocres, int totface, float *min, float *max,
97         RayCoordsFunc coordfunc, RayCheckFunc checkfunc,
98         RayObjectTransformFunc transformfunc, void *userdata);
99 void RE_ray_tree_add_face(RayTree *tree, int ob, RayFace *face);
100 void RE_ray_tree_done(RayTree *tree);
101 void RE_ray_tree_free(RayTree *tree);
102
103 /* intersection with full tree and single face */
104 int RE_ray_tree_intersect(RayTree *tree, Isect *is);
105 int RE_ray_tree_intersect_check(RayTree *tree, Isect *is, RayCheckFunc check);
106 int RE_ray_face_intersection(Isect *is, RayObjectTransformFunc transformfunc,
107         RayCoordsFunc coordsfunc);
108
109 /* retrieve the diameter of the tree structure, for setting intersection
110    end distance */
111 float RE_ray_tree_max_size(RayTree *tree);
112
113 #endif /*__RE_RAYTRACE_H__*/
114