Mercurial > fife-parpg
view engine/core/view/renderers/quadtreerenderer.cpp @ 308:af0b233e246f
- added a workaround for the rotation issue of groundtiles in rio de hola maps
author | chewie@33b003aa-7bff-0310-803a-e67f0ece8222 |
---|---|
date | Tue, 11 Aug 2009 17:08:21 +0000 |
parents | 90005975cdbb |
children | 16c2b3ee59ce |
line wrap: on
line source
/*************************************************************************** * Copyright (C) 2005-2008 by the FIFE team * * http://www.fifengine.de * * This file is part of FIFE. * * * * FIFE is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ // Standard C++ library includes // 3rd party library includes // FIFE includes // These includes are split up in two parts, separated by one empty line // First block: files included from the FIFE root src directory // Second block: files included from the same folder #include "video/renderbackend.h" #include "util/math/fife_math.h" #include "util/log/logger.h" #include "model/metamodel/grids/cellgrid.h" #include "model/structures/instance.h" #include "model/structures/layer.h" #include "model/structures/location.h" #include "view/camera.h" #include "quadtreerenderer.h" #include "model/structures/instancetree.h" #include "util/structures/quadtree.h" ///credit to phoku for his NodeDisplay example which the visitor code is adapted from ( he coded the quadtree after all ) namespace FIFE { static Logger _log(LM_VIEWVIEW); QuadTreeRenderer::QuadTreeRenderer(RenderBackend* renderbackend, int position): RendererBase(renderbackend, position) { setEnabled(false); } QuadTreeRenderer::QuadTreeRenderer(const QuadTreeRenderer& old): RendererBase(old) { setEnabled(false); } RendererBase* QuadTreeRenderer::clone() { return new QuadTreeRenderer(*this); } QuadTreeRenderer::~QuadTreeRenderer() { } RenderVisitor::RenderVisitor(RenderBackend * rb, Layer * layer, Camera *camera) { m_renderbackend = rb; m_layer = layer; m_camera = camera; } RenderVisitor::~RenderVisitor() {} template<typename T> bool RenderVisitor::visit(QuadNode<T,2>* node, int d) { if (d==0) visited = 0; int x = node->x(); int y = node->y(); int size = node->size(); ++visited; CellGrid *cg = m_layer->getCellGrid(); ///we have checked for null pointer in quadtreerenderer::render().. no need to check again ExactModelCoordinate emc= cg->toMapCoordinates(ExactModelCoordinate( x,y) );//0.5 for each cell's half-width ScreenPoint scrpt1 =m_camera->toScreenCoordinates( emc ); emc= cg->toMapCoordinates(ExactModelCoordinate( x,y+size) );// this size usage is wrong.. me thinks ScreenPoint scrpt2 =m_camera->toScreenCoordinates( emc ); emc= cg->toMapCoordinates(ExactModelCoordinate( x+size,y) ); ScreenPoint scrpt3 =m_camera->toScreenCoordinates( emc ); emc= cg->toMapCoordinates(ExactModelCoordinate( x+size,y+size) ); ScreenPoint scrpt4 =m_camera->toScreenCoordinates( emc ); m_renderbackend->drawLine( Point(scrpt1.x,scrpt1.y) , Point(scrpt2.x,scrpt2.y), 255, 255, 255); m_renderbackend->drawLine(Point(scrpt1.x,scrpt1.y), Point(scrpt3.x,scrpt3.y), 255, 255, 255); m_renderbackend->drawLine(Point(scrpt3.x,scrpt3.y), Point(scrpt4.x,scrpt4.y), 255, 255, 255); m_renderbackend->drawLine(Point(scrpt2.x,scrpt2.y), Point(scrpt4.x,scrpt4.y), 255, 255, 255); return true; } void QuadTreeRenderer::render(Camera* cam, Layer* layer, std::vector<Instance*>& instances) { CellGrid* cg = layer->getCellGrid(); if (!cg) { FL_WARN(_log, "No cellgrid assigned to layer, cannot draw grid"); return; } InstanceTree * itree = layer->getInstanceTree(); RenderVisitor VIPguess(m_renderbackend, layer,cam); itree->applyVisitor(VIPguess); } }