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:
@@ -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);
|
||||
}
|
||||
|
@@ -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
|
||||
|
Reference in New Issue
Block a user