Advertisement
Guest User

Untitled

a guest
Jan 4th, 2014
136
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.10 KB | None | 0 0
  1. #ifndef __MV_TEXTURES_H__
  2. #define __MV_TEXTURES_H__
  3.  
  4. #include <fstream>
  5. #include <map>
  6. #include <vector>
  7. #include <string>
  8. #include <functional>
  9. #include <memory>
  10.  
  11. #include "render.h"
  12.  
  13. #include "cereal/cereal.hpp"
  14. #include "cereal/types/map.hpp"
  15. #include "cereal/types/memory.hpp"
  16. #include "cereal/types/string.hpp"
  17. #include "cereal/types/base_class.hpp"
  18.  
  19. namespace MV {
  20. SDL_Surface* converToPowerOfTwo(SDL_Surface* surface);
  21. GLenum getTextureFormat(SDL_Surface* img);
  22. GLenum getInternalTextureFormat(SDL_Surface* img);
  23.  
  24. //These methods are all destructive to the original surface. Do not rely on SDL_Surface being viable after calling.
  25. SDL_Surface* convertToPowerOfTwoSurface(SDL_Surface *a_img);
  26. bool loadTextureFromFile(const std::string &file, GLuint &imageLoaded, Size<int> &size, bool repeat);
  27. bool loadTextureFromSurface(SDL_Surface *img, GLuint &imageLoaded, Size<int> &size, bool repeat);
  28.  
  29. class TextureHandle;
  30. class TextureDefinition : public std::enable_shared_from_this<TextureDefinition> {
  31. template <class Archive>
  32. friend void serialize(Archive & archive, TextureDefinition & texture);
  33. public:
  34. virtual ~TextureDefinition(){}
  35. std::shared_ptr<TextureHandle> makeHandle();
  36. std::shared_ptr<TextureHandle> makeHandle(const Point<int> &a_position, const Size<int> &a_size);
  37.  
  38. void setOnReload(std::function< void (std::shared_ptr<TextureDefinition>) > a_onReload);
  39. void clearOnReload();
  40.  
  41. GLuint textureId() const;
  42. std::string name() const;
  43. Size<int> size() const;
  44.  
  45. //bookkeeping
  46. void reload();
  47. void cleanup();
  48.  
  49. protected:
  50. TextureDefinition(const std::string &a_name);
  51.  
  52. std::string textureName;
  53. Size<int> textureSize;
  54. GLuint texture;
  55.  
  56. std::vector< std::weak_ptr<TextureHandle> > handles;
  57.  
  58. private:
  59. virtual void reloadImplementation() = 0;
  60. virtual void cleanupImplementation(){}
  61.  
  62. std::function< void (std::shared_ptr<TextureDefinition>) > onReload;
  63. };
  64.  
  65. template <class Archive>
  66. void serialize(Archive & archive, TextureDefinition &texture){
  67. archive(cereal::make_nvp("name", texture.textureName), cereal::make_nvp("size", textureSize), cereal::make_nvp("handles", handles));
  68. }
  69.  
  70. class FileTextureDefinition : public TextureDefinition {
  71. public:
  72. static std::shared_ptr<FileTextureDefinition> make(const std::string &a_filename, bool a_repeat = false){
  73. return std::shared_ptr<FileTextureDefinition>(new FileTextureDefinition(a_filename, a_repeat));
  74. }
  75.  
  76. template <class Archive>
  77. static FileTextureDefinition * load_and_allocate(Archive &ar){
  78. return new FileTextureDefinition("", false);
  79. }
  80.  
  81. template <class Archive>
  82. void serialize(Archive & archive){
  83. archive(cereal::base_class<TextureDefinition>(this), CEREAL_NVP(repeat));
  84. if(!handles.empty()){
  85. reload();
  86. }
  87. }
  88. private:
  89. FileTextureDefinition(const std::string &a_filename, bool a_repeat):
  90. TextureDefinition(a_filename),
  91. repeat(a_repeat){
  92. }
  93. virtual void reloadImplementation();
  94.  
  95. bool repeat;
  96. };
  97.  
  98. class DynamicTextureDefinition : public TextureDefinition {
  99. public:
  100. static std::shared_ptr<DynamicTextureDefinition> make(const std::string &a_name, const Size<int> &a_size){
  101. return std::shared_ptr<DynamicTextureDefinition>(new DynamicTextureDefinition(a_name, a_size));
  102. }
  103.  
  104. template <class Archive>
  105. static DynamicTextureDefinition * load_and_allocate(Archive &ar){
  106. return new DynamicTextureDefinition("", Size<int>());
  107. }
  108.  
  109. template <class Archive>
  110. void serialize(Archive & archive){
  111. archive(cereal::base_class<TextureDefinition>(this));
  112. if(!handles.empty()){
  113. reload();
  114. }
  115. }
  116. private:
  117. DynamicTextureDefinition(const std::string &a_name, const Size<int> &a_size):
  118. TextureDefinition(a_name){
  119. textureSize = a_size;
  120. }
  121. virtual void reloadImplementation();
  122. };
  123.  
  124. class SurfaceTextureDefinition : public TextureDefinition {
  125. public:
  126. static std::shared_ptr<SurfaceTextureDefinition> make(const std::string &a_name, std::function<SDL_Surface*()> a_surfaceGenerator){
  127. return std::shared_ptr<SurfaceTextureDefinition>(new SurfaceTextureDefinition(a_name, a_surfaceGenerator));
  128. }
  129.  
  130. Size<int> surfaceSize() const;
  131.  
  132. void setSurfaceGenerator(std::function<SDL_Surface*()> a_surfaceGenerator){
  133. surfaceGenerator = a_surfaceGenerator;
  134. if(!handles.empty()){
  135. reload();
  136. }
  137. }
  138.  
  139. template <class Archive>
  140. static SurfaceTextureDefinition * load_and_allocate(Archive &ar){
  141. return new SurfaceTextureDefinition("", []->SDL_Surface* (){ return nullptr; });
  142. }
  143.  
  144. template <class Archive>
  145. void serialize(Archive & archive){
  146. archive(cereal::base_class<TextureDefinition>(this));
  147. //Must manually setSurfaceGenerator;
  148. }
  149. private:
  150. SurfaceTextureDefinition(const std::string &a_name, std::function<SDL_Surface*()> a_surfaceGenerator):
  151. TextureDefinition(a_name),
  152. surfaceGenerator(a_surfaceGenerator){
  153. }
  154. virtual void reloadImplementation();
  155. std::function<SDL_Surface*()> surfaceGenerator;
  156. Size<int> generatedSurfaceSize;
  157. };
  158.  
  159. class TextureHandle : public std::enable_shared_from_this<TextureHandle> {
  160. friend TextureDefinition;
  161. Slot<void(std::shared_ptr<TextureHandle>)> sizeChanges;
  162. public:
  163. ~TextureHandle();
  164. typedef Signal<void (std::shared_ptr<TextureHandle>)> Signal;
  165.  
  166. Size<int> size() const;
  167. Point<int> position() const;
  168.  
  169. Size<double> percentSize() const;
  170. Point<double> percentPosition() const;
  171.  
  172. Point<double> percentTopLeft() const;
  173. Point<double> percentBottomRight() const;
  174.  
  175. double percentLeft() const;
  176. double percentRight() const;
  177. double percentTop() const;
  178. double percentBottom() const;
  179.  
  180. void setCorners(const Point<int> &a_topLeft, const Point<int> &a_bottomRight);
  181. void setCorners(const Point<> &a_topLeft, const Point<> &a_bottomRight);
  182.  
  183. void setBounds(const Point<int> &a_topLeft, const Size<int> &a_size);
  184. void setBounds(const Point<> &a_topLeft, const Size<> &a_size);
  185.  
  186. void setFlipX(bool a_flip);
  187. void setFlipY(bool a_flip);
  188.  
  189. bool flippedX() const;
  190. bool flippedY() const;
  191.  
  192. std::shared_ptr<TextureDefinition> texture() const;
  193.  
  194. SlotRegister<void(std::shared_ptr<TextureHandle>)> sizeObserver;
  195.  
  196. template <class Archive>
  197. static TextureHandle * load_and_allocate(Archive &ar){
  198. return new TextureHandle();
  199. }
  200.  
  201. template <class Archive>
  202. void serialize(Archive & archive){
  203. archive(CEREAL_NVP(handleSize), CEREAL_NVP(handlePosition),
  204. CEREAL_NVP(handlePercentSize), CEREAL_NVP(handlePercentPosition),
  205. CEREAL_NVP(handlePercentTopLeft), CEREAL_NVP(handlePercentBottomRight),
  206. CEREAL_NVP(flipX), CEREAL_NVP(flipY),
  207. CEREAL_NVP(textureDefinition));
  208. }
  209. private:
  210. TextureHandle(); //for serialization support, do not invoke otherwise.
  211. TextureHandle(std::shared_ptr<TextureDefinition> a_texture, const Point<int> &a_position = Point<int>(0, 0), const Size<int> &a_size = Size<int>(-1, -1));
  212.  
  213. void updatePercentBounds();
  214. void updateIntegralBounds();
  215. void updatePercentCorners();
  216.  
  217. Size<int> handleSize;
  218. Point<int> handlePosition;
  219.  
  220. Size<double> handlePercentSize;
  221. Point<double> handlePercentPosition;
  222.  
  223. Point<double> handlePercentTopLeft;
  224. Point<double> handlePercentBottomRight;
  225.  
  226. bool flipX;
  227. bool flipY;
  228.  
  229. std::shared_ptr<TextureDefinition> textureDefinition;
  230. };
  231.  
  232. class SharedTextures {
  233. public:
  234. std::shared_ptr<FileTextureDefinition> getFileTexture(const std::string &a_filename, bool a_repeat = false);
  235. std::shared_ptr<DynamicTextureDefinition> getDynamicTexture(const std::string &a_identifier, const Size<int> &a_size);
  236. std::shared_ptr<SurfaceTextureDefinition> getSurfaceTexture(const std::string &a_identifier, std::function<SDL_Surface*()> a_surfaceGenerator);
  237.  
  238. template <class Archive>
  239. void serialize(Archive & archive){
  240. archive(CEREAL_NVP(fileDefinitions), CEREAL_NVP(dynamicDefinitions), CEREAL_NVP(surfaceDefinitions));
  241. }
  242. private:
  243. std::map<std::string, std::shared_ptr<FileTextureDefinition>> fileDefinitions;
  244. std::map<std::string, std::shared_ptr<DynamicTextureDefinition>> dynamicDefinitions;
  245. std::map<std::string, std::shared_ptr<SurfaceTextureDefinition>> surfaceDefinitions;
  246. };
  247.  
  248. }
  249. #endif
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement