Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 14 additions & 0 deletions driver_vrinputemulator/src/com/shm/driver_ipc_shm.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -607,6 +607,8 @@ void IpcShmCommunicator::_ipcThreadFunc(IpcShmCommunicator* _this, ServerDriver
resp.msg.dm_deviceOffsets.driverFromHeadTranslationOffset = info->driverFromHeadTranslationOffset();
resp.msg.dm_deviceOffsets.deviceRotationOffset = info->deviceRotationOffset();
resp.msg.dm_deviceOffsets.deviceTranslationOffset = info->deviceTranslationOffset();
resp.msg.dm_deviceOffsets.clientRotationOffset = info->clientRotationOffset();
resp.msg.dm_deviceOffsets.clientTranslationOffset = info->clientTranslationOffset();
}
}
if (resp.status != ipc::ReplyStatus::Ok) {
Expand Down Expand Up @@ -653,6 +655,12 @@ void IpcShmCommunicator::_ipcThreadFunc(IpcShmCommunicator* _this, ServerDriver
if (message.msg.dm_DeviceOffsets.deviceTranslationOffsetValid) {
info->deviceTranslationOffset() = message.msg.dm_DeviceOffsets.deviceTranslationOffset;
}
if (message.msg.dm_DeviceOffsets.clientRotationOffsetValid) {
info->clientRotationOffset() = message.msg.dm_DeviceOffsets.clientRotationOffset;
}
if (message.msg.dm_DeviceOffsets.clientTranslationOffsetValid) {
info->clientTranslationOffset() = message.msg.dm_DeviceOffsets.clientTranslationOffset;
}
break;
case 1:
if (message.msg.dm_DeviceOffsets.worldFromDriverRotationOffsetValid) {
Expand All @@ -673,6 +681,12 @@ void IpcShmCommunicator::_ipcThreadFunc(IpcShmCommunicator* _this, ServerDriver
if (message.msg.dm_DeviceOffsets.deviceTranslationOffsetValid) {
info->deviceTranslationOffset() = info->deviceTranslationOffset() + message.msg.dm_DeviceOffsets.deviceTranslationOffset;
}
if (message.msg.dm_DeviceOffsets.clientRotationOffsetValid) {
info->clientRotationOffset() = message.msg.dm_DeviceOffsets.clientRotationOffset * info->clientRotationOffset();
}
if (message.msg.dm_DeviceOffsets.clientTranslationOffsetValid) {
info->clientTranslationOffset() = info->clientTranslationOffset() + message.msg.dm_DeviceOffsets.clientTranslationOffset;
}
break;
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -135,6 +135,16 @@ bool DeviceManipulationHandle::handlePoseUpdate(uint32_t& unWhichDevice, vr::Dri
if (m_deviceTranslationOffset.v[0] != 0.0 || m_deviceTranslationOffset.v[1] != 0.0 || m_deviceTranslationOffset.v[2] != 0.0) {
VECTOR_ADD(newPose.vecPosition, m_deviceTranslationOffset);
}
if (m_clientRotationOffset.w != 1.0 || m_clientRotationOffset.x != 0.0
|| m_clientRotationOffset.y != 0.0 || m_clientRotationOffset.z != 0.0) {
newPose.qWorldFromDriverRotation = m_clientRotationOffset * newPose.qWorldFromDriverRotation;
}
if (m_clientTranslationOffset.v[0] != 0.0 || m_clientTranslationOffset.v[1] != 0.0 || m_clientTranslationOffset.v[2] != 0.0) {
vr::HmdVector3d_t rotatedTranslation = vrmath::quaternionRotateVector(m_clientRotationOffset, newPose.vecWorldFromDriverTranslation);
newPose.vecWorldFromDriverTranslation[0] = rotatedTranslation.v[0] + m_clientTranslationOffset.v[0];
newPose.vecWorldFromDriverTranslation[1] = rotatedTranslation.v[1] + m_clientTranslationOffset.v[1];
newPose.vecWorldFromDriverTranslation[2] = rotatedTranslation.v[2] + m_clientTranslationOffset.v[2];
}
}

m_motionCompensationManager._applyMotionCompensation(newPose, this);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,8 @@ class DeviceManipulationHandle {
vr::HmdVector3d_t m_driverFromHeadTranslationOffset = { 0.0, 0.0, 0.0 };
vr::HmdQuaternion_t m_deviceRotationOffset = { 1.0, 0.0, 0.0, 0.0 };
vr::HmdVector3d_t m_deviceTranslationOffset = { 0.0, 0.0, 0.0 };
vr::HmdQuaternion_t m_clientRotationOffset = { 1.0, 0.0, 0.0, 0.0 };
vr::HmdVector3d_t m_clientTranslationOffset = { 0.0, 0.0, 0.0 };

struct DigitalInputRemappingInfo {
int state = 0;
Expand Down Expand Up @@ -149,6 +151,10 @@ class DeviceManipulationHandle {
vr::HmdQuaternion_t& deviceRotationOffset() { return m_deviceRotationOffset; }
const vr::HmdVector3d_t& deviceTranslationOffset() const { return m_deviceTranslationOffset; }
vr::HmdVector3d_t& deviceTranslationOffset() { return m_deviceTranslationOffset; }
const vr::HmdQuaternion_t& clientRotationOffset() const { return m_clientRotationOffset; }
vr::HmdQuaternion_t& clientRotationOffset() { return m_clientRotationOffset; }
const vr::HmdVector3d_t& clientTranslationOffset() const { return m_clientTranslationOffset; }
vr::HmdVector3d_t& clientTranslationOffset() { return m_clientTranslationOffset; }

void setDigitalInputRemapping(uint32_t buttonId, const DigitalInputRemapping& remapping);
DigitalInputRemapping getDigitalInputRemapping(uint32_t buttonId);
Expand Down
7 changes: 7 additions & 0 deletions lib_vrinputemulator/include/ipc_protocol.h
Original file line number Diff line number Diff line change
Expand Up @@ -254,6 +254,11 @@ struct Request_DeviceManipulation_SetDeviceOffsets {
vr::HmdQuaternion_t deviceRotationOffset;
bool deviceTranslationOffsetValid;
vr::HmdVector3d_t deviceTranslationOffset;
// client universe offsets
bool clientRotationOffsetValid;
vr::HmdQuaternion_t clientRotationOffset;
bool clientTranslationOffsetValid;
vr::HmdVector3d_t clientTranslationOffset;
};

struct Request_DeviceManipulation_RedirectMode {
Expand Down Expand Up @@ -437,6 +442,8 @@ struct Reply_DeviceManipulation_GetDeviceOffsets {
vr::HmdVector3d_t driverFromHeadTranslationOffset;
vr::HmdQuaternion_t deviceRotationOffset;
vr::HmdVector3d_t deviceTranslationOffset;
vr::HmdQuaternion_t clientRotationOffset;
vr::HmdVector3d_t clientTranslationOffset;
};

struct Reply_InputRemapping_GetDigitalRemapping {
Expand Down