1
0
mirror of https://git.dev.opencascade.org/repos/occt.git synced 2025-08-09 13:22:24 +03:00

0029729: Visualization, Graphic3d_ClipPlane - add support of clipping plane chains

Graphic3d_ClipPlane now can define a Chain of Planes (logical AND).
OpenGl_ShaderManager - added new GLSL sub-programs for clipping plane chains.
Bnd_Range::TrimFrom(), ::TrimTo() - added auxiliary methods for trimming the range.
SelectMgr_ViewClipRange now handles non-continuous clipping range.
Graphic3d_SequenceOfHClipPlane now aggregates NCollection_Sequence instead of inheritance.
OpenGl_CappingPlaneResource - triangulation has been adjusted to make front face following CCW order.
This commit is contained in:
kgv
2018-05-25 10:13:38 +03:00
committed by bugmaster
parent 012264339e
commit 25c35042b6
34 changed files with 1063 additions and 407 deletions

View File

@@ -2626,8 +2626,13 @@ static Standard_Integer VAspects (Draw_Interpretor& /*theDI*/,
for (ViewTest_PrsIter aPrsIter (aNames); aPrsIter.More(); aPrsIter.Next())
{
const TCollection_AsciiString& aName = aPrsIter.CurrentName();
Handle(AIS_InteractiveObject) aPrs = aPrsIter.Current();
const TCollection_AsciiString& aName = aPrsIter.CurrentName();
Handle(AIS_InteractiveObject) aPrs = aPrsIter.Current();
if (aPrs.IsNull())
{
return 1;
}
Handle(Prs3d_Drawer) aDrawer = aPrs->Attributes();
Handle(AIS_ColoredShape) aColoredPrs;
Standard_Boolean toDisplay = Standard_False;

View File

@@ -8375,8 +8375,8 @@ static int VClipPlane (Draw_Interpretor& theDi, Standard_Integer theArgsNb, cons
{
aClipPlane->SetOn (toEnable);
}
else if (aChangeArg == "-equation"
|| aChangeArg == "equation")
else if (aChangeArg.StartsWith ("-equation")
|| aChangeArg.StartsWith ("equation"))
{
if (aNbChangeArgs < 5)
{
@@ -8384,13 +8384,74 @@ static int VClipPlane (Draw_Interpretor& theDi, Standard_Integer theArgsNb, cons
return 1;
}
Standard_Real aCoeffA = Draw::Atof (aChangeArgs [1]);
Standard_Real aCoeffB = Draw::Atof (aChangeArgs [2]);
Standard_Real aCoeffC = Draw::Atof (aChangeArgs [3]);
Standard_Real aCoeffD = Draw::Atof (aChangeArgs [4]);
aClipPlane->SetEquation (gp_Pln (aCoeffA, aCoeffB, aCoeffC, aCoeffD));
Standard_Integer aSubIndex = 1;
Standard_Integer aPrefixLen = 8 + (aChangeArg.Value (1) == '-' ? 1 : 0);
if (aPrefixLen < aChangeArg.Length())
{
TCollection_AsciiString aSubStr = aChangeArg.SubString (aPrefixLen + 1, aChangeArg.Length());
if (!aSubStr.IsIntegerValue()
|| aSubStr.IntegerValue() <= 0)
{
std::cout << "Syntax error: unknown argument '" << aChangeArg << "'.\n";
return 1;
}
aSubIndex = aSubStr.IntegerValue();
}
Standard_Real aCoeffA = Draw::Atof (aChangeArgs[1]);
Standard_Real aCoeffB = Draw::Atof (aChangeArgs[2]);
Standard_Real aCoeffC = Draw::Atof (aChangeArgs[3]);
Standard_Real aCoeffD = Draw::Atof (aChangeArgs[4]);
Handle(Graphic3d_ClipPlane) aSubPln = aClipPlane;
for (Standard_Integer aSubPlaneIter = 1; aSubPlaneIter < aSubIndex; ++aSubPlaneIter)
{
if (aSubPln->ChainNextPlane().IsNull())
{
aSubPln->SetChainNextPlane (new Graphic3d_ClipPlane (*aSubPln));
}
aSubPln = aSubPln->ChainNextPlane();
}
aSubPln->SetChainNextPlane (Handle(Graphic3d_ClipPlane)());
aSubPln->SetEquation (gp_Pln (aCoeffA, aCoeffB, aCoeffC, aCoeffD));
anArgIter += 4;
}
else if ((aChangeArg == "-boxinterior"
|| aChangeArg == "-boxint"
|| aChangeArg == "-box")
&& aNbChangeArgs >= 7)
{
Graphic3d_BndBox3d aBndBox;
aBndBox.Add (Graphic3d_Vec3d (Draw::Atof (aChangeArgs[1]), Draw::Atof (aChangeArgs[2]), Draw::Atof (aChangeArgs[3])));
aBndBox.Add (Graphic3d_Vec3d (Draw::Atof (aChangeArgs[4]), Draw::Atof (aChangeArgs[5]), Draw::Atof (aChangeArgs[6])));
anArgIter += 6;
Standard_Integer aNbSubPlanes = 6;
const Graphic3d_Vec3d aDirArray[6] =
{
Graphic3d_Vec3d (-1, 0, 0),
Graphic3d_Vec3d ( 1, 0, 0),
Graphic3d_Vec3d ( 0,-1, 0),
Graphic3d_Vec3d ( 0, 1, 0),
Graphic3d_Vec3d ( 0, 0,-1),
Graphic3d_Vec3d ( 0, 0, 1),
};
Handle(Graphic3d_ClipPlane) aSubPln = aClipPlane;
for (Standard_Integer aSubPlaneIter = 0; aSubPlaneIter < aNbSubPlanes; ++aSubPlaneIter)
{
const Graphic3d_Vec3d& aDir = aDirArray[aSubPlaneIter];
const Standard_Real aW = -aDir.Dot ((aSubPlaneIter % 2 == 1) ? aBndBox.CornerMax() : aBndBox.CornerMin());
aSubPln->SetEquation (gp_Pln (aDir.x(), aDir.y(), aDir.z(), aW));
if (aSubPlaneIter + 1 == aNbSubPlanes)
{
aSubPln->SetChainNextPlane (Handle(Graphic3d_ClipPlane)());
}
else
{
aSubPln->SetChainNextPlane (new Graphic3d_ClipPlane (*aSubPln));
}
aSubPln = aSubPln->ChainNextPlane();
}
}
else if (aChangeArg == "-capping"
|| aChangeArg == "capping")
{
@@ -12300,7 +12361,9 @@ void ViewerTest::ViewerCommands(Draw_Interpretor& theCommands)
__FILE__,VHLRType,group);
theCommands.Add("vclipplane",
"vclipplane planeName [{0|1}]"
"\n\t\t: [-equation A B C D]"
"\n\t\t: [-equation1 A B C D]"
"\n\t\t: [-equation2 A B C D]"
"\n\t\t: [-boxInterior MinX MinY MinZ MaxX MaxY MaxZ]"
"\n\t\t: [-set|-unset|-setOverrideGlobal [objects|views]]"
"\n\t\t: [-maxPlanes]"
"\n\t\t: [-capping {0|1}]"