30 #include "video/renderbackend.h"
31 #include "video/imagemanager.h"
32 #include "util/log/logger.h"
33 #include "view/camera.h"
35 #include "targetrenderer.h"
39 static Logger _log(LM_VIEWVIEW);
41 RenderTarget::RenderTarget(RenderBackend* rb,
const std::string& name, uint32_t width, uint32_t height):
43 m_target = ImageManager::instance()->loadBlank(name, width, height);
46 RenderTarget::RenderTarget(RenderBackend* rb, ImagePtr& image):
47 m_renderbackend(rb), m_target(image) {
50 RenderTarget::~RenderTarget() {
53 void RenderTarget::addLine(
const std::string &group, Point n1, Point n2, uint8_t r, uint8_t g, uint8_t b, uint8_t a) {
54 OffRendererElementInfo* info =
new OffRendererLineInfo(n1, n2, r, g, b, a);
55 m_groups[group].push_back(info);
58 void RenderTarget::addPoint(
const std::string &group, Point n, uint8_t r, uint8_t g, uint8_t b, uint8_t a) {
59 OffRendererElementInfo* info =
new OffRendererPointInfo(n, r, g, b, a);
60 m_groups[group].push_back(info);
63 void RenderTarget::addTriangle(
const std::string &group, Point n1, Point n2, Point n3, uint8_t r, uint8_t g, uint8_t b, uint8_t a) {
64 OffRendererElementInfo* info =
new OffRendererTriangleInfo(n1, n2, n3, r, g, b, a);
65 m_groups[group].push_back(info);
68 void RenderTarget::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) {
69 OffRendererElementInfo* info =
new OffRendererQuadInfo(n1, n2, n3, n4, r, g, b, a);
70 m_groups[group].push_back(info);
73 void RenderTarget::addVertex(
const std::string &group, Point n, int32_t size, uint8_t r, uint8_t g, uint8_t b, uint8_t a) {
74 OffRendererElementInfo* info =
new OffRendererVertexInfo(n, size, r, g, b, a);
75 m_groups[group].push_back(info);
78 void RenderTarget::addText(
const std::string &group, Point n, IFont* font,
const std::string &text) {
79 OffRendererElementInfo* info =
new OffRendererTextInfo(n, font, text);
80 m_groups[group].push_back(info);
83 void RenderTarget::addImage(
const std::string &group, Point n, ImagePtr image) {
84 OffRendererElementInfo* info =
new OffRendererImageInfo(n, image);
85 m_groups[group].push_back(info);
88 void RenderTarget::addAnimation(
const std::string &group, Point n, AnimationPtr animation) {
89 OffRendererElementInfo* info =
new OffRendererAnimationInfo(n, animation);
90 m_groups[group].push_back(info);
93 void RenderTarget::resizeImage(
const std::string &group, Point n, ImagePtr image, int32_t width, int32_t height) {
94 OffRendererElementInfo* info =
new OffRendererResizeInfo(n, image, width, height);
95 m_groups[group].push_back(info);
98 void RenderTarget::removeAll(
const std::string &group) {
99 std::vector<OffRendererElementInfo*>::const_iterator info_it = m_groups[group].begin();
100 for (;info_it != m_groups[group].end(); ++info_it) {
103 m_groups[group].clear();
104 m_groups.erase(group);
107 void RenderTarget::removeAll() {
111 void RenderTarget::render() {
112 std::map<std::string, std::vector<OffRendererElementInfo*> >::iterator group_it = m_groups.begin();
113 for(; group_it != m_groups.end(); ++group_it) {
114 std::vector<OffRendererElementInfo*>::const_iterator info_it = group_it->second.begin();
115 for (; info_it != group_it->second.end(); ++info_it) {
116 (*info_it)->render(m_renderbackend);
121 TargetRenderer::TargetRenderer(RenderBackend* renderbackend) :
122 m_renderbackend(renderbackend) {
125 TargetRenderer::~TargetRenderer() {
128 RenderTargetPtr TargetRenderer::createRenderTarget(
const std::string& name, uint32_t width, uint32_t height) {
131 rj.lasttime_draw = 1;
132 rj.target = RenderTargetPtr(
new RenderTarget(m_renderbackend, name, width, height));
135 std::pair<RenderJobMap::iterator, bool> ret =
136 m_targets.insert(std::make_pair<std::string, RenderJob>(name, rj));
138 return ret.first->second.target;
141 RenderTargetPtr TargetRenderer::createRenderTarget(ImagePtr& image) {
144 rj.lasttime_draw = 1;
145 rj.target = RenderTargetPtr(
new RenderTarget(m_renderbackend, image));
148 std::pair<RenderJobMap::iterator, bool> ret =
149 m_targets.insert(std::make_pair<std::string, RenderJob>(image->getName(), rj));
151 return ret.first->second.target;
154 void TargetRenderer::setRenderTarget(
const std::string& targetname,
bool discard, int32_t ndraws) {
155 RenderJobMap::iterator it = m_targets.find(targetname);
156 if (it != m_targets.end()) {
157 it->second.ndraws = ndraws;
158 it->second.discard = discard;
162 void TargetRenderer::render() {
163 if (!m_targets.empty()) {
164 for (RenderJobMap::iterator it = m_targets.begin(); it != m_targets.end(); ++it) {
165 if (it->second.ndraws != -1) {
166 if (it->second.ndraws <= it->second.lasttime_draw) {
167 RenderTargetPtr rt = it->second.target;
168 m_renderbackend->attachRenderTarget(rt->m_target, it->second.discard);
170 m_renderbackend->detachRenderTarget();
172 if(it->second.ndraws == 0) {
173 it->second.ndraws = -1;
175 it->second.lasttime_draw = 1;
178 ++it->second.lasttime_draw;