167ebc580305aa904e46fb5234ee183f0412569d
[blender.git] / source / blender / render / intern / include / renderdatabase.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) 2006 Blender Foundation.
19  * All rights reserved.
20  *
21  * The Original Code is: all of this file.
22  *
23  * Contributor(s): none yet.
24  *
25  * ***** END GPL LICENSE BLOCK *****
26  */
27
28 /** \file blender/render/intern/include/renderdatabase.h
29  *  \ingroup render
30  */
31
32
33 #ifndef __RENDERDATABASE_H__
34 #define __RENDERDATABASE_H__
35
36 #ifdef __cplusplus
37 extern "C" {
38 #endif
39
40 struct Object;
41 struct VlakRen;
42 struct VertRen;
43 struct HaloRen;
44 struct Main;
45 struct Material;
46 struct Render;
47 struct MCol;
48 struct MTFace;
49 struct CustomData;
50 struct StrandBuffer;
51 struct StrandRen;
52 struct ObjectInstanceRen;
53 struct RadFace;
54 struct Isect;
55
56 #define RE_QUAD_MASK    0x7FFFFFF
57 #define RE_QUAD_OFFS    0x8000000
58
59 /* render allocates totvert/256 of these nodes, for lookup and quick alloc */
60 typedef struct VertTableNode {
61         struct VertRen *vert;
62         float *rad;
63         float *strand;
64         float *tangent;
65         float *stress;
66         float *winspeed;
67         /* Index of vertex in source mesh (before modifiers). */
68         int *origindex;
69 } VertTableNode;
70
71 typedef struct VlakTableNode {
72         struct VlakRen *vlak;
73         struct MTFace *mtface;
74         struct MCol *mcol;
75         /* Index of mpoly in source mesh (before tessellation). */
76         int *origindex;
77         int totmtface, totmcol;
78         float *surfnor;
79         float *tangent;
80         struct RadFace **radface;
81 } VlakTableNode;
82
83 typedef struct StrandTableNode {
84         struct StrandRen *strand;
85         float *winspeed;
86         float *surfnor;
87         float *simplify;
88         int *face;
89         struct MCol *mcol;
90         float *uv;
91         int totuv, totmcol;
92 } StrandTableNode;
93
94 /* renderdatabase.c */
95 void free_renderdata_tables(struct Render *re);
96 void free_renderdata_vertnodes(struct VertTableNode *vertnodes);
97 void free_renderdata_vlaknodes(struct VlakTableNode *vlaknodes);
98
99 void project_renderdata(struct Render *re, void (*projectfunc)(const float *, float mat[4][4], float *),  bool do_pano, float xoffs, bool do_buckets);
100 int clip_render_object(float boundbox[2][3], float bounds[4], float mat[4][4]);
101
102 /* functions are not exported... so wrong names */
103
104 struct VlakRen *RE_findOrAddVlak(struct ObjectRen *obr, int nr);
105 struct VertRen *RE_findOrAddVert(struct ObjectRen *obr, int nr);
106 struct StrandRen *RE_findOrAddStrand(struct ObjectRen *obr, int nr);
107 struct HaloRen *RE_findOrAddHalo(struct ObjectRen *obr, int nr);
108 struct HaloRen *RE_inithalo(struct Render *re, struct ObjectRen *obr, struct Material *ma,
109                             const float vec[3], const float vec1[3],
110                             const float *orco, float hasize,  float vectsize, int seed);
111 struct HaloRen *RE_inithalo_particle(struct Render *re, struct ObjectRen *obr, struct DerivedMesh *dm, struct Material *ma,
112                                      const float vec[3], const float vec1[3],
113                                      const float *orco, const float *uvco, float hasize, float vectsize, int seed,
114                                      const float pa_co[3]);
115 struct StrandBuffer *RE_addStrandBuffer(struct ObjectRen *obr, int totvert);
116
117 struct ObjectRen *RE_addRenderObject(struct Render *re, struct Object *ob, struct Object *par, int index, int psysindex, int lay);
118 struct ObjectInstanceRen *RE_addRenderInstance(
119         struct Render *re, struct ObjectRen *obr, struct Object *ob, struct Object *par,
120         int index, int psysindex, float mat[4][4], int lay, const struct DupliObject *dob);
121 void RE_makeRenderInstances(struct Render *re);
122 void RE_updateRenderInstance(Render *re, ObjectInstanceRen *obi, int flag);
123
124 void RE_instance_rotate_ray_start(struct ObjectInstanceRen *obi, struct Isect *is);
125 void RE_instance_rotate_ray_dir(struct ObjectInstanceRen *obi, struct Isect *is);
126 void RE_instance_rotate_ray(struct ObjectInstanceRen *obi, struct Isect *is);
127 void RE_instance_rotate_ray_restore(struct ObjectInstanceRen *obi, struct Isect *is);
128
129 float *RE_vertren_get_stress(struct ObjectRen *obr, struct VertRen *ver, int verify);
130 float *RE_vertren_get_rad(struct ObjectRen *obr, struct VertRen *ver, int verify);
131 float *RE_vertren_get_strand(struct ObjectRen *obr, struct VertRen *ver, int verify);
132 float *RE_vertren_get_tangent(struct ObjectRen *obr, struct VertRen *ver, int verify);
133 float *RE_vertren_get_winspeed(struct ObjectInstanceRen *obi, struct VertRen *ver, int verify);
134 int *RE_vertren_get_origindex(struct ObjectRen *obr, VertRen *ver, int verify);
135
136 struct MTFace *RE_vlakren_get_tface(struct ObjectRen *obr, VlakRen *ren, int n, char **name, int verify);
137 struct MCol *RE_vlakren_get_mcol(struct ObjectRen *obr, VlakRen *ren, int n, char **name, int verify);
138 int *RE_vlakren_get_origindex(struct ObjectRen *obr, VlakRen *vlak, int verify);
139 float *RE_vlakren_get_surfnor(struct ObjectRen *obr, VlakRen *ren, int verify);
140 float *RE_vlakren_get_nmap_tangent(struct ObjectRen *obr, VlakRen *ren, int verify);
141 RadFace **RE_vlakren_get_radface(struct ObjectRen *obr, VlakRen *ren, int verify);
142 void RE_vlakren_get_normal(struct Render *re, struct ObjectInstanceRen *obi, struct VlakRen *vlr, float *nor);
143
144 float *RE_strandren_get_surfnor(struct ObjectRen *obr, struct StrandRen *strand, int verify);
145 float *RE_strandren_get_uv(struct ObjectRen *obr, struct StrandRen *strand, int n, char **name, int verify);
146 struct MCol *RE_strandren_get_mcol(struct ObjectRen *obr, struct StrandRen *strand, int n, char **name, int verify);
147 float *RE_strandren_get_simplify(struct ObjectRen *obr, struct StrandRen *strand, int verify);
148 int *RE_strandren_get_face(struct ObjectRen *obr, struct StrandRen *strand, int verify);
149 float *RE_strandren_get_winspeed(struct ObjectInstanceRen *obi, struct StrandRen *strand, int verify);
150
151 struct VertRen *RE_vertren_copy(struct ObjectRen *obr, struct VertRen *ver);
152 struct VlakRen *RE_vlakren_copy(struct ObjectRen *obr, struct VlakRen *vlr);
153
154 void RE_set_customdata_names(struct ObjectRen *obr, struct CustomData *data);
155
156 void area_lamp_vectors(struct LampRen *lar);
157
158
159 /* haloren->type: flags */
160 #define HA_ONLYSKY              1
161 #define HA_VECT                 2
162 #define HA_XALPHA               4
163 #define HA_FLARECIRC    8
164
165 /* convertblender.c */
166 void init_render_world(Render *re);
167 void RE_Database_FromScene_Vectors(Render *re, struct Main *bmain, struct Scene *sce, unsigned int lay);
168
169 #ifdef __cplusplus
170 }
171 #endif
172
173 #endif /* __RENDERDATABASE_H__ */
174