211 lines
9.0 KiB
C++
211 lines
9.0 KiB
C++
// 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_AlphaMode.hxx"
|
|
#include "Graphic3d_TypeOfBackfacingModel.hxx"
|
|
#include "TCollection_HAsciiString.hxx"
|
|
#include "TDF_Attribute.hxx"
|
|
#include "XCAFDoc_VisMaterialCommon.hxx"
|
|
#include "XCAFDoc_VisMaterialPBR.hxx"
|
|
|
|
class Graphic3d_Aspects;
|
|
class Graphic3d_MaterialAspect;
|
|
|
|
//! Attribute storing Material definition for visualization purposes.
|
|
//!
|
|
//! Visualization material provides extended information about how object should be displayed on the
|
|
//! screen (albedo, metalness, roughness - not just a single color as in case of XCAFDoc_Color). It
|
|
//! is expected to correlate with physical material properties (XCAFDoc_Material), but not
|
|
//! necessarily (like painted/polished/rusty object).
|
|
//!
|
|
//! The document defines the list of visualization materials via global attribute
|
|
//! XCAFDoc_VisMaterialTool, while particular material assignment to the shape is done through
|
|
//! tree-nodes links. Therefore, XCAFDoc_VisMaterialTool methods should be used for managing
|
|
//! XCAFDoc_VisMaterial attributes.
|
|
//!
|
|
//! Visualization material definition consists of two options: Common and PBR (for Physically Based
|
|
//! Rendering). Common material definition is an obsolete model defined by very first version of
|
|
//! OpenGL graphics API and having specific hardware-accelerated implementation in past (like T&L).
|
|
//! PBR metallic-roughness model is closer to physical material properties, and intended to be used
|
|
//! within physically-based renderer.
|
|
//!
|
|
//! For compatibility reasons, this attribute allows defining both material models,
|
|
//! so that it is up-to Data Exchange and Application deciding which one to define and use for
|
|
//! rendering (depending on viewer capabilities). Automatic conversion from one model to another is
|
|
//! possible, but lossy (converted material will not look the same).
|
|
//!
|
|
//! Within Data Exchange, different file formats have different capabilities for storing
|
|
//! visualization material properties from simple color (STEP, IGES), to common (OBJ, glTF 1.0) and
|
|
//! PBR (glTF 2.0). This should be taken into account while defining or converting document into one
|
|
//! or another format - material definition might be lost or disturbed.
|
|
//!
|
|
//! @sa XCAFDoc_VisMaterialTool
|
|
class XCAFDoc_VisMaterial : public TDF_Attribute
|
|
{
|
|
DEFINE_STANDARD_RTTIEXT(XCAFDoc_VisMaterial, TDF_Attribute)
|
|
public:
|
|
//! Return attribute GUID.
|
|
Standard_EXPORT static const Standard_GUID& GetID();
|
|
|
|
public:
|
|
//! Empty constructor.
|
|
Standard_EXPORT XCAFDoc_VisMaterial();
|
|
|
|
//! Return TRUE if material definition is empty.
|
|
bool IsEmpty() const { return !myPbrMat.IsDefined && !myCommonMat.IsDefined; }
|
|
|
|
//! Fill in material aspect.
|
|
Standard_EXPORT void FillMaterialAspect(Graphic3d_MaterialAspect& theAspect) const;
|
|
|
|
//! Fill in graphic aspects.
|
|
Standard_EXPORT void FillAspect(const Handle(Graphic3d_Aspects)& theAspect) const;
|
|
|
|
//! Return TRUE if metal-roughness PBR material is defined; FALSE by default.
|
|
Standard_Boolean HasPbrMaterial() const { return myPbrMat.IsDefined; }
|
|
|
|
//! Return metal-roughness PBR material.
|
|
//! Note that default constructor creates an empty material (@sa
|
|
//! XCAFDoc_VisMaterialPBR::IsDefined).
|
|
const XCAFDoc_VisMaterialPBR& PbrMaterial() const { return myPbrMat; }
|
|
|
|
//! Setup metal-roughness PBR material.
|
|
Standard_EXPORT void SetPbrMaterial(const XCAFDoc_VisMaterialPBR& theMaterial);
|
|
|
|
//! Setup undefined metal-roughness PBR material.
|
|
void UnsetPbrMaterial()
|
|
{
|
|
XCAFDoc_VisMaterialPBR anEmpty;
|
|
anEmpty.IsDefined = false;
|
|
SetPbrMaterial(anEmpty);
|
|
}
|
|
|
|
//! Return TRUE if common material is defined; FALSE by default.
|
|
Standard_Boolean HasCommonMaterial() const { return myCommonMat.IsDefined; }
|
|
|
|
//! Return common material.
|
|
//! Note that default constructor creates an empty material (@sa
|
|
//! XCAFDoc_VisMaterialCommon::IsDefined).
|
|
const XCAFDoc_VisMaterialCommon& CommonMaterial() const { return myCommonMat; }
|
|
|
|
//! Setup common material.
|
|
Standard_EXPORT void SetCommonMaterial(const XCAFDoc_VisMaterialCommon& theMaterial);
|
|
|
|
//! Setup undefined common material.
|
|
void UnsetCommonMaterial()
|
|
{
|
|
XCAFDoc_VisMaterialCommon anEmpty;
|
|
anEmpty.IsDefined = false;
|
|
SetCommonMaterial(anEmpty);
|
|
}
|
|
|
|
//! Return base color.
|
|
Standard_EXPORT Quantity_ColorRGBA BaseColor() const;
|
|
|
|
//! Return alpha mode; Graphic3d_AlphaMode_BlendAuto by default.
|
|
Graphic3d_AlphaMode AlphaMode() const { return myAlphaMode; }
|
|
|
|
//! Return alpha cutoff value; 0.5 by default.
|
|
Standard_ShortReal AlphaCutOff() const { return myAlphaCutOff; }
|
|
|
|
//! Set alpha mode.
|
|
Standard_EXPORT void SetAlphaMode(Graphic3d_AlphaMode theMode,
|
|
Standard_ShortReal theCutOff = 0.5f);
|
|
|
|
//! Returns if the material is double or single sided; Graphic3d_TypeOfBackfacingModel_Auto by
|
|
//! default.
|
|
Graphic3d_TypeOfBackfacingModel FaceCulling() const { return myFaceCulling; }
|
|
|
|
//! Specifies whether the material is double or single sided.
|
|
Standard_EXPORT void SetFaceCulling(Graphic3d_TypeOfBackfacingModel theFaceCulling);
|
|
|
|
Standard_DEPRECATED("Deprecated method, FaceCulling() should be used instead")
|
|
|
|
Standard_Boolean IsDoubleSided() const
|
|
{
|
|
return myFaceCulling == Graphic3d_TypeOfBackfacingModel_DoubleSided;
|
|
}
|
|
|
|
Standard_DEPRECATED("Deprecated method, SetFaceCulling() should be used "
|
|
"instead")
|
|
|
|
void SetDoubleSided(Standard_Boolean theIsDoubleSided)
|
|
{
|
|
SetFaceCulling(theIsDoubleSided ? Graphic3d_TypeOfBackfacingModel_DoubleSided
|
|
: Graphic3d_TypeOfBackfacingModel_Auto);
|
|
}
|
|
|
|
//! Return material name / tag (transient data, not stored in the document).
|
|
const Handle(TCollection_HAsciiString)& RawName() const { return myRawName; }
|
|
|
|
//! Set material name / tag (transient data, not stored in the document).
|
|
void SetRawName(const Handle(TCollection_HAsciiString)& theName) { myRawName = theName; }
|
|
|
|
//! Compare two materials.
|
|
//! Performs deep comparison by actual values - e.g. can be useful for merging materials.
|
|
Standard_Boolean IsEqual(const Handle(XCAFDoc_VisMaterial)& theOther) const
|
|
{
|
|
if (theOther.get() == this)
|
|
{
|
|
return true;
|
|
}
|
|
return theOther->myFaceCulling == myFaceCulling && theOther->myAlphaCutOff == myAlphaCutOff
|
|
&& theOther->myAlphaMode == myAlphaMode && theOther->myCommonMat.IsEqual(myCommonMat)
|
|
&& theOther->myPbrMat.IsEqual(myPbrMat);
|
|
}
|
|
|
|
//! Return Common material or convert PBR into Common material.
|
|
Standard_EXPORT XCAFDoc_VisMaterialCommon ConvertToCommonMaterial();
|
|
|
|
//! Return PBR material or convert Common into PBR material.
|
|
Standard_EXPORT XCAFDoc_VisMaterialPBR ConvertToPbrMaterial();
|
|
|
|
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[in] theWith 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[in] theRelTable relocation table
|
|
Standard_EXPORT virtual void Paste(const Handle(TDF_Attribute)& theInto,
|
|
const Handle(TDF_RelocationTable)& theRelTable) const
|
|
Standard_OVERRIDE;
|
|
|
|
//! Dumps the content of me into the stream
|
|
Standard_EXPORT virtual void DumpJson(Standard_OStream& theOStream,
|
|
Standard_Integer theDepth = -1) const Standard_OVERRIDE;
|
|
|
|
private:
|
|
Handle(TCollection_HAsciiString) myRawName; //!< material name / tag (transient data)
|
|
XCAFDoc_VisMaterialPBR myPbrMat; //!< metal-roughness material definition
|
|
XCAFDoc_VisMaterialCommon myCommonMat; //!< common material definition
|
|
// clang-format off
|
|
Graphic3d_AlphaMode myAlphaMode; //!< alpha mode; Graphic3d_AlphaMode_BlendAuto by default
|
|
Standard_ShortReal myAlphaCutOff; //!< alpha cutoff value; 0.5 by default
|
|
Graphic3d_TypeOfBackfacingModel myFaceCulling; //!< specifies whether the material is double/single sided
|
|
// clang-format on
|
|
};
|
|
|
|
DEFINE_STANDARD_HANDLE(XCAFDoc_VisMaterial, TDF_Attribute)
|
|
|
|
#endif // _XCAFDoc_VisMaterial_HeaderFile
|