Macros and random functions are pain...

This commit is contained in:
DelinWorks 2022-05-21 20:23:19 +03:00
parent 30003499bd
commit 4a0624a9ed
2 changed files with 23 additions and 10 deletions

View File

@ -667,7 +667,8 @@ void ParticleSystem::addParticles(int count, int animationCellIndex, int animati
{ {
for (int i = start; i < _particleCount; ++i) for (int i = start; i < _particleCount; ++i)
{ {
_particleData.animCellIndex[i] = (int)abs(RANDOM_M11(&RANDSEED) * getTotalAnimationCells()); int rand0 = abs(RANDOM_M11(&RANDSEED) * getTotalAnimationCells());
_particleData.animCellIndex[i] = MIN(rand0, getTotalAnimationCells() - 1);
} }
} }
@ -679,7 +680,7 @@ void ParticleSystem::addParticles(int count, int animationCellIndex, int animati
} }
} }
if (animationIndex == -1 && !_isAnimationMulti && _isLoopAnimated) if (animationIndex == -1 && !_isAnimationMulti && !_animations.empty())
{ {
for (int i = start; i < _particleCount; ++i) for (int i = start; i < _particleCount; ++i)
{ {
@ -690,11 +691,13 @@ void ParticleSystem::addParticles(int count, int animationCellIndex, int animati
} }
} }
if (animationIndex == -1 && _isAnimationMulti && _isLoopAnimated) if (animationIndex == -1 && _isAnimationMulti && !_animations.empty())
{ {
for (int i = start; i < _particleCount; ++i) for (int i = start; i < _particleCount; ++i)
{ {
_particleData.animIndex[i] = _randomAnimations[abs(RANDOM_M11(&RANDSEED) * _randomAnimations.size())]; int rand0 = abs(RANDOM_M11(&RANDSEED) * _randomAnimations.size());
int index = MIN(rand0, _randomAnimations.size() - 1);
_particleData.animIndex[i] = _randomAnimations[index];
auto descriptor = _animations.at(_particleData.animIndex[i]); auto descriptor = _animations.at(_particleData.animIndex[i]);
_particleData.animTimeLength[i] = _particleData.animTimeLength[i] =
descriptor.animationSpeed + descriptor.animationSpeedVariance * RANDOM_M11(&RANDSEED); descriptor.animationSpeed + descriptor.animationSpeedVariance * RANDOM_M11(&RANDSEED);
@ -1054,17 +1057,17 @@ void ParticleSystem::update(float dt)
{ {
float percent = (_particleData.totalTimeToLive[i] - _particleData.timeToLive[i]) / _particleData.totalTimeToLive[i]; float percent = (_particleData.totalTimeToLive[i] - _particleData.timeToLive[i]) / _particleData.totalTimeToLive[i];
percent = _isLifeAnimationReversed ? 1.0F - percent : percent; percent = _isLifeAnimationReversed ? 1.0F - percent : percent;
_particleData.animCellIndex[i] = (unsigned int)MIN((percent * getTotalAnimationCells()), getTotalAnimationCells() - 1); _particleData.animCellIndex[i] = (unsigned short)MIN(percent * getTotalAnimationCells(), getTotalAnimationCells() - 1);
} }
if (_isLifeAnimated && !_animations.empty()) if (_isLifeAnimated && !_animations.empty())
{ {
auto& anim = _animations.begin()->second; auto& anim = _animations.at(_particleData.animIndex[i]);
float percent = float percent =
(_particleData.totalTimeToLive[i] - _particleData.timeToLive[i]) / _particleData.totalTimeToLive[i]; (_particleData.totalTimeToLive[i] - _particleData.timeToLive[i]) / _particleData.totalTimeToLive[i];
percent = (!!_isLifeAnimationReversed != !!anim.reverseIndices) ? 1.0F - percent : percent; percent = (!!_isLifeAnimationReversed != !!anim.reverseIndices) ? 1.0F - percent : percent;
_particleData.animCellIndex[i] = anim.animationIndices[MIN(abs(percent * anim.animationIndices.size()),
_particleData.animCellIndex[i] = anim.animationIndices[MIN(percent * anim.animationIndices.size(),
anim.animationIndices.size() - 1)]; anim.animationIndices.size() - 1)];
} }
if (_isLoopAnimated) if (_isLoopAnimated)
@ -1076,9 +1079,9 @@ void ParticleSystem::update(float dt)
_particleData.animTimeDelta[i] = 0; _particleData.animTimeDelta[i] = 0;
float percent = _particleData.animTimeDelta[i] / _particleData.animTimeLength[i]; float percent = _particleData.animTimeDelta[i] / _particleData.animTimeLength[i];
percent = anim.reverseIndices ? 1.0F - percent : percent; percent = anim.reverseIndices ? 1.0F - percent : percent;
_particleData.animCellIndex[i] = anim.animationIndices[MIN(abs(percent * anim.animationIndices.size()),
_particleData.animCellIndex[i] = anim.animationIndices[MIN(percent * anim.animationIndices.size(),
anim.animationIndices.size() - 1)]; anim.animationIndices.size() - 1)];
} }
} }

View File

@ -915,6 +915,16 @@ public:
std::vector<unsigned short> indices, std::vector<unsigned short> indices,
bool reverse = false); bool reverse = false);
/** Add a particle animation descriptor with the index 0.
*
* @param indices An array of the indicies
* @param reverse Should the animation indicies be played backwards? (default: false)
*/
void setAnimationDescriptor(std::vector<unsigned short> indices, bool reverse = false)
{
setAnimationDescriptor(0, 0, 0, indices, reverse);
};
/** Gets the particles movement type: Free or Grouped. /** Gets the particles movement type: Free or Grouped.
@since v0.8 @since v0.8
* *