Search in sources :

Example 1 with OSVR

use of com.jme3.input.vr.OSVR in project jmonkeyengine by jMonkeyEngine.

the class VRViewManagerOSVR method postRender.

/**
     * Send the textures to the two eyes.
     */
public void postRender() {
    if (environment != null) {
        if (environment.isInVR()) {
            VRAPI api = environment.getVRHardware();
            if (api.getCompositor() != null) {
                // using the compositor...
                int errl = 0, errr = 0;
                if (environment.isInstanceRendering()) {
                    if (leftTextureType.handle == -1 || leftTextureType.handle != getFullTexId()) {
                        leftTextureType.handle = getFullTexId();
                        if (leftTextureType.handle != -1) {
                            leftTextureType.write();
                            if (api instanceof OSVR) {
                                osvr_renderBuffer[OSVR.EYE_LEFT].colorBufferName = leftTextureType.handle;
                                osvr_renderBuffer[OSVR.EYE_LEFT].depthStencilBufferName = dualEyeTex.getImage().getId();
                                osvr_renderBuffer[OSVR.EYE_LEFT].write();
                                registerOSVRBuffer(osvr_renderBuffer[OSVR.EYE_LEFT]);
                            }
                        }
                    } else {
                        if (api instanceof OSVR) {
                            ((OSVR) api).handleRenderBufferPresent(osvr_viewDescLeft, osvr_viewDescRight, osvr_renderBuffer[OSVR.EYE_LEFT], osvr_renderBuffer[OSVR.EYE_LEFT]);
                        }
                    }
                } else if (leftTextureType.handle == -1 || rightTextureType.handle == -1 || leftTextureType.handle != getLeftTexId() || rightTextureType.handle != getRightTexId()) {
                    leftTextureType.handle = getLeftTexId();
                    if (leftTextureType.handle != -1) {
                        logger.fine("Writing Left texture to native memory at " + leftTextureType.getPointer());
                        leftTextureType.write();
                        if (api instanceof OSVR) {
                            osvr_renderBuffer[OSVR.EYE_LEFT].colorBufferName = leftTextureType.handle;
                            if (leftEyeDepth != null)
                                osvr_renderBuffer[OSVR.EYE_LEFT].depthStencilBufferName = leftEyeDepth.getImage().getId();
                            osvr_renderBuffer[OSVR.EYE_LEFT].write();
                            registerOSVRBuffer(osvr_renderBuffer[OSVR.EYE_LEFT]);
                        }
                    }
                    rightTextureType.handle = getRightTexId();
                    if (rightTextureType.handle != -1) {
                        logger.fine("Writing Right texture to native memory at " + leftTextureType.getPointer());
                        rightTextureType.write();
                        if (api instanceof OSVR) {
                            osvr_renderBuffer[OSVR.EYE_RIGHT].colorBufferName = rightTextureType.handle;
                            if (rightEyeDepth != null)
                                osvr_renderBuffer[OSVR.EYE_RIGHT].depthStencilBufferName = rightEyeDepth.getImage().getId();
                            osvr_renderBuffer[OSVR.EYE_RIGHT].write();
                            registerOSVRBuffer(osvr_renderBuffer[OSVR.EYE_RIGHT]);
                        }
                    }
                } else {
                    if (api instanceof OSVR) {
                        ((OSVR) api).handleRenderBufferPresent(osvr_viewDescFull, osvr_viewDescFull, osvr_renderBuffer[OSVR.EYE_LEFT], osvr_renderBuffer[OSVR.EYE_RIGHT]);
                    }
                }
                if (errl != 0) {
                    logger.severe("Submit to left compositor error: " + OpenVRUtil.getEVRCompositorErrorString(errl) + " (" + Integer.toString(errl) + ")");
                    logger.severe("  Texture color space: " + OpenVRUtil.getEColorSpaceString(leftTextureType.eColorSpace));
                    logger.severe("  Texture type: " + OpenVRUtil.getETextureTypeString(leftTextureType.eType));
                    logger.severe("  Texture handle: " + leftTextureType.handle);
                    logger.severe("  Left eye texture " + leftEyeTexture.getName() + " (" + leftEyeTexture.getImage().getId() + ")");
                    logger.severe("                 Type: " + leftEyeTexture.getType());
                    logger.severe("                 Size: " + leftEyeTexture.getImage().getWidth() + "x" + leftEyeTexture.getImage().getHeight());
                    logger.severe("          Image depth: " + leftEyeTexture.getImage().getDepth());
                    logger.severe("         Image format: " + leftEyeTexture.getImage().getFormat());
                    logger.severe("    Image color space: " + leftEyeTexture.getImage().getColorSpace());
                }
                if (errr != 0) {
                    logger.severe("Submit to right compositor error: " + OpenVRUtil.getEVRCompositorErrorString(errl) + " (" + Integer.toString(errl) + ")");
                    logger.severe("  Texture color space: " + OpenVRUtil.getEColorSpaceString(rightTextureType.eColorSpace));
                    logger.severe("  Texture type: " + OpenVRUtil.getETextureTypeString(rightTextureType.eType));
                    logger.severe("  Texture handle: " + rightTextureType.handle);
                    logger.severe("  Right eye texture " + rightEyeTexture.getName() + " (" + rightEyeTexture.getImage().getId() + ")");
                    logger.severe("                 Type: " + rightEyeTexture.getType());
                    logger.severe("                 Size: " + rightEyeTexture.getImage().getWidth() + "x" + rightEyeTexture.getImage().getHeight());
                    logger.severe("          Image depth: " + rightEyeTexture.getImage().getDepth());
                    logger.severe("         Image format: " + rightEyeTexture.getImage().getFormat());
                    logger.severe("    Image color space: " + rightEyeTexture.getImage().getColorSpace());
                }
            }
        }
    } else {
        throw new IllegalStateException("This VR view manager is not attached to any VR environment.");
    }
}
Also used : OSVR(com.jme3.input.vr.OSVR) VRAPI(com.jme3.input.vr.VRAPI)

Example 2 with OSVR

use of com.jme3.input.vr.OSVR in project jmonkeyengine by jMonkeyEngine.

the class VRViewManagerOSVR method initTextureSubmitStructs.

/**
     * Initialize the system binds of the textures.
     */
private void initTextureSubmitStructs() {
    leftTextureType = new Texture_t();
    rightTextureType = new Texture_t();
    // must be OSVR
    osvr_renderBuffer = new OSVR_RenderBufferOpenGL.ByValue[2];
    osvr_renderBuffer[OSVR.EYE_LEFT] = new OSVR_RenderBufferOpenGL.ByValue();
    osvr_renderBuffer[OSVR.EYE_RIGHT] = new OSVR_RenderBufferOpenGL.ByValue();
    osvr_renderBuffer[OSVR.EYE_LEFT].setAutoSynch(false);
    osvr_renderBuffer[OSVR.EYE_RIGHT].setAutoSynch(false);
    osvr_viewDescFull = new OSVR_ViewportDescription.ByValue();
    osvr_viewDescFull.setAutoSynch(false);
    osvr_viewDescFull.left = osvr_viewDescFull.lower = 0.0;
    osvr_viewDescFull.width = osvr_viewDescFull.height = 1.0;
    osvr_viewDescLeft = new OSVR_ViewportDescription.ByValue();
    osvr_viewDescLeft.setAutoSynch(false);
    osvr_viewDescLeft.left = osvr_viewDescLeft.lower = 0.0;
    osvr_viewDescLeft.width = 0.5;
    osvr_viewDescLeft.height = 1.0;
    osvr_viewDescRight = new OSVR_ViewportDescription.ByValue();
    osvr_viewDescRight.setAutoSynch(false);
    osvr_viewDescRight.left = 0.5;
    osvr_viewDescRight.lower = 0.0;
    osvr_viewDescRight.width = 0.5;
    osvr_viewDescRight.height = 1.0;
    osvr_viewDescRight.write();
    osvr_viewDescLeft.write();
    osvr_viewDescFull.write();
    osvr_renderBuffer[OSVR.EYE_LEFT].depthStencilBufferName = -1;
    osvr_renderBuffer[OSVR.EYE_LEFT].colorBufferName = -1;
    osvr_renderBuffer[OSVR.EYE_RIGHT].depthStencilBufferName = -1;
    osvr_renderBuffer[OSVR.EYE_RIGHT].colorBufferName = -1;
}
Also used : OSVR_RenderBufferOpenGL(com.jme3.system.osvr.osvrrendermanageropengl.OSVR_RenderBufferOpenGL) OSVR_ViewportDescription(com.jme3.system.osvr.osvrrendermanageropengl.OSVR_ViewportDescription) Texture_t(com.jme3.system.jopenvr.Texture_t)

Example 3 with OSVR

use of com.jme3.input.vr.OSVR in project jmonkeyengine by jMonkeyEngine.

the class VRViewManagerOSVR method initialize.

/**
     * Initialize the VR view manager.
     */
public void initialize() {
    logger.config("Initializing VR view manager.");
    if (environment != null) {
        initTextureSubmitStructs();
        setupCamerasAndViews();
        setupVRScene();
        moveScreenProcessingToEyes();
        if (environment.hasTraditionalGUIOverlay()) {
            environment.getVRMouseManager().initialize();
            // update the pose to position the gui correctly on start
            update(0f);
            environment.getVRGUIManager().positionGui();
        }
        if (environment.getApplication() != null) {
            // if we are OSVR, our primary mirror window needs to be the same size as the render manager's output...
            if (environment.getVRHardware() instanceof OSVR) {
                int origWidth = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice().getDisplayMode().getWidth();
                int origHeight = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice().getDisplayMode().getHeight();
                long window = ((LwjglWindow) environment.getApplication().getContext()).getWindowHandle();
                Vector2f windowSize = new Vector2f();
                ((OSVR) environment.getVRHardware()).getRenderSize(windowSize);
                windowSize.x = Math.max(windowSize.x * 2f, leftCamera.getWidth());
                org.lwjgl.glfw.GLFW.glfwSetWindowSize(window, (int) windowSize.x, (int) windowSize.y);
                environment.getApplication().getContext().getSettings().setResolution((int) windowSize.x, (int) windowSize.y);
                if (environment.getApplication().getRenderManager() != null) {
                    environment.getApplication().getRenderManager().notifyReshape((int) windowSize.x, (int) windowSize.y);
                }
                org.lwjgl.glfw.GLFW.glfwSetWindowPos(window, origWidth - (int) windowSize.x, 32);
                org.lwjgl.glfw.GLFW.glfwFocusWindow(window);
                org.lwjgl.glfw.GLFW.glfwSetCursorPos(window, origWidth / 2.0, origHeight / 2.0);
                logger.config("Initialized VR view manager [SUCCESS]");
            } else {
                throw new IllegalStateException("Underlying VR hardware should be " + OSVR.class.getSimpleName());
            }
        } else {
            throw new IllegalStateException("This VR environment is not attached to any application.");
        }
    } else {
        throw new IllegalStateException("This VR view manager is not attached to any VR environment.");
    }
}
Also used : OSVR(com.jme3.input.vr.OSVR) Vector2f(com.jme3.math.Vector2f) LwjglWindow(com.jme3.system.lwjgl.LwjglWindow)

Example 4 with OSVR

use of com.jme3.input.vr.OSVR in project jmonkeyengine by jMonkeyEngine.

the class OSVR method initVRCompositor.

@Override
public boolean initVRCompositor(boolean allowed) {
    if (!allowed || renderManager != null)
        return false;
    grabGLFWContext();
    graphicsLibrary = new com.jme3.system.osvr.osvrrendermanageropengl.OSVR_GraphicsLibraryOpenGL.ByValue();
    graphicsLibrary.toolkit = null;
    graphicsLibrary.setAutoSynch(false);
    grabRM = new PointerByReference();
    grabRMOGL = new PointerByReference();
    byte retval = OsvrRenderManagerOpenGLLibrary.osvrCreateRenderManagerOpenGL(context, OpenGLString, graphicsLibrary, grabRM, grabRMOGL);
    if (retval == 0) {
        renderManager = grabRM.getValue();
        renderManagerOpenGL = grabRMOGL.getValue();
        if (renderManager == null || renderManagerOpenGL == null) {
            System.out.println("Render Manager Created NULL, error!");
            return false;
        }
        openResults.setAutoSynch(false);
        retval = OsvrRenderManagerOpenGLLibrary.osvrRenderManagerOpenDisplayOpenGL(renderManager, openResults);
        if (retval == 0) {
            wglRM = org.lwjgl.opengl.WGL.wglGetCurrentContext();
            renderManagerContext = org.lwjgl.glfw.GLFW.glfwGetCurrentContext();
            shareContext();
            OsvrClientKitLibrary.osvrClientUpdate(context);
            renderParams = new OSVR_RenderParams.ByValue();
            renderParams.setAutoSynch(false);
            OsvrRenderManagerOpenGLLibrary.osvrRenderManagerGetDefaultRenderParams(renderParams);
            grabRIC = new PointerByReference();
            retval = OsvrRenderManagerOpenGLLibrary.osvrRenderManagerGetRenderInfoCollection(renderManager, renderParams, grabRIC);
            if (retval == 0) {
                renderInfoCollection = grabRIC.getValue();
                OsvrRenderManagerOpenGLLibrary.osvrRenderManagerGetNumRenderInfoInCollection(renderInfoCollection, grabNumInfo);
                numRenderInfo = grabNumInfo.getValue();
                eyeLeftInfo = new OSVR_RenderInfoOpenGL.ByValue();
                eyeRightInfo = new OSVR_RenderInfoOpenGL.ByValue();
                eyeLeftInfo.setAutoSynch(false);
                eyeRightInfo.setAutoSynch(false);
                return true;
            }
            OsvrRenderManagerOpenGLLibrary.osvrDestroyRenderManager(renderManager);
            System.out.println("OSVR Render Manager Info Collection Error: " + retval);
            return false;
        }
        OsvrRenderManagerOpenGLLibrary.osvrDestroyRenderManager(renderManager);
        System.out.println("OSVR Open Render Manager Display Error: " + retval);
        return false;
    }
    System.out.println("OSVR Create Render Manager Error: " + retval);
    return false;
}
Also used : OSVR_RenderParams(com.jme3.system.osvr.osvrrendermanageropengl.OSVR_RenderParams) PointerByReference(com.sun.jna.ptr.PointerByReference) OSVR_RenderInfoOpenGL(com.jme3.system.osvr.osvrrendermanageropengl.OSVR_RenderInfoOpenGL)

Example 5 with OSVR

use of com.jme3.input.vr.OSVR in project jmonkeyengine by jMonkeyEngine.

the class VRViewManagerOSVR method setupCamerasAndViews.

private void setupCamerasAndViews() {
    if (environment != null) {
        if (environment.getApplication() != null) {
            // get desired frustrum from original camera
            Camera origCam = environment.getCamera();
            float fFar = origCam.getFrustumFar();
            float fNear = origCam.getFrustumNear();
            // if we are using OSVR get the eye info here
            if (environment.getVRHardware() instanceof OSVR) {
                ((OSVR) environment.getVRHardware()).getEyeInfo();
            }
            // restore frustrum on distortion scene cam, if needed
            if (environment.isInstanceRendering()) {
                leftCamera = origCam;
            } else if (environment.compositorAllowed() == false) {
                origCam.setFrustumFar(100f);
                origCam.setFrustumNear(1f);
                leftCamera = origCam.clone();
                prepareCameraSize(origCam, 2f);
            } else {
                leftCamera = origCam.clone();
            }
            leftCamera.setFrustumPerspective(environment.getDefaultFOV(), environment.getDefaultAspect(), fNear, fFar);
            prepareCameraSize(leftCamera, 1f);
            if (environment.getVRHardware() != null)
                leftCamera.setProjectionMatrix(environment.getVRHardware().getHMDMatrixProjectionLeftEye(leftCamera));
            if (!environment.isInstanceRendering()) {
                leftViewport = setupViewBuffers(leftCamera, LEFT_VIEW_NAME);
                rightCamera = leftCamera.clone();
                if (environment.getVRHardware() != null) {
                    rightCamera.setProjectionMatrix(environment.getVRHardware().getHMDMatrixProjectionRightEye(rightCamera));
                }
                rightViewport = setupViewBuffers(rightCamera, RIGHT_VIEW_NAME);
            } else {
                System.err.println("[VRViewManager] THIS CODE NEED CHANGES !!!");
                leftViewport = environment.getApplication().getViewPort();
                //leftViewport.attachScene(app.getRootNode());
                rightCamera = leftCamera.clone();
                if (environment.getVRHardware() != null) {
                    rightCamera.setProjectionMatrix(environment.getVRHardware().getHMDMatrixProjectionRightEye(rightCamera));
                }
                org.lwjgl.opengl.GL11.glEnable(org.lwjgl.opengl.GL30.GL_CLIP_DISTANCE0);
                //FIXME: [jme-vr] Fix with JMonkey next release
                //RenderManager._VRInstancing_RightCamProjection = camRight.getViewProjectionMatrix();
                setupFinalFullTexture(environment.getApplication().getViewPort().getCamera());
            }
            // setup gui
            environment.getVRGUIManager().setupGui(leftCamera, rightCamera, leftViewport, rightViewport);
            if (environment.getVRHardware() != null) {
                // call these to cache the results internally
                environment.getVRHardware().getHMDMatrixPoseLeftEye();
                environment.getVRHardware().getHMDMatrixPoseRightEye();
            }
        } else {
            throw new IllegalStateException("This VR environment is not attached to any application.");
        }
    } else {
        throw new IllegalStateException("This VR view manager is not attached to any VR environment.");
    }
}
Also used : OSVR(com.jme3.input.vr.OSVR) Camera(com.jme3.renderer.Camera)

Aggregations

OSVR (com.jme3.input.vr.OSVR)5 PointerByReference (com.sun.jna.ptr.PointerByReference)2 OpenVR (com.jme3.input.vr.OpenVR)1 VRAPI (com.jme3.input.vr.VRAPI)1 Vector2f (com.jme3.math.Vector2f)1 Camera (com.jme3.renderer.Camera)1 CullHint (com.jme3.scene.Spatial.CullHint)1 AppSettings (com.jme3.system.AppSettings)1 Texture_t (com.jme3.system.jopenvr.Texture_t)1 LwjglWindow (com.jme3.system.lwjgl.LwjglWindow)1 OSVR_AnalogReport (com.jme3.system.osvr.osvrclientreporttypes.OSVR_AnalogReport)1 OSVR_ButtonReport (com.jme3.system.osvr.osvrclientreporttypes.OSVR_ButtonReport)1 OSVR_Pose3 (com.jme3.system.osvr.osvrclientreporttypes.OSVR_Pose3)1 OSVR_DisplayConfig (com.jme3.system.osvr.osvrdisplay.OsvrDisplayLibrary.OSVR_DisplayConfig)1 OSVR_RenderBufferOpenGL (com.jme3.system.osvr.osvrrendermanageropengl.OSVR_RenderBufferOpenGL)1 OSVR_RenderInfoOpenGL (com.jme3.system.osvr.osvrrendermanageropengl.OSVR_RenderInfoOpenGL)1 OSVR_RenderParams (com.jme3.system.osvr.osvrrendermanageropengl.OSVR_RenderParams)1 OSVR_ViewportDescription (com.jme3.system.osvr.osvrrendermanageropengl.OSVR_ViewportDescription)1 VRViewManagerOSVR (com.jme3.util.VRViewManagerOSVR)1 VRViewManagerOpenVR (com.jme3.util.VRViewManagerOpenVR)1