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.
$OHMD_VENDOR $OHMD_PRODUCT $OHMD_PATH
$OHMD_S_OK $OHMD_S_UNKNOWN_ERROR $OHMD_S_INVALID_PARAMETER $OHMD_S_USER_RESERVED
$OHMD_SCREEN_HORIZONTAL_RESOLUTION $OHMD_SCREEN_VERTICAL_RESOLUTION
$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's website.
Official IRC channel for OpenHMD
OpenHMD depends on the following modules.
Exportable, read-only constants.
Exporting constants and functions.
Access to C functions.
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.
Reviewed documentation as someone relatively inexperienced with Perl.
CandyAngel ([email protected])
Copyright (c) 2015 CandyAngel ([email protected]). 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.