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