/* =========================================================================== ARX FATALIS GPL Source Code Copyright (C) 1999-2010 Arkane Studios SA, a ZeniMax Media company. This file is part of the Arx Fatalis GPL Source Code ('Arx Fatalis Source Code'). Arx Fatalis Source Code is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Arx Fatalis Source Code is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Arx Fatalis Source Code. If not, see . In addition, the Arx Fatalis Source Code is also subject to certain additional terms. You should have received a copy of these additional terms immediately following the terms and conditions of the GNU General Public License which accompanied the Arx Fatalis Source Code. If not, please request a copy in writing from Arkane Studios at the address below. If you have questions concerning this license or the applicable additional terms, you may contact in writing Arkane Studios, c/o ZeniMax Media Inc., Suite 120, Rockville, Maryland 20850 USA. =========================================================================== */ ////////////////////////////////////////////////////////////////////////////////////// // @@ @@@ @@@ @@ @@@@@ // // @@@ @@@@@@ @@@ @@ @@@@ @@@ @@@ // // @@@ @@@@@@@ @@@ @@@@ @@@@ @@ @@@@ // // @@@ @@ @@@@ @@@ @@@@@ @@@@@@ @@@ @@@ // // @@@@@ @@ @@@@ @@@ @@@@@ @@@@@@@ @@@ @ @@@ // // @@@@@ @@ @@@@ @@@@@@@@ @@@@ @@@ @@@@@ @@ @@@@@@@ // // @@ @@@ @@ @@@@ @@@@@@@ @@@ @@@ @@@@@@ @@ @@@@ // // @@@ @@@ @@@ @@@@ @@@@@ @@@@@@@@@ @@@@@@@ @@@ @@@@ // // @@@ @@@@ @@@@@@@ @@@@@@ @@@ @@@@ @@@ @@@ @@@ @@@@ // // @@@@@@@@ @@@@@ @@@@@@@@@@ @@@ @@@ @@@ @@@ @@@ @@@@@ // // @@@ @@@@ @@@@ @@@ @@@@@@@ @@@ @@@ @@@@ @@@ @@@@ @@@@@ // //@@@ @@@@ @@@@@ @@@ @@@@@@ @@ @@@ @@@@ @@@@@@@ @@@@@ @@@@@ // //@@@ @@@@@ @@@@@ @@@@ @@@ @@ @@ @@@@ @@@@@@@ @@@@@@@@@ // //@@@ @@@@ @@@@@@@ @@@@ @@ @@ @@@@ @@@@@ @@@@@ // //@@@ @@@@ @@@@@@@ @@@@ @@ @@ @@@@ @@@@@ @@ // //@@@ @@@ @@@ @@@@@ @@ @@@ // // @@@ @@@ @@ @@ STUDIOS // ////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////// // ARX_Common ////////////////////////////////////////////////////////////////////////////////////// // // Description: // All preprocessor directives set for all the solution. // // Updates: (07-23-2010) (xrichter) File extension change from .c to .cpp // Comments which start with //Old : are the old way to call directx 7 functions in C // // Code: Xavier RICHTER // // Copyright (c) 1999-2010 ARKANE Studios SA. All rights reserved ///////////////////////////////////////////////////////////////////////////////////// #include "Mercury_extern.h" #include #define _CRTDBG_MAP_ALLOC #include //----------------------------------------------------------------------------- #define INPUT_STATE_ADD (512) /*-------------------------------------------------------------*/ /*static void * DXI_malloc(int t) { return malloc(t); } /*-------------------------------------------------------------*/ /*static void * DXI_Realloc(void *mem,int t) { return realloc(mem,t); }*/ /*-------------------------------------------------------------*/ /*static void DXI_free(void *mem) { free(mem); }*/ /*-------------------------------------------------------------*/ BOOL CALLBACK DIEnumDevicesCallback(LPCDIDEVICEINSTANCE lpddi,LPVOID pvRef) { INPUT_INFO *info; info=&DI_InputInfo[DI_NbInputInfo]; memset((void*)info,0,sizeof(INPUT_INFO)); //nom info->name=(char *)malloc(strlen(lpddi->tszInstanceName)+1); if(!info->name) return DIENUM_CONTINUE; strcpy((char*)info->name,(const char*)lpddi->tszInstanceName); //guid info->guid=(GUID*)malloc(sizeof(GUID)); if(!info->guid) { free(info->name); return DIENUM_CONTINUE; } memcpy((void*)info->guid,(void*)&lpddi->guidInstance,sizeof(GUID)); //type info->type=lpddi->dwDevType; DI_NbInputInfo++; return DIENUM_CONTINUE; } /*-------------------------------------------------------------*/ int DXI_Init(HINSTANCE h,DXI_INIT *i) { int nb; if(!h) return DXI_FAIL; DI_DInput7=NULL; memcpy((void*)&DI_Init,(void*)i,sizeof(DXI_INIT)); /* if(!DI_Init.malloc||!DI_Init.realloc||!DI_Init.free) { // DI_Init.malloc=DXI_malloc; // DI_Init.realloc=DXI_Realloc; // DI_Init.free=DXI_free; } */ //Old : if(FAILED(DI_Hr=DirectInputCreateEx(h,DIRECTINPUT_VERSION,&IID_IDirectInput7,&DI_DInput7,NULL))) return DXI_FAIL; if(FAILED(DI_Hr=DirectInputCreateEx(h,DIRECTINPUT_VERSION,IID_IDirectInput7,(void**)&DI_DInput7,NULL))) return DXI_FAIL; DI_NbInputInfo=0; //Old : if(FAILED(DI_Hr=DI_DInput7->lpVtbl->EnumDevices(DI_DInput7,0,DIEnumDevicesCallback,NULL,DIEDFL_ATTACHEDONLY))) return DXI_FAIL; if(FAILED(DI_Hr=DI_DInput7->EnumDevices(0,DIEnumDevicesCallback,NULL,DIEDFL_ATTACHEDONLY))) return DXI_FAIL; nb=MAXKEYBOARD; while(nb--) DI_KeyBoardBuffer[nb]=NULL; nb=MAXMOUSE; while(nb--) DI_MouseState[nb]=NULL; nb=MAXJOY; while(nb--) DI_JoyState[nb]=NULL; nb=MAXSCID; while(nb--) DI_SCIDState[nb]=NULL; return DXI_OK; } /*-------------------------------------------------------------*/ void DXI_ReleaseDevice(INPUT_INFO *info) { if(!info->actif) return; info->actif=DEVICENOACTIF; //Old : if(info->inputdevice7) info->inputdevice7->lpVtbl->Unacquire(info->inputdevice7); if(info->inputdevice7) info->inputdevice7->Unacquire(); RELEASE(info->inputdevice7); info->inputdevice7=NULL; switch(GET_DIDEVICE_TYPE(info->type)) { case DIDEVTYPE_MOUSE: if(info->mousestate) { free((void*)info->mousestate); // free((void*)info->old_mousestate); info->mousestate=NULL; // info->old_mousestate=NULL; } break; case DIDEVTYPE_KEYBOARD: if(info->bufferstate) { free((void*)info->bufferstate); // free((void*)info->old_bufferstate); info->bufferstate=NULL; // info->old_bufferstate=NULL; } break; case DIDEVTYPE_JOYSTICK: if(info->datasid==DFDIJOYSTICK) { if(info->joystate) { free((void*)info->joystate); // free((void*)info->old_joystate); info->joystate=NULL; // info->old_joystate=NULL; } } else { if(info->joystate2) { free((void*)info->joystate2); info->joystate2=NULL; // free((void*)info->old_joystate2); // info->old_joystate2=NULL; } } break; default: case DIDEVTYPE_DEVICE: if(info->datasid==DFDIJOYSTICK) { if(info->joystate) { free((void*)info->joystate); // free((void*)info->old_joystate); info->joystate=NULL; // info->old_joystate=NULL; } } else { if(info->joystate2) { free((void*)info->joystate2); info->joystate2=NULL; // free((void*)info->old_joystate2); // info->old_joystate2=NULL; } } break; } } /*-------------------------------------------------------------*/ void DXI_ReleaseAllDevices(void) { INPUT_INFO *info; int nb; info=DI_InputInfo; nb=DI_NbInputInfo; while(nb) { DXI_ReleaseDevice(info); info++; nb--; } } /*-------------------------------------------------------------*/ void DXI_DeleteAllDevices(void) { INPUT_INFO *info; info=DI_InputInfo; while(DI_NbInputInfo) { free(info->guid); info->guid=NULL; free(info->name); info->name=NULL; DXI_ReleaseDevice(info); info++; DI_NbInputInfo--; } } /*-------------------------------------------------------------*/ void DXI_Release(void) { INPUT_INFO *info; info=DI_InputInfo; while(DI_NbInputInfo) { free(info->guid); info->guid=NULL; free(info->name); info->name=NULL; DXI_ReleaseDevice(info); info++; DI_NbInputInfo--; } RELEASE(DI_DInput7); DI_DInput7 = NULL; } /*-------------------------------------------------------------*/ BOOL CompareGUID(GUID *g1,GUID *g2) { int i,j,*m1,*m2; char *mm1,*mm2; i=sizeof(GUID); j=i&3; i>>=2; m1=(int*)g1; m2=(int*)g2; while(i) { if(*m1++!=*m2++) return FALSE; i--; } mm1=(char*)m1; mm2=(char*)m2; while(j) { if(*mm1++!=*mm2++) return FALSE; j--; } return TRUE; } /*-------------------------------------------------------------*/ BOOL CALLBACK DIEnumDeviceObjectsCallback(LPCDIDEVICEOBJECTINSTANCE lpddoi,LPVOID pvRef) { INPUT_INFO *info; info=(INPUT_INFO *)pvRef; if(CompareGUID((GUID*)&lpddoi->guidType,(GUID*)&GUID_XAxis)) info->info|=DXI_XAxis; if(CompareGUID((GUID*)&lpddoi->guidType,(GUID*)&GUID_YAxis)) info->info|=DXI_YAxis; if(CompareGUID((GUID*)&lpddoi->guidType,(GUID*)&GUID_ZAxis)) info->info|=DXI_ZAxis; if(CompareGUID((GUID*)&lpddoi->guidType,(GUID*)&GUID_RxAxis)) info->info|=DXI_RxAxis; if(CompareGUID((GUID*)&lpddoi->guidType,(GUID*)&GUID_RyAxis)) info->info|=DXI_RyAxis; if(CompareGUID((GUID*)&lpddoi->guidType,(GUID*)&GUID_RzAxis)) info->info|=DXI_RzAxis; if(CompareGUID((GUID*)&lpddoi->guidType,(GUID*)&GUID_Slider)) info->info|=DXI_Slider; if(CompareGUID((GUID*)&lpddoi->guidType,(GUID*)&GUID_Button)) info->info|=DXI_Button; if(CompareGUID((GUID*)&lpddoi->guidType,(GUID*)&GUID_Key)) info->info|=DXI_Key; if(CompareGUID((GUID*)&lpddoi->guidType,(GUID*)&GUID_POV)) info->info|=DXI_POV; if(CompareGUID((GUID*)&lpddoi->guidType,(GUID*)&GUID_Unknown)) info->info|=DXI_Unknown; return DIENUM_CONTINUE; } /*-------------------------------------------------------------*/ static INPUT_INFO * DXI_GetInputInfoWithState(void *state,int type) { int nbdev; INPUT_INFO *info; info=DI_InputInfo; nbdev=DI_NbInputInfo; while(nbdev) { if(GET_DIDEVICE_TYPE(info->type)==type) { switch(type) { case DIDEVTYPE_MOUSE: // if(info->mousestate==state) return info; if(state==info) return info; break; case DIDEVTYPE_KEYBOARD: if(info->bufferstate==state) return info; break; case DIDEVTYPE_JOYSTICK: if(state==info) return info; break; default: case DIDEVTYPE_DEVICE: break; } } info++; nbdev--; } return NULL; } /*-------------------------------------------------------------*/ void DXI_RestoreAllDevices(void) { int nbdev; INPUT_INFO *info; info=DI_InputInfo; nbdev=DI_NbInputInfo; while(nbdev) { if(info->actif) { //Old : info->inputdevice7->lpVtbl->Acquire(info->inputdevice7); info->inputdevice7->Acquire(); } info++; nbdev--; } } /*-------------------------------------------------------------*/ void DXI_SleepAllDevices(void) { int nbdev; INPUT_INFO *info; info=DI_InputInfo; nbdev=DI_NbInputInfo; while(nbdev) { if(info->actif) { //Old : info->inputdevice7->lpVtbl->Unacquire(info->inputdevice7); info->inputdevice7->Unacquire(); } info++; nbdev--; } } /*-------------------------------------------------------------*/ int DXI_GetKeyboardInputDevice(HWND hwnd,int id,int mode) { int nbdev,num=0; INPUT_INFO *info; if(id>=MAXKEYBOARD) return DXI_FAIL; if(DI_KeyBoardBuffer[id]) { info=DXI_GetInputInfoWithState(DI_KeyBoardBuffer[id],DIDEVTYPE_KEYBOARD); if(info) DXI_ReleaseDevice(info); DI_KeyBoardBuffer[id]=NULL; } info=DI_InputInfo; nbdev=DI_NbInputInfo; while(nbdev) { if((GET_DIDEVICE_TYPE(info->type)==DIDEVTYPE_KEYBOARD)&&(!info->actif)) { if(DXI_ChooseInputDevice(hwnd,id,num,mode)==DXI_OK) return DXI_OK; } num++; info++; nbdev--; } return DXI_FAIL; } /*-------------------------------------------------------------*/ int DXI_GetMouseInputDevice(HWND hwnd,int id,int mode,int minbutton,int minaxe) { int nbdev,num=0; INPUT_INFO *info; if(id>=MAXMOUSE) return DXI_FAIL; if(DI_MouseState[id]) { info=DXI_GetInputInfoWithState(DI_MouseState[id],DIDEVTYPE_MOUSE); if(info) DXI_ReleaseDevice(info); DI_MouseState[id]=NULL; } info=DI_InputInfo; nbdev=DI_NbInputInfo; while(nbdev) { if((GET_DIDEVICE_TYPE(info->type)==DIDEVTYPE_MOUSE)&&(!info->actif)) { if(DXI_ChooseInputDevice(hwnd,id,num,mode)==DXI_OK) { if((info->nbbuttons>=minbutton)&&(info->nbaxes>=minaxe)) return DXI_OK; else { DXI_ReleaseDevice(info); } } } num++; info++; nbdev--; } return DXI_FAIL; } /*-------------------------------------------------------------*/ int DXI_GetJoyInputDevice(HWND hwnd,int id,int mode,int minbutton,int minaxe) { int nbdev,num=0; INPUT_INFO *info; if(id>=MAXJOY) return DXI_FAIL; if(DI_JoyState[id]) { info=DXI_GetInputInfoWithState(DI_JoyState[id],DIDEVTYPE_JOYSTICK); if(info) DXI_ReleaseDevice(info); DI_JoyState[id]=NULL; } info=DI_InputInfo; nbdev=DI_NbInputInfo; while(nbdev) { if((GET_DIDEVICE_TYPE(info->type)==DIDEVTYPE_JOYSTICK)&&(!info->actif)) { if(DXI_ChooseInputDevice(hwnd,id,num,mode)==DXI_OK) { if((info->nbbuttons>=minbutton)&&(info->nbaxes>=minaxe)) return DXI_OK; else { DXI_ReleaseDevice(info); } } } num++; info++; nbdev--; } return DXI_FAIL; } int DXI_GetSCIDInputDevice(HWND hwnd,int id,int mode,int minbutton,int minaxe) { int nbdev,num=0; INPUT_INFO *info; /* if(id>=MAXJOY) return DXI_FAIL; if(DI_JoyState[id]) { info=DXI_GetInputInfoWithState(DI_JoyState[id],DIDEVTYPE_JOYSTICK); if(info) DXI_ReleaseDevice(info); DI_JoyState[id]=NULL; } */ // A checker.... info=DI_InputInfo; nbdev=DI_NbInputInfo; while(nbdev) { if((GET_DIDEVICE_TYPE(info->type)==DIDEVTYPE_DEVICE )&&(!info->actif)) { if (!strcmp("Microsoft SideWinder Strategic Commander",info->name)) if(DXI_ChooseInputDevice(hwnd,id,num,mode)==DXI_OK) { if((info->nbbuttons>=minbutton)&&(info->nbaxes>=minaxe)) return DXI_OK; else { DXI_ReleaseDevice(info); } } } num++; info++; nbdev--; } return DXI_FAIL; } /*-------------------------------------------------------------*/ int DXI_ChooseInputDevice( HWND hwnd, int id, int num, int mode ) { DIDEVCAPS devcaps; INPUT_INFO* info; int flag; DIDATAFORMAT* dformat; if( num >= DI_NbInputInfo ) return DXI_FAIL; info = &DI_InputInfo[num]; DXI_ReleaseDevice( info ); //Old : if( FAILED( DI_Hr = DI_DInput7->lpVtbl->CreateDeviceEx( DI_DInput7, info->guid, &IID_IDirectInputDevice7, &info->inputdevice7, NULL ) ) ) return DXI_FAIL; if( FAILED( DI_Hr = DI_DInput7->CreateDeviceEx(*(info->guid), IID_IDirectInputDevice7, (void**)&info->inputdevice7, NULL ) ) ) return DXI_FAIL; INITSTRUCT( devcaps ); //Old : if( FAILED( DI_Hr = info->inputdevice7->lpVtbl->GetCapabilities( info->inputdevice7, &devcaps ) ) ) return DXI_FAIL; if( FAILED( DI_Hr = info->inputdevice7->GetCapabilities(&devcaps ) ) ) return DXI_FAIL; info->nbbuttons = devcaps.dwButtons; info->nbaxes = devcaps.dwAxes; switch( mode ) { case DXI_MODE_EXCLUSIF_ALLMSG: flag = DISCL_EXCLUSIVE | DISCL_BACKGROUND; break; case DXI_MODE_EXCLUSIF_OURMSG: flag = DISCL_EXCLUSIVE | DISCL_FOREGROUND; break; case DXI_MODE_NONEXCLUSIF_ALLMSG: flag = DISCL_NONEXCLUSIVE | DISCL_BACKGROUND; break; case DXI_MODE_NONEXCLUSIF_OURMSG: flag = DISCL_NONEXCLUSIVE | DISCL_FOREGROUND; break; //ARX_BEGIN: jycorbel (2010-06-30) - clean warning on not-initialized variable // flag should be always set unless 'mode' doesn't match any case which could resume on a fatal error default: ARX_CHECK_NO_ENTRY(); flag = 0; //clean warning //ARX_END: jycorbel (2010-06-30) } //Old : if( FAILED( DI_Hr = info->inputdevice7->lpVtbl->SetCooperativeLevel( info->inputdevice7, hwnd, flag ) ) ) return DXI_FAIL; if( FAILED( DI_Hr = info->inputdevice7->SetCooperativeLevel(hwnd, flag ) ) ) return DXI_FAIL; //Old : if( FAILED( DI_Hr = info->inputdevice7->lpVtbl->EnumObjects( info->inputdevice7, DIEnumDeviceObjectsCallback, (void*)info, DIDFT_ALL ) ) ) return DXI_FAIL; if( FAILED( DI_Hr = info->inputdevice7->EnumObjects(DIEnumDeviceObjectsCallback, (void*)info, DIDFT_ALL ) ) ) return DXI_FAIL; switch( GET_DIDEVICE_TYPE( info->type ) ) { case DIDEVTYPE_MOUSE: { DIPROPDWORD dipdw={ // the header { sizeof(DIPROPDWORD), // diph.dwSize sizeof(DIPROPHEADER), // diph.dwHeaderSize 0, // diph.dwObj DIPH_DEVICE, // diph.dwHow }, // the data 128, // dwData }; info->mousestate=(DIDEVICEOBJECTDATA*)malloc(sizeof(DIDEVICEOBJECTDATA)*(info->nbbuttons+info->nbaxes+INPUT_STATE_ADD)); memset(info->mousestate,0,(sizeof(DIDEVICEOBJECTDATA)*(info->nbbuttons+info->nbaxes+INPUT_STATE_ADD))); // info->old_mousestate=(DIDEVICEOBJECTDATA*)malloc(sizeof(DIDEVICEOBJECTDATA)*(info->nbbuttons+info->nbaxes)); // memset(info->old_mousestate,0,(sizeof(DIDEVICEOBJECTDATA)*(info->nbbuttons+info->nbaxes))); // DI_MouseState[id]=info->mousestate; DI_MouseState[id]=info; if(info->nbbuttons>4) { info->datasid=DFDIMOUSE2; dformat=(DIDATAFORMAT*)&c_dfDIMouse2; } else { info->datasid=DFDIMOUSE; dformat=(DIDATAFORMAT*)&c_dfDIMouse; } //Old : if(FAILED(DI_Hr=info->inputdevice7->lpVtbl->SetProperty(info->inputdevice7,DIPROP_BUFFERSIZE,&dipdw.diph))) return DXI_FAIL; if(FAILED(DI_Hr=info->inputdevice7->SetProperty(DIPROP_BUFFERSIZE,&dipdw.diph))) return DXI_FAIL; } break; case DIDEVTYPE_KEYBOARD: info->datasid=DFDIKEYBOARD; info->bufferstate=(char*)malloc(256); memset(info->bufferstate,0,256); // info->old_bufferstate=(char*)malloc(256); // memset(info->old_bufferstate,0,256); DI_KeyBoardBuffer[id]=info;//->bufferstate; //DI_OldKeyBoardBuffer[id]=info->old_bufferstate; dformat=(DIDATAFORMAT*)&c_dfDIKeyboard; break; case DIDEVTYPE_JOYSTICK: DI_JoyState[id]=info; if(info->nbaxes>2) { info->joystate2=(DIJOYSTATE2*)malloc(sizeof(DIJOYSTATE2)); memset(info->joystate2,0,sizeof(DIJOYSTATE2)); // info->old_joystate2=(DIJOYSTATE2*)malloc(sizeof(DIJOYSTATE2)); // memset(info->old_joystate2,0,sizeof(DIJOYSTATE2)); info->datasid=DFDIJOYSTICK2; dformat=(DIDATAFORMAT*)&c_dfDIJoystick2; } else { info->joystate=(DIJOYSTATE*)malloc(sizeof(DIJOYSTATE)); memset(info->joystate,0,sizeof(DIJOYSTATE)); // info->old_joystate=(DIJOYSTATE*)malloc(sizeof(DIJOYSTATE)); // memset(info->old_joystate,0,sizeof(DIJOYSTATE)); info->datasid=DFDIJOYSTICK; dformat=(DIDATAFORMAT*)&c_dfDIJoystick; } break; default: case DIDEVTYPE_DEVICE: if (!strcmp("Microsoft SideWinder Strategic Commander",info->name)) { DI_SCIDState[id]=info; if(info->nbaxes>2) { info->joystate2=(DIJOYSTATE2*)malloc(sizeof(DIJOYSTATE2)); memset(info->joystate2,0,sizeof(DIJOYSTATE2)); // info->old_joystate2=(DIJOYSTATE2*)malloc(sizeof(DIJOYSTATE2)); // memset(info->old_joystate2,0,sizeof(DIJOYSTATE2)); info->datasid=DFDIJOYSTICK2; dformat=(DIDATAFORMAT*)&c_dfDIJoystick2; } else { info->joystate=(DIJOYSTATE*)malloc(sizeof(DIJOYSTATE)); memset(info->joystate,0,sizeof(DIJOYSTATE)); // info->old_joystate=(DIJOYSTATE*)malloc(sizeof(DIJOYSTATE)); // memset(info->old_joystate,0,sizeof(DIJOYSTATE)); info->datasid=DFDIJOYSTICK; dformat=(DIDATAFORMAT*)&c_dfDIJoystick; } /* DIPROPDWORD dipdw={ // the header { sizeof(DIPROPDWORD), // diph.dwSize sizeof(DIPROPHEADER), // diph.dwHeaderSize 0, // diph.dwObj DIPH_DEVICE, // diph.dwHow }, // the data 16, // dwData }; info->SCIDstate=(DIDEVICEOBJECTDATA*)malloc(sizeof(DIDEVICEOBJECTDATA)*(info->nbbuttons+info->nbaxes)); info->old_SCIDstate=(DIDEVICEOBJECTDATA*)malloc(sizeof(DIDEVICEOBJECTDATA)*(info->nbbuttons+info->nbaxes)); // DI_MouseState[id]=info->mousestate; DI_SCIDState[id]=info; if(info->nbbuttons>4) { info->datasid=DFDIMOUSE2; dformat=(DIDATAFORMAT*)&c_dfDIMouse2; } else { info->datasid=DFDIMOUSE; dformat=(DIDATAFORMAT*)&c_dfDIMouse; } if(FAILED(DI_Hr=info->inputdevice7->SetProperty(info->inputdevice7,DIPROP_BUFFERSIZE,&dipdw.diph))) return DXI_FAIL; */ } else dformat=NULL; break; } if(!dformat) return DXI_FAIL; //Old : if(FAILED(DI_Hr=info->inputdevice7->lpVtbl->SetDataFormat(info->inputdevice7,dformat))) return DXI_FAIL; if(FAILED(DI_Hr=info->inputdevice7->SetDataFormat(dformat))) return DXI_FAIL; //Old : if(FAILED(DI_Hr=info->inputdevice7->lpVtbl->Acquire(info->inputdevice7))) if(FAILED(DI_Hr=info->inputdevice7->Acquire())) {} // info->actif=DEVICENOACTIF; // return DXI_FAIL; //else info->actif=DEVICEACTIF; return DXI_OK; } /*-------------------------------------------------------------*/ DXI_INPUT_INFO * DXI_GetInfoDevice(int num) { DXI_INPUT_INFO *dinf; INPUT_INFO *info; if(num>=DI_NbInputInfo) return NULL; dinf=(DXI_INPUT_INFO*)malloc(sizeof(DXI_INPUT_INFO)); if(!dinf) return NULL; info=&DI_InputInfo[num]; dinf->name=(char*)malloc(strlen(info->name)+1); if(!dinf) { free((void*)dinf); return NULL; } strcpy(dinf->name,info->name); dinf->type=info->type; dinf->numlist=num; if(info->inputdevice7) { dinf->nbbuttons=info->nbbuttons; dinf->nbaxes=info->nbaxes; dinf->info=info->info; } else { dinf->nbbuttons=-1; dinf->nbaxes=-1; dinf->info=-1; } return dinf; } BOOL DXI_CleanAxeMouseZ(int id) { DIDEVICEOBJECTDATA *od; DIDEVICEOBJECTDATA *od2; int nb,flg=0; return FALSE; nb=DI_MouseState[id]->nbele; if(!nb) return FALSE; od=DI_MouseState[id]->mousestate; // od2=DI_MouseState[id]->old_mousestate; while(nb) { switch(od->dwOfs) { case DIMOFS_X: flg++; break; case DIMOFS_Y: flg++; break; case DIMOFS_Z: od->dwData-=od2->dwData; flg++; break; default: break; } od++; od2++; nb--; } return (flg>0); } /*-------------------------------------------------------------*/ void DXI_freeInfoDevice(DXI_INPUT_INFO *dinf) { if(!dinf) return; if(dinf->name) free((void*)dinf->name); free((void*)dinf); } /*-------------------------------------------------------------*/ BOOL DXI_ExecuteAllDevices(BOOL _bKeept) { int nb,nbele; DWORD dwNbele;//ARX: xrichter (2010-06-30) - treat warnings C4057 for 'LPDWORD' differs in indirection to slightly different base types from 'int *' INPUT_INFO *info; BOOL flg=TRUE; void * temp; //DIDEVICEOBJECTDATA * od; //DIDEVICEOBJECTDATA * odd; info=DI_InputInfo; nb=DI_NbInputInfo; while(nb) { if(info->actif) { // union!!! temp=info->mousestate; // info->mousestate=info->old_mousestate; // info->old_mousestate=temp; switch(GET_DIDEVICE_TYPE(info->type)) { //ARX_BEGIN: xrichter (2010-06-30) - treat warnings C4057 for 'LPDWORD' differs in indirection to slightly different base types from 'int *' case DIDEVTYPE_MOUSE: nbele=info->nbbuttons+info->nbaxes+INPUT_STATE_ADD; dwNbele=(DWORD)nbele; //Old : if(FAILED(DI_Hr=info->inputdevice7->lpVtbl->GetDeviceData(info->inputdevice7,sizeof(DIDEVICEOBJECTDATA),info->mousestate,&dwNbele,(_bKeept)?DIGDD_PEEK:0 ))) if(FAILED(DI_Hr=info->inputdevice7->GetDeviceData(sizeof(DIDEVICEOBJECTDATA),info->mousestate,&dwNbele,(_bKeept)?DIGDD_PEEK:0 ))) { nbele=info->nbbuttons+info->nbaxes+INPUT_STATE_ADD; dwNbele=(DWORD)nbele; //Old : if(FAILED(DI_Hr=info->inputdevice7->lpVtbl->GetDeviceData(info->inputdevice7,sizeof(DIDEVICEOBJECTDATA),info->mousestate,&dwNbele,(_bKeept)?DIGDD_PEEK:0 ))) if(FAILED(DI_Hr=info->inputdevice7->GetDeviceData(sizeof(DIDEVICEOBJECTDATA),info->mousestate,&dwNbele,(_bKeept)?DIGDD_PEEK:0 ))) { //Old : info->inputdevice7->lpVtbl->GetDeviceData(info->inputdevice7,sizeof(DIDEVICEOBJECTDATA),info->mousestate,&dwNbele,(_bKeept)?DIGDD_PEEK:0 ); info->inputdevice7->GetDeviceData(sizeof(DIDEVICEOBJECTDATA),info->mousestate,&dwNbele,(_bKeept)?DIGDD_PEEK:0 ); //ARX_END: xrichter (2010-06-30) // DXI_RestoreAllDevices(); // info->actif=DEVICENOACTIF; /* if (DIERR_INPUTLOST == DI_Hr) { // DXI_RestoreAllDevices(); } if (DIERR_NOTACQUIRED == DI_Hr) { // DXI_RestoreAllDevices(); //info->inputdevice7->Acquire } /* if (DIERR_INVALIDPARAM == DI_Hr) MessageBox(NULL,"DIERR_INVALIDPARAM ","",0); if (DIERR_NOTACQUIRED == DI_Hr) MessageBox(NULL,"DIERR_NOTACQUIRED ","",0); if (DIERR_NOTINITIALIZED == DI_Hr) MessageBox(NULL,"DIERR_NOTINITIALIZED ","",0); if (E_PENDING == DI_Hr) MessageBox(NULL,"E_PENDING ","",0); */ flg=FALSE; } } DXI_CleanAxeMouseZ(DXI_MOUSE1); ////////////////////////// // od=info->mousestate; // odd=info->old_mousestate; // od++;od++; // odd++;odd++; // od->dwData-=odd->dwData; nbele=(int)dwNbele; //ARX: xrichter (2010-06-30) - treat warnings C4057 for 'LPDWORD' differs in indirection to slightly different base types from 'int *' info->nbele=nbele; break; case DIDEVTYPE_KEYBOARD: //Old : if(FAILED(DI_Hr=info->inputdevice7->lpVtbl->GetDeviceState(info->inputdevice7,256,(void*)info->bufferstate))) if(FAILED(DI_Hr=info->inputdevice7->GetDeviceState(256,(void*)info->bufferstate))) { DXI_RestoreAllDevices(); //Old : if(FAILED(DI_Hr=info->inputdevice7->lpVtbl->GetDeviceState(info->inputdevice7,256,(void*)info->bufferstate))) if(FAILED(DI_Hr=info->inputdevice7->GetDeviceState(256,(void*)info->bufferstate))) { // DXI_RestoreAllDevices(); /* if (DIERR_INPUTLOST == DI_Hr) { //DXI_RestoreAllDevices(); //Old : info->inputdevice7->lpVtbl->Acquire(info->inputdevice7); info->inputdevice7->Acquire(info->inputdevice7); } if (DIERR_NOTACQUIRED == DI_Hr) { //DXI_RestoreAllDevices(); //Old : info->inputdevice7->lpVtbl->Acquire(info->inputdevice7); info->inputdevice7->Acquire(info->inputdevice7); } if (DIERR_NOTINITIALIZED == DI_Hr) { //Old : info->inputdevice7->lpVtbl->Acquire(info->inputdevice7); info->inputdevice7->Acquire(info->inputdevice7); //MessageBox(NULL,"DIERR_NOTINITIALIZED ","",0); } /* if (DIERR_INVALIDPARAM == DI_Hr) MessageBox(NULL,"DIERR_INVALIDPARAM ","",0); if (DIERR_NOTACQUIRED == DI_Hr) MessageBox(NULL,"DIERR_NOTACQUIRED ","",0); if (DIERR_NOTINITIALIZED == DI_Hr) MessageBox(NULL,"DIERR_NOTINITIALIZED ","",0); if (E_PENDING == DI_Hr) MessageBox(NULL,"E_PENDING ","",0); */ //Old : if(FAILED(DI_Hr=info->inputdevice7->lpVtbl->GetDeviceState(info->inputdevice7,256,(void*)info->bufferstate))) // if(FAILED(DI_Hr=info->inputdevice7->GetDeviceState(256,(void*)info->bufferstate))) memset(info->bufferstate,0,256); //seb 27/03/2002 flg=FALSE; } } break; case DIDEVTYPE_JOYSTICK: //Old : if(FAILED(DI_Hr=info->inputdevice7->lpVtbl->Poll(info->inputdevice7))) flg=FALSE; if(FAILED(DI_Hr=info->inputdevice7->Poll())) flg=FALSE; if(info->datasid==DFDIJOYSTICK2) { //Old : if(FAILED(DI_Hr=info->inputdevice7->lpVtbl->GetDeviceState(info->inputdevice7,sizeof(DIJOYSTATE2),(void*)info->joystate2))) if(FAILED(DI_Hr=info->inputdevice7->GetDeviceState(sizeof(DIJOYSTATE2),(void*)info->joystate2))) flg=FALSE; } else { //Old : if(FAILED(DI_Hr=info->inputdevice7->lpVtbl->GetDeviceState(info->inputdevice7,sizeof(DIJOYSTATE),(void*)info->joystate))) if(FAILED(DI_Hr=info->inputdevice7->GetDeviceState(sizeof(DIJOYSTATE),(void*)info->joystate))) flg=FALSE; } break; default: case DIDEVTYPE_DEVICE: //Old : if(FAILED(DI_Hr=info->inputdevice7->lpVtbl->Poll(info->inputdevice7))) if(FAILED(DI_Hr=info->inputdevice7->Poll())) flg=FALSE; if(info->datasid==DFDIJOYSTICK2) { //Old : if(FAILED(DI_Hr=info->inputdevice7->lpVtbl->GetDeviceState(info->inputdevice7,sizeof(DIJOYSTATE2),(void*)info->joystate2))) if(FAILED(DI_Hr=info->inputdevice7->GetDeviceState(sizeof(DIJOYSTATE2),(void*)info->joystate2))) flg=FALSE; /* else { long togo=sizeof(DIJOYSTATE2); long ii=0; char * dat1=(char *)info->joystate2; char * dat2=(char *)info->old_joystate2; while (iiinputdevice7->lpVtbl->GetDeviceState(info->inputdevice7,sizeof(DIJOYSTATE),(void*)info->SCIDstate))) if(FAILED(DI_Hr=info->inputdevice7->GetDeviceState(sizeof(DIJOYSTATE),(void*)info->SCIDstate))) flg=FALSE; } break; /* nbele=info->nbbuttons+info->nbaxes; // Old : if(FAILED(DI_Hr=info->inputdevice7->lpVtbl->GetDeviceData(info->inputdevice7,sizeof(DIDEVICEOBJECTDATA),info->SCIDstate,&nbele,0))) if(FAILED(DI_Hr=info->inputdevice7->GetDeviceData(sizeof(DIDEVICEOBJECTDATA),info->SCIDstate,&nbele,0))) flg=FALSE; info->nbele=nbele; break;*/ } } info++; nb--; } return flg; } /*-------------------------------------------------------------*/ BOOL DXI_KeyPressed(int id,int dikkey) { if(DI_KeyBoardBuffer[id]->bufferstate[dikkey]&0x80) return TRUE; return FALSE; } BOOL DXI_OldKeyPressed(int id,int dikkey) { //if(DI_InputInfo->old_bufferstate[id*dikkey]&0x80) return TRUE; // if(DI_KeyBoardBuffer[id]->old_bufferstate[dikkey]&0x80) return TRUE; return FALSE; } /*-------------------------------------------------------------*/ int DXI_GetKeyIDPressed(int id) { int nb; char *buf; buf=DI_KeyBoardBuffer[id]->bufferstate; nb=256; while(nb) { if((*buf)&0x80) return 256-nb; buf++; nb--; } return -1; } void DXI_ClearKeys(int id) { memset(DI_KeyBoardBuffer[id],0,256); } /*-------------------------------------------------------------*/ BOOL DXI_GetAxeMouseXY(int id,int *mx,int *my) { DIDEVICEOBJECTDATA *od; int nb,flg=0; nb=DI_MouseState[id]->nbele; if(!nb) return FALSE; od=DI_MouseState[id]->mousestate; while(nb) { switch(od->dwOfs) { case DIMOFS_X: *mx=od->dwData; flg++; break; case DIMOFS_Y: *my=od->dwData; flg++; break; default: break; } od++; nb--; } return(flg>0); } /*-------------------------------------------------------------*/ BOOL DXI_GetAxeMouseXYZ(int id,int *mx,int *my,int *mz) { DIDEVICEOBJECTDATA *od; int nb,flg=0; *mx=*my=*mz=0; nb=DI_MouseState[id]->nbele; if(!nb) return FALSE; od=DI_MouseState[id]->mousestate; while(nb) { switch(od->dwOfs) { case DIMOFS_X: *mx+=od->dwData; flg++; break; case DIMOFS_Y: *my+=od->dwData; flg++; break; case DIMOFS_Z: *mz+=od->dwData; flg++; break; default: break; } od++; nb--; } return (flg>0); } /*-------------------------------------------------------------*/ BOOL DXI_MouseButtonImage(int id,int numb) { DIDEVICEOBJECTDATA *od; int state,nb; static FILE *fTemp=NULL; if(!fTemp) { fTemp=fopen("c:\\temp\\dinput.txt","wb"); } nb=DI_MouseState[id]->nbele; if(!nb) return FALSE; od=DI_MouseState[id]->mousestate; while(nb) { switch(numb) { case DXI_BUTTON0: if(od->dwOfs==DIMOFS_BUTTON0) { state=od->dwData; if(state&0x80) { fprintf(fTemp,"1"); } else { fprintf(fTemp,"0"); } } break; case DXI_BUTTON1: if(od->dwOfs==DIMOFS_BUTTON1) { state=od->dwData; if(state&0x80) { fprintf(fTemp,"1"); } else { fprintf(fTemp,"0"); } } break; case DXI_BUTTON2: break; case DXI_BUTTON3: break; case DXI_BUTTON4: break; case DXI_BUTTON5: break; case DXI_BUTTON6: break; case DXI_BUTTON7: break; default: return FALSE; } od++; nb--; } fprintf(fTemp,"\r\n---------\r\n"); return TRUE; } /*-------------------------------------------------------------*/ void DXI_MouseButtonCountClick(int id,int numb,int *_iNumClick,int *_iNumUnClick) { DIDEVICEOBJECTDATA *od; int state,nb; *_iNumClick=0; *_iNumUnClick=0; nb=DI_MouseState[id]->nbele; if(!nb) return; od=DI_MouseState[id]->mousestate; while(nb) { switch(numb) { case DXI_BUTTON0: if(od->dwOfs==DIMOFS_BUTTON0) { state=od->dwData; if(state&0x80) { *_iNumClick+=1; } else { *_iNumUnClick+=1; } } break; case DXI_BUTTON1: if(od->dwOfs==DIMOFS_BUTTON1) { state=od->dwData; if(state&0x80) { *_iNumClick+=1; } else { *_iNumUnClick+=1; } } break; case DXI_BUTTON2: if(od->dwOfs==DIMOFS_BUTTON2) { state=od->dwData; if(state&0x80) { *_iNumClick+=1; } else { *_iNumUnClick+=1; } } break; case DXI_BUTTON3: if(od->dwOfs==DIMOFS_BUTTON3) { state=od->dwData; if(state&0x80) { *_iNumClick+=1; } else { *_iNumUnClick+=1; } } break; case DXI_BUTTON4: if(od->dwOfs==DIMOFS_BUTTON4) { state=od->dwData; if(state&0x80) { *_iNumClick+=1; } else { *_iNumUnClick+=1; } } break; case DXI_BUTTON5: if(od->dwOfs==DIMOFS_BUTTON5) { state=od->dwData; if(state&0x80) { *_iNumClick+=1; } else { *_iNumUnClick+=1; } } break; case DXI_BUTTON6: if(od->dwOfs==DIMOFS_BUTTON6) { state=od->dwData; if(state&0x80) { *_iNumClick+=1; } else { *_iNumUnClick+=1; } } break; case DXI_BUTTON7: if(od->dwOfs==DIMOFS_BUTTON7) { state=od->dwData; if(state&0x80) { *_iNumClick+=1; } else { *_iNumUnClick+=1; } } break; default: break; } od++; nb--; } } /*-------------------------------------------------------------*/ BOOL DXI_MouseButtonPressed(int id,int numb,int *_iDeltaTime) { DIDEVICEOBJECTDATA *od; int state,iTime1,iTime2,nb; BOOL bResult; nb=DI_MouseState[id]->nbele; if(!nb) return FALSE; od=DI_MouseState[id]->mousestate; iTime1=iTime2=0; while(nb) { bResult=FALSE; switch(numb) { case DXI_BUTTON0: if(od->dwOfs==DIMOFS_BUTTON0) { state=od->dwData; if(state&0x80) { bResult=TRUE; } } break; case DXI_BUTTON1: if(od->dwOfs==DIMOFS_BUTTON1) { state=od->dwData; if(state&0x80) { bResult=TRUE; } } break; case DXI_BUTTON2: if(od->dwOfs==DIMOFS_BUTTON2) { state=od->dwData; if(state&0x80) { bResult=TRUE; } } break; case DXI_BUTTON3: if(od->dwOfs==DIMOFS_BUTTON3) { state=od->dwData; if(state&0x80) { bResult=TRUE; } } break; case DXI_BUTTON4: if(od->dwOfs==DIMOFS_BUTTON4) { state=od->dwData; if(state&0x80) { bResult=TRUE; } } break; case DXI_BUTTON5: if(od->dwOfs==DIMOFS_BUTTON5) { state=od->dwData; if(state&0x80) { bResult=TRUE; } } break; case DXI_BUTTON6: if(od->dwOfs==DIMOFS_BUTTON6) { state=od->dwData; if(state&0x80) { bResult=TRUE; } } break; case DXI_BUTTON7: if(od->dwOfs==DIMOFS_BUTTON7) { state=od->dwData; if(state&0x80) { bResult=TRUE; } } break; default: return FALSE; } if(bResult) { if(!iTime1) { iTime1=od->dwTimeStamp; } else { iTime2=od->dwTimeStamp; } } od++; nb--; } if(!iTime2) { *_iDeltaTime=0; } else { *_iDeltaTime=iTime2-iTime1; } return (iTime1)?TRUE:FALSE; } /*-------------------------------------------------------------*/ BOOL DXI_MouseButtonUnPressed(int id,int numb) { DIDEVICEOBJECTDATA *od; int state,nb; nb=DI_MouseState[id]->nbele; if(!nb) return FALSE; od=DI_MouseState[id]->mousestate; state=0x80; while(nb) { // state=0x80; switch(numb) { case DXI_BUTTON0: if(od->dwOfs==DIMOFS_BUTTON0) state=od->dwData; break; case DXI_BUTTON1: if(od->dwOfs==DIMOFS_BUTTON1) state=od->dwData; break; case DXI_BUTTON2: if(od->dwOfs==DIMOFS_BUTTON2) state=od->dwData; break; case DXI_BUTTON3: if(od->dwOfs==DIMOFS_BUTTON3) state=od->dwData; break; case DXI_BUTTON4: if(od->dwOfs==DIMOFS_BUTTON4) state=od->dwData; break; case DXI_BUTTON5: if(od->dwOfs==DIMOFS_BUTTON5) state=od->dwData; break; case DXI_BUTTON6: if(od->dwOfs==DIMOFS_BUTTON6) state=od->dwData; break; case DXI_BUTTON7: if(od->dwOfs==DIMOFS_BUTTON7) state=od->dwData; break; default: return FALSE; } // if(!(state&0x80)) return TRUE; od++; nb--; } if(!(state&0x80)) return TRUE; return FALSE; } BOOL DXI_OldMouseButtonPressed(int id,int numb) { DIDEVICEOBJECTDATA *od; int state,nb; return FALSE; nb=DI_MouseState[id]->nbele; if(!nb) return FALSE; // od=DI_MouseState[id]->old_mousestate; while(nb) { state=0; switch(numb) { case DXI_BUTTON0: if(od->dwOfs==DIMOFS_BUTTON0) state=od->dwData; break; case DXI_BUTTON1: if(od->dwOfs==DIMOFS_BUTTON1) state=od->dwData; break; case DXI_BUTTON2: if(od->dwOfs==DIMOFS_BUTTON2) state=od->dwData; break; case DXI_BUTTON3: if(od->dwOfs==DIMOFS_BUTTON3) state=od->dwData; break; case DXI_BUTTON4: if(od->dwOfs==DIMOFS_BUTTON4) state=od->dwData; break; case DXI_BUTTON5: if(od->dwOfs==DIMOFS_BUTTON5) state=od->dwData; break; case DXI_BUTTON6: if(od->dwOfs==DIMOFS_BUTTON6) state=od->dwData; break; case DXI_BUTTON7: if(od->dwOfs==DIMOFS_BUTTON7) state=od->dwData; break; default: return FALSE; } if(state&0x80) return TRUE; od++; nb--; } return FALSE; } int DXI_GetSCIDAxis(int id,int *jx,int *jy,int *jz) { INPUT_INFO *io; int dir; dir=DXI_JOYNONE; io=DI_SCIDState[id]; if(io->datasid==DFDIJOYSTICK2) { { DIJOYSTATE2 *js; js=io->joystate2; *jx=js->lX; *jy=js->lY; *jz=js->lRz;//>lZ; if(js->lX>0) { dir|=DXI_JOYRIGHT; } else { if(js->lX<0) { dir|=DXI_JOYLEFT; } } if(js->lY>0) { dir|=DXI_JOYDOWN; } else { if(js->lY<0) { dir|=DXI_JOYUP; } } } } else { { DIJOYSTATE *js; js=io->joystate; *jx=js->lX; *jy=js->lY; *jz=js->lZ; if(js->lX>0) { dir|=DXI_JOYRIGHT; } else { if(js->lX<0) { dir|=DXI_JOYLEFT; } } if(js->lY>0) { dir|=DXI_JOYDOWN; } else { if(js->lY<0) { dir|=DXI_JOYUP; } } } } return dir; } BOOL DXI_IsSCIDButtonPressed(int id,int numb) { INPUT_INFO *io; io=DI_SCIDState[id]; if(io->datasid==DFDIJOYSTICK2) { { DIJOYSTATE2 *js; js=io->joystate2; if(js->rgbButtons[numb]&0x80) return TRUE; } } else { { DIJOYSTATE *js; js=io->joystate; if(js->rgbButtons[numb]&0x80) return TRUE; } } return FALSE; } int DXI_GetSCIDButtonPressed(int id) { INPUT_INFO *io; int nb; io=DI_SCIDState[id]; if(io->datasid==DFDIJOYSTICK2) { { DIJOYSTATE2 *js; js=io->joystate2; nb=128; while(nb--) { if (nb==9) nb=9; if(js->rgbButtons[nb]&0x80) return nb; } } } else { { DIJOYSTATE *js; js=io->joystate; nb=32; while(nb--) { if(js->rgbButtons[nb]&0x80) return nb; } } } return -1; } /* DIDEVICEOBJECTDATA *od; int nb; nb=DI_SCIDState[id]->nbele; if(!nb) return -1; od=DI_SCIDState[id]->SCIDstate; while(nb) { switch(od->dwOfs) { case DIMOFS_BUTTON0: if(od->dwData&0x80) return DXI_BUTTON0; break; case DIMOFS_BUTTON1: if(od->dwData&0x80) return DXI_BUTTON1; break; case DIMOFS_BUTTON2: if(od->dwData&0x80) return DXI_BUTTON2; break; case DIMOFS_BUTTON3: if(od->dwData&0x80) return DXI_BUTTON3; break; case DIMOFS_BUTTON4: if(od->dwData&0x80) return DXI_BUTTON4; break; case DIMOFS_BUTTON5: if(od->dwData&0x80) return DXI_BUTTON5; break; case DIMOFS_BUTTON6: if(od->dwData&0x80) return DXI_BUTTON6; break; case DIMOFS_BUTTON7: if(od->dwData&0x80) return DXI_BUTTON7; break; case DIMOFS_BUTTON8: if(od->dwData&0x80) return DXI_BUTTON8; break; case DIMOFS_BUTTON9: if(od->dwData&0x80) return DXI_BUTTON9; break; case DIMOFS_BUTTON10: if(od->dwData&0x80) return DXI_BUTTON10; break; case DIMOFS_BUTTON11: if(od->dwData&0x80) return DXI_BUTTON11; break; case DIMOFS_BUTTON12: if(od->dwData&0x80) return DXI_BUTTON12; break; case DIMOFS_BUTTON13: if(od->dwData&0x80) return DXI_BUTTON13; break; case DIMOFS_BUTTON14: if(od->dwData&0x80) return DXI_BUTTON14; break; case DIMOFS_BUTTON15: if(od->dwData&0x80) return DXI_BUTTON15; break; default: break; } od++; nb--; } return -1; } */ /*-------------------------------------------------------------*/ int DXI_GetIDButtonPressed(int id) { DIDEVICEOBJECTDATA *od; int nb; nb=DI_MouseState[id]->nbele; if(!nb) return -1; od=DI_MouseState[id]->mousestate; while(nb) { switch(od->dwOfs) { case DIMOFS_BUTTON0: if(od->dwData&0x80) return DXI_BUTTON0; break; case DIMOFS_BUTTON1: if(od->dwData&0x80) return DXI_BUTTON1; break; case DIMOFS_BUTTON2: if(od->dwData&0x80) return DXI_BUTTON2; break; case DIMOFS_BUTTON3: if(od->dwData&0x80) return DXI_BUTTON3; break; case DIMOFS_BUTTON4: if(od->dwData&0x80) return DXI_BUTTON4; break; case DIMOFS_BUTTON5: if(od->dwData&0x80) return DXI_BUTTON5; break; case DIMOFS_BUTTON6: if(od->dwData&0x80) return DXI_BUTTON6; break; case DIMOFS_BUTTON7: if(od->dwData&0x80) return DXI_BUTTON7; break; default: break; } od++; nb--; } return -1; } /*-------------------------------------------------------------*/ int DXI_SetMouseRelative(int id) { INPUT_INFO *info; DIPROPDWORD dipdw={ { sizeof(DIPROPDWORD), // diph.dwSize sizeof(DIPROPHEADER), // diph.dwHeaderSize 0, // diph.dwObj DIPH_DEVICE, // diph.dwHow }, DIPROPAXISMODE_REL, // dwData }; info=DXI_GetInputInfoWithState((void*)DI_MouseState[id],DIDEVTYPE_MOUSE); //Old : if(FAILED(DI_Hr=info->inputdevice7->lpVtbl->Unacquire(info->inputdevice7))) return DXI_FAIL; if(FAILED(DI_Hr=info->inputdevice7->Unacquire())) return DXI_FAIL; //Old : if(FAILED(DI_Hr=info->inputdevice7->lpVtbl->SetProperty(info->inputdevice7,DIPROP_AXISMODE,&dipdw.diph))) return DXI_FAIL; if(FAILED(DI_Hr=info->inputdevice7->SetProperty(DIPROP_AXISMODE,&dipdw.diph))) return DXI_FAIL; //Old : if(FAILED(DI_Hr=info->inputdevice7->lpVtbl->Acquire(info->inputdevice7))) return DXI_FAIL; if(FAILED(DI_Hr=info->inputdevice7->Acquire())) return DXI_FAIL; return DXI_OK; } /*-------------------------------------------------------------*/ int DXI_SetMouseAbsolue(int id) { INPUT_INFO *info; DIPROPDWORD dipdw={ { sizeof(DIPROPDWORD), // diph.dwSize sizeof(DIPROPHEADER), // diph.dwHeaderSize 0, // diph.dwObj DIPH_DEVICE, // diph.dwHow }, DIPROPAXISMODE_ABS, // dwData }; info=DXI_GetInputInfoWithState((void*)DI_MouseState[id],DIDEVTYPE_MOUSE); //Old : if(FAILED(DI_Hr=info->inputdevice7->lpVtbl->Unacquire(info->inputdevice7))) return DXI_FAIL; if(FAILED(DI_Hr=info->inputdevice7->Unacquire())) return DXI_FAIL; //Old : if(FAILED(DI_Hr=info->inputdevice7->lpVtbl->SetProperty(info->inputdevice7,DIPROP_AXISMODE,&dipdw.diph))) return DXI_FAIL; if(FAILED(DI_Hr=info->inputdevice7->SetProperty(DIPROP_AXISMODE,&dipdw.diph))) return DXI_FAIL; //Old : if(FAILED(DI_Hr=info->inputdevice7->lpVtbl->Acquire(info->inputdevice7))) return DXI_FAIL; if(FAILED(DI_Hr=info->inputdevice7->Acquire())) return DXI_FAIL; return DXI_OK; } /*-------------------------------------------------------------*/ int DXI_GetAxeJoyXY(int id,int *jx,int *jy) { INPUT_INFO *io; int dir; dir=DXI_JOYNONE; io=DI_JoyState[id]; if(io->datasid==DFDIJOYSTICK2) { { DIJOYSTATE2 *js; js=io->joystate2; *jx=js->lX; *jy=js->lY; if(js->lX>0) { dir|=DXI_JOYRIGHT; } else { if(js->lX<0) { dir|=DXI_JOYLEFT; } } if(js->lY>0) { dir|=DXI_JOYDOWN; } else { if(js->lY<0) { dir|=DXI_JOYUP; } } } } else { { DIJOYSTATE *js; js=io->joystate; *jx=js->lX; *jy=js->lY; if(js->lX>0) { dir|=DXI_JOYRIGHT; } else { if(js->lX<0) { dir|=DXI_JOYLEFT; } } if(js->lY>0) { dir|=DXI_JOYDOWN; } else { if(js->lY<0) { dir|=DXI_JOYUP; } } } } return dir; } /*-------------------------------------------------------------*/ int DXI_GetAxeJoyXYZ(int id,int *jx,int *jy,int *jz) { INPUT_INFO *io; int dir; dir=DXI_JOYNONE; io=DI_JoyState[id]; if(io->datasid==DFDIJOYSTICK2) { { DIJOYSTATE2 *js; js=io->joystate2; *jx=js->lX; *jy=js->lY; *jz=js->lZ; if(js->lX>0) { dir|=DXI_JOYRIGHT; } else { if(js->lX<0) { dir|=DXI_JOYLEFT; } } if(js->lY>0) { dir|=DXI_JOYDOWN; } else { if(js->lY<0) { dir|=DXI_JOYUP; } } } } else { { DIJOYSTATE *js; js=io->joystate; *jx=js->lX; *jy=js->lY; *jz=js->lZ; if(js->lX>0) { dir|=DXI_JOYRIGHT; } else { if(js->lX<0) { dir|=DXI_JOYLEFT; } } if(js->lY>0) { dir|=DXI_JOYDOWN; } else { if(js->lY<0) { dir|=DXI_JOYUP; } } } } return dir; } /*-------------------------------------------------------------*/ int DXI_GetAxeJoyXYZW(int id,int *jx,int *jy,int *jz,int * jw) { INPUT_INFO *io; //int dir; // dir=DXI_JOYNONE; io=DI_JoyState[id]; if(io->datasid==DFDIJOYSTICK2) { DIJOYSTATE2 *js; js=io->joystate2; *jx=js->lX; *jy=js->lY; *jz=js->lRz; *jw=js->rglSlider[0]; } else { DIJOYSTATE *js; js=io->joystate; *jx=js->lX; *jy=js->lY; *jz=js->lZ; *jw=0;//js->rglSlider; } return 1; } /*-------------------------------------------------------------*/ int DXI_SetJoyRelative(int id) { INPUT_INFO *info; DIPROPDWORD dipdw={ { sizeof(DIPROPDWORD), // diph.dwSize sizeof(DIPROPHEADER), // diph.dwHeaderSize 0, // diph.dwObj DIPH_DEVICE, // diph.dwHow }, DIPROPAXISMODE_REL, // dwData }; info=DXI_GetInputInfoWithState((void*)DI_JoyState[id],DIDEVTYPE_JOYSTICK); //Old : if(FAILED(DI_Hr=info->inputdevice7->lpVtbl->Unacquire(info->inputdevice7))) return DXI_FAIL; if(FAILED(DI_Hr=info->inputdevice7->Unacquire())) return DXI_FAIL; //Old : if(FAILED(DI_Hr=info->inputdevice7->lpVtbl->SetProperty(info->inputdevice7,DIPROP_AXISMODE,&dipdw.diph))) return DXI_FAIL; if(FAILED(DI_Hr=info->inputdevice7->SetProperty(DIPROP_AXISMODE,&dipdw.diph))) return DXI_FAIL; //Old : if(FAILED(DI_Hr=info->inputdevice7->lpVtbl->Acquire(info->inputdevice7))) return DXI_FAIL; if(FAILED(DI_Hr=info->inputdevice7->Acquire())) return DXI_FAIL; return DXI_OK; } /*-------------------------------------------------------------*/ int DXI_SetJoyAbsolue(int id) { INPUT_INFO *info; DIPROPDWORD dipdw={ { sizeof(DIPROPDWORD), // diph.dwSize sizeof(DIPROPHEADER), // diph.dwHeaderSize 0, // diph.dwObj DIPH_DEVICE, // diph.dwHow }, DIPROPAXISMODE_ABS, // dwData }; info=DXI_GetInputInfoWithState((void*)DI_JoyState[id],DIDEVTYPE_JOYSTICK); //Old : if(FAILED(DI_Hr=info->inputdevice7->lpVtbl->Unacquire(info->inputdevice7))) return DXI_FAIL; if(FAILED(DI_Hr=info->inputdevice7->Unacquire())) return DXI_FAIL; //Old : if(FAILED(DI_Hr=info->inputdevice7->lpVtbl->SetProperty(info->inputdevice7,DIPROP_AXISMODE,&dipdw.diph))) return DXI_FAIL; if(FAILED(DI_Hr=info->inputdevice7->SetProperty(DIPROP_AXISMODE,&dipdw.diph))) return DXI_FAIL; //Old : if(FAILED(DI_Hr=info->inputdevice7->lpVtbl->Acquire(info->inputdevice7))) return DXI_FAIL; if(FAILED(DI_Hr=info->inputdevice7->Acquire())) return DXI_FAIL; return DXI_OK; } /*-------------------------------------------------------------*/ int DXI_SetRangeJoy(int id,int axe,int range) { INPUT_INFO *info; DIPROPRANGE diprg; DIPROPDWORD dipdw={ { sizeof(DIPROPDWORD), // diph.dwSize sizeof(DIPROPHEADER), // diph.dwHeaderSize 0, // diph.dwObj DIPH_BYOFFSET, // diph.dwHow }, 0, // dwData }; if(!range) return DXI_FAIL; info=DXI_GetInputInfoWithState((void*)DI_JoyState[id],DIDEVTYPE_JOYSTICK); diprg.diph.dwSize=sizeof(diprg); diprg.diph.dwHeaderSize=sizeof(diprg.diph); switch(axe) { case DXI_XAxis: diprg.diph.dwObj=DIJOFS_X; dipdw.diph.dwObj=DIJOFS_X; break; case DXI_YAxis: diprg.diph.dwObj=DIJOFS_Y; dipdw.diph.dwObj=DIJOFS_Y; break; case DXI_ZAxis: diprg.diph.dwObj=DIJOFS_Z; dipdw.diph.dwObj=DIJOFS_Z; break; case DXI_RzAxis: diprg.diph.dwObj=DIJOFS_RZ; dipdw.diph.dwObj=DIJOFS_RZ; break; case DXI_Slider: diprg.diph.dwObj=DIJOFS_SLIDER(0); dipdw.diph.dwObj=DIJOFS_SLIDER(0); break; default: return DXI_FAIL; } diprg.diph.dwHow=DIPH_BYOFFSET; diprg.lMin=-range; diprg.lMax=range; dipdw.dwData=5000; //Old : if(FAILED(DI_Hr=info->inputdevice7->lpVtbl->SetProperty(info->inputdevice7,DIPROP_RANGE,&diprg.diph))) return DXI_FAIL; if(FAILED(DI_Hr=info->inputdevice7->SetProperty(DIPROP_RANGE,&diprg.diph))) return DXI_FAIL; //Old : if(FAILED(DI_Hr=info->inputdevice7->lpVtbl->SetProperty(info->inputdevice7,DIPROP_DEADZONE,&dipdw.diph))) return DXI_FAIL; if(FAILED(DI_Hr=info->inputdevice7->SetProperty(DIPROP_DEADZONE,&dipdw.diph))) return DXI_FAIL; return DXI_OK; } /*-------------------------------------------------------------*/ BOOL DXI_GetJoyButtonPressed(int id,int numb) { INPUT_INFO *io; io=DI_JoyState[id]; if(io->datasid==DFDIJOYSTICK2) { { DIJOYSTATE2 *js; js=io->joystate2; if(js->rgbButtons[numb]&0x80) return TRUE; } } else { { DIJOYSTATE *js; js=io->joystate; if(js->rgbButtons[numb]&0x80) return TRUE; } } return FALSE; } BOOL DXI_OldGetJoyButtonPressed(int id,int numb) { INPUT_INFO *io; return FALSE; io=DI_JoyState[id]; if(io->datasid==DFDIJOYSTICK2) { { DIJOYSTATE2 *js; // js=io->old_joystate2; if(js->rgbButtons[numb]&0x80) return TRUE; } } else { { DIJOYSTATE *js; // js=io->old_joystate; if(js->rgbButtons[numb]&0x80) return TRUE; } } return FALSE; } /*-------------------------------------------------------------*/ int DXI_GetIDJoyButtonPressed(int id) { INPUT_INFO *io; int nb; io=DI_JoyState[id]; if(io->datasid==DFDIJOYSTICK2) { { DIJOYSTATE2 *js; js=io->joystate2; nb=128; while(nb--) { if(js->rgbButtons[nb]&0x80) return nb; } } } else { { DIJOYSTATE *js; js=io->joystate; nb=32; while(nb--) { if(js->rgbButtons[nb]&0x80) return nb; } } } return -1; } /*-------------------------------------------------------------*/