diff options
author | Erik Verbruggen <erik.verbruggen@theqtcompany.com> | 2016-03-03 13:50:50 +0100 |
---|---|---|
committer | Erik Verbruggen <erik.verbruggen@theqtcompany.com> | 2016-03-08 12:04:43 +0000 |
commit | 562fc162014f78146bd407438512501419ac089b (patch) | |
tree | 4320dc09bb181a152246e6826efd30112287d1c6 /src/particles | |
parent | 9ecf2d33501dcd74a510adf6501c636c414ef543 (diff) |
Particles: factor out t^2.
According to IEEE754 a * t * t is not the same as a * (t * t), hence the
compiler won't lift t^2 out as common expression when in another place
'a' is replaced with 'b'. Now for the particles this doesn't matter as
it doesn't need super high precision, nor should any of the calculations
come in overflow territory. So by manually introducing t_sq(uare), the
compiler can remove duplicate t^2 calculations after inlining.
Change-Id: Ibfdb054e34945d7e78eb993fdcedfae886472e83
Reviewed-by: Lars Knoll <lars.knoll@theqtcompany.com>
Diffstat (limited to 'src/particles')
-rw-r--r-- | src/particles/qquickparticlesystem_p.h | 32 |
1 files changed, 20 insertions, 12 deletions
diff --git a/src/particles/qquickparticlesystem_p.h b/src/particles/qquickparticlesystem_p.h index 2a64735541..3a119f99fe 100644 --- a/src/particles/qquickparticlesystem_p.h +++ b/src/particles/qquickparticlesystem_p.h @@ -493,9 +493,10 @@ private: inline void QQuickParticleData::setInstantaneousAX(float ax, QQuickParticleSystem* particleSystem) { float t = (particleSystem->timeInt / 1000.0f) - this->t; + float t_sq = t * t; float vx = (this->vx + t * this->ax) - t * ax; - float ex = this->x + this->vx * t + 0.5f * this->ax * t * t; - float x = ex - t * vx - 0.5f * t * t * ax; + float ex = this->x + this->vx * t + 0.5f * this->ax * t_sq; + float x = ex - t * vx - 0.5f * t_sq * ax; this->ax = ax; this->vx = vx; @@ -505,9 +506,10 @@ inline void QQuickParticleData::setInstantaneousAX(float ax, QQuickParticleSyste inline void QQuickParticleData::setInstantaneousVX(float vx, QQuickParticleSystem* particleSystem) { float t = (particleSystem->timeInt / 1000.0f) - this->t; + float t_sq = t * t; float evx = vx - t * this->ax; - float ex = this->x + this->vx * t + 0.5f * this->ax * t * t; - float x = ex - t * evx - 0.5f * t * t * this->ax; + float ex = this->x + this->vx * t + 0.5f * this->ax * t_sq; + float x = ex - t * evx - 0.5f * t_sq * this->ax; this->vx = evx; this->x = x; @@ -516,15 +518,17 @@ inline void QQuickParticleData::setInstantaneousVX(float vx, QQuickParticleSyste inline void QQuickParticleData::setInstantaneousX(float x, QQuickParticleSystem* particleSystem) { float t = (particleSystem->timeInt / 1000.0f) - this->t; - this->x = x - t * this->vx - 0.5f * t * t * this->ax; + float t_sq = t * t; + this->x = x - t * this->vx - 0.5f * t_sq * this->ax; } inline void QQuickParticleData::setInstantaneousAY(float ay, QQuickParticleSystem* particleSystem) { float t = (particleSystem->timeInt / 1000.0f) - this->t; + float t_sq = t * t; float vy = (this->vy + t * this->ay) - t * ay; - float ey = this->y + this->vy * t + 0.5f * this->ay * t * t; - float y = ey - t * vy - 0.5f * t * t * ay; + float ey = this->y + this->vy * t + 0.5f * this->ay * t_sq; + float y = ey - t * vy - 0.5f * t_sq * ay; this->ay = ay; this->vy = vy; @@ -534,9 +538,10 @@ inline void QQuickParticleData::setInstantaneousAY(float ay, QQuickParticleSyste inline void QQuickParticleData::setInstantaneousVY(float vy, QQuickParticleSystem* particleSystem) { float t = (particleSystem->timeInt / 1000.0f) - this->t; + float t_sq = t * t; float evy = vy - t * this->ay; - float ey = this->y + this->vy * t + 0.5f * this->ay * t * t; - float y = ey - t*evy - 0.5f * t * t * this->ay; + float ey = this->y + this->vy * t + 0.5f * this->ay * t_sq; + float y = ey - t*evy - 0.5f * t_sq * this->ay; this->vy = evy; this->y = y; @@ -545,13 +550,15 @@ inline void QQuickParticleData::setInstantaneousVY(float vy, QQuickParticleSyste inline void QQuickParticleData::setInstantaneousY(float y, QQuickParticleSystem *particleSystem) { float t = (particleSystem->timeInt / 1000.0f) - this->t; - this->y = y - t * this->vy - 0.5f * t * t * this->ay; + float t_sq = t * t; + this->y = y - t * this->vy - 0.5f * t_sq * this->ay; } inline float QQuickParticleData::curX(QQuickParticleSystem *particleSystem) const { float t = (particleSystem->timeInt / 1000.0f) - this->t; - return this->x + this->vx * t + 0.5f * this->ax * t * t; + float t_sq = t * t; + return this->x + this->vx * t + 0.5f * this->ax * t_sq; } inline float QQuickParticleData::curVX(QQuickParticleSystem *particleSystem) const @@ -563,7 +570,8 @@ inline float QQuickParticleData::curVX(QQuickParticleSystem *particleSystem) con inline float QQuickParticleData::curY(QQuickParticleSystem *particleSystem) const { float t = (particleSystem->timeInt / 1000.0f) - this->t; - return y + vy * t + 0.5f * ay * t * t; + float t_sq = t * t; + return y + vy * t + 0.5f * ay * t_sq; } inline float QQuickParticleData::curVY(QQuickParticleSystem *particleSystem) const |