26#include "../testResource.h"
27#include "ui/CocosGUI.h"
31SpritePolygonTest::SpritePolygonTest()
61 Director::getInstance()->setClearColor(Color4F(102.0f/255.0f, 184.0f/255.0f, 204.0f/255.0f, 1.0f));
66 Director::getInstance()->setClearColor(Color4F::BLACK);
76 TTFConfig ttfConfig(
"fonts/arial.ttf", 10);
77 auto label = Label::createWithTTF(ttfConfig,
"DebugDraw OFF");
78 auto menuItem = MenuItemLabel::create(label, [=](Ref *ref){
81 label->setString(
"DebugDraw ON");
88 label->setString(
"DebugDraw OFF");
97 auto menu = Menu::create(menuItem,
nullptr);
98 menu->setPosition(Vec2::ZERO);
99 menuItem->setAnchorPoint(Vec2::ANCHOR_TOP_LEFT);
101 this->addChild(menu, 9999);
114 auto sp = (Sprite*)drawnode->getParent();
116 const auto& polygoninfo = sp->getPolygonInfo();
118 const auto count = polygoninfo.triangles.indexCount/3;
119 const auto indices = polygoninfo.triangles.indices;
120 const auto verts = polygoninfo.triangles.verts;
121 for(ssize_t i = 0; i < count; i++)
124 Vec3 from = verts[indices[i*3]].vertices;
125 Vec3 to = verts[indices[i*3+1]].vertices;
126 drawnode->drawLine(Vec2(from.x, from.y), Vec2(to.x,to.y), Color4F::GREEN);
128 from = verts[indices[i*3+1]].vertices;
129 to = verts[indices[i*3+2]].vertices;
130 drawnode->drawLine(Vec2(from.x, from.y), Vec2(to.x,to.y), Color4F::GREEN);
132 from = verts[indices[i*3+2]].vertices;
133 to = verts[indices[i*3]].vertices;
134 drawnode->drawLine(Vec2(from.x, from.y), Vec2(to.x,to.y), Color4F::GREEN);
154 auto touchListener = EventListenerTouchOneByOne::create();
155 touchListener->onTouchBegan = [&](Touch* touch, Event* event){
158 touchListener->onTouchMoved = [&](Touch* touch, Event* event){
159 auto pos = touch->getDelta();
160 float newScale = clampf(
_polygonSprite->getScale() + pos.x * 0.01f, 0.1f, 2.f);
165 _eventDispatcher->addEventListenerWithSceneGraphPriority(touchListener,
this);
171 _title =
"SpritePolygon Creation";
172 _subtitle =
"Sprite::create(AutoPolygon::generatePolygon(filename))";
177 auto s = Director::getInstance()->getWinSize();
178 auto offset = Vec2(0.15*s.width,0);
182 auto pinfo = AutoPolygon::generatePolygon(filename);
194 auto spDrawNode = DrawNode::create();
200 auto sppDrawNode = DrawNode::create();
202 sppDrawNode->clear();
207 TTFConfig ttfConfig(
"fonts/arial.ttf", 8);
208 std::string temp =
"Sprite:\nPixels drawn: ";
210 auto spArea = Label::createWithTTF(ttfConfig, temp+Value((
int)spSize.width*(
int)spSize.height).asString());
212 spArea->setAnchorPoint(Vec2(0,1));
214 temp =
"SpritePolygon:\nPixels drawn: ";
215 auto vertCount =
"\nverts:"+Value((
int)pinfo.getVertCount()).asString();
216 auto sppArea = Label::createWithTTF(ttfConfig, temp+Value((
int)pinfo.getArea()).asString()+vertCount);
218 sppArea->setAnchorPoint(Vec2(0,1));
225 _title =
"SpritePolygon Creation with a rect";
226 _subtitle =
"Sprite::create(AutoPolygon::generatePolygon(filename, rect))";
231 auto s = Director::getInstance()->getWinSize();
232 auto offset = Vec2(0.15*s.width,0);
234 Rect head = Rect(30,25,25,25);
237 auto pinfo = AutoPolygon::generatePolygon(filename, head);
249 auto spDrawNode = DrawNode::create();
255 auto sppDrawNode = DrawNode::create();
258 sppDrawNode->clear();
262 TTFConfig ttfConfig(
"fonts/arial.ttf", 8);
263 std::string temp =
"Sprite:\nPixels drawn: ";
265 auto spArea = Label::createWithTTF(ttfConfig, temp+Value((
int)spSize.width*(
int)spSize.height).asString());
267 spArea->setAnchorPoint(Vec2(0,1));
269 temp =
"SpritePolygon:\nPixels drawn: ";
270 auto vertCount =
"\nverts:"+Value((
int)pinfo.getVertCount()).asString();
271 auto sppArea = Label::createWithTTF(ttfConfig, temp+Value((
int)pinfo.getArea()).asString()+vertCount);
273 sppArea->setAnchorPoint(Vec2(0,1));
291 auto vsize =Director::getInstance()->getVisibleSize();
292 cocos2d::ui::Slider* slider = cocos2d::ui::Slider::create();
293 slider->loadBarTexture(
"cocosui/sliderTrack.png");
294 slider->loadSlidBallTextures(
"cocosui/sliderThumb.png",
"cocosui/sliderThumb.png",
"");
295 slider->loadProgressBarTexture(
"cocosui/sliderProgress.png");
296 slider->setPosition(Vec2(vsize.width/2, vsize.height/4));
298 auto ttfConfig = TTFConfig(
"fonts/arial.ttf", 8);
299 _epsilonLabel = Label::createWithTTF(ttfConfig,
"Epsilon: 2.0");
301 _epsilonLabel->setPosition(Vec2(vsize.width/2, vsize.height/4 + 15));
305 slider->setPercent((
int)(sqrtf(1.0f/19.0f)*100));
311 auto vsize = Director::getInstance()->getVisibleSize();
312 for(
int i = 0; i < count; i++)
314 float offset = (vsize.width/(count+1)) * (i+1);
315 auto sp =
makeSprite(list[i], Vec2(offset, y));
322 if (type == cocos2d::ui::Slider::EventType::ON_PERCENTAGE_CHANGED)
324 cocos2d::ui::Slider* slider =
dynamic_cast<cocos2d::ui::Slider*
>(pSender);
325 float epsilon = powf(slider->getPercent()/100.0,2)*19.0f + 1.0f;
326 for(
auto child : _children)
328 if(child->getName().size())
330 Sprite *sp = (Sprite*)child;
331 auto file = sp->getName();
332 auto pinfo = AutoPolygon::generatePolygon(file, Rect::ZERO, epsilon);
333 sp->setPolygonInfo(pinfo);
337 _epsilonLabel->setString(
"Epsilon: "+ Value(epsilon).asString());
344 Label *label = (Label*)(sp->getChildByName(sp->getName()));
345 auto filename = sp->getName();
346 auto size = pinfo.getRect().size/Director::getInstance()->getContentScaleFactor();
347 label->setString(filename+
"\nVerts: "+Value((
int)pinfo.getVertCount()).asString()+
"\nPixels: "+Value((
int)(pinfo.getArea()/(size.width*size.height)*100)).asString()+
"%");
353 auto quadSize = Sprite::create(filename)->getContentSize();
354 int originalSize = quadSize.width * quadSize.height;
355 auto pinfo = AutoPolygon::generatePolygon(filename);
356 auto ret = Sprite::create(pinfo);
357 ret->setName(filename);
360 ret->setPosition(pos);
363 auto drawNode = DrawNode::create();
365 drawNode->setTag(ret->getTag());
367 ret->addChild(drawNode);
370 auto ttfConfig = TTFConfig(
"fonts/arial.ttf", 8);
371 auto spArea = Label::createWithTTF(ttfConfig, filename+
"\nVerts: "+Value((
int)pinfo.getVertCount()).asString()+
"\nPixels: "+Value((
int)(pinfo.getArea()/originalSize*100)).asString()+
"%");
372 ret->addChild(spArea);
373 spArea->setAnchorPoint(Vec2(0.0f,1.0f));
374 spArea->setName(filename);
375 ret->setAnchorPoint(Vec2(0.5f, 0.0f));
384 _title =
"Optimization Value (default:2.0)";
391 auto vsize =Director::getInstance()->getVisibleSize();
392 std::string list[] = {
394 "Images/CyanTriangle.png",
396 "Images/elephant1_Diffuse.png"
398 int count =
sizeof(list)/
sizeof(list[0]);
404 _title =
"Optimization Value (default:2.0)";
411 auto vsize =Director::getInstance()->getVisibleSize();
413 std::string list[] = {
415 "Images/grossinis_sister1.png",
416 "Images/grossinis_sister2.png"
423 _title =
"SpritePolygon Actions";
424 _subtitle =
"Touch screen to add sprite with random action.";
443 auto touchListener = EventListenerTouchOneByOne::create();
444 touchListener->onTouchBegan = [&](Touch* touch, Event* event){
447 touchListener->onTouchEnded = [&](Touch* touch, Event* event){
448 auto pos = touch->getLocation();
451 _eventDispatcher->addEventListenerWithSceneGraphPriority(touchListener,
this);
456 auto s = Director::getInstance()->getVisibleSize();
458 const int DEFAULT_SPRITEPOLYGON_COUNT = 8;
459 Sprite* sprites[DEFAULT_SPRITEPOLYGON_COUNT];
461 for (
int i = 0; i < DEFAULT_SPRITEPOLYGON_COUNT; i++) {
465 sprites[i]->setPosition(s.width * CCRANDOM_0_1(), s.height * CCRANDOM_0_1());
466 this->addChild(sprites[i]);
467 auto drawNode = DrawNode::create();
469 drawNode->setTag(sprites[i]->getTag());
471 sprites[i]->addChild(drawNode);
473 sprites[0]->setColor(Color3B::RED);
474 sprites[1]->setOpacity(100);
475 sprites[2]->setTexture(Director::getInstance()->getTextureCache()->addImage(
"Images/grossinis_sister1.png"));
476 sprites[3]->setTextureRect(Rect(0.0f,0.0f,100.0f,30.0f));
477 sprites[4]->setScale(0.5f, 2.0f);
478 sprites[5]->setFlippedY(
true);
479 sprites[6]->setSkewX(60);
480 sprites[7]->setRotation(90);
490 sprite->setPosition(pos);
491 this->addChild(sprite);
492 auto drawNode = DrawNode::create();
494 drawNode->setTag(sprite->getTag());
496 sprite->addChild(drawNode);
498 ActionInterval* action;
499 float random = CCRANDOM_0_1();
501 action = ScaleBy::create(3, 2);
502 else if(random < 0.40)
503 action = RotateBy::create(3, 360);
504 else if( random < 0.60)
505 action = Blink::create(1, 3);
506 else if( random < 0.8 )
507 action = TintBy::create(2, 0, -255, -255);
509 action = FadeOut::create(2);
510 auto seq = Sequence::create( action, action->reverse(),
nullptr );
511 sprite->runAction(RepeatForever::create(seq));
521 TTFConfig ttfConfig(
"fonts/arial.ttf", 10);
522 _perfLabel = Label::createWithTTF(ttfConfig,
"performance test");
524 _perfLabel->setPosition(Director::getInstance()->getVisibleSize().width/2, 80);
527 auto size = Director::getInstance()->getVisibleSize();
531 _posY = size.height/2;
568 int loops = (0.025-dt)*1000;
569 if(dt < 0.025 && loops>0)
581 for(
int i = 0; i < loops; i++)
635 _title =
"Dynamic SpritePolygon Performance";
636 _subtitle =
"Test running, please wait until it ends";
641 auto ret = Sprite::create(
_pinfo);
642 ret->runAction(RepeatForever::create(RotateBy::create(1.0f,360.0f)));
648 _title =
"Dynamic Sprite Performance";
649 _subtitle =
"Test running, please wait until it ends";
657 _incPix = t->getContentSize().width * t->getContentSize().height;
663 ret->runAction(RepeatForever::create(RotateBy::create(1.0f,360.0f)));
672 _title =
"SpritePolygon ";
673 _subtitle =
"AutoPolygon: should not crash";
678 auto s = Director::getInstance()->getWinSize();
679 auto pinfo = AutoPolygon::generatePolygon(
"Images/sprite_polygon_crash.png", Rect::ZERO, 1);
680 auto sprite = Sprite::create(pinfo);
682 sprite->setPosition(s.width/2, s.height/2);
685 auto spDrawNode = DrawNode::create();
686 spDrawNode->setTag(sprite->getTag());
688 sprite->addChild(spDrawNode);
699 _title =
"SpritePolygon ";
700 _subtitle =
"TexturePacker: Sprite with island";
705 auto s = Director::getInstance()->getWinSize();
706 auto cache = SpriteFrameCache::getInstance();
707 cache->addSpriteFramesWithFile(
"Images/test_polygon.plist");
709 auto sprite = Sprite::createWithSpriteFrame(cache->getSpriteFrameByName(
"island_polygon.png"));
711 sprite->setPosition(s.width/2, s.height/2);
714 auto spDrawNode = DrawNode::create();
715 spDrawNode->setTag(sprite->getTag());
717 sprite->addChild(spDrawNode);
729 _subtitle =
"AutoPolygon: Sprite with island";
734 auto s = Director::getInstance()->getWinSize();
736 auto pinfo = AutoPolygon::generatePolygon(
"Images/island_polygon.png", Rect::ZERO, 1);
737 auto sprite = Sprite::create(pinfo);
739 sprite->setPosition(s.width/2, s.height/2);
742 auto spDrawNode = DrawNode::create();
743 spDrawNode->setTag(sprite->getTag());
745 sprite->addChild(spDrawNode);
762 auto screen = Director::getInstance()->getWinSize();
764 auto rotate = RotateBy::create(10, 360);
765 auto action = RepeatForever::create(rotate);
768 auto cache = SpriteFrameCache::getInstance();
769 cache->addSpriteFramesWithFile(
"animations/grossini_dance_poly.plist");
772 for(
int i=0;i<10;i++)
774 sprintf(str,
"grossini_dance_%02d.png", i+1);
775 sprite = Sprite::createWithSpriteFrameName(str);
777 sprite->setPosition(Vec2(screen.width/6*(i%5+1), screen.height*2/3 - screen.height*(i/5)/3));
779 auto point = Sprite::create(
"Images/r1.png");
780 point->setScale( 0.1f );
781 point->setPosition( sprite->getPosition() );
784 sprite->runAction( action->clone() );
788 auto spDrawNode = DrawNode::create();
790 sprite->addChild(spDrawNode);
797 Vector<SpriteFrame*> animFrames(5);
798 for(
int i = 9; i < 14; i++)
800 sprintf(str,
"grossini_dance_%02d.png", i+1);
801 animFrames.pushBack(cache->getSpriteFrameByName(str));
803 auto animation = Animation::createWithSpriteFrames(animFrames, 0.3f);
804 sprite->runAction(RepeatForever::create(Animate::create(animation)));
814 _subtitle =
"Autopolygon around the banana";
819 auto s = Director::getInstance()->getWinSize();
820 auto offset = Vec2(0.15*s.width,0);
821 auto filename =
"Images/bug14017.png";
824 auto pinfo = AutoPolygon::generatePolygon(filename);
836 auto spDrawNode = DrawNode::create();
842 auto sppDrawNode = DrawNode::create();
844 sppDrawNode->clear();
849 TTFConfig ttfConfig(
"fonts/arial.ttf", 8);
850 std::string temp =
"Sprite:\nPixels drawn: ";
852 auto spArea = Label::createWithTTF(ttfConfig, temp+Value((
int)spSize.width*(
int)spSize.height).asString());
854 spArea->setAnchorPoint(Vec2(0,1));
856 temp =
"SpritePolygon:\nPixels drawn: ";
857 auto vertCount =
"\nverts:"+Value((
int)pinfo.getVertCount()).asString();
858 auto sppArea = Label::createWithTTF(ttfConfig, temp+Value((
int)pinfo.getArea()).asString()+vertCount);
860 sppArea->setAnchorPoint(Vec2(0,1));
#define ADD_TEST_CASE(__className__)
virtual void initSprites() override
void initSprites() override
virtual void initSprites() override
void initSprites() override
void initSprites() override
void loadDefaultSprites()
virtual bool init() override
cocos2d::PolygonInfo _polygonInfo
void addSpritePolygon(const cocos2d::Vec2 &pos)
void update(float dt) override
SpritePolygonTestAutoPolyIsland()
virtual void initSprites() override
virtual void onEnter() override
virtual void onExit() override
cocos2d::Vector< cocos2d::DrawNode * > _drawNodes
virtual bool init() override
virtual void initSprites()
cocos2d::Sprite * _normalSprite
cocos2d::Sprite * _polygonSprite
virtual bool init() override
virtual void initSprites() override
SpritePolygonTestFrameAnim()
SpritePolygonTestNoCrash()
virtual void initSprites() override
cocos2d::Sprite * makeSprite(const std::string &filename, const cocos2d::Vec2 &pos)
cocos2d::Label * _epsilonLabel
void makeSprites(const std::string *list, const int count, const float y)
void changeEpsilon(Ref *pSender, cocos2d::ui::Slider::EventType type)
void updateLabel(const cocos2d::Sprite *sp, const cocos2d::PolygonInfo &pinfo)
virtual bool init() override
virtual void initSprites()
SpritePolygonTestTPIsland()
virtual void initSprites() override
virtual void onEnter() override
cocos2d::Label * _subtitleLabel
static cocos2d::Vec2 leftTop()
static cocos2d::Vec2 leftBottom()
static const char s_pathB2[]
static const char s_pathGrossini[]