Commit before breaking everything
[matches/honours.git] / research / transmission_spectroscopy / universesim / src / viewer.c
diff --git a/research/transmission_spectroscopy/universesim/src/viewer.c b/research/transmission_spectroscopy/universesim/src/viewer.c
new file mode 100644 (file)
index 0000000..d24cbdd
--- /dev/null
@@ -0,0 +1,126 @@
+/*
+ */
+
+#include <SDL/SDL.h>
+#include <zlib.h>
+#include <common.h>
+
+extern void    Visualiser_Initialise(void);
+extern void    Visualiser_Update(void);
+extern void    Video_SetName(const char *Format, ...);
+
+ int   main(int argc, char *argv[]);
+void   LoadIns(int ID);
+
+SDL_Surface    *gScreen;
+ int   giLargeIntSize;
+ int   giVectorComponents;
+ int   giNumFrames;
+FILE   *gVideoFile;
+tParticle      *gpParticles;
+unsigned int   giNumParticles;
+ int   giFramerate = 10;
+
+int main(int argc, char *argv[])
+{
+        int    frame = 0;
+        int    len;
+       size_t  size;
+       SDL_Event       e;
+        int    bPlayback = 0;
+        int    bRepeat = 1;
+       
+       gVideoFile = fopen(argv[1], "rb");
+       len = fread(&giLargeIntSize, 2, 1, gVideoFile);
+       len = fread(&giVectorComponents, 2, 1, gVideoFile);
+       len = fread(&giNumParticles, 4, 1, gVideoFile);
+       printf("Sizeof LI = %i, VectC = %i\n", giLargeIntSize, giVectorComponents);
+       printf("%i Particles\n", giNumParticles);
+       
+       fseek(gVideoFile, 0, SEEK_END);
+       size = ftell(gVideoFile);
+       giNumFrames = (size-8)/(giNumParticles*giLargeIntSize*(giVectorComponents+2));
+       printf("%i Itterations\n", giNumFrames);
+       fseek(gVideoFile, 8, SEEK_SET);
+       
+       gpParticles = malloc( sizeof(tParticle)*giNumParticles );
+       printf("gpParticles = %p\n", gpParticles);
+       
+       Visualiser_Initialise();
+       LoadIns(0);
+       
+       for(;;)
+       {
+               Visualiser_Update();
+               
+               if(bPlayback)
+               {
+                       if(frame < giNumFrames-1) {
+                               frame ++;
+                               LoadIns(frame);
+                       }
+                       else {
+                               if(bRepeat) {
+                                       frame = 0;
+                                       LoadIns(frame);
+                               }
+                               else
+                                       bPlayback = 0;
+                       }
+               }
+               
+               while(SDL_PollEvent(&e))
+               {
+                       switch(e.type)
+                       {
+                       case SDL_QUIT:  return 0;
+                       case SDL_KEYDOWN:
+                               switch(e.key.keysym.sym)
+                               {
+                               case SDLK_ESCAPE:       return 0;
+                               case SDLK_LEFT:
+                                       if(frame > 0) {
+                                               frame --;
+                                               LoadIns(frame);
+                                       }
+                                       break;
+                               case SDLK_RIGHT:
+                                       if(frame < giNumFrames-1) {
+                                               frame ++;
+                                               LoadIns(frame);
+                                       }
+                                       break;
+                               
+                               case SDLK_p:    bPlayback = !bPlayback; break;
+                               case SDLK_r:    bRepeat = !bRepeat;             break;
+                               
+                               case SDLK_KP_PLUS:      giFramerate ++; break;
+                               case SDLK_KP_MINUS:     giFramerate --; break;
+
+                               default:
+                                       break;
+                               }
+                               break;
+                       default:
+                               break;
+                       }
+               }
+               SDL_Delay(1000/giFramerate);
+       }
+       
+       return 0;
+}
+
+void LoadIns(int ID)
+{
+        int    i, len;
+       fseek(gVideoFile, 8+ID*(giNumParticles*giLargeIntSize*(giVectorComponents+2)), SEEK_SET);
+       
+       for( i = 0; i < giNumParticles; i++ )
+       {
+               len = fread(&gpParticles[i].Location, giLargeIntSize*giVectorComponents, 1, gVideoFile);
+               len = fread(&gpParticles[i].Mass, giLargeIntSize, 1, gVideoFile);
+               len = fread(&gpParticles[i].Charge, giLargeIntSize, 1, gVideoFile);
+       }
+       Video_SetName("Timestamp %i (out of %i) (%i FPS)", ID+1, giNumFrames, giFramerate);
+}

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