diff --git a/api/boinc_api.C b/api/boinc_api.C index 2bbb00ecb8..fbc15fe024 100644 --- a/api/boinc_api.C +++ b/api/boinc_api.C @@ -126,19 +126,19 @@ int boinc_init() { f = fopen(GRAPHICS_DATA_FILE, "r"); if (!f) { fprintf(stderr, "boinc_init(): can't open graphics data file\n"); - fprintf(stderr, "Using default graphics settings.\n"); - gi.refresh_period = 0.5; - gi.xsize = 640; - gi.ysize = 480; + fprintf(stderr, "Using default graphics settings.\n"); + gi.refresh_period = 0.5; + gi.xsize = 640; + gi.ysize = 480; + } + if (f) { + retval = parse_graphics_file(f, &gi); + if (retval) { + fprintf(stderr, "boinc_init(): can't parse graphics data file\n"); + return retval; + } + fclose(f); } - if (f) { - retval = parse_graphics_file(f, &gi); - if (retval) { - fprintf(stderr, "boinc_init(): can't parse graphics data file\n"); - return retval; - } - fclose(f); - } f = fopen(FD_INIT_FILE, "r"); if (f) { @@ -575,8 +575,8 @@ int parse_init_data_file(FILE* f, APP_INIT_DATA& ai) { int write_fraction_done_file(double pct, double cpu, double checkpoint_cpu) { FILE* f = fopen(FRACTION_DONE_TEMP_FILE, "w"); - if (!f) - return -1; + if (!f) + return -1; fprintf(f, "%f\n" diff --git a/api/graphics_api.C b/api/graphics_api.C index 398db954d7..dc715c381b 100755 --- a/api/graphics_api.C +++ b/api/graphics_api.C @@ -167,4 +167,45 @@ GLvoid glPrint(GLuint font, const char *fmt, ...) // Custom GL "Print" Routine glPopAttrib(); // Pops The Display List Bits } +GLenum InitGL(GLvoid) { // All Setup For OpenGL Goes Here + GLenum err; + + glShadeModel(GL_SMOOTH); // Enable Smooth Shading + if (err=glGetError()) return err; + + glClearColor(0.0f, 0.0f, 0.0f, 0.5f); // Black Background + if (err=glGetError()) return err; + + glClearDepth(1.0f); // Depth Buffer Setup + if (err=glGetError()) return err; + + glEnable(GL_DEPTH_TEST); // Enables Depth Testing + if (err=glGetError()) return err; + + glDepthFunc(GL_LEQUAL); // The Type Of Depth Testing To Do + if (err=glGetError()) return err; + + glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); // Really Nice Perspective Calculations + if (err=glGetError()) return err; + + return GL_NO_ERROR; // Initialization Went OK +} + +GLenum ReSizeGLScene(GLsizei width, GLsizei height) { // Resize And Initialize The GL Window + GLenum err; + double aspect_ratio = 4.0/3.0; + + if (height<=0) height=1; // Prevent A Divide By Zero By Making Height Equal One + if (width<=0) width=1; + + if (height*aspect_ratio > width) + glViewport(0,0,(int)width,(int)(width/aspect_ratio)); // Reset The Current Viewport + else + glViewport(0,0,(int)(height*aspect_ratio),(height)); // Reset The Current Viewport + + if (err=glGetError()) return err; + + return GL_NO_ERROR; +} + #endif diff --git a/api/graphics_api.h b/api/graphics_api.h index 7d78ed2328..9b6b412ae4 100755 --- a/api/graphics_api.h +++ b/api/graphics_api.h @@ -23,5 +23,13 @@ int boinc_finish_opengl(); #ifdef BOINC_APP_GRAPHICS GLvoid glPrint(GLuint font, const char *fmt, ...); +#ifdef __cplusplus +extern "C" { +#endif +GLenum InitGL(GLvoid); +GLenum ReSizeGLScene(GLsizei width, GLsizei height); +#ifdef __cplusplus +} +#endif bool app_render(int xs, int ys, double time_of_day); #endif diff --git a/api/mac_app_opengl.c b/api/mac_app_opengl.c index 222a2c348b..83f964c19e 100644 --- a/api/mac_app_opengl.c +++ b/api/mac_app_opengl.c @@ -69,6 +69,7 @@ GLuint main_font; structGLWindowInfo glInfo; bool user_requested_exit = false; +extern bool using_opengl; // -------------------------------------------------------------------------- @@ -154,22 +155,25 @@ int InitGLWindow(int xsize, int ysize, int depth) aglUpdateContext (boincAGLContext); aglReportError (); - glClearColor(0.0f, 0.0f, 0.0f, 1.0f); // Clear color buffer to dark grey + aglDisable (boincAGLContext, AGL_BUFFER_RECT); + aglReportError (); + ReSizeGLScene( rectPort.right - rectPort.left, rectPort.bottom - rectPort.top ); + glReportError (); + + InitGL(); + glClear (GL_COLOR_BUFFER_BIT); glReportError (); aglSwapBuffers (boincAGLContext); aglReportError (); - - aglDisable (boincAGLContext, AGL_BUFFER_RECT); - aglReportError (); - glViewport (0, 0, rectPort.right - rectPort.left, rectPort.bottom - rectPort.top); - glReportError (); GetFNum("\pTimes New Roman", &fNum); // build font main_font = BuildFontGL (boincAGLContext, fNum, normal, 9); aglUpdateContext (boincAGLContext); aglReportError (); + + using_opengl = true; } return 0; @@ -241,7 +245,7 @@ pascal OSStatus MainAppEventHandler(EventHandlerCallRef appHandler, EventRef the case kHICommandMaximizeWindow: // 'mini' case kHICommandZoomWindow: // 'zoom' GetWindowPortBounds (appGLWindow, &rectPort); - glViewport (0, 0, rectPort.right - rectPort.left, rectPort.bottom - rectPort.top); + ReSizeGLScene(rectPort.right - rectPort.left, rectPort.bottom - rectPort.top); glReportError (); break; case kHICommandOK: // 'ok ' diff --git a/api/windows_opengl.cpp b/api/windows_opengl.cpp index 5f3556ac9f..2d96fc840a 100755 --- a/api/windows_opengl.cpp +++ b/api/windows_opengl.cpp @@ -61,20 +61,6 @@ void ChangeMode( int mode ); BOOL reg_win_class(); BOOL unreg_win_class(); -GLvoid ReSizeGLScene(GLsizei width, GLsizei height) // Resize And Initialize The GL Window -{ - double aspect_ratio = 4.0/3.0; - - if (height==0) { // Prevent A Divide By Zero By - height=1; // Making Height Equal One - } - - if (height*aspect_ratio > width) - glViewport(0,0,(int)width,(int)(width/aspect_ratio)); // Reset The Current Viewport - else - glViewport(0,0,(int)(height*aspect_ratio),(height)); // Reset The Current Viewport -} - GLvoid BuildFont(GLvoid) // Build Our Bitmap Font { HFONT font; // Windows Font ID @@ -108,18 +94,6 @@ GLvoid KillFont(GLvoid) // Delete The Font List glDeleteLists(main_font, 256); // Delete All 96 Characters } -int InitGL(GLvoid) // All Setup For OpenGL Goes Here -{ - glShadeModel(GL_SMOOTH); // Enable Smooth Shading - glClearColor(0.0f, 0.0f, 0.0f, 0.5f); // Black Background - glClearDepth(1.0f); // Depth Buffer Setup - glEnable(GL_DEPTH_TEST); // Enables Depth Testing - glDepthFunc(GL_LEQUAL); // The Type Of Depth Testing To Do - glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); // Really Nice Perspective Calculations - BuildFont(); // Build The Font - return TRUE; // Initialization Went OK -} - GLvoid KillGLWindow(GLvoid) // Properly Kill The Window { while(ShowCursor(true) < 0); // Show Mouse Pointer @@ -335,6 +309,7 @@ BOOL CreateGLWindow(char* title, int width, int height, int bits, bool initially MessageBox(NULL,"Initialization Failed.","ERROR",MB_OK|MB_ICONEXCLAMATION); return FALSE; // Return FALSE } + BuildFont(); // Build The Font return TRUE; // Success } @@ -357,22 +332,6 @@ LRESULT CALLBACK WndProc( HWND hWnd, // Handle For This Window return 0; } - /*case WM_SYSCOMMAND: // Intercept System Commands - { - switch (wParam) { // Check System Calls - case SC_SCREENSAVE: // Screensaver Trying To Start? - if (!fullscreen) { - GetCursorPos(&initCursorPos); - ChangeMode(!fullscreen); - - counter = 5; - } - case SC_MONITORPOWER: // Monitor Trying To Enter Powersave? - return 0; // Prevent From Happening - } - break; // Exit - }*/ - case WM_KEYDOWN: // Is A Key Being Held Down? // If a key is pressed in full screen mode, go back to old mode if (fullscreen) { diff --git a/api/x_opengl.C b/api/x_opengl.C index bc9ea93bd4..402a424ac8 100644 --- a/api/x_opengl.C +++ b/api/x_opengl.C @@ -77,6 +77,8 @@ void *p_graphics_loop( void *duff ) { fprintf(stderr, "glXMakeCurrent failed (window)!\n"); return 0; } + + InitGL(); win_open = true; buildFont(); @@ -115,7 +117,7 @@ void process_input(Display *dpy) { GLvoid buildFont(GLvoid) { XFontStruct *font; - + main_font = glGenLists(256); /* storage for 256 characters */ /* load a font with a specific name in "Host Portable Character Encoding" */ /*font = XLoadQueryFont(dpy,