# OpenHMD
This project aims to provide a Free and Open Source API and drivers for immersive technology, such as head mounted displays with built in head tracking.

## License
OpenHMD is released under the permissive Boost Software License (see LICENSE for more information), to make sure it can be linked and distributed with both free and non-free software. While it doesn't require contribution from the users, it is still very appreciated.

## Supported Devices
  * Oculus Rift DK1 and DK2 (rotation only)
  * Android based devices
  * External Sensor (passthrough for external sensors)

## Supported Platforms
  * Linux
  * Windows
  * OS X
  * Android
  * FreeBSD

## Requirements
  * Option 1: GNU Autotools (if you're building from the git repository)
  * Option 2: CMake
  * HIDAPI
    * http://www.signal11.us/oss/hidapi/
    * https://github.com/signal11/hidapi/

## Language Bindings
  * Java bindings by Joey Ferwerda and Koen Mertens
    * https://github.com/OpenHMD/OpenHMD-Java
  * .NET bindings by Jurrien Fakkeldij
    * https://github.com/jurrien-fakkeldij/OpenHMD.NET
  * Perl bindings by CandyAngel
    * https://github.com/CandyAngel/perl-openhmd
  * Python bindings by Lubosz Sarnecki
    * https://github.com/lubosz/python-rift
  
## Other FOSS HMD Drivers
  * libvr - http://hg.sitedethib.com/libvr

## Compiling and Installing
Using make:

    ./autogen.sh # (if you're building from the git repository)
    ./configure [--enable-openglexample]
    make
    sudo make install

Using CMake:

With CMake, you can enable and disable drivers to compile OpenHMD with.
Current Available drivers are: OPENHMD_DRIVER_OCULUS_RIFT, OPENHMD_DRIVER_EXTERNAL and OPENHMD_DRIVER_ANDROID.
These can be enabled or disabled adding -DDRIVER_OF_CHOICE=ON after the cmake command (or using cmake-gui).

    cmake .
    make

### Configuring udev on Linux
To avoid having to run your applications as root to access USB devices you have to add a udev rule (this will be included in .deb packages, etc).

as root, run:

    echo 'SUBSYSTEM=="usb", ATTR{idVendor}=="2833", MODE="0666", GROUP="plugdev"' > /etc/udev/rules.d/83-hmd.rules
    udevadm control --reload-rules

After this you have to unplug your Rift and plug it back in. You should now be able to access the Oculus Rift as a normal user.


### Cross compiling for windows using mingw
Using Make:

    export PREFIX=/usr/i686-w64-mingw32/ (or whatever your mingw path is)
    PKG_CONFIG_LIBDIR=$PREFIX/lib/pkgconfig ./configure --build=`gcc -dumpmachine` --host=i686-w64-mingw32 --prefix=$PREFIX
    make
the library will end up in the .lib directory, you can use microsoft's lib.exe to make a .lib file for it

Using CMake:

For MinGW cross compiling, toolchain files tend to be the best solution.
Please check the CMake documentation on how to do this.
A starting point might be the CMake wiki: http://www.vtk.org/Wiki/CmakeMingw

### Static linking on windows
If you're linking statically with OpenHMD using windows/mingw you have to make sure the macro OHMD_STATIC is set before including openhmd.h. In GCC this can be done by adding the compiler flag -DOHMD_STATIC, and with msvc it can be done using /DOHMD_STATIC.

Note that this is *only* if you're linking statically! If you're using the DLL then you *must not* define OHMD_STATIC. (If you're not sure then you're probably linking dynamically and won't have to worry about this).

## Pre-built packages
Will be available soon.

## Using OpenHMD
See the examples/ subdirectory for usage examples. The OpenGL example is not built by default, to build it use the --enable-openglexample option for the configure script. It requires SDL, glew and OpenGL.

An API reference can be generated using doxygen and is also available here: http://openhmd.net/doxygen/0.1.0/openhmd_8h.html


