84 lines
		
	
	
	
		
			2.9 KiB
		
	
	
	
		
			Java
		
	
	
	
	
	
			
		
		
	
	
			84 lines
		
	
	
	
		
			2.9 KiB
		
	
	
	
		
			Java
		
	
	
	
	
	
| package net.minecraft.client.resources.model;
 | |
| 
 | |
| import java.util.Map;
 | |
| import java.util.Map.Entry;
 | |
| import java.util.concurrent.CompletableFuture;
 | |
| import java.util.concurrent.Executor;
 | |
| import java.util.stream.Collectors;
 | |
| import net.fabricmc.api.EnvType;
 | |
| import net.fabricmc.api.Environment;
 | |
| import net.minecraft.Util;
 | |
| import net.minecraft.client.renderer.texture.SpriteLoader;
 | |
| import net.minecraft.client.renderer.texture.TextureAtlas;
 | |
| import net.minecraft.client.renderer.texture.TextureAtlasSprite;
 | |
| import net.minecraft.client.renderer.texture.TextureManager;
 | |
| import net.minecraft.resources.ResourceLocation;
 | |
| import net.minecraft.server.packs.resources.ResourceManager;
 | |
| import org.jetbrains.annotations.Nullable;
 | |
| 
 | |
| @Environment(EnvType.CLIENT)
 | |
| public class AtlasSet implements AutoCloseable {
 | |
| 	private final Map<ResourceLocation, AtlasSet.AtlasEntry> atlases;
 | |
| 
 | |
| 	public AtlasSet(Map<ResourceLocation, ResourceLocation> atlasMap, TextureManager textureManager) {
 | |
| 		this.atlases = (Map<ResourceLocation, AtlasSet.AtlasEntry>)atlasMap.entrySet().stream().collect(Collectors.toMap(Entry::getKey, entry -> {
 | |
| 			TextureAtlas textureAtlas = new TextureAtlas((ResourceLocation)entry.getKey());
 | |
| 			textureManager.register((ResourceLocation)entry.getKey(), textureAtlas);
 | |
| 			return new AtlasSet.AtlasEntry(textureAtlas, (ResourceLocation)entry.getValue());
 | |
| 		}));
 | |
| 	}
 | |
| 
 | |
| 	public TextureAtlas getAtlas(ResourceLocation location) {
 | |
| 		return ((AtlasSet.AtlasEntry)this.atlases.get(location)).atlas();
 | |
| 	}
 | |
| 
 | |
| 	public void close() {
 | |
| 		this.atlases.values().forEach(AtlasSet.AtlasEntry::close);
 | |
| 		this.atlases.clear();
 | |
| 	}
 | |
| 
 | |
| 	public Map<ResourceLocation, CompletableFuture<AtlasSet.StitchResult>> scheduleLoad(ResourceManager resourceManager, int mipLevel, Executor executor) {
 | |
| 		return Util.mapValues(
 | |
| 			this.atlases,
 | |
| 			atlasEntry -> SpriteLoader.create(atlasEntry.atlas)
 | |
| 				.loadAndStitch(resourceManager, atlasEntry.atlasInfoLocation, mipLevel, executor)
 | |
| 				.thenApply(preparations -> new AtlasSet.StitchResult(atlasEntry.atlas, preparations))
 | |
| 		);
 | |
| 	}
 | |
| 
 | |
| 	@Environment(EnvType.CLIENT)
 | |
| 	record AtlasEntry(TextureAtlas atlas, ResourceLocation atlasInfoLocation) implements AutoCloseable {
 | |
| 
 | |
| 		public void close() {
 | |
| 			this.atlas.clearTextureData();
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	@Environment(EnvType.CLIENT)
 | |
| 	public static class StitchResult {
 | |
| 		private final TextureAtlas atlas;
 | |
| 		private final SpriteLoader.Preparations preparations;
 | |
| 
 | |
| 		public StitchResult(TextureAtlas atlas, SpriteLoader.Preparations preparations) {
 | |
| 			this.atlas = atlas;
 | |
| 			this.preparations = preparations;
 | |
| 		}
 | |
| 
 | |
| 		@Nullable
 | |
| 		public TextureAtlasSprite getSprite(ResourceLocation location) {
 | |
| 			return (TextureAtlasSprite)this.preparations.regions().get(location);
 | |
| 		}
 | |
| 
 | |
| 		public TextureAtlasSprite missing() {
 | |
| 			return this.preparations.missing();
 | |
| 		}
 | |
| 
 | |
| 		public CompletableFuture<Void> readyForUpload() {
 | |
| 			return this.preparations.readyForUpload();
 | |
| 		}
 | |
| 
 | |
| 		public void upload() {
 | |
| 			this.atlas.upload(this.preparations);
 | |
| 		}
 | |
| 	}
 | |
| }
 |