diff --git a/drape_frontend/framebuffer.cpp b/drape_frontend/framebuffer.cpp index a525ba80ad..d340f53349 100644 --- a/drape_frontend/framebuffer.cpp +++ b/drape_frontend/framebuffer.cpp @@ -17,9 +17,9 @@ Framebuffer::Framebuffer() : m_colorTextureId(0) , m_depthTextureId(0) , m_framebufferId(0) + , m_maxTextureSize(GLFunctions::glGetInteger(gl_const::GLMaxTextureSize)) , m_defaultContext(0) { - } Framebuffer::~Framebuffer() @@ -51,6 +51,11 @@ void Framebuffer::SetDefaultContext(dp::OGLContext * context) m_defaultContext = context; } +int32_t Framebuffer::GetMaxSize() const +{ + return m_maxTextureSize; +} + void Framebuffer::SetSize(uint32_t width, uint32_t height) { assert(width > 0 && height > 0); @@ -59,8 +64,8 @@ void Framebuffer::SetSize(uint32_t width, uint32_t height) if (m_width == width && m_height == height) return; - m_width = width; m_height = height; + m_width = width; Destroy(); diff --git a/drape_frontend/framebuffer.hpp b/drape_frontend/framebuffer.hpp index 31618bbc7b..00db1ae495 100644 --- a/drape_frontend/framebuffer.hpp +++ b/drape_frontend/framebuffer.hpp @@ -16,6 +16,8 @@ public: void SetDefaultContext(dp::OGLContext * context); void SetSize(uint32_t width, uint32_t height); + int32_t GetMaxSize() const; + void Enable(); void Disable(); @@ -31,6 +33,8 @@ private: uint32_t m_depthTextureId; uint32_t m_framebufferId; + const int32_t m_maxTextureSize; + dp::OGLContext * m_defaultContext; }; diff --git a/drape_frontend/frontend_renderer.cpp b/drape_frontend/frontend_renderer.cpp index dc48cd6969..1999b1aa2a 100755 --- a/drape_frontend/frontend_renderer.cpp +++ b/drape_frontend/frontend_renderer.cpp @@ -497,13 +497,30 @@ unique_ptr FrontendRenderer::CreateRoutine() void FrontendRenderer::OnResize(ScreenBase const & screen) { - m_viewport.SetViewport(0, 0, screen.GetWidth(), screen.GetHeight()); m_myPositionController->SetPixelRect(screen.PixelRect()); - m_contextFactory->getDrawContext()->resize(m_viewport.GetWidth(), m_viewport.GetHeight()); - m_framebuffer->SetDefaultContext(m_contextFactory->getDrawContext()); - m_framebuffer->SetSize(m_viewport.GetWidth(), m_viewport.GetHeight()); - m_renderer3d->SetSize(m_viewport.GetWidth(), m_viewport.GetHeight()); + + m_viewport.SetViewport(0, 0, screen.GetWidth(), screen.GetHeight()); + m_contextFactory->getDrawContext()->resize(m_pixelRect.SizeX(), m_pixelRect.SizeY()); RefreshProjection(); + + if (m_useFramebuffer) + { + int width = screen.GetWidth(); + int height = screen.GetHeight(); + int maxSide = max(width, height); + if (maxSide > m_framebuffer->GetMaxSize()) + { + width = width * m_framebuffer->GetMaxSize() / maxSide; + height = height * m_framebuffer->GetMaxSize() / maxSide; + } + LOG(LINFO, ("Max texture size: ", m_framebuffer->GetMaxSize(), ", max side: ", maxSide, ", scale: ", m_framebuffer->GetMaxSize() / (double)maxSide)); + + m_viewport.SetViewport(0, 0, width, height); + + m_renderer3d->SetSize(m_pixelRect.SizeX(), m_pixelRect.SizeY()); + m_framebuffer->SetDefaultContext(m_contextFactory->getDrawContext()); + m_framebuffer->SetSize(width, height); + } } void FrontendRenderer::AddToRenderGroup(vector> & groups, @@ -1138,6 +1155,7 @@ ScreenBase const & FrontendRenderer::ProcessEvents(bool & modelViewChanged, bool gui::DrapeGui::Instance().SetInUserAction(m_userEventStream.IsInUserAction()); ScreenBase modelView2 = modelView; + m_pixelRect = modelView.PixelRect(); modelViewChanged = modelViewChanged || m_3dModeChanged; viewportChanged = viewportChanged || m_3dModeChanged; @@ -1145,13 +1163,15 @@ ScreenBase const & FrontendRenderer::ProcessEvents(bool & modelViewChanged, bool { double scale = max(m_renderer3d->GetScaleX(), m_renderer3d->GetScaleY()); - int w = modelView2.GetWidth(); - int h = modelView2.GetHeight(); + m2::RectD const & pxRect = modelView2.PixelRect(); + m2::RectI iRect(0, 0, (int)(pxRect.maxX() * scale), (int)(pxRect.maxY() * scale)); - m2::AnyRectD rectG = modelView2.GlobalRect(); - double dyG = rectG.GetLocalRect().SizeY() * (scale - 1.0); - modelView2.Scale(1.0/scale); + m2::AnyRectD const & gRect = modelView2.GlobalRect(); + double dyG = gRect.GetLocalRect().SizeY() * (scale - 1.0); + modelView2.Scale(1.0 / scale); modelView2.MoveG(m2::PointD(0, -dyG / 2.0)); + + modelView2 = ScreenBase(iRect, modelView2.GlobalRect()); } m_3dModeChanged = false; diff --git a/drape_frontend/frontend_renderer.hpp b/drape_frontend/frontend_renderer.hpp index 2b7a23c528..87615a3ac3 100755 --- a/drape_frontend/frontend_renderer.hpp +++ b/drape_frontend/frontend_renderer.hpp @@ -230,6 +230,7 @@ private: bool m_3dModeChanged; drape_ptr m_framebuffer; drape_ptr m_renderer3d; + m2::RectD m_pixelRect; Viewport m_viewport; UserEventStream m_userEventStream; diff --git a/drape_frontend/renderer3d.cpp b/drape_frontend/renderer3d.cpp index 5efc08022b..47fc045ab2 100644 --- a/drape_frontend/renderer3d.cpp +++ b/drape_frontend/renderer3d.cpp @@ -155,12 +155,11 @@ void Renderer3d::Render(uint32_t textureId, ref_ptr mng) GLFunctions::glBindBuffer(m_bufferId, gl_const::GLArrayBuffer); GLFunctions::glBindVertexArray(m_VAO); - - GLFunctions::glBufferData(gl_const::GLArrayBuffer, sizeof(m_vertices), m_vertices, gl_const::GLStaticDraw); GLFunctions::glViewport(0, 0, m_width, m_height); GLFunctions::glClear(); + GLFunctions::glDrawArrays(gl_const::GLTriangleStrip, 0, 4); prg->Unbind();