summaryrefslogtreecommitdiff
path: root/src/main.c
diff options
context:
space:
mode:
authorjacksonmj <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)
commit934d1da66eb5aec49769feaf00d0949f805fd3d5 (patch)
tree28ee674d06060d9940e1c235d2dba39f8a5c74f5 /src/main.c
parent20dd54f36e971e9b9f8762309caa49ed07bea031 (diff)
downloadpowder-934d1da66eb5aec49769feaf00d0949f805fd3d5.zip
powder-934d1da66eb5aec49769feaf00d0949f805fd3d5.tar.gz
Move Newtonian gravity into a new file
Diffstat (limited to 'src/main.c')
-rw-r--r--src/main.c124
1 files changed, 4 insertions, 120 deletions
diff --git a/src/main.c b/src/main.c
index ef150ac..ee62b26 100644
--- a/src/main.c
+++ b/src/main.c
@@ -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