From 3c4141979c301a3adb9a37e5635026ee721e027b Mon Sep 17 00:00:00 2001 From: David Rose Date: Thu, 2 Jun 2005 16:12:13 +0000 Subject: [PATCH] fix blend --- panda/src/dxgsg8/dxGraphicsStateGuardian8.cxx | 27 ++++++++++++++----- 1 file changed, 21 insertions(+), 6 deletions(-) diff --git a/panda/src/dxgsg8/dxGraphicsStateGuardian8.cxx b/panda/src/dxgsg8/dxGraphicsStateGuardian8.cxx index aba78b864f..69252f61c7 100644 --- a/panda/src/dxgsg8/dxGraphicsStateGuardian8.cxx +++ b/panda/src/dxgsg8/dxGraphicsStateGuardian8.cxx @@ -1504,6 +1504,9 @@ reset() { << "\nMaxVertexIndex = " << d3d_caps.MaxVertexIndex << "\nMaxStreams = " << d3d_caps.MaxStreams << "\nMaxStreamStride = " << d3d_caps.MaxStreamStride + << "\nD3DTEXOPCAPS_MULTIPLYADD = " << ((d3d_caps.TextureOpCaps & D3DTEXOPCAPS_MULTIPLYADD) != 0) + << "\nD3DTEXOPCAPS_LERP = " << ((d3d_caps.TextureOpCaps & D3DTEXOPCAPS_LERP) != 0) + << "\nD3DPMISCCAPS_TSSARGTEMP = " << ((d3d_caps.PrimitiveMiscCaps & D3DPMISCCAPS_TSSARGTEMP) != 0) << "\n"; } @@ -1556,9 +1559,9 @@ reset() { _last_testcooplevel_result = D3D_OK; - for(int i = 0;i_d3d8->CheckDeviceFormat(_screen->_card_id, D3DDEVTYPE_HAL, _screen->_display_mode.Format, 0x0, D3DRTYPE_TEXTURE, g_D3DFORMATmap[fmtflag]); if (SUCCEEDED(hr)){ @@ -2829,16 +2832,28 @@ set_texture_blend_mode(int i, const TextureStage *stage) { _d3d_device->SetTextureStageState(i, D3DTSS_COLORARG1, D3DTA_TEXTURE); _d3d_device->SetTextureStageState(i, D3DTSS_COLORARG2, D3DTA_CURRENT); - // since I'm making up 'add' mode, use modulate. "adding" alpha - // never makes sense right? _d3d_device->SetTextureStageState(i, D3DTSS_ALPHAOP, D3DTOP_MODULATE); _d3d_device->SetTextureStageState(i, D3DTSS_ALPHAARG1, D3DTA_TEXTURE); _d3d_device->SetTextureStageState(i, D3DTSS_ALPHAARG2, D3DTA_CURRENT); break; case TextureStage::M_blend: - dxgsg8_cat.error() - << "Impossible to emulate GL_BLEND in DX exactly.\n"; + case TextureStage::M_blend_color_scale: + { + // DX only supports one TEXTUREFACTOR color for the whole + // pipeline, so you can't reliably have two different blends in + // effect with different colors on the same object. Oh well. + _d3d_device->SetTextureStageState(i, D3DTSS_COLOROP, D3DTOP_LERP); + _d3d_device->SetTextureStageState(i, D3DTSS_COLORARG0, D3DTA_TEXTURE); + _d3d_device->SetTextureStageState(i, D3DTSS_COLORARG2, D3DTA_CURRENT); + _d3d_device->SetTextureStageState(i, D3DTSS_COLORARG1, D3DTA_TFACTOR); + D3DCOLOR texture_factor = Colorf_to_D3DCOLOR(stage->get_color()); + _d3d_device->SetRenderState(D3DRS_TEXTUREFACTOR, texture_factor); + + _d3d_device->SetTextureStageState(i, D3DTSS_ALPHAOP, D3DTOP_MODULATE); + _d3d_device->SetTextureStageState(i, D3DTSS_ALPHAARG1, D3DTA_TEXTURE); + _d3d_device->SetTextureStageState(i, D3DTSS_ALPHAARG2, D3DTA_CURRENT); + } break; default: