4jcraft/Minecraft.World/WorldGen/Biomes/BiomeCache.cpp
MatthewBeshay a0fdc643d1 Merge branch 'upstream-dev' into cleanup/nullptr-replacement
# Conflicts:
#	Minecraft.Client/Network/PlayerChunkMap.cpp
#	Minecraft.Client/Network/PlayerList.cpp
#	Minecraft.Client/Network/ServerChunkCache.cpp
#	Minecraft.Client/Platform/Common/Consoles_App.cpp
#	Minecraft.Client/Platform/Common/DLC/DLCManager.cpp
#	Minecraft.Client/Platform/Common/GameRules/LevelGenerationOptions.cpp
#	Minecraft.Client/Platform/Common/GameRules/LevelRuleset.cpp
#	Minecraft.Client/Platform/Common/Tutorial/Tutorial.cpp
#	Minecraft.Client/Platform/Common/Tutorial/TutorialTask.cpp
#	Minecraft.Client/Platform/Common/UI/IUIScene_CreativeMenu.cpp
#	Minecraft.Client/Platform/Common/UI/UIComponent_Panorama.cpp
#	Minecraft.Client/Platform/Common/UI/UIController.cpp
#	Minecraft.Client/Platform/Common/UI/UIController.h
#	Minecraft.Client/Platform/Extrax64Stubs.cpp
#	Minecraft.Client/Platform/Windows64/4JLibs/inc/4J_Input.h
#	Minecraft.Client/Platform/Windows64/4JLibs/inc/4J_Storage.h
#	Minecraft.Client/Player/EntityTracker.cpp
#	Minecraft.Client/Player/ServerPlayer.cpp
#	Minecraft.Client/Rendering/EntityRenderers/PlayerRenderer.cpp
#	Minecraft.Client/Textures/Packs/DLCTexturePack.cpp
#	Minecraft.Client/Textures/Stitching/StitchedTexture.cpp
#	Minecraft.Client/Textures/Stitching/TextureMap.cpp
#	Minecraft.Client/Textures/Textures.cpp
#	Minecraft.World/Blocks/NotGateTile.cpp
#	Minecraft.World/Blocks/PressurePlateTile.cpp
#	Minecraft.World/Blocks/TileEntities/PotionBrewing.cpp
#	Minecraft.World/Enchantments/EnchantmentHelper.cpp
#	Minecraft.World/Entities/HangingEntity.cpp
#	Minecraft.World/Entities/LeashFenceKnotEntity.cpp
#	Minecraft.World/Entities/LivingEntity.cpp
#	Minecraft.World/Entities/Mobs/Boat.cpp
#	Minecraft.World/Entities/Mobs/Minecart.cpp
#	Minecraft.World/Entities/Mobs/Witch.cpp
#	Minecraft.World/Entities/SyncedEntityData.cpp
#	Minecraft.World/Items/LeashItem.cpp
#	Minecraft.World/Items/PotionItem.cpp
#	Minecraft.World/Level/BaseMobSpawner.cpp
#	Minecraft.World/Level/CustomLevelSource.cpp
#	Minecraft.World/Level/Level.cpp
#	Minecraft.World/Level/Storage/DirectoryLevelStorage.cpp
#	Minecraft.World/Level/Storage/McRegionLevelStorage.cpp
#	Minecraft.World/Level/Storage/RegionFileCache.cpp
#	Minecraft.World/Player/Player.cpp
#	Minecraft.World/WorldGen/Biomes/BiomeCache.cpp
#	Minecraft.World/WorldGen/Features/RandomScatteredLargeFeature.cpp
#	Minecraft.World/WorldGen/Layers/BiomeOverrideLayer.cpp
2026-03-30 16:28:40 +11:00

152 lines
4.6 KiB
C++

#include "../../Platform/stdafx.h"
#include "Biome.h"
#include "BiomeSource.h"
#include "BiomeCache.h"
#include "../../Platform/System.h"
BiomeCache::Block::Block(int x, int z, BiomeCache* parent) {
// temps = floatArray(ZONE_SIZE * ZONE_SIZE, false); // MGH -
// added "no clear" flag to arrayWithLength downfall =
// floatArray(ZONE_SIZE
// * ZONE_SIZE, false); biomes = BiomeArray(ZONE_SIZE * ZONE_SIZE,
// false);
biomeIndices = byteArray(ZONE_SIZE * ZONE_SIZE, false);
lastUse = 0;
this->x = x;
this->z = z;
// parent->source->getTemperatureBlock(temps, x << ZONE_SIZE_BITS, z <<
// ZONE_SIZE_BITS, ZONE_SIZE, ZONE_SIZE);
// parent->source->getDownfallBlock(downfall, x << ZONE_SIZE_BITS, z <<
// ZONE_SIZE_BITS, ZONE_SIZE, ZONE_SIZE);
// parent->source->getBiomeBlock(biomes, x << ZONE_SIZE_BITS, z <<
// ZONE_SIZE_BITS, ZONE_SIZE, ZONE_SIZE, false); 4jcraft added cast to
// unsigned
parent->source->getBiomeIndexBlock(
biomeIndices, (unsigned)x << ZONE_SIZE_BITS,
(unsigned)z << ZONE_SIZE_BITS, ZONE_SIZE, ZONE_SIZE, false);
}
BiomeCache::Block::~Block() {
// delete [] temps.data;
// delete [] downfall.data;
// delete [] biomes.data;
delete[] biomeIndices.data;
}
Biome* BiomeCache::Block::getBiome(int x, int z) {
// return biomes[(x & ZONE_SIZE_MASK) | ((z & ZONE_SIZE_MASK) <<
// ZONE_SIZE_BITS)];
int biomeIndex = biomeIndices[(x & ZONE_SIZE_MASK) |
((z & ZONE_SIZE_MASK) << ZONE_SIZE_BITS)];
return Biome::biomes[biomeIndex];
}
float BiomeCache::Block::getTemperature(int x, int z) {
// return temps[(x & ZONE_SIZE_MASK) | ((z & ZONE_SIZE_MASK) <<
// ZONE_SIZE_BITS)];
int biomeIndex = biomeIndices[(x & ZONE_SIZE_MASK) |
((z & ZONE_SIZE_MASK) << ZONE_SIZE_BITS)];
return Biome::biomes[biomeIndex]->getTemperature();
}
float BiomeCache::Block::getDownfall(int x, int z) {
// return downfall[(x & ZONE_SIZE_MASK) | ((z & ZONE_SIZE_MASK) <<
// ZONE_SIZE_BITS)];
int biomeIndex = biomeIndices[(x & ZONE_SIZE_MASK) |
((z & ZONE_SIZE_MASK) << ZONE_SIZE_BITS)];
return Biome::biomes[biomeIndex]->getDownfall();
}
BiomeCache::BiomeCache(BiomeSource* source) {
// 4J Initialisors
lastUpdateTime = 0;
this->source = source;
InitializeCriticalSection(&m_CS);
}
BiomeCache::~BiomeCache() {
// 4J Stu - Delete source?
// delete source;
for (auto it = all.begin(); it != all.end(); ++it) {
delete (*it);
}
DeleteCriticalSection(&m_CS);
}
BiomeCache::Block* BiomeCache::getBlockAt(int x, int z) {
EnterCriticalSection(&m_CS);
x >>= ZONE_SIZE_BITS;
z >>= ZONE_SIZE_BITS;
int64_t slot =
(((int64_t)x) & 0xffffffffl) | ((((int64_t)z) & 0xffffffffl) << 32l);
auto it = cached.find(slot);
Block* block = nullptr;
if (it == cached.end()) {
MemSect(48);
block = new Block(x, z, this);
cached[slot] = block;
all.push_back(block);
MemSect(0);
} else {
block = it->second;
}
block->lastUse = app.getAppTime();
LeaveCriticalSection(&m_CS);
return block;
}
Biome* BiomeCache::getBiome(int x, int z) {
return getBlockAt(x, z)->getBiome(x, z);
}
float BiomeCache::getTemperature(int x, int z) {
return getBlockAt(x, z)->getTemperature(x, z);
}
float BiomeCache::getDownfall(int x, int z) {
return getBlockAt(x, z)->getDownfall(x, z);
}
void BiomeCache::update() {
EnterCriticalSection(&m_CS);
int64_t now = app.getAppTime();
int64_t utime = now - lastUpdateTime;
if (utime > DECAY_TIME / 4 || utime < 0) {
lastUpdateTime = now;
for (auto it = all.begin(); it != all.end();) {
Block* block = *it;
int64_t time = now - block->lastUse;
if (time > DECAY_TIME || time < 0) {
it = all.erase(it);
int64_t slot = (((int64_t)block->x) & 0xffffffffl) |
((((int64_t)block->z) & 0xffffffffl) << 32l);
cached.erase(slot);
delete block;
} else {
++it;
}
}
}
LeaveCriticalSection(&m_CS);
}
BiomeArray BiomeCache::getBiomeBlockAt(int x, int z) {
byteArray indices = getBlockAt(x, z)->biomeIndices;
BiomeArray biomes(indices.length);
for (int i = 0; i < indices.length; i++)
biomes[i] = Biome::biomes[indices[i]];
return biomes;
}
byteArray BiomeCache::getBiomeIndexBlockAt(int x, int z) {
return getBlockAt(x, z)->biomeIndices;
}