floatingtextrenderer.cpp
00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030 #include "video/renderbackend.h"
00031 #include "util/math/fife_math.h"
00032 #include "util/log/logger.h"
00033 #include "video/fonts/abstractfont.h"
00034 #include "video/image.h"
00035 #include "model/structures/instance.h"
00036 #include "model/structures/layer.h"
00037 #include "model/structures/location.h"
00038
00039 #include "view/visual.h"
00040 #include "view/camera.h"
00041 #include "floatingtextrenderer.h"
00042
00043
00044 namespace FIFE {
00045 static Logger _log(LM_VIEWVIEW);
00046
00047
00048 FloatingTextRenderer::FloatingTextRenderer(RenderBackend* renderbackend, int position, AbstractFont* font):
00049 RendererBase(renderbackend, position),
00050 m_renderbackend(renderbackend),
00051 m_font(font) {
00052 setEnabled(false);
00053 m_font_color = false;
00054 m_color = m_font->getColor();
00055 }
00056
00057 FloatingTextRenderer::FloatingTextRenderer(const FloatingTextRenderer& old):
00058 RendererBase(old),
00059 m_renderbackend(old.m_renderbackend),
00060 m_font(old.m_font),
00061 m_font_color(old.m_font_color),
00062 m_color(old.m_color) {
00063 setEnabled(false);
00064 m_font_color = m_background = m_backborder = false;
00065 }
00066
00067 RendererBase* FloatingTextRenderer::clone() {
00068 return new FloatingTextRenderer(*this);
00069 }
00070
00071 FloatingTextRenderer::~FloatingTextRenderer() {
00072 }
00073
00074 void FloatingTextRenderer::render(Camera* cam, Layer* layer, RenderList& instances) {
00075 if (!m_font) {
00076 return;
00077 }
00078
00079 RenderList::const_iterator instance_it = instances.begin();
00080 const std::string* saytext = NULL;
00081 unsigned int lm = m_renderbackend->getLightingModel();
00082 SDL_Color old_color = m_font->getColor();
00083 if(m_font_color) {
00084 m_font->setColor(m_color.r, m_color.g, m_color.b, m_color.unused);
00085 }
00086 if(lm != 0) {
00087 m_renderbackend->disableLighting();
00088 m_renderbackend->setStencilTest(255, 2, 7);
00089 m_renderbackend->setAlphaTest(0.0);
00090 }
00091 for (;instance_it != instances.end(); ++instance_it) {
00092 Instance* instance = (*instance_it)->instance;
00093 saytext = instance->getSayText();
00094 if (saytext) {
00095 const Rect& ir = (*instance_it)->dimensions;
00096 Image* img = m_font->getAsImageMultiline(*saytext);
00097 Rect r;
00098 r.x = (ir.x + ir.w/2) - img->getWidth()/2;
00099 r.y = ir.y- img->getHeight();
00100 r.w = img->getWidth();
00101 r.h = img->getHeight();
00102
00103 if(m_background || m_backborder) {
00104 const int overdraw = 5;
00105
00106 Point p = Point(r.x-overdraw, r.y-overdraw);
00107
00108 if(m_background) {
00109 m_renderbackend->fillRectangle(p, r.w+2*overdraw, r.h+2*overdraw, m_backcolor.r, m_backcolor.g, m_backcolor.b, m_backcolor.unused);
00110 }
00111
00112 if(m_backborder) {
00113 m_renderbackend->drawRectangle(p, r.w+2*overdraw, r.h+2*overdraw, m_backbordercolor.r, m_backbordercolor.g, m_backbordercolor.b, m_backbordercolor.unused);
00114 }
00115 }
00116 img->render(r);
00117 }
00118 }
00119 if(lm != 0) {
00120 m_renderbackend->disableAlphaTest();
00121 m_renderbackend->disableStencilTest();
00122 m_renderbackend->enableLighting();
00123 }
00124 if(m_font_color) {
00125 m_font->setColor(old_color.r, old_color.g, old_color.b, old_color.unused);
00126 }
00127 }
00128
00129 void FloatingTextRenderer::setColor(uint8_t r, uint8_t g, uint8_t b, uint8_t a) {
00130 m_color.r = r;
00131 m_color.g = g;
00132 m_color.b = b;
00133 m_color.unused = a;
00134
00135 m_font_color = true;
00136 }
00137
00138 void FloatingTextRenderer::setBackground(uint8_t br, uint8_t bg, uint8_t bb, uint8_t ba) {
00139 m_backcolor.r = br;
00140 m_backcolor.g = bg;
00141 m_backcolor.b = bb;
00142 m_backcolor.unused = ba;
00143
00144 m_background = true;
00145 }
00146
00147 void FloatingTextRenderer::setBorder(uint8_t bbr, uint8_t bbg, uint8_t bbb, uint8_t bba) {
00148 m_backbordercolor.r = bbr;
00149 m_backbordercolor.g = bbg;
00150 m_backbordercolor.b = bbb;
00151 m_backbordercolor.unused = bba;
00152
00153 m_backborder = true;
00154 }
00155
00156 void FloatingTextRenderer::resetBackground() {
00157 m_background = false;
00158 }
00159
00160 void FloatingTextRenderer::resetBorder() {
00161 m_backborder = false;
00162 }
00163
00164 FloatingTextRenderer* FloatingTextRenderer::getInstance(IRendererContainer* cnt) {
00165 return dynamic_cast<FloatingTextRenderer*>(cnt->getRenderer("FloatingTextRenderer"));
00166 }
00167 }