/* gstypes.h Bill Brown, UI GMSL - USACERL */ #include "gsurf.h" #include "bitmap.h" /* #define TRACE_FUNCS */ #define X 0 #define Y 1 #define Z 2 #define W 3 #define FROM 0 #define TO 1 /* colormodes */ #define CM_COLOR 0 #define CM_EMISSION 1 #define CM_AMBIENT 2 #define CM_DIFFUSE 3 #define CM_SPECULAR 4 #define CM_AD 5 #define CM_NULL 6 #define CM_WIRE CM_COLOR #define NULL_COLOR 0xFFFFFF /* attribute sizes - NOT YET USED */ #define GS_CHAR8 char #define GS_SHORT16 short #define GS_INT32 int /* attribute ***types*** */ #define ATTY_NULL 32 /* internal use only */ #define ATTY_MASK 16 /* can't use this one for numbytes */ #define ATTY_FLOAT 8 /* can't use this one for numbytes */ #define ATTY_INT 4 #define ATTY_SHORT 2 #define ATTY_CHAR 1 #define ATTY_ANY 63 /* internal use only */ #define LEGAL_TYPE(t) \ (t==ATTY_MASK || t==ATTY_FLOAT || t==ATTY_INT || t==ATTY_SHORT || t==ATTY_CHAR) #define MAXDIMS 4 #define FUDGE(gs) ((gs->zmax_nz - gs->zmin_nz)/500.) #define DOT3( a, b ) ( (a)[X]*(b)[X] + (a)[Y]*(b)[Y] + (a)[Z]*(b)[Z] ) /* changed flags for datasets */ #define CF_NOT_CHANGED 0x000000 #define CF_COLOR_PACKED 0x000001 #define CF_USR_CHANGED 0x000010 #define CF_CHARSCALED 0x000100 #define NAME_SIZ 80 #define MAX_TF 6 #define MASK_TL 0x10000000 #define MASK_TR 0x01000000 #define MASK_BR 0x00100000 #define MASK_BL 0x00010000 #define MASK_NPTS 0x00000007 typedef float Point4[4]; typedef float Point3[3]; typedef float Point2[2]; typedef struct{ float *fb; int *ib; short *sb; char *cb; struct BM *bm; struct BM *nm; /* null mask: set = null */ float (*tfunc)(); /* int n_tf; */ float k; } typbuff; typedef struct{ /* use hash table? */ int n_elem; /* if n_elem == 256, index == NULL */ char *index; int *value; } table256; typedef struct{ /* applied thusly: offset, mult, if(use_lookup) lookup */ float offset; float mult; int use_lookup; table256 lookup; } transform; /* move this to dataset file? */ typedef struct{ int data_id; int dims[MAXDIMS]; int ndims; int numbytes; char unique_name[NAME_SIZ]; typbuff databuff; IFLAG changed; int need_reload; } dataset; /* maybe add transformation matrix? */ typedef struct{ IFLAG att_src; /* NOTSET_ATT, MAP_ATT, CONST_ATT, FUNC_ATT */ IFLAG att_type; /* ATTY_INT, ATTY_SHORT, ATTY_CHAR, or ATTY_FLOAT */ int hdata; /* handle to dataset */ int (*user_func)(); float constant; int *lookup; /* TODO: use transform instead */ float min_nz, max_nz, range_nz; float default_null; } gsurf_att; typedef struct g_surf{ int gsurf_id; int cols, rows; gsurf_att att[MAX_ATTS]; /* mask, topo, color, etc. */ IFLAG draw_mode; /*DM_GOURAUD | DM_FRINGE | DM_POLY, DM_WIRE, DM_WIRE_POLY*/ long wire_color; /* 0xBBGGRR or WC_COLOR_ATT */ double ox, oy; /* real world origin (i.e., SW corner) */ double xres, yres; float z_exag; float x_trans, y_trans, z_trans; float xmin, xmax, ymin, ymax, zmin, zmax, zminmasked; float xrange, yrange, zrange; float zmin_nz, zmax_nz, zrange_nz; int x_mod, y_mod, x_modw, y_modw; /*cells per viewcell, per wire viewcell*/ int nz_topo, nz_color; /* no zero flags */ int mask_needupdate, norm_needupdate; unsigned long *norms; struct BM *curmask; struct g_surf *next; void *clientdata; } geosurf; /* maybe put attribute info here instead of in geovect - allow a single vector file to have multiple attributes ? Cached lines should usually be stored as 2d, since they may be draped on multiple surfaces & Z will vary depending upon surface. */ typedef struct g_line{ int dims, npts; Point3 *p3; Point2 *p2; struct g_line *next; } geoline; typedef struct g_vect{ int gvect_id; int use_mem, n_lines; int drape_surf_id[MAX_SURFS]; /* if you want 'em flat, define the surface */ int n_surfs; int color, width; char filename[NAME_SIZ]; float x_trans, y_trans, z_trans; /* also maybe center & rotate? */ geoline *lines; geoline *fastlines; int (*bgn_read)(), (*end_read)(), (*nxt_line)(); struct g_vect *next; void *clientdata; } geovect; typedef struct g_point{ int dims; Point3 p3; float fattr; /* may want to make these pointers or arrays for mult atts */ int iattr; char *cattr; struct g_point *next; } geopoint; typedef struct g_site{ int gsite_id; int drape_surf_id[MAX_SURFS]; /* ditto */ int n_surfs, n_sites; int color, width, marker, use_z, use_mem; int has_z, has_att; /* set when file loaded */ int attr_mode; /* ST_ATT_COLOR, ST_ATT_MARKER, ST_ATT_SIZE, ST_ATT_NONE */ char filename[NAME_SIZ]; transform attr_trans; float size; float x_trans, y_trans, z_trans; geopoint *points; int (*bgn_read)(), (*end_read)(), (*nxt_site)(); struct g_site *next; void *clientdata; } geosite; typedef struct dspinfo{ int num_levels; /* stuff to define which isosurfaces available and which ON, file name, etc Also maybe where to put fence cuts, normals direction, solid vs. slices, etc */ } geodsp; typedef struct g_vol{ char filename[NAME_SIZ]; int gvol_id; int drape_surf_id; int n_dsp; float x_trans, y_trans, z_trans; struct dspinfo *dspis[MAX_DSP]; struct g_vol *next; void *clientdata; } geovol; struct lightdefs{ float position[4]; /* X, Y, Z, (1=local/0=inf) */ float color[3]; /* R, G, B */ float ambient[3]; /* R, G, B */ float emission[3]; /* R, G, B */ float shine; /* 0. to 128. */ }; typedef struct{ int coord_sys; /* latlon, equal area, etc */ int view_proj; /* perspective, ortho */ int infocus; /* fixed center of view - true or false */ float from_to[2][4]; int twist, fov, incl, look; /* 10ths of degrees */ float real_to[4], vert_exag; /* a global Z exag */ float scale; struct lightdefs lights[MAX_LIGHTS]; } geoview; typedef struct{ /* need to add elements here for off_screen drawing */ float nearclip, farclip, aspect; short left, right, bottom, top; /* Screen coordinates */ int bgcol; } geodisplay; float ID_matrix[4][4]; void (*Cxl_func)(); void (*Swap_func)(); /* function prototypes */ extern int GS_surf_exists(); extern int GS_new_surface(); extern int GS_delete_surface(); extern double GS_geodistance(); extern float GS_distance(); extern float GS_P2distance(); extern float GS_global_exag(); extern double GS_get_aspect(); extern int Gs_loadmap_as_int(); extern int Gs_loadmap_as_short(); extern geoline *Gv_load_vect(); extern geosurf *gs_get_surf(); extern geosurf *gs_get_prev_surface(); extern geosurf *gs_get_last_surf(); extern geosurf *gs_get_new_surf(); extern int gs_num_surfaces(); extern int gs_init_surf(); extern int gs_delete_surf(); extern int gs_free_surf(); extern int gs_free_unshared_buffs(); extern int gs_get_att_type(); extern int gs_get_att_src(); extern float gs_distance(); extern typbuff *gs_get_att_typbuff(); extern int gs_num_datah_reused(); extern int gsds_alloc_typbuff(); extern typbuff *gsds_get_typbuff(); extern char *gsds_get_name(); extern int gsds_geth(); extern int gsds_findh(); extern int gsds_newh(); extern int gsds_free_datah(); extern int gsds_set_changed(); extern int gsds_get_changed(); extern int gsds_get_type();