case Graphic3d_AlphaMode_Opaque: return 'O';
case Graphic3d_AlphaMode_Mask: return 'M';
case Graphic3d_AlphaMode_Blend: return 'B';
+ case Graphic3d_AlphaMode_MaskBlend: return 'b';
case Graphic3d_AlphaMode_BlendAuto: return 'A';
}
return 'A';
case 'O': return Graphic3d_AlphaMode_Opaque;
case 'M': return Graphic3d_AlphaMode_Mask;
case 'B': return Graphic3d_AlphaMode_Blend;
+ case 'b': return Graphic3d_AlphaMode_MaskBlend;
case 'A': return Graphic3d_AlphaMode_BlendAuto;
}
return Graphic3d_AlphaMode_BlendAuto;
Graphic3d_AlphaMode_Opaque = 0, //!< rendered output is fully opaque and alpha value is ignored
Graphic3d_AlphaMode_Mask, //!< rendered output is either fully opaque or fully transparent depending on the alpha value and the alpha cutoff value
Graphic3d_AlphaMode_Blend, //!< rendered output is combined with the background
+ Graphic3d_AlphaMode_MaskBlend, //!< performs in-place blending (without implicit reordering of opaque objects) with alpha-test
Graphic3d_AlphaMode_BlendAuto = -1, //!< special value defined for backward compatibility - it is equal to Graphic3d_AlphaMode_Blend when Material transparency is not zero and Graphic3d_AlphaMode_Opaque otherwise;
// since this check ignores possible transparency defined by per-vertex colors and textures - NOT recommended to use!
// =======================================================================
Graphic3d_AspectText3d::Graphic3d_AspectText3d()
{
- // actually this should be a special state Graphic3d_AlphaMode_MaskBlend
- // since text is drawn in usual order with normal opaque objects (thanks to alpha test),
- // but blending is also enabled to smoothen boundaries
- SetAlphaMode (Graphic3d_AlphaMode_Mask, 0.285f);
+ SetAlphaMode (Graphic3d_AlphaMode_MaskBlend, 0.285f);
myShadingModel = Graphic3d_TOSM_UNLIT;
myInteriorColor.SetRGB (Quantity_NOC_YELLOW);
myEdgeColor.SetRGB (Quantity_NOC_WHITE);
Aspect_TypeOfStyleText theStyle,
Aspect_TypeOfDisplayText theDisplayType)
{
- SetAlphaMode (Graphic3d_AlphaMode_Mask, 0.285f);
+ SetAlphaMode (Graphic3d_AlphaMode_MaskBlend, 0.285f);
myShadingModel = Graphic3d_TOSM_UNLIT;
myTextStyle = theStyle;
myTextDisplayType = theDisplayType;
// do not update material properties in case of zero reflection mode,
// because GL lighting will be disabled by OpenGl_PrimitiveArray::DrawArray() anyway.
const OpenGl_MaterialState& aMatState = myShaderManager->MaterialState();
- float anAlphaCutoff = anAspect->AlphaMode() == Graphic3d_AlphaMode_Mask
+ float anAlphaCutoff = (anAspect->AlphaMode() == Graphic3d_AlphaMode_Mask
+ || anAspect->AlphaMode() == Graphic3d_AlphaMode_MaskBlend)
? anAspect->AlphaCutoff()
: ShortRealLast();
if (anAspect->ToDrawEdges())
return theAlphaFront < 1.0f
|| theAlphaBack < 1.0f;
}
+ // Graphic3d_AlphaMode_Mask and Graphic3d_AlphaMode_MaskBlend are not considered transparent here
return anAspect->AlphaMode() == Graphic3d_AlphaMode_Blend;
}
myLabelValues.SetFontSize (theCtx, myData.ValuesSize());
+ myAspectLabels.Aspect()->SetAlphaMode (Graphic3d_AlphaMode_MaskBlend, 0.285f);
myAspectLabels.Aspect()->SetTextFontAspect (myData.NamesFontAspect());
myAspectLabels.Aspect()->SetTextFont (!myData.NamesFont().IsEmpty()
? new TCollection_HAsciiString (myData.NamesFont())
: Handle(TCollection_HAsciiString )());
+ myAspectValues.Aspect()->SetAlphaMode (Graphic3d_AlphaMode_MaskBlend, 0.285f);
myAspectValues.Aspect()->SetTextFontAspect (myData.ValuesFontAspect());
myAspectValues.Aspect()->SetTextFont (!myData.ValuesFont().IsEmpty()
? new TCollection_HAsciiString (myData.ValuesFont())
}
aCtx->SetSampleAlphaToCoverage (aCtx->ShaderManager()->MaterialState().HasAlphaCutoff());
+ const bool isForcedBlend = anAspectFace->Aspect()->AlphaMode() == Graphic3d_AlphaMode_MaskBlend;
+ if (isForcedBlend)
+ {
+ aCtx->core11fwd->glEnable (GL_BLEND);
+ aCtx->core11fwd->glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ }
+
const Graphic3d_Vec4* aFaceColors = !myBounds.IsNull() && !toHilight && anAspectFace->Aspect()->InteriorStyle() != Aspect_IS_HIDDENLINE
? myBounds->Colors
: NULL;
}
drawArray (theWorkspace, aFaceColors, hasColorAttrib);
+ if (isForcedBlend)
+ {
+ aCtx->core11fwd->glDisable (GL_BLEND);
+ }
return;
}
aCtx->core11fwd->glCullFace (GL_BACK);
}
+
+ if (isForcedBlend)
+ {
+ aCtx->core11fwd->glDisable (GL_BLEND);
+ }
}
#if !defined(GL_ES_VERSION_2_0)
Standard_Boolean theEnableMeshEdges) const
{
Standard_Integer aBits = 0;
- if (theAlphaMode == Graphic3d_AlphaMode_Mask)
+ if (theAlphaMode == Graphic3d_AlphaMode_Mask
+ || theAlphaMode == Graphic3d_AlphaMode_MaskBlend)
{
aBits |= Graphic3d_ShaderFlags_AlphaTest;
}
&& theTextAspect.Aspect()->TextStyle() != Aspect_TOST_ANNOTATION;
if (!hasDepthTest)
{
- glDisable (GL_DEPTH_TEST);
+ theCtx->core11fwd->glDisable (GL_DEPTH_TEST);
}
if (theCtx->core15fwd != NULL)
#endif
// setup blending
- glEnable (GL_BLEND);
- glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ if (theTextAspect.Aspect()->AlphaMode() == Graphic3d_AlphaMode_MaskBlend)
+ {
+ theCtx->core11fwd->glEnable (GL_BLEND);
+ theCtx->core11fwd->glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ }
// alpha to coverage makes text too thin
theCtx->SetSampleAlphaToCoverage (false);
if (theTextAspect.Aspect()->TextDisplayType() == Aspect_TODT_DIMENSION)
{
- glDisable (GL_BLEND);
+ if (theTextAspect.Aspect()->AlphaMode() == Graphic3d_AlphaMode_MaskBlend)
+ {
+ glDisable (GL_BLEND);
+ }
if (!myIs2d)
{
glDisable (GL_DEPTH_TEST);
}
// reset OpenGL state
- glDisable (GL_BLEND);
+ if (theTextAspect.Aspect()->AlphaMode() == Graphic3d_AlphaMode_MaskBlend)
+ {
+ theCtx->core11fwd->glDisable (GL_BLEND);
+ }
glDisable (GL_STENCIL_TEST);
#if !defined(GL_ES_VERSION_2_0)
glDisable (GL_COLOR_LOGIC_OP);
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))
{
break;
}
case Graphic3d_AlphaMode_Blend:
+ case Graphic3d_AlphaMode_MaskBlend:
{
myWriter->Key ("alphaMode");
myWriter->String ("BLEND");
{
aChangeSet->AlphaMode = Graphic3d_AlphaMode_Blend;
}
+ else if (aParam == "maskblend"
+ || aParam == "blendmask")
+ {
+ aChangeSet->AlphaMode = Graphic3d_AlphaMode_MaskBlend;
+ }
else if (aParam == "blendauto"
|| aParam == "auto")
{
"\n\t\t: [-faceBoundaryWidth LineWidth] [-faceBoundaryColor R G B] [-faceBoundaryType LineType]"
"\n\t\t: [-drawEdges {0|1}] [-edgeType LineType] [-edgeColor R G B] [-quadEdges {0|1}]"
"\n\t\t: [-drawSilhouette {0|1}]"
- "\n\t\t: [-alphaMode {opaque|mask|blend|blendauto} [alphaCutOff=0.5]]"
+ "\n\t\t: [-alphaMode {opaque|mask|blend|maskblend|blendauto} [alphaCutOff=0.5]]"
"\n\t\t: [-dumpJson]"
"\n\t\t: [-dumpCompact {0|1}]"
"\n\t\t: [-dumpDepth depth]"
{
aMode = Graphic3d_AlphaMode_Blend;
}
+ else if (aValStr == "maskblend"
+ || aValStr == "blendmask")
+ {
+ aMode = Graphic3d_AlphaMode_MaskBlend;
+ }
else if (aValStr == "blendauto")
{
aMode = Graphic3d_AlphaMode_BlendAuto;
case Graphic3d_AlphaMode_Opaque: return "Opaque";
case Graphic3d_AlphaMode_Mask: return "Mask";
case Graphic3d_AlphaMode_Blend: return "Blend";
+ case Graphic3d_AlphaMode_MaskBlend: return "MaskBlend";
case Graphic3d_AlphaMode_BlendAuto: return "BlendAuto";
}
return "";
{
anAlphaMode = Graphic3d_AlphaMode_Blend;
}
+ else if (aModeStr == "maskblend"
+ || aModeStr == "blendmask")
+ {
+ anAlphaMode = Graphic3d_AlphaMode_MaskBlend;
+ }
else if (aModeStr == "blendauto")
{
anAlphaMode = Graphic3d_AlphaMode_BlendAuto;
case Graphic3d_AlphaMode_Opaque: return "Opaque";
case Graphic3d_AlphaMode_Mask: return "Mask";
case Graphic3d_AlphaMode_Blend: return "Blend";
+ case Graphic3d_AlphaMode_MaskBlend: return "MaskBlend";
case Graphic3d_AlphaMode_BlendAuto: return "Auto";
}
return "Auto";
//! Decode alpha mode from string.
static Graphic3d_AlphaMode alphaModeFromString (const char* theMode)
{
- switch (*theMode)
+ if (strcasecmp (theMode, "Opaque") == 0)
{
- case 'O': return Graphic3d_AlphaMode_Opaque;
- case 'M': return Graphic3d_AlphaMode_Mask;
- case 'B': return Graphic3d_AlphaMode_Blend;
- case 'A': return Graphic3d_AlphaMode_BlendAuto;
+ return Graphic3d_AlphaMode_Opaque;
+ }
+ else if (strcasecmp (theMode, "Mask") == 0)
+ {
+ return Graphic3d_AlphaMode_Mask;
+ }
+ else if (strcasecmp (theMode, "Blend") == 0)
+ {
+ return Graphic3d_AlphaMode_Blend;
+ }
+ else if (strcasecmp (theMode, "MaskBlend") == 0)
+ {
+ return Graphic3d_AlphaMode_MaskBlend;
+ }
+ else if (strcasecmp (theMode, "Auto") == 0)
+ {
+ return Graphic3d_AlphaMode_BlendAuto;
}
return Graphic3d_AlphaMode_BlendAuto;
}
--- /dev/null
+puts "============"
+puts "0032143: Visualization - add option excluding transparent object from sorting"
+puts "============"
+puts ""
+
+pload MODELING VISUALIZATION
+vclear
+vinit View1 -width 512 -height 512
+vbackground -gradient GRAY20 GRAY80
+restore [locate_data_file Ball.brep] b
+vdisplay -dispMode 1 b
+vfit
+
+set dx 220; set dy 74
+set logoPath "$::env(CSF_OCCTResourcePath)/DrawResources/OCC_logo.png"
+box logo $dx $dy 0 -preview
+vdisplay -dispMode 1 logo -topmost -2d bottomRight [expr $dx+25] 25
+vtexture logo "$logoPath"
+vaspects logo -alphaMode BLEND -shadingModel UNLIT
+vdisplay logo -underlay
+if { [vreadpixel 320 440 -rgb -name] != "DEEPSKYBLUE3" } { puts "Error: Unexpected color for BLEND" }
+vaspects logo -alphaMode MASKBLEND 0.001 -shadingModel UNLIT
+if { [vreadpixel 320 440 -rgb -name] != "DARKGOLDENROD" } { puts "Error: Unexpected color for MASKBLEND" }
+
+vdump ${imagedir}/${casename}.png