OpenHMD - Perl binding for OpenHMD C library
# This synopsis is available as examples/simple.pl
##############################################################################
# This code is a port of OpenHMD's examples/simple.c
# It is not representitive of "best practice" Perl.
##############################################################################
use OpenHMD qw(:all);
sub ohmd_sleep
{
select(undef, undef, undef, shift);
}
sub print_infof
{
my ($hmd, $name, $len, $val) = @_;
my $f = pack 'f*', (0) x $len;
ohmd_device_getf($hmd, $val, $f);
printf("%-20s", $name);
my @f = unpack 'f*', $f;
for(my $i = 0; $i < $len; $i++)
{ printf("%f ", $f[$i]); }
printf("\n");
}
my $ctx = ohmd_ctx_create();
my $num_devices = ohmd_ctx_probe($ctx);
if ($num_devices < 0) {
printf('failed to probe devices: %s', ohmd_ctx_get_error($ctx));
exit;
}
printf "num devices: %d\n\n", $num_devices;
for (my $i = 0; $i < $num_devices; $i++) {
printf("device %d\n", $i);
printf(" vendor: %s\n", ohmd_list_gets($ctx, $i, $OHMD_VENDOR));
printf(" product: %s\n", ohmd_list_gets($ctx, $i, $OHMD_PRODUCT));
printf(" path: %s\n\n", ohmd_list_gets($ctx, $i, $OHMD_PATH));
}
my $hmd = ohmd_list_open_device($ctx, 0);
if (!$hmd) {
printf('failed to open device: %s', ohmd_ctx_get_error($ctx));
exit;
}
my @ivals = (pack 'i1') x 2;
ohmd_device_geti($hmd, $OHMD_SCREEN_HORIZONTAL_RESOLUTION, $ivals[0]);
ohmd_device_geti($hmd, $OHMD_SCREEN_VERTICAL_RESOLUTION, $ivals[1]);
printf "resolution: %i x %i\n", unpack 'i*', join '', @ivals;
print_infof($hmd, "hsize:", 1, $OHMD_SCREEN_HORIZONTAL_SIZE);
print_infof($hmd, "vsize:", 1, $OHMD_SCREEN_VERTICAL_SIZE);
print_infof($hmd, "lens separation:", 1, $OHMD_LENS_HORIZONTAL_SEPARATION);
print_infof($hmd, "lens vcenter:", 1, $OHMD_LENS_VERTICAL_POSITION);
print_infof($hmd, "left eye fov:", 1, $OHMD_LEFT_EYE_FOV);
print_infof($hmd, "right eye fov:", 1, $OHMD_RIGHT_EYE_FOV);
print_infof($hmd, "left eye aspect:", 1, $OHMD_LEFT_EYE_ASPECT_RATIO);
print_infof($hmd, "right eye aspect:", 1, $OHMD_RIGHT_EYE_ASPECT_RATIO);
print_infof($hmd, "distortion k:", 6, $OHMD_DISTORTION_K);
printf "\n";
for (my $i = 0; $i < 10000; $i++) {
ohmd_ctx_update($ctx);
print_infof($hmd, "rotation quat:", 4, $OHMD_ROTATION_QUAT);
ohmd_sleep(.01);
}
ohmd_ctx_destroy($ctx);
OpenHMD is a 1:1 mapping for the OpenHMD C library.
OpenHMD implements the following functions, which can be imported individually or using the :functions
tag.
my $context = ohmd_ctx_create();
Create a new OpenHMD context.
ohmd_ctx_destroy($context);
Destroy an OpenHMD context.
my $error = ohmd_ctx_get_error($context);
Gets the latest human readable error message.
my $device_count = ohmd_ctx_probe($context);
Probes for supported devices and returns the count of found devices.
ohmd_ctx_update($context);
Updates an OpenHMD context.
my $status = ohmd_device_getf($device, $type, $out);
Populate @values with the float values for $type.
# Get the rotation quaternion
my $out = pack 'f4';
my $status = ohmd_device_getf($device, $OHMD_ROTATION_QUAT, $out);
my @quaternion = unpack 'f*', $out;
# @quaternion = (0, 0, 0, 1);
my $status = ohmd_device_geti($device, $type, $out);
Populate @values with the integer values for $type.
# Get the horizontal resolution
my $out = pack 'i1';
my $status = ohmd_device_geti(
$device, $OHMD_SCREEN_HORIZONTAL_RESOLUTION, $out
);
my $horizontal = unpack 'i*', $out;
# $horizontal = 1280
my $status = ohmd_device_setf($device, $type, $in);
Sets float values for $type.
# Set the IPD to 0.60
my $in = pack 'f1', 0.6;
my $status = ohmd_device_getf($device, $OHMD_EYE_IPD, $in);
my $string = ohmd_list_gets($context, $index, $type);
Gets the string value of $type for device at $index.
# Get vendor of device at index 1
my $vendor = ohmd_list_gets($context, 1, $OHMD_VENDOR);
# $vendor = 'OpenHMD'
my $device = ohmd_list_open_device($context, $index);
Opens the device at $index.
# Open the default device
my $device = ohmd_list_open_device($context, 0);
# Open the last device
my $device = ohmd_list_open_device($context, $device_count - 1);
OpenHMD provides the following constants, which can be imported individually or using the :constants
tag.
- String
-
$OHMD_VENDOR $OHMD_PRODUCT $OHMD_PATH
- Status
-
$OHMD_S_OK $OHMD_S_UNKNOWN_ERROR $OHMD_S_INVALID_PARAMETER $OHMD_S_USER_RESERVED
- Integer
-
$OHMD_SCREEN_HORIZONTAL_RESOLUTION $OHMD_SCREEN_VERTICAL_RESOLUTION
- Float
-
$OHMD_ROTATION_QUAT $OHMD_LEFT_EYE_GL_MODELVIEW_MATRIX $OHMD_RIGHT_EYE_GL_MODELVIEW_MATRIX $OHMD_LEFT_EYE_GL_PROJECTION_MATRIX $OHMD_RIGHT_EYE_GL_PROJECTION_MATRIX $OHMD_POSITION_VECTOR $OHMD_SCREEN_HORIZONTAL_SIZE $OHMD_SCREEN_VERTICAL_SIZE $OHMD_LENS_HORIZONTAL_SEPARATION $OHMD_LENS_VERTICAL_POSITION $OHMD_LEFT_EYE_FOV $OHMD_LEFT_EYE_ASPECT_RATIO $OHMD_RIGHT_EYE_FOV $OHMD_RIGHT_EYE_ASPECT_RATIO $OHMD_EYE_IPD $OHMD_PROJECTION_ZFAR $OHMD_PROJECTION_ZNEAR $OHMD_DISTORTION_K
- OpenHMD
-
OpenHMD's website.
- #openhmd @ freenode
-
Official IRC channel for OpenHMD
OpenHMD depends on the following modules.
- Const::Fast
-
Exportable, read-only constants.
- Exporter
-
Exporting constants and functions.
- Inline::C
-
Access to C functions.
- Fredrick Hultin and Joey Ferwerda
-
For their help with the C part of this module, answering questions, implementing suggested functionality into OpenHMD and generally being very encouraging and supportive of perl-openhmd.
- NefariousMoogle
-
Reviewed documentation as someone relatively inexperienced with Perl.
CandyAngel (candyangel@electricjungle.org)
Copyright (c) 2015 CandyAngel (candyangel@electricjungle.org). All rights reserved.
This module is free software; you can redistribute it and/or modify it under the same terms as Perl itself. See perlartistic. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.