mirror of
https://github.com/kevinbentley/Descent3.git
synced 2025-01-22 19:55:23 +00:00
306 lines
14 KiB
C
306 lines
14 KiB
C
#include "fix.h"
|
|
#include "Macros.h"
|
|
#include <InputSprocket.h>
|
|
#include "InSprocket.h"
|
|
#include "InSprocketResource.h"
|
|
#include "renderer.h"
|
|
#include "game.h"
|
|
#include "descent.h"
|
|
#include "streamaudio.h"
|
|
#include "pilot.h"
|
|
#include "macapp.h"
|
|
|
|
// #ifndef DAJ_DEBUG //REMOVE
|
|
#define USE_MOUSE
|
|
// #endif
|
|
// #define MOUSE_MAX 32768.0f
|
|
#define MOUSE_MAX 48000.0f
|
|
// #define MOUSE_MAX 65336.0f
|
|
#undef USE_KEYBOARD // NOT on you life
|
|
Boolean iSprocket_inited = false;
|
|
|
|
ISpNeed ISp_needs[kNeed_COUNT] = {
|
|
{"\pHeading", kIconSuiteID_Yaw, 0, 0, kISpElementKind_Axis, kISpElementLabel_Axis_Yaw, kISpNeedFlag_NoMultiConfig,
|
|
0, 0, 0},
|
|
{"\pPitch", kIconSuiteID_Pitch, 0, 0, kISpElementKind_Axis, kISpElementLabel_Axis_Pitch, kISpNeedFlag_NoMultiConfig,
|
|
0, 0, 0},
|
|
{"\pBank", kIconSuiteID_Roll, 0, 0, kISpElementKind_Axis, kISpElementLabel_Axis_Roll, kISpNeedFlag_NoMultiConfig, 0,
|
|
0, 0},
|
|
{"\pSideways", kIconSuiteID_SlideHorz, 0, 0, kISpElementKind_Axis, kISpElementLabel_Axis_XAxis,
|
|
kISpNeedFlag_NoMultiConfig, 0, 0, 0},
|
|
{"\pThrust", kIconSuiteID_Thrust, 0, 0, kISpElementKind_Axis, kISpElementLabel_Axis_ZAxis,
|
|
kISpNeedFlag_NoMultiConfig, 0, 0, 0},
|
|
{"\pVertical", kIconSuiteID_SlideVert, 0, 0, kISpElementKind_Axis, kISpElementLabel_Axis_YAxis,
|
|
kISpNeedFlag_NoMultiConfig, 0, 0, 0},
|
|
// Mouse Related Input
|
|
{"\pMouse Heading", kIconSuiteID_Yaw, 0, 0, kISpElementKind_Delta, kISpElementLabel_Delta_Yaw,
|
|
kISpNeedFlag_NoMultiConfig, 0, 0, 0},
|
|
{"\pMouse Pitch", kIconSuiteID_Pitch, 0, 0, kISpElementKind_Delta, kISpElementLabel_Delta_Pitch,
|
|
kISpNeedFlag_NoMultiConfig, 0, 0, 0},
|
|
{"\pMouse Bank", kIconSuiteID_Roll, 0, 0, kISpElementKind_Delta, kISpElementLabel_Delta_Roll,
|
|
kISpNeedFlag_NoMultiConfig, 0, 0, 0},
|
|
{"\pMouse Sideways", kIconSuiteID_SlideHorz, 0, 0, kISpElementKind_Delta, kISpElementLabel_Delta_X,
|
|
kISpNeedFlag_NoMultiConfig, 0, 0, 0},
|
|
{"\pMouse Thrust", kIconSuiteID_Thrust, 0, 0, kISpElementKind_Delta, kISpElementLabel_Delta_Z,
|
|
kISpNeedFlag_NoMultiConfig, 0, 0, 0},
|
|
{"\pMouse Vertical", kIconSuiteID_SlideVert, 0, 0, kISpElementKind_Delta, kISpElementLabel_Delta_Y,
|
|
kISpNeedFlag_NoMultiConfig, 0, 0, 0},
|
|
// The buttons
|
|
{"\pForward", kIconSuiteID_Foward, 0, 0, kISpElementKind_Button, kISpElementLabel_None, 0, 0, 0, 0},
|
|
|
|
{"\pReverse", kIconSuiteID_Back, 0, 0, kISpElementKind_Button, kISpElementLabel_None, 0, 0, 0, 0},
|
|
{"\pSlide Left", kIconSuiteID_SlideLeft, 0, 0, kISpElementKind_Button, kISpElementLabel_None, 0, 0, 0, 0},
|
|
{"\pSlide Right", kIconSuiteID_SlideRight, 0, 0, kISpElementKind_Button, kISpElementLabel_None, 0, 0, 0, 0},
|
|
{"\pSlide Up", kIconSuiteID_SlideUp, 0, 0, kISpElementKind_Button, kISpElementLabel_None, 0, 0, 0, 0},
|
|
{"\pSlide Down", kIconSuiteID_SlideDown, 0, 0, kISpElementKind_Button, kISpElementLabel_None, 0, 0, 0, 0},
|
|
{"\pTurn Left", kIconSuiteID_YawL, 0, 0, kISpElementKind_Button, kISpElementLabel_None, 0, 0, 0, 0},
|
|
{"\pTurn Right", kIconSuiteID_YawR, 0, 0, kISpElementKind_Button, kISpElementLabel_None, 0, 0, 0, 0},
|
|
{"\pPitch Up", kIconSuiteID_PitchU, 0, 0, kISpElementKind_Button, kISpElementLabel_None, 0, 0, 0, 0},
|
|
{"\pPitch Down", kIconSuiteID_PitchD, 0, 0, kISpElementKind_Button, kISpElementLabel_None, 0, 0, 0, 0},
|
|
{"\pBank Left", kIconSuiteID_RollL, 0, 0, kISpElementKind_Button, kISpElementLabel_None, 0, 0, 0, 0},
|
|
{"\pBank Right", kIconSuiteID_RollR, 0, 0, kISpElementKind_Button, kISpElementLabel_None, 0, 0, 0, 0},
|
|
|
|
{"\p-", 0, 0, 0, kISpElementKind_Button, kISpElementLabel_None, 0, 0, 0, 0},
|
|
// seperator
|
|
{"\pFire Primary", kIconSuiteID_FirePrim, 0, 0, kISpElementKind_Button, kISpElementLabel_Btn_Fire, 0, 0, 0, 0},
|
|
{"\pFire Secondary", kIconSuiteID_FireSecond, 0, 0, kISpElementKind_Button, kISpElementLabel_Btn_SecondaryFire, 0,
|
|
0, 0, 0},
|
|
{"\pNext Primary", kIconSuiteID_NextPrim, 0, 0, kISpElementKind_Button, kISpElementLabel_None, 0, 0, 0, 0},
|
|
{"\pNext Secondary", kIconSuiteID_NextSecond, 0, 0, kISpElementKind_Button, kISpElementLabel_None, 0, 0, 0, 0},
|
|
{"\pAfterburner", kIconSuiteID_AfterBurn, 0, 0, kISpElementKind_Button, kISpElementLabel_None, 0, 0, 0, 0},
|
|
{"\pHeadlight", kIconSuiteID_HeadLight, 0, 0, kISpElementKind_Button, kISpElementLabel_None, 0, 0, 0, 0},
|
|
{"\pFlare", kIconSuiteID_Flare, 0, 0, kISpElementKind_Button, kISpElementLabel_None, 0, 0, 0, 0},
|
|
{"\pRear View", kIconSuiteID_RearView, 0, 0, kISpElementKind_Button, kISpElementLabel_None, 0, 0, 0, 0},
|
|
{"\pMap", kIconSuiteID_Map, 0, 0, kISpElementKind_Button, kISpElementLabel_None, 0, 0, 0, 0},
|
|
{"\pUse Inventory", kIconSuiteID_UseInv, 0, 0, kISpElementKind_Button, kISpElementLabel_None, 0, 0, 0, 0},
|
|
{"\pNext Inventory", kIconSuiteID_NextInv, 0, 0, kISpElementKind_Button, kISpElementLabel_None, 0, 0, 0, 0},
|
|
{"\pPrevious Inventory", kIconSuiteID_PrevInv, 0, 0, kISpElementKind_Button, kISpElementLabel_None, 0, 0, 0, 0},
|
|
{"\pUse Counter Measure", kIconSuiteID_UseCM, 0, 0, kISpElementKind_Button, kISpElementLabel_None, 0, 0, 0, 0},
|
|
{"\pNext Counter Measure", kIconSuiteID_NextCM, 0, 0, kISpElementKind_Button, kISpElementLabel_None, 0, 0, 0, 0},
|
|
{"\pPrevious Counter Measure", kIconSuiteID_PrevCM, 0, 0, kISpElementKind_Button, kISpElementLabel_None, 0, 0, 0,
|
|
0},
|
|
{"\pBank On", kIconSuiteID_BankOn, 0, 0, kISpElementKind_Button, kISpElementLabel_None, 0, 0, 0, 0},
|
|
{"\pSlide On", kIconSuiteID_SlideOn, 0, 0, kISpElementKind_Button, kISpElementLabel_None, 0, 0, 0, 0}};
|
|
void inSprocket_Init(void) {
|
|
int i;
|
|
|
|
if (iSprocket_inited)
|
|
return;
|
|
|
|
mprintf((1, "inSprocket_init: need_count %d\n", kNeed_COUNT));
|
|
|
|
#ifdef USE_MOUSE
|
|
ISpDevices_ActivateClass(kISpDeviceClass_Mouse);
|
|
#endif
|
|
#ifdef USE_KEYBOARD
|
|
ISpDevices_ActivateClass(kISpDeviceClass_Keyboard);
|
|
#endif
|
|
ISpElement_NewVirtualFromNeeds(kNeed_COUNT, ISp_needs, gInputElement, 0);
|
|
|
|
char pilot_name[40];
|
|
Current_pilot.get_name(pilot_name);
|
|
if (pilot_name[0])
|
|
ISpInit(kNeed_COUNT, ISp_needs, gInputElement, 'DNT3', (ulong)pilot_name, 0, kSetListID, 0);
|
|
else
|
|
ISpInit(kNeed_COUNT, ISp_needs, gInputElement, 'DNT3', kNeedsVersion, 0, kSetListID, 0);
|
|
|
|
ISpElementList_New(0, NULL, &gInputEventList, 0);
|
|
ISpElementList_New(0, NULL, &gInputHoldDownEventList, 0);
|
|
ISpElementList_AddElements(gInputHoldDownEventList, kInputEvent_FirePrim_On, 1, &gInputElement[kNeed_FirePrim]);
|
|
ISpElementList_AddElements(gInputHoldDownEventList, kInputEvent_FireSecond_On, 1, &gInputElement[kNeed_FireSecond]);
|
|
ISpElementList_AddElements(gInputHoldDownEventList, kInputEvent_AfterBurn_On, 1, &gInputElement[kNeed_AfterBurn]);
|
|
ISpElementList_AddElements(gInputHoldDownEventList, kInputEvent_RearView_On, 1, &gInputElement[kNeed_RearView]);
|
|
ISpElementList_AddElements(gInputHoldDownEventList, kInputEvent_Bank_On, 1, &gInputElement[kNeed_BankOn]);
|
|
ISpElementList_AddElements(gInputHoldDownEventList, kInputEvent_Slide_On, 1, &gInputElement[kNeed_SlideOn]);
|
|
|
|
ISpElementList_AddElements(gInputHoldDownEventList, kInputEvent_Accelerate_On, 1, &gInputElement[kNeed_Accelerate]);
|
|
ISpElementList_AddElements(gInputHoldDownEventList, kInputEvent_Reverse_On, 1, &gInputElement[kNeed_Reverse]);
|
|
ISpElementList_AddElements(gInputHoldDownEventList, kInputEvent_SlideLeft_On, 1, &gInputElement[kNeed_SlideLeft]);
|
|
ISpElementList_AddElements(gInputHoldDownEventList, kInputEvent_SlideRight_On, 1, &gInputElement[kNeed_SlideRight]);
|
|
ISpElementList_AddElements(gInputHoldDownEventList, kInputEvent_SlideUp_On, 1, &gInputElement[kNeed_SlideUp]);
|
|
ISpElementList_AddElements(gInputHoldDownEventList, kInputEvent_SlideDown_On, 1, &gInputElement[kNeed_SlideDown]);
|
|
|
|
ISpElementList_AddElements(gInputHoldDownEventList, kInputEvent_TurnLeft_On, 1, &gInputElement[kNeed_TurnLeft]);
|
|
ISpElementList_AddElements(gInputHoldDownEventList, kInputEvent_TurnRight_On, 1, &gInputElement[kNeed_TurnRight]);
|
|
ISpElementList_AddElements(gInputHoldDownEventList, kInputEvent_PitchUp_On, 1, &gInputElement[kNeed_PitchUp]);
|
|
ISpElementList_AddElements(gInputHoldDownEventList, kInputEvent_PitchDown_On, 1, &gInputElement[kNeed_PitchDown]);
|
|
ISpElementList_AddElements(gInputHoldDownEventList, kInputEvent_BankLeft_On, 1, &gInputElement[kNeed_BankLeft]);
|
|
ISpElementList_AddElements(gInputHoldDownEventList, kInputEvent_BankRight_On, 1, &gInputElement[kNeed_BankRight]);
|
|
ISpElementList_AddElements(gInputEventList, kInputEvent_NextPrim, 1, &gInputElement[kNeed_NextPrim]);
|
|
ISpElementList_AddElements(gInputEventList, kInputEvent_NextSecond, 1, &gInputElement[kNeed_NextSecond]);
|
|
ISpElementList_AddElements(gInputEventList, kInputEvent_HeadLight, 1, &gInputElement[kNeed_HeadLight]);
|
|
ISpElementList_AddElements(gInputEventList, kInputEvent_Flare, 1, &gInputElement[kNeed_Flare]);
|
|
ISpElementList_AddElements(gInputEventList, kInputEvent_Map, 1, &gInputElement[kNeed_Map]);
|
|
ISpElementList_AddElements(gInputEventList, kInputEvent_InventoryUse, 1, &gInputElement[kNeed_InventoryUse]);
|
|
ISpElementList_AddElements(gInputEventList, kInputEvent_InventoryNext, 1, &gInputElement[kNeed_InventoryNext]);
|
|
ISpElementList_AddElements(gInputEventList, kInputEvent_InventoryPrev, 1, &gInputElement[kNeed_InventoryPrev]);
|
|
ISpElementList_AddElements(gInputEventList, kInputEvent_CounterUse, 1, &gInputElement[kNeed_CounterUse]);
|
|
ISpElementList_AddElements(gInputEventList, kInputEvent_CounterNext, 1, &gInputElement[kNeed_CounterNext]);
|
|
ISpElementList_AddElements(gInputEventList, kInputEvent_CounterPrev, 1, &gInputElement[kNeed_CounterPrev]);
|
|
/*
|
|
ISpElementList_AddElements(gInputEventList, kInputEvent_ATaunt1, 1, &gInputElement[kNeed_ATaunt1]);
|
|
ISpElementList_AddElements(gInputEventList, kInputEvent_ATaunt2, 1, &gInputElement[kNeed_ATaunt2]);
|
|
ISpElementList_AddElements(gInputEventList, kInputEvent_ATaunt3, 1, &gInputElement[kNeed_ATaunt3]);
|
|
ISpElementList_AddElements(gInputEventList, kInputEvent_ATaunt4, 1, &gInputElement[kNeed_ATaunt4]);
|
|
*/
|
|
ISpElementList_Flush(gInputEventList);
|
|
ISpElementList_Flush(gInputHoldDownEventList);
|
|
for (i = 0; i < 12; i++)
|
|
ISpElement_Flush(gInputElement[i]);
|
|
|
|
ISpSuspend();
|
|
|
|
iSprocket_inited = true;
|
|
}
|
|
void inSprocket_Configure(void) {
|
|
#if defined USE_GLIDE
|
|
rend_Close();
|
|
#elif defined USE_OPENGL
|
|
PauseDSpContext();
|
|
#endif
|
|
|
|
AudioStream::PauseAll();
|
|
|
|
inSprocket_Init(); // Just incase the config gets called before noral init
|
|
|
|
ISpConfigure(NULL);
|
|
|
|
AudioStream::ResumeAll();
|
|
#ifdef USE_MOUSE
|
|
HideCursor();
|
|
#endif
|
|
#if defined USE_GLIDE
|
|
rend_Init(PreferredRenderer, Descent, &Render_preferred_state);
|
|
#elif defined USE_OPENGL
|
|
ResumeDSpContext();
|
|
#endif
|
|
}
|
|
void inSprocket_Activate(Boolean inActivate) {
|
|
Boolean doActivate;
|
|
int i;
|
|
|
|
doActivate = inActivate;
|
|
if (gInputActive != doActivate) {
|
|
gInputActive = doActivate;
|
|
|
|
if (gInputActive) {
|
|
#ifdef USE_MOUSE
|
|
HideCursor();
|
|
#endif
|
|
|
|
ISpResume();
|
|
} else {
|
|
ISpSuspend();
|
|
|
|
#ifdef USE_MOUSE
|
|
// ShowCursor();
|
|
#endif
|
|
}
|
|
}
|
|
}
|
|
|
|
void InSprocket_Flush(void) {
|
|
ISpElementList_Flush(gInputEventList);
|
|
ISpElementList_Flush(gInputHoldDownEventList);
|
|
for (int i = 0; i < 12; i++)
|
|
ISpElement_Flush(gInputElement[i]);
|
|
}
|
|
|
|
float inSprocket_GetAllAxis(int axis) {
|
|
ISpAxisData axisValue = kISpAxisMiddle;
|
|
OSStatus err;
|
|
ISpElementEvent event;
|
|
Boolean gotEvent;
|
|
float val = 0, fval;
|
|
signed int maxval = 0;
|
|
|
|
while (!(err = ISpElement_GetNextEvent(gInputElement[axis + 6], sizeof(event), &event, &gotEvent)) && gotEvent) {
|
|
maxval += (signed int)event.data;
|
|
}
|
|
if (maxval)
|
|
return maxval / MOUSE_MAX;
|
|
err = ISpElement_GetNextEvent(gInputElement[axis], sizeof(event), &event, &gotEvent);
|
|
if (!err && gotEvent) {
|
|
return ISpSymmetricAxisToFloat(event.data);
|
|
}
|
|
err = ISpElement_GetSimpleState(gInputElement[axis], &axisValue);
|
|
if (!err) {
|
|
return ISpSymmetricAxisToFloat(axisValue);
|
|
}
|
|
return val;
|
|
}
|
|
float inSprocket_GetMouse(int axis) {
|
|
OSStatus err;
|
|
ISpElementEvent event;
|
|
Boolean gotEvent = false;
|
|
float val = 0;
|
|
signed int maxval = 0;
|
|
|
|
err = ISpElement_GetNextEvent(gInputElement[axis + 6], sizeof(event), &event, &gotEvent);
|
|
while (!err && gotEvent) {
|
|
maxval += (signed int)event.data;
|
|
err = ISpElement_GetNextEvent(gInputElement[axis + 6], sizeof(event), &event, &gotEvent);
|
|
}
|
|
if (maxval)
|
|
return val = maxval / MOUSE_MAX;
|
|
return val;
|
|
}
|
|
float inSprocket_GetAxis(int axis) {
|
|
ISpAxisData axisValue = kISpAxisMiddle;
|
|
OSStatus err;
|
|
float val = 0;
|
|
ISpElementEvent event;
|
|
Boolean gotEvent;
|
|
|
|
if (!(err = ISpElement_GetNextEvent(gInputElement[axis], sizeof(event), &event, &gotEvent)) && gotEvent) {
|
|
val = ISpSymmetricAxisToFloat(event.data);
|
|
} else if (!(err = ISpElement_GetSimpleState(gInputElement[axis], &axisValue))) {
|
|
val = ISpSymmetricAxisToFloat(axisValue);
|
|
}
|
|
return val;
|
|
}
|
|
int inSprocket_GetAxisInt(int axis) {
|
|
ISpAxisData axisValue = kISpAxisMiddle;
|
|
OSStatus err;
|
|
int val = 0;
|
|
ISpElementEvent event;
|
|
Boolean gotEvent;
|
|
|
|
if (!(err = ISpElement_GetSimpleState(gInputElement[axis], &axisValue))) {
|
|
val = (int)((axisValue >> 24) - 0x7F);
|
|
}
|
|
return val;
|
|
}
|
|
TInputEvent inSprocket_GetButtonEvent(void) {
|
|
OSErr err;
|
|
// TInputEvent result = kInputEvent_None;
|
|
int result = kInputEvent_None;
|
|
ISpElementEvent event;
|
|
Boolean gotEvent;
|
|
|
|
if (gInputActive) {
|
|
err = ISpElementList_GetNextEvent(gInputHoldDownEventList, sizeof(event), &event, &gotEvent);
|
|
if (err == noErr && gotEvent) {
|
|
result = (TInputEvent)event.refCon;
|
|
if (event.data == kISpButtonUp)
|
|
result += 1; // Note: we rely on off being on+1 (ie kInputEvent_InertialDampers_Off ==
|
|
// kInputEvent_InertialDampers_On + 1)
|
|
} else {
|
|
err = ISpElementList_GetNextEvent(gInputEventList, sizeof(event), &event, &gotEvent);
|
|
|
|
if (err == noErr && gotEvent && event.data == kISpButtonDown)
|
|
result = (TInputEvent)event.refCon;
|
|
}
|
|
}
|
|
|
|
return (TInputEvent)result;
|
|
}
|
|
void inSprocket_Exit(void) {
|
|
if (gInputActive) {
|
|
inSprocket_Activate(false);
|
|
}
|
|
ISpElementList_Dispose(gInputEventList);
|
|
ISpStop();
|
|
//?? ISpElement_DisposeVirtual(kNeed_COUNT, gInputElement);
|
|
}
|