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; }
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()); } }