NAME
OpenHMD::Backend::Inline - Binding for the OpenHMD C library, using Inline::C
SYNOPSIS
This synopsis is available as eg/openhmd-backend-inline.pl
use OpenHMD::Backend::Inline qw(:all);
my $context = ohmd_ctx_create() or die 'Failed to create context';
my $count = ohmd_ctx_probe($context);
die sprintf 'Failed to probe devices: %s', ohmd_ctx_get_error($context)
if $count < 0;
printf "Devices: %i\n\n", $count;
my $print_gets = sub {
my ($title, $index, $type) = @_;
my $value = ohmd_list_gets($context, $index, $type);
printf " %-8s: %s\n", $title, $value;
};
foreach my $index (0 .. $count - 1) {
printf "Device %i\n", $index;
$print_gets->('Vendor', $index, $OHMD_VENDOR);
$print_gets->('Product', $index, $OHMD_PRODUCT);
$print_gets->('Path', $index, $OHMD_PATH);
print "\n";
}
my $device = ohmd_list_open_device($context, 0);
die sprintf 'Failed to open device: %s', ohmd_ctx_get_error($context)
if !$device;
my $geti = sub {
my $type = shift;
my $buffer = pack 'i';
my $status = ohmd_device_geti($device, $type, $buffer);
die 'Failed to get integer: %s', ohmd_ctx_get_error($context)
if $status != $OHMD_S_OK;
return unpack 'i', $buffer;
};
my @resolution = (
$geti->($OHMD_SCREEN_HORIZONTAL_RESOLUTION),
$geti->($OHMD_SCREEN_VERTICAL_RESOLUTION),
);
printf "%-20s: %i x %i\n", 'Resolution', @resolution;
my $print_getf = sub {
my ($title, $size, $type) = @_;
my $buffer = pack sprintf 'f%i', $size;
my $status = ohmd_device_getf($device, $type, $buffer);
die 'Failed to get float: %s', ohmd_ctx_get_error($context)
if $status != $OHMD_S_OK;
printf "%-20s: %s\n", (
$title,
join ' ', map { sprintf '% 6f', $_ } unpack 'f*', $buffer,
);
};
$print_getf->('Horizontal Size', 1, $OHMD_SCREEN_HORIZONTAL_SIZE);
$print_getf->('Vertical Size', 1, $OHMD_SCREEN_VERTICAL_SIZE);
$print_getf->('Lens Separation', 1, $OHMD_LENS_HORIZONTAL_SEPARATION);
$print_getf->('Lens Position', 1, $OHMD_LENS_VERTICAL_POSITION);
$print_getf->('Left Eye FoV', 1, $OHMD_LEFT_EYE_FOV);
$print_getf->('Right Eye FoV', 1, $OHMD_RIGHT_EYE_FOV);
$print_getf->('Left Eye Aspect', 1, $OHMD_LEFT_EYE_ASPECT_RATIO);
$print_getf->('Right Eye Aspect', 1, $OHMD_RIGHT_EYE_ASPECT_RATIO);
$print_getf->('Distortion K', 6, $OHMD_DISTORTION_K);
print "\n";
$print_getf->('Default IPD', 1, $OHMD_EYE_IPD);
my $buffer = pack 'f', 0.55;
my $status = ohmd_device_setf($device, $OHMD_EYE_IPD, $buffer);
die sprintf 'Failed to set value: %s', ohmd_ctx_get_error($context)
if $status != $OHMD_S_OK;
$print_getf->('Set IPD', 1, $OHMD_EYE_IPD);
print "\n";
foreach my $tick (0 .. 10) {
ohmd_ctx_update($context);
$print_getf->('Rotation Quaternion', 4, $OHMD_ROTATION_QUAT);
select undef, undef, undef, 0.1;
}
$status = ohmd_close_device($device);
die sprintf 'Failed to close device: %s', ohmd_ctx_get_error($context)
if $status != $OHMD_S_OK;
ohmd_ctx_destroy($context);
DESCRIPTION
OpenHMD::Backend::Inline is a thin wrapper for the OpenHMD C library, using Inline::C.
FUNCTIONS
OpenHMD::Backend::Inline implements the following functions, which can be imported individually or using the :functions
tag.
ohmd_close_device
my $status = ohmd_close_device($device);
Closes a device.
ohmd_ctx_create
my $context = ohmd_ctx_create();
Create a new OpenHMD context.
ohmd_ctx_destroy
ohmd_ctx_destroy($context);
Destroy an OpenHMD context.
ohmd_ctx_get_error
my $error = ohmd_ctx_get_error($context);
Gets the latest human readable error message.
ohmd_ctx_probe
my $device_count = ohmd_ctx_probe($context);
Probes for supported devices and returns the count of found devices.
ohmd_ctx_update
ohmd_ctx_update($context);
Updates an OpenHMD context.
ohmd_device_getf
my $status = ohmd_device_getf($device, $type, $out);
Populate $out with the float values for $type as a packed string.
# Get the rotation quaternion
my $out = pack 'f4';
my $status = ohmd_device_getf($device, $OHMD_ROTATION_QUAT, $out);
my @quaternion = unpack 'f*', $out;
ohmd_device_geti
my $status = ohmd_device_geti($device, $type, $out);
Populate $out with the integer values for $type as a packed string.
# Get the horizontal resolution
my $out = pack 'i1';
my $status = ohmd_device_geti(
$device,
$OHMD_SCREEN_HORIZONTAL_RESOLUTION,
$out,
);
my $horizontal = unpack 'i*', $out;
ohmd_device_setf
my $status = ohmd_device_setf($device, $type, $in);
Sets float values for $type.
# Set the IPD to 0.6
my $in = pack 'f1', 0.6;
my $status = ohmd_device_getf($device, $OHMD_EYE_IPD, $in);
ohmd_list_gets
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);
ohmd_list_open_device
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);
CONSTANTS
OpenHMD::Backend::Inline provides the following constants, which can be imported individually or using the :constants
tag.
Float
$OHMD_DISTORTION_K
$OHMD_EYE_IPD
$OHMD_LEFT_EYE_ASPECT_RATIO
$OHMD_LEFT_EYE_FOV
$OHMD_LEFT_EYE_GL_MODELVIEW_MATRIX
$OHMD_LEFT_EYE_GL_PROJECTION_MATRIX
$OHMD_LENS_HORIZONTAL_SEPARATION
$OHMD_LENS_VERTICAL_POSITION
$OHMD_POSITION_VECTOR
$OHMD_PROJECTION_ZFAR
$OHMD_PROJECTION_ZNEAR
$OHMD_RIGHT_EYE_ASPECT_RATIO
$OHMD_RIGHT_EYE_FOV
$OHMD_RIGHT_EYE_GL_MODELVIEW_MATRIX
$OHMD_RIGHT_EYE_GL_PROJECTION_MATRIX
$OHMD_ROTATION_QUAT
$OHMD_SCREEN_HORIZONTAL_SIZE
$OHMD_SCREEN_VERTICAL_SIZE
Integer
$OHMD_SCREEN_HORIZONTAL_RESOLUTION
$OHMD_SCREEN_VERTICAL_RESOLUTION
Status
$OHMD_S_INVALID_PARAMETER
$OHMD_S_OK
$OHMD_S_UNKNOWN_ERROR
$OHMD_S_USER_RESERVED
String
$OHMD_PATH
$OHMD_PRODUCT
$OHMD_VENDOR
SEE ALSO
- openhmd.net
-
OpenHMD's website.
- #openhmd @ freenode
-
Official IRC channel for OpenHMD
DEPENDENCIES
OpenHMD::Backend::Inline depends on the following modules.
- Carp
-
Throwing errors from the callers perspective.
- Const::Fast
-
Exportable, read-only constants.
- Exporter
-
Exporting constants and functions.
- Inline::C
-
Access to C functions from Perl.
ACKNOWLEDGEMENTS
- Fredrick Hultin and Joey Ferwerda
-
For their help with the C aspect of this module, answering questions, implementing suggested functionality into OpenHMD and generally being very encouraging and supportive.
- NefariousMoogle
-
Reviewed documentation.
AUTHOR
CandyAngel <candyangel@electricjungle.org>
LICENSE AND COPYRIGHT
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.