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(<ime,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