--- /dev/null
+/*
+ */
+
+#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);
+}