private Vector4 GetDrawingDimensions(ScaleMode scaleMode, ref Rect uvRect) { Vector4 returnSize = Vector4.zero; if (mainTexture != null) { var padding = Vector4.zero; var textureSize = new Vector2(mainTexture.width, mainTexture.height); { // Adjust textureSize based on orientation #if UNITY_PLATFORM_SUPPORTS_VIDEOTRANSFORM if (HasValidTexture()) { Matrix4x4 m = Helper.GetMatrixForOrientation(Helper.GetOrientation(_mediaPlayer.Info.GetTextureTransform())); textureSize = m.MultiplyVector(textureSize); textureSize.x = Mathf.Abs(textureSize.x); textureSize.y = Mathf.Abs(textureSize.y); } #endif // Adjust textureSize based on alpha packing if (_mediaPlayer != null) { if (_mediaPlayer.m_AlphaPacking == AlphaPacking.LeftRight || _mediaPlayer.m_StereoPacking == StereoPacking.LeftRight) { textureSize.x /= 2f; } else if (_mediaPlayer.m_AlphaPacking == AlphaPacking.TopBottom || _mediaPlayer.m_StereoPacking == StereoPacking.TopBottom) { textureSize.y /= 2f; } } } Rect r = GetPixelAdjustedRect(); // Fit the above textureSize into rectangle r int spriteW = Mathf.RoundToInt(textureSize.x); int spriteH = Mathf.RoundToInt(textureSize.y); var size = new Vector4(padding.x / spriteW, padding.y / spriteH, (spriteW - padding.z) / spriteW, (spriteH - padding.w) / spriteH); { if (textureSize.sqrMagnitude > 0.0f) { if (scaleMode == ScaleMode.ScaleToFit) { float spriteRatio = textureSize.x / textureSize.y; float rectRatio = r.width / r.height; if (spriteRatio > rectRatio) { float oldHeight = r.height; r.height = r.width * (1.0f / spriteRatio); r.y += (oldHeight - r.height) * rectTransform.pivot.y; } else { float oldWidth = r.width; r.width = r.height * spriteRatio; r.x += (oldWidth - r.width) * rectTransform.pivot.x; } } else if (scaleMode == ScaleMode.ScaleAndCrop) { float aspectRatio = textureSize.x / textureSize.y; float screenRatio = r.width / r.height; if (screenRatio > aspectRatio) { float adjust = aspectRatio / screenRatio; uvRect = new Rect(uvRect.xMin, (uvRect.yMin * adjust) + (1f - adjust) * 0.5f, uvRect.width, adjust * uvRect.height); } else { float adjust = screenRatio / aspectRatio; uvRect = new Rect(uvRect.xMin * adjust + (0.5f - adjust * 0.5f), uvRect.yMin, adjust * uvRect.width, uvRect.height); } } } } returnSize = new Vector4(r.x + r.width * size.x, r.y + r.height * size.y, r.x + r.width * size.z, r.y + r.height * size.w); } return(returnSize); }
private void _OnFillVBO(List <UIVertex> vbo) { _flipY = false; if (HasValidTexture()) { _flipY = _mediaPlayer.TextureProducer.RequiresVerticalFlip(); } Rect uvRect = m_UVRect; Vector4 v = GetDrawingDimensions(_scaleMode, ref uvRect); #if UNITY_PLATFORM_SUPPORTS_VIDEOTRANSFORM Matrix4x4 m = Matrix4x4.identity; if (HasValidTexture()) { m = Helper.GetMatrixForOrientation(Helper.GetOrientation(_mediaPlayer.Info.GetTextureTransform())); } #endif vbo.Clear(); var vert = UIVertex.simpleVert; vert.color = color; vert.position = new Vector2(v.x, v.y); vert.uv0 = new Vector2(uvRect.xMin, uvRect.yMin); if (_flipY) { vert.uv0 = new Vector2(uvRect.xMin, 1.0f - uvRect.yMin); } #if UNITY_PLATFORM_SUPPORTS_VIDEOTRANSFORM vert.uv0 = m.MultiplyPoint3x4(vert.uv0); #endif vbo.Add(vert); vert.position = new Vector2(v.x, v.w); vert.uv0 = new Vector2(uvRect.xMin, uvRect.yMax); if (_flipY) { vert.uv0 = new Vector2(uvRect.xMin, 1.0f - uvRect.yMax); } #if UNITY_PLATFORM_SUPPORTS_VIDEOTRANSFORM vert.uv0 = m.MultiplyPoint3x4(vert.uv0); #endif vbo.Add(vert); vert.position = new Vector2(v.z, v.w); vert.uv0 = new Vector2(uvRect.xMax, uvRect.yMax); if (_flipY) { vert.uv0 = new Vector2(uvRect.xMax, 1.0f - uvRect.yMax); } #if UNITY_PLATFORM_SUPPORTS_VIDEOTRANSFORM vert.uv0 = m.MultiplyPoint3x4(vert.uv0); #endif vbo.Add(vert); vert.position = new Vector2(v.z, v.y); vert.uv0 = new Vector2(uvRect.xMax, uvRect.yMin); if (_flipY) { vert.uv0 = new Vector2(uvRect.xMax, 1.0f - uvRect.yMin); } #if UNITY_PLATFORM_SUPPORTS_VIDEOTRANSFORM vert.uv0 = m.MultiplyPoint3x4(vert.uv0); #endif vbo.Add(vert); }