* crash fix in volume render, less reliance on global R
[blender.git] / source / blender / render / intern / include / renderdatabase.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) 2006 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  */
29
30 #ifndef RENDERDATABASE_H
31 #define RENDERDATABASE_H
32
33 struct Object;
34 struct VlakRen;
35 struct VertRen;
36 struct HaloRen;
37 struct Material;
38 struct Render;
39 struct MCol;
40 struct MTFace;
41 struct CustomData;
42 struct StrandBuffer;
43 struct StrandRen;
44 struct ObjectInstanceRen;
45 struct RadFace;
46
47 #define RE_QUAD_MASK    0x7FFFFFF
48 #define RE_QUAD_OFFS    0x8000000
49
50 /* render allocates totvert/256 of these nodes, for lookup and quick alloc */
51 typedef struct VertTableNode {
52         struct VertRen *vert;
53         float *rad;
54         float *sticky;
55         float *strand;
56         float *tangent;
57         float *stress;
58         float *winspeed;
59 } VertTableNode;
60
61 typedef struct VlakTableNode {
62         struct VlakRen *vlak;
63         struct MTFace *mtface;
64         struct MCol *mcol;
65         int totmtface, totmcol;
66         float *surfnor;
67         float *tangent;
68         struct RadFace **radface;
69 } VlakTableNode;
70
71 typedef struct StrandTableNode {
72         struct StrandRen *strand;
73         float *winspeed;
74         float *surfnor;
75         float *simplify;
76         int *face;
77         struct MCol *mcol;
78         float *uv;
79         int totuv, totmcol;
80 } StrandTableNode;
81
82 /* renderdatabase.c */
83 void free_renderdata_tables(struct Render *re);
84 void free_renderdata_vertnodes(struct VertTableNode *vertnodes);
85 void free_renderdata_vlaknodes(struct VlakTableNode *vlaknodes);
86
87 void set_normalflags(struct Render *re, struct ObjectRen *obr);
88 void project_renderdata(struct Render *re, void (*projectfunc)(float *, float mat[][4], float *),  int do_pano, float xoffs, int do_buckets);
89 int clip_render_object(float boundbox[][3], float *bounds, float mat[][4]);
90
91 /* functions are not exported... so wrong names */
92
93 struct VlakRen *RE_findOrAddVlak(struct ObjectRen *obr, int nr);
94 struct VertRen *RE_findOrAddVert(struct ObjectRen *obr, int nr);
95 struct StrandRen *RE_findOrAddStrand(struct ObjectRen *obr, int nr);
96 struct HaloRen *RE_findOrAddHalo(struct ObjectRen *obr, int nr);
97 struct HaloRen *RE_inithalo(struct Render *re, struct ObjectRen *obr, struct Material *ma, float *vec, float *vec1, float *orco, float hasize,  float vectsize, int seed);
98 struct HaloRen *RE_inithalo_particle(struct Render *re, struct ObjectRen *obr, struct DerivedMesh *dm, struct Material *ma,   float *vec,   float *vec1, float *orco, float *uvco, float hasize, float vectsize, int seed);
99 struct StrandBuffer *RE_addStrandBuffer(struct ObjectRen *obr, int totvert);
100
101 struct ObjectRen *RE_addRenderObject(struct Render *re, struct Object *ob, struct Object *par, int index, int psysindex, int lay);
102 struct ObjectInstanceRen *RE_addRenderInstance(struct Render *re, struct ObjectRen *obr, struct Object *ob, struct Object *par, int index, int psysindex, float mat[][4], int lay);
103 void RE_makeRenderInstances(struct Render *re);
104 void RE_instanceTransformNormal(struct ObjectInstanceRen *obi, float *nor, float *tnor);
105
106 float *RE_vertren_get_sticky(struct ObjectRen *obr, struct VertRen *ver, int verify);
107 float *RE_vertren_get_stress(struct ObjectRen *obr, struct VertRen *ver, int verify);
108 float *RE_vertren_get_rad(struct ObjectRen *obr, struct VertRen *ver, int verify);
109 float *RE_vertren_get_strand(struct ObjectRen *obr, struct VertRen *ver, int verify);
110 float *RE_vertren_get_tangent(struct ObjectRen *obr, struct VertRen *ver, int verify);
111 float *RE_vertren_get_winspeed(struct ObjectInstanceRen *obi, struct VertRen *ver, int verify);
112
113 struct MTFace *RE_vlakren_get_tface(struct ObjectRen *obr, VlakRen *ren, int n, char **name, int verify);
114 struct MCol *RE_vlakren_get_mcol(struct ObjectRen *obr, VlakRen *ren, int n, char **name, int verify);
115 float *RE_vlakren_get_surfnor(struct ObjectRen *obr, VlakRen *ren, int verify);
116 float *RE_vlakren_get_nmap_tangent(struct ObjectRen *obr, VlakRen *ren, int verify);
117 RadFace **RE_vlakren_get_radface(struct ObjectRen *obr, VlakRen *ren, int verify);
118 int RE_vlakren_get_normal(struct Render *re, struct ObjectInstanceRen *obi, struct VlakRen *vlr, float *nor);
119
120 float *RE_strandren_get_surfnor(struct ObjectRen *obr, struct StrandRen *strand, int verify);
121 float *RE_strandren_get_uv(struct ObjectRen *obr, struct StrandRen *strand, int n, char **name, int verify);
122 struct MCol *RE_strandren_get_mcol(struct ObjectRen *obr, struct StrandRen *strand, int n, char **name, int verify);
123 float *RE_strandren_get_simplify(struct ObjectRen *obr, struct StrandRen *strand, int verify);
124 int *RE_strandren_get_face(struct ObjectRen *obr, struct StrandRen *strand, int verify);
125 float *RE_strandren_get_winspeed(struct ObjectInstanceRen *obi, struct StrandRen *strand, int verify);
126
127 struct VertRen *RE_vertren_copy(struct ObjectRen *obr, struct VertRen *ver);
128 struct VlakRen *RE_vlakren_copy(struct ObjectRen *obr, struct VlakRen *vlr);
129
130 void RE_set_customdata_names(struct ObjectRen *obr, struct CustomData *data);
131
132 /* haloren->type: flags */
133 #define HA_ONLYSKY              1
134 #define HA_VECT                 2
135 #define HA_XALPHA               4
136 #define HA_FLARECIRC    8
137
138 /* convertblender.c */
139 void init_render_world(Render *re);
140 void RE_Database_FromScene_Vectors(Render *re, struct Scene *sce);
141
142
143 #endif /* RENDERDATABASE_H */
144