text: /************************************************************************
  * Copyright (c) 2005-2007 tok@openlinux.org.uk                          *
  *                                                                       *
  * This software is provided as-is, without any express or implied       *
  * warranty. In no event will the authors be held liable for any         *
  * damages arising from the use of this software.                        *
  *                                                                       *
  * Permission is granted to anyone to use this software for any purpose, *
  * including commercial applications, and to alter it and redistribute   *
  * it freely, subject to the following restrictions:                     *
  *                                                                       *
  * 1. The origin of this software must not be misrepresented; you must   *
  * not claim that you wrote the original software. If you use this       *
  * software in a product, an acknowledgment in the product documentation *
  * would be appreciated but is not required.                             *
  *                                                                       *
  * 2. Altered source versions must be plainly marked as such, and must   *
  * not be misrepresented as being the original software.                 *
  *                                                                       *
  * 3. This notice may not be removed or altered from any source          *
  * distribution.                                                         *
  ************************************************************************/
  #ifndef GL_CITYVIEW_H
  #define GL_CITYVIEW_H
  
  #include "opengta.h"
  #include "navdata.h"
  #include "gl_texturecache.h"
  #include "gl_frustum.h"
  #include "gl_pagedtexture.h"
  
  namespace OpenGTA {
  
    class BlockAnimCtrl;
    class CityView {
      public:
        CityView();
        ~CityView();
        void loadMap(const std::string &map, const std::string &style);
        void createLevelObject(OpenGTA::Map::ObjectPosition *obj);
        void setPosition(const GLfloat & x, const GLfloat & y, const GLfloat & z);
        void setTopDownView(const GLfloat & height);
        //void setCamVector(const GLfloat & x, const GLfloat & y, const GLfloat & z);
        void setZoom(const GLfloat zoom);
        void setViewMode(bool topDown);
        bool getViewMode() { return topDownView; }
        void setDrawHeadingArrows(bool yes) { drawHeadingMarkers = yes; }
        void setTexFlipTest(int v) { texFlipTest = v; }
        GLfloat* getCamPos() { return (GLfloat*)&camPos; }
        void setVisibleRange(int);
        int  getVisibleRange();
        void getTerrainHeight(GLfloat & x, GLfloat & y, GLfloat & z);
        void draw(Uint32 ticks);
        NavData::Sector* getCurrentSector();
        OpenGL::PagedTexture renderMap2Texture();
  
        bool getDrawTextured();
        bool getDrawLines();
        bool getDrawLinesBlockColor();
        void setDrawTextured(bool v);
        void setDrawLines(bool v);
        void setDrawLinesBlockColor(bool v);
  
        void resetTextures();
        const SDL_Rect & getActiveRect() { return activeRect; }
        const SDL_Rect & getOnScreenRect() { return drawnRect; }
        BlockAnimCtrl* blockAnims;
        
      protected:
        void setNull();
        void cleanup();
        void drawBlock(OpenGTA::Map::BlockInfo* bi);
        void drawObject(OpenGTA::Map::ObjectPosition*);
        //OpenGL::PagedTexture createSprite(size_t sprNum, GraphicsBase::SpriteInfo* info);
        Util::CFrustum frustum;
        OpenGL::TextureCache<uint8_t>* sideCache;
        OpenGL::TextureCache<uint8_t>* lidCache;
        OpenGL::TextureCache<uint8_t>* auxCache;
        Map* loadedMap;
        OpenGTA::GraphicsBase* style;
        GLfloat zoomLevel;
        GLfloat camPos[3];
        GLfloat camVec[3];
        int visibleRange;
        bool topDownView;
        bool drawTextured;
        bool drawLines;
        bool drawLinesBlockType;
        bool drawHeadingMarkers;
        uint8_t aboveBlockType;
  
        SDL_Rect activeRect;
        SDL_Rect drawnRect;
  
        int  scene_rendered_vertices;
        int  scene_rendered_blocks;
  
        GLuint scene_display_list;
        bool scene_is_dirty;
        int texFlipTest;
  
        Uint32 lastCacheEmptyTicks;
  
        NavData::Sector *current_sector;
    };
  }
  
  #endif
  