diff --git a/include/doorkeeper/components/layer.hpp b/include/doorkeeper/components/layer.hpp index 42f0e90..7ebce9e 100644 --- a/include/doorkeeper/components/layer.hpp +++ b/include/doorkeeper/components/layer.hpp @@ -44,7 +44,8 @@ namespace dk { virtual ~LayerBase ( void ) noexcept = default; void preload ( const coords& parFrom, const coords& parTo ); - const coords& mapSize ( void ) const { return m_count; } + const coords& map_size ( void ) const { return m_count; } + const coords& tile_size ( void ) const { return m_tilesize; } protected: coords m_count; @@ -68,7 +69,7 @@ namespace dk { Layer ( const Layer& ) = delete; Layer ( Layer&& ) = default; - Layer ( const coords& parTileSize, BaseMapSource* parTilemap ); + explicit Layer ( BaseMapSource* parTilemap ); virtual ~Layer ( void ) noexcept = default; Layer& operator= ( const Layer& ) = delete; diff --git a/include/doorkeeper/components/layeredviewport.hpp b/include/doorkeeper/components/layeredviewport.hpp new file mode 100644 index 0000000..5ee092c --- /dev/null +++ b/include/doorkeeper/components/layeredviewport.hpp @@ -0,0 +1,49 @@ +/* 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 . + */ + +#ifndef id83407244096746CDBFF64D23F0B1701A +#define id83407244096746CDBFF64D23F0B1701A + +#include "doorkeeper/primitivetypes.hpp" +#include "doorkeeper/components/viewport.hpp" +#include "doorkeeper/components/tyler.hpp" +#include "doorkeeper/components/layer.hpp" + +namespace dk { + template + class LayeredViewport { + public: + typedef VectorT coords_f; + + explicit LayeredViewport ( Tyler& parTyler ); + ~LayeredViewport ( void ) noexcept; + + LayeredViewport& operator+= ( const coords_f& parValue ); + LayeredViewport& operator-= ( const coords_f& parValue ); + + void on_layer_added ( const LayerBase* parLayer ); + void on_layer_removed ( const LayerBase* parLayer ); + + private: + typedef std::vector> ViewportList; + Tyler& m_tyler; + }; +} //namespace dk + +#include "doorkeeper/implem/layeredviewport.inl" + +#endif diff --git a/include/doorkeeper/components/tyler.hpp b/include/doorkeeper/components/tyler.hpp index aa288e4..63d98d5 100644 --- a/include/doorkeeper/components/tyler.hpp +++ b/include/doorkeeper/components/tyler.hpp @@ -36,15 +36,10 @@ namespace dk { public: typedef typename LayerBase::coords coords; - Tyler ( void ) = delete; + Tyler ( void ); Tyler ( Tyler&& ) = default; - Tyler ( const coords& parMapSize, const coords& parTileSize ); ~Tyler ( void ) noexcept = default; - typename coords::scalar_type tiles_count ( void ) const; - const coords& map_size ( void ) const { return m_size; } - const coords& tile_size ( void ) const { return m_tilesize; } - template Layer& push_layer ( BaseMapSource* parTilemap, int parIndex ); template @@ -53,8 +48,6 @@ namespace dk { void preload ( const coords& parFrom, const coords& parTo ); private: - coords m_size; - const coords m_tilesize; LayerList m_layers; }; } //namespace dk diff --git a/include/doorkeeper/implem/layer.inl b/include/doorkeeper/implem/layer.inl index b68a8ef..b2620cc 100644 --- a/include/doorkeeper/implem/layer.inl +++ b/include/doorkeeper/implem/layer.inl @@ -60,8 +60,8 @@ namespace dk { ///-------------------------------------------------------------------------- ///-------------------------------------------------------------------------- template - Layer::Layer (const coords& parTileSize, BaseMapSource* parTilemap) : - LayerBase(parTilemap->mapSize(), parTileSize), + Layer::Layer (BaseMapSource* parTilemap) : + LayerBase(parTilemap->mapSize(), parTilemap->tileSize()), m_tilemap(parTilemap) { DK_ASSERT(m_tilemap); diff --git a/include/doorkeeper/implem/layeredviewport.inl b/include/doorkeeper/implem/layeredviewport.inl new file mode 100644 index 0000000..5c7f110 --- /dev/null +++ b/include/doorkeeper/implem/layeredviewport.inl @@ -0,0 +1,46 @@ +/* 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 . + */ + +namespace dk { + template + LayeredViewport::LayeredViewport (Tyler& parTyler) : + m_tyler(parTyler) + { + } + + template + LayeredViewport::~LayeredViewport() { + } + + template + LayeredViewport& LayeredViewport::operator+= (const coords_f& parValue) { + return *this; + } + + template + LayeredViewport& LayeredViewport::operator-= (const coords_f& parValue) { + return *this; + } + + template + void LayeredViewport::on_layer_added (const LayerBase* parLayer) { + } + + template + void LayeredViewport::on_layer_removed (const LayerBase* parLayer) { + } +} //namespace dk diff --git a/include/doorkeeper/implem/maploader.inl b/include/doorkeeper/implem/maploader.inl index 4f97baa..bef5ba6 100644 --- a/include/doorkeeper/implem/maploader.inl +++ b/include/doorkeeper/implem/maploader.inl @@ -19,7 +19,7 @@ namespace dkh { template dk::Tyler map_load (C& parFileOpener, const std::string& parOpen, const PushLayerMapType& parPusher) { dk::BaseMapSource* reader = parFileOpener(parOpen); - dk::Tyler tyler(reader->mapSize(), reader->tileSize()); + dk::Tyler tyler; for (int z = 0; z < reader->layersCount(); ++z) { implem::call_push_layer(tyler, parPusher, reader, z); } diff --git a/include/doorkeeper/implem/tyler.inl b/include/doorkeeper/implem/tyler.inl index 83c3b13..e67ef62 100644 --- a/include/doorkeeper/implem/tyler.inl +++ b/include/doorkeeper/implem/tyler.inl @@ -19,21 +19,7 @@ namespace dk { ///-------------------------------------------------------------------------- ///-------------------------------------------------------------------------- template - Tyler::Tyler (const coords& parMapSize, const coords& parTileSize) : - m_size(parMapSize), - m_tilesize(parTileSize) - { - } - - ///-------------------------------------------------------------------------- - ///-------------------------------------------------------------------------- - template - typename Tyler::coords::scalar_type Tyler::tiles_count() const { - typename coords::scalar_type retval = 1; - for (uint32_t d = 0; d < D; ++d) { - retval *= m_size[d]; - } - return retval; + Tyler::Tyler() { } ///-------------------------------------------------------------------------- @@ -44,17 +30,7 @@ namespace dk { //TODO: store the index (void)parIndex; - auto newLayer = new Layer(m_tilesize, parTilemap); - if (m_size == coords(0)) { - m_size = newLayer->mapSize(); - } - else { - DK_ASSERT(newLayer->mapSize() == m_size); - if (newLayer->mapSize() != m_size) { - throw SizeMismatchException(); - } - } - DK_ASSERT(newLayer->mapSize() == m_size); + auto newLayer = new Layer(parTilemap); m_layers.push_back(LayerPtr(newLayer)); return *newLayer; } diff --git a/test/main.cpp b/test/main.cpp index 122b8e0..2bf09bd 100644 --- a/test/main.cpp +++ b/test/main.cpp @@ -87,7 +87,7 @@ int main() { &SDL_DestroyRenderer ); - dk::Tyler<2> tiler(coords2(10, 23), coords2(64)); + dk::Tyler<2> tiler; LayerWithData bottomLayer; addLayer(tiler, bottomLayer, DATA_PATH"/test.map"); @@ -99,9 +99,8 @@ int main() { printViewport(dk::Viewport<2>(tiler, coords2(4, 4), coords2(0)), *bottomLayer.layer); #if !defined(NDEBUG) - std::cout << "Map size: " << tiler.map_size() << '\n'; + std::cout << "Map size: " << bottomLayer.layer->map_size() << '\n'; #endif - std::cout << "Total tiles: " << tiler.tiles_count() << '\n'; //Load resources SDLTextureUPtr tile_0(nullptr, &SDL_DestroyTexture), tile_1(nullptr, &SDL_DestroyTexture); @@ -113,7 +112,7 @@ int main() { //Main loop bool running = true; int y = 0; - dk::Viewport<2> viewport(tiler, tiler.map_size(), coords2(0)); + dk::Viewport<2> viewport(tiler, bottomLayer.layer->map_size(), coords2(0)); coords2 tile_size; SDL_QueryTexture(tile_0.get(), nullptr, nullptr, &tile_size.x(), &tile_size.y()); do { @@ -121,7 +120,7 @@ int main() { viewport.setFrom(coords2(0, y / tile_size.y())); draw_tiles(sdl_renderer.get(), tile_0.get(), tile_1.get(), viewport, *bottomLayer.layer, -(y % tile_size.y())); //++y; - if (tile_size.y() * bottomLayer.layer->mapSize().y() == y) + if (tile_size.y() * bottomLayer.layer->map_size().y() == y) y = 0; SDL_RenderPresent(sdl_renderer.get());