30 #include "video/renderbackend.h"
31 #include "video/fonts/ifont.h"
32 #include "video/image.h"
33 #include "video/imagemanager.h"
34 #include "util/math/fife_math.h"
35 #include "util/log/logger.h"
36 #include "util/time/timemanager.h"
37 #include "model/metamodel/timeprovider.h"
39 #include "offrenderer.h"
43 static Logger _log(LM_VIEWVIEW);
45 OffRendererLineInfo::OffRendererLineInfo(Point n1, Point n2, uint8_t r, uint8_t g, uint8_t b, uint8_t a):
46 OffRendererElementInfo(),
54 void OffRendererLineInfo::render(RenderBackend* renderbackend) {
55 renderbackend->drawLine(m_edge1, m_edge2, m_red, m_green, m_blue, m_alpha);
58 OffRendererPointInfo::OffRendererPointInfo(Point anchor, uint8_t r, uint8_t g, uint8_t b, uint8_t a):
59 OffRendererElementInfo(),
66 void OffRendererPointInfo::render(RenderBackend* renderbackend) {
67 renderbackend->putPixel(m_anchor.x, m_anchor.y, m_red, m_green, m_blue, m_alpha);
70 OffRendererTriangleInfo::OffRendererTriangleInfo(Point n1, Point n2, Point n3, uint8_t r, uint8_t g, uint8_t b, uint8_t a):
71 OffRendererElementInfo(),
80 void OffRendererTriangleInfo::render(RenderBackend* renderbackend) {
81 renderbackend->drawTriangle(m_edge1, m_edge2, m_edge3, m_red, m_green, m_blue, m_alpha);
84 OffRendererQuadInfo::OffRendererQuadInfo(Point n1, Point n2, Point n3, Point n4, uint8_t r, uint8_t g, uint8_t b, uint8_t a):
85 OffRendererElementInfo(),
95 void OffRendererQuadInfo::render(RenderBackend* renderbackend) {
96 renderbackend->drawQuad(m_edge1, m_edge2, m_edge3, m_edge4, m_red, m_green, m_blue, m_alpha);
99 OffRendererVertexInfo::OffRendererVertexInfo(Point center, int32_t size, uint8_t r, uint8_t g, uint8_t b, uint8_t a):
100 OffRendererElementInfo(),
108 void OffRendererVertexInfo::render(RenderBackend* renderbackend) {
109 renderbackend->drawVertex(m_center, m_size, m_red, m_green, m_blue, m_alpha);
112 OffRendererImageInfo::OffRendererImageInfo(Point anchor, ImagePtr image):
113 OffRendererElementInfo(),
117 void OffRendererImageInfo::render(RenderBackend* renderbackend) {
119 uint16_t width = m_image->getWidth();
120 uint16_t height = m_image->getHeight();
121 r.x = m_anchor.x-width/2;
122 r.y = m_anchor.y-height/2;
129 OffRendererAnimationInfo::OffRendererAnimationInfo(Point anchor, AnimationPtr animation):
130 OffRendererElementInfo(),
132 m_animation(animation),
133 m_start_time(TimeManager::instance()->getTime()),
136 void OffRendererAnimationInfo::render(RenderBackend* renderbackend) {
137 int32_t animtime =
scaleTime(m_time_scale, TimeManager::instance()->getTime() - m_start_time) % m_animation->getDuration();
138 ImagePtr img = m_animation->getFrameByTimestamp(animtime);
141 uint16_t width = img->getWidth();
142 uint16_t height = img->getHeight();
143 r.x = m_anchor.x-width/2;
144 r.y = m_anchor.y-height/2;
151 OffRendererTextInfo::OffRendererTextInfo(Point anchor, IFont* font, std::string text):
152 OffRendererElementInfo(),
157 void OffRendererTextInfo::render(RenderBackend* renderbackend) {
158 Image* img = m_font->getAsImageMultiline(m_text);
161 uint16_t width = img->getWidth();
162 uint16_t height = img->getHeight();
163 r.x = m_anchor.x-width/2;
164 r.y = m_anchor.y-height/2;
171 OffRendererResizeInfo::OffRendererResizeInfo(Point anchor, ImagePtr image, int32_t width, int32_t height):
172 OffRendererElementInfo(),
178 void OffRendererResizeInfo::render(RenderBackend* renderbackend) {
180 uint16_t width = m_width;
181 uint16_t height = m_height;
182 r.x = m_anchor.x-width/2;
183 r.y = m_anchor.y-height/2;
190 OffRenderer::OffRenderer(RenderBackend* renderbackend):
192 m_renderbackend(renderbackend),
194 m_area(renderbackend->getArea()) {
197 OffRenderer::~OffRenderer() {
201 void OffRenderer::setEnabled(
bool enabled) {
205 bool OffRenderer::isEnabled() {
209 void OffRenderer::setClipArea(Rect area) {
213 const Rect& OffRenderer::getClipArea()
const {
217 void OffRenderer::addLine(
const std::string &group, Point n1, Point n2, uint8_t r, uint8_t g, uint8_t b, uint8_t a) {
218 OffRendererElementInfo* info =
new OffRendererLineInfo(n1, n2, r, g, b, a);
219 m_groups[group].push_back(info);
221 void OffRenderer::addPoint(
const std::string &group, Point n, uint8_t r, uint8_t g, uint8_t b, uint8_t a) {
222 OffRendererElementInfo* info =
new OffRendererPointInfo(n, r, g, b, a);
223 m_groups[group].push_back(info);
225 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) {
226 OffRendererElementInfo* info =
new OffRendererTriangleInfo(n1, n2, n3, r, g, b, a);
227 m_groups[group].push_back(info);
229 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) {
230 OffRendererElementInfo* info =
new OffRendererQuadInfo(n1, n2, n3, n4, r, g, b, a);
231 m_groups[group].push_back(info);
233 void OffRenderer::addVertex(
const std::string &group, Point n, int32_t size, uint8_t r, uint8_t g, uint8_t b, uint8_t a) {
234 OffRendererElementInfo* info =
new OffRendererVertexInfo(n, size, r, g, b, a);
235 m_groups[group].push_back(info);
237 void OffRenderer::addText(
const std::string &group, Point n, IFont* font,
const std::string &text) {
238 OffRendererElementInfo* info =
new OffRendererTextInfo(n, font, text);
239 m_groups[group].push_back(info);
241 void OffRenderer::addImage(
const std::string &group, Point n, ImagePtr image) {
242 OffRendererElementInfo* info =
new OffRendererImageInfo(n, image);
243 m_groups[group].push_back(info);
245 void OffRenderer::addAnimation(
const std::string &group, Point n, AnimationPtr animation) {
246 OffRendererElementInfo* info =
new OffRendererAnimationInfo(n, animation);
247 m_groups[group].push_back(info);
249 void OffRenderer::resizeImage(
const std::string &group, Point n, ImagePtr image, int32_t width, int32_t height) {
250 OffRendererElementInfo* info =
new OffRendererResizeInfo(n, image, width, height);
251 m_groups[group].push_back(info);
253 void OffRenderer::removeAll(
const std::string &group) {
254 std::vector<OffRendererElementInfo*>::const_iterator info_it = m_groups[group].begin();
255 for (;info_it != m_groups[group].end(); ++info_it) {
258 m_groups[group].clear();
259 m_groups.erase(group);
261 void OffRenderer::removeAll() {
265 void OffRenderer::render() {
269 m_renderbackend->pushClipArea(m_area);
270 std::map<std::string, std::vector<OffRendererElementInfo*> >::iterator group_it = m_groups.begin();
271 for(; group_it != m_groups.end(); ++group_it) {
272 std::vector<OffRendererElementInfo*>::const_iterator info_it = group_it->second.begin();
273 for (;info_it != group_it->second.end(); ++info_it) {
274 (*info_it)->render(m_renderbackend);
277 m_renderbackend->renderVertexArrays();
278 m_renderbackend->popClipArea();
uint32_t scaleTime(float multiplier, uint32_t ticks)