Skip to content

Commit

Permalink
feat:support xr controller a/b/x/y/trigger/thumbstick touch event
Browse files Browse the repository at this point in the history
  • Loading branch information
oahc09 committed Sep 20, 2023
1 parent d2d7623 commit a749c17
Show file tree
Hide file tree
Showing 6 changed files with 349 additions and 104 deletions.
6 changes: 6 additions & 0 deletions native/cocos/engine/EngineEvents.h
Original file line number Diff line number Diff line change
Expand Up @@ -124,6 +124,12 @@ enum class StickAxisCode {
R2,
LEFT_GRIP,
RIGHT_GRIP,
A,
B,
LEFT_TRIGGER,
RIGHT_TRIGGER,
LEFT_THUMBSTICK,
RIGHT_THUMBSTICK,
};

struct ControllerInfo {
Expand Down
10 changes: 10 additions & 0 deletions native/cocos/platform/interfaces/modules/XRCommon.h
Original file line number Diff line number Diff line change
Expand Up @@ -118,6 +118,8 @@ enum class XRConfigKey {
EYE_RENDER_JS_CALLBACK = 54,
ASYNC_LOAD_ASSETS_IMAGE = 55,
ASYNC_LOAD_ASSETS_IMAGE_RESULTS = 56,
LEFT_CONTROLLER_ACTIVE = 57,
RIGHT_CONTROLLER_ACTIVE= 58,
MAX_COUNT
};

Expand Down Expand Up @@ -287,6 +289,14 @@ struct XRGrab : public XRControllerInfo {
GRIP_LEFT,
TRIGGER_RIGHT,
GRIP_RIGHT,
TOUCH_A,
TOUCH_B,
TOUCH_X,
TOUCH_Y,
TOUCH_TRIGGER_LEFT,
TOUCH_TRIGGER_RIGHT,
TOUCH_THUMBSTICK_LEFT,
TOUCH_THUMBSTICK_RIGHT,
UNKNOWN
};

Expand Down
178 changes: 92 additions & 86 deletions native/cocos/platform/java/modules/XRInterface.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,14 @@ const static ccstd::unordered_map<xr::XRGrab::Type, StickAxisCode> GRAB_TYPE_TO_
{xr::XRGrab::Type::TRIGGER_RIGHT, StickAxisCode::R2},
{xr::XRGrab::Type::GRIP_LEFT, StickAxisCode::LEFT_GRIP},
{xr::XRGrab::Type::GRIP_RIGHT, StickAxisCode::RIGHT_GRIP},
{xr::XRGrab::Type::TOUCH_A, StickAxisCode::A},
{xr::XRGrab::Type::TOUCH_B, StickAxisCode::B},
{xr::XRGrab::Type::TOUCH_X, StickAxisCode::X},
{xr::XRGrab::Type::TOUCH_Y, StickAxisCode::Y},
{xr::XRGrab::Type::TOUCH_TRIGGER_LEFT, StickAxisCode::LEFT_TRIGGER},
{xr::XRGrab::Type::TOUCH_TRIGGER_RIGHT, StickAxisCode::RIGHT_TRIGGER},
{xr::XRGrab::Type::TOUCH_THUMBSTICK_LEFT, StickAxisCode::LEFT_THUMBSTICK},
{xr::XRGrab::Type::TOUCH_THUMBSTICK_RIGHT, StickAxisCode::RIGHT_THUMBSTICK},
};

void XRInterface::dispatchGamepadEventInternal(const xr::XRControllerEvent &xrControllerEvent) {
Expand All @@ -102,48 +110,50 @@ void XRInterface::dispatchGamepadEventInternal(const xr::XRControllerEvent &xrCo
switch (xrControllerEvent.xrControllerInfos.at(i)->getXREventType()) {
case xr::XREventType::CLICK: {
auto *xrClick = static_cast<xr::XRClick *>(xrControllerEvent.xrControllerInfos.at(i).get());
StickKeyCode stickKeyCode = CLICK_TYPE_TO_KEY_CODE.at(xrClick->type);

switch (xrClick->type) {
case xr::XRClick::Type::MENU:
case xr::XRClick::Type::TRIGGER_LEFT:
case xr::XRClick::Type::SHOULDER_LEFT:
case xr::XRClick::Type::THUMBSTICK_LEFT:
case xr::XRClick::Type::X:
case xr::XRClick::Type::Y:
case xr::XRClick::Type::TRIGGER_RIGHT:
case xr::XRClick::Type::SHOULDER_RIGHT:
case xr::XRClick::Type::THUMBSTICK_RIGHT:
case xr::XRClick::Type::A:
case xr::XRClick::Type::B:
case xr::XRClick::Type::START: {
controllerInfo->buttonInfos.emplace_back(ControllerInfo::ButtonInfo(stickKeyCode, xrClick->isPress));
break;
}
case xr::XRClick::Type::HOME: {
CC_LOG_INFO("[XRInterface] dispatchGamepadEventInternal exit when home click in rokid.");
if(CLICK_TYPE_TO_KEY_CODE.count(xrClick->type) > 0) {
StickKeyCode stickKeyCode = CLICK_TYPE_TO_KEY_CODE.at(xrClick->type);

switch (xrClick->type) {
case xr::XRClick::Type::MENU:
case xr::XRClick::Type::TRIGGER_LEFT:
case xr::XRClick::Type::SHOULDER_LEFT:
case xr::XRClick::Type::THUMBSTICK_LEFT:
case xr::XRClick::Type::X:
case xr::XRClick::Type::Y:
case xr::XRClick::Type::TRIGGER_RIGHT:
case xr::XRClick::Type::SHOULDER_RIGHT:
case xr::XRClick::Type::THUMBSTICK_RIGHT:
case xr::XRClick::Type::A:
case xr::XRClick::Type::B:
case xr::XRClick::Type::START: {
controllerInfo->buttonInfos.emplace_back(ControllerInfo::ButtonInfo(stickKeyCode, xrClick->isPress));
break;
}
case xr::XRClick::Type::HOME: {
CC_LOG_INFO("[XRInterface] dispatchGamepadEventInternal exit when home click in rokid.");
#if CC_USE_XR
xr::XrEntry::getInstance()->destroyXrInstance();
xr::XrEntry::destroyInstance();
_isXrEntryInstanceValid = false;
xr::XrEntry::getInstance()->destroyXrInstance();
xr::XrEntry::destroyInstance();
_isXrEntryInstanceValid = false;
#endif
CC_CURRENT_APPLICATION_SAFE()->close();
break;
CC_CURRENT_APPLICATION_SAFE()->close();
break;
}
case xr::XRClick::Type::DPAD_UP:
controllerInfo->axisInfos.emplace_back(ControllerInfo::AxisInfo(StickAxisCode::Y, xrClick->isPress ? 1.F : 0.F));
break;
case xr::XRClick::Type::DPAD_DOWN:
controllerInfo->axisInfos.emplace_back(ControllerInfo::AxisInfo(StickAxisCode::Y, xrClick->isPress ? -1.F : 0.F));
break;
case xr::XRClick::Type::DPAD_LEFT:
controllerInfo->axisInfos.emplace_back(ControllerInfo::AxisInfo(StickAxisCode::X, xrClick->isPress ? -1.F : 0.F));
break;
case xr::XRClick::Type::DPAD_RIGHT:
controllerInfo->axisInfos.emplace_back(ControllerInfo::AxisInfo(StickAxisCode::X, xrClick->isPress ? 1.F : 0.F));
break;
default:
break;
}
case xr::XRClick::Type::DPAD_UP:
controllerInfo->axisInfos.emplace_back(ControllerInfo::AxisInfo(StickAxisCode::Y, xrClick->isPress ? 1.F : 0.F));
break;
case xr::XRClick::Type::DPAD_DOWN:
controllerInfo->axisInfos.emplace_back(ControllerInfo::AxisInfo(StickAxisCode::Y, xrClick->isPress ? -1.F : 0.F));
break;
case xr::XRClick::Type::DPAD_LEFT:
controllerInfo->axisInfos.emplace_back(ControllerInfo::AxisInfo(StickAxisCode::X, xrClick->isPress ? -1.F : 0.F));
break;
case xr::XRClick::Type::DPAD_RIGHT:
controllerInfo->axisInfos.emplace_back(ControllerInfo::AxisInfo(StickAxisCode::X, xrClick->isPress ? 1.F : 0.F));
break;
default:
break;
}
} break;
case xr::XREventType::STICK: {
Expand All @@ -163,15 +173,17 @@ void XRInterface::dispatchGamepadEventInternal(const xr::XRControllerEvent &xrCo
} break;
case xr::XREventType::GRAB: {
auto *xrGrab = static_cast<xr::XRGrab *>(xrControllerEvent.xrControllerInfos.at(i).get());
StickAxisCode stickAxisCode = GRAB_TYPE_TO_AXIS_CODE.at(xrGrab->type);
switch (xrGrab->type) {
case xr::XRGrab::Type::TRIGGER_LEFT:
case xr::XRGrab::Type::TRIGGER_RIGHT: {
controllerInfo->axisInfos.emplace_back(ControllerInfo::AxisInfo(stickAxisCode, xrGrab->value));
break;
if(GRAB_TYPE_TO_AXIS_CODE.count(xrGrab->type) > 0) {
StickAxisCode stickAxisCode = GRAB_TYPE_TO_AXIS_CODE.at(xrGrab->type);
switch (xrGrab->type) {
case xr::XRGrab::Type::TRIGGER_LEFT:
case xr::XRGrab::Type::TRIGGER_RIGHT: {
controllerInfo->axisInfos.emplace_back(ControllerInfo::AxisInfo(stickAxisCode, xrGrab->value));
break;
}
default:
break;
}
default:
break;
}
} break;
default:
Expand Down Expand Up @@ -219,41 +231,43 @@ void XRInterface::dispatchHandleEventInternal(const xr::XRControllerEvent &xrCon
switch (xrControllerEvent.xrControllerInfos.at(i)->getXREventType()) {
case xr::XREventType::CLICK: {
auto *xrClick = static_cast<xr::XRClick *>(xrControllerEvent.xrControllerInfos.at(i).get());
StickKeyCode stickKeyCode = CLICK_TYPE_TO_KEY_CODE.at(xrClick->type);
switch (xrClick->type) {
case xr::XRClick::Type::MENU: {
if(CLICK_TYPE_TO_KEY_CODE.count(xrClick->type) > 0) {
StickKeyCode stickKeyCode = CLICK_TYPE_TO_KEY_CODE.at(xrClick->type);
switch (xrClick->type) {
case xr::XRClick::Type::MENU: {
#if !XR_OEM_SEED
controllerInfo->buttonInfos.emplace_back(ControllerInfo::ButtonInfo(StickKeyCode::MENU, xrClick->isPress));
controllerInfo->buttonInfos.emplace_back(ControllerInfo::ButtonInfo(StickKeyCode::MENU, xrClick->isPress));
#else
CC_LOG_INFO("[XRInterface] exit when menu click in seed.");
CC_LOG_INFO("[XRInterface] exit when menu click in seed.");
CC_CURRENT_APPLICATION_SAFE()->close();
#endif
break;
}
case xr::XRClick::Type::TRIGGER_LEFT:
case xr::XRClick::Type::THUMBSTICK_LEFT:
case xr::XRClick::Type::X:
case xr::XRClick::Type::Y:
case xr::XRClick::Type::TRIGGER_RIGHT:
case xr::XRClick::Type::THUMBSTICK_RIGHT:
case xr::XRClick::Type::A:
case xr::XRClick::Type::B:
case xr::XRClick::Type::START: {
controllerInfo->buttonInfos.emplace_back(ControllerInfo::ButtonInfo(stickKeyCode, xrClick->isPress));
break;
}
case xr::XRClick::Type::HOME: {
CC_LOG_INFO("[XRInterface] dispatchHandleEventInternal exit when home click in rokid.");
break;
}
case xr::XRClick::Type::TRIGGER_LEFT:
case xr::XRClick::Type::THUMBSTICK_LEFT:
case xr::XRClick::Type::X:
case xr::XRClick::Type::Y:
case xr::XRClick::Type::TRIGGER_RIGHT:
case xr::XRClick::Type::THUMBSTICK_RIGHT:
case xr::XRClick::Type::A:
case xr::XRClick::Type::B:
case xr::XRClick::Type::START: {
controllerInfo->buttonInfos.emplace_back(ControllerInfo::ButtonInfo(stickKeyCode, xrClick->isPress));
break;
}
case xr::XRClick::Type::HOME: {
CC_LOG_INFO("[XRInterface] dispatchHandleEventInternal exit when home click in rokid.");
#if CC_USE_XR
xr::XrEntry::getInstance()->destroyXrInstance();
xr::XrEntry::destroyInstance();
_isXrEntryInstanceValid = false;
xr::XrEntry::getInstance()->destroyXrInstance();
xr::XrEntry::destroyInstance();
_isXrEntryInstanceValid = false;
#endif
CC_CURRENT_APPLICATION_SAFE()->close();
break;
CC_CURRENT_APPLICATION_SAFE()->close();
break;
}
default:
break;
}
default:
break;
}
} break;
case xr::XREventType::STICK: {
Expand All @@ -273,17 +287,9 @@ void XRInterface::dispatchHandleEventInternal(const xr::XRControllerEvent &xrCon
} break;
case xr::XREventType::GRAB: {
auto *xrGrab = static_cast<xr::XRGrab *>(xrControllerEvent.xrControllerInfos.at(i).get());
StickAxisCode stickAxisCode = GRAB_TYPE_TO_AXIS_CODE.at(xrGrab->type);
switch (xrGrab->type) {
case xr::XRGrab::Type::TRIGGER_LEFT:
case xr::XRGrab::Type::TRIGGER_RIGHT:
case xr::XRGrab::Type::GRIP_LEFT:
case xr::XRGrab::Type::GRIP_RIGHT: {
controllerInfo->axisInfos.emplace_back(ControllerInfo::AxisInfo(stickAxisCode, xrGrab->value));
break;
}
default:
break;
if(GRAB_TYPE_TO_AXIS_CODE.count(xrGrab->type) > 0) {
StickAxisCode stickAxisCode = GRAB_TYPE_TO_AXIS_CODE.at(xrGrab->type);
controllerInfo->axisInfos.emplace_back(ControllerInfo::AxisInfo(stickAxisCode, xrGrab->value));
}
} break;
case xr::XREventType::POSE: {
Expand Down
32 changes: 32 additions & 0 deletions pal/input/minigame/handle-input.ts
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,14 @@ export class HandleInputDevice {
public get aimLeftOrientation (): InputSourceOrientation { return this._aimLeftOrientation; }
public get aimRightPosition (): InputSourcePosition { return this._aimRightPosition; }
public get aimRightOrientation (): InputSourceOrientation { return this._aimRightOrientation; }
public get touchButtonA (): InputSourceButton { return this._touchButtonA; }
public get touchButtonB (): InputSourceButton { return this._touchButtonB; }
public get touchButtonX (): InputSourceButton { return this._touchButtonX; }
public get touchButtonY (): InputSourceButton { return this._touchButtonY; }
public get touchButtonTriggerLeft (): InputSourceButton { return this._touchButtonTriggerLeft; }
public get touchButtonTriggerRight (): InputSourceButton { return this._touchButtonTriggerRight; }
public get touchButtonThumbStickLeft (): InputSourceButton { return this._touchButtonThumbStickLeft; }
public get touchButtonThumbStickRight (): InputSourceButton { return this._touchButtonThumbStickRight; }

private _eventTarget: EventTarget = new EventTarget();

Expand Down Expand Up @@ -80,6 +88,14 @@ export class HandleInputDevice {
private _aimLeftOrientation!: InputSourceOrientation;
private _aimRightPosition!: InputSourcePosition;
private _aimRightOrientation!: InputSourceOrientation;
private _touchButtonA!: InputSourceButton;
private _touchButtonB!: InputSourceButton;
private _touchButtonX!: InputSourceButton;
private _touchButtonY!: InputSourceButton;
private _touchButtonTriggerLeft!: InputSourceButton;
private _touchButtonTriggerRight!: InputSourceButton;
private _touchButtonThumbStickLeft!: InputSourceButton;
private _touchButtonThumbStickRight!: InputSourceButton;

constructor () {
this._initInputSource();
Expand Down Expand Up @@ -163,5 +179,21 @@ export class HandleInputDevice {
this._aimRightPosition.getValue = (): Readonly<Vec3> => Vec3.ZERO;
this._aimRightOrientation = new InputSourceOrientation();
this._aimRightOrientation.getValue = (): Readonly<Quat> => Quat.IDENTITY;
this._touchButtonA = new InputSourceButton();
this._touchButtonA.getValue = (): number => 0;
this._touchButtonB = new InputSourceButton();
this._touchButtonB.getValue = (): number => 0;
this._touchButtonX = new InputSourceButton();
this._touchButtonX.getValue = (): number => 0;
this._touchButtonY = new InputSourceButton();
this._touchButtonY.getValue = (): number => 0;
this._touchButtonTriggerLeft = new InputSourceButton();
this._touchButtonTriggerLeft.getValue = (): number => 0;
this._touchButtonTriggerRight = new InputSourceButton();
this._touchButtonTriggerRight.getValue = (): number => 0;
this._touchButtonThumbStickLeft = new InputSourceButton();
this._touchButtonThumbStickLeft.getValue = (): number => 0;
this._touchButtonThumbStickRight = new InputSourceButton();
this._touchButtonThumbStickRight.getValue = (): number => 0;
}
}
Loading

0 comments on commit a749c17

Please sign in to comment.