cache rendering of UILabel

This commit is contained in:
Eduardo Bart 2012-01-17 03:36:25 -02:00
parent e701cce5fd
commit 7bcf7f536e
15 changed files with 124 additions and 87 deletions

107
TODO
View File

@ -1,26 +1,20 @@
====================================================
High priority TODO in order (before first public disclose)
[bart] chat with tabs
[bart] scrollbar
[bart] scrollable widgets
[bart] complete miniwindow (close, minimize, resize)
[bart] move windows
[bart] add top menu buttons
[bart] console scrolling
[bart] modules managment interface
[bart] adjust interface design
[baxnie] display exit box when exiting from game
[baxnie] auto walk
[baxnie] attack modes
[baxnie] player status icons (poison, etc)
[baxnie] container windows
[baxnie] move items
[baxnie] use with
[baxnie] hotkeys window
[baxnie] trade window
[baxnie] battle list
termiante chat
scrollbar
scrollable widgets
complete miniwindow (close, minimize, resize, move)
move windows
add top menu buttons
modules managment interface
adjust interface design
display exit box when exiting from game
attack modes
player status icons (poison, etc)
container windows
move items
use with
@ -28,25 +22,27 @@ High priority TODO in order (before first public disclose)
Low priority TODO
== Core
[bart] review directories loading search
[bart] load modules from zip packages
[bart] create a class for reading binary files
[bart] rework lua/c++ logger
[bart] make protocol class compatible with old tibia protocols
review directories loading search
load modules from zip packages
create a class for reading binary files
rework lua/c++ logger
ake protocol class compatible with old tibia protocols
== Graphics
[bart] use CoordsBuffer in font
[bart] cache renders into framebuffers
[bart] use hardware buffer
[bart] use indices
use CoordsBuffer in font
cache renders into framebuffers
use hardware buffer
use indices
fix opacity and cached framebuffers conflict
== Lua
[bart] make possible to bind non LuaObject derived classes on lua engine (for usage with Point,Rect,Color,Size)
[bart] review usage of x,y/width,height in lua instead of point/size
make possible to bind non LuaObject derived classes on lua engine (for usage with Point,Rect,Color,Size)
review usage of x,y/width,height in lua instead of point/size
== Platform
[bart] port to MacOs and iphone
port to MacOs and iphone
change win32 mouse cursor icon
rework win32 key input system
== UI
[bart] fix massive hotkeys when holding down a key
@ -66,26 +62,29 @@ change win32 mouse cursor icon
[bart] make api to enable/disable capture of events to avoid massive event processing
[bart] review style apply system
== Client modules
[bart] make possible to reload modules
== Client
[bart] implement left panel with dragging windows
[bart] clean sprites cache periodically
[bart] create a shader manager
[bart] find a way to load map rendering styles
[bart] move redering of creatures names, skulls, etc to UI
[bart] cache screen creatures in a list on map
[bart] handle corrupt errors in dat/spr
[bart] remake spr/dat using OTML and image files
[bart] rework map tile rendering (cache visible tiles, etc)
[bart] minimap window
[bart] draw lights using shaders
[bart] limit FPS in options
[bart] resize map, right panel
[baxnie] do lua game event calls from Game instead from GameProtocol
[baxnie] login queue
[baxnie] questlog
[baxnie] edit texts
[baxnie] ignore list
[baxnie] viplist marks
make possible to reload modules
terminal/console scrolling
auto walk
hotkeys window
trade window
battle list
implement left panel with dragging windows
clean sprites cache periodically
create a shader manager
find a way to load map rendering styles
move redering of creatures names, skulls, etc to UI
cache screen creatures in a list on map
handle corrupt errors in dat/spr
remake spr/dat using OTML and image files
rework map tile rendering (cache visible tiles, etc)
minimap window
draw lights using shaders
limit FPS in options
resize map, right panel
do lua game event calls from Game instead from GameProtocol
login queue
questlog
edit texts
ignore list
viplist marks

View File

@ -1,6 +1,6 @@
Client = {}
local function setupWindow()
function Client.init()
g_window.show()
g_window.setMinimumSize({ width = 600, height = 480 })
@ -29,11 +29,8 @@ local function setupWindow()
g_window.setIcon(resolvepath('clienticon.png'))
end
function Client.init()
setupWindow()
end
function Client.terminate()
-- save window configs
Settings.set('window-size', g_window.getUnmaximizedSize())
Settings.set('window-pos', g_window.getUnmaximizedPos())
Settings.set('window-maximized', g_window.isMaximized())

View File

@ -8,5 +8,5 @@ Module
require 'options'
Options.init()
onUnload:
onUnload: |
Options.terminate()

View File

@ -55,8 +55,8 @@ local function onWidgetStyleApply(widget, styleName, styleNode)
end
end
--connect(UIWidget, { onStyleApply = onWidgetStyleApply,
-- onHoverChange = onWidgetHoverChange})
connect(UIWidget, { onStyleApply = onWidgetStyleApply,
onHoverChange = onWidgetHoverChange})
-- UIWidget extensions
function UIWidget:setTooltip(text)

View File

@ -42,6 +42,9 @@ FrameBuffer::~FrameBuffer()
void FrameBuffer::resize(const Size& size)
{
if(m_texture && m_texture->getSize() == size)
return;
internalBind();
m_texture = TexturePtr(new Texture(size.width(), size.height(), 4));
m_texture->setSmooth(true);

View File

@ -131,8 +131,8 @@ void Painter::setCompositionMode(Painter::CompositionMode compositionMode)
case CompositionMode_Multiply:
glBlendFunc(GL_DST_COLOR, GL_ONE_MINUS_SRC_ALPHA);
break;
case CompositionMode_Addition:
glBlendFunc(GL_SRC_ALPHA, GL_ONE);
case CompositionMode_Add:
glBlendFunc(GL_ONE, GL_ONE);
break;
}
}

View File

@ -34,7 +34,7 @@ public:
enum CompositionMode {
CompositionMode_Normal,
CompositionMode_Multiply,
CompositionMode_Addition
CompositionMode_Add
};
void init();
@ -57,6 +57,7 @@ public:
void setCustomProgram(PainterShaderProgramPtr program);
void releaseCustomProgram() { m_customProgram = nullptr; }
void setCompositionMode(CompositionMode compositionMode);
void resetCompositionMode() { setCompositionMode(CompositionMode_Normal); }
void setProjectionMatrix(const Matrix3& projectionMatrix) { m_projectionMatrix = projectionMatrix; }
Matrix3 getProjectionMatrix() { return m_projectionMatrix; }

View File

@ -163,7 +163,7 @@ bool ParticleEmitter::load(const OTMLNodePtr& node)
else if(childNode->value() == "multiply")
m_pCompositionMode = Painter::CompositionMode_Multiply;
else if(childNode->value() == "addition")
m_pCompositionMode = Painter::CompositionMode_Addition;
m_pCompositionMode = Painter::CompositionMode_Add;
}
}

View File

@ -704,6 +704,7 @@ void X11Window::poll()
break;
case UnmapNotify:
m_visible = false;
releaseAllKeys();
break;
case FocusIn:
m_focused = true;

View File

@ -407,6 +407,10 @@ private:
void initText();
void parseTextStyle(const OTMLNodePtr& styleNode);
Boolean<true> m_textMustRecache;
FrameBufferPtr m_textFramebuffer;
Size m_textCachedBoxSize;
protected:
void drawText(const Rect& screenCoords);
@ -423,8 +427,8 @@ public:
void clearText() { setText(""); }
void setText(const std::string& text);
void setTextAlign(Fw::AlignmentFlag align) { m_textAlign = align; }
void setTextOffset(const Point& offset) { m_textOffset = offset; }
void setTextAlign(Fw::AlignmentFlag align) { m_textAlign = align; m_textMustRecache = true; }
void setTextOffset(const Point& offset) { m_textOffset = offset; m_textMustRecache = true; }
void setFont(const std::string& fontName);
std::string getText() { return m_text; }

View File

@ -24,6 +24,7 @@
#include "uitranslator.h"
#include <framework/graphics/fontmanager.h>
#include <framework/graphics/painter.h>
#include <framework/graphics/framebuffer.h>
void UIWidget::initText()
{
@ -47,12 +48,30 @@ void UIWidget::parseTextStyle(const OTMLNodePtr& styleNode)
void UIWidget::drawText(const Rect& screenCoords)
{
g_painter.setColor(m_color);
if(m_text.length() > 0 && m_color.a() > 0) {
Rect textRect = screenCoords;
textRect.translate(m_textOffset);
m_font->renderText(m_text, textRect, m_textAlign, m_color);
if(m_text.length() == 0 || m_color.a() == 0)
return;
Size boxSize = screenCoords.size();
if(boxSize != m_textCachedBoxSize || m_textMustRecache) {
if(!m_textFramebuffer)
m_textFramebuffer = FrameBufferPtr(new FrameBuffer(boxSize));
else
m_textFramebuffer->resize(boxSize);
m_textFramebuffer->bind();
Rect virtualTextRect(0, 0, boxSize);
virtualTextRect.translate(m_textOffset);
g_painter.setCompositionMode(Painter::CompositionMode_Add);
m_font->renderText(m_text, virtualTextRect, m_textAlign, Fw::white);
g_painter.resetCompositionMode();
m_textFramebuffer->release();
m_textMustRecache = false;
m_textCachedBoxSize = boxSize;
}
g_painter.setColor(m_color);
m_textFramebuffer->draw(screenCoords);
}
void UIWidget::onTextChange(const std::string& text)
@ -67,26 +86,29 @@ void UIWidget::onFontChange(const std::string& font)
void UIWidget::setText(const std::string& text)
{
if(m_text != text) {
m_text = text;
if(m_text == text)
return;
// update rect size
if(!m_rect.isValid()) {
Size textSize = m_font->calculateTextRectSize(m_text);
Size newSize = getSize();
if(newSize.width() <= 0)
newSize.setWidth(textSize.width());
if(newSize.height() <= 0)
newSize.setHeight(textSize.height());
setSize(newSize);
}
m_text = text;
onTextChange(text);
// update rect size
if(!m_rect.isValid()) {
Size textSize = m_font->calculateTextRectSize(m_text);
Size newSize = getSize();
if(newSize.width() <= 0)
newSize.setWidth(textSize.width());
if(newSize.height() <= 0)
newSize.setHeight(textSize.height());
setSize(newSize);
}
onTextChange(text);
m_textMustRecache = true;
}
void UIWidget::setFont(const std::string& fontName)
{
m_font = g_fonts.getFont(fontName);
onFontChange(fontName);
m_textMustRecache = true;
}

View File

@ -162,7 +162,7 @@ void Game::processWalkCancel(Otc::Direction direction)
void Game::walk(Otc::Direction direction)
{
if(!isOnline() || isDead() || !checkBotProtection())
if(!isOnline() || !m_localPlayer->isKnown() || isDead() || !checkBotProtection())
return;
if(m_localPlayer->isFollowing())

View File

@ -39,6 +39,9 @@ bool LocalPlayer::canWalk(Otc::Direction direction)
// check for blockable tiles in the walk direction
TilePtr tile = g_map.getTile(m_pos + Position::getPosFromDirection(direction));
if(!tile)
return false;
if(!tile->isWalkable()) {
g_game.processTextMessage("statusSmall", "Sorry, not possible.");
return false;

View File

@ -34,6 +34,7 @@ public:
void setAttackingCreature(const CreaturePtr& creature);
void setFollowingCreature(const CreaturePtr& creature);
void setIcons(Otc::PlayerIcons icons) { m_icons = icons; }
void setKnown(bool known) { m_known = known; }
bool getCanReportBugs() { return m_canReportBugs; }
int getSkill(Otc::Skill skill, Otc::SkillType skillType) { return m_skills[skill][skillType]; }
@ -42,6 +43,7 @@ public:
CreaturePtr getFollowingCreature() { return m_followingCreature; }
Otc::PlayerIcons getIcons() { return m_icons; }
bool isKnown() { return m_known; }
bool isAttacking() { return m_attackingCreature != nullptr; }
bool isFollowing() { return m_followingCreature != nullptr; }
@ -65,6 +67,7 @@ public:
private:
bool m_canReportBugs;
bool m_known;
CreaturePtr m_attackingCreature, m_followingCreature;
Otc::PlayerIcons m_icons;
int m_skills[Otc::LastSkill][Otc::LastSkillType];

View File

@ -1142,6 +1142,10 @@ ThingPtr ProtocolGame::internalGetThing(InputMessage& msg)
creature->setEmblem(emblem);
creature->setPassable(passable);
creature->cancelWalk(direction);
if(creature == m_localPlayer) {
m_localPlayer->setKnown(true);
}
}
thing = creature;