1
0
mirror of https://github.com/The-Powder-Toy/The-Powder-Toy.git synced 2025-03-20 14:20:02 +01:00

Use vector math in cyclone.

This commit is contained in:
Saveliy Skresanov 2018-04-23 22:48:10 +07:00
parent cda029ff42
commit 7afd82469e

@ -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)