Restart N. Grav when needed (somewhat effects issue #31) and fix shitty logic when setting paused state on loading save (Fixes issue #34)

This commit is contained in:
Simon Robertshaw 2012-07-29 12:29:19 +01:00
parent 824bde4ceb
commit 90ad1fd856
2 changed files with 15 additions and 15 deletions

View File

@ -289,19 +289,15 @@ void GameModel::SetSave(SaveInfo * newSave)
if(currentSave && currentSave->GetGameSave()) if(currentSave && currentSave->GetGameSave())
{ {
GameSave * saveData = currentSave->GetGameSave(); GameSave * saveData = currentSave->GetGameSave();
SetPaused(saveData->paused & GetPaused()); SetPaused(saveData->paused | GetPaused());
sim->gravityMode = saveData->gravityMode; sim->gravityMode = saveData->gravityMode;
sim->air->airMode = saveData->airMode; sim->air->airMode = saveData->airMode;
sim->legacy_enable = saveData->legacyEnable; sim->legacy_enable = saveData->legacyEnable;
sim->water_equal_test = saveData->waterEEnabled; sim->water_equal_test = saveData->waterEEnabled;
if(saveData->gravityEnable && !sim->grav->ngrav_enable) if(saveData->gravityEnable)
{
sim->grav->start_grav_async(); sim->grav->start_grav_async();
} else
else if(!saveData->gravityEnable && sim->grav->ngrav_enable)
{
sim->grav->stop_grav_async(); sim->grav->stop_grav_async();
}
sim->clear_sim(); sim->clear_sim();
sim->Load(saveData); sim->Load(saveData);
} }

View File

@ -167,17 +167,20 @@ void Gravity::update_grav_async()
void Gravity::start_grav_async() void Gravity::start_grav_async()
{ {
if(!ngrav_enable){ if(ngrav_enable) //If it's already enabled, restart it
gravthread_done = 0; stop_grav_async();
grav_ready = 0;
pthread_mutex_init (&gravmutex, NULL); gravthread_done = 0;
pthread_cond_init(&gravcv, NULL); grav_ready = 0;
pthread_create(&gravthread, NULL, &Gravity::update_grav_async_helper, this); //Start asynchronous gravity simulation pthread_mutex_init (&gravmutex, NULL);
ngrav_enable = 1; pthread_cond_init(&gravcv, NULL);
} pthread_create(&gravthread, NULL, &Gravity::update_grav_async_helper, this); //Start asynchronous gravity simulation
ngrav_enable = 1;
memset(gravy, 0, (XRES/CELL)*(YRES/CELL)*sizeof(float)); memset(gravy, 0, (XRES/CELL)*(YRES/CELL)*sizeof(float));
memset(gravx, 0, (XRES/CELL)*(YRES/CELL)*sizeof(float)); memset(gravx, 0, (XRES/CELL)*(YRES/CELL)*sizeof(float));
memset(gravp, 0, (XRES/CELL)*(YRES/CELL)*sizeof(float)); memset(gravp, 0, (XRES/CELL)*(YRES/CELL)*sizeof(float));
memset(gravmap, 0, (XRES/CELL)*(YRES/CELL)*sizeof(float));
} }
void Gravity::stop_grav_async() void Gravity::stop_grav_async()
@ -195,6 +198,7 @@ void Gravity::stop_grav_async()
memset(gravy, 0, (XRES/CELL)*(YRES/CELL)*sizeof(float)); memset(gravy, 0, (XRES/CELL)*(YRES/CELL)*sizeof(float));
memset(gravx, 0, (XRES/CELL)*(YRES/CELL)*sizeof(float)); memset(gravx, 0, (XRES/CELL)*(YRES/CELL)*sizeof(float));
memset(gravp, 0, (XRES/CELL)*(YRES/CELL)*sizeof(float)); memset(gravp, 0, (XRES/CELL)*(YRES/CELL)*sizeof(float));
memset(gravmap, 0, (XRES/CELL)*(YRES/CELL)*sizeof(float));
} }
#ifdef GRAVFFT #ifdef GRAVFFT