1 /***************************************************************************
2                           tdfsb.c  -  3D filesystem browser
3                              -------------------
4     begin                : Fri Feb 23 2001
5     copyright            : (C) 2001 - 2007 by Leander Seige
6     email                : tdfsb@determinate.net
7  ***************************************************************************/
8 
9 /***************************************************************************
10  *                                                                         *
11  *   This program is free software; you can redistribute it and/or modify  *
12  *   it under the terms of the GNU General Public License as published by  *
13  *   the Free Software Foundation; either version 2 of the License, or     *
14  *   (at your option) any later version.                                   *
15  *                                                                         *
16  ***************************************************************************/
17 
18 /***************************************************************************
19     Everything here is released under the GPL and coded by Leander Seige.
20     I would like to develop this program myself so if you have bugreports,
21    additional code, bugfixes, comments, suggestions, questions or something
22               similar, please mail me: tdfsb@determinate.net
23                   This is not a limitation, just a request.
24  ***************************************************************************/
25 
26 #include <stdlib.h>
27 #include <stdio.h>
28 #include <string.h>
29 #include <dirent.h>
30 #include <ctype.h>
31 #include <math.h>
32 #include <unistd.h>
33 #include <sys/types.h>
34 #include <sys/stat.h>
35 #include <sys/time.h>
36 #include <GL/glut.h>
37 #include <SDL.h>
38 #include <SDL_image.h>
39 #include <smpeg/smpeg.h>
40 
41 #ifndef _GLUfuncptr
42 #define _GLUfuncptr void*
43 #endif
44 
45 #ifdef PI
46 #undef PI
47 #endif
48 
49 /* #define PI 3.1415926535897932384626433832795029 this is too accurate.. yes, realy :)  */
50 #define PI  3.14159
51 #define SQF 0.70710
52 
53 const SDL_VideoInfo* info = NULL;
54 SDL_Event event;
55 SDL_Surface *window;
56 int bpp=0, rgb_size[3];
57 GLUquadricObj *aua1, *aua2;
58 SDL_TimerID TDFSB_TIMER_ID;
59 void (*TDFSB_FUNC_IDLE)(void),(*TDFSB_FUNC_DISP)(void);
60 void (*TDFSB_FUNC_MOUSE)(int button, int state, int x, int y),(*TDFSB_FUNC_MOTION)(int x, int y);
61 int  (*TDFSB_FUNC_KEY)(unsigned char key);
62 int  (*TDFSB_FUNC_UPKEY)(unsigned char key);
63 
64 unsigned char *ssi;
65 unsigned long int www,hhh,p2w,p2h,cglmode;
66 
67 long int c1,c2,c3,c4,cc,cc1,cc2,cc3,cc4;
68 
69 static GLuint TDFSB_DisplayLists=0;
70 static GLuint TDFSB_CylinderList=0;
71 static GLuint TDFSB_AudioList=0;
72 static GLuint TDFSB_HelpList=0;
73 static GLuint TDFSB_SolidList=0;
74 static GLuint TDFSB_BlendList=0;
75 
76 unsigned long int DRN;
77 unsigned int DRNratio;
78 GLdouble mx,my,mz,r,u,v;
79 
80 struct tree_entry
81 {
82     unsigned char       *name;
83     unsigned long int   namelen;
84     unsigned char       *linkpath;
85     unsigned int        mode,regtype,rasterx,rasterz;
86     GLfloat             posx,posy,posz,scalex,scaley,scalez;
87     unsigned int        uniint0,uniint1,uniint2,uniint3;
88     unsigned char       *uniptr;
89     off_t               size;
90     struct tree_entry   *next;
91 };
92 
93 struct tree_entry *root, *help, *FMptr, *TDFSB_OBJECT_SELECTED=NULL, *TDFSB_OA=NULL;
94 unsigned char *FCptr;
95 
96 struct stat buf;
97 
98 char temp_trunc[4096];
99 char TDFSB_CURRENTPATH[4096], fullpath[4096], yabuf[4096], fpsbuf[12], cfpsbuf[12], throttlebuf[14], ballbuf[20], home[512], flybuf[12], classicbuf[12];
100 char TDFSB_CUSTOM_EXECUTE_STRING[4096];
101 char TDFSB_CES_TEMP[4096];
102 char *alert_kc="MALFORMED KEYBOARD MAP";
103 char *alert_kc2="USING DEFAULTS";
104 unsigned char ch, TDFSB_KEY_FINDER=0;
105 GLuint TDFSB_TEX_NUM;
106 GLuint *TDFSB_TEX_NAMES;
107 
108 char *help_str,*tmpstr,*help_copy;
109 int cnt;
110 int forwardkeybuf = 0;
111 int leftkeybuf = 0;
112 int rightkeybuf = 0;
113 int backwardkeybuf = 0;
114 int upkeybuf = 0;
115 int downkeybuf = 0;
116 
117 GLdouble prevlen;
118 
119 const int lsuff=66;
120 
121 char *xsuff[67];
122 unsigned int  tsuff[67];
123 char  *nsuff [7];
124 
125 GLfloat fh,fh2,mono;
126 
127 int SWX,SWY,PWX,PWY,aSWX,aSWY,aPWX,aPWY,PWD;
128 GLdouble centX,centY;
129 int TDFSB_SHADE=1,TDFSB_FILENAMES=2,TDFSB_ICUBE=1,TDFSB_SHOW_DISPLAY=0,TDFSB_XL_DISPLAY=0,TDFSB_HAVE_MOUSE=1,TDFSB_ANIM_COUNT=0,TDFSB_DIR_ALPHASORT=1,TDFSB_OBJECT_SEARCH=0;
130 int TDFSB_SPEED_DISPLAY=0,TDFSB_SHOW_DOTFILES=0,TDFSB_SHOW_CROSSHAIR=0,TDFSB_FULLSCREEN=0,TDFSB_SHOW_HELP=0,TDFSB_GROUND_CROSS=0,TDFSB_NOTIFY;
131 int TDFSB_CONFIG_FULLSCREEN=0, TDFSB_SHOW_FPS=0,TDFSB_ANIM_STATE=0,TDFSB_MODE_FLY=0,TDFSB_FLY_DISPLAY=0,TDFSB_CLASSIC_NAV=0,TDFSB_CLASSIC_DISPLAY=0,TDFSB_ALERT_KC=0;
132 int TDFSB_SHOW_THROTTLE=0, TDFSB_SHOW_BALL=0;
133 int TDFSB_FPS_CONFIG=0, TDFSB_FPS_CACHE=0, TDFSB_FPS_REAL=0, TDFSB_FPS_DISP=0, TDFSB_FPS_DT=1000, TDFSB_SHOW_CONFIG_FPS=0;
134 int TDFSB_MW_STEPS=1;
135 long TDFSB_US_RUN=0;
136 int TDFSB_CSE_FLAG=1;
137 
138 SDL_Surface *TDFSB_MPEG_SURFACE=NULL;
139 SMPEG *TDFSB_MPEG_HANDLE=NULL,*TDFSB_MP3_HANDLE=NULL;
140 SMPEG_Info TDFSB_MPEG_INFO,TDFSB_MP3_INFO;
141 struct tree_entry *TDFSB_MPEG_FILE,*TDFSB_MP3_FILE;
142 unsigned long int TDFSB_MPEG_FRAMENO;
143 
144 struct timeval ltime,ttime,rtime,wtime;
145 long sec;
146 
147 GLdouble TDFSB_OA_DX,TDFSB_OA_DY,TDFSB_OA_DZ;
148 GLdouble TDFSB_NORTH_X=0, TDFSB_NORTH_Z=0;
149 GLfloat TDFSB_MAXX,TDFSB_MAXZ;
150 GLfloat TDFSB_MINX,TDFSB_MINZ;
151 GLfloat TDFSB_STEPX,TDFSB_STEPZ;
152 GLfloat TDFSB_GG_R=0.2, TDFSB_GG_G=0.2, TDFSB_GG_B=0.6;
153 GLfloat TDFSB_BG_R=0.0, TDFSB_BG_G=0.0, TDFSB_BG_B=0.0;
154 GLfloat TDFSB_FN_R=1.0, TDFSB_FN_G=1.0, TDFSB_FN_B=1.0;
155 GLint TDFSB_BALL_DETAIL=8,TDFSB_WAS_NOREAD=0,TDFSB_MAX_TEX_SIZE=0,temp;
156 GLfloat mousesense=1.5;
157 GLfloat mousespeed=2.0;
158 GLfloat headspeed=1.0;
159 GLdouble vposx,vposy,vposz,tposx,tposy,tposz,smoox,smooy,smooz,smoou,lastposz,lastposx,uposy;
160 
161 	GLfloat mat_ambient[]     = { 0.7, 0.7, 0.7, 1.0 };
162 	GLfloat mat_ambient_red[] = { 1.0, 0.0, 0.0, 0.5 };
163 	GLfloat mat_ambient_grn[] = { 0.0, 1.0, 0.0, 0.5 };
164 	GLfloat mat_ambient_yel[] = { 1.0, 1.0, 0.0, 0.5 };
165 	GLfloat mat_ambient_gry[] = { 1.0, 1.0, 1.0, 0.25 };
166 
167    	GLfloat mat_diffuse[]     = { 0.8, 0.8, 0.8, 1.0 };
168    	GLfloat mat_diffuse_red[] = { 1.0, 0.0, 0.0, 0.5 };
169    	GLfloat mat_diffuse_grn[] = { 0.0, 1.0, 0.0, 0.5 };
170    	GLfloat mat_diffuse_yel[] = { 1.0, 1.0, 0.0, 0.5 };
171    	GLfloat mat_diffuse_gry[] = { 1.0, 1.0, 1.0, 0.25 };
172 
173 	GLfloat mat_specular[]     = { 0.9, 0.9, 0.9, 1.0 };
174 	GLfloat mat_specular_red[] = { 1.0, 0.0, 0.0, 0.5 };
175 	GLfloat mat_specular_grn[] = { 0.0, 1.0, 0.0, 0.5 };
176 	GLfloat mat_specular_yel[] = { 1.0, 1.0, 0.0, 0.5 };
177 	GLfloat mat_specular_gry[] = { 1.0, 1.0, 1.0, 0.25 };
178 
179    	GLfloat mat_emission[]     = { 0.0, 0.0, 0.0, 1.0 };
180    	GLfloat mat_emission_red[] = { 0.4, 0.2, 0.2, 0.5 };
181    	GLfloat mat_emission_grn[] = { 0.2, 0.4, 0.2, 0.5 };
182    	GLfloat mat_emission_yel[] = { 0.4, 0.4, 0.2, 0.5 };
183    	GLfloat mat_emission_gry[] = { 0.3, 0.3, 0.3, 0.25 };
184 
185    	GLfloat mat_shininess[] = { 50.0 };
186 
187 GLfloat light_position[] = { 1.0, 2.0, 1.0, 0.0 };
188 
189 
190 DIR *mydir,*tempdir;
191 struct dirent *myent;
192 
193 static GLfloat spin = 0.0;
194 
195 static GLfloat verTex2 []= 		{
196 		0.0,1.0,  0.0, 0.0, 1.0, -1.0,-1.0, 1.0,
197 		0.0,0.0,  0.0, 0.0, 1.0, -1.0, 1.0, 1.0,
198 		1.0,0.0,  0.0, 0.0, 1.0,  1.0, 1.0, 1.0,
199 		1.0,1.0,  0.0, 0.0, 1.0,  1.0,-1.0, 1.0,
200 
201 		0.0,1.0,  0.0, 0.0,-1.0, -1.0,-1.0,-1.0,
202 		0.0,0.0,  0.0, 0.0,-1.0, -1.0, 1.0,-1.0,
203 		1.0,0.0,  0.0, 0.0,-1.0,  1.0, 1.0,-1.0,
204 		1.0,1.0,  0.0, 0.0,-1.0,  1.0,-1.0,-1.0,
205 
206 		0.99,0.0,  1.0, 0.0, 0.0,  1.0, 1.0, 1.0, /* please mail me if you know why 1.0 doesn't work here but 0.99 */
207 		0.99,0.0,  1.0, 0.0, 0.0,  1.0, 1.0,-1.0,
208 		0.99,0.99,  1.0, 0.0, 0.0,  1.0,-1.0,-1.0,
209 		0.99,0.99,  1.0, 0.0, 0.0,  1.0,-1.0, 1.0,
210 
211 		0.0,1.0, -1.0, 0.0, 0.0, -1.0,-1.0,-1.0,
212 		0.0,1.0, -1.0, 0.0, 0.0, -1.0,-1.0, 1.0,
213 		0.0,0.0, -1.0, 0.0, 0.0, -1.0, 1.0, 1.0,
214 		0.0,0.0, -1.0, 0.0, 0.0, -1.0, 1.0,-1.0,
215 
216 		1.0,0.0,  0.0, 1.0, 0.0,  1.0, 1.0,-1.0,
217 		1.0,0.0,  0.0, 1.0, 0.0,  1.0, 1.0, 1.0,
218 		0.0,0.0,  0.0, 1.0, 0.0, -1.0, 1.0, 1.0,
219 		0.0,0.0,  0.0, 1.0, 0.0, -1.0, 1.0,-1.0
220 
221 	};
222 /*      Texture      Normals         Vertex        */
223 
224 unsigned char TDFSB_KC_FLY,  TDFSB_KC_HELP, TDFSB_KC_HOME;
225 unsigned char TDFSB_KC_FS,   TDFSB_KC_DOT,  TDFSB_KC_RELM;
226 unsigned char TDFSB_KC_RL,   TDFSB_KC_CDU,  TDFSB_KC_IMBR;
227 unsigned char TDFSB_KC_INFO, TDFSB_KC_DISP, TDFSB_KC_CRH;
228 unsigned char TDFSB_KC_FPS,  TDFSB_KC_GCR,  TDFSB_KC_SHD;
229 unsigned char TDFSB_KC_NAME, TDFSB_KC_SORT, TDFSB_KC_CLASS;
230 unsigned char TDFSB_KC_UP,   TDFSB_KC_DOWN, TDFSB_KC_LEFT;
231 unsigned char TDFSB_KC_RIGHT,TDFSB_KC_SAVE, TDFSB_KC_FTH;
232 unsigned char TDFSB_KC_FORWARD,TDFSB_KC_BACKWARD;
233 
234 unsigned char *TDFSB_KEYLIST[] =
235         {       &TDFSB_KC_FLY, &TDFSB_KC_HELP, &TDFSB_KC_HOME,
236                 &TDFSB_KC_FS,  &TDFSB_KC_DOT,  &TDFSB_KC_RELM,
237                 &TDFSB_KC_RL,  &TDFSB_KC_CDU,  &TDFSB_KC_IMBR,
238                 &TDFSB_KC_INFO,&TDFSB_KC_DISP, &TDFSB_KC_CRH,
239                 &TDFSB_KC_FPS, &TDFSB_KC_GCR,  &TDFSB_KC_SHD,
240                 &TDFSB_KC_NAME,&TDFSB_KC_SORT, &TDFSB_KC_CLASS,
241                 &TDFSB_KC_FORWARD,&TDFSB_KC_BACKWARD,
242                 &TDFSB_KC_UP,  &TDFSB_KC_DOWN, &TDFSB_KC_LEFT,
243                 &TDFSB_KC_RIGHT,&TDFSB_KC_SAVE,&TDFSB_KC_FTH
244         };
245 
246 unsigned char *TDFSB_KEYLIST_NAMES[] =
247         {       "KeyFlying",    "KeyHelp",     "KeyJumpHome",
248                 "KeyFullScreen","KeyDotFilter","KeyMouseRelease",
249                 "KeyReload",    "KeyCDup",     "KeyImageBricks",
250                 "KeyGLInfo",    "KeyDisplay",  "KeyCrossHair",
251                 "KeyFPS",       "KeyGrndCross","KeyShadeMode",
252                 "KeyFileNames", "KeyAlphaSort","KeyClassicNav",
253                 "KeyForward",   "KeyBackward",
254                 "KeyUp",        "KeyDown",     "KeyLeft",
255                 "KeyRight",     "KeySaveConfig","KeyFPSThrottle"
256         };
257 
258 int TDFSB_KEYLIST_NUM=26;
259 
260 char *comment[]={       "detail level of the spheres, must be at least 4",
261                         "directory to start, absolute path",
262                         "maximum texture size, must be 2^n, 0 for maximum",
263                         "width of the window in pixel",
264                         "height of the window in pixel",
265                         "width fullscreen","height fullscreen","depth fullscreen, 0 for same as desktop",
266                         "R","G components of the grids color, range 0.0 ... 1.0","B",
267                         "images have a volume (toggle later)",
268                         "show hidden files (toggle later)",
269                         "sort the files alphabetically (toggle later)",
270                         "R","G components of the background color, range 0.0 ... 1.0","B",
271                         "start in fullscreen mode (toggle later)","key dummy",
272                         "show the crosshair (toggle later)",
273                         "show the cross on the ground (toggle later)",
274                         "mouse buttons for forward and backward (toggle later)",
275                         "fly in the viewing direction (toggle later)",
276                         "throttle fps to leave cpu time for other apps (toggle later), 0 for maximum speed",
277                         "velocity of movement (F1/F2), range 1 ... 20",
278                         "velocity of rotation (F3/F4), range 0.1 ... 2.0",
279                         "R","G components of the filename color, range 0.0 ... 1.0","B",
280                         "units to lift up per mousewheel step",
281 			"custom execute string"
282 
283                 };
284 
285 char *param[] = {       "BallDetail",   "StartDir",     "MaxTexSize",   "WindowWidth",  "WindowHeight", "FullscreenWidth",    "FullscreenHeight", "FullscreenDepth",    "GridRed",      "GridGreen",
286                         "GridBlue",     "ImageBricks",  "ShowDotFiles", "AlphaSort",    "BGRed",        "BGGreen",      "BGBlue",       "FullScreen",   "Key",
287                         "ShowCrossHair","ShowGroundCross",              "ClassicNavigation",            "FlyingMode",   "MaxFPS",
288                         "MoveVelocity", "LookVelocity", "NameRed",      "NameGreen",    "NameBlue", "LiftSteps", "CustomExecuteString"
289                 };
290 
291 void *value[]=  {       &TDFSB_BALL_DETAIL,     &TDFSB_CURRENTPATH,      &TDFSB_MAX_TEX_SIZE,    &SWX,   &SWY,   &PWX,   &PWY, &PWD,   &TDFSB_GG_R,    &TDFSB_GG_G,    &TDFSB_GG_B,
292                         &TDFSB_ICUBE,           &TDFSB_SHOW_DOTFILES,                   &TDFSB_DIR_ALPHASORT,   &TDFSB_BG_R,            &TDFSB_BG_G,    &TDFSB_BG_B,
293                         &TDFSB_CONFIG_FULLSCREEN,               NULL,                   &TDFSB_SHOW_CROSSHAIR,  &TDFSB_GROUND_CROSS,    &TDFSB_CLASSIC_NAV,
294                         &TDFSB_MODE_FLY,        &TDFSB_FPS_CONFIG,      &mousespeed,    &headspeed,   &TDFSB_FN_R,            &TDFSB_FN_G,    &TDFSB_FN_B, &TDFSB_MW_STEPS, &TDFSB_CUSTOM_EXECUTE_STRING
295                 };
296 
297 char *pdef[] = { "20","/","256","400","300","640","480","0","0.2","0.2","0.6","yes","no","yes","0.0","0.0","0.0","no","X","yes","no","no","no","25","2.0","1.0","1.0","1.0","1.0","1","cd \"%s\"; xterm&" };
298 int  type[]=   { 1,2,1,1,1,1,1,1,3,3,3,4,4,4,3,3,3,4,5,4,4,4,4,1,3,3,3,3,3,1,2 }; /* 1=int 2=string 3=float 4=boolean 5=keyboard */
299 
300 int  paracnt = 31;
301 
302 void display(void);
303 void warpdisplay(void);
304 int keyboard   (unsigned char key);
305 int keyboardup (unsigned char key);
306 int keyfinder  (unsigned char key);
307 int keyupfinder(unsigned char key);
308 int speckey    (int key);
309 int specupkey  (int key);
310 void stillDisplay (void);
311 
ende(int code)312 void ende(int code)
313 {
314     glDeleteTextures(TDFSB_TEX_NUM,TDFSB_TEX_NAMES);
315     if (TDFSB_TEX_NAMES!=NULL) free(TDFSB_TEX_NAMES);
316     if(TDFSB_MPEG_FILE) { SMPEG_stop(TDFSB_MPEG_HANDLE); SMPEG_delete(TDFSB_MPEG_HANDLE); SDL_FreeSurface(TDFSB_MPEG_SURFACE); }
317     if(TDFSB_MP3_FILE) { SMPEG_stop(TDFSB_MP3_HANDLE); SMPEG_delete(TDFSB_MP3_HANDLE); }
318     TDFSB_MP3_FILE=NULL;
319     TDFSB_MPEG_FILE=NULL;
320     if (DRN!=0)
321     {
322         help=root;
323         while(help)
324         {
325             FMptr=help;
326             FCptr=help->name; free(FCptr);
327             if (help->uniptr!=NULL) { FCptr=help->uniptr; free(FCptr); }
328             if (help->linkpath!=NULL)   { FCptr=help->linkpath;   free(FCptr); }
329             help=help->next;
330             free(FMptr);
331         }
332         root=NULL;DRN=0;
333     }
334     SDL_Quit();
335     exit(code);
336 }
337 
play_mpeg()338 void play_mpeg()
339 {
340     SMPEG_getinfo(TDFSB_MPEG_HANDLE,&TDFSB_MPEG_INFO);
341     if(TDFSB_MPEG_FRAMENO!=TDFSB_MPEG_INFO.current_frame)
342     {   TDFSB_MPEG_FRAMENO=TDFSB_MPEG_INFO.current_frame;
343         SDL_LockSurface(TDFSB_MPEG_SURFACE);
344         glBindTexture(GL_TEXTURE_2D,TDFSB_MPEG_FILE->uniint3);
345         glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA,256,256,0,GL_RGBA,GL_UNSIGNED_BYTE,TDFSB_MPEG_SURFACE->pixels);
346         SDL_UnlockSurface(TDFSB_MPEG_SURFACE);
347     }
348 }
349 
read_mpegframe(char * filename)350 unsigned char * read_mpegframe (char * filename)
351 {
352     SDL_Surface *screen;
353     SMPEG *mpeg;
354     SMPEG_Info info;
355     unsigned long int memsize;
356 
357     mpeg = SMPEG_new(filename, &info, 0);
358     if ( SMPEG_error(mpeg) )
359     {   printf("Error opening mpeg file (frame open).\n");
360         SMPEG_delete(mpeg);
361         return NULL;
362     }
363     SMPEG_enableaudio(mpeg,0);
364     SMPEG_enablevideo(mpeg,1);
365 
366     if(!(info.has_video))
367     {   printf("Error opening mpeg file (frame info).\n");
368         SMPEG_delete(mpeg);
369         return NULL;
370     }
371     www=info.width; hhh=info.height;
372     for (cc=1; (cc<www||cc<hhh) && cc<TDFSB_MAX_TEX_SIZE; cc*=2); p2h=p2w=cc;
373 
374     screen = SDL_CreateRGBSurface( SDL_SWSURFACE, www, hhh, 32,
375 #if SDL_BYTEORDER == SDL_LIL_ENDIAN
376                 0x000000FF,0x0000FF00,0x00FF0000,0xFF000000
377 #else
378                 0xFF000000,0x00FF0000,0x0000FF00,0x000000FF
379 #endif
380     );
381 
382     SMPEG_setdisplay(mpeg, screen, NULL, NULL);
383     SMPEG_setdisplayregion(mpeg,0,0,www,hhh);
384     SMPEG_renderFrame(mpeg, 1);
385 
386     memsize=(unsigned long int)ceil((double)(p2w*p2h*4));
387 
388     if (!(ssi=(unsigned char *)malloc((size_t)memsize)))
389     {
390         SDL_FreeSurface(screen);
391         printf("Cannot read frame %s ! (low mem buffer) \n",filename);
392         www=0;hhh=0;ssi=NULL;
393         p2w=0;p2h=0;
394         return NULL;
395     }
396 
397     SDL_LockSurface(screen);
398 
399     if(gluScaleImage(GL_RGBA,www,hhh,GL_UNSIGNED_BYTE,screen->pixels,p2w,p2h,GL_UNSIGNED_BYTE,ssi))
400     {
401         SDL_UnlockSurface(screen);
402         SDL_FreeSurface(screen);
403         free(ssi);
404         printf("Cannot read frame %s ! (scaling) \n",filename);
405         www=0;hhh=0;ssi=NULL;
406         p2w=0;p2h=0;
407         return NULL;
408     }
409 
410     SDL_UnlockSurface(screen);
411     SDL_FreeSurface(screen);
412 
413     SMPEG_delete(mpeg);
414 
415     cglmode=GL_RGBA;
416     return ssi;
417 
418 }
419 
read_imagefile(char * filename)420 unsigned char * read_imagefile (char * filename)
421 {
422     SDL_Surface *loader,*converter;
423     unsigned long int memsize;
424 
425     loader=IMG_Load(filename);
426     if(!loader)
427     {
428         printf("Cannot read image %s ! (file loading)\n",filename);
429         www=0;hhh=0;ssi=NULL;
430         p2w=0;p2h=0;
431         return NULL;
432     }
433     www=loader->w; hhh=loader->h;
434     if ((www<=0)||(hhh<=0))
435     {
436         SDL_FreeSurface(loader);
437         printf("Cannot read image %s ! (identification error)\n",filename);
438         www=0;hhh=0;ssi=NULL;
439         p2w=0;p2h=0;
440         return NULL;
441     }
442 
443     for (cc=1; (cc<www||cc<hhh) && cc<TDFSB_MAX_TEX_SIZE; cc*=2); p2h=p2w=cc;
444 
445     converter = SDL_CreateRGBSurface( SDL_SWSURFACE, www, hhh, 32,
446 #if SDL_BYTEORDER == SDL_LIL_ENDIAN
447                 0x000000FF,0x0000FF00,0x00FF0000,0xFF000000
448 #else
449                 0xFF000000,0x00FF0000,0x0000FF00,0x000000FF
450 #endif
451     );
452 
453     if(!converter)
454     {
455         SDL_FreeSurface(loader);
456         printf("Cannot read image %s ! (converting)\n",filename);
457         www=0;hhh=0;ssi=NULL;
458         p2w=0;p2h=0;
459         return NULL;
460     }
461     SDL_BlitSurface(loader, NULL, converter, NULL);
462     SDL_FreeSurface(loader);
463 
464     memsize=(unsigned long int)ceil((double)(p2w*p2h*4));
465 
466     printf("\n - SDL image loading mem %lu %lu\n",memsize,p2w);
467 
468     if (!(ssi=(unsigned char *)malloc((size_t)memsize)))
469     {
470         SDL_FreeSurface(converter);
471         printf("Cannot read image %s ! (low mem buffer) \n",filename);
472         www=0;hhh=0;ssi=NULL;
473         p2w=0;p2h=0;
474         return NULL;
475     }
476 
477     SDL_LockSurface(converter);
478 
479     if(gluScaleImage(GL_RGBA,www,hhh,GL_UNSIGNED_BYTE,converter->pixels,p2w,p2h,GL_UNSIGNED_BYTE,ssi))
480     {
481         SDL_UnlockSurface(converter);
482         SDL_FreeSurface(converter);
483         free(ssi);
484         printf("Cannot read image %s ! (scaling) \n",filename);
485         www=0;hhh=0;ssi=NULL;
486         p2w=0;p2h=0;
487         return NULL;
488     }
489 
490     SDL_UnlockSurface(converter);
491     SDL_FreeSurface(converter);
492 
493     cglmode=GL_RGBA;
494     return ssi;
495 }
496 
tdb_gen_list(void)497 void tdb_gen_list(void)
498 {
499     int mat_state;
500 
501     mat_state=0;
502 
503     glNewList(TDFSB_SolidList,GL_COMPILE);
504     for(help=root;help;help=help->next)
505     {
506         glPushMatrix();
507 	mx=help->posx; mz=help->posz; my=help->posy;
508         if ( ((help->mode)&0x1F) == 1 || ((help->mode)&0x1F) == 11)
509         {
510 	    glTranslatef( mx, my, mz );
511             if ((help->mode)&0x20) glutSolidSphere(0.5,TDFSB_BALL_DETAIL,TDFSB_BALL_DETAIL);
512             else glutSolidSphere(1,TDFSB_BALL_DETAIL,TDFSB_BALL_DETAIL);
513         }
514         else if ( ((help->mode)&0x1F) == 0 || ((help->mode)&0x1F) == 10)
515         {
516             if ( ((help->regtype==1)||(help->regtype==3)) && ((help->mode)&0x1F)==0)
517             {
518                 if ((help->mode)&0x20)
519                 {
520 	            glTranslatef( mx, 0, mz );
521                     if (help->scalex > help->scaley)
522                     {
523                         if (help->scalex > help->scalez)
524                             glScalef(0.5,0.5*(help->scaley)/(help->scalex),0.5*(help->scalez)/(help->scalex)); /* x am groessten */
525                         else
526                             glScalef(0.5*(help->scalex)/(help->scalez),0.5*(help->scaley)/(help->scalez),0.5);  /* z am groessten */
527                     }
528                     else if (help->scaley > help->scalez)
529                         glScalef(0.5*(help->scalex)/(help->scaley),0.5,0.5*(help->scalez)/(help->scaley));  /* y am groessten */
530                     else
531                         glScalef(0.5*(help->scalex)/(help->scalez),0.5*(help->scaley)/(help->scalez),0.5);  /* z am groessten */
532                 }
533                 else
534                 {
535 	            glTranslatef( mx, my, mz );
536                     glScalef(help->scalex,help->scaley,help->scalez);
537                 }
538 
539                 glEnable(GL_TEXTURE_2D); glBindTexture(GL_TEXTURE_2D,help->uniint3);
540                 if (TDFSB_ICUBE) cc1=20; else cc1=4;
541                 glBegin(GL_QUADS);
542                 for(cc=0;cc<cc1;cc++)
543                 {
544                     glNormal3f(verTex2[cc*8+2],verTex2[cc*8+3],verTex2[cc*8+4]);
545                     glTexCoord2f(verTex2[cc*8+0],verTex2[cc*8+1]);
546                     glVertex3f(verTex2[cc*8+5],verTex2[cc*8+6],verTex2[cc*8+7]);
547                 }
548                 glEnd();
549                 glDisable(GL_TEXTURE_2D);
550             }
551             else if (help->regtype==0||help->regtype==5)
552             {
553                 if ((help->mode)&0x20)
554                 {
555 	            glTranslatef( mx, 0, mz );
556                     if (help->scalex > help->scaley)
557                     {
558                         if (help->scalex > help->scalez)
559                             glScalef(0.5,0.5*(help->scaley)/(help->scalex),0.5*(help->scalez)/(help->scalex)); /* x am groessten */
560                         else
561                             glScalef(0.5*(help->scalex)/(help->scalez),0.5*(help->scaley)/(help->scalez),0.5);  /* z am groessten */
562                     }
563                     else if (help->scaley > help->scalez)
564                         glScalef(0.5*(help->scalex)/(help->scaley),0.5,0.5*(help->scalez)/(help->scaley));  /* y am groessten */
565                     else
566                         glScalef(0.5*(help->scalex)/(help->scalez),0.5*(help->scaley)/(help->scalez),0.5);  /* z am groessten */
567                 }
568                 else
569                 {
570                     glTranslatef( mx, my, mz );
571                     glScalef(help->scalex, help->scaley, help->scalez);
572                 }
573 
574                 glutSolidCube(2);
575             }
576         }
577         else
578         {
579             if ((help->mode)!=0x25)
580             {
581             	glTranslatef( mx, my, mz );
582                 if (((help->mode)&0x20)) glScalef(0.5,0.5,0.5);
583                 glutSolidOctahedron();
584             }
585         }
586         glPopMatrix();
587     }
588 /* drawing the ground grid */
589     glPushMatrix();
590     glDisable (GL_LIGHTING);
591     glColor4f(TDFSB_GG_R,TDFSB_GG_G,TDFSB_GG_B,1.0);
592     for (c1=0;c1<=20;c1++)
593     {
594         glBegin(GL_LINES);
595         glVertex3f (    TDFSB_MINX+TDFSB_STEPX*c1,      -1,     TDFSB_MINZ);
596         glVertex3f (    TDFSB_MINX+TDFSB_STEPX*c1,      -1,     TDFSB_MAXZ);
597         glVertex3f (    TDFSB_MINX,                     -1,     TDFSB_MINZ+TDFSB_STEPZ*c1);
598         glVertex3f (    TDFSB_MAXX,                     -1,     TDFSB_MINZ+TDFSB_STEPZ*c1);
599         glEnd();
600     }
601 
602     glEnable (GL_LIGHTING);
603     glPopMatrix();
604     glEndList();
605 
606     glNewList(TDFSB_BlendList,GL_COMPILE);
607     glEnable (GL_LIGHTING);
608     glEnable(GL_BLEND); glDepthMask(GL_FALSE); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
609     mat_state=0;
610     for(help=root;help;help=help->next)
611     {
612         mx=help->posx; mz=help->posz; my=help->posy;
613         if (( (help->regtype==2) && ((help->mode)&0x1F)==0))
614         {
615             if(!mat_state)
616             {
617                 glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse_yel);glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient_yel);glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular_yel);glMaterialfv(GL_FRONT, GL_EMISSION, mat_emission_yel);
618                 glMaterialfv(GL_BACK, GL_DIFFUSE, mat_diffuse_yel);glMaterialfv(GL_BACK, GL_AMBIENT, mat_ambient_yel);glMaterialfv(GL_BACK, GL_SPECULAR, mat_specular_yel);glMaterialfv(GL_BACK, GL_EMISSION, mat_emission_yel);
619                 mat_state=1;
620             }
621             glPushMatrix();
622                 if ( ((help->mode)&0x20)) { glTranslatef(mx,0,mz); glScalef(0.25,0.55,0.25); glRotatef(90,1,0,0); }
623                 else { glTranslatef(mx,3.5,mz); glScalef(help->scalex, 4.5, help->scalez); glRotatef(90,1,0,0); }
624                 glCallList(TDFSB_CylinderList);
625             glPopMatrix();
626         }
627     }
628     mat_state=0;
629     for(help=root;help;help=help->next)
630     {
631         mx=help->posx; mz=help->posz; my=help->posy;
632 
633         if (( (((help->regtype)==6)||((help->regtype)==4)) && ((help->mode)&0x1F)==0))
634         {
635             if(!mat_state)
636             {
637                 glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse_grn);glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient_grn);glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular_grn);glMaterialfv(GL_FRONT, GL_EMISSION, mat_emission_grn);
638                 glMaterialfv(GL_BACK, GL_DIFFUSE, mat_diffuse_grn);glMaterialfv(GL_BACK, GL_AMBIENT, mat_ambient_grn);glMaterialfv(GL_BACK, GL_SPECULAR, mat_specular_grn);glMaterialfv(GL_BACK, GL_EMISSION, mat_emission_grn);
639                 mat_state=2;
640             }
641             glPushMatrix();
642                 if ( ((help->mode)&0x20)) { glTranslatef(mx,0,mz); glScalef(0.5,0.5,0.5); glRotatef(90,1,0,0); }
643                 else { glTranslatef(mx,my,mz); glScalef(help->scalex, help->scaley, help->scalez); glRotatef(90,1,0,0); }
644                 glCallList(TDFSB_AudioList);
645             glPopMatrix();
646         }
647     }
648     mat_state=0;
649     for(help=root;help;help=help->next)
650     {
651         mx=help->posx; mz=help->posz; my=help->posy;
652 
653         if ( ((help->mode)&0x1F) >= 10)
654         {
655             if(!mat_state)
656             {
657                 glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse_red);glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient_red);glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular_red);glMaterialfv(GL_FRONT, GL_EMISSION, mat_emission_red);
658                 glMaterialfv(GL_BACK, GL_DIFFUSE, mat_diffuse_red);glMaterialfv(GL_BACK, GL_AMBIENT, mat_ambient_red);glMaterialfv(GL_BACK, GL_SPECULAR, mat_specular_red);glMaterialfv(GL_BACK, GL_EMISSION, mat_emission_red);
659                 mat_state=3;
660             }
661             glPushMatrix();
662                 if (((help->mode)&0x20)) { glTranslatef(help->posx, 0.2, help->posz); glScalef(1.2, 1.2, 1.2); }
663                 else { glTranslatef(help->posx, help->posy+.25, help->posz); glScalef((help->scalex)+.25,(help->scaley)+.25,(help->scalez)+.25); }
664                 glutSolidCube(2);
665             glPopMatrix();
666         }
667     }
668     mat_state=0;
669     for(help=root;help;help=help->next)
670     {
671         mx=help->posx; mz=help->posz; my=help->posy;
672 
673         if ( ((help->mode)&0x20))
674         {
675             if(!mat_state)
676             {
677                 glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse_gry);glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient_gry);glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular_gry);glMaterialfv(GL_FRONT, GL_EMISSION, mat_emission_gry);
678                 glMaterialfv(GL_BACK, GL_DIFFUSE, mat_diffuse_gry);glMaterialfv(GL_BACK, GL_AMBIENT, mat_ambient_gry);glMaterialfv(GL_BACK, GL_SPECULAR, mat_specular_gry);glMaterialfv(GL_BACK, GL_EMISSION, mat_emission_gry);
679                 mat_state=4;
680             }
681             glPushMatrix(); glTranslatef(mx, 0, mz); if ((help->mode)==0x25) glutSolidSphere(0.5,TDFSB_BALL_DETAIL,TDFSB_BALL_DETAIL); glutSolidSphere(1,TDFSB_BALL_DETAIL,TDFSB_BALL_DETAIL); glPopMatrix();
682         }
683     }
684     glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient);glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);glMaterialfv(GL_FRONT, GL_EMISSION, mat_emission);
685     glMaterialfv(GL_BACK, GL_DIFFUSE, mat_diffuse);glMaterialfv(GL_BACK, GL_AMBIENT, mat_ambient);glMaterialfv(GL_BACK, GL_SPECULAR, mat_specular);glMaterialfv(GL_BACK, GL_EMISSION, mat_emission);
686     glDepthMask(GL_TRUE);glDisable(GL_BLEND);
687     glDisable(GL_LIGHTING);
688     glEndList();
689 }
690 
691 
set_filetypes(void)692 void set_filetypes(void)
693 {
694 	xsuff[ 0]="ERROR";              tsuff[ 0]=0;
695 	xsuff[ 1]=".jpeg";              tsuff[ 1]=1;
696 	xsuff[ 2]=".JPEG";              tsuff[ 2]=1;
697 	xsuff[ 3]=".jpg";               tsuff[ 3]=1;
698 	xsuff[ 4]=".JPG";               tsuff[ 4]=1;
699 	xsuff[ 5]=".jpe";               tsuff[ 5]=1;
700 	xsuff[ 6]=".JPE";               tsuff[ 6]=1;
701 	xsuff[ 7]=".gif";               tsuff[ 7]=1;
702 	xsuff[ 8]=".GIF";               tsuff[ 8]=1;
703 	xsuff[ 9]=".tif";               tsuff[ 9]=1;
704 	xsuff[10]=".TIF";               tsuff[10]=1;
705 	xsuff[11]=".tiff";              tsuff[11]=1;
706 	xsuff[12]=".TIFF";              tsuff[12]=1;
707 	xsuff[13]=".png";               tsuff[13]=1;
708 	xsuff[14]=".PNG";               tsuff[14]=1;
709 	xsuff[15]=".pnm";               tsuff[15]=1;
710 	xsuff[16]=".PNM";               tsuff[16]=1;
711 	xsuff[17]=".xpm";               tsuff[17]=1;
712 	xsuff[18]=".XPM";               tsuff[18]=1;
713 	xsuff[19]=".lbm";               tsuff[19]=1;
714 	xsuff[20]=".LBM";               tsuff[20]=1;
715 	xsuff[21]=".bmp";               tsuff[21]=1;
716 	xsuff[22]=".BMP";               tsuff[22]=1;
717 	xsuff[23]=".txt";               tsuff[23]=2;
718 	xsuff[24]=".TXT";               tsuff[24]=2;
719 	xsuff[25]=".c";                 tsuff[25]=2;
720 	xsuff[26]=".C";                 tsuff[26]=2;
721 	xsuff[27]=".h";                 tsuff[27]=2;
722 	xsuff[28]=".htm";               tsuff[28]=2;
723 	xsuff[29]=".html";		tsuff[29]=2;
724 	xsuff[30]=".HTM";               tsuff[30]=2;
725 	xsuff[31]=".HTML";              tsuff[31]=2;
726 	xsuff[32]=".pl";                tsuff[32]=2;
727 	xsuff[33]="README";             tsuff[33]=2;
728 	xsuff[34]="LICENSE";            tsuff[34]=2;
729 	xsuff[35]="LICENSE-GPL";        tsuff[35]=2;
730 	xsuff[36]="LICENSE-LGPL";       tsuff[36]=2;
731 	xsuff[37]=".src";               tsuff[37]=2;
732 	xsuff[38]=".SRC";               tsuff[38]=2;
733 	xsuff[39]=".asc";               tsuff[39]=2;
734 	xsuff[40]=".ascii";             tsuff[40]=2;
735 	xsuff[41]=".ASCII";             tsuff[41]=2;
736 	xsuff[42]=".ASC";               tsuff[42]=2;
737 	xsuff[43]=".sgml";              tsuff[43]=2;
738 	xsuff[44]=".SGML";              tsuff[44]=2;
739 	xsuff[45]=".java";              tsuff[45]=2;
740 	xsuff[46]=".JAVA";              tsuff[46]=2;
741         xsuff[47]=".tdfsb";             tsuff[47]=2;
742         xsuff[48]="COPYING";            tsuff[48]=2;
743         xsuff[49]=".xawtv";             tsuff[49]=2;
744         xsuff[50]=".bash_history";      tsuff[50]=2;
745         xsuff[51]=".pcx";               tsuff[51]=1;
746         xsuff[52]=".PCX";               tsuff[52]=1;
747         xsuff[53]=".tga";               tsuff[53]=1;
748         xsuff[54]=".TGA";               tsuff[54]=1;
749         xsuff[55]=".mpg";               tsuff[55]=3;
750         xsuff[56]=".MPG";               tsuff[56]=3;
751         xsuff[57]=".mpe";               tsuff[57]=3;
752         xsuff[58]=".MPE";               tsuff[58]=3;
753         xsuff[59]=".mpeg";              tsuff[59]=3;
754         xsuff[60]=".MPEG";              tsuff[60]=3;
755         xsuff[61]=".avi";               tsuff[61]=5;
756         xsuff[62]=".AVI";               tsuff[62]=5;
757         xsuff[63]=".wav";               tsuff[63]=4;
758         xsuff[64]=".WAV";               tsuff[64]=4;
759         xsuff[65]=".mp3";               tsuff[65]=6;
760         xsuff[66]=".MP3";               tsuff[66]=6;
761 
762 	nsuff[0]="UNKNOWN";
763 	nsuff[1]="PICTURE";
764 	nsuff[2]="TEXT";
765 	nsuff[3]="VIDEO-MPEG1";
766     	nsuff[4]="AUDIO-WAV";
767         nsuff[5]="VIDEO-AVI";
768         nsuff[6]="AUDIO-MP3";
769 }
770 
setup_kc(void)771 void setup_kc(void)
772 {
773         TDFSB_KC_FLY=     ' ';
774         TDFSB_KC_HELP=    'h';
775         TDFSB_KC_HOME=    '0';
776         TDFSB_KC_FS=      'f';
777         TDFSB_KC_DOT=     '.';
778         TDFSB_KC_RELM=    'r';
779         TDFSB_KC_RL=      'l';
780         TDFSB_KC_CDU=     'u';
781         TDFSB_KC_IMBR=    'b';
782         TDFSB_KC_INFO=    'i';
783         TDFSB_KC_DISP=    'd';
784         TDFSB_KC_CRH=     'c';
785         TDFSB_KC_FPS=     'p';
786         TDFSB_KC_GCR=     'g';
787         TDFSB_KC_SHD=     'm';
788         TDFSB_KC_NAME=    't';
789         TDFSB_KC_SORT=    'a';
790         TDFSB_KC_CLASS=   'o';
791         TDFSB_KC_UP=      '1';
792         TDFSB_KC_DOWN=    '3';
793         TDFSB_KC_LEFT=    'q';
794         TDFSB_KC_RIGHT=   'e';
795         TDFSB_KC_SAVE=    's';
796         TDFSB_KC_FTH=     '#';
797         TDFSB_KC_FORWARD= '2';
798         TDFSB_KC_BACKWARD='w';
799 }
800 
setup_help(void)801 void setup_help(void)
802 {
803         help_str  = (char*) malloc (1024*sizeof(char));
804         help_copy = (char*) malloc (1024*sizeof(char));
805         tmpstr = (char*) malloc (64*sizeof(char));
806 
807 		if ( !(help_str && help_copy && tmpstr) )
808 		{
809 			printf("Malloc Failure setup_help \n"); exit(1);
810 		}
811 
812         strcpy (help_str,"Esc           quit   F1/F2    speed +/-\n");
813         strcat (help_str,"Mouse move    look   F3/F4      rot +/-\n");
814         strcat (help_str,"UP         forward   F5/F6  ball detail\n");
815         strcat (help_str,"DOWN      backward   HOME     start pos\n");
816         strcat (help_str,"L/R     step aside   LMB  select object\n");
817         strcat (help_str,"END    ground zero   +RMB|CTRL appr.obj\n");
818         strcat (help_str,"F7/F8  max fps +/-   +ENTER ply mpg/mp3\n");
819 
820         sprintf(tmpstr,   "\"%c\"      filenames   \"%c\"   ground cross\n",TDFSB_KC_NAME,TDFSB_KC_GCR);
821         strcat (help_str,tmpstr);
822 
823         sprintf(tmpstr,   "\"%c\"      crosshair   \"%c\"        display\n",TDFSB_KC_CRH,TDFSB_KC_DISP);
824         strcat (help_str,tmpstr);
825 
826         sprintf(tmpstr,   "\"%c\"      dot files   \"%c\"      print FPS\n",TDFSB_KC_DOT,TDFSB_KC_FPS);
827         strcat (help_str,tmpstr);
828 
829         sprintf(tmpstr,   "\"%c\" rel./get mouse   \"%c\"     fullscreen\n",TDFSB_KC_RELM,TDFSB_KC_FS);
830         strcat (help_str,tmpstr);
831 
832         sprintf(tmpstr,   "\"%c\"     reload dir   \"%c\"   image bricks\n",TDFSB_KC_RL,TDFSB_KC_IMBR);
833         strcat (help_str,tmpstr);
834 
835         sprintf(tmpstr,   "\"%c\"           cd..   \"%c\"      alphasort\n",TDFSB_KC_CDU,TDFSB_KC_SORT);
836         strcat (help_str,tmpstr);
837 
838         sprintf(tmpstr,   "\"%c\"        shading   \"%c\"         flying\n",TDFSB_KC_SHD,TDFSB_KC_FLY);
839         strcat (help_str,tmpstr);
840 
841         sprintf(tmpstr,   "\"%c\"      show help   \"%c\"  print GL info\n",TDFSB_KC_HELP,TDFSB_KC_INFO);
842         strcat (help_str,tmpstr);
843 
844         sprintf(tmpstr,   "\"%c\"      jump home   \"%c\"    classic nav\n",TDFSB_KC_HOME,TDFSB_KC_CLASS);
845         strcat (help_str,tmpstr);
846 
847         sprintf(tmpstr,   "\"%c\"    save config   \"%c\"   fps throttle\n",TDFSB_KC_SAVE,TDFSB_KC_FTH);
848         strcat (help_str,tmpstr);
849 
850         sprintf(tmpstr," \n\"%c|%c|%c|%c\"            Up|Down|Left|Right\n",TDFSB_KC_UP,TDFSB_KC_DOWN,TDFSB_KC_LEFT,TDFSB_KC_RIGHT);
851         strcat (help_str,tmpstr);
852 
853         sprintf(tmpstr,"\"%c|%c\"                  Forward|Backward\n",TDFSB_KC_FORWARD,TDFSB_KC_BACKWARD);
854         strcat (help_str,tmpstr);
855 
856         strcat (help_str,"PgUp/Down or MMB+Mouse move up/downward\n");
857 
858 }
859 
860 
861 
setup_config(void)862 int setup_config(void)
863 {
864         FILE *config;
865         char conf_line[2048], conf_param[256], conf_value[1024], homefile[256];
866         int x,y,zzz;
867 
868         strcpy(home,getenv("HOME"));
869         strcpy(homefile,home);
870         if (homefile[strlen(homefile)-1]=='/')  strcat(homefile,".tdfsb");
871         else                                    strcat(homefile,"/.tdfsb");
872 
873         if ((config=fopen(homefile,"r")))
874         {
875                 printf("Reading %s ...\n",homefile);
876 
877                 while (fgets(conf_line,256,config))
878                 {
879                         if (strlen(conf_line)<4) { continue; }
880                         x=0; while(conf_line[x]==' '||conf_line[x]=='\t')x++;  if(conf_line[x]=='#'||conf_line[x]=='\n') { continue; }
881 
882                         x=0;
883                         while(conf_line[x]==' '||conf_line[x]=='\t') x++;
884                                 y=0;
885                         while(conf_line[x]!=' '&&conf_line[x]!='='&&conf_line[x]!='\t'&&conf_line[x]!='\n') { conf_param[y++]=conf_line[x++]; }
886                                 conf_param[y]='\0';
887                         while(conf_line[x]==' '||conf_line[x]=='='||conf_line[x]=='\t') x++;
888                                 y=0;
889                         while(conf_line[x]!='#'&&conf_line[x]!='\n') { conf_value[y++]=conf_line[x++]; }
890 /*                        while(conf_line[x]!=' '&&conf_line[x]!='\t'&&conf_line[x]!='\n') { conf_value[y++]=conf_line[x++]; }
891 */
892                                 conf_value[y]='\0';
893                                 zzz=x;
894 
895                         if (strlen(conf_param)<1||strlen(conf_value)<1) continue;
896 
897                         for(x=0; x<paracnt; x++)
898                         if(!strncmp(param[x],conf_param,strlen(param[x])))
899                         {
900                             if (type[x]==1)
901                                     { *(int *)value[x]=atoi(conf_value); printf(" * Read \"%d\" for %s\n",  *(int *)value[x], param[x]); }
902                             else if (type[x]==2)
903                             {		while(conf_value[strlen(conf_value)-1]==' '||conf_value[strlen(conf_value)-1]=='\t')
904 					    conf_value[strlen(conf_value)-1]='\0';
905 					strcpy((char *)value[x],conf_value);
906 					printf(" * Read \"%s\" for %s\n",(char *)value[x], param[x]);
907 			    }
908                             else if (type[x]==3)
909                             {       *(GLfloat *)value[x]=(GLfloat)atof(conf_value);
910                                     printf(" * Read \"%f\" for %s\n",  *(GLfloat *)value[x], param[x]);
911                             }
912                             else if (type[x]==4)
913                             {       if ((strstr(conf_value,"yes"))||(strstr(conf_value,"on"))||(strstr(conf_value,"1"))||(strstr(conf_value,"true")))
914                                             *(GLint *)value[x]=1;
915                                     else
916                                             *(GLint *)value[x]=0;
917                                     printf(" * Read \"%d\" for %s\n",*(GLint *)value[x], param[x]);
918                             }
919                             else if (type[x]==5)
920                             {
921                                     if (strlen(conf_value)==3)
922                                     {       if(conf_value[0]=='"' && conf_value[2]=='"' && isgraph(conf_value[1]) )
923                                                     for(x=0; x<TDFSB_KEYLIST_NUM; x++)
924                                                             if(!strcmp(TDFSB_KEYLIST_NAMES[x],conf_param))
925                                                                     { *TDFSB_KEYLIST[x]=conf_value[1];
926                                                                        printf(" * Read \"%c\" for %s\n",*TDFSB_KEYLIST[x],TDFSB_KEYLIST_NAMES[x]);
927                                                                     }
928                                     }
929                                     else if ( strlen(conf_value)==1 && strlen(conf_line)>(zzz+1) )
930                                     {       if ( conf_value[0]=='"' && conf_line[zzz]==' ' && conf_line[zzz+1]=='"' )
931                                                     for(x=0; x<TDFSB_KEYLIST_NUM; x++)
932                                                             if(!strcmp(TDFSB_KEYLIST_NAMES[x],conf_param))
933                                                                     { *TDFSB_KEYLIST[x]=' ';
934                                                                        printf(" * Read \"%c\" for %s\n",*TDFSB_KEYLIST[x],TDFSB_KEYLIST_NAMES[x]);
935                                                                     }
936                                     }
937                             }
938                         }
939                 }
940 
941                 fclose (config);
942 
943                 printf(" * some values may be truncated later if out of range\n");
944 
945 		if(!strstr(TDFSB_CUSTOM_EXECUTE_STRING,"%s"))
946 		{
947 		    TDFSB_CSE_FLAG=0;
948 		    printf("WARNING: no %%s found in custom execute string. will not insert current path or file.\n");
949 		}
950 		else if(strstr(&(strstr(TDFSB_CUSTOM_EXECUTE_STRING,"%s"))[2],"%s"))
951 		{
952 		    printf("WARNING: more than one %%s found in the custom execute string! falling back to default string.\n");
953 		    sprintf(TDFSB_CUSTOM_EXECUTE_STRING,"cd \"%%s\"; xterm&");
954 		    TDFSB_CSE_FLAG=1;
955 		}
956 		else
957 		{
958 		    TDFSB_CSE_FLAG=1;
959 		}
960 
961                 if (TDFSB_BALL_DETAIL<4) TDFSB_BALL_DETAIL=4;
962                 if (TDFSB_FPS_CONFIG)
963                 {
964                         if(TDFSB_FPS_CONFIG<1)  { TDFSB_FPS_CONFIG=0; TDFSB_US_RUN=0; }
965                         else                    { TDFSB_US_RUN=1000000/TDFSB_FPS_CONFIG; }
966                 }
967 
968                 TDFSB_FPS_REAL=TDFSB_FPS_CACHE=TDFSB_FPS_CONFIG;
969 
970                 mousespeed=(GLfloat) ceilf(mousespeed);
971                 headspeed= (GLfloat)(ceilf(headspeed*10)/10);
972 
973                 if (mousespeed>20) mousespeed=20;
974                 else if (mousespeed<1) mousespeed=1;
975                 if (headspeed>2.0) headspeed=2.0;
976                 else if (headspeed<0.1) headspeed=0.1;
977 
978                 if(TDFSB_BG_R>1.0) { TDFSB_BG_R=1.0; } else if(TDFSB_BG_R<0.0) { TDFSB_BG_R=0.0; }
979                 if(TDFSB_BG_G>1.0) { TDFSB_BG_G=1.0; } else if(TDFSB_BG_G<0.0) { TDFSB_BG_G=0.0; }
980                 if(TDFSB_BG_B>1.0) { TDFSB_BG_B=1.0; } else if(TDFSB_BG_B<0.0) { TDFSB_BG_B=0.0; }
981                 if(TDFSB_GG_R>1.0) { TDFSB_GG_R=1.0; } else if(TDFSB_GG_R<0.0) { TDFSB_GG_R=0.0; }
982                 if(TDFSB_GG_G>1.0) { TDFSB_GG_G=1.0; } else if(TDFSB_GG_G<0.0) { TDFSB_GG_G=0.0; }
983                 if(TDFSB_GG_B>1.0) { TDFSB_GG_B=1.0; } else if(TDFSB_GG_B<0.0) { TDFSB_GG_B=0.0; }
984                 if(TDFSB_FN_R>1.0) { TDFSB_FN_R=1.0; } else if(TDFSB_FN_R<0.0) { TDFSB_FN_R=0.0; }
985                 if(TDFSB_FN_G>1.0) { TDFSB_FN_G=1.0; } else if(TDFSB_FN_G<0.0) { TDFSB_FN_G=0.0; }
986                 if(TDFSB_FN_B>1.0) { TDFSB_FN_B=1.0; } else if(TDFSB_FN_B<0.0) { TDFSB_FN_B=0.0; }
987 
988                 if (TDFSB_MAX_TEX_SIZE) { for (cc=1; cc<=TDFSB_MAX_TEX_SIZE; cc*=2); TDFSB_MAX_TEX_SIZE=cc/2; }
989 
990                 if(realpath(TDFSB_CURRENTPATH,&temp_trunc[0])!=&temp_trunc[0])
991                     if(realpath(home,&temp_trunc[0])!=&temp_trunc[0])
992                         strcpy(&temp_trunc[0],"/");
993                 strcpy(TDFSB_CURRENTPATH,temp_trunc);
994 
995                 for (x=0; x<TDFSB_KEYLIST_NUM-1; x++)
996                 {       for (y=x+1; y<TDFSB_KEYLIST_NUM; y++)
997                                 if (*TDFSB_KEYLIST[x]==*TDFSB_KEYLIST[y])
998                                 {       TDFSB_ALERT_KC=1000;
999                                         printf("MALFORMED KEYBOARD MAP: %s conflicts with %s\n",TDFSB_KEYLIST_NAMES[x],TDFSB_KEYLIST_NAMES[y]);
1000                                 }
1001                 }
1002 
1003                 if (TDFSB_ALERT_KC) setup_kc();
1004 
1005                 return (0);
1006         }
1007         else
1008         {
1009                 printf("couldn't open config file\n");
1010                 printf("creating config file\n");
1011                 if ((config=fopen(homefile,"w")))
1012                 {
1013                         fprintf(config,"# TDFSB Example Config File\n\n");
1014                         for (x=0; x<paracnt; x++)
1015                                 if (type[x]!=5) fprintf(config,"%-18s = %-6s # %s\n",param[x],pdef[x],comment[x]);
1016 
1017                         fprintf(config,"\n# Key bindings\n\n");
1018                         for (x=0; x<TDFSB_KEYLIST_NUM; x++)
1019                                 fprintf(config,"%-18s = \"%c\"\n",TDFSB_KEYLIST_NAMES[x],*TDFSB_KEYLIST[x]);
1020 
1021                         fclose (config);
1022                 }
1023                 else
1024                         printf("couldn't create config file\n");
1025 
1026                 return (1);
1027         }
1028 }
1029 
1030 
save_config(void)1031 void save_config(void)
1032 {
1033         FILE *config;
1034         char homefile[256];
1035         int x;
1036 
1037         strcpy(home,getenv("HOME"));
1038         strcpy(homefile,home);
1039         if (homefile[strlen(homefile)-1]=='/')  strcat(homefile,".tdfsb");
1040         else                                    strcat(homefile,"/.tdfsb");
1041 
1042         if ((config=fopen(homefile,"w")))
1043         {
1044                 fprintf(config,"# TDFSB Saved Config File\n\n");
1045                 for (x=0; x<paracnt; x++)
1046                 {       if (type[x]==1) fprintf(config,"%-18s = %-6d \t# %s\n",param[x],*(int *)value[x],comment[x]);
1047                         else if (type[x]==2) fprintf(config,"%-18s = %s \t# %s\n",param[x],(char *)value[x],comment[x]);
1048                         else if (type[x]==3) fprintf(config,"%-18s = %f \t# %s\n",param[x],*(GLfloat *)value[x],comment[x]);
1049                         else if (type[x]==4) fprintf(config,"%-18s = %s \t# %s\n",param[x],*(int *)value[x]?"yes":"no",comment[x]);
1050                 }
1051 
1052                 fprintf(config,"\n# Key bindings\n\n");
1053                 for (x=0; x<TDFSB_KEYLIST_NUM; x++)
1054                         fprintf(config,"%-18s = \"%c\"\n",TDFSB_KEYLIST_NAMES[x],*TDFSB_KEYLIST[x]);
1055 
1056                 fclose (config);
1057         }
1058         else
1059                 printf("couldn't create config file\n");
1060 
1061 }
1062 
1063 
1064 
viewm(void)1065 void viewm (void)
1066 {
1067         if ((centY=(asin(-tposy))*(((double)SWY)/PI))>SWY/2)    centY= SWY/2;
1068         else if (centY<(-SWY/2))                                centY=-SWY/2;
1069 
1070         if (tposz>0)
1071                 centX= (GLdouble)acos(tposx/((GLdouble)cos((((double)centY)/(double)((double)SWY/PI)))))*(GLdouble)((GLdouble)SWX/mousesense/PI);
1072         else
1073                 centX=-(GLdouble)acos(tposx/((GLdouble)cos((((double)centY)/(double)((double)SWY/PI)))))*(GLdouble)((GLdouble)SWX/mousesense/PI);
1074 }
1075 
check_still(void)1076 void check_still(void)
1077 {
1078         if(!(forwardkeybuf+backwardkeybuf+leftkeybuf+rightkeybuf+upkeybuf+downkeybuf)) TDFSB_FUNC_IDLE=stillDisplay;
1079 }
1080 
stop_move(void)1081 void stop_move(void)
1082 {
1083         forwardkeybuf=backwardkeybuf=leftkeybuf=rightkeybuf=upkeybuf=downkeybuf=0;
1084 }
1085 
fps_timer(int val,int no)1086 Uint32 fps_timer(int val,int no)
1087 {
1088         sprintf(fpsbuf,"FPS: %d",(int)((1000*TDFSB_FPS_DISP)/TDFSB_FPS_DT)-1);
1089         TDFSB_FPS_DISP=0;
1090         return(TDFSB_FPS_DT);
1091 }
1092 
errglu(GLenum errorCode)1093 void errglu(GLenum errorCode)
1094 {
1095 	const GLubyte *estring;
1096 
1097 	estring=gluErrorString(errorCode);
1098 	printf("QE: %s\n", estring);
1099 	ende(1);
1100 }
1101 
init(void)1102 void init(void)
1103 {
1104     TDFSB_DisplayLists= glGenLists(3);
1105     TDFSB_CylinderList=TDFSB_DisplayLists+0;
1106     TDFSB_HelpList=TDFSB_DisplayLists+1;
1107     TDFSB_AudioList=TDFSB_DisplayLists+2;
1108     TDFSB_SolidList=glGenLists(1);
1109     TDFSB_BlendList=glGenLists(1);
1110 
1111 /* building audio object */
1112     aua2 = gluNewQuadric();
1113     gluQuadricCallback(aua2, GLU_ERROR, (_GLUfuncptr)errglu);
1114     gluQuadricDrawStyle(aua2,GLU_FILL);
1115     gluQuadricNormals(aua2, GLU_SMOOTH);
1116     glNewList(TDFSB_AudioList, GL_COMPILE);
1117         glTranslatef(0.0, 0.0, 0.0);
1118         glRotatef(90,1.0,0.0,0.0);
1119         gluCylinder(aua2, 0.2, 1.0, 0.5, 16, 1);
1120         glRotatef(180,0.0,1.0,0.0);
1121         gluCylinder(aua2, 0.2, 1.0, 0.5, 16, 1);
1122     glEndList();
1123     gluDeleteQuadric(aua2);
1124 
1125 /* building  Textfilecylinder */
1126     aua1 = gluNewQuadric();
1127     gluQuadricCallback(aua1, GLU_ERROR, (_GLUfuncptr)errglu);
1128     gluQuadricDrawStyle(aua1,GLU_FILL);
1129     gluQuadricNormals(aua1, GLU_SMOOTH);
1130     glNewList(TDFSB_CylinderList, GL_COMPILE);
1131         glTranslatef(0.0, 0.0, -1.0);
1132         gluCylinder(aua1, 0.6, 0.6, 2.0, 16, 1);
1133         glTranslatef(0.0, 0.0, 2.0);
1134         gluDisk(aua1, 0.0, 0.6, 16, 1);
1135         glTranslatef(0.0, 0.0, -2.0);
1136         gluDisk(aua1, 0.0, 0.6, 16, 1);
1137     glEndList();
1138     gluDeleteQuadric(aua1);
1139 
1140 
1141     glNewList(TDFSB_HelpList, GL_COMPILE);
1142     prevlen=0; cnt=0;
1143     strcpy (help_copy,help_str);
1144     tmpstr = strtok(help_copy,"\n");
1145     while (tmpstr != NULL)
1146     {
1147         cnt++; glTranslatef(-prevlen,-14/0.09,0);
1148         c3=(int)strlen(tmpstr);
1149         for (c2=0;c2<c3;c2++)
1150         {
1151             glutStrokeCharacter(GLUT_STROKE_MONO_ROMAN,tmpstr[c2]);
1152         }
1153         prevlen=c3*104.76;
1154         tmpstr = strtok(NULL,"\n");
1155     }
1156 
1157     glEndList();
1158 
1159     SDL_WarpMouse(SWX/2,SWY/2);
1160     vposy=0; lastposx=lastposz=vposx=vposz=-10; smooy=tposy=0; smoox=tposx=SQF; smooz=tposz=SQF;
1161     smoou=0; uposy=0;
1162     viewm();
1163 
1164     TDFSB_TEX_NUM=0; TDFSB_TEX_NAMES=NULL;
1165 
1166     glClearColor(TDFSB_BG_R,TDFSB_BG_G,TDFSB_BG_B,0.0);
1167     glShadeModel (GL_SMOOTH);
1168     glEnable(GL_DEPTH_TEST);
1169     glEnable(GL_NORMALIZE);
1170 
1171     glPixelStorei(GL_UNPACK_ALIGNMENT,1);
1172     glPixelStorei(GL_PACK_ALIGNMENT,1);
1173 
1174     glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient);
1175     glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);
1176     glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
1177     glMaterialfv(GL_FRONT, GL_SHININESS, mat_shininess);
1178     glMaterialfv(GL_FRONT, GL_EMISSION, mat_emission);
1179     glMaterialfv(GL_BACK, GL_AMBIENT, mat_ambient);
1180     glMaterialfv(GL_BACK, GL_DIFFUSE, mat_diffuse);
1181     glMaterialfv(GL_BACK, GL_SPECULAR, mat_specular);
1182     glMaterialfv(GL_BACK, GL_SHININESS, mat_shininess);
1183     glMaterialfv(GL_BACK, GL_EMISSION, mat_emission);
1184 
1185     glLightfv(GL_LIGHT0, GL_POSITION, light_position);
1186 
1187     glEnable (GL_LIGHTING);
1188     glEnable (GL_LIGHT0);
1189 
1190     mono=glutStrokeWidth(GLUT_STROKE_MONO_ROMAN,'W');
1191 }
1192 
1193 
reshape(int w,int h)1194 void reshape (int w, int h)
1195 {
1196     centY=( ( ((GLdouble)h) * centY )/ ((GLdouble)SWY) );
1197     centX=( ( ((GLdouble)w) * centX )/ ((GLdouble)SWX) );
1198     SWX=w;SWY=h;
1199 
1200     glViewport (0,0,(GLsizei)w,(GLsizei)h);
1201 }
1202 
1203 
1204 
1205 
1206 
1207 
1208 
1209 
1210 
1211 
1212 
1213 
1214 
1215 
1216 
1217 
1218 
1219 
1220 
insert(char * value,char * linkpath,unsigned int mode,off_t size,unsigned int type,unsigned int uni0,unsigned int uni1,unsigned int uni2,unsigned int uni3,unsigned char * locptr,GLfloat posx,GLfloat posy,GLfloat posz,GLfloat scalex,GLfloat scaley,GLfloat scalez)1221 void insert(char * value,char * linkpath,unsigned int mode,off_t size,unsigned int type, unsigned int uni0, unsigned int uni1, unsigned int uni2, unsigned int uni3, unsigned char * locptr, GLfloat posx, GLfloat posy, GLfloat posz, GLfloat scalex, GLfloat scaley, GLfloat scalez)
1222 {
1223          unsigned char *temp;
1224 
1225          temp =(unsigned char *) malloc(strlen(value)+1);
1226          	if (temp==NULL) { printf("low mem while inserting object!\n"); ende(1); }
1227          strcpy(temp,value);
1228 
1229          if(root==NULL) {
1230                  root =(struct tree_entry * ) malloc(sizeof(struct tree_entry));
1231              	 	if (root==NULL) { printf("low mem while inserting object!\n"); ende(1); }
1232                  root->name=temp;
1233                  root->namelen=strlen(temp);
1234                  root->linkpath =linkpath;
1235                  root->mode=mode;
1236                  root->regtype=type;
1237                  root->uniint0=uni0;root->uniint1=uni1;root->uniint2=uni2;root->uniint3=uni3;
1238                  root->posx=posx;root->posy=posy;root->posz=posz;
1239                  root->scalex=scalex;root->scaley=scaley;root->scalez=scalez;
1240                  root->uniptr=locptr;
1241                  root->size=size;
1242                  root->next=NULL;
1243          } else {
1244                  help=root;
1245                  while(help->next)	help=help->next;
1246                  help->next=(struct tree_entry * ) malloc(sizeof(struct tree_entry));
1247                  	if ((help->next)==NULL) { printf("low mem while inserting object!\n"); ende(1); }
1248                  (help->next)->name=temp;
1249                  (help->next)->namelen=strlen(temp);
1250                  (help->next)->linkpath =linkpath;
1251                  (help->next)->mode=mode;
1252                  (help->next)->regtype=type;
1253                  (help->next)->uniint0=uni0;(help->next)->uniint1=uni1;(help->next)->uniint2=uni2;(help->next)->uniint3=uni3;
1254                  (help->next)->posx=posx;(help->next)->posy=posy;(help->next)->posz=posz;
1255                  (help->next)->scalex=scalex;(help->next)->scaley=scaley;(help->next)->scalez=scalez;
1256                  (help->next)->uniptr=locptr;
1257                  (help->next)->size=size;
1258                  (help->next)->next=NULL;
1259          }
1260  }
1261 
1262 
1263 
1264 
1265 
1266 
1267 
leoscan(char * ls_path)1268 char ** leoscan(char * ls_path)
1269 {
1270 	DIR *ls_dir;
1271 	struct dirent *ls_ent;
1272 	char *ls_tmp, *ls_swap, **ls_entlist;
1273 	unsigned long int count,ls,lsc;
1274 
1275 	ls_dir=opendir(ls_path);
1276 
1277 	if (!ls_dir) { printf("Cannot open Directory %s\n",ls_path); ende(1); }
1278 
1279 	count=0;
1280 	while (readdir(ls_dir)) count++;
1281 	rewinddir(ls_dir);
1282 	if(!count)
1283 	{	closedir(ls_dir);
1284 		printf("Error Directory\n");
1285 		ende(1);
1286 	}
1287 	count++;
1288 
1289 	if(!(ls_entlist=(char **)malloc((size_t)(sizeof(char **)*count))))
1290 	{	closedir(ls_dir);
1291 		printf("Low Mem While Reading Directory\n");
1292 		ende(1);
1293 	}
1294 
1295 	ls_entlist[--count]=NULL;
1296 	while((ls_ent=readdir(ls_dir)))
1297 	{
1298 		--count;
1299 		if(count<0)
1300 		{	closedir(ls_dir);
1301 			printf("Directory Changed While Accessing\n");
1302 			ende(1);
1303 		}
1304 		if(!(ls_tmp=(char *)malloc((size_t)1+(strlen(ls_ent->d_name)))))
1305 		{	closedir(ls_dir);
1306 			printf("Low Mem While Reading Directory Entry\n");
1307 			ende(1);
1308 		}
1309 		memcpy((void *)ls_tmp,(void *)&ls_ent->d_name,((size_t)1+(strlen(ls_ent->d_name))));
1310 		ls_entlist[count]=ls_tmp;
1311 	}
1312 
1313 	closedir(ls_dir);
1314 
1315 	if(count)
1316 	{
1317 		printf("Directory Changed While Accessing\n");
1318 		ende(1);
1319 	}
1320 
1321 	if(TDFSB_DIR_ALPHASORT) /* yes,yes,yes only bubblesort, will change that later... ;) */
1322 	{
1323 		printf("Sorting...\n");
1324 		count=1;
1325 		while(count)
1326 		{	count=0;
1327 			ls=0;
1328 			while(ls_entlist[ls+1])
1329 			{	lsc=0;
1330 				while((lsc<=strlen(ls_entlist[ls]))&&(lsc<=strlen(ls_entlist[ls+1])))
1331 				{
1332 					if(ls_entlist[ls][lsc]>ls_entlist[ls+1][lsc])
1333 					{	ls_swap=ls_entlist[ls];
1334 						ls_entlist[ls]=ls_entlist[ls+1];
1335 						ls_entlist[ls+1]=ls_swap;
1336 						count=1; break;
1337 					}
1338 					else if(ls_entlist[ls][lsc]==ls_entlist[ls+1][lsc])
1339 					{lsc++;}
1340 					else
1341 					{break;}
1342 				}
1343 				ls++;
1344 			}
1345 		}
1346 	}
1347 
1348 	return (ls_entlist);
1349 }
1350 
1351 
1352 
1353 
1354 
1355 
1356 
1357 
leodir(void)1358 void leodir(void)
1359 {
1360 	unsigned int mode=0,temptype=0,uni0=0,uni1=0,uni2=0,uni3=0;
1361         unsigned char *locptr,*temptr,*linkpath;
1362         GLfloat	locpx,locpy,locpz,locsx,locsy,locsz,maxz,momx,momz,nextz;
1363 	FILE *fileptr;
1364         char **entry_list,*entry;
1365 	unsigned long int n;
1366 
1367 	printf("------------------DIRECTORY %s\n",TDFSB_CURRENTPATH);
1368 	c1=0;c2=0;
1369 /* cleaning up */
1370 	glDeleteTextures(TDFSB_TEX_NUM,TDFSB_TEX_NAMES);
1371 	if (TDFSB_TEX_NAMES!=NULL)      free(TDFSB_TEX_NAMES);
1372         TDFSB_WAS_NOREAD=0; TDFSB_TEX_NUM=0; TDFSB_TEX_NAMES=NULL;
1373         if(TDFSB_MPEG_FILE) { SMPEG_stop(TDFSB_MPEG_HANDLE); SMPEG_delete(TDFSB_MPEG_HANDLE); SDL_FreeSurface(TDFSB_MPEG_SURFACE); }
1374         TDFSB_MPEG_FILE=NULL;
1375         if(TDFSB_MP3_FILE)  { SMPEG_stop(TDFSB_MP3_HANDLE); SMPEG_delete(TDFSB_MP3_HANDLE); }
1376         TDFSB_MP3_FILE=NULL;
1377 
1378         if (DRN!=0)
1379 	{
1380 		help=root;
1381 		while(help)
1382 		{
1383 			FMptr=help;
1384 			FCptr=help->name; free(FCptr);
1385 			if (help->uniptr!=NULL) { FCptr=help->uniptr; free(FCptr); }
1386 			if (help->linkpath!=NULL) 	{ FCptr=help->linkpath;   free(FCptr); }
1387 			help=help->next;
1388 			free(FMptr);
1389 		}
1390 		root=NULL;	DRN=0;
1391 	}
1392 
1393 /* analyzing new directory */
1394 	entry_list=leoscan(TDFSB_CURRENTPATH);n=0;
1395 	do
1396 	{   entry=entry_list[n++];
1397             linkpath=NULL;
1398 		if (entry  && ( (TDFSB_SHOW_DOTFILES || entry[0]!='.') || !strcmp(entry,"..") )  )
1399 		{
1400 			DRN++;temptype=0;linkpath=NULL;
1401 			strcpy(fullpath,TDFSB_CURRENTPATH);
1402 			if (strlen(fullpath)>1) strcat(fullpath,"/");
1403 			strcat(fullpath,entry); printf("Loading: %s ",entry);
1404 			lstat (fullpath,&buf);
1405 /* What ist it? */
1406 			if      (S_ISREG(buf.st_mode)!=0)	mode=0;
1407 			else if (S_ISDIR(buf.st_mode)!=0)	mode=1;
1408 			else if (S_ISCHR(buf.st_mode)!=0)	mode=2;
1409 			else if (S_ISBLK(buf.st_mode)!=0)	mode=3;
1410 			else if (S_ISFIFO(buf.st_mode)!=0)	mode=4;
1411 /*			else if (S_ISSOCK(buf.st_mode)!=0)	mode=6; removed for BeOS compatibility */
1412 			else if (S_ISLNK(buf.st_mode)!=0)	{       cc=readlink(fullpath, yabuf, 4095); yabuf[cc]='\0';
1413 			                                                linkpath=(unsigned char *) malloc(sizeof(char)*(strlen(yabuf)+1));
1414 			                                                if (linkpath==NULL) { printf("low mem while detecting link\n"); ende(1); }
1415                                                                         strcpy(linkpath,yabuf);
1416 
1417 			                                                printf("LINK: %s -> %s ",fullpath,yabuf);
1418 			                                                if (yabuf[0]!='/') { strcpy(fullpath,TDFSB_CURRENTPATH); if (strlen(fullpath)>1) strcat(fullpath,"/"); strcat(fullpath,yabuf); }
1419 			                                                else strcpy(fullpath,yabuf);
1420 			                                                lstat (fullpath,&buf);
1421 
1422 			                                                if (S_ISREG(buf.st_mode)!=0)		mode=0x20;
1423 			                                                else if (S_ISDIR(buf.st_mode)!=0)	mode=0x21;
1424 			                                                else if (S_ISCHR(buf.st_mode)!=0)	mode=0x22;
1425 			                                                else if (S_ISBLK(buf.st_mode)!=0)	mode=0x23;
1426 			                                                else if (S_ISFIFO(buf.st_mode)!=0)	mode=0x24;
1427 			                                                else if (S_ISLNK(buf.st_mode)!=0)	mode=0x25;
1428 /*			                                                else if (S_ISSOCK(buf.st_mode)!=0)	mode=0x26; BeOS again */
1429 
1430 			                                                printf (" mode: 0x%x ",mode);
1431 			                                        }
1432 
1433 /* Check Permissions */
1434 			if ((mode&0x1F)==1)	{ if  ((access(fullpath,R_OK)<0)||(access(fullpath,X_OK)<0))	{ mode=((mode&0x1F)+10)|(mode&0x20); TDFSB_WAS_NOREAD=1;} }
1435 			else if (access(fullpath,R_OK)<0)							{ mode=((mode&0x1F)+10)|(mode&0x20); TDFSB_WAS_NOREAD=1;}
1436 
1437 /* Data File Identifizierung */
1438 			if ((mode&0x1F)==0)	{	for (cc=1;cc<=lsuff;cc++)
1439 								{
1440 									if 	( !strncmp( xsuff[cc],	&(fullpath[strlen(fullpath)-strlen(xsuff[cc])]),	strlen(xsuff[cc]) )	)
1441 									{	temptype=tsuff[cc];	break;}
1442 								}
1443 							}
1444 
1445 /* Data File Loading + Setting Parameters */
1446                         if ((mode&0x1F)==1||(mode&0x1F)==11)
1447                         {
1448                             temptype=0; locpx=locpz=locpy=0; locsx=locsy=locsz=1; locptr=NULL; uni0=0; uni1=0; uni2=0;
1449                             printf(" .. DIR done.\n");
1450                         }
1451 			else if (temptype==1)
1452                         {
1453                             locptr=read_imagefile(fullpath);
1454                             if (!locptr)
1455                             {   printf("IMAGE FAILED: %s\n",fullpath);
1456                                 locptr=NULL; uni0=0; uni1=0; uni2=0; uni3=0; temptype=0;
1457                                 locsy=((GLfloat)log(((double)buf.st_size/1024)+1))+1;  locsx=locsz=((GLfloat)log(((double)buf.st_size/8192)+1))+1;
1458                                 locpx=locpz=0; locpy=locsy-1;
1459                             }
1460                             else
1461                             {   uni0=p2w; uni1=p2h; uni2=cglmode; uni3=0; /* width height colormode NULL */
1462                                 printf("IMAGE: %ldx%ld %s TEXTURE: %dx%d\n",www,hhh,fullpath,uni0,uni1);
1463                                 if (www<hhh)    { locsx=locsz=((GLfloat)log(((double)www/512)+1))+1; locsy=(hhh*(locsx))/www; }
1464                                 else            { locsy=((GLfloat)log(((double)hhh/512)+1))+1; locsx=locsz=(www*(locsy))/hhh; }
1465                                 locsz=1.44/(((GLfloat)log(((double)buf.st_size/1024)+1))+1);
1466                                 locpx=locpz=0; locpy=locsy-1; TDFSB_TEX_NUM++;
1467                             }
1468                         }
1469                         else if (temptype==2)
1470                         {       uni0=0; uni1=0; uni2=0; uni3=0; c1=0; c2=0; c3=0;
1471                                 fileptr=fopen(fullpath,"r");
1472                                 if(!fileptr)
1473                                 {       printf("TEXT FAILED: %s\n",fullpath); locptr=NULL; temptype=0; }
1474                                 else
1475                                 {       do      { c3=fgetc(fileptr); if ((c3!=EOF)&&(isgraph(c3)||c3==' ')) c1++; }
1476                                         while   (c3!=EOF); rewind(fileptr);
1477                                         locptr=(unsigned char *)malloc( (c1+21)*sizeof(unsigned char) );
1478                                         if (!locptr)
1479                                         {       printf("TEXT FAILED: %s\n",fullpath); fclose(fileptr); locptr=NULL; temptype=0; }
1480                                         else
1481                                         {       temptr=locptr; uni0=((GLfloat)log(((double)buf.st_size/256)+1))+6;
1482                                                 for (c3=0;c3<10;c3++) { *temptr=' '; temptr++; }
1483                                                 do { c3=fgetc(fileptr); if ((c3!=EOF)&&(isgraph(c3)||c3==' ')) { *temptr=(unsigned char)c3; temptr++; c2++; } }
1484                                                 while ((c3!=EOF)&&(c2<c1));
1485                                                 for (c3=0;c3<10;c3++) { *temptr=' '; temptr++; }
1486                                                 *temptr=0;
1487                                                 fclose(fileptr);
1488                                                 printf("TEXT: %ld char.\n",c1);
1489                                         }
1490                                 }
1491                                 locsy=4.5;      /* locsy=((GLfloat)log(((double)buf.st_size/1024)+1))+1; */
1492                                 locsx=locsz=((GLfloat)log(((double)buf.st_size/8192)+1))+1;
1493                                 locpx=locpz=0; locpy=locsy-1;
1494                         }
1495                         else if (temptype==3)
1496                         {       locptr=read_mpegframe(fullpath);
1497                                 if (!locptr)
1498                                 {       printf("MPEG FAILED: %s\n",fullpath);
1499                                         locptr=NULL; uni0=0; uni1=0; uni2=0; uni3=0; temptype=0;
1500                                         locsy=((GLfloat)log(((double)buf.st_size/1024)+1))+1;  locsx=locsz=((GLfloat)log(((double)buf.st_size/8192)+1))+1;
1501                                         locpx=locpz=0; locpy=locsy-1;
1502                                 }
1503                                 else
1504                                 {       uni0=p2w; uni1=p2h; uni2=cglmode; uni3=1; /* width height colormode texture */
1505                                         printf("MPEG: %ldx%ld %s TEXTURE: %dx%d\n",www,hhh,fullpath,uni0,uni1);
1506                                         if (www<hhh)    { locsx=locsz=((GLfloat)log(((double)www/128)+1))+1; locsy=(hhh*(locsx))/www; }
1507                                         else            { locsy=((GLfloat)log(((double)hhh/128)+1))+1; locsx=locsz=(www*(locsy))/hhh; }
1508                                         locsz=(2*2.88)/(((GLfloat)log(((double)buf.st_size/1024)+1))+1);
1509                                         locpx=locpz=0; locpy=locsy-1; TDFSB_TEX_NUM++;
1510                                 }
1511                         }
1512                         else if (temptype==6||temptype==4)
1513                         {       uni0=0; uni1=0; uni2=0; uni3=0; c1=0; c2=0; c3=0; locptr=NULL;
1514                                 locsy=locsx=locsz=((GLfloat)log(((double)buf.st_size/(65536*20)+1)))+1;
1515                                 locpx=locpz=0; locpy=locsy-1;
1516                                 printf("\n");
1517                         }
1518                         else
1519                         {       locptr=NULL; uni0=0; uni1=0; uni2=0; uni3=0; temptype=0;
1520                                 locsy=((GLfloat)log(((double)buf.st_size/1024)+1))+1;
1521                                 locsx=locsz=((GLfloat)log(((double)buf.st_size/8192)+1))+1;
1522                                 locpx=locpz=0; locpy=locsy-1;
1523                                 printf(" .. done.\n");
1524                         }
1525 
1526                         insert(entry,linkpath,mode,buf.st_size,temptype,uni0,uni1,uni2,uni3,locptr,locpx,locpy,locpz,locsx,locsy,locsz);
1527                         free(entry);
1528                 }
1529 
1530         }while (entry);
1531 
1532 	free(entry_list);
1533 
1534 /* calculate object positions */
1535 
1536 	DRNratio=(int) sqrt((double)DRN); help=root; cc=0; maxz=0; momx=0; momz=0; nextz=0;
1537 
1538 	for(c2=0;c2<=DRNratio;c2++)
1539 	{	momz+=maxz+nextz+2*(log(help->scalez+1))+4; maxz=0; momx=0;
1540 		for(c1=0;c1<=DRNratio;c1++)
1541 		{
1542 			if (help->scalez>maxz) { maxz=help->scalez; }
1543 			momx=momx+(help->scalex);
1544 			help->posx=momx; help->posz=momz;
1545 			help->rasterx=c1; help->rasterz=c2;
1546 			momx=momx+(help->scalex);
1547 			help=help->next;
1548 			if (!help) break;
1549 			momx=momx+2*(log(help->scalex+1))+4; /* Wege zw den Objekte, min 1 */
1550 		}
1551 		if (!help) break;
1552 		FMptr=help; nextz=0;
1553 		for(c1=0;c1<=DRNratio;c1++) { if(FMptr->scalez>nextz) nextz=FMptr->scalez; FMptr=FMptr->next; if(!FMptr) break; }
1554 	}
1555 
1556 /* Calculate Ground Grid */
1557 	TDFSB_MAXX=TDFSB_MAXZ=0;
1558 	help=root;	while (help)		{	if (help->posx+help->scalex>TDFSB_MAXX) TDFSB_MAXX=help->posx+help->scalex;
1559 										if (help->posz+help->scalez>TDFSB_MAXZ) TDFSB_MAXZ=help->posz+help->scalez;
1560 										if (help->next) help=help->next; else help=NULL;
1561 									}
1562 	TDFSB_MAXX+=10;TDFSB_MAXZ+=10;
1563 	TDFSB_MINX=root->posx-10;TDFSB_MINZ=root->posz-10;TDFSB_STEPX=(TDFSB_MAXX-TDFSB_MINX)/20;TDFSB_STEPZ=(TDFSB_MAXZ-TDFSB_MINZ)/20;
1564 	printf("GRIDCELLSIZE: %f|%f\n",TDFSB_STEPX,TDFSB_STEPZ);
1565 
1566 /* Reorganize Fileobject Locations : UGLY!!! ;)	*/
1567 	help=root; while (help)			{	FMptr=help;
1568 										do {	if (!(FMptr->next)) { break; }
1569 												if (((FMptr->next)->rasterz)!=(help->rasterz)) {  break; }
1570 												FMptr=FMptr->next;
1571 										} while (1);
1572 										momx=(TDFSB_MAXX-10-(FMptr->posx+FMptr->scalex))/2;
1573 										while (help!=FMptr) { help->posx+=momx; help=help->next; }
1574 										help->posx+=momx;
1575 										if (help->next) help=help->next; else help=NULL;
1576 	                                        }
1577 
1578 /* Creating Texture Objects */
1579  	printf("%ld Textures loaded\n",(long int)TDFSB_TEX_NUM);
1580 
1581 	if (!(TDFSB_TEX_NAMES=(GLuint *)malloc((TDFSB_TEX_NUM+1)*sizeof(GLuint)))) { printf("low mem while alloc texture names\n"); ende(1);}
1582 	glGenTextures(TDFSB_TEX_NUM,TDFSB_TEX_NAMES);
1583 
1584 	c1=0;
1585 	for (help=root;help;help=help->next)
1586 	{
1587 		if (  (((help->regtype)==3)||((help->regtype)==1))  &&(((help->mode)&0x1F)==0))
1588 		{
1589 			glBindTexture(GL_TEXTURE_2D, TDFSB_TEX_NAMES[c1]);
1590 			glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
1591 			glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
1592 			glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
1593 			glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
1594 			glTexEnvf(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_REPLACE);
1595 			glTexImage2D(GL_TEXTURE_2D, 0, (GLenum)help->uniint2, help->uniint0, help->uniint1, 0, (GLenum)help->uniint2, GL_UNSIGNED_BYTE, help->uniptr);
1596 
1597 			help->uniint3=TDFSB_TEX_NAMES[c1];
1598 			c1++;
1599 		}
1600 	}
1601 
1602 /* Creating Display List */
1603 
1604 	tdb_gen_list();
1605 
1606 /* Kontrolloutput */
1607 
1608 	help=root;
1609 	for(help=root;help;help=help->next)
1610 	{
1611 		printf ("[%d,%d] ",help->rasterx,help->rasterz);
1612 		printf ("%s %ld  ",help->name,(long int)help->size);
1613 		if (((help->mode)&0x1F)==1)
1614 		{
1615 			printf("DIR");
1616 		}
1617 		else
1618 		{
1619 		 	printf ("%d-%s-FILE",help->regtype,nsuff[help->regtype]);
1620 		}
1621 		printf ("\n");
1622 
1623                 if (strcmp(help->name,"..")==0)
1624                 {
1625                         TDFSB_NORTH_X=help->posx; TDFSB_NORTH_Z=help->posz;
1626                         printf(" * (%f,%f) is the Northpole.\n",TDFSB_NORTH_X,TDFSB_NORTH_Z);
1627                 }
1628 	}
1629 
1630 	vposy=0; lastposx=lastposz=vposx=vposz=-10; smooy=tposy=0; smoox=tposx=SQF; smooz=tposz=SQF;
1631 	smoou=0; uposy=0;
1632         viewm();
1633 
1634 	strcpy(fullpath,"TDFSB: ");
1635 	strcat(fullpath,TDFSB_CURRENTPATH);
1636 	SDL_WM_SetCaption(fullpath,"TDFSB");
1637 
1638 	printf("Display . files: "); if (TDFSB_SHOW_DOTFILES) printf ("YES.\n"); else printf ("NO.\n");
1639 
1640         TDFSB_ANIM_COUNT=0; TDFSB_ANIM_STATE=0;
1641 
1642 	return;
1643 }
1644 
1645 
1646 
1647 
1648 
1649 
1650 
1651 
1652 
1653 
1654 
1655 
1656 
1657 
1658 
1659 
1660 
1661 
1662 /* TDFSB IDLE FUNCTIONS */
1663 
move(void)1664 void move(void)
1665 {
1666         if(upkeybuf)    {       uposy=vposy=vposy+1/mousespeed; }
1667 	else if(downkeybuf){    uposy=vposy=vposy-1/mousespeed; }
1668 
1669 
1670         if(leftkeybuf)  {       vposz=vposz-tposx/mousespeed;
1671                                 vposx=vposx+tposz/mousespeed;
1672 	                }
1673 	else if(rightkeybuf)
1674 	                {       vposz=vposz+tposx/mousespeed;
1675 	                        vposx=vposx-tposz/mousespeed;
1676 	                }
1677 
1678 
1679         if(forwardkeybuf)
1680 	                {       vposz=vposz+tposz/mousespeed;
1681                                 vposx=vposx+tposx/mousespeed;
1682 	                        if(TDFSB_MODE_FLY)      uposy=vposy=vposy+tposy/mousespeed;
1683                 	}
1684 	else if(backwardkeybuf)
1685 	                {       vposz=vposz-tposz/mousespeed;
1686                                 vposx=vposx-tposx/mousespeed;
1687 	                        if(TDFSB_MODE_FLY)      uposy=vposy=vposy-tposy/mousespeed;
1688                         }
1689 
1690         if (uposy!=vposy) { vposy+=(uposy-vposy)/2; }
1691         if (vposy<0) vposy=0;
1692 
1693 	TDFSB_FUNC_DISP();
1694 }
1695 
stillDisplay(void)1696 void stillDisplay(void)
1697 {
1698         TDFSB_FUNC_DISP();
1699 }
1700 
startstillDisplay(void)1701 void startstillDisplay(void)
1702 {
1703         if (TDFSB_CONFIG_FULLSCREEN) keyboard(TDFSB_KC_FS);
1704         stop_move();
1705         TDFSB_FUNC_IDLE=stillDisplay;
1706         TDFSB_FUNC_DISP();
1707 }
1708 
ground(void)1709 void ground(void)
1710 {
1711         if (TDFSB_ANIM_STATE)           { uposy=vposy-=TDFSB_OA_DY; }
1712         if (!(--TDFSB_ANIM_COUNT))      { TDFSB_ANIM_STATE=0; TDFSB_ANIM_COUNT=0; uposy=vposy=0; stop_move(); TDFSB_FUNC_IDLE=stillDisplay; }
1713         TDFSB_FUNC_DISP();
1714 }
1715 
approach(void)1716 void approach(void)
1717 {
1718         switch (TDFSB_ANIM_STATE)
1719         {
1720                 case 1:
1721                         vposx=vposx+TDFSB_OA_DX;
1722                         uposy=vposy=vposy+TDFSB_OA_DY;
1723                         vposz=vposz+TDFSB_OA_DZ;
1724                         if (fabs(vposx-TDFSB_OA->posx)<0.1 && fabs(vposz-TDFSB_OA->posz)<0.1)
1725                         { TDFSB_ANIM_COUNT=50; TDFSB_ANIM_STATE=2;
1726                           TDFSB_OA_DX=-tposx/50; TDFSB_OA_DZ=(-1-tposz)/50; TDFSB_OA_DY=-tposy/50;
1727                         }
1728                         break;
1729 
1730                 case 2:
1731                         if ((TDFSB_OA->regtype==1)||(TDFSB_OA->regtype==3))
1732                         {
1733                                 if (TDFSB_ANIM_COUNT)
1734                                 {
1735                                         smoox+=TDFSB_OA_DX; tposx=smoox; smooz+=TDFSB_OA_DZ; tposz=smooz; smooy+=TDFSB_OA_DY; tposy=smooy;
1736                                         smoou=0; uposy=0;
1737                                         centX=SWX; centY=0;
1738                                         TDFSB_ANIM_COUNT--;
1739                                 }
1740                                 else
1741                                 {       TDFSB_ANIM_COUNT=50; TDFSB_ANIM_STATE=3;
1742                                         TDFSB_OA_DZ=(TDFSB_OA->posz+TDFSB_OA->scalex+2-vposz)/50;
1743                                         TDFSB_OA_DX=(TDFSB_OA->posx+TDFSB_OA->scalex+6-vposx)/50;
1744                                 }
1745                         }
1746                         else
1747                         {       if (TDFSB_OA->regtype==2) {     TDFSB_ANIM_COUNT=50; TDFSB_ANIM_STATE=3;
1748                                                                 TDFSB_OA_DZ=(TDFSB_OA->posz+TDFSB_OA->scalez+4-vposz)/50;
1749                                                                 TDFSB_OA_DX=(TDFSB_OA->posx+TDFSB_OA->scalex+4-vposx)/50;
1750                                                         }
1751                                 else { TDFSB_ANIM_COUNT=0; TDFSB_ANIM_STATE=0; stop_move(); TDFSB_FUNC_IDLE=stillDisplay; }
1752                         }
1753                         break;
1754 
1755                 case 3:
1756                         if (TDFSB_ANIM_COUNT)
1757                         {       vposz+=TDFSB_OA_DZ*(-tposz);
1758                                 vposx+=TDFSB_OA_DX*(-tposx);
1759                                 smoou=0; uposy=0;
1760                                 TDFSB_ANIM_COUNT--;
1761                         }
1762                         else
1763                         {       TDFSB_ANIM_COUNT=50; TDFSB_ANIM_STATE=4; TDFSB_OA_DY=(TDFSB_OA->posy+TDFSB_OA->scaley/2-1-vposy)/50; }
1764                         break;
1765 
1766                 case 4:
1767                         if (TDFSB_ANIM_COUNT)
1768                         {       uposy=vposy+=TDFSB_OA_DY;
1769                                 /* smoou=0; uposy=0; */
1770                                 if (vposy<0)
1771                                 {       TDFSB_ANIM_COUNT=0;
1772                                         uposy=vposy=0;
1773                                 }
1774                                 else TDFSB_ANIM_COUNT--;
1775                         }
1776                         else
1777                         {       TDFSB_ANIM_COUNT=0; TDFSB_ANIM_STATE=0; stop_move(); TDFSB_FUNC_IDLE=stillDisplay; if(vposy<0) vposy=0; uposy=vposy; }
1778                         break;
1779 
1780                 case 0:
1781                 default:
1782                         break;
1783         }
1784 
1785         TDFSB_FUNC_DISP();
1786 
1787 }
1788 
nullDisplay(void)1789 void nullDisplay(void)
1790 {
1791 
1792 	TDFSB_FUNC_DISP();
1793 
1794 }
1795 
noDisplay(void)1796 void noDisplay(void)
1797 {
1798 	char warpmess[]="WARPING...";
1799 
1800         stop_move();
1801         SDL_WarpMouse(SWX/2,SWY/2);
1802 	glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
1803 
1804 	glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluOrtho2D(0.0,(GLfloat)SWX,0.0,(GLfloat)SWY);
1805 	glDisable(GL_LIGHTING);
1806 	glTranslatef(SWX/2-glutStrokeLength(GLUT_STROKE_ROMAN,(unsigned char *)warpmess)*0.075,SWY/2,0); glLineWidth(1);
1807 		glColor3f(0.5,1.0,0.5);
1808 		strcpy(fullpath, warpmess); c3=(int)strlen(fullpath);
1809  		glScalef(0.15,0.15,0.15);
1810 		for (c2=0;c2<c3;c2++) { glutStrokeCharacter(GLUT_STROKE_ROMAN, fullpath[c2]); }
1811 	glEnable(GL_LIGHTING);
1812 	SDL_GL_SwapBuffers();
1813 
1814 	leodir();
1815 	TDFSB_FUNC_DISP=display;
1816 	TDFSB_FUNC_IDLE=stillDisplay;
1817 }
1818 
1819 
1820 
1821 
1822 
1823 
1824 
1825 
1826 
1827 
1828 
1829 
1830 
1831 
1832 
1833 /* TDFSB DISPLAY FUNCTIONS contains display() warpdisplay() */
1834 
1835 
1836 
display(void)1837 void display(void)
1838 {       double odist, vlen, senx, seny, senz, find_dist;
1839         struct tree_entry *find_entry;
1840         GLenum errCode;
1841 
1842         find_entry = NULL; find_dist=10000000;
1843 
1844         if(TDFSB_MP3_FILE)
1845         {
1846             if(SMPEG_status(TDFSB_MP3_HANDLE)==SMPEG_ERROR)
1847             {
1848                     printf("MP3 ERROR stopping %s\n",TDFSB_MP3_FILE->name);
1849                     SMPEG_stop(TDFSB_MP3_HANDLE);
1850                     SMPEG_delete(TDFSB_MP3_HANDLE);
1851                     TDFSB_MP3_FILE=NULL;
1852             }
1853         }
1854         if(TDFSB_MPEG_FILE)
1855         {
1856             play_mpeg();
1857             if(SMPEG_status(TDFSB_MPEG_HANDLE)==SMPEG_ERROR)
1858             {
1859                     printf("MPEG ERROR stopping %s\n",TDFSB_MPEG_FILE->name);
1860                     SMPEG_stop(TDFSB_MPEG_HANDLE);
1861                     SMPEG_delete(TDFSB_MPEG_HANDLE);
1862                     SDL_FreeSurface(TDFSB_MPEG_SURFACE);
1863                     TDFSB_MPEG_FILE=NULL;
1864             }
1865         }
1866 
1867         if (TDFSB_HAVE_MOUSE) { SDL_WarpMouse(SWX/2,SWY/2); }
1868 	glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
1869 
1870 	glEnable(GL_LIGHTING);
1871 	glMatrixMode(GL_MODELVIEW);
1872 
1873 		glLoadIdentity();
1874 		light_position[0]=vposx;
1875 		light_position[1]=vposy;
1876 		light_position[2]=vposz;
1877 		light_position[3]=1;
1878 		glLightfv(GL_LIGHT0, GL_POSITION, light_position);
1879 
1880 	glPushMatrix();
1881 	glCallList(TDFSB_SolidList);
1882 	glPopMatrix();
1883 
1884         glDisable(GL_LIGHTING);
1885 
1886 	spin=(int)fmod(spin,360);spin++;
1887 	c1=0;
1888 
1889         if (TDFSB_GROUND_CROSS)
1890         {
1891                 glColor4f(0.3,0.4,0.6,1.0);
1892                         glBegin(GL_LINES);
1893                                 glVertex3f(vposx+2,-1,vposz);
1894 				glVertex3f(vposx-2,-1,vposz);
1895 				glVertex3f(vposx  ,-1,vposz+2);
1896 				glVertex3f(vposx  ,-1,vposz-2);
1897 			glEnd();
1898 	}
1899 
1900 	for(help=root;help;help=help->next)
1901 	{
1902                 if (TDFSB_OBJECT_SEARCH)
1903                 {
1904                         if (!((help->mode)&0x20))
1905                                 odist=sqrt( (help->posx-vposx)*(help->posx-vposx) + (help->posy-vposy)*(help->posy-vposy) + (help->posz-vposz)*(help->posz-vposz) );
1906                         else
1907                                 odist=sqrt( (help->posx-vposx)*(help->posx-vposx) + (vposy)*(vposy) + (help->posz-vposz)*(help->posz-vposz) );
1908 
1909                         if(TDFSB_KEY_FINDER)
1910                         {        if (TDFSB_KEY_FINDER==help->name[0])
1911                                         if (find_entry?(find_entry->name[0]!=TDFSB_KEY_FINDER):1)
1912                                                 {       find_entry=help;
1913                                                         tposx=(help->posx-vposx)/odist;
1914                                                         tposz=(help->posz-vposz)/odist;
1915                                                         tposy=(help->posy-vposy)/odist;
1916                                                         viewm();
1917                                                 }
1918                         }
1919                         else
1920                         {
1921                                 vlen=sqrt( (tposx*tposx) + (tposy*tposy) + (tposz*tposz) );
1922                                 odist=odist/vlen;
1923 
1924                                 if (odist<find_dist)
1925                                 {       senx=tposx*odist+vposx; seny=tposy*odist+vposy; senz=tposz*odist+vposz;
1926                                         if (!((help->mode)&0x20))
1927                                         {       if ( (senx > help->posx-help->scalex) && (senx < help->posx+help->scalex) )
1928                                                         if ( (seny > help->posy-help->scaley) && (seny < help->posy+help->scaley) )
1929                                                                 if ( ((senz > help->posz-help->scalez) && (senz < help->posz+help->scalez)) || ((help->regtype==1||help->regtype==3)&&((senz > help->posz-help->scalez-1) && (senz < help->posz+help->scalez+1))) )
1930                                                                         { find_entry=help; find_dist=odist;}
1931                                         }
1932                                         else
1933                                         {       if ( (senx > (help->posx)-1) && (senx < (help->posx)+1) )
1934                                                       if ( (seny > -1) && (seny < 1) )
1935                                                                 if ( (senz > (help->posz)-1) && (senz < (help->posz)+1) )
1936                                                                         { find_entry=help; find_dist=odist;}
1937                                         }
1938                                 }
1939                         }
1940 
1941                         if (find_entry) { TDFSB_OBJECT_SELECTED=find_entry; }
1942                         else            { TDFSB_OBJECT_SELECTED=NULL; }
1943                 }
1944 
1945                 mx=help->posx;	mz=help->posz; my=help->posy;
1946 
1947 		if (TDFSB_FILENAMES)
1948 		{
1949                     glPushMatrix();
1950 		    if (!((help->mode)&0x20)) glTranslatef( mx,my,mz ); else glTranslatef( mx,1.5,mz );
1951 
1952 		    if (TDFSB_FILENAMES==1)
1953                     {
1954 		        glRotatef(spin+(fmod(c1,10)*36),0,1,0);
1955  		        if (!((help->mode)&0x20)) glTranslatef(help->scalex,1.5,help->scalez);
1956     			glRotatef(90-45*(help->scalez/help->scalex),0,1,0);
1957     		    }
1958 		    else
1959                     {
1960                         u=mx-vposx; v=mz-vposz; r=sqrt(u*u+v*v);
1961                         if(v>=0) { glRotated( fmod(135+ asin(u/r)*(180/PI) ,360) ,0,1,0); }
1962 	        	else    { glRotated( fmod(315- asin(u/r)*(180/PI) ,360) ,0,1,0); }
1963                         if (((help->mode)==0x00)&&((help->regtype)==1)) glRotatef(-45,0,1,0);
1964                         if (!((help->mode)&0x20))       { glTranslatef((help->scalex)+1,1.5,(help->scalez)+1);  glRotatef(90-45*(help->scalez/help->scalex),0,1,0);  }
1965 		        else                            { glTranslatef(0,0.5,0); glRotatef(45,0,1,0); }
1966                     }
1967 
1968  	            glScalef(0.005,0.005,0.005);
1969 
1970                     if (!((help->mode)&0x20))
1971                     {
1972                         glColor4f(TDFSB_FN_R,TDFSB_FN_G,TDFSB_FN_B,1.0);
1973                         glTranslatef(-glutStrokeLength(GLUT_STROKE_ROMAN,(unsigned char *)help->name)/2,0,0);
1974                         for (c2=0;c2<help->namelen;c2++) glutStrokeCharacter(GLUT_STROKE_ROMAN, help->name[c2]);
1975     		    }
1976     		    else
1977     		    {
1978                         fh=((((GLfloat)spin)-180)/360);
1979                         if (fh<0)
1980                         {
1981                             fh=fabs(fh); glColor4f(1-(fh),1-(fh),1-(fh),1.0);
1982                             glTranslatef(-glutStrokeLength(GLUT_STROKE_ROMAN,(unsigned char *)help->name)/2,0,0);
1983                             for (c2=0;c2<help->namelen;c2++) glutStrokeCharacter(GLUT_STROKE_ROMAN, help->name[c2]);
1984 
1985                         }
1986                         else
1987                         {
1988                             fh=fabs(fh); glColor4f(0.85-(fh),1-(fh),1-(fh),1.0);
1989                             glTranslatef(-glutStrokeLength(GLUT_STROKE_ROMAN,(unsigned char *)help->linkpath)/2,0,0);
1990                             for (c2=0;c2<strlen(help->linkpath);c2++) glutStrokeCharacter(GLUT_STROKE_ROMAN, help->linkpath[c2]);
1991                         }
1992     		    }
1993      		    glPopMatrix();
1994 		}
1995 /* see if we entered a sphere */
1996 		if ( ((help->mode)==1) || (((help->mode)&0x20)&&(((help->mode)&0x1F)<10)) )
1997 		{
1998                     if ( vposx>mx-1 && vposx<mx+1 && vposz>mz-1 && vposz<mz+1 && vposy<1.5 )
1999                     {
2000                         temp_trunc[0]=0; strcat(TDFSB_CURRENTPATH,"/"); strcat(TDFSB_CURRENTPATH,help->name);
2001                         if ((help->mode!=0x21)&&(help->mode&0x20)) strcat(TDFSB_CURRENTPATH,"/..");
2002                         if(realpath(TDFSB_CURRENTPATH,&temp_trunc[0])!=&temp_trunc[0])
2003                         {
2004                             printf("Cannot resolve path \"%s\".\n",TDFSB_CURRENTPATH); ende(1);
2005                         }
2006                         else
2007                         {
2008                             strcpy(TDFSB_CURRENTPATH,temp_trunc);
2009                             TDFSB_FUNC_IDLE=nullDisplay; TDFSB_FUNC_DISP=noDisplay;
2010                             return;
2011                         }
2012                     }
2013 		}
2014 /* animate text files */
2015 		if ( (help->regtype==2) && ((help->mode)&0x1F)==0)
2016 		{
2017 			glPushMatrix();
2018 			if ( ((help->mode)&0x20)) { cc=16; c1=8; glScalef(0.0625,0.125,0.0625); } else cc=c1=1;
2019 			glScalef(0.005,0.005,0.005); glColor4f(1.0,1.0,0.0,1.0);
2020 			c3=(int)strlen(help->uniptr); c2=0;
2021 			glTranslatef((200*mx)*cc, (-100*(c1)+1500+((GLfloat)(((help->uniint2)=(help->uniint2)+(help->uniint0))))), (200*mz)*cc);
2022                         u=mx-vposx; v=mz-vposz; r=sqrt(u*u+v*v);
2023 			if (v>=0)       { glRotated( fmod(180+ asin(u/r)*(180/PI) ,360) ,0,1,0); }
2024 			else            { glRotated( fmod(0- asin(u/r)*(180/PI) ,360) ,0,1,0); }
2025 			glTranslatef(+mono/2,0,0);
2026 			do {	glTranslatef( -mono, -150, 0); glutStrokeCharacter(GLUT_STROKE_MONO_ROMAN, help->uniptr[c2+(help->uniint1)]); c2++; }
2027 			while (c2<c3&&c2<10);
2028 			if (help->uniint2>=150) { (help->uniint1)=(help->uniint1)+1; if ((help->uniint1)>=c3-10) (help->uniint1)=0; (help->uniint2)=0; }
2029 			glPopMatrix();
2030 		}
2031 		c1++;
2032 
2033 	}
2034 
2035 /* animate audio file */
2036         if(TDFSB_MP3_FILE)
2037         {
2038                 glPushMatrix();
2039                         glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse_grn);glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient_grn);glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular_grn);glMaterialfv(GL_FRONT, GL_EMISSION, mat_emission_grn);
2040                         glMaterialfv(GL_BACK, GL_DIFFUSE, mat_diffuse_grn);glMaterialfv(GL_BACK, GL_AMBIENT, mat_ambient_grn);glMaterialfv(GL_BACK, GL_SPECULAR, mat_specular_grn);glMaterialfv(GL_BACK, GL_EMISSION, mat_emission_grn);
2041                         glEnable (GL_LIGHTING);
2042                         glEnable(GL_BLEND); glDepthMask(GL_FALSE); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
2043                     if ( ((TDFSB_MP3_FILE->mode)&0x20))
2044                     {   glTranslatef(TDFSB_MP3_FILE->posx, 0.0, TDFSB_MP3_FILE->posz); glScalef(0.25,0.25,0.25); }
2045                     else
2046                     {   glTranslatef(TDFSB_MP3_FILE->posx,  TDFSB_MP3_FILE->posy  , TDFSB_MP3_FILE->posz); }
2047                     glRotatef(90,1.0,0.0,0.0);
2048                     glScalef(TDFSB_MP3_FILE->scalex*0.6,1+TDFSB_MP3_FILE->scaley+TDFSB_MP3_FILE->scaley*(-(GLfloat)(abs((((int)spin)&0xF)-8))/10),TDFSB_MP3_FILE->scaley*0.6);
2049                     glCallList(TDFSB_AudioList);
2050                     glRotatef(90,1.0,0.0,0.0);
2051                     glScalef(0.5,0.75*TDFSB_MP3_FILE->scaley*( (GLfloat)(abs((((int)spin)&0xF)-8))/10) ,0.5);
2052                     glCallList(TDFSB_AudioList);
2053 	                glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient);glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);glMaterialfv(GL_FRONT, GL_EMISSION, mat_emission);
2054                     	glMaterialfv(GL_BACK, GL_DIFFUSE, mat_diffuse);glMaterialfv(GL_BACK, GL_AMBIENT, mat_ambient);glMaterialfv(GL_BACK, GL_SPECULAR, mat_specular);glMaterialfv(GL_BACK, GL_EMISSION, mat_emission);
2055                 	glDepthMask(GL_TRUE);glDisable(GL_BLEND);
2056                     	glDisable(GL_LIGHTING);
2057                 glPopMatrix();
2058         }
2059 
2060 	glPushMatrix();
2061 	glCallList(TDFSB_BlendList);
2062 	glPopMatrix();
2063 
2064         if (TDFSB_OBJECT_SELECTED)
2065         {
2066                 glPushMatrix();
2067 
2068                         if ((TDFSB_OBJECT_SELECTED->mode)&0x20)
2069                         {       glTranslatef(TDFSB_OBJECT_SELECTED->posx, 0  , TDFSB_OBJECT_SELECTED->posz);
2070                                 glScalef(1.5,1,1.5);
2071                         }
2072                         else
2073                         {       glTranslatef(TDFSB_OBJECT_SELECTED->posx,  TDFSB_OBJECT_SELECTED->posy  , TDFSB_OBJECT_SELECTED->posz);
2074                                 if (TDFSB_OBJECT_SELECTED->scalex>TDFSB_OBJECT_SELECTED->scalez)
2075                                         glScalef(TDFSB_OBJECT_SELECTED->scalex*1.5, 0.9 , TDFSB_OBJECT_SELECTED->scalex*1.5);
2076                                 else
2077                                         glScalef(TDFSB_OBJECT_SELECTED->scalez*1.5, 0.9 , TDFSB_OBJECT_SELECTED->scalez*1.5);
2078                         }
2079                         glColor4f(0.5,1.0,0.0,1.0);
2080                         glRotatef(fmod(spin,360),0,1,0);
2081                         glutWireCube(2.0);
2082                 glPopMatrix();
2083         }
2084 
2085 /* on screen displays */
2086 	glMatrixMode(GL_PROJECTION);
2087 	glLoadIdentity();
2088 	gluOrtho2D(0.0,(GLfloat)SWX,0.0,(GLfloat)SWY);
2089 
2090 	if(TDFSB_SHOW_CROSSHAIR)
2091 	{
2092 		if (SWX>SWY) fh2=SWX*0.025; else fh2=SWY*0.025; if (fh2>18) fh2=18;
2093 		glPushMatrix();
2094 			 glColor3f(0.5,1.0,0.25);
2095 			 glBegin(GL_LINES);
2096 					glVertex3f(SWX*0.50+fh2,SWY*0.50    , 1);
2097 					glVertex3f(SWX*0.50-fh2,SWY*0.50    , 1);
2098 					glVertex3f(SWX*0.50    ,SWY*0.50+fh2, 1);
2099 					glVertex3f(SWX*0.50    ,SWY*0.50-fh2, 1);
2100 			 glEnd();
2101 		glPopMatrix();
2102 	}
2103 
2104 	if(TDFSB_SHOW_DISPLAY)
2105 	{
2106                 strcpy(fullpath, TDFSB_CURRENTPATH); c3=(int)strlen(fullpath); cc=(GLfloat)glutStrokeLength(GLUT_STROKE_ROMAN,fullpath)*0.14;
2107                 if (cc<(SWX/10)) cc=SWX/10;
2108                 glPushMatrix();
2109 
2110                 if (TDFSB_SHOW_DISPLAY>1)
2111                 {
2112                         glColor4f(0.8,1.0,0.8,0.25);
2113                         glEnable(GL_BLEND); glDepthMask(GL_FALSE); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
2114                         glBegin(GL_QUADS);
2115                                 glVertex3f (5, 45, 1); glVertex3f (cc+20+TDFSB_XL_DISPLAY, 45, 1); glVertex3f (cc+20+TDFSB_XL_DISPLAY, 5, 1); glVertex3f ( 5, 5, 1);
2116                         glEnd();
2117                         if (TDFSB_SHOW_DISPLAY>2)
2118                         {
2119                                 glColor4f(0.4,0.8,0.6,0.5);
2120                                 glBegin(GL_POLYGON);
2121                                         glVertex3f	(	25	+15*1, 		25	+15*0,		1);
2122                                         glVertex3f	(	25	+15*0.866,	25	+15*0.5,	1);
2123                                         glVertex3f	(	25	+15*0.5,	25	+15*0.866,	1);
2124                                         glVertex3f	(	25	+15*0, 		25	+15*1,		1);
2125                                         glVertex3f	(	25	-15*0.5,	25	+15*0.866,	1);
2126                                         glVertex3f	(	25	-15*0.866,	25	+15*0.5,	1);
2127                                         glVertex3f	(	25	-15*1, 		25	+15*0,		1);
2128                                         glVertex3f	(	25	-15*0.866,	25	-15*0.5,	1);
2129                                         glVertex3f	(	25	-15*0.5,	25	-15*0.866,	1);
2130                                         glVertex3f	(	25	-15*0, 		25	-15*1,		1);
2131                                         glVertex3f	(	25	+15*0.5,	25	-15*0.866,	1);
2132                                         glVertex3f	(	25	+15*0.866,	25	-15*0.5,	1);
2133                                 glEnd();
2134 
2135                                 glPushMatrix();
2136                                         glTranslatef(25,25,0);
2137                                         glRotatef(-90 - ( (180* atan2(((double)tposx),((double)tposz)) )/PI) +
2138                                                         ( (180* atan2((((double)vposx-(double)TDFSB_NORTH_X)),(((double)vposz-(double)TDFSB_NORTH_Z))) )/PI)
2139                                                         ,0,0,1);
2140                                         glBegin(GL_LINES);
2141                                                 glVertex3f (0,0,1);
2142 						glColor4f(1.0,1.0,1.0,1.0);
2143                                                 glVertex3f (15*sqrt(tposz*tposz+tposx*tposx), 0, 1);
2144 					glEnd();
2145                                 glPopMatrix();
2146                         }
2147                         glDepthMask(GL_TRUE);glDisable(GL_BLEND);
2148                 }
2149 
2150                 glTranslatef(10+TDFSB_XL_DISPLAY,18,1);
2151                 glColor3f(0.4,0.8,0.6);
2152                 glScalef(0.14,0.14,1);
2153                 for (c2=0;c2<c3;c2++) { glutStrokeCharacter(GLUT_STROKE_ROMAN, fullpath[c2]); }
2154 
2155                 glPopMatrix();
2156         }
2157 
2158         if(TDFSB_SHOW_HELP)
2159         {
2160                 glPushMatrix();
2161                 glTranslatef(10,SWY,0);	glScalef(0.08,0.08,1);	glColor3f(0.4,0.8,0.6);
2162                         glCallList(TDFSB_HelpList);
2163                 glPopMatrix();
2164         }
2165         else
2166         {
2167             if (TDFSB_OBJECT_SELECTED)
2168             {
2169                 glPushMatrix();
2170                 glTranslatef(10,SWY-18,0); glScalef(0.12,0.12,1); glColor3f(0.5,1.0,0.25);
2171                         for (c2=0;c2<strlen(TDFSB_OBJECT_SELECTED->name);c2++) { glutStrokeCharacter(GLUT_STROKE_MONO_ROMAN,TDFSB_OBJECT_SELECTED->name[c2]); }
2172                 glPopMatrix();
2173             }
2174             else if (TDFSB_SHOW_FPS)
2175             {
2176                 glPushMatrix();
2177                     glTranslatef(10,SWY-18,0); glScalef(0.12,0.12,1); glColor3f(0.4,0.8,0.6);
2178                     for (c2=0;c2<strlen(fpsbuf);c2++) { glutStrokeCharacter(GLUT_STROKE_MONO_ROMAN,fpsbuf[c2]); }
2179                 glPopMatrix();
2180             }
2181             if (TDFSB_SHOW_CONFIG_FPS)
2182             {
2183                 glPushMatrix();
2184                     glTranslatef(10,SWY-36,0);  glScalef(0.12,0.12,1);  glColor3f(0.4,0.8,0.6);
2185                     for (c2=0;c2<strlen(cfpsbuf);c2++) { glutStrokeCharacter(GLUT_STROKE_MONO_ROMAN,cfpsbuf[c2]); }
2186                 glPopMatrix();
2187                 TDFSB_SHOW_CONFIG_FPS--;
2188             }
2189             if (TDFSB_SHOW_THROTTLE)
2190             {
2191                 glPushMatrix();
2192                     glTranslatef(10,SWY-54,0); glScalef(0.12,0.12,1); glColor3f(0.4,0.8,0.6);
2193                     for (c2=0;c2<strlen(throttlebuf);c2++) { glutStrokeCharacter(GLUT_STROKE_MONO_ROMAN,throttlebuf[c2]); }
2194                 glPopMatrix();
2195                 TDFSB_SHOW_THROTTLE--;
2196             }
2197             if (TDFSB_SHOW_BALL)
2198             {
2199                 glPushMatrix();
2200                     glTranslatef(10,SWY-72,0); glScalef(0.12,0.12,1); glColor3f(0.4,0.8,0.6);
2201                     for (c2=0;c2<strlen(ballbuf);c2++) { glutStrokeCharacter(GLUT_STROKE_MONO_ROMAN,ballbuf[c2]); }
2202                 glPopMatrix();
2203                 TDFSB_SHOW_BALL--;
2204             }
2205             if(TDFSB_FLY_DISPLAY)
2206             {
2207                 glPushMatrix();
2208                     glTranslatef(SWX-104.76*11*0.1,SWY-18,0);	glScalef(0.10,0.10,1);	glColor3f(0.6,0.4,0.0);
2209                     for (c2=0;c2<11;c2++) { glutStrokeCharacter(GLUT_STROKE_MONO_ROMAN,flybuf[c2]); }
2210                 glPopMatrix();
2211                 TDFSB_FLY_DISPLAY--;
2212             }
2213             if(TDFSB_CLASSIC_DISPLAY)
2214             {
2215                 glPushMatrix();
2216                     glTranslatef(SWX-104.76*12*0.1,SWY-36,0);	glScalef(0.10,0.10,1);	glColor3f(0.5,0.5,0.0);
2217                     for (c2=0;c2<11;c2++) { glutStrokeCharacter(GLUT_STROKE_MONO_ROMAN,classicbuf[c2]); }
2218                 glPopMatrix();
2219                 TDFSB_CLASSIC_DISPLAY--;
2220             }
2221         }
2222 
2223 
2224         if(TDFSB_SPEED_DISPLAY)
2225         {
2226                 glColor4f(0.8,1.0,0.8,0.25);
2227                 glPushMatrix();
2228                         glEnable(GL_BLEND); glDepthMask(GL_FALSE); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
2229                         glBegin(GL_QUADS);
2230                                 glVertex3f(SWX-5-4*20,             50, 1); glVertex3f(SWX-5, 50, 1); glVertex3f(SWX-5,  30, 1); glVertex3f(SWX-5-4*20,             30, 1);
2231                                 glVertex3f(SWX-5-4*20,             25, 1); glVertex3f(SWX-5, 25, 1); glVertex3f(SWX-5,   5, 1); glVertex3f(SWX-5-4*20,              5, 1);
2232                         glEnd();
2233                         glDepthMask(GL_TRUE);glDisable(GL_BLEND);
2234                         glColor3f(0.4,0.8,0.6);
2235                         glBegin(GL_QUADS);
2236                                 glVertex3f(SWX-5-4*(21-mousespeed),50, 1); glVertex3f(SWX-5, 50, 1); glVertex3f(SWX-5,  30, 1); glVertex3f(SWX-5-4*(21-mousespeed),30, 1);
2237                                 glVertex3f(SWX-5-4*(10*headspeed), 25, 1); glVertex3f(SWX-5, 25, 1); glVertex3f(SWX-5,   5, 1); glVertex3f(SWX-5-4*(10*headspeed),  5, 1);
2238                         glEnd();
2239                         glTranslatef(SWX-95-(GLfloat)glutStrokeLength(GLUT_STROKE_ROMAN,"W")*0.14,32,0); glScalef(0.14,0.14,1); glutStrokeCharacter(GLUT_STROKE_ROMAN, 'W');
2240                         glTranslatef(-(GLfloat)glutStrokeLength(GLUT_STROKE_ROMAN,"H"), -25*(1/0.14),0);  glutStrokeCharacter(GLUT_STROKE_ROMAN, 'H');
2241                 glPopMatrix();
2242                 TDFSB_SPEED_DISPLAY--;
2243         }
2244 
2245 
2246         if(TDFSB_ALERT_KC)
2247         {
2248                 glPushMatrix();
2249                         glTranslatef(SWX/2-104.76*strlen(alert_kc)*0.1*0.5,SWY/4+9,0);	glScalef(0.10,0.10,1);	glColor3f(1.0,0.25,0.25);
2250                         for (c2=0;c2<strlen(alert_kc);c2++) { glutStrokeCharacter(GLUT_STROKE_MONO_ROMAN,alert_kc[c2]); }
2251                 glPopMatrix();
2252                 glPushMatrix();
2253                         glTranslatef(SWX/2-104.76*strlen(alert_kc2)*0.1*0.5,SWY/4-9,0);	glScalef(0.10,0.10,1);	glColor3f(1.0,0.25,0.25);
2254                         for (c2=0;c2<strlen(alert_kc2);c2++) { glutStrokeCharacter(GLUT_STROKE_MONO_ROMAN,alert_kc2[c2]); }
2255                 glPopMatrix();
2256                 TDFSB_ALERT_KC--;
2257         }
2258 
2259         glLoadIdentity();
2260         gluPerspective(60,(GLfloat)SWX/(GLfloat)SWY,0.5,2000);
2261         smoox+=(tposx-smoox)/2;
2262         smooy+=(tposy-smooy)/2;
2263         smooz+=(tposz-smooz)/2;
2264 
2265         gluLookAt(vposx,vposy,vposz,vposx+smoox,vposy+smooy,vposz+smooz,0.0,1.0,0.0);
2266 
2267         glFinish();
2268         SDL_GL_SwapBuffers();
2269 
2270         rtime=ttime;
2271         gettimeofday(&ttime,NULL);
2272 
2273         if (ttime.tv_sec-rtime.tv_sec)  sec=(1000000-rtime.tv_usec)+ttime.tv_usec;
2274         else                            sec=ttime.tv_usec-rtime.tv_usec;
2275 
2276         TDFSB_FPS_REAL=(1000000/sec);
2277 
2278         if ((TDFSB_FPS_CONFIG && TDFSB_FPS_REAL) && TDFSB_FPS_REAL!=TDFSB_FPS_CONFIG)     TDFSB_US_RUN+=((1000*800/TDFSB_FPS_CONFIG)-(1000*800/TDFSB_FPS_REAL));
2279 
2280         if (TDFSB_FPS_CONFIG)
2281         {
2282                 if (ttime.tv_sec-ltime.tv_sec)  sec=(1000000-ltime.tv_usec)+ttime.tv_usec;
2283                 else                            sec=ttime.tv_usec-ltime.tv_usec;
2284 
2285                 if(sec<TDFSB_US_RUN)
2286                 {
2287                         sec=(TDFSB_US_RUN-sec);
2288  	                   wtime.tv_sec=0; wtime.tv_usec=sec;
2289                         select(0,NULL,NULL,NULL,&wtime);
2290                 }
2291                 gettimeofday(&ltime,NULL);
2292         }
2293 
2294         if (TDFSB_SHOW_FPS) TDFSB_FPS_DISP++;
2295 }
2296 
2297 
2298 
2299 
2300 
2301 
2302 
2303 
2304 
2305 
MouseMove(int x,int y)2306 void MouseMove( int x, int y )
2307 {
2308         if (!TDFSB_ANIM_STATE)
2309         {
2310                 centX=centX-(GLdouble)(headspeed*(floor(((double)SWX)/2)-(double)x));
2311         	centY=centY-(GLdouble)(headspeed*(floor(((double)SWY)/2)-(double)y));
2312 	        if (centY>=SWY/2) centY=SWY/2; if (centY<=((-SWY)/2)) centY=((-SWY)/2);
2313 	        tposz=( (GLdouble)sin (( ((double)centX)/(double)(SWX/mousesense/PI) ))  )*((GLdouble)cos (( ((double)centY)/(double)(SWY/PI) ))  );
2314 	        tposx=( (GLdouble)cos (( ((double)centX)/(double)(SWX/mousesense/PI) ))  )*((GLdouble)cos (( ((double)centY)/(double)(SWY/PI) ))  );
2315 	        tposy=-((GLdouble)sin (( ((double)centY)/(double)(SWY/PI) ))  );
2316         }
2317 }
2318 
MouseLift(int x,int y)2319 void MouseLift( int x, int y )
2320 {
2321         if (!TDFSB_ANIM_STATE)
2322         {
2323                 uposy+=(  (GLfloat) ( (GLfloat)(SWY/2)-(GLfloat)y )   /  25);
2324 
2325                 centX=centX-(GLdouble)(headspeed*(floor(((double)SWX)/2)-(double)x));
2326 /*        	centY=centY-(GLdouble)(headspeed*(floor(((double)SWY)/2)-(double)y));*/
2327 	        if (centY>=SWY/2) centY=SWY/2; if (centY<=((-SWY)/2)) centY=((-SWY)/2);
2328 	        tposz=( (GLdouble)sin (( ((double)centX)/(double)(SWX/mousesense/PI) ))  )*((GLdouble)cos (( ((double)centY)/(double)(SWY/PI) ))  );
2329 	        tposx=( (GLdouble)cos (( ((double)centX)/(double)(SWX/mousesense/PI) ))  )*((GLdouble)cos (( ((double)centY)/(double)(SWY/PI) ))  );
2330 	        tposy=-((GLdouble)sin (( ((double)centY)/(double)(SWY/PI) ))  );
2331         }
2332 }
2333 
mouse(int button,int state,int x,int y)2334 void mouse (int button, int state, int x, int y)
2335 {
2336         if (!TDFSB_ANIM_STATE)
2337         {
2338         switch (button) {
2339 
2340 		case SDL_BUTTON_LEFT:
2341                         if (!TDFSB_CLASSIC_NAV)
2342                         {       if (state == SDL_PRESSED)
2343                                 {       TDFSB_OBJECT_SELECTED=NULL; TDFSB_OBJECT_SEARCH=1; TDFSB_KEY_FINDER=0;
2344                                         TDFSB_FUNC_KEY=keyfinder; TDFSB_FUNC_UPKEY=keyupfinder;
2345 
2346                                 }
2347 			        			else
2348                                 {       TDFSB_OBJECT_SELECTED=NULL; TDFSB_OBJECT_SEARCH=0; TDFSB_KEY_FINDER=0;
2349                                         TDFSB_FUNC_KEY=keyboard;  TDFSB_FUNC_UPKEY=keyboardup;
2350                                 }
2351 			        			break;
2352                         }
2353                         else
2354                         {       if (state == SDL_PRESSED)
2355                                         { forwardkeybuf=1; backwardkeybuf=0; TDFSB_FUNC_IDLE=move; }
2356                                 else
2357                                         { forwardkeybuf=0; check_still(); }
2358                                 break;
2359                         }
2360 
2361 		case SDL_BUTTON_RIGHT:
2362                         if (!TDFSB_CLASSIC_NAV)
2363                         {       if (state == SDL_PRESSED && TDFSB_OBJECT_SELECTED )
2364                                 {       stop_move();
2365                                         TDFSB_OA=TDFSB_OBJECT_SELECTED;
2366                                         TDFSB_OA_DX=(TDFSB_OA->posx-vposx)/100;
2367                                             TDFSB_OA_DY=(TDFSB_OA->posy+TDFSB_OA->scaley+4-vposy)/100;
2368                                         TDFSB_OA_DZ=(TDFSB_OA->posz-vposz)/100;
2369                                         TDFSB_ANIM_STATE=1; TDFSB_OBJECT_SELECTED=NULL; TDFSB_OBJECT_SEARCH=0;
2370                                         TDFSB_FUNC_KEY=keyboard; TDFSB_FUNC_UPKEY=keyboardup;  TDFSB_KEY_FINDER=0;
2371                                         TDFSB_FUNC_IDLE=approach;
2372                                 }
2373                                 break;
2374                         }
2375                         else
2376                         {
2377                                 if (state == SDL_PRESSED)
2378                                         { backwardkeybuf=1; forwardkeybuf=0; TDFSB_FUNC_IDLE=move;  }
2379                                 else
2380                                         { backwardkeybuf=0; check_still(); }
2381                                 break;
2382                         }
2383 
2384 
2385 		case SDL_BUTTON_MIDDLE:
2386 			if (state == SDL_PRESSED)
2387 				{ TDFSB_FUNC_MOTION=MouseLift; TDFSB_FUNC_IDLE=move; }
2388 			else
2389 				{ TDFSB_FUNC_MOTION=MouseMove; TDFSB_FUNC_IDLE=move; check_still(); uposy=vposy; }
2390 			break;
2391 
2392                 case 4:
2393                         if (state == SDL_PRESSED)
2394                         uposy=vposy=vposy+TDFSB_MW_STEPS; if (vposy<0) vposy=uposy=0;
2395                         break;
2396 
2397                 case 5:
2398                         if (state == SDL_PRESSED)
2399                         uposy=vposy=vposy-TDFSB_MW_STEPS; if (vposy<0) vposy=uposy=0;
2400                         break;
2401 
2402                 case 6:
2403                         printf("No function for button 6 yet\n");
2404                         break;
2405 
2406 		default:
2407 			break;
2408 	}
2409         }
2410 
2411 }
2412 
speckey(int key)2413 int speckey(int key)
2414 {
2415     int i;
2416 
2417         if (!TDFSB_ANIM_STATE)
2418         {
2419         switch (key)
2420 		{
2421 
2422 		case SDLK_TAB:
2423 	                strcpy(fullpath,TDFSB_CURRENTPATH);
2424 			if(TDFSB_OBJECT_SELECTED) {
2425                     	    if(strlen(fullpath)>1) strcat(fullpath,"/"); strcat(fullpath,TDFSB_OBJECT_SELECTED->name);
2426     			    TDFSB_OBJECT_SELECTED=NULL;
2427 			    TDFSB_OBJECT_SEARCH=0;
2428 			    TDFSB_KEY_FINDER=0;
2429                     	    TDFSB_FUNC_KEY=keyboard;
2430 			    TDFSB_FUNC_UPKEY=keyboardup;
2431 			}
2432 			if(SDL_GetModState()&0x0003)
2433 			    snprintf(TDFSB_CES_TEMP,4096,"cd \"%s\"; xterm&",TDFSB_CURRENTPATH);
2434 			else
2435 			{
2436 			    if(TDFSB_CSE_FLAG)
2437 				snprintf(TDFSB_CES_TEMP,4096,TDFSB_CUSTOM_EXECUTE_STRING,fullpath);
2438 			    else
2439 	    			snprintf(TDFSB_CES_TEMP,4096,TDFSB_CUSTOM_EXECUTE_STRING);
2440 			}
2441 			system(TDFSB_CES_TEMP);
2442 			printf("EXECUTE COMMAND: %s\n",TDFSB_CES_TEMP);
2443 			if (TDFSB_HAVE_MOUSE)
2444 			{
2445 			    TDFSB_HAVE_MOUSE=0; TDFSB_FUNC_MOUSE=NULL; TDFSB_FUNC_MOTION=NULL; SDL_ShowCursor(SDL_ENABLE);
2446                         }
2447 
2448 			break;
2449 
2450 		case SDLK_F1:
2451 			if (mousespeed>1) mousespeed=mousespeed-1;
2452 			TDFSB_SPEED_DISPLAY=100; break;
2453 		case SDLK_F2:
2454 			if (mousespeed<20)mousespeed=mousespeed+1;
2455 			TDFSB_SPEED_DISPLAY=100; break;
2456 
2457 		case SDLK_F4:
2458 			headspeed=headspeed-.1;
2459 			if (headspeed<0.1) headspeed=0.1;
2460 			TDFSB_SPEED_DISPLAY=100; break;
2461 		case SDLK_F3:
2462 			headspeed=headspeed+.1;
2463 			if (headspeed>2.0) headspeed=2.0;
2464 			TDFSB_SPEED_DISPLAY=100; break;
2465 
2466                 case SDLK_F5:
2467         	        TDFSB_BALL_DETAIL++;
2468 			sprintf(ballbuf,"Ball Detail: %d\n",(int)TDFSB_BALL_DETAIL);
2469                         TDFSB_SHOW_BALL=100;
2470                         break;
2471                 case SDLK_F6:
2472                         if ( TDFSB_BALL_DETAIL>4) { TDFSB_BALL_DETAIL--;  }
2473 			sprintf(ballbuf,"Ball Detail: %d\n",(int)TDFSB_BALL_DETAIL);
2474                         TDFSB_SHOW_BALL=100;
2475 			break;
2476 
2477 		case SDLK_F7:
2478 			TDFSB_FPS_CONFIG++;
2479 			TDFSB_US_RUN=1000000/TDFSB_FPS_CONFIG;
2480 			sprintf(cfpsbuf,"MaxFPS: %d",TDFSB_FPS_CONFIG);
2481 			if (TDFSB_FPS_CONFIG)   strcpy(throttlebuf,"Throttle: ON");
2482 			else                    strcpy(throttlebuf,"Throttle:OFF");
2483 			TDFSB_SHOW_CONFIG_FPS=100;
2484 			break;
2485 		case SDLK_F8:
2486 			if (TDFSB_FPS_CONFIG>0) TDFSB_FPS_CONFIG--;
2487 			if (TDFSB_FPS_CONFIG>0) { TDFSB_US_RUN=1000000/TDFSB_FPS_CONFIG; }
2488 			sprintf(cfpsbuf,"MaxFPS: %d",TDFSB_FPS_CONFIG);
2489 			if (TDFSB_FPS_CONFIG)   strcpy(throttlebuf,"Throttle: ON");
2490 			else                    strcpy(throttlebuf,"Throttle:OFF");
2491 			TDFSB_SHOW_CONFIG_FPS=100;
2492 			break;
2493 
2494 		case SDLK_HOME:
2495 			vposy=0; lastposx=lastposz=vposx=vposz=-10; smooy=tposy=0; smoox=tposx=SQF; smooz=tposz=SQF;
2496 			smoou=0; uposy=0;
2497 			viewm();
2498 			break;
2499 
2500 		case SDLK_UP:
2501 			forwardkeybuf=1; backwardkeybuf=0; TDFSB_FUNC_IDLE=move;
2502 			break;
2503 		case SDLK_DOWN:
2504 			backwardkeybuf=1; forwardkeybuf=0; TDFSB_FUNC_IDLE=move;
2505 			break;
2506 		case SDLK_LEFT:
2507 			leftkeybuf=1; rightkeybuf=0; TDFSB_FUNC_IDLE=move;
2508 			break;
2509 		case SDLK_RIGHT:
2510 			rightkeybuf=1; leftkeybuf=0; TDFSB_FUNC_IDLE=move;
2511 			break;
2512 
2513 		case SDLK_PAGEUP:
2514 			upkeybuf=1; downkeybuf=0; TDFSB_FUNC_IDLE=move;
2515 			break;
2516 		case SDLK_PAGEDOWN:
2517 			downkeybuf=1; upkeybuf=0; TDFSB_FUNC_IDLE=move;
2518 			break;
2519 		case SDLK_END:
2520 			TDFSB_OA_DY=vposy/25;
2521 			TDFSB_ANIM_COUNT=25;
2522 			TDFSB_ANIM_STATE=1;
2523 			TDFSB_FUNC_IDLE=ground;
2524 			break;
2525 		case SDLK_RCTRL:
2526 			if (TDFSB_OBJECT_SELECTED )
2527 			{	stop_move();
2528 				TDFSB_OA=TDFSB_OBJECT_SELECTED;
2529 				TDFSB_OA_DX=(TDFSB_OA->posx-vposx)/100;
2530 				if (!((TDFSB_OA->mode)&0x20))   TDFSB_OA_DY=(TDFSB_OA->posy+TDFSB_OA->scaley+4-vposy)/100;
2531 				else                            TDFSB_OA_DY=(5-vposy)/100;
2532 				TDFSB_OA_DZ=(TDFSB_OA->posz-vposz)/100;
2533 				TDFSB_ANIM_STATE=1; TDFSB_OBJECT_SELECTED=NULL; TDFSB_OBJECT_SEARCH=0;
2534 				TDFSB_FUNC_KEY=keyboard; TDFSB_FUNC_UPKEY=keyboardup;  TDFSB_KEY_FINDER=0;
2535 				TDFSB_FUNC_IDLE=approach;
2536 			}
2537 			break;
2538                 case SDLK_RETURN:
2539                         if(TDFSB_OBJECT_SELECTED)
2540                         {       if((TDFSB_MPEG_FILE!=TDFSB_OBJECT_SELECTED)&&(TDFSB_OBJECT_SELECTED->regtype==3))
2541                                 {
2542                                     if(TDFSB_MP3_FILE)
2543                                     {
2544                                         SMPEG_stop(TDFSB_MP3_HANDLE);
2545                                         SMPEG_delete(TDFSB_MP3_HANDLE);
2546                                         TDFSB_MP3_FILE=NULL;
2547                                     }
2548                                     if(TDFSB_MPEG_FILE)
2549                                     {
2550                                         printf("MPEG Stop %s\n",TDFSB_MPEG_FILE->name);
2551                                         TDFSB_MPEG_FILE=NULL;
2552                                         SMPEG_stop(TDFSB_MPEG_HANDLE);
2553                                         SMPEG_delete(TDFSB_MPEG_HANDLE);
2554                                         SDL_FreeSurface(TDFSB_MPEG_SURFACE);
2555                                     }
2556                                     strcpy(fullpath,TDFSB_CURRENTPATH);
2557                                     if(strlen(fullpath)>1) strcat(fullpath,"/");
2558                                     strcat(fullpath,TDFSB_OBJECT_SELECTED->name);
2559                                     printf("MPEG Start %s\n",fullpath);
2560 
2561                                     TDFSB_MPEG_HANDLE = SMPEG_new(fullpath, &TDFSB_MPEG_INFO, 1);
2562                                     if ( SMPEG_error(TDFSB_MPEG_HANDLE) )
2563                                     {
2564                                         printf(" * small error, trying without audio\n");
2565                                         TDFSB_MPEG_HANDLE = SMPEG_new(fullpath, &TDFSB_MPEG_INFO, 0);
2566                                         if ( SMPEG_error(TDFSB_MPEG_HANDLE) )
2567                                         {
2568                                             printf("Error opening mpeg file (opening).\n");
2569                                             SMPEG_delete(TDFSB_MPEG_HANDLE);
2570                                             break;
2571                                         }
2572                                         SMPEG_enableaudio(TDFSB_MPEG_HANDLE,0);
2573                                         SMPEG_enablevideo(TDFSB_MPEG_HANDLE,1);
2574                                     }
2575                                     else
2576                                     {
2577                                         SMPEG_enableaudio(TDFSB_MPEG_HANDLE,1);
2578                                         SMPEG_enablevideo(TDFSB_MPEG_HANDLE,1);
2579                                     }
2580 
2581                                     if(!(TDFSB_MPEG_INFO.has_video))
2582                                     {   printf("Error opening mpeg file (info).\n");
2583                                         SMPEG_delete(TDFSB_MPEG_HANDLE);
2584                                         break;
2585                                     }
2586                                     TDFSB_MPEG_SURFACE = SDL_CreateRGBSurface( SDL_SWSURFACE, TDFSB_OBJECT_SELECTED->uniint0, TDFSB_OBJECT_SELECTED->uniint1, 32,
2587 #if SDL_BYTEORDER == SDL_LIL_ENDIAN
2588                                     0x000000FF,0x0000FF00,0x00FF0000,0xFF000000
2589 #else
2590                                     0xFF000000,0x00FF0000,0x0000FF00,0x000000FF
2591 #endif
2592                                     );
2593                                     TDFSB_MPEG_FRAMENO=1;
2594                                     SMPEG_setdisplay(TDFSB_MPEG_HANDLE, TDFSB_MPEG_SURFACE, 0,0);
2595 /*                                    SMPEG_setdisplayregion(TDFSB_MPEG_HANDLE,0,0,TDFSB_OBJECT_SELECTED->uniint0, TDFSB_OBJECT_SELECTED->uniint1);
2596 */                                    SMPEG_scaleXY(TDFSB_MPEG_HANDLE,TDFSB_OBJECT_SELECTED->uniint0, TDFSB_OBJECT_SELECTED->uniint1);
2597                                     SMPEG_renderFrame(TDFSB_MPEG_HANDLE, TDFSB_MPEG_FRAMENO);
2598 
2599                                     TDFSB_MPEG_FILE=TDFSB_OBJECT_SELECTED;
2600 
2601                                     SMPEG_loop(TDFSB_MPEG_HANDLE,1);
2602                                     SMPEG_play(TDFSB_MPEG_HANDLE);
2603                                 }
2604                                 else if((TDFSB_MPEG_FILE==TDFSB_OBJECT_SELECTED)&&(TDFSB_OBJECT_SELECTED->regtype==3))
2605                                 {
2606                                     SMPEG_stop(TDFSB_MPEG_HANDLE);
2607                                     printf("MPEG stop %s\n",TDFSB_MPEG_FILE->name);
2608                                     TDFSB_MPEG_FILE=NULL;
2609                                     SMPEG_delete(TDFSB_MPEG_HANDLE);
2610                                     SDL_FreeSurface(TDFSB_MPEG_SURFACE);
2611                                 }
2612                                 else if(TDFSB_OBJECT_SELECTED->regtype==6)
2613                                 {
2614                                     if(TDFSB_MP3_FILE==TDFSB_OBJECT_SELECTED)
2615                                     {
2616                                         SMPEG_stop(TDFSB_MP3_HANDLE);
2617                                         SMPEG_delete(TDFSB_MP3_HANDLE);
2618                                         TDFSB_MP3_FILE=NULL;
2619                                     }
2620                                     else
2621                                     {
2622                                         if(TDFSB_MPEG_FILE)
2623                                         {
2624                                             SMPEG_stop(TDFSB_MPEG_HANDLE);
2625                                             printf("MPEG Stop %s\n",TDFSB_MPEG_FILE->name);
2626                                             TDFSB_MPEG_FILE=NULL;
2627                                             SMPEG_delete(TDFSB_MPEG_HANDLE);
2628                                             SDL_FreeSurface(TDFSB_MPEG_SURFACE);
2629                                         }
2630                                         if(TDFSB_MP3_FILE)
2631                                         {
2632                                             printf("MP3 Stop %s\n",TDFSB_MP3_FILE->name);
2633                                             SMPEG_stop(TDFSB_MP3_HANDLE);
2634                                             SMPEG_delete(TDFSB_MP3_HANDLE);
2635                                             TDFSB_MP3_FILE=NULL;
2636                                         }
2637 
2638                                         strcpy(fullpath,TDFSB_CURRENTPATH);
2639                                         if(strlen(fullpath)>1) strcat(fullpath,"/");
2640                                         strcat(fullpath,TDFSB_OBJECT_SELECTED->name);
2641                                         printf("MP3 Start %s\n",fullpath);
2642                                         TDFSB_MP3_HANDLE = SMPEG_new(fullpath, &TDFSB_MPEG_INFO, 1);
2643                                         if ( SMPEG_error(TDFSB_MP3_HANDLE) )
2644                                         {   printf("Error opening mpeg file (opening).\n");
2645                                             SMPEG_delete(TDFSB_MP3_HANDLE);
2646                                             break;
2647                                         }
2648 
2649                                         SMPEG_enableaudio(TDFSB_MP3_HANDLE,1);
2650                                         SMPEG_enablevideo(TDFSB_MP3_HANDLE,0);
2651 
2652                                         SMPEG_loop(TDFSB_MP3_HANDLE,1);
2653                                         SMPEG_play(TDFSB_MP3_HANDLE);
2654 
2655                                         TDFSB_MP3_FILE=TDFSB_OBJECT_SELECTED;
2656 
2657                                     }
2658                                 }
2659                         }
2660 
2661 		default:
2662 			return(1);
2663 			break;
2664 		}
2665         }
2666 
2667 	return(0);
2668 }
2669 
specupkey(int key)2670 int specupkey (int key)
2671 {
2672         if (!TDFSB_ANIM_STATE)
2673         {
2674                 if(key==SDLK_UP)            { forwardkeybuf = 0; check_still(); }
2675                 else if(key==SDLK_DOWN)     { backwardkeybuf = 0; check_still(); }
2676                 else if(key==SDLK_LEFT)     { leftkeybuf = 0; check_still(); }
2677                 else if(key==SDLK_RIGHT)    { rightkeybuf = 0; check_still(); }
2678                 else if(key==SDLK_PAGEUP)  { upkeybuf = 0; check_still(); }
2679                 else if(key==SDLK_PAGEDOWN){ downkeybuf = 0; check_still(); }
2680                 else return(1);
2681 
2682                 return(0);
2683         }
2684 		else return(0);
2685 }
2686 
keyfinder(unsigned char key)2687 int keyfinder (unsigned char key)
2688 {
2689         TDFSB_KEY_FINDER=key;
2690         return(0);
2691 }
2692 
keyupfinder(unsigned char key)2693 int keyupfinder (unsigned char key)
2694 {
2695         TDFSB_KEY_FINDER=0;
2696         return(0);
2697 }
2698 
keyboardup(unsigned char key)2699 int keyboardup (unsigned char key)
2700 {
2701         if (!TDFSB_ANIM_STATE)
2702         {
2703                 if(key==TDFSB_KC_FORWARD)       { forwardkeybuf = 0; check_still(); }
2704                 else if(key==TDFSB_KC_BACKWARD) { backwardkeybuf = 0; check_still(); }
2705 				else if(key==TDFSB_KC_LEFT)     { leftkeybuf = 0; check_still(); }
2706                 else if(key==TDFSB_KC_RIGHT)    { rightkeybuf = 0; check_still(); }
2707 				else if(key==TDFSB_KC_UP)       { upkeybuf = 0; check_still(); }
2708 				else if(key==TDFSB_KC_DOWN)     { downkeybuf=0; check_still(); }
2709                 else return(1);
2710 
2711                 return(0);
2712         }
2713 		else return(0);
2714 }
2715 
keyboard(unsigned char key)2716 int keyboard (unsigned char key)
2717 {
2718 
2719         if (!TDFSB_ANIM_STATE)
2720         {
2721                 if (key==27)
2722 			{       printf("\nBye bye...\n\n");
2723 			        ende(0);
2724 			}
2725 
2726 
2727                 else if (key==TDFSB_KC_FLY)
2728                         {       TDFSB_MODE_FLY=1-TDFSB_MODE_FLY;
2729                                 if (TDFSB_MODE_FLY) strcpy(flybuf,"Flying: ON"); else strcpy(flybuf,"Flying:OFF");
2730                                 TDFSB_FLY_DISPLAY=100;
2731                         }
2732 
2733                 else if (key==TDFSB_KC_HELP)
2734                         {       TDFSB_SHOW_HELP = 1-TDFSB_SHOW_HELP;
2735                                 if (TDFSB_SHOW_HELP)    {       printf("\n=======================================\n");
2736                                                                 printf(help_str);
2737                                                                 printf("=======================================\n\n");
2738                                                         }
2739                         }
2740 
2741 		else if (key==TDFSB_KC_FS)
2742                         {
2743                                 if (TDFSB_FULLSCREEN)
2744 			        {
2745                                     if( (window=SDL_SetVideoMode( aSWX, aSWY, bpp, SDL_OPENGL|SDL_RESIZABLE )) == 0 )
2746                                     {   printf("SDL ERROR Video mode set failed: %s\n", SDL_GetError() );
2747                                         ende(1);
2748                                     }
2749                                     reshape(window->w,window->h);
2750                                     TDFSB_CONFIG_FULLSCREEN=0;
2751 
2752                                 }
2753 			        else
2754 			        {   aSWX=SWX; aSWY=SWY;
2755 		        	    if( (window=SDL_SetVideoMode( PWX, PWY, PWD, SDL_OPENGL|SDL_FULLSCREEN )) == 0 )
2756                                     {   printf("SDL ERROR Video mode set failed: %s\n", SDL_GetError() );
2757                                         ende(1);
2758                                     }
2759                                     reshape(window->w,window->h);
2760                                     TDFSB_CONFIG_FULLSCREEN=1;
2761                                 }
2762 			        TDFSB_FULLSCREEN=1-TDFSB_FULLSCREEN;
2763 		        }
2764 
2765 		else if (key==TDFSB_KC_DOT)
2766                         {       TDFSB_SHOW_DOTFILES = 1 - TDFSB_SHOW_DOTFILES;
2767         			TDFSB_FUNC_IDLE=nullDisplay;
2768 	        		TDFSB_FUNC_DISP=noDisplay;
2769 		        }
2770 
2771 		else if (key==TDFSB_KC_RELM)
2772                         {
2773 			        if (TDFSB_HAVE_MOUSE)
2774 			        {       TDFSB_HAVE_MOUSE=0; TDFSB_FUNC_MOUSE=NULL; TDFSB_FUNC_MOTION=NULL; SDL_ShowCursor(SDL_ENABLE);
2775                                 }
2776 			        else
2777 			        {       SDL_WarpMouse(SWX/2,SWY/2); smoox=tposx; smooy=tposy; smooz=tposz;
2778 			                TDFSB_FUNC_MOUSE=mouse; TDFSB_FUNC_MOTION=MouseMove;  SDL_ShowCursor(SDL_DISABLE); TDFSB_HAVE_MOUSE=1;
2779                                 }
2780 			}
2781 
2782 		else if (key==TDFSB_KC_RL)
2783                         {       TDFSB_FUNC_IDLE=nullDisplay;
2784                                 TDFSB_FUNC_DISP=noDisplay;
2785 			}
2786 
2787 		else if (key==TDFSB_KC_CDU)
2788 			{
2789                             strcat(TDFSB_CURRENTPATH,"/.."); temp_trunc[0]=0;
2790                             if(realpath(TDFSB_CURRENTPATH,&temp_trunc[0])!=&temp_trunc[0])
2791                             {
2792                                 printf("Cannot resolve path \"%s\".\n",TDFSB_CURRENTPATH); ende(1);
2793                             }
2794                             else
2795                             {
2796                                 strcpy(TDFSB_CURRENTPATH,temp_trunc);
2797                                 TDFSB_FUNC_IDLE=nullDisplay; TDFSB_FUNC_DISP=noDisplay;
2798                                 return(0);
2799                             }
2800 			    TDFSB_FUNC_IDLE=nullDisplay;
2801                             TDFSB_FUNC_DISP=noDisplay;
2802                         }
2803 
2804 		else if (key==TDFSB_KC_IMBR)
2805                         {
2806 			        if (TDFSB_ICUBE==1) { TDFSB_ICUBE=0;  }
2807 			        else { TDFSB_ICUBE=1;	}
2808 			        TDFSB_FUNC_IDLE=nullDisplay;TDFSB_FUNC_DISP=noDisplay;
2809 			}
2810 
2811 		else if (key==TDFSB_KC_INFO)
2812                         {       printf("\n");
2813 			        printf("GL_RENDERER   = %s\n", (char *) glGetString(GL_RENDERER));
2814                                 printf("GL_VERSION    = %s\n", (char *) glGetString(GL_VERSION));
2815                                 printf("GL_VENDOR     = %s\n", (char *) glGetString(GL_VENDOR));
2816                                 printf("GL_EXTENSIONS = %s\n", (char *) glGetString(GL_EXTENSIONS));
2817                                 printf("\n");
2818                                 printf("Max Texture %d x %d \n",(int)TDFSB_MAX_TEX_SIZE,(int)TDFSB_MAX_TEX_SIZE);
2819                                 printf("\n");
2820                         }
2821 
2822 		else if (key==TDFSB_KC_DISP)
2823                         {       if      (TDFSB_SHOW_DISPLAY==1)	{ TDFSB_SHOW_DISPLAY=2; TDFSB_XL_DISPLAY=0;  TDFSB_SPEED_DISPLAY=200;   }
2824 			        else if (TDFSB_SHOW_DISPLAY==2) { TDFSB_SHOW_DISPLAY=3; TDFSB_XL_DISPLAY=45; TDFSB_SPEED_DISPLAY=200;   }
2825   			        else if (TDFSB_SHOW_DISPLAY==3) { TDFSB_SHOW_DISPLAY=0; TDFSB_XL_DISPLAY=0;                             }
2826 			        else                            { TDFSB_SHOW_DISPLAY=1; TDFSB_XL_DISPLAY=0;  TDFSB_SPEED_DISPLAY=200;   }
2827                         }
2828 
2829 		else if (key==TDFSB_KC_CRH)
2830                         {       TDFSB_SHOW_CROSSHAIR = 1 - TDFSB_SHOW_CROSSHAIR;
2831 			}
2832 
2833 		else if (key==TDFSB_KC_FPS)
2834                         {
2835 			        TDFSB_SHOW_FPS = 1 - TDFSB_SHOW_FPS;
2836                                 if (TDFSB_SHOW_FPS)     { sprintf(fpsbuf,"FPS: <wait>"); TDFSB_FPS_DISP=0; TDFSB_TIMER_ID=SDL_AddTimer(TDFSB_FPS_DT,(SDL_NewTimerCallback)fps_timer,0); }
2837                                 else                    { SDL_RemoveTimer(TDFSB_TIMER_ID); }
2838 			}
2839 
2840 		else if (key==TDFSB_KC_GCR)
2841 			{       TDFSB_GROUND_CROSS = 1 - TDFSB_GROUND_CROSS;
2842 			}
2843 
2844 		else if (key==TDFSB_KC_SHD)
2845                         {        if ( TDFSB_SHADE==1)
2846 			        { glShadeModel(GL_FLAT); TDFSB_SHADE=0;  }
2847 			        else
2848 			        { glShadeModel(GL_SMOOTH); TDFSB_SHADE=1;  }
2849 			}
2850 
2851 		else if (key==TDFSB_KC_NAME)
2852                         {       TDFSB_FILENAMES++;
2853                                 if (TDFSB_FILENAMES==3)	TDFSB_FILENAMES=0;
2854 			}
2855 
2856                 else if (key==TDFSB_KC_SORT)
2857                         {       TDFSB_DIR_ALPHASORT = 1 - TDFSB_DIR_ALPHASORT;
2858                                 TDFSB_FUNC_IDLE=nullDisplay;
2859 			        TDFSB_FUNC_DISP=noDisplay;
2860                         }
2861 
2862                 else if (key==TDFSB_KC_HOME)
2863                         {
2864                                 strcpy(TDFSB_CURRENTPATH,home);
2865                                 TDFSB_FUNC_IDLE=nullDisplay;
2866                                 TDFSB_FUNC_DISP=noDisplay;
2867                         }
2868 
2869                 else if (key==TDFSB_KC_CLASS)
2870                         {
2871                                 TDFSB_CLASSIC_NAV=1-TDFSB_CLASSIC_NAV;
2872                                 if (TDFSB_CLASSIC_NAV) strcpy(classicbuf,"Classic: ON"); else strcpy(classicbuf,"Classic:OFF");
2873                                 TDFSB_CLASSIC_DISPLAY=100;
2874                         }
2875                 else if (key==TDFSB_KC_SAVE)
2876                         {
2877                                 save_config();
2878                         }
2879 
2880                 else if (key==TDFSB_KC_FTH)
2881                         {
2882                                 if (TDFSB_FPS_CONFIG)   { strcpy(throttlebuf,"Throttle:OFF"); TDFSB_FPS_CACHE=TDFSB_FPS_CONFIG; TDFSB_FPS_CONFIG=0; }
2883                                 else                    { strcpy(throttlebuf,"Throttle: ON"); TDFSB_FPS_CONFIG=TDFSB_FPS_CACHE; }
2884 
2885                                 if (TDFSB_FPS_CONFIG)   strcpy(throttlebuf,"Throttle: ON");
2886                                 else                    strcpy(throttlebuf,"Throttle:OFF");
2887 
2888                                 sprintf(cfpsbuf,"MaxFPS: %d",TDFSB_FPS_CONFIG);
2889                                 TDFSB_SHOW_CONFIG_FPS=100;
2890                                 TDFSB_SHOW_THROTTLE=100;
2891                         }
2892 
2893                 else if (key==TDFSB_KC_FORWARD) {       forwardkeybuf = 1; backwardkeybuf = 0;  TDFSB_FUNC_IDLE=move; }
2894                 else if (key==TDFSB_KC_BACKWARD){       backwardkeybuf = 1; forwardkeybuf = 0;  TDFSB_FUNC_IDLE=move; }
2895                 else if (key==TDFSB_KC_UP)      {       upkeybuf = 1; downkeybuf = 0;       TDFSB_FUNC_IDLE=move; }
2896                 else if (key==TDFSB_KC_DOWN)    {       downkeybuf = 1; upkeybuf = 0;       TDFSB_FUNC_IDLE=move; }
2897                 else if (key==TDFSB_KC_LEFT)    {       leftkeybuf = 1; rightkeybuf = 0;    TDFSB_FUNC_IDLE=move; }
2898                 else if (key==TDFSB_KC_RIGHT)   {       rightkeybuf = 1; leftkeybuf = 0;    TDFSB_FUNC_IDLE=move; }
2899 
2900                 else return(1);
2901 
2902                 return(0);
2903 
2904         }
2905 		else return(0);
2906 }
2907 
main(int argc,char ** argv)2908 int main (int argc, char** argv)
2909 {
2910 	int fake_glut_argc;
2911 
2912         if (argc>3)
2913         {
2914             printf("Wrong args(3).\n"); exit(0);
2915         }
2916         else if (argc==2)
2917         {
2918             if (( !strcmp(argv[1],"--version") || !strcmp(argv[1],"-V") ))
2919                 { printf ("TDFSB 0.0.10\n"); exit(0); }
2920             else
2921                 { printf ("Wrong args(1).\n"); exit(0); }
2922         }
2923 
2924         SWX=SWY=PWX=PWY=0; TDFSB_CURRENTPATH[0]=0;
2925 
2926 	fake_glut_argc=1;
2927 	glutInit(&fake_glut_argc,argv);
2928 
2929         set_filetypes();
2930         setup_kc();
2931         if (setup_config()) setup_config();
2932         setup_help();
2933 
2934         if (argc==3)
2935         {
2936             if(( !strcmp(argv[1],"--dir") || !strcmp(argv[1],"-D") ))
2937             {
2938                 if(realpath(argv[2],&temp_trunc[0])!=&temp_trunc[0])
2939                     if(realpath(home,&temp_trunc[0])!=&temp_trunc[0])
2940                         strcpy(&temp_trunc[0],"/");
2941                 strcpy(TDFSB_CURRENTPATH,temp_trunc);
2942             }
2943             else
2944                 { printf ("Wrong args(2).\n"); exit(0); }
2945         }
2946 
2947         if(strlen(TDFSB_CURRENTPATH)<1)
2948             if(realpath(home,&temp_trunc[0])!=&temp_trunc[0])
2949                 strcpy(&temp_trunc[0],"/");
2950         strcpy(TDFSB_CURRENTPATH,temp_trunc);
2951 
2952         if( SDL_Init( SDL_INIT_VIDEO|SDL_INIT_TIMER ) < 0 )
2953         {       printf("SDL ERROR Video initialization failed: %s\n", SDL_GetError() );
2954                 ende(1);
2955         }
2956 
2957         info = SDL_GetVideoInfo();
2958         if( !info )
2959         {       printf("SDL ERROR Video query failed: %s\n", SDL_GetError() );
2960                 ende(1);
2961         }
2962 
2963         bpp = info->vfmt->BitsPerPixel;
2964         if (!PWD) PWD=bpp;
2965         switch (bpp) {
2966             case 8:
2967                 rgb_size[0]=2;rgb_size[1]=3;rgb_size[2]=3;break;
2968             case 15:
2969             case 16:
2970                 rgb_size[0]=5;rgb_size[1]=5;rgb_size[2]=5;break;
2971             default:
2972                 rgb_size[0]=8;rgb_size[1]=8;rgb_size[2]=8;break;
2973         }
2974 
2975         SDL_GL_SetAttribute( SDL_GL_RED_SIZE,  rgb_size[0] );
2976         SDL_GL_SetAttribute( SDL_GL_GREEN_SIZE,rgb_size[1] );
2977         SDL_GL_SetAttribute( SDL_GL_BLUE_SIZE, rgb_size[2] );
2978         SDL_GL_SetAttribute( SDL_GL_DEPTH_SIZE, 16 );
2979         SDL_GL_SetAttribute( SDL_GL_DOUBLEBUFFER,1 );
2980 
2981         if( (window=SDL_SetVideoMode( SWX, SWY, bpp, SDL_OPENGL|SDL_RESIZABLE )) == 0 )
2982         {       printf("SDL ERROR Video mode set failed: %s\n", SDL_GetError() );
2983                 ende(1);
2984         }
2985 
2986         SDL_WarpMouse(SWX/2,SWY/2);
2987 
2988         SDL_EnableUNICODE(1);
2989         SDL_EnableKeyRepeat(0,0);
2990         SDL_ShowCursor(SDL_DISABLE);
2991 
2992         TDFSB_FUNC_IDLE=startstillDisplay;
2993         TDFSB_FUNC_DISP=display;
2994         TDFSB_FUNC_MOTION=MouseMove;
2995         TDFSB_FUNC_MOUSE=mouse;
2996         TDFSB_FUNC_KEY=keyboard;
2997         TDFSB_FUNC_UPKEY=keyboardup;
2998 
2999         glGetIntegerv(GL_MAX_TEXTURE_SIZE,&temp);
3000         if (TDFSB_MAX_TEX_SIZE>temp||TDFSB_MAX_TEX_SIZE==0) TDFSB_MAX_TEX_SIZE=temp;
3001 
3002 
3003 	glViewport(0,0,SWX,SWY);
3004 
3005 	init();
3006 
3007 	leodir();
3008 
3009         while(1)
3010         {
3011             TDFSB_FUNC_IDLE();
3012             while( SDL_PollEvent( &event ) )
3013             {   switch( event.type )
3014                 {       case SDL_QUIT:
3015                             ende (0);
3016                             break;
3017                         case SDL_VIDEORESIZE:
3018                             if( (window=SDL_SetVideoMode( event.resize.w ,event.resize.h , bpp, SDL_OPENGL|SDL_RESIZABLE )) == 0 )
3019                             {       printf("SDL ERROR Video mode set failed: %s\n", SDL_GetError() );
3020                                     ende(1);
3021                             }
3022                             reshape(event.resize.w,event.resize.h);
3023                             break;
3024                         case SDL_MOUSEMOTION:
3025                             if(TDFSB_FUNC_MOTION) TDFSB_FUNC_MOTION(event.motion.x,event.motion.y);
3026                             break;
3027                         case SDL_MOUSEBUTTONDOWN:
3028                         case SDL_MOUSEBUTTONUP:
3029                             if(TDFSB_FUNC_MOUSE) TDFSB_FUNC_MOUSE(event.button.button, event.button.state, event.button.x, event.button.y);
3030                             break;
3031                         case SDL_KEYDOWN:
3032                             if (speckey(event.key.keysym.sym))
3033                                 TDFSB_FUNC_KEY  ((unsigned char)(event.key.keysym.unicode & 0x7F));
3034                             break;
3035                         case SDL_KEYUP:
3036                             if (specupkey(event.key.keysym.sym))
3037                                 TDFSB_FUNC_UPKEY((unsigned char)(event.key.keysym.unicode & 0x7F));
3038                             break;
3039                         default:
3040                             break;
3041                 }
3042             }
3043         }
3044 
3045 	return (0);
3046 }
3047