diff options
Diffstat (limited to 'src/air.c')
| -rw-r--r-- | src/air.c | 51 |
1 files changed, 51 insertions, 0 deletions
@@ -23,6 +23,8 @@ float cb_pv[YRES/CELL][XRES/CELL], cb_opv[YRES/CELL][XRES/CELL]; float fvx[YRES/CELL][XRES/CELL], fvy[YRES/CELL][XRES/CELL]; +float hv[YRES/CELL][XRES/CELL], ohv[YRES/CELL][XRES/CELL]; // For Ambient Heat + void make_kernel(void) //used for velocity { int i, j; @@ -38,6 +40,55 @@ void make_kernel(void) //used for velocity for (i=-1; i<2; i++) kernel[(i+1)+3*(j+1)] *= s; } +void update_airh(void) +{ + int x, y, i, j; + float dh, dp, f, tx, ty; + for (i=0; i<YRES/CELL; i++) //reduces pressure/velocity on the edges every frame + { + hv[i][0] = 295.15f; + hv[i][1] = 295.15f; + hv[i][XRES/CELL-3] = 295.15f; + hv[i][XRES/CELL-2] = 295.15f; + hv[i][XRES/CELL-1] = 295.15f; + } + for (i=0; i<XRES/CELL; i++) //reduces pressure/velocity on the edges every frame + { + hv[0][i] = 295.15f; + hv[1][i] = 295.15f; + hv[YRES/CELL-3][i] = 295.15f; + hv[YRES/CELL-2][i] = 295.15f; + hv[YRES/CELL-1][i] = 295.15f; + } + for (y=0; y<YRES/CELL; y++) //update velocity and pressure + for (x=0; x<XRES/CELL; x++) + { + dh = 0.0f; + for (j=-1; j<2; j++) + for (i=-1; i<2; i++) + if (y+j>0 && y+j<YRES/CELL-2 && + x+i>0 && x+i<XRES/CELL-2 && + 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]; + dh += hv[y+j][x+i]*f; + } + else + { + f = kernel[i+1+(j+1)*3]; + dh += hv[y][x]*f; + } + i = (int)tx; + j = (int)ty; + tx -= i; + ty -= j; + ohv[y][x] = dh; + } + memcpy(hv, ohv, sizeof(hv)); +} + void update_grav(void) { int x, y, i, j, changed = 0; |
