diff --git a/Minecraft.Client/Windows64/Windows64_Minecraft.cpp b/Minecraft.Client/Windows64/Windows64_Minecraft.cpp index 7d38ff99..743da44b 100644 --- a/Minecraft.Client/Windows64/Windows64_Minecraft.cpp +++ b/Minecraft.Client/Windows64/Windows64_Minecraft.cpp @@ -84,6 +84,9 @@ BOOL g_bWidescreen = TRUE; int g_iScreenWidth = 1920; int g_iScreenHeight = 1080; +UINT g_ScreenWidth = 1920; +UINT g_ScreenHeight = 1080; + // Fullscreen toggle state static bool g_isFullscreen = false; static WINDOWPLACEMENT g_wpPrev = { sizeof(g_wpPrev) }; @@ -425,7 +428,90 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) return TRUE; } return DefWindowProc(hWnd, message, wParam, lParam); + case WM_SIZE: + { + if (wParam == SIZE_MINIMIZED) + return 0; + UINT width = LOWORD(lParam); + UINT height = HIWORD(lParam); + + if (width == 0 || height == 0) + return 0; + + g_ScreenWidth = width; + g_ScreenHeight = height; + + if (g_pSwapChain) + { + g_pImmediateContext->OMSetRenderTargets(0, 0, 0); + g_pImmediateContext->ClearState(); + g_pImmediateContext->Flush(); + + if (g_pRenderTargetView) + { + g_pRenderTargetView->Release(); + g_pRenderTargetView = nullptr; + } + + if (g_pDepthStencilView) + { + g_pDepthStencilView->Release(); + g_pDepthStencilView = nullptr; + } + + if (g_pDepthStencilBuffer) + { + g_pDepthStencilBuffer->Release(); + g_pDepthStencilBuffer = nullptr; + } + + HRESULT hr = g_pSwapChain->ResizeBuffers( + 0, + width, + height, + DXGI_FORMAT_UNKNOWN, + 0 + ); + + if (FAILED(hr)) + { + app.DebugPrintf("ResizeBuffers Failed! HRESULT: 0x%X\n", hr); + return 0; + } + + ID3D11Texture2D* pBackBuffer = nullptr; + g_pSwapChain->GetBuffer(0, __uuidof(ID3D11Texture2D), (void**)&pBackBuffer); + + g_pd3dDevice->CreateRenderTargetView(pBackBuffer, NULL, &g_pRenderTargetView); + pBackBuffer->Release(); + + D3D11_TEXTURE2D_DESC descDepth = {}; + descDepth.Width = width; + descDepth.Height = height; + descDepth.MipLevels = 1; + descDepth.ArraySize = 1; + descDepth.Format = DXGI_FORMAT_D24_UNORM_S8_UINT; + descDepth.SampleDesc.Count = 1; + descDepth.BindFlags = D3D11_BIND_DEPTH_STENCIL; + + g_pd3dDevice->CreateTexture2D(&descDepth, NULL, &g_pDepthStencilBuffer); + g_pd3dDevice->CreateDepthStencilView(g_pDepthStencilBuffer, NULL, &g_pDepthStencilView); + + g_pImmediateContext->OMSetRenderTargets(1, &g_pRenderTargetView, g_pDepthStencilView); + + D3D11_VIEWPORT vp = {}; + vp.Width = (FLOAT)width; + vp.Height = (FLOAT)height; + vp.MinDepth = 0.0f; + vp.MaxDepth = 1.0f; + vp.TopLeftX = 0; + vp.TopLeftY = 0; + + g_pImmediateContext->RSSetViewports(1, &vp); + } + } + break; default: return DefWindowProc(hWnd, message, wParam, lParam); } diff --git a/Minecraft.Client/glWrapper.cpp b/Minecraft.Client/glWrapper.cpp index b120d30b..5e0fab2c 100644 --- a/Minecraft.Client/glWrapper.cpp +++ b/Minecraft.Client/glWrapper.cpp @@ -48,9 +48,13 @@ void glLoadIdentity() RenderManager.MatrixSetIdentity(); } +extern UINT g_ScreenWidth; +extern UINT g_ScreenHeight; + void gluPerspective(float fovy, float aspect, float zNear, float zFar) { - RenderManager.MatrixPerspective(fovy,aspect,zNear,zFar); + float dynamicAspect = (float)g_ScreenWidth / (float)g_ScreenHeight; + RenderManager.MatrixPerspective(fovy, dynamicAspect, zNear, zFar); } void glOrtho(float left,float right,float bottom,float top,float zNear,float zFar)