0028738: Data Exchange, XCAFPrs_Style - add transparency property
authorakz <akz@opencascade.com>
Thu, 11 May 2017 10:52:18 +0000 (13:52 +0300)
committerbugmaster <bugmaster@opencascade.com>
Thu, 18 May 2017 09:17:44 +0000 (12:17 +0300)
Use Quantity_ColorRGBA as surface color to store a transparency in XCAFPrs_Style.

15 files changed:
src/Graphic3d/Graphic3d_AspectFillArea3d.hxx
src/Graphic3d/Graphic3d_MaterialAspect.hxx
src/OpenGl/OpenGl_Context.cxx
src/OpenGl/OpenGl_Context.hxx
src/OpenGl/OpenGl_LayerList.cxx
src/OpenGl/OpenGl_View_Raytrace.cxx
src/OpenGl/OpenGl_Workspace.cxx
src/Quantity/FILES
src/Quantity/Quantity_ColorRGBAHasher.hxx [new file with mode: 0644]
src/XCAFPrs/XCAFPrs.cxx
src/XCAFPrs/XCAFPrs_AISObject.cxx
src/XCAFPrs/XCAFPrs_AISObject.hxx
src/XCAFPrs/XCAFPrs_Style.cxx
src/XCAFPrs/XCAFPrs_Style.hxx
tests/bugs/xde/bug28641

index c365576..44c8f00 100644 (file)
@@ -85,6 +85,9 @@ public:
   //! Modifies the color of the interior of the face
   void SetInteriorColor (const Quantity_Color& theColor) { myInteriorColor.SetRGB (theColor); }
 
+  //! Modifies the color of the interior of the face
+  void SetInteriorColor (const Quantity_ColorRGBA& theColor) { myInteriorColor = theColor; }
+
   //! Return back interior color.
   const Quantity_Color& BackInteriorColor() const { return myBackInteriorColor.GetRGB(); }
 
@@ -94,6 +97,9 @@ public:
   //! Modifies the color of the interior of the back face
   void SetBackInteriorColor (const Quantity_Color& theColor) { myBackInteriorColor.SetRGB (theColor); }
 
+  //! Modifies the color of the interior of the back face
+  void SetBackInteriorColor (const Quantity_ColorRGBA& theColor) { myBackInteriorColor = theColor; }
+
   //! Returns the surface material of external faces
   const Graphic3d_MaterialAspect& FrontMaterial() const { return myFrontMaterial; }
 
index 0e93472..9d4ee83 100644 (file)
@@ -92,9 +92,12 @@ public:
   //! Modifies the ambient and diffuse color of the surface.
   Standard_EXPORT void SetColor (const Quantity_Color& theColor);
 
-  //! Returns the transparency coefficient of the surface.
+  //! Returns the transparency coefficient of the surface (1.0 - Alpha); 0.0 means opaque.
   Standard_ShortReal Transparency() const { return myTransparencyCoef; }
 
+  //! Returns the alpha coefficient of the surface (1.0 - Transparency); 1.0 means opaque.
+  Standard_ShortReal Alpha() const { return 1.0f - myTransparencyCoef; }
+
   //! Modifies the transparency coefficient of the surface, where 0 is opaque and 1 is fully transparent.
   //! Transparency is applicable to materials that have at least one of reflection modes (ambient, diffuse, specular or emissive) enabled.
   //! See also SetReflectionModeOn() and SetReflectionModeOff() methods.
@@ -102,6 +105,9 @@ public:
   //! Warning: Raises MaterialDefinitionError if given value is a negative value or greater than 1.0.
   Standard_EXPORT void SetTransparency (const Standard_ShortReal theValue);
 
+  //! Modifies the alpha coefficient of the surface, where 1.0 is opaque and 0.0 is fully transparent.
+  void SetAlpha (Standard_ShortReal theValue) { SetTransparency (1.0f - theValue); }
+
   //! Returns the ambient color of the surface.
   const Quantity_Color& AmbientColor() const { return myColors[Graphic3d_TOR_AMBIENT]; }
 
index eba5e19..94dbf68 100644 (file)
@@ -3051,12 +3051,12 @@ void OpenGl_Context::SetShadingMaterial (const OpenGl_AspectFace* theAspect,
     myMatBack .SetColor (theHighlight->ColorRGBA());
   }
 
-  Standard_ShortReal aTranspFront = 0.f;
-  Standard_ShortReal aTranspBack  = 0.f;
-  if (CheckIsTransparent (theAspect, theHighlight, aTranspFront, aTranspBack))
+  Standard_ShortReal anAlphaFront = 1.0f;
+  Standard_ShortReal anAlphaBack  = 1.0f;
+  if (CheckIsTransparent (theAspect, theHighlight, anAlphaFront, anAlphaBack))
   {
-    myMatFront.Diffuse.a() = 1.0f - aTranspFront;
-    myMatBack .Diffuse.a() = 1.0f - aTranspBack;
+    myMatFront.Diffuse.a() = anAlphaFront;
+    myMatBack .Diffuse.a() = anAlphaBack;
   }
 
   // do not update material properties in case of zero reflection mode,
@@ -3083,8 +3083,8 @@ void OpenGl_Context::SetShadingMaterial (const OpenGl_AspectFace* theAspect,
 // =======================================================================
 Standard_Boolean OpenGl_Context::CheckIsTransparent (const OpenGl_AspectFace* theAspect,
                                                      const Handle(Graphic3d_PresentationAttributes)& theHighlight,
-                                                     Standard_ShortReal& theTranspFront,
-                                                     Standard_ShortReal& theTranspBack)
+                                                     Standard_ShortReal& theAlphaFront,
+                                                     Standard_ShortReal& theAlphaBack)
 {
   const Handle(Graphic3d_AspectFillArea3d)& anAspect = (!theHighlight.IsNull() && !theHighlight->BasicFillAreaAspect().IsNull())
                                                       ?  theHighlight->BasicFillAreaAspect()
@@ -3097,17 +3097,21 @@ Standard_Boolean OpenGl_Context::CheckIsTransparent (const OpenGl_AspectFace* th
                                                : aMatFrontSrc;
 
   // handling transparency
-  theTranspFront = aMatFrontSrc.Transparency();
-  theTranspBack  = aMatBackSrc .Transparency();
   if (!theHighlight.IsNull()
     && theHighlight->BasicFillAreaAspect().IsNull())
   {
-    theTranspFront = theHighlight->Transparency();
-    theTranspBack  = theHighlight->Transparency();
+    theAlphaFront = theHighlight->ColorRGBA().Alpha();
+    theAlphaBack  = theHighlight->ColorRGBA().Alpha();
+  }
+  else
+  {
+    theAlphaFront = aMatFrontSrc.Alpha();
+    theAlphaBack  = aMatBackSrc .Alpha();
   }
 
-  return theTranspFront != 0.f
-      || theTranspBack  != 0.f;
+  const bool isTransparent = theAlphaFront < 1.0f
+                          || theAlphaBack  < 1.0f;
+  return isTransparent;
 }
 
 // =======================================================================
index 064c01e..a6a6599 100644 (file)
@@ -655,8 +655,16 @@ public: //! @name methods to alter or retrieve current state
   //! Checks if transparency is required for the given aspect and highlight style.
   Standard_EXPORT static Standard_Boolean CheckIsTransparent (const OpenGl_AspectFace* theAspect,
                                                               const Handle(Graphic3d_PresentationAttributes)& theHighlight,
-                                                              Standard_ShortReal& theTranspFront,
-                                                              Standard_ShortReal& theTranspBack);
+                                                              Standard_ShortReal& theAlphaFront,
+                                                              Standard_ShortReal& theAlphaBack);
+
+  //! Checks if transparency is required for the given aspect and highlight style.
+  static Standard_Boolean CheckIsTransparent (const OpenGl_AspectFace* theAspect,
+                                              const Handle(Graphic3d_PresentationAttributes)& theHighlight)
+  {
+    Standard_ShortReal anAlphaFront = 1.0f, anAlphaBack = 1.0f;
+    return CheckIsTransparent (theAspect, theHighlight, anAlphaFront, anAlphaBack);
+  }
 
   //! Setup current color.
   Standard_EXPORT void SetColor4fv (const OpenGl_Vec4& theColor);
index f022bcf..40dc81f 100644 (file)
@@ -654,12 +654,8 @@ Standard_Boolean OpenGl_LayerList::OpenGl_OpaqueFilter::ShouldRender (const Hand
     return Standard_True;
   }
 
-  Standard_ShortReal aFront = 0.f;
-  Standard_ShortReal aBack  = 0.f;
-
   if (OpenGl_Context::CheckIsTransparent (theWorkspace->AspectFace(),
-                                          theWorkspace->HighlightStyle(),
-                                          aFront, aBack))
+                                          theWorkspace->HighlightStyle()))
   {
     ++mySkippedCounter;
     return Standard_False;
@@ -690,10 +686,6 @@ Standard_Boolean OpenGl_LayerList::OpenGl_TransparentFilter::ShouldRender (const
     return dynamic_cast<const OpenGl_AspectFace*> (theGlElement) != NULL;
   }
 
-  Standard_ShortReal aFront = 0.f;
-  Standard_ShortReal aBack  = 0.f;
-
   return OpenGl_Context::CheckIsTransparent (theWorkspace->AspectFace(),
-                                             theWorkspace->HighlightStyle(),
-                                             aFront, aBack);
+                                             theWorkspace->HighlightStyle());
 }
index 793d4ac..02d69d1 100644 (file)
@@ -341,8 +341,8 @@ OpenGl_RaytraceMaterial OpenGl_View::convertMaterial (const OpenGl_AspectFace*
 
   const Graphic3d_MaterialAspect& aSrcMat = theAspect->Aspect()->FrontMaterial();
   const OpenGl_Vec3& aMatCol  = theAspect->Aspect()->InteriorColor();
+  const bool         isPhysic = aSrcMat.MaterialType (Graphic3d_MATERIAL_PHYSIC);
   const float        aShine   = 128.0f * float(aSrcMat.Shininess());
-  const bool         isPhysic = aSrcMat.MaterialType (Graphic3d_MATERIAL_PHYSIC) == Standard_True;
 
   // ambient component
   if (aSrcMat.ReflectionMode (Graphic3d_TOR_AMBIENT))
@@ -399,8 +399,7 @@ OpenGl_RaytraceMaterial OpenGl_View::convertMaterial (const OpenGl_AspectFace*
   }
 
   const float anIndex = (float )aSrcMat.RefractionIndex();
-  theMaterial.Transparency = BVH_Vec4f (1.0f - (float )aSrcMat.Transparency(),
-                                        (float )aSrcMat.Transparency(),
+  theMaterial.Transparency = BVH_Vec4f (aSrcMat.Alpha(), aSrcMat.Transparency(),
                                         anIndex == 0 ? 1.0f : anIndex,
                                         anIndex == 0 ? 1.0f : 1.0f / anIndex);
 
index 7ec727d..a851580 100644 (file)
@@ -76,6 +76,8 @@ void OpenGl_Material::Init (const Graphic3d_MaterialAspect& theMat,
                             const Quantity_Color&           theInteriorColor)
 {
   const bool isPhysic = theMat.MaterialType (Graphic3d_MATERIAL_PHYSIC);
+  ChangeShine()        = 128.0f * theMat.Shininess();
+  ChangeTransparency() = theMat.Alpha();
 
   // ambient component
   if (theMat.ReflectionMode (Graphic3d_TOR_AMBIENT))
@@ -120,9 +122,6 @@ void OpenGl_Material::Init (const Graphic3d_MaterialAspect& theMat,
   {
     Emission = THE_BLACK_COLOR;
   }
-
-  ChangeShine()        = 128.0f * theMat.Shininess();
-  ChangeTransparency() = 1.0f - theMat.Transparency();
 }
 
 // =======================================================================
index 2599056..0f3e806 100755 (executable)
@@ -16,6 +16,7 @@ Quantity_Color.cxx
 Quantity_Color.hxx
 Quantity_ColorHasher.hxx
 Quantity_ColorRGBA.hxx
+Quantity_ColorRGBAHasher.hxx
 Quantity_ColorDefinitionError.hxx
 Quantity_Concentration.hxx
 Quantity_Conductivity.hxx
diff --git a/src/Quantity/Quantity_ColorRGBAHasher.hxx b/src/Quantity/Quantity_ColorRGBAHasher.hxx
new file mode 100644 (file)
index 0000000..73f388f
--- /dev/null
@@ -0,0 +1,45 @@
+// Copyright (c) 2017 OPEN CASCADE SAS
+//
+// This file is part of Open CASCADE Technology software library.
+//
+// This library is free software; you can redistribute it and/or modify it under
+// the terms of the GNU Lesser General Public License version 2.1 as published
+// by the Free Software Foundation, with special exception defined in the file
+// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
+// distribution for complete text of the license and disclaimer of any warranty.
+//
+// Alternatively, this file may be used under the terms of Open CASCADE
+// commercial license or contractual agreement.
+
+#ifndef _Quantity_ColorRGBAHasher_HeaderFile
+#define _Quantity_ColorRGBAHasher_HeaderFile
+
+#include <Quantity_ColorRGBA.hxx>
+#include <Quantity_ColorHasher.hxx>
+
+//! Hasher of Quantity_ColorRGBA.
+struct Quantity_ColorRGBAHasher
+{
+
+  //! Returns hash code for the given color.
+  static Standard_Integer HashCode (const Quantity_ColorRGBA& theColor,
+                                    const Standard_Integer    theUpper)
+  {
+    const NCollection_Vec4<float>& aColor = theColor;
+    uint32_t aColor32 = (uint32_t(aColor.a() * 255.0f) << 24)
+                      + (uint32_t(aColor.b() * 255.0f) << 16)
+                      + (uint32_t(aColor.g() * 255.0f) << 8)
+                      +  uint32_t(aColor.r() * 255.0f);
+    return ((aColor32 & 0x7fffffff) % theUpper) + 1;
+  }
+
+  //! Returns true if two colors are equal.
+  static Standard_Boolean IsEqual (const Quantity_ColorRGBA& theColor1,
+                                   const Quantity_ColorRGBA& theColor2)
+  {
+    return theColor1 == theColor2;
+  }
+
+};
+
+#endif // _Quantity_ColorRGBAHasher_HeaderFile
index a90c685..151e1b2 100644 (file)
@@ -149,10 +149,10 @@ void XCAFPrs::CollectStyleSettings (const TDF_Label& theLabel,
     }
     else
     {
-      Quantity_Color aColor;
+      Quantity_ColorRGBA aColor;
       if (aColorTool->GetColor (aLabel, XCAFDoc_ColorGen, aColor))
       {
-        aStyle.SetColorCurv (aColor);
+        aStyle.SetColorCurv (aColor.GetRGB());
         aStyle.SetColorSurf (aColor);
       }
       if (aColorTool->GetColor (aLabel, XCAFDoc_ColorSurf, aColor))
@@ -161,7 +161,7 @@ void XCAFPrs::CollectStyleSettings (const TDF_Label& theLabel,
       }
       if (aColorTool->GetColor (aLabel, XCAFDoc_ColorCurv, aColor))
       {
-        aStyle.SetColorCurv (aColor);
+        aStyle.SetColorCurv (aColor.GetRGB());
       }
     }
 
@@ -189,7 +189,7 @@ void XCAFPrs::CollectStyleSettings (const TDF_Label& theLabel,
           }
         }
 
-        Quantity_Color aColor;
+        Quantity_ColorRGBA aColor;
         XCAFPrs_Style aShuoStyle;
         if (!aColorTool->IsVisible (aShuolab))
         {
@@ -199,7 +199,7 @@ void XCAFPrs::CollectStyleSettings (const TDF_Label& theLabel,
         {
           if (aColorTool->GetColor (aShuolab, XCAFDoc_ColorGen, aColor))
           {
-            aShuoStyle.SetColorCurv (aColor);
+            aShuoStyle.SetColorCurv (aColor.GetRGB());
             aShuoStyle.SetColorSurf (aColor);
           }
           if (aColorTool->GetColor (aShuolab, XCAFDoc_ColorSurf, aColor))
@@ -208,7 +208,7 @@ void XCAFPrs::CollectStyleSettings (const TDF_Label& theLabel,
           }
           if (aColorTool->GetColor (aShuolab, XCAFDoc_ColorCurv, aColor))
           {
-            aShuoStyle.SetColorCurv (aColor);
+            aShuoStyle.SetColorCurv (aColor.GetRGB());
           }
         }
         if (!aShuoStyle.IsSetColorCurv()
index 27b4a03..44d92c1 100644 (file)
@@ -140,7 +140,7 @@ void XCAFPrs_AISObject::DispatchStyles (const Standard_Boolean theToSyncStyles)
   XCAFPrs_Style aDefStyle;
   DefaultStyle (aDefStyle);
   Quantity_Color aColorCurv = aDefStyle.GetColorCurv();
-  Quantity_Color aColorSurf = aDefStyle.GetColorSurf();
+  Quantity_ColorRGBA aColorSurf = aDefStyle.GetColorSurfRGBA();
 
   SetColors (myDrawer, aColorCurv, aColorSurf);
 
@@ -180,8 +180,8 @@ void XCAFPrs_AISObject::DispatchStyles (const Standard_Boolean theToSyncStyles)
     const XCAFPrs_Style& aStyle = aStyleGroupIter.Key();
     aDrawer->SetHidden (!aStyle.IsVisible());
 
-    aColorCurv = aStyle.IsSetColorCurv() ? aStyle.GetColorCurv() : aDefStyle.GetColorCurv();
-    aColorSurf = aStyle.IsSetColorSurf() ? aStyle.GetColorSurf() : aDefStyle.GetColorSurf();
+    aColorCurv = aStyle.IsSetColorCurv() ? aStyle.GetColorCurv()     : aDefStyle.GetColorCurv();
+    aColorSurf = aStyle.IsSetColorSurf() ? aStyle.GetColorSurfRGBA() : aDefStyle.GetColorSurfRGBA();
 
     SetColors (aDrawer, aColorCurv, aColorSurf);
   }
@@ -244,7 +244,7 @@ void XCAFPrs_AISObject::Compute (const Handle(PrsMgr_PresentationManager3d)& the
 //=======================================================================
 void XCAFPrs_AISObject::SetColors (const Handle(Prs3d_Drawer)& theDrawer,
                                    const Quantity_Color&       theColorCurv,
-                                   const Quantity_Color&       theColorSurf)
+                                   const Quantity_ColorRGBA&   theColorSurf)
 {
   if (!theDrawer->HasOwnShadingAspect())
   {
@@ -310,11 +310,12 @@ void XCAFPrs_AISObject::SetColors (const Handle(Prs3d_Drawer)& theDrawer,
   theDrawer->WireAspect()->SetColor (theColorCurv);
 
   Graphic3d_MaterialAspect aMaterial = myDrawer->ShadingAspect()->Aspect()->FrontMaterial();
-  aMaterial.SetColor (theColorSurf);
+  aMaterial.SetColor (theColorSurf.GetRGB());
+  aMaterial.SetAlpha (theColorSurf.Alpha());
   theDrawer->ShadingAspect()->Aspect()->SetInteriorColor (theColorSurf);
   theDrawer->ShadingAspect()->Aspect()->SetFrontMaterial (aMaterial);
-  theDrawer->UIsoAspect()->SetColor (theColorSurf);
-  theDrawer->VIsoAspect()->SetColor (theColorSurf);
+  theDrawer->UIsoAspect()->SetColor (theColorSurf.GetRGB());
+  theDrawer->VIsoAspect()->SetColor (theColorSurf.GetRGB());
 }
 
 //=======================================================================
@@ -342,8 +343,8 @@ void XCAFPrs_AISObject::SetMaterial (const Graphic3d_MaterialAspect& theMaterial
     const Handle(AIS_ColoredDrawer)& aDrawer = anIter.Value();
 
     // take current color
-    const Quantity_Color aColorCurv = aDrawer->WireAspect()->Aspect()->Color();
-    const Quantity_Color aSurfColor = aDrawer->ShadingAspect()->Aspect()->InteriorColor();
+    const Quantity_Color     aColorCurv = aDrawer->WireAspect()->Aspect()->Color();
+    const Quantity_ColorRGBA aSurfColor = aDrawer->ShadingAspect()->Aspect()->InteriorColorRGBA();
 
     // SetColors() will take the material from myDrawer
     SetColors (aDrawer, aColorCurv, aSurfColor);
index 6038dce..94139dc 100644 (file)
@@ -60,7 +60,12 @@ protected:
   //! Set colors to drawer
   Standard_EXPORT void SetColors (const Handle(Prs3d_Drawer)& theDrawer,
                                   const Quantity_Color&       theColorCurv,
-                                  const Quantity_Color&       theColorSurf);
+                                  const Quantity_ColorRGBA&   theColorSurf);
+
+  //! Set colors to drawer
+  void SetColors (const Handle(Prs3d_Drawer)& theDrawer,
+                  const Quantity_Color& theColorCurv,
+                  const Quantity_Color& theColorSurf) { SetColors (theDrawer, theColorCurv, Quantity_ColorRGBA (theColorSurf)); }
 
   //! Fills out a default style object which is used when styles are
   //! not explicitly defined in the document.
index 6cfb5ce..0a0c52f 100644 (file)
@@ -31,7 +31,7 @@ XCAFPrs_Style::XCAFPrs_Style()
 //function : SetColorSurf
 //purpose  :
 //=======================================================================
-void XCAFPrs_Style::SetColorSurf (const Quantity_Color& theColor)
+void XCAFPrs_Style::SetColorSurf (const Quantity_ColorRGBA& theColor)
 {
   myColorSurf    = theColor;
   myHasColorSurf = Standard_True;
@@ -44,7 +44,8 @@ void XCAFPrs_Style::SetColorSurf (const Quantity_Color& theColor)
 void XCAFPrs_Style::UnSetColorSurf()
 {
   myHasColorSurf = Standard_False;
-  myColorSurf.SetValues (Quantity_NOC_YELLOW);
+  myColorSurf.ChangeRGB().SetValues (Quantity_NOC_YELLOW);
+  myColorSurf.SetAlpha (1.0f);
 }
 
 //=======================================================================
index 7e5c57c..47a6d31 100644 (file)
@@ -19,7 +19,7 @@
 #include <Standard.hxx>
 #include <Standard_DefineAlloc.hxx>
 #include <Standard_Handle.hxx>
-#include <Quantity_ColorHasher.hxx>
+#include <Quantity_ColorRGBAHasher.hxx>
 
 //! Represents a set of styling settings applicable to a (sub)shape
 class XCAFPrs_Style 
@@ -35,11 +35,17 @@ public:
   Standard_Boolean IsSetColorSurf() const { return myHasColorSurf; }
 
   //! Return surface color.
-  const Quantity_Color& GetColorSurf() const { return myColorSurf; }
+  const Quantity_Color& GetColorSurf() const { return myColorSurf.GetRGB(); }
 
   //! Set surface color.
-  Standard_EXPORT void SetColorSurf (const Quantity_Color& col);
-  
+  void SetColorSurf (const Quantity_Color& theColor) { SetColorSurf  (Quantity_ColorRGBA (theColor)); }
+
+  //! Return surface color.
+  const Quantity_ColorRGBA& GetColorSurfRGBA() const { return myColorSurf; }
+
+  //! Set surface color.
+  Standard_EXPORT void SetColorSurf  (const Quantity_ColorRGBA& theColor);
+
   //! Manage surface color setting
   Standard_EXPORT void UnSetColorSurf();
   
@@ -98,7 +104,7 @@ public:
     int aHashCode = 0;
     if (theStyle.myHasColorSurf)
     {
-      aHashCode = aHashCode ^ Quantity_ColorHasher::HashCode (theStyle.myColorSurf, theUpper);
+      aHashCode = aHashCode ^ Quantity_ColorRGBAHasher::HashCode (theStyle.myColorSurf, theUpper);
     }
     if (theStyle.myHasColorCurv)
     {
@@ -115,11 +121,11 @@ public:
 
 protected:
 
-  Quantity_Color   myColorSurf;
-  Quantity_Color   myColorCurv;
-  Standard_Boolean myHasColorSurf;
-  Standard_Boolean myHasColorCurv;
-  Standard_Boolean myIsVisible;
+  Quantity_ColorRGBA myColorSurf;
+  Quantity_Color     myColorCurv;
+  Standard_Boolean   myHasColorSurf;
+  Standard_Boolean   myHasColorCurv;
+  Standard_Boolean   myIsVisible;
 
 };
 
index c6a4ddc..a0ed6a8 100644 (file)
@@ -20,6 +20,12 @@ XSetColor D_First b_11 1 1 1 0.2 c
 XSetColor D_First b_10 0 1 1 c
 XAddColor D_First 0.5 0.5 1 0.1
 
+XShow D_First
+vfit
+vsetdispmode 1
+vdump $::imagedir/${::casename}_first.png
+if { [vreadpixel 300 200 rgb name] != "GRAY14" } { puts "Error: wrong color in 3D Viewer" }
+
 # Write file
 SaveAs D_First ${imagedir}/bug28521.xbf
 Close D_First
@@ -73,4 +79,10 @@ if {$isOK == 0} {
   puts "Error: wrong color."
 }
 
+XShow D_Second
+vfit
+vsetdispmode 1
+vdump $::imagedir/${::casename}.png
+if { [vreadpixel 300 200 rgb name] != "GRAY14" } { puts "Error: wrong color in 3D Viewer" }
+
 Close D_Second