void MapView::setDrawMinimapColors(bool enable) { if(m_drawMinimapColors == enable) return; m_drawMinimapColors = enable; updateGeometry(m_visibleDimension, m_optimizedSize); requestVisibleTilesCacheUpdate(); m_smooth = !enable; m_framebuffer->setSmooth(m_smooth); }
void MapView::move(int x, int y) { m_moveOffset.x += x; m_moveOffset.y += y; int32_t tmp = m_moveOffset.x / 32; bool requestTilesUpdate = false; if(tmp != 0) { m_customCameraPosition.x += tmp; m_moveOffset.x %= 32; requestTilesUpdate = true; } tmp = m_moveOffset.y / 32; if(tmp != 0) { m_customCameraPosition.y += tmp; m_moveOffset.y %= 32; requestTilesUpdate = true; } if(requestTilesUpdate) requestVisibleTilesCacheUpdate(); }
void MapView::setCameraPosition(const Position& pos) { m_follow = false; m_customCameraPosition = pos; requestVisibleTilesCacheUpdate(); }
void MapView::followCreature(const CreaturePtr& creature) { m_follow = true; m_followingCreature = creature; requestVisibleTilesCacheUpdate(); }
void MapView::setViewMode(MapView::ViewMode viewMode) { m_viewMode = viewMode; requestVisibleTilesCacheUpdate(); }
void MapView::unlockFirstVisibleFloor() { m_lockedFirstVisibleFloor = -1; requestVisibleTilesCacheUpdate(); }
void MapView::lockFirstVisibleFloor(int firstVisibleFloor) { m_lockedFirstVisibleFloor = firstVisibleFloor; requestVisibleTilesCacheUpdate(); }
void MapView::onMapCenterChange(const Position& pos) { requestVisibleTilesCacheUpdate(); }
void MapView::onTileUpdate(const Position& pos) { if(!m_drawMinimapColors) requestVisibleTilesCacheUpdate(); }
void MapView::updateGeometry(const Size& visibleDimension, const Size& optimizedSize) { int tileSize = 0; Size bufferSize; if(!m_drawMinimapColors) { int possiblesTileSizes[] = {1,2,4,8,16,32}; for(int candidateTileSize : possiblesTileSizes) { bufferSize = (visibleDimension + Size(3,3)) * candidateTileSize; if(bufferSize.width() > g_graphics.getMaxTextureSize() || bufferSize.height() > g_graphics.getMaxTextureSize()) break; tileSize = candidateTileSize; if(optimizedSize.width() < bufferSize.width() - 3*candidateTileSize && optimizedSize.height() < bufferSize.height() - 3*candidateTileSize) break; } if(tileSize == 0) { g_logger.traceError("reached max zoom out"); return; } } else { tileSize = 1; bufferSize = visibleDimension + Size(3,3); } Size drawDimension = visibleDimension + Size(3,3); Point virtualCenterOffset = (drawDimension/2 - Size(1,1)).toPoint(); Point visibleCenterOffset = virtualCenterOffset; ViewMode viewMode = m_viewMode; if(m_autoViewMode) { if(tileSize >= 32 && visibleDimension.area() <= NEAR_VIEW_AREA) viewMode = NEAR_VIEW; else if(tileSize >= 16 && visibleDimension.area() <= MID_VIEW_AREA) viewMode = MID_VIEW; else if(tileSize >= 8 && visibleDimension.area() <= FAR_VIEW_AREA) viewMode = FAR_VIEW; else viewMode = HUGE_VIEW; if(viewMode >= FAR_VIEW) m_multifloor = false; else m_multifloor = true; } // draw actually more than what is needed to avoid massive recalculations on huge views /* if(viewMode >= HUGE_VIEW) { Size oldDimension = drawDimension; drawDimension = (m_framebuffer->getSize() / tileSize); virtualCenterOffset += (drawDimension - oldDimension).toPoint() / 2; } */ m_viewMode = viewMode; m_visibleDimension = visibleDimension; m_drawDimension = drawDimension; m_tileSize = tileSize; m_virtualCenterOffset = virtualCenterOffset; m_visibleCenterOffset = visibleCenterOffset; m_optimizedSize = optimizedSize; m_framebuffer->resize(bufferSize); requestVisibleTilesCacheUpdate(); }
void MapView::onTileUpdate(const Position& pos) { requestVisibleTilesCacheUpdate(); }