void ciMsaFluidSolver::advectRGB(int bound, const ci::Vec2f* duv) { int i0, j0; float x, y, s0, t0, s1, t1, dt0x, dt0y; int index; dt0x = _dt * _NX; dt0y = _dt * _NY; for (int j = _NY; j > 0; --j) { for (int i = _NX; i > 0; --i) { index = FLUID_IX(i, j); x = i - dt0x * duv[index].x; y = j - dt0y * duv[index].y; if (x > _NX + 0.5) x = _NX + 0.5f; if (x < 0.5) x = 0.5f; i0 = (int) x; if (y > _NY + 0.5) y = _NY + 0.5f; if (y < 0.5) y = 0.5f; j0 = (int) y; s1 = x - i0; s0 = 1 - s1; t1 = y - j0; t0 = 1 - t1; i0 = FLUID_IX(i0, j0); //we don't need col/row index any more but index in 1 dimension j0 = i0 + (_NX + 2); r[index] = s0 * ( t0 * rOld[i0] + t1 * rOld[j0] ) + s1 * ( t0 * rOld[i0+1] + t1 * rOld[j0+1] ); g[index] = s0 * ( t0 * gOld[i0] + t1 * gOld[j0] ) + s1 * ( t0 * gOld[i0+1] + t1 * gOld[j0+1] ); b[index] = s0 * ( t0 * bOld[i0] + t1 * bOld[j0] ) + s1 * ( t0 * bOld[i0+1] + t1 * bOld[j0+1] ); } } setBoundaryRGB(); }
void FluidSolver::advectRGB(int bound, const ofVec2f* duv) { int i0, j0; float x, y, s0, t0, s1, t1, dt0x, dt0y; int index; dt0x = deltaT * _NX; dt0y = deltaT * _NY; for (int j = _NY; j > 0; --j) { for (int i = _NX; i > 0; --i) { index = FLUID_IX(i, j); x = i - dt0x * duv[index].x; y = j - dt0y * duv[index].y; if (x > _NX + 0.5) x = _NX + 0.5f; if (x < 0.5) x = 0.5f; i0 = (int) x; if (y > _NY + 0.5) y = _NY + 0.5f; if (y < 0.5) y = 0.5f; j0 = (int) y; s1 = x - i0; s0 = 1 - s1; t1 = y - j0; t0 = 1 - t1; i0 = FLUID_IX(i0, j0); //we don't need col/row index any more but index in 1 dimension j0 = i0 + (_NX + 2); color[index] = ( colorOld[i0] * t0 + colorOld[j0] * t1 ) * s0 + ( colorOld[i0+1] * t0 + colorOld[j0+1] * t1) * s1; } } setBoundaryRGB(); }