/* this file contains definition for the screen */

#include "scrnio.ih"
#include <exec/memory.h>
#ifdef MANX
#include <functions.h>
#endif

#include "scrndef.h"
#include "gadgetdef.h"
#include "mytypes.h"
#include "bezpt.h"
#include "poly.h"
#include "revolve.h"
#include "readilbm.h"

/*
 * definition for image of hourglass
 */
static UWORD HourGlassDat[] = {
 0x0, 0x0, 0x0, 0xffff,
 0x7ffe, 0x8001, 0x6006, 0x9ff9,
 0x2004, 0x5ffa, 0x1c38, 0x2ff4,
 0xf70, 0x17e8, 0x7e0, 0xbd0,
 0x2c0, 0x5a0, 0x240, 0x5a0,
 0x420, 0xbd0, 0x910, 0x17e8,
 0x1788, 0x2ff4, 0x2fe4, 0x5ffa,
 0x7ff6, 0x9ff9, 0x7ffe, 0x8001,
 0x0, 0xffff, 0x0, 0x0
 };

UWORD *HourGlass = NULL;




/*
 * actual gadget definitions
 */
#define TOP 13
#define ROW 9
#define COL 8
#define TxOff 1
       /*
        * start of boolean gadgets
        */
#define BOOLGADFLAGS (RELVERIFY|TOPBORDER)
#define BOOLTOP 0
#define BOOLLEFT 0

static struct IntuiText TextDefLines = {
    -1,-1,JAM1, 0, TxOff, NULL,(UBYTE *) "Lines", NULL };

static struct Gadget G_DefLines = {
    NULL,
    BOOLLEFT , BOOLTOP , 5*COL, ROW, /* loc and size of hit box */
    GADGHBOX,    /* complemented when pressed */
    BOOLGADFLAGS,    /* just get gadget up messages */
    BOOLGADGET,
    NULL, NULL,
    &TextDefLines,
    0, NULL,
    (int)N_DefLines,
    NULL
 };


static struct IntuiText TextEditBez = {
    -1,-1,JAM1, 0, TxOff, NULL,(UBYTE *) "Curves", NULL };

static struct Gadget G_EditBez = {
    &G_DefLines,
    BOOLLEFT+COL*6, BOOLTOP, 6*COL, ROW, /* loc and size of hit box */
    GADGHBOX,    /* complemented when pressed */
    RELVERIFY,    /* just get gadget up messages */
    BOOLGADGET,
    NULL, NULL,
    &TextEditBez,
    0, NULL,
    (int)N_EditBez,
    NULL
 };


static struct IntuiText TextMap = {
    -1,-1,JAM1, 0, TxOff, NULL,(UBYTE *) "Map", NULL };

static struct Gadget G_Map = {
    &G_EditBez,
    BOOLLEFT +24*COL, BOOLTOP, 3*COL, ROW, /* loc and size of hit box */
    GADGHBOX,    /* complemented when pressed */
    RELVERIFY,    /* just get gadget up messages */
    BOOLGADGET,
    NULL, NULL,
    &TextMap,
    0, NULL,
    (int)N_Map,
    NULL
 };


static struct IntuiText TextWire = {
    -1,-1,JAM1, 0, TxOff, NULL,(UBYTE *) "Wire", NULL };

static struct Gadget G_Wire = {
    &G_Map,
    BOOLLEFT +13*COL, BOOLTOP, 4*COL, ROW, /* loc and size of hit box */
    GADGHBOX,    /* complemented when pressed */
    RELVERIFY,    /* just get gadget up messages */
    BOOLGADGET,
    NULL, NULL,
    &TextWire,
    0, NULL,
    (int)N_Wire,
    NULL
 };

static struct IntuiText TextShaded = {
    -1,-1,JAM1, 0, TxOff, NULL,(UBYTE *) "Shade", NULL };

static struct Gadget G_Shaded = {
    &G_Wire,
    BOOLLEFT +18*COL, BOOLTOP, 5*COL, ROW, /* loc and size of hit box */
    GADGHBOX,    /* complemented when pressed */
    RELVERIFY,    /* just get gadget up messages */
    BOOLGADGET,
    NULL, NULL,
    &TextShaded,
    0, NULL,
    (int)N_Shaded,
    NULL
 };

static struct IntuiText TextGoPanel = {
    -1,-1,JAM1, 0, TxOff, NULL,(UBYTE *) "Panel", NULL };

static struct Gadget G_GoPanel = {
    &G_Shaded,
    BOOLLEFT +28*COL, BOOLTOP, 5*COL, ROW, /* loc and size of hit box */
    GADGHBOX,    /* complemented when pressed */
    RELVERIFY,    /* just get gadget up messages */
    BOOLGADGET,
    NULL, NULL,
    &TextGoPanel,
    0, NULL,
    (int)N_GoPanel,
    NULL
 };

static struct IntuiText TextGoSurf = {
    1,-1,JAM1, 0, TxOff, NULL,(UBYTE *) "Display", NULL };

static short S_GoSurf[] = {
    -2,-1,  -2,ROW+1,  7*COL+2,ROW+1,  7*COL+2,-1, -2,-1
 };

static struct Border B_GoSurf = { 0, 0, 1, 0, JAM1, 5, S_GoSurf, NULL };

static struct Gadget G_GoSurf = {
    NULL,
    2*COL, TOP, 7*COL, ROW, /* loc and size of hit box */
    GADGHBOX,    /* complemented when pressed */
    RELVERIFY,    /* just get gadget up messages */
    BOOLGADGET,
    (APTR)&B_GoSurf, NULL,
    &TextGoSurf,
    0, NULL,
    (int)N_GoSurf,
    NULL
 };

        /*
         * beginning of slider gadgets
         */
#define GadFlags    (GADGIMAGE | GADGHNONE)  /* my gadget flags */
#define MyPropType (PROPGADGET)

/*
 *  definitions for the number of Revolution Slices
 */

static char DispRevSlices[] = { "Rev Slices=[   ]" };

static struct IntuiText TextRevSlices = {
    1,1,JAM1, -sizeof(DispRevSlices)*COL, TxOff, NULL,
    (UBYTE *)DispRevSlices, NULL
 };

struct GadExtens VRevSlices = {0.0, 0.0, 0.0, 1, 360, DefRevMeshVal, false };

static struct Gadget G_RevSlices = {
    &G_GoSurf,
    COL*57 , TOP+ROW*2, COL*15, ROW, /* loc and size */
    GadFlags,
    RELVERIFY,
    MyPropType,
    NULL,
    NULL , /* high lighted */
    &TextRevSlices,
    0x0,
    NULL,
    (int)N_RevSlices,
    (APTR) &VRevSlices
 };

/*
 * definition for the background shade
 */
static char DispBackPlane[] = { "Background = [  ]" };

static struct IntuiText TextBackPlane = {
    1,1,JAM1, -sizeof(DispBackPlane)*COL, TxOff, NULL,
    (UBYTE *)DispBackPlane, NULL
 };

struct GadExtens VBackPlane = {0.0, 0.0, 0.0, 0, 31, DefBkPlane, false};


static struct Gadget G_BackPlane = {
    &G_RevSlices,
    COL*57 , TOP+ROW*13, COL*15, ROW, /* loc and size */
    GadFlags,
    RELVERIFY,
    MyPropType,
    NULL,
    NULL , /* high lighted */
    &TextBackPlane,
    0x0,
    NULL,
    (int)N_BackPlane,
    (APTR) &VBackPlane
 };


/*
 *  definitions for the number of Revolution Angles
 */

static char DispRevAngle[] = { "Rev Angle=[   ]" };

static struct IntuiText TextRevAngle = {
    1,1,JAM1, -sizeof(DispRevAngle)*COL, TxOff, NULL,
    (UBYTE *)DispRevAngle, NULL
 };

struct GadExtens VRevAngle = { 0.0, 0.0, 0.0, 0, 360, DefRotRange, false };


static struct Gadget G_RevAngle = {
    &G_BackPlane,
    COL*57 , TOP+ROW*3, COL*15, ROW, /* loc and size */
    GadFlags,
    RELVERIFY,
    MyPropType ,
    NULL,
    NULL, /* high lighted */
    &TextRevAngle,
    0x0,
    NULL,
    (int)N_RevAngle,
    (APTR) &VRevAngle
 };
/*
 *  definitions for start rotation angle
 */

static char DispRevStart[] = { "Start Angle=[   ]" };

static struct IntuiText TextRevStart = {
    1,1,JAM1, -sizeof(DispRevStart)*COL, TxOff, NULL,
    (UBYTE *)DispRevStart, NULL
 };

struct GadExtens VRevStart = { 0.0, 0.0, 0.0, 0, 360, DefRotStart, false };


static struct Gadget G_RevStart = {
    &G_RevAngle,
    COL*57 , TOP+ROW*4, COL*15, ROW, /* loc and size */
    GadFlags,
    RELVERIFY,
    MyPropType ,
    NULL,
    NULL, /* high lighted */
    &TextRevStart,
    0x0,
    NULL,
    (int)N_RevStart,
    (APTR) &VRevStart
 };

/*
 *  definitions for the number of Bezier Slices
 */

static char DispBezSlices[] = { "Bez Slices=[   ]" };

static struct IntuiText TextBezSlices = {
    1,1,JAM1, -sizeof(DispBezSlices)*COL, TxOff, NULL,
    (UBYTE *)DispBezSlices, NULL
 };


struct GadExtens VBezSlices = { 0.0, 0.0, 0.0, 1, 100, DefBezMeshVal, false };

static struct Gadget G_BezSlices = {
    &G_RevStart,
    COL*20 , TOP+ROW*2, COL*15, ROW, /* loc and size */
    GadFlags,
    RELVERIFY,
    MyPropType ,
    NULL,
    NULL, /* high lighted */
    &TextBezSlices,
    0x0,
    NULL,
    (int)N_BezSlices,
    (APTR)&VBezSlices
 };

/*
 *  definitions for tilt angle
 */

static char DispTiltAng[] = { "Tilt Angle=[   ]" };

static struct IntuiText TextTiltAng = {
    1,1,JAM1, -sizeof(DispTiltAng)*COL, TxOff, NULL,
    (UBYTE *)DispTiltAng, NULL
 };


struct GadExtens VTiltAng = { 0.0, 0.0, 0.0, 0, 360, DefTilt, false };

static struct Gadget G_TiltAng = {
    &G_BezSlices,
    COL*20 , TOP+ROW*3, COL*15, ROW, /* loc and size */
    GadFlags,
    RELVERIFY,
    MyPropType ,
    NULL,
    NULL, /* high lighted */
    &TextTiltAng,
    0x0,
    NULL,
    (int)N_TiltAng,
    (APTR) &VTiltAng
 };


/*
 * definitions for K Specular
 */

static char DispKspec[] = {"Kspecular=[     ] " };

static struct IntuiText TextKspec = {
    1,1,JAM1, -sizeof(DispKspec)*COL, TxOff, NULL,
    (UBYTE *)DispKspec, NULL
 };


struct GadExtens VKspec = { 0.0, 1.0, DefKs, 0, 0, 0, true };

static struct Gadget G_Kspec = {
    &G_TiltAng,
    49*COL , TOP+ROW*9, COL*15, ROW, /* loc and size */
    GadFlags,
    RELVERIFY,
    MyPropType ,
    NULL,
    NULL, /* high lighted */
    &TextKspec,
    0x0,
    NULL,
    (int)N_Kspec,
    (APTR) &VKspec
 };

/*
 * definitions for K diffuse
 */

static char DispKdiffuse[] = {"Kdiffuse=[     ] " };

static struct IntuiText TextKdiffuse = {
    1,1,JAM1, -sizeof(DispKdiffuse)*COL, TxOff, NULL,
    (UBYTE *)DispKdiffuse, NULL
 };


struct GadExtens VKdiffuse = { 0.0, 1.0, DefKd, 0, 0, 0, true };

static struct Gadget G_Kdiffuse = {
    &G_Kspec,
    49*COL , TOP+ROW*10, COL*15, ROW, /* loc and size */
    GadFlags,
    RELVERIFY,
    MyPropType ,
    NULL,
    NULL, /* high lighted */
    &TextKdiffuse,
    0x0,
    NULL,
    (int)N_Kdiffuse,
    (APTR) &VKdiffuse
 };



/*
 * definitions for DispPtIntens
 */


static struct IntuiText PtProperties = {
    1,1,JAM1, -10*COL, -ROW, NULL,
    (UBYTE *)"Properties", NULL
 };

static char DispPtIntens[] = {"Intensity=[     ] " };

static struct IntuiText TextPtIntens = {
    1,1,JAM1, -sizeof(DispPtIntens)*COL, TxOff, NULL,
    (UBYTE *)DispPtIntens, &PtProperties
 };


struct GadExtens VPtIntens = { 0.0, 2.5, DefIntensity , 0, 0, 0, true };

static struct Gadget G_PtIntens = {
    &G_Kdiffuse,
    49*COL , TOP+ROW*8, COL*15, ROW, /* loc and size */
    GadFlags,
    RELVERIFY,
    MyPropType ,
    NULL,
    NULL, /* high lighted */
    &TextPtIntens,
    0x0,
    NULL,
    (int)N_PtIntens,
    (APTR) &VPtIntens
 };




/*
 * definitions for background intensity
 */
static struct IntuiText DispAmbient= {
    1,1,JAM1,- COL*3, -ROW, NULL,
    (UBYTE *) "Other", NULL
 };

static char DispBkIntens[] = { "Ambience=[     ] " };

static struct IntuiText TextBkIntens = {
    1,1,JAM1, -sizeof(DispBkIntens)*COL, TxOff, NULL,
    (UBYTE *) DispBkIntens, &DispAmbient
 };

struct GadExtens VBkIntens = { 0.0, 1.0, DefAmbience, 0, 0, 0, true };


static struct Gadget G_BkIntens = {
    &G_PtIntens,
    20*COL , TOP+ROW*13, COL*15, ROW, /* loc and size */
    GadFlags,
    RELVERIFY,
    MyPropType,
    NULL,
    NULL, /* high lighted */
    &TextBkIntens,
    0x0,
    NULL,
    (int)N_BkIntens,
    (APTR)&VBkIntens
 };




/*
 * Definitions for Surface distance
 */

static char DispSurfDist[] = {"Surf Dist=[     ] " };

static struct IntuiText TextSurfDist = {
    1,1,JAM1, -sizeof(DispSurfDist)*COL, TxOff, NULL,
    (UBYTE *) DispSurfDist, NULL
 };


struct GadExtens VSurfDist = {0.0, 0.0, 0.0, -500, 3000, DefSurfDist, false};

static struct Gadget G_SurfDist = {
    &G_BkIntens,
    20*COL , TOP+ROW*4, COL*15, ROW, /* loc and size */
    GadFlags,
    RELVERIFY,
    MyPropType,
    NULL,
    NULL, /* high lighted */
    &TextSurfDist,
    0x0,
    NULL,
    (int)N_SurfDist,
    (APTR)&VSurfDist
 };




/*
 * definitions for location.x
 */
static struct IntuiText PointLight = {
    1,1,JAM1, 9*COL, -ROW*2, NULL,
    (UBYTE *) "Point Light Source", NULL
 };

static struct IntuiText TextPtLocXYZ = {
    1,1,JAM1, -4, -ROW, NULL,
    (UBYTE *) "Location", &PointLight
 };

static char DispPtLocX[] = { "x=[     ] " };

static struct IntuiText TextPtLocX = {
    1,1,JAM1, -sizeof(DispPtLocX)*COL, TxOff, NULL,
    (UBYTE *) DispPtLocX, &TextPtLocXYZ
 };


struct GadExtens VPtLocX = {0.0, 0.0, 0.0, -6000, 6000, DefLightSrcX, false };

static struct Gadget G_PtLocX = {
    &G_SurfDist,
    12*COL , TOP+ROW*8, COL*15, ROW, /* loc and size */
    GadFlags,
    RELVERIFY,
    MyPropType,
    NULL,
    NULL, /* high lighted */
    &TextPtLocX,
    0x0,
    NULL,
    (int)N_PtLocX,
    (APTR) &VPtLocX
 };



/*
 * definitions for location.x
 */

static char DispPtLocY[] = "y=[     ] ";

static struct IntuiText TextPtLocY = {
    1,1,JAM1, -sizeof(DispPtLocY)*COL, TxOff, NULL,
    (UBYTE *) DispPtLocY, NULL
 };


struct GadExtens VPtLocY = { 0.0, 0.0, 0.0, -6000, 6000, DefLightSrcY, false };

static struct Gadget G_PtLocY = {
    &G_PtLocX,
    12*COL , TOP+ROW*9, COL*15, ROW, /* loc and size */
    GadFlags,
    RELVERIFY,
    MyPropType,
    NULL,
    NULL, /* high lighted */
    &TextPtLocY,
    0x0,
    NULL,
    (int)N_PtLocY,
    (APTR) &VPtLocY
 };



 /*
  * definitions for location.z
  */

static char DispPtLocZ[] = { "z=[     ] " };

static struct IntuiText TextPtLocZ = {
    1,1,JAM1, -sizeof(DispPtLocZ)*COL, TxOff, NULL,
    (UBYTE *)DispPtLocZ, NULL
 };


struct GadExtens VPtLocZ ={ 0.0, 0.0, 0.0, -1000, 3000, DefLightSrcZ, false };

static struct Gadget G_PtLocZ = {
    &G_PtLocY,
    12*COL , TOP+ROW*10, COL*15, ROW, /* loc and size */
    GadFlags,
    RELVERIFY,
    MyPropType,
    NULL,
    NULL, /* high lighted */
    &TextPtLocZ,
    0x0,
    NULL,
    (int)N_PtLocZ,
    (APTR) &VPtLocZ
 };

 /*
  * definitions for Map replication in horizontal axis
  */

static char DispRepH[] = { "Map RepH=[     ] " };

static struct IntuiText TextRepH = {
    1,1,JAM1, -sizeof(DispRepH)*COL, TxOff, NULL,
    (UBYTE *)DispRepH, NULL
 };


struct GadExtens VRepH ={ 0.0, 0.0, 0.0, 1, 300, DefRepH, false };

static struct Gadget G_RepH = {
    &G_PtLocZ,
    20*COL , TOP+ROW*15, COL*15, ROW, /* loc and size */
    GadFlags,
    RELVERIFY,
    MyPropType,
    NULL,
    NULL, /* high lighted */
    &TextRepH,
    0x0,
    NULL,
    (int)N_RepH,
    (APTR) &VRepH
 };


 /*
  * definitions for map replication in vertical axis
  */

static char DispRepV[] = { "Map RepV=[     ] " };

static struct IntuiText TextRepV = {
    1,1,JAM1, -sizeof(DispRepV)*COL, TxOff, NULL,
    (UBYTE *)DispRepV, NULL
 };


struct GadExtens VRepV ={ 0.0, 0.0, 0.0, 1, 300, DefRepV, false };

static struct Gadget G_RepV = {
    &G_RepH,
    57*COL , TOP+ROW*15, COL*15, ROW, /* loc and size */
    GadFlags,
    RELVERIFY,
    MyPropType,
    NULL,
    NULL, /* high lighted */
    &TextRepV,
    0x0,
    NULL,
    (int)N_RepV,
    (APTR) &VRepV
 };






LoadChipMem( dest, src, srcsize)
    UWORD **dest;
    UWORD *src;
    int srcsize;
{
    UWORD *d;

    d = (UWORD *)AllocMem( srcsize, MEMF_CHIP );
    *dest = d;
    while( srcsize ) {
        *d++ = *src++;
        srcsize -= sizeof( UWORD );
    }
}


void InitGadgets()
{
    struct Gadget *vp;
    LoadChipMem( &HourGlass, HourGlassDat, sizeof(HourGlassDat));


    CntrlWinDef.FirstGadget = &G_RepV;
    GadWinDef.FirstGadget = &G_GoPanel;
    /*
     * fill in numeric fields
     */
    for( vp = CntrlWinDef.FirstGadget; vp; vp = vp->NextGadget ) {
        GadgetSetVal( vp );
        GadgetUpdate(vp, false );
    }
}


void EndGadgets()
{
    if( HourGlass ) {
        FreeMem(HourGlass, sizeof(HourGlassDat ));
    }
}
