Amiga-Request@cs.odu.edu (Amiga Sources/Binaries Moderator) (02/11/90)
Submitted-by: <edavies@sanjuan.uvic.ca>
Posting-number: Volume 90, Issue 065
Archive-name: applications/surf-r2/part03
#!/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 3 (of 4)."
# Contents: functions.h mergergb.c poly.c readilbm.c scrnops.c tov3d.c
# Wrapped by tadguy@xanth on Sat Feb 10 15:47:42 1990
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f 'functions.h' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'functions.h'\"
else
echo shar: Extracting \"'functions.h'\" \(9629 characters\)
sed "s/^X//" >'functions.h' <<'END_OF_FILE'
Xtypedef long cList;
X
Xlong AbleICR();
Xvoid AbortIO();
Xlong ActivateGadget();
Xvoid ActivateWindow();
Xvoid AddAnimOb();
Xvoid AddBob();
Xvoid AddConfigDev();
Xvoid AddDevice();
Xlong AddDosNode();
Xvoid AddFont();
Xlong AddFreeList();
Xshort AddGadget();
Xunsigned short AddGList();
Xvoid AddHead();
Xstruct Interrupt * AddICRVector();
Xvoid AddIntServer();
Xvoid AddLibrary();
Xlong AddMemList();
Xvoid AddPort();
Xvoid AddResource();
Xvoid AddSemaphore();
Xvoid AddTail();
Xvoid AddTask();
Xvoid AddTime();
Xvoid AddVSprite();
Xlong Alert();
Xvoid * AllocAbs();
Xlong AllocBoardMem();
XcList AllocCList();
Xstruct ConfigDev * AllocConfigDev();
Xstruct MemList * AllocEntry();
Xlong AllocExpansionMem();
Xvoid * AllocMem();
Xlong AllocPotBits();
Xvoid * AllocRaster();
Xchar * AllocRemember();
Xlong AllocSignal();
Xlong AllocTrap();
Xstruct WBObject * AllocWBObject();
Xvoid * Allocate();
Xvoid AlohaWorkbench();
Xvoid AndRectRegion();
Xlong AndRegionRegion();
Xvoid Animate();
Xshort AreaDraw();
Xlong AreaEllipse();
Xvoid AreaEnd();
Xshort AreaMove();
Xvoid AskFont();
Xlong AskSoftStyle();
Xlong AttemptLockLayerRom();
Xlong AttemptSemaphore();
Xshort AutoRequest();
Xlong AvailFonts();
Xlong AvailMem();
Xvoid BeginIO();
Xvoid BeginRefresh();
Xvoid BeginUpdate();
Xvoid BeginLayer();
Xlong BltBitMap();
Xlong BltBitMapRastPort();
Xvoid BltClear();
Xvoid BltMaskBitMapRastPort();
Xvoid BltPattern();
Xvoid BltTemplate();
Xstruct Window * BuildSysRequest();
Xchar * BumpRevision();
Xvoid Cause();
Xvoid CBump();
Xvoid CDInputHandler();
Xvoid ChangeSprite();
Xstruct IORequest * CheckIO();
Xshort ClearDMRequest();
Xvoid ClearEOL();
Xvoid ClearMenuStrip();
Xvoid ClearPointer();
Xvoid ClearRegion();
Xlong ClearRectRegion();
Xvoid ClearScreen();
Xvoid ClipBit();
Xvoid Close();
Xvoid CloseDevice();
Xvoid CloseFont();
Xvoid CloseLibrary();
Xvoid CloseScreen();
Xvoid CloseWindow();
Xshort CloseWorkBench();
Xvoid CMove();
Xshort CmpTime();
Xlong ConcatCList();
Xlong ConfigBoard();
Xlong ConfigChain();
Xlong ConsoleDevice();
Xlong CopperListInit();
XcList CopyCList();
Xvoid CopyMem();
Xvoid CopyMemQuick();
Xvoid CopySBitMap();
Xvoid CreateBehindLayer();
Xstruct Lock * CreateDir();
Xstruct MsgPort * CreatePort();
Xstruct Process * CreateProc();
Xstruct IOStdReq * CreateStdIO();
Xstruct Task * CreateTask();
Xvoid CreateUpfrontLayer();
Xstruct Lock * CurrentDir();
Xvoid CurrentTime();
Xvoid CWait();
Xlong * DateStamp();
Xvoid Deallocate();
Xvoid Debug();
Xvoid Delay();
Xshort DeleteFile();
Xvoid DeleteLayer();
Xvoid DeletePort();
Xvoid DeleteStdIO();
Xvoid DeleteTask();
Xstruct Process * DeviceProc();
Xvoid Disable();
Xvoid DisownBlitter();
Xshort DisplayAlert();
Xvoid DisplayBeep();
Xvoid DisposeRegion();
Xvoid DoCollision();
Xlong DoIO();
Xshort DoubleClick();
Xvoid Draw();
Xvoid DrawBorder();
Xvoid DrawEllipse();
Xvoid DrawGList();
Xvoid DrawImage();
Xstruct Lock * DupLock();
Xvoid Enable();
Xvoid EndRefresh();
Xvoid EndRequest();
Xvoid EndUpdate();
Xvoid Enqueue();
Xshort ExNext();
Xshort Examine();
Xshort Execute();
Xvoid Exit();
Xstruct ConfigDev * FindConfigDev();
Xstruct Node * FindName();
Xstruct MsgPort * FindPort();
Xlong FindResident();
Xstruct SignalSemaphore *FindSemaphore();
Xstruct Task * FindTask();
Xchar * FindToolType();
Xvoid Flood();
Xvoid FlushCList();
Xvoid Forbid();
Xvoid FreeBoardMem();
Xvoid FreeCList();
Xvoid FreeColorMap();
Xvoid FreeConfigDev();
Xvoid FreeCopList();
Xvoid FreeCprList();
Xvoid FreeDiskObject();
Xvoid FreeEntry();
Xvoid FreeExpansionMem();
Xvoid FreeFreeList();
Xvoid FreeGBuffers();
Xvoid FreeMem();
Xvoid FreePotBits();
Xvoid FreeRaster();
Xvoid FreeRemember();
Xvoid FreeSignal();
Xvoid FreeSprite();
Xvoid FreeSysRequest();
Xvoid FreeTrap();
Xvoid FreeVPortCopLists();
Xvoid FreeWBObject();
Xlong GetCC();
Xlong GetCLBuf();
Xshort GetCLChar();
Xshort GetCLWord();
Xstruct ColorMap * GetColorMap();
Xlong GetCurrentBinding();
Xstruct Preferences * GetDefPrefs();
Xstruct DiskObject * GetDiskObject();
Xvoid GetGBuffers();
Xlong GetIcon();
Xstruct Message * GetMsg();
Xstruct Preferences * GetPrefs();
Xshort GetRGB4();
Xlong GetScreenData();
Xshort GetSprite();
Xstruct WBObject * GetWBObject();
Xlong IncrCLMark();
Xshort Info();
Xvoid InitArea();
Xvoid InitBitMap();
Xlong InitCLPool();
Xvoid InitCode();
Xvoid InitGMasks();
Xvoid InitGels();
Xvoid InitMasks();
Xvoid InitRastPort();
Xvoid InitRequester();
Xvoid InitResident();
Xvoid InitSemaphore();
Xvoid InitStruct();
Xvoid InitTmpRas();
Xvoid InitVPort();
Xvoid InitView();
Xstruct FileHandle * Input();
Xvoid Insert();
Xstruct Region * InstallClipRegion();
Xlong IntuiTextLength();
Xstruct InputEvent * Intuition();
Xlong IoErr();
Xshort IsInteractive();
Xstruct MenuItem * ItemAddress();
Xvoid LoadRGB4();
Xstruct Segment * LoadSeg();
Xvoid LoadView();
Xstruct Lock * Lock();
Xvoid LockLayer();
Xvoid LockLayerInfo();
Xvoid LockLayerRom();
Xvoid LockLayers();
Xstruct DeviceNode * MakeDosNode();
Xlong MakeFunctions();
Xstruct Library * MakeLibrary();
Xvoid MakeScreen();
Xvoid MakeVPort();
Xlong MarkCList();
Xlong MatchToolValue();
Xvoid ModifyIDCMP();
Xvoid ModifyProp();
Xvoid Move();
Xvoid MoveLayer();
Xvoid MoveScreen();
Xvoid MoveSprite();
Xvoid MoveWindow();
Xvoid MrgCop();
Xvoid NewList();
Xvoid NewModifyProp();
Xstruct Region * NewRegion();
Xvoid ObtainConfigBinding();
Xvoid ObtainSemaphore();
Xvoid ObtainSemaphoreList();
Xvoid OffGadget();
Xvoid OffMenu();
Xvoid OnGadget();
Xvoid OnMenu();
Xstruct FileHandle * Open();
Xlong OpenDevice();
Xstruct Font * OpenDiskFont();
Xstruct Font * OpenFont();
Xvoid OpenIntuition();
Xstruct Library * OpenLibrary();
Xstruct MiscResource * OpenResource();
Xstruct Screen * OpenScreen();
Xstruct Window * OpenWindow();
Xshort OpenWorkBench();
Xvoid OrRectRegion();
Xlong OrRegionRegion();
Xstruct FileHandle * Output();
Xvoid OwnBlitter();
Xstruct Lock * ParentDir();
Xshort PeekCLMark();
Xvoid Permit();
Xvoid PolyDraw();
Xvoid PrintIText();
Xlong PutCLBuf();
Xlong PutCLChar();
Xlong PutCLWord();
Xshort PutDiskObject();
Xlong PutIcon();
Xvoid PutMsg();
Xlong PutWBObject();
Xvoid QBSBlit();
Xvoid QBlit();
Xshort RawKeyConvert();
Xlong Read();
Xchar ReadExpansionByte();
Xlong ReadExpansionRom();
Xshort ReadPixel();
Xvoid RectFill();
Xvoid RefreshGadgets();
Xvoid RefreshGList();
Xvoid RefreshWindowFrame();
Xvoid ReleaseConfigBinding();
Xvoid ReleaseSemaphore();
Xvoid ReleaseSemaphoreList();
Xvoid RemConfigDev();
Xvoid RemDevice();
Xvoid RemFont();
Xstruct Node * RemHead();
Xvoid RemIBob();
Xvoid RemICRVector();
Xvoid RemIntServer();
Xlong RemLibrary();
Xunsigned short RemoveGList();
Xvoid RemPort();
Xvoid RemResource();
Xvoid RemSemaphore();
Xstruct Node * RemTail();
Xvoid RemTask();
Xvoid RemVSprite();
Xvoid RemakeDisplay();
Xvoid Remove();
Xunsigned short RemoveGadget();
Xshort Rename();
Xvoid ReplyMsg();
Xvoid ReportMouse();
Xshort Request();
Xvoid RethinkDisplay();
Xvoid ScreenToBack();
Xvoid ScreenToFront();
Xvoid ScrollLayer();
Xvoid ScrollRaster();
Xvoid ScrollVPort();
Xlong Seek();
Xvoid SendIO();
Xvoid SetAPen();
Xvoid SetBPen();
Xvoid SetCollision();
Xshort SetComment();
Xvoid SetCurrentBinding();
Xshort SetDMRequest();
Xvoid SetDRMd();
Xlong SetExcept();
Xlong SetFont();
Xlong SetFunction();
Xlong SetICR();
Xstruct Interrupt * SetIntVector();
Xvoid SetMenuStrip();
Xvoid SetPointer();
Xvoid SetPrefs();
Xshort SetProtection();
Xvoid SetRast();
Xvoid SetRGB4();
Xvoid SetRGB4CM();
Xlong SetSR();
Xlong SetSignal();
Xlong SetSoftStyle();
Xshort SetTaskPri();
Xvoid SetWindowTitles();
Xvoid ShowTitle();
Xvoid Signal();
Xlong SizeCList();
Xvoid SizeLayer();
Xvoid SizeWindow();
Xvoid SortGList();
XcList SplitCList();
XcList SubCList();
Xvoid SubTime();
Xvoid SubLibrary();
Xvoid SumKickData();
Xlong SuperState();
Xvoid SwapBitsRastPortClipRect();
Xvoid SyncSBitMap();
Xlong Text();
Xlong TextLength();
Xlong Translate();
Xlong UnGetCLChar();
Xlong UnGetCLWord();
Xvoid UnLoadSeg();
Xvoid UnLock();
Xshort UnPutCLChar();
Xshort UnPutCLWord();
Xvoid UnlockLayer();
Xvoid UnlockLayerInfo();
Xvoid UnlockLayerRom();
Xvoid UnlockLayers();
Xvoid UpfrontLayer();
Xvoid UserState();
Xshort VBeamPos();
Xstruct View * ViewAddress();
Xstruct ViewPort * ViewPortAddress();
Xshort WBenchToBack();
Xshort WBenchToFront();
Xlong Wait();
Xvoid WaitBOVP();
Xvoid WaitBlit();
Xshort WaitForChar();
Xlong WaitIO();
Xstruct Message * WaitPort();
Xvoid WaitTOF();
Xstruct Layer * WhichLayer();
Xshort WindowLimits();
Xvoid WindowToBack();
Xvoid WindowToFront();
Xlong Write();
Xlong WriteExpansionByte();
Xvoid WritePixel();
Xvoid WritePotgo();
Xvoid XorRectRegion();
Xlong XorRegionRegion();
X
END_OF_FILE
if test 9629 -ne `wc -c <'functions.h'`; then
echo shar: \"'functions.h'\" unpacked with wrong size!
fi
# end of 'functions.h'
fi
if test -f 'mergergb.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'mergergb.c'\"
else
echo shar: Extracting \"'mergergb.c'\" \(7542 characters\)
sed "s/^X//" >'mergergb.c' <<'END_OF_FILE'
X/*
X * This program, when called with arg "smith", tries to read smith.r, smith.g
X * and smith.b, and write a combined raw data file acceptable to RAY2, called
X * smith.tmp
X */
X#include <stdio.h>
X#include "mytypes.h"
X
X#define RED 0
X#define GRN 1
X#define BLU 2
X#define NumPrims 3 /* number of primary colors */
X
X#define MakeID(a,b,c,d) ( ((a)<<24) | ((b)<<16) | ((c)<<8) | (d) )
X
X#define ID_FORM MakeID('F','O','R','M')
X#define ID_ILBM MakeID('I','L','B','M')
X#define ID_BMHD MakeID('B','M','H','D')
X#define ID_CMAP MakeID('C','M','A','P')
X#define ID_CAMG MakeID('C','A','M','G')
X#define ID_BODY MakeID('B','O','D','Y')
X
X#define ROUNDUP(x) ( ((x)+1) & (~1L) )
X
Xstruct CHUNK {
X unsigned long Id, Size;
X} Chunk;
X
Xstruct BMHD {
X short w,h,x,y;
X char npl,mask,compress,pad1;
X short transparentColor;
X char xAspect,yAspect;
X short pageWidth,pageHeight;
X};
X
X/*
X * compare width and height of two bit maps
X * return false if equal
X */
Xbool CmpBMHD(a, b)
X struct BMHD *a, *b;
X{
X return( a->w != b->w ||
X a->h != b->h ||
X a->npl != b->npl
X );
X}
X
X
Xstruct BMHD bmhd[NumPrims];
Xstatic FILE *ftrip[NumPrims], *fout;
Xchar *nametrip[NumPrims];
Xchar *oname;
Xbool FileError;
Xshort depth;
X
Xunsigned char colmap[NumPrims][32][3];
X
X
X/*
X * read len bytes from selected file
X */
Xvoid FRead(buffer, len, filenum)
X char *buffer;
X int len, filenum;
X{
X if( fread(buffer, len, 1, ftrip[filenum]) == 0 ) {
X fprintf(stderr, "read error in %s\n", nametrip[filenum] );
X exit(-1);
X }
X}
X
X
X
X#define ABORT(str) { fprintf(stderr,str); exit(-1); }
X
X#define ReadChunk() FRead(&Chunk, sizeof(Chunk), filenum)
X
Xvoid ReadIffHeaders(filenum)
X int filenum;
X{
X long ILBMid;
X bool cmapFlag = false,
X bmhdFlag = false;
X short i;
X
X
X ReadChunk ();
X if (Chunk.Id != ID_FORM)
X ABORT ("Not an IFF File");
X
X FRead (&ILBMid, 4, filenum);
X if (ILBMid != ID_ILBM)
X ABORT ("Not an ILBM File");
X
X while (1) {
X long camgdata;
X
X ReadChunk ();
X
X if (Chunk.Id == ID_BODY) {
X if (!cmapFlag) {
X printf("no cmap before body in %s\n", nametrip[filenum]);
X FileError = true;
X }
X if (!bmhdFlag) {
X printf("no bmhd before the body in %s\n", nametrip[filenum]);
X FileError = true;
X }
X return;
X }
X
X if( feof( ftrip[filenum] ) ) {
X printf("reached end of file without seeing body in %s\n", nametrip[filenum]);
X FileError = true;
X return;
X }
X
X switch (Chunk.Id) {
X case ID_CMAP:
X FRead (colmap[filenum], Chunk.Size, filenum);
X for (i = 0; i < 32; i++) {
X colmap[filenum][i][filenum] >>= 4;
X }
X cmapFlag = true;
X break;
X case ID_BMHD:
X FRead(&bmhd[filenum], Chunk.Size, filenum);
X bmhdFlag = true;
X break;
X case ID_CAMG:
X FRead( &camgdata, sizeof(camgdata),filenum );
X break;
X default: /* unknown identifier */
X fseek( ftrip[filenum], Chunk.Size, 1);
X break;
X }
X }
X}
X
X
X/*
X * leftmost pixel of byte is in most significant bit of byte
X */
Xstatic char GetIlbmVal( rastlist, h)
X char *rastlist[6];
X int h;
X{
X int i;
X char value = 0;
X short mask, bytep;
X
X mask = 0x80 >> ( h & 7);
X bytep = h >> 3;
X
X for( i = depth-1; i >= 0; i-- ) {
X value <<= 1;
X value |= (*(rastlist[i]+bytep) & mask) ? 1: 0;
X }
X return( value );
X}
X
X/*
X * decompress a runlength row of bytes
X */
Xstatic void ReadDecomLine(linebytes, rp, filenum)
X int linebytes, filenum;
X char *rp;
X{
X int runlen;
X char pixel;
X
X while (linebytes) {
X runlen = getc (ftrip[filenum]);
X if (runlen > 127)
X runlen -= 256;
X if (runlen >= 0) {
X runlen++;
X FRead (rp, runlen, filenum);
X rp += runlen;
X linebytes -= runlen;
X }
X else {
X runlen = -runlen + 1;
X linebytes -= runlen;
X pixel = getc (ftrip[filenum]);
X do
X *(rp++) = pixel;
X while (--runlen);
X }
X }
X}
X/*
X * read raster line from one of the color files
X */
Xvoid LoadRaster(raster, ByteWidth, filenum)
X char *raster[6];
X int ByteWidth, filenum;
X{
X if(bmhd[filenum].compress = 0) {
X FRead (raster, ByteWidth * depth, filenum);
X }
X else {
X short i;
X for( i = 0; i < depth; i++) {
X ReadDecomLine( ByteWidth, raster[i], filenum);
X }
X }
X}
X
X/*
X * write intensity values for a given gun
X * note: I've made dirty assumption about byte ordering in a short word
X * if you run this on an ibm (ha ha ha) you'll have to change it
X */
X#define ChipSize 4
Xvoid SaveRaster( raster, width, prim)
X char *raster[];
X int width, prim;
X{
X short i, j;
X unsigned short val;
X
X for( i = 0; i < width; i += ChipSize ) {
X val = colmap[prim][GetIlbmVal(raster, i+3)][prim] << ChipSize;
X val |= colmap[prim][GetIlbmVal(raster, i+2)][prim];
X fputc( val&0xff, fout);
X val = colmap[prim][GetIlbmVal(raster, i+1)][prim] << ChipSize;
X val |= colmap[prim][GetIlbmVal(raster, i+0)][prim];
X fputc( val&0xff, fout);
X }
X}
X
X/*
X * translate body of file to format RAY2 likes
X */
Xvoid TranslateRay2Body()
X{
X int BytesWidth;
X int row, height, width, plane, prim;
X char *raster[6];
X
X depth = bmhd[0].npl;
X width = bmhd[0].w;
X height = bmhd[0].h;
X BytesWidth = (width + 7)/8 ;
X
X for( plane = 0; plane < bmhd[0].npl; plane++ ) {
X raster[plane] = (char *)malloc(BytesWidth);
X }
X
X for( row = 0; !FileError && row < height; row++ ) {
X fputc((unsigned char)(row>>8),fout); /* write line number */
X fputc((unsigned char)(row&0xff),fout);
X
X for( prim = RED; prim <= BLU; prim++ ) {
X LoadRaster( raster, BytesWidth, prim);
X SaveRaster( raster, width, prim);
X }
X }
X}
X
X
X
Xmain(argc, argv)
X int argc;
X char *argv[];
X{
X char buff[4][80];
X char *extensions = "rgb";
X int i;
X
X if( argc == 1 || *argv[1] == '?' ) {
X fprintf(stderr,"usage: merge filename\n");
X exit(-1);
X }
X FileError = false;
X
X for( i = 0; i < NumPrims; i++ ) {
X sprintf(buff[i], "%s.%c", argv[1], extensions[i]);
X nametrip[i] = buff[i];
X ftrip[i] = fopen(nametrip[i],"r");
X if(!ftrip[i]) {
X fprintf(stderr,"unable to read %s\n", nametrip[i]);
X FileError = true;
X }
X }
X
X sprintf(buff[3], "%s.tmp", argv[1]);
X oname = (argc>2)? argv[2]: buff[3];
X fout = fopen( oname,"w");
X if(!fout) {
X fprintf(stderr,"unable to write to %s\n", oname);
X FileError = true;
X }
X
X if( FileError ) goto ErrorExit;
X
X for( i = 0; i < NumPrims; i++ ) {
X printf("reading header %d\n", i);
X ReadIffHeaders(i);
X }
X
X for( i = 1; i < NumPrims; i++ ) {
X if( CmpBMHD(&bmhd[0], &bmhd[i])) {
X fprintf(stderr,"image sizes differ(r != %d)\n", i);
X FileError = true;
X }
X }
X
X if( FileError ) goto ErrorExit;
X printf("about to translate body\n");
X TranslateRay2Body();
X
X ErrorExit:
X for( i = 0; i < NumPrims; i++) {
X if(ftrip[i]) fclose( ftrip[i] );
X }
X if(fout) fclose(fout);
X}
X
X
END_OF_FILE
if test 7542 -ne `wc -c <'mergergb.c'`; then
echo shar: \"'mergergb.c'\" unpacked with wrong size!
fi
# end of 'mergergb.c'
fi
if test -f 'poly.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'poly.c'\"
else
echo shar: Extracting \"'poly.c'\" \(8961 characters\)
sed "s/^X//" >'poly.c' <<'END_OF_FILE'
X#include <math.h>
X#include "mytypes.h"
X#include "scrnio.h"
X#include "bezpt.h"
X#include "revolve.h"
X#include "control.h"
X#include "poly.h"
X#include "readilbm.h"
X#include "menuexp.h"
X
Xbool SpecOn = false; /* specular lighting enable - default off */
X
Xfloat Ambience = DefAmbience;
Xfloat PtIntensity = (float)DefIntensity;
Xfloat Kd = DefKd,
X Ks = DefKs;
X
XPt3 LightSrc = {
X DefLightSrcX,
X DefLightSrcY,
X DefLightSrcZ
X };
X
Xstatic
XRhomboid *polylist = null,
X *nextpoly;
X
XMapRhomboid *mpolylist = null,
X *mnextpoly;
X
Xstatic
Xint polyspace = 0;
X
X
Xstatic bool shadeflag;
X
Xlong CalcMaxPolyNum() {
X return( GetNumSegs() * BezMesh * RevMesh );
X}
X
Xstatic
Xbool PrepPoly()
X{
X if( polylist ) free( (char *)polylist );
X polylist = (Rhomboid *)malloc( CalcMaxPolyNum() * sizeof(Rhomboid));
X if( !polylist ) {
X OutErr("PrepPoly: not enough memory");
X return( true );
X }
X nextpoly = polylist;
X return(false); /* success = 0 */
X}
X
X
Xstatic bool
XPrepMPoly()
X{
X if( mpolylist ) free( (char *)mpolylist );
X mpolylist = (MapRhomboid *)
X malloc( CalcMaxPolyNum() * sizeof(MapRhomboid));
X if( !mpolylist ) {
X OutErr("PrepPoly: not enough memory");
X return( true );
X }
X mnextpoly = mpolylist;
X return(false); /* success = 0 */
X}
X
X
X/*
X * Multiply a vector by scalar quantity
X */
Xvoid ScaleVec( fact, src, dst )
X float fact;
X Pt3 *src, *dst;
X{
X dst->x = src->x * fact;
X dst->y = src->y * fact;
X dst->z = src->z * fact;
X}
X/*
X * convert a vector to a unitized vector
X * if possible
X */
Xvoid Unitize( vec )
X Pt3 *vec;
X{
X float len;
X
X len = vec->x*vec->x + vec->y*vec->y + vec->z*vec->z;
X len = sqrt( len );
X if( len != 0.0 ) {
X vec->x /= len;
X vec->y /= len;
X vec->z /= len;
X }
X}
X
X/*
X * calculate a vector from two points
X */
Xvoid CalcVector( src1, src2, dest )
XPt3 *src1, *src2, *dest ;
X{
X dest->x = src1->x - src2->x;
X dest->y = src1->y - src2->y;
X dest->z = src1->z - src2->z;
X}
X
X
X
X
X/*
X * calculate a normal from a list of polygons. This routine does the
X * logical trick of trying to exclude each point in turn if the
X * normal can not be calculated, or something of the sort.
X * a value of true is returned if a normal with a nonzero z component
X * could not be calculated
X */
X
Xbool CalcNormal( vxlist, normal)
X PtGen *vxlist[];
X register Pt3 *normal;
X{
X int i, k, m;
X Pt3 *j[3];
X Pt3 v1, v2;
X
X for( i = 0; i < RhomVxNum; i++ ) {
X for( k = 0, m = 3; m--; k++ ) {
X if( k == i ) {
X k++;
X }
X j[m] = &vxlist[k]->d3;
X }
X CalcVector( j[1], j[0], &v1 );
X CalcVector( j[2], j[1], &v2 );
X
X normal->z = v1.x*v2.y - v1.y*v2.x;
X if( normal->z == 0 ) {
X continue;
X }
X normal->x = v1.y*v2.z - v1.z*v2.y;
X normal->y = v1.z*v2.x - v1.x*v2.z;
X if( normal->z < 0 ) {
X normal->x = -normal->x;
X normal->y = -normal->y;
X normal->z = -normal->z;
X }
X Unitize(normal);
X return( false );
X }
X return(true);
X}
X
X
X/*
X * Euclidean dot product.
X * I wonder what the minkowski dot product would look like
X */
Xfloat DotProd( v1, v2 )
X Pt3 *v1, *v2;
X{
X return( v1->x*v2->x + v1->y*v2->y + v1->z*v2->z );
X}
X
X
X
X
X
X/*
X * define a polygon as a set of four points
X * returns true if polygon created
X */
Xstatic bool CreatePoly(curpoly, p0, p1, p2, p3)
X register Rhomboid *curpoly;
X PtGen *p0, *p1, *p2, *p3;
X{
X
X Pt3 normal;
X PtGen *list[RhomVxNum];
X
X list[0] = p0; list[1] = p1; list[2] = p2; list[3] = p3;
X /*
X * compute stuff needed only if producing shaded image
X */
X if( shadeflag ) {
X Pt3 lvec;
X Pt3 center;
X float ptintens;
X float ldotn; /* light vector dot normal */
X /*
X * if cant compute normal, then junk polygon
X */
X if( CalcNormal( list, &normal )) {
X return(false);
X }
X
X curpoly->intensity = Ambience;
X center.x = ( list[0]->d3.x
X + list[1]->d3.x
X + list[2]->d3.x
X + list[3]->d3.x)/4.0;
X center.y = ( list[0]->d3.y
X + list[1]->d3.y
X + list[2]->d3.y
X + list[3]->d3.y)/4.0;
X center.z = ( list[0]->d3.z
X + list[1]->d3.z
X + list[2]->d3.z
X + list[3]->d3.z)/4.0;
X
X curpoly->depth = center.z;
X
X CalcVector( ¢er, &LightSrc, &lvec );
X Unitize( &lvec );
X ldotn = DotProd( &lvec, &normal );
X if( ldotn < 0 ) {
X ptintens = PtIntensity * Kd * -ldotn;
X curpoly->intensity += ptintens;
X }
X /*
X * calculate specular component
X */
X if( SpecOn && ldotn < 0 ) {
X float Kspec, Is;
X Pt3 rvec; /* lvec reflected through poly */
X
X ScaleVec( 2*ldotn, &normal, &rvec );
X CalcVector(&lvec, &rvec, &rvec );
X Unitize( ¢er );
X Kspec = DotProd( &rvec, ¢er);
X
X if( Kspec <= 0.0 ) {
X Is = Ks * Kspec * Kspec* PtIntensity;
X curpoly->intensity += Is;
X }
X }
X
X if( curpoly->intensity > 1.0 ) {
X curpoly->intensity = 1.0;
X }
X }
X else {
X /*
X * calculate depth of polygon
X * for now, try an average of the vertex depths
X */
X curpoly->depth =( list[0]->d3.z
X + list[1]->d3.z
X + list[2]->d3.z
X + list[3]->d3.z)/4.0;
X }
X /*
X * store index to screen coordinates
X */
X curpoly->pt[0] = p0->d2;
X curpoly->pt[1] = p1->d2;
X curpoly->pt[2] = p2->d2;
X curpoly->pt[3] = p3->d2;
X
X return(true);
X}
X/*
X * passable procedure for creating polygons without mapping
X */
Xstatic
Xvoid AcceptPoly(p0, p1, p2, p3)
X PtGen *p0, *p1, *p2, *p3;
X{
X if( CreatePoly(nextpoly, p0, p1, p2,p3)) {
X nextpoly++;
X }
X}
X
Xstatic
Xvoid AcceptMPoly( p0, p1, p2, p3)
X PtGen *p0, *p1, *p2, *p3;
X{
X if( CreatePoly(&mnextpoly->rhom, p0, p1, p2,p3)) {
X mnextpoly->bezindex = RevImageB;
X mnextpoly->revindex = RevImageR;
X mnextpoly++;
X }
X}
X
X
X
X
X
X/*
X * compare the depth of two polygons for SortPoly
X */
Xstatic int CmpDepth( a, b )
X Rhomboid *a, *b;
X{
X if( a->depth < b->depth ) return(-1);
X else if( a->depth > b->depth ) return(1);
X else return(0);
X}
X
Xstatic int CmpMDepth( a, b )
X MapRhomboid *a, *b;
X{
X if( a->rhom.depth < b->rhom.depth ) return(-1);
X else if( a->rhom.depth > b->rhom.depth ) return(1);
X else return(0);
X}
X
X
X
X
X
Xvoid RevNoShade() {
X Rhomboid *i;
X if( GetNumSegs() < 1 ) {
X return;
X }
X
X ClrAbort();
X shadeflag = false;
X if( PrepPoly() ) return;
X if( Revolve(AcceptPoly) ) return;
X CurMode = NOTACTIVE;
X
X qsort( (char *)polylist, nextpoly - polylist,
X sizeof(Rhomboid), CmpDepth);
X
X ClrWindow(false);
X
X for( i = polylist; i< nextpoly; i++ ) {
X if( AbortDraw ) return;
X DrawRhomFrame( i->pt );
X }
X}
X
X
X
X
Xvoid RevShade() {
X register Rhomboid *i;
X
X if( !AllocDither()) return; /* not enough memory */
X if( GetNumSegs() < 1 ) {
X return;
X }
X CurMode = NOTACTIVE;
X ClrAbort();
X shadeflag = true;
X if( PrepPoly() || Revolve(AcceptPoly) ) {
X return;
X }
X qsort( (char *)polylist, nextpoly-polylist,
X sizeof(Rhomboid), CmpDepth);
X
X ClrWindow(false);
X
X for( i = polylist; i< nextpoly; i++ ) {
X if( AbortDraw ) return;
X DrawRhomShade( i );
X }
X}
X
X
X
Xvoid RevMap() {
X register MapRhomboid *i;
X
X ClrAbort();
X if( GetNumSegs() < 1 ) {
X return;
X }
X if( InitMapping() ) {
X return;
X }
X CurMode = NOTACTIVE;
X shadeflag = true;
X
X
X if( PrepMPoly() || Revolve(AcceptMPoly) ) {
X return;
X }
X qsort( (char *)mpolylist, mnextpoly-mpolylist,
X sizeof(MapRhomboid), CmpMDepth);
X ClrWindow(false);
X
X for( i = mpolylist; i< mnextpoly; i++ ) {
X if( AbortDraw ) return;
X DrawRhomMap(i);
X }
X}
END_OF_FILE
if test 8961 -ne `wc -c <'poly.c'`; then
echo shar: \"'poly.c'\" unpacked with wrong size!
fi
# end of 'poly.c'
fi
if test -f 'readilbm.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'readilbm.c'\"
else
echo shar: Extracting \"'readilbm.c'\" \(8906 characters\)
sed "s/^X//" >'readilbm.c' <<'END_OF_FILE'
X#include <stdio.h>
X#include <ctype.h>
X#include "readilbm.h"
X
X#define FALSE 0
X#define TRUE 1
X
X#define RED 0
X#define GRN 1
X#define BLU 2
X
X /* color to grey conversion methods */
X
X#define AVERAGE 0
X#define LUMIN 1
X#define DIST 2
X#define REDONLY 3
X#define GREENONLY 4
X#define BLUEONLY 5
X
X#define MakeID(a,b,c,d) ( ((a)<<24) | ((b)<<16) | ((c)<<8) | (d) )
X
X#define ID_FORM MakeID('F','O','R','M')
X#define ID_ILBM MakeID('I','L','B','M')
X#define ID_BMHD MakeID('B','M','H','D')
X#define ID_CMAP MakeID('C','M','A','P')
X#define ID_CAMG MakeID('C','A','M','G')
X#define ID_BODY MakeID('B','O','D','Y')
X
X#define ROUNDUP(x) ( ((x)+1) & (~1L) )
X
X
X
Xstatic struct CHUNK {
X unsigned long Id, Size;
X} Chunk;
X
Xstatic unsigned char cmap[32][3];
X
Xstruct BMHD {
X short w,h,x,y;
X char npl,mask,compress,pad1;
X short transparentColor;
X char xAspect,yAspect;
X short pageWidth,pageHeight;
X};
X
X
Xstatic short Color[32], /* output colors */
X Method = AVERAGE; /* color conversion */
Xstatic short numcolors;
X
Xstatic
XFILE *fin; /* input file */
X
Xextern char *malloc();
X
Xstatic void FRead();
Xstatic void ReadBMHD();
Xstatic void ReadChunk();
Xstatic void RastOut();
Xstatic void HamOut();
Xstatic char GetIlbmVal();
Xstatic void InitColorMappings();
Xstatic short Convert();
Xstatic void ReadDecomLine();
Xstatic void ProcessRows();
X
X#define ABORT(str) { OutErr(str); goto ErrorExit; }
X
X
Xvoid SetGreyModel( model )
X int model;
X{
X Method = model;
X}
X
X /*
X * main routine for reading in an iff file
X */
X
Xvoid ReadIlbm(filename)
X char *filename;
X{
X struct BMHD bmhd;
X long ILBMid;
X unsigned char cmapFlag = FALSE,
X bmhdFlag = FALSE;
X
X
X if ((fin = fopen (filename, "r")) == NULL) {
X OutErr ("ERROR: cannot open input file");
X return;
X }
X /* read in iff file */
X
X ReadChunk ();
X if (Chunk.Id != ID_FORM)
X ABORT ("Not an IFF File");
X
X FRead (&ILBMid, 4);
X if (ILBMid != ID_ILBM)
X ABORT ("Not an ILBM File");
X
X while (1) {
X long camgdata;
X
X ReadChunk ();
X
X if (Chunk.Id == ID_BODY)
X break;
X
X if( feof( fin ) ) {
X ABORT("reached end of file without seeing body\n");
X }
X
X switch (Chunk.Id) {
X case ID_CMAP:
X FRead (cmap, Chunk.Size);
X numcolors = Chunk.Size/3;
X cmapFlag = TRUE;
X break;
X case ID_BMHD:
X ReadBMHD (&bmhd);
X bmhdFlag = TRUE;
X break;
X case ID_CAMG:
X FRead( &camgdata, sizeof(camgdata) );
X break;
X default: /* unknown identifier */
X fseek( fin, Chunk.Size, 1);
X break;
X }
X }
X if (!cmapFlag) {
X ABORT("IFF file does not contain a CMAP chunk before the BODY\n");
X }
X
X if (!bmhdFlag) {
X ABORT("IFF file does not contain a BMHD chunk before the BODY\n");
X }
X
X InitColorMappings();
X if( OpenImgPix( bmhd.w, bmhd.h, Convert(0xf, 0xf, 0xf)) ) {
X ProcessRows(&bmhd);
X }
X
X ErrorExit:
X fclose( fin);
X}
X
Xstatic void ProcessRows(bmhd)
X struct BMHD *bmhd;
X{
X char *rastlist[6];
X char *Raster;
X int depth, i, v, pixwidth;
X int BytePerLine;
X
X depth = bmhd->npl;
X pixwidth = bmhd->w;
X BytePerLine =(pixwidth+7) / 8;
X
X
X Raster = (char *) malloc (BytePerLine * depth);
X
X if(!Raster ) {
X OutErr("ProcessRows:could not allocate Raster");
X return;
X }
X
X for( i = 0; i < depth; i++ ) {
X rastlist[i] = Raster + BytePerLine*i;
X }
X
X for( v = 0; v < bmhd->h; v++) {
X switch (bmhd->compress) {
X case 0:
X FRead (Raster, BytePerLine * depth);
X break;
X case 1:
X for( i = 0; i < depth; i++) {
X ReadDecomLine( BytePerLine, rastlist[i]);
X }
X break;
X default:
X ABORT ("Unknown Compression type in BODY");
X
X }
X if(depth == 6 ) {
X HamOut( rastlist, pixwidth, v);
X }
X else {
X RastOut( rastlist, pixwidth, v, depth);
X }
X }
X
X ErrorExit:
X if( Raster ) free(Raster);
X}
X
X
Xstatic void ReadDecomLine(linebytes, rp)
X int linebytes;
X char *rp;
X{
X int runlen;
X char pixel;
X
X while (linebytes) {
X runlen = getc (fin);
X if (runlen > 127)
X runlen -= 256;
X if (runlen >= 0) {
X runlen++;
X FRead (rp, runlen);
X rp += runlen;
X linebytes -= runlen;
X }
X else {
X runlen = -runlen + 1;
X linebytes -= runlen;
X pixel = getc (fin);
X do
X *(rp++) = pixel;
X while (--runlen);
X }
X }
X}
X
X /*
X * Convert - convert (r,g,b) to hex greyscale.
X */
X
Xstatic short Convert(r,g,b)
X unsigned char r,g,b;
X{
X short i,
X rd, gd, bd,
X min,
X dist,
X best;
X
X /* convert color according to 'Method' */
X switch (Method) {
X case AVERAGE: /* average r,g,b to obtain grey level */
X return ((short)((r + g + b) / 3));
X case LUMIN: /* use NTSC luminescence as grey level */
X return ((short)((r * 30 + g * 59 + b * 11) / 100));
X case DIST: /* use grey with minimum distance in color */
X min = 15*15 * 3;
X for( i = 0; i < numcolors; i++ ) {
X rd = r -i;
X gd = g - i;
X bd = b - i;
X dist = rd * rd + gd * gd + bd * bd;
X if( dist < min ) {
X min = dist; best = i;
X }
X }
X return( best );
X case REDONLY:
X return((short)r);
X case GREENONLY:
X return((short)g);
X case BLUEONLY:
X return((short)b);
X default:
X exit(-1); /* error, big one */
X }
X} /* Convert */
X
Xstatic void InitColorMappings()
X{
X int i;
X
X /* put colors in 4-bit range and Convert */
X for (i = 0; i < 32; i++) {
X cmap[i][RED] >>= 4;
X cmap[i][GRN] >>= 4;
X cmap[i][BLU] >>= 4;
X Color[i] = Convert (cmap[i][RED], cmap[i][GRN], cmap[i][BLU]);
X }
X}
X
X
X/*
X * leftmost pixel of byte is in most significant bit of byte
X */
Xstatic char GetIlbmVal( rastlist, h, bpp )
X char *rastlist[6];
X int h, bpp;
X{
X int i;
X char value = 0;
X short mask, bytep;
X
X mask = 0x80 >> ( h & 7);
X bytep = h >> 3;
X
X for( i = bpp-1; i >= 0; i-- ) {
X value <<= 1;
X value |= (*(rastlist[i]+bytep) & mask) ? 1: 0;
X }
X return( value );
X}
X
X /*
X * HamOut - output ham image in hex.
X */
Xstatic void HamOut(rastlist, pixwidth, v)
X char *rastlist[6];
X int pixwidth, v;
X{
X unsigned char lastred = 0,
X lastgreen = 0,
X lastblue = 0;
X int h;
X char pixval;
X for( h = 0; h <pixwidth; h++ ) {
X short shade;
X
X shade = GetIlbmVal(rastlist, h, 6);
X pixval = shade & 0x0F;
X switch (shade & 0x30) {
X case 0x00:
X lastred = cmap[pixval][RED];
X lastgreen = cmap[pixval][GRN];
X lastblue = cmap[pixval][BLU];
X shade = Color[pixval];
X break;
X case 0x10:
X lastblue = pixval;
X shade = Convert(lastred,lastgreen,lastblue);
X break;
X case 0x20:
X lastred = pixval;
X shade = Convert(lastred,lastgreen,lastblue);
X break;
X case 0x30:
X lastgreen = pixval;
X shade = Convert(lastred,lastgreen,lastblue);
X }
X SetImgPix(h, v, shade);
X }
X}
X
X /*
X * RastOut - handle normal bit mapped images
X */
Xstatic void RastOut(rastlist, pixwidth, v, depth)
X char *rastlist[6];
X int pixwidth, v, depth;
X{
X int h;
X for( h = 0; h < pixwidth; h++ ) {
X short shade;
X shade = Color[GetIlbmVal( rastlist, h, depth)];
X SetImgPix( h, v, shade);
X }
X}
X
X /*
X * ReadChunk - read in an IFF Chunk.
X */
X
Xstatic void ReadChunk()
X{
X FRead (&Chunk, sizeof (Chunk));
X
X} /* ReadChunk */
X
X /*
X * ReadBMHD - read the BMHD structure.
X */
X
Xstatic void ReadBMHD(bmhd)
Xstruct BMHD *bmhd;
X{
X FRead (bmhd, Chunk.Size);
X} /* ReadBMHD */
X
X
X /*
X * FRead - read 'len' bytes to 'pointer' while checking for an error.
X */
X
Xstatic void FRead(pointer,len)
Xchar *pointer;
Xint len;
X{
X if (fread (pointer, len, 1, fin) == 0) {
X char outbuff[90];
X sprintf(outbuff,"Fread Error in reading input file at %d ", ftell(fin));
X OutErr(outbuff);
X }
X} /* FRead */
END_OF_FILE
if test 8906 -ne `wc -c <'readilbm.c'`; then
echo shar: \"'readilbm.c'\" unpacked with wrong size!
fi
# end of 'readilbm.c'
fi
if test -f 'scrnops.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'scrnops.c'\"
else
echo shar: Extracting \"'scrnops.c'\" \(8883 characters\)
sed "s/^X//" >'scrnops.c' <<'END_OF_FILE'
X#include "scrnio.ih"
X/*
X * if manx supports rand, these ifdefs could be removed (somewhat)
X */
X#ifdef MANX
Xextern double ran(); /* not in manx math.h */
X#include <functions.h>
X#else
Xextern int rand();
X#endif
X
X#include "scrndef.h"
X#include "scrnio.h"
X#include "gadgetdef.h"
X#include "menudef.h"
X
X#include "bezpt.h"
X#include "revolve.h"
X#include "control.h"
X#include "poly.h"
X
X
Xlong BackColor = DefBkPlane;
Xshort DitherPower = 2;/* default gray levels = 4 */
Xstatic UWORD *GrayPat = null;
Xshort DitherLevels, DitherMask;
X#define RowPower 4 /* 2**4 = 16 rows */
X#define DitherLoc(LEVEL) ((LEVEL)<<RowPower)
X/*
X * free memory associated with
X * old dither patterns;
X */
Xvoid FreeOldDither() {
X if( GrayPat ) free(GrayPat);
X GrayPat = null;
X}
X/*
X * create grey level patterns
X */
Xbool AllocDither()
X{
X int i;
X float reallevels;
X if( GrayPat) return(true);
X
X DitherLevels = 1 << DitherPower;
X reallevels = (float) DitherLevels - 0.5;
X DitherMask = DitherLevels -1;
X GrayPat = (UWORD *)malloc(DitherLoc(DitherLevels)*sizeof(UWORD));
X if( !GrayPat ) {
X OutErr("not enough memory for options chosen");
X return(false);
X }
X ColorMax = (NumColors -1) * DitherLevels +1;
X /*
X * compute gray values for each grey level
X */
X for( i = 0; i < DitherLevels; i++ ) {
X /*
X * compute gray values for each row
X */
X int j;
X#ifdef MANX
X float fracti;
X fracti = (float)i/ reallevels;
X for( j = 0; j < DitherLoc(1); j++ ) {
X register long k, x;
X for( k = 16, x = 0; k--; ) {
X x <<= 1;
X x |= (ran() < fracti) ? 1: 0;
X }
X GrayPat[DitherLoc(i)+j] = x;
X }
X#else MANX
X for( j = 0; j < DitherLoc(1); j++ ) {
X register long k, x;
X for( k = 16, x = 0; k--; ) {
X x <<= 1;
X x |= ((rand()%DitherLevels)< i) ? 1: 0;
X }
X GrayPat[DitherLoc(i)+j] = x;
X }
X#endif MANX
X }
X return(true);
X}
X
X
Xvoid SetMono( maxrval, maxgval, maxbval )
X short maxrval,
X maxgval,
X maxbval;
X{
X long i;
X short range;
X long rval, gval, bval;
X
X range = (NumColors -1) & 0x1f; /* max 32 colours */
X for( i = 0; i <= range; i++ ) {
X rval = (maxrval * i )/range;
X gval = (maxgval * i )/range;
X bval = (maxbval * i )/range;
X
X SetRGB4( &(SurfScrn->ViewPort), i, rval, gval, bval );
X }
X}
X
X
Xvoid SetRainbow()
X{
X long i;
X short range;
X long rval, gval, bval;
X
X range = NumColors>> 1;
X /*
X * can't do a rainbow with only 2 colors
X */
X if( range < 2) {
X return;
X }
X
X for( i = 0; i < range; i++ ) {
X long diff;
X
X diff = (0xf * i )/(range-1);
X rval = 0xf - diff;
X bval = diff;
X gval = 0xf;
X SetRGB4( &(SurfScrn->ViewPort), i, rval, gval, bval);
X }
X for( i = 0; i < range; i++ ) {
X long diff;
X
X diff = (0xf * i )/(range-1);
X rval = diff;
X bval = 0xf;
X gval = 0xf - diff;
X SetRGB4( &(SurfScrn->ViewPort), i+range, rval, gval, bval);
X }
X SetRGB4( &(SurfScrn->ViewPort), 0L, 0L, 0L, 0L);
X}
X
X/*
X * set colours for hourglass pointer
X */
XSetHourGlassCol()
X{
X SetRGB4( &(SurfScrn->ViewPort),17L, 6L, 2L, 3L );
X SetRGB4( &(SurfScrn->ViewPort),18L, 0L, 0L, 0L );
X SetRGB4( &(SurfScrn->ViewPort),19L, 9L, 7L, 6L );
X}
X
X
X
Xvoid ClrWindow(drawaxis)
Xbool drawaxis;
X{
X long BkColAdj; /* background color adjusted for number of bit planes */
X
X BkColAdj = (BackColor * NumColors) / 32;
X SetRast(rp, BackColor); /* clear the window to colour 0 */
X SetAPen(rp, WinFgCol );
X /*
X * Draw axis on screen
X */
X if( drawaxis) {
X Move( rp, 0, WinVOrig); /* x axis */
X Draw( rp, (long)SurfWinDef.Width, (long)WinVOrig );
X
X Move( rp, WinHOrig, 0); /* y axis */
X Draw( rp, (long)WinHOrig, (long)SurfWinDef.Height );
X }
X}
X
X
X
X
X
Xvoid DrawLine( x1, y1, x2, y2, mode )
Xint x1, y1, x2, y2;
Xint mode;
X{
X SetDrMd( rp, mode );
X Move( rp, (long)UCntrX(x1), (long)UCntrY(y1));
X Draw(rp, (long)UCntrX(x2), (long)UCntrY(y2) );
X}
X
X
X
Xvoid PaintPoint(x,y,forecolor)
X short x, y;
X float forecolor;
X{
X long shade;
X shade = forecolor * (float) (NumColors-1);
X
X if( shade >= NumColors) {
X shade = NumColors-1;
X }
X else if ( shade < 0 ) {
X shade = 0;
X }
X
X SetAPen( rp, shade );
X WritePixel( rp, (long)UCntrX(x), (long)UCntrY(y));
X}
X
X
X
Xvoid DrawPnt( x, y, op )
Xint x, y, op;
X{
X x = UCntrX(x);
X y = UCntrY(y);
X SetDrMd(rp, op );
X RectFill( rp, (long)x, (long)y, (long)x, (long)y);
X}
X
X
Xvoid DrawSqr(x, y, op )
Xint x, y, op;
X{
X x = UCntrX(x);
X y = UCntrY(y);
X SetDrMd(rp, op );
X RectFill( rp, x - 2L, y -2L, x+ 2L, y+2L );
X}
X
X
Xvoid DrawBox( x, y, op)
Xint x, y, op;
X{
X x = UCntrX(x);
X y = UCntrY(y);
X SetDrMd(rp, op );
X RectFill( rp, x - 4L, y -4L, x+ 4L, y+4L );
X RectFill( rp, x - 3L, y -3L, x+ 3L, y+3L );
X}
X
X
Xvoid DrawRhomShade( poly)
XRhomboid *poly;
X{
X int i;
X int shade;
X long backcolor, forecolor;
X static UWORD FullBits = 0xffff;
X
X shade = (int)((poly->intensity) * ColorMax);
X
X if( shade >= ColorMax -1 ) {
X shade = 0;
X backcolor = NumColors -1;
X }
X else {
X backcolor = shade >> DitherPower;
X forecolor = backcolor +1;
X if( forecolor >= NumColors ) {
X forecolor = backcolor;
X }
X }
X SetDrMd( rp, JAM2);
X SetAPen( rp, forecolor );
X SetBPen( rp, backcolor );
X SetAfPt( rp, &GrayPat[DitherLoc((shade & DitherMask))], RowPower);
X
X AreaMove( rp, UCntrX(poly->pt[0].x), UCntrY(poly->pt[0].y));
X
X for( i = 1; i < 4; i++ ) {
X AreaDraw( rp, UCntrX(poly->pt[i].x), UCntrY(poly->pt[i].y) );
X }
X AreaEnd(rp);
X
X SetAfPt( rp, &FullBits, 0); /* reset back to solid */
X}
X
Xvoid DrawRhomFrame( inlist )
XScrnPair inlist[];
X{
X int i;
X
X SetDrMd( rp, JAM1);
X SetAPen( rp, 0L );
X SetOPen( rp, WinFgCol );
X
X AreaMove( rp, UCntrX(inlist[0].x), UCntrY(inlist[0].y));
X
X for( i = 1; i < 4; i++ ) {
X AreaDraw( rp, UCntrX(inlist[i].x), UCntrY(inlist[i].y) );
X }
X AreaEnd(rp);
X BNDRYOFF( rp ); /* turn off outlining */
X}
X
X
X
X
XSwitchBox()
X{
X struct IntuiMessage mycopy,
X *orig;
X
X RefreshGadgets(SurfWinDef.FirstGadget, SurfWin, NULL );
X
X while(1) {
X long wakeupmask;
X
X wakeupmask = Wait( SignalMask );
X /*
X * for now, we ignore the wakeupmask,
X * just read messages from each. if I notice a performance problem,
X * I'll fix it then
X */
X
X /*
X * handle messages for the control window
X */
X while( orig =(struct IntuiMessage *) GetMsg( CntrlWin->UserPort ) ) {
X
X mycopy = *orig;
X ReplyMsg( orig );
X
X switch( mycopy.Class ) {
X case MENUPICK:
X MenuHandler( mycopy.Code );
X break;
X
X case GADGETUP:
X GadgetHandler( (struct Gadget*)mycopy.IAddress );
X break;
X
X case CLOSEWINDOW:
X return;
X
X default:
X break;
X }
X }
X /*
X * handle the button window
X */
X while( orig =(struct IntuiMessage *) GetMsg( GadWin->UserPort ) ) {
X
X mycopy = *orig;
X ReplyMsg( orig );
X
X switch( mycopy.Class ) {
X case GADGETUP:
X GadgetHandler( (struct Gadget*)mycopy.IAddress );
X RefreshGadgets(SurfWinDef.FirstGadget, SurfWin, NULL );
X break;
X
X default:
X break;
X }
X }
X
X /*
X * handle messages for the other window
X */
X while( orig =(struct IntuiMessage *) GetMsg( SurfWin->UserPort ) ) {
X
X mycopy = *orig;
X ReplyMsg( orig );
X
X switch( mycopy.Class ) {
X case MOUSEBUTTONS:
X HandleMButtons(&mycopy);
X break;
X
X case INTUITICKS:
X HandleTicks(&mycopy);
X break;
X
X case MOUSEMOVE:
X break;
X
X default:
X break;
X }
X }
X }
X}
X
X/*
X * display error messages inside a requestor
X */
XOutErr(errstr)
X char *errstr;
X{
X static struct IntuiText errtext =
X { -1, -1, JAM1, 10, 10, NULL, NULL, NULL };
X static struct IntuiText negtext =
X { -1, -1, JAM1, 80, 20, NULL,(UBYTE *)"Onwards", NULL };
X
X errtext.IText = (UBYTE *)errstr;
X
X WBenchToFront();
X AutoRequest(CntrlWin, &errtext, NULL, &negtext, NULL, NULL,
X 8*strlen(errstr)+ 40, 60 );
X WindowToFront( CntrlWin );
X
X}
X
END_OF_FILE
if test 8883 -ne `wc -c <'scrnops.c'`; then
echo shar: \"'scrnops.c'\" unpacked with wrong size!
fi
# end of 'scrnops.c'
fi
if test -f 'tov3d.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'tov3d.c'\"
else
echo shar: Extracting \"'tov3d.c'\" \(8632 characters\)
sed "s/^X//" >'tov3d.c' <<'END_OF_FILE'
X#include <stdio.h>
X#include <math.h>
X
X#define true 1
X#define false 0
X
X/*
X * types
X */
Xtypedef float triplet[3];
Xtypedef int quadrlat[4];
X
Xtypedef enum {
X TminX, TminY, TminZ,
X TmaxX, TmaxY, TmaxZ,
X Tcolorin, Tcolorout, Tnameout } ArgType;
X
Xextern char *malloc();
Xextern double atof();
X
Xchar *ArgName[] = {
X "minx", "miny", "minz", "maxx", "maxy", "maxz", "ci", "co", "o", NULL
X };
X
X/*
X * command line arguments
X */
Xtriplet MinIn, MaxIn; /* define bounding box */
Xchar MinSet[3] = {false}, MaxSet[3] = {false};
X
Xint colorin = -1,
X colorout = -1;
Xchar *namein = NULL,
X *nameout = NULL;
X/*
X * file arguments
X */
XFILE *infile, *outfile= NULL;
Xint linenum;
X
X/*
X * mucky global variables
X */
Xtriplet *inring;
Xchar *indlist;
Xint pnt_total; /* total number of points */
Xtriplet Scale = { 1.0, 1.0, 1.0 };
Xtriplet Disp = { 0.0, 0.0, 0.0 };
X
X
Xint NumRings, /* number of curved rings */
X PtsInPerRing, /* points read in per ring */
X PtsOutPerRing, /* points written per ring */
X IsClosed; /* true if revolution is 360 degrees */
X
X/*
X * parse the command line arguments
X */
Xvoid getCliArgs(argc, argv)
X int argc;
X char *argv[];
X{
X int i;
X for( i = 0; i <argc; i++ ) {
X if( *argv[i] == '-' ) {
X int j;
X
X for( j = 0; ArgName[j]; j++ ) {
X if( !strncmp(ArgName[j], argv[i]+1, strlen(ArgName[j])))
X break;
X }
X
X if( !ArgName[j] ) {
X fprintf(stderr,"%s unknown, try one of below:\n", argv[i]);
X for( j = 0; ArgName[j]; j++ ) {
X fprintf(stderr,"-%s val\n", ArgName[j] );
X }
X exit(-1);
X }
X else {
X char *argpos;
X register int element;
X
X if( strlen(argv[i]+1) > strlen(ArgName[j]) ) {
X argpos = argv[i] + strlen(ArgName[j]) +1;
X }
X else {
X i++;
X if( i >= argc ) {
X fprintf(stderr,"missing arg for -%s\n", argv[i-1] );
X exit(-1);
X }
X argpos = argv[i];
X }
X switch( (ArgType)j ) {
X case TminX:
X case TminY:
X case TminZ:
X element = j - (int)TminX;
X MinIn[element] = atof(argpos);
X MinSet[element] = true;
X break;
X case TmaxX:
X case TmaxY:
X case TmaxZ:
X element = j - (int)TmaxX;
X MaxIn[element] = atof(argpos);
X MaxSet[element] = true;
X break;
X case Tcolorin: colorin = atoi(argpos); break;
X case Tcolorout: colorout = atoi(argpos); break;
X case Tnameout: nameout = argpos;
X } /* end case */
X }
X }
X else {
X namein = argv[i];
X }
X } /* end for loop */
X
X if (!namein ) {
X fprintf(stderr,"No input file named\n");
X exit(-1);
X }
X if(!nameout) {
X nameout = (char *)malloc(200); /* replace with max path size */
X sprintf(nameout, "%s.v3d", namein);
X }
X}
X
X/*
X * read an integer number into variable
X */
Xvoid readInt(IntVar)
X int *IntVar;
X{
X char c;
X linenum++;
X if( !fscanf(infile, "%d", IntVar)) {
X fprintf(stderr, "could not read integer at line %d\n", linenum);
X exit(-1);
X }
X /*
X * skip to end of line
X */
X while( c = getc(infile), c != EOF && c != '\n' ) ;
X}
X
Xvoid readTriplet( tripvar )
X triplet tripvar;
X{
X linenum++;
X if(!fscanf(infile, "%f %f %f",tripvar, tripvar+1, tripvar+2)) {
X fprintf(stderr,"could not read coordinate triplet at line %d\n",
X linenum);
X exit(-1);
X }
X}
X/*
X * read an entire ring
X */
Xvoid readRing() {
X int i;
X for( i = 0; i< PtsInPerRing; i++ ) {
X readTriplet(inring[i]);
X }
X}
X
X/*
X * read the first few lines in the file that tell us how many
X * rings, howmany points per ring, etc
X */
Xvoid readHeader() {
X int RevRange;
X int RevMesh;
X
X linenum = 0;
X readInt( &NumRings );
X readInt( &RevMesh );
X readInt( &RevRange );
X
X PtsInPerRing = RevMesh + 1;
X if( RevRange == 360 ) {
X IsClosed = true;
X PtsOutPerRing = RevMesh;
X }
X else {
X IsClosed = false;
X PtsOutPerRing = PtsInPerRing;
X }
X}
X/*
X * this procedure reads in a list of data points to determine the
X * following:
X * total number of data points to write out
X * maximun x,y,z spread
X */
Xvoid readPass1() {
X triplet max3, min3;
X int i;
X pnt_total = 0;
X
X inring = (triplet *)malloc(sizeof(triplet)*PtsInPerRing);
X indlist = (char *)malloc(sizeof(char)*NumRings);
X
X for( i = 0; i < NumRings; i++ ) {
X int j;
X readRing();
X
X for( j = 0; j < PtsOutPerRing; j++ ) {
X int k;
X for( k = 0; k < 3; k++ ) {
X if( max3[k] < inring[j][k] || !i && !j ) max3[k] = inring[j][k];
X if( min3[k] > inring[j][k] || !i && !j ) min3[k] = inring[j][k];
X }
X }
X if( inring[0][0] == inring[1][0] &&
X inring[0][1] == inring[1][1] ) {
X indlist[i] = 0;
X pnt_total += 1;
X }
X else {
X indlist[i] = 1;
X pnt_total += PtsOutPerRing;
X }
X }
X /*
X * compute scaling and displacement
X */
X for( i = 0; i < 3; i++ ) {
X if( MaxSet[i] && !MinSet[i] )
X MinIn[i] = -MaxIn[i];
X else if( !MaxSet[i] && MinSet[i] )
X MaxIn[i] = -MinIn[i];
X
X Scale[i] = 1.0;
X Disp[i] = 0.0;
X if( MaxSet[i] || MinSet[i] ) {
X float diffOut, diffIn;
X
X diffOut = MaxIn[i] - MinIn[i];
X diffIn = max3[i] - min3[i];
X if( diffIn > 0 ) Scale[i] = diffOut/diffIn;
X Disp[i] = MaxIn[i] - max3[i] * Scale[i];
X }
X }
X}
X
Xvoid writeTriplet(trip)
X triplet trip;
X{
X int i;
X for( i = 0; i < 3; i++ ) {
X fprintf(outfile,"%f%c", trip[i]*Scale[i]+Disp[i], i==2?'\n':' ');
X }
X}
X
X
Xvoid writeRing()
X{
X int i;
X for( i = 0; i < PtsOutPerRing; i++ ) {
X writeTriplet(inring[i]);
X }
X}
X
X
X
Xvoid writePoints()
X{
X int ringno;
X
X fprintf(outfile, "%d\n", pnt_total);
X for( ringno = 0; ringno < NumRings; ringno++ ) {
X readRing();
X if( indlist[ringno] )
X writeRing();
X else
X writeTriplet( inring[0] );
X }
X}
X
X
Xvoid writeQuad(quad, numpts, color, order)
X quadrlat quad;
X int numpts, color, order;
X{
X int i;
X fprintf(outfile, "%d ", numpts);
X for(i=0; i <numpts; i++ ) {
X fprintf(outfile,"%d ", quad[order?i:(numpts-i -1)]);
X }
X fprintf(outfile,"%d \n", color);
X}
X
Xvoid writePolys() {
X int RevA, RevB;
X int PtCntA, PtCntB;
X int RingA, RingB;
X int PolysPerRing;
X
X PolysPerRing = PtsInPerRing -1;
X PtCntB = RingA = 0;
X for( RingB =1; PtCntA = PtCntB, RingB < NumRings; RingA = RingB++ ) {
X
X PtCntB += indlist[RingA]? PtsOutPerRing: 1;
X for( RevA =0; RevA < PolysPerRing; RevA++ ) {
X quadrlat quad;
X int qcnt;
X
X RevB = RevA +1;
X if( RevB >= PtsOutPerRing ) RevB = 0;
X
X qcnt = 0;
X if(indlist[RingA] ) {
X quad[qcnt++] = PtCntA + RevA;
X quad[qcnt++] = PtCntA + RevB;
X }
X else
X quad[qcnt++] = PtCntA;
X
X if(indlist[RingB] ) {
X quad[qcnt++] = PtCntB + RevB;
X quad[qcnt++] = PtCntB + RevA;
X }
X else
X quad[qcnt++] = PtCntB;
X
X if( qcnt >= 3 ) {
X if( colorin >= 0 ) writeQuad(quad, qcnt, colorin, false);
X if( colorout >=0 ) writeQuad(quad, qcnt, colorout, true);
X }
X }
X }
X}
X
Xmain(argc, argv)
X int argc;
X char *argv[];
X{
X getCliArgs(argc, argv);
X infile = fopen(namein, "r");
X if(!infile) {
X fprintf(stderr,"can not read \"%s\"\n", namein);
X exit(-1);
X }
X
X readHeader();
X readPass1();
X fclose(infile);
X
X outfile = fopen(nameout, "w");
X if( !outfile) {
X fprintf(stderr, "can not write to \"%s\"\n", nameout);
X exit(-1);
X }
X
X infile = fopen(namein, "r");
X readHeader();
X writePoints();
X fclose(infile);
X writePolys();
X fclose(outfile);
X}
END_OF_FILE
if test 8632 -ne `wc -c <'tov3d.c'`; then
echo shar: \"'tov3d.c'\" unpacked with wrong size!
fi
# end of 'tov3d.c'
fi
echo shar: End of archive 3 \(of 4\).
cp /dev/null ark3isdone
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.