fixed anchor point issue, removed rect rotated property

This commit is contained in:
WuHao 2015-04-24 18:17:12 +08:00
parent 0e318dd8dc
commit 5620da1adf
6 changed files with 56 additions and 61 deletions

View File

@ -105,8 +105,6 @@ void MarchingSquare::marchSquare(int startx, int starty)
int prevy = 0; int prevy = 0;
int curx = startx; int curx = startx;
int cury = starty; int cury = starty;
float halfWidth = width/2.0;
float halfHeight = height/2.0;
unsigned int count = 0; unsigned int count = 0;
unsigned int totalPixel = width*height; unsigned int totalPixel = width*height;
bool problem = false; bool problem = false;
@ -249,8 +247,8 @@ void MarchingSquare::marchSquare(int startx, int starty)
cury += stepy; cury += stepy;
if(stepx == prevx && stepy == prevy) if(stepx == prevx && stepy == prevy)
{ {
points.back().x = (float)(curx-halfWidth) / scaleFactor; points.back().x = (float)(curx) / scaleFactor;
points.back().y = (float)(height-cury-halfHeight) / scaleFactor; points.back().y = (float)(height-cury) / scaleFactor;
} }
else if(problem) else if(problem)
{ {
@ -258,10 +256,10 @@ void MarchingSquare::marchSquare(int startx, int starty)
//TODO: maybe we can detect if we go into a hole and coming back the hole, we should extract those points and remove them //TODO: maybe we can detect if we go into a hole and coming back the hole, we should extract those points and remove them
points.back().x -= 0.00001; points.back().x -= 0.00001;
points.back().y -= 0.00001; points.back().y -= 0.00001;
points.push_back(Vec2((float)curx-halfWidth, (float)height-cury-halfHeight)/ scaleFactor); points.push_back(Vec2((float)curx, (float)height-cury)/ scaleFactor);
} }
else{ else{
points.push_back(Vec2((float)curx-halfWidth, (float)height-cury-halfHeight)/ scaleFactor); points.push_back(Vec2((float)curx, (float)height-cury)/ scaleFactor);
} }
count++; count++;

View File

@ -61,10 +61,10 @@ SpritePolygon *SpritePolygon::create(const std::string& file, std::vector<cocos2
return nullptr; return nullptr;
} }
} }
SpritePolygon *SpritePolygon::create(const std::string& file, std::vector<cocos2d::Vec2>& verts,std::vector<unsigned short>& indices, const cocos2d::Rect& rect, bool rotated) SpritePolygon *SpritePolygon::create(const std::string& file, std::vector<cocos2d::Vec2>& verts,std::vector<unsigned short>& indices, const cocos2d::Rect& rect)
{ {
SpritePolygon *ret = new (std::nothrow) SpritePolygon(); SpritePolygon *ret = new (std::nothrow) SpritePolygon();
if (ret && ret->initWithRect(file, verts, indices, rect, rotated)) if (ret && ret->initWithRect(file, verts, indices, rect))
{ {
ret->autorelease(); ret->autorelease();
return ret; return ret;
@ -75,7 +75,7 @@ SpritePolygon *SpritePolygon::create(const std::string& file, std::vector<cocos2
return nullptr; return nullptr;
} }
} }
SpritePolygon *SpritePolygon::create(const std::string& file, std::vector<cocos2d::Vec2>& verts, const cocos2d::Rect& rect, bool rotated) SpritePolygon *SpritePolygon::create(const std::string& file, std::vector<cocos2d::Vec2>& verts, const cocos2d::Rect& rect)
{ {
SpritePolygon *ret = new (std::nothrow) SpritePolygon(); SpritePolygon *ret = new (std::nothrow) SpritePolygon();
if (ret) if (ret)
@ -115,7 +115,7 @@ SpritePolygon *SpritePolygon::create(const std::string &file, const cocos2d::Rec
} }
void SpritePolygon::calculateUV() void SpritePolygon::calculateUVandContentSize()
{ {
/* /*
whole texture UV coordination whole texture UV coordination
@ -142,6 +142,8 @@ void SpritePolygon::calculateUV()
// the texture rect in pixels, for example, an image is 32x32 pixels // the texture rect in pixels, for example, an image is 32x32 pixels
Rect* textRect = &_polygonInfo->_rect; Rect* textRect = &_polygonInfo->_rect;
bool needDelete = false; bool needDelete = false;
if(textRect->equals(Rect::ZERO)) if(textRect->equals(Rect::ZERO))
{ {
@ -149,23 +151,19 @@ void SpritePolygon::calculateUV()
textRect = new Rect(0,0, texWidth, texHeight); textRect = new Rect(0,0, texWidth, texHeight);
needDelete = true; needDelete = true;
} }
setContentSize(textRect->size);
// find center point of the texture rect, as all vertices refers to this point
Vec2 center = Vec2(textRect->size.width/2 + textRect->origin.x, textRect->size.height/2 + textRect->origin.y);
auto end = &_polygonInfo->_triangles.verts[_polygonInfo->_triangles.vertCount]; auto end = &_polygonInfo->_triangles.verts[_polygonInfo->_triangles.vertCount];
for(auto i = _polygonInfo->_triangles.verts; i != end; i++) for(auto i = _polygonInfo->_triangles.verts; i != end; i++)
{ {
// for every point, offset with the centerpoint // for every point, offset with the centerpoint
float u = (i->vertices.x + center.x) / texWidth; float u = i->vertices.x / texWidth;
float v = (texHeight - i->vertices.y - center.y) / texHeight; float v = (texHeight - i->vertices.y) / texHeight;
i->texCoords.u = u; i->texCoords.u = u;
i->texCoords.v = v; i->texCoords.v = v;
// CCLOG("%f, %f",u,v);
} }
if(needDelete) if(needDelete)
delete textRect; delete textRect;
} }
@ -184,16 +182,7 @@ TrianglesCommand::Triangles SpritePolygon::triangulate(std::vector<cocos2d::Vec2
vector<V3F_C4B_T2F> *_verts = new vector<V3F_C4B_T2F>(); vector<V3F_C4B_T2F> *_verts = new vector<V3F_C4B_T2F>();
vector<unsigned short> *_indices = new vector<unsigned short>; vector<unsigned short> *_indices = new vector<unsigned short>;
auto bb = setContentSizeFromVecs(verts);
// auto bb = Rect(_textureRect);
// bb.origin.x = -bb.size.width/2;
// bb.origin.y = -bb.size.height/2;
unsigned short idx = 0; unsigned short idx = 0;
auto texture = _texture;
auto textureWidth = (float)texture->getPixelsWide();
auto textureHeight = (float)texture->getPixelsHigh();
// auto scaledRect = CC_RECT_POINTS_TO_PIXELS(Rect(0,0, bb.size.width, bb.size.height));
auto scaledRect =Rect(0,0, bb.size.width, bb.size.height);
for(std::vector<p2t::Triangle*>::const_iterator ite = tris.begin(); ite < tris.end(); ite++) for(std::vector<p2t::Triangle*>::const_iterator ite = tris.begin(); ite < tris.end(); ite++)
{ {
for(int i = 0; i < 3; i++) for(int i = 0; i < 3; i++)
@ -219,16 +208,11 @@ TrianglesCommand::Triangles SpritePolygon::triangulate(std::vector<cocos2d::Vec2
{ {
//vert does not exist yet, so we need to create a new one, //vert does not exist yet, so we need to create a new one,
auto c4b = Color4B::WHITE; auto c4b = Color4B::WHITE;
auto u = (scaledRect.origin.x + scaledRect.size.width* (p->x - bb.origin.x)/_contentSize.width)/textureWidth; auto t2f = Tex2F(0,0);
auto v = (scaledRect.origin.y + scaledRect.size.height* (p->y - bb.origin.y)/_contentSize.height)/textureHeight;
auto t2f = Tex2F(u,1-v);
_verts->push_back(V3F_C4B_T2F{v3,c4b,t2f}); _verts->push_back(V3F_C4B_T2F{v3,c4b,t2f});
_indices->push_back(idx); _indices->push_back(idx);
idx++; idx++;
} }
} }
} }
for(auto j : points) for(auto j : points)
@ -257,13 +241,8 @@ bool SpritePolygon::initWithMarching(const std::string &file, const cocos2d::Rec
{ {
CCASSERT(file.size()>0, "Invalid filename for sprite"); CCASSERT(file.size()>0, "Invalid filename for sprite");
Texture2D *texture = Director::getInstance()->getTextureCache()->addImage(file); Texture2D *texture = Director::getInstance()->getTextureCache()->addImage(file);
if (texture) CCASSERT(texture, "texture was not loaded properly");
{
initWithTexture(texture, rect); initWithTexture(texture, rect);
}
else{
throw "some error";
}
optimization = (optimization < 0)? (float)texture->getPixelsHigh()*(float)texture->getPixelsWide()*0.00015/Director::getInstance()->getContentScaleFactor() : optimization/Director::getInstance()->getContentScaleFactor(); optimization = (optimization < 0)? (float)texture->getPixelsHigh()*(float)texture->getPixelsWide()*0.00015/Director::getInstance()->getContentScaleFactor() : optimization/Director::getInstance()->getContentScaleFactor();
//Marching Square //Marching Square
@ -271,10 +250,10 @@ bool SpritePolygon::initWithMarching(const std::string &file, const cocos2d::Rec
marcher->trace(); marcher->trace();
marcher->optimize(optimization); marcher->optimize(optimization);
// marcher->printPoints();
auto p = marcher->getPoints(); auto p = marcher->getPoints();
auto calculatedRect = setContentSizeFromVecs(p); // auto calculatedRect = setContentSizeFromVecs(p);
auto _textureRect = Rect(rect.origin.x,rect.origin.y,calculatedRect.size.width, calculatedRect.size.height); // auto _textureRect = Rect(rect.origin.x,rect.origin.y,calculatedRect.size.width, calculatedRect.size.height);
auto _triangles = triangulate(p); auto _triangles = triangulate(p);
delete marcher; delete marcher;
@ -283,20 +262,18 @@ bool SpritePolygon::initWithMarching(const std::string &file, const cocos2d::Rec
//save result to cache //save result to cache
SpritePolygonInfo *info = new SpritePolygonInfo(); SpritePolygonInfo *info = new SpritePolygonInfo();
info->_rect = rect; info->_rect = rect;
// info->_vertRect = _textureRect;
info->_triangles = _triangles; info->_triangles = _triangles;
_polygonInfo = SpritePolygonCache::getInstance()->addSpritePolygonCache(file, *info); _polygonInfo = SpritePolygonCache::getInstance()->addSpritePolygonCache(file, *info);
calculateUV(); calculateUVandContentSize();
// _polygonInfo = info;
delete _triangles.verts; delete _triangles.verts;
delete _triangles.indices; delete _triangles.indices;
#if CC_SPRITE_DEBUG_DRAW #if CC_SPRITE_DEBUG_DRAW
debugDraw(); debugDraw();
#endif #endif
// SpritePolygonCache::printInfo(*info);
return true; return true;
} }
bool SpritePolygon::initWithPoly2tri(const std::string &filename, std::vector<cocos2d::Vec2> & verts, const cocos2d::Rect &Rect, bool rotated) bool SpritePolygon::initWithPoly2tri(const std::string &filename, std::vector<cocos2d::Vec2> & verts, const cocos2d::Rect &Rect)
{ {
CCASSERT(filename.size()>0, "Invalid filename for sprite"); CCASSERT(filename.size()>0, "Invalid filename for sprite");
Texture2D *texture = Director::getInstance()->getTextureCache()->addImage(filename); Texture2D *texture = Director::getInstance()->getTextureCache()->addImage(filename);
@ -405,10 +382,9 @@ Rect SpritePolygon::setContentSizeFromVecs(std::vector<cocos2d::Vec2>& verts)
setContentSize(Size(width, height)); setContentSize(Size(width, height));
return Rect(left,bot,width,height); return Rect(left,bot,width,height);
} }
bool SpritePolygon::initWithRect(const std::string& filename, std::vector<cocos2d::Vec2>& verts, std::vector<unsigned short>& indices, const cocos2d::Rect& rect, bool rotated) bool SpritePolygon::initWithRect(const std::string& filename, std::vector<cocos2d::Vec2>& verts, std::vector<unsigned short>& indices, const cocos2d::Rect& rect)
{ {
CCASSERT(filename.size()>0, "Invalid filename for sprite"); CCASSERT(filename.size()>0, "Invalid filename for sprite");
_rectRotated = rotated;
Texture2D *texture = Director::getInstance()->getTextureCache()->addImage(filename); Texture2D *texture = Director::getInstance()->getTextureCache()->addImage(filename);
if (texture) if (texture)
{ {
@ -455,7 +431,7 @@ bool SpritePolygon::initWithTexture(Texture2D *texture, const Rect &rect)
setTexture(texture); setTexture(texture);
// _textureRect = (rect.equals(Rect::ZERO))? Rect(0,0,texture->getPixelsWide(), texture->getPixelsHigh()) : rect; // _textureRect = (rect.equals(Rect::ZERO))? Rect(0,0,texture->getPixelsWide(), texture->getPixelsHigh()) : rect;
setAnchorPoint(Vec2(0.5,0.5));
return true; return true;
} }

View File

@ -47,12 +47,12 @@ public:
bool initWithVerts(const std::string&, std::vector<cocos2d::V3F_C4B_T2F>&, std::vector<unsigned short>&); bool initWithVerts(const std::string&, std::vector<cocos2d::V3F_C4B_T2F>&, std::vector<unsigned short>&);
//create from list of vertices, with texture rect, and triangle indices, UV is calculated from the texture rect //create from list of vertices, with texture rect, and triangle indices, UV is calculated from the texture rect
static SpritePolygon *create(const std::string&, std::vector<cocos2d::Vec2>&, std::vector<unsigned short>&, const cocos2d::Rect& rect = cocos2d::Rect::ZERO, bool rotated = false); static SpritePolygon *create(const std::string&, std::vector<cocos2d::Vec2>&, std::vector<unsigned short>&, const cocos2d::Rect& rect = cocos2d::Rect::ZERO);
bool initWithRect(const std::string&, std::vector<cocos2d::Vec2>&, std::vector<unsigned short>&, const cocos2d::Rect&, bool); bool initWithRect(const std::string&, std::vector<cocos2d::Vec2>&, std::vector<unsigned short>&, const cocos2d::Rect&);
// //create from ordered list of vertices, with texture rect, and rotated property, Triangles and UV is calculated on the fly // //create from ordered list of vertices, with texture rect, Triangles and UV is calculated on the fly
static SpritePolygon *create(const std::string&, std::vector<cocos2d::Vec2>&, const cocos2d::Rect& rect = cocos2d::Rect::ZERO, bool rotated = false); static SpritePolygon *create(const std::string&, std::vector<cocos2d::Vec2>&, const cocos2d::Rect& rect = cocos2d::Rect::ZERO);
bool initWithPoly2tri(const std::string&, std::vector<cocos2d::Vec2>&, const cocos2d::Rect&, bool); bool initWithPoly2tri(const std::string&, std::vector<cocos2d::Vec2>&, const cocos2d::Rect&);
//create from a texture (rect), and automatically trace and optimize the points. //create from a texture (rect), and automatically trace and optimize the points.
//not recommended for production, its better to use the vec2 list for better performance //not recommended for production, its better to use the vec2 list for better performance
@ -76,10 +76,9 @@ protected:
cocos2d::DrawNode *_debugDrawNode; cocos2d::DrawNode *_debugDrawNode;
void debugDraw(); void debugDraw();
void calculateUV(); void calculateUVandContentSize();
bool _triangleDirty; //if triangle is dirty, then it needs to be recalculated from verts and indices bool _triangleDirty; //if triangle is dirty, then it needs to be recalculated from verts and indices
bool _rectRotated;
// std::vector<cocos2d::V3F_C4B_T2F> _verts; // std::vector<cocos2d::V3F_C4B_T2F> _verts;
// std::vector<unsigned short> _indices; // std::vector<unsigned short> _indices;
cocos2d::TrianglesCommand _tcmd; cocos2d::TrianglesCommand _tcmd;

View File

@ -152,7 +152,7 @@ void SpritePolygonCache::removeSpritePolygonCache(const std::string& filePath,
auto infoIter = it->second.begin(); auto infoIter = it->second.begin();
for (; infoIter != it->second.end(); infoIter++) for (; infoIter != it->second.end(); infoIter++)
{ {
//TODO: write clean up code...
} }
return; return;
@ -160,7 +160,12 @@ void SpritePolygonCache::removeSpritePolygonCache(const std::string& filePath,
void SpritePolygonCache::removeAllSpritePolygonCache() void SpritePolygonCache::removeAllSpritePolygonCache()
{ {
for (std::unordered_map<std::string, VecSpritePolygonInfo>::iterator it = _SpritePolygonCacheMap.begin(); it != _SpritePolygonCacheMap.end(); ++it)
{
//TODO: write clean up code...
it->second.clear();
}
_SpritePolygonCacheMap.clear();
} }
bool SpritePolygonCache::isSpritePolygonCachExist(const std::string& filePath, const cocos2d::Rect& rect) bool SpritePolygonCache::isSpritePolygonCachExist(const std::string& filePath, const cocos2d::Rect& rect)

View File

@ -15,6 +15,7 @@ USING_NS_CC;
SpritePolygonTest::SpritePolygonTest() SpritePolygonTest::SpritePolygonTest()
{ {
ADD_TEST_CASE(SpritePolygonTest1); ADD_TEST_CASE(SpritePolygonTest1);
ADD_TEST_CASE(SpritePolygonTest2);
} }
void SpritePolygonTestDemo::initDefaultSprite(const std::string &filename, cocos2d::experimental::SpritePolygon * inst) void SpritePolygonTestDemo::initDefaultSprite(const std::string &filename, cocos2d::experimental::SpritePolygon * inst)
{ {
@ -88,6 +89,16 @@ void SpritePolygonTestDemo::onBackCallback(cocos2d::Ref *sender)
SpritePolygonTest1::SpritePolygonTest1() SpritePolygonTest1::SpritePolygonTest1()
{ {
SpritePolygonCache::getInstance()->removeAllSpritePolygonCache();
_title = "SpritePolygon Creation";
_subtitle = "SpritePolygon::create(\"Images/grossini.png\")";
auto s = experimental::SpritePolygon::create(s_pathGrossini);
initDefaultSprite(s_pathGrossini, s);
}
SpritePolygonTest2::SpritePolygonTest2()
{
SpritePolygonCache::getInstance()->removeAllSpritePolygonCache();
_title = "SpritePolygon Creation"; _title = "SpritePolygon Creation";
_subtitle = "SpritePolygon::create(\"Images/grossini.png\")"; _subtitle = "SpritePolygon::create(\"Images/grossini.png\")";
auto s = experimental::SpritePolygon::create(s_pathGrossini); auto s = experimental::SpritePolygon::create(s_pathGrossini);

View File

@ -24,7 +24,13 @@ class SpritePolygonTest1 : public SpritePolygonTestDemo
public: public:
CREATE_FUNC(SpritePolygonTest1); CREATE_FUNC(SpritePolygonTest1);
SpritePolygonTest1(); SpritePolygonTest1();
};
class SpritePolygonTest2 : public SpritePolygonTestDemo
{
public:
CREATE_FUNC(SpritePolygonTest2);
SpritePolygonTest2();
}; };
#endif /* defined(__cocos2d_tests__SpritePolygonTest__) */ #endif /* defined(__cocos2d_tests__SpritePolygonTest__) */