This commit is contained in:
King_DuckZ 2015-08-28 17:31:05 +02:00
parent eecd1d1649
commit 4df71e46a1
4 changed files with 33 additions and 3 deletions

View file

@ -25,6 +25,7 @@
#include <memory>
#include <cstdint>
#include <boost/iterator/indirect_iterator.hpp>
#include <functional>
namespace dk {
template <uint32_t D>
@ -38,6 +39,7 @@ namespace dk {
typedef typename LayerBase<D>::coords coords;
typedef boost::indirect_iterator<typename LayerList::iterator> iterator;
typedef boost::indirect_iterator<typename LayerList::const_iterator> const_iterator;
typedef std::function<void(const LayerBase<D>&, bool) noexcept> layer_callback;
Tyler ( void );
Tyler ( Tyler&& ) = default;
@ -54,9 +56,12 @@ namespace dk {
const_iterator end ( void ) const;
void preload ( const coords& parFrom, const coords& parTo );
void register_for_layeradd ( layer_callback parCallback );
void unregister_for_layeradd ( layer_callback parCallback );
private:
LayerList m_layers;
std::vector<layer_callback> m_layer_add_callbacks;
};
} //namespace dk

View file

@ -37,6 +37,8 @@ namespace dk {
struct TileInfo {
typedef Vector<D> coords;
TileInfo ( const LayerBase<D>& parLayer );
coords tile_size;
coords map_size;
};
@ -76,6 +78,8 @@ namespace dk {
template <typename T>
typename Layer<T, D>::const_iterator cend ( const Layer<T, D>& parLayer ) const;
void set_tile_info ( const TileInfo<D>* parTileInfo );
private:
void clip_pixel_offset ( void );

View file

@ -20,10 +20,21 @@ namespace dk {
LayeredViewport<D>::LayeredViewport (Tyler<D>& parTyler) :
m_tyler(parTyler)
{
for (const auto& layer : m_tyler) {
const TileInfo<D> tinfo(layer);
auto it_found = m_views.find(tinfo);
if (m_views.end() == it_found) {
auto it_new = m_views.insert(it_found, Viewport<D>(m_tyler, nullptr));
it_new->second.set_tile_info(&it_new->first);
}
}
m_tyler.register_for_layeradd(this);
}
template <uint32_t D>
LayeredViewport<D>::~LayeredViewport() {
LayeredViewport<D>::~LayeredViewport() noexcept {
m_tyler.unregister_for_layeradd(this);
}
template <uint32_t D>

View file

@ -16,6 +16,13 @@
*/
namespace dk {
template <uint32_t D>
TileInfo<D>::TileInfo (const LayerBase<D>& parLayer) :
tile_size(parLayer.tile_size()),
map_size(parLayer.map_size())
{
}
template <uint32_t D>
inline std::size_t hash_value (const TileInfo<D>& parTProps) noexcept {
std::size_t seed = 0;
@ -33,7 +40,6 @@ namespace dk {
m_tyler(parTyler),
m_tile_info(parTileInfo)
{
DK_ASSERT(m_tile_info);
}
template <uint32_t D>
@ -43,7 +49,6 @@ namespace dk {
m_tyler(parTyler),
m_tile_info(parTileInfo)
{
DK_ASSERT(m_tile_info);
DK_ASSERT(parPos < parPos + m_tile_info->map_size); //parSize > 0
DK_ASSERT(m_tile_info->map_size + parPos <= m_tile_info->map_size);
m_tyler.preload(m_view.position(), m_view.position() + this->size());
@ -145,4 +150,9 @@ namespace dk {
auto Viewport<D>::pixel_offset() const -> coords {
return static_cast<coords>(m_pixel_offset);
}
template <uint32_t D>
void Viewport<D>::set_tile_info (const TileInfo<D>* parTileInfo) {
m_tile_info = parTileInfo;
}
} //namespace dk