Search in sources :

Example 6 with OpenVR

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

the class OpenVRFilter method configureDistortionMesh.

/*
        function converted from:
        https://github.com/ValveSoftware/openvr/blob/master/samples/hellovr_opengl/hellovr_opengl_main.cpp#L1335
    */
private void configureDistortionMesh() {
    float m_iLensGridSegmentCountH = 43, m_iLensGridSegmentCountV = 43;
    float w = 1f / m_iLensGridSegmentCountH - 1f;
    float h = 1f / m_iLensGridSegmentCountV - 1f;
    float u, v;
    distortionMesh = new Mesh();
    float[] verts = new float[(int) (m_iLensGridSegmentCountV * m_iLensGridSegmentCountH) * 3];
    float[] texcoordR = new float[(int) (m_iLensGridSegmentCountV * m_iLensGridSegmentCountH) * 2];
    float[] texcoordG = new float[(int) (m_iLensGridSegmentCountV * m_iLensGridSegmentCountH) * 2];
    float[] texcoordB = new float[(int) (m_iLensGridSegmentCountV * m_iLensGridSegmentCountH) * 2];
    int vertPos = 0, coordPos = 0;
    //left eye distortion verts
    float Xoffset = -1f;
    for (int y = 0; y < m_iLensGridSegmentCountV; y++) {
        for (int x = 0; x < m_iLensGridSegmentCountH; x++) {
            u = x * w;
            v = 1 - y * h;
            // x
            verts[vertPos] = Xoffset + u;
            // y
            verts[vertPos + 1] = -1 + 2 * y * h;
            // z
            verts[vertPos + 2] = 0f;
            vertPos += 3;
            DistortionCoordinates_t dc0 = new DistortionCoordinates_t();
            ((VR_IVRSystem_FnTable) application.getVRHardware().getVRSystem()).ComputeDistortion.apply(JOpenVRLibrary.EVREye.EVREye_Eye_Left, u, v, dc0);
            texcoordR[coordPos] = dc0.rfRed[0];
            texcoordR[coordPos + 1] = 1 - dc0.rfRed[1];
            texcoordG[coordPos] = dc0.rfGreen[0];
            texcoordG[coordPos + 1] = 1 - dc0.rfGreen[1];
            texcoordB[coordPos] = dc0.rfBlue[0];
            texcoordB[coordPos + 1] = 1 - dc0.rfBlue[1];
            coordPos += 2;
        }
    }
    //right eye distortion verts
    Xoffset = 0;
    for (int y = 0; y < m_iLensGridSegmentCountV; y++) {
        for (int x = 0; x < m_iLensGridSegmentCountH; x++) {
            u = x * w;
            v = 1 - y * h;
            // x
            verts[vertPos] = Xoffset + u;
            // y
            verts[vertPos + 1] = -1 + 2 * y * h;
            // z
            verts[vertPos + 2] = 0f;
            vertPos += 3;
            DistortionCoordinates_t dc0 = new DistortionCoordinates_t();
            ((VR_IVRSystem_FnTable) application.getVRHardware().getVRSystem()).ComputeDistortion.apply(JOpenVRLibrary.EVREye.EVREye_Eye_Right, u, v, dc0);
            texcoordR[coordPos] = dc0.rfRed[0];
            texcoordR[coordPos + 1] = 1 - dc0.rfRed[1];
            texcoordG[coordPos] = dc0.rfGreen[0];
            texcoordG[coordPos + 1] = 1 - dc0.rfGreen[1];
            texcoordB[coordPos] = dc0.rfBlue[0];
            texcoordB[coordPos + 1] = 1 - dc0.rfBlue[1];
            coordPos += 2;
        }
    }
    // have UV coordinates & positions, now to setup indices
    //std::vector<GLushort> vIndices;
    int[] indices = new int[(int) ((m_iLensGridSegmentCountV - 1) * (m_iLensGridSegmentCountH - 1)) * 6];
    int indexPos = 0;
    int a, b, c, d;
    int offset = 0;
    for (int y = 0; y < m_iLensGridSegmentCountV - 1; y++) {
        for (int x = 0; x < m_iLensGridSegmentCountH - 1; x++) {
            a = (int) (m_iLensGridSegmentCountH * y + x + offset);
            b = (int) (m_iLensGridSegmentCountH * y + x + 1 + offset);
            c = (int) ((y + 1) * m_iLensGridSegmentCountH + x + 1 + offset);
            d = (int) ((y + 1) * m_iLensGridSegmentCountH + x + offset);
            indices[indexPos] = a;
            indices[indexPos + 1] = b;
            indices[indexPos + 2] = c;
            indices[indexPos + 3] = a;
            indices[indexPos + 4] = c;
            indices[indexPos + 5] = d;
            indexPos += 6;
        }
    }
    offset = (int) (m_iLensGridSegmentCountH * m_iLensGridSegmentCountV);
    for (int y = 0; y < m_iLensGridSegmentCountV - 1; y++) {
        for (int x = 0; x < m_iLensGridSegmentCountH - 1; x++) {
            a = (int) (m_iLensGridSegmentCountH * y + x + offset);
            b = (int) (m_iLensGridSegmentCountH * y + x + 1 + offset);
            c = (int) ((y + 1) * m_iLensGridSegmentCountH + x + 1 + offset);
            d = (int) ((y + 1) * m_iLensGridSegmentCountH + x + offset);
            indices[indexPos] = a;
            indices[indexPos + 1] = b;
            indices[indexPos + 2] = c;
            indices[indexPos + 3] = a;
            indices[indexPos + 4] = c;
            indices[indexPos + 5] = d;
            indexPos += 6;
        }
    }
    // OK, create the mesh        
    distortionMesh.setBuffer(VertexBuffer.Type.Position, 3, verts);
    distortionMesh.setBuffer(VertexBuffer.Type.Index, 1, indices);
    distortionMesh.setBuffer(VertexBuffer.Type.TexCoord, 2, texcoordR);
    // TODO: are TexCoord2 & TexCoord3 even implemented in jME3?
    distortionMesh.setBuffer(VertexBuffer.Type.TexCoord2, 2, texcoordG);
    distortionMesh.setBuffer(VertexBuffer.Type.TexCoord3, 2, texcoordB);
// TODO: make sure this distortion mesh is used instead of the fullscreen quad
// when filter gets rendered.. might require changes to jME3 core..?
}
Also used : DistortionCoordinates_t(com.jme3.system.jopenvr.DistortionCoordinates_t) Mesh(com.jme3.scene.Mesh)

Example 7 with OpenVR

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

the class VRViewManagerOpenVR method postRender.

@Override
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();
                        }
                    } else {
                        if (api instanceof OpenVR) {
                            int submitFlag = JOpenVRLibrary.EVRSubmitFlags.EVRSubmitFlags_Submit_Default;
                            errr = ((OpenVR) api).getCompositor().Submit.apply(JOpenVRLibrary.EVREye.EVREye_Eye_Right, leftTextureType, rightTextureBounds, submitFlag);
                            errl = ((OpenVR) api).getCompositor().Submit.apply(JOpenVRLibrary.EVREye.EVREye_Eye_Left, leftTextureType, leftTextureBounds, submitFlag);
                        }
                    }
                } 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();
                    }
                    rightTextureType.handle = getRightTexId();
                    if (rightTextureType.handle != -1) {
                        logger.fine("Writing Right texture to native memory at " + leftTextureType.getPointer());
                        rightTextureType.write();
                    }
                } else {
                    if (api instanceof OpenVR) {
                        errl = ((OpenVR) api).getCompositor().Submit.apply(JOpenVRLibrary.EVREye.EVREye_Eye_Left, leftTextureType, null, JOpenVRLibrary.EVRSubmitFlags.EVRSubmitFlags_Submit_Default);
                        errr = ((OpenVR) api).getCompositor().Submit.apply(JOpenVRLibrary.EVREye.EVREye_Eye_Right, rightTextureType, null, JOpenVRLibrary.EVRSubmitFlags.EVRSubmitFlags_Submit_Default);
                    } else {
                    }
                }
                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 : VRAPI(com.jme3.input.vr.VRAPI) OpenVR(com.jme3.input.vr.OpenVR)

Aggregations

OpenVR (com.jme3.input.vr.OpenVR)3 IntByReference (com.sun.jna.ptr.IntByReference)2 OSVR (com.jme3.input.vr.OSVR)1 VRAPI (com.jme3.input.vr.VRAPI)1 Matrix4f (com.jme3.math.Matrix4f)1 Quaternion (com.jme3.math.Quaternion)1 Vector2f (com.jme3.math.Vector2f)1 Vector3f (com.jme3.math.Vector3f)1 Mesh (com.jme3.scene.Mesh)1 DistortionCoordinates_t (com.jme3.system.jopenvr.DistortionCoordinates_t)1 Texture_t (com.jme3.system.jopenvr.Texture_t)1 TrackedDevicePose_t (com.jme3.system.jopenvr.TrackedDevicePose_t)1 VRControllerState_t (com.jme3.system.jopenvr.VRControllerState_t)1 VRTextureBounds_t (com.jme3.system.jopenvr.VRTextureBounds_t)1 VR_IVRCompositor_FnTable (com.jme3.system.jopenvr.VR_IVRCompositor_FnTable)1 VR_IVRSystem_FnTable (com.jme3.system.jopenvr.VR_IVRSystem_FnTable)1 VRViewManagerOSVR (com.jme3.util.VRViewManagerOSVR)1 VRViewManagerOpenVR (com.jme3.util.VRViewManagerOpenVR)1 FloatByReference (com.sun.jna.ptr.FloatByReference)1 LongByReference (com.sun.jna.ptr.LongByReference)1