quake2forge/rhapsody/in_next.m

333 lines
6.5 KiB
Objective-C

// in_next.m
#import <AppKit/AppKit.h>
#import <drivers/event_status_driver.h>
#include "../client/client.h"
float mousex, mousey;
float mouse_center_x = 160;
float mouse_center_y = 100;
void PSsetmouse (float x, float y);
void PSshowcursor (void);
void PShidecursor (void);
void PScurrentmouse (int win, float *x, float *y);
extern NSView *vid_view_i;
extern NSWindow *vid_window_i;
qboolean mlooking;
qboolean mouseinitialized;
int mouse_buttons;
int mouse_oldbuttonstate;
int mouseactive;
int mousereset;
int mx_accum, my_accum;
int window_center_x, window_center_y;
int old_mouse_x, old_mouse_y;
cvar_t in_mouse = {"in_mouse", "0", CVAR_ARCHIVE};
cvar_t m_filter = {"m_filter", "0", CVAR_ARCHIVE};
cvar_t freelook = {"in_freelook", "0", CVAR_ARCHIVE};
/*
===========
IN_ActivateMouse
Called when the window gains focus or changes in some way
===========
*/
void IN_ActivateMouse (void)
{
NSRect r;
if (!mouseinitialized)
return;
if (!in_mouse.value)
return;
r = [vid_window_i frame];
window_center_x = r.size.width / 2;
window_center_y = r.size.height / 2;
if (!mouseactive)
PShidecursor ();
mouseactive = true;
mousereset = true;
}
/*
===========
IN_DeactivateMouse
Called when the window loses focus
===========
*/
void IN_DeactivateMouse (void)
{
if (!mouseinitialized)
return;
if (mouseactive)
PSshowcursor ();
mouseactive = false;
}
/*
===========
IN_StartupMouse
===========
*/
void IN_StartupMouse (void)
{
if ( COM_CheckParm ("-nomouse") )
return;
mouseinitialized = true;
mouse_buttons = 3;
IN_ActivateMouse ();
}
/*
===========
IN_MouseEvent
===========
*/
void IN_MouseEvent (int mstate)
{
int i;
if (!mouseactive)
return;
// perform button actions
for (i=0 ; i<mouse_buttons ; i++)
{
if ( (mstate & (1<<i)) &&
!(mouse_oldbuttonstate & (1<<i)) )
{
Key_Event (K_MOUSE1 + i, true);
}
if ( !(mstate & (1<<i)) &&
(mouse_oldbuttonstate & (1<<i)) )
{
Key_Event (K_MOUSE1 + i, false);
}
}
mouse_oldbuttonstate = mstate;
}
/*
===========
IN_Accumulate
===========
*/
void IN_Accumulate (void)
{
int dx, dy;
static int old_x, old_y;
if (!mouseinitialized)
return;
if (in_mouse.modified)
{
in_mouse.modified = false;
IN_DeactivateMouse ();
IN_ActivateMouse ();
}
if (!mouseactive)
return;
// [vid_view_i lockFocus];
if (mousereset)
{ // we haven't centered cursor yet
mousereset = false;
}
else
{
NSPoint p;
PScurrentmouse ([vid_window_i windowNumber], &mousex, &mousey);
p.x = mousex;
p.y = mousey;
p = [vid_view_i convertPoint:p fromView: nil];
mousex = p.x;
mousey = p.y;
dx = mousex - old_x;
dy = old_y - mousey;
if (!dx && !dy)
return;
mx_accum += dx;
my_accum += dy;
}
// force the mouse to the center, so there's room to move
PSsetmouse (window_center_x, window_center_y);
PScurrentmouse ([vid_window_i windowNumber], &mousex, &mousey);
// PSsetmouse (window_center_x, window_center_y);
old_x = window_center_x;
old_y = window_center_y;
// [vid_view_i unlockFocus];
}
/*
===========
IN_MouseMove
===========
*/
void IN_MouseMove (usercmd_t *cmd)
{
int mx, my;
int mouse_x, mouse_y;
IN_Accumulate ();
mx = mx_accum;
my = my_accum;
mx_accum = 0;
my_accum = 0;
if (m_filter.value)
{
mouse_x = (mx + old_mouse_x) * 0.5;
mouse_y = (my + old_mouse_y) * 0.5;
}
else
{
mouse_x = mx;
mouse_y = my;
}
old_mouse_x = mx;
old_mouse_y = my;
if (!mx && !my)
return;
if (!mouseactive)
return;
mouse_x *= sensitivity.value;
mouse_y *= sensitivity.value;
// add mouse X/Y movement to cmd
if ( (in_strafe.state & 1) || (lookstrafe.value && mlooking ))
cmd->sidemove += m_side.value * mouse_x;
else
cl.viewangles[YAW] -= m_yaw.value * mouse_x;
if ( (mlooking || freelook.value) && !(in_strafe.state & 1))
{
cl.viewangles[PITCH] += m_pitch.value * mouse_y;
if (cl.viewangles[PITCH] > 80)
cl.viewangles[PITCH] = 80;
if (cl.viewangles[PITCH] < -70)
cl.viewangles[PITCH] = -70;
}
else
{
cmd->forwardmove -= m_forward.value * mouse_y;
}
}
void IN_ShowMouse (void)
{
PSshowcursor ();
}
void IN_HideMouse (void)
{
PShidecursor ();
}
NXEventHandle eventhandle;
NXMouseScaling oldscaling, newscaling;
NXMouseButton oldbutton;
/*
=============
IN_Init
=============
*/
void IN_Init (void)
{
Cvar_RegisterVariable (&in_mouse);
Cvar_RegisterVariable (&m_filter);
Cvar_RegisterVariable (&freelook);
Cmd_AddCommand ("showmouse", IN_ShowMouse);
Cmd_AddCommand ("hidemouse", IN_HideMouse);
IN_StartupMouse ();
// open the event status driver
eventhandle = NXOpenEventStatus();
NXGetMouseScaling (eventhandle, &oldscaling);
NXSetMouseScaling (eventhandle, &newscaling);
oldbutton = NXMouseButtonEnabled (eventhandle);
NXEnableMouseButton (eventhandle, 2);
}
/*
=============
IN_Shutdown
=============
*/
void IN_Shutdown (void)
{
IN_DeactivateMouse ();
// put mouse scaling back the way it was
NXSetMouseScaling (eventhandle, &oldscaling);
NXEnableMouseButton (eventhandle, oldbutton);
NXCloseEventStatus (eventhandle);
}
void IN_Move (usercmd_t *cmd)
{
IN_MouseMove (cmd);
}
void IN_Commands (void)
{
}
/*
=========================================================================
VIEW CENTERING
=========================================================================
*/
void V_StopPitchDrift (void)
{
cl.laststop = cl.time;
cl.nodrift = true;
cl.pitchvel = 0;
}