Ejemplo n.º 1
0
        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);
        }
Ejemplo n.º 2
0
        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);
        }