Guest User

MipMap.h

a guest
Dec 7th, 2013
98
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.31 KB | None | 0 0
  1. #pragma once
  2.  
  3. #include <type_traits>
  4.  
  5. #include "Mipmapable.h"
  6.  
  7. template <typename T>
  8. struct isMipmapable : std::conditional<std::is_base_of<Mipmapable<T>,T>::value,
  9.     std::true_type, std::false_type>::type {};
  10.  
  11. template <typename T, typename = void> class MipMap;
  12.  
  13. template <typename T>
  14. class MipMap<T, typename std::enable_if<isMipmapable<T>::value, void>::type>
  15. {
  16. public:
  17.     MipMap::MipMap(T* topMap, const int levels) {
  18.         if (levels < 1)
  19.             THROW("There must be at least 1 mipmap level.");
  20.         mipMapLevels = levels;
  21.         mipMaps = (T**) malloc(sizeof(T*) * mipMapLevels);
  22.         mipMaps[0] = topMap;
  23.         for (int i = 1; i < mipMapLevels; i++) {
  24.             mipMaps[i] = NULL;
  25.         }
  26.     }
  27.  
  28.     MipMap::~MipMap(void) {
  29.         for (int i = 1; i < mipMapLevels; i++) {
  30.             delete mipMaps[i];
  31.         }
  32.         delete mipMaps;
  33.     }
  34.  
  35.     void assertMipMaps() {
  36.         for (int i = 1; i < mipMapLevels; i++) {
  37.             if (mipMaps[i] == NULL) {
  38.                 mipMaps[i] = mipMaps[i - 1]->makeMipMap();
  39.             }
  40.         }
  41.     }
  42.  
  43.     int getMipMapCount() {
  44.         return mipMapLevels;
  45.     }
  46.  
  47.     void setMipMap(T* mipMap, int level) {
  48.         if (level < 0 || level >= mipMapLevels)
  49.             THROW("Level must be between 0 and " << (mipMapLevels - 1) << " for this mipmap.");
  50.         if (mipMaps[level] != NULL)
  51.             delete mipMaps[level];
  52.         mipMaps[level] = mipMap;
  53.     }
  54.  
  55. private:
  56.     T** mipMaps;
  57.     int mipMapLevels;
  58. };
Advertisement
Add Comment
Please, Sign In to add comment