diff options
-rw-r--r-- | intern/ghost/intern/GHOST_Debug.h | 4 | ||||
-rw-r--r-- | intern/ghost/intern/GHOST_SystemWin32.cpp | 10 | ||||
-rw-r--r-- | intern/ghost/intern/GHOST_WindowWin32.cpp | 85 | ||||
-rw-r--r-- | intern/ghost/intern/GHOST_WindowWin32.h | 4 | ||||
-rw-r--r-- | source/gameengine/GamePlayer/ghost/GPG_Application.cpp | 29 | ||||
-rw-r--r-- | source/gameengine/GamePlayer/ghost/GPG_Application.h | 10 | ||||
-rw-r--r-- | source/gameengine/GamePlayer/ghost/GPG_ghost.cpp | 27 | ||||
-rw-r--r-- | source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp | 5 |
8 files changed, 112 insertions, 62 deletions
diff --git a/intern/ghost/intern/GHOST_Debug.h b/intern/ghost/intern/GHOST_Debug.h index 602f52a6435..e77f3b9c461 100644 --- a/intern/ghost/intern/GHOST_Debug.h +++ b/intern/ghost/intern/GHOST_Debug.h @@ -53,10 +53,10 @@ #ifdef GHOST_DEBUG #define GHOST_PRINT(x) { std::cout << x; } - //#define GHOST_PRINTF(x) { printf(x); } + #define GHOST_PRINTF(x, ...) { printf(x, __VA_ARGS__); } #else // GHOST_DEBUG #define GHOST_PRINT(x) - //#define GHOST_PRINTF(x) + #define GHOST_PRINTF(x, ...) #endif // GHOST_DEBUG diff --git a/intern/ghost/intern/GHOST_SystemWin32.cpp b/intern/ghost/intern/GHOST_SystemWin32.cpp index ffc090ba058..2fdddda835d 100644 --- a/intern/ghost/intern/GHOST_SystemWin32.cpp +++ b/intern/ghost/intern/GHOST_SystemWin32.cpp @@ -238,7 +238,7 @@ GHOST_IWindow* GHOST_SystemWin32::createWindow( bool stereoVisual, const GHOST_TUns16 numOfAASamples, const GHOST_TEmbedderWindowID parentWindow ) { GHOST_Window* window = 0; - window = new GHOST_WindowWin32 (this, title, left, top, width, height, state, type, stereoVisual, numOfAASamples); + window = new GHOST_WindowWin32 (this, title, left, top, width, height, state, type, stereoVisual, numOfAASamples, parentWindow); if (window) { if (window->getValid()) { // Store the pointer to the window @@ -247,6 +247,14 @@ GHOST_IWindow* GHOST_SystemWin32::createWindow( // } } else { + + // Invalid parent window hwnd + if (((GHOST_WindowWin32*)window)->getNextWindow() == NULL) { + delete window; + window = 0; + return window; + } + // An invalid window could be one that was used to test for AA window = ((GHOST_WindowWin32*)window)->getNextWindow(); diff --git a/intern/ghost/intern/GHOST_WindowWin32.cpp b/intern/ghost/intern/GHOST_WindowWin32.cpp index 5d21edb758d..a89b2608bb4 100644 --- a/intern/ghost/intern/GHOST_WindowWin32.cpp +++ b/intern/ghost/intern/GHOST_WindowWin32.cpp @@ -132,6 +132,7 @@ GHOST_WindowWin32::GHOST_WindowWin32( GHOST_TDrawingContextType type, const bool stereoVisual, const GHOST_TUns16 numOfAASamples, + GHOST_TEmbedderWindowID parentwindowhwnd, GHOST_TSuccess msEnabled, int msPixelFormat) : @@ -149,6 +150,7 @@ GHOST_WindowWin32::GHOST_WindowWin32( m_tablet(0), m_maxPressure(0), m_multisample(numOfAASamples), + m_parentWindowHwnd(parentwindowhwnd), m_multisampleEnabled(msEnabled), m_msPixelFormat(msPixelFormat), //For recreation @@ -223,15 +225,26 @@ GHOST_WindowWin32::GHOST_WindowWin32( else if(top < monitor.rcWork.top) top = monitor.rcWork.top; + int wintype = WS_OVERLAPPEDWINDOW; + if (m_parentWindowHwnd != 0) + { + wintype = WS_CHILD; + GetWindowRect((HWND)m_parentWindowHwnd, &rect); + left = 0; + top = 0; + width = rect.right - rect.left; + height = rect.bottom - rect.top; + } + m_hWnd = ::CreateWindow( s_windowClassName, // pointer to registered class name title, // pointer to window name - WS_OVERLAPPEDWINDOW, // window style + wintype, // window style left, // horizontal position of window top, // vertical position of window width, // window width height, // window height - HWND_DESKTOP, // handle to parent or owner window + (HWND) m_parentWindowHwnd, // handle to parent or owner window 0, // handle to menu or child-window identifier ::GetModuleHandle(0), // handle to application instance 0); // pointer to window-creation data @@ -452,6 +465,11 @@ void GHOST_WindowWin32::getClientBounds(GHOST_Rect& bounds) const bounds.m_l = rect.left + sm_cysizeframe; bounds.m_r = rect.right - sm_cysizeframe; bounds.m_t = rect.top; + } else if (state == GHOST_kWindowStateEmbedded) { + bounds.m_b = rect.bottom; + bounds.m_l = rect.left; + bounds.m_r = rect.right; + bounds.m_t = rect.top; } else { bounds.m_b = rect.bottom-GetSystemMetrics(SM_CYCAPTION)-sm_cysizeframe*2; bounds.m_l = rect.left; @@ -459,7 +477,6 @@ void GHOST_WindowWin32::getClientBounds(GHOST_Rect& bounds) const bounds.m_t = rect.top; } } else { - ::GetWindowRect(m_hWnd, &rect); bounds.m_b = rect.bottom; bounds.m_l = rect.left; bounds.m_r = rect.right; @@ -528,6 +545,15 @@ GHOST_TSuccess GHOST_WindowWin32::setClientSize(GHOST_TUns32 width, GHOST_TUns32 GHOST_TWindowState GHOST_WindowWin32::getState() const { GHOST_TWindowState state; + + // XXX 27.04.2011 + // we need to find a way to combine parented windows + resizing if we simply set the + // state as GHOST_kWindowStateEmbedded we will need to check for them somewhere else. + // It's also strange that in Windows is the only platform we need to make this separation. + if (m_parentWindowHwnd != 0) { + state = GHOST_kWindowStateEmbedded; + return state; + } if (::IsIconic(m_hWnd)) { state = GHOST_kWindowStateMinimized; } @@ -589,6 +615,9 @@ GHOST_TSuccess GHOST_WindowWin32::setState(GHOST_TWindowState state) wp.ptMaxPosition.y = 0; SetWindowLongPtr(m_hWnd, GWL_STYLE, WS_POPUP | WS_MAXIMIZE); break; + case GHOST_kWindowStateEmbedded: + SetWindowLongPtr(m_hWnd, GWL_STYLE, WS_CHILD); + break; case GHOST_kWindowStateNormal: default: ShowWindow(m_hWnd, SW_HIDE); @@ -651,10 +680,11 @@ GHOST_TSuccess GHOST_WindowWin32::invalidate() GHOST_TSuccess GHOST_WindowWin32::initMultisample(PIXELFORMATDESCRIPTOR pfd) { int pixelFormat; - bool success; + bool success = FALSE; UINT numFormats; HDC hDC = GetDC(getHWND()); float fAttributes[] = {0, 0}; + UINT nMaxFormats = 1; // The attributes to look for int iAttributes[] = { @@ -679,36 +709,24 @@ GHOST_TSuccess GHOST_WindowWin32::initMultisample(PIXELFORMATDESCRIPTOR pfd) return GHOST_kFailure; } - // See if the format is valid - success = wglChoosePixelFormatARB(hDC, iAttributes, fAttributes, 1, &pixelFormat, &numFormats); - - if (success && numFormats >= 1) - { - m_multisampleEnabled = GHOST_kSuccess; - m_msPixelFormat = pixelFormat; - return GHOST_kSuccess; - } - else - { - // See if any formats are supported - while (!success && iAttributes[19] != 0) - { - iAttributes[19] /= 2; - - success = wglChoosePixelFormatARB(m_hDC, iAttributes, fAttributes, 1, &pixelFormat, &numFormats); - - if (success && numFormats >= 1) - { - m_multisampleEnabled = GHOST_kSuccess; - m_msPixelFormat = pixelFormat; - return GHOST_kSuccess; - } + // iAttributes[17] is the initial multisample. If not valid try to use the closest valid value under it. + while (iAttributes[17] > 0) { + // See if the format is valid + success = wglChoosePixelFormatARB(hDC, iAttributes, fAttributes, nMaxFormats, &pixelFormat, &numFormats); + GHOST_PRINTF("WGL_SAMPLES_ARB = %i --> success = %i, %i formats\n", iAttributes[17], success, numFormats); - success = GHOST_kFailure; + if (success && numFormats >= 1 && m_multisampleEnabled == GHOST_kFailure) { + GHOST_PRINTF("valid pixel format with %i multisamples\n", iAttributes[17]); + m_multisampleEnabled = GHOST_kSuccess; + m_msPixelFormat = pixelFormat; } + iAttributes[17] -= 1; + success = GHOST_kFailure; } - - // No available pixel format... + if (m_multisampleEnabled == GHOST_kSuccess) { + return GHOST_kSuccess; + } + GHOST_PRINT("no available pixel format\n"); return GHOST_kFailure; } @@ -856,12 +874,17 @@ GHOST_TSuccess GHOST_WindowWin32::installDrawingContext(GHOST_TDrawingContextTyp type, m_stereo, m_multisample, + m_parentWindowHwnd, m_multisampleEnabled, m_msPixelFormat); // Return failure so we can trash this window. success = GHOST_kFailure; break; + } else { + m_multisampleEnabled = GHOST_kSuccess; + printf("Multisample failed to initialized\n"); + success = GHOST_kSuccess; } } } diff --git a/intern/ghost/intern/GHOST_WindowWin32.h b/intern/ghost/intern/GHOST_WindowWin32.h index 20212bbc2af..4055c3acf56 100644 --- a/intern/ghost/intern/GHOST_WindowWin32.h +++ b/intern/ghost/intern/GHOST_WindowWin32.h @@ -100,6 +100,7 @@ public: GHOST_TDrawingContextType type = GHOST_kDrawingContextTypeNone, const bool stereoVisual = false, const GHOST_TUns16 numOfAASamples = 0, + GHOST_TEmbedderWindowID parentWindowHwnd=0, GHOST_TSuccess msEnabled = GHOST_kFailure, int msPixelFormat = 0 ); @@ -391,6 +392,9 @@ protected: /** The GHOST_System passes this to wm if this window is being replaced */ GHOST_Window *m_nextWindow; + + /** Hwnd to parent window */ + GHOST_TEmbedderWindowID m_parentWindowHwnd; }; #endif // _GHOST_WINDOW_WIN32_H_ diff --git a/source/gameengine/GamePlayer/ghost/GPG_Application.cpp b/source/gameengine/GamePlayer/ghost/GPG_Application.cpp index e00a890a1fb..6ea98e0e8cc 100644 --- a/source/gameengine/GamePlayer/ghost/GPG_Application.cpp +++ b/source/gameengine/GamePlayer/ghost/GPG_Application.cpp @@ -233,7 +233,8 @@ static HWND findGhostWindowHWND(GHOST_IWindow* window) bool GPG_Application::startScreenSaverPreview( HWND parentWindow, const bool stereoVisual, - const int stereoMode) + const int stereoMode, + const GHOST_TUns16 samples) { bool success = false; @@ -245,7 +246,7 @@ bool GPG_Application::startScreenSaverPreview( STR_String title = ""; m_mainWindow = fSystem->createWindow(title, 0, 0, windowWidth, windowHeight, GHOST_kWindowStateMinimized, - GHOST_kDrawingContextTypeOpenGL, stereoVisual); + GHOST_kDrawingContextTypeOpenGL, stereoVisual, samples); if (!m_mainWindow) { printf("error: could not create main window\n"); exit(-1); @@ -287,9 +288,10 @@ bool GPG_Application::startScreenSaverFullScreen( int height, int bpp,int frequency, const bool stereoVisual, - const int stereoMode) + const int stereoMode, + const GHOST_TUns16 samples) { - bool ret = startFullScreen(width, height, bpp, frequency, stereoVisual, stereoMode); + bool ret = startFullScreen(width, height, bpp, frequency, stereoVisual, stereoMode, samples); if (ret) { HWND ghost_hwnd = findGhostWindowHWND(m_mainWindow); @@ -311,13 +313,14 @@ bool GPG_Application::startWindow(STR_String& title, int windowWidth, int windowHeight, const bool stereoVisual, - const int stereoMode) + const int stereoMode, + const GHOST_TUns16 samples) { bool success; // Create the main window //STR_String title ("Blender Player - GHOST"); m_mainWindow = fSystem->createWindow(title, windowLeft, windowTop, windowWidth, windowHeight, GHOST_kWindowStateNormal, - GHOST_kDrawingContextTypeOpenGL, stereoVisual); + GHOST_kDrawingContextTypeOpenGL, stereoVisual, samples); if (!m_mainWindow) { printf("error: could not create main window\n"); exit(-1); @@ -339,10 +342,13 @@ bool GPG_Application::startWindow(STR_String& title, bool GPG_Application::startEmbeddedWindow(STR_String& title, const GHOST_TEmbedderWindowID parentWindow, const bool stereoVisual, - const int stereoMode) { - - m_mainWindow = fSystem->createWindow(title, 0, 0, 0, 0, GHOST_kWindowStateNormal, - GHOST_kDrawingContextTypeOpenGL, stereoVisual, parentWindow); + const int stereoMode, + const GHOST_TUns16 samples) { + GHOST_TWindowState state = GHOST_kWindowStateNormal; + if (parentWindow != 0) + state = GHOST_kWindowStateEmbedded; + m_mainWindow = fSystem->createWindow(title, 0, 0, 0, 0, state, + GHOST_kDrawingContextTypeOpenGL, stereoVisual, samples, parentWindow); if (!m_mainWindow) { printf("error: could not create main window\n"); @@ -363,7 +369,8 @@ bool GPG_Application::startFullScreen( int height, int bpp,int frequency, const bool stereoVisual, - const int stereoMode) + const int stereoMode, + const GHOST_TUns16 samples) { bool success; // Create the main window diff --git a/source/gameengine/GamePlayer/ghost/GPG_Application.h b/source/gameengine/GamePlayer/ghost/GPG_Application.h index 850b34d5b69..c0638517657 100644 --- a/source/gameengine/GamePlayer/ghost/GPG_Application.h +++ b/source/gameengine/GamePlayer/ghost/GPG_Application.h @@ -63,12 +63,12 @@ public: bool SetGameEngineData(struct Main* maggie, struct Scene* scene, int argc, char** argv); bool startWindow(STR_String& title, int windowLeft, int windowTop, int windowWidth, int windowHeight, - const bool stereoVisual, const int stereoMode); - bool startFullScreen(int width, int height, int bpp, int frequency, const bool stereoVisual, const int stereoMode); - bool startEmbeddedWindow(STR_String& title, const GHOST_TEmbedderWindowID parent_window, const bool stereoVisual, const int stereoMode); + const bool stereoVisual, const int stereoMode, const GHOST_TUns16 samples=0); + bool startFullScreen(int width, int height, int bpp, int frequency, const bool stereoVisual, const int stereoMode, const GHOST_TUns16 samples=0); + bool startEmbeddedWindow(STR_String& title, const GHOST_TEmbedderWindowID parent_window, const bool stereoVisual, const int stereoMode, const GHOST_TUns16 samples=0); #ifdef WIN32 - bool startScreenSaverFullScreen(int width, int height, int bpp, int frequency, const bool stereoVisual, const int stereoMode); - bool startScreenSaverPreview(HWND parentWindow, const bool stereoVisual, const int stereoMode); + bool startScreenSaverFullScreen(int width, int height, int bpp, int frequency, const bool stereoVisual, const int stereoMode, const GHOST_TUns16 samples=0); + bool startScreenSaverPreview(HWND parentWindow, const bool stereoVisual, const int stereoMode, const GHOST_TUns16 samples=0); #endif virtual bool processEvent(GHOST_IEvent* event); diff --git a/source/gameengine/GamePlayer/ghost/GPG_ghost.cpp b/source/gameengine/GamePlayer/ghost/GPG_ghost.cpp index 968d6caeb1c..0ab6da240ce 100644 --- a/source/gameengine/GamePlayer/ghost/GPG_ghost.cpp +++ b/source/gameengine/GamePlayer/ghost/GPG_ghost.cpp @@ -199,7 +199,7 @@ void usage(const char* program, bool isBlenderPlayer) } printf("usage: %s [-w [w h l t]] [-f [fw fh fb ff]] %s[-g gamengineoptions] " - "[-s stereomode] %s\n", program, consoleoption, filename); + "[-s stereomode] [-m aasamples] %s\n", program, consoleoption, filename); printf(" -h: Prints this command summary\n\n"); printf(" -w: display in a window\n"); printf(" --Optional parameters--\n"); @@ -235,9 +235,8 @@ void usage(const char* program, bool isBlenderPlayer) printf(" cubemap (Cube Map)\n"); printf(" sphericalpanoramic (Spherical Panoramic)\n"); printf(" depending on the type of dome you are using\n\n"); -#ifndef _WIN32 + printf(" -m: maximum anti-aliasing (eg. 2,4,8,16)\n\n"); printf(" -i: parent windows ID \n\n"); -#endif #ifdef _WIN32 printf(" -c: keep console window open\n\n"); #endif @@ -257,6 +256,7 @@ void usage(const char* program, bool isBlenderPlayer) printf("\n"); printf("example: %s -w 320 200 10 10 -g noaudio%s%s\n", program, pathname, filename); printf("example: %s -g show_framerate = 0 %s%s\n", program, pathname, filename); + printf("example: %s -i 232421 -m 16 %s%s\n\n", program, pathname, filename); } static void get_filename(int argc, char **argv, char *filename) @@ -367,6 +367,7 @@ int main(int argc, char** argv) GHOST_TEmbedderWindowID parentWindow = 0; bool isBlenderPlayer = false; int validArguments=0; + GHOST_TUns16 aasamples = 0; #ifdef __linux__ #ifdef __alpha__ @@ -553,7 +554,6 @@ int main(int argc, char** argv) usage(argv[0], isBlenderPlayer); return 0; break; -#ifndef _WIN32 case 'i': i++; if ( (i + 1) <= validArguments ) @@ -562,12 +562,15 @@ int main(int argc, char** argv) error = true; printf("error: too few options for parent window argument.\n"); } - #if defined(DEBUG) printf("XWindows ID = %d\n", parentWindow); #endif // defined(DEBUG) - -#endif // _WIN32 + break; + case 'm': + i++; + if ((i+1) <= validArguments ) + aasamples = atoi(argv[i++]); + break; case 'c': i++; closeConsole = false; @@ -857,13 +860,13 @@ int main(int argc, char** argv) if (scr_saver_mode == SCREEN_SAVER_MODE_SAVER) { app.startScreenSaverFullScreen(fullScreenWidth, fullScreenHeight, fullScreenBpp, fullScreenFrequency, - stereoWindow, stereomode); + stereoWindow, stereomode, aasamples); } else #endif { app.startFullScreen(fullScreenWidth, fullScreenHeight, fullScreenBpp, fullScreenFrequency, - stereoWindow, stereomode); + stereoWindow, stereomode, aasamples); } } else @@ -903,16 +906,16 @@ int main(int argc, char** argv) #ifdef WIN32 if (scr_saver_mode == SCREEN_SAVER_MODE_PREVIEW) { - app.startScreenSaverPreview(scr_saver_hwnd, stereoWindow, stereomode); + app.startScreenSaverPreview(scr_saver_hwnd, stereoWindow, stereomode, aasamples); } else #endif { if (parentWindow != 0) - app.startEmbeddedWindow(title, parentWindow, stereoWindow, stereomode); + app.startEmbeddedWindow(title, parentWindow, stereoWindow, stereomode, aasamples); else app.startWindow(title, windowLeft, windowTop, windowWidth, windowHeight, - stereoWindow, stereomode); + stereoWindow, stereomode, aasamples); } } } diff --git a/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp b/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp index 0c47b0d01bf..23e0a50ed6f 100644 --- a/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp +++ b/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp @@ -303,6 +303,8 @@ bool RAS_OpenGLRasterizer::BeginFrame(int drawingmode, double time) glShadeModel(GL_SMOOTH); + glEnable(GL_MULTISAMPLE_ARB); + m_2DCanvas->BeginFrame(); return true; @@ -387,6 +389,9 @@ void RAS_OpenGLRasterizer::EndFrame() FlushDebugLines(); glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); + + glDisable(GL_MULTISAMPLE_ARB); + m_2DCanvas->EndFrame(); } |