void OnBackgroundTextureChanged() { VuforiaRenderer.VideoTextureInfo videoTextureInfo = VuforiaRenderer.Instance.GetVideoTextureInfo(); Debug.Log("OnBackgroundTextureChanged() called with:" + "\nImage Size: " + videoTextureInfo.imageSize.x + "x" + videoTextureInfo.imageSize.y + "\nTexture Size: " + videoTextureInfo.textureSize.x + "x" + videoTextureInfo.textureSize.y); // If the video background texture is changed, reassign to the occlusion material texture m_OcclusionMaterial.mainTexture = VuforiaRenderer.Instance.VideoBackgroundTexture; }
private void UpdateVideoTexture() { if (mVideoBackgroundTexture != VuforiaRenderer.Instance.VideoBackgroundTexture) { mVideoBackgroundTexture = VuforiaRenderer.Instance.VideoBackgroundTexture; GetComponent <Renderer>().material.mainTexture = mVideoBackgroundTexture; } VuforiaRenderer.VideoTextureInfo textureInfo = VuforiaRenderer.Instance.GetVideoTextureInfo(); float ratioX = (float)textureInfo.imageSize.x / (float)textureInfo.textureSize.x; float ratioY = (float)textureInfo.imageSize.y / (float)textureInfo.textureSize.y; SetTextureRatio(ratioX, ratioY); }
void Update() { if (!m_VideoBackgroundReady) { m_VideoBGCfgData = VuforiaRenderer.Instance.GetVideoBackgroundConfig(); m_VideoTextureInfo = VuforiaRenderer.Instance.GetVideoTextureInfo(); if (m_EnableLogging) { Debug.Log( "\nBkgdInfoAvail: " + VuforiaRenderer.Instance.IsVideoBackgroundInfoAvailable() + "\nBkgdInfoSize: " + m_VideoBGCfgData.size.x + "x" + m_VideoBGCfgData.size.y + "\nImageSize: " + m_VideoTextureInfo.imageSize.x + "x" + m_VideoTextureInfo.imageSize.y + "\nTextureSize: " + m_VideoTextureInfo.textureSize.x + "x" + m_VideoTextureInfo.textureSize.y); } } if (!m_ShaderHasBeenSetup) { // Before setting up the shader, code will verify that background info is available // and that sizes in VideoBGCfgData and VideoTextureInfo are not zero. // The asynchonous init order may differ between PlayMode and Device. if (VuforiaRenderer.Instance.IsVideoBackgroundInfoAvailable() && m_VideoBGCfgData.size.x > 0 && m_VideoTextureInfo.imageSize.x > 0 && m_VideoTextureInfo.textureSize.x > 0) { m_VideoBackgroundReady = true; m_OcclusionMaterial.mainTexture = VuforiaRenderer.Instance.VideoBackgroundTexture; SetViewportParameters(); m_ShaderHasBeenSetup = true; } } }
IEnumerator Wait() { MarkerIsIN = false; yield return(new WaitForEndOfFrame()); if (VuforiaRenderer.Instance.IsVideoBackgroundInfoAvailable()) { VuforiaRenderer.VideoTextureInfo videoTextureInfo = VuforiaRenderer.Instance.GetVideoTextureInfo(); if (videoTextureInfo.imageSize.x == 0 || videoTextureInfo.imageSize.y == 0) { goto End; } float k_x = (float)videoTextureInfo.imageSize.x / (float)videoTextureInfo.textureSize.x * 0.5f; float k_y = (float)videoTextureInfo.imageSize.y / (float)videoTextureInfo.textureSize.y * 0.5f; GetComponent <Renderer> ().material.SetFloat("_KX", k_x); GetComponent <Renderer> ().material.SetFloat("_KY", k_y); VideoBackgroundTexure = VuforiaRenderer.Instance.VideoBackgroundTexture; if (!VideoBackgroundTexure || !BackgroundPlane.GetComponent <MeshFilter>()) { goto End; } GetComponent <Renderer>().material.SetTexture("_MainTex", VideoBackgroundTexure); float ImageAspect = (float)videoTextureInfo.imageSize.x / (float)videoTextureInfo.imageSize.y; if (Child_AR_Camera.aspect >= 1.0f || Application.isEditor) { if (Child_AR_Camera.aspect >= ImageAspect) { float Aspect = Child_AR_Camera.aspect / ImageAspect; AR_Camera_Vector.transform.localScale = new Vector3(1.0f, Aspect, 1.0f); #if !UNITY_EDITOR if (Screen.orientation == ScreenOrientation.LandscapeRight) { AR_Camera_Vector.transform.localScale = new Vector3(1.0f, Aspect, -1.0f); } #endif } else { float Aspect = ImageAspect / Child_AR_Camera.aspect; AR_Camera_Vector.transform.localScale = new Vector3(Aspect, 1.0f, 1.0f); #if !UNITY_EDITOR if (Screen.orientation == ScreenOrientation.LandscapeRight) { AR_Camera_Vector.transform.localScale = new Vector3(Aspect, 1.0f, -1.0f); } #endif } } if (Child_AR_Camera.aspect < 1.0f & !Application.isEditor) { if (ImageAspect >= (1.0f / Child_AR_Camera.aspect)) { AR_Camera_Vector.transform.localScale = new Vector3(ImageAspect, Child_AR_Camera.aspect, 1.0f); #if !UNITY_EDITOR if (Screen.orientation == ScreenOrientation.PortraitUpsideDown) { AR_Camera_Vector.transform.localScale = new Vector3(ImageAspect, Child_AR_Camera.aspect, -1.0f); } #endif } else { AR_Camera_Vector.transform.localScale = new Vector3(1.0f / Child_AR_Camera.aspect, 1.0f / ImageAspect, 1.0f); #if !UNITY_EDITOR if (Screen.orientation == ScreenOrientation.PortraitUpsideDown) { AR_Camera_Vector.transform.localScale = new Vector3(1.0f / Child_AR_Camera.aspect, 1.0f / ImageAspect, -1.0f); } #endif } AR_Camera_Vector.transform.localEulerAngles = new Vector3(0.0f, 180.0f, 270.0f); } End: if (videoTextureInfo.imageSize.x == 0 || videoTextureInfo.imageSize.y == 0 || !VideoBackgroundTexure || !BackgroundPlane.GetComponent <MeshFilter>()) { StartCoroutine(Wait()); } } else { yield return(new WaitForEndOfFrame()); StartCoroutine(Wait()); } }
void SetViewportParameters() { VuforiaRenderer.VideoTextureInfo textureInfo = VuforiaRenderer.Instance.GetVideoTextureInfo(); m_TexureRatio.x = (float)textureInfo.imageSize.x / (float)textureInfo.textureSize.x; m_TexureRatio.y = (float)textureInfo.imageSize.y / (float)textureInfo.textureSize.y; // update viewport size Rect viewport = VuforiaARController.Instance.GetVideoBackgroundRectInViewPort(); m_ViewportOrig.x = viewport.xMin; m_ViewportOrig.y = viewport.yMin; m_ViewportSize.x = viewport.xMax - viewport.xMin; m_ViewportSize.y = viewport.yMax - viewport.yMin; bool isMirrored = VuforiaARController.Instance.VideoBackGroundMirrored == VuforiaRenderer.VideoBackgroundReflection.ON; bool isPortrait = (VuforiaRuntimeUtilities.ScreenOrientation == ScreenOrientation.Portrait || VuforiaRuntimeUtilities.ScreenOrientation == ScreenOrientation.PortraitUpsideDown); Shader.DisableKeyword(isPortrait ? "PORTRAIT_OFF" : "PORTRAIT_ON"); Shader.EnableKeyword(isPortrait ? "PORTRAIT_ON" : "PORTRAIT_OFF"); // determine for which orientation the shaders should be set up: switch (VuforiaRuntimeUtilities.ScreenOrientation) { case ScreenOrientation.Portrait: m_Prefix.x = isMirrored ? 0.0f : 1.0f; m_Prefix.y = 1.0f; m_InversionMultiplier.x = isMirrored ? 1.0f : -1.0f; m_InversionMultiplier.y = -1.0f; break; case ScreenOrientation.PortraitUpsideDown: m_Prefix.x = isMirrored ? 1.0f : 0.0f; m_Prefix.y = 0.0f; m_InversionMultiplier.x = isMirrored ? -1.0f : 1.0f; m_InversionMultiplier.y = 1.0f; break; case ScreenOrientation.LandscapeLeft: m_Prefix.x = isMirrored ? 1.0f : 0.0f; m_Prefix.y = 1.0f; m_InversionMultiplier.x = isMirrored ? -1.0f : 1.0f; m_InversionMultiplier.y = -1.0f; break; case ScreenOrientation.LandscapeRight: m_Prefix.x = isMirrored ? 0.0f : 1.0f; m_Prefix.y = 0.0f; m_InversionMultiplier.x = isMirrored ? 1.0f : -1.0f; m_InversionMultiplier.y = 1.0f; break; } // Pass the updated values to the shader m_OcclusionMaterial.SetFloat("_TextureRatioX", m_TexureRatio.x); m_OcclusionMaterial.SetFloat("_TextureRatioY", m_TexureRatio.y); m_OcclusionMaterial.SetFloat("_ViewportSizeX", m_ViewportSize.x); m_OcclusionMaterial.SetFloat("_ViewportSizeY", m_ViewportSize.y); m_OcclusionMaterial.SetFloat("_ViewportOrigX", m_ViewportOrig.x); m_OcclusionMaterial.SetFloat("_ViewportOrigY", m_ViewportOrig.y); m_OcclusionMaterial.SetFloat("_ScreenWidth", Screen.width); m_OcclusionMaterial.SetFloat("_ScreenHeight", Screen.height); m_OcclusionMaterial.SetFloat("_PrefixX", m_Prefix.x); m_OcclusionMaterial.SetFloat("_PrefixY", m_Prefix.y); m_OcclusionMaterial.SetFloat("_InversionMultiplierX", m_InversionMultiplier.x); m_OcclusionMaterial.SetFloat("_InversionMultiplierY", m_InversionMultiplier.y); }