/* GW-Include.h Shared code include for Gravity-Well Gary Teachout Copyright July 1989 */ #include #include #include #include #include #include #include #include #include #define LINEPEN 1 /* pen colors */ #define DOTPEN 3 #define BPEN 2 #define DPEN 0 #define MFPEN 0 #define MBPEN 2 #define NEWCENTER 1 /* awaiting */ #define NEWPOSITION 2 #define NEWVELOCITY 3 #define NEWMASS 4 #define NEWCREATE 5 struct dv /* double 3 - d vector */ { double x , y , z ; } ; struct obv /* orthogonal basis vectors */ { struct dv i , j , k ; } ; struct object /* data for each body */ { struct dv position , velocity , oldpos , startpos , startvel ; double mass , startmass , radius ; short flags , collision ; char name[ 68 ] ; } ; struct filedata /* data for the entire simulation */ { char tag[ 16 ] ; struct object objects[ 20 ] ; struct obv viewbasis , unviewbasis ; struct dv viewoffset ; double elapsedtime , timestep , scale , magic ; USHORT stopflag , awaiting , trailson , objectnum , follow ; char filecomment1[ 66 ] , filecomment2[ 66 ] ; } ; struct menubox /* text menu items */ { struct MenuItem item ; struct IntuiText text ; } ; /* System prototypes */ char *AllocMem() ; struct Screen *OpenScreen() ; struct Window *OpenWindow() ; struct IntuiMessage *GetMsg() ; struct FileHandle *Open() ; struct TextFont *OpenDiskFont() ; /* GW-Main prototypes */ void main( void ) ; void takestep( double ) ; /* GW-Interface prototypes */ void startup( void ) ; void cleanup( void ) ; void openmainview( void ) ; void opentopview( void ) ; void openrightview( void ) ; void openviewcontrol( void ) ; void pixel( struct Window * , double , double ) ; void blankwindow( struct Window * ) ; void line( struct Window * , double , double , double , double ) ; void linelong( struct Window * , long , long , long , long ) ; void interface( void ) ; void readmes( void ) ; void handelmenu( void ) ; void stoploop( void ) ; void resetdisplay( void ) ; void screentitle( long ) ; void setupdisplay( struct Window * ) ; void set( void ) ; void create( void ) ; void setstrings( void ) ; void deleteobject( long ) ; void endtrail( long , long ) ; void updatedisplay( void ) ; /* GW-Vectors prototypes */ void rotatedv( struct dv * , struct dv * , double * , double * ) ; void rotatedvpair10( struct dv * , struct dv * ) ; void adddv( struct dv * , struct dv * , struct dv * ) ; void subdv( struct dv * , struct dv * , struct dv * ) ; void scaledv( struct dv * , double * , struct dv * ) ; void dotdv( struct dv * , struct dv * , double * ) ; void crossdv( struct dv * , struct dv * , struct dv * ) ; void magdv( struct dv * , double * ) ; void basis( struct dv * , struct obv * , struct dv * ) ; /* Global Data */ /* all but one file must be compiled with the -x option */ struct IntuitionBase *IntuitionBase ; struct GfxBase *GfxBase ; struct Library *DiskfontBase ; struct IntuiMessage *mes ; struct Screen *screen ; struct Window *control , /* renamed the Data window */ *viewcontrol , *mainview , *topview , *rightview ; struct TextAttr stext = { "topaz.font" , 8 , 0 , 0 } ; struct TextAttr rtext = { "topaz.font" , 11 , 0 , 0 } ; struct TextFont *rfont ; ULONG class ; USHORT code ; short mousex , mousey ; struct Gadget *iadd ; char *titletext[ 6 ] = { " Gravity Well" , " Gravity Well Awating New Center Point" , " Gravity Well Awating New Position" , " Gravity Well Awating New Velocity" , " Gravity Well Awating New Mass" , " Gravity Well Create Mode" } ; char ettext[ 33 ] ; char numbertext[] = " 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 " ; char *controlgtext[ 11 ] = { "Position" , "Velocity" , "Mass " , "Delete " , "Zero M " , "Start " , " Load " , " Save " , " New " , " Create " , " Enter " } ; char *conlabel[ 10 ] = { "File Name:" , "Comment:" , "" , "Name:" , "Time Step:" , "Magic:" , "Mass:" , "Radius:" , "Start Position:" , "Start Velocity:" } ; short conlabellength[ 10 ] = { 10 , 8 , 0 , 5 , 10 , 6 , 5 , 7 , 15 , 15 } ; short clut[ 4 ][ 3 ] = /* screen colors */ { { 0 , 0 , 0 } , { 15 , 0 , 0 } , { 10 , 8 , 0 } , { 15 , 15 , 15 } } ; struct NewScreen ns = { 0 , 0 , 640 , 400 , 2 , DPEN , BPEN , HIRES | LACE , CUSTOMSCREEN , NULL , " Gravity Well" , NULL , NULL } ; struct NewWindow controlnw = /* the Data window */ { 0 , 12 , 640 , 388 , DPEN , BPEN , MENUPICK | GADGETUP , WINDOWDEPTH | SMART_REFRESH | ACTIVATE , NULL , NULL , " Data " , NULL , NULL , 0 , 0 , 0 , 0 , CUSTOMSCREEN } , viewcontrolnw = { 490 , 0 , 100 , 173 , DPEN , BPEN , CLOSEWINDOW | MENUPICK | GADGETUP , WINDOWCLOSE | WINDOWDRAG | WINDOWDEPTH | SMART_REFRESH , NULL , NULL , "VC " , NULL , NULL , 0 , 0 , 0 , 0 , CUSTOMSCREEN } , mainviewnw = { 80 , 92 , 460 , 308 , DPEN , BPEN , CLOSEWINDOW | NEWSIZE | MENUPICK | MOUSEBUTTONS , WINDOWCLOSE | WINDOWDRAG | WINDOWSIZING | WINDOWDEPTH | SMART_REFRESH , NULL , NULL , " Main View " , NULL , NULL , 100 , 80 , 640 , 400 , CUSTOMSCREEN } , topviewnw = { 80 , 12 , 460 , 80 , DPEN , BPEN , CLOSEWINDOW | NEWSIZE | MENUPICK | MOUSEBUTTONS , WINDOWCLOSE | WINDOWDRAG | WINDOWSIZING | WINDOWDEPTH | SMART_REFRESH , NULL , NULL , " Top View " , NULL , NULL , 100 , 80 , 640 , 400 , CUSTOMSCREEN } , rightviewnw = { 540 , 92 , 100 , 308 , DPEN , BPEN , CLOSEWINDOW | NEWSIZE | MENUPICK | MOUSEBUTTONS , WINDOWCLOSE | WINDOWDRAG | WINDOWSIZING | WINDOWDEPTH | SMART_REFRESH , NULL , NULL , " Right View " , NULL , NULL , 100 , 80 , 640 , 400 , CUSTOMSCREEN } ; struct Menu menustrip[ 3 ] = /* all windows share this menu strip */ { { NULL , 1 , 0 , 120 , 10 , MENUENABLED , " QUIT" , NULL } , { NULL , 121 , 0 , 120 , 10 , MENUENABLED , " Open Window" , NULL } , { NULL , 241 , 0 , 120 , 10 , MENUENABLED , " Control" , NULL } } ; struct menubox menu0[ 1 ] = { { { NULL , 0 , 0 , 130 , 14 , ITEMTEXT | ITEMENABLED | HIGHCOMP , 0 , NULL , NULL , 0 , NULL , 0 } , { MFPEN , MBPEN , JAM1 , 15 , 2 , NULL , "QUIT" , NULL } } } , menu1[ 5 ] = { { { NULL , 0 , 0 , 130 , 14 , ITEMTEXT | ITEMENABLED | HIGHCOMP , 0 , NULL , NULL , 0 , NULL , 0 } , { MFPEN , MBPEN , JAM1 , 15 , 2 , NULL , "Main View" , NULL } } , { { NULL , 0 , 14 , 130 , 14 , ITEMTEXT | ITEMENABLED | HIGHCOMP , 0 , NULL , NULL , 0 , NULL , 0 } , { MFPEN , MBPEN , JAM1 , 15 , 2 , NULL , "Top View" , NULL } } , { { NULL , 0 , 28 , 130 , 14 , ITEMTEXT | ITEMENABLED | HIGHCOMP , 0 , NULL , NULL , 0 , NULL , 0 } , { MFPEN , MBPEN , JAM1 , 15 , 2 , NULL , "Right View" , NULL } } , { { NULL , 0 , 42 , 130 , 14 , ITEMTEXT | ITEMENABLED | HIGHCOMP , 0 , NULL , NULL , 0 , NULL , 0 } , { MFPEN , MBPEN , JAM1 , 15 , 2 , NULL , "View Control" , NULL } } , { { NULL , 0 , 56 , 130 , 14 , ITEMTEXT | ITEMENABLED | HIGHCOMP , 0 , NULL , NULL , 0 , NULL , 0 } , { MFPEN , MBPEN , JAM1 , 15 , 2 , NULL , "Data" , NULL } } } , menu2[ 5 ] = { { { NULL , 0 , 0 , 130 , 14 , ITEMTEXT | ITEMENABLED | HIGHCOMP , 0 , NULL , NULL , 0 , NULL , 0 } , { MFPEN , MBPEN , JAM1 , 15 , 2 , NULL , "Start" , NULL } } , { { NULL , 0 , 14 , 130 , 14 , ITEMTEXT | ITEMENABLED | HIGHCOMP , 0 , NULL , NULL , 0 , NULL , 0 } , { MFPEN , MBPEN , JAM1 , 15 , 2 , NULL , "Stop" , NULL } } , { { NULL , 0 , 28 , 130 , 14 , ITEMTEXT | ITEMENABLED | HIGHCOMP , 0 , NULL , NULL , 0 , NULL , 0 } , { MFPEN , MBPEN , JAM1 , 15 , 2 , NULL , "Set" , NULL } } , { { NULL , 0 , 42 , 130 , 14 , ITEMTEXT | ITEMENABLED | HIGHCOMP , 0 , NULL , NULL , 0 , NULL , 0 } , { MFPEN , MBPEN , JAM1 , 15 , 2 , NULL , "Reset" , NULL } } } ; struct Gadget viewcongadg[ 12 ] = /* gadgets for View Control window */ { { NULL , 8 , 60 + 16 , 20 , 15 , GADGHCOMP , RELVERIFY , BOOLGADGET } , { NULL , 72 , 60 + 16 , 20 , 15 , GADGHCOMP , RELVERIFY , BOOLGADGET } , { NULL , 8 , 76 + 16 , 20 , 15 , GADGHCOMP , RELVERIFY , BOOLGADGET } , { NULL , 72 , 76 + 16 , 20 , 15 , GADGHCOMP , RELVERIFY , BOOLGADGET } , { NULL , 8 , 92 + 16 , 20 , 15 , GADGHCOMP , RELVERIFY , BOOLGADGET } , { NULL , 72 , 92 + 16 , 20 , 15 , GADGHCOMP , RELVERIFY , BOOLGADGET } , { NULL , 10 , 108 + 16 , 80 , 15 , GADGHCOMP , RELVERIFY , BOOLGADGET } , { NULL , 8 , 140 + 16 , 28 , 15 , GADGHCOMP , RELVERIFY , BOOLGADGET } , { NULL , 56 , 140 + 16 , 36 , 15 , GADGHCOMP , RELVERIFY , BOOLGADGET } , { NULL , 10 , 28 + 16 , 80 , 15 , GADGHCOMP , RELVERIFY , BOOLGADGET } , { NULL , 10 , 12 + 16 , 80 , 15 , GADGHCOMP , RELVERIFY , BOOLGADGET } , { NULL , 10 , 12 , 80 , 15 , GADGHCOMP , RELVERIFY , BOOLGADGET } } , controlgadg[ 45 ] = /* gadgets for Data window */ { { NULL , 6 , 12 , 72 , 13 , GADGHCOMP , RELVERIFY , BOOLGADGET } , { NULL , 6 , 26 , 72 , 13 , GADGHCOMP , RELVERIFY , BOOLGADGET } , { NULL , 6 , 40 , 72 , 13 , GADGHCOMP , RELVERIFY , BOOLGADGET } , { NULL , 6 , 54 , 72 , 13 , GADGHCOMP , RELVERIFY , BOOLGADGET } , { NULL , 6 , 68 , 72 , 13 , GADGHCOMP , RELVERIFY , BOOLGADGET } , { NULL , 6 , 82 , 72 , 13 , GADGHCOMP , RELVERIFY , BOOLGADGET } , { NULL , 6 , 96 , 72 , 13 , GADGHCOMP , RELVERIFY , BOOLGADGET } , { NULL , 6 , 110 , 72 , 13 , GADGHCOMP , RELVERIFY , BOOLGADGET } , { NULL , 6 , 124 , 72 , 13 , GADGHCOMP , RELVERIFY , BOOLGADGET } , { NULL , 6 , 138 , 72 , 13 , GADGHCOMP , RELVERIFY , BOOLGADGET } , { NULL , 6 , 152 , 72 , 13 , GADGHCOMP , RELVERIFY , BOOLGADGET } , { NULL , 6 , 166 , 72 , 13 , GADGHCOMP , RELVERIFY , BOOLGADGET } , { NULL , 6 , 180 , 72 , 13 , GADGHCOMP , RELVERIFY , BOOLGADGET } , { NULL , 6 , 194 , 72 , 13 , GADGHCOMP , RELVERIFY , BOOLGADGET } , { NULL , 6 , 208 , 72 , 13 , GADGHCOMP , RELVERIFY , BOOLGADGET } , { NULL , 6 , 222 , 72 , 13 , GADGHCOMP , RELVERIFY , BOOLGADGET } , { NULL , 6 , 236 , 72 , 13 , GADGHCOMP , RELVERIFY , BOOLGADGET } , { NULL , 6 , 250 , 72 , 13 , GADGHCOMP , RELVERIFY , BOOLGADGET } , { NULL , 6 , 264 , 72 , 13 , GADGHCOMP , RELVERIFY , BOOLGADGET } , { NULL , 6 , 278 , 72 , 13 , GADGHCOMP , RELVERIFY , BOOLGADGET } , { NULL , 6 , 294 , 72 , 13 , GADGHCOMP , RELVERIFY , BOOLGADGET } , { NULL , 6 , 308 , 72 , 13 , GADGHCOMP , RELVERIFY , BOOLGADGET } , { NULL , 6 , 322 , 72 , 13 , GADGHCOMP , RELVERIFY , BOOLGADGET } , { NULL , 6 , 336 , 72 , 13 , GADGHCOMP , RELVERIFY , BOOLGADGET } , { NULL , 6 , 350 , 72 , 13 , GADGHCOMP , RELVERIFY , BOOLGADGET } , { NULL , 6 , 364 , 72 , 13 , GADGHCOMP , RELVERIFY , BOOLGADGET } , { NULL , 100 , 87 - 5 , 72 , 13 , GADGHCOMP , RELVERIFY , BOOLGADGET } , { NULL , 200 , 87 - 5 , 72 , 13 , GADGHCOMP , RELVERIFY , BOOLGADGET } , { NULL , 300 , 87 - 5 , 72 , 13 , GADGHCOMP , RELVERIFY , BOOLGADGET } , { NULL , 100 , 217 + 5 , 72 , 13 , GADGHCOMP , RELVERIFY , BOOLGADGET } , /* 30 */ { NULL , 200 , 217 + 5 , 72 , 13 , GADGHCOMP , RELVERIFY , BOOLGADGET } , { NULL , 100 , 74 - 5 , 528 , 8 , GADGHCOMP , TOGGLESELECT | RELVERIFY , STRGADGET } , { NULL , 100 , 126 - 5 , 528 , 8 , GADGHCOMP , TOGGLESELECT | RELVERIFY , STRGADGET } , { NULL , 100 , 139 - 4 , 528 , 8 , GADGHCOMP , TOGGLESELECT | RELVERIFY , STRGADGET } , { NULL , 100 , 256 + 5 , 528 , 8 , GADGHCOMP , TOGGLESELECT | RELVERIFY , STRGADGET } , { NULL , 100 , 178 - 5 , 264 , 8 , GADGHCOMP , TOGGLESELECT | RELVERIFY , STRGADGET } , { NULL , 370 , 178 - 5 , 264 , 8 , GADGHCOMP , TOGGLESELECT | RELVERIFY , STRGADGET } , { NULL , 100 , 295 + 5 , 264 , 8 , GADGHCOMP , TOGGLESELECT | RELVERIFY , STRGADGET } , { NULL , 370 , 295 + 5 , 264 , 8 , GADGHCOMP , TOGGLESELECT | RELVERIFY , STRGADGET } , { NULL , 100 , 334 + 5 , 264 , 8 , GADGHCOMP , TOGGLESELECT | RELVERIFY , STRGADGET } , { NULL , 370 , 334 + 5 , 264 , 8 , GADGHCOMP , TOGGLESELECT | RELVERIFY , STRGADGET } , { NULL , 100 , 347 + 6 , 264 , 8 , GADGHCOMP , TOGGLESELECT | RELVERIFY , STRGADGET } , { NULL , 370 , 347 + 6 , 264 , 8 , GADGHCOMP , TOGGLESELECT | RELVERIFY , STRGADGET } , { NULL , 100 , 360 + 7 , 264 , 8 , GADGHCOMP , TOGGLESELECT | RELVERIFY , STRGADGET } , { NULL , 370 , 360 + 7 , 264 , 8 , GADGHCOMP , TOGGLESELECT | RELVERIFY , STRGADGET } } ; struct StringInfo controlinfo[ 14 ] ; struct Border textbox = { -2 , -2 , BPEN , 0 , JAM1 , 5 } , numberbox = { -2 , -2 , BPEN , 0 , JAM1 , 5 } ; short xytextbox[ 10 ] = { 0 , 0 , 532 , 0 , 532 , 11 , 0 , 11 , 0 , 0 } , xynumbox[ 10 ] = { 0 , 0 , 268 , 0 , 268 , 11 , 0 , 11 , 0 , 0 } ; char undobuffer[ 100 ] , filename[ 100 ] , numberbuff[ 10 ][ 34 ] ; struct dv zerodv = { 0.0 , 0.0 , 0.0 } ; /* reference vectors */ struct obv refobv = { { 1.0 , 0.0 , 0.0 } , { 0.0 , 1.0 , 0.0 } , { 0.0 , 0.0 , 1.0 } } ; struct filedata g = /* data for the entire simulation */ { "Gravity-Well-10" , { { { 0.2539644458873187 , 0.0570845085389242 , 0.0 } , { 0.0133749752769728 , -0.0183469991534279 , 0.0 } , { 0.0 , 0.0 , 0.0 } , { 0.0 , 0.0 , 0.0 } , { 0.0 , 0.0 , 0.0 } , 1.0 , 0.0 , 0.9 , 1 , 0 , "Planet Not the earth" } , { { 13.4603555411268747 , 9.1291549146107567 , 0.0 } , { -0.133749752769728 , 0.1834699915342789 , 0.0 } , { 0.0 , 0.0 , 0.0 } , { 1.0 , 0.0 , 0.0 } , { 0.0 , 1.0 , 0.0 } , 0.1 , 0.0 , 0.2 , 1 , 0 , "Moon" } , { { 0.492 , -1.3 , -0.02 } , { 1.16 , 0.15 , 0.12 } , { 0.0 , 0.0 , 0.0 } , { 1.0 , 0.0 , 0.0 } , { 0.0 , 1.0 , 0.0 } , 0.0 , 0.0 , 0.0 , 1 , 0 , "Space Ship" } } , { { 1.0 , 0.0 , 0.0 } , { 0.0 , 1.0 , 0.0 } , { 0.0 , 0.0 , 1.0 } } , { { 1.0 , 0.0 , 0.0 } , { 0.0 , 1.0 , 0.0 } , { 0.0 , 0.0 , 1.0 } } , { 0.0 , 0.0 , 0.0 } , 0.0 , 0.5 , 0.0298023223876953 , 100.0 , 0 , 0 , 1 , 0 , 0 , "Example simulation" , "At play in space and time" } ;