This commit is contained in:
2025-11-28 23:13:44 +05:30
commit a3a8e79709
7360 changed files with 1156074 additions and 0 deletions

View File

@ -0,0 +1,398 @@
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions
// are met:
// * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above copyright
// notice, this list of conditions and the following disclaimer in the
// documentation and/or other materials provided with the distribution.
// * Neither the name of NVIDIA CORPORATION nor the names of its
// contributors may be used to endorse or promote products derived
// from this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY
// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
//
// Copyright (c) 2008-2021 NVIDIA Corporation. All rights reserved.
#include <linux/LinuxSampleUserInput.h>
#include <X11/keysym.h>
#include <stdio.h>
static bool gTimeInit=false;
using namespace SampleFramework;
using namespace physx;
LinuxSampleUserInput::LinuxSampleUserInput()
{
// register all user inputs for linux platform
registerUserInput(LINUXKEY_1,"KEY_1", "1");
registerUserInput(LINUXKEY_2,"KEY_2", "2");
registerUserInput(LINUXKEY_3,"KEY_3", "3");
registerUserInput(LINUXKEY_4,"KEY_4", "4");
registerUserInput(LINUXKEY_5,"KEY_5", "5");
registerUserInput(LINUXKEY_6,"KEY_6", "6");
registerUserInput(LINUXKEY_7,"KEY_7", "7");
registerUserInput(LINUXKEY_8,"KEY_8", "8");
registerUserInput(LINUXKEY_9,"KEY_9", "9");
registerUserInput(LINUXKEY_0,"KEY_0", "0");
registerUserInput(LINUXKEY_A,"KEY_A", "A");
registerUserInput(LINUXKEY_B,"KEY_B", "B");
registerUserInput(LINUXKEY_C,"KEY_C", "C");
registerUserInput(LINUXKEY_D,"KEY_D", "D");
registerUserInput(LINUXKEY_E,"KEY_E", "E");
registerUserInput(LINUXKEY_F,"KEY_F", "F");
registerUserInput(LINUXKEY_G,"KEY_G", "G");
registerUserInput(LINUXKEY_H,"KEY_H", "H");
registerUserInput(LINUXKEY_I,"KEY_I", "I");
registerUserInput(LINUXKEY_J,"KEY_J", "J");
registerUserInput(LINUXKEY_K,"KEY_K", "K");
registerUserInput(LINUXKEY_L,"KEY_L", "L");
registerUserInput(LINUXKEY_M,"KEY_M", "M");
registerUserInput(LINUXKEY_N,"KEY_N", "N");
registerUserInput(LINUXKEY_O,"KEY_O", "O");
registerUserInput(LINUXKEY_P,"KEY_P", "P");
registerUserInput(LINUXKEY_Q,"KEY_Q", "Q");
registerUserInput(LINUXKEY_R,"KEY_R", "R");
registerUserInput(LINUXKEY_S,"KEY_S", "S");
registerUserInput(LINUXKEY_T,"KEY_T", "T");
registerUserInput(LINUXKEY_U,"KEY_U", "U");
registerUserInput(LINUXKEY_V,"KEY_V", "V");
registerUserInput(LINUXKEY_W,"KEY_W", "W");
registerUserInput(LINUXKEY_X,"KEY_X", "X");
registerUserInput(LINUXKEY_Y,"KEY_Y", "Y");
registerUserInput(LINUXKEY_Z,"KEY_Z", "Z");
registerUserInput(LINUXKEY_SPACE ,"KEY_SPACE","Space");
registerUserInput(LINUXKEY_RETURN ,"KEY_RETURN","Enter");
registerUserInput(LINUXKEY_SHIFT ,"KEY_SHIFT","Shift");
registerUserInput(LINUXKEY_CONTROL ,"KEY_CONTROL","Control");
registerUserInput(LINUXKEY_ESCAPE ,"KEY_ESCAPE","Escape");
registerUserInput(LINUXKEY_COMMA ,"KEY_COMMA",",");
registerUserInput(LINUXKEY_NUMPAD0 ,"KEY_NUMPAD0","Numpad0");
registerUserInput(LINUXKEY_NUMPAD1 ,"KEY_NUMPAD1","Numpad1");
registerUserInput(LINUXKEY_NUMPAD2 ,"KEY_NUMPAD2","Numpad2");
registerUserInput(LINUXKEY_NUMPAD3 ,"KEY_NUMPAD3","Numpad3");
registerUserInput(LINUXKEY_NUMPAD4 ,"KEY_NUMPAD4","Numpad4");
registerUserInput(LINUXKEY_NUMPAD5 ,"KEY_NUMPAD5","Numpad5");
registerUserInput(LINUXKEY_NUMPAD6 ,"KEY_NUMPAD6","Numpad6");
registerUserInput(LINUXKEY_NUMPAD7 ,"KEY_NUMPAD7","Numpad7");
registerUserInput(LINUXKEY_NUMPAD8 ,"KEY_NUMPAD8","Numpad8");
registerUserInput(LINUXKEY_NUMPAD9 ,"KEY_NUMPAD9","Numpad9");
registerUserInput(LINUXKEY_ADD ,"KEY_ADD","+");
registerUserInput(LINUXKEY_SUBTRACT ,"KEY_SUBTRACT","-");
registerUserInput(LINUXKEY_COMMA ,"KEY_COMMM",", on keypad");
registerUserInput(LINUXKEY_DIVIDE ,"KEY_DIVIDE","/");
registerUserInput(LINUXKEY_F1 ,"KEY_F1","F1");
registerUserInput(LINUXKEY_F2 ,"KEY_F2","F2");
registerUserInput(LINUXKEY_F3 ,"KEY_F3","F3");
registerUserInput(LINUXKEY_F4 ,"KEY_F4","F4");
registerUserInput(LINUXKEY_F5 ,"KEY_F5","F5");
registerUserInput(LINUXKEY_F6 ,"KEY_F6","F6");
registerUserInput(LINUXKEY_F7 ,"KEY_F7","F7");
registerUserInput(LINUXKEY_F8 ,"KEY_F8","F8");
registerUserInput(LINUXKEY_F9 ,"KEY_F9","F9");
registerUserInput(LINUXKEY_F10 ,"KEY_F10","F10");
registerUserInput(LINUXKEY_F11 ,"KEY_F11","F11");
registerUserInput(LINUXKEY_F12 ,"KEY_F12","F12");
registerUserInput(LINUXKEY_TAB ,"KEY_TAB","Tab");
registerUserInput(LINUXKEY_BACKSPACE ,"KEY_BACKSPACE","Backspace");
registerUserInput(LINUXKEY_PRIOR ,"KEY_PRIOR","PgUp");
registerUserInput(LINUXKEY_NEXT ,"KEY_NEXT","PgDn");
registerUserInput(LINUXKEY_UP ,"KEY_UP","Up Arrow");
registerUserInput(LINUXKEY_DOWN ,"KEY_DOWN","Down Arrow");
registerUserInput(LINUXKEY_LEFT ,"KEY_LEFT","Left Arrow");
registerUserInput(LINUXKEY_RIGHT ,"KEY_RIGHT","Right Arrow");
// mouse
registerUserInput(MOUSE_BUTTON_LEFT ,"MOUSE_BUTTON_LEFT","Left Mouse Button");
registerUserInput(MOUSE_BUTTON_RIGHT ,"MOUSE_BUTTON_RIGHT","Right Mouse Button");
registerUserInput(MOUSE_BUTTON_CENTER ,"MOUSE_BUTTON_CENTER","Middle Mouse Button");
registerUserInput(MOUSE_MOVE,"MOUSE_MOVE", "Mouse Move");
// scan codes
registerScanCode(SCAN_CODE_UP, 26, LINUXKEY_E, "SCAN_CODE_E");
registerScanCode(SCAN_CODE_DOWN, 54, LINUXKEY_C, "SCAN_CODE_C");
registerScanCode(SCAN_CODE_LEFT, 38, LINUXKEY_A, "SCAN_CODE_A");
registerScanCode(SCAN_CODE_RIGHT, 40, LINUXKEY_D, "SCAN_CODE_D");
registerScanCode(SCAN_CODE_FORWARD, 25, LINUXKEY_W, "SCAN_CODE_W");
registerScanCode(SCAN_CODE_BACKWARD, 39, LINUXKEY_S, "SCAN_CODE_S");
registerScanCode(SCAN_CODE_L, 46, LINUXKEY_L, "SCAN_CODE_L");
registerScanCode(SCAN_CODE_9, 18, LINUXKEY_9, "SCAN_CODE_9");
registerScanCode(SCAN_CODE_0, 19, LINUXKEY_0, "SCAN_CODE_0");
}
void LinuxSampleUserInput::registerScanCode(LinuxSampleUserInputIds scanCodeId, physx::PxU16 scanCode, LinuxSampleUserInputIds nameId, const char* name)
{
const UserInput* ui = getUserInputFromId(nameId);
if(ui)
{
registerUserInput(scanCodeId, name, ui->m_Name);
m_ScanCodesMap[scanCode] = scanCodeId;
}
}
const UserInput* LinuxSampleUserInput::getUserInputFromId(LinuxSampleUserInputIds id) const
{
for (size_t i = mUserInputs.size(); i--;)
{
if(mUserInputs[i].m_Id == id)
{
return &mUserInputs[i];
}
}
return NULL;
}
LinuxSampleUserInput::~LinuxSampleUserInput()
{
m_ScanCodesMap.clear();
m_AnalogStates.clear();
m_DigitalStates.clear();
}
LinuxSampleUserInputIds LinuxSampleUserInput::getInputIdFromMouseButton(const physx::PxU16 b) const
{
if (b == Button1) return MOUSE_BUTTON_LEFT;
else if (b == Button2) return MOUSE_BUTTON_CENTER;
else if (b == Button3) return MOUSE_BUTTON_RIGHT;
else return LINUXKEY_UNKNOWN;
}
LinuxSampleUserInputIds LinuxSampleUserInput::getInputIdFromKeySym(const KeySym keySym) const
{
LinuxSampleUserInputIds id = LINUXKEY_UNKNOWN;
if(keySym >= XK_A && keySym <= XK_Z) id = (LinuxSampleUserInputIds)((keySym - XK_A)+LINUXKEY_A);
else if(keySym >= XK_a && keySym <= XK_z) id = (LinuxSampleUserInputIds)((keySym - XK_a)+LINUXKEY_A);
else if(keySym >= XK_0 && keySym <= XK_9) id = (LinuxSampleUserInputIds)((keySym - XK_0)+LINUXKEY_0);
else if(keySym >= XK_KP_0 && keySym <= XK_KP_9) id = (LinuxSampleUserInputIds)((keySym - XK_KP_0)+LINUXKEY_NUMPAD0);
else if(keySym == XK_Shift_L || keySym == XK_Shift_R) id = LINUXKEY_SHIFT;
else if(keySym == XK_Control_L || keySym == XK_Control_R) id = LINUXKEY_CONTROL;
else if(keySym == XK_space) id = LINUXKEY_SPACE;
else if(keySym == XK_Return) id = LINUXKEY_RETURN;
else if(keySym == XK_Escape) id = LINUXKEY_ESCAPE;
else if(keySym == XK_KP_Separator) id = LINUXKEY_COMMA;
else if(keySym == XK_KP_Divide) id = LINUXKEY_DIVIDE;
else if(keySym == XK_KP_Subtract) id = LINUXKEY_SUBTRACT;
else if(keySym == XK_KP_Add) id = LINUXKEY_ADD;
//
else if(keySym == XK_F1) id = LINUXKEY_F1;
else if(keySym == XK_F2) id = LINUXKEY_F2;
else if(keySym == XK_F3) id = LINUXKEY_F3;
else if(keySym == XK_F4) id = LINUXKEY_F4;
else if(keySym == XK_F5) id = LINUXKEY_F5;
else if(keySym == XK_F6) id = LINUXKEY_F6;
else if(keySym == XK_F7) id = LINUXKEY_F7;
else if(keySym == XK_F8) id = LINUXKEY_F8;
else if(keySym == XK_F9) id = LINUXKEY_F9;
else if(keySym == XK_F10) id = LINUXKEY_F10;
else if(keySym == XK_F11) id = LINUXKEY_F11;
else if(keySym == XK_F12) id = LINUXKEY_F12;
//
else if(keySym == XK_Tab) id = LINUXKEY_TAB;
//
else if(keySym == XK_BackSpace) id = LINUXKEY_BACKSPACE;
else if(keySym == XK_Prior) id = LINUXKEY_PRIOR;
else if(keySym == XK_Next) id = LINUXKEY_NEXT;
//
else if(keySym == XK_Up) id = LINUXKEY_UP;
else if(keySym == XK_Down) id = LINUXKEY_DOWN;
else if(keySym == XK_Left) id = LINUXKEY_LEFT;
else if(keySym == XK_Right) id = LINUXKEY_RIGHT;
return id;
}
void LinuxSampleUserInput::doOnMouseMove(physx::PxU32 x, physx::PxU32 y, physx::PxReal dx, physx::PxReal dy, physx::PxU16 button)
{
const std::vector<size_t>* events = getInputEvents(button);
if(events)
{
for (size_t i = events->size(); i--;)
{
const InputEvent& ie = mInputEvents[(*events)[i]];
if(getInputEventListener())
{
getInputEventListener()->onPointerInputEvent(ie, x, y, dx, dy, false);
}
}
}
}
void LinuxSampleUserInput::doOnMouseDown(physx::PxU32 x, physx::PxU32 y, physx::PxU16 button)
{
const std::vector<size_t>* events = getInputEvents(getInputIdFromMouseButton(button));
if(events)
{
for (size_t i = events->size(); i--;)
{
const InputEvent& ie = mInputEvents[(*events)[i]];
m_DigitalStates[ie.m_Id] = true;
if(getInputEventListener())
{
getInputEventListener()->onPointerInputEvent(ie, x, y, 0, 0, true);
}
}
}
}
void LinuxSampleUserInput::doOnMouseUp(physx::PxU32 x, physx::PxU32 y, physx::PxU16 button)
{
const std::vector<size_t>* events = getInputEvents(getInputIdFromMouseButton(button));
if(events)
{
for (size_t i = events->size(); i--;)
{
const InputEvent& ie = mInputEvents[(*events)[i]];
m_DigitalStates[ie.m_Id] = false;
if(getInputEventListener())
{
getInputEventListener()->onPointerInputEvent(ie, x, y, 0, 0, false);
}
}
}
}
void LinuxSampleUserInput::doOnKeyDown(KeySym keySym, physx::PxU16 keyCode, physx::PxU8 ascii)
{
const std::vector<size_t>* events = NULL;
if(getInputEventListener())
{
//raw ASCII printable characters get sent to the console
if (ascii >= 'a' && ascii <= 'z')
{
getInputEventListener()->onKeyDownEx(static_cast<KeyCode>(ascii - 'a' + KEY_A), ascii);
}
else if (ascii >= 'A' && ascii <= 'Z')
{
getInputEventListener()->onKeyDownEx(static_cast<KeyCode>(ascii - 'A' + KEY_A), ascii);
}
else if (ascii >= '0' && ascii <= '9')
{
getInputEventListener()->onKeyDownEx(static_cast<KeyCode>(ascii - 'A' + KEY_A), ascii);
}
else if (ascii == ' ')
{
getInputEventListener()->onKeyDownEx(static_cast<KeyCode>(ascii - ' ' + KEY_SPACE), ascii);
}
else if (ascii == '.')
{
getInputEventListener()->onKeyDownEx(static_cast<KeyCode>(ascii - '.' + KEY_DECIMAL), ascii);
}
std::map<physx::PxU16, physx::PxU16>::iterator fit = m_ScanCodesMap.find(keyCode);
if(fit != m_ScanCodesMap.end())
{
events = getInputEvents(fit->second);
}
if(!events)
{
LinuxSampleUserInputIds id = getInputIdFromKeySym(keySym);
events = getInputEvents(id);
}
if(!events || !getInputEventListener())
return;
for (size_t i = events->size(); i--;)
{
const InputEvent& ie = mInputEvents[(*events)[i]];
m_DigitalStates[ie.m_Id] = true;
getInputEventListener()->onDigitalInputEvent(ie, true);
}
}
}
void LinuxSampleUserInput::doOnKeyUp( KeySym keySym, physx::PxU16 keyCode, physx::PxU8 ascii)
{
const std::vector<size_t>* events = NULL;
std::map<physx::PxU16, physx::PxU16>::iterator fit = m_ScanCodesMap.find(keyCode);
if(fit != m_ScanCodesMap.end())
{
events = getInputEvents(fit->second);
}
if(!events)
{
LinuxSampleUserInputIds id = getInputIdFromKeySym(keySym);
events = getInputEvents(id);
}
if(!events || !getInputEventListener())
return;
for (size_t i = events->size(); i--;)
{
const InputEvent& ie = mInputEvents[(*events)[i]];
m_DigitalStates[ie.m_Id] = false;
getInputEventListener()->onDigitalInputEvent(ie, false);
}
}
bool LinuxSampleUserInput::getDigitalInputEventState(physx::PxU16 inputEventId ) const
{
std::map<physx::PxU16,bool>::const_iterator fit = m_DigitalStates.find(inputEventId);
if(fit != m_DigitalStates.end())
{
return fit->second;
}
else
{
return false;
}
}
float LinuxSampleUserInput::getAnalogInputEventState(physx::PxU16 inputEventId ) const
{
std::map<physx::PxU16,float>::const_iterator fit = m_AnalogStates.find(inputEventId);
if(fit != m_AnalogStates.end())
{
return fit->second;
}
else
{
return 0.0f;
}
}
void LinuxSampleUserInput::shutdown()
{
m_AnalogStates.clear();
m_DigitalStates.clear();
SampleUserInput::shutdown();
}
void LinuxSampleUserInput::updateInput()
{
SampleUserInput::updateInput();
processGamepads();
}