quadtreerenderer.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 "util/math/fife_math.h"
00032 #include "util/log/logger.h"
00033 #include "model/metamodel/grids/cellgrid.h"
00034 #include "model/structures/instance.h"
00035 #include "model/structures/layer.h"
00036 #include "model/structures/location.h"
00037
00038 #include "view/camera.h"
00039 #include "quadtreerenderer.h"
00040 #include "model/structures/instancetree.h"
00041 #include "util/structures/quadtree.h"
00042
00044 namespace FIFE {
00045 static Logger _log(LM_VIEWVIEW);
00046
00047 QuadTreeRenderer::QuadTreeRenderer(RenderBackend* renderbackend, int position):
00048 RendererBase(renderbackend, position) {
00049 setEnabled(false);
00050 }
00051
00052 QuadTreeRenderer::QuadTreeRenderer(const QuadTreeRenderer& old):
00053 RendererBase(old) {
00054 setEnabled(false);
00055 }
00056
00057 RendererBase* QuadTreeRenderer::clone() {
00058 return new QuadTreeRenderer(*this);
00059 }
00060
00061 QuadTreeRenderer::~QuadTreeRenderer() { }
00062 RenderVisitor::RenderVisitor(RenderBackend * rb, Layer * layer, Camera *camera) {
00063
00064 m_renderbackend = rb;
00065 m_layer = layer;
00066 m_camera = camera;
00067 }
00068
00069 RenderVisitor::~RenderVisitor() {}
00070
00071 template<typename T> bool RenderVisitor::visit(QuadNode<T,2>* node, int d) {
00072
00073 if (d==0)
00074 visited = 0;
00075
00076 int x = node->x();
00077 int y = node->y();
00078 int size = node->size();
00079
00080 ++visited;
00081 CellGrid *cg = m_layer->getCellGrid();
00082
00083
00084 ExactModelCoordinate emc= cg->toMapCoordinates(ExactModelCoordinate( x,y) );
00085 ScreenPoint scrpt1 =m_camera->toScreenCoordinates( emc );
00086 emc= cg->toMapCoordinates(ExactModelCoordinate( x,y+size) );
00087 ScreenPoint scrpt2 =m_camera->toScreenCoordinates( emc );
00088 emc= cg->toMapCoordinates(ExactModelCoordinate( x+size,y) );
00089 ScreenPoint scrpt3 =m_camera->toScreenCoordinates( emc );
00090 emc= cg->toMapCoordinates(ExactModelCoordinate( x+size,y+size) );
00091 ScreenPoint scrpt4 =m_camera->toScreenCoordinates( emc );
00092
00093 m_renderbackend->drawLine( Point(scrpt1.x,scrpt1.y) , Point(scrpt2.x,scrpt2.y), 255, 255, 255);
00094 m_renderbackend->drawLine(Point(scrpt1.x,scrpt1.y), Point(scrpt3.x,scrpt3.y), 255, 255, 255);
00095 m_renderbackend->drawLine(Point(scrpt3.x,scrpt3.y), Point(scrpt4.x,scrpt4.y), 255, 255, 255);
00096 m_renderbackend->drawLine(Point(scrpt2.x,scrpt2.y), Point(scrpt4.x,scrpt4.y), 255, 255, 255);
00097
00098 return true;
00099 }
00100
00101
00102 void QuadTreeRenderer::render(Camera* cam, Layer* layer, std::vector<Instance*>& instances) {
00103 CellGrid* cg = layer->getCellGrid();
00104 if (!cg) {
00105 FL_WARN(_log, "No cellgrid assigned to layer, cannot draw grid");
00106 return;
00107 }
00108 InstanceTree * itree = layer->getInstanceTree();
00109 RenderVisitor VIPguess(m_renderbackend, layer,cam);
00110 itree->applyVisitor(VIPguess);
00111 }
00112
00113 }
00114