Added Graphic3d_TypeOfBackfacingModel_FrontCulled enumeration value.
OpenGl_Context::SetFaceCulling() now supports GL_FRONT in addition to GL_BACK.
Added -faceCulling option to vaspects Draw command.
{
case Graphic3d_TypeOfBackfacingModel_Auto: return '0';
case Graphic3d_TypeOfBackfacingModel_BackCulled: return 'B';
+ case Graphic3d_TypeOfBackfacingModel_FrontCulled: return 'F';
case Graphic3d_TypeOfBackfacingModel_DoubleSided: return '1';
}
return '0';
{
case '0': return Graphic3d_TypeOfBackfacingModel_Auto;
case 'B': return Graphic3d_TypeOfBackfacingModel_BackCulled;
+ case 'F': return Graphic3d_TypeOfBackfacingModel_FrontCulled;
case '1': return Graphic3d_TypeOfBackfacingModel_DoubleSided;
}
return Graphic3d_TypeOfBackfacingModel_Auto;
Graphic3d_TypeOfBackfacingModel_Auto, //!< automatic back face culling enabled for opaque groups with closed flag
//! (e.g. solids, see Graphic3d_Group::IsClosed())
Graphic3d_TypeOfBackfacingModel_DoubleSided, //!< no culling (double-sided shading)
- Graphic3d_TypeOfBackfacingModel_BackCulled, //!< back face culling
+ Graphic3d_TypeOfBackfacingModel_BackCulled, //!< back face culling
+ Graphic3d_TypeOfBackfacingModel_FrontCulled, //!< front face culling
// old aliases
Graphic3d_TOBM_AUTOMATIC = Graphic3d_TypeOfBackfacingModel_Auto,
Graphic3d_TOBM_FORCE = Graphic3d_TypeOfBackfacingModel_DoubleSided,
myRenderMode (GL_RENDER),
myShadeModel (GL_SMOOTH),
myPolygonMode (GL_FILL),
- myToCullBackFaces (false),
+ myFaceCulling (Graphic3d_TypeOfBackfacingModel_DoubleSided),
myReadBuffer (0),
myDrawBuffers (0, 7),
myDefaultVao (0),
}
// =======================================================================
-// function : SetCullBackFaces
+// function : SetFaceCulling
// purpose :
// =======================================================================
-void OpenGl_Context::SetCullBackFaces (bool theToEnable)
+void OpenGl_Context::SetFaceCulling (Graphic3d_TypeOfBackfacingModel theMode)
{
- if (myToCullBackFaces == theToEnable)
+ if (myFaceCulling == theMode)
{
return;
}
- myToCullBackFaces = theToEnable;
- if (theToEnable)
+ if (theMode == Graphic3d_TypeOfBackfacingModel_BackCulled)
{
- //glCullFace (GL_BACK); GL_BACK by default
+ if (myFaceCulling == Graphic3d_TypeOfBackfacingModel_FrontCulled)
+ {
+ core11fwd->glCullFace (GL_BACK);
+ }
+ core11fwd->glEnable (GL_CULL_FACE);
+ }
+ else if (theMode == Graphic3d_TypeOfBackfacingModel_FrontCulled)
+ {
+ core11fwd->glCullFace (GL_FRONT);
core11fwd->glEnable (GL_CULL_FACE);
}
else
{
+ core11fwd->glCullFace (GL_BACK);
core11fwd->glDisable (GL_CULL_FACE);
}
+ myFaceCulling = theMode;
}
// =======================================================================
OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myRenderMode)
OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myPolygonMode)
OCCT_DUMP_FIELD_VALUES_DUMPED (theOStream, theDepth, &myPolygonOffset)
- OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myToCullBackFaces)
+ OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myFaceCulling)
OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myReadBuffer)
OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, myDefaultVao)
Standard_EXPORT bool SetSampleAlphaToCoverage (bool theToEnable);
//! Return back face culling state.
- bool ToCullBackFaces() const { return myToCullBackFaces; }
+ Graphic3d_TypeOfBackfacingModel FaceCulling() const { return myFaceCulling; }
//! Enable or disable back face culling (glEnable (GL_CULL_FACE)).
- Standard_EXPORT void SetCullBackFaces (bool theToEnable);
+ Standard_EXPORT void SetFaceCulling (Graphic3d_TypeOfBackfacingModel theMode);
+
+ //! Return back face culling state.
+ bool ToCullBackFaces() const { return myFaceCulling == Graphic3d_TypeOfBackfacingModel_BackCulled; }
+
+ //! Enable or disable back face culling (glCullFace() + glEnable(GL_CULL_FACE)).
+ void SetCullBackFaces (bool theToEnable)
+ {
+ SetFaceCulling (theToEnable ? Graphic3d_TypeOfBackfacingModel_BackCulled : Graphic3d_TypeOfBackfacingModel_DoubleSided);
+ }
//! Fetch OpenGl context state. This class tracks value of several OpenGl
//! state variables. Consulting the cached values is quicker than
Standard_Integer myShadeModel; //!< currently used shade model (glShadeModel)
Standard_Integer myPolygonMode; //!< currently used polygon rasterization mode (glPolygonMode)
Graphic3d_PolygonOffset myPolygonOffset; //!< currently applied polygon offset
- bool myToCullBackFaces; //!< back face culling mode enabled state (glIsEnabled (GL_CULL_FACE))
+ Graphic3d_TypeOfBackfacingModel myFaceCulling; //!< back face culling mode enabled state (glIsEnabled (GL_CULL_FACE))
Standard_Integer myReadBuffer; //!< current read buffer
NCollection_Array1<Standard_Integer>
myDrawBuffers; //!< current draw buffers
anOutlineProgram->SetUniform (aCtx, anOutlineProgram->GetStateLocation (OpenGl_OCCT_ORTHO_SCALE), anOrthoScale);
aCtx->SetColor4fv (anAspectFace->Aspect()->EdgeColorRGBA());
- aCtx->core11fwd->glCullFace (GL_FRONT);
+ aCtx->SetFaceCulling (Graphic3d_TypeOfBackfacingModel_FrontCulled);
drawArray (theWorkspace, NULL, false);
-
- aCtx->core11fwd->glCullFace (GL_BACK);
+ aCtx->SetFaceCulling (Graphic3d_TypeOfBackfacingModel_BackCulled);
}
if (isForcedBlend)
// =======================================================================
const OpenGl_Aspects* OpenGl_Workspace::ApplyAspects (bool theToBindTextures)
{
- bool toSuppressBackFaces = myView->BackfacingModel() == Graphic3d_TypeOfBackfacingModel_BackCulled;
- if (myView->BackfacingModel() == Graphic3d_TypeOfBackfacingModel_Auto)
+ //bool toSuppressBackFaces = myView->BackfacingModel() == Graphic3d_TypeOfBackfacingModel_BackCulled;
+ Graphic3d_TypeOfBackfacingModel aCullFacesMode = myView->BackfacingModel();
+ if (aCullFacesMode == Graphic3d_TypeOfBackfacingModel_Auto)
{
- toSuppressBackFaces = myAspectsSet->Aspect()->FaceCulling() == Graphic3d_TypeOfBackfacingModel_BackCulled;
- if (myAspectsSet->Aspect()->FaceCulling() == Graphic3d_TypeOfBackfacingModel_Auto
- && myToAllowFaceCulling)
+ aCullFacesMode = myAspectsSet->Aspect()->FaceCulling();
+ if (aCullFacesMode == Graphic3d_TypeOfBackfacingModel_Auto)
{
- toSuppressBackFaces = true;
- if (myAspectsSet->Aspect()->InteriorStyle() == Aspect_IS_HATCH
- || myAspectsSet->Aspect()->AlphaMode() == Graphic3d_AlphaMode_Blend
- || myAspectsSet->Aspect()->AlphaMode() == Graphic3d_AlphaMode_Mask
- || myAspectsSet->Aspect()->AlphaMode() == Graphic3d_AlphaMode_MaskBlend
- || (myAspectsSet->Aspect()->AlphaMode() == Graphic3d_AlphaMode_BlendAuto
- && myAspectsSet->Aspect()->FrontMaterial().Transparency() != 0.0f))
+ aCullFacesMode = Graphic3d_TypeOfBackfacingModel_DoubleSided;
+ if (myToAllowFaceCulling)
{
- // disable culling in case of translucent shading aspect
- toSuppressBackFaces = false;
+ if (myAspectsSet->Aspect()->InteriorStyle() == Aspect_IS_HATCH
+ || myAspectsSet->Aspect()->AlphaMode() == Graphic3d_AlphaMode_Blend
+ || myAspectsSet->Aspect()->AlphaMode() == Graphic3d_AlphaMode_Mask
+ || myAspectsSet->Aspect()->AlphaMode() == Graphic3d_AlphaMode_MaskBlend
+ || (myAspectsSet->Aspect()->AlphaMode() == Graphic3d_AlphaMode_BlendAuto
+ && myAspectsSet->Aspect()->FrontMaterial().Transparency() != 0.0f))
+ {
+ // disable culling in case of translucent shading aspect
+ aCullFacesMode = Graphic3d_TypeOfBackfacingModel_DoubleSided;
+ }
+ else
+ {
+ aCullFacesMode = Graphic3d_TypeOfBackfacingModel_BackCulled;
+ }
}
}
}
- myGlContext->SetCullBackFaces (toSuppressBackFaces);
+ myGlContext->SetFaceCulling (aCullFacesMode);
if (myAspectsSet->Aspect() == myAspectsApplied
&& myHighlightStyle == myAspectFaceAppliedWithHL)
// as both may share the same material having "auto" flag
if (theStyle.Material().IsNull()
|| theStyle.Material()->FaceCulling() == Graphic3d_TypeOfBackfacingModel_Auto
- || theStyle.Material()->FaceCulling() == Graphic3d_TypeOfBackfacingModel_DoubleSided)
+ || theStyle.Material()->FaceCulling() == Graphic3d_TypeOfBackfacingModel_DoubleSided
+ || theStyle.Material()->FaceCulling() == Graphic3d_TypeOfBackfacingModel_FrontCulled) // front culling flag cannot be exported to glTF
{
myWriter->Key ("doubleSided");
myWriter->Bool (true);
Graphic3d_AlphaMode AlphaMode;
Standard_ShortReal AlphaCutoff;
+ Standard_Integer ToSetFaceCulling;
+ Graphic3d_TypeOfBackfacingModel FaceCulling;
+
Standard_Integer ToSetMaterial;
Graphic3d_NameOfMaterial Material;
TCollection_AsciiString MatName;
ToSetAlphaMode (0),
AlphaMode (Graphic3d_AlphaMode_BlendAuto),
AlphaCutoff (0.5f),
+ ToSetFaceCulling (0),
+ FaceCulling (Graphic3d_TypeOfBackfacingModel_Auto),
ToSetMaterial (0),
Material (Graphic3d_NameOfMaterial_DEFAULT),
ToSetShowFreeBoundary (0),
&& ToSetLineWidth == 0
&& ToSetTransparency == 0
&& ToSetAlphaMode == 0
+ && ToSetFaceCulling == 0
&& ToSetColor == 0
&& ToSetBackFaceColor == 0
&& ToSetMaterial == 0
theDrawer->ShadingAspect()->Aspect()->SetAlphaMode (AlphaMode, AlphaCutoff);
}
}
+ if (ToSetFaceCulling != 0)
+ {
+ if (ToSetFaceCulling != -1
+ || theDrawer->HasOwnShadingAspect())
+ {
+ toRecompute = theDrawer->SetupOwnShadingAspect (aDefDrawer) || toRecompute;
+ theDrawer->ShadingAspect()->Aspect()->SetFaceCulling (FaceCulling);
+ }
+ }
if (ToSetHatch != 0)
{
if (ToSetHatch != -1
}
}
}
+ else if (anArg == "-setfaceculling"
+ || anArg == "-faceculling")
+ {
+ if (++anArgIter >= theArgNb)
+ {
+ Message::SendFail() << "Error: wrong syntax at " << anArg;
+ return 1;
+ }
+
+ aChangeSet->ToSetFaceCulling = 1;
+ {
+ TCollection_AsciiString aParam (theArgVec[anArgIter]);
+ aParam.LowerCase();
+ if (aParam == "auto")
+ {
+ aChangeSet->FaceCulling = Graphic3d_TypeOfBackfacingModel_Auto;
+ }
+ else if (aParam == "backculled"
+ || aParam == "backcull"
+ || aParam == "back")
+ {
+ aChangeSet->FaceCulling = Graphic3d_TypeOfBackfacingModel_BackCulled;
+ }
+ else if (aParam == "frontculled"
+ || aParam == "frontcull"
+ || aParam == "front")
+ {
+ aChangeSet->FaceCulling = Graphic3d_TypeOfBackfacingModel_FrontCulled;
+ }
+ else if (aParam == "doublesided"
+ || aParam == "off")
+ {
+ aChangeSet->FaceCulling = Graphic3d_TypeOfBackfacingModel_DoubleSided;
+ }
+ else
+ {
+ Message::SendFail() << "Error: wrong syntax at '" << aParam << "'";
+ return 1;
+ }
+ }
+ }
else if (anArg == "-setvis"
|| anArg == "-setvisibility"
|| anArg == "-visibility")
aChangeSet->ToSetAlphaMode = -1;
aChangeSet->AlphaMode = Graphic3d_AlphaMode_BlendAuto;
aChangeSet->AlphaCutoff = 0.5f;
+ aChangeSet->ToSetFaceCulling = -1;
+ aChangeSet->FaceCulling = Graphic3d_TypeOfBackfacingModel_Auto;
aChangeSet->ToSetColor = -1;
aChangeSet->Color = DEFAULT_COLOR;
//aChangeSet->ToSetBackFaceColor = -1; // should be reset by ToSetColor
vaspects [-noupdate|-update] [name1 [name2 [...]] | -defaults] [-subshapes subname1 [subname2 [...]]]
[-visibility {0|1}]
[-color {ColorName | R G B}] [-unsetColor]
- [-backfaceColor Color]
+ [-backfaceColor Color] [-faceCulling {auto|back|front|doublesided}]
[-material MatName] [-unsetMaterial]
[-transparency Transp] [-unsetTransparency]
[-width LineWidth] [-unsetWidth]
{
case Graphic3d_TypeOfBackfacingModel_Auto: return "Auto";
case Graphic3d_TypeOfBackfacingModel_BackCulled: return "BackCulled";
+ case Graphic3d_TypeOfBackfacingModel_FrontCulled: return "FrontCulled";
case Graphic3d_TypeOfBackfacingModel_DoubleSided: return "DoubleSided";
}
return "";
{
aMode = Graphic3d_TypeOfBackfacingModel_BackCulled;
}
+ else if (aCullStr == "frontculled"
+ || aCullStr == "frontcull"
+ || aCullStr == "front")
+ {
+ aMode = Graphic3d_TypeOfBackfacingModel_FrontCulled;
+ }
else if (aCullStr == "doublesided")
{
aMode = Graphic3d_TypeOfBackfacingModel_DoubleSided;
aDoubleSidedStr.GetInteger (aDoubleSidedInt);
Standard_ShortReal anAlphaCutOff = 0.5f;
readReal (theSource, ::AlphaCutOff(), anAlphaCutOff);
- aMat->SetFaceCulling (aDoubleSidedInt == 1
- ? Graphic3d_TypeOfBackfacingModel_DoubleSided
- : (aDoubleSidedInt == 2
- ? Graphic3d_TypeOfBackfacingModel_BackCulled
- : Graphic3d_TypeOfBackfacingModel_Auto));
+ switch (aDoubleSidedInt)
+ {
+ case 1: aMat->SetFaceCulling (Graphic3d_TypeOfBackfacingModel_DoubleSided); break;
+ case 2: aMat->SetFaceCulling (Graphic3d_TypeOfBackfacingModel_BackCulled); break;
+ case 3: aMat->SetFaceCulling (Graphic3d_TypeOfBackfacingModel_FrontCulled); break;
+ case 0:
+ default: aMat->SetFaceCulling (Graphic3d_TypeOfBackfacingModel_Auto); break;
+ }
aMat->SetAlphaMode (alphaModeFromString (theSource.Element().getAttribute (::AlphaMode()).GetString()), anAlphaCutOff);
Quantity_ColorRGBA aBaseColor;
XmlObjMgt_SRelocationTable& ) const
{
Handle(XCAFDoc_VisMaterial) aMat = Handle(XCAFDoc_VisMaterial)::DownCast(theSource);
- Standard_Integer aDoubleSidedInt = aMat->FaceCulling() == Graphic3d_TypeOfBackfacingModel_DoubleSided
- ? 1
- : (aMat->FaceCulling() == Graphic3d_TypeOfBackfacingModel_BackCulled
- ? 2
- : 0);
+ Standard_Integer aDoubleSidedInt = 0;
+ switch (aMat->FaceCulling())
+ {
+ case Graphic3d_TypeOfBackfacingModel_DoubleSided: aDoubleSidedInt = 1; break;
+ case Graphic3d_TypeOfBackfacingModel_BackCulled: aDoubleSidedInt = 2; break;
+ case Graphic3d_TypeOfBackfacingModel_FrontCulled: aDoubleSidedInt = 3; break;
+ case Graphic3d_TypeOfBackfacingModel_Auto: aDoubleSidedInt = 0; break;
+ }
theTarget.Element().setAttribute (::IsDoubleSided(), aDoubleSidedInt);
theTarget.Element().setAttribute (::AlphaMode(), alphaModeToString (aMat->AlphaMode()));
writeReal (theTarget, ::AlphaCutOff(), aMat->AlphaCutOff());
--- /dev/null
+puts "========"
+puts "0033056: Visualization - add front face culling option"
+puts "Check face culling options"
+puts "========"
+
+set THE_NB_BOXES 4
+set THE_COLORS { ORANGE ORANGE ORANGE ORANGE }
+set THE_MODES { AUTO BACK FRONT DOUBLESIDED }
+
+pload MODELING VISUALIZATION
+vclear
+vinit View1
+vcamera -persp -fovy 80
+vfront
+
+set x 1
+set z 1
+for { set i 1 } { $i <= $THE_NB_BOXES } { incr i } {
+ box b$i [expr $x * 300] 0 [expr $z * 400] 200 300 300
+ vdisplay -dispMode 1 b$i
+ vsetcolor b$i [lindex $THE_COLORS [expr $i - 1]]
+ vaspects b$i -faceCulling [lindex $THE_MODES [expr $i - 1]]
+
+ vdrawtext t$i [lindex $THE_MODES [expr $i - 1]] -pos [expr $x * 300] 0 [expr $z * 400 + 300] -height 16 -color RED -font MONOSPACE -aspect BOLD -valign top
+
+ incr x
+ if { $i == 2 } {
+ set x 1
+ set z 2
+ }
+}
+vfit
+
+vaspects -faceBoundaryDraw 1 -faceBoundaryColor RED
+vdump $::imagedir/${::casename}_bnds.png
+
+vaspects -faceBoundaryDraw 0
+vclipplane c -equation 0 1 0 -100 -set
+vdump $::imagedir/${::casename}_clip.png
+
+vclipplane c off
+vdump $::imagedir/${::casename}.png