mirror of
https://github.com/edubart/otclient.git
synced 2025-10-15 03:54:54 +02:00
@@ -37,6 +37,7 @@
|
||||
#include <framework/core/eventdispatcher.h>
|
||||
#include <framework/core/application.h>
|
||||
#include <framework/core/resourcemanager.h>
|
||||
#include <boost/concept_check.hpp>
|
||||
|
||||
|
||||
enum {
|
||||
@@ -163,16 +164,8 @@ void MapView::draw(const Rect& rect)
|
||||
if(m_shaderSwitchDone && m_shader && m_fadeInTime > 0)
|
||||
fadeOpacity = std::min(m_fadeTimer.timeElapsed() / m_fadeInTime, 1.0f);
|
||||
|
||||
Point drawOffset = ((m_drawDimension - m_visibleDimension - Size(1,1)).toPoint()/2) * m_tileSize;
|
||||
if(isFollowingCreature())
|
||||
drawOffset += m_followingCreature->getWalkOffset() * scaleFactor;
|
||||
|
||||
Size srcSize = rect.size();
|
||||
Size srcVisible = m_visibleDimension * m_tileSize;
|
||||
srcSize.scale(srcVisible, Fw::KeepAspectRatio);
|
||||
drawOffset.x += (srcVisible.width() - srcSize.width()) / 2;
|
||||
drawOffset.y += (srcVisible.height() - srcSize.height()) / 2;
|
||||
Rect srcRect = Rect(drawOffset, srcSize);
|
||||
Rect srcRect = calcFramebufferSource(rect.size());
|
||||
Point drawOffset = srcRect.topLeft();
|
||||
|
||||
if(m_shader && g_painter->hasShaders() && g_graphics.shouldUseShaders() && m_viewMode == NEAR_VIEW) {
|
||||
Rect framebufferRect = Rect(0,0, m_drawDimension * m_tileSize);
|
||||
@@ -544,6 +537,49 @@ void MapView::setCameraPosition(const Position& pos)
|
||||
requestVisibleTilesCacheUpdate();
|
||||
}
|
||||
|
||||
Position MapView::getPosition(const Point& point, const Size& mapSize)
|
||||
{
|
||||
Position cameraPosition = getCameraPosition();
|
||||
|
||||
// if we have no camera, its impossible to get the tile
|
||||
if(!cameraPosition.isValid())
|
||||
return Position();
|
||||
|
||||
Rect srcRect = calcFramebufferSource(mapSize);
|
||||
float sh = srcRect.width() / (float)mapSize.width();
|
||||
float sv = srcRect.height() / (float)mapSize.height();
|
||||
|
||||
Point framebufferPos = Point(point.x * sh, point.y * sv);
|
||||
Point centerOffset = (framebufferPos + srcRect.topLeft()) / m_tileSize;
|
||||
|
||||
Point tilePos2D = getVisibleCenterOffset() - m_drawDimension.toPoint() + centerOffset + Point(2,2);
|
||||
if(tilePos2D.x + cameraPosition.x < 0 && tilePos2D.y + cameraPosition.y < 0)
|
||||
return Position();
|
||||
|
||||
Position position = Position(tilePos2D.x, tilePos2D.y, 0) + cameraPosition;
|
||||
|
||||
if(!position.isValid())
|
||||
return Position();
|
||||
|
||||
return position;
|
||||
}
|
||||
|
||||
Rect MapView::calcFramebufferSource(const Size& destSize)
|
||||
{
|
||||
float scaleFactor = m_tileSize/(float)Otc::TILE_PIXELS;
|
||||
Point drawOffset = ((m_drawDimension - m_visibleDimension - Size(1,1)).toPoint()/2) * m_tileSize;
|
||||
if(isFollowingCreature())
|
||||
drawOffset += m_followingCreature->getWalkOffset() * scaleFactor;
|
||||
|
||||
Size srcSize = destSize;
|
||||
Size srcVisible = m_visibleDimension * m_tileSize;
|
||||
srcSize.scale(srcVisible, Fw::KeepAspectRatio);
|
||||
drawOffset.x += (srcVisible.width() - srcSize.width()) / 2;
|
||||
drawOffset.y += (srcVisible.height() - srcSize.height()) / 2;
|
||||
|
||||
return Rect(drawOffset, srcSize);
|
||||
}
|
||||
|
||||
int MapView::calcFirstVisibleFloor()
|
||||
{
|
||||
int z = 7;
|
||||
|
@@ -107,9 +107,12 @@ public:
|
||||
void setShader(const PainterShaderProgramPtr& shader, float fadein, float fadeout);
|
||||
PainterShaderProgramPtr getShader() { return m_shader; }
|
||||
|
||||
Position getPosition(const Point& point, const Size& mapSize);
|
||||
|
||||
MapViewPtr asMapView() { return static_self_cast<MapView>(); }
|
||||
|
||||
private:
|
||||
Rect calcFramebufferSource(const Size& destSize);
|
||||
int calcFirstVisibleFloor();
|
||||
int calcLastVisibleFloor();
|
||||
Point transformPositionTo2D(const Position& position, const Position& relativePosition) {
|
||||
|
@@ -128,29 +128,7 @@ Position UIMap::getPosition(const Point& mousePos)
|
||||
return Position();
|
||||
|
||||
Point relativeMousePos = mousePos - m_mapRect.topLeft();
|
||||
Size visibleSize = getVisibleDimension() * m_mapView->getTileSize();
|
||||
Position cameraPosition = getCameraPosition();
|
||||
|
||||
// if we have no camera, its impossible to get the tile
|
||||
if(!cameraPosition.isValid())
|
||||
return Position();
|
||||
|
||||
float scaleFactor = m_mapView->getTileSize() / (float)Otc::TILE_PIXELS;
|
||||
float horizontalStretchFactor = visibleSize.width() / (float)m_mapRect.width();
|
||||
float verticalStretchFactor = visibleSize.height() / (float)m_mapRect.height();
|
||||
|
||||
Point tilePos2D = Point(relativeMousePos.x * horizontalStretchFactor, relativeMousePos.y * verticalStretchFactor);
|
||||
|
||||
if(m_mapView->isFollowingCreature())
|
||||
tilePos2D += getFollowingCreature()->getWalkOffset() * scaleFactor;
|
||||
tilePos2D /= m_mapView->getTileSize();
|
||||
|
||||
Point visibleCenterOffset = m_mapView->getVisibleCenterOffset();
|
||||
Position position = Position(1 + (int)tilePos2D.x - visibleCenterOffset.x, 1 + (int)tilePos2D.y - visibleCenterOffset.y, 0) + cameraPosition;
|
||||
if(!position.isValid())
|
||||
return Position();
|
||||
|
||||
return position;
|
||||
return m_mapView->getPosition(relativeMousePos, m_mapRect.size());
|
||||
}
|
||||
|
||||
TilePtr UIMap::getTile(const Point& mousePos)
|
||||
|
@@ -589,7 +589,7 @@ void UITextEdit::updateText()
|
||||
void UITextEdit::onHoverChange(bool hovered)
|
||||
{
|
||||
if(m_changeCursorImage) {
|
||||
if(hovered)
|
||||
if(hovered && !g_mouse.isCursorChanged())
|
||||
g_mouse.pushCursor("text");
|
||||
else
|
||||
g_mouse.popCursor("text");
|
||||
|
Reference in New Issue
Block a user