Merge pull request #5328 from dumganhar/iss3990-particle

closed #3990: ParticleSystemQuad::setTotalParticles() can't set a value larger than the initialized value.
This commit is contained in:
James Chen 2014-02-13 17:03:52 +08:00
commit 4ca47b3e5f
4 changed files with 79 additions and 17 deletions

View File

@ -200,6 +200,16 @@ void ParticleSystemQuad::initTexCoordsWithRect(const Rect& pointRect)
quads[i].tr.texCoords.v = top; quads[i].tr.texCoords.v = top;
} }
} }
void ParticleSystemQuad::updateTexCoords()
{
if (_texture)
{
const Size& s = _texture->getContentSize();
initTexCoordsWithRect(Rect(0, 0, s.width, s.height));
}
}
void ParticleSystemQuad::setTextureWithRect(Texture2D *texture, const Rect& rect) void ParticleSystemQuad::setTextureWithRect(Texture2D *texture, const Rect& rect)
{ {
// Only update the texture if is different from the current one // Only update the texture if is different from the current one
@ -210,11 +220,13 @@ void ParticleSystemQuad::setTextureWithRect(Texture2D *texture, const Rect& rect
this->initTexCoordsWithRect(rect); this->initTexCoordsWithRect(rect);
} }
void ParticleSystemQuad::setTexture(Texture2D* texture) void ParticleSystemQuad::setTexture(Texture2D* texture)
{ {
const Size& s = texture->getContentSize(); const Size& s = texture->getContentSize();
this->setTextureWithRect(texture, Rect(0, 0, s.width, s.height)); this->setTextureWithRect(texture, Rect(0, 0, s.width, s.height));
} }
void ParticleSystemQuad::setDisplayFrame(SpriteFrame *spriteFrame) void ParticleSystemQuad::setDisplayFrame(SpriteFrame *spriteFrame)
{ {
CCASSERT(spriteFrame->getOffsetInPixels().equals(Point::ZERO), CCASSERT(spriteFrame->getOffsetInPixels().equals(Point::ZERO),
@ -468,11 +480,10 @@ void ParticleSystemQuad::setTotalParticles(int tp)
_indices = indicesNew; _indices = indicesNew;
// Clear the memory // Clear the memory
// XXX: Bug? If the quads are cleared, then drawing doesn't work... WHY??? XXX
memset(_particles, 0, particlesSize); memset(_particles, 0, particlesSize);
memset(_quads, 0, quadsSize); memset(_quads, 0, quadsSize);
memset(_indices, 0, indicesSize); memset(_indices, 0, indicesSize);
_allocatedParticles = tp; _allocatedParticles = tp;
} }
else else
@ -506,12 +517,17 @@ void ParticleSystemQuad::setTotalParticles(int tp)
{ {
setupVBO(); setupVBO();
} }
// fixed http://www.cocos2d-x.org/issues/3990
// Updates texture coords.
updateTexCoords();
} }
else else
{ {
_totalParticles = tp; _totalParticles = tp;
} }
_emissionRate = _totalParticles / _life;
resetSystem(); resetSystem();
} }

View File

@ -136,6 +136,9 @@ protected:
/** initializes the texture with a rectangle measured Points */ /** initializes the texture with a rectangle measured Points */
void initTexCoordsWithRect(const Rect& rect); void initTexCoordsWithRect(const Rect& rect);
/** Updates texture coords */
void updateTexCoords();
// Overrides // Overrides
/** /**
* @js NA * @js NA

View File

@ -958,7 +958,7 @@ enum
static int sceneIdx = -1; static int sceneIdx = -1;
#define MAX_LAYER 44 #define MAX_LAYER 45
Layer* createParticleLayer(int nIndex) Layer* createParticleLayer(int nIndex)
{ {
@ -1009,6 +1009,7 @@ Layer* createParticleLayer(int nIndex)
case 41: return new ReorderParticleSystems(); case 41: return new ReorderParticleSystems();
case 42: return new PremultipliedAlphaTest(); case 42: return new PremultipliedAlphaTest();
case 43: return new PremultipliedAlphaTest2(); case 43: return new PremultipliedAlphaTest2();
case 44: return new Issue3990();
default: default:
break; break;
} }
@ -1889,9 +1890,43 @@ std::string PremultipliedAlphaTest2::subtitle() const
return "Arrows should be faded"; return "Arrows should be faded";
} }
// Issue3990
void Issue3990::onEnter()
{
ParticleDemo::onEnter();
_color->setColor(Color3B::BLACK);
this->removeChild(_background, true);
_background = NULL;
_emitter = ParticleSystemQuad::create("Particles/Spiral.plist");
_emitter->setPositionType(ParticleSystem::PositionType::GROUPED);
_emitter->setTotalParticles(1000);
_emitter->setPosition(VisibleRect::center());
_emitter->retain();
this->addChild(_emitter ,10);
}
std::string Issue3990::title() const
{
return "Issue3990, setTotalParticle should work";
}
std::string Issue3990::subtitle() const
{
return "Show '998' or '999' at bottom right side";
}
//
void ParticleTestScene::runThisTest() void ParticleTestScene::runThisTest()
{ {
addChild(nextParticleAction()); addChild(nextParticleAction());
Director::getInstance()->replaceScene(this); Director::getInstance()->replaceScene(this);
} }

View File

@ -193,7 +193,7 @@ public:
class Issue870 : public ParticleDemo class Issue870 : public ParticleDemo
{ {
public: public:
virtual void onEnter(); virtual void onEnter() override;
virtual std::string title() const override; virtual std::string title() const override;
virtual std::string subtitle() const override; virtual std::string subtitle() const override;
void updateQuads(float dt); void updateQuads(float dt);
@ -205,7 +205,7 @@ private:
class Issue1201 : public ParticleDemo class Issue1201 : public ParticleDemo
{ {
public: public:
virtual void onEnter(); virtual void onEnter() override;
virtual std::string title() const override; virtual std::string title() const override;
virtual std::string subtitle() const override; virtual std::string subtitle() const override;
}; };
@ -213,7 +213,7 @@ public:
class ParticleBatchHybrid : public ParticleDemo class ParticleBatchHybrid : public ParticleDemo
{ {
public: public:
virtual void onEnter(); virtual void onEnter() override;
void switchRender(float dt); void switchRender(float dt);
virtual std::string title() const override; virtual std::string title() const override;
virtual std::string subtitle() const override; virtual std::string subtitle() const override;
@ -225,7 +225,7 @@ private:
class ParticleBatchMultipleEmitters : public ParticleDemo class ParticleBatchMultipleEmitters : public ParticleDemo
{ {
public: public:
virtual void onEnter(); virtual void onEnter() override;
virtual std::string title() const override; virtual std::string title() const override;
virtual std::string subtitle() const override; virtual std::string subtitle() const override;
}; };
@ -233,7 +233,7 @@ public:
class ParticleReorder : public ParticleDemo class ParticleReorder : public ParticleDemo
{ {
public: public:
virtual void onEnter(); virtual void onEnter() override;
void reorderParticles(float dt); void reorderParticles(float dt);
virtual std::string title() const override; virtual std::string title() const override;
virtual std::string subtitle() const override; virtual std::string subtitle() const override;
@ -244,7 +244,7 @@ private:
class MultipleParticleSystems : public ParticleDemo class MultipleParticleSystems : public ParticleDemo
{ {
public: public:
virtual void onEnter(); virtual void onEnter() override;
virtual std::string title() const override; virtual std::string title() const override;
virtual std::string subtitle() const override; virtual std::string subtitle() const override;
virtual void update(float dt); virtual void update(float dt);
@ -253,8 +253,8 @@ public:
class MultipleParticleSystemsBatched : public ParticleDemo class MultipleParticleSystemsBatched : public ParticleDemo
{ {
public: public:
virtual void onEnter(); virtual void onEnter() override;
virtual void update(float dt); virtual void update(float dt) override;
virtual std::string title() const override; virtual std::string title() const override;
virtual std::string subtitle() const override; virtual std::string subtitle() const override;
private: private:
@ -264,8 +264,8 @@ private:
class AddAndDeleteParticleSystems : public ParticleDemo class AddAndDeleteParticleSystems : public ParticleDemo
{ {
public: public:
virtual void onEnter(); virtual void onEnter() override;
virtual void update(float dt); virtual void update(float dt) override;
void removeSystem(float dt); void removeSystem(float dt);
virtual std::string title() const override; virtual std::string title() const override;
virtual std::string subtitle() const override; virtual std::string subtitle() const override;
@ -276,9 +276,9 @@ private:
class ReorderParticleSystems : public ParticleDemo class ReorderParticleSystems : public ParticleDemo
{ {
public: public:
virtual void onEnter(); virtual void onEnter() override;
void reorderSystem(float time); void reorderSystem(float time);
virtual void update(float dt); virtual void update(float dt) override;
virtual std::string title() const override; virtual std::string title() const override;
virtual std::string subtitle() const override; virtual std::string subtitle() const override;
private: private:
@ -288,7 +288,7 @@ private:
class PremultipliedAlphaTest : public ParticleDemo class PremultipliedAlphaTest : public ParticleDemo
{ {
public: public:
virtual void onEnter(); virtual void onEnter() override;
virtual std::string title() const override; virtual std::string title() const override;
virtual std::string subtitle() const override; virtual std::string subtitle() const override;
}; };
@ -296,7 +296,15 @@ public:
class PremultipliedAlphaTest2 : public ParticleDemo class PremultipliedAlphaTest2 : public ParticleDemo
{ {
public: public:
virtual void onEnter(); virtual void onEnter() override;
virtual std::string title() const override;
virtual std::string subtitle() const override;
};
class Issue3990 : public ParticleDemo
{
public:
virtual void onEnter() override;
virtual std::string title() const override; virtual std::string title() const override;
virtual std::string subtitle() const override; virtual std::string subtitle() const override;
}; };