Procházet zdrojové kódy

fix flickering light

David Rose před 17 roky
rodič
revize
f86e9a8cd6
1 změnil soubory, kde provedl 5 přidání a 1 odebrání
  1. 5 1
      panda/src/dxgsg8/dxGraphicsStateGuardian8.cxx

+ 5 - 1
panda/src/dxgsg8/dxGraphicsStateGuardian8.cxx

@@ -2609,7 +2609,6 @@ bind_light(DirectionalLight *light_obj, const NodePath &light, int light_id) {
     ZeroMemory(&fdata, sizeof(D3DLIGHT8));
     ZeroMemory(&fdata, sizeof(D3DLIGHT8));
     
     
     fdata.Type =  D3DLIGHT_DIRECTIONAL;
     fdata.Type =  D3DLIGHT_DIRECTIONAL;
-    fdata.Diffuse  = get_light_color(light_obj);
     fdata.Ambient  =  black ;
     fdata.Ambient  =  black ;
     fdata.Specular = *(D3DCOLORVALUE *)(light_obj->get_specular_color().get_data());
     fdata.Specular = *(D3DCOLORVALUE *)(light_obj->get_specular_color().get_data());
     
     
@@ -2623,6 +2622,11 @@ bind_light(DirectionalLight *light_obj, const NodePath &light, int light_id) {
     fdata.Attenuation2 = 0.0f;       // quadratic
     fdata.Attenuation2 = 0.0f;       // quadratic
   }
   }
 
 
+  // We have to reset the Diffuse color at each call, because it might
+  // have changed independently of the light object itself (due to
+  // color_scale_via_lighting being in effect).
+  fdata.Diffuse  = get_light_color(light_obj);
+
   HRESULT hr = _d3d_device->SetLight(light_id, &fdata);
   HRESULT hr = _d3d_device->SetLight(light_id, &fdata);
   if (FAILED(hr)) {
   if (FAILED(hr)) {
     wdxdisplay8_cat.warning()
     wdxdisplay8_cat.warning()