diff --git a/src/gx/d3d/CGxDeviceD3d.cpp b/src/gx/d3d/CGxDeviceD3d.cpp index e5da4b2..466a07f 100644 --- a/src/gx/d3d/CGxDeviceD3d.cpp +++ b/src/gx/d3d/CGxDeviceD3d.cpp @@ -11,6 +11,21 @@ D3DCMPFUNC CGxDeviceD3d::s_cmpFunc[] = { D3DCMP_LESS, }; +D3DBLEND CGxDeviceD3d::s_dstBlend[] = { + D3DBLEND_ZERO, // GxBlend_Opaque + D3DBLEND_ZERO, // GxBlend_AlphaKey + D3DBLEND_INVSRCALPHA, // GxBlend_Alpha + D3DBLEND_ONE, // GxBlend_Add + D3DBLEND_ZERO, // GxBlend_Mod + D3DBLEND_SRCCOLOR, // GxBlend_Mod2x + D3DBLEND_ONE, // GxBlend_ModAdd + D3DBLEND_ONE, // GxBlend_InvSrcAlphaAdd + D3DBLEND_ZERO, // GxBlend_InvSrcAlphaOpaque + D3DBLEND_ZERO, // GxBlend_SrcAlphaOpaque + D3DBLEND_ONE, // GxBlend_NoAlphaAdd + D3DBLEND_INVBLENDFACTOR, // GxBlend_ConstantAlpha +}; + D3DCUBEMAP_FACES CGxDeviceD3d::s_faceTypes[] = { D3DCUBEMAP_FACE_POSITIVE_X, D3DCUBEMAP_FACE_NEGATIVE_X, @@ -136,6 +151,21 @@ D3DPRIMITIVETYPE CGxDeviceD3d::s_primitiveConversion[] = { D3DPT_TRIANGLEFAN, // GxPrim_TriangleFan }; +D3DBLEND CGxDeviceD3d::s_srcBlend[] = { + D3DBLEND_ONE, // GxBlend_Opaque + D3DBLEND_ONE, // GxBlend_AlphaKey + D3DBLEND_SRCALPHA, // GxBlend_Alpha + D3DBLEND_SRCALPHA, // GxBlend_Add + D3DBLEND_DESTCOLOR, // GxBlend_Mod + D3DBLEND_DESTCOLOR, // GxBlend_Mod2x + D3DBLEND_DESTCOLOR, // GxBlend_ModAdd + D3DBLEND_INVSRCALPHA, // GxBlend_InvSrcAlphaAdd + D3DBLEND_INVSRCALPHA, // GxBlend_InvSrcAlphaOpaque + D3DBLEND_SRCALPHA, // GxBlend_SrcAlphaOpaque + D3DBLEND_ONE, // GxBlend_NoAlphaAdd + D3DBLEND_BLENDFACTOR, // GxBlend_ConstantAlpha +}; + EGxTexFormat CGxDeviceD3d::s_tolerableTexFmtMapping[] = { GxTex_Unknown, // GxTex_Unknown GxTex_Argb4444, // GxTex_Abgr8888 @@ -483,6 +513,16 @@ void CGxDeviceD3d::DsSet(EDeviceState state, uint32_t val) { switch (state) { // TODO handle other device states + case Ds_SrcBlend: { + this->m_d3dDevice->SetRenderState(D3DRS_SRCBLEND, val); + break; + } + + case Ds_DstBlend: { + this->m_d3dDevice->SetRenderState(D3DRS_DESTBLEND, val); + break; + } + case Ds_TssMagFilter0: case Ds_TssMagFilter1: case Ds_TssMagFilter2: @@ -837,6 +877,20 @@ void CGxDeviceD3d::IRsSendToHw(EGxRenderState which) { switch (which) { // TODO handle all render states + case GxRs_BlendingMode: { + auto blendMode = static_cast(static_cast(state->m_value)); + + if (blendMode < GxBlend_Alpha) { + this->DsSet(Ds_AlphaBlendEnable, 0); + } else { + this->DsSet(Ds_AlphaBlendEnable, 1); + this->DsSet(Ds_SrcBlend, CGxDeviceD3d::s_srcBlend[blendMode]); + this->DsSet(Ds_DstBlend, CGxDeviceD3d::s_dstBlend[blendMode]); + } + + break; + } + case GxRs_AlphaRef: { auto alphaRef = static_cast(state->m_value); diff --git a/src/gx/d3d/CGxDeviceD3d.hpp b/src/gx/d3d/CGxDeviceD3d.hpp index e7baec5..c37d746 100644 --- a/src/gx/d3d/CGxDeviceD3d.hpp +++ b/src/gx/d3d/CGxDeviceD3d.hpp @@ -197,6 +197,7 @@ class CGxDeviceD3d : public CGxDevice { // Static variables static D3DCMPFUNC s_cmpFunc[]; + static D3DBLEND s_dstBlend[]; static D3DCUBEMAP_FACES s_faceTypes[]; static D3DTEXTUREFILTERTYPE s_filterModes[GxTexFilters_Last][3]; static uint32_t s_gxAttribToD3dAttribSize[]; @@ -207,6 +208,7 @@ class CGxDeviceD3d : public CGxDevice { static D3DFORMAT s_GxTexFmtToD3dFmt[]; static EGxTexFormat s_GxTexFmtToUse[]; static D3DPRIMITIVETYPE s_primitiveConversion[]; + static D3DBLEND s_srcBlend[]; static EGxTexFormat s_tolerableTexFmtMapping[]; static D3DTEXTUREADDRESS s_wrapModes[];