Class DBRep_DrawableShape is changed to postpone generation of display data until the shape is actually displayed (for the first time).
Test perf draw bug28404 is added.
myRgN(Standard_False),
myHid(Standard_False)
{
- Set(aShape);
+ myShape = aShape;
}
//=======================================================================
-//function : Set
+//function : updateDisplayData
//purpose :
//=======================================================================
-void DBRep_DrawableShape::Set(const TopoDS_Shape& aShape)
+void DBRep_DrawableShape::updateDisplayData () const
{
- myShape = aShape;
-
myFaces.Clear();
myEdges.Clear();
//==============================================================
TopTools_IndexedDataMapOfShapeListOfShape edgemap;
- TopExp::MapShapesAndAncestors(aShape,TopAbs_EDGE,TopAbs_FACE,edgemap);
+ TopExp::MapShapesAndAncestors(myShape,TopAbs_EDGE,TopAbs_FACE,edgemap);
Standard_Integer iedge;
for (iedge = 1; iedge <= edgemap.Extent(); iedge++) {
return;
}
+ if (myFaces.IsEmpty() || myEdges.IsEmpty())
+ updateDisplayData();
+
// hidden lines
if (myHLR) {
DBRep_DrawableShape* p = (DBRep_DrawableShape*) this;
if (aSurf.IsNull() || mytriangulations) {
Tr = BRep_Tool::Triangulation(F->Face(), loc);
if (!Tr.IsNull()) {
- Display(Tr, loc.Transformation(), dis);
+ display(Tr, loc.Transformation(), dis);
}
}
itf.Next();
//=======================================================================
-//function : Display
+//function : display
//purpose :
//=======================================================================
-void DBRep_DrawableShape::Display(const Handle(Poly_Triangulation)& T,
+void DBRep_DrawableShape::display(const Handle(Poly_Triangulation)& T,
const gp_Trsf& tr,
Draw_Display& dis) const
{
Standard_EXPORT DBRep_DrawableShape(const TopoDS_Shape& C, const Draw_Color& FreeCol, const Draw_Color& ConnCol, const Draw_Color& EdgeCol, const Draw_Color& IsosCol, const Standard_Real size, const Standard_Integer nbisos, const Standard_Integer discret);
- Standard_EXPORT void Set (const TopoDS_Shape& C);
-
//! Changes the number of isoparametric curves in a shape.
Standard_EXPORT void ChangeNbIsos (const Standard_Integer NbIsos);
DEFINE_STANDARD_RTTIEXT(DBRep_DrawableShape,Draw_Drawable3D)
-protected:
-
+private:
+ void display (const Handle(Poly_Triangulation)& T, const gp_Trsf& tr, Draw_Display& dis) const;
+ //! Updates internal data necessary for display
+ void updateDisplayData () const;
private:
-
- Standard_EXPORT void Display (const Handle(Poly_Triangulation)& T, const gp_Trsf& tr, Draw_Display& dis) const;
-
TopoDS_Shape myShape;
- DBRep_ListOfEdge myEdges;
- DBRep_ListOfFace myFaces;
+
+ mutable DBRep_ListOfEdge myEdges;
+ mutable DBRep_ListOfFace myFaces;
DBRep_ListOfHideData myHidData;
+
Standard_Real mySize;
Standard_Integer myDiscret;
Draw_Color myFreeCol;
--- /dev/null
+puts "0028404: DRAW is slow"
+
+# Test performance of code generating deep nested compound
+# involving simple shape (box) around 93 K times
+
+pload MODELING
+
+# replicate shape nb times, adding rotation and translation to each copy
+# (except first)
+proc replicate {result shape nb cx cy cz rx ry rz angle tx ty tz} {
+ upvar $result res
+ upvar $shape s
+
+ copy s a0
+ set ll a0
+ for {set i 1} {$i < $nb} {incr i} {
+ copy "a[expr $i - 1]" a$i
+ trotate a$i $cx $cy $cz $rx $ry $rz $angle
+ ttranslate a$i $tx $ty $tz
+ lappend ll a$i
+ }
+ eval compound $ll res
+ return $result
+}
+
+# switch off autodisplay of shapes
+autodisplay 0
+
+chrono s restart
+box b 10 10 10
+replicate r1 b 12 0 0 0 0 0 1 30 15 20 3
+replicate r2 r1 36 50 -50 0 1 1 0 10 0 0 0
+replicate r3 r2 18 250 250 0 1 -1 0 20 100 100 20
+replicate r4 r3 12 -300 -300 0 0 0 1 30 300 300 0
+chrono s stop counter "huge compound generation CPU"
+
+# return autodisplay
+autodisplay 1
009 modalg
010 moddata
011 sewing
-012 vis
\ No newline at end of file
+012 vis
+013 draw