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