/** * Creates necessary resources to render a window and sends draw commands to the rendering thread * * @param WindowDrawBuffer The buffer containing elements to draw */ void FSlateOpenGLRenderer::DrawWindows( FSlateDrawBuffer& InWindowDrawBuffer ) { // Update the font cache with new text before elements are batched FontCache->UpdateCache(); // Draw each window. For performance. All elements are batched before anything is rendered TArray<FSlateWindowElementList>& WindowElementLists = InWindowDrawBuffer.GetWindowElementLists(); for( int32 ListIndex = 0; ListIndex < WindowElementLists.Num(); ++ListIndex ) { FSlateWindowElementList& ElementList = WindowElementLists[ListIndex]; if ( ElementList.GetWindow().IsValid() ) { TSharedRef<SWindow> WindowToDraw = ElementList.GetWindow().ToSharedRef(); const FVector2D WindowSize = WindowToDraw->GetSizeInScreen(); FSlateOpenGLViewport* Viewport = WindowToViewportMap.Find( &WindowToDraw.Get() ); check(Viewport); //@todo Slate OpenGL: Move this to ResizeViewport if( WindowSize.X != Viewport->ViewportRect.Right || WindowSize.Y != Viewport->ViewportRect.Bottom ) { //@todo implement fullscreen const bool bFullscreen = false; Private_ResizeViewport( WindowSize, *Viewport, bFullscreen ); } Viewport->MakeCurrent(); // Batch elements. Note that we must set the current viewport before doing this so we have a valid rendering context when calling OpenGL functions ElementBatcher->AddElements( ElementList.GetDrawElements() ); //@ todo Slate: implement for opengl bool bRequiresStencilTest = false; ElementBatcher->FillBatchBuffers( ElementList, bRequiresStencilTest ); ElementBatcher->ResetBatches(); RenderingPolicy->UpdateBuffers( ElementList ); check(Viewport); glViewport( Viewport->ViewportRect.Left, Viewport->ViewportRect.Top, Viewport->ViewportRect.Right, Viewport->ViewportRect.Bottom ); // Draw all elements RenderingPolicy->DrawElements( ViewMatrix*Viewport->ProjectionMatrix, ElementList.GetRenderBatches() ); Viewport->SwapBuffers(); // Reset all batch data for this window ElementBatcher->ResetBatches(); } } FontCache->ConditionalFlushCache(); }
void FSlateOpenGLRenderer::UpdateFullscreenState( const TSharedRef<SWindow> InWindow, uint32 OverrideResX, uint32 OverrideResY ) { FSlateOpenGLViewport* Viewport = WindowToViewportMap.Find( &InWindow.Get() ); if( Viewport ) { bool bFullscreen = IsViewportFullscreen( *InWindow ); // todo: support Fullscreen modes in OpenGL // uint32 ResX = OverrideResX ? OverrideResX : GSystemResolution.ResX; // uint32 ResY = OverrideResY ? OverrideResY : GSystemResolution.ResY; Private_ResizeViewport( FVector2D( Viewport->ViewportRect.Right, Viewport->ViewportRect.Bottom ), *Viewport, bFullscreen ); } }
void FSlateD3DRenderer::RequestResize( const TSharedPtr<SWindow>& InWindow, uint32 NewSizeX, uint32 NewSizeY ) { const bool bFullscreen = IsViewportFullscreen( *InWindow ); Private_ResizeViewport( InWindow.ToSharedRef(), NewSizeX, NewSizeY, bFullscreen ); }