int main(int argc, char **argv) { struct planet sun, mercury, venus, earth, moon, mars; init_planet(&sun, 0xfc9a24, 695800, 0, 0, NULL); init_planet(&mercury, 0x99989D, 2440, 57910000, 0.01, NULL); init_planet(&venus, 0x6894D2, 6052, 108200000, 0.002, NULL); init_planet(&moon, 0xffffff, 1737.10, 384400, 0.0035 * 12, NULL); init_planet(&earth, 0x005db3, 6371, 149600000, 0.0035, &moon); init_planet(&mars, 0xD0331A, 3390, 227900000, 0.0015, NULL); init_planet_system(&ps, sun); add_planet(&ps, mercury); add_planet(&ps, venus); add_planet(&ps, earth); add_planet(&ps, mars); glutInit(&argc, argv); glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE); glutInitWindowSize(1200, 800); glutCreateWindow("Solar System"); glutReshapeFunc(reshape); glutDisplayFunc(display); glutTimerFunc(TIMER_DELAY, timer, 0); glutMainLoop(); }
ENTRYPOINT void init_grav(ModeInfo * mi) { Display *display = MI_DISPLAY(mi); GC gc = MI_GC(mi); unsigned char ball; gravstruct *gp; if (gravs == NULL) { if ((gravs = (gravstruct *) calloc(MI_NUM_SCREENS(mi), sizeof (gravstruct))) == NULL) return; } gp = &gravs[MI_SCREEN(mi)]; gp->width = MI_WIDTH(mi); gp->height = MI_HEIGHT(mi); gp->sr = STARRADIUS; gp->nplanets = MI_COUNT(mi); if (gp->nplanets < 0) { if (gp->planets) { (void) free((void *) gp->planets); gp->planets = (planetstruct *) NULL; } gp->nplanets = NRAND(-gp->nplanets) + 1; /* Add 1 so its not too boring */ } if (gp->planets == NULL) { if ((gp->planets = (planetstruct *) calloc(gp->nplanets, sizeof (planetstruct))) == NULL) return; } MI_CLEARWINDOW(mi); if (MI_NPIXELS(mi) > 2) gp->starcolor = MI_PIXEL(mi, NRAND(MI_NPIXELS(mi))); else gp->starcolor = MI_WHITE_PIXEL(mi); for (ball = 0; ball < (unsigned char) gp->nplanets; ball++) init_planet(mi, &gp->planets[ball]); /* Draw centrepoint */ XDrawArc(display, MI_WINDOW(mi), gc, gp->width / 2 - gp->sr / 2, gp->height / 2 - gp->sr / 2, gp->sr, gp->sr, 0, 23040); }
ENTRYPOINT void init_grav(ModeInfo * mi) { unsigned char ball; gravstruct *gp; MI_INIT (mi, gravs); gp = &gravs[MI_SCREEN(mi)]; gp->width = MI_WIDTH(mi); gp->height = MI_HEIGHT(mi); gp->sr = STARRADIUS; gp->nplanets = MI_COUNT(mi); if (gp->nplanets < 0) { if (gp->planets) { (void) free((void *) gp->planets); gp->planets = (planetstruct *) NULL; } gp->nplanets = NRAND(-gp->nplanets) + 1; /* Add 1 so its not too boring */ } if (gp->planets == NULL) { if ((gp->planets = (planetstruct *) calloc(gp->nplanets, sizeof (planetstruct))) == NULL) return; } MI_CLEARWINDOW(mi); if (MI_NPIXELS(mi) > 2) gp->starcolor = MI_PIXEL(mi, NRAND(MI_NPIXELS(mi))); else gp->starcolor = MI_WHITE_PIXEL(mi); for (ball = 0; ball < (unsigned char) gp->nplanets; ball++) init_planet(mi, &gp->planets[ball]); }
LRESULT WINAPI ScreenSaverProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { RECT rc; HANDLE hPalMem; switch (msg) { case WM_CREATE: { gravstruct *gp = &gravs; int i, R,G,B; unsigned char ball; vLoadStrings(); // load strings from table GetIniSettings(); // get settings from ini file (control.ini) wTimer = SetTimer(hWnd, ID_TIMER, wElapse, NULL); // create timer to move image GetClientRect(hWnd, &rc); // find size of screen gp->width = rc.right; gp->height = rc.bottom; gp->sr = STARRADIUS; gp->nplanets = iPlanets; srand((unsigned)time(NULL)); // seed random w/ timer if (!gp->planets) { gp->planets = (planetstruct*)malloc((gp->nplanets+1)*sizeof(planetstruct)); memset(gp->planets, 0, (gp->nplanets+1)*sizeof(planetstruct)); gp->starcolor = rand() % (PALSIZE-21); } for (ball = 0; ball <= gp->nplanets; ball++) init_planet(&(gp->planets[ball])); // Create a logical palette to play with hPalMem = LocalAlloc(LMEM_FIXED, sizeof(LOGPALETTE) + PALSIZE * sizeof(PALETTEENTRY)); if (!hPalMem) { // error("No memory for palette"); return -1; } pLogPal = (NPLOGPALETTE) LocalLock(hPalMem); pLogPal->palVersion = 0x300; pLogPal->palNumEntries = PALSIZE; for (i=0, R=255,G=0,B=0; i<PALSIZE; i++) { cycle_colors(&R,&G,&B,255,0,6); pLogPal->palPalEntry[i].peRed = LOBYTE(R); pLogPal->palPalEntry[i].peGreen = LOBYTE(G); pLogPal->palPalEntry[i].peBlue = LOBYTE(B); pLogPal->palPalEntry[i].peFlags = PC_RESERVED; } hPal = CreatePalette((LPLOGPALETTE)pLogPal); if (!hPal) { //Error("CreatePalette() failed"); return -1; } break; } case WM_TIMER: // BOUNCER-specific MoveImage(hWnd); // move image around break; case WM_DESTROY: // BOUNCER-specific if( wTimer ) KillTimer(hWnd, ID_TIMER); if (hPal) DeleteObject(hPal); free(gravs.planets); break; case WM_ERASEBKGND: GetClientRect(hWnd,&rc); FillRect((HDC)wParam,&rc,(HBRUSH)GetStockObject(BLACK_BRUSH)); return 0L; default: break; } return DefScreenSaverProc(hWnd, msg, wParam, lParam); }