doxygen: prevent GPL license block from being parsed as doxygen comment.
[blender.git] / source / blender / render / intern / include / rayobject.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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
19  *
20  * The Original Code is Copyright (C) 2009 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  */
29
30 #ifndef RE_RAYOBJECT_H
31 #define RE_RAYOBJECT_H
32
33 #ifdef __cplusplus
34 extern "C" {
35 #endif
36
37 struct Isect;
38 struct ObjectInstanceRen;
39 struct RayHint;
40 struct VlakRen;
41
42 /* RayObject
43
44    Can be a face/triangle, bvh tree, object instance, etc. This is the
45    public API used by the renderer, see rayobject_internal.h for the
46    internal implementation details. */
47
48 typedef struct RayObject RayObject;
49
50 /* Intersection, see rayintersection.h */
51
52 int RE_rayobject_raycast(RayObject *r, struct Isect *i);
53
54 /* Acceleration Structures */
55
56 RayObject* RE_rayobject_octree_create(int ocres, int size);
57 RayObject* RE_rayobject_instance_create(RayObject *target, float transform[][4], void *ob, void *target_ob);
58 RayObject* RE_rayobject_empty_create();
59
60 RayObject* RE_rayobject_blibvh_create(int size);        /* BLI_kdopbvh.c   */
61 RayObject* RE_rayobject_vbvh_create(int size);          /* raytrace/rayobject_vbvh.c */
62 RayObject* RE_rayobject_svbvh_create(int size);         /* raytrace/rayobject_svbvh.c */
63 RayObject* RE_rayobject_qbvh_create(int size);          /* raytrace/rayobject_qbvh.c */
64
65 /* Building */
66
67 void RE_rayobject_add(RayObject *r, RayObject *);
68 void RE_rayobject_done(RayObject *r);
69 void RE_rayobject_free(RayObject *r);
70
71 void RE_rayobject_set_control(RayObject *r, void *data, int (*test_break)(void *data));
72
73 /* RayObject representing faces, all data is locally available instead
74    of referring to some external data structure, for possibly faster
75    intersection tests. */
76
77 typedef struct RayFace {
78         float v1[4], v2[4], v3[4], v4[3];
79         int quad;
80         void *ob;
81         void *face;
82 } RayFace;
83
84 #define RE_rayface_isQuad(a) ((a)->quad)
85
86 RayObject* RE_rayface_from_vlak(RayFace *face, struct ObjectInstanceRen *obi, struct VlakRen *vlr);
87
88 /* RayObject representing faces directly from a given VlakRen structure. Thus
89    allowing to save memory, but making code triangle intersection dependant on
90    render structures. */
91
92 typedef struct VlakPrimitive {
93         struct ObjectInstanceRen *ob;
94         struct VlakRen *face;
95 } VlakPrimitive;
96
97 RayObject* RE_vlakprimitive_from_vlak(VlakPrimitive *face, struct ObjectInstanceRen *obi, struct VlakRen *vlr);
98
99 /* Bounding Box */
100
101 /* extend min/max coords so that the rayobject is inside them */
102 void RE_rayobject_merge_bb(RayObject *ob, float *min, float *max);
103
104 /* initializes an hint for optiming raycast where it is know that a ray will pass by the given BB often the origin point */
105 void RE_rayobject_hint_bb(RayObject *r, struct RayHint *hint, float *min, float *max);
106
107 /* initializes an hint for optiming raycast where it is know that a ray will be contained inside the given cone*/
108 /* void RE_rayobject_hint_cone(RayObject *r, struct RayHint *hint, float *); */
109
110 /* Internals */
111
112 #include "../raytrace/rayobject_internal.h"
113
114 #ifdef __cplusplus
115 }
116 #endif
117
118 #endif
119