diff options
| author | Simon Robertshaw <simon@hardwired.org.uk> | 2012-04-18 20:18:37 (GMT) |
|---|---|---|
| committer | Simon Robertshaw <simon@hardwired.org.uk> | 2012-04-18 20:18:37 (GMT) |
| commit | b40f13b66a8661d8698e5fc737c2842dfb73e6f9 (patch) | |
| tree | 1e9fb258cd8bcbba92c14b0ccef4bf6acfd3712a /src/elements/gel.cpp | |
| parent | ff7428fc70385287204832048bcf2f3c72aaabe8 (diff) | |
| download | powder-b40f13b66a8661d8698e5fc737c2842dfb73e6f9.zip powder-b40f13b66a8661d8698e5fc737c2842dfb73e6f9.tar.gz | |
TPT: Added gel - a liquid with variable heat conductivity and viscosity. 8523da398f
Diffstat (limited to 'src/elements/gel.cpp')
| -rw-r--r-- | src/elements/gel.cpp | 62 |
1 files changed, 62 insertions, 0 deletions
diff --git a/src/elements/gel.cpp b/src/elements/gel.cpp new file mode 100644 index 0000000..9092097 --- /dev/null +++ b/src/elements/gel.cpp @@ -0,0 +1,62 @@ +#include "simulation\Element.h" + +int update_GEL(UPDATE_FUNC_ARGS) { + int r, rx, ry; + for (rx=-2; rx<3; rx++) + for (ry=-2; ry<3; ry++) + if (x+rx>=0 && y+ry>0 && x+rx<XRES && y+ry<YRES && (rx || ry)) + { + r = pmap[y+ry][x+rx]; + if (!r) + continue; + + //Desaturation + if (((r&0xFF)==PT_WATR || (r&0xFF)==PT_DSTW || (r&0xFF)==PT_SLTW || (r&0xFF)==PT_CBNW) + && parts[i].tmp<100) + { + parts[i].tmp = (100+parts[i].tmp)/2; + sim->kill_part(r>>8); + } + + char gel = 0; + if ((r&0xFF)==PT_GEL) + gel = 1; + + //Concentration diffusion + if (gel && (parts[r>>8].tmp+1)<parts[i].tmp) + { + parts[r>>8].tmp++; + parts[i].tmp--; + } + + float dx, dy; + dx = parts[i].x - parts[r>>8].x; + dy = parts[i].y - parts[r>>8].y; + + //Stickness + if ((dx*dx + dy*dy)>1.5 && (gel || !sim->ptypes[r&0xFF].falldown || (fabs(rx)<2 && fabs(ry)<2))) + { + float per, nd; + nd = dx*dx + dy*dy - 0.5; + + per = 5*(1 - parts[i].tmp/100)*(nd/(dx*dx + dy*dy + nd) - 0.5); + if (sim->ptypes[r&0xFF].state==ST_LIQUID) + per *= 0.1; + + dx *= per; dy *= per; + parts[i].vx += dx; parts[r>>8].vx -= dx; + parts[i].vy += dy; parts[r>>8].vy -= dy; + } + } + return 0; +} + +int graphics_GEL(GRAPHICS_FUNC_ARGS) +{ + int q = cpart->tmp; + *colr = q*(32-255)/120+255; + *colg = q*(48-186)/120+186; + *colb = q*208/120; + return 0; +} + |
