summaryrefslogtreecommitdiff
path: root/src/simulation/Simulation.cpp
diff options
context:
space:
mode:
authorStanislaw Skowronek <skylark@disorder.sko>2013-11-16 19:45:31 (GMT)
committer Stanislaw Skowronek <skylark@disorder.sko>2013-11-16 19:45:31 (GMT)
commit70c14bd72cd13473570bbbb0bd47eb71ca4b4a15 (patch)
tree6915056ba6746b6610a962191a7bcffafadccde5 /src/simulation/Simulation.cpp
parent4f2d1e0cba1542311bd441c1eded463ac910f9ac (diff)
downloadpowder-70c14bd72cd13473570bbbb0bd47eb71ca4b4a15.zip
powder-70c14bd72cd13473570bbbb0bd47eb71ca4b4a15.tar.gz
Some cleanups. See if this looks nicer :)
Diffstat (limited to 'src/simulation/Simulation.cpp')
-rw-r--r--src/simulation/Simulation.cpp118
1 files changed, 117 insertions, 1 deletions
diff --git a/src/simulation/Simulation.cpp b/src/simulation/Simulation.cpp
index 375d918..f0bd48c 100644
--- a/src/simulation/Simulation.cpp
+++ b/src/simulation/Simulation.cpp
@@ -2673,6 +2673,37 @@ void Simulation::unlink_solid(int i)
parts[i].sld = 0;
}
+int Simulation::link_solid(int i, int sld)
+{
+ Solid *s = solids + sld;
+
+ if(parts[i].sld)
+ return 0;
+
+ parts[i].sld = sld + 1;
+ if(s->first == -1) {
+ s->vx = s->vy = s->vrot = 0.0f;
+ s->cx = s->cdx = parts[i].x;
+ s->cy = s->cdy = parts[i].y;
+ s->ax = s->ay = s->arot = s->arad = 0.0f;
+ s->an = 0;
+ s->bf = 0;
+ s->bpx[0] = -10000;
+ s->bpx[1] = 10000;
+ s->bpy[2] = -10000;
+ s->bpy[3] = 10000;
+ s->first = i;
+ }
+
+ parts[i].snext = -1;
+ parts[i].sprev = s->last;
+ if(s->last != -1)
+ parts[s->last].snext = i;
+ s->last = i;
+
+ return 1;
+}
+
void Simulation::kill_part(int i)//kills particle number i
{
int x = (int)(parts[i].x+0.5f);
@@ -4754,9 +4785,49 @@ int Simulation::GetParticleType(std::string type)
return -1;
}
+void Simulation::solid_respawn(int i, int pp, int dx, int dy)
+{
+ int nx = (int)(parts[pp].x + 0.5f), ny = (int)(parts[pp].y + 0.5f);
+ int nc, t, pq;
+
+ if(pmap[ny+dy][nx+dx])
+ return;
+
+ nc = 1;
+ t = pmap[ny+2*dy][nx+2*dx]; if(t && parts[t >> 8].sld == i+1) nc ++;
+ t = pmap[ny+dy+dx][nx+dx+dy]; if(t && parts[t >> 8].sld == i+1) nc ++;
+ t = pmap[ny+dy-dx][nx+dx-dy]; if(t && parts[t >> 8].sld == i+1) nc ++;
+ if(nc < 3)
+ return;
+
+ pq = create_part(-1, nx+dx, ny+dy, parts[pp].type);
+ if(pq < 0)
+ return;
+
+ parts[pq].life = parts[pp].life;
+ parts[pq].ctype = parts[pp].ctype;
+ parts[pq].flags = parts[pp].flags;
+ parts[pq].temp = parts[pp].temp;
+ parts[pq].tmp = parts[pp].tmp;
+ parts[pq].tmp2 = parts[pp].tmp2;
+ parts[pq].dcolour = parts[pp].dcolour;
+ if(pmap[ny+2*dy][nx+2*dx]) {
+ parts[pq].x = (parts[pp].x + parts[pmap[ny+2*dy][nx+2*dx] >> 8].x) * 0.5f;
+ parts[pq].y = (parts[pp].y + parts[pmap[ny+2*dy][nx+2*dx] >> 8].y) * 0.5f;
+ parts[pq].vx = (parts[pp].vx + parts[pmap[ny+2*dy][nx+2*dx] >> 8].vx) * 0.5f;
+ parts[pq].vy = (parts[pp].vy + parts[pmap[ny+2*dy][nx+2*dx] >> 8].vy) * 0.5f;
+ } else {
+ parts[pq].x = (parts[pmap[ny+dy+dx][nx+dx+dy] >> 8].x + parts[pmap[ny+dy-dx][nx+dx-dy] >> 8].x) * 0.5f;
+ parts[pq].y = (parts[pmap[ny+dy+dx][nx+dx+dy] >> 8].y + parts[pmap[ny+dy-dx][nx+dx-dy] >> 8].y) * 0.5f;
+ parts[pq].vx = (parts[pmap[ny+dy+dx][nx+dx+dy] >> 8].vx + parts[pmap[ny+dy-dx][nx+dx-dy] >> 8].vx) * 0.5f;
+ parts[pq].vy = (parts[pmap[ny+dy+dx][nx+dx+dy] >> 8].vy + parts[pmap[ny+dy-dx][nx+dx-dy] >> 8].vy) * 0.5f;
+ }
+ link_solid(pq, i);
+}
+
void Simulation::update_solids()
{
- int i, pp, nc, bb, bd, nx, ny;
+ int i, pp, pq, nc, bb, bd, nx, ny;
float adx, ady, mmx, mmy, dd, ee, rmx, rmy, vx, vy, av;
float vrot, cvrot, svrot;
Solid *sld;
@@ -4770,15 +4841,60 @@ void Simulation::update_solids()
cvrot = cosf(sld->vrot) - 1.0f;
svrot = sinf(sld->vrot);
for(pp=sld->first; pp!=-1; pp=parts[pp].snext) {
+ nx = (int)(parts[pp].x + 0.5f);
+ ny = (int)(parts[pp].y + 0.5f);
+ if((pmap[ny][nx] >> 8) == pp)
+ pmap[ny][nx] = 0;
adx = parts[pp].x - sld->cdx;
ady = parts[pp].y - sld->cdy;
vx = sld->vx + adx*cvrot + ady*svrot;
vy = sld->vy + ady*cvrot - adx*svrot;
parts[pp].x += vx;
parts[pp].y += vy;
+ nx = (int)(parts[pp].x + 0.5f);
+ ny = (int)(parts[pp].y + 0.5f);
+ if(nx >= CELL && nx < XRES-CELL && ny >= CELL && ny < YRES-CELL) {
+ pmap[ny][nx] = (pp << 8) | parts[pp].type;
+ } else {
+ unlink_solid(pp);
+ if(elementCount[parts[pp].type])
+ elementCount[parts[pp].type]--;
+ parts[pp].type = PT_NONE;
+ parts[pp].life = pfree;
+ pfree = pp;
+ }
+ }
+ for(pp=sld->first; pp!=-1; pp=parts[pp].snext) {
+ nx = (int)(parts[pp].x + 0.5f);
+ ny = (int)(parts[pp].y + 0.5f);
+ if((pmap[ny][nx] >> 8) != pp) {
+ if(!pmap[ny][nx-1] || parts[pmap[ny][nx-1] >> 8].sld != i+1) continue;
+ if(!pmap[ny][nx+1] || parts[pmap[ny][nx+1] >> 8].sld != i+1) continue;
+ if(!pmap[ny-1][nx] || parts[pmap[ny-1][nx] >> 8].sld != i+1) continue;
+ if(!pmap[ny+1][nx] || parts[pmap[ny+1][nx] >> 8].sld != i+1) continue;
+ pq = pmap[ny][nx] >> 8;
+ if(fabs(parts[pq].vx) < fabs(parts[pp].vx))
+ parts[pq].vx = parts[pp].vx;
+ if(fabs(parts[pq].vy) < fabs(parts[pp].vy))
+ parts[pq].vy = parts[pp].vy;
+ unlink_solid(pp);
+ if(elementCount[parts[pp].type])
+ elementCount[parts[pp].type]--;
+ parts[pp].type = PT_NONE;
+ parts[pp].life = pfree;
+ pfree = pp;
+ } else {
+ solid_respawn(i, pp, -1, 0);
+ solid_respawn(i, pp, 1, 0);
+ solid_respawn(i, pp, 0, -1);
+ solid_respawn(i, pp, 0, 1);
+ }
}
}
+ if(sld->first == -1)
+ continue;
+
for(pp=sld->first; pp!=-1; pp=parts[pp].snext) {
nx = (int)(parts[pp].x + 0.5f);
ny = (int)(parts[pp].y + 0.5f);