diff --git a/engine/client/in_raw.h b/engine/client/in_raw.h index 3826f874..e680783a 100644 --- a/engine/client/in_raw.h +++ b/engine/client/in_raw.h @@ -73,7 +73,7 @@ typedef struct tagRAWMOUSE { USHORT usButtonFlags; USHORT usButtonData; }; - } buttondata; + }; ULONG ulRawButtons; LONG lLastX; LONG lLastY; diff --git a/engine/client/in_win.c b/engine/client/in_win.c index c4756e88..ea466e6c 100644 --- a/engine/client/in_win.c +++ b/engine/client/in_win.c @@ -1803,36 +1803,36 @@ void IN_RawInput_MouseRead(HANDLE in_device_handle) } // buttons - if (raw->data.mouse.buttondata.usButtonFlags & RI_MOUSE_BUTTON_1_DOWN) + if (raw->data.mouse.usButtonFlags & RI_MOUSE_BUTTON_1_DOWN) Key_Event(K_MOUSE1, true); - if (raw->data.mouse.buttondata.usButtonFlags & RI_MOUSE_BUTTON_1_UP) + if (raw->data.mouse.usButtonFlags & RI_MOUSE_BUTTON_1_UP) Key_Event(K_MOUSE1, false); - if (raw->data.mouse.buttondata.usButtonFlags & RI_MOUSE_BUTTON_2_DOWN) + if (raw->data.mouse.usButtonFlags & RI_MOUSE_BUTTON_2_DOWN) Key_Event(K_MOUSE2, true); - if (raw->data.mouse.buttondata.usButtonFlags & RI_MOUSE_BUTTON_2_UP) + if (raw->data.mouse.usButtonFlags & RI_MOUSE_BUTTON_2_UP) Key_Event(K_MOUSE2, false); - if (raw->data.mouse.buttondata.usButtonFlags & RI_MOUSE_BUTTON_3_DOWN) + if (raw->data.mouse.usButtonFlags & RI_MOUSE_BUTTON_3_DOWN) Key_Event(K_MOUSE3, true); - if (raw->data.mouse.buttondata.usButtonFlags & RI_MOUSE_BUTTON_3_UP) + if (raw->data.mouse.usButtonFlags & RI_MOUSE_BUTTON_3_UP) Key_Event(K_MOUSE3, false); - if (raw->data.mouse.buttondata.usButtonFlags & RI_MOUSE_BUTTON_4_DOWN) + if (raw->data.mouse.usButtonFlags & RI_MOUSE_BUTTON_4_DOWN) Key_Event(K_MOUSE4, true); - if (raw->data.mouse.buttondata.usButtonFlags & RI_MOUSE_BUTTON_4_UP) + if (raw->data.mouse.usButtonFlags & RI_MOUSE_BUTTON_4_UP) Key_Event(K_MOUSE4, false); - if (raw->data.mouse.buttondata.usButtonFlags & RI_MOUSE_BUTTON_5_DOWN) + if (raw->data.mouse.usButtonFlags & RI_MOUSE_BUTTON_5_DOWN) Key_Event(K_MOUSE5, true); - if (raw->data.mouse.buttondata.usButtonFlags & RI_MOUSE_BUTTON_5_UP) + if (raw->data.mouse.usButtonFlags & RI_MOUSE_BUTTON_5_UP) Key_Event(K_MOUSE5, false); // mouse wheel - if (raw->data.mouse.buttondata.usButtonFlags & RI_MOUSE_WHEEL) + if (raw->data.mouse.usButtonFlags & RI_MOUSE_WHEEL) { // If the current message has a mouse_wheel message - if ((SHORT)raw->data.mouse.buttondata.usButtonData > 0) + if ((SHORT)raw->data.mouse.usButtonData > 0) { Key_Event(K_MWHEELUP, true); Key_Event(K_MWHEELUP, false); } - if ((SHORT)raw->data.mouse.buttondata.usButtonData < 0) + if ((SHORT)raw->data.mouse.usButtonData < 0) { Key_Event(K_MWHEELDOWN, true); Key_Event(K_MWHEELDOWN, false); diff --git a/engine/d3d/vid_d3d.c b/engine/d3d/vid_d3d.c index d2f87160..a6dce752 100644 --- a/engine/d3d/vid_d3d.c +++ b/engine/d3d/vid_d3d.c @@ -1,1260 +1,1272 @@ -#include "quakedef.h" -#ifdef D3DQUAKE -#include "winquake.h" -#include "d3dquake.h" -#include "glquake.h" - -#pragma comment(lib, "d3dx.lib") -#pragma comment(lib, "ddraw.lib") -#pragma comment(lib, "dxguid.lib") - - -#ifndef WM_XBUTTONDOWN - #define WM_XBUTTONDOWN 0x020B - #define WM_XBUTTONUP 0x020C -#endif -#ifndef MK_XBUTTON1 - #define MK_XBUTTON1 0x0020 - #define MK_XBUTTON2 0x0040 -// copied from DarkPlaces in an attempt to grab more buttons - #define MK_XBUTTON3 0x0080 - #define MK_XBUTTON4 0x0100 - #define MK_XBUTTON5 0x0200 - #define MK_XBUTTON6 0x0400 - #define MK_XBUTTON7 0x0800 -#endif - -#ifndef WM_INPUT - #define WM_INPUT 255 -#endif - - -int gl_bumpmappingpossible; - -static LPD3DXCONTEXT pD3DX; -static LPDIRECTDRAW7 pDD; -static LPDIRECT3D7 pD3D; -LPDIRECT3DDEVICE7 pD3DDev; -static LPDIRECTDRAWSURFACE7 pPrimary; -static LPDIRECTDRAWGAMMACONTROL pGammaControl; - - -static qboolean vid_initializing; - -extern qboolean scr_initialized; // ready to draw -extern qboolean scr_drawloading; - - -cvar_t vid_hardwaregamma; - - -HWND mainwindow; - -struct texture_s *r_notexture_mip; - -int r_framecount; - -mleaf_t *r_viewleaf; - -#define MAX_MOD_KNOWN 1024 -int mod_numknown; -model_t mod_known[MAX_MOD_KNOWN]; -model_t *loadmodel; -model_t *currentmodel; -char loadname[32]; -qbyte *mod_base; - -qboolean DDActive; - -model_t *lightmodel; -int relitsurface; - -int window_center_x, window_center_y; -RECT window_rect; -int window_x, window_y; - -qboolean r_cache_thrash; // set if thrashing the surface cache - -mpic_t *draw_disc; // also used on sbar - -#if !defined(SWQUAKE) && !defined(RGLQUAKE) -qbyte GetPaletteIndex(int red, int green, int blue) -{ - //slow, horrible method. - { - int i, best=15; - int bestdif=256*256*256, curdif; - extern qbyte *host_basepal; - qbyte *pa; - - #define _abs(x) ((x)*(x)) - - pa = host_basepal; - for (i = 0; i < 256; i++, pa+=3) - { - curdif = _abs(red - pa[0]) + _abs(green - pa[1]) + _abs(blue - pa[2]); - if (curdif < bestdif) - { - if (curdif<1) - return i; - bestdif = curdif; - best = i; - } - } - return best; - } -} -#endif - -void BuildGammaTable (float g, float c); -void D3D7_VID_GenPaletteTables (unsigned char *palette) -{ - qbyte *pal; - unsigned r,g,b; - unsigned v; - unsigned short i; - unsigned *table; - extern qbyte gammatable[256]; - - if (palette) - { - BuildGammaTable(1, 1); - - // - // 8 8 8 encoding - // - if (vid_hardwaregamma.value) - { - // don't built in the gamma table - - pal = palette; - table = d_8to24rgbtable; - for (i=0 ; i<256 ; i++) - { - r = pal[0]; - g = pal[1]; - b = pal[2]; - pal += 3; - - // v = (255<<24) + (r<<16) + (g<<8) + (b<<0); - // v = (255<<0) + (r<<8) + (g<<16) + (b<<24); - v = (255<<24) + (r<<0) + (g<<8) + (b<<16); - *table++ = v; - } - d_8to24rgbtable[255] &= 0xffffff; // 255 is transparent - } - else - { - //computer has no hardware gamma (poor suckers) increase table accordingly - - pal = palette; - table = d_8to24rgbtable; - for (i=0 ; i<256 ; i++) - { - r = gammatable[pal[0]]; - g = gammatable[pal[1]]; - b = gammatable[pal[2]]; - pal += 3; - - // v = (255<<24) + (r<<16) + (g<<8) + (b<<0); - // v = (255<<0) + (r<<8) + (g<<16) + (b<<24); - v = (255<<24) + (r<<0) + (g<<8) + (b<<16); - *table++ = v; - } - d_8to24rgbtable[255] &= 0xffffff; // 255 is transparent - } - - if (LittleLong(1) != 1) - for (i=0 ; i<256 ; i++) - d_8to24rgbtable[i] = LittleLong(d_8to24rgbtable[i]); - } -} - -#if !defined(SWQUAKE) && !defined(GLQUAKE) -void D_FlushCaches (void) -{ -} -#endif - - - - -void D3DMod_Think (void) -{ -} -void D3DMod_NowLoadExternal(void) -{ -} -void D3DMod_TouchModel (char *name) -{ -} -void *D3DMod_Extradata (struct model_s *mod) // handles caching -{ - return NULL; -} -struct model_s *D3DMod_FindName (char *name) -{ - return NULL; -} -struct model_s *D3DMod_ForName (char *name, qboolean crash) -{ - return NULL; -} -void D3DMod_ClearAll (void) -{ -} -void D3DMod_Init (void) -{ -} - - -typedef enum {MS_WINDOWED, MS_FULLSCREEN, MS_FULLDIB, MS_UNINIT} modestate_t; -static modestate_t modestate; - -qboolean D3DAppActivate(BOOL fActive, BOOL minimize) -/**************************************************************************** -* -* Function: AppActivate -* Parameters: fActive - True if app is activating -* -* Description: If the application is activating, then swap the system -* into SYSPAL_NOSTATIC mode so that our palettes will display -* correctly. -* -****************************************************************************/ -{ - static BOOL sound_active; - - if (ActiveApp == fActive && Minimized == minimize) - return false; //so windows doesn't crash us over and over again. - - ActiveApp = fActive; - Minimized = minimize; - -// enable/disable sound on focus gain/loss - if (!ActiveApp && sound_active) - { - S_BlockSound (); - sound_active = false; - } - else if (ActiveApp && !sound_active) - { - S_UnblockSound (); - sound_active = true; - } - - if (fActive) - { -/* if (modestate != MS_WINDOWED) - { - IN_ActivateMouse (); - IN_HideMouse (); -// if (vid_canalttab && vid_wassuspended) - { -// vid_wassuspended = false; -// ChangeDisplaySettings (&gdevmode, CDS_FULLSCREEN); - ShowWindow(mainwindow, SW_SHOWNORMAL); - - // Fix for alt-tab bug in NVidia drivers -// MoveWindow (mainwindow, 0, 0, gdevmode.dmPelsWidth, gdevmode.dmPelsHeight, false); - } - } - else if ((modestate == MS_WINDOWED) && _windowed_mouse.value && (key_dest == key_game || key_dest == key_menu)) - { - IN_ActivateMouse (); - IN_HideMouse (); - } -*/ - Cvar_ForceCallback(&v_gamma); - } - - if (!fActive) - { -/* if (modestate != MS_WINDOWED) - { - IN_DeactivateMouse (); - IN_ShowMouse (); -// if (vid_canalttab) -// { -// ChangeDisplaySettings (NULL, 0); -// vid_wassuspended = true; -// } - } - else if ((modestate == MS_WINDOWED) && _windowed_mouse.value) - { - IN_DeactivateMouse (); - IN_ShowMouse (); - } -*/ - Cvar_ForceCallback(&v_gamma); //wham bam thanks. -/* - if (qSetDeviceGammaRamp) - { - if (vid_desktopgamma.value) - { - HDC hDC = GetDC(GetDesktopWindow()); - qSetDeviceGammaRamp (hDC, originalgammaramps); - ReleaseDC(GetDesktopWindow(), hDC); - } - else - { - qSetDeviceGammaRamp(maindc, originalgammaramps); - } - } - */ - } - - return true; -} - - - - - -static LRESULT WINAPI D3D7_WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) -{ - LONG lRet = 1; - int fActive, fMinimized, temp; - extern unsigned int uiWheelMessage; - - if ( uMsg == uiWheelMessage ) - uMsg = WM_MOUSEWHEEL; - - switch (uMsg) - { - case WM_KILLFOCUS: - if (modestate == MS_FULLDIB) - ShowWindow(mainwindow, SW_SHOWMINNOACTIVE); - break; - - case WM_CREATE: - break; - - case WM_MOVE: - GetWindowRect(mainwindow, &window_rect); - window_x = (int) LOWORD(lParam); - window_y = (int) HIWORD(lParam); -// VID_UpdateWindowStatus (); - break; - - case WM_KEYDOWN: - case WM_SYSKEYDOWN: - if (!vid_initializing) - Key_Event (MapKey(lParam), true); - break; - - case WM_KEYUP: - case WM_SYSKEYUP: - if (!vid_initializing) - Key_Event (MapKey(lParam), false); - break; - - case WM_SYSCHAR: - // keep Alt-Space from happening - break; - - // this is complicated because Win32 seems to pack multiple mouse events into - // one update sometimes, so we always check all states and look for events - case WM_LBUTTONDOWN: - case WM_LBUTTONUP: - case WM_RBUTTONDOWN: - case WM_RBUTTONUP: - case WM_MBUTTONDOWN: - case WM_MBUTTONUP: - case WM_MOUSEMOVE: - case WM_XBUTTONDOWN: - case WM_XBUTTONUP: - temp = 0; - - if (wParam & MK_LBUTTON) - temp |= 1; - - if (wParam & MK_RBUTTON) - temp |= 2; - - if (wParam & MK_MBUTTON) - temp |= 4; - - if (wParam & MK_XBUTTON1) - temp |= 8; - - if (wParam & MK_XBUTTON2) - temp |= 16; - - if (wParam & MK_XBUTTON3) - temp |= 32; - - if (wParam & MK_XBUTTON4) - temp |= 64; - - if (wParam & MK_XBUTTON5) - temp |= 128; - - if (wParam & MK_XBUTTON6) - temp |= 256; - - if (wParam & MK_XBUTTON7) - temp |= 512; - - if (!vid_initializing) - IN_MouseEvent (temp); - - break; - - // JACK: This is the mouse wheel with the Intellimouse - // Its delta is either positive or neg, and we generate the proper - // Event. - case WM_MOUSEWHEEL: - if (!vid_initializing) - { - if ((short) HIWORD(wParam) > 0) - { - Key_Event(K_MWHEELUP, true); - Key_Event(K_MWHEELUP, false); - } - else - { - Key_Event(K_MWHEELDOWN, true); - Key_Event(K_MWHEELDOWN, false); - } - } - break; - - case WM_INPUT: - // raw input handling - IN_RawInput_MouseRead((HANDLE)lParam); - break; - - case WM_SIZE: - if (!vid_initializing) - { - GetWindowRect(mainwindow, &window_rect); - // force width/height to be updated -// glwidth = window_rect.right - window_rect.left; -// glheight = window_rect.bottom - window_rect.top; -// Cvar_ForceCallback(&vid_conautoscale); -// Cvar_ForceCallback(&vid_conwidth); - } - break; - - case WM_CLOSE: - if (!vid_initializing) - if (MessageBox (mainwindow, "Are you sure you want to quit?", "Confirm Exit", - MB_YESNO | MB_SETFOREGROUND | MB_ICONQUESTION) == IDYES) - { - Sys_Quit (); - } - - break; - - case WM_ACTIVATE: - fActive = LOWORD(wParam); - fMinimized = (BOOL) HIWORD(wParam); - if (!D3DAppActivate(!(fActive == WA_INACTIVE), fMinimized)) - break;//so, urm, tell me microsoft, what changed? - if (modestate == MS_FULLDIB) - ShowWindow(mainwindow, SW_SHOWNORMAL); - - // fix the leftover Alt from any Alt-Tab or the like that switched us away -// ClearAllStates (); - - break; - - case WM_DESTROY: - { -// if (dibwindow) -// DestroyWindow (dibwindow); - } - break; - - case MM_MCINOTIFY: - lRet = CDAudio_MessageHandler (hWnd, uMsg, wParam, lParam); - break; - - - case WM_MWHOOK: - if (!vid_initializing) - MW_Hook_Message (lParam); - break; - - default: - /* pass all unhandled messages to DefWindowProc */ - lRet = DefWindowProc (hWnd, uMsg, wParam, lParam); - break; - } - - /* return 1 if handled message, 0 if not */ - return lRet; -} - - - -qboolean D3D7_VID_Init(rendererstate_t *info, unsigned char *palette) -{ - DWORD width = info->width; - DWORD height = info->height; - DWORD bpp = info->bpp; - DWORD zbpp = 16; - DWORD flags = 0; - MSG msg; - - extern cvar_t vid_conwidth; - extern cvar_t vid_conheight; - - DDGAMMARAMP gammaramp; - char errs[1024]; - int i; - HRESULT hr; - - char *CLASSNAME = "FTED3D7QUAKE"; - WNDCLASS wc = { - 0, - &D3D7_WindowProc, - 0, - 0, - NULL, - NULL, - NULL, - NULL, - NULL, - CLASSNAME - }; - -// wc.style = 0; - wc.lpfnWndProc = D3D7_WindowProc; -// wc.cbClsExtra; -// wc.cbWndExtra; -// wc.hInstance; -// wc.hIcon; -// wc.hCursor; -// wc.hbrBackground; -// wc.lpszMenuName; - wc.lpszClassName = CLASSNAME; - - vid_initializing = true; - - if( FAILED(hr = D3DXInitialize()) ) - { - D3DXGetErrorString(hr, sizeof(errs), errs); - Con_Printf("D3D initialisation failed: error %X: %s\n", hr, errs); - return false; - } - - RegisterClass(&wc); - - flags |= info->fullscreen ? D3DX_CONTEXT_FULLSCREEN : 0; - - if (flags & D3DX_CONTEXT_FULLSCREEN) - mainwindow = CreateWindow(CLASSNAME, "Direct3D", 0, 0, 0, width, height, NULL, NULL, NULL, NULL); - else - mainwindow = CreateWindow(CLASSNAME, "Direct3D", WS_OVERLAPPEDWINDOW, 0, 0, width, height, NULL, NULL, NULL, NULL); -/* - width = vid_conwidth.value; - height = vid_conheight.value; -*/ - // Try as specified. - hr = D3DXCreateContextEx(D3DX_DEFAULT, flags, - mainwindow, NULL, bpp, 0, - zbpp, 0, 1, width, height, D3DX_DEFAULT, &pD3DX); - if( FAILED(hr) ) - { - D3DXGetErrorString(hr, sizeof(errs), errs); - printf("D3D initialisation failed: error %X: %s\n", hr, errs); - - // default z-buffer - hr = D3DXCreateContextEx(D3DX_DEFAULT, flags, - mainwindow, NULL, bpp, 0, - D3DX_DEFAULT, 0, 1, width, height, D3DX_DEFAULT, &pD3DX); - if( FAILED(hr) ) - { - // default depth and z-buffer - hr = D3DXCreateContextEx(D3DX_DEFAULT, flags, - mainwindow, NULL, D3DX_DEFAULT, 0, - D3DX_DEFAULT, 0, 1, width, height, D3DX_DEFAULT, &pD3DX); - if( FAILED(hr) ) - { - // default everything - hr = D3DXCreateContextEx(D3DX_DEFAULT, flags, - mainwindow, NULL, D3DX_DEFAULT, 0, - D3DX_DEFAULT, 0, 1, D3DX_DEFAULT, D3DX_DEFAULT, D3DX_DEFAULT, &pD3DX); - if( FAILED(hr) ) - { - D3DXGetErrorString(hr, sizeof(errs), errs); - Con_Printf("D3D fallbacks failed: error %X: %s\n", hr, errs); - - DestroyWindow(mainwindow); - mainwindow = NULL; - return false; - } - } - } - } - //the void* casts are because microsoft screwed up in the header files I have - pDD = pD3DX->lpVtbl->GetDD((void*)pD3DX); - pD3D = pD3DX->lpVtbl->GetD3D((void*)pD3DX); - pD3DDev = pD3DX->lpVtbl->GetD3DDevice((void*)pD3DX); - pPrimary = pD3DX->lpVtbl->GetPrimary((void*)pD3DX); - - while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) - { - TranslateMessage(&msg); - DispatchMessage(&msg); - } - - ShowWindow(mainwindow, SW_NORMAL); - pD3DX->lpVtbl->SetClearColor((void*)pD3DX, 0xffffffff); - pD3DX->lpVtbl->Clear((void*)pD3DX, D3DCLEAR_TARGET); - pD3DX->lpVtbl->UpdateFrame((void*)pD3DX, 0); - - - - pD3DX->lpVtbl->GetBufferSize((void*)pD3DX, &width, &height); - vid.width = width; - vid.height = height; - vid.recalc_refdef = true; - - pDD->lpVtbl->QueryInterface ((void*)pDD, &IID_IDirectDrawGammaControl, (void**)&pGammaControl); - if (pGammaControl) - { - for (i = 0; i < 256; i++) - gammaramp.red[i] = i*2; - pGammaControl->lpVtbl->SetGammaRamp(pGammaControl, 0, &gammaramp); - } - else - Con_Printf("Couldn't get gamma controls\n"); - - vid_initializing = false; - - - - - - - pD3DDev->lpVtbl->SetRenderState(pD3DDev, D3DRENDERSTATE_ALPHAFUNC, D3DCMP_GREATER ); - pD3DDev->lpVtbl->SetRenderState(pD3DDev, D3DRENDERSTATE_ALPHAREF, 0.666*256 ); - - pD3DDev->lpVtbl->SetRenderState(pD3DDev, D3DRENDERSTATE_ALPHATESTENABLE, TRUE ); - - - //pD3DDev->lpVtbl->SetRenderState(pD3DDev, D3DRENDERSTATE_DITHERENABLE, FALSE); - //pD3DDev->lpVtbl->SetRenderState(pD3DDev, D3DRENDERSTATE_SPECULARENABLE, FALSE); - //pD3DDev->lpVtbl->SetRenderState(pD3DDev, D3DRENDERSTATE_TEXTUREPERSPECTIVE, TRUE); - pD3DDev->lpVtbl->SetRenderState(pD3DDev, D3DRENDERSTATE_LIGHTING, FALSE); - - pD3DDev->lpVtbl->SetRenderState(pD3DDev, D3DRENDERSTATE_ZWRITEENABLE, TRUE); - pD3DDev->lpVtbl->SetRenderState(pD3DDev, D3DRENDERSTATE_ZVISIBLE, TRUE); - - pD3DDev->lpVtbl->SetRenderState(pD3DDev, D3DRENDERSTATE_ZFUNC, D3DCMP_LESSEQUAL); - - - GetWindowRect(mainwindow, &window_rect); - - - D3D7_VID_GenPaletteTables(palette); - - - - { - extern cvar_t vid_conwidth, vid_conheight; - vid.conwidth = vid_conwidth.value; - vid.conheight = vid_conheight.value; - if (vid.width != vid.conwidth || vid.height != vid.conheight) - vid.recalc_refdef = true; - vid.width = vid.conwidth; - vid.height = vid.conheight; - } - - return true; -} - - - -qboolean (D3D7_R_CheckSky) (void) -{ - return false; -} -void (D3D7_R_SetSky) (char *name, float rotate, vec3_t axis) -{ -} - -void (D3D7_R_NewMap) (void) -{ - extern int skytexturenum; - int i; - r_worldentity.model = cl.worldmodel; - GLR_AnimateLight(); - D3D7_BuildLightmaps(); - - P_ClearParticles(); - - skytexturenum = -1; - - for (i=0 ; inumtextures ; i++) - { - if (!cl.worldmodel->textures[i]) - continue; - if (!Q_strncmp(cl.worldmodel->textures[i]->name,"sky",3) ) - skytexturenum = i; -// if (!Q_strncmp(cl.worldmodel->textures[i]->name,"window02_1",10) ) -// mirrortexturenum = i; - cl.worldmodel->textures[i]->texturechain = NULL; - } -} - -mleaf_t *r_viewleaf, *r_oldviewleaf; -mleaf_t *r_viewleaf2, *r_oldviewleaf2; -void (D3D7_R_PreNewMap) (void) -{ - r_viewleaf = NULL; - r_oldviewleaf = NULL; - r_viewleaf2 = NULL; - r_oldviewleaf2 = NULL; -} -int (D3D7_R_LightPoint) (vec3_t point) -{ - return 0; -} - -void (D3D7_R_PushDlights) (void) -{ -} -void (D3D7_R_AddStain) (vec3_t org, float red, float green, float blue, float radius) -{ -} -void (D3D7_R_LessenStains) (void) -{ -} - -void (D3D7_Mod_Init) (void) -{ -} -void (D3D7_Mod_ClearAll) (void) -{ -} -struct model_s *(D3D7_Mod_ForName) (char *name, qboolean crash) -{ - return NULL; -} -struct model_s *(D3D7_Mod_FindName) (char *name) -{ - return NULL; -} -void *(D3D7_Mod_Extradata) (struct model_s *mod) -{ - return NULL; -} // handles caching -void (D3D7_Mod_TouchModel) (char *name) -{ -} - -void (D3D7_Mod_NowLoadExternal) (void) -{ -} -void (D3D7_Mod_Think) (void) -{ -} -qboolean(D3D7_Mod_GetTag) (struct model_s *model, int tagnum, int frame1, int frame2, float f2ness, float f1time, float f2time, float *result) -{ - return false; -} -int (D3D7_Mod_TagNumForName) (struct model_s *model, char *name) -{ - return 0; -} -int (D3D7_Mod_SkinForName) (struct model_s *model, char *name) -{ - return 0; -} - -void (D3D7_VID_DeInit) (void) -{ - if (pPrimary) - { - pPrimary->lpVtbl->Release(pPrimary); - pPrimary = NULL; - } - if (pD3DDev) - { - pD3DDev->lpVtbl->Release(pD3DDev); - pD3DDev = NULL; - } - if (pD3D) - { - pD3D->lpVtbl->Release(pD3D); - pD3D = NULL; - } - if (pDD) - { - pDD->lpVtbl->Release(pDD); - pDD = NULL; - } - if (pD3DX) - { - pD3DX->lpVtbl->Release((void*)pD3DX); - pD3DX = NULL; - } - if (mainwindow) - { - DestroyWindow(mainwindow); - mainwindow = NULL; - } -} -void (D3D7_VID_LockBuffer) (void) -{ -} -void (D3D7_VID_UnlockBuffer) (void) -{ -} -void (D3D7_D_BeginDirectRect) (int x, int y, qbyte *pbitmap, int width, int height) -{ -} -void (D3D7_D_EndDirectRect) (int x, int y, int width, int height) -{ -} -void (D3D7_VID_ForceLockState) (int lk) -{ -} -int (D3D7_VID_ForceUnlockedAndReturnState) (void) -{ - return 0; -} - -void (D3D7_VID_SetPalette) (unsigned char *palette) -{ - D3D7_VID_GenPaletteTables(palette); -} -void (D3D7_VID_ShiftPalette) (unsigned char *palette) -{ - D3D7_VID_GenPaletteTables(palette); -} -char *(D3D7_VID_GetRGBInfo) (int prepad, int *truevidwidth, int *truevidheight) -{ - return NULL; -} -void (D3D7_VID_SetWindowCaption) (char *msg) -{ - SetWindowText(mainwindow, msg); -} - -void d3d7_ortho(float *m) -{ - D3DXMatrixOrthoOffCenter((D3DXMATRIX*)m, 0, vid.width, vid.height, 0, -100, 100); -} - -void D3D7_Set2D (void) -{ - int r; - float m[16]; - D3DVIEWPORT7 vport; -// pD3DDev->lpVtbl->EndScene(pD3DDev); - - D3DXMatrixOrthoOffCenter((D3DXMATRIX*)m, 0, vid.width, vid.height, 0, -100, 100); - r = pD3DDev->lpVtbl->SetTransform(pD3DDev, D3DTRANSFORMSTATE_PROJECTION, (D3DMATRIX*)m); - - D3DXMatrixIdentity((D3DXMATRIX*)m); - r = pD3DDev->lpVtbl->SetTransform(pD3DDev, D3DTRANSFORMSTATE_WORLD, (D3DMATRIX*)m); - - D3DXMatrixIdentity((D3DXMATRIX*)m); - pD3DDev->lpVtbl->SetTransform(pD3DDev, D3DTRANSFORMSTATE_VIEW, (D3DMATRIX*)m); - - pD3DDev->lpVtbl->SetRenderState(pD3DDev, D3DRENDERSTATE_CULLMODE, D3DCULL_CCW ); - - pD3DDev->lpVtbl->SetRenderState(pD3DDev, D3DRENDERSTATE_ZFUNC, D3DCMP_ALWAYS); - pD3DDev->lpVtbl->SetRenderState(pD3DDev, D3DRENDERSTATE_ZENABLE, D3DZB_FALSE); - - pD3DDev->lpVtbl->SetTextureStageState(pD3DDev, 0, D3DTSS_MAGFILTER, D3DTFG_LINEAR); - pD3DDev->lpVtbl->SetTextureStageState(pD3DDev, 1, D3DTSS_MAGFILTER, D3DTFG_LINEAR); - - pD3DDev->lpVtbl->SetTextureStageState(pD3DDev, 0, D3DTSS_MIPFILTER, D3DTFP_LINEAR); - pD3DDev->lpVtbl->SetTextureStageState(pD3DDev, 1, D3DTSS_MIPFILTER, D3DTFP_LINEAR); - - pD3DDev->lpVtbl->SetTextureStageState(pD3DDev, 0, D3DTSS_MINFILTER, D3DTFN_LINEAR); - pD3DDev->lpVtbl->SetTextureStageState(pD3DDev, 1, D3DTSS_MINFILTER, D3DTFN_LINEAR); - - vport.dwX = 0; - vport.dwY = 0; - pD3DX->lpVtbl->GetBufferSize((void*)pD3DX, &vport.dwWidth, &vport.dwHeight); - vport.dvMinZ = 0; - vport.dvMaxZ = 1; - pD3DDev->lpVtbl->SetViewport(pD3DDev, &vport); - -// pD3DDev->lpVtbl->BeginScene(pD3DDev); -} - -void D3D7_GetBufferSize(int *width, int *height) -{ - pD3DX->lpVtbl->GetBufferSize((void*)pD3DX, width, height); -} - - -void (D3D7_SCR_UpdateScreen) (void) -{ - extern cvar_t vid_conheight; - int uimenu; -#ifdef TEXTEDITOR - extern qboolean editormodal; -#endif - qboolean nohud; - RSpeedMark(); - - if (block_drawing) - { - RSpeedEnd(RSPEED_TOTALREFRESH); - return; - } - - vid.numpages = 2;// + gl_triplebuffer.value; - - scr_copytop = 0; - scr_copyeverything = 0; - - if (scr_disabled_for_loading) - { - extern float scr_disabled_time; - if (Sys_DoubleTime() - scr_disabled_time > 60 || key_dest != key_game) - { - scr_disabled_for_loading = false; - } - else - { - pD3DDev->lpVtbl->BeginScene(pD3DDev); - scr_drawloading = true; - SCR_DrawLoading (); - scr_drawloading = false; - pD3DDev->lpVtbl->EndScene(pD3DDev); - pD3DX->lpVtbl->UpdateFrame((void*)pD3DX, 0); - RSpeedEnd(RSPEED_TOTALREFRESH); - return; - } - } - - if (!scr_initialized || !con_initialized) - { - RSpeedEnd(RSPEED_TOTALREFRESH); - return; // not initialized yet - } - - { - extern cvar_t vid_conwidth, vid_conheight; - vid.conwidth = vid_conwidth.value; - vid.conheight = vid_conheight.value; - if (vid.width != vid.conwidth || vid.height != vid.conheight) - vid.recalc_refdef = true; - vid.width = vid.conwidth; - vid.height = vid.conheight; - } - - -#ifdef VM_UI - uimenu = UI_MenuState(); -#else - uimenu = 0; -#endif - - pD3DDev->lpVtbl->BeginScene(pD3DDev); - D3D7_Set2D (); -/* -#ifdef TEXTEDITOR - if (editormodal) - { - Editor_Draw(); - GLV_UpdatePalette (false, host_frametime); -#if defined(_WIN32) && defined(RGLQUAKE) - Media_RecordFrame(); -#endif - GLR_BrightenScreen(); - - if (key_dest == key_console) - Con_DrawConsole(vid_conheight.value/2, false); - GL_EndRendering (); - GL_DoSwap(); - RSpeedEnd(RSPEED_TOTALREFRESH); - return; - } -#endif -*/ - if (Media_ShowFilm()) - { - M_Draw(0); -// GLV_UpdatePalette (false, host_frametime); -#if defined(_WIN32) - Media_RecordFrame(); -#endif -// GLR_BrightenScreen(); - pD3DDev->lpVtbl->EndScene(pD3DDev); - pD3DX->lpVtbl->UpdateFrame((void*)pD3DX, 0); - - pD3DX->lpVtbl->SetClearColor((void*)pD3DX, rand()); - pD3DX->lpVtbl->Clear((void*)pD3DX, D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER); - -// pD3DDev->lpVtbl->BeginScene(pD3DDev); - - RSpeedEnd(RSPEED_TOTALREFRESH); - return; - } - - // - // determine size of refresh window - // - if (vid.recalc_refdef) - SCR_CalcRefdef (); - -// -// do 3D refresh drawing, and then update the screen -// - SCR_SetUpToDrawConsole (); - - nohud = false; - -#ifdef VM_CG - if (CG_Refresh()) - nohud = true; - else -#endif -#ifdef CSQC_DAT - if (cls.state == ca_active && CSQC_DrawView()) - nohud = true; - else -#endif - if (r_worldentity.model && uimenu != 1) - { - V_RenderView (); -// Q1BSP_TestClipDecal(); - } - - - D3D7_Set2D (); - -// GLR_BrightenScreen(); - - if (!nohud) - SCR_TileClear (); - - SCR_DrawTwoDimensional(uimenu, nohud); - -// GLV_UpdatePalette (false, host_frametime); -#if defined(_WIN32) && defined(RGLQUAKE) - Media_RecordFrame(); -#endif - - RSpeedEnd(RSPEED_TOTALREFRESH); - RSpeedShow(); - - - - pD3DDev->lpVtbl->EndScene(pD3DDev); - pD3DX->lpVtbl->UpdateFrame((void*)pD3DX, 0); - - - pD3DX->lpVtbl->SetClearColor((void*)pD3DX, rand()); - pD3DX->lpVtbl->Clear((void*)pD3DX, D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER); - - - window_center_x = (window_rect.left + window_rect.right)/2; - window_center_y = (window_rect.top + window_rect.bottom)/2; - - - - if (modestate == MS_WINDOWED) - { - extern int mouseusedforgui; - extern qboolean mouseactive; - if (!_windowed_mouse.value) - { - if (mouseactive) - { - IN_DeactivateMouse (); - IN_ShowMouse (); - } - } - else - { - if ((key_dest == key_game||mouseusedforgui) && !mouseactive && ActiveApp) - { - IN_ActivateMouse (); - IN_HideMouse (); - } - else if (mouseactive && key_dest == key_console) - {//!(key_dest == key_game || mouseusedforgui)) { - IN_DeactivateMouse (); - IN_ShowMouse (); - } - } - } -} - - - - - -mpic_t *(D3D7_Draw_SafePicFromWad) (char *name); -mpic_t *(D3D7_Draw_CachePic) (char *path); -mpic_t *(D3D7_Draw_SafeCachePic) (char *path); -void (D3D7_Draw_Init) (void); -void (D3D7_Draw_ReInit) (void); -void (D3D7_Draw_Character) (int x, int y, unsigned int num); -void (D3D7_Draw_ColouredCharacter) (int x, int y, unsigned int num); -void (D3D7_Draw_String) (int x, int y, const qbyte *str); -void (D3D7_Draw_Alt_String) (int x, int y, const qbyte *str); -void (D3D7_Draw_Crosshair) (void); -void (D3D7_Draw_DebugChar) (qbyte num); -void (D3D7_Draw_Pic) (int x, int y, mpic_t *pic); -void (D3D7_Draw_ScalePic) (int x, int y, int width, int height, mpic_t *pic); -void (D3D7_Draw_SubPic) (int x, int y, mpic_t *pic, int srcx, int srcy, int width, int height); -void (D3D7_Draw_TransPic) (int x, int y, mpic_t *pic); -void (D3D7_Draw_TransPicTranslate) (int x, int y, int w, int h, qbyte *pic, qbyte *translation); -void (D3D7_Draw_ConsoleBackground) (int lines); -void (D3D7_Draw_EditorBackground) (int lines); -void (D3D7_Draw_TileClear) (int x, int y, int w, int h); -void (D3D7_Draw_Fill) (int x, int y, int w, int h, int c); -void (D3D7_Draw_FillRGB) (int x, int y, int w, int h, float r, float g, float b); -void (D3D7_Draw_FadeScreen) (void); -void (D3D7_Draw_BeginDisc) (void); -void (D3D7_Draw_EndDisc) (void); - -void (D3D7_Draw_Image) (float x, float y, float w, float h, float s1, float t1, float s2, float t2, mpic_t *pic); //gl-style scaled/coloured/subpic -void (D3D7_Draw_ImageColours) (float r, float g, float b, float a); - -void (D3D7_R_Init) (void); -void (D3D7_R_DeInit) (void); -void (D3D7_R_ReInit) (void); -void (D3D7_R_RenderView) (void); // must set r_refdef first - -qboolean (D3D7_R_CheckSky) (void); -void (D3D7_R_SetSky) (char *name, float rotate, vec3_t axis); - -void (D3D7_R_NewMap) (void); -void (D3D7_R_PreNewMap) (void); -int (D3D7_R_LightPoint) (vec3_t point); - -void (D3D7_R_PushDlights) (void); -void (D3D7_R_AddStain) (vec3_t org, float red, float green, float blue, float radius); -void (D3D7_R_LessenStains) (void); - -void (D3D7_Media_ShowFrameBGR_24_Flip) (qbyte *framedata, int inwidth, int inheight); //input is bottom up... -void (D3D7_Media_ShowFrameRGBA_32) (qbyte *framedata, int inwidth, int inheight); //top down -void (D3D7_Media_ShowFrame8bit) (qbyte *framedata, int inwidth, int inheight, qbyte *palette); //paletted topdown (framedata is 8bit indexes into palette) - -void (D3D7_Mod_Init) (void); -void (D3D7_Mod_ClearAll) (void); -struct model_s *(D3D7_Mod_ForName) (char *name, qboolean crash); -struct model_s *(D3D7_Mod_FindName) (char *name); -void *(D3D7_Mod_Extradata) (struct model_s *mod); // handles caching -void (D3D7_Mod_TouchModel) (char *name); - -void (D3D7_Mod_NowLoadExternal) (void); -void (D3D7_Mod_Think) (void); -qboolean(D3D7_Mod_GetTag) (struct model_s *model, int tagnum, int frame1, int frame2, float f2ness, float f1time, float f2time, float *result); -int (D3D7_Mod_TagNumForName) (struct model_s *model, char *name); -int (D3D7_Mod_SkinForName) (struct model_s *model, char *name); - - -qboolean (D3D7_VID_Init) (rendererstate_t *info, unsigned char *palette); -void (D3D7_VID_DeInit) (void); -void (D3D7_VID_LockBuffer) (void); -void (D3D7_VID_UnlockBuffer) (void); -void (D3D7_D_BeginDirectRect) (int x, int y, qbyte *pbitmap, int width, int height); -void (D3D7_D_EndDirectRect) (int x, int y, int width, int height); -void (D3D7_VID_ForceLockState) (int lk); -int (D3D7_VID_ForceUnlockedAndReturnState) (void); -void (D3D7_VID_SetPalette) (unsigned char *palette); -void (D3D7_VID_ShiftPalette) (unsigned char *palette); -char *(D3D7_VID_GetRGBInfo) (int prepad, int *truevidwidth, int *truevidheight); -void (D3D7_VID_SetWindowCaption) (char *msg); - -void (D3D7_SCR_UpdateScreen) (void); - - - - - - - -rendererinfo_t d3d7rendererinfo = -{ - "Direct3D7 Native", - { - "D3D7" - }, - QR_DIRECT3D, - - D3D7_Draw_SafePicFromWad, - D3D7_Draw_CachePic, - D3D7_Draw_SafeCachePic, - D3D7_Draw_Init, - D3D7_Draw_ReInit, - D3D7_Draw_Character, +#include "quakedef.h" +#ifdef D3DQUAKE +#include "winquake.h" +#include "d3dquake.h" +#include "glquake.h" + +#pragma comment(lib, "d3dx.lib") +#pragma comment(lib, "ddraw.lib") +#pragma comment(lib, "dxguid.lib") + + +#ifndef WM_XBUTTONDOWN + #define WM_XBUTTONDOWN 0x020B + #define WM_XBUTTONUP 0x020C +#endif +#ifndef MK_XBUTTON1 + #define MK_XBUTTON1 0x0020 +#endif +#ifndef MK_XBUTTON2 + #define MK_XBUTTON2 0x0040 +#endif +// copied from DarkPlaces in an attempt to grab more buttons +#ifndef MK_XBUTTON3 + #define MK_XBUTTON3 0x0080 +#endif +#ifndef MK_XBUTTON4 + #define MK_XBUTTON4 0x0100 +#endif +#ifndef MK_XBUTTON5 + #define MK_XBUTTON5 0x0200 +#endif +#ifndef MK_XBUTTON6 + #define MK_XBUTTON6 0x0400 +#endif +#ifndef MK_XBUTTON7 + #define MK_XBUTTON7 0x0800 +#endif + +#ifndef WM_INPUT + #define WM_INPUT 255 +#endif + + +int gl_bumpmappingpossible; + +static LPD3DXCONTEXT pD3DX; +static LPDIRECTDRAW7 pDD; +static LPDIRECT3D7 pD3D; +LPDIRECT3DDEVICE7 pD3DDev; +static LPDIRECTDRAWSURFACE7 pPrimary; +static LPDIRECTDRAWGAMMACONTROL pGammaControl; + + +static qboolean vid_initializing; + +extern qboolean scr_initialized; // ready to draw +extern qboolean scr_drawloading; + + +cvar_t vid_hardwaregamma; + + +HWND mainwindow; + +struct texture_s *r_notexture_mip; + +int r_framecount; + +mleaf_t *r_viewleaf; + +#define MAX_MOD_KNOWN 1024 +int mod_numknown; +model_t mod_known[MAX_MOD_KNOWN]; +model_t *loadmodel; +model_t *currentmodel; +char loadname[32]; +qbyte *mod_base; + +qboolean DDActive; + +model_t *lightmodel; +int relitsurface; + +int window_center_x, window_center_y; +RECT window_rect; +int window_x, window_y; + +qboolean r_cache_thrash; // set if thrashing the surface cache + +mpic_t *draw_disc; // also used on sbar + +#if !defined(SWQUAKE) && !defined(RGLQUAKE) +qbyte GetPaletteIndex(int red, int green, int blue) +{ + //slow, horrible method. + { + int i, best=15; + int bestdif=256*256*256, curdif; + extern qbyte *host_basepal; + qbyte *pa; + + #define _abs(x) ((x)*(x)) + + pa = host_basepal; + for (i = 0; i < 256; i++, pa+=3) + { + curdif = _abs(red - pa[0]) + _abs(green - pa[1]) + _abs(blue - pa[2]); + if (curdif < bestdif) + { + if (curdif<1) + return i; + bestdif = curdif; + best = i; + } + } + return best; + } +} +#endif + +void BuildGammaTable (float g, float c); +void D3D7_VID_GenPaletteTables (unsigned char *palette) +{ + qbyte *pal; + unsigned r,g,b; + unsigned v; + unsigned short i; + unsigned *table; + extern qbyte gammatable[256]; + + if (palette) + { + BuildGammaTable(1, 1); + + // + // 8 8 8 encoding + // + if (vid_hardwaregamma.value) + { + // don't built in the gamma table + + pal = palette; + table = d_8to24rgbtable; + for (i=0 ; i<256 ; i++) + { + r = pal[0]; + g = pal[1]; + b = pal[2]; + pal += 3; + + // v = (255<<24) + (r<<16) + (g<<8) + (b<<0); + // v = (255<<0) + (r<<8) + (g<<16) + (b<<24); + v = (255<<24) + (r<<0) + (g<<8) + (b<<16); + *table++ = v; + } + d_8to24rgbtable[255] &= 0xffffff; // 255 is transparent + } + else + { + //computer has no hardware gamma (poor suckers) increase table accordingly + + pal = palette; + table = d_8to24rgbtable; + for (i=0 ; i<256 ; i++) + { + r = gammatable[pal[0]]; + g = gammatable[pal[1]]; + b = gammatable[pal[2]]; + pal += 3; + + // v = (255<<24) + (r<<16) + (g<<8) + (b<<0); + // v = (255<<0) + (r<<8) + (g<<16) + (b<<24); + v = (255<<24) + (r<<0) + (g<<8) + (b<<16); + *table++ = v; + } + d_8to24rgbtable[255] &= 0xffffff; // 255 is transparent + } + + if (LittleLong(1) != 1) + for (i=0 ; i<256 ; i++) + d_8to24rgbtable[i] = LittleLong(d_8to24rgbtable[i]); + } +} + +#if !defined(SWQUAKE) && !defined(GLQUAKE) +void D_FlushCaches (void) +{ +} +#endif + + + + +void D3DMod_Think (void) +{ +} +void D3DMod_NowLoadExternal(void) +{ +} +void D3DMod_TouchModel (char *name) +{ +} +void *D3DMod_Extradata (struct model_s *mod) // handles caching +{ + return NULL; +} +struct model_s *D3DMod_FindName (char *name) +{ + return NULL; +} +struct model_s *D3DMod_ForName (char *name, qboolean crash) +{ + return NULL; +} +void D3DMod_ClearAll (void) +{ +} +void D3DMod_Init (void) +{ +} + + +typedef enum {MS_WINDOWED, MS_FULLSCREEN, MS_FULLDIB, MS_UNINIT} modestate_t; +static modestate_t modestate; + +qboolean D3DAppActivate(BOOL fActive, BOOL minimize) +/**************************************************************************** +* +* Function: AppActivate +* Parameters: fActive - True if app is activating +* +* Description: If the application is activating, then swap the system +* into SYSPAL_NOSTATIC mode so that our palettes will display +* correctly. +* +****************************************************************************/ +{ + static BOOL sound_active; + + if (ActiveApp == fActive && Minimized == minimize) + return false; //so windows doesn't crash us over and over again. + + ActiveApp = fActive; + Minimized = minimize; + +// enable/disable sound on focus gain/loss + if (!ActiveApp && sound_active) + { + S_BlockSound (); + sound_active = false; + } + else if (ActiveApp && !sound_active) + { + S_UnblockSound (); + sound_active = true; + } + + if (fActive) + { +/* if (modestate != MS_WINDOWED) + { + IN_ActivateMouse (); + IN_HideMouse (); +// if (vid_canalttab && vid_wassuspended) + { +// vid_wassuspended = false; +// ChangeDisplaySettings (&gdevmode, CDS_FULLSCREEN); + ShowWindow(mainwindow, SW_SHOWNORMAL); + + // Fix for alt-tab bug in NVidia drivers +// MoveWindow (mainwindow, 0, 0, gdevmode.dmPelsWidth, gdevmode.dmPelsHeight, false); + } + } + else if ((modestate == MS_WINDOWED) && _windowed_mouse.value && (key_dest == key_game || key_dest == key_menu)) + { + IN_ActivateMouse (); + IN_HideMouse (); + } +*/ + Cvar_ForceCallback(&v_gamma); + } + + if (!fActive) + { +/* if (modestate != MS_WINDOWED) + { + IN_DeactivateMouse (); + IN_ShowMouse (); +// if (vid_canalttab) +// { +// ChangeDisplaySettings (NULL, 0); +// vid_wassuspended = true; +// } + } + else if ((modestate == MS_WINDOWED) && _windowed_mouse.value) + { + IN_DeactivateMouse (); + IN_ShowMouse (); + } +*/ + Cvar_ForceCallback(&v_gamma); //wham bam thanks. +/* + if (qSetDeviceGammaRamp) + { + if (vid_desktopgamma.value) + { + HDC hDC = GetDC(GetDesktopWindow()); + qSetDeviceGammaRamp (hDC, originalgammaramps); + ReleaseDC(GetDesktopWindow(), hDC); + } + else + { + qSetDeviceGammaRamp(maindc, originalgammaramps); + } + } + */ + } + + return true; +} + + + + + +static LRESULT WINAPI D3D7_WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) +{ + LONG lRet = 1; + int fActive, fMinimized, temp; + extern unsigned int uiWheelMessage; + + if ( uMsg == uiWheelMessage ) + uMsg = WM_MOUSEWHEEL; + + switch (uMsg) + { + case WM_KILLFOCUS: + if (modestate == MS_FULLDIB) + ShowWindow(mainwindow, SW_SHOWMINNOACTIVE); + break; + + case WM_CREATE: + break; + + case WM_MOVE: + GetWindowRect(mainwindow, &window_rect); + window_x = (int) LOWORD(lParam); + window_y = (int) HIWORD(lParam); +// VID_UpdateWindowStatus (); + break; + + case WM_KEYDOWN: + case WM_SYSKEYDOWN: + if (!vid_initializing) + Key_Event (MapKey(lParam), true); + break; + + case WM_KEYUP: + case WM_SYSKEYUP: + if (!vid_initializing) + Key_Event (MapKey(lParam), false); + break; + + case WM_SYSCHAR: + // keep Alt-Space from happening + break; + + // this is complicated because Win32 seems to pack multiple mouse events into + // one update sometimes, so we always check all states and look for events + case WM_LBUTTONDOWN: + case WM_LBUTTONUP: + case WM_RBUTTONDOWN: + case WM_RBUTTONUP: + case WM_MBUTTONDOWN: + case WM_MBUTTONUP: + case WM_MOUSEMOVE: + case WM_XBUTTONDOWN: + case WM_XBUTTONUP: + temp = 0; + + if (wParam & MK_LBUTTON) + temp |= 1; + + if (wParam & MK_RBUTTON) + temp |= 2; + + if (wParam & MK_MBUTTON) + temp |= 4; + + if (wParam & MK_XBUTTON1) + temp |= 8; + + if (wParam & MK_XBUTTON2) + temp |= 16; + + if (wParam & MK_XBUTTON3) + temp |= 32; + + if (wParam & MK_XBUTTON4) + temp |= 64; + + if (wParam & MK_XBUTTON5) + temp |= 128; + + if (wParam & MK_XBUTTON6) + temp |= 256; + + if (wParam & MK_XBUTTON7) + temp |= 512; + + if (!vid_initializing) + IN_MouseEvent (temp); + + break; + + // JACK: This is the mouse wheel with the Intellimouse + // Its delta is either positive or neg, and we generate the proper + // Event. + case WM_MOUSEWHEEL: + if (!vid_initializing) + { + if ((short) HIWORD(wParam) > 0) + { + Key_Event(K_MWHEELUP, true); + Key_Event(K_MWHEELUP, false); + } + else + { + Key_Event(K_MWHEELDOWN, true); + Key_Event(K_MWHEELDOWN, false); + } + } + break; + + case WM_INPUT: + // raw input handling + IN_RawInput_MouseRead((HANDLE)lParam); + break; + + case WM_SIZE: + if (!vid_initializing) + { + GetWindowRect(mainwindow, &window_rect); + // force width/height to be updated +// glwidth = window_rect.right - window_rect.left; +// glheight = window_rect.bottom - window_rect.top; +// Cvar_ForceCallback(&vid_conautoscale); +// Cvar_ForceCallback(&vid_conwidth); + } + break; + + case WM_CLOSE: + if (!vid_initializing) + if (MessageBox (mainwindow, "Are you sure you want to quit?", "Confirm Exit", + MB_YESNO | MB_SETFOREGROUND | MB_ICONQUESTION) == IDYES) + { + Sys_Quit (); + } + + break; + + case WM_ACTIVATE: + fActive = LOWORD(wParam); + fMinimized = (BOOL) HIWORD(wParam); + if (!D3DAppActivate(!(fActive == WA_INACTIVE), fMinimized)) + break;//so, urm, tell me microsoft, what changed? + if (modestate == MS_FULLDIB) + ShowWindow(mainwindow, SW_SHOWNORMAL); + + // fix the leftover Alt from any Alt-Tab or the like that switched us away +// ClearAllStates (); + + break; + + case WM_DESTROY: + { +// if (dibwindow) +// DestroyWindow (dibwindow); + } + break; + + case MM_MCINOTIFY: + lRet = CDAudio_MessageHandler (hWnd, uMsg, wParam, lParam); + break; + + + case WM_MWHOOK: + if (!vid_initializing) + MW_Hook_Message (lParam); + break; + + default: + /* pass all unhandled messages to DefWindowProc */ + lRet = DefWindowProc (hWnd, uMsg, wParam, lParam); + break; + } + + /* return 1 if handled message, 0 if not */ + return lRet; +} + + + +qboolean D3D7_VID_Init(rendererstate_t *info, unsigned char *palette) +{ + DWORD width = info->width; + DWORD height = info->height; + DWORD bpp = info->bpp; + DWORD zbpp = 16; + DWORD flags = 0; + MSG msg; + + extern cvar_t vid_conwidth; + extern cvar_t vid_conheight; + + DDGAMMARAMP gammaramp; + char errs[1024]; + int i; + HRESULT hr; + + char *CLASSNAME = "FTED3D7QUAKE"; + WNDCLASS wc = { + 0, + &D3D7_WindowProc, + 0, + 0, + NULL, + NULL, + NULL, + NULL, + NULL, + CLASSNAME + }; + +// wc.style = 0; + wc.lpfnWndProc = D3D7_WindowProc; +// wc.cbClsExtra; +// wc.cbWndExtra; +// wc.hInstance; +// wc.hIcon; +// wc.hCursor; +// wc.hbrBackground; +// wc.lpszMenuName; + wc.lpszClassName = CLASSNAME; + + vid_initializing = true; + + if( FAILED(hr = D3DXInitialize()) ) + { + D3DXGetErrorString(hr, sizeof(errs), errs); + Con_Printf("D3D initialisation failed: error %X: %s\n", hr, errs); + return false; + } + + RegisterClass(&wc); + + flags |= info->fullscreen ? D3DX_CONTEXT_FULLSCREEN : 0; + + if (flags & D3DX_CONTEXT_FULLSCREEN) + mainwindow = CreateWindow(CLASSNAME, "Direct3D", 0, 0, 0, width, height, NULL, NULL, NULL, NULL); + else + mainwindow = CreateWindow(CLASSNAME, "Direct3D", WS_OVERLAPPEDWINDOW, 0, 0, width, height, NULL, NULL, NULL, NULL); +/* + width = vid_conwidth.value; + height = vid_conheight.value; +*/ + // Try as specified. + hr = D3DXCreateContextEx(D3DX_DEFAULT, flags, + mainwindow, NULL, bpp, 0, + zbpp, 0, 1, width, height, D3DX_DEFAULT, &pD3DX); + if( FAILED(hr) ) + { + D3DXGetErrorString(hr, sizeof(errs), errs); + printf("D3D initialisation failed: error %X: %s\n", hr, errs); + + // default z-buffer + hr = D3DXCreateContextEx(D3DX_DEFAULT, flags, + mainwindow, NULL, bpp, 0, + D3DX_DEFAULT, 0, 1, width, height, D3DX_DEFAULT, &pD3DX); + if( FAILED(hr) ) + { + // default depth and z-buffer + hr = D3DXCreateContextEx(D3DX_DEFAULT, flags, + mainwindow, NULL, D3DX_DEFAULT, 0, + D3DX_DEFAULT, 0, 1, width, height, D3DX_DEFAULT, &pD3DX); + if( FAILED(hr) ) + { + // default everything + hr = D3DXCreateContextEx(D3DX_DEFAULT, flags, + mainwindow, NULL, D3DX_DEFAULT, 0, + D3DX_DEFAULT, 0, 1, D3DX_DEFAULT, D3DX_DEFAULT, D3DX_DEFAULT, &pD3DX); + if( FAILED(hr) ) + { + D3DXGetErrorString(hr, sizeof(errs), errs); + Con_Printf("D3D fallbacks failed: error %X: %s\n", hr, errs); + + DestroyWindow(mainwindow); + mainwindow = NULL; + return false; + } + } + } + } + //the void* casts are because microsoft screwed up in the header files I have + pDD = pD3DX->lpVtbl->GetDD((void*)pD3DX); + pD3D = pD3DX->lpVtbl->GetD3D((void*)pD3DX); + pD3DDev = pD3DX->lpVtbl->GetD3DDevice((void*)pD3DX); + pPrimary = pD3DX->lpVtbl->GetPrimary((void*)pD3DX); + + while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) + { + TranslateMessage(&msg); + DispatchMessage(&msg); + } + + ShowWindow(mainwindow, SW_NORMAL); + pD3DX->lpVtbl->SetClearColor((void*)pD3DX, 0xffffffff); + pD3DX->lpVtbl->Clear((void*)pD3DX, D3DCLEAR_TARGET); + pD3DX->lpVtbl->UpdateFrame((void*)pD3DX, 0); + + + + pD3DX->lpVtbl->GetBufferSize((void*)pD3DX, &width, &height); + vid.width = width; + vid.height = height; + vid.recalc_refdef = true; + + pDD->lpVtbl->QueryInterface ((void*)pDD, &IID_IDirectDrawGammaControl, (void**)&pGammaControl); + if (pGammaControl) + { + for (i = 0; i < 256; i++) + gammaramp.red[i] = i*2; + pGammaControl->lpVtbl->SetGammaRamp(pGammaControl, 0, &gammaramp); + } + else + Con_Printf("Couldn't get gamma controls\n"); + + vid_initializing = false; + + + + + + + pD3DDev->lpVtbl->SetRenderState(pD3DDev, D3DRENDERSTATE_ALPHAFUNC, D3DCMP_GREATER ); + pD3DDev->lpVtbl->SetRenderState(pD3DDev, D3DRENDERSTATE_ALPHAREF, 0.666*256 ); + + pD3DDev->lpVtbl->SetRenderState(pD3DDev, D3DRENDERSTATE_ALPHATESTENABLE, TRUE ); + + + //pD3DDev->lpVtbl->SetRenderState(pD3DDev, D3DRENDERSTATE_DITHERENABLE, FALSE); + //pD3DDev->lpVtbl->SetRenderState(pD3DDev, D3DRENDERSTATE_SPECULARENABLE, FALSE); + //pD3DDev->lpVtbl->SetRenderState(pD3DDev, D3DRENDERSTATE_TEXTUREPERSPECTIVE, TRUE); + pD3DDev->lpVtbl->SetRenderState(pD3DDev, D3DRENDERSTATE_LIGHTING, FALSE); + + pD3DDev->lpVtbl->SetRenderState(pD3DDev, D3DRENDERSTATE_ZWRITEENABLE, TRUE); + pD3DDev->lpVtbl->SetRenderState(pD3DDev, D3DRENDERSTATE_ZVISIBLE, TRUE); + + pD3DDev->lpVtbl->SetRenderState(pD3DDev, D3DRENDERSTATE_ZFUNC, D3DCMP_LESSEQUAL); + + + GetWindowRect(mainwindow, &window_rect); + + + D3D7_VID_GenPaletteTables(palette); + + + + { + extern cvar_t vid_conwidth, vid_conheight; + vid.conwidth = vid_conwidth.value; + vid.conheight = vid_conheight.value; + if (vid.width != vid.conwidth || vid.height != vid.conheight) + vid.recalc_refdef = true; + vid.width = vid.conwidth; + vid.height = vid.conheight; + } + + return true; +} + + + +qboolean (D3D7_R_CheckSky) (void) +{ + return false; +} +void (D3D7_R_SetSky) (char *name, float rotate, vec3_t axis) +{ +} + +void (D3D7_R_NewMap) (void) +{ + extern int skytexturenum; + int i; + r_worldentity.model = cl.worldmodel; + GLR_AnimateLight(); + D3D7_BuildLightmaps(); + + P_ClearParticles(); + + skytexturenum = -1; + + for (i=0 ; inumtextures ; i++) + { + if (!cl.worldmodel->textures[i]) + continue; + if (!Q_strncmp(cl.worldmodel->textures[i]->name,"sky",3) ) + skytexturenum = i; +// if (!Q_strncmp(cl.worldmodel->textures[i]->name,"window02_1",10) ) +// mirrortexturenum = i; + cl.worldmodel->textures[i]->texturechain = NULL; + } +} + +mleaf_t *r_viewleaf, *r_oldviewleaf; +mleaf_t *r_viewleaf2, *r_oldviewleaf2; +void (D3D7_R_PreNewMap) (void) +{ + r_viewleaf = NULL; + r_oldviewleaf = NULL; + r_viewleaf2 = NULL; + r_oldviewleaf2 = NULL; +} +int (D3D7_R_LightPoint) (vec3_t point) +{ + return 0; +} + +void (D3D7_R_PushDlights) (void) +{ +} +void (D3D7_R_AddStain) (vec3_t org, float red, float green, float blue, float radius) +{ +} +void (D3D7_R_LessenStains) (void) +{ +} + +void (D3D7_Mod_Init) (void) +{ +} +void (D3D7_Mod_ClearAll) (void) +{ +} +struct model_s *(D3D7_Mod_ForName) (char *name, qboolean crash) +{ + return NULL; +} +struct model_s *(D3D7_Mod_FindName) (char *name) +{ + return NULL; +} +void *(D3D7_Mod_Extradata) (struct model_s *mod) +{ + return NULL; +} // handles caching +void (D3D7_Mod_TouchModel) (char *name) +{ +} + +void (D3D7_Mod_NowLoadExternal) (void) +{ +} +void (D3D7_Mod_Think) (void) +{ +} +qboolean(D3D7_Mod_GetTag) (struct model_s *model, int tagnum, int frame1, int frame2, float f2ness, float f1time, float f2time, float *result) +{ + return false; +} +int (D3D7_Mod_TagNumForName) (struct model_s *model, char *name) +{ + return 0; +} +int (D3D7_Mod_SkinForName) (struct model_s *model, char *name) +{ + return 0; +} + +void (D3D7_VID_DeInit) (void) +{ + if (pPrimary) + { + pPrimary->lpVtbl->Release(pPrimary); + pPrimary = NULL; + } + if (pD3DDev) + { + pD3DDev->lpVtbl->Release(pD3DDev); + pD3DDev = NULL; + } + if (pD3D) + { + pD3D->lpVtbl->Release(pD3D); + pD3D = NULL; + } + if (pDD) + { + pDD->lpVtbl->Release(pDD); + pDD = NULL; + } + if (pD3DX) + { + pD3DX->lpVtbl->Release((void*)pD3DX); + pD3DX = NULL; + } + if (mainwindow) + { + DestroyWindow(mainwindow); + mainwindow = NULL; + } +} +void (D3D7_VID_LockBuffer) (void) +{ +} +void (D3D7_VID_UnlockBuffer) (void) +{ +} +void (D3D7_D_BeginDirectRect) (int x, int y, qbyte *pbitmap, int width, int height) +{ +} +void (D3D7_D_EndDirectRect) (int x, int y, int width, int height) +{ +} +void (D3D7_VID_ForceLockState) (int lk) +{ +} +int (D3D7_VID_ForceUnlockedAndReturnState) (void) +{ + return 0; +} + +void (D3D7_VID_SetPalette) (unsigned char *palette) +{ + D3D7_VID_GenPaletteTables(palette); +} +void (D3D7_VID_ShiftPalette) (unsigned char *palette) +{ + D3D7_VID_GenPaletteTables(palette); +} +char *(D3D7_VID_GetRGBInfo) (int prepad, int *truevidwidth, int *truevidheight) +{ + return NULL; +} +void (D3D7_VID_SetWindowCaption) (char *msg) +{ + SetWindowText(mainwindow, msg); +} + +void d3d7_ortho(float *m) +{ + D3DXMatrixOrthoOffCenter((D3DXMATRIX*)m, 0, vid.width, vid.height, 0, -100, 100); +} + +void D3D7_Set2D (void) +{ + int r; + float m[16]; + D3DVIEWPORT7 vport; +// pD3DDev->lpVtbl->EndScene(pD3DDev); + + D3DXMatrixOrthoOffCenter((D3DXMATRIX*)m, 0, vid.width, vid.height, 0, -100, 100); + r = pD3DDev->lpVtbl->SetTransform(pD3DDev, D3DTRANSFORMSTATE_PROJECTION, (D3DMATRIX*)m); + + D3DXMatrixIdentity((D3DXMATRIX*)m); + r = pD3DDev->lpVtbl->SetTransform(pD3DDev, D3DTRANSFORMSTATE_WORLD, (D3DMATRIX*)m); + + D3DXMatrixIdentity((D3DXMATRIX*)m); + pD3DDev->lpVtbl->SetTransform(pD3DDev, D3DTRANSFORMSTATE_VIEW, (D3DMATRIX*)m); + + pD3DDev->lpVtbl->SetRenderState(pD3DDev, D3DRENDERSTATE_CULLMODE, D3DCULL_CCW ); + + pD3DDev->lpVtbl->SetRenderState(pD3DDev, D3DRENDERSTATE_ZFUNC, D3DCMP_ALWAYS); + pD3DDev->lpVtbl->SetRenderState(pD3DDev, D3DRENDERSTATE_ZENABLE, D3DZB_FALSE); + + pD3DDev->lpVtbl->SetTextureStageState(pD3DDev, 0, D3DTSS_MAGFILTER, D3DTFG_LINEAR); + pD3DDev->lpVtbl->SetTextureStageState(pD3DDev, 1, D3DTSS_MAGFILTER, D3DTFG_LINEAR); + + pD3DDev->lpVtbl->SetTextureStageState(pD3DDev, 0, D3DTSS_MIPFILTER, D3DTFP_LINEAR); + pD3DDev->lpVtbl->SetTextureStageState(pD3DDev, 1, D3DTSS_MIPFILTER, D3DTFP_LINEAR); + + pD3DDev->lpVtbl->SetTextureStageState(pD3DDev, 0, D3DTSS_MINFILTER, D3DTFN_LINEAR); + pD3DDev->lpVtbl->SetTextureStageState(pD3DDev, 1, D3DTSS_MINFILTER, D3DTFN_LINEAR); + + vport.dwX = 0; + vport.dwY = 0; + pD3DX->lpVtbl->GetBufferSize((void*)pD3DX, &vport.dwWidth, &vport.dwHeight); + vport.dvMinZ = 0; + vport.dvMaxZ = 1; + pD3DDev->lpVtbl->SetViewport(pD3DDev, &vport); + +// pD3DDev->lpVtbl->BeginScene(pD3DDev); +} + +void D3D7_GetBufferSize(int *width, int *height) +{ + pD3DX->lpVtbl->GetBufferSize((void*)pD3DX, width, height); +} + + +void (D3D7_SCR_UpdateScreen) (void) +{ + extern cvar_t vid_conheight; + int uimenu; +#ifdef TEXTEDITOR + extern qboolean editormodal; +#endif + qboolean nohud; + RSpeedMark(); + + if (block_drawing) + { + RSpeedEnd(RSPEED_TOTALREFRESH); + return; + } + + vid.numpages = 2;// + gl_triplebuffer.value; + + scr_copytop = 0; + scr_copyeverything = 0; + + if (scr_disabled_for_loading) + { + extern float scr_disabled_time; + if (Sys_DoubleTime() - scr_disabled_time > 60 || key_dest != key_game) + { + scr_disabled_for_loading = false; + } + else + { + pD3DDev->lpVtbl->BeginScene(pD3DDev); + scr_drawloading = true; + SCR_DrawLoading (); + scr_drawloading = false; + pD3DDev->lpVtbl->EndScene(pD3DDev); + pD3DX->lpVtbl->UpdateFrame((void*)pD3DX, 0); + RSpeedEnd(RSPEED_TOTALREFRESH); + return; + } + } + + if (!scr_initialized || !con_initialized) + { + RSpeedEnd(RSPEED_TOTALREFRESH); + return; // not initialized yet + } + + { + extern cvar_t vid_conwidth, vid_conheight; + vid.conwidth = vid_conwidth.value; + vid.conheight = vid_conheight.value; + if (vid.width != vid.conwidth || vid.height != vid.conheight) + vid.recalc_refdef = true; + vid.width = vid.conwidth; + vid.height = vid.conheight; + } + + +#ifdef VM_UI + uimenu = UI_MenuState(); +#else + uimenu = 0; +#endif + + pD3DDev->lpVtbl->BeginScene(pD3DDev); + D3D7_Set2D (); +/* +#ifdef TEXTEDITOR + if (editormodal) + { + Editor_Draw(); + GLV_UpdatePalette (false, host_frametime); +#if defined(_WIN32) && defined(RGLQUAKE) + Media_RecordFrame(); +#endif + GLR_BrightenScreen(); + + if (key_dest == key_console) + Con_DrawConsole(vid_conheight.value/2, false); + GL_EndRendering (); + GL_DoSwap(); + RSpeedEnd(RSPEED_TOTALREFRESH); + return; + } +#endif +*/ + if (Media_ShowFilm()) + { + M_Draw(0); +// GLV_UpdatePalette (false, host_frametime); +#if defined(_WIN32) + Media_RecordFrame(); +#endif +// GLR_BrightenScreen(); + pD3DDev->lpVtbl->EndScene(pD3DDev); + pD3DX->lpVtbl->UpdateFrame((void*)pD3DX, 0); + + pD3DX->lpVtbl->SetClearColor((void*)pD3DX, rand()); + pD3DX->lpVtbl->Clear((void*)pD3DX, D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER); + +// pD3DDev->lpVtbl->BeginScene(pD3DDev); + + RSpeedEnd(RSPEED_TOTALREFRESH); + return; + } + + // + // determine size of refresh window + // + if (vid.recalc_refdef) + SCR_CalcRefdef (); + +// +// do 3D refresh drawing, and then update the screen +// + SCR_SetUpToDrawConsole (); + + nohud = false; + +#ifdef VM_CG + if (CG_Refresh()) + nohud = true; + else +#endif +#ifdef CSQC_DAT + if (cls.state == ca_active && CSQC_DrawView()) + nohud = true; + else +#endif + if (r_worldentity.model && uimenu != 1) + { + V_RenderView (); +// Q1BSP_TestClipDecal(); + } + + + D3D7_Set2D (); + +// GLR_BrightenScreen(); + + if (!nohud) + SCR_TileClear (); + + SCR_DrawTwoDimensional(uimenu, nohud); + +// GLV_UpdatePalette (false, host_frametime); +#if defined(_WIN32) && defined(RGLQUAKE) + Media_RecordFrame(); +#endif + + RSpeedEnd(RSPEED_TOTALREFRESH); + RSpeedShow(); + + + + pD3DDev->lpVtbl->EndScene(pD3DDev); + pD3DX->lpVtbl->UpdateFrame((void*)pD3DX, 0); + + + pD3DX->lpVtbl->SetClearColor((void*)pD3DX, rand()); + pD3DX->lpVtbl->Clear((void*)pD3DX, D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER); + + + window_center_x = (window_rect.left + window_rect.right)/2; + window_center_y = (window_rect.top + window_rect.bottom)/2; + + + + if (modestate == MS_WINDOWED) + { + extern int mouseusedforgui; + extern qboolean mouseactive; + if (!_windowed_mouse.value) + { + if (mouseactive) + { + IN_DeactivateMouse (); + IN_ShowMouse (); + } + } + else + { + if ((key_dest == key_game||mouseusedforgui) && !mouseactive && ActiveApp) + { + IN_ActivateMouse (); + IN_HideMouse (); + } + else if (mouseactive && key_dest == key_console) + {//!(key_dest == key_game || mouseusedforgui)) { + IN_DeactivateMouse (); + IN_ShowMouse (); + } + } + } +} + + + + + +mpic_t *(D3D7_Draw_SafePicFromWad) (char *name); +mpic_t *(D3D7_Draw_CachePic) (char *path); +mpic_t *(D3D7_Draw_SafeCachePic) (char *path); +void (D3D7_Draw_Init) (void); +void (D3D7_Draw_ReInit) (void); +void (D3D7_Draw_Character) (int x, int y, unsigned int num); +void (D3D7_Draw_ColouredCharacter) (int x, int y, unsigned int num); +void (D3D7_Draw_String) (int x, int y, const qbyte *str); +void (D3D7_Draw_Alt_String) (int x, int y, const qbyte *str); +void (D3D7_Draw_Crosshair) (void); +void (D3D7_Draw_DebugChar) (qbyte num); +void (D3D7_Draw_Pic) (int x, int y, mpic_t *pic); +void (D3D7_Draw_ScalePic) (int x, int y, int width, int height, mpic_t *pic); +void (D3D7_Draw_SubPic) (int x, int y, mpic_t *pic, int srcx, int srcy, int width, int height); +void (D3D7_Draw_TransPic) (int x, int y, mpic_t *pic); +void (D3D7_Draw_TransPicTranslate) (int x, int y, int w, int h, qbyte *pic, qbyte *translation); +void (D3D7_Draw_ConsoleBackground) (int lines); +void (D3D7_Draw_EditorBackground) (int lines); +void (D3D7_Draw_TileClear) (int x, int y, int w, int h); +void (D3D7_Draw_Fill) (int x, int y, int w, int h, int c); +void (D3D7_Draw_FillRGB) (int x, int y, int w, int h, float r, float g, float b); +void (D3D7_Draw_FadeScreen) (void); +void (D3D7_Draw_BeginDisc) (void); +void (D3D7_Draw_EndDisc) (void); + +void (D3D7_Draw_Image) (float x, float y, float w, float h, float s1, float t1, float s2, float t2, mpic_t *pic); //gl-style scaled/coloured/subpic +void (D3D7_Draw_ImageColours) (float r, float g, float b, float a); + +void (D3D7_R_Init) (void); +void (D3D7_R_DeInit) (void); +void (D3D7_R_ReInit) (void); +void (D3D7_R_RenderView) (void); // must set r_refdef first + +qboolean (D3D7_R_CheckSky) (void); +void (D3D7_R_SetSky) (char *name, float rotate, vec3_t axis); + +void (D3D7_R_NewMap) (void); +void (D3D7_R_PreNewMap) (void); +int (D3D7_R_LightPoint) (vec3_t point); + +void (D3D7_R_PushDlights) (void); +void (D3D7_R_AddStain) (vec3_t org, float red, float green, float blue, float radius); +void (D3D7_R_LessenStains) (void); + +void (D3D7_Media_ShowFrameBGR_24_Flip) (qbyte *framedata, int inwidth, int inheight); //input is bottom up... +void (D3D7_Media_ShowFrameRGBA_32) (qbyte *framedata, int inwidth, int inheight); //top down +void (D3D7_Media_ShowFrame8bit) (qbyte *framedata, int inwidth, int inheight, qbyte *palette); //paletted topdown (framedata is 8bit indexes into palette) + +void (D3D7_Mod_Init) (void); +void (D3D7_Mod_ClearAll) (void); +struct model_s *(D3D7_Mod_ForName) (char *name, qboolean crash); +struct model_s *(D3D7_Mod_FindName) (char *name); +void *(D3D7_Mod_Extradata) (struct model_s *mod); // handles caching +void (D3D7_Mod_TouchModel) (char *name); + +void (D3D7_Mod_NowLoadExternal) (void); +void (D3D7_Mod_Think) (void); +qboolean(D3D7_Mod_GetTag) (struct model_s *model, int tagnum, int frame1, int frame2, float f2ness, float f1time, float f2time, float *result); +int (D3D7_Mod_TagNumForName) (struct model_s *model, char *name); +int (D3D7_Mod_SkinForName) (struct model_s *model, char *name); + + +qboolean (D3D7_VID_Init) (rendererstate_t *info, unsigned char *palette); +void (D3D7_VID_DeInit) (void); +void (D3D7_VID_LockBuffer) (void); +void (D3D7_VID_UnlockBuffer) (void); +void (D3D7_D_BeginDirectRect) (int x, int y, qbyte *pbitmap, int width, int height); +void (D3D7_D_EndDirectRect) (int x, int y, int width, int height); +void (D3D7_VID_ForceLockState) (int lk); +int (D3D7_VID_ForceUnlockedAndReturnState) (void); +void (D3D7_VID_SetPalette) (unsigned char *palette); +void (D3D7_VID_ShiftPalette) (unsigned char *palette); +char *(D3D7_VID_GetRGBInfo) (int prepad, int *truevidwidth, int *truevidheight); +void (D3D7_VID_SetWindowCaption) (char *msg); + +void (D3D7_SCR_UpdateScreen) (void); + + + + + + + +rendererinfo_t d3d7rendererinfo = +{ + "Direct3D7 Native", + { + "D3D7" + }, + QR_DIRECT3D, + + D3D7_Draw_SafePicFromWad, + D3D7_Draw_CachePic, + D3D7_Draw_SafeCachePic, + D3D7_Draw_Init, + D3D7_Draw_ReInit, + D3D7_Draw_Character, D3D7_Draw_ColouredCharacter, - NULL, - D3D7_Draw_String, - D3D7_Draw_Alt_String, - D3D7_Draw_Crosshair, - D3D7_Draw_DebugChar, - D3D7_Draw_Pic, - D3D7_Draw_ScalePic, - D3D7_Draw_SubPic, - D3D7_Draw_TransPic, - D3D7_Draw_TransPicTranslate, - D3D7_Draw_ConsoleBackground, - D3D7_Draw_EditorBackground, - D3D7_Draw_TileClear, - D3D7_Draw_Fill, - D3D7_Draw_FillRGB, - D3D7_Draw_FadeScreen, - D3D7_Draw_BeginDisc, - D3D7_Draw_EndDisc, - - D3D7_Draw_Image, - D3D7_Draw_ImageColours, - - D3D7_R_Init, - D3D7_R_DeInit, - D3D7_R_ReInit, - D3D7_R_RenderView, - - D3D7_R_CheckSky, - D3D7_R_SetSky, - - D3D7_R_NewMap, - D3D7_R_PreNewMap, - D3D7_R_LightPoint, - - D3D7_R_PushDlights, - D3D7_R_AddStain, - D3D7_R_LessenStains, - - D3D7_Media_ShowFrameBGR_24_Flip, - D3D7_Media_ShowFrameRGBA_32, - D3D7_Media_ShowFrame8bit, - - GLMod_Init, - GLMod_ClearAll, - GLMod_ForName, - GLMod_FindName, - GLMod_Extradata, - GLMod_TouchModel, - - GLMod_NowLoadExternal, - GLMod_Think, - D3D7_Mod_GetTag, - D3D7_Mod_TagNumForName, - D3D7_Mod_SkinForName, - - - D3D7_VID_Init, - D3D7_VID_DeInit, - D3D7_VID_LockBuffer, - D3D7_VID_UnlockBuffer, - D3D7_D_BeginDirectRect, - D3D7_D_EndDirectRect, - D3D7_VID_ForceLockState, - D3D7_VID_ForceUnlockedAndReturnState, - D3D7_VID_SetPalette, - D3D7_VID_ShiftPalette, - D3D7_VID_GetRGBInfo, - D3D7_VID_SetWindowCaption, - - D3D7_SCR_UpdateScreen - -}; -#endif + NULL, + D3D7_Draw_String, + D3D7_Draw_Alt_String, + D3D7_Draw_Crosshair, + D3D7_Draw_DebugChar, + D3D7_Draw_Pic, + D3D7_Draw_ScalePic, + D3D7_Draw_SubPic, + D3D7_Draw_TransPic, + D3D7_Draw_TransPicTranslate, + D3D7_Draw_ConsoleBackground, + D3D7_Draw_EditorBackground, + D3D7_Draw_TileClear, + D3D7_Draw_Fill, + D3D7_Draw_FillRGB, + D3D7_Draw_FadeScreen, + D3D7_Draw_BeginDisc, + D3D7_Draw_EndDisc, + + D3D7_Draw_Image, + D3D7_Draw_ImageColours, + + D3D7_R_Init, + D3D7_R_DeInit, + D3D7_R_ReInit, + D3D7_R_RenderView, + + D3D7_R_CheckSky, + D3D7_R_SetSky, + + D3D7_R_NewMap, + D3D7_R_PreNewMap, + D3D7_R_LightPoint, + + D3D7_R_PushDlights, + D3D7_R_AddStain, + D3D7_R_LessenStains, + + D3D7_Media_ShowFrameBGR_24_Flip, + D3D7_Media_ShowFrameRGBA_32, + D3D7_Media_ShowFrame8bit, + + GLMod_Init, + GLMod_ClearAll, + GLMod_ForName, + GLMod_FindName, + GLMod_Extradata, + GLMod_TouchModel, + + GLMod_NowLoadExternal, + GLMod_Think, + D3D7_Mod_GetTag, + D3D7_Mod_TagNumForName, + D3D7_Mod_SkinForName, + + + D3D7_VID_Init, + D3D7_VID_DeInit, + D3D7_VID_LockBuffer, + D3D7_VID_UnlockBuffer, + D3D7_D_BeginDirectRect, + D3D7_D_EndDirectRect, + D3D7_VID_ForceLockState, + D3D7_VID_ForceUnlockedAndReturnState, + D3D7_VID_SetPalette, + D3D7_VID_ShiftPalette, + D3D7_VID_GetRGBInfo, + D3D7_VID_SetWindowCaption, + + D3D7_SCR_UpdateScreen + +}; +#endif diff --git a/engine/d3d9/vid_d3d9.c b/engine/d3d9/vid_d3d9.c index 96290b59..9d975abb 100644 --- a/engine/d3d9/vid_d3d9.c +++ b/engine/d3d9/vid_d3d9.c @@ -1,1529 +1,1541 @@ -#include "quakedef.h" -#ifdef D3DQUAKE -#include "winquake.h" -#include "d3d9quake.h" - -//#include "d3d9.h" - - -//#pragma comment(lib, "../libs/dxsdk9/lib/d3d9.lib") - - -#ifndef WM_XBUTTONDOWN - #define WM_XBUTTONDOWN 0x020B - #define WM_XBUTTONUP 0x020C -#endif -#ifndef MK_XBUTTON1 - #define MK_XBUTTON1 0x0020 - #define MK_XBUTTON2 0x0040 -// copied from DarkPlaces in an attempt to grab more buttons - #define MK_XBUTTON3 0x0080 - #define MK_XBUTTON4 0x0100 - #define MK_XBUTTON5 0x0200 - #define MK_XBUTTON6 0x0400 - #define MK_XBUTTON7 0x0800 -#endif - -#ifndef WM_INPUT - #define WM_INPUT 255 -#endif - - -int gl_bumpmappingpossible; - -void D3D9_GetBufferSize(int *width, int *height); -static LPDIRECT3D9 pD3D; -LPDIRECT3DDEVICE9 pD3DDev9; -//static LPDIRECTDRAWGAMMACONTROL pGammaControl; - - -static qboolean vid_initializing; - -extern qboolean scr_initialized; // ready to draw -extern qboolean scr_drawloading; - - -cvar_t vid_hardwaregamma; - - -HWND mainwindow; - -struct texture_s *r_notexture_mip; - -int r_framecount; - -mleaf_t *r_viewleaf; - -#define MAX_MOD_KNOWN 1024 -int mod_numknown; -model_t mod_known[MAX_MOD_KNOWN]; -model_t *loadmodel; -model_t *currentmodel; -char loadname[32]; -qbyte *mod_base; - -qboolean DDActive; - -model_t *lightmodel; -int relitsurface; - -int window_center_x, window_center_y; -RECT window_rect; -int window_x, window_y; - -qboolean r_cache_thrash; // set if thrashing the surface cache - -mpic_t *draw_disc; // also used on sbar - -int d3d9width, d3d9height; -#if 0 -#if !defined(SWQUAKE) && !defined(RGLQUAKE) -qbyte GetPaletteIndex(int red, int green, int blue) -{ - //slow, horrible method. - { - int i, best=15; - int bestdif=256*256*256, curdif; - extern qbyte *host_basepal; - qbyte *pa; - - #define _abs(x) ((x)*(x)) - - pa = host_basepal; - for (i = 0; i < 256; i++, pa+=3) - { - curdif = _abs(red - pa[0]) + _abs(green - pa[1]) + _abs(blue - pa[2]); - if (curdif < bestdif) - { - if (curdif<1) - return i; - bestdif = curdif; - best = i; - } - } - return best; - } -} -#endif -#endif - -void BuildGammaTable (float g, float c); -void D3D9_VID_GenPaletteTables (unsigned char *palette) -{ - extern unsigned short ramps[3][256]; - qbyte *pal; - unsigned r,g,b; - unsigned v; - unsigned short i; - unsigned *table; - extern qbyte gammatable[256]; - - if (palette) - { - extern cvar_t v_contrast; - BuildGammaTable(v_gamma.value, v_contrast.value); - - // - // 8 8 8 encoding - // - if (1)//vid_hardwaregamma.value) - { - // don't built in the gamma table - - pal = palette; - table = d_8to24rgbtable; - for (i=0 ; i<256 ; i++) - { - r = pal[0]; - g = pal[1]; - b = pal[2]; - pal += 3; - - // v = (255<<24) + (r<<16) + (g<<8) + (b<<0); - // v = (255<<0) + (r<<8) + (g<<16) + (b<<24); - v = (255<<24) + (r<<0) + (g<<8) + (b<<16); - *table++ = v; - } - d_8to24rgbtable[255] &= 0xffffff; // 255 is transparent - } - else - { - //computer has no hardware gamma (poor suckers) increase table accordingly - - pal = palette; - table = d_8to24rgbtable; - for (i=0 ; i<256 ; i++) - { - r = gammatable[pal[0]]; - g = gammatable[pal[1]]; - b = gammatable[pal[2]]; - pal += 3; - - // v = (255<<24) + (r<<16) + (g<<8) + (b<<0); - // v = (255<<0) + (r<<8) + (g<<16) + (b<<24); - v = (255<<24) + (r<<0) + (g<<8) + (b<<16); - *table++ = v; - } - d_8to24rgbtable[255] &= 0xffffff; // 255 is transparent - } - - if (LittleLong(1) != 1) - { - for (i=0 ; i<256 ; i++) - d_8to24rgbtable[i] = LittleLong(d_8to24rgbtable[i]); - } - } - - if (pD3DDev9) - IDirect3DDevice9_SetGammaRamp(pD3DDev9, 0, D3DSGR_NO_CALIBRATION, (D3DGAMMARAMP *)ramps); -} -#if 0 -#if !defined(SWQUAKE) && !defined(GLQUAKE) -void D_FlushCaches (void) -{ -} -#endif -#endif - -/* - -void D3D9_Mod_Think (void) -{ -} -void D3D9_Mod_NowLoadExternal(void) -{ -} -void D3D9_Mod_TouchModel (char *name) -{ -} -void *D3D9_Mod_Extradata (struct model_s *mod) // handles caching -{ - return NULL; -} -struct model_s *D3D9_Mod_FindName (char *name) -{ - return NULL; -} -struct model_s *D3D9_Mod_ForName (char *name, qboolean crash) -{ - return NULL; -} -void D3D9_Mod_ClearAll (void) -{ -} -void D3D9_Mod_Init (void) -{ -}*/ - - -typedef enum {MS_WINDOWED, MS_FULLSCREEN, MS_FULLDIB, MS_UNINIT} modestate_t; -static modestate_t modestate; - -qboolean D3D9AppActivate(BOOL fActive, BOOL minimize) -/**************************************************************************** -* -* Function: AppActivate -* Parameters: fActive - True if app is activating -* -* Description: If the application is activating, then swap the system -* into SYSPAL_NOSTATIC mode so that our palettes will display -* correctly. -* -****************************************************************************/ -{ - static BOOL sound_active; - - if (ActiveApp == fActive && Minimized == minimize) - return false; //so windows doesn't crash us over and over again. - - ActiveApp = fActive; - Minimized = minimize; - -// enable/disable sound on focus gain/loss - if (!ActiveApp && sound_active) - { - S_BlockSound (); - sound_active = false; - } - else if (ActiveApp && !sound_active) - { - S_UnblockSound (); - sound_active = true; - } - - if (fActive) - { -/* if (modestate != MS_WINDOWED) - { - IN_ActivateMouse (); - IN_HideMouse (); -// if (vid_canalttab && vid_wassuspended) - { -// vid_wassuspended = false; -// ChangeDisplaySettings (&gdevmode, CDS_FULLSCREEN); - ShowWindow(mainwindow, SW_SHOWNORMAL); - - // Fix for alt-tab bug in NVidia drivers -// MoveWindow (mainwindow, 0, 0, gdevmode.dmPelsWidth, gdevmode.dmPelsHeight, false); - } - } - else if ((modestate == MS_WINDOWED) && _windowed_mouse.value && (key_dest == key_game || key_dest == key_menu)) - { - IN_ActivateMouse (); - IN_HideMouse (); - } -*/ - Cvar_ForceCallback(&v_gamma); - } - - if (!fActive) - { -/* if (modestate != MS_WINDOWED) - { - IN_DeactivateMouse (); - IN_ShowMouse (); -// if (vid_canalttab) -// { -// ChangeDisplaySettings (NULL, 0); -// vid_wassuspended = true; -// } - } - else if ((modestate == MS_WINDOWED) && _windowed_mouse.value) - { - IN_DeactivateMouse (); - IN_ShowMouse (); - } -*/ - Cvar_ForceCallback(&v_gamma); //wham bam thanks. -/* - if (qSetDeviceGammaRamp) - { - if (vid_desktopgamma.value) - { - HDC hDC = GetDC(GetDesktopWindow()); - qSetDeviceGammaRamp (hDC, originalgammaramps); - ReleaseDC(GetDesktopWindow(), hDC); - } - else - { - qSetDeviceGammaRamp(maindc, originalgammaramps); - } - } - */ - } - - return true; -} - - - - - -static LRESULT WINAPI D3D9_WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) -{ - LONG lRet = 1; - int fActive, fMinimized, temp; - extern unsigned int uiWheelMessage; - - if ( uMsg == uiWheelMessage ) - uMsg = WM_MOUSEWHEEL; - - switch (uMsg) - { - case WM_KILLFOCUS: - if (modestate == MS_FULLDIB) - ShowWindow(mainwindow, SW_SHOWMINNOACTIVE); - break; - - case WM_CREATE: - break; - - case WM_MOVE: - GetWindowRect(mainwindow, &window_rect); - window_x = (int) LOWORD(lParam); - window_y = (int) HIWORD(lParam); -// VID_UpdateWindowStatus (); - break; - - case WM_KEYDOWN: - case WM_SYSKEYDOWN: - if (!vid_initializing) - Key_Event (MapKey(lParam), true); - break; - - case WM_KEYUP: - case WM_SYSKEYUP: - if (!vid_initializing) - Key_Event (MapKey(lParam), false); - break; - - case WM_SYSCHAR: - // keep Alt-Space from happening - break; - - // this is complicated because Win32 seems to pack multiple mouse events into - // one update sometimes, so we always check all states and look for events - case WM_LBUTTONDOWN: - case WM_LBUTTONUP: - case WM_RBUTTONDOWN: - case WM_RBUTTONUP: - case WM_MBUTTONDOWN: - case WM_MBUTTONUP: - case WM_MOUSEMOVE: - case WM_XBUTTONDOWN: - case WM_XBUTTONUP: - temp = 0; - - if (wParam & MK_LBUTTON) - temp |= 1; - - if (wParam & MK_RBUTTON) - temp |= 2; - - if (wParam & MK_MBUTTON) - temp |= 4; - - if (wParam & MK_XBUTTON1) - temp |= 8; - - if (wParam & MK_XBUTTON2) - temp |= 16; - - if (wParam & MK_XBUTTON3) - temp |= 32; - - if (wParam & MK_XBUTTON4) - temp |= 64; - - if (wParam & MK_XBUTTON5) - temp |= 128; - - if (wParam & MK_XBUTTON6) - temp |= 256; - - if (wParam & MK_XBUTTON7) - temp |= 512; - - if (!vid_initializing) - IN_MouseEvent (temp); - - break; - - // JACK: This is the mouse wheel with the Intellimouse - // Its delta is either positive or neg, and we generate the proper - // Event. - case WM_MOUSEWHEEL: - if (!vid_initializing) - { - if ((short) HIWORD(wParam) > 0) - { - Key_Event(K_MWHEELUP, true); - Key_Event(K_MWHEELUP, false); - } - else - { - Key_Event(K_MWHEELDOWN, true); - Key_Event(K_MWHEELDOWN, false); - } - } - break; - - case WM_INPUT: - // raw input handling - IN_RawInput_MouseRead((HANDLE)lParam); - break; - - case WM_SIZE: - if (!vid_initializing) - { - GetWindowRect(mainwindow, &window_rect); - // force width/height to be updated -// glwidth = window_rect.right - window_rect.left; -// glheight = window_rect.bottom - window_rect.top; -// Cvar_ForceCallback(&vid_conautoscale); -// Cvar_ForceCallback(&vid_conwidth); - } - break; - - case WM_CLOSE: - if (!vid_initializing) - if (MessageBox (mainwindow, "Are you sure you want to quit?", "Confirm Exit", - MB_YESNO | MB_SETFOREGROUND | MB_ICONQUESTION) == IDYES) - { - Sys_Quit (); - } - - break; - - case WM_ACTIVATE: - fActive = LOWORD(wParam); - fMinimized = (BOOL) HIWORD(wParam); - if (!D3D9AppActivate(!(fActive == WA_INACTIVE), fMinimized)) - break;//so, urm, tell me microsoft, what changed? - if (modestate == MS_FULLDIB) - ShowWindow(mainwindow, SW_SHOWNORMAL); - - // fix the leftover Alt from any Alt-Tab or the like that switched us away -// ClearAllStates (); - - break; - - case WM_DESTROY: - { -// if (dibwindow) -// DestroyWindow (dibwindow); - } - break; - - case MM_MCINOTIFY: - lRet = CDAudio_MessageHandler (hWnd, uMsg, wParam, lParam); - break; - - - case WM_MWHOOK: - if (!vid_initializing) - MW_Hook_Message (lParam); - break; - - default: - /* pass all unhandled messages to DefWindowProc */ - lRet = DefWindowProc (hWnd, uMsg, wParam, lParam); - break; - } - - /* return 1 if handled message, 0 if not */ - return lRet; -} - -static D3DPRESENT_PARAMETERS d3dpp; -void resetD3D9(void) -{ - IDirect3DDevice9_Reset(pD3DDev9, &d3dpp); - - - IDirect3DDevice9_Clear(pD3DDev9, 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 255, 0), 1.0f, 0); - IDirect3DDevice9_BeginScene(pD3DDev9); - IDirect3DDevice9_EndScene(pD3DDev9); - IDirect3DDevice9_Present(pD3DDev9, NULL, NULL, NULL, NULL); - - - - - - IDirect3DDevice9_SetRenderState(pD3DDev9, D3DRS_ALPHAFUNC, D3DCMP_GREATER ); - IDirect3DDevice9_SetRenderState(pD3DDev9, D3DRS_ALPHAREF, 0.666*256 ); - - IDirect3DDevice9_SetRenderState(pD3DDev9, D3DRS_ALPHATESTENABLE, TRUE ); - - - //IDirect3DDevice9_SetRenderState(pD3DDev9, D3DRENDERSTATE_DITHERENABLE, FALSE); - //IDirect3DDevice9_SetRenderState(pD3DDev9, D3DRENDERSTATE_SPECULARENABLE, FALSE); - //IDirect3DDevice9_SetRenderState(pD3DDev9, D3DRENDERSTATE_TEXTUREPERSPECTIVE, TRUE); - IDirect3DDevice9_SetRenderState(pD3DDev9, D3DRS_LIGHTING, FALSE); - - IDirect3DDevice9_SetRenderState(pD3DDev9, D3DRS_ZWRITEENABLE, TRUE); - - IDirect3DDevice9_SetRenderState(pD3DDev9, D3DRS_ZFUNC, D3DCMP_LESSEQUAL); - -} - -#if (WINVER < 0x500) && !defined(__GNUC__) -typedef struct tagMONITORINFO -{ - DWORD cbSize; - RECT rcMonitor; - RECT rcWork; - DWORD dwFlags; -} MONITORINFO, *LPMONITORINFO; -#endif -/* -void testD3D(HWND hWnd) -{ - - D3DPRESENT_PARAMETERS d3dpp[2]; - - int i; - int numadaptors; - int err; - D3DADAPTER_IDENTIFIER9 inf; - - static HMODULE d3d9dll; - LPDIRECT3D9 (WINAPI *pDirect3DCreate9) (int version); - - if (!d3d9dll) - d3d9dll = LoadLibrary("d3d9.dll"); - if (!d3d9dll) - { - Con_Printf("Direct3d 9 does not appear to be installed\n"); - return; - } - pDirect3DCreate9 = (void*)GetProcAddress(d3d9dll, "Direct3DCreate9"); - if (!pDirect3DCreate9) - { - Con_Printf("Direct3d 9 does not appear to be installed properly\n"); - return; - } - - pD3D = pDirect3DCreate9(D3D_SDK_VERSION); // create the Direct3D interface - if (!pD3D) - return; - - for (i = 0; i < 2; i++) - { - memset(&d3dpp[0], 0, sizeof(d3dpp)); // clear out the struct for use - d3dpp[0].SwapEffect = D3DSWAPEFFECT_DISCARD; // discard old frames - d3dpp[0].hDeviceWindow = hWnd; // set the window to be used by Direct3D - d3dpp[0].BackBufferWidth = d3d9width = info->width; - d3dpp[0].BackBufferHeight = d3d9height = info->height; - d3dpp[0].MultiSampleType = info->multisample; - d3dpp[0].BackBufferCount = 3; - d3dpp[0].FullScreen_RefreshRateInHz = info->fullscreen?info->rate:0; //don't pass a rate if not fullscreen, d3d doesn't like it. - d3dpp[0].Windowed = !info->fullscreen; - - d3dpp[0].EnableAutoDepthStencil = true; - d3dpp[0].AutoDepthStencilFormat = D3DFMT_D16; - d3dpp[0].BackBufferFormat = info->fullscreen?D3DFMT_X8R8G8B8:D3DFMT_UNKNOWN; - } - - IDirect3D9_CreateDevice(pD3D, - i, - D3DDEVTYPE_HAL, - hWnd, - D3DCREATE_SOFTWARE_VERTEXPROCESSING, - &d3dpp, - &pD3DDev9); - -} -*/ -void initD3D9(HWND hWnd, rendererstate_t *info) -{ - int i; - int numadaptors; - int err; - D3DADAPTER_IDENTIFIER9 inf; - extern cvar_t _vid_wait_override; - - static HMODULE d3d9dll; - LPDIRECT3D9 (WINAPI *pDirect3DCreate9) (int version); - - if (!d3d9dll) - d3d9dll = LoadLibrary("d3d9.dll"); - if (!d3d9dll) - { - Con_Printf("Direct3d 9 does not appear to be installed\n"); - return; - } - pDirect3DCreate9 = (void*)GetProcAddress(d3d9dll, "Direct3DCreate9"); - if (!pDirect3DCreate9) - { - Con_Printf("Direct3d 9 does not appear to be installed properly\n"); - return; - } - - pD3D = pDirect3DCreate9(D3D_SDK_VERSION); // create the Direct3D interface - if (!pD3D) - return; - - numadaptors = IDirect3D9_GetAdapterCount(pD3D); - for (i = 0; i < numadaptors; i++) - { //try each adaptor in turn until we get one that actually works - memset(&d3dpp, 0, sizeof(d3dpp)); // clear out the struct for use - d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD; // discard old frames - d3dpp.hDeviceWindow = hWnd; // set the window to be used by Direct3D - d3dpp.BackBufferWidth = d3d9width = info->width; - d3dpp.BackBufferHeight = d3d9height = info->height; - d3dpp.MultiSampleType = info->multisample; - d3dpp.BackBufferCount = 3; - d3dpp.FullScreen_RefreshRateInHz = info->fullscreen?info->rate:0; //don't pass a rate if not fullscreen, d3d doesn't like it. - d3dpp.Windowed = !info->fullscreen; - - d3dpp.EnableAutoDepthStencil = true; - d3dpp.AutoDepthStencilFormat = D3DFMT_D16; - d3dpp.BackBufferFormat = info->fullscreen?D3DFMT_X8R8G8B8:D3DFMT_UNKNOWN; - - if (!*_vid_wait_override.string) - d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_DEFAULT; - else - { - if (_vid_wait_override.value == 1) - d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_ONE; - else if (_vid_wait_override.value == 2) - d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_TWO; - else if (_vid_wait_override.value == 3) - d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_THREE; - else if (_vid_wait_override.value == 4) - d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_FOUR; - else - d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE; - } - - memset(&inf, 0, sizeof(inf)); - err = IDirect3D9_GetAdapterIdentifier(pD3D, i, 0, &inf); - - // create a device class using this information and information from the d3dpp stuct - IDirect3D9_CreateDevice(pD3D, - i, - D3DDEVTYPE_HAL, - hWnd, - D3DCREATE_SOFTWARE_VERTEXPROCESSING, - &d3dpp, - &pD3DDev9); - - if (pD3DDev9) - { - HMONITOR hm; - MONITORINFO mi; - char *s; - for (s = inf.Description + strlen(inf.Description)-1; s >= inf.Description && *s <= ' '; s--) - *s = 0; - Con_Printf("D3D9: Using device %s\n", inf.Description); - - if (d3dpp.Windowed) //fullscreen we get positioned automagically. - { //windowed, we get positioned at 0,0... which is often going to be on the wrong screen - //the user can figure it out from here - static HANDLE huser32; - BOOL (WINAPI *pGetMonitorInfoA)(HMONITOR hMonitor, LPMONITORINFO lpmi); - if (!huser32) - huser32 = LoadLibrary("user32.dll"); - if (!huser32) - return; - pGetMonitorInfoA = (void*)GetProcAddress(huser32, "GetMonitorInfoA"); - if (!pGetMonitorInfoA) - return; - - hm = IDirect3D9_GetAdapterMonitor(pD3D, i); - memset(&mi, 0, sizeof(mi)); - mi.cbSize = sizeof(mi); - pGetMonitorInfoA(hm, &mi); - MoveWindow(d3dpp.hDeviceWindow, mi.rcWork.left, mi.rcWork.top, d3dpp.BackBufferWidth, d3dpp.BackBufferHeight, false); - } - return; //successful - } - } - - - Con_Printf("IDirect3D9_CreateDevice failed\n"); - - - return; -} - -qboolean D3D9_VID_Init(rendererstate_t *info, unsigned char *palette) -{ - DWORD width = info->width; - DWORD height = info->height; - DWORD bpp = info->bpp; - DWORD zbpp = 16; - DWORD flags = 0; - MSG msg; - - extern cvar_t vid_conwidth; - extern cvar_t vid_conheight; - - //DDGAMMARAMP gammaramp; - //int i; - - char *CLASSNAME = "FTED3D9QUAKE"; - WNDCLASS wc = { - 0, - &D3D9_WindowProc, - 0, - 0, - NULL, - NULL, - NULL, - NULL, - NULL, - CLASSNAME - }; - - vid_initializing = true; - - RegisterClass(&wc); - - if (info->fullscreen) - mainwindow = CreateWindow(CLASSNAME, "Direct3D", 0, 0, 0, width, height, NULL, NULL, NULL, NULL); - else - mainwindow = CreateWindow(CLASSNAME, "Direct3D", WS_OVERLAPPEDWINDOW, 0, 0, width, height, NULL, NULL, NULL, NULL); -/* - width = vid_conwidth.value; - height = vid_conheight.value; -*/ - // Try as specified. - - initD3D9(mainwindow, info); - if (!pD3DDev9) - return false; - - - - while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) - { - TranslateMessage(&msg); - DispatchMessage(&msg); - } - - ShowWindow(mainwindow, SW_NORMAL); - //IDirect3DDevice9_Clear(pD3DDev9, 0, NULL, D3DCLEAR_TARGET, 0xffffffff, 1, 0); - //IDirect3DDevice9_Present(pD3DDev9, NULL, NULL, NULL, NULL); - - IDirect3DDevice9_Clear(pD3DDev9, 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 0, 0), 1.0f, 0); - IDirect3DDevice9_BeginScene(pD3DDev9); - IDirect3DDevice9_EndScene(pD3DDev9); - IDirect3DDevice9_Present(pD3DDev9, NULL, NULL, NULL, NULL); - - - -// pD3DX->lpVtbl->GetBufferSize((void*)pD3DX, &width, &height); - vid.width = width; - vid.height = height; - vid.recalc_refdef = true; - -// pDD->lpVtbl->QueryInterface ((void*)pDD, &IID_IDirectDrawGammaControl, (void**)&pGammaControl); -/* if (pGammaControl) - { - for (i = 0; i < 256; i++) - gammaramp.red[i] = i*2; - pGammaControl->lpVtbl->SetGammaRamp(pGammaControl, 0, &gammaramp); - } - else*/ - Con_Printf("Couldn't get gamma controls\n"); - - vid_initializing = false; - - - -resetD3D9();/* - - - IDirect3DDevice9_SetRenderState(pD3DDev9, D3DRS_ALPHAFUNC, D3DCMP_GREATER ); - IDirect3DDevice9_SetRenderState(pD3DDev9, D3DRS_ALPHAREF, 0.666*256 ); - - IDirect3DDevice9_SetRenderState(pD3DDev9, D3DRS_ALPHATESTENABLE, TRUE ); - - - //IDirect3DDevice9_SetRenderState(pD3DDev9, D3DRENDERSTATE_DITHERENABLE, FALSE); - //IDirect3DDevice9_SetRenderState(pD3DDev9, D3DRENDERSTATE_SPECULARENABLE, FALSE); - //IDirect3DDevice9_SetRenderState(pD3DDev9, D3DRENDERSTATE_TEXTUREPERSPECTIVE, TRUE); - IDirect3DDevice9_SetRenderState(pD3DDev9, D3DRS_LIGHTING, FALSE); - - IDirect3DDevice9_SetRenderState(pD3DDev9, D3DRS_ZWRITEENABLE, TRUE); - - IDirect3DDevice9_SetRenderState(pD3DDev9, D3DRS_ZFUNC, D3DCMP_LESSEQUAL); - -*/ - GetWindowRect(mainwindow, &window_rect); - - - D3D9_VID_GenPaletteTables(palette); - - { - extern qboolean mouseactive; - mouseactive = false; - } - - { - extern cvar_t v_contrast; - void GLV_Gamma_Callback(struct cvar_s *var, char *oldvalue); - Cvar_Hook(&v_gamma, GLV_Gamma_Callback); - Cvar_Hook(&v_contrast, GLV_Gamma_Callback); - - Cvar_ForceCallback(&v_gamma); - } - - { - extern cvar_t vid_conwidth, vid_conheight; - vid.conwidth = vid_conwidth.value; - vid.conheight = vid_conheight.value; - if (vid.width != vid.conwidth || vid.height != vid.conheight) - vid.recalc_refdef = true; - vid.width = vid.conwidth; - vid.height = vid.conheight; - } - - return true; -} - - - -qboolean (D3D9_R_CheckSky) (void) -{ - return false; -} -void (D3D9_R_SetSky) (char *name, float rotate, vec3_t axis) -{ -} - -void (D3D9_R_NewMap) (void) -{ - extern int skytexturenum; - int i; - r_worldentity.model = cl.worldmodel; - GLR_AnimateLight(); - D3D9_BuildLightmaps(); - - P_ClearParticles(); - - skytexturenum = -1; - - for (i=0 ; inumtextures ; i++) - { - if (!cl.worldmodel->textures[i]) - continue; - if (!Q_strncmp(cl.worldmodel->textures[i]->name,"sky",3) ) - skytexturenum = i; -// if (!Q_strncmp(cl.worldmodel->textures[i]->name,"window02_1",10) ) -// mirrortexturenum = i; - cl.worldmodel->textures[i]->texturechain = NULL; - } -} - -extern mleaf_t *r_viewleaf, *r_oldviewleaf; -extern mleaf_t *r_viewleaf2, *r_oldviewleaf2; -void (D3D9_R_PreNewMap) (void) -{ - r_viewleaf = NULL; - r_oldviewleaf = NULL; - r_viewleaf2 = NULL; - r_oldviewleaf2 = NULL; -} -int (D3D9_R_LightPoint) (vec3_t point) -{ - return 0; -} - -void (D3D9_R_PushDlights) (void) -{ -} -void (D3D9_R_AddStain) (vec3_t org, float red, float green, float blue, float radius) -{ -} -void (D3D9_R_LessenStains) (void) -{ -} - -void (D3D9_Mod_Init) (void) -{ -} -void (D3D9_Mod_ClearAll) (void) -{ -} -struct model_s *(D3D9_Mod_ForName) (char *name, qboolean crash) -{ - return NULL; -} -struct model_s *(D3D9_Mod_FindName) (char *name) -{ - return NULL; -} -void *(D3D9_Mod_Extradata) (struct model_s *mod) -{ - return NULL; -} // handles caching -void (D3D9_Mod_TouchModel) (char *name) -{ -} - -void (D3D9_Mod_NowLoadExternal) (void) -{ -} -void (D3D9_Mod_Think) (void) -{ -} - -int (D3D9_Mod_SkinForName) (struct model_s *model, char *name) -{ - return 0; -} - -void (D3D9_VID_DeInit) (void) -{ - if (pD3DDev9) - { - IDirect3DDevice9_Release(pD3DDev9); - pD3DDev9 = NULL; - } - if (pD3D) - { - IDirect3D9_Release(pD3D); - pD3D = NULL; - } - if (mainwindow) - { - DestroyWindow(mainwindow); - mainwindow = NULL; - } -} -void (D3D9_VID_LockBuffer) (void) -{ -} -void (D3D9_VID_UnlockBuffer) (void) -{ -} -void (D3D9_D_BeginDirectRect) (int x, int y, qbyte *pbitmap, int width, int height) -{ -} -void (D3D9_D_EndDirectRect) (int x, int y, int width, int height) -{ -} -void (D3D9_VID_ForceLockState) (int lk) -{ -} -int (D3D9_VID_ForceUnlockedAndReturnState) (void) -{ - return 0; -} - -void (D3D9_VID_SetPalette) (unsigned char *palette) -{ - D3D9_VID_GenPaletteTables(palette); -} -void (D3D9_VID_ShiftPalette) (unsigned char *palette) -{ - D3D9_VID_GenPaletteTables(palette); -} -char *(D3D9_VID_GetRGBInfo) (int prepad, int *truevidwidth, int *truevidheight) -{ - return NULL; -} -void (D3D9_VID_SetWindowCaption) (char *msg) -{ - SetWindowText(mainwindow, msg); -} - -#if 0 -#undef IDirect3DDevice9_SetRenderState -void IDirect3DDevice9_SetRenderState(void *pD3DDev9, int D3DRS, int param) -{ -} -#endif - -void D3D9_Set2D (void) -{ - float m[16]; - D3DVIEWPORT9 vport; -// IDirect3DDevice9_EndScene(pD3DDev9); - - Matrix4_Orthographic(m, 0, vid.width, vid.height, 0, -100, 100); - d3d7_ortho(m); - IDirect3DDevice9_SetTransform(pD3DDev9, D3DTS_PROJECTION, (D3DMATRIX*)m); - - Matrix4_Identity(m); - IDirect3DDevice9_SetTransform(pD3DDev9, D3DTS_WORLD, (D3DMATRIX*)m); - - Matrix4_Identity(m); - IDirect3DDevice9_SetTransform(pD3DDev9, D3DTS_VIEW, (D3DMATRIX*)m); - - IDirect3DDevice9_SetRenderState(pD3DDev9, D3DRS_CULLMODE, D3DCULL_CCW ); - - IDirect3DDevice9_SetRenderState(pD3DDev9, D3DRS_ZFUNC, D3DCMP_ALWAYS); - IDirect3DDevice9_SetRenderState(pD3DDev9, D3DRS_ZENABLE, D3DZB_FALSE); - - IDirect3DDevice9_SetSamplerState(pD3DDev9, 0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR ); - IDirect3DDevice9_SetSamplerState(pD3DDev9, 1, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR ); - - IDirect3DDevice9_SetSamplerState(pD3DDev9, 0, D3DSAMP_MIPFILTER, D3DTEXF_NONE ); - IDirect3DDevice9_SetSamplerState(pD3DDev9, 1, D3DSAMP_MIPFILTER, D3DTEXF_NONE ); - - IDirect3DDevice9_SetSamplerState(pD3DDev9, 0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR ); - IDirect3DDevice9_SetSamplerState(pD3DDev9, 1, D3DSAMP_MINFILTER, D3DTEXF_LINEAR ); - - vport.X = 0; - vport.Y = 0; - D3D9_GetBufferSize(&vport.Width, &vport.Height); - vport.MinZ = 0; - vport.MaxZ = 1; - IDirect3DDevice9_SetViewport(pD3DDev9, &vport); - -// IDirect3DDevice9_BeginScene(pD3DDev9); -} - -void D3D9_GetBufferSize(int *width, int *height) -{ - *width = d3d9width;//vid.width; - *height = d3d9height;//vid.height; -// IDirect3DDevice9_GetBufferSize((void*)pD3DX, width, height); -} - -int d3d9error(int i) -{ - if (FAILED(i))// != D3D_OK) - Con_Printf("D3D error: %x %i\n", i); - return i; -} - -typedef struct { - float x, y, z; - unsigned int colour; -} d3d9bsvert_t; -void D3D9_BrightenScreen (void) -{ - d3d9bsvert_t d3d9bsvert[4]; -index_t d3d9quadindexes[6] = { - 0, 1, 2, - 0, 2, 3 -}; - -extern cvar_t gl_contrast; - float f; - unsigned int colour; - - RSpeedMark(); - - if (gl_contrast.value <= 1.0) - return; - - f = gl_contrast.value; - f = min (f, 3); - - IDirect3DDevice9_SetTexture (pD3DDev9, 0, NULL); - IDirect3DDevice9_SetRenderState(pD3DDev9, D3DRS_ALPHABLENDENABLE, TRUE); - IDirect3DDevice9_SetRenderState(pD3DDev9, D3DRS_SRCBLEND, D3DBLEND_DESTCOLOR); - IDirect3DDevice9_SetRenderState(pD3DDev9, D3DRS_DESTBLEND, D3DBLEND_ONE); - - while (f > 1) - { - if (f >= 2) - colour = 0xffffffff; - else - { - colour = (f-1)*255; - colour = (colour * 0x010101) | 0xff000000; - } - - - d3d9bsvert[0].x = 0; - d3d9bsvert[0].y = 0; - d3d9bsvert[0].z = 0; - d3d9bsvert[0].colour = colour; - - d3d9bsvert[1].x = vid.width; - d3d9bsvert[1].y = 0; - d3d9bsvert[1].z = 0; - d3d9bsvert[1].colour = colour; - - d3d9bsvert[2].x = vid.width; - d3d9bsvert[2].y = vid.height; - d3d9bsvert[2].z = 0; - d3d9bsvert[2].colour = colour; - - d3d9bsvert[3].x = 0; - d3d9bsvert[3].y = vid.height; - d3d9bsvert[3].z = 0; - d3d9bsvert[3].colour = colour; - - IDirect3DDevice9_SetFVF(pD3DDev9, D3DFVF_XYZ|D3DFVF_DIFFUSE); - IDirect3DDevice9_DrawIndexedPrimitiveUP(pD3DDev9, D3DPT_TRIANGLELIST, 0, 4, 2, d3d9quadindexes, D3DFMT_QINDEX, d3d9bsvert, sizeof(d3d9bsvert[0])); - - - f *= 0.5; - } - - IDirect3DDevice9_SetRenderState(pD3DDev9, D3DRS_SRCBLEND, D3DBLEND_SRCALPHA); - IDirect3DDevice9_SetRenderState(pD3DDev9, D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA); - IDirect3DDevice9_SetRenderState(pD3DDev9, D3DRS_ALPHABLENDENABLE, FALSE); - - RSpeedEnd(RSPEED_PALETTEFLASHES); -} - -void (D3D9_SCR_UpdateScreen) (void) -{ - extern int keydown[]; - extern cvar_t vid_conheight; - int uimenu; -#ifdef TEXTEDITOR - extern qboolean editormodal; -#endif - qboolean nohud; - RSpeedMark(); - - switch (IDirect3DDevice9_TestCooperativeLevel(pD3DDev9)) - { - case D3DERR_DEVICELOST: - //the user has task switched away from us or something - return; - case D3DERR_DEVICENOTRESET: - resetD3D9(); - if (FAILED(IDirect3DDevice9_TestCooperativeLevel(pD3DDev9))) - Sys_Error("D3D9 Device lost. Additionally restoration failed.\n"); - // D3DSucks(); - // scr_disabled_for_loading = false; - - VID_ShiftPalette (NULL); - break; - default: - break; - } - - - if (keydown['k']) - { - d3d9error(IDirect3DDevice9_Clear(pD3DDev9, 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(rand()&255, rand()&255, rand()&255), 1.0f, 0)); - d3d9error(IDirect3DDevice9_BeginScene(pD3DDev9)); - d3d9error(IDirect3DDevice9_EndScene(pD3DDev9)); - d3d9error(IDirect3DDevice9_Present(pD3DDev9, NULL, NULL, NULL, NULL)); - - VID_ShiftPalette (NULL); - } - - - if (block_drawing) - { - RSpeedEnd(RSPEED_TOTALREFRESH); - return; - } - - vid.numpages = 2;// + gl_triplebuffer.value; - - scr_copytop = 0; - scr_copyeverything = 0; - - if (scr_disabled_for_loading) - { - extern float scr_disabled_time; - if (Sys_DoubleTime() - scr_disabled_time > 60 || key_dest != key_game) - { - scr_disabled_for_loading = false; - } - else - { - IDirect3DDevice9_BeginScene(pD3DDev9); - scr_drawloading = true; - SCR_DrawLoading (); - scr_drawloading = false; - IDirect3DDevice9_EndScene(pD3DDev9); - IDirect3DDevice9_Present(pD3DDev9, NULL, NULL, NULL, NULL); - RSpeedEnd(RSPEED_TOTALREFRESH); - return; - } - } - - if (!scr_initialized || !con_initialized) - { - RSpeedEnd(RSPEED_TOTALREFRESH); - return; // not initialized yet - } - - { - extern cvar_t vid_conwidth, vid_conheight; - vid.conwidth = vid_conwidth.value; - vid.conheight = vid_conheight.value; - if (vid.width != vid.conwidth || vid.height != vid.conheight) - vid.recalc_refdef = true; - vid.width = vid.conwidth; - vid.height = vid.conheight; - } - - -#ifdef VM_UI - uimenu = UI_MenuState(); -#else - uimenu = 0; -#endif - - d3d9error(IDirect3DDevice9_BeginScene(pD3DDev9)); - D3D9_Set2D (); -/* -#ifdef TEXTEDITOR - if (editormodal) - { - Editor_Draw(); - GLV_UpdatePalette (false, host_frametime); -#if defined(_WIN32) && defined(RGLQUAKE) - Media_RecordFrame(); -#endif - GLR_BrightenScreen(); - - if (key_dest == key_console) - Con_DrawConsole(vid_conheight.value/2, false); - GL_EndRendering (); - GL_DoSwap(); - RSpeedEnd(RSPEED_TOTALREFRESH); - return; - } -#endif -*/ - if (Media_ShowFilm()) - { - M_Draw(0); -// GLV_UpdatePalette (false, host_frametime); -#if defined(_WIN32) - Media_RecordFrame(); -#endif -// GLR_BrightenScreen(); - IDirect3DDevice9_EndScene(pD3DDev9); - IDirect3DDevice9_Present(pD3DDev9, NULL, NULL, NULL, NULL); - - d3d9error(IDirect3DDevice9_Clear(pD3DDev9, 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(rand()&255, rand()&255, rand()&255), 1, 0)); - -// pD3DDev->lpVtbl->BeginScene(pD3DDev); - - RSpeedEnd(RSPEED_TOTALREFRESH); - return; - } - - // - // determine size of refresh window - // - if (vid.recalc_refdef) - SCR_CalcRefdef (); - -// -// do 3D refresh drawing, and then update the screen -// - SCR_SetUpToDrawConsole (); - - nohud = false; - -#ifdef VM_CG - if (CG_Refresh()) - nohud = true; - else -#endif -#ifdef CSQC_DAT - if (cls.state == ca_active && CSQC_DrawView()) - nohud = true; - else -#endif - if (r_worldentity.model && uimenu != 1) - { - V_RenderView (); -// Q1BSP_TestClipDecal(); - } - - - D3D9_Set2D (); - - D3D9_BrightenScreen(); - - if (!nohud) - SCR_TileClear (); - - SCR_DrawTwoDimensional(uimenu, nohud); - - GLV_UpdatePalette (false, host_frametime); -#if defined(_WIN32) && defined(RGLQUAKE) - Media_RecordFrame(); -#endif - - RSpeedEnd(RSPEED_TOTALREFRESH); - RSpeedShow(); - - - - d3d9error(IDirect3DDevice9_EndScene(pD3DDev9)); - d3d9error(IDirect3DDevice9_Present(pD3DDev9, NULL, NULL, NULL, NULL)); - - - - d3d9error(IDirect3DDevice9_Clear(pD3DDev9, 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 0, rand()&255), 1, 0)); - d3d9error(IDirect3DDevice9_Clear(pD3DDev9, 0, NULL, D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(rand()&255, rand()&255, rand()&255), 1, 0)); - - window_center_x = (window_rect.left + window_rect.right)/2; - window_center_y = (window_rect.top + window_rect.bottom)/2; - - - - if (modestate == MS_WINDOWED) - { - extern int mouseusedforgui; - extern qboolean mouseactive; - qboolean wantactive; - - wantactive = _windowed_mouse.value && (key_dest == key_game||mouseusedforgui) && ActiveApp; - if (wantactive != mouseactive) - { - if (!mouseactive) - { - IN_ActivateMouse (); - IN_HideMouse (); - } - else - { - IN_DeactivateMouse (); - IN_ShowMouse (); - } - } - } - - VID_ShiftPalette (NULL); -} - - - - - -mpic_t *(D3D9_Draw_SafePicFromWad) (char *name); -mpic_t *(D3D9_Draw_CachePic) (char *path); -mpic_t *(D3D9_Draw_SafeCachePic) (char *path); -void (D3D9_Draw_Init) (void); -void (D3D9_Draw_ReInit) (void); -void (D3D9_Draw_Character) (int x, int y, unsigned int num); -void (D3D9_Draw_ColouredCharacter) (int x, int y, unsigned int num); -void (D3D9_Draw_String) (int x, int y, const qbyte *str); -void (D3D9_Draw_Alt_String) (int x, int y, const qbyte *str); -void (D3D9_Draw_Crosshair) (void); -void (D3D9_Draw_DebugChar) (qbyte num); -void (D3D9_Draw_Pic) (int x, int y, mpic_t *pic); -void (D3D9_Draw_ScalePic) (int x, int y, int width, int height, mpic_t *pic); -void (D3D9_Draw_SubPic) (int x, int y, mpic_t *pic, int srcx, int srcy, int width, int height); -void (D3D9_Draw_TransPic) (int x, int y, mpic_t *pic); -void (D3D9_Draw_TransPicTranslate) (int x, int y, int w, int h, qbyte *pic, qbyte *translation); -void (D3D9_Draw_ConsoleBackground) (int lines); -void (D3D9_Draw_EditorBackground) (int lines); -void (D3D9_Draw_TileClear) (int x, int y, int w, int h); -void (D3D9_Draw_Fill) (int x, int y, int w, int h, unsigned int c); -void (D3D9_Draw_FillRGB) (int x, int y, int w, int h, float r, float g, float b); -void (D3D9_Draw_FadeScreen) (void); -void (D3D9_Draw_BeginDisc) (void); -void (D3D9_Draw_EndDisc) (void); - -void (D3D9_Draw_Image) (float x, float y, float w, float h, float s1, float t1, float s2, float t2, mpic_t *pic); //gl-style scaled/coloured/subpic -void (D3D9_Draw_ImageColours) (float r, float g, float b, float a); - -void (D3D9_R_Init) (void); -void (D3D9_R_DeInit) (void); -void (D3D9_R_ReInit) (void); -void (D3D9_R_RenderView) (void); // must set r_refdef first - -qboolean (D3D9_R_CheckSky) (void); -void (D3D9_R_SetSky) (char *name, float rotate, vec3_t axis); - -void (D3D9_R_NewMap) (void); -void (D3D9_R_PreNewMap) (void); -int (D3D9_R_LightPoint) (vec3_t point); - -void (D3D9_R_PushDlights) (void); -void (D3D9_R_AddStain) (vec3_t org, float red, float green, float blue, float radius); -void (D3D9_R_LessenStains) (void); - -void (D3D9_Media_ShowFrameBGR_24_Flip) (qbyte *framedata, int inwidth, int inheight); //input is bottom up... -void (D3D9_Media_ShowFrameRGBA_32) (qbyte *framedata, int inwidth, int inheight); //top down -void (D3D9_Media_ShowFrame8bit) (qbyte *framedata, int inwidth, int inheight, qbyte *palette); //paletted topdown (framedata is 8bit indexes into palette) - -void (D3D9_Mod_Init) (void); -void (D3D9_Mod_ClearAll) (void); -struct model_s *(D3D9_Mod_ForName) (char *name, qboolean crash); -struct model_s *(D3D9_Mod_FindName) (char *name); -void *(D3D9_Mod_Extradata) (struct model_s *mod); // handles caching -void (D3D9_Mod_TouchModel) (char *name); - -void (D3D9_Mod_NowLoadExternal) (void); -void (D3D9_Mod_Think) (void); -qboolean(D3D9_Mod_GetTag) (struct model_s *model, int tagnum, int frame1, int frame2, float f2ness, float f1time, float f2time, float *result); -int (D3D9_Mod_TagNumForName) (struct model_s *model, char *name); -int (D3D9_Mod_SkinForName) (struct model_s *model, char *name); - - -qboolean (D3D9_VID_Init) (rendererstate_t *info, unsigned char *palette); -void (D3D9_VID_DeInit) (void); -void (D3D9_VID_LockBuffer) (void); -void (D3D9_VID_UnlockBuffer) (void); -void (D3D9_D_BeginDirectRect) (int x, int y, qbyte *pbitmap, int width, int height); -void (D3D9_D_EndDirectRect) (int x, int y, int width, int height); -void (D3D9_VID_ForceLockState) (int lk); -int (D3D9_VID_ForceUnlockedAndReturnState) (void); -void (D3D9_VID_SetPalette) (unsigned char *palette); -void (D3D9_VID_ShiftPalette) (unsigned char *palette); -char *(D3D9_VID_GetRGBInfo) (int prepad, int *truevidwidth, int *truevidheight); -void (D3D9_VID_SetWindowCaption) (char *msg); - -void (D3D9_SCR_UpdateScreen) (void); - - - - - - - -rendererinfo_t d3d9rendererinfo = -{ - "Direct3D9 Native", - { - "D3D9", - "Direct3d", - "DirectX", - "DX" - }, - QR_DIRECT3D, - - D3D9_Draw_SafePicFromWad, - D3D9_Draw_CachePic, - D3D9_Draw_SafeCachePic, - D3D9_Draw_Init, - D3D9_Draw_ReInit, - D3D9_Draw_Character, +#include "quakedef.h" +#ifdef D3DQUAKE +#include "winquake.h" +#include "d3d9quake.h" + +//#include "d3d9.h" + + +//#pragma comment(lib, "../libs/dxsdk9/lib/d3d9.lib") + + +#ifndef WM_XBUTTONDOWN + #define WM_XBUTTONDOWN 0x020B + #define WM_XBUTTONUP 0x020C +#endif +#ifndef MK_XBUTTON1 + #define MK_XBUTTON1 0x0020 +#endif +#ifndef MK_XBUTTON2 + #define MK_XBUTTON2 0x0040 +#endif +// copied from DarkPlaces in an attempt to grab more buttons +#ifndef MK_XBUTTON3 + #define MK_XBUTTON3 0x0080 +#endif +#ifndef MK_XBUTTON4 + #define MK_XBUTTON4 0x0100 +#endif +#ifndef MK_XBUTTON5 + #define MK_XBUTTON5 0x0200 +#endif +#ifndef MK_XBUTTON6 + #define MK_XBUTTON6 0x0400 +#endif +#ifndef MK_XBUTTON7 + #define MK_XBUTTON7 0x0800 +#endif + +#ifndef WM_INPUT + #define WM_INPUT 255 +#endif + + +int gl_bumpmappingpossible; + +void D3D9_GetBufferSize(int *width, int *height); +static LPDIRECT3D9 pD3D; +LPDIRECT3DDEVICE9 pD3DDev9; +//static LPDIRECTDRAWGAMMACONTROL pGammaControl; + + +static qboolean vid_initializing; + +extern qboolean scr_initialized; // ready to draw +extern qboolean scr_drawloading; + + +cvar_t vid_hardwaregamma; + + +HWND mainwindow; + +struct texture_s *r_notexture_mip; + +int r_framecount; + +mleaf_t *r_viewleaf; + +#define MAX_MOD_KNOWN 1024 +int mod_numknown; +model_t mod_known[MAX_MOD_KNOWN]; +model_t *loadmodel; +model_t *currentmodel; +char loadname[32]; +qbyte *mod_base; + +qboolean DDActive; + +model_t *lightmodel; +int relitsurface; + +int window_center_x, window_center_y; +RECT window_rect; +int window_x, window_y; + +qboolean r_cache_thrash; // set if thrashing the surface cache + +mpic_t *draw_disc; // also used on sbar + +int d3d9width, d3d9height; +#if 0 +#if !defined(SWQUAKE) && !defined(RGLQUAKE) +qbyte GetPaletteIndex(int red, int green, int blue) +{ + //slow, horrible method. + { + int i, best=15; + int bestdif=256*256*256, curdif; + extern qbyte *host_basepal; + qbyte *pa; + + #define _abs(x) ((x)*(x)) + + pa = host_basepal; + for (i = 0; i < 256; i++, pa+=3) + { + curdif = _abs(red - pa[0]) + _abs(green - pa[1]) + _abs(blue - pa[2]); + if (curdif < bestdif) + { + if (curdif<1) + return i; + bestdif = curdif; + best = i; + } + } + return best; + } +} +#endif +#endif + +void BuildGammaTable (float g, float c); +void D3D9_VID_GenPaletteTables (unsigned char *palette) +{ + extern unsigned short ramps[3][256]; + qbyte *pal; + unsigned r,g,b; + unsigned v; + unsigned short i; + unsigned *table; + extern qbyte gammatable[256]; + + if (palette) + { + extern cvar_t v_contrast; + BuildGammaTable(v_gamma.value, v_contrast.value); + + // + // 8 8 8 encoding + // + if (1)//vid_hardwaregamma.value) + { + // don't built in the gamma table + + pal = palette; + table = d_8to24rgbtable; + for (i=0 ; i<256 ; i++) + { + r = pal[0]; + g = pal[1]; + b = pal[2]; + pal += 3; + + // v = (255<<24) + (r<<16) + (g<<8) + (b<<0); + // v = (255<<0) + (r<<8) + (g<<16) + (b<<24); + v = (255<<24) + (r<<0) + (g<<8) + (b<<16); + *table++ = v; + } + d_8to24rgbtable[255] &= 0xffffff; // 255 is transparent + } + else + { + //computer has no hardware gamma (poor suckers) increase table accordingly + + pal = palette; + table = d_8to24rgbtable; + for (i=0 ; i<256 ; i++) + { + r = gammatable[pal[0]]; + g = gammatable[pal[1]]; + b = gammatable[pal[2]]; + pal += 3; + + // v = (255<<24) + (r<<16) + (g<<8) + (b<<0); + // v = (255<<0) + (r<<8) + (g<<16) + (b<<24); + v = (255<<24) + (r<<0) + (g<<8) + (b<<16); + *table++ = v; + } + d_8to24rgbtable[255] &= 0xffffff; // 255 is transparent + } + + if (LittleLong(1) != 1) + { + for (i=0 ; i<256 ; i++) + d_8to24rgbtable[i] = LittleLong(d_8to24rgbtable[i]); + } + } + + if (pD3DDev9) + IDirect3DDevice9_SetGammaRamp(pD3DDev9, 0, D3DSGR_NO_CALIBRATION, (D3DGAMMARAMP *)ramps); +} +#if 0 +#if !defined(SWQUAKE) && !defined(GLQUAKE) +void D_FlushCaches (void) +{ +} +#endif +#endif + +/* + +void D3D9_Mod_Think (void) +{ +} +void D3D9_Mod_NowLoadExternal(void) +{ +} +void D3D9_Mod_TouchModel (char *name) +{ +} +void *D3D9_Mod_Extradata (struct model_s *mod) // handles caching +{ + return NULL; +} +struct model_s *D3D9_Mod_FindName (char *name) +{ + return NULL; +} +struct model_s *D3D9_Mod_ForName (char *name, qboolean crash) +{ + return NULL; +} +void D3D9_Mod_ClearAll (void) +{ +} +void D3D9_Mod_Init (void) +{ +}*/ + + +typedef enum {MS_WINDOWED, MS_FULLSCREEN, MS_FULLDIB, MS_UNINIT} modestate_t; +static modestate_t modestate; + +qboolean D3D9AppActivate(BOOL fActive, BOOL minimize) +/**************************************************************************** +* +* Function: AppActivate +* Parameters: fActive - True if app is activating +* +* Description: If the application is activating, then swap the system +* into SYSPAL_NOSTATIC mode so that our palettes will display +* correctly. +* +****************************************************************************/ +{ + static BOOL sound_active; + + if (ActiveApp == fActive && Minimized == minimize) + return false; //so windows doesn't crash us over and over again. + + ActiveApp = fActive; + Minimized = minimize; + +// enable/disable sound on focus gain/loss + if (!ActiveApp && sound_active) + { + S_BlockSound (); + sound_active = false; + } + else if (ActiveApp && !sound_active) + { + S_UnblockSound (); + sound_active = true; + } + + if (fActive) + { +/* if (modestate != MS_WINDOWED) + { + IN_ActivateMouse (); + IN_HideMouse (); +// if (vid_canalttab && vid_wassuspended) + { +// vid_wassuspended = false; +// ChangeDisplaySettings (&gdevmode, CDS_FULLSCREEN); + ShowWindow(mainwindow, SW_SHOWNORMAL); + + // Fix for alt-tab bug in NVidia drivers +// MoveWindow (mainwindow, 0, 0, gdevmode.dmPelsWidth, gdevmode.dmPelsHeight, false); + } + } + else if ((modestate == MS_WINDOWED) && _windowed_mouse.value && (key_dest == key_game || key_dest == key_menu)) + { + IN_ActivateMouse (); + IN_HideMouse (); + } +*/ + Cvar_ForceCallback(&v_gamma); + } + + if (!fActive) + { +/* if (modestate != MS_WINDOWED) + { + IN_DeactivateMouse (); + IN_ShowMouse (); +// if (vid_canalttab) +// { +// ChangeDisplaySettings (NULL, 0); +// vid_wassuspended = true; +// } + } + else if ((modestate == MS_WINDOWED) && _windowed_mouse.value) + { + IN_DeactivateMouse (); + IN_ShowMouse (); + } +*/ + Cvar_ForceCallback(&v_gamma); //wham bam thanks. +/* + if (qSetDeviceGammaRamp) + { + if (vid_desktopgamma.value) + { + HDC hDC = GetDC(GetDesktopWindow()); + qSetDeviceGammaRamp (hDC, originalgammaramps); + ReleaseDC(GetDesktopWindow(), hDC); + } + else + { + qSetDeviceGammaRamp(maindc, originalgammaramps); + } + } + */ + } + + return true; +} + + + + + +static LRESULT WINAPI D3D9_WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) +{ + LONG lRet = 1; + int fActive, fMinimized, temp; + extern unsigned int uiWheelMessage; + + if ( uMsg == uiWheelMessage ) + uMsg = WM_MOUSEWHEEL; + + switch (uMsg) + { + case WM_KILLFOCUS: + if (modestate == MS_FULLDIB) + ShowWindow(mainwindow, SW_SHOWMINNOACTIVE); + break; + + case WM_CREATE: + break; + + case WM_MOVE: + GetWindowRect(mainwindow, &window_rect); + window_x = (int) LOWORD(lParam); + window_y = (int) HIWORD(lParam); +// VID_UpdateWindowStatus (); + break; + + case WM_KEYDOWN: + case WM_SYSKEYDOWN: + if (!vid_initializing) + Key_Event (MapKey(lParam), true); + break; + + case WM_KEYUP: + case WM_SYSKEYUP: + if (!vid_initializing) + Key_Event (MapKey(lParam), false); + break; + + case WM_SYSCHAR: + // keep Alt-Space from happening + break; + + // this is complicated because Win32 seems to pack multiple mouse events into + // one update sometimes, so we always check all states and look for events + case WM_LBUTTONDOWN: + case WM_LBUTTONUP: + case WM_RBUTTONDOWN: + case WM_RBUTTONUP: + case WM_MBUTTONDOWN: + case WM_MBUTTONUP: + case WM_MOUSEMOVE: + case WM_XBUTTONDOWN: + case WM_XBUTTONUP: + temp = 0; + + if (wParam & MK_LBUTTON) + temp |= 1; + + if (wParam & MK_RBUTTON) + temp |= 2; + + if (wParam & MK_MBUTTON) + temp |= 4; + + if (wParam & MK_XBUTTON1) + temp |= 8; + + if (wParam & MK_XBUTTON2) + temp |= 16; + + if (wParam & MK_XBUTTON3) + temp |= 32; + + if (wParam & MK_XBUTTON4) + temp |= 64; + + if (wParam & MK_XBUTTON5) + temp |= 128; + + if (wParam & MK_XBUTTON6) + temp |= 256; + + if (wParam & MK_XBUTTON7) + temp |= 512; + + if (!vid_initializing) + IN_MouseEvent (temp); + + break; + + // JACK: This is the mouse wheel with the Intellimouse + // Its delta is either positive or neg, and we generate the proper + // Event. + case WM_MOUSEWHEEL: + if (!vid_initializing) + { + if ((short) HIWORD(wParam) > 0) + { + Key_Event(K_MWHEELUP, true); + Key_Event(K_MWHEELUP, false); + } + else + { + Key_Event(K_MWHEELDOWN, true); + Key_Event(K_MWHEELDOWN, false); + } + } + break; + + case WM_INPUT: + // raw input handling + IN_RawInput_MouseRead((HANDLE)lParam); + break; + + case WM_SIZE: + if (!vid_initializing) + { + GetWindowRect(mainwindow, &window_rect); + // force width/height to be updated +// glwidth = window_rect.right - window_rect.left; +// glheight = window_rect.bottom - window_rect.top; +// Cvar_ForceCallback(&vid_conautoscale); +// Cvar_ForceCallback(&vid_conwidth); + } + break; + + case WM_CLOSE: + if (!vid_initializing) + if (MessageBox (mainwindow, "Are you sure you want to quit?", "Confirm Exit", + MB_YESNO | MB_SETFOREGROUND | MB_ICONQUESTION) == IDYES) + { + Sys_Quit (); + } + + break; + + case WM_ACTIVATE: + fActive = LOWORD(wParam); + fMinimized = (BOOL) HIWORD(wParam); + if (!D3D9AppActivate(!(fActive == WA_INACTIVE), fMinimized)) + break;//so, urm, tell me microsoft, what changed? + if (modestate == MS_FULLDIB) + ShowWindow(mainwindow, SW_SHOWNORMAL); + + // fix the leftover Alt from any Alt-Tab or the like that switched us away +// ClearAllStates (); + + break; + + case WM_DESTROY: + { +// if (dibwindow) +// DestroyWindow (dibwindow); + } + break; + + case MM_MCINOTIFY: + lRet = CDAudio_MessageHandler (hWnd, uMsg, wParam, lParam); + break; + + + case WM_MWHOOK: + if (!vid_initializing) + MW_Hook_Message (lParam); + break; + + default: + /* pass all unhandled messages to DefWindowProc */ + lRet = DefWindowProc (hWnd, uMsg, wParam, lParam); + break; + } + + /* return 1 if handled message, 0 if not */ + return lRet; +} + +static D3DPRESENT_PARAMETERS d3dpp; +void resetD3D9(void) +{ + IDirect3DDevice9_Reset(pD3DDev9, &d3dpp); + + + IDirect3DDevice9_Clear(pD3DDev9, 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 255, 0), 1.0f, 0); + IDirect3DDevice9_BeginScene(pD3DDev9); + IDirect3DDevice9_EndScene(pD3DDev9); + IDirect3DDevice9_Present(pD3DDev9, NULL, NULL, NULL, NULL); + + + + + + IDirect3DDevice9_SetRenderState(pD3DDev9, D3DRS_ALPHAFUNC, D3DCMP_GREATER ); + IDirect3DDevice9_SetRenderState(pD3DDev9, D3DRS_ALPHAREF, 0.666*256 ); + + IDirect3DDevice9_SetRenderState(pD3DDev9, D3DRS_ALPHATESTENABLE, TRUE ); + + + //IDirect3DDevice9_SetRenderState(pD3DDev9, D3DRENDERSTATE_DITHERENABLE, FALSE); + //IDirect3DDevice9_SetRenderState(pD3DDev9, D3DRENDERSTATE_SPECULARENABLE, FALSE); + //IDirect3DDevice9_SetRenderState(pD3DDev9, D3DRENDERSTATE_TEXTUREPERSPECTIVE, TRUE); + IDirect3DDevice9_SetRenderState(pD3DDev9, D3DRS_LIGHTING, FALSE); + + IDirect3DDevice9_SetRenderState(pD3DDev9, D3DRS_ZWRITEENABLE, TRUE); + + IDirect3DDevice9_SetRenderState(pD3DDev9, D3DRS_ZFUNC, D3DCMP_LESSEQUAL); + +} + +#if (WINVER < 0x500) && !defined(__GNUC__) +typedef struct tagMONITORINFO +{ + DWORD cbSize; + RECT rcMonitor; + RECT rcWork; + DWORD dwFlags; +} MONITORINFO, *LPMONITORINFO; +#endif +/* +void testD3D(HWND hWnd) +{ + + D3DPRESENT_PARAMETERS d3dpp[2]; + + int i; + int numadaptors; + int err; + D3DADAPTER_IDENTIFIER9 inf; + + static HMODULE d3d9dll; + LPDIRECT3D9 (WINAPI *pDirect3DCreate9) (int version); + + if (!d3d9dll) + d3d9dll = LoadLibrary("d3d9.dll"); + if (!d3d9dll) + { + Con_Printf("Direct3d 9 does not appear to be installed\n"); + return; + } + pDirect3DCreate9 = (void*)GetProcAddress(d3d9dll, "Direct3DCreate9"); + if (!pDirect3DCreate9) + { + Con_Printf("Direct3d 9 does not appear to be installed properly\n"); + return; + } + + pD3D = pDirect3DCreate9(D3D_SDK_VERSION); // create the Direct3D interface + if (!pD3D) + return; + + for (i = 0; i < 2; i++) + { + memset(&d3dpp[0], 0, sizeof(d3dpp)); // clear out the struct for use + d3dpp[0].SwapEffect = D3DSWAPEFFECT_DISCARD; // discard old frames + d3dpp[0].hDeviceWindow = hWnd; // set the window to be used by Direct3D + d3dpp[0].BackBufferWidth = d3d9width = info->width; + d3dpp[0].BackBufferHeight = d3d9height = info->height; + d3dpp[0].MultiSampleType = info->multisample; + d3dpp[0].BackBufferCount = 3; + d3dpp[0].FullScreen_RefreshRateInHz = info->fullscreen?info->rate:0; //don't pass a rate if not fullscreen, d3d doesn't like it. + d3dpp[0].Windowed = !info->fullscreen; + + d3dpp[0].EnableAutoDepthStencil = true; + d3dpp[0].AutoDepthStencilFormat = D3DFMT_D16; + d3dpp[0].BackBufferFormat = info->fullscreen?D3DFMT_X8R8G8B8:D3DFMT_UNKNOWN; + } + + IDirect3D9_CreateDevice(pD3D, + i, + D3DDEVTYPE_HAL, + hWnd, + D3DCREATE_SOFTWARE_VERTEXPROCESSING, + &d3dpp, + &pD3DDev9); + +} +*/ +void initD3D9(HWND hWnd, rendererstate_t *info) +{ + int i; + int numadaptors; + int err; + D3DADAPTER_IDENTIFIER9 inf; + extern cvar_t _vid_wait_override; + + static HMODULE d3d9dll; + LPDIRECT3D9 (WINAPI *pDirect3DCreate9) (int version); + + if (!d3d9dll) + d3d9dll = LoadLibrary("d3d9.dll"); + if (!d3d9dll) + { + Con_Printf("Direct3d 9 does not appear to be installed\n"); + return; + } + pDirect3DCreate9 = (void*)GetProcAddress(d3d9dll, "Direct3DCreate9"); + if (!pDirect3DCreate9) + { + Con_Printf("Direct3d 9 does not appear to be installed properly\n"); + return; + } + + pD3D = pDirect3DCreate9(D3D_SDK_VERSION); // create the Direct3D interface + if (!pD3D) + return; + + numadaptors = IDirect3D9_GetAdapterCount(pD3D); + for (i = 0; i < numadaptors; i++) + { //try each adaptor in turn until we get one that actually works + memset(&d3dpp, 0, sizeof(d3dpp)); // clear out the struct for use + d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD; // discard old frames + d3dpp.hDeviceWindow = hWnd; // set the window to be used by Direct3D + d3dpp.BackBufferWidth = d3d9width = info->width; + d3dpp.BackBufferHeight = d3d9height = info->height; + d3dpp.MultiSampleType = info->multisample; + d3dpp.BackBufferCount = 3; + d3dpp.FullScreen_RefreshRateInHz = info->fullscreen?info->rate:0; //don't pass a rate if not fullscreen, d3d doesn't like it. + d3dpp.Windowed = !info->fullscreen; + + d3dpp.EnableAutoDepthStencil = true; + d3dpp.AutoDepthStencilFormat = D3DFMT_D16; + d3dpp.BackBufferFormat = info->fullscreen?D3DFMT_X8R8G8B8:D3DFMT_UNKNOWN; + + if (!*_vid_wait_override.string) + d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_DEFAULT; + else + { + if (_vid_wait_override.value == 1) + d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_ONE; + else if (_vid_wait_override.value == 2) + d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_TWO; + else if (_vid_wait_override.value == 3) + d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_THREE; + else if (_vid_wait_override.value == 4) + d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_FOUR; + else + d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE; + } + + memset(&inf, 0, sizeof(inf)); + err = IDirect3D9_GetAdapterIdentifier(pD3D, i, 0, &inf); + + // create a device class using this information and information from the d3dpp stuct + IDirect3D9_CreateDevice(pD3D, + i, + D3DDEVTYPE_HAL, + hWnd, + D3DCREATE_SOFTWARE_VERTEXPROCESSING, + &d3dpp, + &pD3DDev9); + + if (pD3DDev9) + { + HMONITOR hm; + MONITORINFO mi; + char *s; + for (s = inf.Description + strlen(inf.Description)-1; s >= inf.Description && *s <= ' '; s--) + *s = 0; + Con_Printf("D3D9: Using device %s\n", inf.Description); + + if (d3dpp.Windowed) //fullscreen we get positioned automagically. + { //windowed, we get positioned at 0,0... which is often going to be on the wrong screen + //the user can figure it out from here + static HANDLE huser32; + BOOL (WINAPI *pGetMonitorInfoA)(HMONITOR hMonitor, LPMONITORINFO lpmi); + if (!huser32) + huser32 = LoadLibrary("user32.dll"); + if (!huser32) + return; + pGetMonitorInfoA = (void*)GetProcAddress(huser32, "GetMonitorInfoA"); + if (!pGetMonitorInfoA) + return; + + hm = IDirect3D9_GetAdapterMonitor(pD3D, i); + memset(&mi, 0, sizeof(mi)); + mi.cbSize = sizeof(mi); + pGetMonitorInfoA(hm, &mi); + MoveWindow(d3dpp.hDeviceWindow, mi.rcWork.left, mi.rcWork.top, d3dpp.BackBufferWidth, d3dpp.BackBufferHeight, false); + } + return; //successful + } + } + + + Con_Printf("IDirect3D9_CreateDevice failed\n"); + + + return; +} + +qboolean D3D9_VID_Init(rendererstate_t *info, unsigned char *palette) +{ + DWORD width = info->width; + DWORD height = info->height; + DWORD bpp = info->bpp; + DWORD zbpp = 16; + DWORD flags = 0; + MSG msg; + + extern cvar_t vid_conwidth; + extern cvar_t vid_conheight; + + //DDGAMMARAMP gammaramp; + //int i; + + char *CLASSNAME = "FTED3D9QUAKE"; + WNDCLASS wc = { + 0, + &D3D9_WindowProc, + 0, + 0, + NULL, + NULL, + NULL, + NULL, + NULL, + CLASSNAME + }; + + vid_initializing = true; + + RegisterClass(&wc); + + if (info->fullscreen) + mainwindow = CreateWindow(CLASSNAME, "Direct3D", 0, 0, 0, width, height, NULL, NULL, NULL, NULL); + else + mainwindow = CreateWindow(CLASSNAME, "Direct3D", WS_OVERLAPPEDWINDOW, 0, 0, width, height, NULL, NULL, NULL, NULL); +/* + width = vid_conwidth.value; + height = vid_conheight.value; +*/ + // Try as specified. + + initD3D9(mainwindow, info); + if (!pD3DDev9) + return false; + + + + while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) + { + TranslateMessage(&msg); + DispatchMessage(&msg); + } + + ShowWindow(mainwindow, SW_NORMAL); + //IDirect3DDevice9_Clear(pD3DDev9, 0, NULL, D3DCLEAR_TARGET, 0xffffffff, 1, 0); + //IDirect3DDevice9_Present(pD3DDev9, NULL, NULL, NULL, NULL); + + IDirect3DDevice9_Clear(pD3DDev9, 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 0, 0), 1.0f, 0); + IDirect3DDevice9_BeginScene(pD3DDev9); + IDirect3DDevice9_EndScene(pD3DDev9); + IDirect3DDevice9_Present(pD3DDev9, NULL, NULL, NULL, NULL); + + + +// pD3DX->lpVtbl->GetBufferSize((void*)pD3DX, &width, &height); + vid.width = width; + vid.height = height; + vid.recalc_refdef = true; + +// pDD->lpVtbl->QueryInterface ((void*)pDD, &IID_IDirectDrawGammaControl, (void**)&pGammaControl); +/* if (pGammaControl) + { + for (i = 0; i < 256; i++) + gammaramp.red[i] = i*2; + pGammaControl->lpVtbl->SetGammaRamp(pGammaControl, 0, &gammaramp); + } + else*/ + Con_Printf("Couldn't get gamma controls\n"); + + vid_initializing = false; + + + +resetD3D9();/* + + + IDirect3DDevice9_SetRenderState(pD3DDev9, D3DRS_ALPHAFUNC, D3DCMP_GREATER ); + IDirect3DDevice9_SetRenderState(pD3DDev9, D3DRS_ALPHAREF, 0.666*256 ); + + IDirect3DDevice9_SetRenderState(pD3DDev9, D3DRS_ALPHATESTENABLE, TRUE ); + + + //IDirect3DDevice9_SetRenderState(pD3DDev9, D3DRENDERSTATE_DITHERENABLE, FALSE); + //IDirect3DDevice9_SetRenderState(pD3DDev9, D3DRENDERSTATE_SPECULARENABLE, FALSE); + //IDirect3DDevice9_SetRenderState(pD3DDev9, D3DRENDERSTATE_TEXTUREPERSPECTIVE, TRUE); + IDirect3DDevice9_SetRenderState(pD3DDev9, D3DRS_LIGHTING, FALSE); + + IDirect3DDevice9_SetRenderState(pD3DDev9, D3DRS_ZWRITEENABLE, TRUE); + + IDirect3DDevice9_SetRenderState(pD3DDev9, D3DRS_ZFUNC, D3DCMP_LESSEQUAL); + +*/ + GetWindowRect(mainwindow, &window_rect); + + + D3D9_VID_GenPaletteTables(palette); + + { + extern qboolean mouseactive; + mouseactive = false; + } + + { + extern cvar_t v_contrast; + void GLV_Gamma_Callback(struct cvar_s *var, char *oldvalue); + Cvar_Hook(&v_gamma, GLV_Gamma_Callback); + Cvar_Hook(&v_contrast, GLV_Gamma_Callback); + + Cvar_ForceCallback(&v_gamma); + } + + { + extern cvar_t vid_conwidth, vid_conheight; + vid.conwidth = vid_conwidth.value; + vid.conheight = vid_conheight.value; + if (vid.width != vid.conwidth || vid.height != vid.conheight) + vid.recalc_refdef = true; + vid.width = vid.conwidth; + vid.height = vid.conheight; + } + + return true; +} + + + +qboolean (D3D9_R_CheckSky) (void) +{ + return false; +} +void (D3D9_R_SetSky) (char *name, float rotate, vec3_t axis) +{ +} + +void (D3D9_R_NewMap) (void) +{ + extern int skytexturenum; + int i; + r_worldentity.model = cl.worldmodel; + GLR_AnimateLight(); + D3D9_BuildLightmaps(); + + P_ClearParticles(); + + skytexturenum = -1; + + for (i=0 ; inumtextures ; i++) + { + if (!cl.worldmodel->textures[i]) + continue; + if (!Q_strncmp(cl.worldmodel->textures[i]->name,"sky",3) ) + skytexturenum = i; +// if (!Q_strncmp(cl.worldmodel->textures[i]->name,"window02_1",10) ) +// mirrortexturenum = i; + cl.worldmodel->textures[i]->texturechain = NULL; + } +} + +extern mleaf_t *r_viewleaf, *r_oldviewleaf; +extern mleaf_t *r_viewleaf2, *r_oldviewleaf2; +void (D3D9_R_PreNewMap) (void) +{ + r_viewleaf = NULL; + r_oldviewleaf = NULL; + r_viewleaf2 = NULL; + r_oldviewleaf2 = NULL; +} +int (D3D9_R_LightPoint) (vec3_t point) +{ + return 0; +} + +void (D3D9_R_PushDlights) (void) +{ +} +void (D3D9_R_AddStain) (vec3_t org, float red, float green, float blue, float radius) +{ +} +void (D3D9_R_LessenStains) (void) +{ +} + +void (D3D9_Mod_Init) (void) +{ +} +void (D3D9_Mod_ClearAll) (void) +{ +} +struct model_s *(D3D9_Mod_ForName) (char *name, qboolean crash) +{ + return NULL; +} +struct model_s *(D3D9_Mod_FindName) (char *name) +{ + return NULL; +} +void *(D3D9_Mod_Extradata) (struct model_s *mod) +{ + return NULL; +} // handles caching +void (D3D9_Mod_TouchModel) (char *name) +{ +} + +void (D3D9_Mod_NowLoadExternal) (void) +{ +} +void (D3D9_Mod_Think) (void) +{ +} + +int (D3D9_Mod_SkinForName) (struct model_s *model, char *name) +{ + return 0; +} + +void (D3D9_VID_DeInit) (void) +{ + if (pD3DDev9) + { + IDirect3DDevice9_Release(pD3DDev9); + pD3DDev9 = NULL; + } + if (pD3D) + { + IDirect3D9_Release(pD3D); + pD3D = NULL; + } + if (mainwindow) + { + DestroyWindow(mainwindow); + mainwindow = NULL; + } +} +void (D3D9_VID_LockBuffer) (void) +{ +} +void (D3D9_VID_UnlockBuffer) (void) +{ +} +void (D3D9_D_BeginDirectRect) (int x, int y, qbyte *pbitmap, int width, int height) +{ +} +void (D3D9_D_EndDirectRect) (int x, int y, int width, int height) +{ +} +void (D3D9_VID_ForceLockState) (int lk) +{ +} +int (D3D9_VID_ForceUnlockedAndReturnState) (void) +{ + return 0; +} + +void (D3D9_VID_SetPalette) (unsigned char *palette) +{ + D3D9_VID_GenPaletteTables(palette); +} +void (D3D9_VID_ShiftPalette) (unsigned char *palette) +{ + D3D9_VID_GenPaletteTables(palette); +} +char *(D3D9_VID_GetRGBInfo) (int prepad, int *truevidwidth, int *truevidheight) +{ + return NULL; +} +void (D3D9_VID_SetWindowCaption) (char *msg) +{ + SetWindowText(mainwindow, msg); +} + +#if 0 +#undef IDirect3DDevice9_SetRenderState +void IDirect3DDevice9_SetRenderState(void *pD3DDev9, int D3DRS, int param) +{ +} +#endif + +void D3D9_Set2D (void) +{ + float m[16]; + D3DVIEWPORT9 vport; +// IDirect3DDevice9_EndScene(pD3DDev9); + + Matrix4_Orthographic(m, 0, vid.width, vid.height, 0, -100, 100); + d3d7_ortho(m); + IDirect3DDevice9_SetTransform(pD3DDev9, D3DTS_PROJECTION, (D3DMATRIX*)m); + + Matrix4_Identity(m); + IDirect3DDevice9_SetTransform(pD3DDev9, D3DTS_WORLD, (D3DMATRIX*)m); + + Matrix4_Identity(m); + IDirect3DDevice9_SetTransform(pD3DDev9, D3DTS_VIEW, (D3DMATRIX*)m); + + IDirect3DDevice9_SetRenderState(pD3DDev9, D3DRS_CULLMODE, D3DCULL_CCW ); + + IDirect3DDevice9_SetRenderState(pD3DDev9, D3DRS_ZFUNC, D3DCMP_ALWAYS); + IDirect3DDevice9_SetRenderState(pD3DDev9, D3DRS_ZENABLE, D3DZB_FALSE); + + IDirect3DDevice9_SetSamplerState(pD3DDev9, 0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR ); + IDirect3DDevice9_SetSamplerState(pD3DDev9, 1, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR ); + + IDirect3DDevice9_SetSamplerState(pD3DDev9, 0, D3DSAMP_MIPFILTER, D3DTEXF_NONE ); + IDirect3DDevice9_SetSamplerState(pD3DDev9, 1, D3DSAMP_MIPFILTER, D3DTEXF_NONE ); + + IDirect3DDevice9_SetSamplerState(pD3DDev9, 0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR ); + IDirect3DDevice9_SetSamplerState(pD3DDev9, 1, D3DSAMP_MINFILTER, D3DTEXF_LINEAR ); + + vport.X = 0; + vport.Y = 0; + D3D9_GetBufferSize(&vport.Width, &vport.Height); + vport.MinZ = 0; + vport.MaxZ = 1; + IDirect3DDevice9_SetViewport(pD3DDev9, &vport); + +// IDirect3DDevice9_BeginScene(pD3DDev9); +} + +void D3D9_GetBufferSize(int *width, int *height) +{ + *width = d3d9width;//vid.width; + *height = d3d9height;//vid.height; +// IDirect3DDevice9_GetBufferSize((void*)pD3DX, width, height); +} + +int d3d9error(int i) +{ + if (FAILED(i))// != D3D_OK) + Con_Printf("D3D error: %x %i\n", i); + return i; +} + +typedef struct { + float x, y, z; + unsigned int colour; +} d3d9bsvert_t; +void D3D9_BrightenScreen (void) +{ + d3d9bsvert_t d3d9bsvert[4]; +index_t d3d9quadindexes[6] = { + 0, 1, 2, + 0, 2, 3 +}; + +extern cvar_t gl_contrast; + float f; + unsigned int colour; + + RSpeedMark(); + + if (gl_contrast.value <= 1.0) + return; + + f = gl_contrast.value; + f = min (f, 3); + + IDirect3DDevice9_SetTexture (pD3DDev9, 0, NULL); + IDirect3DDevice9_SetRenderState(pD3DDev9, D3DRS_ALPHABLENDENABLE, TRUE); + IDirect3DDevice9_SetRenderState(pD3DDev9, D3DRS_SRCBLEND, D3DBLEND_DESTCOLOR); + IDirect3DDevice9_SetRenderState(pD3DDev9, D3DRS_DESTBLEND, D3DBLEND_ONE); + + while (f > 1) + { + if (f >= 2) + colour = 0xffffffff; + else + { + colour = (f-1)*255; + colour = (colour * 0x010101) | 0xff000000; + } + + + d3d9bsvert[0].x = 0; + d3d9bsvert[0].y = 0; + d3d9bsvert[0].z = 0; + d3d9bsvert[0].colour = colour; + + d3d9bsvert[1].x = vid.width; + d3d9bsvert[1].y = 0; + d3d9bsvert[1].z = 0; + d3d9bsvert[1].colour = colour; + + d3d9bsvert[2].x = vid.width; + d3d9bsvert[2].y = vid.height; + d3d9bsvert[2].z = 0; + d3d9bsvert[2].colour = colour; + + d3d9bsvert[3].x = 0; + d3d9bsvert[3].y = vid.height; + d3d9bsvert[3].z = 0; + d3d9bsvert[3].colour = colour; + + IDirect3DDevice9_SetFVF(pD3DDev9, D3DFVF_XYZ|D3DFVF_DIFFUSE); + IDirect3DDevice9_DrawIndexedPrimitiveUP(pD3DDev9, D3DPT_TRIANGLELIST, 0, 4, 2, d3d9quadindexes, D3DFMT_QINDEX, d3d9bsvert, sizeof(d3d9bsvert[0])); + + + f *= 0.5; + } + + IDirect3DDevice9_SetRenderState(pD3DDev9, D3DRS_SRCBLEND, D3DBLEND_SRCALPHA); + IDirect3DDevice9_SetRenderState(pD3DDev9, D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA); + IDirect3DDevice9_SetRenderState(pD3DDev9, D3DRS_ALPHABLENDENABLE, FALSE); + + RSpeedEnd(RSPEED_PALETTEFLASHES); +} + +void (D3D9_SCR_UpdateScreen) (void) +{ + extern int keydown[]; + extern cvar_t vid_conheight; + int uimenu; +#ifdef TEXTEDITOR + extern qboolean editormodal; +#endif + qboolean nohud; + RSpeedMark(); + + switch (IDirect3DDevice9_TestCooperativeLevel(pD3DDev9)) + { + case D3DERR_DEVICELOST: + //the user has task switched away from us or something + return; + case D3DERR_DEVICENOTRESET: + resetD3D9(); + if (FAILED(IDirect3DDevice9_TestCooperativeLevel(pD3DDev9))) + Sys_Error("D3D9 Device lost. Additionally restoration failed.\n"); + // D3DSucks(); + // scr_disabled_for_loading = false; + + VID_ShiftPalette (NULL); + break; + default: + break; + } + + + if (keydown['k']) + { + d3d9error(IDirect3DDevice9_Clear(pD3DDev9, 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(rand()&255, rand()&255, rand()&255), 1.0f, 0)); + d3d9error(IDirect3DDevice9_BeginScene(pD3DDev9)); + d3d9error(IDirect3DDevice9_EndScene(pD3DDev9)); + d3d9error(IDirect3DDevice9_Present(pD3DDev9, NULL, NULL, NULL, NULL)); + + VID_ShiftPalette (NULL); + } + + + if (block_drawing) + { + RSpeedEnd(RSPEED_TOTALREFRESH); + return; + } + + vid.numpages = 2;// + gl_triplebuffer.value; + + scr_copytop = 0; + scr_copyeverything = 0; + + if (scr_disabled_for_loading) + { + extern float scr_disabled_time; + if (Sys_DoubleTime() - scr_disabled_time > 60 || key_dest != key_game) + { + scr_disabled_for_loading = false; + } + else + { + IDirect3DDevice9_BeginScene(pD3DDev9); + scr_drawloading = true; + SCR_DrawLoading (); + scr_drawloading = false; + IDirect3DDevice9_EndScene(pD3DDev9); + IDirect3DDevice9_Present(pD3DDev9, NULL, NULL, NULL, NULL); + RSpeedEnd(RSPEED_TOTALREFRESH); + return; + } + } + + if (!scr_initialized || !con_initialized) + { + RSpeedEnd(RSPEED_TOTALREFRESH); + return; // not initialized yet + } + + { + extern cvar_t vid_conwidth, vid_conheight; + vid.conwidth = vid_conwidth.value; + vid.conheight = vid_conheight.value; + if (vid.width != vid.conwidth || vid.height != vid.conheight) + vid.recalc_refdef = true; + vid.width = vid.conwidth; + vid.height = vid.conheight; + } + + +#ifdef VM_UI + uimenu = UI_MenuState(); +#else + uimenu = 0; +#endif + + d3d9error(IDirect3DDevice9_BeginScene(pD3DDev9)); + D3D9_Set2D (); +/* +#ifdef TEXTEDITOR + if (editormodal) + { + Editor_Draw(); + GLV_UpdatePalette (false, host_frametime); +#if defined(_WIN32) && defined(RGLQUAKE) + Media_RecordFrame(); +#endif + GLR_BrightenScreen(); + + if (key_dest == key_console) + Con_DrawConsole(vid_conheight.value/2, false); + GL_EndRendering (); + GL_DoSwap(); + RSpeedEnd(RSPEED_TOTALREFRESH); + return; + } +#endif +*/ + if (Media_ShowFilm()) + { + M_Draw(0); +// GLV_UpdatePalette (false, host_frametime); +#if defined(_WIN32) + Media_RecordFrame(); +#endif +// GLR_BrightenScreen(); + IDirect3DDevice9_EndScene(pD3DDev9); + IDirect3DDevice9_Present(pD3DDev9, NULL, NULL, NULL, NULL); + + d3d9error(IDirect3DDevice9_Clear(pD3DDev9, 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(rand()&255, rand()&255, rand()&255), 1, 0)); + +// pD3DDev->lpVtbl->BeginScene(pD3DDev); + + RSpeedEnd(RSPEED_TOTALREFRESH); + return; + } + + // + // determine size of refresh window + // + if (vid.recalc_refdef) + SCR_CalcRefdef (); + +// +// do 3D refresh drawing, and then update the screen +// + SCR_SetUpToDrawConsole (); + + nohud = false; + +#ifdef VM_CG + if (CG_Refresh()) + nohud = true; + else +#endif +#ifdef CSQC_DAT + if (cls.state == ca_active && CSQC_DrawView()) + nohud = true; + else +#endif + if (r_worldentity.model && uimenu != 1) + { + V_RenderView (); +// Q1BSP_TestClipDecal(); + } + + + D3D9_Set2D (); + + D3D9_BrightenScreen(); + + if (!nohud) + SCR_TileClear (); + + SCR_DrawTwoDimensional(uimenu, nohud); + + GLV_UpdatePalette (false, host_frametime); +#if defined(_WIN32) && defined(RGLQUAKE) + Media_RecordFrame(); +#endif + + RSpeedEnd(RSPEED_TOTALREFRESH); + RSpeedShow(); + + + + d3d9error(IDirect3DDevice9_EndScene(pD3DDev9)); + d3d9error(IDirect3DDevice9_Present(pD3DDev9, NULL, NULL, NULL, NULL)); + + + + d3d9error(IDirect3DDevice9_Clear(pD3DDev9, 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 0, rand()&255), 1, 0)); + d3d9error(IDirect3DDevice9_Clear(pD3DDev9, 0, NULL, D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(rand()&255, rand()&255, rand()&255), 1, 0)); + + window_center_x = (window_rect.left + window_rect.right)/2; + window_center_y = (window_rect.top + window_rect.bottom)/2; + + + + if (modestate == MS_WINDOWED) + { + extern int mouseusedforgui; + extern qboolean mouseactive; + qboolean wantactive; + + wantactive = _windowed_mouse.value && (key_dest == key_game||mouseusedforgui) && ActiveApp; + if (wantactive != mouseactive) + { + if (!mouseactive) + { + IN_ActivateMouse (); + IN_HideMouse (); + } + else + { + IN_DeactivateMouse (); + IN_ShowMouse (); + } + } + } + + VID_ShiftPalette (NULL); +} + + + + + +mpic_t *(D3D9_Draw_SafePicFromWad) (char *name); +mpic_t *(D3D9_Draw_CachePic) (char *path); +mpic_t *(D3D9_Draw_SafeCachePic) (char *path); +void (D3D9_Draw_Init) (void); +void (D3D9_Draw_ReInit) (void); +void (D3D9_Draw_Character) (int x, int y, unsigned int num); +void (D3D9_Draw_ColouredCharacter) (int x, int y, unsigned int num); +void (D3D9_Draw_String) (int x, int y, const qbyte *str); +void (D3D9_Draw_Alt_String) (int x, int y, const qbyte *str); +void (D3D9_Draw_Crosshair) (void); +void (D3D9_Draw_DebugChar) (qbyte num); +void (D3D9_Draw_Pic) (int x, int y, mpic_t *pic); +void (D3D9_Draw_ScalePic) (int x, int y, int width, int height, mpic_t *pic); +void (D3D9_Draw_SubPic) (int x, int y, mpic_t *pic, int srcx, int srcy, int width, int height); +void (D3D9_Draw_TransPic) (int x, int y, mpic_t *pic); +void (D3D9_Draw_TransPicTranslate) (int x, int y, int w, int h, qbyte *pic, qbyte *translation); +void (D3D9_Draw_ConsoleBackground) (int lines); +void (D3D9_Draw_EditorBackground) (int lines); +void (D3D9_Draw_TileClear) (int x, int y, int w, int h); +void (D3D9_Draw_Fill) (int x, int y, int w, int h, unsigned int c); +void (D3D9_Draw_FillRGB) (int x, int y, int w, int h, float r, float g, float b); +void (D3D9_Draw_FadeScreen) (void); +void (D3D9_Draw_BeginDisc) (void); +void (D3D9_Draw_EndDisc) (void); + +void (D3D9_Draw_Image) (float x, float y, float w, float h, float s1, float t1, float s2, float t2, mpic_t *pic); //gl-style scaled/coloured/subpic +void (D3D9_Draw_ImageColours) (float r, float g, float b, float a); + +void (D3D9_R_Init) (void); +void (D3D9_R_DeInit) (void); +void (D3D9_R_ReInit) (void); +void (D3D9_R_RenderView) (void); // must set r_refdef first + +qboolean (D3D9_R_CheckSky) (void); +void (D3D9_R_SetSky) (char *name, float rotate, vec3_t axis); + +void (D3D9_R_NewMap) (void); +void (D3D9_R_PreNewMap) (void); +int (D3D9_R_LightPoint) (vec3_t point); + +void (D3D9_R_PushDlights) (void); +void (D3D9_R_AddStain) (vec3_t org, float red, float green, float blue, float radius); +void (D3D9_R_LessenStains) (void); + +void (D3D9_Media_ShowFrameBGR_24_Flip) (qbyte *framedata, int inwidth, int inheight); //input is bottom up... +void (D3D9_Media_ShowFrameRGBA_32) (qbyte *framedata, int inwidth, int inheight); //top down +void (D3D9_Media_ShowFrame8bit) (qbyte *framedata, int inwidth, int inheight, qbyte *palette); //paletted topdown (framedata is 8bit indexes into palette) + +void (D3D9_Mod_Init) (void); +void (D3D9_Mod_ClearAll) (void); +struct model_s *(D3D9_Mod_ForName) (char *name, qboolean crash); +struct model_s *(D3D9_Mod_FindName) (char *name); +void *(D3D9_Mod_Extradata) (struct model_s *mod); // handles caching +void (D3D9_Mod_TouchModel) (char *name); + +void (D3D9_Mod_NowLoadExternal) (void); +void (D3D9_Mod_Think) (void); +qboolean(D3D9_Mod_GetTag) (struct model_s *model, int tagnum, int frame1, int frame2, float f2ness, float f1time, float f2time, float *result); +int (D3D9_Mod_TagNumForName) (struct model_s *model, char *name); +int (D3D9_Mod_SkinForName) (struct model_s *model, char *name); + + +qboolean (D3D9_VID_Init) (rendererstate_t *info, unsigned char *palette); +void (D3D9_VID_DeInit) (void); +void (D3D9_VID_LockBuffer) (void); +void (D3D9_VID_UnlockBuffer) (void); +void (D3D9_D_BeginDirectRect) (int x, int y, qbyte *pbitmap, int width, int height); +void (D3D9_D_EndDirectRect) (int x, int y, int width, int height); +void (D3D9_VID_ForceLockState) (int lk); +int (D3D9_VID_ForceUnlockedAndReturnState) (void); +void (D3D9_VID_SetPalette) (unsigned char *palette); +void (D3D9_VID_ShiftPalette) (unsigned char *palette); +char *(D3D9_VID_GetRGBInfo) (int prepad, int *truevidwidth, int *truevidheight); +void (D3D9_VID_SetWindowCaption) (char *msg); + +void (D3D9_SCR_UpdateScreen) (void); + + + + + + + +rendererinfo_t d3d9rendererinfo = +{ + "Direct3D9 Native", + { + "D3D9", + "Direct3d", + "DirectX", + "DX" + }, + QR_DIRECT3D, + + D3D9_Draw_SafePicFromWad, + D3D9_Draw_CachePic, + D3D9_Draw_SafeCachePic, + D3D9_Draw_Init, + D3D9_Draw_ReInit, + D3D9_Draw_Character, D3D9_Draw_ColouredCharacter, - NULL, - D3D9_Draw_String, - D3D9_Draw_Alt_String, - D3D9_Draw_Crosshair, - D3D9_Draw_DebugChar, - D3D9_Draw_Pic, - D3D9_Draw_ScalePic, - D3D9_Draw_SubPic, - D3D9_Draw_TransPic, - D3D9_Draw_TransPicTranslate, - D3D9_Draw_ConsoleBackground, - D3D9_Draw_EditorBackground, - D3D9_Draw_TileClear, - D3D9_Draw_Fill, - D3D9_Draw_FillRGB, - D3D9_Draw_FadeScreen, - D3D9_Draw_BeginDisc, - D3D9_Draw_EndDisc, - - D3D9_Draw_Image, - D3D9_Draw_ImageColours, - - D3D9_R_Init, - D3D9_R_DeInit, - D3D9_R_ReInit, - D3D9_R_RenderView, - - D3D9_R_CheckSky, - D3D9_R_SetSky, - - D3D9_R_NewMap, - D3D9_R_PreNewMap, - D3D9_R_LightPoint, - - D3D9_R_PushDlights, - D3D9_R_AddStain, - D3D9_R_LessenStains, - - D3D9_Media_ShowFrameBGR_24_Flip, - D3D9_Media_ShowFrameRGBA_32, - D3D9_Media_ShowFrame8bit, - - GLMod_Init, - GLMod_ClearAll, - GLMod_ForName, - GLMod_FindName, - GLMod_Extradata, - GLMod_TouchModel, - - GLMod_NowLoadExternal, - GLMod_Think, - Mod_GetTag, - Mod_TagNumForName, - D3D9_Mod_SkinForName, - - - D3D9_VID_Init, - D3D9_VID_DeInit, - D3D9_VID_LockBuffer, - D3D9_VID_UnlockBuffer, - D3D9_D_BeginDirectRect, - D3D9_D_EndDirectRect, - D3D9_VID_ForceLockState, - D3D9_VID_ForceUnlockedAndReturnState, - D3D9_VID_SetPalette, - D3D9_VID_ShiftPalette, - D3D9_VID_GetRGBInfo, - D3D9_VID_SetWindowCaption, - - D3D9_SCR_UpdateScreen - -}; -#endif + NULL, + D3D9_Draw_String, + D3D9_Draw_Alt_String, + D3D9_Draw_Crosshair, + D3D9_Draw_DebugChar, + D3D9_Draw_Pic, + D3D9_Draw_ScalePic, + D3D9_Draw_SubPic, + D3D9_Draw_TransPic, + D3D9_Draw_TransPicTranslate, + D3D9_Draw_ConsoleBackground, + D3D9_Draw_EditorBackground, + D3D9_Draw_TileClear, + D3D9_Draw_Fill, + D3D9_Draw_FillRGB, + D3D9_Draw_FadeScreen, + D3D9_Draw_BeginDisc, + D3D9_Draw_EndDisc, + + D3D9_Draw_Image, + D3D9_Draw_ImageColours, + + D3D9_R_Init, + D3D9_R_DeInit, + D3D9_R_ReInit, + D3D9_R_RenderView, + + D3D9_R_CheckSky, + D3D9_R_SetSky, + + D3D9_R_NewMap, + D3D9_R_PreNewMap, + D3D9_R_LightPoint, + + D3D9_R_PushDlights, + D3D9_R_AddStain, + D3D9_R_LessenStains, + + D3D9_Media_ShowFrameBGR_24_Flip, + D3D9_Media_ShowFrameRGBA_32, + D3D9_Media_ShowFrame8bit, + + GLMod_Init, + GLMod_ClearAll, + GLMod_ForName, + GLMod_FindName, + GLMod_Extradata, + GLMod_TouchModel, + + GLMod_NowLoadExternal, + GLMod_Think, + Mod_GetTag, + Mod_TagNumForName, + D3D9_Mod_SkinForName, + + + D3D9_VID_Init, + D3D9_VID_DeInit, + D3D9_VID_LockBuffer, + D3D9_VID_UnlockBuffer, + D3D9_D_BeginDirectRect, + D3D9_D_EndDirectRect, + D3D9_VID_ForceLockState, + D3D9_VID_ForceUnlockedAndReturnState, + D3D9_VID_SetPalette, + D3D9_VID_ShiftPalette, + D3D9_VID_GetRGBInfo, + D3D9_VID_SetWindowCaption, + + D3D9_SCR_UpdateScreen + +}; +#endif diff --git a/engine/gl/gl_vidnt.c b/engine/gl/gl_vidnt.c index 4d0a7496..f4ff64f9 100644 --- a/engine/gl/gl_vidnt.c +++ b/engine/gl/gl_vidnt.c @@ -37,14 +37,26 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #endif #ifndef MK_XBUTTON1 #define MK_XBUTTON1 0x0020 +#endif +#ifndef MK_XBUTTON2 #define MK_XBUTTON2 0x0040 +#endif // copied from DarkPlaces in an attempt to grab more buttons +#ifndef MK_XBUTTON3 #define MK_XBUTTON3 0x0080 +#endif +#ifndef MK_XBUTTON4 #define MK_XBUTTON4 0x0100 +#endif +#ifndef MK_XBUTTON5 #define MK_XBUTTON5 0x0200 +#endif +#ifndef MK_XBUTTON6 #define MK_XBUTTON6 0x0400 +#endif +#ifndef MK_XBUTTON7 #define MK_XBUTTON7 0x0800 -#endif +#endif #ifndef WM_INPUT #define WM_INPUT 255 diff --git a/engine/sw/vid_win2.c b/engine/sw/vid_win2.c index 8577a627..0f55c3fe 100644 --- a/engine/sw/vid_win2.c +++ b/engine/sw/vid_win2.c @@ -51,14 +51,26 @@ extern int r_flushcache; #endif #ifndef MK_XBUTTON1 #define MK_XBUTTON1 0x0020 +#endif +#ifndef MK_XBUTTON2 #define MK_XBUTTON2 0x0040 +#endif // copied from DarkPlaces in an attempt to grab more buttons +#ifndef MK_XBUTTON3 #define MK_XBUTTON3 0x0080 +#endif +#ifndef MK_XBUTTON4 #define MK_XBUTTON4 0x0100 +#endif +#ifndef MK_XBUTTON5 #define MK_XBUTTON5 0x0200 +#endif +#ifndef MK_XBUTTON6 #define MK_XBUTTON6 0x0400 +#endif +#ifndef MK_XBUTTON7 #define MK_XBUTTON7 0x0800 -#endif +#endif #ifndef WM_INPUT #define WM_INPUT 255