diff options
| author | jacksonmj <mj-pt@jacksonmj.co.uk> | 2011-12-10 15:23:33 (GMT) |
|---|---|---|
| committer | Simon Robertshaw <simon@hardwired.org.uk> | 2011-12-18 14:04:47 (GMT) |
| commit | 934d1da66eb5aec49769feaf00d0949f805fd3d5 (patch) | |
| tree | 28ee674d06060d9940e1c235d2dba39f8a5c74f5 /src/main.c | |
| parent | 20dd54f36e971e9b9f8762309caa49ed07bea031 (diff) | |
| download | powder-934d1da66eb5aec49769feaf00d0949f805fd3d5.zip powder-934d1da66eb5aec49769feaf00d0949f805fd3d5.tar.gz | |
Move Newtonian gravity into a new file
Diffstat (limited to 'src/main.c')
| -rw-r--r-- | src/main.c | 124 |
1 files changed, 4 insertions, 120 deletions
@@ -46,6 +46,7 @@ #include <misc.h> #include <font.h> #include <powder.h> +#include "gravity.h" #include <graphics.h> #include <powdergraphics.h> #include <version.h> @@ -171,7 +172,6 @@ int do_open = 0; int sys_pause = 0; int sys_shortcuts = 1; int legacy_enable = 0; //Used to disable new features such as heat, will be set by save. -int ngrav_enable = 0; //Newtonian gravity, will be set by save int aheat_enable; //Ambient heat int decorations_enable = 1; int hud_enable = 1; @@ -197,12 +197,6 @@ sign signs[MAXSIGNS]; int numCores = 4; -pthread_t gravthread; -pthread_mutex_t gravmutex; -pthread_cond_t gravcv; -int grav_ready = 0; -int gravthread_done = 0; - int core_count() { int numCPU = 1; @@ -1450,73 +1444,6 @@ int set_scale(int scale, int kiosk){ } return 1; } - -void* update_grav_async(void* unused) -{ - int done = 0; - int thread_done = 0; - memset(th_ogravmap, 0, sizeof(th_ogravmap)); - memset(th_gravmap, 0, sizeof(th_gravmap)); - memset(th_gravy, 0, sizeof(th_gravy)); - memset(th_gravx, 0, sizeof(th_gravx)); -#ifdef GRAVFFT - grav_fft_init(); -#endif - while(!thread_done){ - if(!done){ - update_grav(); - done = 1; - pthread_mutex_lock(&gravmutex); - - grav_ready = done; - thread_done = gravthread_done; - - pthread_mutex_unlock(&gravmutex); - } else { - pthread_mutex_lock(&gravmutex); - pthread_cond_wait(&gravcv, &gravmutex); - - done = grav_ready; - thread_done = gravthread_done; - - pthread_mutex_unlock(&gravmutex); - } - } - pthread_exit(NULL); -} - -void 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, update_grav_async, NULL); //Start asynchronous gravity simulation - ngrav_enable = 1; - } - memset(gravyf, 0, sizeof(gravyf)); - memset(gravxf, 0, sizeof(gravxf)); - memset(gravpf, 0, sizeof(gravpf)); -} - -void stop_grav_async() -{ - if(ngrav_enable){ - pthread_mutex_lock(&gravmutex); - gravthread_done = 1; - pthread_cond_signal(&gravcv); - pthread_mutex_unlock(&gravmutex); - pthread_join(gravthread, NULL); - pthread_mutex_destroy(&gravmutex); //Destroy the mutex - memset(gravy, 0, sizeof(gravy)); //Clear the grav velocities - memset(gravx, 0, sizeof(gravx)); //Clear the grav velocities - ngrav_enable = 0; - } - memset(gravyf, 0, sizeof(gravyf)); - memset(gravxf, 0, sizeof(gravxf)); - memset(gravpf, 0, sizeof(gravpf)); -} #ifdef RENDERER int main(int argc, char *argv[]) @@ -1648,14 +1575,7 @@ int main(int argc, char *argv[]) part_vbuf_store = part_vbuf; pers_bg = calloc((XRES+BARSIZE)*YRES, PIXELSIZE); - //Allocate full size Gravmaps - th_gravyf = calloc(XRES*YRES, sizeof(float)); - th_gravxf = calloc(XRES*YRES, sizeof(float)); - th_gravpf = calloc(XRES*YRES, sizeof(float)); - gravyf = calloc(XRES*YRES, sizeof(float)); - gravxf = calloc(XRES*YRES, sizeof(float)); - gravpf = calloc(XRES*YRES, sizeof(float)); - + gravity_init(); GSPEED = 1; /* Set 16-bit stereo audio at 22Khz */ @@ -1931,41 +1851,7 @@ int main(int argc, char *argv[]) if(sl == WL_GRAV+100 || sr == WL_GRAV+100) draw_grav_zones(part_vbuf); - if(ngrav_enable){ - pthread_mutex_lock(&gravmutex); - result = grav_ready; - if(result) //Did the gravity thread finish? - { - memcpy(th_gravmap, gravmap, sizeof(gravmap)); //Move our current gravmap to be processed other thread - //memcpy(gravy, th_gravy, sizeof(gravy)); //Hmm, Gravy - //memcpy(gravx, th_gravx, sizeof(gravx)); //Move the processed velocity maps to be used - //memcpy(gravp, th_gravp, sizeof(gravp)); - - if (!sys_pause||framerender){ //Only update if not paused - //Switch the full size gravmaps, we don't really need the two above any more - float *tmpf; - tmpf = gravyf; - gravyf = th_gravyf; - th_gravyf = tmpf; - - tmpf = gravxf; - gravxf = th_gravxf; - th_gravxf = tmpf; - - tmpf = gravpf; - gravpf = th_gravpf; - th_gravpf = tmpf; - - grav_ready = 0; //Tell the other thread that we're ready for it to continue - pthread_cond_signal(&gravcv); - } - } - pthread_mutex_unlock(&gravmutex); - //Apply the gravity mask - membwand(gravy, gravmask, sizeof(gravy), sizeof(gravmask)); - membwand(gravx, gravmask, sizeof(gravx), sizeof(gravmask)); - } - + gravity_update_async(); //Check for updated velocity maps from gravity thread if (!sys_pause||framerender) //Only update if not paused memset(gravmap, 0, sizeof(gravmap)); //Clear the old gravmap @@ -3677,9 +3563,7 @@ int main(int argc, char *argv[]) SDL_CloseAudio(); http_done(); -#ifdef GRAVFFT - grav_fft_cleanup(); -#endif + gravity_cleanup(); #ifdef LUACONSOLE luacon_close(); #endif |
