// ------------------------------------------------------------------------------- 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 }
// ------------------------------------------------------------------------------- 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 }
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); }
/// <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); }