Fix some asserts, get rid of subtiles params.

This commit is contained in:
King_DuckZ 2015-08-25 20:53:35 +02:00
parent ccd00df6d8
commit 6a6dfd9225
12 changed files with 102 additions and 39 deletions

View File

@ -29,6 +29,7 @@
#if !defined(NDEBUG) #if !defined(NDEBUG)
#include <iostream> #include <iostream>
#endif #endif
#include <functional>
namespace dk { namespace dk {
template <uint32_t D> template <uint32_t D>
@ -39,17 +40,15 @@ namespace dk {
public: public:
typedef Vector<D> coords; typedef Vector<D> coords;
LayerBase ( const coords& parCount, const coords& parTileSize, const coords& parMasterTileSize ); LayerBase ( const coords& parCount, const coords& parTileSize );
virtual ~LayerBase ( void ) noexcept = default; virtual ~LayerBase ( void ) noexcept = default;
void preload ( const coords& parFrom, const coords& parTo ); void preload ( const coords& parFrom, const coords& parTo );
coords count ( void ) const { return m_mastersize / m_tilesize * m_count; }
const coords& mapSize ( void ) const { return m_count; } const coords& mapSize ( void ) const { return m_count; }
protected: protected:
coords m_count; coords m_count;
coords m_tilesize; coords m_tilesize;
coords m_mastersize;
private: private:
virtual void onPreload ( const coords& parFrom, const coords& parTo ) = 0; virtual void onPreload ( const coords& parFrom, const coords& parTo ) = 0;
@ -69,7 +68,7 @@ namespace dk {
Layer ( const Layer& ) = delete; Layer ( const Layer& ) = delete;
Layer ( Layer&& ) = default; Layer ( Layer&& ) = default;
Layer ( const coords& parTileSize, const coords& parMasterTileSize, BaseMapSource<D>* parTilemap ); Layer ( const coords& parTileSize, BaseMapSource<D>* parTilemap );
virtual ~Layer ( void ) noexcept = default; virtual ~Layer ( void ) noexcept = default;
Layer& operator= ( const Layer& ) = delete; Layer& operator= ( const Layer& ) = delete;
@ -83,6 +82,11 @@ namespace dk {
std::vector<T> m_tiles; std::vector<T> m_tiles;
BaseMapSource<D>* m_tilemap; BaseMapSource<D>* m_tilemap;
}; };
namespace implem {
template <uint32_t D, typename O>
bool at_least_one ( const Vector<D>& parLeft, const Vector<D>& parRight, O parOp ) a_pure;
} //namespace implem
} //namespace dk } //namespace dk
#include "doorkeeper/implem/layer.inl" #include "doorkeeper/implem/layer.inl"

View File

@ -38,7 +38,7 @@ namespace dk {
Tyler ( void ) = delete; Tyler ( void ) = delete;
Tyler ( Tyler&& ) = default; Tyler ( Tyler&& ) = default;
explicit Tyler ( const coords& parTileSize ); Tyler ( const coords& parMapSize, const coords& parTileSize );
~Tyler ( void ) noexcept = default; ~Tyler ( void ) noexcept = default;
typename coords::scalar_type tiles_count ( void ) const; typename coords::scalar_type tiles_count ( void ) const;
@ -47,8 +47,6 @@ namespace dk {
template <typename T> template <typename T>
Layer<T, D>& push_layer ( BaseMapSource<D>* parTilemap, int parIndex ); Layer<T, D>& push_layer ( BaseMapSource<D>* parTilemap, int parIndex );
template <typename T> template <typename T>
Layer<T, D>& push_layer ( BaseMapSource<D>* parTilemap, const coords& parSubdiv, int parIndex );
template <typename T>
void push_layer_void ( BaseMapSource<D>* parTilemap, int parIndex ); void push_layer_void ( BaseMapSource<D>* parTilemap, int parIndex );
void preload ( const coords& parFrom, const coords& parTo ); void preload ( const coords& parFrom, const coords& parTo );

View File

@ -59,7 +59,7 @@ namespace dkh {
virtual void fetch_raw ( char* parOut, const coords& parFrom, const coords& parTo, std::size_t parSize ); virtual void fetch_raw ( char* parOut, const coords& parFrom, const coords& parTo, std::size_t parSize );
std::vector<MapTileType> m_wholedata; std::vector<MapTileType> m_wholedata;
const coords m_mapSize; coords m_mapSize;
const dk::PixelConvSquare<2> m_pixel_conv; const dk::PixelConvSquare<2> m_pixel_conv;
const dk::MapTypes m_mapType; const dk::MapTypes m_mapType;
}; };

View File

@ -16,24 +16,41 @@
*/ */
namespace dk { namespace dk {
namespace implem {
///----------------------------------------------------------------------
///----------------------------------------------------------------------
template <uint32_t D, typename O>
inline bool at_least_one (const Vector<D>& parLeft, const Vector<D>& parRight, O parOp) {
for (uint32_t z = 0; z < D; ++z) {
if (parOp(parLeft[z], parRight[z])) {
return true;
}
}
return false;
}
} //namespace implem
///-------------------------------------------------------------------------- ///--------------------------------------------------------------------------
///-------------------------------------------------------------------------- ///--------------------------------------------------------------------------
template <uint32_t D> template <uint32_t D>
LayerBase<D>::LayerBase (const coords& parCount, const coords& parTileSize, const coords& parMasterTileSize) : LayerBase<D>::LayerBase (const coords& parCount, const coords& parTileSize) :
m_count(parCount / (parMasterTileSize / parTileSize)), m_count(parCount),
m_tilesize(parTileSize), m_tilesize(parTileSize),
m_mastersize(parMasterTileSize),
m_haveFrom(0), m_haveFrom(0),
m_haveTo(0) m_haveTo(0)
{ {
DK_ASSERT((parMasterTileSize / parTileSize) * parTileSize == parMasterTileSize); DK_ASSERT(parCount > 0);
} }
///-------------------------------------------------------------------------- ///--------------------------------------------------------------------------
///-------------------------------------------------------------------------- ///--------------------------------------------------------------------------
template <uint32_t D> template <uint32_t D>
void LayerBase<D>::preload (const coords& parFrom, const coords& parTo) { void LayerBase<D>::preload (const coords& parFrom, const coords& parTo) {
if (parFrom < m_haveFrom or parTo > m_haveTo) { using implem::at_least_one;
using less = std::less<typename coords::scalar_type>;
using greater = std::greater<typename coords::scalar_type>;
if (at_least_one<D>(parFrom, m_haveFrom, less()) or at_least_one<D>(parTo, m_haveTo, greater())) {
this->onPreload(parFrom, parTo); this->onPreload(parFrom, parTo);
m_haveFrom = parFrom; m_haveFrom = parFrom;
m_haveTo = parTo; m_haveTo = parTo;
@ -43,8 +60,8 @@ namespace dk {
///-------------------------------------------------------------------------- ///--------------------------------------------------------------------------
///-------------------------------------------------------------------------- ///--------------------------------------------------------------------------
template <typename T, uint32_t D> template <typename T, uint32_t D>
Layer<T, D>::Layer (const coords& parTileSize, const coords& parMasterTileSize, BaseMapSource<D>* parTilemap) : Layer<T, D>::Layer (const coords& parTileSize, BaseMapSource<D>* parTilemap) :
LayerBase<D>(parTilemap->mapSize(), parTileSize, parMasterTileSize), LayerBase<D>(parTilemap->mapSize(), parTileSize),
m_tilemap(parTilemap) m_tilemap(parTilemap)
{ {
DK_ASSERT(m_tilemap); DK_ASSERT(m_tilemap);

View File

@ -19,7 +19,7 @@ namespace dkh {
template <uint32_t D, typename C> template <uint32_t D, typename C>
dk::Tyler<D> map_load (C& parFileOpener, const std::string& parOpen, const PushLayerMapType<D>& parPusher) { dk::Tyler<D> map_load (C& parFileOpener, const std::string& parOpen, const PushLayerMapType<D>& parPusher) {
dk::BaseMapSource<D>* reader = parFileOpener(parOpen); dk::BaseMapSource<D>* reader = parFileOpener(parOpen);
dk::Tyler<D> tyler(reader->tileSize()); dk::Tyler<D> tyler(reader->mapSize(), reader->tileSize());
for (int z = 0; z < reader->layersCount(); ++z) { for (int z = 0; z < reader->layersCount(); ++z) {
implem::call_push_layer<D>(tyler, parPusher, reader, z); implem::call_push_layer<D>(tyler, parPusher, reader, z);
} }

View File

@ -19,8 +19,8 @@ namespace dk {
///-------------------------------------------------------------------------- ///--------------------------------------------------------------------------
///-------------------------------------------------------------------------- ///--------------------------------------------------------------------------
template <uint32_t D> template <uint32_t D>
Tyler<D>::Tyler (const coords& parTileSize) : Tyler<D>::Tyler (const coords& parMapSize, const coords& parTileSize) :
m_size(0), m_size(parMapSize),
m_tilesize(parTileSize) m_tilesize(parTileSize)
{ {
} }
@ -41,18 +41,10 @@ namespace dk {
template <uint32_t D> template <uint32_t D>
template <typename T> template <typename T>
Layer<T, D>& Tyler<D>::push_layer (BaseMapSource<D>* parTilemap, int parIndex) { Layer<T, D>& Tyler<D>::push_layer (BaseMapSource<D>* parTilemap, int parIndex) {
return push_layer<T>(parTilemap, coords(static_cast<CoordinateScalarType>(1)), parIndex);
}
///--------------------------------------------------------------------------
///--------------------------------------------------------------------------
template <uint32_t D>
template <typename T>
Layer<T, D>& Tyler<D>::push_layer (BaseMapSource<D>* parTilemap, const coords& parSubdiv, int parIndex) {
//TODO: store the index //TODO: store the index
(void)parIndex; (void)parIndex;
auto newLayer = new Layer<T, D>(m_tilesize / parSubdiv, m_tilesize, parTilemap); auto newLayer = new Layer<T, D>(m_tilesize, parTilemap);
if (m_size == coords(0)) { if (m_size == coords(0)) {
m_size = newLayer->mapSize(); m_size = newLayer->mapSize();
} }
@ -62,7 +54,7 @@ namespace dk {
throw SizeMismatchException(); throw SizeMismatchException();
} }
} }
DK_ASSERT(newLayer->count() == m_size * parSubdiv); DK_ASSERT(newLayer->mapSize() == m_size);
m_layers.push_back(LayerPtr(newLayer)); m_layers.push_back(LayerPtr(newLayer));
return *newLayer; return *newLayer;
} }

View File

@ -36,14 +36,14 @@ namespace dk {
template <typename T> template <typename T>
typename Layer<T, D>::iterator Viewport<D>::begin (Layer<T, D>& parLayer) const { typename Layer<T, D>::iterator Viewport<D>::begin (Layer<T, D>& parLayer) const {
typedef typename Layer<T, D>::iterator IterType; typedef typename Layer<T, D>::iterator IterType;
return IterType(&parLayer.m_tiles, parLayer.m_tilemap->pixel_conv(), m_view.position(), m_tyler.map_size() - 1); return IterType(&parLayer.m_tiles, parLayer.m_tilemap->pixel_conv(), m_view.position(), m_view.upper());
} }
template <uint32_t D> template <uint32_t D>
template <typename T> template <typename T>
typename Layer<T, D>::iterator Viewport<D>::end (Layer<T, D>& parLayer) const { typename Layer<T, D>::iterator Viewport<D>::end (Layer<T, D>& parLayer) const {
typedef typename Layer<T, D>::iterator IterType; typedef typename Layer<T, D>::iterator IterType;
return IterType(&parLayer.m_tiles, parLayer.m_tilemap->pixel_conv(), make_past_end_coords<D>(m_tyler.map_size() - 1), make_past_end_coords<D>(m_tyler.map_size() - 1)); return IterType(&parLayer.m_tiles, parLayer.m_tilemap->pixel_conv(), make_past_end_coords<D>(m_view.upper()), make_past_end_coords<D>(m_view.upper()));
} }
template <uint32_t D> template <uint32_t D>
@ -62,14 +62,14 @@ namespace dk {
template <typename T> template <typename T>
typename Layer<T, D>::const_iterator Viewport<D>::cbegin (const Layer<T, D>& parLayer) const { typename Layer<T, D>::const_iterator Viewport<D>::cbegin (const Layer<T, D>& parLayer) const {
typedef typename Layer<T, D>::const_iterator IterType; typedef typename Layer<T, D>::const_iterator IterType;
return IterType(&parLayer.m_tiles, parLayer.m_tilemap->pixel_conv(), m_view.position(), m_tyler.map_size() - 1); return IterType(&parLayer.m_tiles, parLayer.m_tilemap->pixel_conv(), m_view.position(), m_view.upper());
} }
template <uint32_t D> template <uint32_t D>
template <typename T> template <typename T>
typename Layer<T, D>::const_iterator Viewport<D>::cend (const Layer<T, D>& parLayer) const { typename Layer<T, D>::const_iterator Viewport<D>::cend (const Layer<T, D>& parLayer) const {
typedef typename Layer<T, D>::const_iterator IterType; typedef typename Layer<T, D>::const_iterator IterType;
return IterType(&parLayer.m_tiles, parLayer.m_tilemap->pixel_conv(), make_past_end_coords<D>(m_tyler.map_size() - 1), make_past_end_coords<D>(m_tyler.map_size() - 1)); return IterType(&parLayer.m_tiles, parLayer.m_tilemap->pixel_conv(), make_past_end_coords<D>(m_view.upper()), make_past_end_coords<D>(m_view.upper()));
} }
template <uint32_t D> template <uint32_t D>

View File

@ -81,17 +81,16 @@ namespace dkh {
throw std::runtime_error("Invalid data: can't parse file"); throw std::runtime_error("Invalid data: can't parse file");
} }
coords map_size;
if (grammar.lengths.empty()) { if (grammar.lengths.empty()) {
map_size.x() = map_size.y() = 0; m_mapSize.x() = m_mapSize.y() = 0;
throw std::runtime_error("Invalid data: can't guess map size"); throw std::runtime_error("Invalid data: can't guess map size");
} }
//Only look at the front. Besides a bug in spirit makes the other counts //Only look at the front. Besides a bug in spirit makes the other counts
//invalid, see //invalid, see
//http://boost.2283326.n4.nabble.com/Possible-bug-in-line-pos-iterator-td4636592.html //http://boost.2283326.n4.nabble.com/Possible-bug-in-line-pos-iterator-td4636592.html
map_size.x() = grammar.lengths.front(); m_mapSize.x() = grammar.lengths.front();
map_size.y() = m_wholedata.size() / map_size.x(); m_mapSize.y() = m_wholedata.size() / m_mapSize.x();
} }
const AsciiMapSource::coords& AsciiMapSource::mapSize() const { const AsciiMapSource::coords& AsciiMapSource::mapSize() const {

View File

@ -1,3 +1,5 @@
0000000000
0000000000
1101111001 1101111001
1101111001 1101111001
1110111100 1110111100
@ -6,3 +8,16 @@
1111010111 1111010111
1111101111 1111101111
1111111111 1111111111
1111111111
1101111001
1101111001
1110111100
1110111000
1111011011
1111010111
1111101111
1111111111
1111111111
0000000000
0000000000
0000000000

View File

@ -87,7 +87,7 @@ int main() {
&SDL_DestroyRenderer &SDL_DestroyRenderer
); );
dk::Tyler<2> tiler(coords2(64)); dk::Tyler<2> tiler(coords2(10, 23), coords2(64));
LayerWithData<AsciiMapSource, int> bottomLayer; LayerWithData<AsciiMapSource, int> bottomLayer;
addLayer(tiler, bottomLayer, DATA_PATH"/test.map"); addLayer(tiler, bottomLayer, DATA_PATH"/test.map");
@ -113,7 +113,7 @@ int main() {
//Main loop //Main loop
bool running = true; bool running = true;
int y = 0; int y = 0;
dk::Viewport<2> viewport(tiler, coords2(10, 6), coords2(0)); dk::Viewport<2> viewport(tiler, tiler.map_size(), coords2(0));
coords2 tile_size; coords2 tile_size;
SDL_QueryTexture(tile_0.get(), nullptr, nullptr, &tile_size.x(), &tile_size.y()); SDL_QueryTexture(tile_0.get(), nullptr, nullptr, &tile_size.x(), &tile_size.y());
do { do {

View File

@ -31,7 +31,7 @@ const dk::CoordinateScalarType asciimapsource::map_width = 10;
const dk::CoordinateScalarType asciimapsource::map_height = 8; const dk::CoordinateScalarType asciimapsource::map_height = 8;
asciimapsource::asciimapsource() : asciimapsource::asciimapsource() :
tiler(coords2(tile_size)), tiler(coords2(map_width, map_height), coords2(tile_size)),
layer(nullptr) layer(nullptr)
{ {
std::istringstream iss((std::string(map_data))); std::istringstream iss((std::string(map_data)));

View File

@ -23,6 +23,38 @@ class TileCoordsPrinter:
def display_hint(self): def display_hint(self):
return "map"; return "map";
class LayerBasePrinter:
def __init__(self, parVal):
self.val = parVal;
def to_string(self):
m_haveFrom = self.val["m_haveFrom"];
m_haveTo = self.val["m_haveTo"];
return "{{have from-to = {0}-{1}}}".format(m_haveFrom, m_haveTo);
def display_hint(self):
return "map";
class TylerPrinter:
def __init__(self, parVal):
self.val = parVal;
def to_string(self):
m_size = str(self.val["m_size"]);
m_tilesize = str(self.val["m_tilesize"]);
start = self.val["m_layers"]["_M_impl"]["_M_start"];
finish = self.val["m_layers"]["_M_impl"]["_M_finish"];
end = self.val["m_layers"]["_M_impl"]["_M_end_of_storage"];
layers_count = int(finish - start);
m_layers = ", ".join(
"{0}: {1}".format(str(self.val["m_layers"]["_M_impl"]["_M_start"][z]["_M_t"]["_M_head_impl"].type.target()), str(self.val["m_layers"]["_M_impl"]["_M_start"][z]["_M_t"]["_M_head_impl"].dereference())) for z in range(0, layers_count));
capacity = int(end - start);
return "{{m_size = {0}, m_tilesize = {1}, m_layers ({2}/{3}) = {{{4}}}}}".format(m_size, m_tilesize, layers_count, capacity, m_layers);
def display_hint(self):
return "map";
def vector_wrapper_match(parVal): def vector_wrapper_match(parVal):
tag_value = str(parVal.type.strip_typedefs().tag); tag_value = str(parVal.type.strip_typedefs().tag);
if tag_value == None: if tag_value == None:
@ -31,10 +63,16 @@ def vector_wrapper_match(parVal):
reg_vecbase = re.compile("^vwr::implem::VecBase<.*>$"); reg_vecbase = re.compile("^vwr::implem::VecBase<.*>$");
reg_vec = re.compile("^vwr::Vec<.*>$"); reg_vec = re.compile("^vwr::Vec<.*>$");
reg_tilecoords = re.compile("^dk::TileCoords<.*>$"); reg_tilecoords = re.compile("^dk::TileCoords<.*>$");
reg_tyler = re.compile("^dk::Tyler<.*>$");
reg_layerbase = re.compile("^dk::LayerBase<.*>$");
if reg_vecbase.match(tag_value) or reg_vec.match(tag_value): if reg_vecbase.match(tag_value) or reg_vec.match(tag_value):
return VectorWrapperPrinter(parVal); return VectorWrapperPrinter(parVal);
elif reg_tilecoords.match(tag_value): elif reg_tilecoords.match(tag_value):
return TileCoordsPrinter(parVal); return TileCoordsPrinter(parVal);
elif reg_tyler.match(tag_value):
return TylerPrinter(parVal);
elif reg_layerbase.match(tag_value):
return LayerBasePrinter(parVal);
else: else:
return None; return None;