Example #1
0
    // -------------------------------------------------------------------------------

    public void SetMirror(ref xmgVideoCaptureParameters videoParameters)
    {
        GetComponent <Renderer>().material.SetInt("_Mirror", videoParameters.UseFrontal ? 1 : 0);

#if (!UNITY_EDITOR && UNITY_IOS)
        GetComponent <Renderer>().material.SetInt("_Rotation",
                                                  (int)xmgTools.GetVideoOrientation(videoParameters.useNativeCapture, videoParameters.UseFrontal));
#endif
    }
Example #2
0
    // -------------------------------------------------------------------------------

    public void CreateVideoCapturePlane(
        float screenScaleFactor,
        xmgVideoCaptureParameters videoParameters)
    {
        m_captureWidth  = videoParameters.GetVideoCaptureWidth();
        m_captureHeight = videoParameters.GetVideoCaptureHeight();

        Debug.Log("CreateVideoCapturePlane - Capture " + m_captureWidth + " " + m_captureHeight);

        // Create the mesh (plane)
        Mesh mesh = createPlanarMesh();

        // Attach it to the current GO
        gameObject.AddComponent <MeshFilter>().mesh = mesh;
        gameObject.transform.rotation   = Quaternion.Euler(0.0f, 0.0f, 0.0f);
        gameObject.transform.localScale = new Vector3(1.0f, 1.0f, 1.0f);
        gameObject.transform.position   = new Vector3(0.0f, 0.0f, 1.0f);

        // Assign video texture to the renderer
        if (!gameObject.GetComponent <Renderer>())
        {
            gameObject.AddComponent <MeshRenderer>();
        }

        GetComponent <Renderer>().material = new Material(Shader.Find("Custom/VideoShader"));

        m_data         = new Color32[m_captureWidth * m_captureHeight];
        m_PixelsHandle = GCHandle.Alloc(m_data, GCHandleType.Pinned);
        l_texture      = new Texture2D(m_captureWidth, m_captureHeight, TextureFormat.RGBA32, false);
        GetComponent <Renderer>().material.SetTexture("_MainTex", l_texture);

        // shader parameters
        GetComponent <Renderer>().material.SetInt("_Rotation",
                                                  (int)xmgTools.GetVideoOrientation(videoParameters.useNativeCapture, videoParameters.UseFrontal));
        GetComponent <Renderer>().material.SetFloat("_ScaleX",
                                                    (float)GetScaleX(videoParameters) * screenScaleFactor);
        GetComponent <Renderer>().material.SetFloat("_ScaleY",
                                                    (float)GetScaleY(videoParameters) * screenScaleFactor);
        GetComponent <Renderer>().material.SetInt("_Mirror",
                                                  (int)(videoParameters.MirrorVideo == true ? 1 : 0));
        GetComponent <Renderer>().material.SetInt("_VerticalMirror",
                                                  (int)((videoParameters.GetVerticalMirror() == true) ? 1 : 0));
#if (!UNITY_EDITOR && UNITY_IOS)
        // Native images on iOS are BGRA
        GetComponent <Renderer>().material.SetInt("_InvertTextureChannels", 1);
#endif
    }
Example #3
0
    static public float GetScaleX(xmgVideoCaptureParameters videoParameters)
    {
        int CaptureWidth  = videoParameters.GetVideoCaptureWidth();
        int CaptureHeight = videoParameters.GetVideoCaptureHeight();

        float arVideo  = (float)CaptureWidth / (float)CaptureHeight;
        float arScreen = (float)Screen.width / (float)Screen.height;

#if ((UNITY_ANDROID || UNITY_IOS) && !UNITY_EDITOR && !UNITY_STANDALONE)
        if (Screen.orientation == ScreenOrientation.Portrait || Screen.orientation == ScreenOrientation.PortraitUpsideDown)
        {
            arScreen = (float)Screen.height / (float)Screen.width;
        }
#endif
        if (Math.Abs(arVideo - arScreen) > 0.001f &&
            videoParameters.videoPlaneFittingMode == xmgVideoPlaneFittingMode.FitScreenVertically)
        {
            return(arVideo / arScreen);
        }
        return(1.0f);
    }
Example #4
0
    /// <summary>
    /// Opens Unity video capture
    /// </summary>
    public WebCamTexture OpenVideoCapture(ref xmgVideoCaptureParameters videoParameters)
    {
        m_captureWidth  = videoParameters.GetVideoCaptureWidth();
        m_captureHeight = videoParameters.GetVideoCaptureHeight();

        // Reset
        Camera.main.clearFlags            = CameraClearFlags.Skybox;
        Camera.main.transform.position    = new Vector3(0, 0, 0);
        Camera.main.transform.eulerAngles = new Vector3(0, 0, 0);
        transform.localPosition           = new Vector3(0.0f, 0.0f, 0.0f);

        Debug.Log("webcam names:");
        for (int cameraIndex = 0; cameraIndex < WebCamTexture.devices.Length; cameraIndex++)
        {
            Debug.Log(WebCamTexture.devices[cameraIndex].name);
        }

        if (videoParameters.videoCaptureIndex == -1)
        {
            for (int cameraIndex = 0; cameraIndex < WebCamTexture.devices.Length; cameraIndex++)
            {
                // We want the back camera
                if (!WebCamTexture.devices[cameraIndex].isFrontFacing && !videoParameters.UseFrontal)
                {
                    deviceName      = WebCamTexture.devices[cameraIndex].name;
                    m_webcamTexture = new WebCamTexture(deviceName, m_captureWidth, m_captureHeight, 30);
                    break;
                }
                else if (WebCamTexture.devices[cameraIndex].isFrontFacing && videoParameters.UseFrontal)
                {
                    deviceName      = WebCamTexture.devices[cameraIndex].name;
                    m_webcamTexture = new WebCamTexture(deviceName, m_captureWidth, m_captureHeight, 30);
                    break;
                }
            }
        }
        else
        {
            deviceName = WebCamTexture.devices[videoParameters.videoCaptureIndex].name;
            // deviceName = "device #0";
            m_webcamTexture = new WebCamTexture(deviceName, m_captureWidth, m_captureHeight, 30);
        }
        if (!m_webcamTexture)   // try with the first idx
        {
            if (!videoParameters.UseFrontal || WebCamTexture.devices.Length == 1)
            {
                deviceName = WebCamTexture.devices[0].name;
            }
            else
            {
                deviceName = WebCamTexture.devices[1].name;
            }
            m_webcamTexture = new WebCamTexture(deviceName, m_captureWidth, m_captureHeight, 30);
        }


        if (!m_webcamTexture)
        {
            Debug.Log("No camera detected!");
        }
        else
        {
            if (m_webcamTexture.isPlaying)
            {
                m_webcamTexture.Stop();
            }

            m_webcamTexture.Play();     // It's here where width and height is usually modified to correct image resolution


            if (m_webcamTexture.width != m_webcamTexture.requestedWidth && m_webcamTexture.requestedWidth > 100 && m_webcamTexture.width > 100)
            {
                Debug.Log("==> (W) An issue is detected with required video capture mode, changing to a more appropriate mode");
                Debug.Log("requested width x height: " + m_webcamTexture.requestedWidth + m_webcamTexture.requestedHeight);
                Debug.Log("effective width x height: " + m_webcamTexture.width + m_webcamTexture.height);
                videoParameters.videoCaptureMode = xmgVideoCaptureParameters.getVideoCaptureMode(m_webcamTexture.width, m_webcamTexture.height);
            }
        }
        return(m_webcamTexture);
    }