Skip to content

Commit 760ee57

Browse files
Merge pull request cocos2d#6767 from ricardoquesada/sprite_multiple_pass
multiple pass sprite
2 parents a8c21dc + e5494cd commit 760ee57

File tree

1 file changed

+72
-8
lines changed

1 file changed

+72
-8
lines changed

tests/cpp-tests/Classes/ShaderTest/ShaderTest2.cpp

Lines changed: 72 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
#include "ShaderTest.h"
2828
#include "../testResource.h"
2929
#include "cocos2d.h"
30+
#include <tuple>
3031

3132
namespace 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+
111117
class Effect;
112118
class 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
}
135184
protected:
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

Comments
 (0)