1 /*
2 Copyright (C) 1996-1997 Id Software, Inc.
3
4 This program is free software; you can redistribute it and/or
5 modify it under the terms of the GNU General Public License
6 as published by the Free Software Foundation; either version 2
7 of the License, or (at your option) any later version.
8
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
12
13 See the GNU General Public License for more details.
14
15 You should have received a copy of the GNU General Public License
16 along with this program; if not, write to the Free Software
17 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
18
19 */
20 #include <termios.h>
21 #include <sys/ioctl.h>
22 #include <sys/stat.h>
23 #include <sys/vt.h>
24 #include <stdarg.h>
25 #include <stdio.h>
26 #include <signal.h>
27
28 #include <asm/io.h>
29
30 #include "vga.h"
31 #include "vgakeyboard.h"
32 #include "vgamouse.h"
33
34 #include "quakedef.h"
35 #include "GL/fxmesa.h"
36
37 #define WARP_WIDTH 320
38 #define WARP_HEIGHT 200
39
40 static fxMesaContext fc = NULL;
41 #define stringify(m) { #m, m }
42
43 unsigned short d_8to16table[256];
44 unsigned d_8to24table[256];
45 unsigned char d_15to8table[65536];
46
47 int num_shades=32;
48
49 struct
50 {
51 char *name;
52 int num;
53 } mice[] =
54 {
55 stringify(MOUSE_MICROSOFT),
56 stringify(MOUSE_MOUSESYSTEMS),
57 stringify(MOUSE_MMSERIES),
58 stringify(MOUSE_LOGITECH),
59 stringify(MOUSE_BUSMOUSE),
60 stringify(MOUSE_PS2),
61 };
62
63 static unsigned char scantokey[128];
64
65 int num_mice = sizeof (mice) / sizeof(mice[0]);
66
67 int d_con_indirect = 0;
68
69 int svgalib_inited=0;
70 int UseMouse = 1;
71 int UseKeyboard = 1;
72
73 int mouserate = MOUSE_DEFAULTSAMPLERATE;
74
75 cvar_t _windowed_mouse = {"_windowed_mouse","0", true};
76
77 cvar_t vid_mode = {"vid_mode","5",false};
78 cvar_t vid_redrawfull = {"vid_redrawfull","0",false};
79 cvar_t vid_waitforrefresh = {"vid_waitforrefresh","0",true};
80
81 char *framebuffer_ptr;
82
83 cvar_t mouse_button_commands[3] =
84 {
85 {"mouse1","+attack"},
86 {"mouse2","+strafe"},
87 {"mouse3","+forward"},
88 };
89
90 int mouse_buttons;
91 int mouse_buttonstate;
92 int mouse_oldbuttonstate;
93 float mouse_x, mouse_y;
94 float old_mouse_x, old_mouse_y;
95 int mx, my;
96
97 cvar_t m_filter = {"m_filter","1"};
98
99 int scr_width, scr_height;
100
101 /*-----------------------------------------------------------------------*/
102
103 //int texture_mode = GL_NEAREST;
104 //int texture_mode = GL_NEAREST_MIPMAP_NEAREST;
105 //int texture_mode = GL_NEAREST_MIPMAP_LINEAR;
106 int texture_mode = GL_LINEAR;
107 //int texture_mode = GL_LINEAR_MIPMAP_NEAREST;
108 //int texture_mode = GL_LINEAR_MIPMAP_LINEAR;
109
110 int texture_extension_number = 1;
111
112 float gldepthmin, gldepthmax;
113
114 cvar_t gl_ztrick = {"gl_ztrick","1"};
115
116 const char *gl_vendor;
117 const char *gl_renderer;
118 const char *gl_version;
119 const char *gl_extensions;
120
121 qboolean is8bit = false;
122 qboolean isPermedia = false;
123 qboolean gl_mtexable = false;
124
125 /*-----------------------------------------------------------------------*/
D_BeginDirectRect(int x,int y,byte * pbitmap,int width,int height)126 void D_BeginDirectRect (int x, int y, byte *pbitmap, int width, int height)
127 {
128 }
129
D_EndDirectRect(int x,int y,int width,int height)130 void D_EndDirectRect (int x, int y, int width, int height)
131 {
132 }
133
matchmouse(int mouse,char * name)134 int matchmouse(int mouse, char *name)
135 {
136 int i;
137 for (i=0 ; i<num_mice ; i++)
138 if (!strcmp(mice[i].name, name))
139 return i;
140 return mouse;
141 }
142
143 #if 0
144
145 void vtswitch(int newconsole)
146 {
147
148 int fd;
149 struct vt_stat x;
150
151 // switch consoles and wait until reactivated
152 fd = open("/dev/console", O_RDONLY);
153 ioctl(fd, VT_GETSTATE, &x);
154 ioctl(fd, VT_ACTIVATE, newconsole);
155 ioctl(fd, VT_WAITACTIVE, x.v_active);
156 close(fd);
157
158 }
159
160 #endif
161
keyhandler(int scancode,int state)162 void keyhandler(int scancode, int state)
163 {
164
165 int sc;
166
167 sc = scancode & 0x7f;
168
169 Key_Event(scantokey[sc], state == KEY_EVENTPRESS);
170
171 }
172
VID_Shutdown(void)173 void VID_Shutdown(void)
174 {
175 if (!fc)
176 return;
177
178 fxMesaDestroyContext(fc);
179
180 if (UseKeyboard)
181 keyboard_close();
182 }
183
signal_handler(int sig)184 void signal_handler(int sig)
185 {
186 printf("Received signal %d, exiting...\n", sig);
187 Sys_Quit();
188 exit(0);
189 }
190
InitSig(void)191 void InitSig(void)
192 {
193 signal(SIGHUP, signal_handler);
194 signal(SIGINT, signal_handler);
195 signal(SIGQUIT, signal_handler);
196 signal(SIGILL, signal_handler);
197 signal(SIGTRAP, signal_handler);
198 signal(SIGIOT, signal_handler);
199 signal(SIGBUS, signal_handler);
200 signal(SIGFPE, signal_handler);
201 signal(SIGSEGV, signal_handler);
202 signal(SIGTERM, signal_handler);
203 }
204
VID_ShiftPalette(unsigned char * p)205 void VID_ShiftPalette(unsigned char *p)
206 {
207 // VID_SetPalette(p);
208 }
209
VID_SetPalette(unsigned char * palette)210 void VID_SetPalette (unsigned char *palette)
211 {
212 byte *pal;
213 unsigned r,g,b;
214 unsigned v;
215 int r1,g1,b1;
216 int k;
217 unsigned short i;
218 unsigned *table;
219 FILE *f;
220 char s[255];
221 float dist, bestdist;
222 static qboolean palflag = false;
223
224 //
225 // 8 8 8 encoding
226 //
227 Con_Printf("Converting 8to24\n");
228
229 pal = palette;
230 table = d_8to24table;
231 for (i=0 ; i<256 ; i++)
232 {
233 r = pal[0];
234 g = pal[1];
235 b = pal[2];
236 pal += 3;
237
238 // v = (255<<24) + (r<<16) + (g<<8) + (b<<0);
239 // v = (255<<0) + (r<<8) + (g<<16) + (b<<24);
240 v = (255<<24) + (r<<0) + (g<<8) + (b<<16);
241 *table++ = v;
242 }
243 d_8to24table[255] &= 0xffffff; // 255 is transparent
244
245 // JACK: 3D distance calcs - k is last closest, l is the distance.
246 // FIXME: Precalculate this and cache to disk.
247 if (palflag)
248 return;
249 palflag = true;
250
251 COM_FOpenFile("glquake/15to8.pal", &f);
252 if (f) {
253 fread(d_15to8table, 1<<15, 1, f);
254 fclose(f);
255 } else {
256 for (i=0; i < (1<<15); i++) {
257 /* Maps
258 000000000000000
259 000000000011111 = Red = 0x1F
260 000001111100000 = Blue = 0x03E0
261 111110000000000 = Grn = 0x7C00
262 */
263 r = ((i & 0x1F) << 3)+4;
264 g = ((i & 0x03E0) >> 2)+4;
265 b = ((i & 0x7C00) >> 7)+4;
266 pal = (unsigned char *)d_8to24table;
267 for (v=0,k=0,bestdist=10000.0; v<256; v++,pal+=4) {
268 r1 = (int)r - (int)pal[0];
269 g1 = (int)g - (int)pal[1];
270 b1 = (int)b - (int)pal[2];
271 dist = sqrt(((r1*r1)+(g1*g1)+(b1*b1)));
272 if (dist < bestdist) {
273 k=v;
274 bestdist = dist;
275 }
276 }
277 d_15to8table[i]=k;
278 }
279 sprintf(s, "%s/glquake", com_gamedir);
280 Sys_mkdir (s);
281 sprintf(s, "%s/glquake/15to8.pal", com_gamedir);
282 if ((f = fopen(s, "wb")) != NULL) {
283 fwrite(d_15to8table, 1<<15, 1, f);
284 fclose(f);
285 }
286 }
287 }
288
289 /*
290 ===============
291 GL_Init
292 ===============
293 */
GL_Init(void)294 void GL_Init (void)
295 {
296 gl_vendor = glGetString (GL_VENDOR);
297 Con_Printf ("GL_VENDOR: %s\n", gl_vendor);
298 gl_renderer = glGetString (GL_RENDERER);
299 Con_Printf ("GL_RENDERER: %s\n", gl_renderer);
300
301 gl_version = glGetString (GL_VERSION);
302 Con_Printf ("GL_VERSION: %s\n", gl_version);
303 gl_extensions = glGetString (GL_EXTENSIONS);
304 Con_Printf ("GL_EXTENSIONS: %s\n", gl_extensions);
305
306 // Con_Printf ("%s %s\n", gl_renderer, gl_version);
307
308 glClearColor (1,0,0,0);
309 glCullFace(GL_FRONT);
310 glEnable(GL_TEXTURE_2D);
311
312 glEnable(GL_ALPHA_TEST);
313 glAlphaFunc(GL_GREATER, 0.666);
314
315 glPolygonMode (GL_FRONT_AND_BACK, GL_FILL);
316 glShadeModel (GL_FLAT);
317
318 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
319 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
320 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
321 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
322
323 glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
324
325 // glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
326 glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
327 }
328
329 /*
330 =================
331 GL_BeginRendering
332
333 =================
334 */
GL_BeginRendering(int * x,int * y,int * width,int * height)335 void GL_BeginRendering (int *x, int *y, int *width, int *height)
336 {
337 extern cvar_t gl_clear;
338
339 *x = *y = 0;
340 *width = scr_width;
341 *height = scr_height;
342
343 // if (!wglMakeCurrent( maindc, baseRC ))
344 // Sys_Error ("wglMakeCurrent failed");
345
346 // glViewport (*x, *y, *width, *height);
347 }
348
349
GL_EndRendering(void)350 void GL_EndRendering (void)
351 {
352 glFlush();
353 fxMesaSwapBuffers();
354 }
355
Init_KBD(void)356 void Init_KBD(void)
357 {
358 int i;
359
360 if (COM_CheckParm("-nokbd")) UseKeyboard = 0;
361
362 if (UseKeyboard)
363 {
364 for (i=0 ; i<128 ; i++)
365 scantokey[i] = ' ';
366
367 scantokey[42] = K_SHIFT;
368 scantokey[54] = K_SHIFT;
369 scantokey[72] = K_UPARROW;
370 scantokey[103] = K_UPARROW;
371 scantokey[80] = K_DOWNARROW;
372 scantokey[108] = K_DOWNARROW;
373 scantokey[75] = K_LEFTARROW;
374 scantokey[105] = K_LEFTARROW;
375 scantokey[77] = K_RIGHTARROW;
376 scantokey[106] = K_RIGHTARROW;
377 scantokey[29] = K_CTRL;
378 scantokey[97] = K_CTRL;
379 scantokey[56] = K_ALT;
380 scantokey[100] = K_ALT;
381 // scantokey[58] = JK_CAPS;
382 // scantokey[69] = JK_NUM_LOCK;
383 scantokey[71] = K_HOME;
384 scantokey[73] = K_PGUP;
385 scantokey[79] = K_END;
386 scantokey[81] = K_PGDN;
387 scantokey[82] = K_INS;
388 scantokey[83] = K_DEL;
389 scantokey[1 ] = K_ESCAPE;
390 scantokey[28] = K_ENTER;
391 scantokey[15] = K_TAB;
392 scantokey[14] = K_BACKSPACE;
393 scantokey[119] = K_PAUSE;
394 scantokey[57] = ' ';
395
396 scantokey[102] = K_HOME;
397 scantokey[104] = K_PGUP;
398 scantokey[107] = K_END;
399 scantokey[109] = K_PGDN;
400 scantokey[110] = K_INS;
401 scantokey[111] = K_DEL;
402
403 scantokey[2] = '1';
404 scantokey[3] = '2';
405 scantokey[4] = '3';
406 scantokey[5] = '4';
407 scantokey[6] = '5';
408 scantokey[7] = '6';
409 scantokey[8] = '7';
410 scantokey[9] = '8';
411 scantokey[10] = '9';
412 scantokey[11] = '0';
413 scantokey[12] = '-';
414 scantokey[13] = '=';
415 scantokey[41] = '`';
416 scantokey[26] = '[';
417 scantokey[27] = ']';
418 scantokey[39] = ';';
419 scantokey[40] = '\'';
420 scantokey[51] = ',';
421 scantokey[52] = '.';
422 scantokey[53] = '/';
423 scantokey[43] = '\\';
424
425 scantokey[59] = K_F1;
426 scantokey[60] = K_F2;
427 scantokey[61] = K_F3;
428 scantokey[62] = K_F4;
429 scantokey[63] = K_F5;
430 scantokey[64] = K_F6;
431 scantokey[65] = K_F7;
432 scantokey[66] = K_F8;
433 scantokey[67] = K_F9;
434 scantokey[68] = K_F10;
435 scantokey[87] = K_F11;
436 scantokey[88] = K_F12;
437 scantokey[30] = 'a';
438 scantokey[48] = 'b';
439 scantokey[46] = 'c';
440 scantokey[32] = 'd';
441 scantokey[18] = 'e';
442 scantokey[33] = 'f';
443 scantokey[34] = 'g';
444 scantokey[35] = 'h';
445 scantokey[23] = 'i';
446 scantokey[36] = 'j';
447 scantokey[37] = 'k';
448 scantokey[38] = 'l';
449 scantokey[50] = 'm';
450 scantokey[49] = 'n';
451 scantokey[24] = 'o';
452 scantokey[25] = 'p';
453 scantokey[16] = 'q';
454 scantokey[19] = 'r';
455 scantokey[31] = 's';
456 scantokey[20] = 't';
457 scantokey[22] = 'u';
458 scantokey[47] = 'v';
459 scantokey[17] = 'w';
460 scantokey[45] = 'x';
461 scantokey[21] = 'y';
462 scantokey[44] = 'z';
463
464 scantokey[78] = '+';
465 scantokey[74] = '-';
466
467 if (keyboard_init())
468 Sys_Error("keyboard_init() failed");
469 keyboard_seteventhandler(keyhandler);
470 }
471 }
472
473 #define NUM_RESOLUTIONS 3
474
475 static resolutions[NUM_RESOLUTIONS][3]={
476 { 512, 384, GR_RESOLUTION_512x384 },
477 { 640, 400, GR_RESOLUTION_640x400 },
478 { 640, 480, GR_RESOLUTION_640x480 }
479 };
480
findres(int * width,int * height)481 int findres(int *width, int *height)
482 {
483 int i;
484
485 for(i=0;i<NUM_RESOLUTIONS;i++)
486 if((*width<=resolutions[i][0]) && (*height<=resolutions[i][1])) {
487 *width = resolutions[i][0];
488 *height = resolutions[i][1];
489 return resolutions[i][2];
490 }
491
492 *width = 640;
493 *height = 480;
494 return GR_RESOLUTION_640x480;
495 }
496
VID_Is8bit(void)497 qboolean VID_Is8bit(void)
498 {
499 return is8bit;
500 }
501
502 #ifdef GL_EXT_SHARED
VID_Init8bitPalette()503 void VID_Init8bitPalette()
504 {
505 // Check for 8bit Extensions and initialize them.
506 int i;
507 char thePalette[256*3];
508 char *oldPalette, *newPalette;
509
510 if (strstr(gl_extensions, "GL_EXT_shared_texture_palette") == NULL)
511 return;
512
513 Con_SafePrintf("8-bit GL extensions enabled.\n");
514 glEnable( GL_SHARED_TEXTURE_PALETTE_EXT );
515 oldPalette = (char *) d_8to24table; //d_8to24table3dfx;
516 newPalette = thePalette;
517 for (i=0;i<256;i++) {
518 *newPalette++ = *oldPalette++;
519 *newPalette++ = *oldPalette++;
520 *newPalette++ = *oldPalette++;
521 oldPalette++;
522 }
523 glColorTableEXT(GL_SHARED_TEXTURE_PALETTE_EXT, GL_RGB, 256, GL_RGB, GL_UNSIGNED_BYTE, (void *) thePalette);
524 is8bit = true;
525 }
526
527 #else
528 extern void gl3DfxSetPaletteEXT(GLuint *pal);
529
VID_Init8bitPalette(void)530 void VID_Init8bitPalette(void)
531 {
532 // Check for 8bit Extensions and initialize them.
533 int i;
534 GLubyte table[256][4];
535 char *oldpal;
536
537 if (strstr(gl_extensions, "3DFX_set_global_palette") == NULL)
538 return;
539
540 Con_SafePrintf("8-bit GL extensions enabled.\n");
541 glEnable( GL_SHARED_TEXTURE_PALETTE_EXT );
542 oldpal = (char *) d_8to24table; //d_8to24table3dfx;
543 for (i=0;i<256;i++) {
544 table[i][2] = *oldpal++;
545 table[i][1] = *oldpal++;
546 table[i][0] = *oldpal++;
547 table[i][3] = 255;
548 oldpal++;
549 }
550 gl3DfxSetPaletteEXT((GLuint *)table);
551 is8bit = true;
552 }
553 #endif
554
VID_Init(unsigned char * palette)555 void VID_Init(unsigned char *palette)
556 {
557 int i;
558 GLint attribs[32];
559 char gldir[MAX_OSPATH];
560 int width = 640, height = 480;
561
562 S_Init();
563
564 Init_KBD();
565
566 Cvar_RegisterVariable (&vid_mode);
567 Cvar_RegisterVariable (&vid_redrawfull);
568 Cvar_RegisterVariable (&vid_waitforrefresh);
569 Cvar_RegisterVariable (&gl_ztrick);
570
571 vid.maxwarpwidth = WARP_WIDTH;
572 vid.maxwarpheight = WARP_HEIGHT;
573 vid.colormap = host_colormap;
574 vid.fullbright = 256 - LittleLong (*((int *)vid.colormap + 2048));
575
576 // interpret command-line params
577
578 // set vid parameters
579 attribs[0] = FXMESA_DOUBLEBUFFER;
580 attribs[1] = FXMESA_ALPHA_SIZE;
581 attribs[2] = 1;
582 attribs[3] = FXMESA_DEPTH_SIZE;
583 attribs[4] = 1;
584 attribs[5] = FXMESA_NONE;
585
586 if ((i = COM_CheckParm("-width")) != 0)
587 width = atoi(com_argv[i+1]);
588 if ((i = COM_CheckParm("-height")) != 0)
589 height = atoi(com_argv[i+1]);
590
591 if ((i = COM_CheckParm("-conwidth")) != 0)
592 vid.conwidth = Q_atoi(com_argv[i+1]);
593 else
594 vid.conwidth = 640;
595
596 vid.conwidth &= 0xfff8; // make it a multiple of eight
597
598 if (vid.conwidth < 320)
599 vid.conwidth = 320;
600
601 // pick a conheight that matches with correct aspect
602 vid.conheight = vid.conwidth*3 / 4;
603
604 if ((i = COM_CheckParm("-conheight")) != 0)
605 vid.conheight = Q_atoi(com_argv[i+1]);
606 if (vid.conheight < 200)
607 vid.conheight = 200;
608
609 fc = fxMesaCreateContext(0, findres(&width, &height), GR_REFRESH_75Hz,
610 attribs);
611 if (!fc)
612 Sys_Error("Unable to create 3DFX context.\n");
613
614 scr_width = width;
615 scr_height = height;
616
617 fxMesaMakeCurrent(fc);
618
619 if (vid.conheight > height)
620 vid.conheight = height;
621 if (vid.conwidth > width)
622 vid.conwidth = width;
623 vid.width = vid.conwidth;
624 vid.height = vid.conheight;
625
626 vid.aspect = ((float)vid.height / (float)vid.width) *
627 (320.0 / 240.0);
628 vid.numpages = 2;
629
630 InitSig(); // trap evil signals
631
632 GL_Init();
633
634 sprintf (gldir, "%s/glquake", com_gamedir);
635 Sys_mkdir (gldir);
636
637 VID_SetPalette(palette);
638
639 // Check for 3DFX Extensions and initialize them.
640 VID_Init8bitPalette();
641
642 Con_SafePrintf ("Video mode %dx%d initialized.\n", width, height);
643
644 vid.recalc_refdef = 1; // force a surface cache flush
645 }
646
Sys_SendKeyEvents(void)647 void Sys_SendKeyEvents(void)
648 {
649 if (UseKeyboard)
650 while (keyboard_update());
651 }
652
Force_CenterView_f(void)653 void Force_CenterView_f (void)
654 {
655 cl.viewangles[PITCH] = 0;
656 }
657
658
mousehandler(int buttonstate,int dx,int dy)659 void mousehandler(int buttonstate, int dx, int dy)
660 {
661 mouse_buttonstate = buttonstate;
662 mx += dx;
663 my += dy;
664 }
665
IN_Init(void)666 void IN_Init(void)
667 {
668
669 int mtype;
670 char *mousedev;
671 int mouserate;
672
673 if (UseMouse)
674 {
675
676 Cvar_RegisterVariable (&mouse_button_commands[0]);
677 Cvar_RegisterVariable (&mouse_button_commands[1]);
678 Cvar_RegisterVariable (&mouse_button_commands[2]);
679 Cmd_AddCommand ("force_centerview", Force_CenterView_f);
680
681 mouse_buttons = 3;
682
683 mtype = vga_getmousetype();
684
685 mousedev = "/dev/mouse";
686 if (getenv("MOUSEDEV")) mousedev = getenv("MOUSEDEV");
687 if (COM_CheckParm("-mdev"))
688 mousedev = com_argv[COM_CheckParm("-mdev")+1];
689
690 mouserate = 1200;
691 if (getenv("MOUSERATE")) mouserate = atoi(getenv("MOUSERATE"));
692 if (COM_CheckParm("-mrate"))
693 mouserate = atoi(com_argv[COM_CheckParm("-mrate")+1]);
694
695 if (mouse_init(mousedev, mtype, mouserate))
696 {
697 Con_Printf("No mouse found\n");
698 UseMouse = 0;
699 }
700 else
701 mouse_seteventhandler(mousehandler);
702
703 }
704
705 }
706
IN_Shutdown(void)707 void IN_Shutdown(void)
708 {
709 if (UseMouse)
710 mouse_close();
711 }
712
713 /*
714 ===========
715 IN_Commands
716 ===========
717 */
IN_Commands(void)718 void IN_Commands (void)
719 {
720 if (UseMouse)
721 {
722 // poll mouse values
723 while (mouse_update())
724 ;
725
726 // perform button actions
727 if ((mouse_buttonstate & MOUSE_LEFTBUTTON) &&
728 !(mouse_oldbuttonstate & MOUSE_LEFTBUTTON))
729 Key_Event (K_MOUSE1, true);
730 else if (!(mouse_buttonstate & MOUSE_LEFTBUTTON) &&
731 (mouse_oldbuttonstate & MOUSE_LEFTBUTTON))
732 Key_Event (K_MOUSE1, false);
733
734 if ((mouse_buttonstate & MOUSE_RIGHTBUTTON) &&
735 !(mouse_oldbuttonstate & MOUSE_RIGHTBUTTON))
736 Key_Event (K_MOUSE2, true);
737 else if (!(mouse_buttonstate & MOUSE_RIGHTBUTTON) &&
738 (mouse_oldbuttonstate & MOUSE_RIGHTBUTTON))
739 Key_Event (K_MOUSE2, false);
740
741 if ((mouse_buttonstate & MOUSE_MIDDLEBUTTON) &&
742 !(mouse_oldbuttonstate & MOUSE_MIDDLEBUTTON))
743 Key_Event (K_MOUSE3, true);
744 else if (!(mouse_buttonstate & MOUSE_MIDDLEBUTTON) &&
745 (mouse_oldbuttonstate & MOUSE_MIDDLEBUTTON))
746 Key_Event (K_MOUSE3, false);
747
748 mouse_oldbuttonstate = mouse_buttonstate;
749 }
750 }
751
752 /*
753 ===========
754 IN_Move
755 ===========
756 */
IN_MouseMove(usercmd_t * cmd)757 void IN_MouseMove (usercmd_t *cmd)
758 {
759 if (!UseMouse)
760 return;
761
762 // poll mouse values
763 while (mouse_update())
764 ;
765
766 if (m_filter.value)
767 {
768 mouse_x = (mx + old_mouse_x) * 0.5;
769 mouse_y = (my + old_mouse_y) * 0.5;
770 }
771 else
772 {
773 mouse_x = mx;
774 mouse_y = my;
775 }
776 old_mouse_x = mx;
777 old_mouse_y = my;
778 mx = my = 0; // clear for next update
779
780 mouse_x *= sensitivity.value;
781 mouse_y *= sensitivity.value;
782
783 // add mouse X/Y movement to cmd
784 if ( (in_strafe.state & 1) || (lookstrafe.value && (in_mlook.state & 1) ))
785 cmd->sidemove += m_side.value * mouse_x;
786 else
787 cl.viewangles[YAW] -= m_yaw.value * mouse_x;
788
789 if (in_mlook.state & 1)
790 V_StopPitchDrift ();
791
792 if ( (in_mlook.state & 1) && !(in_strafe.state & 1))
793 {
794 cl.viewangles[PITCH] += m_pitch.value * mouse_y;
795 if (cl.viewangles[PITCH] > 80)
796 cl.viewangles[PITCH] = 80;
797 if (cl.viewangles[PITCH] < -70)
798 cl.viewangles[PITCH] = -70;
799 }
800 else
801 {
802 if ((in_strafe.state & 1) && noclip_anglehack)
803 cmd->upmove -= m_forward.value * mouse_y;
804 else
805 cmd->forwardmove -= m_forward.value * mouse_y;
806 }
807 }
808
IN_Move(usercmd_t * cmd)809 void IN_Move (usercmd_t *cmd)
810 {
811 IN_MouseMove(cmd);
812 }
813
VID_UnlockBuffer()814 void VID_UnlockBuffer() {}
VID_LockBuffer()815 void VID_LockBuffer() {}
816
817