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

0028036: Visualization, AIS_ColoredShape - handle correctly nested compounds within Shaded display mode

AIS_ColoredShape::Compute() now parses nested compounds in two passes
to handle complex cases with compounds used for grouping styles.
This commit is contained in:
kgv
2016-11-01 21:36:24 +03:00
committed by abv
parent 4af9e8a8b7
commit 9c86076b21
7 changed files with 595 additions and 344 deletions

View File

@@ -296,13 +296,10 @@ namespace
}
//! Compute boundary presentation for faces of the shape.
static void computeFaceBoundaries (const TopoDS_Shape& theShape,
const Handle(Prs3d_Presentation)& thePrs,
const Handle(Prs3d_Drawer)& theDrawer)
static Handle(Graphic3d_ArrayOfSegments) fillFaceBoundaries (const TopoDS_Shape& theShape)
{
// collection of all triangulation nodes on edges
// for computing boundaries presentation
NCollection_List<Handle(TColgp_HArray1OfPnt)> aNodeCollection;
Standard_Integer aNodeNumber = 0;
Standard_Integer aNbPolylines = 0;
@@ -338,7 +335,7 @@ namespace
}
if (aNodeNumber == 0)
{
return;
return Handle(Graphic3d_ArrayOfSegments)();
}
// create indexed segments array to pack polylines from different edges into single array
@@ -391,13 +388,7 @@ namespace
}
}
}
// set up aspect and add polyline data
Handle(Graphic3d_AspectLine3d) aBoundaryAspect = theDrawer->FaceBoundaryAspect()->Aspect();
Handle(Graphic3d_Group) aPrsGrp = Prs3d_Root::CurrentGroup (thePrs);
aPrsGrp->SetGroupPrimitivesAspect (aBoundaryAspect);
aPrsGrp->AddPrimitiveArray (aSegments);
return aSegments;
}
} // anonymous namespace
@@ -546,6 +537,57 @@ void StdPrs_ShadedShape::Add (const Handle (Prs3d_Presentation)& thePrs,
if (theDrawer->FaceBoundaryDraw())
{
computeFaceBoundaries (theShape, thePrs, theDrawer);
Handle(Graphic3d_ArrayOfSegments) aBndSegments = fillFaceBoundaries (theShape);
if (!aBndSegments.IsNull())
{
Handle(Graphic3d_AspectLine3d) aBoundaryAspect = theDrawer->FaceBoundaryAspect()->Aspect();
Handle(Graphic3d_Group) aPrsGrp = Prs3d_Root::CurrentGroup (thePrs);
aPrsGrp->SetGroupPrimitivesAspect (aBoundaryAspect);
aPrsGrp->AddPrimitiveArray (aBndSegments);
}
}
}
// =======================================================================
// function : FillTriangles
// purpose :
// =======================================================================
Handle(Graphic3d_ArrayOfTriangles) StdPrs_ShadedShape::FillTriangles (const TopoDS_Shape& theShape,
const Standard_Boolean theHasTexels,
const gp_Pnt2d& theUVOrigin,
const gp_Pnt2d& theUVRepeat,
const gp_Pnt2d& theUVScale)
{
return fillTriangles (theShape, theHasTexels, theUVOrigin, theUVRepeat, theUVScale);
}
// =======================================================================
// function : FillFaceBoundaries
// purpose :
// =======================================================================
Handle(Graphic3d_ArrayOfSegments) StdPrs_ShadedShape::FillFaceBoundaries (const TopoDS_Shape& theShape)
{
return fillFaceBoundaries (theShape);
}
// =======================================================================
// function : AddWireframeForFreeElements
// purpose :
// =======================================================================
void StdPrs_ShadedShape::AddWireframeForFreeElements (const Handle (Prs3d_Presentation)& thePrs,
const TopoDS_Shape& theShape,
const Handle (Prs3d_Drawer)& theDrawer)
{
wireframeFromShape (thePrs, theShape, theDrawer);
}
// =======================================================================
// function : AddWireframeForFacesWithoutTriangles
// purpose :
// =======================================================================
void StdPrs_ShadedShape::AddWireframeForFacesWithoutTriangles (const Handle(Prs3d_Presentation)& thePrs,
const TopoDS_Shape& theShape,
const Handle(Prs3d_Drawer)& theDrawer)
{
wireframeNoTriangFacesFromShape (thePrs, theShape, theDrawer);
}

View File

@@ -25,20 +25,19 @@
#include <Prs3d_Drawer.hxx>
#include <StdPrs_Volume.hxx>
#include <Standard_Boolean.hxx>
class Graphic3d_ArrayOfSegments;
class Graphic3d_ArrayOfTriangles;
class Prs3d_Presentation;
class TopoDS_Shape;
class gp_Pnt2d;
class BRep_Builder;
class TopoDS_Compound;
//! Auxiliary procedures to prepare Shaded presentation of specified shape.
class StdPrs_ShadedShape : public Prs3d_Root
class StdPrs_ShadedShape : public Prs3d_Root
{
public:
DEFINE_STANDARD_ALLOC
//! Shades <theShape>.
//! @param theVolumeType defines the way how to interpret input shapes - as Closed volumes (to activate back-face
@@ -56,27 +55,43 @@ public:
//! into two compounds for separate processing of closed and unclosed sub-shapes
Standard_EXPORT static void ExploreSolids (const TopoDS_Shape& theShape, const BRep_Builder& theBuilder, TopoDS_Compound& theClosed, TopoDS_Compound& theOpened, const Standard_Boolean theIgnore1DSubShape);
//! Computes wireframe presentation for free wires and vertices
Standard_EXPORT static void AddWireframeForFreeElements (const Handle(Prs3d_Presentation)& thePrs,
const TopoDS_Shape& theShape,
const Handle(Prs3d_Drawer)& theDrawer);
//! Computes special wireframe presentation for faces without triangulation.
Standard_EXPORT static void AddWireframeForFacesWithoutTriangles (const Handle(Prs3d_Presentation)& thePrs,
const TopoDS_Shape& theShape,
const Handle(Prs3d_Drawer)& theDrawer);
public:
protected:
private:
//! Create primitive array with triangles for specified shape.
//! @param theShape [in] the shape with precomputed triangulation
static Handle(Graphic3d_ArrayOfTriangles) FillTriangles (const TopoDS_Shape& theShape)
{
gp_Pnt2d aDummy;
return FillTriangles (theShape, Standard_False, aDummy, aDummy, aDummy);
}
//! Create primitive array of triangles for specified shape.
//! @param theShape the shape with precomputed triangulation
//! @param theHasTexels define UV coordinates in primitive array
//! @param theUVOrigin origin for UV coordinates
//! @param theUVRepeat repeat parameters for UV coordinates
//! @param theUVScale scale coefficients for UV coordinates
//! @return triangles array or NULL if specified face does not have computed triangulation
Standard_EXPORT static Handle(Graphic3d_ArrayOfTriangles) FillTriangles (const TopoDS_Shape& theShape,
const Standard_Boolean theHasTexels,
const gp_Pnt2d& theUVOrigin,
const gp_Pnt2d& theUVRepeat,
const gp_Pnt2d& theUVScale);
//! Define primitive array of boundary segments for specified shape.
//! @param theShape segments array or NULL if specified face does not have computed triangulation
Standard_EXPORT static Handle(Graphic3d_ArrayOfSegments) FillFaceBoundaries (const TopoDS_Shape& theShape);
};
#endif // _StdPrs_ShadedShape_HeaderFile