nuclear@1: #include nuclear@1: #include "vr.h" nuclear@1: #include "vr_impl.h" nuclear@1: nuclear@1: static bool init_ovr(); nuclear@1: nuclear@3: VRContext vr_ctx; nuclear@1: nuclear@1: extern "C" int vr_init(enum vr_init_mode mode) nuclear@1: { nuclear@1: if(!init_ovr()) { nuclear@1: return -1; nuclear@1: } nuclear@1: return 0; nuclear@1: } nuclear@1: nuclear@1: extern "C" void vr_shutdown(void) nuclear@1: { nuclear@3: //System::Destroy(); nuclear@1: } nuclear@1: nuclear@1: static bool init_ovr() nuclear@1: { nuclear@5: LogMaskConstants log_level; nuclear@1: // initialize Oculus SDK nuclear@5: const char *logenv = getenv("VR_LOGLEVEL"); nuclear@5: if(logenv) { nuclear@5: switch(atoi(logenv)) { nuclear@5: case 0: nuclear@5: log_level = LogMask_None; nuclear@5: break; nuclear@5: case 1: nuclear@5: log_level = LogMask_Regular; nuclear@5: break; nuclear@5: case 2: nuclear@5: default: nuclear@5: log_level = LogMask_All; nuclear@5: break; nuclear@5: } nuclear@5: } nuclear@5: nuclear@5: System::Init(Log::ConfigureDefaultLog(log_level)); nuclear@3: if(!(vr_ctx.ovr_devman = DeviceManager::Create())) { nuclear@1: fprintf(stderr, "failed to create OVR device manager\n"); nuclear@1: return false; nuclear@1: } nuclear@1: nuclear@1: // create the display device nuclear@4: HMDInfo info; nuclear@3: if(!(vr_ctx.ovr_hmd_dev = vr_ctx.ovr_devman->EnumerateDevices().CreateDevice())) { nuclear@1: fprintf(stderr, "no oculus rift devices found\n"); nuclear@4: } else { nuclear@4: if(vr_ctx.ovr_hmd_dev->GetDeviceInfo(&info)) { nuclear@4: printf("oculus device info:\n"); nuclear@4: printf(" name: %s\n", info.DisplayDeviceName); nuclear@4: printf(" ipd: %f\n", info.InterpupillaryDistance); nuclear@4: printf(" distortion: %f %f %f %f\n", info.DistortionK[0], nuclear@4: info.DistortionK[1], info.DistortionK[2], info.DistortionK[3]); nuclear@4: } nuclear@1: nuclear@4: // calculate and store viewing parameters nuclear@4: float vhalfsz = info.VScreenSize * 0.5; nuclear@4: vr_ctx.info.fov = 2.0 * atan(vhalfsz / info.EyeToScreenDistance); nuclear@4: nuclear@4: vr_ctx.info.width = info.HResolution; nuclear@4: vr_ctx.info.height = info.VResolution; nuclear@4: vr_ctx.info.aspect = (float)vr_ctx.info.width / (float)vr_ctx.info.height; nuclear@4: nuclear@4: vr_ctx.info.ipd = info.InterpupillaryDistance; nuclear@4: for(int i=0; i<4; i++) { nuclear@4: vr_ctx.info.distort[i] = info.DistortionK[i]; nuclear@4: } nuclear@1: } nuclear@1: nuclear@1: // get the sensor device nuclear@4: if(vr_ctx.ovr_hmd_dev) { nuclear@4: if(!(vr_ctx.ovr_sensor_dev = vr_ctx.ovr_hmd_dev->GetSensor())) { nuclear@4: fprintf(stderr, "failed to get oculus sensor device\n"); nuclear@4: } nuclear@4: } else { nuclear@4: if(!(vr_ctx.ovr_sensor_dev = vr_ctx.ovr_devman->EnumerateDevices().CreateDevice())) { nuclear@4: fprintf(stderr, "failed to get oculus sensor device\n"); nuclear@4: } nuclear@1: } nuclear@1: nuclear@4: if(vr_ctx.ovr_sensor_dev) { nuclear@4: SensorInfo sinfo; nuclear@4: if(vr_ctx.ovr_sensor_dev->GetDeviceInfo(&sinfo)) { nuclear@4: printf("oculus sensor device info:\n"); nuclear@4: printf(" name: %s\n", sinfo.ProductName); nuclear@4: } nuclear@4: nuclear@4: vr_ctx.ovr_sfusion.AttachToSensor(vr_ctx.ovr_sensor_dev); nuclear@1: } nuclear@1: return true; nuclear@1: } nuclear@3: nuclear@3: extern "C" int vr_get_width(void) nuclear@3: { nuclear@3: return vr_ctx.info.width; nuclear@3: } nuclear@3: nuclear@3: extern "C" int vr_get_height(void) nuclear@3: { nuclear@3: return vr_ctx.info.height; nuclear@3: } nuclear@3: nuclear@3: extern "C" float vr_get_fov(void) nuclear@3: { nuclear@3: return vr_ctx.info.fov; nuclear@3: } nuclear@3: nuclear@3: extern "C" float vr_get_aspect(void) nuclear@3: { nuclear@3: return vr_ctx.info.aspect; nuclear@3: } nuclear@3: nuclear@3: extern "C" void vr_set_eyedist(float ipd) nuclear@3: { nuclear@3: vr_ctx.info.ipd = ipd; nuclear@3: } nuclear@3: nuclear@3: extern "C" float vr_get_eyedist(void) nuclear@3: { nuclear@3: return vr_ctx.info.ipd; nuclear@3: } nuclear@3: nuclear@3: extern "C" void vr_set_distort(const float *coef) nuclear@3: { nuclear@3: memcpy(vr_ctx.info.distort, coef, sizeof vr_ctx.info.distort); nuclear@3: } nuclear@3: nuclear@3: extern "C" void vr_get_distort(float *coef) nuclear@3: { nuclear@3: memcpy(coef, vr_ctx.info.distort, sizeof vr_ctx.info.distort); nuclear@3: } nuclear@3: nuclear@3: extern "C" void vr_set_prediction_sec(float dt) nuclear@3: { nuclear@3: vr_ctx.ovr_sfusion.SetPrediction(dt); nuclear@3: } nuclear@3: nuclear@3: extern "C" float vr_get_prediction_sec(void) nuclear@3: { nuclear@3: return vr_ctx.ovr_sfusion.GetPredictionDelta(); nuclear@3: } nuclear@3: nuclear@3: extern "C" void vr_get_translation(float *offs) nuclear@3: { nuclear@3: // current oculus devkit doesn't do translation nuclear@3: offs[0] = offs[1] = offs[2] = 0.0f; nuclear@3: } nuclear@3: nuclear@3: extern "C" void vr_get_rotation(float *quat) nuclear@3: { nuclear@3: Quatf oq = vr_ctx.ovr_sfusion.GetPredictedOrientation(); nuclear@3: quat[0] = oq.x; nuclear@3: quat[1] = oq.y; nuclear@3: quat[2] = oq.z; nuclear@3: quat[3] = oq.w; nuclear@3: } nuclear@3: nuclear@3: extern "C" void vr_get_rotation_euler(float *euler) nuclear@3: { nuclear@3: Quatf oq = vr_ctx.ovr_sfusion.GetPredictedOrientation(); nuclear@3: oq.GetEulerAngles(euler + 1, euler, euler + 2); nuclear@3: }