From b054b9682ac1c69476ab602d1d43b763c7cd9213 Mon Sep 17 00:00:00 2001 From: EvilSpirit Date: Thu, 4 Feb 2016 15:46:24 +0600 Subject: [PATCH] Cache generated bezier curves and edges in Entity. --- src/drawentity.cpp | 34 ++++++++++++++++++++++++---------- src/sketch.h | 14 +++++++++++++- 2 files changed, 37 insertions(+), 11 deletions(-) diff --git a/src/drawentity.cpp b/src/drawentity.cpp index bb86026..3f2ae82 100644 --- a/src/drawentity.cpp +++ b/src/drawentity.cpp @@ -118,12 +118,11 @@ void Entity::Draw(void) { void Entity::GenerateEdges(SEdgeList *el, bool includingConstruction) { if(construction && !includingConstruction) return; - SBezierList sbl = {}; - GenerateBezierCurves(&sbl); + SBezierList *sbl = GetOrGenerateBezierCurves(); int i, j; - for(i = 0; i < sbl.l.n; i++) { - SBezier *sb = &(sbl.l.elem[i]); + for(i = 0; i < sbl->l.n; i++) { + SBezier *sb = &(sbl->l.elem[i]); List lv = {}; sb->MakePwlInto(&lv); @@ -133,7 +132,24 @@ void Entity::GenerateEdges(SEdgeList *el, bool includingConstruction) { lv.Clear(); } - sbl.Clear(); +} + +SBezierList *Entity::GetOrGenerateBezierCurves() { + if(beziers.l.n == 0) + GenerateBezierCurves(&beziers); + return &beziers; +} + +SEdgeList *Entity::GetOrGenerateEdges() { + if(edges.l.n != 0) { + if(EXACT(edgesChordTol == SS.ChordTolMm())) + return &edges; + edges.l.Clear(); + } + if(edges.l.n == 0) + GenerateEdges(&edges, /*includingConstruction=*/true); + edgesChordTol = SS.ChordTolMm(); + return &edges; } double Entity::GetDistance(Point2d mp) { @@ -640,13 +656,11 @@ void Entity::DrawOrGetDistance(void) { // And draw the curves; generate the rational polynomial curves for // everything, then piecewise linearize them, and display those. - SEdgeList sel = {}; - GenerateEdges(&sel, true); + SEdgeList *sel = GetOrGenerateEdges(); int i; - for(i = 0; i < sel.l.n; i++) { - SEdge *se = &(sel.l.elem[i]); + for(i = 0; i < sel->l.n; i++) { + SEdge *se = &(sel->l.elem[i]); LineDrawOrGetDistance(se->a, se->b, true); } - sel.Clear(); } diff --git a/src/sketch.h b/src/sketch.h index a6bdd42..8e789b6 100644 --- a/src/sketch.h +++ b/src/sketch.h @@ -455,7 +455,7 @@ public: // POD members with indeterminate value. Entity() : EntityBase({}), forceHidden(), actPoint(), actNormal(), actDistance(), actVisible(), style(), construction(), - dogd() {}; + dogd(), beziers(), edges(), edgesChordTol() {}; // An imported entity that was hidden in the source file ends up hidden // here too. @@ -473,6 +473,10 @@ public: hStyle style; bool construction; + SBezierList beziers; + SEdgeList edges; + double edgesChordTol; + // Routines to draw and hit-test the representation of the entity // on-screen. struct { @@ -502,6 +506,14 @@ public: void CalculateNumerical(bool forExport); std::string DescriptionString(void); + + SBezierList *GetOrGenerateBezierCurves(); + SEdgeList *GetOrGenerateEdges(); + + void Clear() { + beziers.l.Clear(); + edges.l.Clear(); + } }; class EntReqTable {