Ejemplo n.º 1
0
CachedMapBlockData* MeshUpdateQueue::cacheBlock(Map *map, v3s16 p, UpdateMode mode,
			size_t *cache_hit_counter)
{
	std::map<v3s16, CachedMapBlockData*>::iterator it =
			m_cache.find(p);
	if (it != m_cache.end()) {
		// Already in cache
		CachedMapBlockData *cached_block = it->second;
		if (mode == SKIP_UPDATE_IF_ALREADY_CACHED) {
			if (cache_hit_counter)
				(*cache_hit_counter)++;
			return cached_block;
		}
		MapBlock *b = map->getBlockNoCreateNoEx(p);
		if (b) {
			if (cached_block->data == NULL)
				cached_block->data =
						new MapNode[MAP_BLOCKSIZE * MAP_BLOCKSIZE * MAP_BLOCKSIZE];
			memcpy(cached_block->data, b->getData(),
					MAP_BLOCKSIZE * MAP_BLOCKSIZE * MAP_BLOCKSIZE * sizeof(MapNode));
		} else {
			delete[] cached_block->data;
			cached_block->data = NULL;
		}
		return cached_block;
	}

	// Not yet in cache
	CachedMapBlockData *cached_block = new CachedMapBlockData();
	m_cache[p] = cached_block;
	MapBlock *b = map->getBlockNoCreateNoEx(p);
	if (b) {
		cached_block->data =
				new MapNode[MAP_BLOCKSIZE * MAP_BLOCKSIZE * MAP_BLOCKSIZE];
		memcpy(cached_block->data, b->getData(),
				MAP_BLOCKSIZE * MAP_BLOCKSIZE * MAP_BLOCKSIZE * sizeof(MapNode));
	}
	return cached_block;
}
Ejemplo n.º 2
0
void MeshMakeData::fill(MapBlock *block)
{
	fillBlockDataBegin(block->getPos());

	fillBlockData(v3s16(0,0,0), block->getData());

	// Get map for reading neigbhor blocks
	Map *map = block->getParent();

	for (u16 i=0; i<26; i++) {
		const v3s16 &dir = g_26dirs[i];
		v3s16 bp = m_blockpos + dir;
		MapBlock *b = map->getBlockNoCreateNoEx(bp);
		if(b)
			fillBlockData(dir, b->getData());
	}
}