Listing 3. Excerpts From a 3D Function Plotting Program Using the X-Specs 3D Glasses /*---------------- INCLUDE FILES ----------------*/ #include "/hdr/common.h" #include "/hdr/XSpecsLib.h" /*---------------- External Variables ---------------*/ extern struct GfxBase *GfxBase; extern struct Library *XSpecsBase; extern struct Window *win; extern struct RastPort *rastport; extern struct ViewPort *viewport; extern AllPlotData *apd; extern DOUBLE Evaluate(DOUBLE, DOUBLE); /*------------------ CalcAndPlot3 Function ----------------*/ static VOID CalcAndPlot3(DOUBLE x1, DOUBLE y1, BOOL flag) { static LONG pennum; static DOUBLE x2, y2, z1; /* Assign last 2 points to first 2 points */ xp1 = xp4; xp2 = xp3; yp1 = yp4; yp2 = yp3; zp1 = zp4; zp2 = zp3; x2 = x1 + xspc; /* used if flag = FALSE, plot along Y-axis */ y2 = y1 + yspc; /* used if flag = TRUE , plot along X-axis */ if(flag) Calculate2(x1, y2, calc(x1, y2)); else Calculate2(x2, y1, calc(x2, y1)); xp3 = xp; yp3 = yp; zp3 = zp; z1 = calc(x1, y1); Calculate2(x1, y1, z1); xp4 = xp; yp4 = yp; zp4 = zp; dtoplane = zcalc(x1, y1, z1); pennum = (LONG)((dtoplane - dmin)/colorspread) + pennumbase; if (pennum > pennummax) pennum = pennummax; if (pennum < pennumbase) pennum = pennumbase; XSpecsSetAPen(pennum); XSpecsMove(xp1, yp1, zp1); XSpecsDraw(xp2, yp2, zp2); XSpecsDraw(xp3, yp3, zp3); XSpecsDraw(xp4, yp4, zp4); } /* CalcAndPlot3 */ /*-------------------- DrawGraph Function -----------------*/ VOID DrawGraph(VOID) { struct IntuiMessage *message; DOUBLE calcspacex, calcspacey, calcincx, calcincy, tx, ty, tz, yminend, ymaxend, ybeginspc, xminend, xmaxend, xbeginspc, zradians, yradians, xradians; BOOL alongxflag, alongyflag; /* Set-up code is here; not shown */ /* PLOT THE GRAPH */ switch(plottype) { case PLOTXSPECS: { /* block begin */ struct MsgPort *uport; /* user port of XSpecs windows */ UWORD colorarray32[] = { 0x000, 0xF00, 0xD00, 0xB00, 0x007, 0x008, 0x009, 0x00A, 0x00B, 0x00C, 0x00D, 0x00E, 0x00F, 0x11F, 0x22F, 0x33F, 0x44F, 0x55F, 0x66F, 0x77F, 0x88F, 0x99F, 0xAAF, 0xBBF, 0xCCF, 0xDDF, 0xEEF, 0xFFF, 0x006, 0x005, 0x004, 0x002 }; if (XSpecsAllocView(NULL) != 0) goto EndDrawGraph; if (!(uport = (struct MsgPort *) XSpecsOn (MOUSEBUTTONS))) { XSpecsFreeView(); /* Free up view */ goto EndDrawGraph; } /* if */ XSpecsLoadRGB4(colorarray32,32); if(alongxflag) { /* Plot along X-axis */ yminend = apd->dd.PlotYmin; ymaxend = apd->dd.PlotYmax; /* Prevent going one yspc to far at end of plot */ if(ybegin < yend) ymaxend = apd->dd.PlotYmax - yspc; else yminend = apd->dd.PlotYmin - yspc; for(ty = ybegin ; (ty <= ymaxend) && (ty >= yminend) ; ty += yspc) { /* Check for Stop Plot from user */ if(message = (struct IntuiMessage *) GetMsg(win->UserPort)) { goto EndXSpecsPlot; } /* if */ /* Initialize starting plot points */ ybeginspc = ty + yspc; Calculate2(xbegin, ty, calc(xbegin, ty)); xp4 = xp; yp4 = yp; zp4 = zp; Calculate2(xbegin, ybeginspc, calc(xbegin, ybeginspc)); xp3 = xp; yp3 = yp; zp3 = zp; /* Plot along X-axis */ for(tx = xbegin + xspc ; (tx <= apd->dd.PlotXmax) && (tx >= apd->dd.PlotXmin) ; tx += xspc) CalcAndPlot3(tx, ty, alongxflag); } /* for */ } /* if */ else { /* Plot along Y-axis */ xminend = apd->dd.PlotXmin; xmaxend = apd->dd.PlotXmax; /* Prevent going one xspc to far at end of plot */ if(xbegin < xend) xmaxend = apd->dd.PlotXmax - xspc; else xminend = apd->dd.PlotXmin - xspc; for(tx = xbegin ; (tx <= xmaxend) && (tx >= xminend) ; tx += xspc) { /* Check for Stop Plot from user */ if(message = (struct IntuiMessage *) GetMsg(win->UserPort)) { goto EndXSpecsPlot; } /* if */ /* Initialize starting plot points */ xbeginspc = tx + xspc; Calculate2(tx, ybegin, calc(tx, ybegin)); xp4 = xp; yp4 = yp; zp4 = zp; Calculate2(xbeginspc, ybegin, calc(xbeginspc, ybegin)); xp3 = xp; yp3 = yp; zp3 = zp; /* Plot along X-axis */ for(ty = ybegin + yspc ; (ty <= apd->dd.PlotYmax) && (ty >= apd->dd.PlotYmin) ; ty += yspc) CalcAndPlot3(tx, ty, alongxflag); } /* for */ } /* else */ WaitPort(win->UserPort); /* Wait for user mouse click */ } /* Block end */ EndXSpecsPlot: XSpecsOff(); /* Turn 'um off */ XSpecsFreeView(); /* Free up view */ break; default: break; } /* switch */