diff --git a/CMakeLists.txt b/CMakeLists.txt index 4f87386..68d2ee1 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -41,6 +41,11 @@ if(WHOA_SYSTEM_WIN) WIN32_LEAN_AND_MEAN ) + # Make DirectXMath boring + add_definitions( + -D_XM_NO_INTRINSICS_ + ) + # Lua uses various "unsafe" C functions add_definitions( -D_CRT_SECURE_NO_WARNINGS diff --git a/src/gx/d3d/CGxDeviceD3d.cpp b/src/gx/d3d/CGxDeviceD3d.cpp index 4125f0d..4137cd9 100644 --- a/src/gx/d3d/CGxDeviceD3d.cpp +++ b/src/gx/d3d/CGxDeviceD3d.cpp @@ -2,7 +2,9 @@ #include "gx/Blit.hpp" #include "gx/CGxBatch.hpp" #include "gx/texture/CGxTex.hpp" +#include "math/Utils.hpp" #include +#include D3DCMPFUNC CGxDeviceD3d::s_cmpFunc[] = { D3DCMP_LESSEQUAL, @@ -1690,6 +1692,33 @@ UNLOCK: } } +void CGxDeviceD3d::IXformSetProjection(const C44Matrix& matrix) { + DirectX::XMMATRIX projNative; + memcpy(&projNative, &matrix, sizeof(projNative)); + + if (NotEqual(projNative._34, 1.0f, WHOA_EPSILON_1) && NotEqual(projNative._34, 0.0f, WHOA_EPSILON_1)) { + projNative /= projNative._34; + } + + if (projNative._44 == 0.0f) { + auto v5 = -(projNative._43 / (projNative._33 + 1.0f)); + auto v6 = -(projNative._43 / (projNative._33 - 1.0f)); + projNative._33 = v6 / (v6 - v5); + projNative._43 = v6 * v5 / (v5 - v6); + } else { + auto v8 = 1.0f / projNative._33; + auto v9 = (-1.0f - projNative._43) * v8; + auto v10 = v8 * (1.0f - projNative._43); + projNative._33 = 1.0f / (v10 - v9); + projNative._43 = v9 / (v9 - v10); + } + + // TODO shrink + + this->m_xforms[GxXform_Projection].m_dirty = 1; + memcpy(&this->m_projNative, &projNative, sizeof(this->m_projNative)); +} + void CGxDeviceD3d::PoolSizeSet(CGxPool* pool, uint32_t size) { // TODO } @@ -1751,3 +1780,8 @@ int32_t CGxDeviceD3d::StereoEnabled() { // TODO return 0; } + +void CGxDeviceD3d::XformSetProjection(const C44Matrix& matrix) { + CGxDevice::XformSetProjection(matrix); + this->IXformSetProjection(matrix); +} diff --git a/src/gx/d3d/CGxDeviceD3d.hpp b/src/gx/d3d/CGxDeviceD3d.hpp index 4c846b0..9ea7608 100644 --- a/src/gx/d3d/CGxDeviceD3d.hpp +++ b/src/gx/d3d/CGxDeviceD3d.hpp @@ -248,6 +248,7 @@ class CGxDeviceD3d : public CGxDevice { virtual void CapsWindowSizeInScreenCoords(CRect& dst); virtual void ScenePresent(); virtual void SceneClear(uint32_t mask, CImVector color); + virtual void XformSetProjection(const C44Matrix& matrix); virtual void Draw(CGxBatch* batch, int32_t indexed); virtual void PoolSizeSet(CGxPool* pool, uint32_t size); virtual char* BufLock(CGxBuf* buf); @@ -287,6 +288,7 @@ class CGxDeviceD3d : public CGxDevice { void IStateSyncVertexPtrs(); void ITexCreate(CGxTex* texId); void ITexUpload(CGxTex* texId); + void IXformSetProjection(const C44Matrix& matrix); }; #endif