ftp.nice.ch/pub/next/graphics/3d/geomview.1.4.1.s.tar.gz#/Geomview/src/lib/shade/appearance.h

This is appearance.h in view mode; [Download] [Up]

/* Copyright (c) 1992 The Geometry Center; University of Minnesota
   1300 South Second Street;  Minneapolis, MN  55454, USA;
   
This file is part of geomview/OOGL. geomview/OOGL is free software;
you can redistribute it and/or modify it only under the terms given in
the file COPYING, which you should have received along with this file.
This and other related software may be obtained via anonymous ftp from
geom.umn.edu; email: software@geom.umn.edu. */

/* Authors: Charlie Gunn, Stuart Levy, Tamara Munzner, Mark Phillips */

#ifndef APPEARANCEDEF
#define APPEARANCEDEF

/*
  #define AP_IDEBUG before #including this file to compile for
  debugging
*/

#include "ooglutil.h"
#include "vert.h"
#include "3d.h"
#include "color.h"
#include "handle.h"
#include <stdarg.h>

#define DONE 1
#define ANOTHER 2

typedef struct LtLight {
    struct LtLight *next;
    Color ambient;
    Color color;
    Point position;		/* application-specified light position */
    Point globalposition;	/* real light position; set & used only by mg */
    float intensity;

    int Private;		/* private part; used only by mg */

    short location;		/* How to interpret the "position": */
#define	LTF_GLOBAL	0x0		/* global coordinate system */
#define	LTF_CAMERA	0x1		/* camera coordinates */
#define	LTF_LOCAL	0x2		/* local coordinates
					 * where appearance is attached. */

    short changed;
} LtLight;


typedef struct LmLighting {
    REFERENCEFIELDS
    int valid, override;	 /* LMF_* inheritance bits */
    Color ambient;
    int	localviewer;
    float attenconst, attenmult, attenmult2;
    LtLight *lights;

    int Private;
    int changed;
} LmLighting;


typedef struct Material {
    REFERENCEFIELDS
    int valid, override;	/* MTF_* inheritance bits */
    Color emission;
    Color ambient;
    Color diffuse;
    float alpha;
    Color specular;
    float shininess;
    float ka, kd, ks;
    Color edgecolor;		/* Color for polygon edges and other vectors */
    Color normalcolor;		/* Color for surface-normal vectors */

    int Private;
    int changed;
} Material;

typedef struct Appearance {
    REFERENCEFIELDS
    Material	*mat, *backmat;	    /* material properties */
    LmLighting	*lighting;  /* attached lighting */
    unsigned int flag;	    /* APF_* shading,faces/edges,normals,transparency */
    unsigned int valid;	    /* APF_* bits control inheritance of these fields */
    unsigned int override;  /* same APF_* flags: parent overrides child */
    float nscale;	    /* scale factor for drawing normals */
    int linewidth;          /* how wide do lines appear (pixels) ? */
    int shading;	    /* APF_{CONSTANT,FLAT,SMOOTH} */
}  Appearance;



/* the following tokens are used in LtSet and LtGet */
#define LT_END		700
#define	LT_AMBIENT	701	/* Color ambient */
#define	LT_COLOR	702	/* Color color */
#define	LT_POSITION	703	/* Point position */
#define	LT_INTENSITY	704	/* double intensity */
#define	LT_LOCATION	705	/* int location: LTF_{GLOBAL,CAMERA,LOCAL} */

#define LT_ABLOCK	706	/* void **ablock */


/* the following tokens are used in LmSet and LmGet */
#define LM_END		  600	
#define	LM_AMBIENT	  601	/* Color ambient */
#define	LM_LOCALVIEWER	  602	/* int localviewer */
#define	LM_ATTENC	  603	/* double attenconst */
#define	LM_ATTENM	  604	/* double attenmult */
#define	LM_ATTEN2	  612	/* double attenmult2 */
#define LM_LtSet	  605	/* ... */
#define LM_LIGHT	  606	/* LtLight *light */
#define LM_VALID	  607	/* int mask (Get only) */
#define LM_INVALID	  608	/* int mask (unsets valid bits) */
#define LM_OVERRIDE	  609	/* int mask (sets override bits) */
#define LM_NOOVERRIDE	  610	/* int mask (unsets override bits) */
#define LM_REPLACELIGHTS  611	/* int replace */

#define LM_ABLOCK	  613	/* void **ablock */


/* the following tokens are used in MtSet and MtGet */
#define MT_END		500	
#define MT_EMISSION	501	/* Color *emission */
#define	MT_AMBIENT	502	/* Color *ambient */
#define	MT_DIFFUSE	503	/* Color *diffuse */
#define	MT_SPECULAR	504	/* Color *specular */
#define	MT_Ka		505	/* double ka */
#define	MT_Kd		506	/* double kd */
#define	MT_Ks		507	/* double ks */
#define	MT_ALPHA	508	/* double alpha */
#define	MT_SHININESS	509	/* double shininess */
#define	MT_EDGECOLOR	510	/* Color *edgecolor (for edges & vectors) */
#define	MT_NORMALCOLOR	511	/* Color *normalcolor (for surface normals) */
#define MT_VALID	512	/* int mask (Get only) */
#define MT_INVALID	513	/* int mask (unsets valid bits) */
#define MT_OVERRIDE	514	/* int mask (sets override bits) */
#define MT_NOOVERRIDE	515	/* int mask (unsets override bits) */

#define MT_ABLOCK	516	/* void **ablock */


/* the following tokens are used in ApSet and ApGet */
#define AP_END		400	
#define AP_DO		401	/* int mask (set flag bits) */
#define AP_DONT 	402	/* int mask (unset flag bits) */
#define AP_MAT		403	/* Material *mat */
#define AP_MtSet	404	/* ... */
#define AP_LGT		405	/* LmLighting *lgt */
#define AP_LmSet	406	/* ... */
#define AP_NORMSCALE	407	/* float nscale */
#define AP_LINEWIDTH	408	/* int linewidth */
#define AP_VALID	409	/* int mask (Get only) */
#define AP_INVALID	410	/* int mask (unsets valid bits) */
#define AP_OVERRIDE	411	/* int mask (sets override bits) */
#define AP_NOOVERRIDE	412	/* int mask (unsets override bits) */
#define AP_SHADING	413	/* int shading (set to APF_{CONSTANT,FLAT,SMOOTH} */
#define	AP_BACKMAT	414	/* Material *backmaterial */

#define AP_ABLOCK	415	/* void **ablock */

				/* Flags to ApMerge, etc. */
#define	APF_INPLACE	 0x1	/* Merge in place */
#define	APF_OVEROVERRIDE 0x2	/* src replaces dst even without src override */


#ifndef AP_IDEBUG
Appearance *	ApCreate( int attr, ... );
Appearance *	ApSet( Appearance *ap, int attr, ... );
#endif
Appearance *	_ApSet(Appearance *ap, int attr1, register va_list *alist);
int		ApGet( Appearance *ap, int attr, void *valuep );
void		ApDelete( Appearance *ap );
Appearance *	ApDefault( Appearance *ap );
Appearance *	ApCopy( Appearance *from, Appearance *into );
Appearance *	ApMerge( Appearance *src, Appearance *dst, int inplace );
Appearance *	ApFLoad( Appearance *into, FILE *f, char *stream );
Appearance *	ApLoad( Appearance *into, char *stream );

		/* Force 'override' bits on (for all valid fields)
		 * or off, in an Appearance.
		 */
void 	ApUseOverrides( Appearance *ap, int use_overrides );

		/* Erase fields in 'dst' corresponding to any in 'src';
		 * allows 'src' settings to propagate through 'dst',
		 * when 'dst' is its child.
		 */
void	ApLetPropagate( Appearance *src, Appearance *dst );

#ifndef AP_IDEBUG
Material *	MtCreate( int attr, ... );
Material *	MtSet( Material *, int attr, ... );
#endif
int		MtGet( Material *, int attr, void *valuep );

void		MtDelete( Material * );
Material *	MtDefault( Material * );
Material *	MtLoad( Material *, char *filename );
Material *	MtCopy( Material *from, Material *into );
Material *	MtMerge( Material *src, Material *dst, int inplace );
Material *	MtFLoad( Material *into, FILE *stream, char *filename );
int		MtSave( Material *, char *filename );
int		MtFSave( Material *mat, FILE *stream );
void		MtPrint( Material * );


#ifndef AP_IDEBUG
LtLight *	LtCreate( int attr, ... );
LtLight *	LtSet( LtLight *, int attr, ... );
#endif
int		LtGet( LtLight *, int attr, void *valuep );
void 		LtDelete( LtLight * );
LtLight *	LtCopy( LtLight *, LtLight * );
LtLight *	LtMerge( LtLight *, LtLight * );
LtLight *	LtDefault( LtLight * );
void 		LtProperties( LtLight *, float, Color *, Point * );
LtLight *     	LtLoad( LtLight *, char *filename);
LtLight *     	LtFLoad( LtLight *, FILE *, char *filename);
void 		LtRemove( LmLighting *, LtLight * );
void 		LtAppend( LmLighting *, LtLight * );
LtLight *	LtCopylist(LtLight *l, int mergeflag);
void		LtDeletelist(LtLight *l);


#ifndef AP_IDEBUG
LmLighting *	LmCreate( int attr, ... );
LmLighting *	LmSet( LmLighting *, int attr, ... );
#endif
int		LmGet( LmLighting *, int attr, void *valuep );
void 		LmDelete( LmLighting * );
void 		LmDelete( LmLighting * );
void 		LmDefault( LmLighting * );
LmLighting * 	LmLoad( LmLighting *, char *filename );
LmLighting *	LmFLoad( LmLighting *, FILE *, char *filename );
void 		LmSave( LmLighting *, char *filename );
int 		LmFSave( LmLighting *, FILE *, char *filename );
LmLighting *	LmMerge( LmLighting *src, LmLighting *dst, int inplace );
LmLighting *	LmCopy( LmLighting *src, LmLighting *dst );

#define	LIGHTINGMAGIC	OOGLMagic('l', 1)

#define	LMF_LOCALVIEWER	0x1   /* Local viewer (flag valid) */
#define	LMF_AMBIENT	0x2   /* Ambient light color */
#define	LMF_ATTENC	0x4   /* attenuation constant factor */
#define	LMF_ATTENM	0x8   /* attenuation linear factor */
#define	LMF_ATTEN2	0x20  /* 1/r^2 attenuation factor */
#define	LMF_REPLACELIGHTS	0x10  /* When merging, use only new lights, not union */

#define	MATMAGIC	OOGLMagic('m', 1)

#define MTF_EMISSION	0x1
#define	MTF_AMBIENT	0x2
#define	MTF_DIFFUSE	0x4
#define	MTF_SPECULAR	0x8
#define	MTF_Ka		0x10
#define	MTF_Kd		0x20
#define	MTF_Ks		0x40
#define	MTF_ALPHA	0x80
#define	MTF_SHININESS	0x100
#define	MTF_EDGECOLOR	0x200
#define	MTF_NORMALCOLOR	0x400


#define	APMAGIC		OOGLMagic('a', 1)

/* The following bits are used in 'flag', 'valid', 'override' */
#define	APF_FACEDRAW	0x2	/* Draw faces */
#define	APF_EDGEDRAW	0x10	/* Draw edges */
#define	APF_TRANSP	0x20	/* Enable transparency */
#define	APF_EVERT	0x40	/* Evert surface normals */
#define	APF_NORMALDRAW	0x80	/* Draw surface normals */
#define	APF_VECTDRAW	0x100	/* Draw vectors/points */

/* The following bits are used in 'valid', 'override' */
#define	APF_SHADING	0x1     /* Use 'shading' value */
#define	APF_NORMSCALE	0x4	/* Use 'nscale' value to draw normals */
#define	APF_LINEWIDTH	0x8	/* Use 'linewidth' value  */

/* Possible values for ap->shading field; these MUST be consecutive !!
   (code outside the appearance library depends on this fact) */
#define	APF_CONSTANT	0	/* constant-colored (unlighted) faces */
#define APF_FLAT	1	/* Flat-shaded, lighted faces */
#define	APF_SMOOTH	2	/* Gouraud-shaded faces, with lighting */
#define	APF_CSMOOTH	3	/* Gouraud-shaded faces, without lighting */

#define	IS_SMOOTH(shading)  ((shading) >= APF_SMOOTH)
#define	IS_SHADED(shading)  ((1<<(shading)) & ((1<<APF_FLAT)|(1<<APF_SMOOTH)))


#ifdef AP_IDEBUG

Appearance *	ApCreate();
Appearance *	ApSet();
Material *	MtCreate();
Material *	MtSet();
LtLight *	LtCreate();
LtLight *	LtSet();
LmLighting *	LmCreate();
LmLighting *	LmSet();

int lt_end = LT_END;
int lt_ambient = LT_AMBIENT;
int lt_color = LT_COLOR;
int lt_position = LT_POSITION;
int lt_intensity = LT_INTENSITY;

int lm_end = LM_END;
int lm_ambient = LM_AMBIENT;
int lm_localviewer = LM_LOCALVIEWER;
int lm_attenc = LM_ATTENC;
int lm_attenm = LM_ATTENM;
int lm_ltset = LM_LtSet;
int lm_light = LM_LIGHT;
int lm_valid = LM_VALID;
int lm_invalid = LM_INVALID;
int lm_override = LM_OVERRIDE;
int lm_nooverride = LM_NOOVERRIDE;

int mt_end = MT_END;
int mt_emission = MT_EMISSION;
int mt_ambient = MT_AMBIENT;
int mt_diffuse = MT_DIFFUSE;
int mt_specular = MT_SPECULAR;
int mt_ka = MT_Ka;
int mt_kd = MT_Kd;
int mt_ks = MT_Ks;
int mt_alpha = MT_ALPHA;
int mt_shininess = MT_SHININESS;
int mt_valid = MT_VALID;
int mt_invalid = MT_INVALID;
int mt_override = MT_OVERRIDE;
int mt_nooverride = MT_NOOVERRIDE;

int ap_end = AP_END;
int ap_do = AP_DO;
int ap_dont = AP_DONT ; 
int ap_mat = AP_MAT;
int ap_mtset = AP_MtSet;
int ap_lgt = AP_LGT;
int ap_lmset = AP_LmSet;
int ap_normscale = AP_NORMSCALE;
int ap_linewidth = AP_LINEWIDTH;
int ap_valid = AP_VALID;
int ap_invalid = AP_INVALID;
int ap_override = AP_OVERRIDE;
int ap_nooverride = AP_NOOVERRIDE;
int ap_shading = AP_SHADING;

int lmf_localviewer = LMF_LOCALVIEWER;
int lmf_ambient = LMF_AMBIENT;
int lmf_attenc = LMF_ATTENC;
int lmf_attenm = LMF_ATTENM;
int lmf_replacelights = LMF_REPLACELIGHTS;

int mtf_emission = MTF_EMISSION;
int mtf_ambient = MTF_AMBIENT;
int mtf_diffuse = MTF_DIFFUSE;
int mtf_specular = MTF_SPECULAR;
int mtf_ka = MTF_Ka;
int mtf_kd = MTF_Kd;
int mtf_ks = MTF_Ks;
int mtf_alpha = MTF_ALPHA;
int mtf_shininess = MTF_SHININESS;

int apf_facedraw = APF_FACEDRAW;
int apf_edgedraw = APF_EDGEDRAW;
int apf_transp = APF_TRANSP;
int apf_evert = APF_EVERT;

int apf_shading = APF_SHADING;
int apf_normscale = APF_NORMSCALE;
int apf_linewidth = APF_LINEWIDTH;

int apf_constant = APF_CONSTANT;
int apf_flat = APF_FLAT;
int apf_smooth = APF_SMOOTH;

#endif /* AP_IDEBUG */

void ApFSave( Appearance *ap, Handle *aphandle, FILE *f, char *fname );
int ApStreamIn(Pool *p, Handle **hp, Appearance **app);
int ApStreamOut(Pool *p, Handle *h, Appearance *ap);

#endif /* APPEARANCEDEF */


These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.