also report VR events for HMD and generic tracked devices. Also expose those VR events to pybullet: expose a deviceTypeFilter, that defaults to VR_DEVICE_CONTROLLER
This commit is contained in:
@@ -2537,11 +2537,20 @@ b3SharedMemoryCommandHandle b3RequestVREventsCommandInit(b3PhysicsClientHandle p
|
||||
b3Assert(command);
|
||||
|
||||
command->m_type = CMD_REQUEST_VR_EVENTS_DATA;
|
||||
command->m_updateFlags = 0;
|
||||
|
||||
command->m_updateFlags = VR_DEVICE_CONTROLLER;
|
||||
return (b3SharedMemoryCommandHandle)command;
|
||||
}
|
||||
|
||||
void b3VREventsSetDeviceTypeFilter(b3SharedMemoryCommandHandle commandHandle, int deviceTypeFilter)
|
||||
{
|
||||
struct SharedMemoryCommand* command = (struct SharedMemoryCommand*) commandHandle;
|
||||
b3Assert(command);
|
||||
if (command->m_type == CMD_REQUEST_VR_EVENTS_DATA)
|
||||
{
|
||||
command->m_updateFlags = deviceTypeFilter;
|
||||
}
|
||||
}
|
||||
|
||||
void b3GetVREventsData(b3PhysicsClientHandle physClient, struct b3VREventsData* vrEventsData)
|
||||
{
|
||||
PhysicsClient* cl = (PhysicsClient* ) physClient;
|
||||
|
||||
@@ -352,6 +352,8 @@ int b3LoadBunnySetCollisionMargin(b3SharedMemoryCommandHandle commandHandle, dou
|
||||
|
||||
|
||||
b3SharedMemoryCommandHandle b3RequestVREventsCommandInit(b3PhysicsClientHandle physClient);
|
||||
void b3VREventsSetDeviceTypeFilter(b3SharedMemoryCommandHandle commandHandle, int deviceTypeFilter);
|
||||
|
||||
void b3GetVREventsData(b3PhysicsClientHandle physClient, struct b3VREventsData* vrEventsData);
|
||||
|
||||
b3SharedMemoryCommandHandle b3SetVRCameraStateCommandInit(b3PhysicsClientHandle physClient);
|
||||
|
||||
@@ -605,6 +605,7 @@ struct b3VRControllerEvents
|
||||
{
|
||||
for (int i=0;i<MAX_VR_CONTROLLERS;i++)
|
||||
{
|
||||
m_vrEvents[i].m_deviceType = 0;
|
||||
m_vrEvents[i].m_numButtonEvents = 0;
|
||||
m_vrEvents[i].m_numMoveEvents = 0;
|
||||
for (int b=0;b<MAX_VR_BUTTONS;b++)
|
||||
@@ -628,6 +629,7 @@ struct b3VRControllerEvents
|
||||
if (vrEvents[i].m_numMoveEvents+vrEvents[i].m_numButtonEvents)
|
||||
{
|
||||
m_vrEvents[controlledId].m_controllerId = vrEvents[i].m_controllerId;
|
||||
m_vrEvents[controlledId].m_deviceType = vrEvents[i].m_deviceType;
|
||||
|
||||
m_vrEvents[controlledId].m_pos[0] = vrEvents[i].m_pos[0];
|
||||
m_vrEvents[controlledId].m_pos[1] = vrEvents[i].m_pos[1];
|
||||
@@ -1209,7 +1211,9 @@ struct PhysicsServerCommandProcessorInternalData
|
||||
bool m_allowRealTimeSimulation;
|
||||
bool m_hasGround;
|
||||
|
||||
b3VRControllerEvents m_vrEvents1;
|
||||
b3VRControllerEvents m_vrControllerEvents;
|
||||
|
||||
|
||||
btAlignedObjectArray<b3KeyboardEvent> m_keyboardEvents;
|
||||
|
||||
btMultiBodyFixedConstraint* m_gripperRigidbodyFixed;
|
||||
@@ -1324,7 +1328,7 @@ struct PhysicsServerCommandProcessorInternalData
|
||||
m_pickedConstraint(0),
|
||||
m_pickingMultiBodyPoint2Point(0)
|
||||
{
|
||||
m_vrEvents1.init();
|
||||
m_vrControllerEvents.init();
|
||||
|
||||
initHandles();
|
||||
#if 0
|
||||
@@ -2362,20 +2366,23 @@ bool PhysicsServerCommandProcessor::processCommand(const struct SharedMemoryComm
|
||||
case CMD_REQUEST_VR_EVENTS_DATA:
|
||||
{
|
||||
BT_PROFILE("CMD_REQUEST_VR_EVENTS_DATA");
|
||||
|
||||
serverStatusOut.m_sendVREvents.m_numVRControllerEvents = 0;
|
||||
|
||||
for (int i=0;i<MAX_VR_CONTROLLERS;i++)
|
||||
{
|
||||
b3VRControllerEvent& event = m_data->m_vrEvents1.m_vrEvents[i];
|
||||
b3VRControllerEvent& event = m_data->m_vrControllerEvents.m_vrEvents[i];
|
||||
|
||||
if (event.m_numButtonEvents + event.m_numMoveEvents)
|
||||
if (clientCmd.m_updateFlags&event.m_deviceType)
|
||||
{
|
||||
serverStatusOut.m_sendVREvents.m_controllerEvents[serverStatusOut.m_sendVREvents.m_numVRControllerEvents++] = event;
|
||||
event.m_numButtonEvents = 0;
|
||||
event.m_numMoveEvents = 0;
|
||||
for (int b=0;b<MAX_VR_BUTTONS;b++)
|
||||
if (event.m_numButtonEvents + event.m_numMoveEvents)
|
||||
{
|
||||
event.m_buttons[b] = 0;
|
||||
serverStatusOut.m_sendVREvents.m_controllerEvents[serverStatusOut.m_sendVREvents.m_numVRControllerEvents++] = event;
|
||||
event.m_numButtonEvents = 0;
|
||||
event.m_numMoveEvents = 0;
|
||||
for (int b=0;b<MAX_VR_BUTTONS;b++)
|
||||
{
|
||||
event.m_buttons[b] = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -5668,15 +5675,15 @@ void PhysicsServerCommandProcessor::enableRealTimeSimulation(bool enableRealTime
|
||||
m_data->m_allowRealTimeSimulation = enableRealTimeSim;
|
||||
}
|
||||
|
||||
void PhysicsServerCommandProcessor::stepSimulationRealTime(double dtInSec, const struct b3VRControllerEvent* vrEvents, int numVREvents,const struct b3KeyboardEvent* keyEvents, int numKeyEvents)
|
||||
void PhysicsServerCommandProcessor::stepSimulationRealTime(double dtInSec, const struct b3VRControllerEvent* vrControllerEvents, int numVRControllerEvents,const struct b3KeyboardEvent* keyEvents, int numKeyEvents)
|
||||
{
|
||||
m_data->m_vrEvents1.addNewVREvents(vrEvents,numVREvents);
|
||||
m_data->m_vrControllerEvents.addNewVREvents(vrControllerEvents,numVRControllerEvents);
|
||||
for (int i=0;i<m_data->m_stateLoggers.size();i++)
|
||||
{
|
||||
if (m_data->m_stateLoggers[i]->m_loggingType==STATE_LOGGING_VR_CONTROLLERS)
|
||||
{
|
||||
VRControllerStateLogger* vrLogger = (VRControllerStateLogger*) m_data->m_stateLoggers[i];
|
||||
vrLogger->m_vrEvents.addNewVREvents(vrEvents,numVREvents);
|
||||
vrLogger->m_vrEvents.addNewVREvents(vrControllerEvents,numVRControllerEvents);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1046,7 +1046,9 @@ public:
|
||||
|
||||
virtual void vrControllerButtonCallback(int controllerId, int button, int state, float pos[4], float orientation[4]);
|
||||
virtual void vrControllerMoveCallback(int controllerId, float pos[4], float orientation[4], float analogAxis);
|
||||
|
||||
virtual void vrHMDMoveCallback(int controllerId, float pos[4], float orientation[4]);
|
||||
virtual void vrGenericTrackerMoveCallback(int controllerId, float pos[4], float orientation[4]);
|
||||
|
||||
|
||||
virtual bool mouseMoveCallback(float x,float y)
|
||||
{
|
||||
@@ -2229,6 +2231,7 @@ void PhysicsServerExample::vrControllerButtonCallback(int controllerId, int butt
|
||||
|
||||
m_args[0].m_csGUI->lock();
|
||||
m_args[0].m_vrControllerEvents[controllerId].m_controllerId = controllerId;
|
||||
m_args[0].m_vrControllerEvents[controllerId].m_deviceType = VR_DEVICE_CONTROLLER;
|
||||
m_args[0].m_vrControllerEvents[controllerId].m_pos[0] = trTotal.getOrigin()[0];
|
||||
m_args[0].m_vrControllerEvents[controllerId].m_pos[1] = trTotal.getOrigin()[1];
|
||||
m_args[0].m_vrControllerEvents[controllerId].m_pos[2] = trTotal.getOrigin()[2];
|
||||
@@ -2252,7 +2255,7 @@ void PhysicsServerExample::vrControllerButtonCallback(int controllerId, int butt
|
||||
void PhysicsServerExample::vrControllerMoveCallback(int controllerId, float pos[4], float orn[4], float analogAxis)
|
||||
{
|
||||
|
||||
if (controllerId <= 0 || controllerId >= MAX_VR_CONTROLLERS)
|
||||
if (controllerId < 0 || controllerId >= MAX_VR_CONTROLLERS)
|
||||
{
|
||||
printf("Controller Id exceeds max: %d > %d", controllerId, MAX_VR_CONTROLLERS);
|
||||
return;
|
||||
@@ -2299,6 +2302,7 @@ void PhysicsServerExample::vrControllerMoveCallback(int controllerId, float pos[
|
||||
|
||||
m_args[0].m_csGUI->lock();
|
||||
m_args[0].m_vrControllerEvents[controllerId].m_controllerId = controllerId;
|
||||
m_args[0].m_vrControllerEvents[controllerId].m_deviceType = VR_DEVICE_CONTROLLER;
|
||||
m_args[0].m_vrControllerEvents[controllerId].m_pos[0] = trTotal.getOrigin()[0];
|
||||
m_args[0].m_vrControllerEvents[controllerId].m_pos[1] = trTotal.getOrigin()[1];
|
||||
m_args[0].m_vrControllerEvents[controllerId].m_pos[2] = trTotal.getOrigin()[2];
|
||||
@@ -2311,4 +2315,87 @@ void PhysicsServerExample::vrControllerMoveCallback(int controllerId, float pos[
|
||||
m_args[0].m_csGUI->unlock();
|
||||
|
||||
}
|
||||
|
||||
void PhysicsServerExample::vrHMDMoveCallback(int controllerId, float pos[4], float orn[4])
|
||||
{
|
||||
if (controllerId < 0 || controllerId >= MAX_VR_CONTROLLERS)
|
||||
{
|
||||
printf("Controller Id exceeds max: %d > %d", controllerId, MAX_VR_CONTROLLERS);
|
||||
return;
|
||||
}
|
||||
|
||||
//we may need to add some trLocal transform, to align the camera to our preferences
|
||||
btTransform trLocal;
|
||||
trLocal.setIdentity();
|
||||
// trLocal.setRotation(btQuaternion(btVector3(0, 0, 1), SIMD_HALF_PI)*btQuaternion(btVector3(0, 1, 0), SIMD_HALF_PI));
|
||||
|
||||
btTransform trOrg;
|
||||
trOrg.setIdentity();
|
||||
trOrg.setOrigin(btVector3(pos[0], pos[1], pos[2]));
|
||||
trOrg.setRotation(btQuaternion(orn[0], orn[1], orn[2], orn[3]));
|
||||
|
||||
btTransform tr2a;
|
||||
tr2a.setIdentity();
|
||||
btTransform tr2;
|
||||
tr2.setIdentity();
|
||||
tr2.setOrigin(gVRTeleportPos1);
|
||||
tr2a.setRotation(gVRTeleportOrn);
|
||||
btTransform trTotal = tr2*tr2a*trOrg*trLocal;
|
||||
|
||||
|
||||
|
||||
m_args[0].m_csGUI->lock();
|
||||
m_args[0].m_vrControllerEvents[controllerId].m_controllerId = controllerId;
|
||||
m_args[0].m_vrControllerEvents[controllerId].m_deviceType = VR_DEVICE_HMD;
|
||||
m_args[0].m_vrControllerEvents[controllerId].m_pos[0] = trTotal.getOrigin()[0];
|
||||
m_args[0].m_vrControllerEvents[controllerId].m_pos[1] = trTotal.getOrigin()[1];
|
||||
m_args[0].m_vrControllerEvents[controllerId].m_pos[2] = trTotal.getOrigin()[2];
|
||||
m_args[0].m_vrControllerEvents[controllerId].m_orn[0] = trTotal.getRotation()[0];
|
||||
m_args[0].m_vrControllerEvents[controllerId].m_orn[1] = trTotal.getRotation()[1];
|
||||
m_args[0].m_vrControllerEvents[controllerId].m_orn[2] = trTotal.getRotation()[2];
|
||||
m_args[0].m_vrControllerEvents[controllerId].m_orn[3] = trTotal.getRotation()[3];
|
||||
m_args[0].m_vrControllerEvents[controllerId].m_numMoveEvents++;
|
||||
m_args[0].m_csGUI->unlock();
|
||||
}
|
||||
void PhysicsServerExample::vrGenericTrackerMoveCallback(int controllerId, float pos[4], float orn[4])
|
||||
{
|
||||
if (controllerId < 0 || controllerId >= MAX_VR_CONTROLLERS)
|
||||
{
|
||||
printf("Controller Id exceeds max: %d > %d", controllerId, MAX_VR_CONTROLLERS);
|
||||
return;
|
||||
}
|
||||
|
||||
//we may need to add some trLocal transform, to align the camera to our preferences
|
||||
btTransform trLocal;
|
||||
trLocal.setIdentity();
|
||||
trLocal.setRotation(btQuaternion(btVector3(0, 0, 1), SIMD_HALF_PI)*btQuaternion(btVector3(0, 1, 0), SIMD_HALF_PI));
|
||||
|
||||
|
||||
btTransform trOrg;
|
||||
trOrg.setIdentity();
|
||||
trOrg.setOrigin(btVector3(pos[0], pos[1], pos[2]));
|
||||
trOrg.setRotation(btQuaternion(orn[0], orn[1], orn[2], orn[3]));
|
||||
|
||||
btTransform tr2a;
|
||||
tr2a.setIdentity();
|
||||
btTransform tr2;
|
||||
tr2.setIdentity();
|
||||
tr2.setOrigin(gVRTeleportPos1);
|
||||
tr2a.setRotation(gVRTeleportOrn);
|
||||
btTransform trTotal = tr2*tr2a*trOrg*trLocal;
|
||||
|
||||
m_args[0].m_csGUI->lock();
|
||||
m_args[0].m_vrControllerEvents[controllerId].m_controllerId = controllerId;
|
||||
m_args[0].m_vrControllerEvents[controllerId].m_deviceType = VR_DEVICE_GENERIC_TRACKER;
|
||||
m_args[0].m_vrControllerEvents[controllerId].m_pos[0] = trTotal.getOrigin()[0];
|
||||
m_args[0].m_vrControllerEvents[controllerId].m_pos[1] = trTotal.getOrigin()[1];
|
||||
m_args[0].m_vrControllerEvents[controllerId].m_pos[2] = trTotal.getOrigin()[2];
|
||||
m_args[0].m_vrControllerEvents[controllerId].m_orn[0] = trTotal.getRotation()[0];
|
||||
m_args[0].m_vrControllerEvents[controllerId].m_orn[1] = trTotal.getRotation()[1];
|
||||
m_args[0].m_vrControllerEvents[controllerId].m_orn[2] = trTotal.getRotation()[2];
|
||||
m_args[0].m_vrControllerEvents[controllerId].m_orn[3] = trTotal.getRotation()[3];
|
||||
m_args[0].m_vrControllerEvents[controllerId].m_numMoveEvents++;
|
||||
m_args[0].m_csGUI->unlock();
|
||||
}
|
||||
|
||||
B3_STANDALONE_EXAMPLE(PhysicsServerCreateFunc)
|
||||
|
||||
@@ -605,6 +605,7 @@ struct UserDebugDrawResultArgs
|
||||
double m_parameterValue;
|
||||
};
|
||||
|
||||
|
||||
struct SendVREvents
|
||||
{
|
||||
int m_numVRControllerEvents;
|
||||
|
||||
@@ -252,7 +252,9 @@ struct b3CameraImageData
|
||||
enum b3VREventType
|
||||
{
|
||||
VR_CONTROLLER_MOVE_EVENT=1,
|
||||
VR_CONTROLLER_BUTTON_EVENT
|
||||
VR_CONTROLLER_BUTTON_EVENT=2,
|
||||
VR_HMD_MOVE_EVENT=4,
|
||||
VR_GENERIC_TRACKER_MOVE_EVENT=8,
|
||||
};
|
||||
|
||||
#define MAX_VR_BUTTONS 64
|
||||
@@ -271,9 +273,19 @@ enum b3VRButtonInfo
|
||||
eButtonReleased = 4,
|
||||
};
|
||||
|
||||
|
||||
|
||||
enum eVRDeviceTypeEnums
|
||||
{
|
||||
VR_DEVICE_CONTROLLER=1,
|
||||
VR_DEVICE_HMD=2,
|
||||
VR_DEVICE_GENERIC_TRACKER=3,
|
||||
};
|
||||
|
||||
struct b3VRControllerEvent
|
||||
{
|
||||
int m_controllerId;//valid for VR_CONTROLLER_MOVE_EVENT and VR_CONTROLLER_BUTTON_EVENT
|
||||
int m_deviceType;
|
||||
int m_numMoveEvents;
|
||||
int m_numButtonEvents;
|
||||
|
||||
@@ -289,6 +301,11 @@ struct b3VREventsData
|
||||
{
|
||||
int m_numControllerEvents;
|
||||
struct b3VRControllerEvent* m_controllerEvents;
|
||||
int m_numHmdEvents;
|
||||
struct b3VRMoveEvent* m_hmdEvents;
|
||||
|
||||
int m_numGenericTrackerEvents;
|
||||
struct b3VRMoveEvent* m_genericTrackerEvents;
|
||||
};
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user