int OHMD_APIENTRY ohmd_device_getf(ohmd_device* device, ohmd_float_value type, float* out) { switch(type){ case OHMD_LEFT_EYE_GL_MODELVIEW_MATRIX: { vec3f point = {{0, 0, 0}}; quatf rot; device->getf(device, OHMD_ROTATION_QUAT, (float*)&rot); quatf tmp = device->rotation_correction; oquatf_mult_me(&tmp, &rot); rot = tmp; mat4x4f orient, world_shift, result; omat4x4f_init_look_at(&orient, &rot, &point); omat4x4f_init_translate(&world_shift, +(device->properties.ipd / 2.0f), 0, 0); omat4x4f_mult(&world_shift, &orient, &result); omat4x4f_transpose(&result, (mat4x4f*)out); return OHMD_S_OK; } case OHMD_RIGHT_EYE_GL_MODELVIEW_MATRIX: { vec3f point = {{0, 0, 0}}; quatf rot; device->getf(device, OHMD_ROTATION_QUAT, (float*)&rot); oquatf_mult_me(&rot, &device->rotation_correction); mat4x4f orient, world_shift, result; omat4x4f_init_look_at(&orient, &rot, &point); omat4x4f_init_translate(&world_shift, -(device->properties.ipd / 2.0f), 0, 0); omat4x4f_mult(&world_shift, &orient, &result); omat4x4f_transpose(&result, (mat4x4f*)out); return OHMD_S_OK; } case OHMD_LEFT_EYE_GL_PROJECTION_MATRIX: omat4x4f_transpose(&device->properties.proj_left, (mat4x4f*)out); return OHMD_S_OK; case OHMD_RIGHT_EYE_GL_PROJECTION_MATRIX: omat4x4f_transpose(&device->properties.proj_right, (mat4x4f*)out); return OHMD_S_OK; case OHMD_SCREEN_HORIZONTAL_SIZE: *out = device->properties.hsize; return OHMD_S_OK; case OHMD_SCREEN_VERTICAL_SIZE: *out = device->properties.vsize; return OHMD_S_OK; case OHMD_LENS_HORIZONTAL_SEPARATION: *out = device->properties.lens_sep; return OHMD_S_OK; case OHMD_LENS_VERTICAL_POSITION: *out = device->properties.lens_vpos; return OHMD_S_OK; case OHMD_RIGHT_EYE_FOV: case OHMD_LEFT_EYE_FOV: *out = device->properties.fov; return OHMD_S_OK; case OHMD_RIGHT_EYE_ASPECT_RATIO: case OHMD_LEFT_EYE_ASPECT_RATIO: *out = device->properties.ratio; return OHMD_S_OK; case OHMD_EYE_IPD: *out = device->properties.ipd; return OHMD_S_OK; case OHMD_PROJECTION_ZFAR: *out = device->properties.zfar; return OHMD_S_OK; case OHMD_PROJECTION_ZNEAR: *out = device->properties.znear; return OHMD_S_OK; case OHMD_ROTATION_QUAT: { int ret = device->getf(device, OHMD_ROTATION_QUAT, out); if(ret != 0) return ret; oquatf_mult_me((quatf*)out, &device->rotation_correction); quatf tmp = device->rotation_correction; oquatf_mult_me(&tmp, (quatf*)out); *(quatf*)out = tmp; return OHMD_S_OK; } case OHMD_POSITION_VECTOR: { int ret = device->getf(device, OHMD_POSITION_VECTOR, out); if(ret != 0) return ret; for(int i = 0; i < 3; i++) out[i] += device->position_correction.arr[i]; return OHMD_S_OK; } default: return device->getf(device, type, out); } }
int OHMD_APIENTRY ohmd_device_getf(ohmd_device* device, ohmd_float_value type, float* out) { switch(type){ case OHMD_LEFT_EYE_GL_MODELVIEW_MATRIX: { vec3f point = {{0, 0, 0}}; quatf rot; device->getf(device, OHMD_ROTATION_QUAT, (float*)&rot); mat4x4f orient, world_shift, result; omat4x4f_init_look_at(&orient, &rot, &point); omat4x4f_init_translate(&world_shift, +(device->properties.ipd / 2.0f), 0, 0); omat4x4f_mult(&world_shift, &orient, &result); omat4x4f_transpose(&result, (mat4x4f*)out); return 0; } case OHMD_RIGHT_EYE_GL_MODELVIEW_MATRIX: { vec3f point = {{0, 0, 0}}; quatf rot; device->getf(device, OHMD_ROTATION_QUAT, (float*)&rot); mat4x4f orient, world_shift, result; omat4x4f_init_look_at(&orient, &rot, &point); omat4x4f_init_translate(&world_shift, -(device->properties.ipd / 2.0f), 0, 0); omat4x4f_mult(&world_shift, &orient, &result); omat4x4f_transpose(&result, (mat4x4f*)out); return 0; } case OHMD_LEFT_EYE_GL_PROJECTION_MATRIX: omat4x4f_transpose(&device->properties.proj_left, (mat4x4f*)out); return 0; case OHMD_RIGHT_EYE_GL_PROJECTION_MATRIX: omat4x4f_transpose(&device->properties.proj_right, (mat4x4f*)out); return 0; case OHMD_SCREEN_HORIZONTAL_SIZE: *out = device->properties.hsize; return 0; case OHMD_SCREEN_VERTICAL_SIZE: *out = device->properties.vsize; return 0; case OHMD_LENS_HORIZONTAL_SEPARATION: *out = device->properties.lens_sep; return 0; case OHMD_LENS_VERTICAL_POSITION: *out = device->properties.lens_vpos; return 0; case OHMD_RIGHT_EYE_FOV: case OHMD_LEFT_EYE_FOV: *out = device->properties.fov; return 0; case OHMD_RIGHT_EYE_ASPECT_RATIO: case OHMD_LEFT_EYE_ASPECT_RATIO: *out = device->properties.ratio; return 0; case OHMD_EYE_IPD: *out = device->properties.ipd; return 0; case OHMD_PROJECTION_ZFAR: *out = device->properties.zfar; return 0; case OHMD_PROJECTION_ZNEAR: *out = device->properties.znear; return 0; default: return device->getf(device, type, out); } }