30 #include "video/renderbackend.h"
31 #include "util/math/fife_math.h"
32 #include "util/log/logger.h"
33 #include "video/fonts/abstractfont.h"
34 #include "video/image.h"
35 #include "model/structures/instance.h"
36 #include "model/structures/layer.h"
37 #include "model/structures/location.h"
39 #include "view/visual.h"
40 #include "view/camera.h"
41 #include "floatingtextrenderer.h"
45 static Logger _log(LM_VIEWVIEW);
48 FloatingTextRenderer::FloatingTextRenderer(RenderBackend* renderbackend,
int position, AbstractFont* font):
49 RendererBase(renderbackend, position),
50 m_renderbackend(renderbackend),
54 m_color = m_font->getColor();
57 FloatingTextRenderer::FloatingTextRenderer(
const FloatingTextRenderer& old):
59 m_renderbackend(old.m_renderbackend),
61 m_font_color(old.m_font_color),
62 m_color(old.m_color) {
64 m_font_color = m_background = m_backborder =
false;
67 RendererBase* FloatingTextRenderer::clone() {
68 return new FloatingTextRenderer(*
this);
71 FloatingTextRenderer::~FloatingTextRenderer() {
74 void FloatingTextRenderer::render(Camera* cam, Layer* layer, RenderList& instances) {
79 RenderList::const_iterator instance_it = instances.begin();
80 const std::string* saytext = NULL;
81 unsigned int lm = m_renderbackend->getLightingModel();
82 SDL_Color old_color = m_font->getColor();
84 m_font->setColor(m_color.r, m_color.g, m_color.b, m_color.unused);
87 m_renderbackend->disableLighting();
88 m_renderbackend->setStencilTest(255, 2, 7);
89 m_renderbackend->setAlphaTest(0.0);
91 for (;instance_it != instances.end(); ++instance_it) {
92 Instance* instance = (*instance_it)->instance;
93 saytext = instance->getSayText();
95 const Rect& ir = (*instance_it)->dimensions;
96 Image* img = m_font->getAsImageMultiline(*saytext);
98 r.
x = (ir.x + ir.w/2) - img->getWidth()/2;
99 r.y = ir.y- img->getHeight();
100 r.w = img->getWidth();
101 r.h = img->getHeight();
103 if(m_background || m_backborder) {
104 const int overdraw = 5;
106 Point p = Point(r.x-overdraw, r.y-overdraw);
109 m_renderbackend->fillRectangle(p, r.w+2*overdraw, r.h+2*overdraw, m_backcolor.r, m_backcolor.g, m_backcolor.b, m_backcolor.unused);
113 m_renderbackend->drawRectangle(p, r.w+2*overdraw, r.h+2*overdraw, m_backbordercolor.r, m_backbordercolor.g, m_backbordercolor.b, m_backbordercolor.unused);
120 m_renderbackend->disableAlphaTest();
121 m_renderbackend->disableStencilTest();
122 m_renderbackend->enableLighting();
125 m_font->setColor(old_color.r, old_color.g, old_color.b, old_color.unused);
129 void FloatingTextRenderer::setColor(uint8_t r, uint8_t g, uint8_t b, uint8_t a) {
138 void FloatingTextRenderer::setBackground(uint8_t br, uint8_t bg, uint8_t bb, uint8_t ba) {
142 m_backcolor.unused = ba;
147 void FloatingTextRenderer::setBorder(uint8_t bbr, uint8_t bbg, uint8_t bbb, uint8_t bba) {
148 m_backbordercolor.r = bbr;
149 m_backbordercolor.g = bbg;
150 m_backbordercolor.b = bbb;
151 m_backbordercolor.unused = bba;
156 void FloatingTextRenderer::resetBackground() {
157 m_background =
false;
160 void FloatingTextRenderer::resetBorder() {
161 m_backborder =
false;
164 FloatingTextRenderer* FloatingTextRenderer::getInstance(IRendererContainer* cnt) {
165 return dynamic_cast<FloatingTextRenderer*
>(cnt->getRenderer(
"FloatingTextRenderer"));