Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -183,7 +183,7 @@ int NewIsometricTileRenderer::getTileSize() const {
return images->getBlockSize() * 16 * tile_width;
}

void NewIsometricTileRenderer::renderTopBlocks(const TilePos& tile_pos, boost::container::vector<TileImage>& tile_images) {
void NewIsometricTileRenderer::renderTopBlocks(const TilePos& tile_pos, std::vector<TileImage>& tile_images) {
int block_size = images->getBlockSize();
mc::BlockDir dir = render_view->getRotation().rotate(mc::DIR_NORTH + mc::DIR_EAST + mc::DIR_BOTTOM);
for (old::TileTopBlockIterator it(tile_pos, block_size, tile_width, render_view); !it.end(); it.next()) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -90,7 +90,7 @@ class NewIsometricTileRenderer : public TileRenderer {
virtual int getTileSize() const;

protected:
virtual void renderTopBlocks(const TilePos& tile_pos, boost::container::vector<TileImage>& tile_images);
virtual void renderTopBlocks(const TilePos& tile_pos, std::vector<TileImage>& tile_images);
};

}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ int SideTileRenderer::getTileHeight() const {
return block_images->getBlockHeight() * 8 * tile_width;
}

void SideTileRenderer::renderTopBlocks(const TilePos& tile_pos, boost::container::vector<TileImage>& tile_images) {
void SideTileRenderer::renderTopBlocks(const TilePos& tile_pos, std::vector<TileImage>& tile_images) {
int block_width = block_images->getBlockWidth();
int block_height = block_images->getBlockHeight();
for (int cx = 0; cx < tile_width; cx++) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ class SideTileRenderer : public TileRenderer {
virtual int getTileHeight() const;

protected:
virtual void renderTopBlocks(const TilePos& tile_pos, boost::container::vector<TileImage>& tile_images);
virtual void renderTopBlocks(const TilePos& tile_pos, std::vector<TileImage>& tile_images);
};

}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ int TopdownTileRenderer::getTileSize() const {
return images->getBlockSize() * 16 * tile_width;
}

void TopdownTileRenderer::renderTopBlocks(const TilePos& tile_pos, boost::container::vector<TileImage>& tile_images) {
void TopdownTileRenderer::renderTopBlocks(const TilePos& tile_pos, std::vector<TileImage>& tile_images) {
int block_size = images->getBlockSize();
for (int cx = 0; cx < tile_width; cx++) {
for (int cz = 0; cz < tile_width; cz++) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ class TopdownTileRenderer : public TileRenderer {
virtual int getTileSize() const;

protected:
virtual void renderTopBlocks(const TilePos& tile_pos, boost::container::vector<TileImage>& tile_images);
virtual void renderTopBlocks(const TilePos& tile_pos, std::vector<TileImage>& tile_images);
};

}
Expand Down
79 changes: 52 additions & 27 deletions src/mapcraftercore/renderer/tilerenderer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,10 @@

#include "tilerenderer.h"

#include <boost/range/algorithm/sort.hpp>
#include <algorithm> //std::sort()
#include <atomic>
#include <memory> // std::allocator
#include <vector>

#include "blockimages.h"
#include "rendermode.h"
Expand All @@ -30,6 +33,8 @@
#include "../mc/pos.h"
#include "../util.h"

#include <boost/core/noinit_adaptor.hpp>

namespace mapcrafter {
namespace renderer {

Expand Down Expand Up @@ -65,62 +70,82 @@ void TileRenderer::setShadowEdges(std::array<uint8_t, 5> shadow_edges) {
this->shadow_edges = shadow_edges;
}

TileRenderer::cmpBlockPos* TileRenderer::getTileComparator() const {
switch ((RenderRotation::Direction)render_view->getRotation()){
template<typename IT>
static void sortTiles(IT begin, IT end, RenderRotation::Direction dir) {
switch (dir){
default:
case RenderRotation::TOP_LEFT:
return [](const TileImage& a, const TileImage& b) -> bool {
std::sort(begin, end, [](const TileImage* a, const TileImage* b) -> bool {
return
(a.pos.y != b.pos.y) ? (a.pos.y < b.pos.y) : (
(a.pos.z != b.pos.z) ? (a.pos.z < b.pos.z) : (
(a.pos.x != b.pos.x) ? (a.pos.x > b.pos.x) : (
(a->pos.y != b->pos.y) ? (a->pos.y < b->pos.y) : (
(a->pos.z != b->pos.z) ? (a->pos.z < b->pos.z) : (
(a->pos.x != b->pos.x) ? (a->pos.x > b->pos.x) : (
false
)));
};
});
break;
case RenderRotation::TOP_RIGHT:
return [](const TileImage& a, const TileImage& b) -> bool {
std::sort(begin, end, [](const TileImage* a, const TileImage* b) -> bool {
return
(a.pos.y != b.pos.y) ? (a.pos.y < b.pos.y) : (
(a.pos.x != b.pos.x) ? (a.pos.x < b.pos.x) : (
(a.pos.z != b.pos.z) ? (a.pos.z < b.pos.z) : (
(a->pos.y != b->pos.y) ? (a->pos.y < b->pos.y) : (
(a->pos.x != b->pos.x) ? (a->pos.x < b->pos.x) : (
(a->pos.z != b->pos.z) ? (a->pos.z < b->pos.z) : (
false
)));
};
});
break;
case RenderRotation::BOTTOM_RIGHT:
return [](const TileImage& a, const TileImage& b) -> bool {
std::sort(begin, end, [](const TileImage* a, const TileImage* b) -> bool {
return
(a.pos.y != b.pos.y) ? (a.pos.y < b.pos.y) : (
(a.pos.z != b.pos.z) ? (a.pos.z > b.pos.z) : (
(a.pos.x != b.pos.x) ? (a.pos.x < b.pos.x) : (
(a->pos.y != b->pos.y) ? (a->pos.y < b->pos.y) : (
(a->pos.z != b->pos.z) ? (a->pos.z > b->pos.z) : (
(a->pos.x != b->pos.x) ? (a->pos.x < b->pos.x) : (
false
)));
};
});
break;
case RenderRotation::BOTTOM_LEFT:
return [](const TileImage& a, const TileImage& b) -> bool {
std::sort(begin, end, [](const TileImage* a, const TileImage* b) -> bool {
return
(a.pos.y != b.pos.y) ? (a.pos.y < b.pos.y) : (
(a.pos.x != b.pos.x) ? (a.pos.x > b.pos.x) : (
(a.pos.z != b.pos.z) ? (a.pos.z > b.pos.z) : (
(a->pos.y != b->pos.y) ? (a->pos.y < b->pos.y) : (
(a->pos.x != b->pos.x) ? (a->pos.x > b->pos.x) : (
(a->pos.z != b->pos.z) ? (a->pos.z > b->pos.z) : (
false
)));
};
});
break;
}
}

void TileRenderer::renderTile(const TilePos& tile_pos, RGBAImage& tile) {
static std::atomic<size_t> tile_images_maxsize(64 << 10); //64Ki

tile.setSize(getTileWidth(), getTileHeight());

boost::container::vector<TileImage> tile_images;
size_t tile_images_capacity_value = tile_images_maxsize;

std::vector<TileImage> tile_images;
tile_images.reserve(tile_images_capacity_value * 2);
renderTopBlocks(tile_pos, tile_images);

size_t count = tile_images.size();
if (count > tile_images_capacity_value
&& tile_images_maxsize.compare_exchange_strong(tile_images_capacity_value, count)) {
LOG(DEBUG) << "raised initial tile_images capacity to " << count;
}

//get pointers to all the TileImages
std::vector<TileImage*, boost::noinit_adaptor<std::allocator<TileImage*>>> tile_image_pointers(count);
std::transform(
tile_images.begin(), tile_images.end(), tile_image_pointers.begin(),
[](TileImage& tile_image) -> TileImage* {
return &tile_image;
});

// Sort them in order depending of the rotation
boost::range::sort(tile_images, getTileComparator());
sortTiles(tile_image_pointers.begin(), tile_image_pointers.end(), (RenderRotation::Direction)render_view->getRotation());

for (auto it = tile_images.begin(); it != tile_images.end(); ++it) {
for (auto it : tile_image_pointers) {
tile.alphaBlit(it->image, it->x, it->y);
}
}
Expand All @@ -133,7 +158,7 @@ int TileRenderer::getTileHeight() const {
return getTileSize();
}

void TileRenderer::renderBlocks(int x, int y, mc::BlockPos top, const mc::BlockDir& dir, boost::container::vector<TileImage>& tile_images) {
void TileRenderer::renderBlocks(int x, int y, mc::BlockPos top, const mc::BlockDir& dir, std::vector<TileImage>& tile_images) {

for (; top.y >= mc::CHUNK_LOWEST*16 ; top += dir) {
// get current chunk position
Expand Down
8 changes: 2 additions & 6 deletions src/mapcraftercore/renderer/tilerenderer.h
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,6 @@
#include <array>
#include <vector>
#include <boost/filesystem.hpp>
#include <boost/container/vector.hpp>

namespace fs = boost::filesystem;

Expand Down Expand Up @@ -75,11 +74,8 @@ class TileRenderer {
virtual int getTileHeight() const;

protected:
// void sortTiles(boost::container::vector<TileImage>& tile_images) const;
typedef bool cmpBlockPos(const TileImage &, const TileImage &);
cmpBlockPos* getTileComparator() const;
void renderBlocks(int x, int y, mc::BlockPos top, const mc::BlockDir& dir, boost::container::vector<TileImage>& tile_images);
virtual void renderTopBlocks(const TilePos& tile_pos, boost::container::vector<TileImage>& tile_images) {}
void renderBlocks(int x, int y, mc::BlockPos top, const mc::BlockDir& dir, std::vector<TileImage>& tile_images);
virtual void renderTopBlocks(const TilePos& tile_pos, std::vector<TileImage>& tile_images) {}

mc::Block getBlock(const mc::BlockPos& pos, int get = mc::GET_ID);
uint32_t getBiomeColor(const mc::BlockPos& pos, const BlockImage& block, const mc::Chunk* chunk);
Expand Down