mirror of https://github.com/axmolengine/axmol.git
Merge pull request #9 from fusijie/fix_spritepolygon2
fix memory leakage about operation=
This commit is contained in:
commit
db07e21a71
|
@ -35,6 +35,8 @@ THE SOFTWARE.
|
||||||
|
|
||||||
USING_NS_CC;
|
USING_NS_CC;
|
||||||
|
|
||||||
|
static unsigned short quadIndices[]={0,1,2, 3,2,1};
|
||||||
|
|
||||||
PolygonInfo::PolygonInfo(const PolygonInfo& other):
|
PolygonInfo::PolygonInfo(const PolygonInfo& other):
|
||||||
triangles(),
|
triangles(),
|
||||||
isVertsOwner(true),
|
isVertsOwner(true),
|
||||||
|
@ -51,28 +53,11 @@ rect()
|
||||||
memcpy(triangles.indices, other.triangles.indices, other.triangles.indexCount*sizeof(unsigned short));
|
memcpy(triangles.indices, other.triangles.indices, other.triangles.indexCount*sizeof(unsigned short));
|
||||||
};
|
};
|
||||||
|
|
||||||
void PolygonInfo::setQuad(V3F_C4B_T2F_Quad *quad)
|
|
||||||
{
|
|
||||||
if(nullptr != triangles.verts && isVertsOwner)
|
|
||||||
{
|
|
||||||
CC_SAFE_DELETE_ARRAY(triangles.verts);
|
|
||||||
}
|
|
||||||
|
|
||||||
if(nullptr != triangles.indices)
|
|
||||||
{
|
|
||||||
CC_SAFE_DELETE_ARRAY(triangles.indices);
|
|
||||||
}
|
|
||||||
|
|
||||||
isVertsOwner = false;
|
|
||||||
triangles.indices = new unsigned short[6]{0,1,2, 3,2,1};
|
|
||||||
triangles.vertCount = 4;
|
|
||||||
triangles.indexCount = 6;
|
|
||||||
triangles.verts = (V3F_C4B_T2F*)quad;
|
|
||||||
}
|
|
||||||
PolygonInfo& PolygonInfo::operator= (const PolygonInfo& other)
|
PolygonInfo& PolygonInfo::operator= (const PolygonInfo& other)
|
||||||
{
|
{
|
||||||
if(this != &other)
|
if(this != &other)
|
||||||
{
|
{
|
||||||
|
releaseVertsAndIndices();
|
||||||
filename = other.filename;
|
filename = other.filename;
|
||||||
isVertsOwner = other.isVertsOwner;
|
isVertsOwner = other.isVertsOwner;
|
||||||
rect = other.rect;
|
rect = other.rect;
|
||||||
|
@ -85,18 +70,38 @@ PolygonInfo& PolygonInfo::operator= (const PolygonInfo& other)
|
||||||
}
|
}
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
PolygonInfo::~PolygonInfo()
|
PolygonInfo::~PolygonInfo()
|
||||||
{
|
{
|
||||||
if(nullptr != triangles.verts && isVertsOwner)
|
releaseVertsAndIndices();
|
||||||
|
}
|
||||||
|
|
||||||
|
void PolygonInfo::setQuad(V3F_C4B_T2F_Quad *quad)
|
||||||
|
{
|
||||||
|
releaseVertsAndIndices();
|
||||||
|
isVertsOwner = false;
|
||||||
|
triangles.indices = quadIndices;
|
||||||
|
triangles.vertCount = 4;
|
||||||
|
triangles.indexCount = 6;
|
||||||
|
triangles.verts = (V3F_C4B_T2F*)quad;
|
||||||
|
}
|
||||||
|
|
||||||
|
void PolygonInfo::releaseVertsAndIndices()
|
||||||
|
{
|
||||||
|
if(isVertsOwner)
|
||||||
{
|
{
|
||||||
CC_SAFE_DELETE_ARRAY(triangles.verts);
|
if(nullptr != triangles.verts)
|
||||||
}
|
{
|
||||||
|
CC_SAFE_DELETE_ARRAY(triangles.verts);
|
||||||
if(nullptr != triangles.indices)
|
}
|
||||||
{
|
|
||||||
CC_SAFE_DELETE_ARRAY(triangles.indices);
|
if(nullptr != triangles.indices)
|
||||||
|
{
|
||||||
|
CC_SAFE_DELETE_ARRAY(triangles.indices);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const unsigned int PolygonInfo::getVertCount() const
|
const unsigned int PolygonInfo::getVertCount() const
|
||||||
{
|
{
|
||||||
return (unsigned int)triangles.vertCount;
|
return (unsigned int)triangles.vertCount;
|
||||||
|
@ -117,8 +122,6 @@ const float PolygonInfo::getArea() const
|
||||||
return area;
|
return area;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
AutoPolygon::AutoPolygon(const std::string &filename)
|
AutoPolygon::AutoPolygon(const std::string &filename)
|
||||||
:_image(nullptr)
|
:_image(nullptr)
|
||||||
,_data(nullptr)
|
,_data(nullptr)
|
||||||
|
@ -150,7 +153,6 @@ std::vector<Vec2> AutoPolygon::trace(const Rect& rect, const float& threshold)
|
||||||
|
|
||||||
Vec2 AutoPolygon::findFirstNoneTransparentPixel(const Rect& rect, const float& threshold)
|
Vec2 AutoPolygon::findFirstNoneTransparentPixel(const Rect& rect, const float& threshold)
|
||||||
{
|
{
|
||||||
Vec2 first(rect.origin);
|
|
||||||
bool found = false;
|
bool found = false;
|
||||||
Vec2 i;
|
Vec2 i;
|
||||||
for(i.y = rect.origin.y; i.y < rect.origin.y+rect.size.height; i.y++)
|
for(i.y = rect.origin.y; i.y < rect.origin.y+rect.size.height; i.y++)
|
||||||
|
@ -174,9 +176,9 @@ unsigned char AutoPolygon::getAlphaByIndex(const unsigned int& i)
|
||||||
{
|
{
|
||||||
return *(_data+i*4+3);
|
return *(_data+i*4+3);
|
||||||
}
|
}
|
||||||
unsigned char AutoPolygon::getAlphaByPos(const Vec2& i)
|
unsigned char AutoPolygon::getAlphaByPos(const Vec2& pos)
|
||||||
{
|
{
|
||||||
return *(_data+((int)i.y*_width+(int)i.x)*4+3);
|
return *(_data+((int)pos.y*_width+(int)pos.x)*4+3);
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned int AutoPolygon::getSquareValue(const unsigned int& x, const unsigned int& y, const Rect& rect, const float& threshold)
|
unsigned int AutoPolygon::getSquareValue(const unsigned int& x, const unsigned int& y, const Rect& rect, const float& threshold)
|
||||||
|
@ -193,9 +195,6 @@ unsigned int AutoPolygon::getSquareValue(const unsigned int& x, const unsigned i
|
||||||
//NOTE: due to the way we pick points from texture, rect needs to be smaller, otherwise it goes outside 1 pixel
|
//NOTE: due to the way we pick points from texture, rect needs to be smaller, otherwise it goes outside 1 pixel
|
||||||
auto fixedRect = Rect(rect.origin, rect.size-Size(2,2));
|
auto fixedRect = Rect(rect.origin, rect.size-Size(2,2));
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Vec2 tl = Vec2(x-1, y-1);
|
Vec2 tl = Vec2(x-1, y-1);
|
||||||
sv += (fixedRect.containsPoint(tl) && getAlphaByPos(tl) > threshold)? 1 : 0;
|
sv += (fixedRect.containsPoint(tl) && getAlphaByPos(tl) > threshold)? 1 : 0;
|
||||||
Vec2 tr = Vec2(x, y-1);
|
Vec2 tr = Vec2(x, y-1);
|
||||||
|
@ -485,7 +484,6 @@ std::vector<Vec2> AutoPolygon::expand(const std::vector<Vec2>& points, const coc
|
||||||
co.AddPath(subj, ClipperLib::jtMiter, ClipperLib::etClosedPolygon);
|
co.AddPath(subj, ClipperLib::jtMiter, ClipperLib::etClosedPolygon);
|
||||||
co.Execute(solution, epsilon);
|
co.Execute(solution, epsilon);
|
||||||
|
|
||||||
|
|
||||||
ClipperLib::PolyNode* p = solution.GetFirst();
|
ClipperLib::PolyNode* p = solution.GetFirst();
|
||||||
if(!p)
|
if(!p)
|
||||||
{
|
{
|
||||||
|
@ -499,7 +497,7 @@ std::vector<Vec2> AutoPolygon::expand(const std::vector<Vec2>& points, const coc
|
||||||
//turn the result into simply polygon (AKA, fix overlap)
|
//turn the result into simply polygon (AKA, fix overlap)
|
||||||
|
|
||||||
//clamp into the specified rect
|
//clamp into the specified rect
|
||||||
ClipperLib::Clipper cl= ClipperLib::Clipper();
|
ClipperLib::Clipper cl;
|
||||||
cl.StrictlySimple(true);
|
cl.StrictlySimple(true);
|
||||||
cl.AddPath(p->Contour, ClipperLib::ptSubject, true);
|
cl.AddPath(p->Contour, ClipperLib::ptSubject, true);
|
||||||
//create the clipping rect
|
//create the clipping rect
|
||||||
|
@ -524,11 +522,6 @@ std::vector<Vec2> AutoPolygon::expand(const std::vector<Vec2>& points, const coc
|
||||||
return outPoints;
|
return outPoints;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool AutoPolygon::isAConvexPoint(const cocos2d::Vec2& p1, const cocos2d::Vec2& p2)
|
|
||||||
{
|
|
||||||
return p1.cross(p2) >0 ? true : false;
|
|
||||||
}
|
|
||||||
|
|
||||||
TrianglesCommand::Triangles AutoPolygon::triangulate(const std::vector<Vec2>& points)
|
TrianglesCommand::Triangles AutoPolygon::triangulate(const std::vector<Vec2>& points)
|
||||||
{
|
{
|
||||||
// if there are less than 3 points, then we can't triangulate
|
// if there are less than 3 points, then we can't triangulate
|
||||||
|
|
|
@ -55,10 +55,14 @@ public:
|
||||||
* @return PolygonInfo object
|
* @return PolygonInfo object
|
||||||
*/
|
*/
|
||||||
PolygonInfo():
|
PolygonInfo():
|
||||||
triangles(),
|
|
||||||
isVertsOwner(true),
|
isVertsOwner(true),
|
||||||
rect()
|
rect(cocos2d::Rect::ZERO),
|
||||||
|
filename("")
|
||||||
{
|
{
|
||||||
|
triangles.verts = nullptr;
|
||||||
|
triangles.indices = nullptr;
|
||||||
|
triangles.vertCount = 0;
|
||||||
|
triangles.indexCount = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -84,11 +88,7 @@ public:
|
||||||
* @param quad a pointer to the V3F_C4B_T2F_Quad obje
|
* @param quad a pointer to the V3F_C4B_T2F_Quad obje
|
||||||
*/
|
*/
|
||||||
void setQuad(V3F_C4B_T2F_Quad *quad);
|
void setQuad(V3F_C4B_T2F_Quad *quad);
|
||||||
|
|
||||||
Rect rect;
|
|
||||||
std::string filename;
|
|
||||||
TrianglesCommand::Triangles triangles;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* get vertex count
|
* get vertex count
|
||||||
* @return number of vertices
|
* @return number of vertices
|
||||||
|
@ -101,8 +101,15 @@ public:
|
||||||
*/
|
*/
|
||||||
const float getArea() const;
|
const float getArea() const;
|
||||||
|
|
||||||
|
Rect rect;
|
||||||
|
std::string filename;
|
||||||
|
TrianglesCommand::Triangles triangles;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
bool isVertsOwner;
|
bool isVertsOwner;
|
||||||
|
|
||||||
|
private:
|
||||||
|
void releaseVertsAndIndices();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -238,7 +245,7 @@ protected:
|
||||||
unsigned int getSquareValue(const unsigned int& x, const unsigned int& y, const Rect& rect, const float& threshold);
|
unsigned int getSquareValue(const unsigned int& x, const unsigned int& y, const Rect& rect, const float& threshold);
|
||||||
|
|
||||||
unsigned char getAlphaByIndex(const unsigned int& i);
|
unsigned char getAlphaByIndex(const unsigned int& i);
|
||||||
unsigned char getAlphaByPos(const Vec2& i);
|
unsigned char getAlphaByPos(const Vec2& pos);
|
||||||
|
|
||||||
int getIndexFromPos(const unsigned int& x, const unsigned int& y){return y*_width+x;};
|
int getIndexFromPos(const unsigned int& x, const unsigned int& y){return y*_width+x;};
|
||||||
cocos2d::Vec2 getPosFromIndex(const unsigned int& i){return cocos2d::Vec2(i%_width, i/_width);};
|
cocos2d::Vec2 getPosFromIndex(const unsigned int& i){return cocos2d::Vec2(i%_width, i/_width);};
|
||||||
|
@ -246,7 +253,6 @@ protected:
|
||||||
std::vector<cocos2d::Vec2> rdp(std::vector<cocos2d::Vec2> v, const float& optimization);
|
std::vector<cocos2d::Vec2> rdp(std::vector<cocos2d::Vec2> v, const float& optimization);
|
||||||
float perpendicularDistance(const cocos2d::Vec2& i, const cocos2d::Vec2& start, const cocos2d::Vec2& end);
|
float perpendicularDistance(const cocos2d::Vec2& i, const cocos2d::Vec2& start, const cocos2d::Vec2& end);
|
||||||
|
|
||||||
bool isAConvexPoint(const cocos2d::Vec2& p1, const cocos2d::Vec2& p2);
|
|
||||||
//real rect is the size that is in scale with the texture file
|
//real rect is the size that is in scale with the texture file
|
||||||
Rect getRealRect(const Rect& rect);
|
Rect getRealRect(const Rect& rect);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue