= Virtual Reality
:author: 
:revnumber: 
:revdate: 2016/10/23 11:22
:relfileprefix: ../
:imagesdir: ..
ifdef::env-github,env-browser[:outfilesuffix: .adoc]

Please see this link:https://hub.jmonkeyengine.org/t/official-vr-module/37830/67[forum post] for additional information on JME Official VR module.

jMonkeyEngine 3 has a wide range of support for Virtual Reality (VR). The known supported systems are:

HTC Vive and systems supporting SteamVR/OpenVR

Native Oculus Rift support (and through SteamVR)

Razer HDK and systems supporting OSVR

Google Cardboard / GoogleVR

Two implementations exist for OpenVR. A community maintained JNA based binding and LWJGL's JNI based.

To use the JNA based bindings, put:

    settings.put(VRConstants.SETTING_VRAPI, VRConstants.SETTING_VRAPI_OPENVR_VALUE);

in your settings. To use LWJGL, instead put:

    settings.put(VRConstants.SETTING_VRAPI, VRConstants.SETTING_VRAPI_OPENVR_LWJGL_VALUE);
    
Note that the LWJGL bindings require LWJGL3 (jme3-lwjgl3) to be used.


== Sample Application

[source,java]
----
public class Main extends SimpleApplication {

    public static void main(String[] args) {
        AppSettings settings = new AppSettings(true);
        settings.put(VRConstants.SETTING_VRAPI, VRConstants.SETTING_VRAPI_OPENVR_LWJGL_VALUE);
        settings.put(VRConstants.SETTING_ENABLE_MIRROR_WINDOW, true);
       
        VREnvironment env = new VREnvironment(settings);
        env.initialize();
        
    	// Checking if the VR environment is well initialized 
    	// (access to the underlying VR system is effective, VR devices are detected).
    	if (env.isInitialized()){
            VRAppState vrAppState = new VRAppState(settings, env);
            vrAppState.setMirrorWindowSize(1024, 800);
            Main app = new Main(vrAppState);
            app.setLostFocusBehavior(LostFocusBehavior.Disabled);
            app.setSettings(settings);
            app.setShowSettings(false);
            app.start();
        }
    }
    
    public Main(AppState... appStates) {
        super(appStates);
    }

    @Override
    public void simpleInitApp() {
        Box b = new Box(1, 1, 1);
        Geometry geom = new Geometry("Box", b);

        Material mat = new Material(assetManager, "Common/MatDefs/Misc/Unshaded.j3md");
        mat.setColor("Color", ColorRGBA.Blue);
        geom.setMaterial(mat);

        rootNode.attachChild(geom);
    }

    @Override
    public void simpleUpdate(float tpf) {
        //TODO: add update code
    }

    @Override
    public void simpleRender(RenderManager rm) {
        //TODO: add render code
    }
}
----
Project source: https://github.com/neph1/VRSampleApplication


== Google Cardboard VR SDK 1.0 integration
gvr-android-jme (https://github.com/nordfalk/gvr-android-jme)


== Legacy
The following projects are not up to date, but may provide functionality not found in the other packages.
Google Cardboard up to version 0.6: https://github.com/neph1/jme-cardboard
