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