Quake-2

Quake 2 GPL Source Release
Log | Files | Refs

in_next.m (6646B)


      1 // in_next.m
      2 
      3 #import <AppKit/AppKit.h>
      4 #import <drivers/event_status_driver.h>
      5 #include "../client/client.h"
      6 
      7 float	mousex, mousey;
      8 
      9 float	mouse_center_x = 160;
     10 float	mouse_center_y = 100;
     11 
     12 void PSsetmouse (float x, float y);
     13 void PSshowcursor (void);
     14 void PShidecursor (void);
     15 void PScurrentmouse (int win, float *x, float *y);
     16 
     17 extern	NSView	*vid_view_i;
     18 extern	NSWindow	*vid_window_i;
     19 
     20 qboolean	mlooking;
     21 qboolean	mouseinitialized;
     22 int		mouse_buttons;
     23 int		mouse_oldbuttonstate;
     24 int		mouseactive;
     25 int		mousereset;
     26 int		mx_accum, my_accum;
     27 int		window_center_x, window_center_y;
     28 int		old_mouse_x, old_mouse_y;
     29 
     30 cvar_t	in_mouse = {"in_mouse", "0", CVAR_ARCHIVE};
     31 cvar_t	m_filter = {"m_filter", "0", CVAR_ARCHIVE};
     32 cvar_t	freelook = {"in_freelook", "0", CVAR_ARCHIVE};
     33 
     34 
     35 /*
     36 ===========
     37 IN_ActivateMouse
     38 
     39 Called when the window gains focus or changes in some way
     40 ===========
     41 */
     42 void IN_ActivateMouse (void)
     43 {
     44     NSRect	r;
     45   
     46         if (!mouseinitialized)
     47                 return;
     48         if (!in_mouse.value)
     49                 return;
     50 
     51         r = [vid_window_i frame];
     52         window_center_x = r.size.width / 2;
     53         window_center_y = r.size.height / 2;
     54 
     55         if (!mouseactive)
     56             PShidecursor ();
     57  
     58         mouseactive = true;
     59         mousereset = true;
     60 }
     61 
     62 
     63 /*
     64 ===========
     65 IN_DeactivateMouse
     66 
     67 Called when the window loses focus
     68 ===========
     69 */
     70 void IN_DeactivateMouse (void)
     71 {
     72         if (!mouseinitialized)
     73                 return;
     74 
     75     if (mouseactive)
     76         PSshowcursor ();
     77 
     78     mouseactive = false;
     79 }
     80 
     81 
     82 /*
     83 ===========
     84 IN_StartupMouse
     85 ===========
     86 */
     87 void IN_StartupMouse (void)
     88 {
     89         if ( COM_CheckParm ("-nomouse") ) 
     90                 return; 
     91 
     92         mouseinitialized = true;
     93 
     94         mouse_buttons = 3;
     95 
     96         IN_ActivateMouse ();
     97 }
     98 
     99 /*
    100 ===========
    101 IN_MouseEvent
    102 ===========
    103 */
    104 void IN_MouseEvent (int mstate)
    105 {
    106         int		i;
    107 
    108         if (!mouseactive)
    109                 return;
    110 
    111 // perform button actions
    112         for (i=0 ; i<mouse_buttons ; i++)
    113         {
    114                 if ( (mstate & (1<<i)) &&
    115                         !(mouse_oldbuttonstate & (1<<i)) )
    116                 {
    117                         Key_Event (K_MOUSE1 + i, true);
    118                 }
    119 
    120                 if ( !(mstate & (1<<i)) &&
    121                         (mouse_oldbuttonstate & (1<<i)) )
    122                 {
    123                                 Key_Event (K_MOUSE1 + i, false);
    124                 }
    125         }	
    126 
    127         mouse_oldbuttonstate = mstate;
    128 }
    129 
    130 
    131 
    132 /*
    133 ===========
    134 IN_Accumulate
    135 ===========
    136 */
    137 void IN_Accumulate (void)
    138 {
    139         int		dx, dy;
    140         static int		old_x, old_y;
    141 
    142         if (!mouseinitialized)
    143                 return;
    144 
    145         if (in_mouse.modified)
    146         {
    147             in_mouse.modified = false;
    148             IN_DeactivateMouse ();
    149             IN_ActivateMouse ();
    150         }
    151 
    152         if (!mouseactive)
    153                 return;
    154 
    155 //       [vid_view_i lockFocus];
    156 
    157         if (mousereset)
    158         {	// we haven't centered cursor yet
    159                 mousereset = false;
    160         }
    161         else
    162         {
    163 	 NSPoint	p;
    164 
    165             PScurrentmouse ([vid_window_i windowNumber], &mousex, &mousey);
    166 
    167 		p.x = mousex;
    168 		p.y = mousey;
    169 		p = [vid_view_i convertPoint:p fromView: nil];
    170 
    171             mousex = p.x;
    172             mousey = p.y;
    173             
    174             dx = mousex - old_x;
    175             dy = old_y - mousey;
    176 
    177                 if (!dx && !dy)
    178                         return;
    179                 mx_accum += dx;
    180                 my_accum += dy;
    181         }
    182 
    183         // force the mouse to the center, so there's room to move
    184         PSsetmouse (window_center_x, window_center_y);
    185         PScurrentmouse ([vid_window_i windowNumber], &mousex, &mousey);
    186 //        PSsetmouse (window_center_x, window_center_y);
    187         old_x = window_center_x;
    188         old_y = window_center_y;
    189 
    190 //        [vid_view_i unlockFocus];
    191 }
    192 
    193 
    194 /*
    195 ===========
    196 IN_MouseMove
    197 ===========
    198 */
    199 void IN_MouseMove (usercmd_t *cmd)
    200 {
    201         int		mx, my;
    202 	int		mouse_x, mouse_y;
    203        
    204         IN_Accumulate ();
    205 
    206         mx = mx_accum;
    207         my = my_accum;
    208 
    209         mx_accum = 0;
    210         my_accum = 0;
    211 
    212         if (m_filter.value)
    213         {
    214                 mouse_x = (mx + old_mouse_x) * 0.5;
    215                 mouse_y = (my + old_mouse_y) * 0.5;
    216         }
    217         else
    218         {
    219                 mouse_x = mx;
    220                 mouse_y = my;
    221         }
    222 
    223         old_mouse_x = mx;
    224         old_mouse_y = my;
    225 
    226         if (!mx && !my)
    227                 return;
    228 
    229         if (!mouseactive)
    230                 return;
    231 
    232         mouse_x *= sensitivity.value;
    233         mouse_y *= sensitivity.value;
    234 
    235 // add mouse X/Y movement to cmd
    236         if ( (in_strafe.state & 1) || (lookstrafe.value && mlooking ))
    237                 cmd->sidemove += m_side.value * mouse_x;
    238         else
    239                 cl.viewangles[YAW] -= m_yaw.value * mouse_x;
    240 
    241         if ( (mlooking || freelook.value) && !(in_strafe.state & 1))
    242         {
    243                 cl.viewangles[PITCH] += m_pitch.value * mouse_y;
    244                 if (cl.viewangles[PITCH] > 80)
    245                         cl.viewangles[PITCH] = 80;
    246                 if (cl.viewangles[PITCH] < -70)
    247                         cl.viewangles[PITCH] = -70;
    248         }
    249         else
    250         {
    251                 cmd->forwardmove -= m_forward.value * mouse_y;
    252         }
    253 
    254 }
    255 
    256 void IN_ShowMouse (void)
    257 {
    258     PSshowcursor ();
    259 }
    260 
    261 void IN_HideMouse (void)
    262 {
    263     PShidecursor ();
    264 }
    265 
    266 NXEventHandle	eventhandle;
    267 NXMouseScaling	oldscaling, newscaling;
    268 NXMouseButton	oldbutton;
    269 
    270 /*
    271  =============
    272  IN_Init
    273  =============
    274  */
    275 void IN_Init (void)
    276 {
    277     Cvar_RegisterVariable (&in_mouse);
    278     Cvar_RegisterVariable (&m_filter);
    279     Cvar_RegisterVariable (&freelook);
    280 
    281     Cmd_AddCommand ("showmouse", IN_ShowMouse);
    282     Cmd_AddCommand ("hidemouse", IN_HideMouse);
    283     
    284     IN_StartupMouse ();
    285 
    286     // open the event status driver
    287     eventhandle = NXOpenEventStatus();
    288     NXGetMouseScaling (eventhandle, &oldscaling);
    289     NXSetMouseScaling (eventhandle, &newscaling);
    290     oldbutton = NXMouseButtonEnabled (eventhandle);
    291     NXEnableMouseButton (eventhandle, 2);
    292 }
    293 
    294 /*
    295  =============
    296  IN_Shutdown
    297  =============
    298  */
    299 void IN_Shutdown (void)
    300 {
    301     IN_DeactivateMouse ();
    302 
    303     // put mouse scaling back the way it was
    304     NXSetMouseScaling (eventhandle, &oldscaling);
    305     NXEnableMouseButton (eventhandle, oldbutton);
    306     NXCloseEventStatus (eventhandle);
    307 }
    308 
    309 void IN_Move (usercmd_t *cmd)
    310 {
    311     IN_MouseMove (cmd);
    312 }
    313 
    314 void IN_Commands (void)
    315 {
    316 }
    317 
    318 
    319 /*
    320 =========================================================================
    321 
    322 VIEW CENTERING
    323 
    324 =========================================================================
    325 */
    326 
    327 void V_StopPitchDrift (void)
    328 {
    329 	cl.laststop = cl.time;
    330 	cl.nodrift = true;
    331 	cl.pitchvel = 0;
    332 }