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 "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 }