Amiga-Request@cs.odu.edu (Amiga Sources/Binaries Moderator) (02/11/90)
Submitted-by: <edavies@sanjuan.uvic.ca> Posting-number: Volume 90, Issue 064 Archive-name: applications/surf-r2/part02 #!/bin/sh # This is a shell archive. Remove anything before this line, then unpack # it by saving it into a file and typing "sh file". To overwrite existing # files, type "sh file -c". You can also feed this as standard input via # unshar, or by typing "sh <file", e.g.. If this archive is complete, you # will see the following message at the end: # "End of archive 2 (of 4)." # Contents: gadgetuse.c getfilenames.c mapcalc.c menu_files.c # menu_image.c menu_scrn.c revolve.c writeilbm.c # Wrapped by tadguy@xanth on Sat Feb 10 15:47:40 1990 PATH=/bin:/usr/bin:/usr/ucb ; export PATH if test -f 'gadgetuse.c' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'gadgetuse.c'\" else echo shar: Extracting \"'gadgetuse.c'\" \(5801 characters\) sed "s/^X//" >'gadgetuse.c' <<'END_OF_FILE' X/* this file contains definition for the screen */ X X#include "scrnio.ih" X#include <exec/memory.h> X#ifdef MANX X#include <functions.h> X#endif X X#include "scrndef.h" X#include "gadgetdef.h" X#include "mytypes.h" X#include "poly.h" X#include "readilbm.h" X X#define GetExtens(gei) ((struct GadExtens *)gei->UserData) X X Xvoid GadgetSetVal(gad) X struct Gadget *gad; X{ X struct GadExtens *vp; X struct PropInfo *prop; X long gadval; X X if( !(gad->GadgetType & PROPGADGET) ) { X return; X } X X if( !gad->GadgetRender ) { X gad->GadgetRender = (APTR) malloc(sizeof(struct Image)); X if( !gad->GadgetRender ) { X OutErr("Not enough memory for gadgets"); X CloseDisplay(); X exit( 0 ); X } X } X if( !gad->SpecialInfo ) { X static struct PropInfo dummyprop = { X FREEHORIZ|AUTOKNOB, X 0x8000, 1, /* HorizPot = initial value */ X 0xff, 0, /* not really of interest */ X 0,0,0,0,0,0 X }; X X gad->SpecialInfo = (APTR) malloc(sizeof(struct PropInfo)); X if( !gad->SpecialInfo ) { X OutErr("Not enough memory for gadgets"); X CloseDisplay(); X exit( 0 ); X } X *(struct PropInfo *)gad->SpecialInfo = dummyprop; X } X X vp = GetExtens( gad ); X if(!vp) { X return; X } X prop = (struct PropInfo *) gad->SpecialInfo; X X if( vp->isfloat ) { X gadval = (long)( (long)MAXPOT * X ( vp->curfval - vp->minfval )/(vp->maxfval - vp->minfval)); X prop->HorizBody = MAXPOT /( 15 * 8 ); X } X else { X gadval = ( (long)MAXPOT * X ( (long) vp->curival - vp->minival))/(vp->maxival - vp->minival); X prop->HorizBody = MAXPOT /( vp->maxival - vp->minival ); X } X X prop->HorizPot = gadval; X} X X X Xvoid GadgetUpdate(gad, exists) X struct Gadget *gad; X bool exists; /* has the gadget already been displayed? */ X{ X struct GadExtens *vp; X long potvalue; X char dbuff[25]; X char *tx, *dx; X struct IntuiText *it; X X if(!( gad->GadgetType & PROPGADGET) ) { X return; X } X X vp = GetExtens( gad ); X if(!vp) return; X X potvalue = ((struct PropInfo *) gad->SpecialInfo)->HorizPot; X X if( vp->isfloat ) { X float temp; X temp = ( potvalue * (vp->maxfval - vp->minfval ))/ MAXPOT X + vp->minfval; X vp->curfval = temp; X#if !MANX X sprintf(dbuff,"%f ", temp); X#else X ftoa(temp, dbuff, sizeof(dbuff)-4, 1); X#endif !MANX X } X else { X long temp; X temp = (long)( potvalue * (vp->maxival - vp->minival ))/ MAXPOT X + vp->minival; X vp->curival = temp; X sprintf(dbuff,"%-12d", temp); X } X /* X * find '[' X */ X it = gad->GadgetText; X for( tx = (char *)it->IText; *tx && *tx != '['; tx++ ) { X ; X } X if( !*tx ) { X return; /* something screwy */ X } X tx++; /* skip past opening bracket */ X dx = dbuff; X while( *tx != ']' ) { X *tx++ = *dx++; X } X X if(exists){ X long tempx, tempy; X tempx = it->LeftEdge + gad->LeftEdge; X tempy = it->TopEdge + gad->TopEdge + 6; /*fudge factor for baseline*/ X Move( CntrlWin->RPort, tempx, tempy ); X SetAPen(CntrlWin->RPort,it->FrontPen ); X Text( CntrlWin->RPort, it->IText, strlen(it->IText )); X } X} X Xvoid SetHourGlass() { X SetPointer( SurfWin, HourGlass, 16, 16, MPtrXOffset, MPtrYOffset); X SetPointer( GadWin, HourGlass, 16, 16, MPtrXOffset, MPtrYOffset); X SetPointer( CntrlWin, HourGlass, 16, 16, MPtrXOffset, MPtrYOffset); X} X Xvoid ClearHourGlass() { X ClearPointer(SurfWin); X ClearPointer(GadWin); X ClearPointer(CntrlWin); X} X Xvoid GadgetHandler(gadaddr) X struct Gadget *gadaddr; X{ X short curival; X float curfval; X X if( gadaddr->UserData ) { X GadgetUpdate( gadaddr, true ); X curival = ((struct GadExtens *) gadaddr->UserData)->curival; X curfval = ((struct GadExtens *) gadaddr->UserData)->curfval; X } X X switch( (enum GadgetName) gadaddr->GadgetID ) { X case N_PtLocX: X LightSrc.x = (float)curival; X break; X case N_PtLocY: X LightSrc.y = (float)curival; X break; X case N_BackPlane: X BackColor = curival; X break; X case N_PtLocZ: X LightSrc.z = (float)curival; X break; X case N_BkIntens: X Ambience = curfval; X break; X case N_PtIntens: X PtIntensity = curfval; X break; X case N_Kdiffuse: X Kd = curfval; X break; X case N_Kspec: X Ks = curfval; X break; X case N_Map: X /* ResetCurve(); */ X SetHourGlass(); X RevMap(); X ClearHourGlass(); X break; X case N_Wire: X SetHourGlass(); X RevNoShade(); X ClearHourGlass(); X break; X case N_Shaded: X SetHourGlass(); X RevShade(); X ClearHourGlass(); X break; X case N_EditBez: X SetFitBez(); X break; X case N_DefLines: X SetPolyDraw(); X break; X case N_RevAngle: X SetRotRange( curival ); X break; X case N_RevStart: X SetRotStart( curival ); X break; X case N_TiltAng: X SetSecAng( curival ); X break; X case N_RevSlices: X SetRevMesh( curival ); X break; X case N_BezSlices: X SetBezMesh( curival ); X break; X case N_SurfDist: X SetSurfDist( curival); X break; X case N_RepV: X MapRepV = curival; X PrepImgPix(); X break; X case N_RepH: X MapRepH = curival; X PrepImgPix(); X break; X case N_GoSurf: X ScreenToFront( SurfScrn ); X break; X case N_GoPanel: X WBenchToFront(); X WindowToFront( CntrlWin ); X break; X default: X break; X } X} END_OF_FILE if test 5801 -ne `wc -c <'gadgetuse.c'`; then echo shar: \"'gadgetuse.c'\" unpacked with wrong size! fi # end of 'gadgetuse.c' fi if test -f 'getfilenames.c' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'getfilenames.c'\" else echo shar: Extracting \"'getfilenames.c'\" \(4299 characters\) sed "s/^X//" >'getfilenames.c' <<'END_OF_FILE' X#include <intuition/intuition.h> X#include "scrnio.ih" X#include <exec/memory.h> X#ifdef MANX X#include <functions.h> X#endif X X#include "scrndef.h" X#include "mytypes.h" X X X#define StringSize 40 X#define ROW 8 X#define COL 8 X#define TextX COL X#define TextY (ROW/2) X#define StringX 8 X#define StringY 12 X#define ReqSizeX 50*COL X#define ReqSizeY 6*ROW X X#define CodeGo 100 X#define CodeCancel 101 X X/* X * declarations for a cancel button to be used by both X * requestors. X */ Xstatic struct IntuiText TextCancel = { X 1,-1,JAM1, 2, 1, NULL,(UBYTE *) "Cancel", NULL }; X Xstatic short S_Cancel[] = { X -2,-1, -2,ROW+1, 6*COL+2,ROW+1, 6*COL+2,-1, -2,-1 X }; X Xstatic struct Border B_Cancel = { 0, 0, 1, 0, JAM1, 5, S_Cancel, NULL }; X Xstatic struct Gadget G_Cancel = { X NULL, X 10*COL, ROW *4, 6*COL, ROW, /* loc and size of hit box */ X GADGHBOX, /* complemented when pressed */ X RELVERIFY, /* just get gadget up messages */ X BOOLGADGET | REQGADGET, X (APTR)&B_Cancel, NULL, X &TextCancel, X 0, NULL, X (int)CodeCancel, X NULL X }; X X/* X * String gadget to get ilbm filename X */ Xstatic char OutTitle[] = { "output filename:" }; Xstatic char InTitle[] = { "input filename:" }; X Xstatic struct IntuiText TextOutFile = { X 1,1,JAM1, TextX, TextY, NULL, X (UBYTE *)OutTitle, NULL X }; Xstatic struct IntuiText TextInFile = { X 1,1,JAM1, TextX, TextY, NULL, X (UBYTE *)InTitle, NULL X }; X X Xstatic char OutNameBuff[StringSize] = { "out.ilbm" }; Xstatic char InNameBuff[StringSize] = { "in.ilbm" }; Xstatic char undo[StringSize]; X Xstatic struct StringInfo S_OutFile = { X (UBYTE *)OutNameBuff, X (UBYTE *)undo, X 0, X sizeof( OutNameBuff), X 0, X 0, X 13, X 0, X 0,0,NULL,0, NULL X}; X Xstatic struct StringInfo S_InFile = { X (UBYTE *)InNameBuff, X (UBYTE *)undo, X 0, X sizeof( InNameBuff), X 0, X 0, X 13, X 0, X 0,0,NULL,0, NULL X}; X Xstatic short BD_InOut[] = { X -2,-1, -2, ROW, (StringSize-1)*COL+1,ROW, X (StringSize-1)*COL+1,-1, -2, -1 X }; X Xstatic struct Border B_InOut = { 0, 0, 1, 0, JAM1, 5, BD_InOut, NULL }; X Xstatic struct Gadget G_OutFile = { X &G_Cancel, X StringX , StringY, /* loc */ X sizeof(OutNameBuff)*COL, ROW, /* size */ X GADGHCOMP, X RELVERIFY /* | STRINGCENTER */, X STRGADGET | REQGADGET, X (APTR)&B_InOut, /* border */ X NULL, /* high lighted */ X &TextOutFile, X 0, X (APTR) &S_OutFile, X (int)CodeGo, X NULL X }; X X Xstatic struct Gadget G_InFile = { X &G_Cancel, X StringX , StringY, /* loc */ X sizeof(InNameBuff)*COL, ROW, /* size */ X GADGHCOMP, X RELVERIFY/* | STRINGCENTER */, X STRGADGET | REQGADGET, X (APTR)&B_InOut, /* border */ X NULL, /* high lighted */ X NULL, /* text */ X 0, X (APTR) &S_InFile, X (int)CodeGo, X NULL X }; X Xstatic struct Requester R_InFile = { X NULL, X COL*10, ROW*4, ReqSizeX, ReqSizeY, X 0, 0, X &G_InFile, X NULL, X &TextInFile, X NULL, X 2, /* backfill */ X NULL, X { NULL }, X { NULL }, X NULL, X { NULL }, X}; X X X X Xstatic struct Requester R_OutFile = { X NULL, X COL*10, ROW*4, ReqSizeX, ReqSizeY, X 0, 0, X &G_OutFile, X NULL, X &TextOutFile, X NULL, X 2, /* backfill */ X NULL, X { NULL }, X { NULL }, X NULL, X { NULL }, X}; X Xstatic bool XWaitForUser() { X struct IntuiMessage mycopy, X *orig; X long wakeupmask; X X for(;;) { X wakeupmask = Wait( 1<< CntrlWin->UserPort->mp_SigBit ); X X /* X * handle messages for the control window X */ X X while( orig =(struct IntuiMessage *) GetMsg( CntrlWin->UserPort ) ) { X X mycopy = *orig; X ReplyMsg( orig ); X X if( mycopy.Class == GADGETUP ) { X USHORT code; X X code = ((struct Gadget*)mycopy.IAddress)->GadgetID; X if( code == CodeGo ) return( true ); X if( code == CodeCancel) return(false); X } X } X } X} X X X Xchar *GetInFile() X{ X bool answer; X Request( &R_InFile, CntrlWin); X answer = WaitForUser(); X EndRequest( &R_InFile, CntrlWin); X return( answer?InNameBuff: NULL); X} X X Xchar *GetOutFile() X{ X bool answer; X Request( &R_OutFile, CntrlWin); X answer = WaitForUser(); X EndRequest( &R_OutFile, CntrlWin); X return( answer?OutNameBuff: NULL); X} X X X X END_OF_FILE if test 4299 -ne `wc -c <'getfilenames.c'`; then echo shar: \"'getfilenames.c'\" unpacked with wrong size! fi # end of 'getfilenames.c' fi if test -f 'mapcalc.c' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'mapcalc.c'\" else echo shar: Extracting \"'mapcalc.c'\" \(5365 characters\) sed "s/^X//" >'mapcalc.c' <<'END_OF_FILE' X#include <math.h> X#include "mytypes.h" X#include "revolve.h" /* need to get scrnpair from here */ X#include "mapstuff.h" X#include "menuexp.h" X X#ifdef TEST X#undef DebugOn X#define DebugOn 1 X#endif TEST X X X#define DEBUG X/* X * this section of code derived from: X * "The essential algorithms of ray tracing" by Eric Haines X * presented in Sigraph proceedings on Ray Tracing X * my major change has been to simplify it for two dimensions X */ X Xtypedef struct { X float x, y; X} Vector; X Xstatic float DotVector(a,b) X Vector *a, *b; X{ X return( a->x * b->x + a->y * b->y); X} X Xstatic void DivVector(in, scale, out) X Vector *in, *out; X float scale; X{ X if ( fabs(scale) < SingleTinyVal ) { X out->x = SingleLargeVal; X out->y = SingleLargeVal; X } X else { X out->x = in->x / scale; X out->y = in->y / scale; X } X} X X X Xstatic Vector Na, Nb, Nc; Xstatic float Du0, Du1, Du2, X Dv0, Dv1, Dv2; Xstatic Vector Qux, Quy, X Qvx, Qvy; Xstatic float Dux, Duy, X Dvx, Dvy; Xstatic bool IsQuadu, IsQuadv; X Xvoid CalcMapConsts(vp) X register ScrnPair *vp; X#define p00 vp[0] X#define p01 vp[1] X#define p11 vp[2] X#define p10 vp[3] X{ X Vector Pa, Pb, Pc, Pd; X X Pa.x = p00.x - p10.x + p11.x - p01.x; X Pa.y = p00.y - p10.y + p11.y - p01.y; X X Pb.x = p10.x - p00.x; X Pb.y = p10.y - p00.y; X X Pc.x = p01.x - p00.x; X Pc.y = p01.y - p00.y; X X Pd.x = p00.x; X Pd.y = p00.y; X X Na.x = Pa.y; Na.y = -Pa.x; X Nc.x = Pc.y; Nc.y = -Pc.x; X Nb.x = Pb.y; Nb.y = -Pb.x; X X Du0 = DotVector(&Nc, &Pd); X Du1 = DotVector(&Na, &Pd) + DotVector(&Nc, &Pb); X Du2 = DotVector( &Na, &Pb); X X if( fabs( Du2 ) > SingleTinyVal ) { X float TwoDu2; X X IsQuadu = true; X TwoDu2 = 2.0 * Du2; X DivVector( &Na, TwoDu2, &Qux ); X DivVector( &Nc, -Du2, &Quy ); X Duy = Du0/Du2; X Dux = -Du1/TwoDu2; X } X else { X IsQuadu = false; X } X X Dv0 = DotVector( &Nb, &Pd); X Dv1 = DotVector(&Na, &Pd) + DotVector(&Nb, &Pc); X Dv2 = DotVector( &Na, &Pc); X if( fabs( Dv2 ) > SingleTinyVal ) { X float TwoDv2; X X IsQuadv = true; X TwoDv2 = 2.0 * Dv2; X DivVector( &Na, TwoDv2, &Qvx); X DivVector( &Nb, -Dv2, &Qvy); X/* DivVector( &Nc, -Dv2, &Qvy); */ X Dvx = - Dv1/TwoDv2; X Dvy = Dv0/Dv2; X } X else { X IsQuadv = false; X } X#ifdef DEBUG X if( DebugOn ) { X printf("du2 %f, du1 %f, du0 %f\n", Du2, Du1, Du0 ); X printf("dv2 %f, dv1 %f, dv0 %f\n", Dv2, Dv1, Dv0 ); X printf("Na = (%f, %f), Nb = (%f,%f), Nc = (%f,%f)\n", X Na.x, Na.y, Nb.x, Nb.y, Nc.x, Nc.y ); X printf("IsQuad =(%c, %c)\n", IsQuadu?'t':'f', IsQuadv? 't': 'f' ); X } X#endif DEBUG X X} X X X/* X * given points px,py in the quadrilateral, map them to points inside a X * unit square X */ Xvoid MapXYRatio(px, py, outx, outy, SweepCode) X float px, py; X float *outx, *outy; X short SweepCode; X{ X float resu, resv; X Vector Ri; X X X Ri.x = px; Ri.y = py; X X if( !IsQuadu ) { X float denom; X denom = (Du1 - DotVector(&Na, &Ri)); X if( fabs(denom) < SingleTinyVal ) X resu = 2.0; X else X resu = (DotVector(&Nc, &Ri) - Du0)/denom; X } else { X float Ka, Kb; X float discrim; X X Ka = Dux + DotVector( &Qux, &Ri); X Kb = Duy + DotVector( &Quy, &Ri); X discrim = sqrt(fabs(Ka * Ka - Kb)); X resu = Ka + ((discrim > Ka)? discrim: (-discrim)); X#ifdef DEBUG X if( DebugOn ) { X printf("dux=%f, duy = %f, ka = %f, kb = %f\n", X Dux, Duy, Ka, Kb ); X } X#endif DEBUG X X } X X if( !IsQuadv ) { X float denom; X denom = (Dv1 - DotVector(&Na, &Ri)); X if( fabs(denom) < SingleTinyVal ) X resv = 2.0; X else X resv = (DotVector(&Nb, &Ri) - Dv0)/denom; X } else { X float Ka, Kb; X float discrim; X X Ka = Dvx + DotVector( &Qvx, &Ri); X Kb = Dvy + DotVector( &Qvy, &Ri); X discrim = sqrt(fabs( Ka * Ka - Kb)); X resv = Ka + ((discrim > Ka)? discrim: (-discrim)); X#ifdef DEBUG X if( DebugOn ) { X printf("dvx=%f, dvy = %f, ka = %f, kb = %f\n", X Dvx, Dvy, Ka, Kb ); X } X#endif DEBUG X } X X#ifdef DEBUG X if( DebugOn ) { X printf("(%f,%f) -> (%f, %f)\n", px, py, resu, resv ); X } X#endif DEBUG X X if( resu > 1.0 || resu < 0.0 ) { X resu = ( SweepCode & MP_XMAX)? 1.0: 0.0; X } X if( resv > 1.0 || resv < 0.0 ) { X resv = ( SweepCode & MP_YMAX)? 1.0: 0.0; X } X X *outx = resu; *outy = resv; X} X X X X/* X * here abides testcode X */ X#ifdef TEST X#include <stdio.h> X XReadScrnPair(set, a) X char *set; X ScrnPair *a; X{ X int tx, ty; X printf("enter screen pair %s\n",set); X scanf("%d %d", &tx, &ty); X a->x = tx; a->y = ty; X} X XReadLimits(a) XScrnPair a[]; X{ X ReadScrnPair("a", &a[0]); X ReadScrnPair("b", &a[1]); X ReadScrnPair("c", &a[2]); X ReadScrnPair("d", &a[3]); X} X Xmain() { X float inx, iny; X float outy, outx; X ScrnPair pts[4]; X X ReadLimits(pts); X CalcMapConsts(pts); X while(!feof(stdin)) { X printf("enter quadrilateral points\n"); X scanf("%f %f", &inx, &iny ); X MapXYRatio( inx, iny, &outx, &outy, 0); X printf("p(%f,%f)->p(%f,%f)\n", inx, iny, outx, outy); X } X} X#endif TEST END_OF_FILE if test 5365 -ne `wc -c <'mapcalc.c'`; then echo shar: \"'mapcalc.c'\" unpacked with wrong size! fi # end of 'mapcalc.c' fi if test -f 'menu_files.c' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'menu_files.c'\" else echo shar: Extracting \"'menu_files.c'\" \(7512 characters\) sed "s/^X//" >'menu_files.c' <<'END_OF_FILE' X#include "gadgetdef.h" X Xstatic struct IntuiText filetext[] = { X { 0, 1, JAM2, 2, 0, NULL, (UBYTE *)"save as", NULL }, X { 0, 1, JAM2, 2, 0, NULL, (UBYTE *)"save first", NULL }, X { 0, 1, JAM2, 2, 0, NULL, (UBYTE *)"save next", NULL }, X { 0, 1, JAM2, 2, 0, NULL, (UBYTE *)"open map", NULL }, X { 0, 1, JAM2, 2, 0, NULL, (UBYTE *)"close map", NULL }, X { 0, 1, JAM2, 2, 0, NULL, (UBYTE *)"write data", NULL } X}; X Xstatic struct IntuiText greytext[] = { X { 0, 1, JAM2, 2, 0, NULL, (UBYTE *)"Grey model", NULL }, X { 0, 1, JAM2, 20, 0, NULL, (UBYTE *)"Average", NULL }, X { 0, 1, JAM2, 20, 0, NULL, (UBYTE *)"Lumin", NULL }, X { 0, 1, JAM2, 20, 0, NULL, (UBYTE *)"Distance", NULL }, X { 0, 1, JAM2, 20, 0, NULL, (UBYTE *)"R only", NULL }, X { 0, 1, JAM2, 20, 0, NULL, (UBYTE *)"G only", NULL }, X { 0, 1, JAM2, 20, 0, NULL, (UBYTE *)"B only", NULL } X}; X Xstatic struct IntuiText packtext[] = { X { 0, 1, JAM2, 2, 0, NULL, (UBYTE *)"compression", NULL }, X { 0, 1, JAM2, 20, 0, NULL, (UBYTE *)"run length", NULL }, X { 0, 1, JAM2, 20, 0, NULL, (UBYTE *)"none", NULL } X}; X X X X#define FILEFLAGS ( ITEMTEXT | HIGHCOMP | ITEMENABLED ) X Xstatic struct MenuItem packitems[] = { X { &packitems[1], /* next item */ X 90, 0, 110 , 10, /* x,y,w,h */ X COLMEMFLAGS| CHECKED, X 2, /* mutual exclude bits */ X (APTR) &packtext[1], /* grey */ X NULL, /* highlight image */ X 'h', /* command byte ? */ X NULL, /* submenu item */ X 0 /* next select for select dragging */ X }, X { NULL, /* next item */ X 90, 10, 110 , 10, /* x,y,w,h */ X COLMEMFLAGS, X 1, /* mutual exclude bits */ X (APTR) &packtext[2], /* grey */ X NULL, /* highlight image */ X 'h', /* command byte ? */ X NULL, /* submenu item */ X 0 /* next select for select dragging */ X } X}; X X#define GREYMUTUAL(pos) (077 ^ (1<<(pos))) Xstatic struct MenuItem greyitems[] = { X { &greyitems[1], /* next item */ X 90, 0, 80 , 10, /* x,y,w,h */ X COLMEMFLAGS|CHECKED, X GREYMUTUAL(0), /* mutual exclude bits */ X (APTR) &greytext[1], /* average */ X NULL, /* highlight image */ X 'h', /* command byte ? */ X NULL, /* submenu item */ X 0 /* next select for select dragging */ X }, X { &greyitems[2], /* next item */ X 90, 10, 80 , 10, /* x,y,w,h */ X COLMEMFLAGS, X GREYMUTUAL(1), /* mutual exclude bits */ X (APTR) &greytext[2], /* lumin */ X NULL, /* highlight image */ X 'h', /* command byte ? */ X NULL, /* submenu item */ X 0 /* next select for select dragging */ X }, X { &greyitems[3], /* next item */ X 90, 20, 80 , 10, /* x,y,w,h */ X COLMEMFLAGS, X GREYMUTUAL(2), /* mutual exclude bits */ X (APTR) &greytext[3], /* dist */ X NULL, /* highlight image */ X 'h', /* command byte ? */ X NULL, /* submenu item */ X 0 /* next select for select dragging */ X }, X { &greyitems[4], /* next item */ X 90, 30, 80 , 10, /* x,y,w,h */ X COLMEMFLAGS, X GREYMUTUAL(3), /* mutual exclude bits */ X (APTR) &greytext[4], /* dist */ X NULL, /* highlight image */ X 'h', /* command byte ? */ X NULL, /* submenu item */ X 0 /* next select for select dragging */ X }, X { &greyitems[5], /* next item */ X 90, 40, 80 , 10, /* x,y,w,h */ X COLMEMFLAGS, X GREYMUTUAL(4), /* mutual exclude bits */ X (APTR) &greytext[5], /* dist */ X NULL, /* highlight image */ X 'h', /* command byte ? */ X NULL, /* submenu item */ X 0 /* next select for select dragging */ X }, X { NULL, /* next item */ X 90, 50, 80 , 10, /* x,y,w,h */ X COLMEMFLAGS, X GREYMUTUAL(5), /* mutual exclude bits */ X (APTR) &greytext[6], /* dist */ X NULL, /* highlight image */ X 'h', /* command byte ? */ X NULL, /* submenu item */ X 0 /* next select for select dragging */ X } X}; X X X X Xstatic struct MenuItem fileitems[] = { X { &fileitems[1], /* next item */ X 10, 0, 90 , 10, /* x,y,w,h */ X FILEFLAGS, X 0, /* mutual exclude bits */ X (APTR) &filetext[0], /* grey */ X NULL, /* highlight image */ X 'h', /* command byte ? */ X NULL, /* submenu item */ X 0 /* next select for select dragging */ X }, X { &fileitems[2], /* next item */ X 10, 10, 90 , 10, /* x,y,w,h */ X FILEFLAGS, X 0, /* mutual exclude bits */ X (APTR) &filetext[1], /* grey */ X NULL, /* highlight image */ X 'h', /* command byte ? */ X NULL, /* submenu item */ X 0 /* next select for select dragging */ X }, X { &fileitems[3], /* next item */ X 10, 20, 90 , 10, /* x,y,w,h */ X FILEFLAGS, X 0, /* mutual exclude bits */ X (APTR) &filetext[2], /* grey */ X NULL, /* highlight image */ X 'h', /* command byte ? */ X NULL, /* submenu item */ X 0 /* next select for select dragging */ X }, X { &fileitems[4], /* next item */ X 10, 30, 90 , 10, /* x,y,w,h */ X FILEFLAGS, X 0, /* mutual exclude bits */ X (APTR) &packtext[0], /* grey */ X NULL, /* highlight image */ X 'h', /* command byte ? */ X packitems, /* submenu item */ X 0 /* next select for select dragging */ X }, X { &fileitems[5], /* next item */ X 10, 40, 90 , 10, /* x,y,w,h */ X FILEFLAGS, X 0, /* mutual exclude bits */ X (APTR) &filetext[3], /* grey */ X NULL, /* highlight image */ X 'h', /* command byte ? */ X NULL, /* submenu item */ X 0 /* next select for select dragging */ X }, X { &fileitems[6], /* next item */ X 10, 50, IMAGE_HITWIDTH , 10, /* x,y,w,h */ X COLMEMFLAGS, X 1, /* mutual exclude bits */ X (APTR) &greytext[0], /* red */ X NULL, /* highlight image */ X 'h', /* command byte ? */ X greyitems, /* submenu item */ X 0 /* next select for select dragging */ X }, X { &fileitems[7], /* next item */ X 10, 60, 90 , 10, /* x,y,w,h */ X FILEFLAGS, X 0, /* mutual exclude bits */ X (APTR) &filetext[4], /* grey */ X NULL, /* highlight image */ X 'h', /* command byte ? */ X NULL, /* submenu item */ X 0 /* next select for select dragging */ X }, X { NULL, /* next item */ X 10, 70, 90 , 10, /* x,y,w,h */ X FILEFLAGS, X 0, /* mutual exclude bits */ X (APTR) &filetext[5], /* grey */ X NULL, /* highlight image */ X 'h', /* command byte ? */ X NULL, /* submenu item */ X 0 /* next select for select dragging */ X } X}; X Xextern char *GetOutFile(); Xextern char *GetInFile(); X XMenuDoFile(item) Xint item; X{ X static int filecnt = 0; X char tempbuff[80]; X char *filename; X bool packflag; X int i; X X packflag = Selected( packitems[0] )?1:0; X X X switch (item ) { X case 0: X if( (filename = GetOutFile())) { X SetHourGlass(); X WriteIlbm(filename, &SurfWinDef, &SurfScrnDef, packflag); X } X break; X case 1: X filecnt = 0; /* deliberate fall into case 2 */ X case 2: X if( filename = GetOutFile()) { X SetHourGlass(); X sprintf(tempbuff, "%s.%d", filename, filecnt++ ); X WriteIlbm(tempbuff, &SurfWinDef, &SurfScrnDef, packflag); X } X break; X case 4: X if( filename = GetInFile()){ X SetHourGlass(); X ReadIlbm( filename); X } X break; X case 5: X for( i = 0; i < (sizeof(greyitems)/sizeof(greyitems[0])); i++ ) { X if( Selected(greyitems[i])) { X SetGreyModel(i); X } X } X break; X case 6: X CloseImgPix(); X break; X case 7: X if( filename = GetOutFile()) { X SetHourGlass(); X WriteData(filename); X } X break; X X default: X break; X } X X ClearHourGlass(); X} END_OF_FILE if test 7512 -ne `wc -c <'menu_files.c'`; then echo shar: \"'menu_files.c'\" unpacked with wrong size! fi # end of 'menu_files.c' fi if test -f 'menu_image.c' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'menu_image.c'\" else echo shar: Extracting \"'menu_image.c'\" \(6963 characters\) sed "s/^X//" >'menu_image.c' <<'END_OF_FILE' X#include "menuexp.h" X X X/* X * Menu description for selecting color mapping X */ Xstatic struct IntuiText Specular = { X 0, 1, JAM2, 20, 0, NULL, (UBYTE *)"Specular", NULL X}; X Xstatic struct IntuiText revtext[] = { X { 0, 1, JAM2, 2, 0, NULL, (UBYTE *)"Rev. Axis", NULL }, X { 0, 1, JAM2, 20, 0, NULL, (UBYTE *)"X", NULL }, X { 0, 1, JAM2, 20, 0, NULL, (UBYTE *)"Y", NULL } X}; X Xstatic struct IntuiText dithertext[] = { X { 0, 1, JAM2, 2, 0, NULL, (UBYTE *)"Dither", NULL }, X { 0, 1, JAM2, 20, 0, NULL, (UBYTE *)"none", NULL }, X { 0, 1, JAM2, 20, 0, NULL, (UBYTE *)"2", NULL }, X { 0, 1, JAM2, 20, 0, NULL, (UBYTE *)"4", NULL }, X { 0, 1, JAM2, 20, 0, NULL, (UBYTE *)"8", NULL }, X { 0, 1, JAM2, 20, 0, NULL, (UBYTE *)"16", NULL }, X { 0, 1, JAM2, 20, 0, NULL, (UBYTE *)"32", NULL }, X { 0, 1, JAM2, 20, 0, NULL, (UBYTE *)"64", NULL }, X { 0, 1, JAM2, 20, 0, NULL, (UBYTE *)"128", NULL } X}; X X Xstatic struct IntuiText MiscText[] = { X { 0, 1, JAM2, 20, 0, NULL, (UBYTE *)"Abort Draw", NULL }, X { 0, 1, JAM2, 20, 0, NULL, (UBYTE *)"Debug", NULL }, X { 0, 1, JAM2, 20, 0, NULL, (UBYTE *)"Flip XY Map", NULL } X}; X Xstruct MenuItem revitems[] = { X { &revitems[1], /* next item */ X 90, 0, 80 , 10, /* x,y,w,h */ X COLMEMFLAGS| CHECKED, X 2, /* mutual exclude bits */ X (APTR) &revtext[1], /* grey */ X NULL, /* highlight image */ X 'h', /* command byte ? */ X NULL, /* submenu item */ X 0 /* next select for select dragging */ X }, X { NULL, /* next item */ X 90, 10, 80 , 10, /* x,y,w,h */ X COLMEMFLAGS, X 1, /* mutual exclude bits */ X (APTR) &revtext[2], /* grey */ X NULL, /* highlight image */ X 'h', /* command byte ? */ X NULL, /* submenu item */ X 0 /* next select for select dragging */ X } X}; X X#define DitherExMask(X) (((1<<8)-1) ^ (1<<X)) X Xstruct MenuItem ditheritems[] = { X { &ditheritems[1], /* next item */ X 90, 0, 80 , 10, /* x,y,w,h */ X COLMEMFLAGS, X DitherExMask(0), /* mutual exclude bits */ X (APTR) &dithertext[1], /* grey */ X NULL, /* highlight image */ X 'h', /* command byte ? */ X NULL, /* submenu item */ X 0 /* next select for select dragging */ X }, X { &ditheritems[2], /* next item */ X 90, 10, 80 , 10, /* x,y,w,h */ X COLMEMFLAGS, X DitherExMask(1), /* mutual exclude bits */ X (APTR) &dithertext[2], /* grey */ X NULL, /* highlight image */ X 'h', /* command byte ? */ X NULL, /* submenu item */ X 0 /* next select for select dragging */ X }, X { &ditheritems[3], /* next item */ X 90, 20, 80 , 10, /* x,y,w,h */ X COLMEMFLAGS| CHECKED, X DitherExMask(2), /* mutual exclude bits */ X (APTR) &dithertext[3], /* grey */ X NULL, /* highlight image */ X 'h', /* command byte ? */ X NULL, /* submenu item */ X 0 /* next select for select dragging */ X }, X { &ditheritems[4], /* next item */ X 90, 30, 80 , 10, /* x,y,w,h */ X COLMEMFLAGS, X DitherExMask(3), /* mutual exclude bits */ X (APTR) &dithertext[4], /* grey */ X NULL, /* highlight image */ X 'h', /* command byte ? */ X NULL, /* submenu item */ X 0 /* next select for select dragging */ X }, X { &ditheritems[5], /* next item */ X 90, 40, 80 , 10, /* x,y,w,h */ X COLMEMFLAGS, X DitherExMask(4), /* mutual exclude bits */ X (APTR) &dithertext[5], /* grey */ X NULL, /* highlight image */ X 'h', /* command byte ? */ X NULL, /* submenu item */ X 0 /* next select for select dragging */ X }, X { &ditheritems[6], /* next item */ X 90, 50, 80 , 10, /* x,y,w,h */ X COLMEMFLAGS, X DitherExMask(5), /* mutual exclude bits */ X (APTR) &dithertext[6], /* grey */ X NULL, /* highlight image */ X 'h', /* command byte ? */ X NULL, /* submenu item */ X 0 /* next select for select dragging */ X }, X { &ditheritems[7], /* next item */ X 90, 60, 80 , 10, /* x,y,w,h */ X COLMEMFLAGS, X DitherExMask(6), /* mutual exclude bits */ X (APTR) &dithertext[7], /* grey */ X NULL, /* highlight image */ X 'h', /* command byte ? */ X NULL, /* submenu item */ X 0 /* next select for select dragging */ X }, X { NULL, /* next item */ X 90, 70, 80 , 10, /* x,y,w,h */ X COLMEMFLAGS, X DitherExMask(7), /* mutual exclude bits */ X (APTR) &dithertext[8], /* grey */ X NULL, /* highlight image */ X 'h', /* command byte ? */ X NULL, /* submenu item */ X 0 /* next select for select dragging */ X } X}; X X X#define IMAGE_HITWIDTH 96 X Xstruct MenuItem imageitems[] = { X { &imageitems[1], /* next item */ X 1, 0, IMAGE_HITWIDTH , 10, /* x,y,w,h */ X COLMEMFLAGS, X 2, /* mutual exclude bits */ X (APTR) &revtext[0], /* grey */ X NULL, /* highlight image */ X 'h', /* command byte ? */ X revitems, /* submenu item */ X 0 /* next select for select dragging */ X }, X { &imageitems[2], /* next item */ X 1, 10, IMAGE_HITWIDTH , 10, /* x,y,w,h */ X COLMEMFLAGS, X 1, /* mutual exclude bits */ X (APTR) &dithertext[0], /* red */ X NULL, /* highlight image */ X 'h', /* command byte ? */ X ditheritems, /* submenu item */ X 0 /* next select for select dragging */ X }, X { &imageitems[3], /* next item */ X 1, 20, IMAGE_HITWIDTH , 10, /* x,y,w,h */ X COLMEMFLAGS|MENUTOGGLE, X 0, /* mutual exclude bits */ X (APTR) &Specular, X NULL, /* highlight image */ X 'h', /* command byte ? */ X NULL, /* submenu item */ X 0 /* next select for select dragging */ X }, X { &imageitems[4], /* next item */ X 1, 30, IMAGE_HITWIDTH , 10, /* x,y,w,h */ X COLMEMFLAGS|MENUTOGGLE, X 0, /* mutual exclude bits */ X (APTR) &MiscText[2], /* Flip XY */ X NULL, /* highlight image */ X 'h', /* command byte ? */ X NULL, /* submenu item */ X 0 /* next select for select dragging */ X }, X { &imageitems[5], /* next item */ X 1, 40, 100 , 10, /* x,y,w,h */ X COLMEMFLAGS| MENUTOGGLE, X 0, /* mutual exclude bits */ X (APTR) &MiscText[0], /* AbortDraw */ X NULL, /* highlight image */ X 'h', /* command byte ? */ X NULL, /* submenu item */ X 0 /* next select for select dragging */ X }, X { NULL, /* next item */ X 1, 50, IMAGE_HITWIDTH, 10, /* x,y,w,h */ X COLMEMFLAGS|MENUTOGGLE, X 0, /* mutual exclude bits */ X (APTR) &MiscText[1], /* debug */ X NULL, /* highlight image */ X 'h', /* command byte ? */ X NULL, /* submenu item */ X 0 /* next select for select dragging */ X } X}; X XUSHORT *AbortDrawPtr = &imageitems[4].Flags; XUSHORT *DebugOnPtr = &imageitems[5].Flags; X X Xstatic void MenuSetImage() X{ X int i; X if( Selected(revitems[0])) { X SetRevAxis(0); /* Xaxis */ X } X else { X SetRevAxis(1); /* Yaxis */ X } X X for( i = 0; i < sizeof(ditheritems)/sizeof(ditheritems[0]); i++ ) { X if( Selected(ditheritems[i] )) { X if( i != DitherPower ) { X FreeOldDither(); X } X DitherPower = i; X } X } X X SpecOn = Selected( imageitems[2])?true:false; X FlipImgPix( Selected(imageitems[3])?true:false); X} X END_OF_FILE if test 6963 -ne `wc -c <'menu_image.c'`; then echo shar: \"'menu_image.c'\" unpacked with wrong size! fi # end of 'menu_image.c' fi if test -f 'menu_scrn.c' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'menu_scrn.c'\" else echo shar: Extracting \"'menu_scrn.c'\" \(5430 characters\) sed "s/^X//" >'menu_scrn.c' <<'END_OF_FILE' X#include "scrndef.h" X/* X * Menu description for selecting color mapping X */ X X/* X * define mutual exclusion flags X */ X#define MUBIT1 1 X#define MUBIT2 2 X#define MUBIT3 4 X#define MUBIT4 8 X#define MUBIT5 16 X#define MULO 32 X#define MUHI 64 X#define MUHAM 128 X#define MUOVER 256 X Xstatic struct IntuiText scrntext[] = { X { 0, 1, JAM2, 20, 0, NULL, (UBYTE *)"2 color", NULL }, X { 0, 1, JAM2, 20, 0, NULL, (UBYTE *)"4 color ", NULL }, X { 0, 1, JAM2, 20, 0, NULL, (UBYTE *)"8 color", NULL }, X { 0, 1, JAM2, 20, 0, NULL, (UBYTE *)"16 color", NULL }, X { 0, 1, JAM2, 20, 0, NULL, (UBYTE *)"32 color", NULL }, X { 0, 1, JAM2, 20, 0, NULL, (UBYTE *)"lores", NULL }, X { 0, 1, JAM2, 20, 0, NULL, (UBYTE *)"hires", NULL }, X { 0, 1, JAM2, 20, 0, NULL, (UBYTE *)"ham", NULL }, X { 0, 1, JAM2, 20, 0, NULL, (UBYTE *)"overscan", NULL }, X { 0, 1, JAM2, 20, 0, NULL, (UBYTE *)"interlace", NULL }, X}; X Xstatic struct MenuItem scrnitems[] = { X { &scrnitems[1], /* next item */ X 10, 0, 90 , 10, /* x,y,w,h */ X COLMEMFLAGS , X MUBIT2|MUBIT3|MUBIT4|MUBIT5, /* mutual exclude bits */ X (APTR) &scrntext[0], /* grey */ X NULL, /* highlight image */ X 'h', /* command byte ? */ X NULL, /* submenu item */ X 0 /* next select for select dragging */ X }, X { &scrnitems[2], /* next item */ X 10, 10, 90 , 10, /* x,y,w,h */ X COLMEMFLAGS, X MUBIT1|MUBIT3|MUBIT4|MUBIT5, /* mutual exclude bits */ X (APTR) &scrntext[1], /* grey */ X NULL, /* highlight image */ X 'h', /* command byte ? */ X NULL, /* submenu item */ X 0 /* next select for select dragging */ X }, X { &scrnitems[3], /* next item */ X 10, 20, 90 , 10, /* x,y,w,h */ X COLMEMFLAGS, X MUBIT1|MUBIT2|MUBIT4|MUBIT5, /* mutual exclude bits */ X (APTR) &scrntext[2], /* grey */ X NULL, /* highlight image */ X 'h', /* command byte ? */ X NULL, /* submenu item */ X 0 /* next select for select dragging */ X }, X { &scrnitems[4], /* next item */ X 10, 30, 90 , 10, /* x,y,w,h */ X COLMEMFLAGS| CHECKED, X MUBIT1|MUBIT2|MUBIT3|MUBIT5, /* mutual exclude bits */ X (APTR) &scrntext[3], /* grey */ X NULL, /* highlight image */ X 'h', /* command byte ? */ X NULL, /* submenu item */ X 0 /* next select for select dragging */ X }, X { &scrnitems[5], /* next item */ X 10, 40, 90 , 10, /* x,y,w,h */ X COLMEMFLAGS, X MUBIT1|MUBIT2|MUBIT3|MUBIT4|MUHI, /* mutual exclude bits */ X (APTR) &scrntext[4], /* grey */ X NULL, /* highlight image */ X 'h', /* command byte ? */ X NULL, /* submenu item */ X 0 /* next select for select dragging */ X }, X { &scrnitems[6], /* next item */ X 10, 50, 90 , 10, /* x,y,w,h */ X COLMEMFLAGS| CHECKED, X MUHI|MUHAM, /* mutual exclude bits */ X (APTR) &scrntext[5], /* grey */ X NULL, /* highlight image */ X 'h', /* command byte ? */ X NULL, /* submenu item */ X 0 /* next select for select dragging */ X }, X { &scrnitems[7], /* next item */ X 10, 60, 90 , 10, /* x,y,w,h */ X COLMEMFLAGS, X MULO|MUHAM|MUBIT5, /* mutual exclude bits */ X (APTR) &scrntext[6], /* grey */ X NULL, /* highlight image */ X 'h', /* command byte ? */ X NULL, /* submenu item */ X 0 /* next select for select dragging */ X }, X { &scrnitems[8], /* next item */ X 10, 70, 90 , 10, /* x,y,w,h */ X (COLMEMFLAGS) & ~ITEMENABLED, X MULO|MUHI, /* mutual exclude bits */ X (APTR) &scrntext[7], /* grey */ X NULL, /* highlight image */ X 'h', /* command byte ? */ X NULL, /* submenu item */ X 0 /* next select for select dragging */ X }, X { &scrnitems[9], /* next item */ X 10, 80, 90 , 10, /* x,y,w,h */ X ( COLMEMFLAGS|MENUTOGGLE)& ~ITEMENABLED , X 0, /* mutual exclude bits */ X (APTR) &scrntext[8], /* grey */ X NULL, /* highlight image */ X 'h', /* command byte ? */ X NULL, /* submenu item */ X 0 /* next select for select dragging */ X }, X { NULL, /* next item */ X 10, 90, 90 , 10, /* x,y,w,h */ X COLMEMFLAGS|MENUTOGGLE, X 0, /* mutual exclude bits */ X (APTR) &scrntext[9], /* grey */ X NULL, /* highlight image */ X 'h', /* command byte ? */ X NULL, /* submenu item */ X 0 /* next select for select dragging */ X } X}; X X X Xvoid MenuSetScrn() X{ X UBYTE colmax; X X CloseSurf(); X X /* X * overscan X */ X SurfScrnDef.Width = 320; X SurfScrnDef.Height = 200+ButHeight; X SurfScrnDef.LeftEdge = SurfScrnDef.TopEdge = 0; X X if( Selected(scrnitems[8])) { X SurfScrnDef.Width = 352; X SurfScrnDef.Height = 220; X } X X if( Selected(scrnitems[7])) { /* ham mode */ X SurfScrnDef.Depth = 6; X SurfScrnDef.ViewModes = HAM; X } X else { X int i; X SurfScrnDef.Depth = 3; /* incase non of the flags are set */ X X for( i = 0; i < 5; i++ ) { X if( Selected( scrnitems[i])) { X SurfScrnDef.Depth = i+1; X } X } X X if( Selected( scrnitems[5] ) ) { /* lores */ X SurfScrnDef.ViewModes = 0; X } X else { X SurfScrnDef.ViewModes = HIRES; X SurfScrnDef.Width <<= 1; X SurfScrnDef.LeftEdge *= 2; X if( SurfScrnDef.Depth > 4 ) { X SurfScrnDef.Depth = 4; X } X } X } X X if( Selected( scrnitems[9] )) { /* interlace */ X SurfScrnDef.Height <<= 1; X SurfScrnDef.Height -= ButHeight; X SurfScrnDef.TopEdge *= 2; X SurfScrnDef.ViewModes |= LACE; X } X X X OpenSurf(); X} END_OF_FILE if test 5430 -ne `wc -c <'menu_scrn.c'`; then echo shar: \"'menu_scrn.c'\" unpacked with wrong size! fi # end of 'menu_scrn.c' fi if test -f 'revolve.c' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'revolve.c'\" else echo shar: Extracting \"'revolve.c'\" \(6344 characters\) sed "s/^X//" >'revolve.c' <<'END_OF_FILE' X#include <math.h> X#include <stdio.h> X#include "fasttrig.h" X#include "bezpt.h" X#include "revolve.h" X#include "mytypes.h" X X XRevAxisType RevAxis; X X Xshort RevMesh = DefRevMeshVal; Xshort RevImageR, /* revolution index */ X RevImageB; /* bezier index */ X Xstatic int RotRange = DefRotRange; Xstatic int RotStart = DefRotStart; Xstatic int SecAngle = DefTilt; Xstatic float SurfDist = DefSurfDist; Xstatic float ViewDist = DefViewDist; Xstatic bool Perspective = DefPersp; X Xvoid SetPerspective( value) X int value; X{ X Perspective = value; X} X X X Xvoid SetRevAxis( value) X X{ X RevAxis = (value)? RevY : RevX; X} X X Xvoid SetRotStart( value ) X int value; X{ X RotStart = value; X} X Xvoid SetRotRange( value ) X int value; X{ X RotRange = value; X} X Xvoid SetSecAng( value ) X int value; X{ X SecAngle = value; X} X Xvoid SetRevMesh( value ) X int value; X{ X RevMesh = value; X} X X X Xvoid SetSurfDist( value ) X int value; X{ X SurfDist = (float )value; X} X X Xvoid SetViewDist( value ) X int value; X{ X ViewDist = (float )value; X} X X X Xstatic Xfloat secsin, seccos; /* trig values of secondary angle */ X Xstatic Xint sizeptlist = 0; X Xstatic XPtGen *ptlist1 = 0, X *ptlist2 = 0; X Xstatic Xint NumEnts; /* number of angle slices */ X X Xstatic Xbool PrepRev() X{ X NumEnts = RevMesh+1; X X /* X * allocate space 3d descriptions of a point revolved x degrees X */ X if( NumEnts > sizeptlist ) { X if( ptlist1 ) free(ptlist1); X if( ptlist2 ) free(ptlist2); X X ptlist1 =(PtGen *) malloc( NumEnts * sizeof(PtGen) ); X ptlist2 =(PtGen *) malloc( NumEnts * sizeof(PtGen) ); X if( !ptlist1 || !ptlist2 ) { X OutErr("PrepRev:not enough memory"); X return(true); X } X } X X X if( InitFastTrig( RotStart, RotRange, NumEnts)) return(true); X secsin = sin((float)SecAngle*PI/180); X seccos = cos((float)SecAngle*PI/180); X return (false); X} X X Xstatic Xvoid CalcRing(ptlist, xpos, ypos) Xregister PtGen *ptlist; Xfloat xpos, ypos; X{ X int angle; X X for( angle = 0; angle < NumEnts; angle++, ptlist++) { X float temp; X /* X * calculate 3d coordinate of point revolved X */ X if( RevAxis == RevX) { X ptlist->d3.y = ypos * fcos(angle); X temp = ypos * fsin(angle); X ptlist->d3.x = xpos* seccos - temp *secsin; X ptlist->d3.z = xpos * secsin + temp * seccos; X } X else { X ptlist->d3.x = xpos * fcos(angle); X temp = xpos * fsin( angle); X ptlist->d3.y = ypos * seccos + temp * secsin; X ptlist->d3.z = secsin * ypos - temp * seccos; X } X ptlist->d3.z -= SurfDist; X X/* if( Perspective ) { X float PerspScale; X X PerspScale = fabs(ViewDist / ptlist->d3.z); X ptlist->d3.x *= PerspScale; X ptlist->d3.y *= PerspScale; X } X */ X /* X * calculate the 2d screen coordinate equvalent X */ X /* X ptlist->d2.x = (short) ptlist->d3.x; X ptlist->d2.y = (short) ptlist->d3.y; X */ X ptlist->d2.x = (short) (ptlist->d3.x + 0.5); X ptlist->d2.y = (short) (ptlist->d3.y + 0.5); X } X} X X X X X X X/* X * return true on failure X */ Xbool Revolve(acceptfunc) X void (*acceptfunc)(); X{ X float tparm, deltat; X int subseg; X X if( PrepRev() ) { X return(true); X } X X deltat = 1.0/BezMesh; X RevImageB = 0; X ResetActSeg(); X do { X float xpos, ypos; X X X InitCalcBez(); X xpos = StartPtX(GetCurSeg()); X ypos = StartPtY(GetCurSeg()); X CalcRing(ptlist1, xpos, ypos ); X for( subseg = 1; subseg <= BezMesh; subseg++ ) { X register PtGen *ptlista, *ptlistb; X register int numpoly; X X tparm = subseg * deltat; X if( subseg & 1 ) { X ptlista = ptlist2; ptlistb = ptlist1; X } X else { X ptlista = ptlist1; ptlistb = ptlist2; X } X X CalcBezPt(tparm, &xpos, &ypos ); X CalcRing( ptlista, xpos, ypos ); X RevImageR = 0; X for( numpoly = NumEnts -1; numpoly--; ) { X (* acceptfunc)(ptlistb, ptlista, ptlista+1, ptlistb+1); X ptlista++; X ptlistb++; X RevImageR++; X } X RevImageB++; X } X NextSeg(); X X } while( ActSeg ); X return( false ); X} X X/* X * write a ring of points X */ Xstatic void WriteRing(fileout, ptlist, numpnts) XFILE *fileout; XPtGen *ptlist; Xint numpnts; X{ X while( numpnts-- ) { X fprintf(fileout, "%f %f %f \n", ptlist->d3.x, X ptlist->d3.y, ptlist->d3.z ); X ptlist++; X } X} X X/* X * write the list of vertices to file pointer X * this function performs a similar function to revolve X */ Xstatic void WriteRevolve(fileout) X FILE *fileout; X{ X float tparm, deltat; X float OldSurfDist; X int subseg; X float xpos, ypos; X X X OldSurfDist = SurfDist; X SurfDist = 0; X deltat = 1.0/BezMesh; X RevImageB = 0; X ResetActSeg(); X /* X * write out the starting ring X */ X InitCalcBez(); X xpos = StartPtX(GetCurSeg()); X ypos = StartPtY(GetCurSeg()); X CalcRing(ptlist1, xpos, ypos ); X WriteRing(fileout, ptlist1, NumEnts); X /* X * loop to write out all the other rings X */ X do { X X InitCalcBez(); X for( subseg = 1; subseg <= BezMesh; subseg++ ) { X tparm = subseg * deltat; X CalcBezPt(tparm, &xpos, &ypos ); X CalcRing( ptlist1, xpos, ypos ); X WriteRing(fileout, ptlist1, NumEnts); X RevImageB++; X } X NextSeg(); X X } while( ActSeg ); X SurfDist = OldSurfDist; X X return; X} X X/* X * this function writes a list of vertices to "filename" X */ Xvoid WriteData(filename) X char *filename; X{ X FILE *fileout; X X if(( GetNumSegs() < 1) || PrepRev()){ X return; X } X X fileout = fopen(filename,"w"); X if(!fileout) { X OutErr("could not open data file"); X return; X } X X X fprintf(fileout, "%d * number of Rings\n", BezRings()); X fprintf(fileout, "%d * Rev mesh\n", RevMesh); X fprintf(fileout, "%d * Rotation range\n", RotRange); X WriteRevolve(fileout); X fprintf(fileout, "end\n"); X fclose(fileout); X} X X X END_OF_FILE if test 6344 -ne `wc -c <'revolve.c'`; then echo shar: \"'revolve.c'\" unpacked with wrong size! fi # end of 'revolve.c' fi if test -f 'writeilbm.c' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'writeilbm.c'\" else echo shar: Extracting \"'writeilbm.c'\" \(6260 characters\) sed "s/^X//" >'writeilbm.c' <<'END_OF_FILE' X#include <stdio.h> X#include <exec/types.h> X#include <intuition/intuition.h> X#include <graphics/gfxmacros.h> X#ifdef MANX X#include <functions.h> X#endif X#include "mytypes.h" X Xextern int PackRow(); X/* X * following definitions cut from ilbm.h file X */ Xtypedef UBYTE Masking; /* Choice of masking technique.*/ X#define mskNone 0 X#define mskHasMask 1 X#define mskHasTransparentColor 2 X#define mskLasso 3 X Xtypedef UBYTE Compression; /* Choice of compression algorithm applied to X * each row of the source and mask planes. "cmpByteRun1" is the byte run X * encoding generated by Mac's PackBits. See Packer.h . */ X#define cmpNone 0 X#define cmpByteRun1 1 X X/* Aspect ratios: The proper fraction xAspect/yAspect represents the pixel X * aspect ratio pixel_width/pixel_height. X * X * For the 4 Amiga display modes: X * 320 x 200: 10/11 (these pixels are taller than they are wide) X * 320 x 400: 20/11 X * 640 x 200: 5/11 X * 640 x 400: 10/11 */ X#define x320x200Aspect 10 X#define y320x200Aspect 11 X#define x320x400Aspect 20 X#define y320x400Aspect 11 X#define x640x200Aspect 5 X#define y640x200Aspect 11 X#define x640x400Aspect 10 X#define y640x400Aspect 11 X X/* A BitMapHeader is stored in a BMHD chunk. */ Xtypedef struct { X UWORD w, h; /* raster width & height in pixels */ X WORD x, y; /* position for this image */ X UBYTE nPlanes; /* # source bitplanes */ X Masking masking; /* masking technique */ X Compression compression; /* compression algoithm */ X UBYTE pad1; /* UNUSED. For consistency, put 0 here.*/ X UWORD transparentColor; /* transparent "color number" */ X UBYTE xAspect, yAspect; /* aspect ratio, a rational number x/y */ X WORD pageWidth, pageHeight; /* source "page" size in pixels */ X } BitMapHeader; X X/* RowBytes computes the number of bytes in a row, from the width in pixels.*/ X#define RowBytes(w) (((w) + 15) >> 4 << 1) X X X X#define IDSIZE 4 X Xvoid WriteIlbm( filename, win, scrn,packflag ) X char *filename; X struct NewWindow *win; X struct NewScreen *scrn; X bool packflag; X{ X FILE *ofile; X long formpos; /* position of length following 'FORM' */ X long formsize; X struct ViewPort *vp; X X ofile = fopen(filename,"w"); X if( !ofile ) { X return; X } X X fwrite("FORM", IDSIZE, 1, ofile); X formpos = ftell( ofile ); X fwrite( (char *)&formsize, sizeof(formsize), 1, ofile); /* will be rewritten */ X fwrite( "ILBMBMHD", IDSIZE*2, 1, ofile ); X X { X BitMapHeader bmhdr; X long bmhdrsize; X static UBYTE xaspect[2][2]= { { x320x200Aspect, x320x400Aspect }, X { x640x200Aspect, x640x400Aspect }}; X static UBYTE yaspect[2][2]= { { y320x200Aspect, y320x400Aspect }, X { y640x200Aspect, y640x400Aspect }}; X int wx, wy; X X bmhdrsize = 20; X fwrite( (char *)&bmhdrsize, sizeof(bmhdrsize), 1, ofile); X bmhdr.x = bmhdr.y = 0; X bmhdr.w = win->Width; X bmhdr.h = win->Height; X bmhdr.nPlanes = scrn->Depth; X bmhdr.masking = mskNone; X bmhdr.compression = packflag ?cmpByteRun1: cmpNone; X bmhdr.pad1 = 0; X X wx = (scrn->Width == 320)? 0: 1; X wy = (scrn->Height == 200)? 0: 1; X bmhdr.xAspect = xaspect[wx][wy]; X bmhdr.yAspect = yaspect[wx][wy]; X bmhdr.pageHeight = win->Height; X bmhdr.pageWidth = scrn->Width; X bmhdr.transparentColor = 0; X fwrite((char *)&bmhdr, bmhdrsize, 1, ofile ); X } X X fwrite("CMAP",IDSIZE, 1, ofile); X vp = &win->Screen->ViewPort; X { X long cmapsize; X long i; X UWORD value; X UBYTE col[3]; X int numentries; X X numentries = (1<< scrn->Depth ); X cmapsize = numentries*3; X fwrite( (char *)&cmapsize, sizeof(cmapsize), 1,ofile); X for( i = 0; i < numentries; i++ ) { X value = GetRGB4(vp->ColorMap, i); X col[2] = (value & 0xf) << 4; /* blue */ X col[1] = value & 0xf0; /* green */ X col[0] = (value & 0xf00) >> 4; /* red */ X fwrite(col, 3, 1, ofile); X } X } X X fwrite("CAMG", IDSIZE, 1, ofile); X { X long viewmode; X long viewmodesize; X X viewmodesize = sizeof(viewmode); X viewmode = scrn->ViewModes; X fwrite((char *)&viewmodesize, sizeof(viewmodesize), 1, ofile); X fwrite((char *)&viewmode, sizeof(viewmode), 1, ofile ); X } X X fwrite("BODY", IDSIZE,1, ofile); X { X struct BitMap *bm; X long bodypos, X bodysize; X UBYTE *bmd[16]; /* assume as many as 16 bit planes :-) */ X int row; X int plane; X int rowlength; /* in bytes */ X char outbuff[200]; /* largest enough for a row 1600 bits wide */ X X bodypos = ftell(ofile); X fwrite( (char *)&bodysize, sizeof(bodysize), 1, ofile); X bm = vp->RasInfo->BitMap; X rowlength = RowBytes(scrn->Width); X X for( plane = 0; plane < scrn->Depth; plane++ ) { X bmd[plane] = bm->Planes[plane] + rowlength * win->TopEdge; X } X X /* X * write actual bitplanes X */ X for( row = 0; row < win->Height; row++ ) { X X for( plane = 0; plane < scrn->Depth; plane++ ) { X if( packflag ) { X int packedsize; X X packedsize = PackRow(bmd[plane],outbuff, rowlength ); X fwrite(outbuff, packedsize, 1, ofile); X } X else { X fwrite(bmd[plane], rowlength, 1, ofile ); X } X bmd[plane] += rowlength; X } X } X bodysize = ftell(ofile) -( bodypos + 4); X /* X * fill out body to make even X */ X if( bodysize & 1 ) { X fputc(0,ofile); X bodysize++; X } X formsize = ftell(ofile) -( formpos + 4); X X fseek( ofile, bodypos, 0L ); X fwrite( (char *)&bodysize, sizeof(bodysize), 1, ofile); X } X X fseek( ofile, formpos, 0L ); X fwrite( (char *)&formsize, sizeof(formsize), 1, ofile); X X fclose(ofile); X} END_OF_FILE if test 6260 -ne `wc -c <'writeilbm.c'`; then echo shar: \"'writeilbm.c'\" unpacked with wrong size! fi # end of 'writeilbm.c' fi echo shar: End of archive 2 \(of 4\). cp /dev/null ark2isdone MISSING="" for I in 1 2 3 4 ; do if test ! -f ark${I}isdone ; then MISSING="${MISSING} ${I}" fi done if test "${MISSING}" = "" ; then echo You have unpacked all 4 archives. rm -f ark[1-9]isdone else echo You still need to unpack the following archives: echo " " ${MISSING} fi ## End of shell archive. exit 0 -- Mail submissions (sources or binaries) to <amiga@cs.odu.edu>. Mail comments to the moderator at <amiga-request@cs.odu.edu>. Post requests for sources, and general dicussion to comp.sys.amiga.