/data/maps/four_rooms/rooms/

7c64009999f054f42f6815b05ccfc305c'>commit diff stats
path: root/src/renderer.h
blob: 4c6ccc4011772e78c2a7b6651d8cba7ac6430f71 (plain) (tree)
1
2
3
4
5
6
7
8
9






                           
              
                 
                 

           
          
             





















                                                
                                                       


















































































                                                                     

                          
                                              


        
                       



                    
 
                               
                                     
                                              
 


                                          
                  
                                                         
 


                                 

                             
                          
 
                   



                                      
                         

    

                                                                                  
                                

                                  
                           
                           




                               


                                                      
#ifndef RENDERER_H_6A58EC30
#define RENDERER_H_6A58EC30

#include <SDL.h>
#include <SDL_image.h>
#include <stdexcept>
#include <memory>
#include <map>
#include <string>
#include <vector>

class Game;
class Map;
class Sprite;

class sdl_error : public std::logic_error {
public:

  sdl_error() : std::logic_error(SDL_GetError())
  {
  }
};

class img_error : public std::logic_error {
public:

  img_error() : std::logic_error(IMG_GetError())
  {
  }
};

class sdl_wrapper {
public:

  sdl_wrapper()
  {
    if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO) != 0)
    {
      sdl_error ex;
      SDL_Quit();

    	throw ex;
    }
  }

  ~sdl_wrapper()
  {
    SDL_Quit();
  }
};

class img_wrapper {
public:

  img_wrapper()
  {
    if (IMG_Init(IMG_INIT_PNG) != IMG_INIT_PNG)
    {
      img_error ex;
      IMG_Quit();

      throw ex;
    }
  }

  ~img_wrapper()
  {
    IMG_Quit();
  }
};

class window_deleter {
public:

  void operator()(SDL_Window* ptr)
  {
    SDL_DestroyWindow(ptr);
  }
};

using window_ptr = std::unique_ptr<SDL_Window, window_deleter>;

class renderer_deleter {
public:

  void operator()(SDL_Renderer* ptr)
  {
    SDL_DestroyRenderer(ptr);
  }
};

using renderer_ptr = std::unique_ptr<SDL_Renderer, renderer_deleter>;

class surface_deleter {
public:

  void operator()(SDL_Surface* ptr)
  {
    SDL_FreeSurface(ptr);
  }
};

using surface_ptr = std::unique_ptr<SDL_Surface, surface_deleter>;

class texture_deleter {
public:

  void operator()(SDL_Texture* ptr)
  {
    SDL_DestroyTexture(ptr);
  }
};

using texture_ptr = std::unique_ptr<SDL_Texture, texture_deleter>;

class Renderer {
public:

  Renderer();

  void render(Game& game);

  int loadImageFromFile(std::string filename);

private:

  // Important wrappers
  sdl_wrapper sdl_;
  img_wrapper img_;
  window_ptr win_;
  renderer_ptr ren_;

  // Textures loaded from files
  std::vector<texture_ptr> textures_;
  std::map<std::string, int> filenameToTexId_;

  // Sprite rendering
  void renderSprite(const Sprite& sprite);

  // Map rendering
  texture_ptr renderMapLayer(const Map& map, bool above);

  std::string cachedMapName_;
  std::string cachedTilesetName_;
  texture_ptr tilesetTex_;
  texture_ptr renLowerLayer_;
  texture_ptr renUpperLayer_;
  texture_ptr mapSwapTex_;

  // Text rendering
  struct MessageCache {
    texture_ptr renderedTex;
    std::vector<int> charIndexToWidth;
    std::string line;
    std::string overflow;
  };

  void renderMessageLine(MessageCache& line, const std::string& text, Game& game);

  MessageCache messageLines_[2];
  int speakerHeaderTex_ = -1;
  MessageCache speakerHeaderLine_;
  int advMsgArrowTex_ = -1;
  int choiceArrowTex_ = -1;

  // Debug console
  texture_ptr debugConsoleTex_;
  std::string cachedDebugText_;
  SDL_Rect debugDestRect_;
};

#endif /* end of include guard: RENDERER_H_6A58EC30 */