From a7dd322da62780af67b045b18117a0fa7f190c4c Mon Sep 17 00:00:00 2001 From: King_DuckZ Date: Thu, 27 Aug 2015 17:12:55 +0200 Subject: [PATCH] DELEME2 --- .../doorkeeper/components/layeredviewport.hpp | 18 ++++++++- include/doorkeeper/components/tyler.hpp | 8 ++++ include/doorkeeper/components/viewport.hpp | 19 ++++++++-- include/doorkeeper/doorkeeper.hpp | 1 + include/doorkeeper/implem/layeredviewport.inl | 34 +++++++++++++++++ include/doorkeeper/implem/tyler.inl | 28 ++++++++++++++ include/doorkeeper/implem/viewport.inl | 37 +++++++++++++------ test/main.cpp | 2 + test/unit/CMakeLists.txt | 1 + test/unit/layeredviewport.cpp | 25 +++++++++++++ 10 files changed, 158 insertions(+), 15 deletions(-) create mode 100644 test/unit/layeredviewport.cpp diff --git a/include/doorkeeper/components/layeredviewport.hpp b/include/doorkeeper/components/layeredviewport.hpp index 5ee092c..f299e13 100644 --- a/include/doorkeeper/components/layeredviewport.hpp +++ b/include/doorkeeper/components/layeredviewport.hpp @@ -22,12 +22,22 @@ #include "doorkeeper/components/viewport.hpp" #include "doorkeeper/components/tyler.hpp" #include "doorkeeper/components/layer.hpp" +#include +#include +#include +#include namespace dk { + template + class Tyler; + template class LayeredViewport { + typedef std::map, Viewport> ViewportList; public: typedef VectorT coords_f; + typedef boost::transform_iterator&(const LayerBase&)>, typename Tyler::iterator> iterator; + typedef boost::transform_iterator&(const LayerBase&)>, typename Tyler::const_iterator> const_iterator; explicit LayeredViewport ( Tyler& parTyler ); ~LayeredViewport ( void ) noexcept; @@ -37,9 +47,15 @@ namespace dk { void on_layer_added ( const LayerBase* parLayer ); void on_layer_removed ( const LayerBase* parLayer ); + iterator begin ( void ); + const_iterator begin ( void ) const; + iterator end ( void ); + const_iterator end ( void ) const; + Viewport& viewport ( const LayerBase& parLayer ); + const Viewport& viewport ( const LayerBase& parLayer ) const; private: - typedef std::vector> ViewportList; + ViewportList m_views; Tyler& m_tyler; }; } //namespace dk diff --git a/include/doorkeeper/components/tyler.hpp b/include/doorkeeper/components/tyler.hpp index 63d98d5..c9b47fb 100644 --- a/include/doorkeeper/components/tyler.hpp +++ b/include/doorkeeper/components/tyler.hpp @@ -24,6 +24,7 @@ #include #include #include +#include namespace dk { template @@ -35,6 +36,8 @@ namespace dk { typedef std::vector LayerList; public: typedef typename LayerBase::coords coords; + typedef boost::indirect_iterator iterator; + typedef boost::indirect_iterator const_iterator; Tyler ( void ); Tyler ( Tyler&& ) = default; @@ -45,6 +48,11 @@ namespace dk { template void push_layer_void ( BaseMapSource* parTilemap, int parIndex ); + iterator begin ( void ); + const_iterator begin ( void ) const; + iterator end ( void ); + const_iterator end ( void ) const; + void preload ( const coords& parFrom, const coords& parTo ); private: diff --git a/include/doorkeeper/components/viewport.hpp b/include/doorkeeper/components/viewport.hpp index a68cd0b..5ecd8d4 100644 --- a/include/doorkeeper/components/viewport.hpp +++ b/include/doorkeeper/components/viewport.hpp @@ -24,6 +24,7 @@ #include "doorkeeper/components/tilecoords.hpp" #include #include +#include namespace dk { template @@ -32,6 +33,17 @@ namespace dk { template class Layer; + template + struct TileInfo { + typedef Vector coords; + + coords tile_size; + coords map_size; + }; + + template + std::size_t hash_value ( const TileInfo& parTProps ) noexcept a_pure; + template class Viewport { public: @@ -39,8 +51,8 @@ namespace dk { typedef VectorT coords_f; Viewport ( const Viewport& parOther ) = default; - explicit Viewport ( Tyler& parTyler ); - Viewport ( Tyler& parTyler, const coords& parSize, const coords& parPos ); + Viewport ( Tyler& parTyler, const TileInfo* parTileInfo ); + Viewport ( Tyler& parTyler, const TileInfo* parTileInfo, const coords& parPos ); ~Viewport ( void ) noexcept = default; Viewport& operator= ( const Viewport& ) = default; @@ -68,8 +80,9 @@ namespace dk { void clip_pixel_offset ( void ); TileCoords m_view; - Tyler& m_tyler; coords_f m_pixel_offset; + Tyler& m_tyler; + const TileInfo* const m_tile_info; }; } //namespace dk diff --git a/include/doorkeeper/doorkeeper.hpp b/include/doorkeeper/doorkeeper.hpp index 057e8fb..2e1834a 100644 --- a/include/doorkeeper/doorkeeper.hpp +++ b/include/doorkeeper/doorkeeper.hpp @@ -22,5 +22,6 @@ #include "components/tyler.hpp" #include "components/viewport.hpp" #include "components/layer.hpp" +#include "components/layeredviewport.hpp" #endif diff --git a/include/doorkeeper/implem/layeredviewport.inl b/include/doorkeeper/implem/layeredviewport.inl index 5c7f110..288b8cc 100644 --- a/include/doorkeeper/implem/layeredviewport.inl +++ b/include/doorkeeper/implem/layeredviewport.inl @@ -28,11 +28,17 @@ namespace dk { template LayeredViewport& LayeredViewport::operator+= (const coords_f& parValue) { + for (auto& view : m_views) { + view.second += parValue; + } return *this; } template LayeredViewport& LayeredViewport::operator-= (const coords_f& parValue) { + for (auto& view : m_views) { + view.second -= parValue; + } return *this; } @@ -43,4 +49,32 @@ namespace dk { template void LayeredViewport::on_layer_removed (const LayerBase* parLayer) { } + + template + auto LayeredViewport::begin() -> iterator { + return iterator(m_view.begin(), std::bind(&LayeredViewport::viewport, this, std::placeholders::_1)); + + template + auto LayeredViewport::begin() const -> const_iterator { + return const_iterator(m_view.begin(), std::bind(&LayeredViewport::viewport, this, std::placeholders::_1)); + } + + template + auto LayeredViewport::end() -> iterator { + return iterator(m_view.end(), std::bind(&LayeredViewport::viewport, this, std::placeholders::_1)); + + template + auto LayeredViewport::end() const -> const_iterator { + return const_iterator(m_view.end(), std::bind(&LayeredViewport::viewport, this, std::placeholders::_1)); + } + + template + Viewport& LayeredViewport::viewport (const LayerBase& parLayer) { + return const_cast&>(const_cast*>(this)->viewport(parLayer)); + + template + const Viewport& LayeredViewport::viewport (const LayerBase& parLayer) const { + const TileInfo tinfo { parLayer.tile_size(), parLayer.map_size() }; + return m_views[tinfo]; + } } //namespace dk diff --git a/include/doorkeeper/implem/tyler.inl b/include/doorkeeper/implem/tyler.inl index e67ef62..e15e2bd 100644 --- a/include/doorkeeper/implem/tyler.inl +++ b/include/doorkeeper/implem/tyler.inl @@ -51,4 +51,32 @@ namespace dk { layer->preload(parFrom, parTo); } } + + ///-------------------------------------------------------------------------- + ///-------------------------------------------------------------------------- + template + auto Tyler::begin() -> iterator { + return iterator(m_layers.begin()); + } + + ///-------------------------------------------------------------------------- + ///-------------------------------------------------------------------------- + template + auto Tyler::begin() const -> const_iterator { + return const_iterator(m_layers.begin()); + } + + ///-------------------------------------------------------------------------- + ///-------------------------------------------------------------------------- + template + auto Tyler::end() -> iterator { + return iterator(m_layers.end()); + } + + ///-------------------------------------------------------------------------- + ///-------------------------------------------------------------------------- + template + auto Tyler::end() const -> const_iterator { + return const_iterator(m_layers.end()); + } } //namespace dk diff --git a/include/doorkeeper/implem/viewport.inl b/include/doorkeeper/implem/viewport.inl index deb3a63..e50077b 100644 --- a/include/doorkeeper/implem/viewport.inl +++ b/include/doorkeeper/implem/viewport.inl @@ -17,20 +17,35 @@ namespace dk { template - Viewport::Viewport (Tyler& parTyler) : - m_tyler(parTyler), - m_pixel_offset(0) - { + inline std::size_t hash_value (const TileInfo& parTProps) noexcept { + std::size_t seed = 0; + for (uint32_t z = 0; z < D; ++z) { + boost::hash_combine(seed, parTProps.map_size[z]); + boost::hash_combine(seed, parTProps.tile_size[z]); + } + return seed; } template - Viewport::Viewport (Tyler& parTyler, const coords& parSize, const coords& parPos) : - m_view(parPos, parSize - 1), + Viewport::Viewport (Tyler& parTyler, const TileInfo* parTileInfo) : + m_view(parTileInfo->map_size - 1), + m_pixel_offset(0), m_tyler(parTyler), - m_pixel_offset(0) + m_tile_info(parTileInfo) { - DK_ASSERT(parPos < parPos + parSize); //parSize > 0 - DK_ASSERT(parSize + parPos <= parTyler.map_size()); + DK_ASSERT(m_tile_info); + } + + template + Viewport::Viewport (Tyler& parTyler, const TileInfo* parTileInfo, const coords& parPos) : + m_view(parPos, parTileInfo->map_size - 1), + m_pixel_offset(0), + 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()); } @@ -76,7 +91,7 @@ namespace dk { template void Viewport::setFrom (const coords& parFrom) { - DK_ASSERT(this->size() + parFrom <= m_tyler.map_size()); + DK_ASSERT(this->size() + parFrom <= m_tile_info->map_size); m_view.set_position(parFrom); m_tyler.preload(m_view.position(), m_view.position() + this->size()); } @@ -102,7 +117,7 @@ namespace dk { template void Viewport::clip_pixel_offset() { - const auto& tile_size = m_tyler.tile_size(); + const auto& tile_size = m_tile_info->tile_size; for (uint32_t z = 0; z < D; ++z) { auto offs = static_cast(m_pixel_offset[z]); if (std::abs(offs) >= tile_size[z]) { diff --git a/test/main.cpp b/test/main.cpp index 2bf09bd..105e9f9 100644 --- a/test/main.cpp +++ b/test/main.cpp @@ -95,6 +95,8 @@ int main() { LayerWithData topLayer; addLayer(tiler, topLayer, DATA_PATH"/test_2.map"); + dk::TileInfo<2> tinfo_10_6 { coords2(64), coords2(10, 6) }; + dk::TileInfo<2> tinfo_4_4 { coords2(64), coords2(4, 4) }; printViewport(dk::Viewport<2>(tiler, coords2(10, 6), coords2(0)), *bottomLayer.layer); printViewport(dk::Viewport<2>(tiler, coords2(4, 4), coords2(0)), *bottomLayer.layer); diff --git a/test/unit/CMakeLists.txt b/test/unit/CMakeLists.txt index de63bf5..f06b20e 100644 --- a/test/unit/CMakeLists.txt +++ b/test/unit/CMakeLists.txt @@ -13,6 +13,7 @@ add_executable(${PROJECT_NAME} vector.cpp tileiterator.cpp asciimapsource.cpp + layeredviewport.cpp ) target_link_libraries(${PROJECT_NAME} diff --git a/test/unit/layeredviewport.cpp b/test/unit/layeredviewport.cpp new file mode 100644 index 0000000..7eb35a4 --- /dev/null +++ b/test/unit/layeredviewport.cpp @@ -0,0 +1,25 @@ +/* Copyright 2015, Michele Santullo + * This file is part of DoorKeeper. + * + * DoorKeeper is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * DoorKeeper is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with DoorKeeper. If not, see . + */ + +#include +#include "doorkeeper/components/layeredviewport.hpp" +#include "doorkeeper/components/tyler.hpp" + +TEST(components, layeredviewport) { + dk::Tyler<3> tiler; + dk::layeredviewport<3> lview(tiler); +} \ No newline at end of file