28#include "../testResource.h"
30#include "renderer/backend/Device.h"
35#define SET_UNIFORM(ps, name, value) do { \
36decltype(value) __v = value; \
37auto __loc = (ps)->getUniformLocation(name); \
38(ps)->setUniform(__loc, &__v, sizeof(__v)); \
41#define SET_TEXTURE(ps, name, idx, value) do { \
43auto __loc = (ps)->getUniformLocation(name); \
44(ps)->setTexture(__loc, idx, __v); \
48Shader2Tests::Shader2Tests()
57static int tuple_sort(
const std::tuple<ssize_t,Effect*,QuadCommand> &tuple1,
const std::tuple<ssize_t,Effect*,QuadCommand> &tuple2 )
59 return std::get<0>(tuple1) < std::get<0>(tuple2);
65 float time = Director::getInstance()->getTotalFrames() * Director::getInstance()->getAnimationInterval();
66 Vec4 uTime(time / 10.0f, time, time * 2.0f, time * 4.0f);
67 Vec4 sinTime(time / 8.0f, time / 4.0f, time / 2.0f, sinf(time));
68 Vec4 cosTime(time / 8.0f, time / 4.0f, time / 2.0f, cosf(time));
81 if(ret && ret->initWithFile(filename)) {
104 _effects.push_back(std::make_tuple(order,effect,QuadCommand()));
109 void draw(Renderer *renderer,
const Mat4 &transform, uint32_t flags)
override
113 _insideBounds = (flags & FLAGS_TRANSFORM_DIRTY) ? renderer->checkVisibility(transform, _contentSize) : _insideBounds;
122 if(std::get<0>(effect) >=0)
124 auto* programState = std::get<1>(effect)->getProgramState();
127 QuadCommand &q = std::get<2>(effect);
128 q.init(_globalZOrder, _texture, _blendFunc, &_quad, 1, transform, flags);
130 renderer->addCommand(&q);
136 _trianglesCommand.init(_globalZOrder, _texture, _blendFunc, _polyInfo.triangles, transform, flags);
138 updateUniforms(_trianglesCommand.getPipelineDescriptor().programState);
139 renderer->addCommand(&_trianglesCommand);
143 QuadCommand &q = std::get<2>(*it);
144 auto* programState = std::get<1>(*it)->getProgramState();
146 q.init(_globalZOrder, _texture, _blendFunc, &_quad, 1, transform, flags);
147 q.getPipelineDescriptor().programState = programState;
148 renderer->addCommand(&q);
160 std::get<1>(tuple)->release();
165 std::vector<std::tuple<ssize_t,Effect*,QuadCommand>>
_effects;
175 auto fileUtiles = FileUtils::getInstance();
176 auto fragmentFullPath = fileUtiles->fullPathForFilename(fragmentFilename);
177 auto fragSource = fileUtiles->getStringFromFile(fragmentFullPath);
179#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
182 auto program = backend::Device::getInstance()->newProgram(positionTextureColor_vert, fragSource.c_str());
183 auto programState =
new backend::ProgramState(program);
185 CC_SAFE_RELEASE(program);
210 bool init(
float blurRadius = 10.0f,
float sampleNum = 5.0f);
221 Size size = sprite->getTexture()->getContentSizeInPixels();
256 Vec3 color(1.0f, 0.2f, 0.3f);
257 float radius = 0.01f;
258 float threshold = 1.75;
281 auto s = sprite->getTexture()->getContentSizeInPixels();
300 auto s = sprite->getTexture()->getContentSizeInPixels();
345 auto s = sprite->getTexture()->getContentSizeInPixels();
364 auto s = sprite->getTexture()->getContentSizeInPixels();
383 auto s = sprite->getTexture()->getContentSizeInPixels();
385 s = Director::getInstance()->getWinSize();
398 if (normalMappedSprite && normalMappedSprite->
init() && normalMappedSprite->
initNormalMap(normalMapFileName))
401 normalMappedSprite->autorelease();
402 return normalMappedSprite;
404 CC_SAFE_DELETE(normalMappedSprite);
429 auto normalMapTexture = Director::getInstance()->getTextureCache()->addImage(normalMapFileName);
466 if (ShaderTestDemo2::init()) {
468 auto layer = LayerColor::create(Color4B::BLUE);
469 this->addChild(layer);
471 auto s = Director::getInstance()->getWinSize();
473 auto itemPrev = MenuItemImage::create(
"Images/b1.png",
"Images/b2.png",
481 auto itemNext = MenuItemImage::create(
"Images/f1.png",
"Images/f2.png",
489 auto menu = Menu::create(itemPrev, itemNext,
nullptr);
490 menu->alignItemsHorizontally();
492 menu->setAnchorPoint(Vec2(0.0f,0.0f));
493 menu->setPosition(Vec2(s.width/2,70.0f));
497 _sprite->setPosition(Vec2(0.0f, s.height/2));
500 auto jump = JumpBy::create(4, Vec2(s.width,0.0f), 100, 4);
501 auto rot = RotateBy::create(4, 720);
502 auto spawn = Spawn::create(jump, rot,
nullptr);
503 auto rev = spawn->reverse();
504 auto seq = Sequence::create(spawn, rev,
nullptr);
505 auto repeat = RepeatForever::create(seq);
509 _effects.pushBack(EffectBlur::create());
510 _effects.pushBack(EffectOutline::create());
511 _effects.pushBack(EffectNoise::create());
512 _effects.pushBack(EffectEdgeDetect::create());
513 _effects.pushBack(EffectGreyScale::create());
514 _effects.pushBack(EffectSepia::create());
515 _effects.pushBack(EffectBloom::create());
516 _effects.pushBack(EffectCelShading::create());
517 _effects.pushBack(EffectLensFlare::create());
536 if (ShaderTestDemo2::init()) {
538 auto s = Director::getInstance()->getWinSize();
541 _sprite->setPosition(Vec2(s.width/2, s.height/2));
546 Vec3 pos(150,150, 50);
549 _lightSprite->setPosition(Vec2(pos.x, s.height- pos.y));
550 Mat4 mat =
_sprite->getNodeToWorldTransform();
551 Point lightPosInLocalSpace = PointApplyAffineTransform(Vec2(pos.x, pos.y),
_sprite->getWorldToNodeAffineTransform());
552 lampEffect->setLightColor(Color4F(1,1,1,1));
553 lampEffect->setLightPos(Vec3(lightPosInLocalSpace.x, lightPosInLocalSpace.y, 50.0f));
554 lampEffect->setKBump(2);
557 auto listener = EventListenerTouchAllAtOnce::create();
561 _eventDispatcher->addEventListenerWithSceneGraphPriority(listener,
this);
570 for (
auto &item: touches )
573 auto s = Director::getInstance()->getWinSize();
574 Point loc_winSpace = touch->getLocationInView();
575 _lightSprite->setPosition(Vec2( loc_winSpace.x, s.height - loc_winSpace.y));
576 Vec3 pos(loc_winSpace.x,loc_winSpace.y, 50);
577 Mat4 mat =
_sprite->getNodeToWorldTransform();
578 Point lightPosInLocalSpace = PointApplyAffineTransform(Vec2(pos.x, pos.y),
_sprite->getWorldToNodeAffineTransform());
585 for (
auto &item: touches )
588 auto s = Director::getInstance()->getWinSize();
589 Point loc_winSpace = touch->getLocationInView();
590 _lightSprite->setPosition(Vec2( loc_winSpace.x, s.height - loc_winSpace.y));
591 Vec3 pos(loc_winSpace.x,loc_winSpace.y, 50);
592 Mat4 mat =
_sprite->getNodeToWorldTransform();
593 Point lightPosInLocalSpace = PointApplyAffineTransform(Vec2(pos.x, pos.y),
_sprite->getWorldToNodeAffineTransform());
600 for (
auto &item: touches )
603 auto s = Director::getInstance()->getWinSize();
604 Point loc_winSpace = touch->getLocationInView();
605 _lightSprite->setPosition(Vec2( loc_winSpace.x, s.height - loc_winSpace.y));
606 Vec3 pos(loc_winSpace.x,loc_winSpace.y, 50);
607 Mat4 mat =
_sprite->getNodeToWorldTransform();
608 Point lightPosInLocalSpace = PointApplyAffineTransform(Vec2(pos.x, pos.y),
_sprite->getWorldToNodeAffineTransform());
#define ADD_TEST_CASE(__className__)
static int tuple_sort(const std::tuple< ssize_t, Effect *, QuadCommand > &tuple1, const std::tuple< ssize_t, Effect *, QuadCommand > &tuple2)
static void updateUniforms(backend::ProgramState *programState)
#define SET_TEXTURE(ps, name, idx, value)
#define SET_UNIFORM(ps, name, value)
virtual void setTarget(EffectSprite *sprite) override
void setBlurSampleNum(float num)
virtual void setTarget(EffectSprite *sprite) override
bool init(float blurRadius=10.0f, float sampleNum=5.0f)
void setBlurRadius(float radius)
virtual void setTarget(EffectSprite *sprite) override
CREATE_FUNC(EffectCelShading)
CREATE_FUNC(EffectEdgeDetect)
virtual void setTarget(EffectSprite *sprite) override
CREATE_FUNC(EffectGreyScale)
cocos2d::backend::ProgramState * _programState
virtual void setTarget(EffectSprite *sprite)
bool initProgramState(const std::string &fragmentFilename)
cocos2d::backend::ProgramState * getProgramState() const
CREATE_FUNC(EffectLensFlare)
virtual void setTarget(EffectSprite *sprite) override
virtual void setTarget(EffectSprite *sprite) override
void setLightColor(const Color4F &color)
static EffectNormalMapped * create(const std::string &normalMapFileName)
CREATE_FUNC(EffectNormalMapped)
bool initNormalMap(const std::string &normalMapFileName)
void setLightPos(const Vec3 &pos)
void setKBump(float value)
virtual void setTarget(EffectSprite *sprite) override
CREATE_FUNC(EffectOutline)
void setEffect(Effect *effect)
void addEffect(Effect *effect, ssize_t order)
static EffectSprite * create(const std::string &filename)
void draw(Renderer *renderer, const Mat4 &transform, uint32_t flags) override
std::vector< std::tuple< ssize_t, Effect *, QuadCommand > > _effects
cocos2d::Sprite * _lightSprite
virtual void onTouchesEnded(const std::vector< cocos2d::Touch * > &touches, cocos2d::Event *unused_event)
virtual void onTouchesBegan(const std::vector< cocos2d::Touch * > &touches, cocos2d::Event *unused_event)
virtual void onTouchesMoved(const std::vector< cocos2d::Touch * > &touches, cocos2d::Event *unused_event)
cocos2d::Vector< Effect * > _effects