void ciMsaFluidSolver::update() {
	addSourceUV();
	
	if( doVorticityConfinement )
	{
		vorticityConfinement(uvOld);
		addSourceUV();
	}
	
	swapUV();
	
	diffuseUV( viscocity );
	
	project(uv, uvOld);
	
	swapUV();
	
	advect2d(uv, uvOld);
	
	project(uv, uvOld);
	
	if(doRGB)
	{
		addSourceRGB();
		swapRGB();
		
		if( colorDiffusion!=0. && _dt!=0. )
		{
			diffuseRGB(0, colorDiffusion );
			swapRGB();
		}
		
		advectRGB(0, uv);
		fadeRGB();
	} 
	else
	{
		addSource(r, rOld);
		swapR();
		
		if( colorDiffusion!=0. && _dt!=0. )
		{
			diffuse(0, r, rOld, colorDiffusion );
			swapRGB();
		}
		
		advect(0, r, rOld, uv);	
		fadeR();
	}
}
//set the hue and saturation
static void setHueAndSaturation(int *R, int *G, int *B, int hValue, int sValue)
{
    int intR = *R;
    int intG = *G;
    int intB = *B;
	
    if (intR < intG)
        swapRGB(&intR, &intG);
    if (intR < intB)
        swapRGB(&intR, &intB);
    if (intB > intG)
        swapRGB(&intB, &intG);
	
    int delta = intR - intB;
    if (!delta) return;
	
    int entire = intR + intB;
    int H, S, L = entire >> 1;  
    if (L < 128)
        S = delta * 255 / entire;
    else
        S = delta * 255 / (510 - entire);
    
    if (hValue)
    {
        if (intR == *R)
            H = (*G - *B) * 60 / delta;
        else if (intR == *G)
            H = (*B - *R) * 60 / delta + 120;
        else
            H = (*R - *G) * 60 / delta + 240;
        H += hValue;
        if (H < 0) H += 360;
        else if (H > 360) H -= 360;
        int index = H / 60;
        int extra = H % 60;
        if (index & 1) extra = 60 - extra;
        extra = (extra * 255 + 30) / 60;
        intG = extra - (extra - 128) * (255 - S) / 255;
        int Lum = L - 128;
        if (Lum > 0)
            intG += (((255 - intG) * Lum + 64) / 128);
        else if (Lum < 0)
            intG += (intG * Lum / 128);
        checkRGB(&intG);
        switch (index)
        {
            case 1:
                swapRGB(&intR, &intG);
                break;
            case 2:
                swapRGB(&intR, &intB);
                swapRGB(&intG, &intB);
                break;
            case 3:
                swapRGB(&intR, &intB);
                break;
            case 4:
                swapRGB(&intR, &intG);
                swapRGB(&intG, &intB);
                break;
            case 5:
                swapRGB(&intG, &intB);
                break;
        }
    }
    else
    {
        intR = *R;
        intG = *G;
        intB = *B;
    }
    if (sValue)
    {
        if (sValue > 0)
        {
            sValue = sValue + S >= 255? S: 255 - sValue;
            sValue = 65025 / sValue - 255;
        }
        intR += ((intR - L) * sValue / 255);
        intG += ((intG - L) * sValue / 255);
        intB += ((intB - L) * sValue / 255);
        checkRGB(&intR);
        checkRGB(&intG);
        checkRGB(&intB);
    }
    assignRGB(R, G, B, intR, intG, intB);
}