This is mgrib.c in view mode; [Download] [Up]
#include "mg.h" #include "mgP.h" #include "mgribP.h" #include "mgribshade.h" #include "mgribtoken.h" #include <stdio.h> #include <sys/types.h> #include <stdlib.h> #include <string.h> #include <time.h> mgcontext * mgrib_ctxcreate(int a1, ...); void mgrib_ctxset( int a1, ... ); int mgrib_feature( int feature ); void mgrib_ctxdelete( mgcontext *ctx ); int mgrib_ctxget( int attr, void* valueptr ); int mgrib_ctxselect( mgcontext *ctx ); void mgrib_sync( void ); void mgrib_worldbegin( void ); void mgrib_worldend( void ); void mgrib_reshapeviewport( void ); void mgrib_identity( void ); void mgrib_transform( Transform T ); int mgrib_pushtransform( void ); int mgrib_poptransform( void ); void mgrib_settransform( Transform T ); int mgrib_pushappearance( void ); int mgrib_popappearance( void ); Appearance *mgrib_setappearance( Appearance* app, int merge); Appearance *mgrib_getappearance( void ); int mgrib_setcamera( Camera* cam ); mgribcontext *mgrib_newcontext( mgribcontext *ctx ); extern void mgrib_polygon(); extern void mgrib_mesh(); extern void mgrib_line(); extern void mgrib_polyline(); extern void mgrib_polylist(); extern void mgrib_bezier(); void _mgrib_ctxset(int a1, va_list *alist); WnWindow *mgribwindow(WnWindow *win); struct mgfuncs mgribfuncs = { MGD_RIB, mgdevice_RIB, mgrib_feature, (mgcontext *(*)())mgrib_ctxcreate, mgrib_ctxdelete, (void (*)())mgrib_ctxset, mgrib_ctxget, mgrib_ctxselect, mgrib_sync, mgrib_worldbegin, mgrib_worldend, mgrib_reshapeviewport, mgrib_settransform, mg_gettransform, /* Generic */ mgrib_identity, mgrib_transform, mgrib_pushtransform, mgrib_poptransform, mgrib_pushappearance, mgrib_popappearance, mgrib_setappearance, mgrib_getappearance, mgrib_setcamera, mgrib_polygon, mgrib_polylist, mgrib_mesh, mgrib_line, mgrib_polyline, mg_quads, mgrib_bezier }; static mgribcontext *MGRIB; /* For debugging */ int mgdevice_RIB() { _mgf = mgribfuncs; if (_mgc != NULL && _mgc->devno != MGD_RIB) _mgc = NULL; return(0); } /*----------------------------------------------------------------------- * Function: mgrib_ctxcreate * Date: Thu Jul 18 18:55:18 1991 * Author: mbp * Notes: see mg.doc for rest of spec */ mgcontext * mgrib_ctxcreate(int a1, ...) { va_list alist; time_t timedate = (time_t)time(0); _mgc = (mgcontext*)(MGRIB = mgrib_newcontext( OOGLNewE(mgribcontext, "mgrib_ctxcreate") )); /* Ensure some sensible default Window */ WnSet(_mgc->win, WN_XSIZE, 300, WN_YSIZE, 200, WN_END); /* Default RIB1.0 structure info */ sprintf(_mgribc->ribscene, "Generic RIB file"); sprintf(_mgribc->ribcreator, "mgrib driver"); sprintf(_mgribc->ribfor, getenv("USER")); sprintf(_mgribc->ribdate, ctime(&timedate)); _mgribc->ribdate[24] = '\0'; /* remove the line feed */ va_start(alist, a1); _mgrib_ctxset(a1, &alist); va_end(alist); return _mgc; } /*----------------------------------------------------------------------- * Function: _mgrib_ctxset * Description: internal ctxset routine * Args: a1: first attribute * *alist: rest of attribute-value list * Returns: nothing * Author: mbp * Date: Fri Sep 20 11:08:13 1991 * Notes: mgrib_ctxcreate() and mgrib_ctxset() call this to actually * parse and interpret the attribute list. */ void _mgrib_ctxset(int a1, va_list *alist) { int attr; for (attr = a1; attr != MG_END; attr = va_arg (*alist, int)) { switch (attr) { case MG_ApSet: { Appearance *ap; ap = _ApSet(NULL, va_arg(*alist, int), alist); mgrib_setappearance(ap, MG_MERGE); ApDelete(ap); } break; case MG_WnSet: _WnSet( _mgc->win, va_arg(*alist, int), alist); break; case MG_CamSet: _CamSet( _mgc->cam, va_arg(*alist, int), alist); break; case MG_APPEAR: mgsetappearance(va_arg(*alist, Appearance *), MG_SET); break; case MG_WINDOW: if (_mgc->win) WnDelete(_mgc->win); _mgc->win = va_arg(*alist, WnWindow*); RefIncr((Ref*) (_mgc->win)); break; case MG_CAMERA: mgrib_setcamera( va_arg(*alist, Camera*) ); break; case MG_SETOPTIONS: _mgc->opts |= va_arg(*alist, int); case MG_UNSETOPTIONS: _mgc->opts &= ~va_arg(*alist, int); break; case MG_SHOW: _mgc->shown = va_arg(*alist, int); break; case MG_PARENT: _mgc->parent = va_arg(*alist, mgcontext*); break; case MG_BACKGROUND: _mgc->background = *va_arg(*alist, ColorA*); break; case MG_ZNUDGE: /* for now, read nothing */ va_arg(*alist, double); break; case MG_SPACE: _mgc->space = va_arg(*alist, int); break; case MG_NDINFO: _mgc->NDinfo = va_arg(*alist, void *); break; case MG_NDMAP: _mgc->NDmap = va_arg(*alist, mgmapfunc); break; /* kind of RIB-specific */ case MG_RIBFILE: /* if(_mgribc->rib) fclose(_mgribc->rib); */ _mgribc->rib = va_arg(*alist, FILE*); break; /* really RIB-specific */ case MG_RIBLINEMODE: _mgribc->line_mode = va_arg(*alist, int); break; case MG_RIBFORMAT: switch( va_arg(*alist, int) ) { case MG_RIBASCII: _mgribc->render_device |= RMD_ASCII; _mgribc->render_device &= ~RMD_BINARY; break; case MG_RIBBINARY: _mgribc->render_device |= RMD_BINARY; _mgribc->render_device &= ~RMD_ASCII; break; } break; case MG_RIBFILEPATH: if(_mgribc->rib) fclose(_mgribc->rib); strcpy(_mgribc->filepath, va_arg(*alist, char*)); _mgribc->rib = fopen(_mgribc->filepath,"w+"); break; case MG_RIBDISPLAY: _mgribc->display = va_arg(*alist, int); break; case MG_RIBDISPLAYNAME: strcpy(_mgribc->displayname, va_arg(*alist, char*)); break; case MG_RIBBACKING: _mgribc->backing = va_arg(*alist, int); break; case MG_RIBSHADER: _mgribc->shader = va_arg(*alist, int); break; case MG_RIBSCENE: strcpy(_mgribc->ribscene, va_arg(*alist, char*)); break; case MG_RIBCREATOR: strcpy(_mgribc->ribcreator, va_arg(*alist, char*)); break; case MG_RIBFOR: strcpy(_mgribc->ribfor, va_arg(*alist, char*)); break; case MG_RIBDATE: strcpy(_mgribc->ribdate, va_arg(*alist, char*)); break; default: OOGLError (0, "_mgrib_ctxset: undefined option: %d\n", attr); return; break; } } if (_mgc->shown && !_mgribc->born) { /* open the window */ mgribwindow(_mgc->win); /* rib state is *not* in accordance with appearance state: don't set the appearance until worldbegin time */ } } /*----------------------------------------------------------------------- * Function: mgrib_ctxget * Description: get a context attribute value * Args: attr: the attribute to get * value: place to write attr's value * Returns: 1 for success; -1 if attr is invalid * Author: mbp * Date: Fri Sep 20 11:50:25 1991 * Notes: */ int mgrib_ctxget(int attr, void* value) { #define VALUE(type) ((type*)value) switch (attr) { /* Attributes common to all MG contexts: */ case MG_APPEAR: *VALUE(Appearance*) = &(_mgc->astk->ap); break; case MG_CAMERA: *VALUE(Camera*) = _mgc->cam; break; case MG_WINDOW: if(_mgribc->born) { /* IT DOESN'T MAKE SENSE TO DO THIS, DOES IT? */ } *VALUE(WnWindow*) = _mgc->win; break; case MG_PARENT: *VALUE(mgcontext*) = _mgc->parent; break; case MG_SETOPTIONS: case MG_UNSETOPTIONS: *VALUE(int) = _mgc->opts; break; case MG_BACKGROUND: *VALUE(ColorA) = _mgc->background; break; case MG_ZNUDGE: /* not implemented now */ *VALUE(int) = 0; case MG_SPACE: *VALUE(int) = _mgc->space; break; case MG_NDINFO: *VALUE(void *) = _mgc->NDinfo; break; case MG_NDMAP: *VALUE(mgmapfunc) = _mgc->NDmap; break; /* Attributes specific to RIB contexts: */ case MG_RIBWINID: *VALUE(int) = _mgribc->win; break; case MG_RIBFILE: *VALUE(FILE*) = _mgribc->rib; break; /* Attributes really specific to RI contexts: */ case MG_RIBLINEMODE: *VALUE(int) = _mgribc->line_mode; break; case MG_RIBFORMAT: if(_mgribc->render_device & RMD_ASCII) *VALUE(int) = MG_RIBASCII; if(_mgribc->render_device & RMD_BINARY) *VALUE(int) = MG_RIBBINARY; break; case MG_RIBFILEPATH: *VALUE(char *) = _mgribc->filepath; break; case MG_RIBDISPLAY: *VALUE(int) = _mgribc->display; break; case MG_RIBDISPLAYNAME: *VALUE(char *) = _mgribc->displayname; break; case MG_RIBBACKING: *VALUE(int) = _mgribc->backing; break; case MG_RIBSHADER: *VALUE(int) = _mgribc->shader; break; case MG_RIBSCENE: *VALUE(char *) = _mgribc->ribscene; break; case MG_RIBCREATOR: *VALUE(char *) = _mgribc->ribcreator; break; case MG_RIBFOR: *VALUE(char *) = _mgribc->ribfor; break; case MG_RIBDATE: *VALUE(char *) = _mgribc->ribdate; break; default: OOGLError (0, "mgrib_ctxget: undefined option: %d\n", attr); return -1; } return 1; #undef VALUE } /*----------------------------------------------------------------------- * Function: mgribwindow * Description: create a RIB window * Args: *win: the WnWindow structure to realize * Returns: win if success, NULL if not * Author: wisdom, gunn * Date: Fri Sep 20 11:56:31 1991 * Notes: makes the RI calls necessary to create a RIB "window" * which is really a virtual window defining Format, Display, * etc. */ WnWindow * mgribwindow(WnWindow *win) { WnPosition wp; int xsize, ysize, flag, reconstrain; char *name; char gver[80]; double pxloc, pyloc, pxsize, pysize; char fullscene[280], fullcreator[280], fullfor[280], fulldate[280]; /* RIB 1.0 structure comments */ sprintf(fullscene,"Scene %s",_mgribc->ribscene); sprintf(fullcreator,"Creator %s",_mgribc->ribcreator); sprintf(fullfor,"For %s",_mgribc->ribfor); sprintf(fulldate,"CreationDate %s",_mgribc->ribdate); mrti(mr_header,"RenderMan RIB-Structure 1.0", mr_nl, mr_header, fullscene, mr_nl, mr_header, fullcreator, mr_nl, mr_header, fulldate, mr_nl, mr_header, fullfor, mr_nl, mr_header, "Frames 1", mr_nl, /* always 1 frame*/ mr_NULL); /* options */ if(_mgribc->shader && _mgribc->shadepath) { mrti(mr_header, "CapabilitiesNeeded ShadingLanguage", mr_nl, mr_embed, "version 3.03", mr_nl, mr_option, mr_string, "searchpath", mr_string, "shader", mr_nl, mr_embed, "[", mr_string, _mgribc->shadepath, mr_embed, "]", mr_nl, mr_nl, mr_NULL); } else { mrti(mr_embed, "version 3.03", mr_nl, mr_nl, mr_NULL); } /* set display characteristics...*/ mrti(mr_display, mr_string, _mgribc->displayname, (_mgribc->display == MG_RIBFRAME) ? mr_framebuffer : mr_file, mr_rgb, mr_NULL); /* window size */ WnGet(_mgc->win, WN_CURPOS, &wp); xsize = wp.xmax - wp.xmin + 1; ysize = wp.ymax - wp.ymin + 1; mrti(mr_format, mr_int, xsize, mr_int, ysize, mr_float, 1., mr_NULL); _mgribc->born = 1; return(win); } /*----------------------------------------------------------------------- * Function: mgrib_ctxset * Description: set some context attributes * Args: a1, ...: list of attribute-value pairs * Returns: nothing * Author: mbp * Date: Fri Sep 20 12:00:18 1991 */ void mgrib_ctxset( int a1, ... ) { va_list alist; va_start( alist, a1 ); _mgrib_ctxset(a1, &alist); va_end(alist); } /*----------------------------------------------------------------------- * Function: mgrib_feature * Description: report whether mgrib device has a particular feature * Args: feature: the feature to report on * Returns: an int giving info about feature * Author: wisdom * Date: Tue Aug 3 15:38:05 CDT 1993 * Notes: -1 means the feature is not present. * */ int mgrib_feature( int feature ) { if(feature == MGF_BEZIER) return 1; return(-1); } /*----------------------------------------------------------------------- * Function: mgrib_ctxdelete * Description: delete a GL context * Args: *ctx: context to delete * Returns: nothing * Author: slevy * Date: Tue Nov 12 10:29:04 CST 1991 * Notes: Deleting the current context leaves the current-context * pointer set to NULL. */ void mgrib_ctxdelete( mgcontext *ctx ) { /* if(_mgribc->rib) fclose(_mgribc->rib); */ if(ctx->devno != MGD_RIB) { mgcontext *was = _mgc; mgctxselect(ctx); mgctxdelete(ctx); if(was != ctx) mgctxselect(was); } else { if(((mgribcontext *)ctx)->shadepath) free(((mgribcontext *)ctx)->shadepath); mg_ctxdelete(ctx); if(ctx == _mgc) _mgc = NULL; } } /*----------------------------------------------------------------------- * Function: mgrib_ctxselect * Description: select a RIB context --- make it current * Args: *ctx: the context to become current * Returns: 0 (why ???) * Author: mbp, wisdom * Date: Fri Sep 20 12:04:41 1991 */ int mgrib_ctxselect( mgcontext *ctx ) { if(ctx == NULL || ctx->devno != MGD_RIB) { return mg_ctxselect(ctx); } _mgc = ctx; MGRIB = (mgribcontext *)ctx; return(0); } /*----------------------------------------------------------------------- * Function: mgrib_sync * Description: sync * Returns: nothing * Author: wisdom * Date: Mon Aug 2 18:05:41 CDT 1993 * Notes: sync with PRMAN not necessary */ void mgrib_sync( void ) {} /*----------------------------------------------------------------------- * Function: mgrib_worldbegin * Description: prepare to draw a frame * Returns: nothing * Author: wisdom, slevy, gunn * Date: Sat Mar 7 16:28:35 GMT-0600 1992 */ void mgrib_worldbegin( void ) { static Transform cam2ri = {{1, 0,0,0}, {0,1,0,0}, {0,0,-1,0},{0,0,0,1}}; int persp; float halfxfield, halfyfield, aspect, near, far, fov; WnWindow *win; int xsize, ysize; Transform T; WnPosition wp; char str[256]; float focallen; HPoint3 look; Point3 lookat; /* first, check to see if we need to open the default rib file */ /* IT'S NOW POSSIBLE THAT THIS WON'T GET SENT TO A FILE (streams) */ /* IN WHICH CASE IT WOULD BE WRONG TO OPEN A FILE. MOVE THIS!! */ if(!_mgribc->rib) _mgribc->rib = fopen(DEFAULT_RIB_FILE, "w+"); /* interpret options...(none exist now) */ /* this will make sure there's nothing left in the rib file */ /* we cannot use ftruncate because it generates an error on sgi */ /*ftruncate(fileno(_mgribc->rib), 0);*/ if (lseek(1, (off_t)0, 0) == (off_t)0 && ftruncate(1, (off_t)0) == -1) perror("ftruncate"); mg_worldbegin(); mg_findcam(); /* Camera is at (in its own coordinates) (0,0,0). * Looking toward vector (0,0,-1) * nominally looking at a point (0,0,-focallen) */ CamGet(_mgc->cam, CAM_FOCUS, &focallen); look.x = look.y = 0; look.z = -focallen; look.w = 1; /* Transform to world coordinates */ HPt3TransPt3(_mgc->C2W, &look, &lookat); /* Now the camera is at _mgc->cpos (this is a Point3), */ /* looking at lookat (another Point3) */ /* interpret camera ...*/ CamGet( _mgc->cam, CAM_NEAR, &near); CamGet( _mgc->cam, CAM_FAR, &far); mrti(mr_clipping, mr_float, near, mr_float, far, mr_NULL); CamGet( _mgc->cam, CAM_PERSPECTIVE, &persp); mrti(mr_projection, mr_string, persp?"perspective":"orthographic", mr_NULL); CamGet( _mgc->cam, CAM_ASPECT, &aspect ); CamGet( _mgc->cam, CAM_HALFYFIELD, &halfyfield ); halfxfield = halfyfield * aspect; mrti(mr_screenwindow, mr_float, -halfxfield, mr_float, halfxfield, mr_float, -halfyfield, mr_float, halfyfield, mr_NULL); CamGet( _mgc->cam, CAM_FOV, &fov); sprintf(str, "Field of view %g", fov); mrti(mr_comment, str, mr_NULL); mrti(mr_framebegin, mr_int, 1, mr_nl, mr_NULL); sprintf(str, "CameraOrientation %.4g %.4g %.4g %.4g %.4g %.4g", _mgc->cpos.x,_mgc->cpos.y,_mgc->cpos.z, lookat.x,lookat.y,lookat.z); mrti(mr_header, str, mr_nl, mr_NULL); mrti(mr_identity, mr_NULL); mgrib_printmatrix(cam2ri); mgrib_printmatrix(_mgc->W2C); /* Lighting Hack (*WAY* OBSOLETE) * mg_globallights(_mgc->astk->lighting.lights, 1); * if ( (_mgc->astk->lighting.lights != NULL) && * (_mgc->astk->ap.shading != APF_CONSTANT)) * mgrib_lights(_mgc->astk->lighting.lights, _mgc->astk); */ /* RiWorldBegin...*/ mrti(mr_nl, mr_nl, mr_worldbegin, mr_NULL); /* if the option is selected, add the background */ if(_mgribc->backing == MG_RIBDOBG) { float halfxbg = far * halfxfield, halfybg = far * halfyfield; float farz = -.99 * far; Point3 bg[4]; bg[0].x = -halfxbg; bg[0].y = -halfybg; bg[0].z = farz; bg[1].x = -halfxbg; bg[1].y = halfybg; bg[1].z = farz; bg[2].x = halfxbg; bg[2].y = halfybg; bg[2].z = farz; bg[3].x = halfxbg; bg[3].y = -halfybg; bg[3].z = farz; mrti(mr_comment, "simulate background color via polygon", mr_NULL); mrti(mr_attributebegin, mr_NULL); mgrib_printmatrix(_mgc->C2W); mrti(mr_surface, mr_constant, mr_NULL); mrti(mr_color, mr_parray, 3, &_mgc->background, mr_NULL); mrti(mr_polygon, mr_P, mr_parray, 4*3, bg, mr_NULL); mrti(mr_attributeend, mr_NULL); } /* bring ri state into accordance with appearance state */ { Appearance *ap = ApCopy( &(_mgc->astk->ap), NULL ); mgrib_setappearance( ap, MG_SET ); ApDelete(ap); } /* NOW DONE BY mg_worldbegin() *CamView(_mgc->cam, _mgribc->W2S); *TmTranslate(T, 1.0, 1.0, 0); *TmConcat(_mgribc->W2S,T, _mgribc->W2S); */ /* NOW DONE BY mg_worldbegin() *mgrib_ctxget(MG_WINDOW, &win); *WnGet(_mgc->win, WN_CURPOS, &wp); *xsize = wp.xmax - wp.xmin + 1; *ysize = wp.ymax - wp.ymin + 1; * *TmScale(T, (double)xsize*.5, (double)ysize*.5, 1.0); *TmConcat(_mgribc->W2S,T, _mgribc->W2S); * *TmCopy(_mgribc->W2S, _mgribc->O2S); */ } /*----------------------------------------------------------------------- * Function: mgrib_worldend * Description: finish drawing a frame * Returns: nothing * Author: wisdom * Date: Sat Mar 7 14:47:40 GMT-0600 1992 */ void mgrib_worldend( void ) { unsigned char *buffer = tokenbuffer; mrti(mr_worldend, mr_nl, mr_NULL); mrti(mr_frameend, mr_nl, mr_NULL); /* now flush the buffer, if appropriate */ /* mgrib_flushbuffer(); NOW DONE AT HIGHER LEVEL */ } /*----------------------------------------------------------------------- * Function: mgrib_reshapeviewport * Description: adjust to a new window size * Returns: nothing * Author: mbp * Date: Fri Sep 20 12:08:30 1991 * Notes: adjusts both GL's internal viewport setting, as well as * MG context WnWindow's current position and camera's * aspect ratio. */ void mgrib_reshapeviewport( void ) { WnWindow *win; WnPosition wp; int xsize, ysize; mgrib_ctxget(MG_WINDOW, &win); /* Get window; force it to ask * NeXTStep how big the window is */ WnGet(win, WN_CURPOS, &wp); xsize = wp.xmax - wp.xmin + 1; ysize = wp.ymax - wp.ymin + 1; CamSet(_mgc->cam, CAM_ASPECT, (double)xsize/(double)ysize, CAM_END); } /*----------------------------------------------------------------------- * Function: mgrib_identity * Description: set the current object xform to identity * Returns: nothing * Author: * Date: * Notes: * */ void mgrib_identity( void ) { mgrib_settransform( TM_IDENTITY ); } /*----------------------------------------------------------------------- * Function: mgrib_transform * Description: premultiply the object xform by T * Args: T * Returns: nothing * Author: mbp * Date: Fri Sep 20 12:24:57 1991 * Notes: We use the GL ModelView matrix stack, not the mgcontext's * stack. * */ void mgrib_transform( Transform T ) { mg_transform(T); mgrib_printmatrix(T); TmConcat(_mgc->xstk->T, _mgc->W2S, _mgc->O2S); } /*----------------------------------------------------------------------- * Function: mgrib_pushtransform * Description: push the object xform stack * Returns: nothing (???) * Author: mbp * Date: Fri Sep 20 12:25:43 1991 * Notes: We use the GL ModelView matrix stack, not the mgcontext's * stack. * * This assumes we're already in MVIEWING mode. */ int mgrib_pushtransform( void ) { mg_pushtransform(); mrti(mr_transformbegin, mr_NULL); } /*----------------------------------------------------------------------- * Function: mgrib_popransform * Description: pop the object xform stack * Returns: nothing (???) * Author: mbp * Date: Fri Sep 20 12:25:43 1991 * Notes: We use the GL ModelView matrix stack, not the mgcontext's * stack. * * This assumes we're already in MVIEWING mode. */ int mgrib_poptransform( void ) { mg_poptransform(); mrti(mr_transformend, mr_NULL); TmConcat(_mgc->xstk->T, _mgc->W2S, _mgc->O2S); } /*----------------------------------------------------------------------- * Function: mgrib_settransform * Description: set the current object xform to T * Args: T * Returns: nothing * Author: mbp * Date: Fri Sep 20 12:29:43 1991 * Notes: */ void mgrib_settransform( Transform T ) { mrti(mr_identity, mr_NULL); mg_settransform( T ); TmConcat(_mgc->xstk->T, _mgc->W2S, _mgc->O2S); if(T != TM_IDENTITY) mgrib_printmatrix(T); } /*----------------------------------------------------------------------- * Function: mgrib_pushappearance * Description: push the MG context appearance stack * Returns: nothing * Author: mbp * Date: Fri Sep 20 12:54:19 1991 */ int mgrib_pushappearance( void ) { mg_pushappearance(); mrti(mr_comment, "push appearance", mr_attributebegin, mr_NULL); } /*----------------------------------------------------------------------- * Function: mgrib_popappearance * Description: pop the MG context appearance stack * Returns: nothing * Author: * Date: * Note: Note that we do not have to do anything besides * AttributeEnd, because the RenderMan driver retains * the previous state information. 1/13/92 TMM */ int mgrib_popappearance( void ) { register struct mgastk *mastk = _mgc->astk; register struct mgastk *mastk_next; if (! (mastk_next=mastk->next)) { OOGLError(0, "mggl_popappearance: appearance stack has only 1 entry.\n"); return; } mrti(mr_comment, "pop appearance", mr_attributeend, mr_NULL); mg_popappearance(); } /*----------------------------------------------------------------------- * Function: mgrib_setappearance * Author: munzner, mbp, wisdom * Date: Wed Aug 7 01:08:07 1991 * Notes: Tossed mgrib_material, just use mgrib_appearance * since shaders depend on both appearance and material * settings. (4/1/93 TMM) */ Appearance * mgrib_setappearance( Appearance* ap, int mergeflag ) { int changed, mat_changed, lng_changed; struct mgastk *mastk = _mgc->astk; Appearance *ma; static float nullarray[] = { 0.0 }; ma = &(mastk->ap); /* Decide what changes */ if (mergeflag == MG_MERGE) { changed = ap->valid & ~ma->override; mat_changed = ap->mat ? ap->mat->valid & ~ma->mat->override : 0; lng_changed = ap->lighting ? ap->lighting->valid & ~ma->lighting->override : 0; } else { changed = ap->valid; mat_changed = ap->mat ? ap->mat->valid : 0; lng_changed = ap->lighting ? ap->lighting->valid : 0; } mg_setappearance( ap, mergeflag ); /* here is where everything gets set (sort of) */ if(_mgribc->born) { mgrib_appearance( mastk, changed, mat_changed); /* interpret lights ... */ mgrib_lighting(_mgc->astk, lng_changed); } } /*----------------------------------------------------------------------- * Function: mgrib_getappearance * Description: return a ptr to current appearance * Returns: ptr to current appearance * Author: mbp * Date: Fri Sep 20 13:00:41 1991 * Notes: Applications should not modify the returned appearance * in any way. */ Appearance * mgrib_getappearance() { return &(_mgc->astk->ap); } /*----------------------------------------------------------------------- * Function: mgrib_setcamera * Description: set the context's camera (pointer) * Args: *cam: the camera to use * Returns: nothing * Author: mbp * Date: Fri Sep 20 13:07:31 1991 * Notes: The context stores a pointer to the camera, not a copy * of it. */ int mgrib_setcamera( Camera* cam ) { if (_mgc->cam) CamDelete(_mgc->cam); _mgc->cam = cam; RefIncr((Ref*) cam); } /*----------------------------------------------------------------------- * Function: mgrib_newcontext * Description: initialize a new mgricontext structure * Args: *ctx: the struct to initialize * Returns: ctx * Author: mbp * Date: Fri Sep 20 13:11:03 1991 */ mgribcontext * mgrib_newcontext( mgribcontext *ctx ) { static char stdshaderpaths[] = ".:shaders:/usr/local/prman/prman/lib/shaders:/NextLibrary/Shaders"; char *geomdata = getenv("GEOMDATA"); mg_newcontext(&(ctx->mgctx)); ctx->mgctx.devfuncs = &mgribfuncs; ctx->mgctx.devno = MGD_RIB; ctx->mgctx.astk->ap_seq = 1; ctx->mgctx.astk->mat_seq = 1; ctx->mgctx.astk->light_seq = 1; ctx->born = 0; ctx->rib = NULL; ctx->backing = MG_RIBDOBG; ctx->shader = MG_RIBSTDSHADE; ctx->shadepath = NULL; /* should add context field */ if(geomdata) { char path[512]; sprintf(path, "%s:%s/shaders", stdshaderpaths, geomdata); ctx->shadepath = strdup(path); } /* initalize the token interface */ if(!tokenbuffer) mrti_init(); mrti_reset(); ctx->render_device = RMD_ASCII; ctx->line_mode = MG_RIBCYLINDER; return ctx; } /*----------------------------------------------------------------------- * Function: mgrib_findctx * Description: Given a GL window ID, returns the associated mg context. * Returns: mgcontext * for success, NULL if none exists. * Author: slevy * Date: Mon Nov 11 18:33:53 CST 1991 * Notes: This is a public routine. */ mgcontext * mgrib_findctx( long winid ) { register struct mgcontext *mgc; for(mgc = _mgclist; mgc != NULL; mgc = mgc->next) { if(mgc->devno == MGD_RIB && ((mgribcontext *)mgc)->win == winid) return mgc; } return NULL; } /*----------------------------------------------------------------------- * Function: mgrib_flushbuffer * Description: flushed tokens from buffer to a file * Returns: nothing * Author: wisdom * Date: Mon Jul 26 12:35:45 CDT 1993 * Notes: This is a public routine, prototyped in mgrib.h */ void mgrib_flushbuffer() { unsigned char *buffer = tokenbuffer; /* do we even want a buffer anymore? why? */ if(!_mgribc->rib) _mgribc->rib = fopen(DEFAULT_RIB_FILE, "w+"); while(buffer<ptr) putc(*(buffer++), _mgribc->rib); fflush(_mgribc->rib); mrti_reset(_mgribc->rib); } /*----------------------------------------------------------------------- * Function: mgrib_terminatebuffer * Description: NULL terminates the tokenbuffer, required to support NeXTs render panel * Returns: nothing * Author: wisdom * Date: Mon Jul 26 12:35:45 CDT 1993 * Notes: This is a public routine, prototyped in mgrib.h */ void mgrib_terminatebuffer() { *(ptr++) = 0; } /*----------------------------------------------------------------------- * Function: mgrib_tokenbuffer * Description: returns through indirection the tokenbuffer an size * Returns: char pointer to tokenbuffer * Author: wisdom * Date: Mon Jul 26 12:35:45 CDT 1993 * Notes: This is a public routine, prototyped in mgrib.h */ void mgrib_tokenbuffer(char **buffer, int *size) { *buffer = (char *)tokenbuffer; *size = ptr - tokenbuffer; }
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.