示例#1
0
void PhysicsDirect::postProcessStatus(const struct SharedMemoryStatus& serverCmd)
{
	switch (serverCmd.m_type)
	{
		case CMD_REQUEST_RAY_CAST_INTERSECTIONS_COMPLETED:
		{
			if (m_data->m_verboseOutput)
			{
				b3Printf("Raycast completed");
			}
			m_data->m_raycastHits.clear();
			b3RayHitInfo* rayHits = (b3RayHitInfo*)m_data->m_bulletStreamDataServerToClient;
			for (int i = 0; i < serverCmd.m_raycastHits.m_numRaycastHits; i++)
			{
				m_data->m_raycastHits.push_back(rayHits[i]);
			}
			break;
		}
		case CMD_REQUEST_VR_EVENTS_DATA_COMPLETED:
		{
			if (m_data->m_verboseOutput)
			{
				b3Printf("Request VR Events completed");
			}
			m_data->m_cachedVREvents.resize(serverCmd.m_sendVREvents.m_numVRControllerEvents);
			for (int i = 0; i < serverCmd.m_sendVREvents.m_numVRControllerEvents; i++)
			{
				m_data->m_cachedVREvents[i] = serverCmd.m_sendVREvents.m_controllerEvents[i];
			}
			break;
		}
		case CMD_REQUEST_KEYBOARD_EVENTS_DATA_COMPLETED:
		{
			if (m_data->m_verboseOutput)
			{
				b3Printf("Request keyboard events completed");
			}
			m_data->m_cachedKeyboardEvents.resize(serverCmd.m_sendKeyboardEvents.m_numKeyboardEvents);
			for (int i = 0; i < serverCmd.m_sendKeyboardEvents.m_numKeyboardEvents; i++)
			{
				m_data->m_cachedKeyboardEvents[i] = serverCmd.m_sendKeyboardEvents.m_keyboardEvents[i];
			}
			break;
		}

		case CMD_REQUEST_MOUSE_EVENTS_DATA_COMPLETED:
		{
			B3_PROFILE("CMD_REQUEST_MOUSE_EVENTS_DATA_COMPLETED");
			if (m_data->m_verboseOutput)
			{
				b3Printf("Request mouse events completed");
			}
			m_data->m_cachedMouseEvents.resize(serverCmd.m_sendMouseEvents.m_numMouseEvents);
			for (int i = 0; i < serverCmd.m_sendMouseEvents.m_numMouseEvents; i++)
			{
				m_data->m_cachedMouseEvents[i] = serverCmd.m_sendMouseEvents.m_mouseEvents[i];
			}
			break;
		}

		case CMD_REQUEST_INTERNAL_DATA_COMPLETED:
		{
			if (serverCmd.m_numDataStreamBytes)
			{
				int numStreamBytes = serverCmd.m_numDataStreamBytes;
				m_data->m_serverDNA.resize(numStreamBytes);
				for (int i = 0; i < numStreamBytes; i++)
				{
					m_data->m_serverDNA[i] = m_data->m_bulletStreamDataServerToClient[i];
				}
			}
			break;
		}
		case CMD_RESET_SIMULATION_COMPLETED:
		{
			resetData();
			break;
		}

		case CMD_USER_CONSTRAINT_INFO_COMPLETED:
		case CMD_USER_CONSTRAINT_COMPLETED:
		{
			int cid = serverCmd.m_userConstraintResultArgs.m_userConstraintUniqueId;
			m_data->m_userConstraintInfoMap.insert(cid, serverCmd.m_userConstraintResultArgs);
			break;
		}
		case CMD_REMOVE_USER_CONSTRAINT_COMPLETED:
		{
			int cid = serverCmd.m_userConstraintResultArgs.m_userConstraintUniqueId;
			m_data->m_userConstraintInfoMap.remove(cid);
			break;
		}
		case CMD_REMOVE_BODY_FAILED:
		{
			b3Warning("Remove body failed\n");
			break;
		}
		case CMD_REMOVE_BODY_COMPLETED:
		{
			for (int i = 0; i < serverCmd.m_removeObjectArgs.m_numBodies; i++)
			{
				int bodyUniqueId = serverCmd.m_removeObjectArgs.m_bodyUniqueIds[i];
				removeCachedBody(bodyUniqueId);
			}
			for (int i = 0; i < serverCmd.m_removeObjectArgs.m_numUserConstraints; i++)
			{
				int key = serverCmd.m_removeObjectArgs.m_userConstraintUniqueIds[i];
				m_data->m_userConstraintInfoMap.remove(key);
			}

			break;
		}
		case CMD_CHANGE_USER_CONSTRAINT_COMPLETED:
		{
			int cid = serverCmd.m_userConstraintResultArgs.m_userConstraintUniqueId;
			b3UserConstraint* userConstraintPtr = m_data->m_userConstraintInfoMap[cid];
			if (userConstraintPtr)
			{
				const b3UserConstraint* serverConstraint = &serverCmd.m_userConstraintResultArgs;
				if (serverCmd.m_updateFlags & USER_CONSTRAINT_CHANGE_PIVOT_IN_B)
				{
					userConstraintPtr->m_childFrame[0] = serverConstraint->m_childFrame[0];
					userConstraintPtr->m_childFrame[1] = serverConstraint->m_childFrame[1];
					userConstraintPtr->m_childFrame[2] = serverConstraint->m_childFrame[2];
				}
				if (serverCmd.m_updateFlags & USER_CONSTRAINT_CHANGE_FRAME_ORN_IN_B)
				{
					userConstraintPtr->m_childFrame[3] = serverConstraint->m_childFrame[3];
					userConstraintPtr->m_childFrame[4] = serverConstraint->m_childFrame[4];
					userConstraintPtr->m_childFrame[5] = serverConstraint->m_childFrame[5];
					userConstraintPtr->m_childFrame[6] = serverConstraint->m_childFrame[6];
				}
				if (serverCmd.m_updateFlags & USER_CONSTRAINT_CHANGE_MAX_FORCE)
				{
					userConstraintPtr->m_maxAppliedForce = serverConstraint->m_maxAppliedForce;
				}
				if (serverCmd.m_updateFlags & USER_CONSTRAINT_CHANGE_GEAR_RATIO)
				{
					userConstraintPtr->m_gearRatio = serverConstraint->m_gearRatio;
				}
				if (serverCmd.m_updateFlags & USER_CONSTRAINT_CHANGE_RELATIVE_POSITION_TARGET)
				{
					userConstraintPtr->m_relativePositionTarget = serverConstraint->m_relativePositionTarget;
				}
				if (serverCmd.m_updateFlags & USER_CONSTRAINT_CHANGE_ERP)
				{
					userConstraintPtr->m_erp = serverConstraint->m_erp;
				}
				if (serverCmd.m_updateFlags & USER_CONSTRAINT_CHANGE_GEAR_AUX_LINK)
				{
					userConstraintPtr->m_gearAuxLink = serverConstraint->m_gearAuxLink;
				}
			}
			break;
		}
		case CMD_USER_CONSTRAINT_REQUEST_STATE_COMPLETED:
		{
			break;
		}
		case CMD_SYNC_BODY_INFO_COMPLETED:
		case CMD_MJCF_LOADING_COMPLETED:
		case CMD_SDF_LOADING_COMPLETED:
		{
			//we'll stream further info from the physics server
			//so serverCmd will be invalid, make a copy

			int numConstraints = serverCmd.m_sdfLoadedArgs.m_numUserConstraints;
			for (int i = 0; i < numConstraints; i++)
			{
				int constraintUid = serverCmd.m_sdfLoadedArgs.m_userConstraintUniqueIds[i];

				m_data->m_tmpInfoRequestCommand.m_type = CMD_USER_CONSTRAINT;
				m_data->m_tmpInfoRequestCommand.m_updateFlags = USER_CONSTRAINT_REQUEST_INFO;
				m_data->m_tmpInfoRequestCommand.m_userConstraintArguments.m_userConstraintUniqueId = constraintUid;

				bool hasStatus = m_data->m_commandProcessor->processCommand(m_data->m_tmpInfoRequestCommand, m_data->m_tmpInfoStatus, &m_data->m_bulletStreamDataServerToClient[0], SHARED_MEMORY_MAX_STREAM_CHUNK_SIZE);

				b3Clock clock;
				double startTime = clock.getTimeInSeconds();
				double timeOutInSeconds = m_data->m_timeOutInSeconds;

				while ((!hasStatus) && (clock.getTimeInSeconds() - startTime < timeOutInSeconds))
				{
					hasStatus = m_data->m_commandProcessor->receiveStatus(m_data->m_tmpInfoStatus, &m_data->m_bulletStreamDataServerToClient[0], SHARED_MEMORY_MAX_STREAM_CHUNK_SIZE);
				}

				if (hasStatus)
				{
					int cid = m_data->m_tmpInfoStatus.m_userConstraintResultArgs.m_userConstraintUniqueId;
					m_data->m_userConstraintInfoMap.insert(cid, m_data->m_tmpInfoStatus.m_userConstraintResultArgs);
				}
			}

			int numBodies = serverCmd.m_sdfLoadedArgs.m_numBodies;
			for (int i = 0; i < numBodies; i++)
			{
				int bodyUniqueId = serverCmd.m_sdfLoadedArgs.m_bodyUniqueIds[i];

				m_data->m_tmpInfoRequestCommand.m_type = CMD_REQUEST_BODY_INFO;
				m_data->m_tmpInfoRequestCommand.m_sdfRequestInfoArgs.m_bodyUniqueId = bodyUniqueId;

				bool hasStatus = m_data->m_commandProcessor->processCommand(m_data->m_tmpInfoRequestCommand, m_data->m_tmpInfoStatus, &m_data->m_bulletStreamDataServerToClient[0], SHARED_MEMORY_MAX_STREAM_CHUNK_SIZE);

				b3Clock clock;
				double startTime = clock.getTimeInSeconds();
				double timeOutInSeconds = m_data->m_timeOutInSeconds;

				while ((!hasStatus) && (clock.getTimeInSeconds() - startTime < timeOutInSeconds))
				{
					hasStatus = m_data->m_commandProcessor->receiveStatus(m_data->m_tmpInfoStatus, &m_data->m_bulletStreamDataServerToClient[0], SHARED_MEMORY_MAX_STREAM_CHUNK_SIZE);
				}

				if (hasStatus)
				{
					processBodyJointInfo(bodyUniqueId, m_data->m_tmpInfoStatus);
				}
			}
			break;
		}
		case CMD_CREATE_MULTI_BODY_COMPLETED:
		case CMD_URDF_LOADING_COMPLETED:
		{
			if (serverCmd.m_numDataStreamBytes > 0)
			{
				int bodyIndex = serverCmd.m_dataStreamArguments.m_bodyUniqueId;
				processBodyJointInfo(bodyIndex, serverCmd);
			}
			break;
		}
		case CMD_BULLET_LOADING_FAILED:
		{
			b3Warning("Couldn't load .bullet file");
			break;
		}
		case CMD_BULLET_LOADING_COMPLETED:
		{
			break;
		}

		case CMD_REQUEST_OPENGL_VISUALIZER_CAMERA_COMPLETED:
		{
			break;
		}

		case CMD_REQUEST_OPENGL_VISUALIZER_CAMERA_FAILED:
		{
			b3Warning("requestOpenGLVisualizeCamera failed");
			break;
		}
		case CMD_REMOVE_USER_CONSTRAINT_FAILED:
		{
			b3Warning("removeConstraint failed");
			break;
		}
		case CMD_CHANGE_USER_CONSTRAINT_FAILED:
		{
			//b3Warning("changeConstraint failed");
			break;
		}

		case CMD_USER_CONSTRAINT_FAILED:
		{
			b3Warning("createConstraint failed");
			break;
		}

		case CMD_CREATE_COLLISION_SHAPE_FAILED:
		{
			b3Warning("createCollisionShape failed");
			break;
		}
		case CMD_CREATE_COLLISION_SHAPE_COMPLETED:
		{
			break;
		}

		case CMD_CREATE_VISUAL_SHAPE_FAILED:
		{
			b3Warning("createVisualShape failed");
			break;
		}
		case CMD_CREATE_VISUAL_SHAPE_COMPLETED:
		{
			break;
		}

		case CMD_CREATE_MULTI_BODY_FAILED:
		{
			b3Warning("createMultiBody failed");
			break;
		}
		case CMD_REQUEST_COLLISION_INFO_COMPLETED:
		{
			break;
		}
		case CMD_REQUEST_COLLISION_INFO_FAILED:
		{
			b3Warning("Request getCollisionInfo failed");
			break;
		}

		case CMD_CUSTOM_COMMAND_COMPLETED:
		{
			break;
		}
		case CMD_CUSTOM_COMMAND_FAILED:
		{
			b3Warning("custom plugin command failed");
			break;
		}
		case CMD_CLIENT_COMMAND_COMPLETED:
		{
			break;
		}
		case CMD_CALCULATED_JACOBIAN_COMPLETED:
		{
			break;
		}
		case CMD_CALCULATED_JACOBIAN_FAILED:
		{
			b3Warning("jacobian calculation failed");
			break;
		}
		case CMD_CALCULATED_MASS_MATRIX_FAILED:
		{
			b3Warning("calculate mass matrix failed");
			break;
		}
		case CMD_CALCULATED_MASS_MATRIX_COMPLETED:
		{
			double* matrixData = (double*)&m_data->m_bulletStreamDataServerToClient[0];
			m_data->m_cachedMassMatrix.resize(serverCmd.m_massMatrixResultArgs.m_dofCount * serverCmd.m_massMatrixResultArgs.m_dofCount);
			for (int i = 0; i < serverCmd.m_massMatrixResultArgs.m_dofCount * serverCmd.m_massMatrixResultArgs.m_dofCount; i++)
			{
				m_data->m_cachedMassMatrix[i] = matrixData[i];
			}
			break;
		}
		case CMD_ACTUAL_STATE_UPDATE_COMPLETED:
		{
			break;
		}
		case CMD_DESIRED_STATE_RECEIVED_COMPLETED:
		{
			break;
		}
		case CMD_STEP_FORWARD_SIMULATION_COMPLETED:
		{
			break;
		}
		case CMD_REQUEST_PHYSICS_SIMULATION_PARAMETERS_COMPLETED:
		{
			break;
		}
		case CMD_SAVE_STATE_COMPLETED:
		{
			break;
		}
		case CMD_COLLISION_SHAPE_INFO_FAILED:
		{
			b3Warning("getCollisionShapeData failed");
			break;
		}
		case CMD_COLLISION_SHAPE_INFO_COMPLETED:
		{
			B3_PROFILE("CMD_COLLISION_SHAPE_INFO_COMPLETED");
			if (m_data->m_verboseOutput)
			{
				b3Printf("Collision Shape Information Request OK\n");
			}
			int numCollisionShapesCopied = serverCmd.m_sendCollisionShapeArgs.m_numCollisionShapes;
			m_data->m_cachedCollisionShapes.resize(numCollisionShapesCopied);
			b3CollisionShapeData* shapeData = (b3CollisionShapeData*)&m_data->m_bulletStreamDataServerToClient[0];
			for (int i = 0; i < numCollisionShapesCopied; i++)
			{
				m_data->m_cachedCollisionShapes[i] = shapeData[i];
			}
			break;
		}
		case CMD_RESTORE_STATE_FAILED:
		{
			b3Warning("restoreState failed");
			break;
		}
		case CMD_RESTORE_STATE_COMPLETED:
		{
			break;
		}
		case CMD_BULLET_SAVING_COMPLETED:
		{
			break;
		}
		case CMD_LOAD_SOFT_BODY_FAILED:
		{
			b3Warning("loadSoftBody failed");
			break;
		}
		case CMD_LOAD_SOFT_BODY_COMPLETED:
		{
			break;
		}
		case CMD_SYNC_USER_DATA_FAILED:
		{
			b3Warning("Synchronizing user data failed.");
			break;
		}
		case CMD_ADD_USER_DATA_FAILED:
		{
			b3Warning("Adding user data failed (do the specified body and link exist?)");
			break;
		}
		case CMD_REMOVE_USER_DATA_FAILED:
		{
			b3Warning("Removing user data failed");
			break;
		}
		case CMD_ADD_USER_DATA_COMPLETED:
		{
			processAddUserData(serverCmd);
			break;
		}
		case CMD_SYNC_USER_DATA_COMPLETED:
		{
			B3_PROFILE("CMD_SYNC_USER_DATA_COMPLETED");
			// Remove all cached user data entries.
			for (int i = 0; i < m_data->m_bodyJointMap.size(); i++)
			{
				BodyJointInfoCache2** bodyJointsPtr = m_data->m_bodyJointMap.getAtIndex(i);
				if (bodyJointsPtr && *bodyJointsPtr)
				{
					(*bodyJointsPtr)->m_userDataIds.clear();
				}
				m_data->m_userDataMap.clear();
				m_data->m_userDataHandleLookup.clear();
			}
			const int numIdentifiers = serverCmd.m_syncUserDataArgs.m_numUserDataIdentifiers;
			int* identifiers = new int[numIdentifiers];
			memcpy(identifiers, &m_data->m_bulletStreamDataServerToClient[0], numIdentifiers * sizeof(int));

			for (int i = 0; i < numIdentifiers; i++)
			{
				m_data->m_tmpInfoRequestCommand.m_type = CMD_REQUEST_USER_DATA;
				m_data->m_tmpInfoRequestCommand.m_userDataRequestArgs.m_userDataId = identifiers[i];

				bool hasStatus = m_data->m_commandProcessor->processCommand(m_data->m_tmpInfoRequestCommand, m_data->m_tmpInfoStatus, &m_data->m_bulletStreamDataServerToClient[0], SHARED_MEMORY_MAX_STREAM_CHUNK_SIZE);

				b3Clock clock;
				double startTime = clock.getTimeInSeconds();
				double timeOutInSeconds = m_data->m_timeOutInSeconds;

				while ((!hasStatus) && (clock.getTimeInSeconds() - startTime < timeOutInSeconds))
				{
					hasStatus = m_data->m_commandProcessor->receiveStatus(m_data->m_tmpInfoStatus, &m_data->m_bulletStreamDataServerToClient[0], SHARED_MEMORY_MAX_STREAM_CHUNK_SIZE);
				}

				if (hasStatus)
				{
					processAddUserData(m_data->m_tmpInfoStatus);
				}
			}
			delete[] identifiers;
			break;
		}
		case CMD_REMOVE_USER_DATA_COMPLETED:
		{
			const int userDataId = serverCmd.m_removeUserDataResponseArgs.m_userDataId;
			SharedMemoryUserData* userData = m_data->m_userDataMap[userDataId];
			if (userData)
			{
				BodyJointInfoCache2** bodyJointsPtr = m_data->m_bodyJointMap[userData->m_bodyUniqueId];
				if (bodyJointsPtr && *bodyJointsPtr)
				{
					(*bodyJointsPtr)->m_userDataIds.remove(userDataId);
				}
				m_data->m_userDataHandleLookup.remove(SharedMemoryUserDataHashKey(userData));
				m_data->m_userDataMap.remove(userDataId);
			}
			break;
		}
		default:
		{
			//b3Warning("Unknown server status type");
		}
	};
}
示例#2
0
void PhysicsDirect::postProcessStatus(const struct SharedMemoryStatus& serverCmd)
{
	switch (serverCmd.m_type)
	{
	
	case CMD_REQUEST_RAY_CAST_INTERSECTIONS_COMPLETED:
	{
		if (m_data->m_verboseOutput)
		{
			b3Printf("Raycast completed");
		}
		m_data->m_raycastHits.clear();
		for (int i=0;i<serverCmd.m_raycastHits.m_numRaycastHits;i++)
		{
			m_data->m_raycastHits.push_back(serverCmd.m_raycastHits.m_rayHits[i]);
		}
		break;
	}
	case CMD_REQUEST_VR_EVENTS_DATA_COMPLETED:
	{

		if (m_data->m_verboseOutput)
		{
			b3Printf("Request VR Events completed");
		}
		m_data->m_cachedVREvents.resize(serverCmd.m_sendVREvents.m_numVRControllerEvents);
		for (int i=0;i< serverCmd.m_sendVREvents.m_numVRControllerEvents;i++)
		{
			m_data->m_cachedVREvents[i] = serverCmd.m_sendVREvents.m_controllerEvents[i];
		}
		break;
	}
	case CMD_REQUEST_KEYBOARD_EVENTS_DATA_COMPLETED:
	{
		if (m_data->m_verboseOutput)
		{
			b3Printf("Request keyboard events completed");
		}
		m_data->m_cachedKeyboardEvents.resize(serverCmd.m_sendKeyboardEvents.m_numKeyboardEvents);
		for (int i=0;i<serverCmd.m_sendKeyboardEvents.m_numKeyboardEvents;i++)
		{
			m_data->m_cachedKeyboardEvents[i] = serverCmd.m_sendKeyboardEvents.m_keyboardEvents[i];
		}
		break;
	}

	case CMD_REQUEST_MOUSE_EVENTS_DATA_COMPLETED:
	{
		B3_PROFILE("CMD_REQUEST_MOUSE_EVENTS_DATA_COMPLETED");
		if (m_data->m_verboseOutput)
		{
			b3Printf("Request mouse events completed");
		}
		m_data->m_cachedMouseEvents.resize(serverCmd.m_sendMouseEvents.m_numMouseEvents);
		for (int i=0;i<serverCmd.m_sendMouseEvents.m_numMouseEvents;i++)
		{
			m_data->m_cachedMouseEvents[i] = serverCmd.m_sendMouseEvents.m_mouseEvents[i];
		}
		break;
	}

	case CMD_REQUEST_INTERNAL_DATA_COMPLETED:
	{
		if (serverCmd.m_numDataStreamBytes)
		{
			int numStreamBytes = serverCmd.m_numDataStreamBytes;
			m_data->m_serverDNA.resize(numStreamBytes);
			for (int i = 0; i < numStreamBytes; i++)
			{
				m_data->m_serverDNA[i] = m_data->m_bulletStreamDataServerToClient[i];
			}
		}
		break;
	}
	case CMD_RESET_SIMULATION_COMPLETED:
	{
		resetData();
		break;
	}

	case CMD_USER_CONSTRAINT_INFO_COMPLETED:
    case CMD_USER_CONSTRAINT_COMPLETED:
    {
        int cid = serverCmd.m_userConstraintResultArgs.m_userConstraintUniqueId;
        m_data->m_userConstraintInfoMap.insert(cid,serverCmd.m_userConstraintResultArgs);
        break;
    }
    case CMD_REMOVE_USER_CONSTRAINT_COMPLETED:
    {
        int cid = serverCmd.m_userConstraintResultArgs.m_userConstraintUniqueId;
        m_data->m_userConstraintInfoMap.remove(cid);
        break;
    }
	case CMD_REMOVE_BODY_FAILED:
	{
		b3Warning("Remove body failed\n");
		break;
	}
	case CMD_REMOVE_BODY_COMPLETED:
	{
		for (int i=0;i<serverCmd.m_removeObjectArgs.m_numBodies;i++)
		{
			int bodyUniqueId = serverCmd.m_removeObjectArgs.m_bodyUniqueIds[i];
			removeCachedBody(bodyUniqueId);
		}
		for (int i=0;i<serverCmd.m_removeObjectArgs.m_numUserConstraints;i++)
		{
			int key = serverCmd.m_removeObjectArgs.m_userConstraintUniqueIds[i];
			m_data->m_userConstraintInfoMap.remove(key);
		}

		break;
	}
	case CMD_CHANGE_USER_CONSTRAINT_COMPLETED:
	{
        int cid = serverCmd.m_userConstraintResultArgs.m_userConstraintUniqueId;
		b3UserConstraint* userConstraintPtr = m_data->m_userConstraintInfoMap[cid];
		if (userConstraintPtr)
		{
			const b3UserConstraint* serverConstraint = &serverCmd.m_userConstraintResultArgs;
			if (serverCmd.m_updateFlags & USER_CONSTRAINT_CHANGE_PIVOT_IN_B)
			{
					userConstraintPtr->m_childFrame[0] = serverConstraint->m_childFrame[0];
					userConstraintPtr->m_childFrame[1] = serverConstraint->m_childFrame[1];
					userConstraintPtr->m_childFrame[2] = serverConstraint->m_childFrame[2];
			}
			if (serverCmd.m_updateFlags & USER_CONSTRAINT_CHANGE_FRAME_ORN_IN_B)
			{
				userConstraintPtr->m_childFrame[3] = serverConstraint->m_childFrame[3];
				userConstraintPtr->m_childFrame[4] = serverConstraint->m_childFrame[4];
				userConstraintPtr->m_childFrame[5] = serverConstraint->m_childFrame[5];
				userConstraintPtr->m_childFrame[6] = serverConstraint->m_childFrame[6];
			}
			if (serverCmd.m_updateFlags & USER_CONSTRAINT_CHANGE_MAX_FORCE)
			{
				userConstraintPtr->m_maxAppliedForce = serverConstraint->m_maxAppliedForce;
			}
		}
		break;
	}

	case CMD_SYNC_BODY_INFO_COMPLETED:
	case CMD_MJCF_LOADING_COMPLETED:
	case CMD_SDF_LOADING_COMPLETED:
	{
		//we'll stream further info from the physics server
		//so serverCmd will be invalid, make a copy

		int numConstraints = serverCmd.m_sdfLoadedArgs.m_numUserConstraints;
		for (int i=0;i<numConstraints;i++)
		{
			int constraintUid = serverCmd.m_sdfLoadedArgs.m_userConstraintUniqueIds[i];
			SharedMemoryCommand infoRequestCommand;
			infoRequestCommand.m_type = CMD_USER_CONSTRAINT;
			infoRequestCommand.m_updateFlags = USER_CONSTRAINT_REQUEST_INFO;
            infoRequestCommand.m_userConstraintArguments.m_userConstraintUniqueId = constraintUid;
			SharedMemoryStatus infoStatus;
			bool hasStatus = m_data->m_commandProcessor->processCommand(infoRequestCommand, infoStatus, &m_data->m_bulletStreamDataServerToClient[0], SHARED_MEMORY_MAX_STREAM_CHUNK_SIZE);
					

			b3Clock clock;
			double startTime = clock.getTimeInSeconds();
			double timeOutInSeconds = m_data->m_timeOutInSeconds;

			while ((!hasStatus) && (clock.getTimeInSeconds()-startTime < timeOutInSeconds))
			{
				hasStatus = m_data->m_commandProcessor->receiveStatus(infoStatus, &m_data->m_bulletStreamDataServerToClient[0], SHARED_MEMORY_MAX_STREAM_CHUNK_SIZE);
			}

			if (hasStatus)
			{
				int cid = infoStatus.m_userConstraintResultArgs.m_userConstraintUniqueId;
				m_data->m_userConstraintInfoMap.insert(cid,infoStatus.m_userConstraintResultArgs);
			}
		}

		int numBodies = serverCmd.m_sdfLoadedArgs.m_numBodies;
		for (int i = 0; i<numBodies; i++)
		{
			int bodyUniqueId = serverCmd.m_sdfLoadedArgs.m_bodyUniqueIds[i];
			SharedMemoryCommand infoRequestCommand;
			infoRequestCommand.m_type = CMD_REQUEST_BODY_INFO;
			infoRequestCommand.m_sdfRequestInfoArgs.m_bodyUniqueId = bodyUniqueId;
			SharedMemoryStatus infoStatus;
			bool hasStatus = m_data->m_commandProcessor->processCommand(infoRequestCommand, infoStatus, &m_data->m_bulletStreamDataServerToClient[0], SHARED_MEMORY_MAX_STREAM_CHUNK_SIZE);
					

			b3Clock clock;
			double startTime = clock.getTimeInSeconds();
			double timeOutInSeconds = m_data->m_timeOutInSeconds;

			while ((!hasStatus) && (clock.getTimeInSeconds()-startTime < timeOutInSeconds))
			{
				hasStatus = m_data->m_commandProcessor->receiveStatus(infoStatus, &m_data->m_bulletStreamDataServerToClient[0], SHARED_MEMORY_MAX_STREAM_CHUNK_SIZE);
			}

			if (hasStatus)
			{
				processBodyJointInfo(bodyUniqueId, infoStatus);
			}
		}
		break;
	}
	case CMD_CREATE_MULTI_BODY_COMPLETED:
	case CMD_URDF_LOADING_COMPLETED:
	{

		if (serverCmd.m_numDataStreamBytes > 0)
		{
			int bodyIndex = serverCmd.m_dataStreamArguments.m_bodyUniqueId;
			processBodyJointInfo(bodyIndex, serverCmd);
		}
		break;
	}
	case CMD_BULLET_LOADING_FAILED:
	{
		b3Warning("Couldn't load .bullet file");
		break;
	}
	case CMD_BULLET_LOADING_COMPLETED:
	{
		break;
	}
	
	case CMD_REQUEST_OPENGL_VISUALIZER_CAMERA_COMPLETED:
	{
		break;
	}

	case CMD_REQUEST_OPENGL_VISUALIZER_CAMERA_FAILED:
	{
		b3Warning("requestOpenGLVisualizeCamera failed");
		break;
	}
	case CMD_REMOVE_USER_CONSTRAINT_FAILED:
	{
		b3Warning("removeConstraint failed");
		break;
	}
	case CMD_CHANGE_USER_CONSTRAINT_FAILED:
	{
		b3Warning("changeConstraint failed");
		break;
	}

	case CMD_USER_CONSTRAINT_FAILED:
	{
		b3Warning("createConstraint failed");
		break;
	}
	
	case CMD_CREATE_COLLISION_SHAPE_FAILED:
	{
		b3Warning("createCollisionShape failed");
		break;
	}
	case CMD_CREATE_COLLISION_SHAPE_COMPLETED:
	{
		break;
	}
	
	case CMD_CREATE_VISUAL_SHAPE_FAILED:
	{
		b3Warning("createVisualShape failed");
		break;
	}
	case CMD_CREATE_VISUAL_SHAPE_COMPLETED:
	{
		break;
	}
	
	case CMD_CREATE_MULTI_BODY_FAILED:
	{
		b3Warning("createMultiBody failed");
		break;
	}
	case CMD_REQUEST_COLLISION_INFO_COMPLETED:
	{
		break;
	}
	case CMD_REQUEST_COLLISION_INFO_FAILED:
	{
		b3Warning("Request getCollisionInfo failed");
		break;
	}

	default:
	{
		//b3Warning("Unknown server status type");
	}
	};


}