Browse Source

fix blend

David Rose 20 years ago
parent
commit
3c4141979c
1 changed files with 21 additions and 6 deletions
  1. 21 6
      panda/src/dxgsg8/dxGraphicsStateGuardian8.cxx

+ 21 - 6
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<MAX_POSSIBLE_TEXFMTS;i++) {
+  for(int i = 0; i < MAX_POSSIBLE_TEXFMTS; i++) {
     // look for all possible DX8 texture fmts
-    D3DFORMAT_FLAG fmtflag = D3DFORMAT_FLAG(1<<i);
+    D3DFORMAT_FLAG fmtflag = D3DFORMAT_FLAG(1 << i);
     hr = _screen->_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: