kimath: SHAPE_POLY_SET should re-parent triangulated polygons when copied/cloned
This commit is contained in:
parent
80ba02caf5
commit
db9e111838
|
@ -88,17 +88,7 @@ class SHAPE_POLY_SET : public SHAPE
|
||||||
|
|
||||||
virtual bool IsClosed() const override { return true; }
|
virtual bool IsClosed() const override { return true; }
|
||||||
|
|
||||||
virtual const BOX2I BBox( int aClearance = 0 ) const override
|
virtual const BOX2I BBox( int aClearance = 0 ) const override;
|
||||||
{
|
|
||||||
BOX2I bbox( parent->m_vertices[a] );
|
|
||||||
bbox.Merge( parent->m_vertices[b] );
|
|
||||||
bbox.Merge( parent->m_vertices[c] );
|
|
||||||
|
|
||||||
if( aClearance != 0 )
|
|
||||||
bbox.Inflate( aClearance );
|
|
||||||
|
|
||||||
return bbox;
|
|
||||||
}
|
|
||||||
|
|
||||||
virtual const VECTOR2I GetPoint( int aIndex ) const override
|
virtual const VECTOR2I GetPoint( int aIndex ) const override
|
||||||
{
|
{
|
||||||
|
@ -132,6 +122,10 @@ class SHAPE_POLY_SET : public SHAPE
|
||||||
TRIANGULATED_POLYGON* parent;
|
TRIANGULATED_POLYGON* parent;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
TRIANGULATED_POLYGON();
|
||||||
|
TRIANGULATED_POLYGON( const TRIANGULATED_POLYGON& aOther );
|
||||||
|
~TRIANGULATED_POLYGON();
|
||||||
|
|
||||||
void Clear()
|
void Clear()
|
||||||
{
|
{
|
||||||
m_vertices.clear();
|
m_vertices.clear();
|
||||||
|
@ -146,15 +140,9 @@ class SHAPE_POLY_SET : public SHAPE
|
||||||
c = m_vertices[ tri.c ];
|
c = m_vertices[ tri.c ];
|
||||||
}
|
}
|
||||||
|
|
||||||
void AddTriangle( const TRI& aTri )
|
TRIANGULATED_POLYGON& operator=( const TRIANGULATED_POLYGON& aOther );
|
||||||
{
|
|
||||||
m_triangles.push_back( aTri );
|
|
||||||
}
|
|
||||||
|
|
||||||
void AddTriangle( int a, int b, int c )
|
void AddTriangle( int a, int b, int c );
|
||||||
{
|
|
||||||
m_triangles.emplace_back( a, b, c, this );
|
|
||||||
}
|
|
||||||
|
|
||||||
void AddVertex( const VECTOR2I& aP )
|
void AddVertex( const VECTOR2I& aP )
|
||||||
{
|
{
|
||||||
|
|
|
@ -1906,6 +1906,8 @@ SHAPE_POLY_SET &SHAPE_POLY_SET::operator=( const SHAPE_POLY_SET& aOther )
|
||||||
m_triangulatedPolys.clear();
|
m_triangulatedPolys.clear();
|
||||||
m_triangulationValid = false;
|
m_triangulationValid = false;
|
||||||
|
|
||||||
|
printf("operator= %p %p\n", this, &aOther );
|
||||||
|
|
||||||
if( aOther.IsTriangulationUpToDate() )
|
if( aOther.IsTriangulationUpToDate() )
|
||||||
{
|
{
|
||||||
for( unsigned i = 0; i < aOther.TriangulatedPolyCount(); i++ )
|
for( unsigned i = 0; i < aOther.TriangulatedPolyCount(); i++ )
|
||||||
|
@ -1930,6 +1932,8 @@ MD5_HASH SHAPE_POLY_SET::GetHash() const
|
||||||
|
|
||||||
bool SHAPE_POLY_SET::IsTriangulationUpToDate() const
|
bool SHAPE_POLY_SET::IsTriangulationUpToDate() const
|
||||||
{
|
{
|
||||||
|
|
||||||
|
printf("[%p] IsTriValid %d\n", this, !!m_triangulationValid );
|
||||||
if( !m_triangulationValid )
|
if( !m_triangulationValid )
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
@ -2137,11 +2141,13 @@ bool SHAPE_POLY_SET::hasTouchingHoles( const POLYGON& aPoly ) const
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool SHAPE_POLY_SET::HasIndexableSubshapes() const
|
bool SHAPE_POLY_SET::HasIndexableSubshapes() const
|
||||||
{
|
{
|
||||||
return IsTriangulationUpToDate();
|
return IsTriangulationUpToDate();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
size_t SHAPE_POLY_SET::GetIndexableSubshapeCount() const
|
size_t SHAPE_POLY_SET::GetIndexableSubshapeCount() const
|
||||||
{
|
{
|
||||||
size_t n = 0;
|
size_t n = 0;
|
||||||
|
@ -2150,6 +2156,7 @@ size_t SHAPE_POLY_SET::GetIndexableSubshapeCount() const
|
||||||
return n;
|
return n;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void SHAPE_POLY_SET:: GetIndexableSubshapes( std::vector<SHAPE*>& aSubshapes )
|
void SHAPE_POLY_SET:: GetIndexableSubshapes( std::vector<SHAPE*>& aSubshapes )
|
||||||
{
|
{
|
||||||
aSubshapes.reserve( GetIndexableSubshapeCount() );
|
aSubshapes.reserve( GetIndexableSubshapeCount() );
|
||||||
|
@ -2164,3 +2171,53 @@ void SHAPE_POLY_SET:: GetIndexableSubshapes( std::vector<SHAPE*>& aSubshapes )
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
const BOX2I SHAPE_POLY_SET::TRIANGULATED_POLYGON::TRI::BBox( int aClearance ) const
|
||||||
|
{
|
||||||
|
BOX2I bbox( parent->m_vertices[a] );
|
||||||
|
bbox.Merge( parent->m_vertices[b] );
|
||||||
|
bbox.Merge( parent->m_vertices[c] );
|
||||||
|
|
||||||
|
if( aClearance != 0 )
|
||||||
|
bbox.Inflate( aClearance );
|
||||||
|
|
||||||
|
return bbox;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void SHAPE_POLY_SET::TRIANGULATED_POLYGON::AddTriangle( int a, int b, int c )
|
||||||
|
{
|
||||||
|
m_triangles.emplace_back( a, b, c, this );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
SHAPE_POLY_SET::TRIANGULATED_POLYGON::TRIANGULATED_POLYGON( const TRIANGULATED_POLYGON& aOther )
|
||||||
|
{
|
||||||
|
m_vertices = aOther.m_vertices;
|
||||||
|
m_triangles = aOther.m_triangles;
|
||||||
|
|
||||||
|
for( TRI& tri : m_triangles )
|
||||||
|
tri.parent = this;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
SHAPE_POLY_SET::TRIANGULATED_POLYGON& SHAPE_POLY_SET::TRIANGULATED_POLYGON::operator=( const TRIANGULATED_POLYGON& aOther )
|
||||||
|
{
|
||||||
|
m_vertices = aOther.m_vertices;
|
||||||
|
m_triangles = aOther.m_triangles;
|
||||||
|
|
||||||
|
for( TRI& tri : m_triangles )
|
||||||
|
tri.parent = this;
|
||||||
|
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
SHAPE_POLY_SET::TRIANGULATED_POLYGON::TRIANGULATED_POLYGON()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
SHAPE_POLY_SET::TRIANGULATED_POLYGON::~TRIANGULATED_POLYGON()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue