style cleanup
[blender.git] / source / blender / render / intern / raytrace / rayobject_internal.h
1 /*
2  * ***** BEGIN GPL LICENSE BLOCK *****
3  *
4  * This program is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU General Public License
6  * as published by the Free Software Foundation; either version 2
7  * of the License, or (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software Foundation,
16  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17  *
18  * The Original Code is Copyright (C) 2009 Blender Foundation.
19  * All rights reserved.
20  *
21  * The Original Code is: all of this file.
22  *
23  * Contributor(s): AndrĂ© Pinto.
24  *
25  * ***** END GPL LICENSE BLOCK *****
26  */
27
28 #ifndef __RAYOBJECT_INTERNAL_H__
29 #define __RAYOBJECT_INTERNAL_H__
30
31 /** \file blender/render/intern/raytrace/rayobject_internal.h
32  *  \ingroup render
33  */
34
35 #ifdef __cplusplus
36 extern "C" {
37 #endif
38
39 /* RayObjectControl
40  *
41  * This class is intended as a place holder for control, configuration of the
42  * rayobject like:
43  *      - stop building (TODO maybe when porting build to threads this could be
44  *    implemented with some thread_cancel function)
45  *  - max number of threads and threads callback to use during build
46  *      ...
47  */     
48
49 typedef int  (*RE_rayobjectcontrol_test_break_callback)(void *data);
50
51 typedef struct RayObjectControl {
52         void *data;
53         RE_rayobjectcontrol_test_break_callback test_break;
54 } RayObjectControl;
55
56 /* Returns true if for some reason a heavy processing function should stop
57  * (eg.: user asked to stop during a tree a build)
58  */
59
60 int RE_rayobjectcontrol_test_break(RayObjectControl *c);
61
62 /* RayObject
63  *
64  *  A ray object is everything where we can cast rays like:
65  *      * a face/triangle
66  *      * an octree
67  *      * a bvh tree
68  *      * an octree of bvh's
69  *      * a bvh of bvh's
70  *
71  *
72  *  All types of RayObjects can be created by implementing the
73  *  callbacks of the RayObject.
74  *
75  *  Due to high computing time evolved with casting on faces
76  *  there is a special type of RayObject (named RayFace)
77  *  which won't use callbacks like other generic nodes.
78  *
79  *  In order to allow a mixture of RayFace+RayObjects,
80  *  all RayObjects must be 4byte aligned, allowing us to use the
81  *  2 least significant bits (with the mask 0x03) to define the
82  *  type of RayObject.
83  *
84  *  This leads to 4 possible types of RayObject:
85  *
86  *   addr&3  - type of object
87  *      0       Self (reserved for each structure)
88  *      1       RayFace (tri/quad primitive)
89  *      2       RayObject (generic with API callbacks)
90  *      3       VlakPrimitive
91  *              (vlak primitive - to be used when we have a vlak describing the data
92  *               eg.: on render code)
93  *
94  *  0 means it's reserved and has it own meaning inside each ray acceleration structure
95  *  (this way each structure can use the align offset to determine if a node represents a
96  *   RayObject primitive, which can be used to save memory)
97  */
98
99 /* used to test the type of ray object */
100 #define RE_rayobject_isAligned(o)               ((((intptr_t)o)&3) == 0)
101 #define RE_rayobject_isRayFace(o)               ((((intptr_t)o)&3) == 1)
102 #define RE_rayobject_isRayAPI(o)                ((((intptr_t)o)&3) == 2)
103 #define RE_rayobject_isVlakPrimitive(o) ((((intptr_t)o)&3) == 3)
104
105 /* used to align a given ray object */
106 #define RE_rayobject_align(o)                                   ((RayObject *)(((intptr_t)o)&(~3)))
107
108 /* used to unalign a given ray object */
109 #define RE_rayobject_unalignRayFace(o)                  ((RayObject *)(((intptr_t)o)|1))
110 #define RE_rayobject_unalignRayAPI(o)                   ((RayObject *)(((intptr_t)o)|2))
111 #define RE_rayobject_unalignVlakPrimitive(o)    ((RayObject *)(((intptr_t)o)|3))
112
113 /*
114  * This rayobject represents a generic object. With it's own callbacks for raytrace operations.
115  * It's suitable to implement things like LOD.
116  */
117
118 struct RayObject {
119         struct RayObjectAPI *api;
120         struct RayObjectControl control;
121 };
122
123 typedef int  (*RE_rayobject_raycast_callback)(RayObject *, struct Isect *);
124 typedef void (*RE_rayobject_add_callback)(RayObject *raytree, RayObject *rayobject);
125 typedef void (*RE_rayobject_done_callback)(RayObject *);
126 typedef void (*RE_rayobject_free_callback)(RayObject *);
127 typedef void (*RE_rayobject_merge_bb_callback)(RayObject *, float min[3], float max[3]);
128 typedef float (*RE_rayobject_cost_callback)(RayObject *);
129 typedef void (*RE_rayobject_hint_bb_callback)(RayObject *, struct RayHint *, float min[3], float max[3]);
130
131 typedef struct RayObjectAPI {
132         RE_rayobject_raycast_callback   raycast;
133         RE_rayobject_add_callback               add;
134         RE_rayobject_done_callback              done;
135         RE_rayobject_free_callback              free;
136         RE_rayobject_merge_bb_callback  bb;
137         RE_rayobject_cost_callback              cost;
138         RE_rayobject_hint_bb_callback   hint_bb;
139 } RayObjectAPI;
140
141 /*
142  * Returns the expected cost of raycast on this node, primitives have a cost of 1
143  */
144 float RE_rayobject_cost(RayObject *r);
145
146 /*
147  * This function differs from RE_rayobject_raycast
148  * RE_rayobject_intersect does NOT perform last-hit optimization
149  * So this is probably a function to call inside raytrace structures
150  */
151 int RE_rayobject_intersect(RayObject *r, struct Isect *i);
152
153 #ifdef __cplusplus
154 }
155 #endif
156
157 #endif  /* __RAYOBJECT_INTERNAL_H__ */