camerazonerenderer.cpp
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/image.h"
00032 #include "util/math/fife_math.h"
00033 #include "util/log/logger.h"
00034 #include "model/metamodel/grids/cellgrid.h"
00035 #include "model/structures/instance.h"
00036 #include "model/structures/layer.h"
00037 #include "model/structures/location.h"
00038
00039 #include "view/camera.h"
00040 #include "camerazonerenderer.h"
00041
00042
00043
00044 namespace FIFE {
00045 static Logger _log(LM_VIEWVIEW);
00046
00047 CameraZoneRenderer::CameraZoneRenderer(RenderBackend* renderbackend, int position, ImagePool* imagepool):
00048 RendererBase(renderbackend, position),
00049 m_imagepool(imagepool),
00050 m_zone_image(NULL) {
00051 setEnabled(false);
00052 }
00053
00054 CameraZoneRenderer::CameraZoneRenderer(const CameraZoneRenderer& old):
00055 RendererBase(old),
00056 m_imagepool(old.m_imagepool),
00057 m_zone_image(NULL) {
00058 setEnabled(false);
00059 }
00060
00061 RendererBase* CameraZoneRenderer::clone() {
00062 return new CameraZoneRenderer(*this);
00063 }
00064
00065 CameraZoneRenderer::~CameraZoneRenderer() {
00066 delete m_zone_image;
00067 }
00068
00069
00070
00071 void CameraZoneRenderer::render(Camera* cam, Layer* layer, std::vector<Instance*>& instances) {
00072 CellGrid* cg = layer->getCellGrid();
00073 if (!cg) {
00074 FL_WARN(_log, "No cellgrid assigned to layer, cannot draw camera zones");
00075 return;
00076 }
00077
00078 Rect rect = cam->getViewPort();
00079 if (!m_zone_image) {
00080
00081 int dataSize = rect.w * rect.h;
00082
00083
00084 uint32_t* data = new uint32_t[dataSize];
00085 uint32_t* end = data + dataSize;
00086
00087 #if SDL_BYTEORDER == SDL_BIG_ENDIAN
00088 uint32_t empty_pixel = 0;
00089 uint32_t edge_pixel = 0xff << 16 | 0xff << 24;
00090 #else
00091 uint32_t empty_pixel = 0;
00092 uint32_t edge_pixel = 0xff << 8 | 0xff;
00093 #endif
00094
00095 std::fill(data, end, empty_pixel);
00096
00097
00098
00099 ModelCoordinate prevLayerCoord;
00100 for (int y = 0; y < rect.h; y++) {
00101 for (int x = 0; x < rect.w; x++) {
00102 ExactModelCoordinate mapCoord = cam->toMapCoordinates(ScreenPoint(x, y));
00103 ModelCoordinate layerCoord = cg->toLayerCoordinates(mapCoord);
00104
00105 if (prevLayerCoord != layerCoord) {
00106 data[x + rect.w * y] = edge_pixel;
00107 }
00108 prevLayerCoord = layerCoord;
00109 }
00110 }
00111
00112
00113 for (int x = 0; x < rect.w; x++) {
00114 for (int y = 0; y < rect.h; y++) {
00115 ExactModelCoordinate mapCoord = cam->toMapCoordinates(ScreenPoint(x, y));
00116 ModelCoordinate layerCoord = cg->toLayerCoordinates(mapCoord);
00117
00118 if (prevLayerCoord != layerCoord) {
00119 data[x + rect.w * y] = edge_pixel;
00120 }
00121 prevLayerCoord = layerCoord;
00122 }
00123 }
00124
00125 m_zone_image = m_renderbackend->createImage((uint8_t*) data, rect.w, rect.h);
00126 delete data;
00127 }
00128 m_zone_image->render(rect);
00129 }
00130
00131 void CameraZoneRenderer::setEnabled(bool enabled) {
00132 if (!enabled) {
00133 delete m_zone_image;
00134 m_zone_image = NULL;
00135 }
00136 }
00137 }