Пример #1
0
            void Init()
            {
                texture               = ComponentUtility.CreateComponent <Component_Image>(null, true, false);
                texture.CreateType    = Component_Image.TypeEnum._2D;
                texture.CreateSize    = imageSizeRender;             // new Vector2I( imageSizeRender, imageSizeRender );
                texture.CreateMipmaps = false;
                texture.CreateFormat  = imageFormat;
                texture.CreateUsage   = Component_Image.Usages.RenderTarget;
                texture.CreateFSAA    = 0;
                texture.Enabled       = true;

                var renderTexture = texture.Result.GetRenderTarget(0, 0);

                viewport = renderTexture.AddViewport(false, true);
                viewport.AllowRenderScreenLabels = false;

                //viewport.UpdateBegin += Viewport_UpdateBegin;

                textureRead               = ComponentUtility.CreateComponent <Component_Image>(null, true, false);
                textureRead.CreateType    = Component_Image.TypeEnum._2D;
                textureRead.CreateSize    = texture.CreateSize;
                textureRead.CreateMipmaps = false;
                textureRead.CreateFormat  = texture.CreateFormat;
                textureRead.CreateUsage   = Component_Image.Usages.ReadBack | Component_Image.Usages.BlitDestination;
                textureRead.CreateFSAA    = 0;
                textureRead.Enabled       = true;
                //!!!!
                textureRead.Result.PrepareNativeObject();

                var imageDataBytes = PixelFormatUtility.GetNumElemBytes(imageFormat) * imageSizeRender.X * imageSizeRender.Y;

                imageData = NativeUtility.Alloc(NativeUtility.MemoryAllocationType.Utility, imageDataBytes);
            }
        public void ComponentCreate()
        {
            ComponentDestroy();

            if (EnabledInHierarchyAndIsNotResource)
            {
                var fileName = LoadFile.GetByReference;
                if (!string.IsNullOrEmpty(fileName) && VirtualFile.Exists(fileName))
                {
                    createdComponent = ResourceManager.LoadSeparateInstance <Component>(fileName, true, null);
                }
                else
                {
                    var type = CreateType.Value;
                    if (type != null)
                    {
                        createdComponent = ComponentUtility.CreateComponent(type, null, true, true);
                    }
                }

                if (createdComponent != null)
                {
                    ComponentCreated?.Invoke(this);
                }
            }
        }
Пример #3
0
            /////////////////////////////////////////

            public Component_Scene CreateScene(bool enable)
            {
                DetachAndOrDestroyScene();

                scene = ComponentUtility.CreateComponent <Component_Scene>(null, true, enable);

                //!!!!что еще отключать?
                scene.OctreeEnabled = false;

                //rendering pipeline
                {
                    var pipeline = (Component_RenderingPipeline)scene.CreateComponent(RenderingSystem.RenderingPipelineDefault, -1, false);
                    scene.RenderingPipeline = pipeline;

                    //!!!!что еще отключать?
                    pipeline.DeferredShading = AutoTrueFalse.False;
                    pipeline.LODRange        = new RangeI(0, 0);
                    //pipeline.UseRenderTargets = false;

                    //!!!!
                    scene.BackgroundColor = new ColorValue(0.5, 0.5, 0.5);
                    //scene.BackgroundColor = new ColorValue( 0, 0, 0, 0 );

                    scene.BackgroundColorAffectLighting      = 1;
                    scene.BackgroundColorEnvironmentOverride = new ColorValue(0.8, 0.8, 0.8);

                    pipeline.Enabled = true;
                }

                //ambient light
                {
                    var light = scene.CreateComponent <Component_Light>();
                    light.Type       = Component_Light.TypeEnum.Ambient;
                    light.Brightness = ReferenceUtility.MakeReference("Base\\ProjectSettings.component|PreviewAmbientLightBrightness");
                    //light.Brightness = ProjectSettings.Get.PreviewAmbientLightBrightness.Value;
                }

                //directional light
                {
                    var light = scene.CreateComponent <Component_Light>();
                    light.Type       = Component_Light.TypeEnum.Directional;
                    light.Transform  = new Transform(new Vector3(0, 0, 0), Quaternion.FromDirectionZAxisUp(new Vector3(0, 0, -1)), Vector3.One);
                    light.Brightness = ReferenceUtility.MakeReference("Base\\ProjectSettings.component|PreviewDirectionalLightBrightness");
                    //light.Brightness = ProjectSettings.Get.PreviewDirectionalLightBrightness.Value;
                    //!!!!?
                    light.Shadows = false;
                    //light.Type = Component_Light.TypeEnum.Point;
                    //light.Transform = new Transform( new Vec3( 0, 0, 2 ), Quat.Identity, Vec3.One );
                }

                scene.ViewportUpdateGetCameraSettings += Scene_ViewportUpdateGetCameraSettings;

                //connect scene to viewport
                if (viewport != null)
                {
                    viewport.AttachedScene = scene;
                }

                return(scene);
            }
Пример #4
0
        //[Browsable( false )]
        //public UIControl CreatedControl
        //{
        //	get { return createdControl; }
        //}

        void CreateRenderTarget()
        {
            DestroyRenderTarget();

            var size = GetDemandedSize();
            var hdr  = HDR.Value;

            var mipmaps = false;

            createdImage               = ComponentUtility.CreateComponent <Component_Image>(null, true, false);
            createdImage.CreateType    = Component_Image.TypeEnum._2D;
            createdImage.CreateSize    = size;
            createdImage.CreateMipmaps = mipmaps;
            createdImage.CreateFormat  = hdr ? PixelFormat.Float32RGBA : PixelFormat.A8R8G8B8;
            var usage = Component_Image.Usages.RenderTarget;

            if (mipmaps)
            {
                usage |= Component_Image.Usages.AutoMipmaps;
            }
            createdImage.CreateUsage = usage;
            createdImage.CreateFSAA  = 0;
            createdImage.Enabled     = true;

            var renderTexture = createdImage.Result.GetRenderTarget();

            createdViewport = renderTexture.AddViewport(true, true);

            createdViewport.UpdateBeforeOutput += CreatedViewport_UpdateBeforeOutput;

            createdForSize = size;
            createdForHDR  = hdr;

            UpdateAttachedScene();
        }
Пример #5
0
        protected override void OnEnabled()
        {
            base.OnEnabled();

            mesh = ComponentUtility.CreateComponent <Component_Mesh>(null, true, false);
            mesh.CreateComponent <Component_MeshGeometry_Box>();
            mesh.Enabled = true;

            processedCubemapNeedUpdate = true;
        }
Пример #6
0
        public static Component_Mesh GetBillboardMesh()
        {
            if (billboardMesh == null || billboardMesh.Disposed)
            {
                billboardMesh = null;
            }

            if (billboardMesh == null)
            {
                var mesh     = ComponentUtility.CreateComponent <Component_Mesh>(null, true, false);
                var geometry = mesh.CreateComponent <Component_MeshGeometry_Plane>();
                geometry.Axis  = 1;
                mesh.Billboard = true;
                mesh.Enabled   = true;

                billboardMesh = mesh;
            }

            return(billboardMesh);
        }
Пример #7
0
            //

            public Item(RectangleF uv)
            {
                UV         = uv;
                EngineTime = Time.Current;

                var vertexStructure = StandardVertex.MakeStructure(StandardVertex.Components.StaticOneTexCoord, true, out int vertexSize);

                var positions = new Vector3F[] { new Vector3F(-0.5f, -0.5f, 0), new Vector3F(0.5f, -0.5f, 0), new Vector3F(0.5f, 0.5f, 0), new Vector3F(-0.5f, 0.5f, 0) };
                var texCoords = new Vector2F[] { uv.LeftTop, uv.RightTop, uv.RightBottom, uv.LeftBottom };

                var vertices = new byte[vertexSize * positions.Length];

                unsafe
                {
                    fixed(byte *pVertices = vertices)
                    {
                        StandardVertex.StaticOneTexCoord *pVertex = (StandardVertex.StaticOneTexCoord *)pVertices;

                        for (int n = 0; n < positions.Length; n++)
                        {
                            pVertex->Position  = positions[n];
                            pVertex->Normal    = new Vector3F(0, 0, 1);
                            pVertex->Tangent   = new Vector4F(1, 0, 0, -1);
                            pVertex->Color     = new ColorValue(1, 1, 1, 1);
                            pVertex->TexCoord0 = texCoords[n];

                            pVertex++;
                        }
                    }
                }

                var mesh     = ComponentUtility.CreateComponent <Component_Mesh>(null, true, false);
                var geometry = mesh.CreateComponent <Component_MeshGeometry>();

                geometry.VertexStructure = vertexStructure;
                geometry.Vertices        = vertices;
                geometry.Indices         = new int[] { 0, 1, 2, 2, 3, 0 };
                mesh.Enabled             = true;

                Mesh = mesh;
            }
Пример #8
0
        public Component_Image GetImage(out long uniqueMaskDataCounter)
        {
            uniqueMaskDataCounter = 0;

            if (MaskImage.Value != null)
            {
                return(MaskImage);
            }
            else if (Mask.Value != null && Mask.Value.Length != 0)
            {
                if (EnabledInHierarchy)
                {
                    if (createdMaskImage == null)
                    {
                        int textureSize = (int)Math.Sqrt(Mask.Value.Length);

                        //need set ShowInEditor = false before AddComponent
                        var texture = ComponentUtility.CreateComponent <Component_Image>(null, false, false);
                        texture.DisplayInEditor = false;
                        AddComponent(texture, -1);
                        //var texture = CreateComponent<Component_Image>( enabled: false );

                        texture.SaveSupport  = false;
                        texture.CloneSupport = false;

                        //!!!!
                        bool mipmaps = false;

                        texture.CreateType    = Component_Image.TypeEnum._2D;
                        texture.CreateSize    = new Vector2I(textureSize, textureSize);
                        texture.CreateMipmaps = mipmaps;
                        texture.CreateFormat  = PixelFormat.L8;

                        var usage = Component_Image.Usages.WriteOnly;
                        if (mipmaps)
                        {
                            usage |= Component_Image.Usages.AutoMipmaps;
                        }
                        texture.CreateUsage = usage;

                        texture.Enabled = true;

                        createdMaskImage           = texture;
                        createdMaskImageNeedUpdate = true;
                    }

                    //update data
                    if (createdMaskImageNeedUpdate)
                    {
                        GpuTexture gpuTexture = createdMaskImage.Result;
                        if (gpuTexture != null)
                        {
                            var d = new GpuTexture.SurfaceData[] { new GpuTexture.SurfaceData(0, 0, Mask.Value) };
                            gpuTexture.SetData(d);
                        }

                        createdMaskImageNeedUpdate = false;
                    }

                    uniqueMaskDataCounter = this.uniqueMaskDataCounter;
                    return(createdMaskImage);
                }
            }
            return(null);
        }
Пример #9
0
        public Component_Image DynamicTexture_Alloc(DynamicTextureType type, Component_Image.TypeEnum imageType, Vector2I size, PixelFormat format, int fsaaLevel, bool mipmaps, int arrayLayers = 1, bool createSimple3DRenderer = false, bool createCanvasRenderer = false)
        {
            if (type == DynamicTextureType.RenderTarget)
            {
                UpdateStatisticsCurrent.RenderTargets++;
            }
            else
            {
                UpdateStatisticsCurrent.DynamicTextures++;
            }

            //find free
            {
                var target = DynamicTexture_GetFree(type, imageType, size, format, fsaaLevel, mipmaps, arrayLayers, createSimple3DRenderer, createCanvasRenderer);
                if (target != null)
                {
                    return(target);
                }
            }

            //!!!!need hierarchy controller?
            Component_Image texture = ComponentUtility.CreateComponent <Component_Image>(null, true, false);

            texture.CreateType        = imageType;
            texture.CreateSize        = size;
            texture.CreateMipmaps     = mipmaps;
            texture.CreateArrayLayers = arrayLayers;
            texture.CreateFormat      = format;
            if (type == DynamicTextureType.DynamicTexture)
            {
                texture.CreateUsage = Component_Image.Usages.Dynamic | Component_Image.Usages.WriteOnly;
            }
            else
            {
                texture.CreateUsage = Component_Image.Usages.RenderTarget;
            }
            texture.CreateFSAA = fsaaLevel;
            texture.Enabled    = true;

            //!!!!!как проверять ошибки создания текстур? везде так
            //if( texture == null )
            //{
            //	//!!!!!
            //	Log.Fatal( "ViewportRenderingPipeline: RenderTarget_Alloc: Unable to create texture." );
            //	return null;
            //}

            int faces = imageType == Component_Image.TypeEnum.Cube ? 6 : arrayLayers;

            int numMips;

            if (mipmaps)
            {
                int   max         = size.MaxComponent();
                float kInvLogNat2 = 1.4426950408889634073599246810019f;
                numMips = 1 + (int)(Math.Log(size.MaxComponent()) * kInvLogNat2);
            }
            else
            {
                numMips = 1;
            }

            if (type == DynamicTextureType.RenderTarget)
            {
                for (int face = 0; face < faces; face++)
                {
                    for (int mip = 0; mip < numMips; mip++)
                    {
                        RenderTexture renderTexture = texture.Result.GetRenderTarget(mip, face);
                        var           viewport      = renderTexture.AddViewport(createSimple3DRenderer, createCanvasRenderer);

                        viewport.RenderingPipelineCreate();
                        viewport.RenderingPipelineCreated.UseRenderTargets = false;
                    }
                    //!!!!что-то еще?
                }
            }

            //Log.Info( "alloc: " + type.ToString() + " " + size.ToString() );

            //add to list of allocated
            var item = new DynamicTextureItem();

            item.type      = type;
            item.imageType = imageType;
            item.size      = size;
            item.format    = format;
            item.fsaaLevel = fsaaLevel;
            item.mipmaps   = mipmaps;
            //item.num_mipmaps = num_mipmaps;
            item.arrayLayers            = arrayLayers;
            item.createSimple3DRenderer = createSimple3DRenderer;
            item.createCanvasRenderer   = createCanvasRenderer;
            item.image = texture;
            dynamicTexturesAllocated.Add(item);

            item.usedLastUpdate = true;
            return(texture);
        }
        public void UpdateCaptureCubemap()
        {
            if (Mode.Value != ModeEnum.Capture)
            {
                return;
            }

            Component_Image texture     = null;
            Component_Image textureRead = null;

            try
            {
                //create

                var resolution = Resolution.Value;
                var hdr        = HDR.Value;

                var size = int.Parse(resolution.ToString().Replace("_", ""));
                //!!!!16 бит достаточно, тогда нужно поддержку для Image2D
                PixelFormat format = hdr ? PixelFormat.Float32RGBA : PixelFormat.A8R8G8B8;
                //PixelFormat format = hdr ? PixelFormat.Float16RGBA : PixelFormat.A8R8G8B8;

                texture               = ComponentUtility.CreateComponent <Component_Image>(null, true, false);
                texture.CreateType    = Component_Image.TypeEnum._2D;
                texture.CreateSize    = new Vector2I(size, size);
                texture.CreateMipmaps = false;
                texture.CreateFormat  = format;
                texture.CreateUsage   = Component_Image.Usages.RenderTarget;
                texture.CreateFSAA    = 0;
                texture.Enabled       = true;

                var renderTexture = texture.Result.GetRenderTarget(0, 0);
                //!!!!
                var viewport = renderTexture.AddViewport(true, false);
                //var viewport = renderTexture.AddViewport( false, false );
                viewport.Mode          = Viewport.ModeEnum.ReflectionProbeCubemap;
                viewport.AttachedScene = ParentScene;

                textureRead               = ComponentUtility.CreateComponent <Component_Image>(null, true, false);
                textureRead.CreateType    = Component_Image.TypeEnum._2D;
                textureRead.CreateSize    = new Vector2I(size, size);
                textureRead.CreateMipmaps = false;
                textureRead.CreateFormat  = format;
                textureRead.CreateUsage   = Component_Image.Usages.ReadBack | Component_Image.Usages.BlitDestination;
                textureRead.CreateFSAA    = 0;
                textureRead.Enabled       = true;
                //!!!!
                textureRead.Result.PrepareNativeObject();

                //render
                var image2D = new ImageUtility.Image2D(PixelFormat.Float32RGB, new Vector2I(size * 4, size * 3));

                var position = Transform.Value.Position;

                for (int face = 0; face < 6; face++)
                {
                    Vector3 dir = Vector3.Zero;
                    Vector3 up  = Vector3.Zero;

                    //flipped
                    switch (face)
                    {
                    case 0: dir = -Vector3.YAxis; up = Vector3.ZAxis; break;

                    case 1: dir = Vector3.YAxis; up = Vector3.ZAxis; break;

                    case 2: dir = Vector3.ZAxis; up = -Vector3.XAxis; break;

                    case 3: dir = -Vector3.ZAxis; up = Vector3.XAxis; break;

                    case 4: dir = Vector3.XAxis; up = Vector3.ZAxis; break;

                    case 5: dir = -Vector3.XAxis; up = Vector3.ZAxis; break;
                    }

                    //!!!!renderingPipelineOverride

                    var scene        = ParentScene;
                    var cameraEditor = scene.Mode.Value == Component_Scene.ModeEnum._2D ? scene.CameraEditor2D.Value : scene.CameraEditor.Value;
                    if (cameraEditor == null)
                    {
                        cameraEditor = new Component_Camera();
                    }

                    var cameraSettings = new Viewport.CameraSettingsClass(viewport, 1, 90, NearClipPlane.Value, FarClipPlane.Value, position, dir, up, ProjectionType.Perspective, 1, cameraEditor.Exposure, cameraEditor.EmissiveFactor, renderSky: RenderSky);

                    viewport.Update(true, cameraSettings);

                    //clear temp data
                    viewport.RenderingContext.MultiRenderTarget_DestroyAll();
                    viewport.RenderingContext.DynamicTexture_DestroyAll();

                    texture.Result.GetRealObject(true).BlitTo(viewport.RenderingContext.CurrentViewNumber, textureRead.Result.GetRealObject(true), 0, 0);

                    //get data
                    var totalBytes = PixelFormatUtility.GetNumElemBytes(format) * size * size;
                    var data       = new byte[totalBytes];
                    unsafe
                    {
                        fixed(byte *pBytes = data)
                        {
                            var demandedFrame = textureRead.Result.GetRealObject(true).Read((IntPtr)pBytes, 0);

                            while (RenderingSystem.CallBgfxFrame() < demandedFrame)
                            {
                            }
                        }
                    }

                    Vector2I index = Vector2I.Zero;
                    switch (face)
                    {
                    case 1: index = new Vector2I(2, 1); break;

                    case 0: index = new Vector2I(0, 1); break;

                    case 2: index = new Vector2I(1, 0); break;

                    case 3: index = new Vector2I(1, 2); break;

                    case 4: index = new Vector2I(1, 1); break;

                    case 5: index = new Vector2I(3, 1); break;
                    }
                    //switch( face )
                    //{
                    //case 0: index = new Vector2I( 2, 1 ); break;
                    //case 1: index = new Vector2I( 0, 1 ); break;
                    //case 2: index = new Vector2I( 1, 0 ); break;
                    //case 3: index = new Vector2I( 1, 2 ); break;
                    //case 4: index = new Vector2I( 1, 1 ); break;
                    //case 5: index = new Vector2I( 3, 1 ); break;
                    //}

                    var faceImage = new ImageUtility.Image2D(format, new Vector2I(size, size), data);

                    //flip by X
                    var faceImageFlip = new ImageUtility.Image2D(format, new Vector2I(size, size));
                    for (int y = 0; y < size; y++)
                    {
                        for (int x = 0; x < size; x++)
                        {
                            var pixel = faceImage.GetPixel(new Vector2I(x, y));
                            faceImageFlip.SetPixel(new Vector2I(size - 1 - x, y), pixel);
                        }
                    }

                    image2D.Blit(index * size, faceImageFlip);
                }

                //reset alpha channel
                for (int y = 0; y < image2D.Size.Y; y++)
                {
                    for (int x = 0; x < image2D.Size.X; x++)
                    {
                        var pixel = image2D.GetPixel(new Vector2I(x, y));
                        pixel.W = 1.0f;
                        image2D.SetPixel(new Vector2I(x, y), pixel);
                    }
                }

                var destRealFileName = VirtualPathUtility.GetRealPathByVirtual(GetDestVirtualFileName());

                if (!Directory.Exists(Path.GetDirectoryName(destRealFileName)))
                {
                    Directory.CreateDirectory(Path.GetDirectoryName(destRealFileName));
                }

                if (!ImageUtility.Save(destRealFileName, image2D.Data, image2D.Size, 1, image2D.Format, 1, 0, out var error))
                {
                    throw new Exception(error);
                }

                //delete Gen files
                var names = new string[] { "_Gen.info", "_GenEnv.dds", "_GenIrr.dds" };
                foreach (var name in names)
                {
                    var fileName2 = VirtualPathUtility.GetRealPathByVirtual(destRealFileName + name);
                    if (File.Exists(fileName2))
                    {
                        File.Delete(fileName2);
                    }
                }
            }
            catch (Exception e)
            {
                Log.Error(e.Message);
            }
            finally
            {
                texture?.Dispose();
                textureRead?.Dispose();
            }

            processedCubemapNeedUpdate = true;
        }
Пример #11
0
        protected override void OnRenderUI(CanvasRenderer renderer)
        {
            base.OnRenderUI(renderer);

            Vector2I size = GetNeededSize();

            if (browser == null)
            {
                CreateBrowser();
            }

            //update brower engine and texture
            if (browser != null)
            {
                if (viewSize != size /*&& !browser.IsResizing */)
                {
                    var oldSize = viewSize;
                    viewSize = size;
                    OnResized(oldSize, viewSize);
                }

                //create texture
                if (texture == null || textureSize != size || needRecreateTexture)
                {
                    if (texture != null)
                    {
                        texture.Dispose();
                        texture = null;
                    }

                    textureSize = size;

                    bool mipmaps = false;
                    //!!!!
                    //if( ControlManager != null && ControlManager is UI3DControlContainer )
                    //	mipmaps = renderingIn3DMipmaps;

                    var usage = Component_Image.Usages.WriteOnly;
                    if (mipmaps)
                    {
                        usage |= Component_Image.Usages.AutoMipmaps;
                    }

                    texture               = ComponentUtility.CreateComponent <Component_Image>(null, true, false);
                    texture.CreateType    = Component_Image.TypeEnum._2D;
                    texture.CreateSize    = textureSize;
                    texture.CreateMipmaps = mipmaps;                    // ? -1 : 0;
                    texture.CreateFormat  = PixelFormat.A8R8G8B8;
                    texture.CreateUsage   = usage;
                    texture.Enabled       = true;

                    //Log.Info( textureSize.ToString() );

                    //if( mipmaps )
                    //{
                    //	texture = TextureManager.Instance.Create( textureName, Texture.Type.Type2D, textureSize,
                    //		1, -1, PixelFormat.A8R8G8B8, Texture.Usage.DynamicWriteOnlyDiscardable | Texture.Usage.AutoMipmap );
                    //}
                    //else
                    //{
                    //	texture = TextureManager.Instance.Create( textureName, Texture.Type.Type2D, textureSize,
                    //		1, 0, PixelFormat.A8R8G8B8, Texture.Usage.DynamicWriteOnlyDiscardable );
                    //}

                    needUpdateTexture   = true;
                    needRecreateTexture = false;
                }

                if (needInvalidate)
                {
                    browserHost.SetZoomLevel(Zoom);
                    browserHost.Invalidate(new CefRectangle(0, 0, 100000, 100000), CefPaintElementType.View);
                    needInvalidate = false;
                }

                //update texture
                if (/*browser.IsDirty ||*/ needUpdateTexture)
                {
                    if (texture != null)
                    {
                        UpdateTexture();
                    }
                    needUpdateTexture = false;
                }
            }

            //draw texture
            {
                //bool backColorZero = BackColor == new ColorValue( 0, 0, 0, 0 );

                //ColorValue color = new ColorValue( 1, 1, 1 );
                ////ColorValue color = backColorZero ? new ColorValue( 1, 1, 1 ) : BackColor;
                //if( texture == null )
                //	color = new ColorValue( 0, 0, 0, color.Alpha );
                //color *= GetTotalColorMultiplier();

                //var color = GetTotalColorMultiplier();
                //if( color.Alpha > 0 )
                //{
                var color = new ColorValue(1, 1, 1);
                //color.Saturate();

                GetScreenRectangle(out var rect);

                Component_Image tex = null;
                if (renderBuffer != null && renderBufferForSize == ViewSize && renderBuffer.Length == ViewSize.X * ViewSize.Y * 4)
                {
                    tex = texture;
                }
                if (tex == null)
                {
                    tex = ResourceUtility.WhiteTexture2D;
                }

                if (renderer.IsScreen)                 //&& !renderer._OutGeometryTransformEnabled )
                {
                    ////screen per pixel accuracy

                    Vector2   viewportSize = renderer.ViewportForScreenCanvasRenderer.SizeInPixels.ToVector2F();
                    var       v            = size.ToVector2() / viewportSize;
                    Rectangle fixedRect    = new Rectangle(rect.LeftTop, rect.LeftTop + v);

                    //Vec2 leftTop = rect.LeftTop;
                    //leftTop *= viewportSize;
                    //leftTop = new Vec2( (int)( leftTop.X + .9999f ), (int)( leftTop.Y + .9999f ) );
                    ////!!!!!
                    ////if( RenderSystem.Instance.IsDirect3D() )
                    ////	leftTop -= new Vec2( .5f, .5f );
                    //leftTop /= viewportSize;

                    //Vec2 rightBottom = rect.RightBottom;
                    //rightBottom *= viewportSize;
                    //rightBottom = new Vec2( (int)( rightBottom.X + .9999f ), (int)( rightBottom.Y + .9999f ) );
                    ////!!!!!
                    ////if( RenderSystem.Instance.IsDirect3D() )
                    ////	rightBottom -= new Vec2( .5f, .5f );
                    //rightBottom /= viewportSize;

                    //Rect fixedRect = new Rect( leftTop, rightBottom );

                    renderer.PushTextureFilteringMode(CanvasRenderer.TextureFilteringMode.Point);
                    renderer.AddQuad(fixedRect, new Rectangle(0, 0, 1, 1), tex, color, true);
                    renderer.PopTextureFilteringMode();
                }
                else
                {
                    renderer.AddQuad(rect, new Rectangle(0, 0, 1, 1), tex, color, true);
                }
                //}
            }

            if (!IsSupportedByThisPlatform())
            {
                var text   = string.Format("UIWebBrowser: {0} is not supported.", SystemSettings.CurrentPlatform);
                var center = GetScreenRectangle().GetCenter();
                renderer.AddText(text, center, EHorizontalAlignment.Center, EVerticalAlignment.Center, new ColorValue(1, 0, 0));
            }
        }