00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #ifndef LIBPROCTERCPARENTMAP_H
00018 #define LIBPROCTERCPARENTMAP_H
00019
00020 #include <libprocter/cmap.h>
00021 #include <libprocter/ctilesurface.h>
00022
00023 namespace libProcTer {
00024
00036 template<typename T>
00037 class CParentMap
00038 {
00039 public:
00056 CParentMap(const CGridPosition &pos, const CTileSurface * const *parents, CTileSurface::eTextureType type);
00057
00068 T *getLandel(int x, int y);
00069
00070 protected:
00072 CMap<T> *m_Maps[4];
00073
00075
00076 unsigned int m_dx, m_dy;
00078 };
00079
00080
00081 template<typename T>
00082 CParentMap<T>::CParentMap(const CGridPosition &pos, const CTileSurface * const *parents, CTileSurface::eTextureType type)
00083 {
00084 for(unsigned int i=0; i < 4; i++)
00085 {
00086 if(parents[i] == NULL)
00087 {m_Maps[i] = NULL; continue;}
00088
00089 m_Maps[i] = (CMap<T> *)(parents[i]->getInternalMap(type));
00090 }
00091
00092 m_dx = 2*PROCTER_TEX_RES;
00093 m_dy = 2*PROCTER_TEX_RES;
00094 if(pos.u & 0x1) m_dx = PROCTER_TEX_RES;
00095 if(pos.v & 0x1) m_dy = PROCTER_TEX_RES;
00096 }
00097
00098 template<typename T>
00099 T *CParentMap<T>::getLandel(int x, int y)
00100 {
00101
00102 x += m_dx;
00103 y += m_dy;
00104
00105
00106 x >>= 1;
00107 y >>= 1;
00108
00109
00110 unsigned int parent_index = 0;
00111 if(x >= PROCTER_TEX_RES)
00112 {
00113 parent_index++;
00114 x -= PROCTER_TEX_RES;
00115 }
00116 if(y >= PROCTER_TEX_RES)
00117 {
00118 parent_index += 2;
00119 y -= PROCTER_TEX_RES;
00120 }
00121
00122 CMap<T> *map = m_Maps[parent_index];
00123 if(map == NULL) return NULL;
00124
00125 T *base = map->getData();
00126 if(base == NULL) return NULL;
00127
00128 return base + (x + PROCTER_TEX_RES*y);
00129 }
00130
00131 }
00132
00133 #endif
00134
00135