Skip to content

Commit

Permalink
Use vector math in cyclone.
Browse files Browse the repository at this point in the history
  • Loading branch information
savask committed Apr 23, 2018
1 parent cda029f commit 7afd824
Showing 1 changed file with 10 additions and 6 deletions.
16 changes: 10 additions & 6 deletions src/simulation/simtools/Cyclone.cpp
Expand Up @@ -16,19 +16,23 @@ int Tool_Cycl::Perform(Simulation * sim, Particle * cpart, int x, int y, int bru
{
/*
Air velocity calculation.
Air velocity X = cosine of cell angle
Angle of cell is calculated via cells X/Y relation to the brush center and arctangent
Angle has 1.57 radians added to it (90 degrees) in order to make the velocity be at 90 degrees to the centerpoint.
Ditto for Y, except Y uses sine
(x, y) -- turn 90 deg -> (-y, x)
*/
// only trigger once per cell (less laggy)
if ((x%CELL) == 0 && (y%CELL) == 0)
{
if(brushX == x && brushY == y)
return 1;

float *vx = &sim->air->vx[y / CELL][x / CELL];
float *vy = &sim->air->vy[y / CELL][x / CELL];

*vx -= (strength / 16) * (tpt::cos(1.57f + (tpt::atan2(brushY - y, brushX - x))));
*vy -= (strength / 16) * (tpt::sin(1.57f + (tpt::atan2(brushY - y, brushX - x))));
float dvx = brushX - x;
float dvy = brushY - y;
float invsqr = 1/sqrtf(dvx*dvx + dvy*dvy);

*vx -= (strength / 16) * (-dvy)*invsqr;
*vy -= (strength / 16) * dvx*invsqr;

// Clamp velocities
if (*vx > 256.0f)
Expand Down

0 comments on commit 7afd824

Please sign in to comment.