minecraft-src/net/minecraft/client/resources/MapTextureManager.java
2025-07-04 03:45:38 +03:00

102 lines
3 KiB
Java

package net.minecraft.client.resources;
import com.mojang.blaze3d.platform.NativeImage;
import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment;
import net.minecraft.client.renderer.texture.DynamicTexture;
import net.minecraft.client.renderer.texture.TextureManager;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.level.material.MapColor;
import net.minecraft.world.level.saveddata.maps.MapId;
import net.minecraft.world.level.saveddata.maps.MapItemSavedData;
@Environment(EnvType.CLIENT)
public class MapTextureManager implements AutoCloseable {
private final Int2ObjectMap<MapTextureManager.MapInstance> maps = new Int2ObjectOpenHashMap<>();
final TextureManager textureManager;
public MapTextureManager(TextureManager textureManager) {
this.textureManager = textureManager;
}
public void update(MapId id, MapItemSavedData data) {
this.getOrCreateMapInstance(id, data).forceUpload();
}
public ResourceLocation prepareMapTexture(MapId id, MapItemSavedData data) {
MapTextureManager.MapInstance mapInstance = this.getOrCreateMapInstance(id, data);
mapInstance.updateTextureIfNeeded();
return mapInstance.location;
}
public void resetData() {
for (MapTextureManager.MapInstance mapInstance : this.maps.values()) {
mapInstance.close();
}
this.maps.clear();
}
private MapTextureManager.MapInstance getOrCreateMapInstance(MapId id, MapItemSavedData data) {
return this.maps.compute(id.id(), (integer, mapInstance) -> {
if (mapInstance == null) {
return new MapTextureManager.MapInstance(integer, data);
} else {
mapInstance.replaceMapData(data);
return mapInstance;
}
});
}
public void close() {
this.resetData();
}
@Environment(EnvType.CLIENT)
class MapInstance implements AutoCloseable {
private MapItemSavedData data;
private final DynamicTexture texture;
private boolean requiresUpload = true;
final ResourceLocation location;
MapInstance(final int id, final MapItemSavedData data) {
this.data = data;
this.texture = new DynamicTexture(() -> "Map " + id, 128, 128, true);
this.location = ResourceLocation.withDefaultNamespace("map/" + id);
MapTextureManager.this.textureManager.register(this.location, this.texture);
}
void replaceMapData(MapItemSavedData data) {
boolean bl = this.data != data;
this.data = data;
this.requiresUpload |= bl;
}
public void forceUpload() {
this.requiresUpload = true;
}
void updateTextureIfNeeded() {
if (this.requiresUpload) {
NativeImage nativeImage = this.texture.getPixels();
if (nativeImage != null) {
for (int i = 0; i < 128; i++) {
for (int j = 0; j < 128; j++) {
int k = j + i * 128;
nativeImage.setPixel(j, i, MapColor.getColorFromPackedId(this.data.colors[k]));
}
}
}
this.texture.upload();
this.requiresUpload = false;
}
}
public void close() {
this.texture.close();
}
}
}