26#include "../testResource.h"
28#include "renderer/ccShaders.h"
29#include "renderer/backend/Device.h"
34#define SET_UNIFORM(ps, name, value) do { \
35decltype(value) __v = value; \
36auto __loc = (ps)->getUniformLocation(name); \
37(ps)->setUniform(__loc, &__v, sizeof(__v)); \
40#define SET_TEXTURE(ps, name, idx, value) do { \
42auto __loc = (ps)->getUniformLocation(name); \
43(ps)->setTexture(__loc, idx, __v); \
48ShaderTests::ShaderTests()
75:_center(Vec2(0.0f, 0.0f))
76,_resolution(Vec2(0.0f, 0.0f))
88 node->initWithVertex(vert, frag);
107 setAnchorPoint(Vec2(0.5f, 0.5f));
110 auto layout = _programState->getVertexLayout();
111 layout->setAttribute(
"a_position", 0, backend::VertexFormat::FLOAT2, 0,
false);
114 Vec2 vertices[6] = { Vec2(0.0f,0.0f), Vec2(w,0.0f), Vec2(w,h), Vec2(0.0f,0.0f), Vec2(0.0f,h), Vec2(w,h) };
115 layout->setLayout(
sizeof(Vec2));
123 _customCommand.createVertexBuffer(
sizeof(Vec2), 6, CustomCommand::BufferUsage::STATIC);
133 auto fileUtiles = FileUtils::getInstance();
136 auto fragmentFilePath = fileUtiles->fullPathForFilename(frag);
137 auto fragSource = fileUtiles->getStringFromFile(fragmentFilePath);
140 std::string vertSource;
142 vertSource = position_vert;
144 std::string vertexFilePath = fileUtiles->fullPathForFilename(vert);
145 vertSource = fileUtiles->getStringFromFile(vertexFilePath);
147 auto program = backend::Device::getInstance()->newProgram(vertSource.c_str(), fragSource.c_str());
148 auto programState =
new backend::ProgramState(program);
150 CC_SAFE_RELEASE(programState);
151 CC_SAFE_RELEASE(program);
161 Node::setPosition(newPosition);
162 auto position = getPosition();
163 auto frameSize = Director::getInstance()->getOpenGLView()->getFrameSize();
164 auto visibleSize = Director::getInstance()->getVisibleSize();
165 auto retinaFactor = Director::getInstance()->getOpenGLView()->getRetinaFactor();
166 _center = Vec2(position.x * frameSize.width / visibleSize.width * retinaFactor, position.y * frameSize.height / visibleSize.height * retinaFactor);
177 auto projectionMatrix = Director::getInstance()->getMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_PROJECTION);
178 auto finalMatrix = projectionMatrix * transform;
180 _programState->setUniform(
_locMVP, finalMatrix.m,
sizeof(finalMatrix.m));
182 float time = Director::getInstance()->getTotalFrames() * Director::getInstance()->getAnimationInterval();
183 Vec4 uTime(time / 10.0f, time, time * 2.0f, time * 4.0f);
184 Vec4 sinTime(time / 8.0f, time / 4.0f, time / 2.0f, sinf(time));
185 Vec4 cosTime(time / 8.0f, time / 4.0f, time / 2.0f, cosf(time));
187 _programState->setUniform(
_locTime, &uTime,
sizeof(uTime));
188 _programState->setUniform(
_locSinTime, &sinTime,
sizeof(sinTime));
189 _programState->setUniform(
_locCosTime, &cosTime,
sizeof(cosTime));
192 CC_INCREMENT_GL_DRAWN_BATCHES_AND_VERTICES(1, 6);
197 if(_programState ==
nullptr)
201 _locCenter = _programState->getUniformLocation(
"center");
202 _locMVP = _programState->getUniformLocation(
"u_MVPMatrix");
203 _locTime = _programState->getUniformLocation(
"u_Time");
204 _locSinTime = _programState->getUniformLocation(
"u_SinTime");
205 _locCosTime = _programState->getUniformLocation(
"u_CosTime");
206 _locScreenSize = _programState->getUniformLocation(
"u_screenSize");
208 const Vec2& frameSize = Director::getInstance()->getOpenGLView()->getFrameSize();
209 float retinaFactor = Director::getInstance()->getOpenGLView()->getRetinaFactor();
210 auto screenSizeInPixels = frameSize * retinaFactor;
211 _programState->setUniform(
_locScreenSize, &screenSizeInPixels,
sizeof(screenSizeInPixels));
222 if (ShaderTestDemo::init())
226 auto s = Director::getInstance()->getWinSize();
227 sn->setPosition(Vec2(s.width/2, s.height/2));
239 return "Shader: Frag shader";
244 return "Monjori plane deformations";
255 if (ShaderTestDemo::init())
259 auto s = Director::getInstance()->getWinSize();
260 sn->setPosition(Vec2(s.width/2, s.height/2));
271 return "Shader: Frag shader";
276 return "Mandelbrot shader with Zoom";
286 if (ShaderTestDemo::init())
290 auto s = Director::getInstance()->getWinSize();
291 sn->setPosition(Vec2(s.width/2, s.height/2));
302 return "Shader: Frag shader";
307 return "Julia shader";
318 if (ShaderTestDemo::init())
322 auto s = Director::getInstance()->getWinSize();
323 sn->setPosition(Vec2(s.width/2, s.height/2));
335 return "Shader: Frag shader";
350 if (ShaderTestDemo::init())
354 auto s = Director::getInstance()->getWinSize();
355 sn->setPosition(Vec2(s.width/2, s.height/2));
367 return "Shader: Frag shader";
382 if (ShaderTestDemo::init())
386 auto s = Director::getInstance()->getWinSize();
387 sn->setPosition(Vec2(s.width/2, s.height/2));
399 return "Shader: Frag shader";
434 bool result = pRet->initWithFile(
"");
435 log(
"Test call Sprite::initWithFile with bad file name result is : %s", result ?
"true" :
"false");
438 if (pRet && pRet->initWithFile(pszFileName))
444 CC_SAFE_DELETE(pRet);
453 if( Sprite::initWithTexture(texture, rect) )
455#if CC_ENABLE_CACHE_TEXTURE_DATA
456 auto listener = EventListenerCustom::create(EVENT_RENDERER_RECREATED, [
this](EventCustom* event){
460 _eventDispatcher->addEventListenerWithSceneGraphPriority(listener,
this);
473 std::string fragSource = FileUtils::getInstance()->getStringFromFile(
474 FileUtils::getInstance()->fullPathForFilename(
"Shaders/example_Blur.fsh"));
476 auto program = backend::Device::getInstance()->newProgram(positionTextureColor_vert, fragSource.data());
477 auto programState =
new backend::ProgramState(program);
478 setProgramState(programState);
479 CC_SAFE_RELEASE(programState);
480 CC_SAFE_RELEASE(program);
482 auto size = getTexture()->getContentSizeInPixels();
487 SET_UNIFORM(_programState,
"u_PMatrix", Director::getInstance()->getMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_PROJECTION));
510 return "Shader: Frag shader";
515 return "Gaussian blur";
520 auto screenSize = Director::getInstance()->getWinSize();
523 ControlSlider *slider = ControlSlider::create(
"extensions/sliderTrack.png",
"extensions/sliderProgress.png" ,
"extensions/sliderThumb.png");
524 slider->setAnchorPoint(Vec2(0.5f, 1.0f));
525 slider->setMinimumValue(0.0f);
526 slider->setMaximumValue(25.0f);
527 slider->setScale(0.6f);
528 slider->setPosition(Vec2(screenSize.width / 4.0f, screenSize.height / 3.0f + 24.0f));
529 slider->addTargetWithActionForControlEvents(
this, cccontrol_selector(
ShaderBlur::onRadiusChanged), Control::EventType::VALUE_CHANGED);
530 slider->setValue(2.0f);
534 auto label = Label::createWithTTF(
"Blur Radius",
"fonts/arial.ttf", 12.0f);
536 label->setPosition(Vec2(screenSize.width / 4.0f, screenSize.height / 3.0f));
540 ControlSlider *slider = ControlSlider::create(
"extensions/sliderTrack.png",
"extensions/sliderProgress.png" ,
"extensions/sliderThumb.png");
541 slider->setAnchorPoint(Vec2(0.5f, 1.0f));
542 slider->setMinimumValue(0.0f);
543 slider->setMaximumValue(11.0f);
544 slider->setScale(0.6f);
545 slider->setPosition(Vec2(screenSize.width / 4.0f, screenSize.height / 3.0f - 10.0f));
547 slider->setValue(7.0f);
551 auto label = Label::createWithTTF(
"Blur Sample Num",
"fonts/arial.ttf", 12.0f);
553 label->setPosition(Vec2(screenSize.width / 4.0f, screenSize.height / 3.0f - 34.0f));
560 if( ShaderTestDemo::init() )
563 auto sprite = Sprite::create(
"Images/grossini.png");
564 auto s = Director::getInstance()->getWinSize();
565 _blurSprite->setPosition(Vec2(s.width/3, s.height/2 + 30.0f));
566 sprite->setPosition(Vec2(2*s.width/3, s.height/2 + 30.0f));
571 auto label = Label::createWithTTF(
"Normal Sprite",
"fonts/arial.ttf", 12.0f);
573 label->setPosition(Vec2(2*s.width/3, s.height/3.0f));
584 ControlSlider* slider = (ControlSlider*)sender;
590 ControlSlider* slider = (ControlSlider*)sender;
604 if( ShaderTestDemo::init() ) {
606 auto fragStr = FileUtils::getInstance()->getStringFromFile(FileUtils::getInstance()->fullPathForFilename(
"Shaders/example_HorizontalColor.fsh"));
607 char * fragSource = (
char*)fragStr.c_str();
609 auto program = backend::Device::getInstance()->newProgram(positionTextureColor_vert, fragSource);
610 auto p =
new backend::ProgramState(program);
611 auto director = Director::getInstance();
612 const auto& screenSizeLocation = p->getUniformLocation(
"u_screenSize");
613 const auto& frameSize = director->getOpenGLView()->getFrameSize();
614 float retinaFactor = director->getOpenGLView()->getRetinaFactor();
615 auto screenSizeInPixels = frameSize * retinaFactor;
616 p->setUniform(screenSizeLocation, &screenSizeInPixels,
sizeof(screenSizeInPixels));
618 auto s = director->getWinSize();
620 _label = Label::createWithBMFont(
"fonts/west_england-64.fnt",
"RETRO EFFECT");
621 _label->setAnchorPoint(Vec2::ANCHOR_MIDDLE);
622 _label->setProgramState(p);
625 _label->setPosition(Vec2(s.width/2,s.height/2));
630 CC_SAFE_RELEASE(program);
640 int letterCount =
_label->getStringLength();
641 for (
int i = 0; i < letterCount; ++i)
643 auto sprite =
_label->getLetter(i);
644 if (sprite !=
nullptr)
646 auto oldPosition = sprite->getPosition();
647 sprite->setPosition(Vec2( oldPosition.x, sinf(
_accum * 2 + i/2.0) * 20 ));
650 float scaleY = ( sinf(
_accum * 2 + i/2.0 + 0.707) );
652 sprite->setScaleY(scaleY);
659 return "Shader: Retro test";
664 return "sin() effect with moving colors";
674 return "ShaderToy Test";
684 if (ShaderTestDemo::init())
688 auto s = Director::getInstance()->getWinSize();
689 sn->setPosition(Vec2(s.width/2, s.height/2));
690 sn->setContentSize(Size(s.width/2,s.height/2));
708 return "ShaderToy Test";
718 if (ShaderTestDemo::init())
722 auto s = Director::getInstance()->getWinSize();
723 sn->setPosition(Vec2(s.width/2, s.height/2));
724 sn->setContentSize(Size(s.width/2,s.height/2));
742 return "MultiTexture test";
747 return "MultiTexture";
752 auto screenSize = Director::getInstance()->getWinSize();
754 ui::Slider* slider = ui::Slider::create();
755 slider->loadBarTexture(
"cocosui/sliderTrack.png");
756 slider->loadSlidBallTextures(
"cocosui/sliderThumb.png",
"cocosui/sliderThumb.png",
"");
757 slider->loadProgressBarTexture(
"cocosui/sliderProgress.png");
758 slider->setPercent(50);
760 slider->setPosition(Vec2(screenSize.width / 2.0f, screenSize.height / 3.0f));
763 slider->addEventListener([&](Ref* sender, ui::Slider::EventType type) {
765 if (type == ui::Slider::EventType::ON_PERCENTAGE_CHANGED)
767 ui::Slider* slider =
dynamic_cast<ui::Slider*
>(sender);
768 float p = slider->getPercent() / 100.0f;
769 auto state =
_sprite->getProgramState();
778 if (ShaderTestDemo::init())
780 auto s = Director::getInstance()->getWinSize();
783 auto left = Sprite::create(
"Images/grossinis_sister1.png");
785 left->setPosition(s.width*1/4, s.height/2);
788 auto right = Sprite::create(
"Images/grossinis_sister2.png");
790 right->setPosition(s.width*3/4, s.height/2);
794 _sprite = Sprite::createWithTexture(left->getTexture());
796 _sprite->setPosition(Vec2(s.width/2, s.height/2));
798 auto * fu = FileUtils::getInstance();
799 auto vertexShader = fu->getStringFromFile(
"Shaders/example_MultiTexture.vsh");
800 auto fragmentShader = fu->getStringFromFile(
"Shaders/example_MultiTexture.fsh");
801 auto program = backend::Device::getInstance()->newProgram(vertexShader.c_str(), fragmentShader.c_str());
802 auto programState =
new backend::ProgramState(program);
803 _sprite->setProgramState(programState);
805 SET_TEXTURE(programState,
"u_texture1", 1, right->getTexture()->getBackendTexture());
812 auto label = Label::createWithTTF(TTFConfig(
"fonts/arial.ttf"),
"change");
814 auto menu = Menu::create(mi,
nullptr);
816 menu->setPosition(s.width * 7 / 8, s.height / 2);
818 CC_SAFE_RELEASE(programState);
819 CC_SAFE_RELEASE(program);
828 static const int textureFilesCount = 3;
829 static const std::string textureFiles[textureFilesCount] = {
830 "Images/grossini.png",
831 "Images/grossinis_sister1.png",
832 "Images/grossinis_sister2.png"
834 auto texture = Director::getInstance()->getTextureCache()->addImage(textureFiles[
_changedTextureId++ % textureFilesCount]);
835 Sprite* right =
dynamic_cast<Sprite*
>(getChildByTag(
rightSpriteTag));
836 right->setTexture(texture);
837 auto programState =
_sprite->getProgramState();
838 SET_TEXTURE(programState,
"u_texture1", 1, right->getTexture()->getBackendTexture());
#define ADD_TEST_CASE(__className__)
#define SET_TEXTURE(ps, name, idx, value)
#define SET_UNIFORM(ps, name, value)
virtual std::string title() const override
cocos2d::extension::ControlSlider * _sliderNumCtrl
void onRadiusChanged(cocos2d::Ref *sender, cocos2d::extension::Control::EventType controlEvent)
void onSampleNumChanged(cocos2d::Ref *sender, cocos2d::extension::Control::EventType controlEvent)
virtual bool init() override
virtual std::string subtitle() const override
cocos2d::extension::ControlSlider * _sliderRadiusCtl
ShaderFlower()
ShaderFlower
virtual std::string subtitle() const override
virtual bool init() override
virtual std::string title() const override
virtual bool init() override
virtual std::string subtitle() const override
virtual std::string title() const override
virtual std::string title() const override
virtual std::string subtitle() const override
virtual bool init() override
virtual bool init() override
virtual std::string subtitle() const override
virtual std::string title() const override
virtual std::string subtitle() const override
virtual std::string title() const override
virtual bool init() override
virtual std::string title() const override
ShaderMandelbrot()
ShaderMandelbrot
virtual std::string subtitle() const override
virtual bool init() override
ShaderMonjori()
ShaderMonjori
virtual std::string title() const override
virtual bool init() override
virtual std::string subtitle() const override
static const int rightSpriteTag
void changeTexture(cocos2d::Ref *)
cocos2d::ui::Slider * createSliderCtl()
virtual bool init() override
virtual std::string title() const override
cocos2d::Sprite * _sprite
virtual std::string subtitle() const override
cocos2d::Vec2 _resolution
std::string _fragFileName
void loadShaderVertex(const std::string &vert, const std::string &frag)
virtual void update(float dt) override
cocos2d::backend::UniformLocation _locSinTime
cocos2d::backend::UniformLocation _locScreenSize
virtual void draw(cocos2d::Renderer *renderer, const cocos2d::Mat4 &transform, uint32_t flags) override
cocos2d::backend::UniformLocation _locCosTime
virtual void setPosition(const cocos2d::Vec2 &newPosition) override
cocos2d::backend::UniformLocation _locTime
bool initWithVertex(const std::string &vert, const std::string &frag)
cocos2d::backend::UniformLocation _locMVP
virtual void setProgramState(cocos2d::backend::ProgramState *programState) override
cocos2d::backend::UniformLocation _locResolution
std::string _vertFileName
cocos2d::CustomCommand _customCommand
cocos2d::backend::UniformLocation _locCenter
static ShaderNode * shaderNodeWithVertex(const std::string &vert, const std::string &frag)
virtual std::string title() const override
virtual bool init() override
virtual std::string subtitle() const override
ShaderPlasma()
ShaderPlasma
virtual void update(float dt) override
virtual std::string title() const override
virtual bool init() override
virtual std::string subtitle() const override
void setBlurRadius(float radius)
static SpriteBlur * create(const char *pszFileName)
bool initWithTexture(Texture2D *texture, const Rect &rect)
void setBlurSampleNum(float num)