259 lines
8.3 KiB
C++
259 lines
8.3 KiB
C++
/*
|
|
* ***** BEGIN GPL LICENSE BLOCK *****
|
|
*
|
|
* This program is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU General Public License
|
|
* as published by the Free Software Foundation; either version 2
|
|
* of the License, or (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program; if not, write to the Free Software Foundation,
|
|
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
*
|
|
* The Original Code is Copyright (C) 2006 by Blender Foundation
|
|
* All rights reserved.
|
|
*
|
|
* The Original Code is: all of this file.
|
|
*
|
|
* Contributor(s): none yet.
|
|
*
|
|
* ***** END GPL/BL DUAL LICENSE BLOCK *****
|
|
*/
|
|
/** \file RE_shader_ext.h
|
|
* \ingroup render
|
|
*/
|
|
|
|
|
|
#ifndef __RE_SHADER_EXT_H__
|
|
#define __RE_SHADER_EXT_H__
|
|
|
|
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
|
|
/* this include is for shading and texture exports */
|
|
/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
|
|
|
|
/* localized texture result data */
|
|
/* note; tr tg tb ta has to remain in this order */
|
|
typedef struct TexResult {
|
|
float tin, tr, tg, tb, ta;
|
|
int talpha;
|
|
float *nor;
|
|
} TexResult;
|
|
|
|
/* localized shade result data */
|
|
typedef struct ShadeResult {
|
|
float combined[4];
|
|
float col[4];
|
|
float alpha, mist, z;
|
|
float emit[3];
|
|
float diff[3]; /* diffuse with no ramps, shadow, etc */
|
|
float diffshad[3]; /* diffuse with shadow */
|
|
float spec[3]; /* specular with shadow */
|
|
float shad[4]; /* shad[3] is shadow intensity */
|
|
float ao[3];
|
|
float env[3];
|
|
float indirect[3];
|
|
float refl[3];
|
|
float refr[3];
|
|
float nor[3];
|
|
float winspeed[4];
|
|
float rayhits[4];
|
|
} ShadeResult;
|
|
|
|
/* only here for quick copy */
|
|
struct ShadeInputCopy {
|
|
|
|
struct Material *mat;
|
|
struct VlakRen *vlr;
|
|
struct StrandRen *strand;
|
|
struct ObjectInstanceRen *obi;
|
|
struct ObjectRen *obr;
|
|
int facenr;
|
|
float facenor[3]; /* copy from face */
|
|
short flippednor; /* is facenor flipped? */
|
|
struct VertRen *v1, *v2, *v3; /* vertices can be in any order for quads... */
|
|
short i1, i2, i3; /* original vertex indices */
|
|
short puno;
|
|
short osatex;
|
|
float vn[3], vno[3]; /* actual render normal, and a copy to restore it */
|
|
float n1[3], n2[3], n3[3]; /* vertex normals, corrected */
|
|
int mode, mode2; /* base material mode (OR-ed result of entire node tree) */
|
|
};
|
|
|
|
typedef struct ShadeInputUV {
|
|
float dxuv[3], dyuv[3], uv[3];
|
|
const char *name;
|
|
} ShadeInputUV;
|
|
|
|
typedef struct ShadeInputCol {
|
|
float col[4];
|
|
const char *name;
|
|
} ShadeInputCol;
|
|
|
|
/* localized renderloop data */
|
|
typedef struct ShadeInput {
|
|
/* copy from face, also to extract tria from quad */
|
|
/* note it mirrors a struct above for quick copy */
|
|
|
|
struct Material *mat;
|
|
struct VlakRen *vlr;
|
|
struct StrandRen *strand;
|
|
struct ObjectInstanceRen *obi;
|
|
struct ObjectRen *obr;
|
|
int facenr;
|
|
float facenor[3]; /* copy from face */
|
|
short flippednor; /* is facenor flipped? */
|
|
struct VertRen *v1, *v2, *v3; /* vertices can be in any order for quads... */
|
|
short i1, i2, i3; /* original vertex indices */
|
|
short puno;
|
|
short osatex;
|
|
float vn[3], vno[3]; /* actual render normal, and a copy to restore it */
|
|
float n1[3], n2[3], n3[3]; /* vertex normals, corrected */
|
|
int mode, mode2; /* base material mode (OR-ed result of entire node tree) */
|
|
|
|
/* internal face coordinates */
|
|
float u, v, dx_u, dx_v, dy_u, dy_v;
|
|
float co[3], view[3], camera_co[3];
|
|
|
|
/* copy from material, keep synced so we can do memcopy */
|
|
/* current size: 23*4 */
|
|
float r, g, b;
|
|
float specr, specg, specb;
|
|
float mirr, mirg, mirb;
|
|
float ambr, ambb, ambg;
|
|
|
|
float amb, emit, ang, spectra, ray_mirror;
|
|
float alpha, refl, spec, zoffs, add;
|
|
float translucency;
|
|
/* end direct copy from material */
|
|
|
|
/* individual copies: */
|
|
int har; /* hardness */
|
|
|
|
/* texture coordinates */
|
|
float lo[3], gl[3], ref[3], orn[3], winco[3], vcol[4];
|
|
float refcol[4], displace[3];
|
|
float strandco, tang[3], nmapnorm[3], nmaptang[4], stress, winspeed[4];
|
|
float duplilo[3], dupliuv[3];
|
|
float tangents[8][4]; /* 8 = MAX_MTFACE */
|
|
|
|
ShadeInputUV uv[8]; /* 8 = MAX_MTFACE */
|
|
ShadeInputCol col[8]; /* 8 = MAX_MCOL */
|
|
int totuv, totcol, actuv, actcol;
|
|
|
|
/* dx/dy OSA coordinates */
|
|
float dxco[3], dyco[3];
|
|
float dxlo[3], dylo[3], dxgl[3], dygl[3];
|
|
float dxref[3], dyref[3], dxorn[3], dyorn[3];
|
|
float dxno[3], dyno[3], dxview, dyview;
|
|
float dxlv[3], dylv[3];
|
|
float dxwin[3], dywin[3];
|
|
float dxrefract[3], dyrefract[3];
|
|
float dxstrand, dystrand;
|
|
|
|
/* AO is a pre-process now */
|
|
float ao[3], indirect[3], env[3];
|
|
|
|
int xs, ys; /* pixel to be rendered */
|
|
int mask; /* subsample mask */
|
|
float scanco[3]; /* original scanline coordinate without jitter */
|
|
|
|
int samplenr; /* sample counter, to detect if we should do shadow again */
|
|
int depth; /* 1 or larger on raytrace shading */
|
|
int volume_depth; /* number of intersections through volumes */
|
|
|
|
/* for strand shading, normal at the surface */
|
|
float surfnor[3], surfdist;
|
|
|
|
/* from initialize, part or renderlayer */
|
|
bool do_preview; /* for nodes, in previewrender */
|
|
bool do_manage; /* color management flag */
|
|
bool use_world_space_shading;
|
|
short thread, sample; /* sample: ShadeSample array index */
|
|
short nodes; /* indicate node shading, temp hack to prevent recursion */
|
|
|
|
unsigned int lay;
|
|
int layflag, passflag, combinedflag;
|
|
short object_pass_index;
|
|
struct Material *mat_override;
|
|
|
|
#ifdef RE_RAYCOUNTER
|
|
RayCounter raycounter;
|
|
#endif
|
|
|
|
} ShadeInput;
|
|
|
|
typedef struct BakeImBufuserData {
|
|
float *displacement_buffer;
|
|
char *mask_buffer;
|
|
} BakeImBufuserData;
|
|
|
|
/* node shaders... */
|
|
struct Tex;
|
|
struct MTex;
|
|
struct ImBuf;
|
|
struct ImagePool;
|
|
struct Object;
|
|
|
|
/* this one uses nodes */
|
|
int multitex_ext(struct Tex *tex,
|
|
float texvec[3],
|
|
float dxt[3], float dyt[3],
|
|
int osatex,
|
|
struct TexResult *texres,
|
|
const short thread,
|
|
struct ImagePool *pool,
|
|
bool scene_color_manage,
|
|
const bool skip_load_image);
|
|
/* nodes disabled */
|
|
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);
|
|
/* only for internal node usage */
|
|
int multitex_nodes(struct Tex *tex, float texvec[3], float dxt[3], float dyt[3], int osatex, struct TexResult *texres,
|
|
const short thread, short which_output, struct ShadeInput *shi, struct MTex *mtex,
|
|
struct ImagePool *pool);
|
|
float RE_lamp_get_data(struct ShadeInput *shi, struct Object *lamp_obj, float col[4], float lv[3], float *dist, float shadow[4]);
|
|
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]);
|
|
|
|
float RE_fresnel_dielectric(float incoming[3], float normal[3], float eta);
|
|
|
|
/* shaded view and bake */
|
|
struct Render;
|
|
struct Image;
|
|
|
|
int RE_bake_shade_all_selected(struct Render *re, int type, struct Object *actob, short *do_update, float *progress);
|
|
struct Image *RE_bake_shade_get_image(void);
|
|
void RE_bake_ibuf_filter(struct ImBuf *ibuf, char *mask, const int filter);
|
|
void RE_bake_ibuf_normalize_displacement(struct ImBuf *ibuf, float *displacement, char *mask, float displacement_min, float displacement_max);
|
|
float RE_bake_make_derivative(struct ImBuf *ibuf, float *heights_buffer, const char *mask,
|
|
const float height_min, const float height_max,
|
|
const float fmult);
|
|
|
|
enum {
|
|
RE_OBJECT_INSTANCE_MATRIX_OB,
|
|
RE_OBJECT_INSTANCE_MATRIX_OBINV,
|
|
RE_OBJECT_INSTANCE_MATRIX_LOCALTOVIEW,
|
|
RE_OBJECT_INSTANCE_MATRIX_LOCALTOVIEWINV,
|
|
};
|
|
|
|
const float (*RE_object_instance_get_matrix(struct ObjectInstanceRen *obi, int matrix_id))[4];
|
|
|
|
float RE_object_instance_get_object_pass_index(struct ObjectInstanceRen *obi);
|
|
float RE_object_instance_get_random_id(struct ObjectInstanceRen *obi);
|
|
|
|
enum {
|
|
RE_VIEW_MATRIX,
|
|
RE_VIEWINV_MATRIX,
|
|
};
|
|
|
|
const float (*RE_render_current_get_matrix(int matrix_id))[4];
|
|
|
|
#define BAKE_RESULT_OK 0
|
|
#define BAKE_RESULT_NO_OBJECTS 1
|
|
#define BAKE_RESULT_FEEDBACK_LOOP 2
|
|
|
|
#endif /* __RE_SHADER_EXT_H__ */
|