From f389c3b3fe04f91291a1048a5becea60c5ef80d9 Mon Sep 17 00:00:00 2001 From: Eduardo Bart Date: Sat, 19 Jan 2013 14:44:07 -0200 Subject: [PATCH] Widgets can now rotate :O --- src/client/localplayer.cpp | 5 +++-- src/framework/graphics/painter.cpp | 13 +++++++++++++ src/framework/graphics/painter.h | 4 ++++ src/framework/graphics/texturemanager.cpp | 4 +++- src/framework/luafunctions.cpp | 3 +++ src/framework/ui/uiwidget.cpp | 8 ++++++++ src/framework/ui/uiwidget.h | 4 ++++ src/framework/ui/uiwidgetbasestyle.cpp | 3 +++ 8 files changed, 41 insertions(+), 3 deletions(-) diff --git a/src/client/localplayer.cpp b/src/client/localplayer.cpp index fdb9fe90..556d3550 100644 --- a/src/client/localplayer.cpp +++ b/src/client/localplayer.cpp @@ -61,13 +61,14 @@ void LocalPlayer::draw(const Point& dest, float scaleFactor, bool animate, Light { Creature::draw(dest, scaleFactor, animate, lightView); - // This is a test to rotation, translate and scale transformations. /* + // This is a test to rotation, translate and scale transformations. Point rotateOffset = dest; rotateOffset += ((animate ? m_walkOffset : Point(0,0)) + Point(16,16)) * scaleFactor; + g_painter->pushTransformMatrix(); g_painter->rotate(rotateOffset, Fw::pi * std::sin(g_clock.millis()/1000.0f)); Creature::draw(dest, scaleFactor, animate, lightView); - g_painter->resetTransformMatrix(); + g_painter->popTransformMatrix(); */ } diff --git a/src/framework/graphics/painter.cpp b/src/framework/graphics/painter.cpp index 38dcd80c..e4e2b3ba 100644 --- a/src/framework/graphics/painter.cpp +++ b/src/framework/graphics/painter.cpp @@ -226,6 +226,19 @@ void Painter::rotate(float x, float y, float angle) translate(x, y); } +void Painter::pushTransformMatrix() +{ + m_transformMatrixStack.push_back(m_transformMatrix); + assert(m_transformMatrixStack.size() < 100); +} + +void Painter::popTransformMatrix() +{ + assert(m_transformMatrixStack.size() > 0); + setTransformMatrix(m_transformMatrixStack.back()); + m_transformMatrixStack.pop_back(); +} + void Painter::updateGlTexture() { if(m_glTextureId != 0) diff --git a/src/framework/graphics/painter.h b/src/framework/graphics/painter.h index 52f96917..ffa868c1 100644 --- a/src/framework/graphics/painter.h +++ b/src/framework/graphics/painter.h @@ -106,6 +106,9 @@ public: void rotate(float x, float y, float angle); void rotate(const Point& p, float angle) { rotate(p.x, p.y, angle); } + void pushTransformMatrix(); + void popTransformMatrix(); + Matrix3 getTransformMatrix() { return m_transformMatrix; } Matrix3 getProjectionMatrix() { return m_projectionMatrix; } Matrix3 getTextureMatrix() { return m_textureMatrix; } @@ -137,6 +140,7 @@ protected: CoordsBuffer m_coordsBuffer; + std::vector m_transformMatrixStack; Matrix3 m_transformMatrix; Matrix3 m_projectionMatrix; Matrix3 m_textureMatrix; diff --git a/src/framework/graphics/texturemanager.cpp b/src/framework/graphics/texturemanager.cpp index 42f69841..88670ebd 100644 --- a/src/framework/graphics/texturemanager.cpp +++ b/src/framework/graphics/texturemanager.cpp @@ -89,8 +89,10 @@ TexturePtr TextureManager::getTexture(const std::string& fileName) texture = g_textures.getEmptyTexture(); } - if(texture) + if(texture) { + texture->setSmooth(true); m_textures[filePath] = texture; + } } return texture; diff --git a/src/framework/luafunctions.cpp b/src/framework/luafunctions.cpp index 0abd2db1..88bca32e 100644 --- a/src/framework/luafunctions.cpp +++ b/src/framework/luafunctions.cpp @@ -399,6 +399,7 @@ void Application::registerLuaFunctions() g_lua.bindClassMemberFunction("backwardsGetWidgetById", &UIWidget::backwardsGetWidgetById); g_lua.bindClassMemberFunction("resize", &UIWidget::resize); g_lua.bindClassMemberFunction("move", &UIWidget::move); + g_lua.bindClassMemberFunction("rotate", &UIWidget::rotate); g_lua.bindClassMemberFunction("hide", &UIWidget::hide); g_lua.bindClassMemberFunction("show", &UIWidget::show); g_lua.bindClassMemberFunction("disable", &UIWidget::disable); @@ -493,6 +494,7 @@ void Application::registerLuaFunctions() g_lua.bindClassMemberFunction("setPaddingBottom", &UIWidget::setPaddingBottom); g_lua.bindClassMemberFunction("setPaddingLeft", &UIWidget::setPaddingLeft); g_lua.bindClassMemberFunction("setOpacity", &UIWidget::setOpacity); + g_lua.bindClassMemberFunction("setRotation", &UIWidget::setRotation); g_lua.bindClassMemberFunction("getX", &UIWidget::getX); g_lua.bindClassMemberFunction("getY", &UIWidget::getY); g_lua.bindClassMemberFunction("getPosition", &UIWidget::getPosition); @@ -535,6 +537,7 @@ void Application::registerLuaFunctions() g_lua.bindClassMemberFunction("getPaddingBottom", &UIWidget::getPaddingBottom); g_lua.bindClassMemberFunction("getPaddingLeft", &UIWidget::getPaddingLeft); g_lua.bindClassMemberFunction("getOpacity", &UIWidget::getOpacity); + g_lua.bindClassMemberFunction("getRotation", &UIWidget::getRotation); g_lua.bindClassMemberFunction("setImageSource", &UIWidget::setImageSource); g_lua.bindClassMemberFunction("setImageClip", &UIWidget::setImageClip); g_lua.bindClassMemberFunction("setImageOffsetX", &UIWidget::setImageOffsetX); diff --git a/src/framework/ui/uiwidget.cpp b/src/framework/ui/uiwidget.cpp index e12c219e..15fa22e9 100644 --- a/src/framework/ui/uiwidget.cpp +++ b/src/framework/ui/uiwidget.cpp @@ -58,6 +58,11 @@ void UIWidget::draw(const Rect& visibleRect, Fw::DrawPane drawPane) if(m_clipping) g_painter->setClipRect(visibleRect); + if(m_rotation != 0.0f) { + g_painter->pushTransformMatrix(); + g_painter->rotate(m_rect.center(), m_rotation * (Fw::pi / 180.0)); + } + drawSelf(drawPane); if(m_children.size() > 0) { @@ -67,6 +72,9 @@ void UIWidget::draw(const Rect& visibleRect, Fw::DrawPane drawPane) drawChildren(visibleRect, drawPane); } + if(m_rotation != 0.0f) + g_painter->popTransformMatrix(); + if(m_clipping) g_painter->resetClipRect(); } diff --git a/src/framework/ui/uiwidget.h b/src/framework/ui/uiwidget.h index 3568aa78..96873294 100644 --- a/src/framework/ui/uiwidget.h +++ b/src/framework/ui/uiwidget.h @@ -214,6 +214,7 @@ protected: public: void resize(int width, int height) { setRect(Rect(getPosition(), Size(width, height))); } void move(int x, int y) { setRect(Rect(x, y, getSize())); } + void rotate(float degrees) { setRotation(degrees); } void hide() { setVisible(false); } void show() { setVisible(true); } void disable() { setEnabled(false); } @@ -287,6 +288,7 @@ protected: EdgeGroup m_margin; EdgeGroup m_padding; float m_opacity; + float m_rotation; int m_autoRepeatDelay; Point m_lastClickPosition; @@ -342,6 +344,7 @@ public: void setPaddingBottom(int padding) { m_padding.bottom = padding; updateLayout(); } void setPaddingLeft(int padding) { m_padding.left = padding; updateLayout(); } void setOpacity(float opacity) { m_opacity = std::min(std::max(opacity, 0.0f), 1.0f); } + void setRotation(float degrees) { m_rotation = degrees; } int getX() { return m_rect.x(); } int getY() { return m_rect.y(); } @@ -385,6 +388,7 @@ public: int getPaddingBottom() { return m_padding.bottom; } int getPaddingLeft() { return m_padding.left; } float getOpacity() { return m_opacity; } + float getRotation() { return m_rotation; } // image diff --git a/src/framework/ui/uiwidgetbasestyle.cpp b/src/framework/ui/uiwidgetbasestyle.cpp index cf4ce8ef..2c2483b3 100644 --- a/src/framework/ui/uiwidgetbasestyle.cpp +++ b/src/framework/ui/uiwidgetbasestyle.cpp @@ -38,6 +38,7 @@ void UIWidget::initBaseStyle() m_iconColor = Color::white; m_color = Color::white; m_opacity = 1.0f; + m_rotation = 0.0f; m_iconAlign = Fw::AlignNone; // generate an unique id, this is need because anchored layouts find widgets by id @@ -107,6 +108,8 @@ void UIWidget::parseBaseStyle(const OTMLNodePtr& styleNode) setIconAlign(Fw::translateAlignment(node->value())); else if(node->tag() == "opacity") setOpacity(node->value()); + else if(node->tag() == "rotation") + setRotation(node->value()); else if(node->tag() == "enabled") setEnabled(node->value()); else if(node->tag() == "visible")