From d9dd07545dae9b35a580ee4b6917e25781e716bf Mon Sep 17 00:00:00 2001 From: kgv Date: Tue, 25 Jun 2019 23:26:58 +0300 Subject: [PATCH] 0030810: Data Exchange, RWObj_CafReader - fix material assignment 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 | 18 ++++++++++++++++++ src/RWObj/RWObj_TriangulationReader.cxx | 15 ++++++++++++--- src/RWObj/RWObj_TriangulationReader.hxx | 1 + 3 files changed, 31 insertions(+), 3 deletions(-) diff --git a/src/RWObj/RWObj_MtlReader.cxx b/src/RWObj/RWObj_MtlReader.cxx index 549d83ce79..f7cafc2778 100644 --- a/src/RWObj/RWObj_MtlReader.cxx +++ b/src/RWObj/RWObj_MtlReader.cxx @@ -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) diff --git a/src/RWObj/RWObj_TriangulationReader.cxx b/src/RWObj/RWObj_TriangulationReader.cxx index 1c4b7031ee..1299643b26 100644 --- a/src/RWObj/RWObj_TriangulationReader.cxx +++ b/src/RWObj/RWObj_TriangulationReader.cxx @@ -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(); diff --git a/src/RWObj/RWObj_TriangulationReader.hxx b/src/RWObj/RWObj_TriangulationReader.hxx index da51d1e73d..275995e325 100644 --- a/src/RWObj/RWObj_TriangulationReader.hxx +++ b/src/RWObj/RWObj_TriangulationReader.hxx @@ -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 };