OSVR_ReturnCode osvrAnalysisSyncInit(OSVR_IN_PTR OSVR_PluginRegContext ctx, OSVR_IN_STRZ const char *name, OSVR_IN_PTR OSVR_DeviceInitOptions options, OSVR_OUT_PTR OSVR_DeviceToken *device, OSVR_OUT_PTR OSVR_ClientContext *clientCtx) { if (!ctx) { OSVR_DEV_VERBOSE("osvrAnalysisSyncInit: can't use a null plugin " "registration context."); return OSVR_RETURN_FAILURE; } if (!name || !(name[0])) { OSVR_DEV_VERBOSE( "osvrAnalysisSyncInit: can't use a null or empty device name."); return OSVR_RETURN_FAILURE; } OSVR_VALIDATE_OUTPUT_PTR(device, "device token"); OSVR_VALIDATE_OUTPUT_PTR(clientCtx, "client context"); auto initialResult = osvrDeviceSyncInitWithOptions(ctx, name, options, device); if (initialResult == OSVR_RETURN_FAILURE) { OSVR_DEV_VERBOSE( "osvrAnalysisSyncInit: couldn't create initial device token."); return OSVR_RETURN_FAILURE; } /// Dig the VRPN connection out of the server. auto osvrConn = osvr::connection::Connection::retrieveConnection( osvr::pluginhost::PluginSpecificRegistrationContext::get(ctx) .getParent()); auto vrpnConn = extractVrpnConnection(*osvrConn); /// Create a client context here /// @todo Use an interface factory that handles relative paths. auto clientCtxSmart = osvr::common::wrapSharedContext( osvr::client::createAnalysisClientContext( "org.osvr.analysisplugin" /**< @todo */, "localhost" /**< @todo */, vrpn_ConnectionPtr(vrpnConn))); auto &dev = **device; /// pass ownership dev.acquireObject(clientCtxSmart); /// register client context update dev.setPreConnectionInteract([=] { clientCtxSmart->update(); }); /// finally return the client context too. *clientCtx = clientCtxSmart.get(); return OSVR_RETURN_SUCCESS; }
OSVR_ReturnCode osvrClientGetSkeletonBoneName(OSVR_Skeleton skel, OSVR_SkeletonBoneCount boneId, char *boneName, uint32_t len) { OSVR_VALIDATE_SKELETON_CONFIG; OSVR_VALIDATE_OUTPUT_PTR(boneName, "bone name"); try { auto name = skel->getBoneName(boneId); if (name.size() + 1 > len) { /// buffer too small return OSVR_RETURN_FAILURE; } // this line pops warning 4996 on VS compiler, disabled above name.copy(boneName, name.size()); boneName[name.size()] = '\0'; } catch (osvr::client::IdNotFound &) { OSVR_DEV_VERBOSE( "Error getting name for provided boneId : Id not found"); return OSVR_RETURN_FAILURE; } catch (std::exception &e) { OSVR_DEV_VERBOSE( "Error getting name for provided boneId : " << e.what()); return OSVR_RETURN_FAILURE; } return OSVR_RETURN_SUCCESS; }
OSVR_ReturnCode osvrClientGetSkeletonNumJoints(OSVR_Skeleton skel, OSVR_SkeletonJointCount *numJoints) { OSVR_VALIDATE_SKELETON_CONFIG; OSVR_VALIDATE_OUTPUT_PTR(numJoints, "number of joints"); *numJoints = skel->getNumJoints(); return OSVR_RETURN_SUCCESS; }
OSVR_ReturnCode osvrClientGetSkeletonBoneId(OSVR_Skeleton skel, const char *boneName, OSVR_SkeletonBoneCount *boneId) { OSVR_VALIDATE_SKELETON_CONFIG; OSVR_VALIDATE_OUTPUT_PTR(boneId, "bone Id"); if (!skel->getBoneId(boneName, boneId)) { OSVR_DEV_VERBOSE("Error getting boneId for " << boneName); return OSVR_RETURN_FAILURE; } return OSVR_RETURN_SUCCESS; }
OSVR_ReturnCode osvrClientGetSkeletonJointId(OSVR_Skeleton skel, const char *jointName, OSVR_SkeletonJointCount *jointId) { OSVR_VALIDATE_SKELETON_CONFIG; OSVR_VALIDATE_OUTPUT_PTR(jointId, "joint Id"); if (!skel->getJointId(jointName, jointId)) { OSVR_DEV_VERBOSE("Error getting jointId for " << jointName); return OSVR_RETURN_FAILURE; } return OSVR_RETURN_SUCCESS; }
OSVR_CLIENTKIT_EXPORT OSVR_ReturnCode osvrClientGetSkeletonAvailableBoneId( OSVR_Skeleton skel, OSVR_SkeletonBoneCount boneIndex, OSVR_SkeletonBoneCount *boneId) { OSVR_VALIDATE_SKELETON_CONFIG; OSVR_VALIDATE_OUTPUT_PTR(boneId, "bone Id"); if (!skel->getAvailableBoneId(boneIndex, boneId)) { OSVR_DEV_VERBOSE("ERROR getting the boneId for boneIndex " << boneIndex); return OSVR_RETURN_FAILURE; } return OSVR_RETURN_SUCCESS; }
OSVR_CLIENTKIT_EXPORT OSVR_ReturnCode osvrClientGetSkeletonAvailableJointId( OSVR_Skeleton skel, OSVR_SkeletonJointCount jointIndex, OSVR_SkeletonJointCount *jointId) { OSVR_VALIDATE_SKELETON_CONFIG; OSVR_VALIDATE_OUTPUT_PTR(jointId, "joint Id"); if (!skel->getAvailableJointId(jointIndex, jointId)) { OSVR_DEV_VERBOSE("ERROR getting the jointId for jointIndex " << jointIndex); return OSVR_RETURN_FAILURE; } return OSVR_RETURN_SUCCESS; }
OSVR_ReturnCode osvrClientGetSkeletonStringBoneNameLength( OSVR_Skeleton skel, OSVR_SkeletonBoneCount boneId, uint32_t *len) { OSVR_VALIDATE_SKELETON_CONFIG; OSVR_VALIDATE_OUTPUT_PTR(len, "name length"); try { auto boneName = skel->getBoneName(boneId); *len = static_cast<uint32_t>(boneName.empty() ? 0 : (boneName.size() + 1)); } catch (osvr::client::IdNotFound &) { OSVR_DEV_VERBOSE( "Error getting name for provided boneId : Id not found"); return OSVR_RETURN_FAILURE; } catch (std::exception &e) { OSVR_DEV_VERBOSE( "Error getting name for provided boneId : " << e.what()); return OSVR_RETURN_FAILURE; } return OSVR_RETURN_SUCCESS; }
OSVR_ReturnCode osvrClientGetSkeletonJointState(OSVR_Skeleton skel, OSVR_SkeletonJointCount jointId, OSVR_SkeletonJointState *state) { OSVR_VALIDATE_SKELETON_CONFIG; OSVR_VALIDATE_OUTPUT_PTR(state, "joint state"); try { OSVR_Pose3 pose = skel->getJointState(jointId); state->jointId = jointId; state->pose = pose; } catch (osvr::client::NoPoseYet &) { OSVR_DEV_VERBOSE("Error getting pose for joint: no pose yet available"); return OSVR_RETURN_FAILURE; } catch (std::exception &e) { OSVR_DEV_VERBOSE("Error getting joint pose - exception: " << e.what()); return OSVR_RETURN_FAILURE; } return OSVR_RETURN_SUCCESS; }