# HG changeset patch # User Ritor1 # Date 1405417485 -21600 # Node ID 2d3c3d1dff0cb142e95b185680e72b9a8ab02da1 # Parent b29880e9ee79910f46aeaaba616449049bc8bc3a added RenderStruct.h diff -r b29880e9ee79 -r 2d3c3d1dff0c Build/Visual Studio 2010/World of Might and Magic.vcxproj --- a/Build/Visual Studio 2010/World of Might and Magic.vcxproj Mon Jul 14 19:48:47 2014 +0600 +++ b/Build/Visual Studio 2010/World of Might and Magic.vcxproj Tue Jul 15 15:44:45 2014 +0600 @@ -460,6 +460,7 @@ + diff -r b29880e9ee79 -r 2d3c3d1dff0c Build/Visual Studio 2010/World of Might and Magic.vcxproj.filters --- a/Build/Visual Studio 2010/World of Might and Magic.vcxproj.filters Mon Jul 14 19:48:47 2014 +0600 +++ b/Build/Visual Studio 2010/World of Might and Magic.vcxproj.filters Tue Jul 15 15:44:45 2014 +0600 @@ -533,6 +533,7 @@ UI + diff -r b29880e9ee79 -r 2d3c3d1dff0c DirectX11.cpp --- a/DirectX11.cpp Mon Jul 14 19:48:47 2014 +0600 +++ b/DirectX11.cpp Tue Jul 15 15:44:45 2014 +0600 @@ -1,6 +1,8 @@ +#define _CRT_SECURE_NO_WARNINGS #define WIN32_LEAN_AND_MEAN #include "DirectX11.h" +#include "RenderStruct.h" HRESULT D3D11::InitDevice() { @@ -54,7 +56,7 @@ // Теперь создаем задний буфер. Обратите внимание, в SDK // RenderTargetOutput - это передний буфер, а RenderTargetView - задний. - ID3D11Texture2D* pBackBuffer = NULL; + pBackBuffer = NULL; hr = g_pSwapChain->GetBuffer( 0, __uuidof(ID3D11Texture2D), (LPVOID*)&pBackBuffer ); if (FAILED(hr)) return hr; @@ -102,4 +104,4 @@ void Render() { -} \ No newline at end of file +} diff -r b29880e9ee79 -r 2d3c3d1dff0c DirectX11.h --- a/DirectX11.h Mon Jul 14 19:48:47 2014 +0600 +++ b/DirectX11.h Tue Jul 15 15:44:45 2014 +0600 @@ -10,23 +10,42 @@ #include "VectorTypes.h" #include -#include +#include "RenderStruct.h" #pragma comment(lib, "d3d11.lib") class D3D11 { HINSTANCE g_hInst; HWND g_hWnd; - D3D_DRIVER_TYPE g_driverType; //Этот параметр указывает, производить вычисления в видеокарте или в центральном процессоре. - D3D_FEATURE_LEVEL g_featureLevel; //параметр, указывающий, какую версию DirectX поддерживает наша видеокарта. - ID3D11Device* g_pd3dDevice; - ID3D11DeviceContext* g_pImmediateContext; - IDXGISwapChain* g_pSwapChain; + D3D_DRIVER_TYPE g_driverType; //Этот параметр указывает, производить вычисления в видеокарте или в центральном процессоре. + D3D_FEATURE_LEVEL g_featureLevel; //параметр, указывающий, какую версию DirectX поддерживает наша видеокарта. + ID3D11Device* g_pd3dDevice; //устройство d3d11 + ID3D11DeviceContext* g_pImmediateContext;// контекст устройства + IDXGISwapChain* g_pSwapChain; // цепочка обмена ID3D11RenderTargetView* g_pRenderTargetView; public: + int *pActiveZBuffer; + //IDirectDraw4 *pDirectDraw4; + //IDirectDrawSurface4 *pFrontBuffer4; + //IDirectDrawSurface4 *pBackBuffer4; + ID3D11Texture2D* pBackBuffer; + void *pTargetSurface; + unsigned int uTargetSurfacePitch; + unsigned int bUseColoredLights; + unsigned int bTinting; + unsigned int bUsingSpecular; + uint32_t uFogColor; + unsigned int pHDWaterBitmapIDs[7]; + int hd_water_current_frame; + int hd_water_tile_id; + void (*pBeforePresentFunction)(); + uint32_t bFogEnabled; + RenderBillboardD3D pBillboardRenderListD3D[1000]; + unsigned int uNumBillboardsToDraw; + D3D11(): g_hInst(NULL), g_hWnd(NULL), g_driverType(D3D_DRIVER_TYPE_NULL), g_featureLevel(D3D_FEATURE_LEVEL_11_0), g_pd3dDevice(NULL), g_pImmediateContext(NULL), g_pSwapChain(NULL), g_pRenderTargetView(NULL){} @@ -34,6 +53,7 @@ HRESULT InitDevice(); // Инициализация устройств DirectX void CleanupDevice(); // Удаление созданнных устройств DirectX //void Render(); // Функция рисования + bool Initialize(OSWindow *window, bool bColoredLights, uint32_t uDetailLevel, bool bTinting); @@ -164,4 +184,14 @@ void am_Blt_Copy(RECT *pSrcRect, POINT *pTargetXY, int a3); void am_Blt_Chroma(RECT *pSrcRect, POINT *pTargetPoint, int a3, int blend_mode); + + inline void ToggleTint() {bTinting = !bTinting;} + inline void ToggleColoredLights() {bUseColoredLights = !bUseColoredLights;} + + inline unsigned int GetRenderWidth() {return window->GetWidth();} + inline unsigned int GetRenderHeight() {return window->GetHeight();} + + + friend void Present_NoColorKey(); + }; diff -r b29880e9ee79 -r 2d3c3d1dff0c Render.cpp --- a/Render.cpp Mon Jul 14 19:48:47 2014 +0600 +++ b/Render.cpp Tue Jul 15 15:44:45 2014 +0600 @@ -1333,9 +1333,9 @@ //IDirectDraw4 *v9; // eax@16 //IDirectDraw4 *v10; // eax@20 //IDirectDraw4 *v13; // eax@35 - const char *v23; // [sp-4h] [bp-DCh]@9 - const char *v24; // [sp-4h] [bp-DCh]@13 - const char *v25; // [sp-4h] [bp-DCh]@19 + //const char *v23; // [sp-4h] [bp-DCh]@9 + //const char *v24; // [sp-4h] [bp-DCh]@13 + //const char *v25; // [sp-4h] [bp-DCh]@19 DWORD v26; // [sp-4h] [bp-DCh]@30 DDSCAPS2 v27; // [sp+Ch] [bp-CCh]@37 DDSURFACEDESC2 ddsd2; // [sp+1Ch] [bp-BCh]@11 @@ -1370,9 +1370,7 @@ { if (FAILED(pHost->SetCooperativeLevel(hWnd, DDSCL_MULTITHREADED | DDSCL_NORMAL))) { - v23 = "Init - Failed to set cooperative level.\n"; - sprintf(pErrorMessage, v23); -LABEL_65: + sprintf(pErrorMessage, "Init - Failed to set cooperative level.\n"); if (pHost) { pHost->Release(); @@ -1390,8 +1388,18 @@ pHost->GetDisplayMode(&ddsd2); if ( FORCE_16_BITS && ddsd2.ddpfPixelFormat.dwRGBBitCount != 16 ) { - v24 = "Init - Desktop isn't in 16 bit mode.\n"; - goto LABEL_14; + sprintf(pErrorMessage, "Init - Desktop isn't in 16 bit mode.\n"); + if (pFrontBuffer) + { + pFrontBuffer->Release(); + pFrontBuffer = 0; + } + if (pHost) + { + pHost->Release(); + pHost = 0; + } + return 0; } ddsd2.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT; @@ -1400,20 +1408,38 @@ ddsd2.dwHeight = game_height; if (pHost->CreateSurface(&ddsd2, &pBackBuffer, 0) ) { - v24 = "Init - Failed to create back buffer.\n"; -LABEL_14: - sprintf(pErrorMessage, v24); + sprintf(pErrorMessage, "Init - Failed to create back buffer.\n"); if (pFrontBuffer) { pFrontBuffer->Release(); pFrontBuffer = 0; } - goto LABEL_65; + if (pHost) + { + pHost->Release(); + pHost = 0; + } + return 0; } if ( pHost->CreateClipper(0, &v30, 0) ) { - v25 = "Init - Failed to create clipper.\n"; - goto LABEL_45; + sprintf(pErrorMessage, "Init - Failed to create clipper.\n"); + if (pBackBuffer) + { + pBackBuffer->Release(); + pBackBuffer = 0; + } + if (pFrontBuffer) + { + pFrontBuffer->Release(); + pFrontBuffer= 0; + } + if (pHost) + { + pHost->Release(); + pHost = 0; + } + return 0; } v30->SetHWnd(0, hWnd); pFrontBuffer->SetClipper(v30); @@ -1431,7 +1457,25 @@ if ( pDirect3D->EnumZBufferFormats(*pAvailableDevices[uDeviceID].pGUID, (HRESULT (__stdcall *)(DDPIXELFORMAT *, void *))D3DZBufferFormatEnumerator, &ddsd2.ddpfPixelFormat) ) - goto LABEL_21; + { + sprintf(pErrorMessage, "Init - Failed to enumerate Z buffer formats.\n"); + if (pBackBuffer) + { + pBackBuffer->Release(); + pBackBuffer = 0; + } + if (pFrontBuffer) + { + pFrontBuffer->Release(); + pFrontBuffer= 0; + } + if (pHost) + { + pHost->Release(); + pHost = 0; + } + return 0; + } if ( uDeviceID == 2 || uDeviceID == 3 ) ddsd2.ddsCaps.dwCaps |= DDSCAPS_SYSTEMMEMORY; @@ -1439,10 +1483,7 @@ { if ( !pBackBuffer->AddAttachedSurface(pZBuffer) ) { - if ( !pDirect3D->CreateDevice(*pAvailableDevices[uDeviceID].pGUID, - pBackBuffer, - &pDevice, - 0) ) + if ( !pDirect3D->CreateDevice(*pAvailableDevices[uDeviceID].pGUID, pBackBuffer, &pDevice, 0) ) { memset(&d3dvp2, 0, sizeof(D3DVIEWPORT2)); d3dvp2.dvClipWidth = 2.0; @@ -1452,30 +1493,82 @@ d3dvp2.dvMinZ = 0.0; goto LABEL_54; } -LABEL_51: sprintf(pErrorMessage, "Init - Failed to create D3D device.\n"); if (pDirect3D) { pDirect3D->Release(); pDirect3D = 0; } - goto LABEL_59; + if (pZBuffer) + { + pZBuffer->Release(); + pZBuffer = 0; + } + if (pBackBuffer) + { + pBackBuffer->Release(); + pBackBuffer = 0; + } + if (pFrontBuffer) + { + pFrontBuffer->Release(); + pFrontBuffer= 0; + } + if (pHost) + { + pHost->Release(); + pHost = 0; + } + return 0; } -LABEL_48: sprintf(pErrorMessage, "Init - Failed to attach z-buffer to back buffer.\n"); if (pZBuffer) { pZBuffer->Release(); pZBuffer = 0; } - goto LABEL_61; - } - goto LABEL_44; - } -LABEL_36: - v23 = "Init - Failed to create front buffer.\n"; - sprintf(pErrorMessage, v23); - goto LABEL_65; + if (pBackBuffer) + { + pBackBuffer->Release(); + pBackBuffer = 0; + } + if (pFrontBuffer) + { + pFrontBuffer->Release(); + pFrontBuffer= 0; + } + if (pHost) + { + pHost->Release(); + pHost = 0; + } + return 0; + } + sprintf(pErrorMessage, "Init - Failed to create z-buffer.\n"); + if (pBackBuffer) + { + pBackBuffer->Release(); + pBackBuffer = 0; + } + if (pFrontBuffer) + { + pFrontBuffer->Release(); + pFrontBuffer= 0; + } + if (pHost) + { + pHost->Release(); + pHost = 0; + } + return 0; + } + sprintf(pErrorMessage, "Init - Failed to create front buffer.\n"); + if (pHost) + { + pHost->Release(); + pHost = 0; + } + return 0; } if ( uDeviceID == 1 ) v26 = 1045; @@ -1483,15 +1576,23 @@ v26 = 1041; if (pHost->SetCooperativeLevel(hWnd, v26) ) { - v23 = "Init - Failed to set cooperative level.\n"; - sprintf(pErrorMessage, v23); - goto LABEL_65; + sprintf(pErrorMessage, "Init - Failed to set cooperative level.\n"); + if (pHost) + { + pHost->Release(); + pHost = 0; + } + return 0; } if (pHost->SetDisplayMode(window->GetWidth(), window->GetHeight(), 16, 0, 0) ) { - v23 = "Init - Failed to set display mode.\n"; - sprintf(pErrorMessage, v23); - goto LABEL_65; + sprintf(pErrorMessage, "Init - Failed to set display mode.\n"); + if (pHost) + { + pHost->Release(); + pHost = 0; + } + return 0; } memset(&ddsd2, 0, sizeof(DDSURFACEDESC2)); @@ -1500,7 +1601,15 @@ ddsd2.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE | DDSCAPS_3DDEVICE | DDSCAPS_FLIP | DDSCAPS_COMPLEX; ddsd2.dwBackBufferCount = 1; if ( pHost->CreateSurface(&ddsd2, &pFrontBuffer, 0) ) - goto LABEL_36; + { + sprintf(pErrorMessage, "Init - Failed to create front buffer.\n"); + if (pHost) + { + pHost->Release(); + pHost = 0; + } + return 0; + } //a3a = &pBackBuffer; //v14 = *v34; memset(&v27, 0, sizeof(DDSCAPS2)); @@ -1510,8 +1619,23 @@ pHost->QueryInterface(IID_IDirect3D3, (LPVOID *)&pDirect3D); if (FAILED(pFrontBuffer->GetAttachedSurface(&v27, &pBackBuffer))) { - v25 = "Init - Failed to get D3D interface.\n"; - goto LABEL_45; + sprintf(pErrorMessage, "Init - Failed to get D3D interface.\n"); + if (pBackBuffer) + { + pBackBuffer->Release(); + pBackBuffer = 0; + } + if (pFrontBuffer) + { + pFrontBuffer->Release(); + pFrontBuffer= 0; + } + if (pHost) + { + pHost->Release(); + pHost = 0; + } + return 0; } ddsd2.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT | DDSD_PIXELFORMAT; @@ -1522,41 +1646,103 @@ (HRESULT (__stdcall *)(DDPIXELFORMAT *, void *))D3DZBufferFormatEnumerator, &ddsd2.ddpfPixelFormat) ) { -LABEL_21: - v25 = "Init - Failed to enumerate Z buffer formats.\n"; - goto LABEL_45; + sprintf(pErrorMessage, "Init - Failed to enumerate Z buffer formats.\n"); + if (pBackBuffer) + { + pBackBuffer->Release(); + pBackBuffer = 0; + } + if (pFrontBuffer) + { + pFrontBuffer->Release(); + pFrontBuffer= 0; + } + if (pHost) + { + pHost->Release(); + pHost = 0; + } + return 0; } if ( uDeviceID == 2 || uDeviceID == 3 ) BYTE1(ddsd2.ddsCaps.dwCaps) |= 8u; //uDeviceIDa = &pZBuffer; if (pHost->CreateSurface(&ddsd2, &pZBuffer, 0) ) { -LABEL_44: - v25 = "Init - Failed to create z-buffer.\n"; -LABEL_45: - sprintf(pErrorMessage, v25); + sprintf(pErrorMessage, "Init - Failed to create z-buffer.\n"); + if (pBackBuffer) + { + pBackBuffer->Release(); + pBackBuffer = 0; + } + if (pFrontBuffer) + { + pFrontBuffer->Release(); + pFrontBuffer= 0; + } + if (pHost) + { + pHost->Release(); + pHost = 0; + } + return 0; + } + if (pBackBuffer->AddAttachedSurface(pZBuffer)) + { + sprintf(pErrorMessage, "Init - Failed to attach z-buffer to back buffer.\n"); + if (pZBuffer) + { + pZBuffer->Release(); + pZBuffer = 0; + } if (pBackBuffer) { pBackBuffer->Release(); pBackBuffer = 0; } -LABEL_63: - //v19 = &pFrontBuffer; if (pFrontBuffer) { pFrontBuffer->Release(); pFrontBuffer= 0; } - goto LABEL_65; - } - if (pBackBuffer->AddAttachedSurface(pZBuffer)) - goto LABEL_48; + if (pHost) + { + pHost->Release(); + pHost = 0; + } + return 0; + } //v33 = &pDevice; - if (pDirect3D->CreateDevice(*pAvailableDevices[uDeviceID].pGUID, - pBackBuffer, - &pDevice, - 0) ) - goto LABEL_51; + if (pDirect3D->CreateDevice(*pAvailableDevices[uDeviceID].pGUID, pBackBuffer, &pDevice, 0) ) + { + sprintf(pErrorMessage, "Init - Failed to create D3D device.\n"); + if (pDirect3D) + { + pDirect3D->Release(); + pDirect3D = 0; + } + if (pZBuffer) + { + pZBuffer->Release(); + pZBuffer = 0; + } + if (pBackBuffer) + { + pBackBuffer->Release(); + pBackBuffer = 0; + } + if (pFrontBuffer) + { + pFrontBuffer->Release(); + pFrontBuffer= 0; + } + if (pHost) + { + pHost->Release(); + pHost = 0; + } + return 0; + } memset(&d3dvp2, 0, sizeof(D3DVIEWPORT2)); d3dvp2.dvClipWidth = 2.0; d3dvp2.dvClipY = 1.0; @@ -1584,19 +1770,27 @@ pDirect3D->Release(); pDirect3D = 0; } -LABEL_59: if (pZBuffer) { pZBuffer->Release(); pZBuffer = 0; } -LABEL_61: if (pBackBuffer) { pBackBuffer->Release(); pBackBuffer = 0; } - goto LABEL_63; + if (pFrontBuffer) + { + pFrontBuffer->Release(); + pFrontBuffer= 0; + } + if (pHost) + { + pHost->Release(); + pHost = 0; + } + return 0; } pDevice->AddViewport(pViewport); @@ -2769,26 +2963,26 @@ //----- (0049FD3A) -------------------------------------------------------- void Render::_49FD3A_fullscreen() { - Render *v2; // esi@1 - IDirectDrawSurface4 *v3; // eax@6 - IDirectDrawSurface4 *v4; // ST0C_4@6 + //Render *v2; // esi@1 + //IDirectDrawSurface4 *v3; // eax@6 + //IDirectDrawSurface4 *v4; // ST0C_4@6 RECT v5; // [sp+8h] [bp-10h]@6 - Render* a1 = this; - v2 = a1; - if ( a1->pRenderD3D ) + //Render* a1 = this; + //v2 = this; + if ( this->pRenderD3D ) { if (pFrontBuffer4->IsLost() == DDERR_SURFACELOST) pFrontBuffer4->Restore(); if (pBackBuffer4->IsLost() == DDERR_SURFACELOST) pBackBuffer4->Restore(); - v3 = v2->pBackBuffer4; - v4 = v2->pFrontBuffer4; + //v3 = this->pBackBuffer4; + //v4 = this->pFrontBuffer4; v5.top = 0; v5.bottom = window->GetHeight(); v5.left = 0; v5.right = window->GetWidth(); - v3->BltFast(0, 0, v4, &v5, 16u); + this->pBackBuffer4->BltFast(0, 0, this->pFrontBuffer4, &v5, 16); } } @@ -2805,7 +2999,7 @@ //----- (0049FE05) -------------------------------------------------------- void Render::Release() { - Render *v1; // esi@1 + //Render *v1; // esi@1 //RenderD3D *v2; // ecx@1 //char v3; // zf@4 //void *v4; // ebx@6 @@ -2822,22 +3016,22 @@ // unsigned __int16 **v15; // ebx@28 // void **v16; // esi@29 - v1 = this; + // v1 = this; if (pRenderD3D) { - if ( v1->using_software_screen_buffer ) + if ( this->using_software_screen_buffer ) { pRenderD3D->ClearTarget(true, 0, false, 1.0); pRenderD3D->Present(0); pRenderD3D->ClearTarget(true, 0, false, 1.0); } - //v1->pColorKeySurface4 = 0; - v1->pBackBuffer4 = nullptr; - v1->pFrontBuffer4 = nullptr; - v1->pDirectDraw4 = nullptr; - delete [] v1->pTargetSurface_unaligned; - v1->pTargetSurface = nullptr; - v1->pTargetSurface_unaligned = nullptr; + //this->pColorKeySurface4 = 0; + this->pBackBuffer4 = nullptr; + this->pFrontBuffer4 = nullptr; + this->pDirectDraw4 = nullptr; + delete [] this->pTargetSurface_unaligned; + this->pTargetSurface = nullptr; + this->pTargetSurface_unaligned = nullptr; if (pRenderD3D) { pRenderD3D->Release(); @@ -2850,72 +3044,72 @@ /*{ if ( bWinNT4_0 == 1 ) { - v5 = (IDirectDraw *)v1->pDirectDraw2; + v5 = (IDirectDraw *)this->pDirectDraw2; if ( !v5 ) return; - v5->SetCooperativeLevel(v1->hWnd, 8u); - v1->pDirectDraw2->FlipToGDISurface(); - v6 = v1->pSomeSurface2; + v5->SetCooperativeLevel(this->hWnd, 8u); + this->pDirectDraw2->FlipToGDISurface(); + v6 = this->pSomeSurface2; if ( v6 ) { v6->Release(); - v1->pSomeSurface2 = 0; - } - v7 = v1->pBackBuffer2; + this->pSomeSurface2 = 0; + } + v7 = this->pBackBuffer2; if ( v7 ) { v7->Release(); - v1->pBackBuffer2 = 0; - } - v8 = v1->pFrontBuffer2; + this->pBackBuffer2 = 0; + } + v8 = this->pFrontBuffer2; if ( v8 ) { v8->Release(); - v1->pFrontBuffer2 = 0; - } - v9 = v1->pDirectDraw2; + this->pFrontBuffer2 = 0; + } + v9 = this->pDirectDraw2; if ( v9 ) { v9->Release(); - v1->pDirectDraw2 = 0; + this->pDirectDraw2 = 0; } } else { - v10 = v1->pDirectDraw4; + v10 = this->pDirectDraw4; if ( !v10 ) return; - v10->SetCooperativeLevel(v1->hWnd, 1032u); - v1->pDirectDraw4->FlipToGDISurface(); - v11 = v1->pColorKeySurface4; + v10->SetCooperativeLevel(this->hWnd, 1032u); + this->pDirectDraw4->FlipToGDISurface(); + v11 = this->pColorKeySurface4; if ( v11 ) { v11->Release(); - v1->pColorKeySurface4 = 0; - } - v12 = v1->pBackBuffer4; + this->pColorKeySurface4 = 0; + } + v12 = this->pBackBuffer4; if ( v12 ) { v12->Release(); - v1->pBackBuffer4 = 0; - } - v13 = v1->pFrontBuffer4; + this->pBackBuffer4 = 0; + } + v13 = this->pFrontBuffer4; if ( v13 ) { v13->Release(); - v1->pFrontBuffer4 = 0; - } - v14 = v1->pDirectDraw4; + this->pFrontBuffer4 = 0; + } + v14 = this->pDirectDraw4; if ( v14 ) { v14->Release(); - v1->pDirectDraw4 = 0; - } - } - v15 = &v1->pTargetSurface; - if ( v1->pTargetSurface ) - { - v16 = (void **)&v1->ptr_400E8; + this->pDirectDraw4 = 0; + } + } + v15 = &this->pTargetSurface; + if ( this->pTargetSurface ) + { + v16 = (void **)&this->ptr_400E8; free(*v16); *v15 = 0; *v16 = 0; @@ -2923,9 +3117,6 @@ }*/ } - - - void Present32(unsigned __int32 *src, unsigned int src_pitch, unsigned __int32 *dst, unsigned int dst_pitch) { @@ -3136,12 +3327,12 @@ //HWND v3; // ebx@1 //void *v4; // eax@2 //RenderD3D *v5; // eax@3 - unsigned int v6; // edx@5 + //unsigned int v6; // edx@5 RenderD3D__DevInfo *v7; // ecx@5 bool v8; // eax@6 - RenderD3D *v9; // ecx@13 + //RenderD3D *v9; // ecx@13 unsigned int v10; // eax@13 - RenderD3D *v11; // eax@25 + //RenderD3D *v11; // eax@25 // HRESULT v12; // eax@25 int v13; // ecx@25 int v14; // eax@27 @@ -3157,7 +3348,7 @@ DDSURFACEDESC2 pDesc; // [sp+108h] [bp-204h]@40 D3DDEVICEDESC halCaps; // [sp+184h] [bp-188h]@25 // DDSURFACEDESC2 ddsd2; // [sp+280h] [bp-8Ch]@38 - void *v28; // [sp+2FCh] [bp-10h]@2 + //void *v28; // [sp+2FCh] [bp-10h]@2 int v29; // [sp+308h] [bp-4h]@2 __debugbreak(); // Nomad @@ -3185,20 +3376,16 @@ else {*/ pRenderD3D = new RenderD3D; - v28 = pRenderD3D; - v6 = uDesiredDirect3DDevice; + //v28 = pRenderD3D; + //v6 = uDesiredDirect3DDevice; v29 = -1; v7 = pRenderD3D->pAvailableDevices; - if ( v7[v6].bIsDeviceCompatible ) - { - v8 = pRenderD3D->CreateDevice(v6, /*0*/true, window); - } + if ( pRenderD3D->pAvailableDevices[uDesiredDirect3DDevice].bIsDeviceCompatible ) + v8 = pRenderD3D->CreateDevice(uDesiredDirect3DDevice, /*0*/true, window); else { if ( v7[1].bIsDeviceCompatible ) - { v8 = pRenderD3D->CreateDevice(1, /*0*/true, window); - } else { if ( !v7->bIsDeviceCompatible ) @@ -3210,10 +3397,10 @@ if ( !v8 ) Error("D3Drend->Init failed."); - v9 = pRenderD3D; - pBackBuffer4 = v9->pBackBuffer; - pFrontBuffer4 = v9->pFrontBuffer; - pDirectDraw4 = v9->pHost; + //v9 = pRenderD3D; + pBackBuffer4 = pRenderD3D->pBackBuffer; + pFrontBuffer4 = pRenderD3D->pFrontBuffer; + pDirectDraw4 = pRenderD3D->pHost; v10 = pRenderD3D->GetDeviceCaps(); if ( v10 & 1 ) { @@ -3260,9 +3447,9 @@ memset(&halCaps, 0, 0xFCu); halCaps.dwSize = 252; memset(&refCaps, 0, 0xFCu); - v11 = pRenderD3D; + //v11 = pRenderD3D; refCaps.dwSize = 252; - ErrD3D(v11->pDevice->GetCaps(&halCaps, &refCaps)); + ErrD3D(pRenderD3D->pDevice->GetCaps(&halCaps, &refCaps)); v13 = halCaps.dwMinTextureWidth; if ( (unsigned int)halCaps.dwMinTextureWidth >= halCaps.dwMinTextureHeight ) v13 = halCaps.dwMinTextureHeight; @@ -3342,7 +3529,7 @@ using_software_screen_buffer = v15; //} bWindowMode = 0; - pParty->uFlags |= 2u; + pParty->uFlags |= 2; pViewport->SetFOV(flt_6BE3A0 * 65536.0f); return v15 != 0; } @@ -3995,7 +4182,7 @@ //----- (004A121C) -------------------------------------------------------- void Render::CreateFrontBuffer() { - Render *v1; // esi@1 + //Render *v1; // esi@1 IDirectDraw *pDD; // eax@3 IDirectDrawSurface **pOutSurf; // esi@3 struct _DDSURFACEDESC *v4; // edx@3 @@ -4004,18 +4191,18 @@ unsigned int v7; // [sp-4h] [bp-88h]@3 DDSURFACEDESC2 a2; // [sp+4h] [bp-80h]@3 - v1 = this; + //v1 = this; //if (pVersion->pVersionInfo.dwPlatformId != VER_PLATFORM_WIN32_NT || //pVersion->pVersionInfo.dwMajorVersion != 4 ) { memset(&a2, 0, 0x7Cu); - pDD = (IDirectDraw *)v1->pDirectDraw4; + pDD = (IDirectDraw *)this->pDirectDraw4; a2.dwSize = 124; a2.dwFlags = 1; v7 = 0; a2.ddsCaps.dwCaps = 512; v6 = 2357; - pOutSurf = (IDirectDrawSurface **)&v1->pFrontBuffer4; + pOutSurf = (IDirectDrawSurface **)&this->pFrontBuffer4; v4 = (struct _DDSURFACEDESC *)&a2; } /*else @@ -4036,7 +4223,7 @@ //----- (004A12CD) -------------------------------------------------------- void Render::CreateBackBuffer() { - Render *v1; // esi@1 + //Render *v1; // esi@1 IDirectDraw *v2; // eax@3 IDirectDrawSurface **ppBackBuffer; // esi@3 struct _DDSURFACEDESC *v4; // edx@3 @@ -4045,12 +4232,12 @@ unsigned int v7; // [sp-4h] [bp-88h]@3 DDSURFACEDESC2 a2; // [sp+4h] [bp-80h]@3 - v1 = this; + //v1 = this; //if (pVersion->pVersionInfo.dwPlatformId != VER_PLATFORM_WIN32_NT || // pVersion->pVersionInfo.dwMajorVersion != 4 ) { memset(&a2, 0, 0x7Cu); - v2 = (IDirectDraw *)v1->pDirectDraw4; + v2 = (IDirectDraw *)this->pDirectDraw4; a2.dwSize = 124; a2.dwFlags = 7; v7 = 0; @@ -4058,7 +4245,7 @@ a2.dwWidth = window->GetWidth(); a2.dwHeight = window->GetHeight(); v6 = 2387; - ppBackBuffer = (IDirectDrawSurface **)&v1->pBackBuffer4; + ppBackBuffer = (IDirectDrawSurface **)&this->pBackBuffer4; v4 = (struct _DDSURFACEDESC *)&a2; } /*else @@ -4081,7 +4268,7 @@ //----- (004A139A) -------------------------------------------------------- void Render::CreateDirectDrawPrimarySurface() { - Render *v1; // esi@1 + //Render *v1; // esi@1 //int v2; // ebx@3 // IDirectDraw2 *v3; // eax@3 // HRESULT v4; // eax@3 @@ -4100,24 +4287,21 @@ DDSCAPS2 v17; // [sp+88h] [bp-18h]@4 // int a4; // [sp+98h] [bp-8h]@3 - v1 = this; + //v1 = this; //if (pVersion->pVersionInfo.dwPlatformId != VER_PLATFORM_WIN32_NT || //pVersion->pVersionInfo.dwMajorVersion != 4 ) { //v2 = 0; //this->field_4004C = 1; memset(&ddsd2, 0, 0x7Cu); - v7 = v1->pDirectDraw4; + v7 = this->pDirectDraw4; ddsd2.dwBackBufferCount = 1; ddsd2.dwSize = 0x7Cu; ddsd2.dwFlags = DDSD_CAPS | DDSD_BACKBUFFERCOUNT; ddsd2.ddsCaps.dwCaps = DDSCAPS_COMPLEX | DDSCAPS_FLIP | DDSCAPS_3DDEVICE | DDSCAPS_PRIMARYSURFACE; - ErrD3D(v7->CreateSurface( - &ddsd2, - &pFrontBuffer4, - 0)); - pFrontBuffer = (IDirectDrawSurface *)v1->pFrontBuffer4; - ppBackBuffer = (IDirectDrawSurface **)&v1->pBackBuffer4; + ErrD3D(v7->CreateSurface(&ddsd2, &pFrontBuffer4, 0)); + pFrontBuffer = (IDirectDrawSurface *)this->pFrontBuffer4; + ppBackBuffer = (IDirectDrawSurface **)&this->pBackBuffer4; } /*else { diff -r b29880e9ee79 -r 2d3c3d1dff0c Render.h --- a/Render.h Mon Jul 14 19:48:47 2014 +0600 +++ b/Render.h Tue Jul 15 15:44:45 2014 +0600 @@ -5,282 +5,10 @@ #include "lib\legacy_dx\d3d.h" #include "OSWindow.h" +#include "RenderStruct.h" #include "VectorTypes.h" - -#define ErrD3D(hr) \ - do \ - { \ - extern void ErrHR(HRESULT, const char *, const char *, const char *, int); \ - ErrHR(hr, "Direct3D", __FUNCTION__, __FILE__, __LINE__); \ - } while(0) - -struct Polygon; -struct Texture; -struct RGBTexture; -struct RenderBillboardTransform_local0; -struct ODMFace; - - -unsigned __int16 Color16(unsigned __int32 r, unsigned __int32 g, unsigned __int32 b); -unsigned __int32 Color32(unsigned __int16 color16); - -/* 119 */ -#pragma pack(push, 1) -struct RenderVertexSoft -{ - inline RenderVertexSoft(): - flt_2C(0.0f) - {} - - Vec3_float_ vWorldPosition; - Vec3_float_ vWorldViewPosition; - float vWorldViewProjX; - float vWorldViewProjY; - float _rhw; - float u; - float v; - float flt_2C; -}; -#pragma pack(pop) - - - -/* 112 */ -#pragma pack(push, 1) -struct RenderVertexD3D3 -{ - Vec3_float_ pos; - float rhw; - signed int diffuse; - unsigned int specular; - Vec2_float_ texcoord; -}; -#pragma pack(pop) - -class Sprite; -class SpriteFrame; - -/* 161 */ -#pragma pack(push, 1) -struct RenderBillboard -{ - int _screenspace_x_scaler_packedfloat; - int _screenspace_y_scaler_packedfloat; - float fov_x; - float fov_y; - union - { - int sZValue; - struct - { - unsigned __int16 object_pid; - signed __int16 actual_z; - }; - }; - int field_14_actor_id; - signed __int16 HwSpriteID; - __int16 uPalette; - __int16 uIndoorSectorID; - __int16 field_1E; - __int16 world_x; - __int16 world_y; - __int16 world_z; - __int16 uScreenSpaceX; - __int16 uScreenSpaceY; - unsigned __int16 dimming_level; - signed int sTintColor; - SpriteFrame *pSpriteFrame; - - inline float GetFloatZ() const - { - return (float)object_pid / 65535.0f + (float)actual_z; - } -}; -#pragma pack(pop) - - -#pragma pack(push, 1) -struct RenderD3D__DevInfo -{ - unsigned int bIsDeviceCompatible; - char *pName; - char *pDescription; - GUID *pGUID; - unsigned int uCaps; - char *pDriverName; - char *pDeviceDesc; - char *pDDraw4DevDesc; - GUID *pDirectDrawGUID; - int uVideoMem; -}; -#pragma pack(pop) - - - -#pragma pack(push, 1) -struct RenderD3D_D3DDevDesc -{ - int field_0; - int field_4; - int field_8; - int field_C; - int field_10; - char *pDriverName; - char *pDeviceDesc; - char *pDDraw4DevDesc; - GUID *pGUID; - unsigned int uVideoMem; -}; -#pragma pack(pop) - - - - - - - - - -/* 280 */ -#pragma pack(push, 1) -struct HWLTexture -{ - inline HWLTexture(): - field_0(0), field_4(0), field_8(0), - field_C(0), field_10(0), field_14(0) - {} - - int field_0; - int field_4; - int field_8; - int field_C; - int field_10; - int field_14; - int uBufferWidth; - int uBufferHeight; - int uAreaWidth; - int uAreaHeigth; - unsigned int uWidth; - unsigned int uHeight; - int uAreaX; - int uAreaY; - unsigned __int16 *pPixels; -}; -#pragma pack(pop) - - -/* 185 */ -#pragma pack(push, 1) -struct RenderHWLContainer -{ - RenderHWLContainer(); - bool Load(const wchar_t *pFilename); - bool Release(); - - HWLTexture *LoadTexture(const char *pName, int bMipMaps); - - FILE *pFile; - uint32_t uSignature; - unsigned int uDataOffset; - unsigned int uNumItems; - char *pSpriteNames[50000]; - int pSpriteOffsets[50000]; - int bDumpDebug; - int scale_hwls_to_half; -}; -#pragma pack(pop) - - - -/* 242 */ -#pragma pack(push, 1) -struct RenderBillboardD3D -{ - inline RenderBillboardD3D(): - opacity(Transparent), - field_90(-1), - sParentBillboardID(-1), - uNumVertices(4) - {} - - enum OpacityType: unsigned __int32 - { - Transparent = 0, - Opaque_1 = 1, - Opaque_2 = 2, - Opaque_3 = 3, - NoBlend = 0xFFFFFFFF - }; - - IDirect3DTexture2 *pTexture; - unsigned int uNumVertices; - RenderVertexD3D3 pQuads[4]; - float z_order; - OpacityType opacity; - int field_90; - int sZValue; - signed int sParentBillboardID; -}; -#pragma pack(pop) - - - - -#pragma pack(push, 1) -struct RenderD3D_aux -{ - RenderD3D__DevInfo *pInfo; - RenderD3D_D3DDevDesc *ptr_4; -}; -#pragma pack(pop) - - - -/* 183 */ -#pragma pack(push, 1) -class RenderD3D -{ -public: - RenderD3D(); - - void GetAvailableDevices(RenderD3D__DevInfo **pOutDevices); - void Release(); - bool CreateDevice(unsigned int uDeviceID, int bWindowed, OSWindow *window); - unsigned int GetDeviceCaps(); - void ClearTarget(unsigned int bClearColor, unsigned int uClearColor, unsigned int bClearDepth, float z_clear); - void Present(bool bForceBlit); - bool CreateTexture(unsigned int uTextureWidth, unsigned int uTextureHeight, IDirectDrawSurface4 **pOutSurface, IDirect3DTexture2 **pOutTexture, bool bAlphaChannel, bool bMipmaps, unsigned int uMinDeviceTexDim); - void HandleLostResources(); - - - unsigned int bWindowed; - int field_4; - int field_8; - HWND hWindow; - int field_10; - int field_14; - int field_18; - RenderD3D__DevInfo *pAvailableDevices; - IDirectDraw4 *pHost; - IDirect3D3 *pDirect3D; - IUnknown *pUnk; - IDirectDrawSurface4 *pBackBuffer; - IDirectDrawSurface4 *pFrontBuffer; - IDirectDrawSurface4 *pZBuffer; - IDirect3DDevice3 *pDevice; - IDirect3DViewport3 *pViewport; - int field_40; - int field_44; - char pErrorMessage[48]; - char field_78[208]; -}; -#pragma pack(pop) -extern struct RenderVertexD3D3 pVertices[50]; - -/* 182 */ -#pragma pack(push, 1) struct Render { Render(); @@ -539,67 +267,3 @@ //int windowed_mode_width; //int windowed_mode_height; }; -#pragma pack(pop) - -bool PauseGameDrawing(); - -extern struct IDirectDrawClipper *pDDrawClipper; -extern struct Render *pRenderer; // idb -extern struct pUnkTerrain *Unks; - - - -/* 248 */ -#pragma pack(push, 1) -struct RenderBillboardTransform_local0 -{ - void *pTarget; - int *pTargetZ; - int uScreenSpaceX; - int uScreenSpaceY; - int _screenspace_x_scaler_packedfloat; - int _screenspace_y_scaler_packedfloat; - char field_18[8]; - unsigned __int16 *pPalette; - unsigned __int16 *pPalette2; - union - { - int sZValue; - struct - { - unsigned short object_pid; - short zbuffer_depth; - }; - }; - unsigned int uFlags; // & 4 - mirror horizontally - unsigned int uTargetPitch; - unsigned int uViewportX; - unsigned int uViewportY; - unsigned int uViewportZ; - unsigned int uViewportW; - int field_44; - int sParentBillboardID; - int sTintColor; -}; -#pragma pack(pop) - - - - -extern int uNumDecorationsDrawnThisFrame; // weak -extern RenderBillboard pBillboardRenderList[500]; -extern unsigned int uNumBillboardsToDraw; -extern int uNumSpritesDrawnThisFrame; // weak - - - - -extern RenderVertexSoft array_507D30[50]; -extern RenderVertexSoft array_50AC10[50]; -extern RenderVertexSoft array_73D150[20]; - -extern RenderVertexD3D3 d3d_vertex_buffer[50]; - - -int ODM_NearClip(unsigned int uVertexID); // idb -int ODM_FarClip(unsigned int uNumVertices); \ No newline at end of file diff -r b29880e9ee79 -r 2d3c3d1dff0c RenderStruct.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/RenderStruct.h Tue Jul 15 15:44:45 2014 +0600 @@ -0,0 +1,348 @@ +#pragma once + +#include +#include + +#include "lib\legacy_dx\d3d.h" +#include "OSWindow.h" + +#include "VectorTypes.h" + + +#define ErrD3D(hr) \ + do \ + { \ + extern void ErrHR(HRESULT, const char *, const char *, const char *, int); \ + ErrHR(hr, "Direct3D", __FUNCTION__, __FILE__, __LINE__); \ + } while(0) + +struct Polygon; +struct Texture; +struct RGBTexture; +struct RenderBillboardTransform_local0; +struct ODMFace; + + +unsigned __int16 Color16(unsigned __int32 r, unsigned __int32 g, unsigned __int32 b); +unsigned __int32 Color32(unsigned __int16 color16); + +/* 119 */ +#pragma pack(push, 1) +struct RenderVertexSoft +{ + inline RenderVertexSoft(): + flt_2C(0.0f) + {} + + Vec3_float_ vWorldPosition; + Vec3_float_ vWorldViewPosition; + float vWorldViewProjX; + float vWorldViewProjY; + float _rhw; + float u; + float v; + float flt_2C; +}; +#pragma pack(pop) + + + +/* 112 */ +#pragma pack(push, 1) +struct RenderVertexD3D3 +{ + Vec3_float_ pos; + float rhw; + signed int diffuse; + unsigned int specular; + Vec2_float_ texcoord; +}; +#pragma pack(pop) + +class Sprite; +class SpriteFrame; + +/* 161 */ +#pragma pack(push, 1) +struct RenderBillboard +{ + int _screenspace_x_scaler_packedfloat; + int _screenspace_y_scaler_packedfloat; + float fov_x; + float fov_y; + union + { + int sZValue; + struct + { + unsigned __int16 object_pid; + signed __int16 actual_z; + }; + }; + int field_14_actor_id; + signed __int16 HwSpriteID; + __int16 uPalette; + __int16 uIndoorSectorID; + __int16 field_1E; + __int16 world_x; + __int16 world_y; + __int16 world_z; + __int16 uScreenSpaceX; + __int16 uScreenSpaceY; + unsigned __int16 dimming_level; + signed int sTintColor; + SpriteFrame *pSpriteFrame; + + inline float GetFloatZ() const + { + return (float)object_pid / 65535.0f + (float)actual_z; + } +}; +#pragma pack(pop) + + +#pragma pack(push, 1) +struct RenderD3D__DevInfo +{ + unsigned int bIsDeviceCompatible; + char *pName; + char *pDescription; + GUID *pGUID; + unsigned int uCaps; + char *pDriverName; + char *pDeviceDesc; + char *pDDraw4DevDesc; + GUID *pDirectDrawGUID; + int uVideoMem; +}; +#pragma pack(pop) + + + +#pragma pack(push, 1) +struct RenderD3D_D3DDevDesc +{ + int field_0; + int field_4; + int field_8; + int field_C; + int field_10; + char *pDriverName; + char *pDeviceDesc; + char *pDDraw4DevDesc; + GUID *pGUID; + unsigned int uVideoMem; +}; +#pragma pack(pop) + + + + + + + + + +/* 280 */ +#pragma pack(push, 1) +struct HWLTexture +{ + inline HWLTexture(): + field_0(0), field_4(0), field_8(0), + field_C(0), field_10(0), field_14(0) + {} + + int field_0; + int field_4; + int field_8; + int field_C; + int field_10; + int field_14; + int uBufferWidth; + int uBufferHeight; + int uAreaWidth; + int uAreaHeigth; + unsigned int uWidth; + unsigned int uHeight; + int uAreaX; + int uAreaY; + unsigned __int16 *pPixels; +}; +#pragma pack(pop) + + +/* 185 */ +#pragma pack(push, 1) +struct RenderHWLContainer +{ + RenderHWLContainer(); + bool Load(const wchar_t *pFilename); + bool Release(); + + HWLTexture *LoadTexture(const char *pName, int bMipMaps); + + FILE *pFile; + uint32_t uSignature; + unsigned int uDataOffset; + unsigned int uNumItems; + char *pSpriteNames[50000]; + int pSpriteOffsets[50000]; + int bDumpDebug; + int scale_hwls_to_half; +}; +#pragma pack(pop) + + + +/* 242 */ +#pragma pack(push, 1) +struct RenderBillboardD3D +{ + inline RenderBillboardD3D(): + opacity(Transparent), + field_90(-1), + sParentBillboardID(-1), + uNumVertices(4) + {} + + enum OpacityType: unsigned __int32 + { + Transparent = 0, + Opaque_1 = 1, + Opaque_2 = 2, + Opaque_3 = 3, + NoBlend = 0xFFFFFFFF + }; + + IDirect3DTexture2 *pTexture; + unsigned int uNumVertices; + RenderVertexD3D3 pQuads[4]; + float z_order; + OpacityType opacity; + int field_90; + int sZValue; + signed int sParentBillboardID; +}; +#pragma pack(pop) + + + + +#pragma pack(push, 1) +struct RenderD3D_aux +{ + RenderD3D__DevInfo *pInfo; + RenderD3D_D3DDevDesc *ptr_4; +}; +#pragma pack(pop) + + + +/* 183 */ +#pragma pack(push, 1) +class RenderD3D +{ +public: + RenderD3D(); + + void GetAvailableDevices(RenderD3D__DevInfo **pOutDevices); + void Release(); + bool CreateDevice(unsigned int uDeviceID, int bWindowed, OSWindow *window); + unsigned int GetDeviceCaps(); + void ClearTarget(unsigned int bClearColor, unsigned int uClearColor, unsigned int bClearDepth, float z_clear); + void Present(bool bForceBlit); + bool CreateTexture(unsigned int uTextureWidth, unsigned int uTextureHeight, IDirectDrawSurface4 **pOutSurface, IDirect3DTexture2 **pOutTexture, bool bAlphaChannel, bool bMipmaps, unsigned int uMinDeviceTexDim); + void HandleLostResources(); + + + unsigned int bWindowed; + int field_4; + int field_8; + HWND hWindow; + int field_10; + int field_14; + int field_18; + RenderD3D__DevInfo *pAvailableDevices; + IDirectDraw4 *pHost; + IDirect3D3 *pDirect3D; + IUnknown *pUnk; + IDirectDrawSurface4 *pBackBuffer; + IDirectDrawSurface4 *pFrontBuffer; + IDirectDrawSurface4 *pZBuffer; + IDirect3DDevice3 *pDevice; + IDirect3DViewport3 *pViewport; + int field_40; + int field_44; + char pErrorMessage[48]; + char field_78[208]; +}; +#pragma pack(pop) +extern struct RenderVertexD3D3 pVertices[50]; + +/* 182 */ +#pragma pack(push, 1) + +#pragma pack(pop) + +bool PauseGameDrawing(); + +extern struct IDirectDrawClipper *pDDrawClipper; +extern struct Render *pRenderer; // idb +extern struct pUnkTerrain *Unks; + + + +/* 248 */ +#pragma pack(push, 1) +struct RenderBillboardTransform_local0 +{ + void *pTarget; + int *pTargetZ; + int uScreenSpaceX; + int uScreenSpaceY; + int _screenspace_x_scaler_packedfloat; + int _screenspace_y_scaler_packedfloat; + char field_18[8]; + unsigned __int16 *pPalette; + unsigned __int16 *pPalette2; + union + { + int sZValue; + struct + { + unsigned short object_pid; + short zbuffer_depth; + }; + }; + unsigned int uFlags; // & 4 - mirror horizontally + unsigned int uTargetPitch; + unsigned int uViewportX; + unsigned int uViewportY; + unsigned int uViewportZ; + unsigned int uViewportW; + int field_44; + int sParentBillboardID; + int sTintColor; +}; +#pragma pack(pop) + + + + +extern int uNumDecorationsDrawnThisFrame; // weak +extern RenderBillboard pBillboardRenderList[500]; +extern unsigned int uNumBillboardsToDraw; +extern int uNumSpritesDrawnThisFrame; // weak + + + + +extern RenderVertexSoft array_507D30[50]; +extern RenderVertexSoft array_50AC10[50]; +extern RenderVertexSoft array_73D150[20]; + +extern RenderVertexD3D3 d3d_vertex_buffer[50]; + + +int ODM_NearClip(unsigned int uVertexID); // idb +int ODM_FarClip(unsigned int uNumVertices); \ No newline at end of file