Do not use cache when we modify vertices

When we add vertices to the tesselation routines, we cannot reuse these
without the original vertex points.

It may be possible to copy and modify the vertices from the hint data so
that they are properly positioned but naive attempts (moving based on
first point) did not work, so for now, we disable the hint cache when
the vertex sizes do not match as this prevents OOB access

Fixes https://gitlab.com/kicad/code/kicad/-/issues/17621
This commit is contained in:
Seth Hillbrand 2024-03-31 14:57:54 -07:00
parent dfa16eda95
commit 06b199fd41
4 changed files with 24 additions and 10 deletions

View File

@ -88,9 +88,13 @@ public:
firstVertex->updateList();
if( aHintData )
/**
* If we have a hint data, we can skip the tesselation process as long as the
* the hint source did not need to subdivide the polygon.
*/
if( aHintData && aHintData->Vertices().size() == m_vertices.size() )
{
m_result.Triangles() = aHintData->Triangles();
m_result.SetTriangles( aHintData->Triangles() );
return true;
}
else

View File

@ -172,8 +172,23 @@ public:
int GetSourceOutlineIndex() const { return m_sourceOutline; }
void SetSourceOutlineIndex( int aIndex ) { m_sourceOutline = aIndex; }
std::deque<TRI>& Triangles() { return m_triangles; }
const std::deque<TRI>& Triangles() const { return m_triangles; }
void SetTriangles( const std::deque<TRI>& aTriangles )
{
m_triangles.resize( aTriangles.size() );
for( size_t ii = 0; ii < aTriangles.size(); ii++ )
{
m_triangles[ii] = aTriangles[ii];
m_triangles[ii].parent = this;
}
}
const std::deque<VECTOR2I>& Vertices() const { return m_vertices; }
void SetVertices( const std::deque<VECTOR2I>& aVertices )
{
m_vertices = aVertices;
}
size_t GetVertexCount() const
{

View File

@ -3301,11 +3301,6 @@ void SHAPE_POLY_SET::cacheTriangulation( bool aPartition, bool aSimplify,
triangulationValid = true;
}
if( triangulationValid && wxLog::IsLevelEnabled(wxLOG_Trace, wxLOG_COMPONENT) )
{
}
return triangulationValid;
};
@ -3450,7 +3445,7 @@ void SHAPE_POLY_SET::GetIndexableSubshapes( std::vector<const SHAPE*>& aSubshape
for( const std::unique_ptr<TRIANGULATED_POLYGON>& tpoly : m_triangulatedPolys )
{
for( TRIANGULATED_POLYGON::TRI& tri : tpoly->Triangles() )
for( const TRIANGULATED_POLYGON::TRI& tri : tpoly->Triangles() )
aSubshapes.push_back( &tri );
}
}

View File

@ -78,7 +78,7 @@ BOOST_FIXTURE_TEST_CASE( RegressionTriangulationTests, TRIANGULATE_TEST_FIXTURE
{
const auto tri_poly = poly->TriangulatedPolygon( ii );
for( auto& tri : tri_poly->Triangles() )
for( const auto& tri : tri_poly->Triangles() )
tri_area += tri.Area();
}