150 lines
4.3 KiB
C++
Executable File
150 lines
4.3 KiB
C++
Executable File
/**
|
|
* @RDE_HEADER@
|
|
* Small wrapper to automatically start thp_viewer
|
|
* $Id$
|
|
* $HeadURL$
|
|
* $Author$
|
|
* Created by Christian Ehrlicher, SLSE, 2016-02-29
|
|
*/
|
|
|
|
#include <windows.h>
|
|
#include <gl/gl.h>
|
|
#include <gl/glu.h>
|
|
|
|
static void* getGLExtensionFuncPtr(const char *funcName, const char *fallbackFuncName)
|
|
{
|
|
void* ptr = wglGetProcAddress(funcName);
|
|
if (ptr)
|
|
return ptr;
|
|
return wglGetProcAddress(fallbackFuncName);
|
|
}
|
|
|
|
static int checkOpenGL(HWND hWnd)
|
|
{
|
|
HDC hDC = GetDC( hWnd );
|
|
|
|
PIXELFORMATDESCRIPTOR pfd;
|
|
ZeroMemory( &pfd, sizeof( pfd ) );
|
|
pfd.nSize = sizeof( pfd );
|
|
pfd.nVersion = 1;
|
|
pfd.dwFlags = PFD_DRAW_TO_WINDOW |
|
|
PFD_SUPPORT_OPENGL |
|
|
PFD_DOUBLEBUFFER |
|
|
PFD_SWAP_EXCHANGE;
|
|
pfd.iPixelType = PFD_TYPE_RGBA;
|
|
pfd.cColorBits = 32;
|
|
pfd.cRedBits = 8;
|
|
pfd.cGreenBits = 8;
|
|
pfd.cBlueBits = 8;
|
|
pfd.cAlphaBits = 8;
|
|
pfd.cDepthBits = 0;
|
|
pfd.iLayerType = PFD_MAIN_PLANE;
|
|
int iFormat = ChoosePixelFormat( hDC, &pfd );
|
|
if( !SetPixelFormat( hDC, iFormat, &pfd ) ) {
|
|
DWORD dw = GetLastError();
|
|
int ret = MessageBox(NULL,
|
|
L"Your system does not support some mandatory OpenGL Functions.\nThe THP-Viewer may not display all things correct!\nDo you really want to start the THP-viewer?",
|
|
L"THP-Viewer startup",
|
|
MB_ICONWARNING|MB_YESNO);
|
|
if(ret == IDNO) {
|
|
ReleaseDC( hWnd, hDC );
|
|
return 1;
|
|
}
|
|
}
|
|
|
|
HGLRC hRC = wglCreateContext( hDC );
|
|
|
|
DWORD dw = wglMakeCurrent( hDC, hRC );
|
|
void *_glCompressedTexImage2D = getGLExtensionFuncPtr( "glCompressedTexImage2D", "glCompressedTexImage2DARB" );
|
|
if(!_glCompressedTexImage2D) {
|
|
int ret = MessageBox(NULL,
|
|
L"Your system does not support the mandatory OpenGL Function glCompressedTexImage2D.\nThe THP-Viewer may not display all things correct!\nDo you really want to start the THP-viewer?",
|
|
L"THP-Viewer startup",
|
|
MB_ICONWARNING|MB_YESNO);
|
|
if(ret == IDNO) {
|
|
wglDeleteContext( hRC );
|
|
ReleaseDC( hWnd, hDC );
|
|
return 1;
|
|
}
|
|
}
|
|
|
|
wglDeleteContext( hRC );
|
|
ReleaseDC( hWnd, hDC );
|
|
|
|
return 0;
|
|
}
|
|
|
|
static int startThpViewer(HINSTANCE hInstance)
|
|
{
|
|
TCHAR fn[MAX_PATH*10];
|
|
DWORD len = GetModuleFileName(hInstance, fn, sizeof(fn));
|
|
|
|
for(int i = len - 1; i >= 0; --i) {
|
|
if(fn[i] == '\\')
|
|
break;
|
|
fn[i] = '\0';
|
|
}
|
|
wcscat(fn, L"thp\\thp_viewer.exe");
|
|
|
|
STARTUPINFO si; ZeroMemory(&si, sizeof(si));
|
|
PROCESS_INFORMATION pi; ZeroMemory(&pi, sizeof(pi));
|
|
si.cb = sizeof(si);
|
|
|
|
DWORD ret = CreateProcess(fn,
|
|
NULL, // lpCommandLine
|
|
NULL, // lpProcessAttributes
|
|
NULL, // lpThreadAttributes
|
|
NULL, // bInheritHandles
|
|
0, // dwCreationFlags
|
|
NULL, // lpEnvironment
|
|
NULL, // lpCurrentDirectory
|
|
&si, // lpStartupInfo
|
|
&pi); // lpProcessInformation
|
|
|
|
if(ret == 0) {
|
|
MessageBox(NULL,
|
|
L"Error starting the THP-Viewer!",
|
|
L"THP-Viewer startup",
|
|
MB_ICONWARNING|MB_OK);
|
|
return 1;
|
|
}
|
|
// Wait until child process exits.
|
|
WaitForSingleObject( pi.hProcess, INFINITE );
|
|
|
|
// Close process and thread handles.
|
|
CloseHandle( pi.hProcess );
|
|
CloseHandle( pi.hThread );
|
|
|
|
return 0;
|
|
}
|
|
|
|
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
|
|
{
|
|
return DefWindowProc( hWnd, message, wParam, lParam );
|
|
}
|
|
|
|
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
|
|
LPSTR lpCmdLine, int nCmdShow)
|
|
{
|
|
WNDCLASS wc;
|
|
ZeroMemory( &wc, sizeof(wc) );
|
|
// register window class
|
|
wc.style = CS_OWNDC;
|
|
wc.lpfnWndProc = WndProc;
|
|
wc.hInstance = hInstance;
|
|
wc.lpszClassName = L"THP_Viewer_startup";
|
|
RegisterClass( &wc );
|
|
|
|
// create main window
|
|
HWND hWnd = CreateWindow(L"THP_Viewer_startup",
|
|
L"THP-Viewer startup",
|
|
WS_CAPTION | WS_POPUPWINDOW,
|
|
0, 0, 256, 256,
|
|
NULL, NULL, hInstance, NULL );
|
|
|
|
int iRet = checkOpenGL(hWnd);
|
|
if(iRet != 0)
|
|
return iRet;
|
|
return startThpViewer(hInstance);
|
|
}
|