e8403053e0bd34d79419ce526745908394b86839
[blender.git] / source / blender / render / extern / include / RE_shader_ext.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 by 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/BL DUAL LICENSE BLOCK *****
28  */
29
30 #ifndef RE_SHADER_EXT_H
31 #define RE_SHADER_EXT_H
32
33 /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
34 /* this include is for shading and texture exports            */
35 /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
36
37 /* localized texture result data */
38 /* note; tr tg tb ta has to remain in this order */
39 typedef struct TexResult {
40         float tin, tr, tg, tb, ta;
41         int talpha;
42         float *nor;
43 } TexResult;
44
45 /* localized shade result data */
46 typedef struct ShadeResult 
47 {
48         float combined[4];
49         float col[4];
50         float alpha, mist, z;
51         float diff[3];          /* no ramps, shadow, etc */
52         float spec[3];
53         float shad[3];
54         float ao[3];
55         float refl[3];
56         float refr[3];
57         float nor[3];
58         float rad[3];
59         float winspeed[4];
60 } ShadeResult;
61
62 /* only here for quick copy */
63 struct ShadeInputCopy {
64         
65         struct Material *mat;
66         struct VlakRen *vlr;
67         struct StrandRen *strand;
68         struct ObjectInstanceRen *obi;
69         struct ObjectRen *obr;
70         int facenr;
71         float facenor[3];                               /* copy from face */
72         short flippednor;                               /* is facenor flipped? */
73         struct VertRen *v1, *v2, *v3;   /* vertices can be in any order for quads... */
74         short i1, i2, i3;                               /* original vertex indices */
75         short puno;
76         short osatex;
77         float vn[3], vno[3];                    /* actual render normal, and a copy to restore it */
78         float n1[3], n2[3], n3[3];              /* vertex normals, corrected */
79         int mode;                                               /* base material mode (OR-ed result of entire node tree) */
80 };
81
82 typedef struct ShadeInputUV {
83         float dxuv[3], dyuv[3], uv[3];
84         char *name;
85 } ShadeInputUV;
86
87 typedef struct ShadeInputCol {
88         float col[3];
89         char *name;
90 } ShadeInputCol;
91
92 /* localized renderloop data */
93 typedef struct ShadeInput
94 {
95         /* copy from face, also to extract tria from quad */
96         /* note it mirrors a struct above for quick copy */
97         
98         struct Material *mat;
99         struct VlakRen *vlr;
100         struct StrandRen *strand;
101         struct ObjectInstanceRen *obi;
102         struct ObjectRen *obr;
103         int facenr;
104         float facenor[3];                               /* copy from face */
105         short flippednor;                               /* is facenor flipped? */
106         struct VertRen *v1, *v2, *v3;   /* vertices can be in any order for quads... */
107         short i1, i2, i3;                               /* original vertex indices */
108         short puno;
109         short osatex;
110         float vn[3], vno[3];                    /* actual render normal, and a copy to restore it */
111         float n1[3], n2[3], n3[3];              /* vertex normals, corrected */
112         int mode;                                               /* base material mode (OR-ed result of entire node tree) */
113         
114         /* internal face coordinates */
115         float u, v, dx_u, dx_v, dy_u, dy_v;
116         float co[3], view[3];
117         
118         /* copy from material, keep synced so we can do memcopy */
119         /* current size: 23*4 */
120         float r, g, b;
121         float specr, specg, specb;
122         float mirr, mirg, mirb;
123         float ambr, ambb, ambg;
124         
125         float amb, emit, ang, spectra, ray_mirror;
126         float alpha, refl, spec, zoffs, add;
127         float translucency;
128         /* end direct copy from material */
129         
130         /* individual copies: */
131         int har; /* hardness */
132         float layerfac;
133         
134         /* texture coordinates */
135         float lo[3], gl[3], ref[3], orn[3], winco[3], sticky[3], vcol[4], rad[3];
136         float refcol[4], displace[3];
137         float strandco, tang[3], nmaptang[3], stress, winspeed[4];
138         float duplilo[3], dupliuv[3];
139
140         ShadeInputUV uv[8];   /* 8 = MAX_MTFACE */
141         ShadeInputCol col[8]; /* 8 = MAX_MCOL */
142         int totuv, totcol, actuv, actcol;
143         
144         /* dx/dy OSA coordinates */
145         float dxco[3], dyco[3];
146         float dxlo[3], dylo[3], dxgl[3], dygl[3];
147         float dxref[3], dyref[3], dxorn[3], dyorn[3];
148         float dxno[3], dyno[3], dxview, dyview;
149         float dxlv[3], dylv[3];
150         float dxwin[3], dywin[3];
151         float dxsticky[3], dysticky[3];
152         float dxrefract[3], dyrefract[3];
153         float dxstrand, dystrand;
154         
155         /* AO is a pre-process now */
156         float ao[3];
157         
158         int xs, ys;                             /* pixel to be rendered */
159         int mask;                               /* subsample mask */
160         
161         int samplenr;                   /* sample counter, to detect if we should do shadow again */
162         int depth;                              /* 1 or larger on raytrace shading */
163         
164         /* stored copy of original face normal (facenor) 
165          * before flipping. Used in Front/back output on geometry node */
166         float orignor[3];
167         /* for strand shading, normal at the surface */
168         float surfnor[3], surfdist;
169
170         /* from initialize, part or renderlayer */
171         short do_preview;               /* for nodes, in previewrender */
172         short thread, sample;   /* sample: ShadeSample array index */
173         
174         unsigned int lay;
175         int layflag, passflag, combinedflag;
176         struct Group *light_override;
177         struct Material *mat_override;
178         
179 } ShadeInput;
180
181
182 /* node shaders... */
183 struct Tex;
184 int     multitex_ext(struct Tex *tex, float *texvec, float *dxt, float *dyt, int osatex, struct TexResult *texres);
185
186 /* shaded view and bake */
187 struct Render;
188 struct Image;
189 struct Object;
190
191 void RE_shade_external(struct Render *re, struct ShadeInput *shi, struct ShadeResult *shr);
192 int RE_bake_shade_all_selected(struct Render *re, int type, struct Object *actob);
193 struct Image *RE_bake_shade_get_image(void);
194
195 #endif /* RE_SHADER_EXT_H */
196