2727#include " ShaderTest.h"
2828#include " ../testResource.h"
2929#include " cocos2d.h"
30+ #include < tuple>
3031
3132namespace ShaderTest2
3233{
@@ -108,6 +109,11 @@ void ShaderTestScene2::runThisTest()
108109//
109110// EffectSprite
110111//
112+ static int tuple_sort ( const std::tuple<ssize_t ,Effect*,QuadCommand> &tuple1, const std::tuple<ssize_t ,Effect*,QuadCommand> &tuple2 )
113+ {
114+ return std::get<0 >(tuple1) < std::get<0 >(tuple2);
115+ }
116+
111117class Effect ;
112118class EffectSprite : public Sprite
113119{
@@ -122,19 +128,73 @@ class EffectSprite : public Sprite
122128 return nullptr ;
123129 }
124130
125- void setEffect (Effect * effect) {
126- if (_effect != effect) {
131+ void setEffect (Effect* effect) {
132+ if (_defaultEffect != effect) {
127133 effect->setTarget (this );
128134
129- CC_SAFE_RELEASE (_effect);
130- _effect = effect;
131- CC_SAFE_RETAIN (_effect);
132- setGLProgramState (_effect->getGLProgramState ());
135+ CC_SAFE_RELEASE (_defaultEffect);
136+ _defaultEffect = effect;
137+ CC_SAFE_RETAIN (_defaultEffect);
138+
139+ setGLProgramState (_defaultEffect->getGLProgramState ());
140+ }
141+ }
142+ void addEffect (Effect *effect, ssize_t order) {
143+ effect->retain ();
144+ effect->setTarget (this );
145+
146+ _effects.push_back (std::make_tuple (order,effect,QuadCommand ()));
147+
148+ std::sort (std::begin (_effects), std::end (_effects), tuple_sort);
149+ }
150+
151+ void draw (Renderer *renderer, const Mat4 &transform, bool transformUpdated) override
152+ {
153+ // Don't do calculate the culling if the transform was not updated
154+ _insideBounds = transformUpdated ? renderer->checkVisibility (transform, _contentSize) : _insideBounds;
155+
156+ if (_insideBounds)
157+ {
158+ // negative effects: order < 0
159+ int idx=0 ;
160+ for (auto &effect : _effects) {
161+
162+ if (std::get<0 >(effect) >=0 )
163+ break ;
164+ QuadCommand &q = std::get<2 >(effect);
165+ q.init (_globalZOrder, _texture->getName (), std::get<1 >(effect)->getGLProgramState (), _blendFunc, &_quad, 1 , transform);
166+ renderer->addCommand (&q);
167+ idx++;
168+
169+ }
170+
171+ // normal effect: order == 0
172+ _quadCommand.init (_globalZOrder, _texture->getName (), getGLProgramState (), _blendFunc, &_quad, 1 , transform);
173+ renderer->addCommand (&_quadCommand);
174+
175+ // postive effects: oder >= 0
176+ for (auto it = std::begin (_effects)+idx; it != std::end (_effects); ++it) {
177+ QuadCommand &q = std::get<2 >(*it);
178+ q.init (_globalZOrder, _texture->getName (), std::get<1 >(*it)->getGLProgramState (), _blendFunc, &_quad, 1 , transform);
179+ renderer->addCommand (&q);
180+ idx++;
181+ }
133182 }
134183 }
135184protected:
136- EffectSprite () : _effect(nullptr ) {}
137- Effect *_effect;
185+ EffectSprite () : _defaultEffect(nullptr )
186+ {
187+ _effects.reserve (2 );
188+ }
189+ ~EffectSprite () {
190+ for (auto &tuple : _effects) {
191+ std::get<1 >(tuple)->release ();
192+ }
193+ CC_SAFE_RELEASE (_defaultEffect);
194+ }
195+
196+ std::vector<std::tuple<ssize_t ,Effect*,QuadCommand>> _effects;
197+ Effect* _defaultEffect;
138198};
139199
140200//
@@ -436,6 +496,10 @@ EffectSpriteTest::EffectSpriteTest()
436496
437497 _vectorIndex = 0 ;
438498 _sprite->setEffect ( _effects.at (_vectorIndex) );
499+
500+ // _sprite->addEffect( _effects.at(8), -10 );
501+ // _sprite->addEffect( _effects.at(1), 1 );
502+
439503 }
440504}
441505
0 commit comments