Skip to content

Commit 5080f76

Browse files
committed
[62] Polyline calculate AABB while adding lines and beziers
1 parent c804fad commit 5080f76

File tree

1 file changed

+27
-3
lines changed

1 file changed

+27
-3
lines changed

62_CAD/Polyline.h

Lines changed: 27 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -356,6 +356,12 @@ class CPolylineBase
356356
class CPolyline : public CPolylineBase
357357
{
358358
public:
359+
CPolyline() :
360+
m_Min(float64_t2(nbl::hlsl::numeric_limits<float64_t>::max, nbl::hlsl::numeric_limits<float64_t>::max)),
361+
m_Max(float64_t2(nbl::hlsl::numeric_limits<float64_t>::min, nbl::hlsl::numeric_limits<float64_t>::min)),
362+
m_closedPolygon(false)
363+
{}
364+
359365
size_t getSectionsCount() const override { return m_sections.size(); }
360366

361367
const SectionInfo& getSectionInfoAt(const uint32_t idx) const override
@@ -423,6 +429,7 @@ class CPolyline : public CPolylineBase
423429
m_linePoints[oldLinePointSize + i].p = linePoints[i];
424430
m_linePoints[oldLinePointSize + i].phaseShift = 0.0;
425431
m_linePoints[oldLinePointSize + i].stretchValue = 1.0;
432+
addExtremum(linePoints[i]);
426433
}
427434

428435
SectionInfo newSection = {};
@@ -463,6 +470,10 @@ class CPolyline : public CPolylineBase
463470
m_quadBeziers[currBezierIdx].shape = quadBeziers[i];
464471
m_quadBeziers[currBezierIdx].phaseShift = 0.0;
465472
m_quadBeziers[currBezierIdx].stretchValue = 1.0;
473+
474+
addExtremum(quadBeziers[i].P0);
475+
addExtremum(quadBeziers[i].P1); // Currently We add the control point instead of actual extremum to avoid computing a quadratic formula for each bezier we add
476+
addExtremum(quadBeziers[i].P2);
466477
}
467478

468479
const bool unifiedSection = (m_sections.size() > lastSectionsSize && m_sections.back().type == ObjectType::QUAD_BEZIER);
@@ -1184,12 +1195,28 @@ class CPolyline : public CPolylineBase
11841195
m_closedPolygon = closed;
11851196
}
11861197

1198+
float64_t2 getMin() const { return m_Min; }
1199+
float64_t2 getMax() const { return m_Max; }
1200+
11871201
protected:
11881202
std::vector<PolylineConnector> m_polylineConnector;
11891203
std::vector<SectionInfo> m_sections;
11901204
std::vector<LinePointInfo> m_linePoints;
11911205
std::vector<QuadraticBezierInfo> m_quadBeziers;
11921206
uint32_t lastSectionsSize = std::numeric_limits<uint32_t>::max();
1207+
// important for miter and parallel generation
1208+
bool m_closedPolygon = false;
1209+
1210+
inline void addExtremum(const float64_t2& point)
1211+
{
1212+
m_Min.x = nbl::hlsl::min(m_Min.x, point.x);
1213+
m_Min.y = nbl::hlsl::min(m_Min.y, point.y);
1214+
m_Max.x = nbl::hlsl::max(m_Max.x, point.x);
1215+
m_Max.y = nbl::hlsl::max(m_Max.y, point.y);
1216+
}
1217+
1218+
float64_t2 m_Min; // min coordinate of the whole polyline
1219+
float64_t2 m_Max; // max coordinate of the whole polyline
11931220

11941221
// Next 3 are protected member functions to modify current lines and bezier sections used in polyline offsetting:
11951222

@@ -1751,7 +1778,4 @@ class CPolyline : public CPolylineBase
17511778
nbl::core::vector<PolylineConnectorNormalHelperInfo> connectorNormalInfos;
17521779
float phaseShiftAtEndOfPolyline = 0.0f;
17531780
};
1754-
1755-
// important for miter and parallel generation
1756-
bool m_closedPolygon = false;
17571781
};

0 commit comments

Comments
 (0)