From 690a8e1f9cc5692fc560408802c96658bad877f3 Mon Sep 17 00:00:00 2001 From: ExMix Date: Tue, 18 Nov 2014 10:49:35 +0300 Subject: [PATCH] [drape] build fix --- drape_head/drape_head.pro | 2 +- drape_head/drape_surface.cpp | 60 ++++++++++++++++++++++++++++++++---- drape_head/drape_surface.hpp | 15 +++++++-- 3 files changed, 68 insertions(+), 9 deletions(-) diff --git a/drape_head/drape_head.pro b/drape_head/drape_head.pro index 0555a1434c..29f08b32b4 100644 --- a/drape_head/drape_head.pro +++ b/drape_head/drape_head.pro @@ -1,6 +1,6 @@ # Head project for drape develop and debuging ROOT_DIR = .. -DEPENDENCIES = drape_frontend map anim drape indexer platform geometry coding base expat protobuf jansson zlib fribidi tomcrypt +DEPENDENCIES = map drape_frontend anim drape indexer platform geometry coding base expat protobuf jansson zlib fribidi tomcrypt include($$ROOT_DIR/common.pri) diff --git a/drape_head/drape_surface.cpp b/drape_head/drape_surface.cpp index b084ddcf5e..712f7a54ae 100644 --- a/drape_head/drape_surface.cpp +++ b/drape_head/drape_surface.cpp @@ -1,6 +1,9 @@ #include "drape_surface.hpp" #include "../drape_frontend/viewport.hpp" +#include "../drape_frontend/map_data_provider.hpp" + +#include "../platform/platform.hpp" #include "../drape/shader_def.hpp" @@ -15,16 +18,29 @@ DrapeSurface::DrapeSurface() : m_dragState(false) + , m_navigator(m_scales) , m_contextFactory(NULL) { setSurfaceType(QSurface::OpenGLSurface); QObject::connect(this, SIGNAL(heightChanged(int)), this, SLOT(sizeChanged(int))); QObject::connect(this, SIGNAL(widthChanged(int)), this, SLOT(sizeChanged(int))); + + ///{ Temporary initialization + m_model.InitClassificator(); + Platform::FilesList maps; + Platform & pl = GetPlatform(); + pl.GetFilesByExt(pl.WritableDir(), DATA_FILE_EXTENSION, maps); + + for_each(maps.begin(), maps.end(), bind(&model::FeaturesFetcher::AddMap, &m_model, _1)); + ///} + /// + m_navigator.LoadState(); } DrapeSurface::~DrapeSurface() { + m_navigator.SaveState(); m_drapeEngine.Destroy(); m_contextFactory.Destroy(); } @@ -40,6 +56,7 @@ void DrapeSurface::exposeEvent(QExposeEvent *e) dp::ThreadSafeFactory * factory = new dp::ThreadSafeFactory(new QtOGLContextFactory(this)); m_contextFactory = dp::MasterPointer(factory); CreateEngine(); + UpdateCoverage(); } } } @@ -53,7 +70,8 @@ void DrapeSurface::mousePressEvent(QMouseEvent * e) if (e->button() == Qt::LeftButton) { m2::PointF p = GetDevicePosition(e->pos()); - m_drapeEngine->DragStarted(p); + m_navigator.StartDrag(p, 0); + UpdateCoverage(); m_dragState = true; } } @@ -67,7 +85,8 @@ void DrapeSurface::mouseMoveEvent(QMouseEvent * e) if (m_dragState) { m2::PointF p = GetDevicePosition(e->pos()); - m_drapeEngine->Drag(p); + m_navigator.DoDrag(p, 0); + UpdateCoverage(); } } @@ -80,7 +99,8 @@ void DrapeSurface::mouseReleaseEvent(QMouseEvent * e) if (m_dragState) { m2::PointF p = GetDevicePosition(e->pos()); - m_drapeEngine->DragEnded(p); + m_navigator.StopDrag(p, 0, false); + UpdateCoverage(); m_dragState = false; } } @@ -89,7 +109,8 @@ void DrapeSurface::wheelEvent(QWheelEvent * e) { if (!m_dragState) { - m_drapeEngine->Scale(GetDevicePosition(e->pos()), exp(e->delta() / 360.0)); + m_navigator.ScaleToPoint(GetDevicePosition(e->pos()), exp(e->delta() / 360.0), 0); + UpdateCoverage(); } } @@ -99,14 +120,41 @@ void DrapeSurface::CreateEngine() float pixelRatio = devicePixelRatio(); - m_drapeEngine = dp::MasterPointer( - new df::DrapeEngine(f , pixelRatio, df::Viewport(pixelRatio, 0, 0, width(), height()))); + typedef df::MapDataProvider::TReadIDsFn TReadIDsFn; + typedef df::MapDataProvider::TReadFeaturesFn TReadFeaturesFn; + typedef df::MapDataProvider::TReadIdCallback TReadIdCallback; + typedef df::MapDataProvider::TReadFeatureCallback TReadFeatureCallback; + + TReadIDsFn idReadFn = [this](TReadIdCallback const & fn, m2::RectD const & r, int scale) + { + m_model.ForEachFeatureID(r, fn, scale); + }; + + TReadFeaturesFn featureReadFn = [this](TReadFeatureCallback const & fn, vector const & ids) + { + m_model.ReadFeatures(fn, ids); + }; + + m_drapeEngine = TEnginePrt(new df::DrapeEngine(f, df::Viewport(pixelRatio, 0, 0, width(), height()), + df::MapDataProvider(idReadFn, featureReadFn))); +} + +void DrapeSurface::UpdateCoverage() +{ + m_drapeEngine->UpdateCoverage(m_navigator.Screen()); } void DrapeSurface::sizeChanged(int) { if (!m_drapeEngine.IsNull()) + { + float vs = devicePixelRatio(); + int w = width() * vs; + int h = height() * vs; + m_navigator.OnSize(0, 0, w, h); m_drapeEngine->Resize(width(), height()); + UpdateCoverage(); + } } m2::PointF DrapeSurface::GetDevicePosition(QPoint const & p) diff --git a/drape_head/drape_surface.hpp b/drape_head/drape_surface.hpp index 57b4854a6f..c9b355dfa9 100644 --- a/drape_head/drape_surface.hpp +++ b/drape_head/drape_surface.hpp @@ -2,6 +2,10 @@ #include "qtoglcontextfactory.hpp" +#include "../map/feature_vec_model.hpp" +#include "../map/navigator.hpp" +#include "../map/scales_processor.hpp" + #include "../drape/batcher.hpp" #include "../drape/gpu_program_manager.hpp" #include "../drape/uniform_values_storage.hpp" @@ -33,6 +37,7 @@ protected: private: void CreateEngine(); + void UpdateCoverage(); Q_SLOT void sizeChanged(int); @@ -41,7 +46,13 @@ private: bool m_dragState; + ScalesProcessor m_scales; + model::FeaturesFetcher m_model; + Navigator m_navigator; + private: - dp::MasterPointer m_contextFactory; - dp::MasterPointer m_drapeEngine; + typedef dp::MasterPointer TContextFactoryPtr; + typedef dp::MasterPointer TEnginePrt; + TContextFactoryPtr m_contextFactory; + TEnginePrt m_drapeEngine; };