TPT: Rotate/reflect particle, air, and fan velocities in transform_save 830629be3f

This commit is contained in:
Simon Robertshaw 2012-04-18 15:10:09 +01:00
parent ce7d749dda
commit d03a9c8fe5

View File

@ -741,11 +741,18 @@ void *Simulation::transform_save(void *odata, int *size, matrix2d transform, vec
float (*fvyo)[XRES/CELL] = (float (*)[XRES/CELL])calloc((YRES/CELL)*(XRES/CELL), sizeof(float)); float (*fvyo)[XRES/CELL] = (float (*)[XRES/CELL])calloc((YRES/CELL)*(XRES/CELL), sizeof(float));
float (*fvxn)[XRES/CELL] = (float (*)[XRES/CELL])calloc((YRES/CELL)*(XRES/CELL), sizeof(float)); float (*fvxn)[XRES/CELL] = (float (*)[XRES/CELL])calloc((YRES/CELL)*(XRES/CELL), sizeof(float));
float (*fvyn)[XRES/CELL] = (float (*)[XRES/CELL])calloc((YRES/CELL)*(XRES/CELL), sizeof(float)); float (*fvyn)[XRES/CELL] = (float (*)[XRES/CELL])calloc((YRES/CELL)*(XRES/CELL), sizeof(float));
float (*vxo)[XRES/CELL] = (float (*)[XRES/CELL])calloc((YRES/CELL)*(XRES/CELL), sizeof(float));
float (*vyo)[XRES/CELL] = (float (*)[XRES/CELL])calloc((YRES/CELL)*(XRES/CELL), sizeof(float));
float (*vxn)[XRES/CELL] = (float (*)[XRES/CELL])calloc((YRES/CELL)*(XRES/CELL), sizeof(float));
float (*vyn)[XRES/CELL] = (float (*)[XRES/CELL])calloc((YRES/CELL)*(XRES/CELL), sizeof(float));
float (*pvo)[XRES/CELL] = (float (*)[XRES/CELL])calloc((YRES/CELL)*(XRES/CELL), sizeof(float));
float (*pvn)[XRES/CELL] = (float (*)[XRES/CELL])calloc((YRES/CELL)*(XRES/CELL), sizeof(float));
int i, x, y, nx, ny, w, h, nw, nh; int i, x, y, nx, ny, w, h, nw, nh;
vector2d pos, tmp, ctl, cbr; vector2d pos, tmp, ctl, cbr;
vector2d vel;
vector2d cornerso[4]; vector2d cornerso[4];
unsigned char *odatac = (unsigned char *)odata; unsigned char *odatac = (unsigned char *)odata;
//*if (parse_save(odata, *size, 0, 0, 0, bmapo, fvxo, fvyo, signst, partst, pmapt)) TODO: IMPLEMENT //if (parse_save(odata, *size, 0, 0, 0, bmapo, vxo, vyo, pvo, fvxo, fvyo, signst, partst, pmapt)) //TODO: Implement
{ {
free(bmapo); free(bmapo);
free(bmapn); free(bmapn);
@ -756,6 +763,12 @@ void *Simulation::transform_save(void *odata, int *size, matrix2d transform, vec
free(fvyo); free(fvyo);
free(fvxn); free(fvxn);
free(fvyn); free(fvyn);
free(vxo);
free(vyo);
free(vxn);
free(vyn);
free(pvo);
free(pvn);
return odata; return odata;
} }
w = odatac[6]*CELL; w = odatac[6]*CELL;
@ -811,6 +824,10 @@ void *Simulation::transform_save(void *odata, int *size, matrix2d transform, vec
} }
partst[i].x = nx; partst[i].x = nx;
partst[i].y = ny; partst[i].y = ny;
vel = v2d_new(partst[i].vx, partst[i].vy);
vel = m2d_multiply_v2d(transform, vel);
partst[i].vx = vel.x;
partst[i].vy = vel.y;
} }
for (y=0; y<YRES/CELL; y++) for (y=0; y<YRES/CELL; y++)
for (x=0; x<XRES/CELL; x++) for (x=0; x<XRES/CELL; x++)
@ -826,12 +843,19 @@ void *Simulation::transform_save(void *odata, int *size, matrix2d transform, vec
bmapn[ny][nx] = bmapo[y][x]; bmapn[ny][nx] = bmapo[y][x];
if (bmapo[y][x]==WL_FAN) if (bmapo[y][x]==WL_FAN)
{ {
fvxn[ny][nx] = fvxo[y][x]; vel = v2d_new(fvxo[y][x], fvyo[y][x]);
fvyn[ny][nx] = fvyo[y][x]; vel = m2d_multiply_v2d(transform, vel);
fvxn[ny][nx] = vel.x;
fvyn[ny][nx] = vel.y;
} }
} }
vel = v2d_new(vxo[y][x], vyo[y][x]);
vel = m2d_multiply_v2d(transform, vel);
vxn[ny][nx] = vel.x;
vyn[ny][nx] = vel.y;
pvn[ny][nx] = pvo[y][x];
} }
//ndata = build_save(size,0,0,nw,nh,bmapn,fvxn,fvyn,signst,partst); TODO: IMPLEMENT //ndata = build_save(size,0,0,nw,nh,bmapn,vxn,vyn,pvn,fvxn,fvyn,signst,partst); //TODO: IMPLEMENT
free(bmapo); free(bmapo);
free(bmapn); free(bmapn);
free(partst); free(partst);
@ -841,6 +865,12 @@ void *Simulation::transform_save(void *odata, int *size, matrix2d transform, vec
free(fvyo); free(fvyo);
free(fvxn); free(fvxn);
free(fvyn); free(fvyn);
free(vxo);
free(vyo);
free(vxn);
free(vyn);
free(pvo);
free(pvn);
return ndata; return ndata;
} }