offrenderer.cpp

00001 /***************************************************************************
00002  *   Copyright (C) 2005-2011 by the FIFE team                              *
00003  *   http://www.fifengine.de                                               *
00004  *   This file is part of FIFE.                                            *
00005  *                                                                         *
00006  *   FIFE is free software; you can redistribute it and/or                 *
00007  *   modify it under the terms of the GNU Lesser General Public            *
00008  *   License as published by the Free Software Foundation; either          *
00009  *   version 2.1 of the License, or (at your option) any later version.    *
00010  *                                                                         *
00011  *   This library is distributed in the hope that it will be useful,       *
00012  *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
00013  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU     *
00014  *   Lesser General Public License for more details.                       *
00015  *                                                                         *
00016  *   You should have received a copy of the GNU Lesser General Public      *
00017  *   License along with this library; if not, write to the                 *
00018  *   Free Software Foundation, Inc.,                                       *
00019  *   51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA          *
00020  ***************************************************************************/
00021 
00022 // Standard C++ library includes
00023 
00024 // 3rd party library includes
00025 
00026 // FIFE includes
00027 // These includes are split up in two parts, separated by one empty line
00028 // First block: files included from the FIFE root src directory
00029 // Second block: files included from the same folder
00030 #include "video/renderbackend.h"
00031 #include "video/fonts/ifont.h"
00032 #include "video/image.h"
00033 #include "video/imagemanager.h"
00034 #include "util/math/fife_math.h"
00035 #include "util/log/logger.h"
00036 #include "util/time/timemanager.h"
00037 #include "model/metamodel/timeprovider.h"
00038 
00039 #include "offrenderer.h"
00040 
00041 
00042 namespace FIFE {
00043     static Logger _log(LM_VIEWVIEW);
00044 
00045     OffRendererLineInfo::OffRendererLineInfo(Point n1, Point n2, uint8_t r, uint8_t g, uint8_t b, uint8_t a):
00046         OffRendererElementInfo(),
00047         m_edge1(n1),
00048         m_edge2(n2),
00049         m_red(r),
00050         m_green(g),
00051         m_blue(b),
00052         m_alpha(a) {
00053     }
00054     void OffRendererLineInfo::render(RenderBackend* renderbackend) {
00055         renderbackend->drawLine(m_edge1, m_edge2, m_red, m_green, m_blue, m_alpha);
00056     }
00057 
00058     OffRendererPointInfo::OffRendererPointInfo(Point anchor, uint8_t r, uint8_t g, uint8_t b, uint8_t a):
00059         OffRendererElementInfo(),
00060         m_anchor(anchor),
00061         m_red(r),
00062         m_green(g),
00063         m_blue(b),
00064         m_alpha(a) {
00065     }
00066     void OffRendererPointInfo::render(RenderBackend* renderbackend) {
00067         renderbackend->putPixel(m_anchor.x, m_anchor.y, m_red, m_green, m_blue, m_alpha);
00068     }
00069 
00070     OffRendererTriangleInfo::OffRendererTriangleInfo(Point n1, Point n2, Point n3, uint8_t r, uint8_t g, uint8_t b, uint8_t a):
00071         OffRendererElementInfo(),
00072         m_edge1(n1),
00073         m_edge2(n2),
00074         m_edge3(n3),
00075         m_red(r),
00076         m_green(g),
00077         m_blue(b),
00078         m_alpha(a) {
00079     }
00080     void OffRendererTriangleInfo::render(RenderBackend* renderbackend) {
00081         renderbackend->drawTriangle(m_edge1, m_edge2, m_edge3, m_red, m_green, m_blue, m_alpha);
00082     }
00083 
00084     OffRendererQuadInfo::OffRendererQuadInfo(Point n1, Point n2, Point n3, Point n4, uint8_t r, uint8_t g, uint8_t b, uint8_t a):
00085         OffRendererElementInfo(),
00086         m_edge1(n1),
00087         m_edge2(n2),
00088         m_edge3(n3),
00089         m_edge4(n4),
00090         m_red(r),
00091         m_green(g),
00092         m_blue(b),
00093         m_alpha(a) {
00094     }
00095     void OffRendererQuadInfo::render(RenderBackend* renderbackend) {
00096         renderbackend->drawQuad(m_edge1, m_edge2, m_edge3, m_edge4, m_red, m_green, m_blue, m_alpha);
00097     }
00098 
00099     OffRendererVertexInfo::OffRendererVertexInfo(Point center, int32_t size, uint8_t r, uint8_t g, uint8_t b, uint8_t a):
00100         OffRendererElementInfo(),
00101         m_center(center),
00102         m_size(size),
00103         m_red(r),
00104         m_green(g),
00105         m_blue(b),
00106         m_alpha(a) {
00107     }
00108     void OffRendererVertexInfo::render(RenderBackend* renderbackend) {
00109         renderbackend->drawVertex(m_center, m_size, m_red, m_green, m_blue, m_alpha);
00110     }
00111 
00112     OffRendererImageInfo::OffRendererImageInfo(Point anchor, ImagePtr image):
00113         OffRendererElementInfo(),
00114         m_anchor(anchor),
00115         m_image(image) {
00116     }
00117     void OffRendererImageInfo::render(RenderBackend* renderbackend) {
00118         Rect r;
00119         uint16_t width = m_image->getWidth();
00120         uint16_t height = m_image->getHeight();
00121         r.x = m_anchor.x-width/2;
00122         r.y = m_anchor.y-height/2;
00123         r.w = width;
00124         r.h = height;
00125 
00126         m_image->render(r);
00127     }
00128 
00129     OffRendererAnimationInfo::OffRendererAnimationInfo(Point anchor, AnimationPtr animation):
00130         OffRendererElementInfo(),
00131         m_anchor(anchor),
00132         m_animation(animation),
00133         m_start_time(TimeManager::instance()->getTime()),
00134         m_time_scale(1.0) {
00135     }
00136     void OffRendererAnimationInfo::render(RenderBackend* renderbackend) {
00137         int32_t animtime = scaleTime(m_time_scale, TimeManager::instance()->getTime() - m_start_time) % m_animation->getDuration();
00138         ImagePtr img = m_animation->getFrameByTimestamp(animtime);
00139 
00140         Rect r;
00141         uint16_t width = img->getWidth();
00142         uint16_t height = img->getHeight();
00143         r.x = m_anchor.x-width/2;
00144         r.y = m_anchor.y-height/2;
00145         r.w = width;
00146         r.h = height;
00147 
00148         img->render(r);
00149     }
00150 
00151     OffRendererTextInfo::OffRendererTextInfo(Point anchor, IFont* font, std::string text):
00152         OffRendererElementInfo(),
00153         m_anchor(anchor),
00154         m_font(font),
00155         m_text(text) {
00156     }
00157     void OffRendererTextInfo::render(RenderBackend* renderbackend) {
00158         Image* img = m_font->getAsImageMultiline(m_text);
00159 
00160         Rect r;
00161         uint16_t width = img->getWidth();
00162         uint16_t height = img->getHeight();
00163         r.x = m_anchor.x-width/2;
00164         r.y = m_anchor.y-height/2;
00165         r.w = width;
00166         r.h = height;
00167 
00168         img->render(r);
00169     }
00170 
00171     OffRendererResizeInfo::OffRendererResizeInfo(Point anchor, ImagePtr image, int32_t width, int32_t height):
00172         OffRendererElementInfo(),
00173         m_anchor(anchor),
00174         m_image(image),
00175         m_width(width),
00176         m_height(height){
00177     }
00178     void OffRendererResizeInfo::render(RenderBackend* renderbackend) {
00179         Rect r;
00180         uint16_t width = m_width;
00181         uint16_t height = m_height;
00182         r.x = m_anchor.x-width/2;
00183         r.y = m_anchor.y-height/2;
00184         r.w = width;
00185         r.h = height;
00186 
00187         m_image->render(r);
00188     }
00189 
00190     OffRenderer::OffRenderer(RenderBackend* renderbackend):
00191         m_groups(),
00192         m_renderbackend(renderbackend),
00193         m_enabled(false),
00194         m_area(renderbackend->getArea()) {
00195     }
00196 
00197     OffRenderer::~OffRenderer() {
00198         removeAll();
00199     }
00200 
00201     void OffRenderer::setEnabled(bool enabled) {
00202         m_enabled = enabled;
00203     }
00204 
00205     bool OffRenderer::isEnabled() {
00206         return m_enabled;
00207     }
00208 
00209     void OffRenderer::setClipArea(Rect area) {
00210         m_area = area;
00211     }
00212 
00213     const Rect& OffRenderer::getClipArea() const {
00214         return m_area;
00215     }
00216 
00217     void OffRenderer::addLine(const std::string &group, Point n1, Point n2, uint8_t r, uint8_t g, uint8_t b, uint8_t a) {
00218         OffRendererElementInfo* info = new OffRendererLineInfo(n1, n2, r, g, b, a);
00219         m_groups[group].push_back(info);
00220     }
00221     void OffRenderer::addPoint(const std::string &group, Point n, uint8_t r, uint8_t g, uint8_t b, uint8_t a) {
00222         OffRendererElementInfo* info = new OffRendererPointInfo(n, r, g, b, a);
00223         m_groups[group].push_back(info);
00224     }
00225     void OffRenderer::addTriangle(const std::string &group, Point n1, Point n2, Point n3, uint8_t r, uint8_t g, uint8_t b, uint8_t a) {
00226         OffRendererElementInfo* info = new OffRendererTriangleInfo(n1, n2, n3, r, g, b, a);
00227         m_groups[group].push_back(info);
00228     }
00229     void OffRenderer::addQuad(const std::string &group, Point n1, Point n2, Point n3, Point n4, uint8_t r, uint8_t g, uint8_t b, uint8_t a) {
00230         OffRendererElementInfo* info = new OffRendererQuadInfo(n1, n2, n3, n4, r, g, b, a);
00231         m_groups[group].push_back(info);
00232     }
00233     void OffRenderer::addVertex(const std::string &group, Point n, int32_t size, uint8_t r, uint8_t g, uint8_t b, uint8_t a) {
00234         OffRendererElementInfo* info = new OffRendererVertexInfo(n, size, r, g, b, a);
00235         m_groups[group].push_back(info);
00236     }
00237     void OffRenderer::addText(const std::string &group, Point n, IFont* font, const std::string &text) {
00238         OffRendererElementInfo* info = new OffRendererTextInfo(n, font, text);
00239         m_groups[group].push_back(info);
00240     }
00241     void OffRenderer::addImage(const std::string &group, Point n, ImagePtr image) {
00242         OffRendererElementInfo* info = new OffRendererImageInfo(n, image);
00243         m_groups[group].push_back(info);
00244     }
00245     void OffRenderer::addAnimation(const std::string &group, Point n, AnimationPtr animation) {
00246         OffRendererElementInfo* info = new OffRendererAnimationInfo(n, animation);
00247         m_groups[group].push_back(info);
00248     }
00249     void OffRenderer::resizeImage(const std::string &group, Point n, ImagePtr image, int32_t width, int32_t height) {
00250         OffRendererElementInfo* info = new OffRendererResizeInfo(n, image, width, height);
00251         m_groups[group].push_back(info);
00252     }
00253     void OffRenderer::removeAll(const std::string &group) {
00254         std::vector<OffRendererElementInfo*>::const_iterator info_it = m_groups[group].begin();
00255         for (;info_it != m_groups[group].end(); ++info_it) {
00256             delete *info_it;
00257         }
00258         m_groups[group].clear();
00259         m_groups.erase(group);
00260     }
00261     void OffRenderer::removeAll() {
00262         m_groups.clear();
00263     }
00264 
00265     void OffRenderer::render() {
00266         if (!m_enabled) {
00267             return;
00268         }
00269         m_renderbackend->pushClipArea(m_area);
00270         std::map<std::string, std::vector<OffRendererElementInfo*> >::iterator group_it = m_groups.begin();
00271         for(; group_it != m_groups.end(); ++group_it) {
00272             std::vector<OffRendererElementInfo*>::const_iterator info_it = group_it->second.begin();
00273             for (;info_it != group_it->second.end(); ++info_it) {
00274                 (*info_it)->render(m_renderbackend);
00275             }
00276         }
00277         m_renderbackend->renderVertexArrays();
00278         m_renderbackend->popClipArea();
00279     }
00280 }