Commit before breaking everything
[matches/honours.git] / research / transmission_spectroscopy / universesim / src / viewer.c
1 /*
2  */
3
4 #include <SDL/SDL.h>
5 #include <zlib.h>
6 #include <common.h>
7
8 extern void     Visualiser_Initialise(void);
9 extern void     Visualiser_Update(void);
10 extern void     Video_SetName(const char *Format, ...);
11
12  int    main(int argc, char *argv[]);
13 void    LoadIns(int ID);
14
15 SDL_Surface     *gScreen;
16  int    giLargeIntSize;
17  int    giVectorComponents;
18  int    giNumFrames;
19 FILE    *gVideoFile;
20 tParticle       *gpParticles;
21 unsigned int    giNumParticles;
22  int    giFramerate = 10;
23
24 int main(int argc, char *argv[])
25 {
26          int    frame = 0;
27          int    len;
28         size_t  size;
29         SDL_Event       e;
30          int    bPlayback = 0;
31          int    bRepeat = 1;
32         
33         gVideoFile = fopen(argv[1], "rb");
34         len = fread(&giLargeIntSize, 2, 1, gVideoFile);
35         len = fread(&giVectorComponents, 2, 1, gVideoFile);
36         len = fread(&giNumParticles, 4, 1, gVideoFile);
37         printf("Sizeof LI = %i, VectC = %i\n", giLargeIntSize, giVectorComponents);
38         printf("%i Particles\n", giNumParticles);
39         
40         fseek(gVideoFile, 0, SEEK_END);
41         size = ftell(gVideoFile);
42         giNumFrames = (size-8)/(giNumParticles*giLargeIntSize*(giVectorComponents+2));
43         printf("%i Itterations\n", giNumFrames);
44         fseek(gVideoFile, 8, SEEK_SET);
45         
46         gpParticles = malloc( sizeof(tParticle)*giNumParticles );
47         printf("gpParticles = %p\n", gpParticles);
48         
49         Visualiser_Initialise();
50         LoadIns(0);
51         
52         for(;;)
53         {
54                 Visualiser_Update();
55                 
56                 if(bPlayback)
57                 {
58                         if(frame < giNumFrames-1) {
59                                 frame ++;
60                                 LoadIns(frame);
61                         }
62                         else {
63                                 if(bRepeat) {
64                                         frame = 0;
65                                         LoadIns(frame);
66                                 }
67                                 else
68                                         bPlayback = 0;
69                         }
70                 }
71                 
72                 while(SDL_PollEvent(&e))
73                 {
74                         switch(e.type)
75                         {
76                         case SDL_QUIT:  return 0;
77                         case SDL_KEYDOWN:
78                                 switch(e.key.keysym.sym)
79                                 {
80                                 case SDLK_ESCAPE:       return 0;
81                                 case SDLK_LEFT:
82                                         if(frame > 0) {
83                                                 frame --;
84                                                 LoadIns(frame);
85                                         }
86                                         break;
87                                 case SDLK_RIGHT:
88                                         if(frame < giNumFrames-1) {
89                                                 frame ++;
90                                                 LoadIns(frame);
91                                         }
92                                         break;
93                                 
94                                 case SDLK_p:    bPlayback = !bPlayback; break;
95                                 case SDLK_r:    bRepeat = !bRepeat;             break;
96                                 
97                                 case SDLK_KP_PLUS:      giFramerate ++; break;
98                                 case SDLK_KP_MINUS:     giFramerate --; break;
99
100                                 default:
101                                         break;
102                                 }
103                                 break;
104                         default:
105                                 break;
106                         }
107                 }
108                 SDL_Delay(1000/giFramerate);
109         }
110         
111         return 0;
112 }
113
114 void LoadIns(int ID)
115 {
116          int    i, len;
117         fseek(gVideoFile, 8+ID*(giNumParticles*giLargeIntSize*(giVectorComponents+2)), SEEK_SET);
118         
119         for( i = 0; i < giNumParticles; i++ )
120         {
121                 len = fread(&gpParticles[i].Location, giLargeIntSize*giVectorComponents, 1, gVideoFile);
122                 len = fread(&gpParticles[i].Mass, giLargeIntSize, 1, gVideoFile);
123                 len = fread(&gpParticles[i].Charge, giLargeIntSize, 1, gVideoFile);
124         }
125         Video_SetName("Timestamp %i (out of %i) (%i FPS)", ID+1, giNumFrames, giFramerate);
126 }

UCC git Repository :: git.ucc.asn.au