void setScene(std::shared_ptr<Scene>& _scene) { { std::lock_guard<std::mutex> lock(m_sceneMutex); m_scene = _scene; } auto& camera = m_scene->camera(); m_view->setCameraType(camera.type); switch (camera.type) { case CameraType::perspective: m_view->setVanishingPoint(camera.vanishingPoint.x, camera.vanishingPoint.y); if (camera.fovStops) { m_view->setFieldOfViewStops(camera.fovStops); } else { m_view->setFieldOfView(camera.fieldOfView); } break; case CameraType::isometric: m_view->setObliqueAxis(camera.obliqueAxis.x, camera.obliqueAxis.y); break; case CameraType::flat: break; } if (m_scene->useScenePosition) { glm::dvec2 projPos = m_view->getMapProjection().LonLatToMeters(m_scene->startPosition); m_view->setPosition(projPos.x, projPos.y); m_view->setZoom(m_scene->startZoom); } m_inputHandler->setView(m_view); m_tileManager->setDataSources(_scene->dataSources()); m_tileWorker->setScene(_scene); setPixelScale(m_view->pixelScale()); bool animated = m_scene->animated() == Scene::animate::yes; if (m_scene->animated() == Scene::animate::none) { for (const auto& style : m_scene->styles()) { animated |= style->isAnimated(); } } if (animated != isContinuousRendering()) { setContinuousRendering(animated); } }
void update(float _dt) { g_time += _dt; for (auto& ease : m_eases) { if (!ease.finished()) { ease.update(_dt); } } m_inputHandler->update(_dt); m_view->update(); { std::lock_guard<std::mutex> lock(m_tilesMutex); ViewState viewState { m_view->getMapProjection(), m_view->changedOnLastUpdate(), glm::dvec2{m_view->getPosition().x, -m_view->getPosition().y }, m_view->getZoom() }; m_tileManager->updateTileSets(viewState, m_view->getVisibleTiles()); bool updateLabels = m_labels->needUpdate(); auto& tiles = m_tileManager->getVisibleTiles(); if (m_view->changedOnLastUpdate() || m_tileManager->hasTileSetChanged()) { for (const auto& tile : tiles) { tile->update(_dt, *m_view); } updateLabels = true; } if (updateLabels) { auto& cache = m_tileManager->getTileCache(); m_labels->update(*m_view, _dt, m_scene->styles(), tiles, cache); } bool animated = false; for (const auto& style : m_scene->styles()) { if (style->isAnimated()) { animated = true; break; } } if (animated != isContinuousRendering()) { setContinuousRendering(animated); } } }
void update(float _dt) { g_time += _dt; m_inputHandler->update(_dt); m_view->update(); { std::lock_guard<std::mutex> lock(m_tilesMutex); m_tileManager->updateTileSets(); if (m_view->changedOnLastUpdate() || m_tileManager->hasTileSetChanged() || m_labels->needUpdate()) { auto& tiles = m_tileManager->getVisibleTiles(); for (const auto& tile : tiles) { tile->update(_dt, *m_view); } m_labels->update(*m_view, _dt, m_scene->styles(), tiles); } bool animated = false; for (const auto& style : m_scene->styles()) { if (style->isAnimated()) { animated = true; break; } } if (animated != isContinuousRendering()) { setContinuousRendering(animated); } } }