0030810: Data Exchange, RWObj_CafReader - fix material assignment
authorkgv <kgv@opencascade.com>
Tue, 25 Jun 2019 20:26:58 +0000 (23:26 +0300)
committerapn <apn@opencascade.com>
Wed, 26 Jun 2019 15:48:16 +0000 (18:48 +0300)
RWObj_MtlReader fixed incorrect folder iteration within findRelativePath().
Fixed discarding texture-only material.
RWObj_TriangulationReader::addMesh() - fixed usage of wrong material for flushing previous group.

src/RWObj/RWObj_MtlReader.cxx
src/RWObj/RWObj_TriangulationReader.cxx
src/RWObj/RWObj_TriangulationReader.hxx

index 549d83c..f7cafc2 100644 (file)
@@ -63,7 +63,18 @@ namespace
         theRelativePath = aRelPath;
         return true;
       }
+
       aPath = aFolder;
+      for (; aPath.Length() >= 2;)
+      {
+        if (aPath.Value (aPath.Length()) == '/'
+         || aPath.Value (aPath.Length()) == '\\')
+        {
+          aPath = aPath.SubString (1, aPath.Length() - 1);
+          continue;
+        }
+        break;
+      }
     }
   }
 }
@@ -195,6 +206,7 @@ bool RWObj_MtlReader::Read (const TCollection_AsciiString& theFolder,
       if (validateColor (aColor))
       {
         aMat.SpecularColor = Quantity_Color (aColor.r(), aColor.g(), aColor.b(), Quantity_TOC_RGB);
+        hasAspect = true;
       }
     }
     else if (::memcmp (aPos, "Ns", 2) == 0
@@ -207,6 +219,7 @@ bool RWObj_MtlReader::Read (const TCollection_AsciiString& theFolder,
       if (aSpecular >= 0.0)
       {
         aMat.Shininess = (float )Min (aSpecular / 1000.0, 1.0);
+        hasAspect = true;
       }
     }
     else if (::memcmp (aPos, "Tr", 2) == 0
@@ -220,6 +233,7 @@ bool RWObj_MtlReader::Read (const TCollection_AsciiString& theFolder,
        && aTransp <= 0.99)
       {
         aMat.Transparency = (float )aTransp;
+        hasAspect = true;
       }
     }
     else if (*aPos == 'd' && IsSpace (aPos[1]))
@@ -233,6 +247,7 @@ bool RWObj_MtlReader::Read (const TCollection_AsciiString& theFolder,
        && anAlpha >= 0.01)
       {
         aMat.Transparency = float(1.0 - anAlpha);
+        hasAspect = true;
       }
     }
     else if (::memcmp (aPos, "map_Kd", 6) == 0
@@ -242,6 +257,7 @@ bool RWObj_MtlReader::Read (const TCollection_AsciiString& theFolder,
       if (RWObj_Tools::ReadName (aPos, aMat.DiffuseTexture))
       {
         processTexturePath (aMat.DiffuseTexture, theFolder);
+        hasAspect = true;
       }
     }
     else if (::memcmp (aPos, "map_Ks", 6) == 0
@@ -251,6 +267,7 @@ bool RWObj_MtlReader::Read (const TCollection_AsciiString& theFolder,
       if (RWObj_Tools::ReadName (aPos, aMat.SpecularTexture))
       {
         processTexturePath (aMat.SpecularTexture, theFolder);
+        hasAspect = true;
       }
     }
     else if (::memcmp (aPos, "map_Bump", 8) == 0
@@ -260,6 +277,7 @@ bool RWObj_MtlReader::Read (const TCollection_AsciiString& theFolder,
       if (RWObj_Tools::ReadName (aPos, aMat.BumpTexture))
       {
         processTexturePath (aMat.BumpTexture, theFolder);
+        hasAspect = true;
       }
     }
     /*else if (::memcmp (aPos, "illum", 5) == 0)
index 1c4b703..1299643 100644 (file)
@@ -32,7 +32,6 @@ Standard_Boolean RWObj_TriangulationReader::addMesh (const RWObj_SubMesh& theMes
     return Standard_False;
   }
 
-  const RWObj_Material* aMaterial = myMaterials.Seek (theMesh.Material);
   if (Handle(Poly_Triangulation) aTris = GetTriangulation())
   {
     myNodes.Clear();
@@ -46,7 +45,11 @@ Standard_Boolean RWObj_TriangulationReader::addMesh (const RWObj_SubMesh& theMes
       {
         if (myShapeReceiver != NULL)
         {
-          myShapeReceiver->BindNamedShape (myLastGroupShape, theMesh.Group, myLastGroupShape.ShapeType() == TopAbs_FACE ? aMaterial : NULL, Standard_False);
+          const RWObj_Material* aMaterial = myLastGroupShape.ShapeType() == TopAbs_FACE
+                                        && !myLastFaceMaterial.IsEmpty()
+                                          ? myMaterials.Seek (myLastFaceMaterial)
+                                          : NULL;
+          myShapeReceiver->BindNamedShape (myLastGroupShape, myLastGroupName, aMaterial, Standard_False);
         }
       }
       myLastGroupShape = TopoDS_Shape();
@@ -57,8 +60,10 @@ Standard_Boolean RWObj_TriangulationReader::addMesh (const RWObj_SubMesh& theMes
     BRep_Builder aBuilder;
     aBuilder.MakeFace (aNewFace, aTris);
     addSubShape (myLastGroupShape, aNewFace, Standard_True);
+    myLastFaceMaterial = theMesh.Material;
     if (myShapeReceiver != NULL)
     {
+      const RWObj_Material* aMaterial = myMaterials.Seek (theMesh.Material);
       myShapeReceiver->BindNamedShape (aNewFace, "", aMaterial, Standard_False);
     }
   }
@@ -70,7 +75,11 @@ Standard_Boolean RWObj_TriangulationReader::addMesh (const RWObj_SubMesh& theMes
     {
       if (myShapeReceiver != NULL)
       {
-        myShapeReceiver->BindNamedShape (myLastGroupShape, theMesh.Group, myLastGroupShape.ShapeType() == TopAbs_FACE ? aMaterial : NULL, Standard_False);
+        const RWObj_Material* aMaterial = myLastGroupShape.ShapeType() == TopAbs_FACE
+                                          && !myLastFaceMaterial.IsEmpty()
+                                            ? myMaterials.Seek (myLastFaceMaterial)
+                                            : NULL;
+        myShapeReceiver->BindNamedShape (myLastGroupShape, myLastGroupName, aMaterial, Standard_False);
       }
     }
     myLastGroupShape = TopoDS_Shape();
index da51d1e..275995e 100644 (file)
@@ -117,6 +117,7 @@ protected:
   TopoDS_Compound         myLastObjectShape; //!< Compound containing current object groups
   TopoDS_Shape            myLastGroupShape;  //!< current group shape - either a single Face or Compound of Faces
   TCollection_AsciiString myLastGroupName;   //!< current group name
+  TCollection_AsciiString myLastFaceMaterial;//!< last face material name
   Standard_Boolean        myToCreateShapes;  //!< create a single triangulation
 
 };