0025459: Visualization - AIS_ColoredShape::SetMaterial() should not reset custom...
authorkgv <kgv@opencascade.com>
Fri, 14 Nov 2014 09:55:57 +0000 (12:55 +0300)
committerbugmaster <bugmaster@opencascade.com>
Fri, 21 Nov 2014 12:43:12 +0000 (15:43 +0300)
src/AIS/AIS_ColoredShape.cxx
src/AIS/AIS_ColoredShape.hxx
src/AIS/AIS_Shape.cdl
src/AIS/AIS_Shape.cxx
src/Prs3d/Prs3d_ShadingAspect.cdl
src/Prs3d/Prs3d_ShadingAspect.cxx
tests/bugs/vis/bug25459_coloredshape [new file with mode: 0644]

index aa50d38..d6ea641 100644 (file)
@@ -270,6 +270,28 @@ void AIS_ColoredShape::SetTransparency (const Standard_Real theValue)
 }
 
 //=======================================================================
+//function : SetMaterial
+//purpose  :
+//=======================================================================
+
+void AIS_ColoredShape::SetMaterial (const Graphic3d_MaterialAspect& theMaterial)
+{
+  setMaterial (myDrawer, theMaterial, HasColor(), IsTransparent());
+  //myOwnMaterial = theMaterial;
+  hasOwnMaterial = Standard_True;
+  LoadRecomputable (AIS_Shaded);
+  for (DataMapOfShapeColor::Iterator anIter (myShapeColors); anIter.More(); anIter.Next())
+  {
+    const Handle(AIS_ColoredDrawer)& aDrawer = anIter.Value();
+    //if (aDrawer->HasOwnMaterial()) continue;
+    if (aDrawer->HasShadingAspect())
+    {
+      setMaterial (aDrawer, theMaterial, aDrawer->HasOwnColor(), Standard_False); // aDrawer->IsTransparent()
+    }
+  }
+}
+
+//=======================================================================
 //function : Compute
 //purpose  :
 //=======================================================================
index c7b865f..c9affe1 100644 (file)
@@ -104,6 +104,9 @@ public: //! @name global aspects
   //! Sets transparency value.
   Standard_EXPORT virtual void SetTransparency (const Standard_Real theValue) Standard_OVERRIDE;
 
+  //! Sets the material aspect.
+  Standard_EXPORT virtual void SetMaterial (const Graphic3d_MaterialAspect& theAspect) Standard_OVERRIDE;
+
 protected: //! @name override presentation computation
 
   Standard_EXPORT virtual void Compute (const Handle(PrsMgr_PresentationManager3d)& thePrsMgr,
index 7b81d6f..9138a87 100644 (file)
@@ -306,6 +306,13 @@ uses
                      theValue  : Real   from Standard)
     is protected;
 
+    setMaterial (me;
+                 theDrawer       : Drawer from AIS;
+                 theMaterial     : MaterialAspect from Graphic3d;
+                 theToKeepColor  : Boolean from Standard;
+                 theToKeepTransp : Boolean from Standard)
+    is protected;
+
 fields
     myshape            : Shape   from TopoDS   is protected;
     myBB               : Box     from Bnd      is protected;
index f64202d..34e8197 100644 (file)
@@ -711,6 +711,35 @@ void AIS_Shape::UnsetWidth()
 }
 
 //=======================================================================
+//function : setMaterial
+//purpose  :
+//=======================================================================
+
+void AIS_Shape::setMaterial (const Handle(AIS_Drawer)&       theDrawer,
+                             const Graphic3d_MaterialAspect& theMaterial,
+                             const Standard_Boolean          theToKeepColor,
+                             const Standard_Boolean          theToKeepTransp) const
+{
+  const Quantity_Color aColor  = theDrawer->ShadingAspect()->Material     (myCurrentFacingModel).Color();
+  const Standard_Real  aTransp = theDrawer->ShadingAspect()->Transparency (myCurrentFacingModel);
+  if (!theDrawer->HasShadingAspect())
+  {
+    theDrawer->SetShadingAspect (new Prs3d_ShadingAspect());
+    *theDrawer->ShadingAspect()->Aspect() = *theDrawer->Link()->ShadingAspect()->Aspect();
+  }
+  theDrawer->ShadingAspect()->SetMaterial (theMaterial, myCurrentFacingModel);
+
+  if (theToKeepColor)
+  {
+    theDrawer->ShadingAspect()->SetColor (aColor, myCurrentFacingModel);
+  }
+  if (theToKeepTransp)
+  {
+    theDrawer->ShadingAspect()->SetTransparency (aTransp, myCurrentFacingModel);
+  }
+}
+
+//=======================================================================
 //function : SetMaterial
 //purpose  : 
 //=======================================================================
@@ -727,20 +756,9 @@ void AIS_Shape::SetMaterial(const Graphic3d_NameOfMaterial aMat)
 
 void AIS_Shape::SetMaterial (const Graphic3d_MaterialAspect& theMat)
 {
-  if (!myDrawer->HasShadingAspect())
-  {
-    myDrawer->SetShadingAspect (new Prs3d_ShadingAspect());
-    *myDrawer->ShadingAspect()->Aspect() = *myDrawer->Link()->ShadingAspect()->Aspect();
-  }
+  setMaterial (myDrawer, theMat, HasColor(), IsTransparent());
   hasOwnMaterial = Standard_True;
 
-  myDrawer->ShadingAspect()->SetMaterial (theMat, myCurrentFacingModel);
-  if (HasColor())
-  {
-    myDrawer->ShadingAspect()->SetColor (myOwnColor, myCurrentFacingModel);
-  }
-  myDrawer->ShadingAspect()->SetTransparency (myTransparency, myCurrentFacingModel);
-
   // modify shading presentation without re-computation
   const PrsMgr_Presentations&        aPrsList  = Presentations();
   Handle(Graphic3d_AspectFillArea3d) anAreaAsp = myDrawer->ShadingAspect()->Aspect();
index da96e49..cdaa748 100644 (file)
@@ -74,10 +74,12 @@ is
     Color (me; aModel: TypeOfFacingModel from Aspect = Aspect_TOFM_FRONT_SIDE) 
     returns Color from Quantity is static;
        --- Purpose: Returns the polygons color.
+       ---C++: return const &
 
     Material (me; aModel: TypeOfFacingModel from Aspect = Aspect_TOFM_FRONT_SIDE) 
     returns MaterialAspect from Graphic3d is static;
        --- Purpose: Returns the polygons material aspect.
+       ---C++: return const &
 
     Transparency (me; aModel: TypeOfFacingModel from Aspect = Aspect_TOFM_FRONT_SIDE) 
     returns Real from Standard is static;
index 4f7f480..dac08d1 100644 (file)
 // Alternatively, this file may be used under the terms of Open CASCADE
 // commercial license or contractual agreement.
 
-#define BUC60488       //GG_23/09/99 Updates correctly the Material after
-//                     any change.
-
-#define GER61351               //GG_171199     Enable to set an object RGB color
-//                                               instead a restricted object NameOfColor.
-//                             Enable to change separatly the front and back color.
-
-#define OCC1174 //SAV_080103 Added back face interior color management
-
 #include <Prs3d_ShadingAspect.ixx>
 
 //=======================================================================
@@ -53,7 +44,6 @@ Prs3d_ShadingAspect::Prs3d_ShadingAspect () {
 //purpose  : 
 //=======================================================================
 
-#ifdef GER61351
 void Prs3d_ShadingAspect::SetColor(const Quantity_NameOfColor aColor,
                                             const Aspect_TypeOfFacingModel aModel) {
 
@@ -62,10 +52,6 @@ void Prs3d_ShadingAspect::SetColor(const Quantity_NameOfColor aColor,
 
 void Prs3d_ShadingAspect::SetColor(const Quantity_Color &aColor,
                                             const Aspect_TypeOfFacingModel aModel) {
-#ifndef OCC1174  
-  myAspect->SetInteriorColor(aColor);
-#endif
-
   if( aModel != Aspect_TOFM_BOTH_SIDE ) {
     myAspect->SetDistinguishOn();
   }
@@ -73,77 +59,46 @@ void Prs3d_ShadingAspect::SetColor(const Quantity_Color &aColor,
     Graphic3d_MaterialAspect front = myAspect->FrontMaterial();
     front.SetColor(aColor);
     myAspect->SetFrontMaterial(front);
-#ifdef OCC1174
     myAspect->SetInteriorColor( aColor );
-#endif
   }
 
   if( aModel == Aspect_TOFM_BACK_SIDE || aModel == Aspect_TOFM_BOTH_SIDE ) {
     Graphic3d_MaterialAspect back = myAspect->BackMaterial();
     back.SetColor(aColor);
     myAspect->SetBackMaterial(back);
-#ifdef OCC1174
     myAspect->SetBackInteriorColor( aColor );
-#endif
   }
 }
 
-Quantity_Color Prs3d_ShadingAspect::Color( const Aspect_TypeOfFacingModel aModel ) const {
-  Quantity_Color myReturn ;
-  switch (aModel) {
+const Quantity_Color& Prs3d_ShadingAspect::Color (const Aspect_TypeOfFacingModel theModel) const
+{
+  switch (theModel)
+  {
     default:
     case Aspect_TOFM_BOTH_SIDE:
     case Aspect_TOFM_FRONT_SIDE:
-       myReturn = myAspect->FrontMaterial().Color();
-       break;
+      return myAspect->FrontMaterial().Color();
     case Aspect_TOFM_BACK_SIDE:
-       myReturn = myAspect->BackMaterial().Color();
-       break;
+      return myAspect->BackMaterial().Color();
   }
-  return myReturn ;
 }
-#else
-void Prs3d_ShadingAspect::SetColor(const Quantity_NameOfColor aColor) {
-  myAspect->SetInteriorColor(aColor);
-#ifdef OCC1174
-  myAspect->SetBackInteriorColor( aColor );
-#endif
-  myAspect->FrontMaterial().SetAmbientColor(Quantity_Color(aColor));
-  myAspect->BackMaterial().SetAmbientColor(Quantity_Color(aColor));
-//  myAspect->FrontMaterial().SetColor(Quantity_Color(aColor));
-//  myAspect->BackMaterial().SetColor(Quantity_Color(aColor));
-}
-#endif 
 
 //=======================================================================
 //function : SetMaterial
 //purpose  : 
 //=======================================================================
 
-#ifdef GER61351
 void Prs3d_ShadingAspect::SetMaterial(
                    const Graphic3d_NameOfMaterial aMaterial,
                         const Aspect_TypeOfFacingModel aModel ) {
-
   SetMaterial(Graphic3d_MaterialAspect(aMaterial),aModel);
 }
-#else
-void Prs3d_ShadingAspect::SetMaterial(
-//                 const Graphic3d_NameOfPhysicalMaterial aMaterial) {
-                 const Graphic3d_NameOfMaterial aMaterial) {
-
-  Graphic3d_MaterialAspect TheMaterial(aMaterial);
-  myAspect->SetFrontMaterial (TheMaterial);
-  myAspect->SetBackMaterial (TheMaterial);
-}
-#endif
 
 //=======================================================================
 //function : SetMaterial
 //purpose  : 
 //=======================================================================
 
-#ifdef GER61351
 void Prs3d_ShadingAspect::SetMaterial(
                    const Graphic3d_MaterialAspect& aMaterial,
                         const Aspect_TypeOfFacingModel aModel ) {
@@ -160,36 +115,24 @@ void Prs3d_ShadingAspect::SetMaterial(
   }
 }
 
-Graphic3d_MaterialAspect  Prs3d_ShadingAspect::Material(
-                        const Aspect_TypeOfFacingModel aModel ) const {
-  Graphic3d_MaterialAspect myReturn ;             
-  switch (aModel) {
+const Graphic3d_MaterialAspect& Prs3d_ShadingAspect::Material (const Aspect_TypeOfFacingModel theModel) const
+{
+  switch (theModel)
+  {
     default:
     case Aspect_TOFM_BOTH_SIDE:
     case Aspect_TOFM_FRONT_SIDE:
-       myReturn = myAspect->FrontMaterial();
-       break;
+      return myAspect->FrontMaterial();
     case Aspect_TOFM_BACK_SIDE:
-       myReturn = myAspect->BackMaterial();
-       break;
+      return myAspect->BackMaterial();
   }
- return myReturn ;  
-} 
-#else
-void Prs3d_ShadingAspect::SetMaterial(
-                 const Graphic3d_MaterialAspect&  aMaterial) 
-{
-  myAspect->SetFrontMaterial (aMaterial);
-  myAspect->SetBackMaterial (aMaterial);
 }
-#endif
 
 //=======================================================================
 //function : SetTransparency
 //purpose  : 
 //=======================================================================
 
-#ifdef GER61351
 void Prs3d_ShadingAspect::SetTransparency(const Standard_Real aValue,
                                                      const Aspect_TypeOfFacingModel aModel ) {
 
@@ -222,7 +165,6 @@ Standard_Real aValue(0.);
   }
   return aValue;
 }
-#endif
 
 //=======================================================================
 //function : SetAspect
diff --git a/tests/bugs/vis/bug25459_coloredshape b/tests/bugs/vis/bug25459_coloredshape
new file mode 100644 (file)
index 0000000..e747838
--- /dev/null
@@ -0,0 +1,25 @@
+puts "========"
+puts "OCC25459 AIS_ColoredShape::SetMaterial() should not reset custom colors"
+puts "========"
+
+box b 0 0 0 1 2 3
+
+# prepare view
+vinit View1
+vclear
+vglinfo
+vsetdispmode 1
+vaxo
+vdisplay b
+vfit
+
+# customize object
+explode b F
+vaspects b -subshapes b_3 -setcolor RED
+vaspects b -setmaterial PLASTIC
+
+# validate results
+set aFaceColor [vreadpixel 128 256 rgb name]
+if {"$aFaceColor"  != "RED4"} {
+  puts "Error: wrong Face color"
+}