29#include "renderer/backend/Device.h"
46 else if(itr->second < 0) {
47 itr->second = n + itr->second;
49 return static_cast<int>(itr->second);
52 inline int64_t
now()
const{
53 return std::chrono::duration_cast<std::chrono::nanoseconds>(std::chrono::steady_clock::now().time_since_epoch()).count();
66NewRendererTests::NewRendererTests()
87 return "New Renderer";
92 return "MultiSceneTest";
97 auto touchListener = EventListenerTouchAllAtOnce::create();
111 Size winSize = Director::getInstance()->getWinSize();
113 Sprite* parent = Sprite::create(
"Images/grossini.png");
114 parent->setPosition(winSize.width/4, winSize.height/2);
115 Sprite* child1 = Sprite::create(
"Images/grossinis_sister1.png");
116 child1->setPosition(0.0f, -20.0f);
117 Sprite* child2 = Sprite::create(
"Images/grossinis_sister2.png");
118 child2->setPosition(20.0f, -20.0f);
119 Sprite* child3 = Sprite::create(
"Images/grossinis_sister1.png");
120 child3->setPosition(40.0f, -20.0f);
121 Sprite* child4 = Sprite::create(
"Images/grossinis_sister2.png");
122 child4->setPosition(60.0f, -20.0f);
123 Sprite* child5 = Sprite::create(
"Images/grossinis_sister2.png");
124 child5->setPosition(80.0f, -20.0f);
125 Sprite* child6 = Sprite::create(
"Images/grossinis_sister2.png");
126 child6->setPosition(100.0f, -20.0f);
127 Sprite* child7 = Sprite::create(
"Images/grossinis_sister2.png");
128 child7->setPosition(120.0f, -20.0f);
130 parent->addChild(child1);
131 parent->addChild(child2);
132 parent->addChild(child3);
133 parent->addChild(child4);
134 parent->addChild(child5);
135 parent->addChild(child6);
136 parent->addChild(child7);
142 Size winSize = Director::getInstance()->getWinSize();
144 Sprite* parent = Sprite::create(
"Images/grossini.png");
145 parent->setPosition(winSize.width*2/3, winSize.height/2);
146 Sprite* child1 = Sprite::create(
"Images/grossinis_sister1.png");
147 child1->setPosition(0.0f, -20.0f);
148 Sprite* child2 = Sprite::create(
"Images/grossinis_sister2.png");
149 child2->setPosition(20.0f, -20.0f);
150 Sprite* child3 = Sprite::create(
"Images/grossinis_sister1.png");
151 child3->setPosition(40.0f, -20.0f);
152 Sprite* child4 = Sprite::create(
"Images/grossinis_sister2.png");
153 child4->setPosition(60.0f, -20.0f);
154 Sprite* child5 = Sprite::create(
"Images/grossinis_sister2.png");
155 child5->setPosition(80.0f, -20.0f);
156 Sprite* child6 = Sprite::create(
"Images/grossinis_sister2.png");
157 child6->setPosition(100.0f, -20.0f);
158 Sprite* child7 = Sprite::create(
"Images/grossinis_sister2.png");
159 child7->setPosition(120.0f, -20.0f);
161 parent->addChild(child1);
162 parent->addChild(child2);
163 parent->addChild(child3);
164 parent->addChild(child4);
165 parent->addChild(child5);
166 parent->addChild(child6);
167 parent->addChild(child7);
193 virtual void draw(Renderer *renderer,
const Mat4 &transform, uint32_t flags)
override;
199 sprite->initWithFile(filename);
200 sprite->autorelease();
206 CCASSERT(renderer,
"Render is null");
210 Sprite::draw(renderer, transform, flags);
211 renderer->popGroup();
217 Size winSize = Director::getInstance()->getWinSize();
218 sprite->setPosition(winSize.width/2,winSize.height/2);
233 return "GroupCommandTest: You should see a sprite";
238 auto s = Director::getInstance()->getWinSize();
240 auto clipper = ClippingNode::create();
242 clipper->setContentSize( Size(200.0f, 200.0f) );
243 clipper->setAnchorPoint( Vec2(0.5f, 0.5f) );
244 clipper->setPosition( Vec2(s.width / 2, s.height / 2) );
246 clipper->runAction(RepeatForever::create(RotateBy::create(1, 45)));
247 this->addChild(clipper);
262 clipper->setAlphaThreshold(0.05f);
263 auto stencil = Sprite::create(
"Images/grossini.png");
264 stencil->setPosition(s.width/2, s.height/2);
265 clipper->setStencil(stencil);
267 auto content = Sprite::create(
"Images/background2.png");
269 content->setAnchorPoint( Vec2(0.5f, 0.5f) );
270 content->setPosition( Vec2(clipper->getContentSize().width / 2, clipper->getContentSize().height / 2) );
271 clipper->addChild(content);
275 auto listener = EventListenerTouchAllAtOnce::create();
279 _eventDispatcher->addEventListenerWithSceneGraphPriority(listener,
this);
299 Touch *touch = touches[0];
301 Vec2 point = clipper->convertToNodeSpace(Director::getInstance()->convertToGL(touch->getLocationInView()));
302 auto rect = Rect(0, 0, clipper->getContentSize().width, clipper->getContentSize().height);
310 Touch *touch = touches[0];
312 auto point = clipper->convertToNodeSpace(Director::getInstance()->convertToGL(touch->getLocationInView()));
315 content->setPosition(content->getPosition() + diff);
330 auto s = Director::getInstance()->getWinSize();
332 auto parent = Node::create();
333 parent->setPosition(s.width/2, s.height/2);
336 auto rectNode = DrawNode::create();
338 rectangle[0] = Vec2(-50, -50);
339 rectangle[1] = Vec2(50, -50);
340 rectangle[2] = Vec2(50, 50);
341 rectangle[3] = Vec2(-50, 50);
343 Color4F white(1, 1, 1, 1);
344 rectNode->drawPolygon(rectangle, 4, white, 1, white);
345 parent->addChild(rectNode);
365 Size size = Director::getInstance()->getWinSize();
366 auto sprite = Sprite::create(
"Images/btn-about-normal-vertical.png");
367 sprite->setRotation(5);
368 sprite->setPosition(Vec2(size.width/2,size.height/3));
372 auto sprite2 = Sprite::create(
"Images/btn-about-normal-vertical.png");
373 sprite2->setRotation(-85);
374 sprite2->setPosition(Vec2(size.width/2,size.height * 2/3));
375 sprite2->setScale(2);
378 auto listener = EventListenerTouchOneByOne::create();
379 listener->setSwallowTouches(
true);
384 _eventDispatcher->addEventListenerWithSceneGraphPriority(listener,
this);
390 auto pos = touch->getLocation();
397 auto pos = touch->getLocation();
401 auto layerPos = getPosition();
402 auto newPos = layerPos + offset;
420 return "Drag the layer to test the result of culling";
426 Size s = Director::getInstance()->getWinSize();
427 Node* parent = Node::create();
428 parent->setPosition(s.width / 2,s.height / 2);
432#define KEY_CREATION "11"
433#define KEY_DESTROYATION "22"
435 labelCreate = Label::createWithTTF(TTFConfig(
"fonts/arial.ttf"),
"Sprite Creation: ..");
436 labelDestory= Label::createWithTTF(TTFConfig(
"fonts/arial.ttf"),
"Destroy Sprites: ..");
438 MenuItemFont::setFontName(
"fonts/arial.ttf");
439 MenuItemFont::setFontSize(65);
441 decrease->setColor(Color3B(0, 200, 20));
443 increase->setColor(Color3B(0, 200, 20));
445 auto menu = Menu::create(decrease, increase,
nullptr);
446 menu->alignItemsHorizontally();
447 menu->setPosition(Vec2(s.width / 2, s.height - 105));
450 TTFConfig ttfCount(
"fonts/Marker Felt.ttf", 30);
470 std::stringstream ss;
479 std::vector<std::string> predefineTextures = {
480 "Images/concave.png",
481 "Images/atlastest.png",
482 "Images/grossini_dance_atlas-mono.png",
483 "Images/HelloWorld.png",
484 "Images/background1.png",
485 "Images/background2.png",
487 "Images/issue_17116.png",
488 "Images/sprite_polygon_crash.png",
489 "Images/bitmapFontTest3.png",
490 "Images/cocos-html5.png",
492 "Images/poly_test_textures.png",
493 "Images/powered.png",
494 "Images/bug14017.png",
495 "Images/test-rgba1.png",
496 "Images/grossinis_heads.png",
497 "Images/cocos2dbanner.png"
501 std::vector<Sprite*> spriteCache;
508 auto* sprite =
new Sprite();
509 if(sprite ==
nullptr )
513 if(!sprite->initWithFile(predefineTextures[i % predefineTextures.size()]))
518 spriteCache.push_back(sprite);
526 spriteCache[i]->release();
529 std::stringstream ss;
530 auto t1_ms = creationDuration * 1.0 / 1000000;
531 ss <<
"Create "<< spriteCache.size() <<
" sprites takes " << t1_ms<<
" ms, " << (int64_t)(spriteCache.size() * 1000 / t1_ms) <<
" sprites per second!";
536 }
else if (t1_ms < 1000) {
545 auto t2_ms = destroyDuration * 1.0 / 1000000;
546 ss <<
"Destroy "<< spriteCache.size() <<
" sprites takes " << t2_ms<<
" ms, " << (int64_t)(spriteCache.size() * 1000 / t2_ms) <<
" sprites per second!" ;
571 return "Sprite Creation";
576#if defined(COCOS2D_DEBUG) && COCOS2D_DEBUG == 1
577 return "In debug mode";
579 return "In release mode";
586 Size s = Director::getInstance()->getWinSize();
587 Node* parent = Node::create();
588 parent->setPosition(0,0);
591 for (
int i=0; i< Renderer::VBO_SIZE / 3.9; ++i)
593 Sprite* sprite = Sprite::create(
"Images/grossini_dance_01.png");
594 sprite->setScale(0.1f, 0.1f);
595 float x = ((float)std::rand()) /RAND_MAX;
596 float y = ((float)std::rand()) /RAND_MAX;
597 sprite->setPosition(Vec2(x * s.width, y * s.height));
598 parent->addChild(sprite);
609 return "New Renderer";
614 return "VBO full Test, everything should render normally";
619 Size s = Director::getInstance()->getWinSize();
620 Vec2 left(s.width / 4, s.height / 2);
621 Vec2 right(s.width / 4 * 3, s.height / 2);
623 auto sp1 = Sprite::create(
"Images/grossini.png");
624 sp1->setPosition(left);
625 auto move1 = MoveBy::create(1, Vec2(s.width/2, 0.0f));
626 auto seq1 = RepeatForever::create(Sequence::create(move1, move1->reverse(),
nullptr));
628 sp1->runAction(seq1);
629 auto sp2 = Sprite::create(
"Images/grossinis_sister1.png");
630 sp2->setPosition(right);
631 auto move2 = MoveBy::create(1, Vec2(-s.width/2, 0.0f));
632 auto seq2 = RepeatForever::create(Sequence::create(move2, move2->reverse(),
nullptr));
634 sp2->runAction(seq2);
636 auto label1 = Label::createWithTTF(TTFConfig(
"fonts/arial.ttf"),
"capture all");
638 auto menu = Menu::create(mi1,
nullptr);
640 menu->setPosition(s.width / 2, s.height / 4);
647 Director::getInstance()->getTextureCache()->removeTextureForKey(
_filename);
652 return "New Renderer";
657 return "Capture screen test, press the menu items to capture the screen";
662 Director::getInstance()->getTextureCache()->removeTextureForKey(
_filename);
674 auto sp = Sprite::create(outputFile);
676 Size s = Director::getInstance()->getWinSize();
677 sp->setPosition(s.width / 2, s.height / 2);
683 log(
"Capture screen failed.");
692 Size s = Director::getInstance()->getWinSize();
693 Vec2 left(s.width / 4, s.height / 2);
694 Vec2 right(s.width / 4 * 3, s.height / 2);
696 auto sp1 = Sprite::create(
"Images/grossini.png");
697 sp1->setPosition(left);
698 auto move1 = MoveBy::create(1, Vec2(s.width / 2, 0.0f));
699 auto seq1 = RepeatForever::create(Sequence::create(move1, move1->reverse(),
nullptr));
701 sp1->runAction(seq1);
702 auto sp2 = Sprite::create(
"Images/grossinis_sister1.png");
703 sp2->setPosition(right);
704 auto move2 = MoveBy::create(1, Vec2(-s.width / 2, 0.0f));
705 auto seq2 = RepeatForever::create(Sequence::create(move2, move2->reverse(),
nullptr));
707 sp2->runAction(seq2);
709 auto label1 = Label::createWithTTF(TTFConfig(
"fonts/arial.ttf"),
"capture this scene");
711 auto menu = Menu::create(mi1,
nullptr);
713 menu->setPosition(s.width / 2, s.height / 4);
720 Director::getInstance()->getTextureCache()->removeTextureForKey(
_filename);
725 return "New Renderer";
730 return "Capture node test, press the menu items to capture this scene with scale 0.5";
735 Director::getInstance()->getTextureCache()->removeTextureForKey(
_filename);
738 _filename = FileUtils::getInstance()->getWritablePath() +
"/CaptureNodeTest.png";
741 auto callback = [&](Image* image){
743 auto sp = Sprite::createWithTexture(Director::getInstance()->getTextureCache()->addImage(image,
_filename));
745 Size s = Director::getInstance()->getWinSize();
746 sp->setPosition(s.width / 2, s.height / 2);
755 auto callbackFunction = std::bind(callback, std::placeholders::_1);
756 utils::captureNode(
this, callbackFunction, 0.5);
761 Size s = Director::getInstance()->getWinSize();
762 auto fastmap = cocos2d::FastTMXTiledMap::create(
"TileMaps/orthogonal-test2.tmx");
763 this->addChild(fastmap);
764 for (
int i = 0; i < 30; i++) {
765 auto sprite = Sprite::create(
"Images/grossini.png");
766 sprite->setPosition(s.width/2 + s.width/10 * i, s.height/2);
767 this->addChild(sprite);
768 auto label = Label::createWithTTF(TTFConfig(
"fonts/arial.ttf"),
"Label");
769 label->setPosition(s.width/2 + s.width/10 * i, s.height/2);
770 this->addChild(label);
772 this->scheduleOnce([=](
float){
773 auto camera = Director::getInstance()->getRunningScene()->getCameras().front();
774 auto move = MoveBy::create(2.0f, Vec2(2 * s.width, 0.0f));
775 camera->runAction(Sequence::create(move, move->reverse(),
nullptr));
776 }, 1.0f,
"lambda-autoculling-bug");
781 return "Bug-AutoCulling";
786 return "Moving the camera to the right instead of moving the layer";
795 Size s = Director::getInstance()->getWinSize();
797 for (
int i=0; i<250; i++)
799 int x = CCRANDOM_0_1() * s.width;
800 int y = CCRANDOM_0_1() * s.height;
802 auto label = LabelAtlas::create(
"This is a label",
"fonts/tuffy_bold_italic-charmap.plist");
803 label->setColor(Color3B::RED);
804 label->setPosition(Vec2(x,y));
807 auto sprite = Sprite::create(
"fonts/tuffy_bold_italic-charmap.png");
808 sprite->setTextureRect(Rect(0.0f,0.0f,100.0f,100.0f));
809 sprite->setPosition(Vec2(x,y));
810 sprite->setColor(Color3B::BLUE);
817 return "RendererBatchQuadTri";
822 return "QuadCommand and TriangleCommands are batched together";
833 Size s = Director::getInstance()->getWinSize();
838 auto x_inc = s.width / 20;
839 auto y_inc = s.height / 6;
841 for (
int y=0; y<6; ++y)
843 for (
int x=0; x<20; ++x)
845 auto sprite = Sprite::create(
"Images/grossini.png");
846 sprite->setPosition(Vec2(x * x_inc, y * y_inc));
847 sprite->setScale(0.4);
851 sprite->setProgramState(sepiaState);
853 sprite->setProgramState(blurState);
861 const std::string shaderName(
"Shaders/example_Blur.fsh");
863 auto fileUtiles = FileUtils::getInstance();
864 auto fragmentFullPath = fileUtiles->fullPathForFilename(shaderName);
865 auto fragSource = fileUtiles->getStringFromFile(fragmentFullPath);
866 auto program = backend::Device::getInstance()->newProgram(positionTextureColor_vert, fragSource.c_str());
867 auto programState =
new backend::ProgramState(program);
868 programState->autorelease();
869 CC_SAFE_RELEASE(program);
871 backend::UniformLocation loc = programState->getUniformLocation(
"resolution");
872 auto resolution = Vec2(85, 121);
873 programState->setUniform(loc, &resolution,
sizeof(resolution));
875 loc = programState->getUniformLocation(
"blurRadius");
876 float blurRadius = 10.0f;
877 programState->setUniform(loc, &blurRadius,
sizeof(blurRadius));
879 loc = programState->getUniformLocation(
"sampleNum");
880 float sampleNum = 5.0f;
881 programState->setUniform(loc, &sampleNum,
sizeof(sampleNum));
888 const std::string shaderName(
"Shaders/example_Sepia.fsh");
891 auto fileUtiles = FileUtils::getInstance();
892 auto fragmentFullPath = fileUtiles->fullPathForFilename(shaderName);
893 auto fragSource = fileUtiles->getStringFromFile(fragmentFullPath);
894 auto program = backend::Device::getInstance()->newProgram(positionTextureColor_vert, fragSource.c_str());
895 auto programState =
new backend::ProgramState(program);
896 programState->autorelease();
897 CC_SAFE_RELEASE(program);
903 return "RendererUniformBatch";
908 return "Only 9 draw calls should appear";
918 Size s = Director::getInstance()->getWinSize();
923 auto x_inc = s.width / 20;
924 auto y_inc = s.height / 6;
926 for (
int y=0; y<6; ++y)
928 for (
int x=0; x<20; ++x)
930 auto sprite = Sprite::create(
"Images/grossini.png");
931 sprite->setPosition(Vec2(x * x_inc, y * y_inc));
932 sprite->setScale(0.4);
935 auto r = CCRANDOM_0_1();
937 sprite->setProgramState(sepiaState);
939 sprite->setProgramState(blurState);
946 const std::string shaderName(
"Shaders/example_Blur.fsh");
949 auto fileUtiles = FileUtils::getInstance();
950 auto fragmentFullPath = fileUtiles->fullPathForFilename(shaderName);
951 auto fragSource = fileUtiles->getStringFromFile(fragmentFullPath);
952 auto program = backend::Device::getInstance()->newProgram(positionTextureColor_vert, fragSource.c_str());
953 auto programState =
new backend::ProgramState(program);
954 programState->autorelease();
955 CC_SAFE_RELEASE(program);
957 backend::UniformLocation loc = programState->getUniformLocation(
"resolution");
958 auto resolution = Vec2(85, 121);
959 programState->setUniform(loc, &resolution,
sizeof(resolution));
961 loc = programState->getUniformLocation(
"blurRadius");
962 float blurRadius = 10.0f;
963 programState->setUniform(loc, &blurRadius,
sizeof(blurRadius));
965 loc = programState->getUniformLocation(
"sampleNum");
966 float sampleNum = 5.0f;
967 programState->setUniform(loc, &sampleNum,
sizeof(sampleNum));
974 const std::string shaderName(
"Shaders/example_Sepia.fsh");
977 auto fileUtiles = FileUtils::getInstance();
978 auto fragmentFullPath = fileUtiles->fullPathForFilename(shaderName);
979 auto fragSource = fileUtiles->getStringFromFile(fragmentFullPath);
980 auto program = backend::Device::getInstance()->newProgram(positionTextureColor_vert, fragSource.c_str());
981 auto programState =
new backend::ProgramState(program);
982 programState->autorelease();
983 CC_SAFE_RELEASE(program);
989 return "RendererUniformBatch 2";
994 return "Mixing different shader states should work ok";
999 Size s = Director::getInstance()->getWinSize();
1005 _totalSprites = Label::createWithTTF(TTFConfig(
"fonts/arial.ttf"),
"sprites");
1018 Size s = Director::getInstance()->getWinSize();
1019 Sprite* sprite =
nullptr;
1022 sprite = Sprite::create(
"Images/grossini_dance_05.png");
1026 sprite = Sprite::create(
"Images/grossini_dance_01.png");
1029 if (!sprite)
return;
1030 auto r = rand_0_1() * 0.6 + 0.2;
1031 sprite->setScale(r, r);
1032 float x = ((float)std::rand()) / RAND_MAX;
1033 float y = ((float)std::rand()) / RAND_MAX;
1034 sprite->runAction(RepeatForever::create(RotateBy::create(1, 45)));
1036 sprite->setPosition(Vec2(x * s.width, y * s.height));
1040 std::stringstream ss;
1048 if( dt <= 1.0f / 28.0f && dt >= 1.0f/ 31.0f)
1065 delta =std::min(20, std::max(1, delta));
1066 for(
int i =0 ;i< delta; i++) {
1078 std::stringstream ss;
1092 return "Non Batched Sprites";
1097#if defined(COCOS2D_DEBUG) && COCOS2D_DEBUG == 1
1098 return "DEBUG: simulate lots of sprites, drop to 30 fps";
1100 return "RELEASE: simulate lots of sprites, drop to 30 fps";
#define ADD_TEST_CASE(__className__)
virtual std::string title() const override
virtual std::string subtitle() const override
static const int childTag
virtual std::string subtitle() const override
virtual std::string title() const override
void onCaptured(cocos2d::Ref *)
void afterCaptured(bool succeed, const std::string &outputFile)
static const int childTag
void onCaptured(cocos2d::Ref *)
virtual std::string title() const override
virtual std::string subtitle() const override
int endTick(const std::string &key)
std::map< std::string, int64_t > _durations
void startTick(const std::string &key)
virtual std::string title() const override
virtual ~GroupCommandTest()
virtual std::string subtitle() const override
virtual std::string subtitle() const override
virtual std::string title() const override
void onTouchesMoved(const std::vector< cocos2d::Touch * > &touches, cocos2d::Event *event)
void onTouchesEnded(const std::vector< cocos2d::Touch * > &touches, cocos2d::Event *event)
virtual std::string subtitle() const override
virtual ~NewClippingNodeTest()
void onTouchesBegan(const std::vector< cocos2d::Touch * > &touches, cocos2d::Event *event)
virtual std::string title() const override
virtual std::string title() const override
void onTouchMoved(cocos2d::Touch *touch, cocos2d::Event *event)
virtual std::string subtitle() const override
virtual ~NewCullingTest()
bool onTouchBegan(cocos2d::Touch *touch, cocos2d::Event *event)
virtual ~NewDrawNodeTest()
virtual std::string subtitle() const override
virtual std::string title() const override
virtual std::string subtitle() const override
virtual std::string title() const override
void onTouchesEnded(const std::vector< cocos2d::Touch * > &touches, cocos2d::Event *event)
void createNewSpriteTest()
virtual void update(float dt) override
virtual std::string title() const override
virtual ~NonBatchSprites()
virtual std::string subtitle() const override
const float DEST_DT_30FPS
cocos2d::Label * _totalSprites
virtual std::string title() const override
virtual std::string subtitle() const override
virtual std::string title() const override
void addSpritesCallback(Ref *)
void delSpritesCallback(Ref *)
void updateSpriteCountLabel(int x)
cocos2d::Label * _labelSpriteNum
virtual std::string subtitle() const override
cocos2d::Label * labelCreate
virtual ~SpriteCreation()
cocos2d::Label * labelDestory
static SpriteInGroupCommand * create(const std::string &filename)
virtual void draw(Renderer *renderer, const Mat4 &transform, uint32_t flags) override
GroupCommand _spriteWrapperCommand
virtual std::string subtitle() const override
virtual std::string title() const override