diff options
| author | Simon <simon@hardwired.org.uk> | 2011-04-08 10:09:42 (GMT) |
|---|---|---|
| committer | Simon <simon@hardwired.org.uk> | 2011-04-08 10:09:42 (GMT) |
| commit | 767d73c5fc51647dcb5da4ed8349da2186c5060c (patch) | |
| tree | e9cb3540858927af4887553068fd348a95195092 /src/air.c | |
| parent | 1bdf72be1a306ac07641211adb2ec1539e3d0a48 (diff) | |
| download | powder-767d73c5fc51647dcb5da4ed8349da2186c5060c.zip powder-767d73c5fc51647dcb5da4ed8349da2186c5060c.tar.gz | |
astyle
Diffstat (limited to 'src/air.c')
| -rw-r--r-- | src/air.c | 318 |
1 files changed, 159 insertions, 159 deletions
@@ -34,180 +34,180 @@ void update_air(void) int x, y, i, j; float dp, dx, dy, f, tx, ty; -if (airMode != 4) { //airMode 4 is no air/pressure update - - for (i=0; i<YRES/CELL; i++) //reduces pressure/velocity on the edges every frame - { - pv[i][0] = pv[i][0]*0.8f; - pv[i][1] = pv[i][1]*0.8f; - pv[i][2] = pv[i][2]*0.8f; - pv[i][XRES/CELL-2] = pv[i][XRES/CELL-2]*0.8f; - pv[i][XRES/CELL-1] = pv[i][XRES/CELL-1]*0.8f; - vx[i][0] = vx[i][1]*0.9f; - vx[i][1] = vx[i][2]*0.9f; - vx[i][XRES/CELL-2] = vx[i][XRES/CELL-3]*0.9f; - vx[i][XRES/CELL-1] = vx[i][XRES/CELL-2]*0.9f; - vy[i][0] = vy[i][1]*0.9f; - vy[i][1] = vy[i][2]*0.9f; - vy[i][XRES/CELL-2] = vy[i][XRES/CELL-3]*0.9f; - vy[i][XRES/CELL-1] = vy[i][XRES/CELL-2]*0.9f; - } - for (i=0; i<XRES/CELL; i++) //reduces pressure/velocity on the edges every frame - { - pv[0][i] = pv[0][i]*0.8f; - pv[1][i] = pv[1][i]*0.8f; - pv[2][i] = pv[2][i]*0.8f; - pv[YRES/CELL-2][i] = pv[YRES/CELL-2][i]*0.8f; - pv[YRES/CELL-1][i] = pv[YRES/CELL-1][i]*0.8f; - vx[0][i] = vx[1][i]*0.9f; - vx[1][i] = vx[2][i]*0.9f; - vx[YRES/CELL-2][i] = vx[YRES/CELL-3][i]*0.9f; - vx[YRES/CELL-1][i] = vx[YRES/CELL-2][i]*0.9f; - vy[0][i] = vy[1][i]*0.9f; - vy[1][i] = vy[2][i]*0.9f; - vy[YRES/CELL-2][i] = vy[YRES/CELL-3][i]*0.9f; - vy[YRES/CELL-1][i] = vy[YRES/CELL-2][i]*0.9f; - } + if (airMode != 4) { //airMode 4 is no air/pressure update - for (j=1; j<YRES/CELL; j++) //clear some velocities near walls - { - for (i=1; i<XRES/CELL; i++) + for (i=0; i<YRES/CELL; i++) //reduces pressure/velocity on the edges every frame { - if (bmap[j][i]==WL_WALL || bmap[j][i]==WL_WALLELEC || (bmap[j][i]==WL_EWALL && !emap[j][i])) - { - vx[j][i] = 0.0f; - vx[j][i-1] = 0.0f; - vy[j][i] = 0.0f; - vy[j-1][i] = 0.0f; - } + pv[i][0] = pv[i][0]*0.8f; + pv[i][1] = pv[i][1]*0.8f; + pv[i][2] = pv[i][2]*0.8f; + pv[i][XRES/CELL-2] = pv[i][XRES/CELL-2]*0.8f; + pv[i][XRES/CELL-1] = pv[i][XRES/CELL-1]*0.8f; + vx[i][0] = vx[i][1]*0.9f; + vx[i][1] = vx[i][2]*0.9f; + vx[i][XRES/CELL-2] = vx[i][XRES/CELL-3]*0.9f; + vx[i][XRES/CELL-1] = vx[i][XRES/CELL-2]*0.9f; + vy[i][0] = vy[i][1]*0.9f; + vy[i][1] = vy[i][2]*0.9f; + vy[i][XRES/CELL-2] = vy[i][XRES/CELL-3]*0.9f; + vy[i][XRES/CELL-1] = vy[i][XRES/CELL-2]*0.9f; } - } - - for (y=1; y<YRES/CELL; y++) //pressure adjustments from velocity - for (x=1; x<XRES/CELL; x++) + for (i=0; i<XRES/CELL; i++) //reduces pressure/velocity on the edges every frame { - dp = 0.0f; - dp += vx[y][x-1] - vx[y][x]; - dp += vy[y-1][x] - vy[y][x]; - pv[y][x] *= AIR_PLOSS; - pv[y][x] += dp*AIR_TSTEPP; + pv[0][i] = pv[0][i]*0.8f; + pv[1][i] = pv[1][i]*0.8f; + pv[2][i] = pv[2][i]*0.8f; + pv[YRES/CELL-2][i] = pv[YRES/CELL-2][i]*0.8f; + pv[YRES/CELL-1][i] = pv[YRES/CELL-1][i]*0.8f; + vx[0][i] = vx[1][i]*0.9f; + vx[1][i] = vx[2][i]*0.9f; + vx[YRES/CELL-2][i] = vx[YRES/CELL-3][i]*0.9f; + vx[YRES/CELL-1][i] = vx[YRES/CELL-2][i]*0.9f; + vy[0][i] = vy[1][i]*0.9f; + vy[1][i] = vy[2][i]*0.9f; + vy[YRES/CELL-2][i] = vy[YRES/CELL-3][i]*0.9f; + vy[YRES/CELL-1][i] = vy[YRES/CELL-2][i]*0.9f; } - for (y=0; y<YRES/CELL-1; y++) //velocity adjustments from pressure - for (x=0; x<XRES/CELL-1; x++) + for (j=1; j<YRES/CELL; j++) //clear some velocities near walls { - dx = dy = 0.0f; - dx += pv[y][x] - pv[y][x+1]; - dy += pv[y][x] - pv[y+1][x]; - vx[y][x] *= AIR_VLOSS; - vy[y][x] *= AIR_VLOSS; - vx[y][x] += dx*AIR_TSTEPV; - vy[y][x] += dy*AIR_TSTEPV; - if (bmap[y][x]==WL_WALL || bmap[y][x+1]==WL_WALL || - bmap[y][x]==WL_WALLELEC || bmap[y][x+1]==WL_WALLELEC || - (bmap[y][x]==WL_EWALL && !emap[y][x]) || - (bmap[y][x+1]==WL_EWALL && !emap[y][x+1])) - vx[y][x] = 0; - if (bmap[y][x]==WL_WALL || bmap[y+1][x]==WL_WALL || - bmap[y][x]==WL_WALLELEC || bmap[y+1][x]==WL_WALLELEC || - (bmap[y][x]==WL_EWALL && !emap[y][x]) || - (bmap[y+1][x]==WL_EWALL && !emap[y+1][x])) - vy[y][x] = 0; + for (i=1; i<XRES/CELL; i++) + { + if (bmap[j][i]==WL_WALL || bmap[j][i]==WL_WALLELEC || (bmap[j][i]==WL_EWALL && !emap[j][i])) + { + vx[j][i] = 0.0f; + vx[j][i-1] = 0.0f; + vy[j][i] = 0.0f; + vy[j-1][i] = 0.0f; + } + } } - for (y=0; y<YRES/CELL; y++) //update velocity and pressure - for (x=0; x<XRES/CELL; x++) - { - dx = 0.0f; - dy = 0.0f; - dp = 0.0f; - for (j=-1; j<2; j++) - for (i=-1; i<2; i++) - if (y+j>0 && y+j<YRES/CELL-1 && - x+i>0 && x+i<XRES/CELL-1 && - bmap[y+j][x+i]!=WL_WALL && - bmap[y+j][x+i]!=WL_WALLELEC && - (bmap[y+j][x+i]!=WL_EWALL || emap[y+j][x+i])) - { - f = kernel[i+1+(j+1)*3]; - dx += vx[y+j][x+i]*f; - dy += vy[y+j][x+i]*f; - dp += pv[y+j][x+i]*f; - } - else - { - f = kernel[i+1+(j+1)*3]; - dx += vx[y][x]*f; - dy += vy[y][x]*f; - dp += pv[y][x]*f; - } - - tx = x - dx*0.7f; - ty = y - dy*0.7f; - i = (int)tx; - j = (int)ty; - tx -= i; - ty -= j; - if (i>=2 && i<XRES/CELL-3 && - j>=2 && j<YRES/CELL-3) + for (y=1; y<YRES/CELL; y++) //pressure adjustments from velocity + for (x=1; x<XRES/CELL; x++) { - dx *= 1.0f - AIR_VADV; - dy *= 1.0f - AIR_VADV; - - dx += AIR_VADV*(1.0f-tx)*(1.0f-ty)*vx[j][i]; - dy += AIR_VADV*(1.0f-tx)*(1.0f-ty)*vy[j][i]; - - dx += AIR_VADV*tx*(1.0f-ty)*vx[j][i+1]; - dy += AIR_VADV*tx*(1.0f-ty)*vy[j][i+1]; - - dx += AIR_VADV*(1.0f-tx)*ty*vx[j+1][i]; - dy += AIR_VADV*(1.0f-tx)*ty*vy[j+1][i]; - - dx += AIR_VADV*tx*ty*vx[j+1][i+1]; - dy += AIR_VADV*tx*ty*vy[j+1][i+1]; + dp = 0.0f; + dp += vx[y][x-1] - vx[y][x]; + dp += vy[y-1][x] - vy[y][x]; + pv[y][x] *= AIR_PLOSS; + pv[y][x] += dp*AIR_TSTEPP; } - if (bmap[y][x] == WL_FAN) + for (y=0; y<YRES/CELL-1; y++) //velocity adjustments from pressure + for (x=0; x<XRES/CELL-1; x++) { - dx += fvx[y][x]; - dy += fvy[y][x]; + dx = dy = 0.0f; + dx += pv[y][x] - pv[y][x+1]; + dy += pv[y][x] - pv[y+1][x]; + vx[y][x] *= AIR_VLOSS; + vy[y][x] *= AIR_VLOSS; + vx[y][x] += dx*AIR_TSTEPV; + vy[y][x] += dy*AIR_TSTEPV; + if (bmap[y][x]==WL_WALL || bmap[y][x+1]==WL_WALL || + bmap[y][x]==WL_WALLELEC || bmap[y][x+1]==WL_WALLELEC || + (bmap[y][x]==WL_EWALL && !emap[y][x]) || + (bmap[y][x+1]==WL_EWALL && !emap[y][x+1])) + vx[y][x] = 0; + if (bmap[y][x]==WL_WALL || bmap[y+1][x]==WL_WALL || + bmap[y][x]==WL_WALLELEC || bmap[y+1][x]==WL_WALLELEC || + (bmap[y][x]==WL_EWALL && !emap[y][x]) || + (bmap[y+1][x]==WL_EWALL && !emap[y+1][x])) + vy[y][x] = 0; } - // pressure/velocity caps - if (dp > 256.0f) dp = 256.0f; - if (dp < -256.0f) dp = -256.0f; - if (dx > 256.0f) dx = 256.0f; - if (dx < -256.0f) dx = -256.0f; - if (dy > 256.0f) dy = 256.0f; - if (dy < -256.0f) dy = -256.0f; - - switch (airMode) + for (y=0; y<YRES/CELL; y++) //update velocity and pressure + for (x=0; x<XRES/CELL; x++) { - default: - case 0: //Default - break; - case 1: //0 Pressure - dp = 0.0f; - break; - case 2: //0 Velocity - dx = 0.0f; - dy = 0.0f; - break; - case 3: //0 Air - dx = 0.0f; - dy = 0.0f; - dp = 0.0f; - break; - case 4: //No Update - break; + dx = 0.0f; + dy = 0.0f; + dp = 0.0f; + for (j=-1; j<2; j++) + for (i=-1; i<2; i++) + if (y+j>0 && y+j<YRES/CELL-1 && + x+i>0 && x+i<XRES/CELL-1 && + bmap[y+j][x+i]!=WL_WALL && + bmap[y+j][x+i]!=WL_WALLELEC && + (bmap[y+j][x+i]!=WL_EWALL || emap[y+j][x+i])) + { + f = kernel[i+1+(j+1)*3]; + dx += vx[y+j][x+i]*f; + dy += vy[y+j][x+i]*f; + dp += pv[y+j][x+i]*f; + } + else + { + f = kernel[i+1+(j+1)*3]; + dx += vx[y][x]*f; + dy += vy[y][x]*f; + dp += pv[y][x]*f; + } + + tx = x - dx*0.7f; + ty = y - dy*0.7f; + i = (int)tx; + j = (int)ty; + tx -= i; + ty -= j; + if (i>=2 && i<XRES/CELL-3 && + j>=2 && j<YRES/CELL-3) + { + dx *= 1.0f - AIR_VADV; + dy *= 1.0f - AIR_VADV; + + dx += AIR_VADV*(1.0f-tx)*(1.0f-ty)*vx[j][i]; + dy += AIR_VADV*(1.0f-tx)*(1.0f-ty)*vy[j][i]; + + dx += AIR_VADV*tx*(1.0f-ty)*vx[j][i+1]; + dy += AIR_VADV*tx*(1.0f-ty)*vy[j][i+1]; + + dx += AIR_VADV*(1.0f-tx)*ty*vx[j+1][i]; + dy += AIR_VADV*(1.0f-tx)*ty*vy[j+1][i]; + + dx += AIR_VADV*tx*ty*vx[j+1][i+1]; + dy += AIR_VADV*tx*ty*vy[j+1][i+1]; + } + + if (bmap[y][x] == WL_FAN) + { + dx += fvx[y][x]; + dy += fvy[y][x]; + } + // pressure/velocity caps + if (dp > 256.0f) dp = 256.0f; + if (dp < -256.0f) dp = -256.0f; + if (dx > 256.0f) dx = 256.0f; + if (dx < -256.0f) dx = -256.0f; + if (dy > 256.0f) dy = 256.0f; + if (dy < -256.0f) dy = -256.0f; + + + switch (airMode) + { + default: + case 0: //Default + break; + case 1: //0 Pressure + dp = 0.0f; + break; + case 2: //0 Velocity + dx = 0.0f; + dy = 0.0f; + break; + case 3: //0 Air + dx = 0.0f; + dy = 0.0f; + dp = 0.0f; + break; + case 4: //No Update + break; + } + + ovx[y][x] = dx; + ovy[y][x] = dy; + opv[y][x] = dp; } - - ovx[y][x] = dx; - ovy[y][x] = dy; - opv[y][x] = dp; - } - memcpy(vx, ovx, sizeof(vx)); - memcpy(vy, ovy, sizeof(vy)); - memcpy(pv, opv, sizeof(pv)); -} + memcpy(vx, ovx, sizeof(vx)); + memcpy(vy, ovy, sizeof(vy)); + memcpy(pv, opv, sizeof(pv)); + } } |
