Async scene loading 34/93534/1
authorVarun <tallytalwar@gmail.com>
Mon, 24 Oct 2016 16:23:36 +0000 (12:23 -0400)
committerVarun <tallytalwar@gmail.com>
Mon, 24 Oct 2016 21:49:33 +0000 (17:49 -0400)
Map is ready when both the following conditions are met:
- scene is loaded
- canvas has a valid dimensions

Change-Id: I63435281d4793c373cfc6e69d7882cf90bbce3b8

src/mapzen/tangram_view.cpp
src/mapzen/tangram_view.hpp

index fed5035..f007c19 100644 (file)
@@ -127,7 +127,7 @@ mapzen_error_e TangramView::create(maps_view_h view, maps_plugin_map_view_ready_
        MAPS_LOGD("evas_gl_context_create() set PixelScale %f", scaleFactor);
        m_map->setPixelScale(scaleFactor);
 
-       m_map->loadScene(NORMAL_SCENE_FILE_PATH);
+       m_map->loadSceneAsync(NORMAL_SCENE_FILE_PATH, false, sceneLoadedCb, (void*)view);
 
        // Make the GL context current and perform GL setup.
        evas_gl_make_current(m_gl, m_surface, m_context);
@@ -135,7 +135,7 @@ mapzen_error_e TangramView::create(maps_view_h view, maps_plugin_map_view_ready_
 
        m_map->resize(m_w, m_h);
 
-       if (m_w > 1 && m_h > 1) {
+       if (m_sceneLoaded && m_w > 1 && m_h > 1) {
                readyMapCb((void*)view);
        }
 
@@ -194,6 +194,7 @@ mapzen_error_e TangramView::destroy(maps_view_h view)
        }
 
        m_isInitialized = false;
+       m_sceneLoaded = false;
 
        if (m_image) {
                evas_object_image_pixels_get_callback_set(m_image, nullptr, nullptr);
@@ -249,7 +250,7 @@ mapzen_error_e TangramView::render(maps_view_h view, const maps_coordinates_h co
        m_h = MAX(m_h, 1);
 
        if (x != m_x || y != m_y || w != m_w || h != m_h) {
-               if ( (m_w <= 1 || m_h <= 1) && w > 1 && h > 1) {
+               if ( (m_w <= 1 || m_h <= 1) && w > 1 && h > 1 && m_sceneLoaded) {
                        // Send a tangram view ready callback when we have a legit canvas size
                        readyMapCb((void*)view);
                }
@@ -869,7 +870,7 @@ void TangramView::setMapType(maps_view_h view)
                                return;
                }
                m_viewType = newViewType;
-               m_map->loadScene(newSceneFile);
+               m_map->loadSceneAsync(newSceneFile, false, sceneLoadedCb, (void*)view);
        }
 
        bool buildings_enabled = false;
@@ -907,11 +908,25 @@ void TangramView::setMapType(maps_view_h view)
        m_map->applySceneUpdates();
 }
 
+void TangramView::sceneLoadedCb(void *data) {
+       TangramView *tv = nullptr;
+       int maps_error = maps_view_get_maps_plugin_view_handle((maps_view_h)data, (void**)&tv);
+       if (maps_error != MAPS_ERROR_NONE || !tv) { return; }
+
+       // only do this for first scene load not for any sceneUpdates
+       if (!tv->isSceneLoaded()) {
+               if (tv->getWidth() > 1 && tv->getHeight() > 1) {
+                       readyMapCb(data);
+               }
+               tv->setSceneLoaded(true);
+       }
+}
+
 void TangramView::readyMapCb(void *data)
 {
        TangramView *tv = nullptr;
        int maps_error = maps_view_get_maps_plugin_view_handle((maps_view_h)data, (void**)&tv);
-       if (maps_error != MAPS_ERROR_NONE || !tv) return;
+       if (maps_error != MAPS_ERROR_NONE || !tv) { return; }
 
        if (tv->m_readyCb) {
                tv->m_readyCb(data);
index 1e439f9..49fddd9 100644 (file)
@@ -58,6 +58,12 @@ public:
        static void initNetworkRequests();
        static void deinitNetworkRequests();
 
+       int getWidth() { return m_w; }
+       int getHeight() { return m_h; }
+
+       void setSceneLoaded(bool sceneLoaded) { m_sceneLoaded = sceneLoaded; }
+       bool isSceneLoaded() { return m_sceneLoaded; }
+
 private:
        mapzen_error_e setupOpenGlSurface(maps_view_h view);
        void setMapType(maps_view_h view);
@@ -74,6 +80,7 @@ private:
        std::mutex& viewObjectMutex() { return m_viewObjectMutex; }
        void removeAllObjects();
 
+       static void sceneLoadedCb(void *data);
        static void readyMapCb(void *view);
        static void renderingCb(void *data);
        static void pixelGetCb(void *data, Evas_Object *obj);
@@ -91,6 +98,7 @@ private:
        bool m_isInitialized = false;
        bool m_publicTransitEnabled = false;
        bool m_buildingsEnabled = true;
+       bool m_sceneLoaded = false;
        std::string m_language = "eng";
 
        int m_x = 0;