From d67e13087abb612f76d12482d648b9d623c0f5e4 Mon Sep 17 00:00:00 2001 From: fallenoak Date: Sat, 15 Apr 2023 13:56:49 -0500 Subject: [PATCH] feat(gx): sync viewport in d3d backend --- src/gx/d3d/CGxDeviceD3d.cpp | 30 +++++++++++++++++++++++++++++- src/gx/d3d/CGxDeviceD3d.hpp | 1 + 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/src/gx/d3d/CGxDeviceD3d.cpp b/src/gx/d3d/CGxDeviceD3d.cpp index 99b7f0a..58b103e 100644 --- a/src/gx/d3d/CGxDeviceD3d.cpp +++ b/src/gx/d3d/CGxDeviceD3d.cpp @@ -1594,6 +1594,10 @@ void CGxDeviceD3d::IStateSync() { this->IStateSyncIndexPtr(); // TODO + + if (this->intF6C) { + this->IXformSetViewport(); + } } void CGxDeviceD3d::IStateSyncEnables() { @@ -1946,6 +1950,30 @@ void CGxDeviceD3d::IXformSetProjection(const C44Matrix& matrix) { memcpy(&this->m_projNative, &projNative, sizeof(this->m_projNative)); } +void CGxDeviceD3d::IXformSetViewport() { + const auto& gxViewport = this->m_viewport; + auto windowRect = this->DeviceCurWindow(); + + D3DVIEWPORT9 d3dViewport; + + d3dViewport.X = (gxViewport.x.l * windowRect.maxX) + 0.5; + d3dViewport.Y = ((1.0 - gxViewport.y.h) * windowRect.maxY) + 0.5; + + // TODO account for negative X value + + d3dViewport.Width = (gxViewport.x.h * windowRect.maxX) - d3dViewport.X + 0.5; + d3dViewport.Height = ((1.0 - gxViewport.y.l) * windowRect.maxY) - d3dViewport.Y + 0.5; + + d3dViewport.MinZ = gxViewport.z.l; + d3dViewport.MaxZ = gxViewport.z.h; + + // TODO conditionally adjust Y value + + this->m_d3dDevice->SetViewport(&d3dViewport); + + this->intF6C = 0; +} + void CGxDeviceD3d::PoolSizeSet(CGxPool* pool, uint32_t size) { // TODO } @@ -1966,7 +1994,7 @@ void CGxDeviceD3d::SceneClear(uint32_t mask, CImVector color) { } if (this->intF6C) { - // TODO + this->IXformSetViewport(); } D3DCOLOR d3dColor = color.b | (color.g | (color.r << 8) << 8); diff --git a/src/gx/d3d/CGxDeviceD3d.hpp b/src/gx/d3d/CGxDeviceD3d.hpp index 456a36f..9823083 100644 --- a/src/gx/d3d/CGxDeviceD3d.hpp +++ b/src/gx/d3d/CGxDeviceD3d.hpp @@ -301,6 +301,7 @@ class CGxDeviceD3d : public CGxDevice { void ITexCreate(CGxTex* texId); void ITexUpload(CGxTex* texId); void IXformSetProjection(const C44Matrix& matrix); + void IXformSetViewport(); }; #endif