Approximate AO: Diffuse Bounce Hack
[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 #include "RE_raytrace.h" /* For RE_RAYCOUNTER */
34 /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
35 /* this include is for shading and texture exports            */
36 /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
37
38 /* localized texture result data */
39 /* note; tr tg tb ta has to remain in this order */
40 typedef struct TexResult {
41         float tin, tr, tg, tb, ta;
42         int talpha;
43         float *nor;
44 } TexResult;
45
46 /* localized shade result data */
47 typedef struct ShadeResult 
48 {
49         float combined[4];
50         float col[4];
51         float alpha, mist, z;
52         float diff[3];          /* no ramps, shadow, etc */
53         float spec[3];
54         float shad[3];
55         float ao[3];
56         float refl[3];
57         float refr[3];
58         float nor[3];
59         float winspeed[4];
60         float rayhits[4];
61 } ShadeResult;
62
63 /* only here for quick copy */
64 struct ShadeInputCopy {
65         
66         struct Material *mat;
67         struct VlakRen *vlr;
68         struct StrandRen *strand;
69         struct ObjectInstanceRen *obi;
70         struct ObjectRen *obr;
71         int facenr;
72         float facenor[3];                               /* copy from face */
73         short flippednor;                               /* is facenor flipped? */
74         struct VertRen *v1, *v2, *v3;   /* vertices can be in any order for quads... */
75         short i1, i2, i3;                               /* original vertex indices */
76         short puno;
77         short osatex;
78         float vn[3], vno[3];                    /* actual render normal, and a copy to restore it */
79         float n1[3], n2[3], n3[3];              /* vertex normals, corrected */
80         int mode;                                               /* base material mode (OR-ed result of entire node tree) */
81 };
82
83 typedef struct ShadeInputUV {
84         float dxuv[3], dyuv[3], uv[3];
85         char *name;
86 } ShadeInputUV;
87
88 typedef struct ShadeInputCol {
89         float col[3];
90         char *name;
91 } ShadeInputCol;
92
93 /* localized renderloop data */
94 typedef struct ShadeInput
95 {
96         /* copy from face, also to extract tria from quad */
97         /* note it mirrors a struct above for quick copy */
98         
99         struct Material *mat;
100         struct VlakRen *vlr;
101         struct StrandRen *strand;
102         struct ObjectInstanceRen *obi;
103         struct ObjectRen *obr;
104         int facenr;
105         float facenor[3];                               /* copy from face */
106         short flippednor;                               /* is facenor flipped? */
107         struct VertRen *v1, *v2, *v3;   /* vertices can be in any order for quads... */
108         short i1, i2, i3;                               /* original vertex indices */
109         short puno;
110         short osatex;
111         float vn[3], vno[3];                    /* actual render normal, and a copy to restore it */
112         float n1[3], n2[3], n3[3];              /* vertex normals, corrected */
113         int mode;                                               /* base material mode (OR-ed result of entire node tree) */
114         
115         /* internal face coordinates */
116         float u, v, dx_u, dx_v, dy_u, dy_v;
117         float co[3], view[3], camera_co[3];
118         
119         /* copy from material, keep synced so we can do memcopy */
120         /* current size: 23*4 */
121         float r, g, b;
122         float specr, specg, specb;
123         float mirr, mirg, mirb;
124         float ambr, ambb, ambg;
125         
126         float amb, emit, ang, spectra, ray_mirror;
127         float alpha, refl, spec, zoffs, add;
128         float translucency;
129         /* end direct copy from material */
130         
131         /* individual copies: */
132         int har; /* hardness */
133         
134         /* texture coordinates */
135         float lo[3], gl[3], ref[3], orn[3], winco[3], sticky[3], vcol[4];
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], indirect[3];
157         
158         int xs, ys;                             /* pixel to be rendered */
159         int mask;                               /* subsample mask */
160         float scanco[3];                /* original scanline coordinate without jitter */
161         
162         int samplenr;                   /* sample counter, to detect if we should do shadow again */
163         int depth;                              /* 1 or larger on raytrace shading */
164         int volume_depth;               /* number of intersections through volumes */
165         
166         /* stored copy of original face normal (facenor) 
167          * before flipping. Used in Front/back output on geometry node */
168         float orignor[3];
169         /* for strand shading, normal at the surface */
170         float surfnor[3], surfdist;
171
172         /* from initialize, part or renderlayer */
173         short do_preview;               /* for nodes, in previewrender */
174         short thread, sample;   /* sample: ShadeSample array index */
175         short nodes;                    /* indicate node shading, temp hack to prevent recursion */
176         
177         unsigned int lay;
178         int layflag, passflag, combinedflag;
179         struct Group *light_override;
180         struct Material *mat_override;
181         
182 #ifdef RE_RAYCOUNTER
183         RayCounter raycounter;
184 #endif
185         
186 } ShadeInput;
187
188
189 /* node shaders... */
190 struct Tex;
191 int     multitex_ext(struct Tex *tex, float *texvec, float *dxt, float *dyt, int osatex, struct TexResult *texres);
192 int     multitex_thread(struct Tex *tex, float *texvec, float *dxt, float *dyt, int osatex, struct TexResult *texres, short thread, short which_output);
193
194 /* shaded view and bake */
195 struct Render;
196 struct Image;
197 struct Object;
198
199 void RE_shade_external(struct Render *re, struct ShadeInput *shi, struct ShadeResult *shr);
200 int RE_bake_shade_all_selected(struct Render *re, int type, struct Object *actob);
201 struct Image *RE_bake_shade_get_image(void);
202
203 #endif /* RE_SHADER_EXT_H */
204