/*
 * $Id$ 
 *
 * ***** 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) 2001-2002 by NaN Holding BV.
 * All rights reserved.
 *
 * The Original Code is: all of this file.
 *
 * Contributor(s): none yet.
 *
 * ***** END GPL LICENSE BLOCK *****
 */
#ifndef DNA_TEXTURE_TYPES_H
#define DNA_TEXTURE_TYPES_H

/** \file DNA_texture_types.h
 *  \ingroup DNA
 *  \since mar-2001
 *  \author nzc
 */

#include "DNA_ID.h"
#include "DNA_image_types.h" /* ImageUser */

#ifdef __cplusplus
extern "C" {
#endif

struct AnimData;
struct Ipo;
struct PluginTex;
struct ColorBand;
struct EnvMap;
struct Object;
struct Tex;
struct Image;
struct PreviewImage;
struct ImBuf;
struct CurveMapping;

typedef struct MTex {

	short texco, mapto, maptoneg, blendtype;
	struct Object *object;
	struct Tex *tex;
	char uvname[32];
	
	char projx, projy, projz, mapping;
	float ofs[3], size[3], rot;
	
	short texflag, colormodel, pmapto, pmaptoneg;
	short normapspace, which_output;
	char brush_map_mode, pad[7];
	float r, g, b, k;
	float def_var, rt;
	
	/* common */
	float colfac, varfac;
	
	/* material */
	float norfac, dispfac, warpfac;
	float colspecfac, mirrfac, alphafac;
	float difffac, specfac, emitfac, hardfac;
	float raymirrfac, translfac, ambfac;
	float colemitfac, colreflfac, coltransfac;
	float densfac, scatterfac, reflfac;

	/* particles */
	float timefac, lengthfac, clumpfac, dampfac;
	float kinkfac, roughfac, padensfac, gravityfac;
	float lifefac, sizefac, ivelfac, fieldfac;

	/* lamp */
	float shadowfac;

	/* world */
	float zenupfac, zendownfac, blendfac;
} MTex;

#ifndef DNA_USHORT_FIX
#define DNA_USHORT_FIX
/**
 * @deprecated This typedef serves to avoid badly typed functions when
 * @deprecated compiling while delivering a proper dna.c. Do not use
 * @deprecated it in any case.
 */
typedef unsigned short dna_ushort_fix;
#endif

typedef struct PluginTex {
	char name[160];
	void *handle;
	
	char *pname;
	char *stnames;

	int stypes;
	int vars;
	void *varstr;
	float *result;
	float *cfra;
	
	float data[32];

	int (*doit)(void);
	void (*instance_init)(void *);

	/* should be void (*)(unsigned short)... patched */	
	void (*callback)(dna_ushort_fix);
	
	int version, pad;
} PluginTex;

typedef struct CBData {
	float r, g, b, a, pos;
	int cur;
} CBData;

/* 32 = MAXCOLORBAND */
/* note that this has to remain a single struct, for UserDef */
typedef struct ColorBand {
	short flag, tot, cur, ipotype;
	CBData data[32];
	
} ColorBand;

typedef struct EnvMap {
	struct Object *object;
	struct Image *ima;		/* type ENV_LOAD */
	struct ImBuf *cube[6];		/* these images are dynamic, not part of the main struct */
	float imat[4][4];
	float obimat[3][3];
	short type, stype;
	float clipsta, clipend;
	float viewscale;	/* viewscale is for planar envmaps to zoom in or out */
	unsigned int notlay;
	short cuberes, depth;
	int ok, lastframe;
	short recalc, lastsize;
} EnvMap;

typedef struct PointDensity {
	short flag;

	short falloff_type;
	float falloff_softness;
	float radius;
	short source;
	short color_source;
	int totpoints;
	
	int pdpad;

	struct Object *object;	/* for 'Object' or 'Particle system' type - source object */
	int psys;				/* index+1 in ob.particlesystem, non-ID pointer not allowed */
	short psys_cache_space;		/* cache points in worldspace, object space, ... ? */
	short ob_cache_space;		/* cache points in worldspace, object space, ... ? */
	
	void *point_tree;		/* the acceleration tree containing points */
	float *point_data;		/* dynamically allocated extra for extra information, like particle age */
	
	float noise_size;
	short noise_depth;
	short noise_influence;
	short noise_basis;
	short pdpad3[3];
	float noise_fac;
	
	float speed_scale, falloff_speed_scale, pdpad2;
	struct ColorBand *coba;	/* for time -> color */
	
	struct CurveMapping *falloff_curve; /* falloff density curve */	
} PointDensity;

typedef struct VoxelData {
	int resol[3];
	int interp_type;
	short file_format;
	short flag;
	short extend;
	short smoked_type;
	
	struct Object *object; /* for rendering smoke sims */
	float int_multiplier;	
	int still_frame;
	char source_path[240];

	/* temporary data */
	float *dataset;
	int cachedframe;
	int ok;
	
} VoxelData;

typedef struct Tex {
	ID id;
	struct AnimData *adt;	/* animation data (must be immediately after id for utilities to use it) */ 
	
	float noisesize, turbul;
	float bright, contrast, saturation, rfac, gfac, bfac;
	float filtersize, pad2;

	/* newnoise: musgrave parameters */
	float mg_H, mg_lacunarity, mg_octaves, mg_offset, mg_gain;

	/* newnoise: distorted noise amount, musgrave & voronoi ouput scale */
	float dist_amount, ns_outscale;

	/* newnoise: voronoi nearest neighbour weights, minkovsky exponent, distance metric & color type */
	float vn_w1;
	float vn_w2;
	float vn_w3;
	float vn_w4;
	float vn_mexp;
	short vn_distm, vn_coltype;

	short noisedepth, noisetype; /* noisedepth MUST be <= 30 else we get floating point exceptions */

	/* newnoise: noisebasis type for clouds/marble/etc, noisebasis2 only used for distorted noise */
	short noisebasis, noisebasis2;

	short imaflag, flag;
	short type, stype;
	
	float cropxmin, cropymin, cropxmax, cropymax;
	int texfilter;
	int afmax;	// anisotropic filter maximum value, ewa -> max eccentricity, feline -> max probes
	short xrepeat, yrepeat;
	short extend;

	/* variables disabled, moved to struct iuser */
	short fie_ima;
	int len;
	int frames, offset, sfra;
	
	float checkerdist, nabla;
	float pad1;
	
	struct ImageUser iuser;
	
	struct bNodeTree *nodetree;
	struct Ipo *ipo;				// XXX depreceated... old animation system
	struct Image *ima;
	struct PluginTex *plugin;
	struct ColorBand *coba;
	struct EnvMap *env;
	struct PreviewImage * preview;
	struct PointDensity *pd;
	struct VoxelData *vd;
	
	char use_nodes;
	char pad[7];
	
} Tex;

/* used for mapping node. note: rot is in degrees */

typedef struct TexMapping {
	float loc[3], rot[3], size[3];
	int flag;
	
	float mat[4][4];
	float min[3], max[3];
	struct Object *ob;

} TexMapping;

/* texmap->flag */
#define TEXMAP_CLIP_MIN	1
#define TEXMAP_CLIP_MAX	2


/* **************** TEX ********************* */

/* type */
#define TEX_CLOUDS		1
#define TEX_WOOD		2
#define TEX_MARBLE		3
#define TEX_MAGIC		4
#define TEX_BLEND		5
#define TEX_STUCCI		6
#define TEX_NOISE		7
#define TEX_IMAGE		8
#define TEX_PLUGIN		9
#define TEX_ENVMAP		10
#define TEX_MUSGRAVE	11
#define TEX_VORONOI		12
#define TEX_DISTNOISE	13
#define TEX_POINTDENSITY	14
#define TEX_VOXELDATA		15

/* musgrave stype */
#define TEX_MFRACTAL		0
#define TEX_RIDGEDMF		1
#define TEX_HYBRIDMF		2
#define TEX_FBM				3
#define TEX_HTERRAIN		4

/* newnoise: noisebasis 1 & 2 */
#define TEX_BLENDER			0
#define TEX_STDPERLIN		1
#define TEX_NEWPERLIN		2
#define TEX_VORONOI_F1		3
#define TEX_VORONOI_F2		4
#define TEX_VORONOI_F3		5
#define TEX_VORONOI_F4		6
#define TEX_VORONOI_F2F1	7
#define TEX_VORONOI_CRACKLE		8
#define TEX_CELLNOISE		14

/* newnoise: Voronoi distance metrics, vn_distm */
#define TEX_DISTANCE		0
#define TEX_DISTANCE_SQUARED		1
#define TEX_MANHATTAN		2
#define TEX_CHEBYCHEV		3
#define TEX_MINKOVSKY_HALF		4
#define TEX_MINKOVSKY_FOUR		5
#define TEX_MINKOVSKY		6

/* imaflag */
#define TEX_INTERPOL	1
#define TEX_USEALPHA	2
#define TEX_MIPMAP		4
#define TEX_IMAROT		16
#define TEX_CALCALPHA	32
#define TEX_NORMALMAP	2048
#define TEX_GAUSS_MIP	4096
#define TEX_FILTER_MIN	8192
#define TEX_DERIVATIVEMAP	16384

/* texfilter */
// TXF_BOX -> blender's old texture filtering method
#define TXF_BOX			0
#define TXF_EWA			1
#define TXF_FELINE		2
#define TXF_AREA		3

/* imaflag unused, only for version check */
#define TEX_FIELDS_		8
#define TEX_ANIMCYCLIC_	64
#define TEX_ANIM5_		128
#define TEX_ANTIALI_	256
#define TEX_ANTISCALE_	512
#define TEX_STD_FIELD_	1024

/* flag */
#define TEX_COLORBAND		1
#define TEX_FLIPBLEND		2
#define TEX_NEGALPHA		4
#define TEX_CHECKER_ODD		8
#define TEX_CHECKER_EVEN	16
#define TEX_PRV_ALPHA		32
#define TEX_PRV_NOR			64
#define TEX_REPEAT_XMIR		128
#define TEX_REPEAT_YMIR		256
#define TEX_FLAG_MASK		( TEX_COLORBAND | TEX_FLIPBLEND | TEX_NEGALPHA | TEX_CHECKER_ODD | TEX_CHECKER_EVEN | TEX_PRV_ALPHA | TEX_PRV_NOR | TEX_REPEAT_XMIR | TEX_REPEAT_YMIR ) 
#define TEX_DS_EXPAND		512

/* extend (starts with 1 because of backward comp.) */
#define TEX_EXTEND		1
#define TEX_CLIP		2
#define TEX_REPEAT		3
#define TEX_CLIPCUBE	4
#define TEX_CHECKER		5

/* noisetype */
#define TEX_NOISESOFT	0
#define TEX_NOISEPERL	1

/* tex->noisebasis2 in texture.c - wood waveforms */
#define TEX_SIN			0
#define TEX_SAW			1
#define TEX_TRI			2

/* tex->stype in texture.c - wood types */
#define TEX_BAND		0
#define TEX_RING		1
#define TEX_BANDNOISE	2
#define TEX_RINGNOISE	3

/* tex->stype in texture.c - cloud types */
#define TEX_DEFAULT		0
#define TEX_COLOR		1

/* tex->stype in texture.c - marble types */
#define TEX_SOFT		0
#define TEX_SHARP		1
#define TEX_SHARPER		2

/* tex->stype in texture.c - blend types */
#define TEX_LIN			0
#define TEX_QUAD		1
#define TEX_EASE		2
#define TEX_DIAG		3
#define TEX_SPHERE		4
#define TEX_HALO		5
#define TEX_RAD			6

/* tex->stype in texture.c - stucci types */
#define TEX_PLASTIC		0
#define TEX_WALLIN		1
#define TEX_WALLOUT		2

/* tex->stype in texture.c - voronoi types */
#define TEX_INTENSITY	0
#define TEX_COL1		1
#define TEX_COL2		2
#define TEX_COL3		3

/* mtex->normapspace */
#define MTEX_NSPACE_CAMERA	0
#define MTEX_NSPACE_WORLD	1
#define MTEX_NSPACE_OBJECT	2
#define MTEX_NSPACE_TANGENT	3

/* wrap */
#define MTEX_FLAT		0
#define MTEX_CUBE		1
#define MTEX_TUBE		2
#define MTEX_SPHERE		3

/* return value */
#define TEX_INT		0
#define TEX_RGB		1
#define TEX_NOR		2

/* pr_texture in material, world, lamp, */
#define TEX_PR_TEXTURE	0
#define TEX_PR_OTHER	1
#define TEX_PR_BOTH		2

/* **************** MTEX ********************* */

/* proj */
#define PROJ_N			0
#define PROJ_X			1
#define PROJ_Y			2
#define PROJ_Z			3

/* texflag */
#define MTEX_RGBTOINT		1
#define MTEX_STENCIL		2
#define MTEX_NEGATIVE		4
#define MTEX_ALPHAMIX		8
#define MTEX_VIEWSPACE		16
#define MTEX_DUPLI_MAPTO	32
#define MTEX_OB_DUPLI_ORIG	64
#define MTEX_COMPAT_BUMP	128
#define MTEX_3TAP_BUMP		256
#define MTEX_5TAP_BUMP		512
#define MTEX_BUMP_OBJECTSPACE	1024
#define MTEX_BUMP_TEXTURESPACE	2048

/* blendtype */
#define MTEX_BLEND		0
#define MTEX_MUL		1
#define MTEX_ADD		2
#define MTEX_SUB		3
#define MTEX_DIV		4
#define MTEX_DARK		5
#define MTEX_DIFF		6
#define MTEX_LIGHT		7
#define MTEX_SCREEN		8
#define MTEX_OVERLAY	9
#define MTEX_BLEND_HUE		10
#define MTEX_BLEND_SAT		11
#define MTEX_BLEND_VAL		12
#define MTEX_BLEND_COLOR	13
#define MTEX_NUM_BLENDTYPES	14
#define MTEX_SOFT_LIGHT     15 
#define MTEX_LIN_LIGHT      16

/* brush_map_mode */
#define MTEX_MAP_MODE_FIXED    0
#define MTEX_MAP_MODE_TILED    1
#define MTEX_MAP_MODE_3D       2

/* **************** EnvMap ********************* */

/* type */
#define ENV_CUBE	0
#define ENV_PLANE	1
#define ENV_SPHERE	2

/* stype */
#define ENV_STATIC	0
#define ENV_ANIM	1
#define ENV_LOAD	2

/* ok */
#define ENV_NORMAL	1
#define ENV_OSA		2

/* **************** PointDensity ********************* */

/* source */
#define TEX_PD_PSYS			0
#define TEX_PD_OBJECT		1
#define TEX_PD_FILE			2

/* falloff_type */
#define TEX_PD_FALLOFF_STD		0
#define TEX_PD_FALLOFF_SMOOTH	1
#define TEX_PD_FALLOFF_SOFT		2
#define TEX_PD_FALLOFF_CONSTANT	3
#define TEX_PD_FALLOFF_ROOT		4
#define TEX_PD_FALLOFF_PARTICLE_AGE 5
#define TEX_PD_FALLOFF_PARTICLE_VEL 6

/* psys_cache_space */
#define TEX_PD_OBJECTLOC	0
#define TEX_PD_OBJECTSPACE	1
#define TEX_PD_WORLDSPACE	2

/* flag */
#define TEX_PD_TURBULENCE		1
#define TEX_PD_FALLOFF_CURVE	2

/* noise_influence */
#define TEX_PD_NOISE_STATIC		0
#define TEX_PD_NOISE_VEL		1
#define TEX_PD_NOISE_AGE		2
#define TEX_PD_NOISE_TIME		3

/* color_source */
#define TEX_PD_COLOR_CONSTANT	0
#define TEX_PD_COLOR_PARTAGE	1
#define TEX_PD_COLOR_PARTSPEED	2
#define TEX_PD_COLOR_PARTVEL	3

#define POINT_DATA_VEL		1
#define POINT_DATA_LIFE		2

/******************** Voxel Data *****************************/
/* flag */
#define TEX_VD_STILL			1

/* interpolation */
#define TEX_VD_NEARESTNEIGHBOR		0
#define TEX_VD_LINEAR				1
#define TEX_VD_QUADRATIC        2
#define TEX_VD_TRICUBIC_CATROM  3
#define TEX_VD_TRICUBIC_BSPLINE 4
#define TEX_VD_TRICUBIC_SLOW    5

/* file format */
#define TEX_VD_BLENDERVOXEL		0
#define TEX_VD_RAW_8BIT			1
#define TEX_VD_RAW_16BIT		2
#define TEX_VD_IMAGE_SEQUENCE	3
#define TEX_VD_SMOKE			4
/* for voxels which use VoxelData->source_path */
#define TEX_VD_IS_SOURCE_PATH(_format) (ELEM3(_format, TEX_VD_BLENDERVOXEL, TEX_VD_RAW_8BIT, TEX_VD_RAW_16BIT))

/* smoke data types */
#define TEX_VD_SMOKEDENSITY		0
#define TEX_VD_SMOKEHEAT		1
#define TEX_VD_SMOKEVEL			2

#ifdef __cplusplus
}
#endif

#endif

