From 90ad1fd8564f8a305932b1488159c1f784c04ae8 Mon Sep 17 00:00:00 2001 From: Simon Robertshaw Date: Sun, 29 Jul 2012 12:29:19 +0100 Subject: [PATCH] Restart N. Grav when needed (somewhat effects issue #31) and fix shitty logic when setting paused state on loading save (Fixes issue #34) --- src/game/GameModel.cpp | 10 +++------- src/simulation/Gravity.cpp | 20 ++++++++++++-------- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/src/game/GameModel.cpp b/src/game/GameModel.cpp index fef4e6171..b2f7d700f 100644 --- a/src/game/GameModel.cpp +++ b/src/game/GameModel.cpp @@ -289,19 +289,15 @@ void GameModel::SetSave(SaveInfo * newSave) if(currentSave && currentSave->GetGameSave()) { GameSave * saveData = currentSave->GetGameSave(); - SetPaused(saveData->paused & GetPaused()); + SetPaused(saveData->paused | GetPaused()); sim->gravityMode = saveData->gravityMode; sim->air->airMode = saveData->airMode; sim->legacy_enable = saveData->legacyEnable; sim->water_equal_test = saveData->waterEEnabled; - if(saveData->gravityEnable && !sim->grav->ngrav_enable) - { + if(saveData->gravityEnable) sim->grav->start_grav_async(); - } - else if(!saveData->gravityEnable && sim->grav->ngrav_enable) - { + else sim->grav->stop_grav_async(); - } sim->clear_sim(); sim->Load(saveData); } diff --git a/src/simulation/Gravity.cpp b/src/simulation/Gravity.cpp index 2b7810d90..89f626ea9 100644 --- a/src/simulation/Gravity.cpp +++ b/src/simulation/Gravity.cpp @@ -167,17 +167,20 @@ void Gravity::update_grav_async() void Gravity::start_grav_async() { - if(!ngrav_enable){ - gravthread_done = 0; - grav_ready = 0; - pthread_mutex_init (&gravmutex, NULL); - pthread_cond_init(&gravcv, NULL); - pthread_create(&gravthread, NULL, &Gravity::update_grav_async_helper, this); //Start asynchronous gravity simulation - ngrav_enable = 1; - } + if(ngrav_enable) //If it's already enabled, restart it + stop_grav_async(); + + gravthread_done = 0; + grav_ready = 0; + pthread_mutex_init (&gravmutex, NULL); + 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(gravx, 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() @@ -195,6 +198,7 @@ void Gravity::stop_grav_async() memset(gravy, 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(gravmap, 0, (XRES/CELL)*(YRES/CELL)*sizeof(float)); } #ifdef GRAVFFT