PuzzleSDK
RenderTextureTest.cpp
浏览该文件的文档.
1/****************************************************************************
2 Copyright (c) 2017-2018 Xiamen Yaji Software Co., Ltd.
3
4 http://www.cocos2d-x.org
5
6 Permission is hereby granted, free of charge, to any person obtaining a copy
7 of this software and associated documentation files (the "Software"), to deal
8 in the Software without restriction, including without limitation the rights
9 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10 copies of the Software, and to permit persons to whom the Software is
11 furnished to do so, subject to the following conditions:
12
13 The above copyright notice and this permission notice shall be included in
14 all copies or substantial portions of the Software.
15
16 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22 THE SOFTWARE.
23 ****************************************************************************/
24
25#include "RenderTextureTest.h"
26
28using namespace cocos2d::ui;
29
30RenderTextureTests::RenderTextureTests()
31{
40// ADD_TEST_CASE(RenderTextureWithSprite3DIssue16894); this Test makes no sense
41};
42
47{
48 auto s = Director::getInstance()->getWinSize();
49
50 // create a render texture, this is what we are going to draw into
51 _target = RenderTexture::create(s.width, s.height, backend::PixelFormat::RGBA8888);
52 _target->retain();
53 _target->setPosition(Vec2(s.width / 2, s.height / 2));
54
55 // note that the render texture is a Node, and contains a sprite of its texture for convenience,
56 // so we can just parent it to the scene like any other Node
57 this->addChild(_target, -1);
58
59 auto listener = EventListenerTouchAllAtOnce::create();
60 listener->onTouchesMoved = CC_CALLBACK_2(RenderTextureSave::onTouchesMoved, this);
61 _eventDispatcher->addEventListenerWithSceneGraphPriority(listener, this);
62
63 // Save Image menu
64 MenuItemFont::setFontSize(16);
65 auto item1 = MenuItemFont::create("Save Image PMA", CC_CALLBACK_1(RenderTextureSave::saveImageWithPremultipliedAlpha, this));
66 auto item2 = MenuItemFont::create("Save Image Non-PMA", CC_CALLBACK_1(RenderTextureSave::saveImageWithNonPremultipliedAlpha, this));
67 auto item3 = MenuItemFont::create("Add Image", CC_CALLBACK_1(RenderTextureSave::addImage, this));
68 auto item4 = MenuItemFont::create("Clear to Random", CC_CALLBACK_1(RenderTextureSave::clearImage, this));
69 auto item5 = MenuItemFont::create("Clear to Transparent", CC_CALLBACK_1(RenderTextureSave::clearImageTransparent, this));
70 auto menu = Menu::create(item1, item2, item3, item4, item5, nullptr);
71 this->addChild(menu);
72 menu->alignItemsVertically();
73 menu->setPosition(Vec2(VisibleRect::rightTop().x - 80, VisibleRect::rightTop().y - 100));
74}
75
76std::string RenderTextureSave::title() const
77{
78 return "Touch the screen";
79}
80
81std::string RenderTextureSave::subtitle() const
82{
83 return "Press 'Save Image' to create an snapshot of the render texture";
84}
85
86void RenderTextureSave::clearImage(cocos2d::Ref *sender)
87{
88 _target->clear(CCRANDOM_0_1(), CCRANDOM_0_1(), CCRANDOM_0_1(), CCRANDOM_0_1());
89}
90
92{
93 _target->clear(0, 0, 0, 0);
94}
95
97{
98 static int counter = 0;
99
100 char png[20];
101 sprintf(png, "image-pma-%d.png", counter);
102
103 auto callback = [&](RenderTexture* rt, const std::string& path)
104 {
105 auto sprite = Sprite::create(path);
106 addChild(sprite);
107 sprite->setScale(0.3f);
108 sprite->setPosition(Vec2(40.0f, 40.0f));
109 sprite->setRotation(counter * 3);
110 _target->release();
111 };
112
113 _target->retain();
114 _target->saveToFile(png, Image::Format::PNG, true, callback);
115 //Add this function to avoid crash if we switch to a new scene.
116 Director::getInstance()->getRenderer()->render();
117 CCLOG("Image saved %s", png);
118
119 counter++;
120}
121
123{
124 static int counter = 0;
125
126 char png[20];
127 sprintf(png, "image-no-pma-%d.png", counter);
128
129 auto callback = [&](RenderTexture* rt, const std::string& path)
130 {
131 auto sprite = Sprite::create(path);
132 addChild(sprite);
133 sprite->setScale(0.3f);
134 sprite->setPosition(Vec2(40.0f, 40.0f));
135 sprite->setRotation(counter * 3);
136 rt->release();
137 };
138
139 _target->retain();
140 _target->saveToFileAsNonPMA(png, Image::Format::PNG, true, callback);
141
142 //Add this function to avoid crash if we switch to a new scene.
143 Director::getInstance()->getRenderer()->render();
144 CCLOG("Image saved %s", png);
145
146 counter++;
147}
148
149void RenderTextureSave::addImage(cocos2d::Ref* sender)
150{
151 auto s = Director::getInstance()->getWinSize();
152
153 // begin drawing to the render texture
154 _target->begin();
155
156 Sprite* sprite = Sprite::create("Images/test-rgba1.png");
157 sprite->setPosition(sprite->getContentSize().width + CCRANDOM_0_1() * (s.width - sprite->getContentSize().width), sprite->getContentSize().height + CCRANDOM_0_1() * (s.height - sprite->getContentSize().height));
158 sprite->visit();
159
160 // finish drawing and return context back to the screen
161 _target->end();
162}
163
165{
166 _target->release();
167 Director::getInstance()->getTextureCache()->removeUnusedTextures();
168}
169
170void RenderTextureSave::onTouchesMoved(const std::vector<Touch*>& touches, Event* event)
171{
172 auto touch = touches[0];
173 auto start = touch->getLocation();
174 auto end = touch->getPreviousLocation();
175
176 // begin drawing to the render texture
177 _target->begin();
178
179 // for extra points, we'll draw this smoothly from the last position and vary the sprite's
180 // scale/rotation/offset
181 float distance = start.getDistance(end);
182 if (distance > 1)
183 {
184 int d = (int)distance;
185 _brushs.clear();
186 for(int i = 0; i < d; ++i)
187 {
188 Sprite * sprite = Sprite::create("Images/fire.png");
189 sprite->setColor(Color3B::RED);
190 sprite->setOpacity(20);
191 _brushs.pushBack(sprite);
192 }
193 for (int i = 0; i < d; i++)
194 {
195 float difx = end.x - start.x;
196 float dify = end.y - start.y;
197 float delta = (float)i / distance;
198 _brushs.at(i)->setPosition(Vec2(start.x + (difx * delta), start.y + (dify * delta)));
199 _brushs.at(i)->setRotation(rand() % 360);
200 float r = (float)(rand() % 50 / 50.f) + 0.25f;
201 _brushs.at(i)->setScale(r);
202 /*_brush->setColor(Color3B(CCRANDOM_0_1() * 127 + 128, 255, 255));*/
203 // Use CCRANDOM_0_1() will cause error when loading libtests.so on android, I don't know why.
204 _brushs.at(i)->setColor(Color3B(rand() % 127 + 128, 255, 255));
205 // Call visit to draw the brush, don't call draw..
206 _brushs.at(i)->visit();
207 }
208 }
209
210 // finish drawing and return context back to the screen
211 _target->end();
212}
213
219{
220 /*
221 * 1 2
222 * A: A1 A2
223 *
224 * B: B1 B2
225 *
226 * A1: premulti sprite
227 * A2: premulti render
228 *
229 * B1: non-premulti sprite
230 * B2: non-premulti render
231 */
232 auto background = LayerColor::create(Color4B(200,200,200,255));
233 addChild(background);
234
235 auto s = Director::getInstance()->getWinSize();
236 auto spr_premulti = Sprite::create("Images/fire.png");
237 spr_premulti->setPosition(Vec2(s.width/2-16, s.height/2+16));
238
239 auto spr_nonpremulti = Sprite::create("Images/fire.png");
240 spr_nonpremulti->setPosition(Vec2(s.width/2-16, s.height/2-16));
241
242 /* A2 & B2 setup */
243 auto rend = RenderTexture::create(32, 64, backend::PixelFormat::RGBA8888);
244
245 if (nullptr == rend)
246 {
247 return;
248 }
249
250 auto spr_size = spr_premulti->getContentSize();
251 rend->setKeepMatrix(true);
252 Size pixelSize = Director::getInstance()->getWinSizeInPixels();
253 rend->setVirtualViewport(Vec2(s.width/2-32, s.height/2-32),Rect(0,0,s.width,s.height),Rect(0,0,pixelSize.width,pixelSize.height));
254
255 // It's possible to modify the RenderTexture blending function by
256 // [[rend sprite] setBlendFunc:(BlendFunc) {BlendFactor::ONE, BlendFactor::ONE_MINUS_SRC_ALPHA}];
257 rend->begin();
258 spr_premulti->visit();
259 spr_nonpremulti->visit();
260 rend->end();
261
262 rend->setPosition(Vec2(s.width/2+16, s.height/2));
263
264 addChild(spr_nonpremulti);
265 addChild(spr_premulti);
266 addChild(rend);
267}
268
270{
271 return "Testing issue #937";
272}
273
275{
276 return "All images should be equal...";
277}
278
284{
285 auto listener = EventListenerTouchAllAtOnce::create();
286 listener->onTouchesBegan = CC_CALLBACK_2(RenderTextureZbuffer::onTouchesBegan, this);
287 listener->onTouchesMoved = CC_CALLBACK_2(RenderTextureZbuffer::onTouchesMoved, this);
288 listener->onTouchesEnded = CC_CALLBACK_2(RenderTextureZbuffer::onTouchesEnded, this);
289 _eventDispatcher->addEventListenerWithSceneGraphPriority(listener, this);
290
291 auto size = Director::getInstance()->getWinSize();
292 auto label = Label::createWithTTF("vertexZ = 50", "fonts/Marker Felt.ttf", 64);
293 label->setPosition(Vec2(size.width / 2, size.height * 0.25f));
294 this->addChild(label);
295
296 auto label2 = Label::createWithTTF("vertexZ = 0", "fonts/Marker Felt.ttf", 64);
297 label2->setPosition(Vec2(size.width / 2, size.height * 0.5f));
298 this->addChild(label2);
299
300 auto label3 = Label::createWithTTF("vertexZ = -50", "fonts/Marker Felt.ttf", 64);
301 label3->setPosition(Vec2(size.width / 2, size.height * 0.75f));
302 this->addChild(label3);
303
304 label->setPositionZ(50);
305 label2->setPositionZ(0);
306 label3->setPositionZ(-50);
307
308 SpriteFrameCache::getInstance()->addSpriteFramesWithFile("Images/bugs/circle.plist");
309 mgr = SpriteBatchNode::create("Images/bugs/circle.png", 9);
310 this->addChild(mgr);
311 sp1 = Sprite::createWithSpriteFrameName("circle.png");
312 sp2 = Sprite::createWithSpriteFrameName("circle.png");
313 sp3 = Sprite::createWithSpriteFrameName("circle.png");
314 sp4 = Sprite::createWithSpriteFrameName("circle.png");
315 sp5 = Sprite::createWithSpriteFrameName("circle.png");
316 sp6 = Sprite::createWithSpriteFrameName("circle.png");
317 sp7 = Sprite::createWithSpriteFrameName("circle.png");
318 sp8 = Sprite::createWithSpriteFrameName("circle.png");
319 sp9 = Sprite::createWithSpriteFrameName("circle.png");
320
321 mgr->addChild(sp1, 9);
322 mgr->addChild(sp2, 8);
323 mgr->addChild(sp3, 7);
324 mgr->addChild(sp4, 6);
325 mgr->addChild(sp5, 5);
326 mgr->addChild(sp6, 4);
327 mgr->addChild(sp7, 3);
328 mgr->addChild(sp8, 2);
329 mgr->addChild(sp9, 1);
330
331 sp1->setPositionZ(400);
332 sp2->setPositionZ(300);
333 sp3->setPositionZ(200);
334 sp4->setPositionZ(100);
335 sp5->setPositionZ(0);
336 sp6->setPositionZ(-100);
337 sp7->setPositionZ(-200);
338 sp8->setPositionZ(-300);
339 sp9->setPositionZ(-400);
340
341 sp9->setScale(2);
342 sp9->setColor(Color3B::YELLOW);
343}
344
346{
347 return "Testing Z Buffer in Render Texture";
348}
349
351{
352 return "Touch screen. It should be green";
353}
354
355void RenderTextureZbuffer::onTouchesBegan(const std::vector<Touch*>& touches, Event *event)
356{
357
358 for (auto &item: touches)
359 {
360 auto touch = static_cast<Touch*>(item);
361 auto location = touch->getLocation();
362
363 sp1->setPosition(location);
364 sp2->setPosition(location);
365 sp3->setPosition(location);
366 sp4->setPosition(location);
367 sp5->setPosition(location);
368 sp6->setPosition(location);
369 sp7->setPosition(location);
370 sp8->setPosition(location);
371 sp9->setPosition(location);
372 }
373}
374
375void RenderTextureZbuffer::onTouchesMoved(const std::vector<Touch*>& touches, Event* event)
376{
377 for (auto &item: touches)
378 {
379 auto touch = static_cast<Touch*>(item);
380 auto location = touch->getLocation();
381
382 sp1->setPosition(location);
383 sp2->setPosition(location);
384 sp3->setPosition(location);
385 sp4->setPosition(location);
386 sp5->setPosition(location);
387 sp6->setPosition(location);
388 sp7->setPosition(location);
389 sp8->setPosition(location);
390 sp9->setPosition(location);
391 }
392}
393
394void RenderTextureZbuffer::onTouchesEnded(const std::vector<Touch*>& touches, Event* event)
395{
396 this->renderScreenShot();
397}
398
400{
401 auto texture = RenderTexture::create(512, 512);
402 if (nullptr == texture)
403 {
404 return;
405 }
406
407 texture->begin();
408
409 this->visit();
410
411 texture->end();
412
413 auto sprite = Sprite::createWithTexture(texture->getSprite()->getTexture());
414
415 sprite->setPosition(Vec2(256, 256));
416 sprite->setOpacity(182);
417 sprite->setFlippedY(1);
418 this->addChild(sprite, 999999);
419 sprite->setColor(Color3B::GREEN);
420
421 sprite->runAction(Sequence::create(FadeTo::create(2, 0),
422 Hide::create(),
423 nullptr));
424}
425
427{
428 auto sprite1 = Sprite::create("Images/grossini.png");
429 auto sprite11 = Sprite::create("Images/grossini.png");
430 auto sprite2 = Sprite::create("Images/grossinis_sister1.png");
431 auto sprite22 = Sprite::create("Images/grossinis_sister1.png");
432 Size size = Director::getInstance()->getWinSize();
433 Size sprite1Size = sprite1->getContentSize();
434 sprite1->setPosition((size.width-sprite1Size.width)/2 - 20, (size.height - sprite1Size.height)/2 - 20);
435 sprite11->setPosition(size.width/2 + 20, (size.height - sprite1Size.height)/2 - 20);
436
437 sprite2->setPosition((size.width-sprite1Size.width)/2 - 20, size.height/2 + 20);
438 sprite22->setPosition(size.width/2 + 20, size.height/2 + 20);
439
440 addChild(sprite1);
441 addChild(sprite11);
442 addChild(sprite2);
443 addChild(sprite22);
444
445 _rend = RenderTexture::create(200, 200, backend::PixelFormat::RGBA8888);
446 _rend->retain();
447 _rend->setKeepMatrix(true);
448 Size pixelSize = Director::getInstance()->getWinSizeInPixels();
449 _rend->setVirtualViewport(Vec2(size.width/2-150, size.height/2-150),Rect(0,0,size.width,size.height),Rect(0,0,pixelSize.width,pixelSize.height));
450
451 _rend->beginWithClear(1, 0, 0, 1);
452 sprite1->visit();
453 sprite11->visit();
454 sprite2->visit();
455 sprite22->visit();
456 _rend->end();
457
458 _spriteDraw = Sprite::createWithTexture(_rend->getSprite()->getTexture());
459 FiniteTimeAction* baseAction = MoveBy::create(1, Vec2(size.width,0.0f));
460 _spriteDraw->setPosition(0,size.height/2);
461 _spriteDraw->setScaleY(-1);
462 _spriteDraw->runAction(RepeatForever::create(Sequence::create
463 (baseAction,baseAction->reverse(), nullptr)));
464 addChild(_spriteDraw);
465}
466
468{
469 CC_SAFE_RELEASE(_rend);
470}
471
473{
474 return "Render Texture Part Test";
475}
476
478{
479 return "Only Grabbing a sub region of fullscreen";
480}
481
482// RenderTextureTestDepthStencil
483
485{
486 auto s = Director::getInstance()->getWinSize();
487
488 _spriteDS = Sprite::create("Images/fire.png");
489 _spriteDS->retain();
490 _spriteDS->setPosition(Vec2(s.width * 0.25f, 0.0f));
491 _spriteDS->setScale(10);
492
493 _spriteDraw = Sprite::create("Images/fire.png");
494 _spriteDraw->retain();
495 _spriteDraw->setPosition(Vec2(s.width * 0.25f, 0.0f));
496 _spriteDraw->setScale(10);
498 _spriteDraw->setPosition(_spriteDraw->getPosition() + Vec2(_spriteDraw->getContentSize().width * _spriteDraw->getScale() * 0.5f, _spriteDraw->getContentSize().height * _spriteDraw->getScale() * 0.5f));
499
500 _rend = RenderTexture::create(s.width, s.height, backend::PixelFormat::RGBA4444, PixelFormat::D24S8);
501
502 _rend->setPosition(Vec2(s.width * 0.5f, s.height * 0.5f));
503
504 this->addChild(_rend);
505}
506
508{
509 CC_SAFE_RELEASE(_spriteDraw);
510 CC_SAFE_RELEASE(_spriteDS);
511}
512
513void RenderTextureTestDepthStencil::draw(Renderer *renderer, const Mat4 &transform, uint32_t flags)
514{
515 _renderCmds[0].init(_globalZOrder);
516 _renderCmds[0].func = CC_CALLBACK_0(RenderTextureTestDepthStencil::onBeforeClear, this);
517 renderer->addCommand(&_renderCmds[0]);
518
519 _rend->beginWithClear(0, 0, 0, 0, 0, 0);
520
521 _renderCmds[1].init(_globalZOrder);
522 _renderCmds[1].func = CC_CALLBACK_0(RenderTextureTestDepthStencil::onBeforeStencil, this);
523 renderer->addCommand(&_renderCmds[1]);
524
525 _spriteDS->visit();
526
527 _renderCmds[2].init(_globalZOrder);
528 _renderCmds[2].func = CC_CALLBACK_0(RenderTextureTestDepthStencil::onBeforeDraw, this);
529 renderer->addCommand(&_renderCmds[2]);
530
531 _spriteDraw->visit();
532
533 _rend->end();
534
535 _renderCmds[3].init(_globalZOrder);
536 _renderCmds[3].func = CC_CALLBACK_0(RenderTextureTestDepthStencil::onAfterDraw, this);
537 renderer->addCommand(&_renderCmds[3]);
538}
539
541{
542 Director::getInstance()->getRenderer()->setStencilWriteMask(0xFF);
543}
544
546{
548 auto renderer = Director::getInstance()->getRenderer();
549 renderer->setStencilTest(true);
550 renderer->setStencilCompareFunction(backend::CompareFunction::NEVER, 1, 0xFF);
551 renderer->setStencilOperation(backend::StencilOperation::REPLACE, backend::StencilOperation::REPLACE, backend::StencilOperation::REPLACE);
552}
553
555{
556 Director::getInstance()->getRenderer()->setStencilCompareFunction(backend::CompareFunction::NOT_EQUAL, 1, 0xFF);
557}
558
560{
561 Director::getInstance()->getRenderer()->setStencilTest(false);
562}
563
565{
566 return "Testing depthStencil attachment";
567}
568
570{
571 return "Circle should be missing 1/4 of its region";
572}
573
574// RenderTextureTest
576{
577 /*
578 * 1 2
579 * A: A1 A2
580 *
581 * B: B1 B2
582 *
583 * A1: premulti sprite
584 * A2: premulti render
585 *
586 * B1: non-premulti sprite
587 * B2: non-premulti render
588 */
589 auto background = LayerColor::create(Color4B(40,40,40,255));
590 addChild(background);
591
592 // sprite 1
593 sprite1 = Sprite::create("Images/fire.png");
594
595 // sprite 2
596 sprite2 = Sprite::create("Images/fire_rgba8888.pvr");
597
598 auto s = Director::getInstance()->getWinSize();
599
600 /* Create the render texture */
601 auto renderTexture = RenderTexture::create(s.width, s.height, backend::PixelFormat::RGBA4444);
603
604 renderTexture->setPosition(Vec2(s.width/2, s.height/2));
605 // renderTexture->setScale(2.0f);
606
607 /* add the sprites to the render texture */
608 renderTexture->addChild(sprite1);
609 renderTexture->addChild(sprite2);
610 renderTexture->setClearColor(Color4F(0, 0, 0, 0));
611 renderTexture->setClearFlags(ClearFlag::COLOR);
612
613 /* add the render texture to the scene */
614 addChild(renderTexture);
615
616 renderTexture->setAutoDraw(true);
617
618 scheduleUpdate();
619
620 // Toggle clear on / off
621 auto item = MenuItemFont::create("Clear On/Off", CC_CALLBACK_1(RenderTextureTargetNode::touched, this));
622 auto menu = Menu::create(item, nullptr);
623 addChild(menu);
624
625 menu->setPosition(Vec2(s.width/2, s.height/2));
626}
627
629{
630 //TODO: minggo
631 if (renderTexture->getClearFlags() == ClearFlag::NONE)
632 {
633 renderTexture->setClearFlags(ClearFlag::COLOR);
634 }
635 else
636 {
637 renderTexture->setClearFlags(ClearFlag::NONE);
638 renderTexture->setClearColor(Color4F( CCRANDOM_0_1(), CCRANDOM_0_1(), CCRANDOM_0_1(), 1));
639 }
640}
641
643{
644 static float time = 0;
645 float r = 80;
646 sprite1->setPosition(Vec2(cosf(time * 2) * r, sinf(time * 2) * r));
647 sprite2->setPosition(Vec2(sinf(time * 2) * r, cosf(time * 2) * r));
648
649 time += dt;
650}
651
653{
654 return "Testing Render Target Node";
655}
656
658{
659 return "Sprites should be equal and move with each frame";
660}
661
662// SpriteRenderTextureBug
663
666{
667 CC_SAFE_RELEASE(_rt);
668}
669
671{
672 auto sprite = new (std::nothrow) SimpleSprite();
673 if (sprite && sprite->initWithFile(filename, rect))
674 {
675 sprite->autorelease();
676 }
677 else
678 {
679 CC_SAFE_DELETE(sprite);
680 }
681
682 return sprite;
683}
684
685void SpriteRenderTextureBug::SimpleSprite::draw(Renderer *renderer, const Mat4 &transform, uint32_t flags)
686{
687 if (_rt == nullptr)
688 {
689 auto s = Director::getInstance()->getWinSize();
690 _rt = RenderTexture::create(s.width, s.height, backend::PixelFormat::RGBA8888);
691 _rt->retain();
692 }
693 _rt->beginWithClear(0.0f, 0.0f, 0.0f, 1.0f);
694 _rt->end();
695
696 Sprite::draw(renderer, transform, flags);
697
698}
699
701{
702 auto listener = EventListenerTouchAllAtOnce::create();
703 listener->onTouchesEnded = CC_CALLBACK_2(SpriteRenderTextureBug::onTouchesEnded, this);
704 _eventDispatcher->addEventListenerWithSceneGraphPriority(listener, this);
705
706 auto s = Director::getInstance()->getWinSize();
707 addNewSpriteWithCoords(Vec2(s.width/2, s.height/2));
708}
709
711{
712 int idx = CCRANDOM_0_1() * 1400 / 100;
713 int x = (idx%5) * 85;
714 int y = (idx/5) * 121;
715
716 auto sprite = SpriteRenderTextureBug::SimpleSprite::create("Images/grossini_dance_atlas.png",
717 Rect(x,y,85,121));
718 addChild(sprite);
719
720 sprite->setPosition(p);
721
722 FiniteTimeAction *action = nullptr;
723 float rd = CCRANDOM_0_1();
724
725 if (rd < 0.20)
726 action = ScaleBy::create(3, 2);
727 else if (rd < 0.40)
728 action = RotateBy::create(3, 360);
729 else if (rd < 0.60)
730 action = Blink::create(1, 3);
731 else if (rd < 0.8 )
732 action = TintBy::create(2, 0, -255, -255);
733 else
734 action = FadeOut::create(2);
735
736 auto action_back = action->reverse();
737 auto seq = Sequence::create(action, action_back, nullptr);
738
739 sprite->runAction(RepeatForever::create(seq));
740
741 //return sprite;
742 return nullptr;
743}
744
745void SpriteRenderTextureBug::onTouchesEnded(const std::vector<Touch*>& touches, Event* event)
746{
747 for (auto &touch: touches)
748 {
749 auto location = touch->getLocation();
750 addNewSpriteWithCoords(location);
751 }
752}
753
755{
756 return "SpriteRenderTextureBug";
757}
758
760{
761 return "Touch the screen. Sprite should appear on under the touch";
762}
763
764
765//
766// Issue16113Test
767//
769{
770 auto s = Director::getInstance()->getWinSize();
771
772 // Save Image menu
773 MenuItemFont::setFontSize(16);
774 auto item1 = MenuItemFont::create("Save Image", [&](Ref* ref){
775 auto winSize = Director::getInstance()->getVisibleSize();
776 auto text = Label::createWithTTF("hello world", "fonts/Marker Felt.ttf", 40);
777 text->setTextColor(Color4B::RED);
778 auto target = RenderTexture::create(winSize.width, winSize.height, backend::PixelFormat::RGBA8888);
779 target->beginWithClear(0,0,0,0);
780 text->setPosition(winSize.width / 2,winSize.height/2);
781 text->Node::visit();
782 target->end();
783 auto callback = [&](RenderTexture* rt, const std::string& path){
784 rt->release();
785 };
786 target->retain();
787 target->saveToFile("issue16113.png", Image::Format::PNG, true, callback);
788 });
789 auto menu = Menu::create(item1, nullptr);
790 this->addChild(menu);
791 menu->setPosition(s.width/2, s.height/2);
792}
793
794std::string Issue16113Test::title() const
795{
796 return "Github Issue 16113";
797}
798
799std::string Issue16113Test::subtitle() const
800{
801 return "aaa.png file without white border on iOS";
802}
803
804//
805// RenderTextureWithSprite3DIssue16894
806//
808{
809 auto visibleSize = Director::getInstance()->getVisibleSize();
810 Vec2 origin = Director::getInstance()->getVisibleOrigin();
811
812 for (int i = 0; i < 3; ++i)
813 {
814 // Ship - Model is from cocos2d-x test project
815 auto ship = Sprite3D::create("Sprite3DTest/boss.c3b");
816 ship->setScale(6);
817 ship->setRotation3D(Vec3(180.0f,45.0f,0.0f));
818 ship->setPosition(Vec2(visibleSize.width/4 + origin.x, visibleSize.height/2 + origin.y));
819 ship->setForce2DQueue(true);
820 ship->retain();
821
822 if (i == 0)
823 {
824 addChild(ship, 1);
826 auto spin = RotateBy::create(4, Vec3(0.0f,180.0f,0.0f));
827 auto repeatspin = RepeatForever::create(spin);
828 ship->runAction(repeatspin);
829 }
830 _ship[i] = ship;
831 }
832
833 // RenderTextures
834 _renderTexDefault = RenderTexture::create(visibleSize.width, visibleSize.height, backend::PixelFormat::RGBA8888);
835 _renderTexDefault->setKeepMatrix(true);
836 addChild(_renderTexDefault);
837 _renderTexDefault->setPosition(visibleSize.width/4 * 3, visibleSize.height/2);
838
839 _renderTexWithBuffer = RenderTexture::create(visibleSize.width, visibleSize.height, backend::PixelFormat::RGBA8888, backend::PixelFormat::D24S8);
840 _renderTexWithBuffer->setKeepMatrix(true);
841 addChild(_renderTexWithBuffer);
842 _renderTexWithBuffer->setPosition(visibleSize.width/4 * 4, visibleSize.height/2);
843
844 // Update
845 scheduleUpdate();
846
847 auto label1 = Label::createWithTTF("Normal Sprite3D\n", "fonts/arial.ttf", 10);
848 label1->setPosition(Vec2(visibleSize.width/4 * 1, 60.0f));
849 this->addChild(label1, 1);
850
851 auto label2 = Label::createWithTTF("RenderTexture\nDefault - No depth buffer", "fonts/arial.ttf", 10);
852 label2->setPosition(Vec2(visibleSize.width/4 * 2, 60.0f));
853 this->addChild(label2, 1);
854
855 auto label3 = Label::createWithTTF("RenderTexture\nGL_DEPTH24_STENCIL8", "fonts/arial.ttf", 10);
856 label3->setPosition(Vec2(visibleSize.width/4 * 3, 60.0f));
857 this->addChild(label3, 1);
858}
859
861{
862 for (int i = 0; i < 3; ++i)
863 {
864 _ship[i]->release();
865 }
866}
867
868void RenderTextureWithSprite3DIssue16894::visit(Renderer *renderer, const Mat4& parentTransform, uint32_t parentFlags)
869{
870 RenderTextureTest::visit(renderer, parentTransform, parentFlags);
871
872 _ship[1]->setRotation3D(_ship[0]->getRotation3D());
873 _ship[2]->setRotation3D(_ship[0]->getRotation3D());
874
875 _renderTexDefault->beginWithClear(0, 0, 0, 0, 0, 0);
876 _ship[1]->visit(Director::getInstance()->getRenderer(), Mat4::IDENTITY, 0);
877 _renderTexDefault->end();
878
879 _renderTexWithBuffer->beginWithClear(0, 0, 0, 0, 1, 0);
880 _ship[2]->visit(Director::getInstance()->getRenderer(), Mat4::IDENTITY, 0);
881 _renderTexWithBuffer->end();
882}
883
885{
886 return "Issue16894: Render Sprite3D to texture";
887}
888
890{
891 return "3 ships, 1st & 3rd are the same";
892}
#define ADD_TEST_CASE(__className__)
Definition: BaseTest.h:211
virtual std::string title() const override
virtual std::string subtitle() const override
virtual std::string title() const override
virtual std::string subtitle() const override
virtual std::string subtitle() const override
virtual std::string title() const override
cocos2d::RenderTexture * _rend
cocos2d::Sprite * _spriteDraw
cocos2d::Vector< cocos2d::Sprite * > _brushs
virtual std::string subtitle() const override
void clearImage(cocos2d::Ref *pSender)
void onTouchesMoved(const std::vector< cocos2d::Touch * > &touches, cocos2d::Event *event)
cocos2d::RenderTexture * _target
void saveImageWithNonPremultipliedAlpha(cocos2d::Ref *pSender)
void saveImageWithPremultipliedAlpha(cocos2d::Ref *pSender)
virtual std::string title() const override
void addImage(cocos2d::Ref *sender)
void clearImageTransparent(cocos2d::Ref *sender)
cocos2d::Sprite * sprite1
virtual void update(float t) override
void touched(cocos2d::Ref *sender)
virtual std::string subtitle() const override
cocos2d::Sprite * sprite2
virtual std::string title() const override
cocos2d::RenderTexture * renderTexture
virtual std::string title() const override
cocos2d::CallbackCommand _renderCmds[4]
virtual std::string subtitle() const override
cocos2d::RenderTexture * _rend
virtual void draw(cocos2d::Renderer *renderer, const cocos2d::Mat4 &transform, uint32_t flags) override
virtual std::string title() const override
virtual std::string subtitle() const override
virtual void visit(cocos2d::Renderer *renderer, const cocos2d::Mat4 &parentTransform, uint32_t parentFlags) override
cocos2d::Sprite * sp4
cocos2d::Sprite * sp3
void onTouchesEnded(const std::vector< cocos2d::Touch * > &touches, cocos2d::Event *event)
cocos2d::Sprite * sp2
cocos2d::Sprite * sp1
cocos2d::SpriteBatchNode * mgr
cocos2d::Sprite * sp5
cocos2d::Sprite * sp7
void onTouchesMoved(const std::vector< cocos2d::Touch * > &touches, cocos2d::Event *event)
cocos2d::Sprite * sp9
cocos2d::Sprite * sp8
virtual std::string subtitle() const override
void onTouchesBegan(const std::vector< cocos2d::Touch * > &touches, cocos2d::Event *event)
cocos2d::Sprite * sp6
virtual std::string title() const override
virtual void draw(cocos2d::Renderer *renderer, const cocos2d::Mat4 &transform, uint32_t flags)
static SimpleSprite * create(const char *filename, const cocos2d::Rect &rect)
virtual std::string subtitle() const override
void onTouchesEnded(const std::vector< cocos2d::Touch * > &touches, cocos2d::Event *event)
SimpleSprite * addNewSpriteWithCoords(const cocos2d::Vec2 &p)
virtual std::string title() const override
static cocos2d::Vec2 rightTop()
Definition: VisibleRect.cpp:81