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/ifont.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, int32_t position):
00049 RendererBase(renderbackend, position),
00050 m_renderbackend(renderbackend),
00051 m_font(0) {
00052 setEnabled(false);
00053 m_font_color = false;
00054 }
00055
00056 FloatingTextRenderer::FloatingTextRenderer(const FloatingTextRenderer& old):
00057 RendererBase(old),
00058 m_renderbackend(old.m_renderbackend),
00059 m_font(old.m_font),
00060 m_font_color(old.m_font_color),
00061 m_color(old.m_color) {
00062 setEnabled(false);
00063 m_font_color = m_background = m_backborder = false;
00064 }
00065
00066 RendererBase* FloatingTextRenderer::clone() {
00067 return new FloatingTextRenderer(*this);
00068 }
00069
00070 FloatingTextRenderer::~FloatingTextRenderer() {
00071 }
00072
00073 void FloatingTextRenderer::render(Camera* cam, Layer* layer, RenderList& instances) {
00074 if (!m_font) {
00075
00076 return;
00077 }
00078
00079 RenderList::const_iterator instance_it = instances.begin();
00080 const std::string* saytext = NULL;
00081 uint32_t 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 for (;instance_it != instances.end(); ++instance_it) {
00087 Instance* instance = (*instance_it)->instance;
00088 saytext = instance->getSayText();
00089 if (saytext) {
00090 const Rect& ir = (*instance_it)->dimensions;
00091 Image* img = m_font->getAsImageMultiline(*saytext);
00092 Rect r;
00093 r.x = (ir.x + ir.w/2) - img->getWidth()/2;
00094 r.y = ir.y- img->getHeight();
00095 r.w = img->getWidth();
00096 r.h = img->getHeight();
00097
00098 if(m_background || m_backborder) {
00099 const int32_t overdraw = 5;
00100
00101 Point p = Point(r.x-overdraw, r.y-overdraw);
00102
00103 if(m_background) {
00104 m_renderbackend->fillRectangle(p, r.w+2*overdraw, r.h+2*overdraw, m_backcolor.r, m_backcolor.g, m_backcolor.b, m_backcolor.unused);
00105 }
00106
00107 if(m_backborder) {
00108 m_renderbackend->drawRectangle(p, r.w+2*overdraw, r.h+2*overdraw, m_backbordercolor.r, m_backbordercolor.g, m_backbordercolor.b, m_backbordercolor.unused);
00109 }
00110 }
00111 img->render(r);
00112 if(lm > 0) {
00113 uint16_t elements = 1;
00114 if (m_background) {
00115 ++elements;
00116 }
00117 if (m_backborder) {
00118 ++elements;
00119 }
00120 m_renderbackend->changeRenderInfos(elements, 4, 5, false, true, 255, REPLACE, ALWAYS);
00121 }
00122 }
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 }