Introduced new attribute XCAFDoc_VisMaterial storing visualization material definition.
//! Default constructor.
AIS_ColoredDrawer (const Handle(Prs3d_Drawer)& theLink)
: myIsHidden (false),
+ myHasOwnMaterial(false),
myHasOwnColor (false),
myHasOwnTransp(false),
myHasOwnWidth (false)
bool IsHidden() const { return myIsHidden; }
void SetHidden (const bool theToHide) { myIsHidden = theToHide;}
+ bool HasOwnMaterial() const { return myHasOwnMaterial; }
+ void UnsetOwnMaterial() { myHasOwnMaterial = false; }
+ void SetOwnMaterial() { myHasOwnMaterial = true; }
+
bool HasOwnColor() const { return myHasOwnColor; }
void UnsetOwnColor() { myHasOwnColor = false; }
void SetOwnColor (const Quantity_Color& /*theColor*/) { myHasOwnColor = true; }
public: //! @name list of overridden properties
bool myIsHidden;
+ bool myHasOwnMaterial;
bool myHasOwnColor;
bool myHasOwnTransp;
bool myHasOwnWidth;
for (AIS_DataMapOfShapeDrawer::Iterator anIter (myShapeColors); anIter.More(); anIter.Next())
{
const Handle(AIS_ColoredDrawer)& aDrawer = anIter.Value();
- //if (aDrawer->HasOwnMaterial()) continue;
+ if (aDrawer->HasOwnMaterial())
+ {
+ continue;
+ }
+
if (aDrawer->HasOwnShadingAspect())
{
setMaterial (aDrawer, theMaterial, aDrawer->HasOwnColor(), aDrawer->HasOwnTransparency());
}
aMat->Id = aMatId.GetString();
myMaterialsCommon.Bind (aMat->Id, aMat);
+ gltfBindMaterial (Handle(RWGltf_MaterialMetallicRoughness)(), aMat);
}
}
else if (aMatList->IsArray())
aMatCommon->Id = TCollection_AsciiString ("mat_") + aMatIndex;
myMaterialsCommon.Bind (TCollection_AsciiString (aMatIndex), aMatCommon);
}
+
+ gltfBindMaterial (aMatPbr, aMatCommon);
}
}
}
+// =======================================================================
+// function : gltfBindMaterial
+// purpose :
+// =======================================================================
+void RWGltf_GltfJsonParser::gltfBindMaterial (const Handle(RWGltf_MaterialMetallicRoughness)& theMatPbr,
+ const Handle(RWGltf_MaterialCommon)& theMatCommon)
+{
+ if (theMatPbr.IsNull()
+ && theMatCommon.IsNull())
+ {
+ return;
+ }
+
+ Handle(XCAFDoc_VisMaterial) aMat = new XCAFDoc_VisMaterial();
+ if (!theMatCommon.IsNull())
+ {
+ XCAFDoc_VisMaterialCommon aMatXde;
+ aMatXde.IsDefined = true;
+ aMatXde.AmbientColor = theMatCommon->AmbientColor;
+ aMatXde.DiffuseColor = theMatCommon->DiffuseColor;
+ aMatXde.SpecularColor = theMatCommon->SpecularColor;
+ aMatXde.EmissiveColor = theMatCommon->EmissiveColor;
+ aMatXde.Shininess = theMatCommon->Shininess;
+ aMatXde.Transparency = theMatCommon->Transparency;
+ aMatXde.AmbientTexture = theMatCommon->AmbientTexture;
+ aMatXde.DiffuseTexture = theMatCommon->DiffuseTexture;
+ aMatXde.SpecularTexture = theMatCommon->SpecularTexture;
+ aMat->SetCommonMaterial (aMatXde);
+ }
+ if (!theMatPbr.IsNull())
+ {
+ XCAFDoc_VisMaterialMetallicRoughness aMatXde;
+ aMatXde.IsDefined = true;
+ aMatXde.MetallicRoughnessTexture = theMatPbr->MetallicRoughnessTexture;
+ aMatXde.BaseColorTexture = theMatPbr->BaseColorTexture;
+ aMatXde.EmissiveTexture = theMatPbr->EmissiveTexture;
+ aMatXde.OcclusionTexture = theMatPbr->OcclusionTexture;
+ aMatXde.NormalTexture = theMatPbr->NormalTexture;
+ aMatXde.BaseColor = theMatPbr->BaseColor;
+ aMatXde.EmissiveFactor = theMatPbr->EmissiveFactor;
+ aMatXde.Metallic = theMatPbr->Metallic;
+ aMatXde.Roughness = theMatPbr->Roughness;
+ aMat->SetMetalRougnessMaterial (aMatXde);
+ }
+
+ myMaterials.Bind (!theMatPbr.IsNull() ? theMatPbr->Id : theMatCommon->Id, aMat);
+}
+
// =======================================================================
// function : gltfParseStdMaterial
// purpose :
{
RWMesh_NodeAttributes aShapeAttribs;
aShapeAttribs.RawName = aUserName;
- aShapeAttribs.Style.SetColorSurf (aMeshData->BaseColor());
+ //aShapeAttribs.Style.SetColorSurf (aMeshData->BaseColor());
+
+ Handle(XCAFDoc_VisMaterial) aMat;
+ myMaterials.Find (!aMeshData->MaterialPbr().IsNull() ? aMeshData->MaterialPbr()->Id : aMeshData->MaterialCommon()->Id, aMat);
+ aShapeAttribs.Style.SetMaterial (aMat);
+
myAttribMap->Bind (aFace, aShapeAttribs);
}
myFaceList.Append (aFace);
{
if (aLateData->HasStyle())
{
- aShapeAttribs.Style.SetColorSurf (aLateData->BaseColor());
+ //aShapeAttribs.Style.SetColorSurf (aLateData->BaseColor());
+ Handle(XCAFDoc_VisMaterial) aMat;
+ myMaterials.Find (!aLateData->MaterialPbr().IsNull() ? aLateData->MaterialPbr()->Id : aLateData->MaterialCommon()->Id, aMat);
+ aShapeAttribs.Style.SetMaterial (aMat);
}
if (aShapeAttribs.Name.IsEmpty()
&& myUseMeshNameAsFallback)
Standard_EXPORT bool gltfParseTexture (Handle(Image_Texture)& theTexture,
const RWGltf_JsonValue* theTextureId);
+ //! Bind material definition to the map.
+ Standard_EXPORT void gltfBindMaterial (const Handle(RWGltf_MaterialMetallicRoughness)& theMatPbr,
+ const Handle(RWGltf_MaterialCommon)& theMatCommon);
+
protected:
//! Parse scene array of nodes recursively.
NCollection_DataMap<TCollection_AsciiString, Handle(RWGltf_MaterialMetallicRoughness)> myMaterialsPbr;
NCollection_DataMap<TCollection_AsciiString, Handle(RWGltf_MaterialCommon)> myMaterialsCommon;
+ NCollection_DataMap<TCollection_AsciiString, Handle(XCAFDoc_VisMaterial)> myMaterials;
NCollection_DataMap<TCollection_AsciiString, TopoDS_Shape> myShapeMap[2];
NCollection_DataMap<TCollection_AsciiString, bool> myProbedFiles;
#include <XCAFDoc_DocumentTool.hxx>
#include <XCAFDoc_ShapeMapTool.hxx>
#include <XCAFDoc_ShapeTool.hxx>
+#include <XCAFDoc_VisMaterialTool.hxx>
IMPLEMENT_STANDARD_RTTIEXT(RWMesh_CafReader, Standard_Transient)
{
aColorTool->SetColor (aNewRefLabel, aShapeAttribs.Style.GetColorCurv(), XCAFDoc_ColorCurv);
}
+ if (!aShapeAttribs.Style.Material().IsNull())
+ {
+ /// TODO duplicates!
+ Handle(XCAFDoc_VisMaterialTool) aMatTool = XCAFDoc_DocumentTool::VisMaterialTool (myXdeDoc->Main());
+ const TDF_Label aMaterialLabel = aMatTool->AddMaterial (aShapeAttribs.Style.Material()->MetalRougnessMaterial(), aShapeAttribs.Style.Material()->CommonMaterial());
+ aMatTool->SetShapeMaterial (aNewRefLabel, aMaterialLabel);
+ }
// store sub-shapes (iterator is set to ignore Location)
TCollection_AsciiString aDummyName;
aShapeAttribs.Name = theName;
if (theMaterial != NULL)
{
- aShapeAttribs.Style.SetColorSurf (Quantity_ColorRGBA (theMaterial->DiffuseColor, 1.0f - theMaterial->Transparency));
+ ///aShapeAttribs.Style.SetColorSurf (Quantity_ColorRGBA (theMaterial->DiffuseColor, 1.0f - theMaterial->Transparency));
+
+ Handle(XCAFDoc_VisMaterial) aMat = new XCAFDoc_VisMaterial();
+ XCAFDoc_VisMaterialCommon aMatXde;
+ aMatXde.IsDefined = true;
+ aMatXde.AmbientColor = theMaterial->AmbientColor;
+ aMatXde.DiffuseColor = theMaterial->DiffuseColor;
+ aMatXde.SpecularColor = theMaterial->SpecularColor;
+ aMatXde.Shininess = theMaterial->Shininess;
+ aMatXde.Transparency = theMaterial->Transparency;
+ if (!theMaterial->DiffuseTexture.IsEmpty())
+ {
+ aMatXde.DiffuseTexture = new Image_Texture (theMaterial->DiffuseTexture);
+ }
+ if (!theMaterial->SpecularTexture.IsEmpty())
+ {
+ aMatXde.SpecularTexture = new Image_Texture (theMaterial->SpecularTexture);
+ }
+ aMat->SetCommonMaterial (aMatXde);
+ aShapeAttribs.Style.SetMaterial (aMat);
}
myAttribMap.Bind (theShape, aShapeAttribs);
XCAFDoc_View.hxx
XCAFDoc_ViewTool.cxx
XCAFDoc_ViewTool.hxx
+XCAFDoc_VisMaterial.cxx
+XCAFDoc_VisMaterial.hxx
+XCAFDoc_VisMaterialTool.cxx
+XCAFDoc_VisMaterialTool.hxx
XCAFDoc_Volume.cxx
XCAFDoc_Volume.hxx
return ID;
}
+//=======================================================================
+//function : VisMaterialRefGUID
+//purpose :
+//=======================================================================
+const Standard_GUID& XCAFDoc::VisMaterialRefGUID()
+{
+ static const Standard_GUID ID ("936F4070-5369-405D-A7AD-2AC76C860EC8");
+ return ID;
+}
//=======================================================================
//function : NoteRefGUID
Standard_EXPORT static const Standard_GUID& MaterialRefGUID();
+ //! Return GUID for TreeNode representing Visualization Material.
+ Standard_EXPORT static const Standard_GUID& VisMaterialRefGUID();
+
//! Return GUIDs for representing notes
Standard_EXPORT static const Standard_GUID& NoteRefGUID();
IMPLEMENT_STANDARD_RTTIEXT(XCAFDoc_ColorTool,TDF_Attribute)
-#define AUTONAMING // automatically set names for labels
+static Standard_Boolean XCAFDoc_ColorTool_AutoNaming = Standard_True;
+
+//=======================================================================
+//function : SetAutoNaming
+//purpose :
+//=======================================================================
+void XCAFDoc_ColorTool::SetAutoNaming (Standard_Boolean theIsAutoNaming)
+{
+ XCAFDoc_ColorTool_AutoNaming = theIsAutoNaming;
+}
+
+//=======================================================================
+//function : AutoNaming
+//purpose :
+//=======================================================================
+Standard_Boolean XCAFDoc_ColorTool::AutoNaming()
+{
+ return XCAFDoc_ColorTool_AutoNaming;
+}
//=======================================================================
//function : BaseLabel
//purpose :
//=======================================================================
-TDF_Label XCAFDoc_ColorTool::AddColor(const Quantity_ColorRGBA& col) const
+TDF_Label XCAFDoc_ColorTool::AddColor (const Quantity_ColorRGBA& theColor) const
{
- TDF_Label L;
- if (FindColor(col, L)) return L;
+ TDF_Label aLab;
+ if (FindColor (theColor, aLab))
+ {
+ return aLab;
+ }
// create a new color entry
-
TDF_TagSource aTag;
- L = aTag.NewChild(Label());
-
- XCAFDoc_Color::Set(L, col);
-
-#ifdef AUTONAMING
- // set name according to color value
- TCollection_AsciiString str;
- Quantity_Color aColor = col.GetRGB();
- str += aColor.StringName(aColor.Name());
- str += " (";
- str += TCollection_AsciiString(aColor.Red());
- str += ",";
- str += TCollection_AsciiString(aColor.Green());
- str += ",";
- str += TCollection_AsciiString(aColor.Blue());
- str += ",";
- str += TCollection_AsciiString(col.Alpha());
- str += ")";
- TDataStd_Name::Set(L, str);
-#endif
+ aLab = aTag.NewChild (Label());
+ XCAFDoc_Color::Set (aLab, theColor);
+
+ if (XCAFDoc_ColorTool_AutoNaming)
+ {
+ // set name according to color value
+ const NCollection_Vec4<float>& anRgbaF = theColor;
+ const NCollection_Vec4<unsigned int> anRgba (anRgbaF * 255.0f);
+ char aColorHex[32];
+ Sprintf (aColorHex, "%02X%02X%02X%02X", anRgba.r(), anRgba.g(), anRgba.b(), anRgba.a());
+ const TCollection_AsciiString aName = TCollection_AsciiString (Quantity_Color::StringName (theColor.GetRGB().Name()))
+ + " (#" + aColorHex + ")";
+ TDataStd_Name::Set (aLab, aName);
+ }
- return L;
+ return aLab;
}
//=======================================================================
//! Provide tools for management of Colors section of document.
class XCAFDoc_ColorTool : public TDF_Attribute
{
+public:
+ //! Returns current auto-naming mode; TRUE by default.
+ //! If TRUE then for added colors the TDataStd_Name attribute will be automatically added.
+ //! This setting is global.
+ Standard_EXPORT static Standard_Boolean AutoNaming();
+
+ //! See also AutoNaming().
+ Standard_EXPORT static void SetAutoNaming (Standard_Boolean theIsAutoNaming);
public:
-
Standard_EXPORT XCAFDoc_ColorTool();
//! Creates (if not exist) ColorTool.
// Alternatively, this file may be used under the terms of Open CASCADE
// commercial license or contractual agreement.
+#include <XCAFDoc_DocumentTool.hxx>
#include <Standard_GUID.hxx>
#include <Standard_Type.hxx>
#include <XCAFDoc_ColorTool.hxx>
#include <XCAFDoc_ClippingPlaneTool.hxx>
#include <XCAFDoc_DimTolTool.hxx>
-#include <XCAFDoc_DocumentTool.hxx>
#include <XCAFDoc_LayerTool.hxx>
#include <XCAFDoc_MaterialTool.hxx>
#include <XCAFDoc_NotesTool.hxx>
#include <XCAFDoc_ShapeTool.hxx>
#include <XCAFDoc_ViewTool.hxx>
+#include <XCAFDoc_VisMaterialTool.hxx>
IMPLEMENT_STANDARD_RTTIEXT(XCAFDoc_DocumentTool,TDF_Attribute)
return L;
}
+//=======================================================================
+//function : VisMaterialLabel
+//purpose :
+//=======================================================================
+TDF_Label XCAFDoc_DocumentTool::VisMaterialLabel (const TDF_Label& theLabel)
+{
+ TDF_Label aLabel = DocLabel (theLabel).FindChild (10, Standard_True);
+ TDataStd_Name::Set (aLabel, "VisMaterials");
+ return aLabel;
+}
+
//=======================================================================
//function : ShapeTool
//purpose :
return XCAFDoc_ColorTool::Set(ColorsLabel(acces));
}
+//=======================================================================
+//function : VisMaterialTool
+//purpose :
+//=======================================================================
+Handle(XCAFDoc_VisMaterialTool) XCAFDoc_DocumentTool::VisMaterialTool (const TDF_Label& theLabel)
+{
+ return XCAFDoc_VisMaterialTool::Set (VisMaterialLabel (theLabel));
+}
//=======================================================================
//function : LayerTool
class XCAFDoc_MaterialTool;
class XCAFDoc_NotesTool;
class XCAFDoc_ViewTool;
+class XCAFDoc_VisMaterialTool;
class TDF_Attribute;
class TDF_RelocationTable;
public:
-
Standard_EXPORT static const Standard_GUID& GetID();
//! Create (if not exist) DocumentTool attribute
//! Returns sub-label of DocLabel() with tag 9.
Standard_EXPORT static TDF_Label NotesLabel(const TDF_Label& acces);
+ //! Returns sub-label of DocLabel() with tag 10.
+ Standard_EXPORT static TDF_Label VisMaterialLabel (const TDF_Label& theLabel);
+
//! Creates (if it does not exist) ShapeTool attribute on ShapesLabel().
Standard_EXPORT static Handle(XCAFDoc_ShapeTool) ShapeTool (const TDF_Label& acces);
//! Creates (if it does not exist) ColorTool attribute on ColorsLabel().
Standard_EXPORT static Handle(XCAFDoc_ColorTool) ColorTool (const TDF_Label& acces);
-
+
+ //! Creates (if it does not exist) XCAFDoc_VisMaterialTool attribute on VisMaterialLabel().
+ //! Should not be confused with MaterialTool() defining physical/manufacturing materials.
+ Standard_EXPORT static Handle(XCAFDoc_VisMaterialTool) VisMaterialTool (const TDF_Label& theLabel);
+
//! Creates (if it does not exist) LayerTool attribute on LayersLabel().
Standard_EXPORT static Handle(XCAFDoc_LayerTool) LayerTool (const TDF_Label& acces);
//! Creates (if it does not exist) NotesTool attribute on NotesLabel().
Standard_EXPORT static Handle(XCAFDoc_NotesTool) NotesTool(const TDF_Label& acces);
+public:
+
Standard_EXPORT XCAFDoc_DocumentTool();
//! to be called when reading this attribute from file
DEFINE_STANDARD_RTTIEXT(XCAFDoc_DocumentTool,TDF_Attribute)
-protected:
-
-
-
-
-private:
-
-
-
-
};
-
-
-
-
-
-
#endif // _XCAFDoc_DocumentTool_HeaderFile
--- /dev/null
+// Copyright (c) 2019 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.
+
+#include <XCAFDoc_VisMaterial.hxx>
+
+#include <Graphic3d_MaterialAspect.hxx>
+#include <Standard_GUID.hxx>
+#include <TDF_Label.hxx>
+
+IMPLEMENT_STANDARD_RTTIEXT(XCAFDoc_VisMaterial, TDF_Attribute)
+
+//=======================================================================
+//function : GetID
+//purpose :
+//=======================================================================
+const Standard_GUID& XCAFDoc_VisMaterial::GetID()
+{
+ static Standard_GUID THE_VIS_MAT_ID ("EBB00255-03A0-4845-BD3B-A70EEDEEFA78");
+ return THE_VIS_MAT_ID;
+}
+
+//=======================================================================
+//function : Constructor
+//purpose :
+//=======================================================================
+XCAFDoc_VisMaterial::XCAFDoc_VisMaterial()
+{
+ //
+}
+
+ //=======================================================================
+ //function : Set
+ //purpose :
+ //=======================================================================
+Handle(XCAFDoc_VisMaterial) XCAFDoc_VisMaterial::Set (const TDF_Label& theLabel,
+ const XCAFDoc_VisMaterialMetallicRoughness& theMetRoughnessMat,
+ const XCAFDoc_VisMaterialCommon& theCommonMat)
+{
+ Handle(XCAFDoc_VisMaterial) anAttrib;
+ if (!theLabel.FindAttribute (XCAFDoc_VisMaterial::GetID(), anAttrib))
+ {
+ anAttrib = new XCAFDoc_VisMaterial();
+ theLabel.AddAttribute (anAttrib);
+ }
+
+ anAttrib->Backup();
+ anAttrib->myMetalRoughMat = theMetRoughnessMat;
+ anAttrib->myCommonMat = theCommonMat;
+ return anAttrib;
+}
+
+//=======================================================================
+//function : SetMetalRougnessMaterial
+//purpose :
+//=======================================================================
+void XCAFDoc_VisMaterial::SetMetalRougnessMaterial (const XCAFDoc_VisMaterialMetallicRoughness& theMaterial)
+{
+ Backup();
+ myMetalRoughMat = theMaterial;
+}
+
+//=======================================================================
+//function : SetCommonMaterial
+//purpose :
+//=======================================================================
+void XCAFDoc_VisMaterial::SetCommonMaterial (const XCAFDoc_VisMaterialCommon& theMaterial)
+{
+ Backup();
+ myCommonMat = theMaterial;
+}
+
+//=======================================================================
+//function : Restore
+//purpose :
+//=======================================================================
+void XCAFDoc_VisMaterial::Restore (const Handle(TDF_Attribute)& theWith)
+{
+ XCAFDoc_VisMaterial* anOther = dynamic_cast<XCAFDoc_VisMaterial* >(theWith.get());
+ myMetalRoughMat = anOther->myMetalRoughMat;
+ myCommonMat = anOther->myCommonMat;
+}
+
+//=======================================================================
+//function : NewEmpty
+//purpose :
+//=======================================================================
+Handle(TDF_Attribute) XCAFDoc_VisMaterial::NewEmpty() const
+{
+ return new XCAFDoc_VisMaterial();
+}
+
+//=======================================================================
+//function : Paste
+//purpose :
+//=======================================================================
+void XCAFDoc_VisMaterial::Paste (const Handle(TDF_Attribute)& theInto,
+ const Handle(TDF_RelocationTable)& ) const
+{
+ XCAFDoc_VisMaterial* anOther = dynamic_cast<XCAFDoc_VisMaterial* >(theInto.get());
+ anOther->Backup();
+ anOther->myMetalRoughMat = myMetalRoughMat;
+ anOther->myCommonMat = myCommonMat;
+}
+
+//=======================================================================
+//function : FillMaterialAspect
+//purpose :
+//=======================================================================
+void XCAFDoc_VisMaterial::FillMaterialAspect (Graphic3d_MaterialAspect& theAspect) const
+{
+ if (myCommonMat.IsDefined)
+ {
+ theAspect = Graphic3d_MaterialAspect (Graphic3d_NOM_UserDefined);
+ theAspect.SetAmbientColor (myCommonMat.AmbientColor);
+ theAspect.SetDiffuseColor (myCommonMat.DiffuseColor);
+ theAspect.SetSpecularColor(myCommonMat.SpecularColor);
+ theAspect.SetEmissiveColor(myCommonMat.EmissiveColor);
+ theAspect.SetTransparency (myCommonMat.Transparency);
+ theAspect.SetShininess (myCommonMat.Shininess);
+ }
+ if (myMetalRoughMat.IsDefined)
+ {
+ if (myCommonMat.IsDefined)
+ {
+ return;
+ }
+
+ theAspect = Graphic3d_MaterialAspect (Graphic3d_NOM_UserDefined);
+ theAspect.SetDiffuseColor (myMetalRoughMat.BaseColor.GetRGB());
+ theAspect.SetAlpha (myMetalRoughMat.BaseColor.Alpha());
+ theAspect.SetSpecularColor(Quantity_Color (Graphic3d_Vec3 (myMetalRoughMat.Metallic)));
+ theAspect.SetShininess (1.0f - myMetalRoughMat.Roughness);
+ }
+}
--- /dev/null
+// Copyright (c) 2019 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 _XCAFDoc_VisMaterial_HeaderFile
+#define _XCAFDoc_VisMaterial_HeaderFile
+
+#include <Graphic3d_Vec.hxx>
+#include <Image_Texture.hxx>
+#include <TDF_Attribute.hxx>
+#include <Quantity_ColorRGBA.hxx>
+
+class Graphic3d_MaterialAspect;
+
+//! Common (obsolete) material definition.
+struct XCAFDoc_VisMaterialCommon
+{
+ Handle(Image_Texture) AmbientTexture; //!< image defining ambient color
+ Handle(Image_Texture) DiffuseTexture; //!< image defining diffuse color
+ Handle(Image_Texture) SpecularTexture; //!< image defining specular color
+ Quantity_Color AmbientColor; //!< ambient color
+ Quantity_Color DiffuseColor; //!< diffuse color
+ Quantity_Color SpecularColor; //!< specular color
+ Quantity_Color EmissiveColor; //!< emission color
+ Standard_ShortReal Shininess; //!< shininess value
+ Standard_ShortReal Transparency; //!< transparency value within [0, 1] range with 0 meaning opaque
+ Standard_Boolean IsDefined; //!< defined flag; FALSE by default
+
+ //! Empty constructor.
+ XCAFDoc_VisMaterialCommon()
+ : AmbientColor (0.1, 0.1, 0.1, Quantity_TOC_RGB),
+ DiffuseColor (0.8, 0.8, 0.8, Quantity_TOC_RGB),
+ SpecularColor(0.2, 0.2, 0.2, Quantity_TOC_RGB),
+ EmissiveColor(0.0, 0.0, 0.0, Quantity_TOC_RGB),
+ Shininess (1.0f),
+ Transparency (0.0f),
+ IsDefined (Standard_False) {}
+
+ //! Compare two materials.
+ Standard_Boolean IsEqual (const XCAFDoc_VisMaterialCommon& theOther) const
+ {
+ if (&theOther == this)
+ {
+ return true;
+ }
+ else if (theOther.IsDefined != IsDefined)
+ {
+ return false;
+ }
+ else if (!IsDefined)
+ {
+ return true;
+ }
+
+ return theOther.AmbientTexture == AmbientTexture
+ && theOther.DiffuseTexture == DiffuseTexture
+ && theOther.SpecularTexture == SpecularTexture
+ && theOther.AmbientColor == AmbientColor
+ && theOther.DiffuseColor == DiffuseColor
+ && theOther.SpecularColor == SpecularColor
+ && theOther.EmissiveColor == EmissiveColor
+ && theOther.Shininess == Shininess
+ && theOther.Transparency == Transparency;
+ }
+};
+
+//! Metallic-roughness PBR material definition.
+struct XCAFDoc_VisMaterialMetallicRoughness
+{
+ Handle(Image_Texture) BaseColorTexture; //!< RGB texture for the base color
+ Handle(Image_Texture) MetallicRoughnessTexture; //!< RG texture packing the metallic and roughness properties together
+ Handle(Image_Texture) EmissiveTexture; //!< RGB emissive map controls the color and intensity of the light being emitted by the material
+ Handle(Image_Texture) OcclusionTexture; //!< R occlusion map indicating areas of indirect lighting
+ Handle(Image_Texture) NormalTexture; //!< normal map
+ Quantity_ColorRGBA BaseColor; //!< base color (or scale factor to the texture); [1.0, 1.0, 1.0, 1.0] by default
+ Graphic3d_Vec3 EmissiveFactor; //!< emissive color; [0.0, 0.0, 0.0] by default
+ Standard_ShortReal Metallic; //!< metalness (or scale factor to the texture) within range [0.0, 1.0]; 1.0 by default
+ Standard_ShortReal Roughness; //!< roughness (or scale factor to the texture) within range [0.0, 1.0]; 1.0 by default
+ Standard_Boolean IsDefined; //!< defined flag; FALSE by default
+
+ //! Empty constructor.
+ XCAFDoc_VisMaterialMetallicRoughness()
+ : BaseColor (1.0f, 1.0f, 1.0f, 1.0f),
+ EmissiveFactor (0.0f, 0.0f, 0.0f),
+ Metallic (0.0f),
+ Roughness (0.0f),
+ IsDefined (Standard_False) {}
+
+ //! Compare two materials.
+ Standard_Boolean IsEqual (const XCAFDoc_VisMaterialMetallicRoughness& theOther) const
+ {
+ if (&theOther == this)
+ {
+ return true;
+ }
+ else if (theOther.IsDefined != IsDefined)
+ {
+ return false;
+ }
+ else if (!IsDefined)
+ {
+ return true;
+ }
+
+ return theOther.BaseColorTexture == BaseColorTexture
+ && theOther.MetallicRoughnessTexture == MetallicRoughnessTexture
+ && theOther.EmissiveTexture == EmissiveTexture
+ && theOther.OcclusionTexture == OcclusionTexture
+ && theOther.NormalTexture == NormalTexture
+ && theOther.BaseColor == BaseColor
+ && theOther.EmissiveFactor == EmissiveFactor
+ && theOther.Metallic == Metallic
+ && theOther.Roughness == Roughness;
+ }
+};
+
+//! Attribute storing Material definition for visualization purposes.
+class XCAFDoc_VisMaterial : public TDF_Attribute
+{
+ DEFINE_STANDARD_RTTIEXT(XCAFDoc_VisMaterial, TDF_Attribute)
+public:
+
+ //! Return attribute GUID.
+ Standard_EXPORT static const Standard_GUID& GetID();
+
+ //! Find, or create, the Material attribute.
+ Standard_EXPORT static Handle(XCAFDoc_VisMaterial) Set (const TDF_Label& theLabel,
+ const XCAFDoc_VisMaterialMetallicRoughness& theMetRoughnessMat,
+ const XCAFDoc_VisMaterialCommon& theCommonMat);
+
+ //! Find, or create, the Material attribute.
+ static Handle(XCAFDoc_VisMaterial) Set (const TDF_Label& theLabel,
+ const XCAFDoc_VisMaterialMetallicRoughness& theMetRoughnessMat)
+ {
+ return Set (theLabel, theMetRoughnessMat, XCAFDoc_VisMaterialCommon());
+ }
+
+ //! Find, or create, the Material attribute.
+ static Handle(XCAFDoc_VisMaterial) Set (const TDF_Label& theLabel,
+ const XCAFDoc_VisMaterialCommon& theCommonMat)
+ {
+ return Set (theLabel, XCAFDoc_VisMaterialMetallicRoughness(), theCommonMat);
+ }
+
+public:
+
+ Standard_EXPORT XCAFDoc_VisMaterial();
+
+ //! Return TRUE if material definition is empty.
+ bool IsEmpty() const { return !myMetalRoughMat.IsDefined && !myCommonMat.IsDefined; }
+
+ //! Fill in material aspect.
+ Standard_EXPORT void FillMaterialAspect (Graphic3d_MaterialAspect& theAspect) const;
+
+ //! Return TRUE if metal-roughness PBR material is defined.
+ Standard_Boolean HasMetalRougnessMaterial() const { return myMetalRoughMat.IsDefined; }
+
+ //! Return metal-roughness PBR material.
+ const XCAFDoc_VisMaterialMetallicRoughness& MetalRougnessMaterial() const { return myMetalRoughMat; }
+
+ //! Setup metal-roughness PBR material.
+ Standard_EXPORT void SetMetalRougnessMaterial (const XCAFDoc_VisMaterialMetallicRoughness& theMaterial);
+
+ //! Setup undefined metal-roughness PBR material.
+ void UnsetMetalRougnessMaterial() { SetMetalRougnessMaterial (XCAFDoc_VisMaterialMetallicRoughness()); }
+
+ //! Return TRUE if common material is defined.
+ Standard_Boolean HasCommonMaterial() const { return myCommonMat.IsDefined; }
+
+ //! Return common material.
+ const XCAFDoc_VisMaterialCommon& CommonMaterial() const { return myCommonMat; }
+
+ //! Setup common material.
+ Standard_EXPORT void SetCommonMaterial (const XCAFDoc_VisMaterialCommon& theMaterial);
+
+ //! Setup undefined common material.
+ void UnsetCommonMaterial() { SetCommonMaterial (XCAFDoc_VisMaterialCommon()); }
+
+ //! Compare two materials.
+ /** Standard_Boolean IsEqual (const Handle(XCAFDoc_VisMaterial)& theOther) const
+ {
+ return theOther == this
+ || (theOther->myColor == myColor);
+ }*/
+
+public: //! @name interface implementation
+
+ //! Return GUID of this attribute type.
+ virtual const Standard_GUID& ID() const Standard_OVERRIDE { return GetID(); }
+
+ //! Restore attribute from specified state.
+ //! @param theWith [in] attribute state to restore (copy into this)
+ Standard_EXPORT virtual void Restore (const Handle(TDF_Attribute)& theWith) Standard_OVERRIDE;
+
+ //! Create a new empty attribute.
+ Standard_EXPORT virtual Handle(TDF_Attribute) NewEmpty() const Standard_OVERRIDE;
+
+ //! Paste this attribute into another one.
+ //! @param theInto [in/out] target attribute to copy this into
+ //! @param theRelTable [in] relocation table
+ Standard_EXPORT virtual void Paste (const Handle(TDF_Attribute)& theInto,
+ const Handle(TDF_RelocationTable)& theRelTable) const Standard_OVERRIDE;
+
+private:
+
+ XCAFDoc_VisMaterialMetallicRoughness myMetalRoughMat; //!< metal-roughness material definition
+ XCAFDoc_VisMaterialCommon myCommonMat; //!< common material definition
+ TCollection_AsciiString myId; //!< material identifier
+
+};
+
+DEFINE_STANDARD_HANDLE(XCAFDoc_VisMaterial, TDF_Attribute)
+
+#endif // _XCAFDoc_VisMaterial_HeaderFile
--- /dev/null
+// Copyright (c) 2019 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.
+
+#include <XCAFDoc_VisMaterialTool.hxx>
+
+#include <Standard_GUID.hxx>
+#include <TDataStd_Name.hxx>
+#include <TDataStd_TreeNode.hxx>
+#include <TDataStd_UAttribute.hxx>
+#include <TDF_Attribute.hxx>
+#include <TDF_ChildIDIterator.hxx>
+#include <TDF_Label.hxx>
+#include <TNaming_NamedShape.hxx>
+#include <TopoDS_Shape.hxx>
+#include <XCAFDoc.hxx>
+#include <XCAFDoc_VisMaterial.hxx>
+#include <XCAFDoc_DocumentTool.hxx>
+#include <XCAFDoc_ShapeTool.hxx>
+
+IMPLEMENT_STANDARD_RTTIEXT(XCAFDoc_VisMaterialTool, TDF_Attribute)
+
+static Standard_Boolean XCAFDoc_VisMaterialTool_AutoNaming = Standard_True;
+
+//=======================================================================
+//function : SetAutoNaming
+//purpose :
+//=======================================================================
+void XCAFDoc_VisMaterialTool::SetAutoNaming (Standard_Boolean theIsAutoNaming)
+{
+ XCAFDoc_VisMaterialTool_AutoNaming = theIsAutoNaming;
+}
+
+//=======================================================================
+//function : AutoNaming
+//purpose :
+//=======================================================================
+Standard_Boolean XCAFDoc_VisMaterialTool::AutoNaming()
+{
+ return XCAFDoc_VisMaterialTool_AutoNaming;
+}
+
+//=======================================================================
+//function : GetID
+//purpose :
+//=======================================================================
+const Standard_GUID& XCAFDoc_VisMaterialTool::GetID()
+{
+ static Standard_GUID THE_VIS_MAT_TOOL_ID ("87B511CE-DA15-4A5E-98AF-E3F46AB5B6E8");
+ return THE_VIS_MAT_TOOL_ID;
+}
+
+//=======================================================================
+//function : Set
+//purpose :
+//=======================================================================
+Handle(XCAFDoc_VisMaterialTool) XCAFDoc_VisMaterialTool::Set (const TDF_Label& theLabel)
+{
+ Handle(XCAFDoc_VisMaterialTool) aTool;
+ if (!theLabel.FindAttribute (XCAFDoc_VisMaterialTool::GetID(), aTool))
+ {
+ aTool = new XCAFDoc_VisMaterialTool();
+ theLabel.AddAttribute (aTool);
+ aTool->myShapeTool = XCAFDoc_DocumentTool::ShapeTool (theLabel);
+ }
+ return aTool;
+}
+
+
+//=======================================================================
+//function : XCAFDoc_VisMaterialTool
+//purpose :
+//=======================================================================
+XCAFDoc_VisMaterialTool::XCAFDoc_VisMaterialTool()
+{
+ //
+}
+
+//=======================================================================
+//function : ShapeTool
+//purpose :
+//=======================================================================
+const Handle(XCAFDoc_ShapeTool)& XCAFDoc_VisMaterialTool::ShapeTool()
+{
+ if (myShapeTool.IsNull())
+ {
+ myShapeTool = XCAFDoc_DocumentTool::ShapeTool (Label());
+ }
+ return myShapeTool;
+}
+
+//=======================================================================
+//function : GetMaterial
+//purpose :
+//=======================================================================
+Handle(XCAFDoc_VisMaterial) XCAFDoc_VisMaterialTool::GetMaterial (const TDF_Label& theMatLabel) const
+{
+ Handle(XCAFDoc_VisMaterial) aMatAttrib;
+ if (theMatLabel.Father() == Label())
+ {
+ theMatLabel.FindAttribute (XCAFDoc_VisMaterial::GetID(), aMatAttrib);
+ }
+ return aMatAttrib;
+}
+
+//=======================================================================
+//function : FindMaterial
+//purpose :
+//=======================================================================
+/**Standard_Boolean XCAFDoc_VisMaterialTool::FindMaterial (const Handle(XCAFDoc_VisMaterial)& theMaterial,
+ TDF_Label& theLabel) const
+{
+ for (TDF_ChildIDIterator aChildIter (Label(), XCAFDoc_VisMaterial::GetID()); aChildIter.More(); aChildIter.Next())
+ {
+ const TDF_Label aLabel = aChildIter.Value()->Label();
+ if (Handle(XCAFDoc_VisMaterial) aMat = GetMaterial (aLabel))
+ {
+ if (aMat->IsEqual (theMaterial))
+ {
+ theLabel = aLabel;
+ return Standard_True;
+ }
+ }
+ }
+ return Standard_False;
+}*/
+
+//=======================================================================
+//function : AddMaterial
+//purpose :
+//=======================================================================
+TDF_Label XCAFDoc_VisMaterialTool::AddMaterial (const XCAFDoc_VisMaterialMetallicRoughness& theMetRoughnessMat,
+ const XCAFDoc_VisMaterialCommon& theCommonMat) const
+{
+ TDF_TagSource aTag;
+ TDF_Label aLab = aTag.NewChild (Label());
+ XCAFDoc_VisMaterial::Set (aLab, theMetRoughnessMat, theCommonMat);
+ if (!XCAFDoc_VisMaterialTool_AutoNaming)
+ {
+ return aLab;
+ }
+
+ // set name according to color value
+ /**const NCollection_Vec4<float>& anRgbaF = theColor;
+ const NCollection_Vec4<unsigned int> anRgba (anRgbaF * 255.0f);
+ char aColorHex[32];
+ Sprintf (aColorHex, "%02X%02X%02X%02X", anRgba.r(), anRgba.g(), anRgba.b(), anRgba.a());
+ const TCollection_AsciiString aName = TCollection_AsciiString (Quantity_Color::StringName (theColor.GetRGB().Name()))
+ + " (#" + aColorHex + ")";
+ TDataStd_Name::Set (aLab, aName);*/
+
+ return aLab;
+}
+
+//=======================================================================
+//function : RemoveMaterial
+//purpose :
+//=======================================================================
+void XCAFDoc_VisMaterialTool::RemoveMaterial (const TDF_Label& theLabel) const
+{
+ theLabel.ForgetAllAttributes (true);
+}
+
+//=======================================================================
+//function : GetMaterials
+//purpose :
+//=======================================================================
+void XCAFDoc_VisMaterialTool::GetMaterials (TDF_LabelSequence& theLabels) const
+{
+ theLabels.Clear();
+ for (TDF_ChildIDIterator aChildIDIterator (Label(), XCAFDoc_VisMaterial::GetID()); aChildIDIterator.More(); aChildIDIterator.Next())
+ {
+ const TDF_Label aLabel = aChildIDIterator.Value()->Label();
+ if (IsMaterial (aLabel))
+ {
+ theLabels.Append (aLabel);
+ }
+ }
+}
+
+//=======================================================================
+//function : SetShapeMaterial
+//purpose :
+//=======================================================================
+void XCAFDoc_VisMaterialTool::SetShapeMaterial (const TDF_Label& theShapeLabel,
+ const TDF_Label& theMaterialLabel) const
+{
+ // set reference
+ Handle(TDataStd_TreeNode) aMainNode = TDataStd_TreeNode::Set (theMaterialLabel, XCAFDoc::VisMaterialRefGUID());
+ Handle(TDataStd_TreeNode) aRefNode = TDataStd_TreeNode::Set (theShapeLabel, XCAFDoc::VisMaterialRefGUID());
+ aRefNode->Remove(); // abv: fix against bug in TreeNode::Append()
+ aMainNode->Prepend (aRefNode);
+}
+
+//=======================================================================
+//function : UnSetShapeMaterial
+//purpose :
+//=======================================================================
+void XCAFDoc_VisMaterialTool::UnSetShapeMaterial (const TDF_Label& theShapeLabel) const
+{
+ theShapeLabel.ForgetAttribute (XCAFDoc::VisMaterialRefGUID());
+}
+
+//=======================================================================
+//function : IsSet
+//purpose :
+//=======================================================================
+Standard_Boolean XCAFDoc_VisMaterialTool::IsSet (const TDF_Label& theLabel) const
+{
+ Handle(TDataStd_TreeNode) aNode;
+ return theLabel.FindAttribute (XCAFDoc::VisMaterialRefGUID(), aNode)
+ && aNode->HasFather();
+}
+
+//=======================================================================
+//function : GetShapeMaterial
+//purpose :
+//=======================================================================
+Standard_Boolean XCAFDoc_VisMaterialTool::GetShapeMaterial (const TDF_Label& theShapeLabel,
+ TDF_Label& theMaterialLabel)
+{
+ Handle(TDataStd_TreeNode) aNode;
+ if (!theShapeLabel.FindAttribute (XCAFDoc::VisMaterialRefGUID(), aNode)
+ || !aNode->HasFather())
+ {
+ return Standard_False;
+ }
+
+ theMaterialLabel = aNode->Father()->Label();
+ return Standard_True;
+}
+
+//=======================================================================
+//function : GetShapeMaterial
+//purpose :
+//=======================================================================
+Handle(XCAFDoc_VisMaterial) XCAFDoc_VisMaterialTool::GetShapeMaterial (const TDF_Label& theShapeLabel)
+{
+ TDF_Label aMatLabel;
+ return GetShapeMaterial (theShapeLabel, aMatLabel)
+ ? GetMaterial (aMatLabel)
+ : Handle(XCAFDoc_VisMaterial)();
+}
+
+//=======================================================================
+//function : SetShapeMaterial
+//purpose :
+//=======================================================================
+Standard_Boolean XCAFDoc_VisMaterialTool::SetShapeMaterial (const TopoDS_Shape& theShape,
+ const TDF_Label& theMaterialLabel)
+{
+ TDF_Label aShapeLabel;
+ if (!ShapeTool()->Search (theShape, aShapeLabel))
+ {
+ return Standard_False;
+ }
+
+ SetShapeMaterial (aShapeLabel, theMaterialLabel);
+ return Standard_True;
+}
+
+//=======================================================================
+//function : UnSetShapeMaterial
+//purpose :
+//=======================================================================
+Standard_Boolean XCAFDoc_VisMaterialTool::UnSetShapeMaterial (const TopoDS_Shape& theShape)
+{
+ TDF_Label aShapeLabel;
+ if (!ShapeTool()->Search (theShape, aShapeLabel))
+ {
+ return Standard_False;
+ }
+
+ UnSetShapeMaterial (aShapeLabel);
+ return Standard_True;
+}
+
+//=======================================================================
+//function : IsSet
+//purpose :
+//=======================================================================
+Standard_Boolean XCAFDoc_VisMaterialTool::IsSet (const TopoDS_Shape& theShape)
+{
+ TDF_Label aShapeLabel;
+ return ShapeTool()->Search (theShape, aShapeLabel)
+ && IsSet (aShapeLabel);
+}
+
+//=======================================================================
+//function : GetShapeMaterial
+//purpose :
+//=======================================================================
+Standard_Boolean XCAFDoc_VisMaterialTool::GetShapeMaterial (const TopoDS_Shape& theShape,
+ TDF_Label& theMaterialLabel)
+{
+ TDF_Label aShapeLabel;
+ return ShapeTool()->Search (theShape, aShapeLabel)
+ && GetShapeMaterial (aShapeLabel, theMaterialLabel);
+}
+
+//=======================================================================
+//function : GetShapeMaterial
+//purpose :
+//=======================================================================
+Handle(XCAFDoc_VisMaterial) XCAFDoc_VisMaterialTool::GetShapeMaterial (const TopoDS_Shape& theShape)
+{
+ TDF_Label aMatLabel;
+ return GetShapeMaterial (theShape, aMatLabel)
+ ? GetMaterial (aMatLabel)
+ : Handle(XCAFDoc_VisMaterial)();
+}
--- /dev/null
+// Copyright (c) 2019 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 _XCAFDoc_VisMaterialTool_HeaderFile
+#define _XCAFDoc_VisMaterialTool_HeaderFile
+
+#include <Standard_Type.hxx>
+#include <TDF_Attribute.hxx>
+#include <TDF_LabelSequence.hxx>
+
+class TopoDS_Shape;
+class Quantity_ColorRGBA;
+class XCAFDoc_ShapeTool;
+class XCAFDoc_VisMaterial;
+struct XCAFDoc_VisMaterialMetallicRoughness;
+struct XCAFDoc_VisMaterialCommon;
+
+//! Provides tools to store and retrieve attributes (visualization materials) of TopoDS_Shape in and from TDocStd_Document.
+class XCAFDoc_VisMaterialTool : public TDF_Attribute
+{
+ DEFINE_STANDARD_RTTIEXT(XCAFDoc_VisMaterialTool, TDF_Attribute)
+public:
+ //! Returns current auto-naming mode; TRUE by default.
+ //! If TRUE then for added colors the TDataStd_Name attribute will be automatically added.
+ //! This setting is global.
+ Standard_EXPORT static Standard_Boolean AutoNaming();
+
+ //! See also AutoNaming().
+ Standard_EXPORT static void SetAutoNaming (Standard_Boolean theIsAutoNaming);
+
+ //! Creates (if not exist) ColorTool.
+ Standard_EXPORT static Handle(XCAFDoc_VisMaterialTool) Set (const TDF_Label& L);
+
+ Standard_EXPORT static const Standard_GUID& GetID();
+
+public:
+
+ Standard_EXPORT XCAFDoc_VisMaterialTool();
+
+ //! returns the label under which colors are stored
+ Standard_EXPORT TDF_Label BaseLabel() const { return Label(); }
+
+ //! Returns internal XCAFDoc_ShapeTool tool
+ Standard_EXPORT const Handle(XCAFDoc_ShapeTool)& ShapeTool();
+
+ //! Returns TRUE if Label belongs to a Material Table.
+ Standard_Boolean IsMaterial (const TDF_Label& theLabel) const { return !GetMaterial (theLabel).IsNull(); }
+
+ //! Returns Material defined by specified Label, or NULL if the label is not in Material Table.
+ Standard_EXPORT Handle(XCAFDoc_VisMaterial) GetMaterial (const TDF_Label& theMatLabel) const;
+
+ //! Finds Material definition in Material Table and returns its label if found.
+ /*Standard_EXPORT Standard_Boolean FindMaterial (const Handle(XCAFDoc_VisMaterial)& theMaterial,
+ TDF_Label& theLabel) const;*/
+
+ //! Finds a color definition in a colortable and returns its label if found (or Null label else)
+/** TDF_Label FindColor (const Quantity_ColorRGBA& theColor) const
+ {
+ TDF_Label aLabel;
+ FindColor (theColor, aLabel);
+ return aLabel;
+ }*/
+
+ //! Adds Material definition to a Material Table and returns its Label (returns existing label if the same material is already defined).
+ Standard_EXPORT TDF_Label AddMaterial (const XCAFDoc_VisMaterialMetallicRoughness& theMetRoughnessMat,
+ const XCAFDoc_VisMaterialCommon& theCommonMat) const;
+
+ //! Adds Material definition to a Material Table and returns its Label (returns existing label if the same material is already defined).
+ /*Standard_EXPORT TDF_Label AddUniqueMaterial (const XCAFDoc_VisMaterialMetallicRoughness& theMetRoughnessMat,
+ const XCAFDoc_VisMaterialCommon& theCommonMat) const;*/
+
+ //! Removes Material from the Material Table
+ Standard_EXPORT void RemoveMaterial (const TDF_Label& theLabel) const;
+
+ //! Returns a sequence of Materials currently stored in the Material Table.
+ Standard_EXPORT void GetMaterials (TDF_LabelSequence& Labels) const;
+
+ //! Sets a link with GUID defined by <type> (see
+ //! XCAFDoc::ColorRefGUID()) from label <L> to color
+ //! defined by <colorL>. Color of shape is defined following way
+ //! in dependance with type of color.
+ //! If type of color is XCAFDoc_ColorGen - then this color
+ //! defines default color for surfaces and curves.
+ //! If for shape color with types XCAFDoc_ColorSurf or XCAFDoc_ColorCurv is specified
+ //! then such color overrides generic color.
+ Standard_EXPORT void SetShapeMaterial (const TDF_Label& theShapeLabel,
+ const TDF_Label& theMaterialLabel) const;
+
+ //! Removes a link with GUID defined by <type> (see
+ //! XCAFDoc::ColorRefGUID()) from label <L> to color
+ Standard_EXPORT void UnSetShapeMaterial (const TDF_Label& theShapeLabel) const;
+
+ //! Returns True if label <L> has a color assignment
+ //! of the type <type>
+ Standard_EXPORT Standard_Boolean IsSet (const TDF_Label& L) const;
+
+ //! Returns label with color assigned to <L> as <type>
+ //! Returns False if no such color is assigned
+ Standard_EXPORT static Standard_Boolean GetShapeMaterial (const TDF_Label& theShapeLabel, TDF_Label& theMaterialLabel);
+
+ //! Returns color assigned to <L> as <type>
+ //! Returns False if no such color is assigned
+ Standard_EXPORT Handle(XCAFDoc_VisMaterial) GetShapeMaterial (const TDF_Label& theShapeLabel);
+
+ //! Sets a link with GUID defined by <type> (see
+ //! XCAFDoc::ColorRefGUID()) from label <L> to color
+ //! defined by <colorL>
+ //! Returns False if cannot find a label for shape S
+ Standard_EXPORT Standard_Boolean SetShapeMaterial (const TopoDS_Shape& theShape,
+ const TDF_Label& theMaterialLabel);
+
+ //! Removes a link with GUID defined by <type> (see
+ //! XCAFDoc::ColorRefGUID()) from label <L> to color
+ //! Returns True if such link existed
+ Standard_EXPORT Standard_Boolean UnSetShapeMaterial (const TopoDS_Shape& theShape);
+
+ //! Returns True if label <L> has a color assignment
+ //! of the type <type>
+ Standard_EXPORT Standard_Boolean IsSet (const TopoDS_Shape& theShape);
+
+ //! Returns label with color assigned to <L> as <type>
+ //! Returns False if no such color is assigned
+ Standard_EXPORT Standard_Boolean GetShapeMaterial (const TopoDS_Shape& theShape, TDF_Label& theMaterialLabel);
+
+ //! Returns color assigned to <L> as <type>
+ //! Returns False if no such color is assigned
+ Standard_EXPORT Handle(XCAFDoc_VisMaterial) GetShapeMaterial (const TopoDS_Shape& theShape);
+
+ /// TODO
+ ///Standard_EXPORT Standard_Boolean ReverseChainsOfTreeNodes();
+
+public:
+
+ //! Returns GUID of this attribute type.
+ virtual const Standard_GUID& ID() const Standard_OVERRIDE { return GetID(); }
+
+ //! Does nothing.
+ virtual void Restore (const Handle(TDF_Attribute)& ) Standard_OVERRIDE {}
+
+ //! Creates new instance of this tool.
+ virtual Handle(TDF_Attribute) NewEmpty() const Standard_OVERRIDE { return new XCAFDoc_VisMaterialTool(); }
+
+ //! Does nothing.
+ virtual void Paste (const Handle(TDF_Attribute)& ,
+ const Handle(TDF_RelocationTable)& ) const Standard_OVERRIDE {}
+
+private:
+
+ Handle(XCAFDoc_ShapeTool) myShapeTool;
+
+};
+
+DEFINE_STANDARD_HANDLE(XCAFDoc_VisMaterialTool, TDF_Attribute)
+
+#endif // _XCAFDoc_VisMaterialTool_HeaderFile
// Alternatively, this file may be used under the terms of Open CASCADE
// commercial license or contractual agreement.
+#include <XCAFPrs.hxx>
-#include <BRep_Builder.hxx>
#include <TColStd_HSequenceOfExtendedString.hxx>
#include <TDF_AttributeSequence.hxx>
#include <TDF_Label.hxx>
#include <XCAFDoc_DocumentTool.hxx>
#include <XCAFDoc_GraphNode.hxx>
#include <XCAFDoc_LayerTool.hxx>
+#include <XCAFDoc_VisMaterialTool.hxx>
#include <XCAFDoc_ShapeTool.hxx>
-#include <XCAFPrs.hxx>
#include <XCAFPrs_Style.hxx>
static Standard_Boolean viewnameMode = Standard_False;
+//! Fill colors of XCAFPrs_Style structure.
+static void fillStyleColors (XCAFPrs_Style& theStyle,
+ const Handle(XCAFDoc_ColorTool)& theTool,
+ const TDF_Label& theLabel)
+{
+ Quantity_ColorRGBA aColor;
+ if (theTool->GetColor (theLabel, XCAFDoc_ColorGen, aColor))
+ {
+ theStyle.SetColorCurv (aColor.GetRGB());
+ theStyle.SetColorSurf (aColor);
+ }
+ if (theTool->GetColor (theLabel, XCAFDoc_ColorSurf, aColor))
+ {
+ theStyle.SetColorSurf (aColor);
+ }
+ if (theTool->GetColor (theLabel, XCAFDoc_ColorCurv, aColor))
+ {
+ theStyle.SetColorCurv (aColor.GetRGB());
+ }
+}
+
static Standard_Boolean getShapesOfSHUO (TopLoc_IndexedMapOfLocation& theaPrevLocMap,
const Handle(XCAFDoc_ShapeTool)& theSTool,
const TDF_Label& theSHUOlab,
// collect settings on subshapes
Handle(XCAFDoc_ColorTool) aColorTool = XCAFDoc_DocumentTool::ColorTool(theLabel);
+ Handle(XCAFDoc_VisMaterialTool) aMatTool = XCAFDoc_DocumentTool::VisMaterialTool (theLabel);
+
TDF_LabelSequence aLabSeq;
XCAFDoc_ShapeTool::GetSubShapes (theLabel, aLabSeq);
// and add the shape itself
{
const TDF_Label& aLabel = aLabIter.Value();
XCAFPrs_Style aStyle;
+ aStyle.SetVisibility (aColorTool->IsVisible (aLabel));
+ aStyle.SetMaterial (aMatTool->GetShapeMaterial (aLabel));
- Standard_Boolean isVisible = aColorTool->IsVisible (aLabel);
- if (isVisible)
+ Handle(TColStd_HSequenceOfExtendedString) aLayerNames;
+ Handle(XCAFDoc_LayerTool) aLayerTool = XCAFDoc_DocumentTool::LayerTool (aLabel);
+ if (aStyle.IsVisible())
{
- Handle(XCAFDoc_LayerTool) aLayerTool = XCAFDoc_DocumentTool::LayerTool (aLabel);
- Handle(TColStd_HSequenceOfExtendedString) aLayerNames = new TColStd_HSequenceOfExtendedString();
+ aLayerNames = new TColStd_HSequenceOfExtendedString();
aLayerTool->GetLayers (aLabel, aLayerNames);
Standard_Integer aNbHidden = 0;
for (TColStd_HSequenceOfExtendedString::Iterator aLayerIter (*aLayerNames); aLayerIter.More(); aLayerIter.Next())
++aNbHidden;
}
}
- isVisible = aNbHidden == 0
- || aNbHidden != aLayerNames->Length();
+ aStyle.SetVisibility (aNbHidden == 0
+ || aNbHidden != aLayerNames->Length());
}
- if (!isVisible)
- {
- aStyle.SetVisibility (Standard_False);
- }
- else
+ if (aColorTool->IsColorByLayer (aLabel))
{
- if (aColorTool->IsColorByLayer(aLabel))
+ Quantity_ColorRGBA aLayerColor = theLayerColor;
+ if (aLayerNames.IsNull())
{
- Quantity_ColorRGBA aLayerColor = theLayerColor;
- Handle(XCAFDoc_LayerTool) aLayerTool = XCAFDoc_DocumentTool::LayerTool (aLabel);
- Handle(TColStd_HSequenceOfExtendedString) aLayerNames = new TColStd_HSequenceOfExtendedString();
+ aLayerNames = new TColStd_HSequenceOfExtendedString();
aLayerTool->GetLayers (aLabel, aLayerNames);
- if (aLayerNames->Length() == 1)
- {
- TDF_Label aLayer = aLayerTool->FindLayer (aLayerNames->First());
- Quantity_ColorRGBA aColor;
- if (aColorTool->GetColor (aLayer, XCAFDoc_ColorGen, aColor))
- aLayerColor = aColor;
- }
-
- aStyle.SetColorCurv (aLayerColor.GetRGB());
- aStyle.SetColorSurf (aLayerColor);
}
- else
+ if (aLayerNames->Length() == 1)
{
+ TDF_Label aLayer = aLayerTool->FindLayer (aLayerNames->First());
Quantity_ColorRGBA aColor;
- if (aColorTool->GetColor (aLabel, XCAFDoc_ColorGen, aColor))
- {
- aStyle.SetColorCurv (aColor.GetRGB());
- aStyle.SetColorSurf (aColor);
- }
- if (aColorTool->GetColor (aLabel, XCAFDoc_ColorSurf, aColor))
- {
- aStyle.SetColorSurf (aColor);
- }
- if (aColorTool->GetColor (aLabel, XCAFDoc_ColorCurv, aColor))
+ if (aColorTool->GetColor (aLayer, XCAFDoc_ColorGen, aColor))
{
- aStyle.SetColorCurv (aColor.GetRGB());
+ aLayerColor = aColor;
}
}
+
+ aStyle.SetColorCurv (aLayerColor.GetRGB());
+ aStyle.SetColorSurf (aLayerColor);
+ }
+ else
+ {
+ fillStyleColors (aStyle, aColorTool, aLabel);
}
// PTV try to set color from SHUO structure
- Handle(XCAFDoc_ShapeTool) aShapeTool = aColorTool->ShapeTool();
+ const Handle(XCAFDoc_ShapeTool)& aShapeTool = aColorTool->ShapeTool();
if (aShapeTool->IsComponent (aLabel))
{
TDF_AttributeSequence aShuoAttribSeq;
}
}
- Quantity_ColorRGBA aColor;
XCAFPrs_Style aShuoStyle;
- if (!aColorTool->IsVisible (aShuolab))
- {
- aShuoStyle.SetVisibility (Standard_False);
- }
- else
- {
- if (aColorTool->GetColor (aShuolab, XCAFDoc_ColorGen, aColor))
- {
- aShuoStyle.SetColorCurv (aColor.GetRGB());
- aShuoStyle.SetColorSurf (aColor);
- }
- if (aColorTool->GetColor (aShuolab, XCAFDoc_ColorSurf, aColor))
- {
- aShuoStyle.SetColorSurf (aColor);
- }
- if (aColorTool->GetColor (aShuolab, XCAFDoc_ColorCurv, aColor))
- {
- aShuoStyle.SetColorCurv (aColor.GetRGB());
- }
- }
- if (!aShuoStyle.IsSetColorCurv()
- && !aShuoStyle.IsSetColorSurf()
- && aShuoStyle.IsVisible())
+ aShuoStyle.SetMaterial (aMatTool->GetShapeMaterial (aShuolab));
+ aShuoStyle.SetVisibility(aColorTool->IsVisible (aShuolab));
+ fillStyleColors (aShuoStyle, aColorTool, aShuolab);
+ if (aShuoStyle.IsEmpty())
{
continue;
}
}
}
- if (!aStyle.IsSetColorCurv()
- && !aStyle.IsSetColorSurf()
- && aStyle.IsVisible())
+ if (aStyle.IsEmpty())
{
continue;
}
#include <gp_Pnt.hxx>
#include <Graphic3d_AspectFillArea3d.hxx>
#include <Graphic3d_AspectLine3d.hxx>
+#include <Graphic3d_Texture2Dmanual.hxx>
#include <Prs3d_Drawer.hxx>
#include <Prs3d_DimensionAspect.hxx>
#include <Prs3d_IsoAspect.hxx>
#include <XCAFPrs_DataMapIteratorOfIndexedDataMapOfShapeStyle.hxx>
#include <XCAFPrs_Style.hxx>
-
IMPLEMENT_STANDARD_RTTIEXT(XCAFPrs_AISObject,AIS_ColoredShape)
+namespace
+{
+ //! Texture holder.
+ class XCAFPrs_Texture : public Graphic3d_Texture2Dmanual
+ {
+ DEFINE_STANDARD_RTTI_INLINE(XCAFPrs_Texture, Graphic3d_Texture2Dmanual)
+ public:
+
+ //! Constructor.
+ explicit XCAFPrs_Texture (const Image_Texture& theImageSource,
+ const Graphic3d_TextureUnit theUnit)
+ : Graphic3d_Texture2Dmanual (""),
+ myImageSource (theImageSource)
+ {
+ if (!myImageSource.TextureId().IsEmpty())
+ {
+ myTexId = myImageSource.TextureId();
+ }
+ myParams->SetTextureUnit (theUnit);
+ }
+
+ //! Image reader.
+ virtual Handle(Image_PixMap) GetImage() const Standard_OVERRIDE { return myImageSource.ReadImage(); }
+ private:
+ Image_Texture myImageSource;
+ };
+}
+
//=======================================================================
//function : XCAFPrs_AISObject
//purpose :
// Getting default colors
XCAFPrs_Style aDefStyle;
DefaultStyle (aDefStyle);
- Quantity_Color aColorCurv = aDefStyle.GetColorCurv();
- Quantity_ColorRGBA aColorSurf = aDefStyle.GetColorSurfRGBA();
-
- SetColors (myDrawer, aColorCurv, aColorSurf);
+ setStyleToDrawer (myDrawer, aDefStyle, aDefStyle, myDrawer->ShadingAspect()->Aspect()->FrontMaterial());
// collect sub-shapes with the same style into compounds
BRep_Builder aBuilder;
myShapeColors.Bind (aShapeCur, aDrawer);
const XCAFPrs_Style& aStyle = aStyleGroupIter.Key();
aDrawer->SetHidden (!aStyle.IsVisible());
-
- aColorCurv = aStyle.IsSetColorCurv() ? aStyle.GetColorCurv() : aDefStyle.GetColorCurv();
- aColorSurf = aStyle.IsSetColorSurf() ? aStyle.GetColorSurfRGBA() : aDefStyle.GetColorSurfRGBA();
-
- SetColors (aDrawer, aColorCurv, aColorSurf);
+ if (!aStyle.Material().IsNull()
+ && !aStyle.Material()->IsEmpty())
+ {
+ aDrawer->SetOwnMaterial();
+ }
+ if (aStyle.IsSetColorSurf()
+ || aStyle.IsSetColorCurv())
+ {
+ aDrawer->SetOwnColor (Quantity_Color());
+ }
+ setStyleToDrawer (aDrawer, aStyle, aDefStyle, myDrawer->ShadingAspect()->Aspect()->FrontMaterial());
}
aStyleGroups.Clear();
}
}
//=======================================================================
-//function : SetColors
+//function : setStyleToDrawer
//purpose :
//=======================================================================
-void XCAFPrs_AISObject::SetColors (const Handle(Prs3d_Drawer)& theDrawer,
- const Quantity_Color& theColorCurv,
- const Quantity_ColorRGBA& theColorSurf)
+void XCAFPrs_AISObject::setStyleToDrawer (const Handle(Prs3d_Drawer)& theDrawer,
+ const XCAFPrs_Style& theStyle,
+ const XCAFPrs_Style& theDefStyle,
+ const Graphic3d_MaterialAspect& theDefMaterial)
{
- if (!theDrawer->HasOwnShadingAspect())
+ theDrawer->SetupOwnShadingAspect();
+ theDrawer->SetOwnLineAspects();
+
+ Quantity_ColorRGBA aSurfColor = theDefStyle.GetColorSurfRGBA();
+ Quantity_Color aCurvColor = theDefStyle.GetColorCurv();
+ Graphic3d_MaterialAspect aMaterial = theDefMaterial;
+ const Handle(XCAFDoc_VisMaterial)& anXMat = !theStyle.Material().IsNull() ? theStyle.Material() : theDefStyle.Material();
+ if (!anXMat.IsNull()
+ && !anXMat->IsEmpty())
{
- theDrawer->SetShadingAspect (new Prs3d_ShadingAspect());
- if (theDrawer->HasLink())
+ anXMat->FillMaterialAspect (aMaterial);
+ aSurfColor = Quantity_ColorRGBA (aMaterial.Color(), aMaterial.Alpha());
+ aCurvColor = aMaterial.Color();
+
+ Handle(Image_Texture) aColorTexture, aNormTexture;
+ if (!anXMat->CommonMaterial().DiffuseTexture.IsNull())
{
- *theDrawer->ShadingAspect()->Aspect() = *theDrawer->Link()->ShadingAspect()->Aspect();
+ aColorTexture = anXMat->CommonMaterial().DiffuseTexture;
}
- }
- if (!theDrawer->HasOwnLineAspect())
- {
- theDrawer->SetLineAspect (new Prs3d_LineAspect (Quantity_NOC_BLACK, Aspect_TOL_SOLID, 1.0));
- if (theDrawer->HasLink())
+ else if (!anXMat->MetalRougnessMaterial().BaseColorTexture.IsNull())
{
- *theDrawer->LineAspect()->Aspect() = *theDrawer->Link()->LineAspect()->Aspect();
+ aColorTexture = anXMat->MetalRougnessMaterial().BaseColorTexture;
}
- }
- if (!theDrawer->HasOwnWireAspect())
- {
- theDrawer->SetWireAspect (new Prs3d_LineAspect (Quantity_NOC_BLACK, Aspect_TOL_SOLID, 1.0));
- if (theDrawer->HasLink())
+ else if (!anXMat->CommonMaterial().AmbientTexture.IsNull())
{
- *theDrawer->WireAspect()->Aspect() = *theDrawer->Link()->WireAspect()->Aspect();
+ aColorTexture = anXMat->CommonMaterial().AmbientTexture;
}
- }
- if (!theDrawer->HasOwnUIsoAspect())
- {
- theDrawer->SetUIsoAspect (new Prs3d_IsoAspect (Quantity_NOC_GRAY75, Aspect_TOL_SOLID, 0.5, 1));
- if (theDrawer->HasLink())
+
+ if (!anXMat->MetalRougnessMaterial().NormalTexture.IsNull())
{
- *theDrawer->UIsoAspect()->Aspect() = *theDrawer->Link()->UIsoAspect()->Aspect();
- theDrawer->UIsoAspect()->SetNumber (theDrawer->Link()->UIsoAspect()->Number());
+ aNormTexture = anXMat->MetalRougnessMaterial().NormalTexture;
}
- }
- if (!theDrawer->HasOwnVIsoAspect())
- {
- theDrawer->SetVIsoAspect (new Prs3d_IsoAspect (Quantity_NOC_GRAY75, Aspect_TOL_SOLID, 0.5, 1));
- if (theDrawer->HasLink())
+
+ Standard_Integer aNbTextures = 0;
+ if (!aColorTexture.IsNull())
{
- *theDrawer->VIsoAspect()->Aspect() = *theDrawer->Link()->VIsoAspect()->Aspect();
- theDrawer->VIsoAspect()->SetNumber (theDrawer->Link()->VIsoAspect()->Number());
+ ++aNbTextures;
}
- }
- if (!theDrawer->HasOwnFreeBoundaryAspect())
- {
- theDrawer->SetFreeBoundaryAspect (new Prs3d_LineAspect (Quantity_NOC_BLACK, Aspect_TOL_SOLID, 1.0));
- if (theDrawer->HasLink())
+ if (!aNormTexture.IsNull())
{
- *theDrawer->FreeBoundaryAspect()->Aspect() = *theDrawer->Link()->FreeBoundaryAspect()->Aspect();
+ //++aNbTextures;
}
- }
- if (!theDrawer->HasOwnUnFreeBoundaryAspect())
- {
- theDrawer->SetUnFreeBoundaryAspect (new Prs3d_LineAspect (Quantity_NOC_BLACK, Aspect_TOL_SOLID, 1.0));
- if (theDrawer->HasLink())
+ if (aNbTextures != 0)
{
- *theDrawer->UnFreeBoundaryAspect()->Aspect() = *theDrawer->Link()->UnFreeBoundaryAspect()->Aspect();
+ Handle(Graphic3d_TextureSet) aTextureSet = new Graphic3d_TextureSet (aNbTextures);
+ Standard_Integer aTextureIndex = 0;
+ if (!aColorTexture.IsNull())
+ {
+ aTextureSet->SetValue (aTextureIndex++, new XCAFPrs_Texture (*aColorTexture, Graphic3d_TextureUnit_BaseColor));
+ }
+ if (!aNormTexture.IsNull())
+ {
+ //aTextureSet->SetValue (aTextureIndex++, new XCAFPrs_Texture (*aColorTexture, Graphic3d_TextureUnit_Normal));
+ }
+ theDrawer->ShadingAspect()->Aspect()->SetTextureSet (aTextureSet);
+ theDrawer->ShadingAspect()->Aspect()->SetTextureMapOn (true);
}
}
+ if (theStyle.IsSetColorSurf())
+ {
+ aSurfColor = theStyle.GetColorSurfRGBA();
+ aMaterial.SetColor (aSurfColor.GetRGB());
+ aMaterial.SetAlpha (aSurfColor.Alpha());
+ }
+ if (theStyle.IsSetColorCurv())
+ {
+ aCurvColor = theStyle.GetColorCurv();
+ }
- theDrawer->UnFreeBoundaryAspect()->SetColor (theColorCurv);
- theDrawer->FreeBoundaryAspect()->SetColor (theColorCurv);
- theDrawer->WireAspect()->SetColor (theColorCurv);
+ theDrawer->UnFreeBoundaryAspect()->SetColor (aCurvColor);
+ theDrawer->FreeBoundaryAspect()->SetColor (aCurvColor);
+ theDrawer->WireAspect()->SetColor (aCurvColor);
- Graphic3d_MaterialAspect aMaterial = myDrawer->ShadingAspect()->Aspect()->FrontMaterial();
- aMaterial.SetColor (theColorSurf.GetRGB());
- aMaterial.SetAlpha (theColorSurf.Alpha());
- theDrawer->ShadingAspect()->Aspect()->SetInteriorColor (theColorSurf);
+ theDrawer->ShadingAspect()->Aspect()->SetInteriorColor (aSurfColor);
theDrawer->ShadingAspect()->Aspect()->SetFrontMaterial (aMaterial);
- theDrawer->UIsoAspect()->SetColor (theColorSurf.GetRGB());
- theDrawer->VIsoAspect()->SetColor (theColorSurf.GetRGB());
+ theDrawer->UIsoAspect()->SetColor (aSurfColor.GetRGB());
+ theDrawer->VIsoAspect()->SetColor (aSurfColor.GetRGB());
}
//=======================================================================
XCAFPrs_Style aDefStyle;
DefaultStyle (aDefStyle);
setMaterial (myDrawer, theMaterial, HasColor(), IsTransparent());
- SetColors (myDrawer, aDefStyle.GetColorCurv(), aDefStyle.GetColorSurf());
+ setStyleToDrawer (myDrawer, aDefStyle, aDefStyle, myDrawer->ShadingAspect()->Aspect()->FrontMaterial());
for (AIS_DataMapOfShapeDrawer::Iterator anIter (myShapeColors); anIter.More(); anIter.Next())
{
const Handle(AIS_ColoredDrawer)& aDrawer = anIter.Value();
+ if (aDrawer->HasOwnMaterial())
+ {
+ continue;
+ }
- // take current color
- 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);
+ if (aDrawer->HasOwnShadingAspect())
+ {
+ // take current color
+ const Quantity_ColorRGBA aSurfColor = aDrawer->ShadingAspect()->Aspect()->InteriorColorRGBA();
+ Graphic3d_MaterialAspect aMaterial = myDrawer->ShadingAspect()->Aspect()->FrontMaterial();
+ aMaterial.SetColor (aSurfColor.GetRGB());
+ aMaterial.SetAlpha (aSurfColor.Alpha());
+ aDrawer->ShadingAspect()->Aspect()->SetInteriorColor (aSurfColor);
+ aDrawer->ShadingAspect()->Aspect()->SetFrontMaterial (aMaterial);
+ }
}
SynchronizeAspects();
}
const Handle(Prs3d_Presentation)& thePresentation,
const Standard_Integer theMode) Standard_OVERRIDE;
- //! Set colors to drawer
- Standard_EXPORT void SetColors (const Handle(Prs3d_Drawer)& theDrawer,
- const Quantity_Color& theColorCurv,
- 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.
//! By default, the style uses white color for curves and surfaces.
Standard_EXPORT virtual void DefaultStyle (XCAFPrs_Style& theStyle) const;
+protected:
+
+ //! Assign style to drawer.
+ static void setStyleToDrawer (const Handle(Prs3d_Drawer)& theDrawer,
+ const XCAFPrs_Style& theStyle,
+ const XCAFPrs_Style& theDefStyle,
+ const Graphic3d_MaterialAspect& theDefMaterial);
+
protected:
TDF_Label myLabel; //!< label pointing onto the shape
#include <Standard_DefineAlloc.hxx>
#include <Standard_Handle.hxx>
#include <Quantity_ColorRGBAHasher.hxx>
+#include <XCAFDoc_VisMaterial.hxx>
//! Represents a set of styling settings applicable to a (sub)shape
class XCAFPrs_Style
//! Empty constructor - colors are unset, visibility is TRUE.
Standard_EXPORT XCAFPrs_Style();
+ //! Return TRUE if style is empty - does not override any properties.
+ Standard_Boolean IsEmpty() const
+ {
+ return !myHasColorSurf
+ && !myHasColorCurv
+ && myMaterial.IsNull()
+ && myIsVisible;
+ }
+
+ //! Return material.
+ const Handle(XCAFDoc_VisMaterial)& Material() const { return myMaterial; }
+
+ //! Set material.
+ void SetMaterial (const Handle(XCAFDoc_VisMaterial)& theMaterial) { myMaterial = theMaterial; }
+
//! Return TRUE if surface color has been defined.
Standard_Boolean IsSetColorSurf() const { return myHasColorSurf; }
return myHasColorSurf == theOther.myHasColorSurf
&& myHasColorCurv == theOther.myHasColorCurv
+ && myMaterial == theOther.myMaterial
&& (!myHasColorSurf || myColorSurf == theOther.myColorSurf)
&& (!myHasColorCurv || myColorCurv == theOther.myColorCurv);
}
{
aHashCode = aHashCode ^ Quantity_ColorHasher::HashCode (theStyle.myColorCurv, theUpperBound);
}
+ if (!theStyle.myMaterial.IsNull())
+ {
+ aHashCode = aHashCode ^ ::HashCode (theStyle.myMaterial, theUpperBound);
+ }
return ::HashCode (aHashCode, theUpperBound);
}
protected:
+ Handle(XCAFDoc_VisMaterial) myMaterial;
Quantity_ColorRGBA myColorSurf;
Quantity_Color myColorCurv;
Standard_Boolean myHasColorSurf;