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); }