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

View file

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

View file

@ -20,10 +20,21 @@ namespace dk {
LayeredViewport<D>::LayeredViewport (Tyler<D>& parTyler) : LayeredViewport<D>::LayeredViewport (Tyler<D>& parTyler) :
m_tyler(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> template <uint32_t D>
LayeredViewport<D>::~LayeredViewport() { LayeredViewport<D>::~LayeredViewport() noexcept {
m_tyler.unregister_for_layeradd(this);
} }
template <uint32_t D> template <uint32_t D>

View file

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