diff options
| author | jacksonmj <mj-pt@jacksonmj.co.uk> | 2011-06-18 13:48:00 (GMT) |
|---|---|---|
| committer | Simon Robertshaw <simon@hardwired.org.uk> | 2011-06-25 14:51:07 (GMT) |
| commit | 636b1db4d231e0d9f1815ddb74abd97b64b1d3ba (patch) | |
| tree | 29127bb16e4c5580a4c5aa0dcac4586098bcb2f2 /src | |
| parent | f417d7a4df7a13d8971d84708b236f31caa3e622 (diff) | |
| download | powder-636b1db4d231e0d9f1815ddb74abd97b64b1d3ba.zip powder-636b1db4d231e0d9f1815ddb74abd97b64b1d3ba.tar.gz | |
Better liquids movement in radial/Newtonian gravity
Diffstat (limited to 'src')
| -rw-r--r-- | src/powder.c | 103 |
1 files changed, 101 insertions, 2 deletions
diff --git a/src/powder.c b/src/powder.c index afb1591..917f9bf 100644 --- a/src/powder.c +++ b/src/powder.c @@ -2109,9 +2109,8 @@ killed: goto movedone; } } - if (ptypes[t].falldown>1 && (parts[i].vy>fabsf(parts[i].vx) || gravityMode==2)) + if (ptypes[t].falldown>1 && !ngrav_enable && gravityMode==0 && parts[i].vy>fabsf(parts[i].vx)) { - // TODO: rewrite to operate better with radial gravity s = 0; // stagnant is true if FLAG_STAGNANT was set for this particle in previous frame if (!stagnant || nt) //nt is if there is an something else besides the current particle type, around the particle @@ -2155,6 +2154,106 @@ killed: parts[i].vx *= ptypes[t].collision; parts[i].vy *= ptypes[t].collision; } + else if (ptypes[t].falldown>1 && fabsf(pGravX*parts[i].vx+pGravY*parts[i].vy)>fabsf(pGravY*parts[i].vx+pGravX*parts[i].vy)) + { + float nxf, nyf, ptGrav = ptypes[t].gravity; + s = 0; + // stagnant is true if FLAG_STAGNANT was set for this particle in previous frame + if (!stagnant || nt) //nt is if there is an something else besides the current particle type, around the particle + rt = 30;//slight less water lag, although it changes how it moves a lot + else + rt = 10; + nxf = clear_xf; + nyf = clear_yf; + for (j=0;j<rt;j++) + { + switch (gravityMode) + { + default: + case 0: + pGravX = 0.0f; + pGravY = ptGrav; + break; + case 1: + pGravX = pGravY = 0.0f; + break; + case 2: + pGravD = 0.01f - hypotf((nx - XCNTR), (ny - YCNTR)); + pGravX = ptGrav * ((float)(nx - XCNTR) / pGravD); + pGravY = ptGrav * ((float)(ny - YCNTR) / pGravD); + } + pGravX += gravx[ny/CELL][nx/CELL]; + pGravY += gravy[ny/CELL][nx/CELL]; + if (fabsf(pGravY)>fabsf(pGravX)) + mv = fabsf(pGravY); + else + mv = fabsf(pGravX); + if (mv<0.0001f) break; + pGravX /= mv; + pGravY /= mv; + nxf += r*pGravY; + nyf -= r*pGravX; + nx = (int)(nxf+0.5f); + ny = (int)(nyf+0.5f); + if (nx<0 || ny<0 || nx>=XRES || ny >=YRES) + break; + if ((pmap[ny][nx]&0xFF)!=t || bmap[ny/CELL][nx/CELL]) + { + s = do_move(i, x, y, nxf, nyf); + if (s || bmap[ny/CELL][nx/CELL]!=WL_STREAM) + break; + } + } + if (s==1) + { + clear_x = nx; + clear_y = ny; + for (j=0;j<rt;j++) + { + switch (gravityMode) + { + default: + case 0: + pGravX = 0.0f; + pGravY = ptGrav; + break; + case 1: + pGravX = pGravY = 0.0f; + break; + case 2: + pGravD = 0.01f - hypotf((nx - XCNTR), (ny - YCNTR)); + pGravX = ptGrav * ((float)(nx - XCNTR) / pGravD); + pGravY = ptGrav * ((float)(ny - YCNTR) / pGravD); + } + pGravX += gravx[ny/CELL][nx/CELL]; + pGravY += gravy[ny/CELL][nx/CELL]; + if (fabsf(pGravY)>fabsf(pGravX)) + mv = fabsf(pGravY); + else + mv = fabsf(pGravX); + if (mv<0.0001f) break; + pGravX /= mv; + pGravY /= mv; + nxf += pGravX; + nyf += pGravY; + nx = (int)(nxf+0.5f); + ny = (int)(nyf+0.5f); + if (nx<0 || ny<0 || nx>=XRES || ny>=YRES) + break; + if ((pmap[ny][nx]&0xFF)!=t || bmap[ny/CELL][nx/CELL]) + { + s = do_move(i, clear_x, clear_y, nxf, nyf); + if (s || bmap[ny/CELL][nx/CELL]!=WL_STREAM) + break; + } + } + } + else if (s==-1) {} // particle is out of bounds + else if ((clear_x!=x||clear_y!=y) && do_move(i, x, y, clear_xf, clear_yf)) {} + else parts[i].flags |= FLAG_STAGNANT; + parts[i].vx *= ptypes[t].collision; + parts[i].vy *= ptypes[t].collision; + } else { // if interpolation was done, try moving to last clear position |
