Fixed setting up model-view matrix (now one time per frame)

This commit is contained in:
r.kuznetsov 2015-03-17 16:52:39 +03:00
parent 2114318f22
commit 15cfc0df2d
6 changed files with 43 additions and 33 deletions

View file

@ -2,11 +2,16 @@
#include "3party/fribidi/lib/fribidi.h"
#include "std/mutex.hpp"
namespace fribidi
{
strings::UniString log2vis(strings::UniString const & str)
{
static mutex fribidiMutex;
lock_guard<mutex> lock(fribidiMutex);
size_t const count = str.size();
if (count == 0)
return str;

View file

@ -68,9 +68,7 @@ void DrapeEngine::Resize(int w, int h)
void DrapeEngine::UpdateCoverage(ScreenBase const & screen)
{
m_threadCommutator->PostMessage(ThreadsCommutator::RenderThread,
dp::MovePointer<Message>(new UpdateModelViewMessage(screen)),
MessagePriority::Normal);
m_frontend->UpdateModelView(screen);
}
void DrapeEngine::ClearUserMarksLayer(df::TileKey const & tileKey)

View file

@ -40,6 +40,7 @@ FrontendRenderer::FrontendRenderer(dp::RefPointer<ThreadsCommutator> commutator,
, m_textureManager(textureManager)
, m_gpuProgramManager(new dp::GpuProgramManager())
, m_viewport(viewport)
, m_modelViewChanged(false)
{
#ifdef DRAW_INFO
m_tpf = 0,0;
@ -159,18 +160,6 @@ void FrontendRenderer::AcceptMessage(dp::RefPointer<Message> message)
break;
}
case Message::UpdateModelView:
{
UpdateModelViewMessage * coverMessage = df::CastMessage<UpdateModelViewMessage>(message);
m_view = coverMessage->GetScreen();
RefreshModelView();
ResolveTileKeys();
m_commutator->PostMessage(ThreadsCommutator::ResourceUploadThread,
dp::MovePointer<Message>(new UpdateReadManagerMessage(m_view, m_tiles)),
MessagePriority::Normal);
break;
}
case Message::InvalidateRect:
{
InvalidateRectMessage * m = df::CastMessage<InvalidateRectMessage>(message);
@ -431,6 +420,7 @@ void FrontendRenderer::Routine::Do()
context->setDefaultFramebuffer();
m_renderer.m_textureManager->UpdateDynamicTextures();
m_renderer.RenderScene();
m_renderer.ProcessModelViewUpdating();
double availableTime = VSyncInterval - (timer.ElapsedSeconds() /*+ avarageMessageTime*/);
@ -467,4 +457,26 @@ void FrontendRenderer::DeleteRenderData()
DeleteRange(m_userMarkRenderGroups, DeleteFunctor());
}
void FrontendRenderer::UpdateModelView(ScreenBase const & screen)
{
lock_guard<mutex> lock(m_modelViewMutex);
m_modelViewChanged = true;
m_newView = screen;
}
void FrontendRenderer::ProcessModelViewUpdating()
{
if (m_modelViewChanged)
{
lock_guard<mutex> lock(m_modelViewMutex);
m_view = m_newView;
RefreshModelView();
ResolveTileKeys();
m_commutator->PostMessage(ThreadsCommutator::ResourceUploadThread,
dp::MovePointer<Message>(new UpdateReadManagerMessage(m_view, m_tiles)),
MessagePriority::Normal);
m_modelViewChanged = false;
}
}
} // namespace df

View file

@ -55,6 +55,8 @@ public:
void AfterDrawFrame();
#endif
void UpdateModelView(ScreenBase const & screen);
protected:
virtual void AcceptMessage(dp::RefPointer<Message> message);
@ -90,6 +92,7 @@ private:
private:
void DeleteRenderData();
void ProcessModelViewUpdating();
private:
dp::RefPointer<dp::TextureManager> m_textureManager;
@ -107,6 +110,10 @@ private:
ScreenBase m_view;
set<TileKey> m_tiles;
ScreenBase m_newView;
mutex m_modelViewMutex;
bool m_modelViewChanged;
dp::OverlayTree m_overlayTree;
};

View file

@ -13,7 +13,6 @@ public:
TileReadEnded,
FlushTile,
MapShapeReaded,
UpdateModelView,
UpdateReadManager,
InvalidateRect,
InvalidateReadManagerRect,

View file

@ -89,20 +89,6 @@ private:
Viewport m_viewport;
};
class UpdateModelViewMessage : public Message
{
public:
UpdateModelViewMessage(ScreenBase const & screen)
: m_screen(screen) {}
Type GetType() const override { return Message::UpdateModelView; }
ScreenBase const & GetScreen() const { return m_screen; }
private:
ScreenBase m_screen;
};
class InvalidateRectMessage : public Message
{
public:
@ -117,19 +103,22 @@ private:
m2::RectD m_rect;
};
class UpdateReadManagerMessage : public UpdateModelViewMessage
class UpdateReadManagerMessage : public Message
{
public:
UpdateReadManagerMessage(ScreenBase const & screen, set<TileKey> const & tiles)
: UpdateModelViewMessage(screen)
, m_tiles(tiles) {}
: m_screen(screen)
, m_tiles(tiles)
{}
Type GetType() const override { return Message::UpdateReadManager; }
set<TileKey> const & GetTiles() const { return m_tiles; }
ScreenBase const & GetScreen() const { return m_screen; }
private:
set<TileKey> m_tiles;
ScreenBase m_screen;
};
class InvalidateReadManagerRectMessage : public Message