diff options
Diffstat (limited to 'q3radiant/WIN_Z.CPP')
-rwxr-xr-x | q3radiant/WIN_Z.CPP | 192 |
1 files changed, 192 insertions, 0 deletions
diff --git a/q3radiant/WIN_Z.CPP b/q3radiant/WIN_Z.CPP new file mode 100755 index 0000000..caac0d0 --- /dev/null +++ b/q3radiant/WIN_Z.CPP @@ -0,0 +1,192 @@ +/* +=========================================================================== +Copyright (C) 1999-2005 Id Software, Inc. + +This file is part of Quake III Arena source code. + +Quake III Arena source code is free software; you can redistribute it +and/or modify it under the terms of the GNU General Public License as +published by the Free Software Foundation; either version 2 of the License, +or (at your option) any later version. + +Quake III Arena source code is distributed in the hope that it will be +useful, but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with Foobar; if not, write to the Free Software +Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +=========================================================================== +*/ +// win_cam.c -- windows specific camera view code
+
+#include "stdafx.h"
+#include "qe3.h"
+
+static HDC s_hdcZ;
+static HGLRC s_hglrcZ;
+
+/*
+============
+WZ_WndProc
+============
+*/
+LONG WINAPI WZ_WndProc (
+ HWND hWnd,
+ UINT uMsg,
+ WPARAM wParam,
+ LPARAM lParam)
+{
+ int fwKeys, xPos, yPos;
+ RECT rect;
+
+ GetClientRect(hWnd, &rect);
+
+ switch (uMsg)
+ {
+
+ case WM_DESTROY:
+ QEW_StopGL( hWnd, s_hglrcZ, s_hdcZ );
+ return 0;
+
+ case WM_CREATE:
+ s_hdcZ = GetDC(hWnd);
+ QEW_SetupPixelFormat( s_hdcZ, false);
+ if ( ( s_hglrcZ = wglCreateContext( s_hdcZ ) ) == 0 )
+ Error( "wglCreateContext in WZ_WndProc failed" );
+
+ if (!wglMakeCurrent( s_hdcZ, s_hglrcZ ))
+ Error ("wglMakeCurrent in WZ_WndProc failed");
+
+ if (!wglShareLists( g_qeglobals.d_hglrcBase, s_hglrcZ ) )
+ Error( "wglShareLists in WZ_WndProc failed" );
+ return 0;
+
+ case WM_PAINT:
+ {
+ PAINTSTRUCT ps;
+
+ BeginPaint(hWnd, &ps);
+
+ if ( !wglMakeCurrent( s_hdcZ, s_hglrcZ ) )
+ Error ("wglMakeCurrent failed");
+ QE_CheckOpenGLForErrors();
+
+ Z_Draw ();
+ SwapBuffers(s_hdcZ);
+
+ EndPaint(hWnd, &ps);
+ }
+ return 0;
+
+
+ case WM_KEYDOWN:
+ QE_KeyDown (wParam);
+ return 0;
+
+ case WM_MBUTTONDOWN:
+ case WM_RBUTTONDOWN:
+ case WM_LBUTTONDOWN:
+ if (GetTopWindow(g_qeglobals.d_hwndMain) != hWnd)
+ BringWindowToTop(hWnd);
+
+ SetFocus( g_qeglobals.d_hwndZ );
+ SetCapture( g_qeglobals.d_hwndZ );
+ fwKeys = wParam; // key flags
+ xPos = (short)LOWORD(lParam); // horizontal position of cursor
+ yPos = (short)HIWORD(lParam); // vertical position of cursor
+ yPos = (int)rect.bottom - 1 - yPos;
+ Z_MouseDown (xPos, yPos, fwKeys);
+ return 0;
+
+ case WM_MBUTTONUP:
+ case WM_RBUTTONUP:
+ case WM_LBUTTONUP:
+ fwKeys = wParam; // key flags
+ xPos = (short)LOWORD(lParam); // horizontal position of cursor
+ yPos = (short)HIWORD(lParam); // vertical position of cursor
+ yPos = (int)rect.bottom - 1 - yPos;
+ Z_MouseUp (xPos, yPos, fwKeys);
+ if (! (fwKeys & (MK_LBUTTON|MK_RBUTTON|MK_MBUTTON)))
+ ReleaseCapture ();
+ return 0;
+
+ case WM_GETMINMAXINFO:
+ {
+ MINMAXINFO *pmmi = (LPMINMAXINFO) lParam;
+
+ pmmi->ptMinTrackSize.x = ZWIN_WIDTH;
+ return 0;
+ }
+
+ case WM_MOUSEMOVE:
+ fwKeys = wParam; // key flags
+ xPos = (short)LOWORD(lParam); // horizontal position of cursor
+ yPos = (short)HIWORD(lParam); // vertical position of cursor
+ yPos = (int)rect.bottom - 1 - yPos;
+ Z_MouseMoved (xPos, yPos, fwKeys);
+ return 0;
+
+ case WM_SIZE:
+ z.width = rect.right;
+ z.height = rect.bottom;
+ InvalidateRect( g_qeglobals.d_hwndZ, NULL, false);
+ return 0;
+
+ case WM_NCCALCSIZE:// don't let windows copy pixels
+ DefWindowProc (hWnd, uMsg, wParam, lParam);
+ return WVR_REDRAW;
+
+ case WM_KILLFOCUS:
+ case WM_SETFOCUS:
+ SendMessage( hWnd, WM_NCACTIVATE, uMsg == WM_SETFOCUS, 0 );
+ return 0;
+
+ case WM_CLOSE:
+ /* call destroy window to cleanup and go away */
+ DestroyWindow (hWnd);
+ return 0;
+ }
+
+ return DefWindowProc (hWnd, uMsg, wParam, lParam);
+}
+
+
+/*
+==============
+WZ_Create
+==============
+*/
+void WZ_Create (HINSTANCE hInstance)
+{
+ WNDCLASS wc;
+ memset (&wc, 0, sizeof(wc));
+ wc.style = CS_NOCLOSE;
+ wc.lpfnWndProc = (WNDPROC)WZ_WndProc;
+ wc.cbClsExtra = 0;
+ wc.cbWndExtra = 0;
+ wc.hInstance = hInstance;
+ wc.hIcon = 0;
+ wc.hCursor = LoadCursor (NULL,IDC_ARROW);
+ wc.hbrBackground = NULL;
+ wc.lpszMenuName = NULL;
+ wc.lpszClassName = Z_WINDOW_CLASS;
+
+ if (!RegisterClass (&wc) )
+ Error ("WCam_Register: failed");
+
+ g_qeglobals.d_hwndZ = CreateWindow (Z_WINDOW_CLASS ,
+ "Z",
+ QE3_STYLE,
+ 0,20,ZWIN_WIDTH,screen_height-38, // size
+ g_qeglobals.d_hwndMain, // parent
+ 0, // no menu
+ hInstance,
+ NULL);
+ if (!g_qeglobals.d_hwndZ)
+ Error ("Couldn't create zwindow");
+
+ LoadWindowState(g_qeglobals.d_hwndZ, "zwindow");
+ ShowWindow (g_qeglobals.d_hwndZ, SW_SHOWDEFAULT);
+}
|