feat(gx): set native projection matrix in d3d backend

This commit is contained in:
fallenoak 2023-03-12 23:49:48 -05:00 committed by GitHub
parent 8d36078606
commit 91baaebd5b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 41 additions and 0 deletions

View File

@ -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

View File

@ -2,7 +2,9 @@
#include "gx/Blit.hpp"
#include "gx/CGxBatch.hpp"
#include "gx/texture/CGxTex.hpp"
#include "math/Utils.hpp"
#include <algorithm>
#include <directxmath.h>
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);
}

View File

@ -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