// // SpritePolygonTest.cpp // cocos2d_tests // // Created by WuHao on 15/4/23. // // #include "SpritePolygonTest.h" #include "../testResource.h" USING_NS_CC; SpritePolygonTest::SpritePolygonTest() { ADD_TEST_CASE(SpritePolygonTest1); // ADD_TEST_CASE(SpritePolygonTest2); // ADD_TEST_CASE(SpritePolygonTest3); // ADD_TEST_CASE(SpritePolygonTest4); ADD_TEST_CASE(SpritePolygonPerformanceTestStatic); ADD_TEST_CASE(SpritePerformanceTestStatic); ADD_TEST_CASE(SpritePolygonPerformanceTestDynamic); ADD_TEST_CASE(SpritePerformanceTestDynamic); } SpritePolygonPerformance::SpritePolygonPerformance() { SpritePolygonCache::getInstance()->removeAllSpritePolygonCache(); Director::getInstance()->setClearColor(Color4F(102.f/255, 184.f/255, 204.f/255, 255.f)); TTFConfig ttfConfig("fonts/arial.ttf", 10); perfLabel = Label::createWithTTF(ttfConfig, "performance test"); addChild(perfLabel); perfLabel->setPosition(Director::getInstance()->getVisibleSize().width/2, 80); spriteCount = vertCount = triCount = pixelCount = continuousLowDt =0; auto size = Director::getInstance()->getVisibleSize(); elapsedTime = 0; _posX = _leftX = size.width*0.15; _rightX = size.width*0.85; _posY = size.height/2; prevDt = 0.016f; goRight = true; ended = false; scheduleUpdate(); continuousHighDtTime = 0.0; waitingTime = 0.0; } void SpritePolygonPerformance::updateLabel() { // std::string temp = "Nodes: " + Value(spriteCount).asString() + " Triangles: " + Value(triCount).asString() + "\nPixels: " + Value(pixelCount).asString() + " Vertices: " + Value(vertCount).asString(); if(!ended) perfLabel->setString("Nodes: " + Value(spriteCount).asString() + " Triangles: " + Value(triCount).asString() + "\nPixels: " + Value(pixelCount).asString() + " Vertices: " + Value(vertCount).asString()); } Node *SpritePolygonPerformance::makeSprite() { return Node::create(); } void SpritePolygonPerformance::update(float dt) { dt = dt*0.3 + prevDt*0.7; prevDt = dt; elapsedTime += dt; int loops = (0.025-dt)*1000; if(dt < 0.025 && loops>0) { continuousHighDtTime = clampf(continuousHighDtTime-dt*2, 0.0, 1.0); waitingTime = clampf(waitingTime-dt, 0.0, 5.0); continuousLowDt++; } else { continuousHighDtTime+=dt; continuousLowDt = 0; } if (continuousLowDt >= 5 && loops > 0) { for(int i = 0; i < loops; i++) { if(_posX >= _rightX) { goRight = false; } else if(_posX <= _leftX) { goRight = true; } auto s = makeSprite(); addChild(s); s->setPosition(_posX, _posY); if(goRight) _posX++; else _posX--; incrementStats(); } updateLabel(); } //if we have 10 continuous low dt, then we will start to create more sprites else if(continuousHighDtTime >= .5 || waitingTime > 3.0){ // its now 1 seconds with high DT time, time to end ended = true; unscheduleUpdate(); perfLabel->setString("Test ended in " + Value(elapsedTime).asString() + " seconds\nNodes: " + Value(spriteCount).asString() + " Triangles: " + Value(triCount).asString() + "\nPixels: " + Value(pixelCount).asString() + " Vertices: " + Value(vertCount).asString()); _subtitleLabel->setString("Test ended"); } else{ waitingTime += dt; } } void SpritePolygonPerformance::incrementStats() { spriteCount ++; vertCount += _incVert; triCount += _incTri; pixelCount += _incPix; } SpritePolygonPerformanceTestStatic::SpritePolygonPerformanceTestStatic() { _title = "Static SpritePolygon Performance"; _subtitle = "Test running, please wait until it ends"; initIncrementStats(); } experimental::SpritePolygon* SpritePolygonPerformanceTestStatic::makeSprite() { return experimental::SpritePolygon::create(s_pathGrossini); } void SpritePolygonPerformanceTestStatic::initIncrementStats() { auto t = experimental::SpritePolygon::create(s_pathGrossini); _incVert = (int)t->getVertCount(); _incTri = (int)t->getTrianglesCount(); _incPix = (int)t->getArea(); } SpritePolygonPerformanceTestDynamic::SpritePolygonPerformanceTestDynamic() { _title = "Dynamic SpritePolygon Performance"; _subtitle = "Test running, please wait until it ends"; initIncrementStats(); } experimental::SpritePolygon* SpritePolygonPerformanceTestDynamic::makeSprite() { auto ret = experimental::SpritePolygon::create(s_pathGrossini); ret->runAction(RepeatForever::create(RotateBy::create(1.0,360.0))); return ret; } SpritePerformanceTestStatic::SpritePerformanceTestStatic() { _title = "Static Sprite Performance"; _subtitle = "Test running, please wait until it ends"; initIncrementStats(); } Sprite* SpritePerformanceTestStatic::makeSprite() { return Sprite::create(s_pathGrossini); } void SpritePerformanceTestStatic::initIncrementStats() { auto t = Sprite::create(s_pathGrossini); _incVert = 4; _incTri = 2; _incPix = t->getContentSize().width * t->getContentSize().height; } SpritePerformanceTestDynamic::SpritePerformanceTestDynamic() { _title = "Dynamic Sprite Performance"; _subtitle = "Test running, please wait until it ends"; initIncrementStats(); } Sprite* SpritePerformanceTestDynamic::makeSprite() { auto ret = Sprite::create(s_pathGrossini); ret->runAction(RepeatForever::create(RotateBy::create(1.0,360.0))); return ret; } void SpritePolygonTestDemo::initDefaultSprite(const std::string &filename, cocos2d::experimental::SpritePolygon * inst) { Director::getInstance()->setClearColor(Color4F(102.f/255, 184.f/255, 204.f/255, 255.f)); spp = inst; addChild(spp); auto s = Director::getInstance()->getWinSize(); auto offset = Vec2(0.15*s.width,0); spp->setPosition(Vec2(s)/2 + offset); sp = Sprite::create(filename); addChild(sp); sp->setPosition(Vec2(s)/2 - offset); auto touchListener = EventListenerTouchOneByOne::create(); touchListener->onTouchBegan = [&](Touch* touch, Event* event){ spp->showDebug(true); debugForNormalSprite->setVisible(true); return true; }; touchListener->onTouchMoved = [&](Touch* touch, Event* event){ auto pos = touch->getDelta(); float newScale = clampf(spp->getScale() + pos.x * 0.01f, 0.1f, 2.f); spp->setScale(newScale); sp->setScale(newScale); }; touchListener->onTouchEnded = [&](Touch* touch, Event* event){ spp->showDebug(false); debugForNormalSprite->setVisible(false); }; _eventDispatcher->addEventListenerWithSceneGraphPriority(touchListener, this); debugForNormalSprite = DrawNode::create(); sp->addChild(debugForNormalSprite); auto positions = new Vec2[4]; auto spSize = sp->getContentSize(); positions[0] = Vec2(0, spSize.height); positions[1] = Vec2(spSize); positions[2] = Vec2(spSize.width, 0); positions[3] = Vec2(0,0); debugForNormalSprite->drawPoints(positions, 4, 8, Color4F(0.0,1.0,1.0,1.0)); debugForNormalSprite->drawLine(positions[0], positions[1], Color4F::GREEN); debugForNormalSprite->drawLine(positions[1], positions[2], Color4F::GREEN); debugForNormalSprite->drawLine(positions[2], positions[3], Color4F::GREEN); debugForNormalSprite->drawLine(positions[3], positions[0], Color4F::GREEN); debugForNormalSprite->drawLine(positions[0], positions[2], Color4F::GREEN); debugForNormalSprite->setVisible(false); delete [] positions; TTFConfig ttfConfig("fonts/arial.ttf", 8); std::string temp = "Sprite:\nPixels drawn: "; auto spArea = Label::createWithTTF(ttfConfig, temp+Value((int)spSize.width*(int)spSize.height).asString()); sp->addChild(spArea); spArea->setAnchorPoint(Vec2(0,1)); temp = "SpritePolygon:\nPixels drawn: "; auto vertCount = "\nverts:"+Value((int)spp->getVertCount()).asString(); auto sppArea = Label::createWithTTF(ttfConfig, temp+Value((int)spp->getArea()).asString()+vertCount); spp->addChild(sppArea); sppArea->setAnchorPoint(Vec2(0,1)); } void SpritePolygonTestCase::onBackCallback(cocos2d::Ref *sender) { TestCase::onBackCallback(sender); Director::getInstance()->setClearColor(Color4F::BLACK); } SpritePolygonTest1::SpritePolygonTest1() { SpritePolygonCache::getInstance()->removeAllSpritePolygonCache(); _title = "SpritePolygon Creation"; _subtitle = "SpritePolygon::create(\"Images/grossini.png\")"; cocos2d::experimental::SpritePolygon *s; for(int i = 0; i < 10; i ++) { s= experimental::SpritePolygon::create(s_pathGrossini); } initDefaultSprite(s_pathGrossini, s); } //SpritePolygonTest2::SpritePolygonTest2() //{ // /* // 36.5 128.5 // 27.5 133.5 // 24.5 145.5 // 26.5 161.5 // 33.5 168.5 // 27.5 168.5 // 16.5 179.5 // 30.5 197.5 // 28.5 237.5 // 56.5 237.5 // 54.5 197.5 // 68.5 184.5 // 57.5 168.5 // 51.5 168.5 // 60.5 154.5 // 57.5 133.5 // 48.5 127.5 // 36.5 127.5 // */ // std::vector verts; // verts.push_back(Vec2(36.5, 242.0-128.5)); // verts.push_back(Vec2(27.5, 242.0-133.5)); // verts.push_back(Vec2(24.5, 242.0-145.5)); // verts.push_back(Vec2(26.5, 242.0-161.5)); // verts.push_back(Vec2(33.5, 242.0-168.5)); // verts.push_back(Vec2(27.5, 242.0-168.5)); // verts.push_back(Vec2(16.5, 242.0-179.5)); // verts.push_back(Vec2(30.5, 242.0-197.5)); // verts.push_back(Vec2(28.5, 242.0-237.5)); // verts.push_back(Vec2(56.5, 242.0-237.5)); // verts.push_back(Vec2(54.5, 242.0-197.5)); // verts.push_back(Vec2(68.5, 242.0-184.5)); // verts.push_back(Vec2(57.5, 242.0-168.5)); // verts.push_back(Vec2(51.5, 242.0-168.5)); // verts.push_back(Vec2(60.5, 242.0-154.5)); // verts.push_back(Vec2(57.5, 242.0-133.5)); // verts.push_back(Vec2(48.5, 242.0-127.5)); // verts.push_back(Vec2(36.5, 242.0-127.5)); // // SpritePolygonCache::getInstance()->removeAllSpritePolygonCache(); // _title = "SpritePolygon Creation"; // _subtitle = "SpritePolygon::create(\"Images/grossini.png\", verts)"; // auto s = experimental::SpritePolygon::create(s_pathGrossini, verts); // initDefaultSprite(s_pathGrossini, s); //} // //SpritePolygonTest3::SpritePolygonTest3() //{ // /* // 18, 48 // 33.500000, 73.500000 // 27.500000, 73.500000 // 16.500000, 62.500000 // 30.500000, 44.500000 // 54.500000, 44.500000 // 51.500000, 73.500000 // 60.500000, 87.500000 // 26.500000, 80.500000 // 24.500000, 96.500000 // 57.500000, 108.500000 // 36.500000, 113.500000 // 48.500000, 114.500000 // 36.500000, 114.500000 // 27.500000, 108.500000 // 68.500000, 57.500000 // 57.500000, 73.500000 // 56.500000, 4.500000 // 28.500000, 4.500000 // 0, 1, 2 // 3, 0, 2 // 4, 0, 3 // 5, 0, 4 // 5, 6, 0 // 0, 6, 7 // 8, 7, 6 // 6, 9, 8 // 9, 10, 8 // 9, 11, 10 // 11, 12, 10 // 8, 10, 13 // 14, 5, 4 // 15, 5, 14 // 4, 3, 16 // 3, 17, 16 // */ // std::vector verts; // verts.push_back(Vec2(33.500000, 73.500000)); // verts.push_back(Vec2(27.500000, 73.500000)); // verts.push_back(Vec2(16.500000, 62.500000)); // verts.push_back(Vec2(30.500000, 44.500000)); // verts.push_back(Vec2(54.500000, 44.500000)); // verts.push_back(Vec2(51.500000, 73.500000)); // verts.push_back(Vec2(60.500000, 87.500000)); // verts.push_back(Vec2(26.500000, 80.500000)); // verts.push_back(Vec2(24.500000, 96.500000)); // verts.push_back(Vec2(57.500000, 108.500000)); // verts.push_back(Vec2(36.500000, 113.500000)); // verts.push_back(Vec2(48.500000, 114.500000)); // verts.push_back(Vec2(36.500000, 114.500000)); // verts.push_back(Vec2(27.500000, 108.500000)); // verts.push_back(Vec2(68.500000, 57.500000)); // verts.push_back(Vec2(57.500000, 73.500000)); // verts.push_back(Vec2(56.500000, 4.500000)); // verts.push_back(Vec2(28.500000, 4.500000)); // unsigned short indicesArr[] = {0, 1, 2, 3, 0, 2, 4, 0, 3, 5, 0, 4, 5, 6, 0, 0, 6, 7, 8, 7, 6, 6, 9, 8, 9, 10, 8, 9, 11, 10, 11, 12, 10, 8, 10, 13, 14, 5, 4, 15, 5, 14, 4, 3, 16, 3, 17, 16}; // std::vector indices(indicesArr, indicesArr + sizeof indicesArr / sizeof indicesArr[0]); // // SpritePolygonCache::getInstance()->removeAllSpritePolygonCache(); // _title = "SpritePolygon Creation"; // _subtitle = "SpritePolygon::create(\"Images/grossini.png\", verts, indices)"; // auto s = experimental::SpritePolygon::create(s_pathGrossini, verts, indices); // initDefaultSprite(s_pathGrossini, s); //} // //SpritePolygonTest4::SpritePolygonTest4(){ // /* // 18, 48 // 33.500000, 73.500000 // 27.500000, 73.500000 // 16.500000, 62.500000 // 30.500000, 44.500000 // 54.500000, 44.500000 // 51.500000, 73.500000 // 60.500000, 87.500000 // 26.500000, 80.500000 // 24.500000, 96.500000 // 57.500000, 108.500000 // 36.500000, 113.500000 // 48.500000, 114.500000 // 36.500000, 114.500000 // 27.500000, 108.500000 // 68.500000, 57.500000 // 57.500000, 73.500000 // 56.500000, 4.500000 // 28.500000, 4.500000 // 0, 1, 2, // 3, 0, 2, // 4, 0, 3, // 5, 0, 4, // 5, 6, 0, // 0, 6, 7, // 8, 7, 6, // 6, 9, 8, // 9, 10, 8, // 9, 11, 10, // 11, 12, 10, // 8, 10, 13, // 14, 5, 4, // 15, 5, 14, // 4, 3, 16, // 3, 17, 16, // 0.394118, 0.392562 // 0.323529, 0.392562 // 0.194118, 0.483471 // 0.358824, 0.632231 // 0.641176, 0.632231 // 0.605882, 0.392562 // 0.711765, 0.276859 // 0.311765, 0.334711 // 0.288235, 0.202479 // 0.676471, 0.103306 // 0.429412, 0.061983 // 0.570588, 0.053719 // 0.429412, 0.053719 // 0.323529, 0.103306 // 0.805882, 0.524793 // 0.676471, 0.392562 // 0.664706, 0.962810 // 0.335294, 0.962810 // */ // Vec3 poss[] = {Vec3(33.500000, 73.500000,0), // Vec3(27.500000, 73.500000,0), // Vec3(16.500000, 62.500000,0), // Vec3(30.500000, 44.500000,0), // Vec3(54.500000, 44.500000,0), // Vec3(51.500000, 73.500000,0), // Vec3(60.500000, 87.500000,0), // Vec3(26.500000, 80.500000,0), // Vec3(24.500000, 96.500000,0), // Vec3(57.500000, 108.500000,0), // Vec3(36.500000, 113.500000,0), // Vec3(48.500000, 114.500000,0), // Vec3(36.500000, 114.500000,0), // Vec3(27.500000, 108.500000,0), // Vec3(68.500000, 57.500000,0), // Vec3(57.500000, 73.500000,0), // Vec3(56.500000, 4.500000,0), // Vec3(28.500000, 4.50000, 0) // }; // unsigned short idxs[] = {0, 1, 2, 3, 0, 2, 4, 0, 3, 5, 0, 4, 5, 6, 0, 0, 6, 7, 8, 7, 6, 6, 9, 8, 9, 10, 8, 9, 11, 10, 11, 12, 10, 8, 10, 13, 14, 5, 4, 15, 5, 14, 4, 3, 16, 3, 17, 16}; // std::vector indices(idxs, idxs + sizeof idxs / sizeof idxs[0]); // Tex2F t2f[] = { // Tex2F(0.394118f, 0.392562f), // Tex2F(0.323529f, 0.392562f), // Tex2F(0.194118f, 0.483471f), // Tex2F(0.358824f, 0.632231f), // Tex2F(0.641176f, 0.632231f), // Tex2F(0.605882f, 0.392562f), // Tex2F(0.711765f, 0.276859f), // Tex2F(0.311765f, 0.334711f), // Tex2F(0.288235f, 0.202479f), // Tex2F(0.676471f, 0.103306f), // Tex2F(0.429412f, 0.061983f), // Tex2F(0.570588f, 0.053719f), // Tex2F(0.429412f, 0.053719f), // Tex2F(0.323529f, 0.103306f), // Tex2F(0.805882f, 0.524793f), // Tex2F(0.676471f, 0.392562f), // Tex2F(0.664706f, 0.962810f), // Tex2F(0.335294f, 0.962810f) // }; // std::vector vs; // for(int i = 0; i < 18; i++) // { // V3F_C4B_T2F t = {poss[i],Color4B::WHITE, t2f[i]}; // vs.push_back(t); // } // // SpritePolygonCache::getInstance()->removeAllSpritePolygonCache(); // _title = "SpritePolygon Creation"; // _subtitle = "SpritePolygon::create(\"Images/grossini.png\", vector v, vector indices)"; // auto s = experimental::SpritePolygon::create(s_pathGrossini, vs, indices); // initDefaultSprite(s_pathGrossini, s); //}