MapTextureManager.java

net.minecraft.client.resources.MapTextureManager

信息

  • 全限定名:net.minecraft.client.resources.MapTextureManager
  • 类型:public class
  • 包:net.minecraft.client.resources
  • 源码路径:src/main/java/net/minecraft/client/resources/MapTextureManager.java
  • 起始行号:L17
  • 实现:AutoCloseable
  • 职责:

    TODO

字段/常量

  • maps

    • 类型: Int2ObjectMap<MapTextureManager.MapInstance>
    • 修饰符: private final
    • 源码定位: L18
    • 说明:

      TODO

  • textureManager

    • 类型: TextureManager
    • 修饰符: private final
    • 源码定位: L19
    • 说明:

      TODO

内部类/嵌套类型

  • net.minecraft.client.resources.MapTextureManager.MapInstance
    • 类型: class
    • 修饰符: private
    • 源码定位: L60
    • 说明:

      TODO

构造器

public MapTextureManager(TextureManager textureManager) @ L21

  • 构造器名:MapTextureManager
  • 源码定位:L21
  • 修饰符:public

参数:

  • textureManager: TextureManager

说明:

TODO

方法

下面的方法块按源码顺序生成。

public void update(MapId id, MapItemSavedData data) @ L25

  • 方法名:update
  • 源码定位:L25
  • 返回类型:void
  • 修饰符:public

参数:

  • id: MapId
  • data: MapItemSavedData

说明:

TODO

public Identifier prepareMapTexture(MapId id, MapItemSavedData data) @ L29

  • 方法名:prepareMapTexture
  • 源码定位:L29
  • 返回类型:Identifier
  • 修饰符:public

参数:

  • id: MapId
  • data: MapItemSavedData

说明:

TODO

public void resetData() @ L35

  • 方法名:resetData
  • 源码定位:L35
  • 返回类型:void
  • 修饰符:public

参数:

说明:

TODO

private MapTextureManager.MapInstance getOrCreateMapInstance(MapId id, MapItemSavedData data) @ L43

  • 方法名:getOrCreateMapInstance
  • 源码定位:L43
  • 返回类型:MapTextureManager.MapInstance
  • 修饰符:private

参数:

  • id: MapId
  • data: MapItemSavedData

说明:

TODO

public void close() @ L54

  • 方法名:close
  • 源码定位:L54
  • 返回类型:void
  • 修饰符:public

参数:

说明:

TODO

代码

@OnlyIn(Dist.CLIENT)
public class MapTextureManager implements AutoCloseable {
    private final Int2ObjectMap<MapTextureManager.MapInstance> maps = new Int2ObjectOpenHashMap<>();
    private final TextureManager textureManager;
 
    public MapTextureManager(TextureManager textureManager) {
        this.textureManager = textureManager;
    }
 
    public void update(MapId id, MapItemSavedData data) {
        this.getOrCreateMapInstance(id, data).forceUpload();
    }
 
    public Identifier 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(), (k, instance) -> {
            if (instance == null) {
                return new MapTextureManager.MapInstance(k, data);
            } else {
                instance.replaceMapData(data);
                return (MapTextureManager.MapInstance)instance;
            }
        });
    }
 
    @Override
    public void close() {
        this.resetData();
    }
 
    @OnlyIn(Dist.CLIENT)
    private class MapInstance implements AutoCloseable {
        private MapItemSavedData data;
        private final DynamicTexture texture;
        private boolean requiresUpload;
        private final Identifier location;
 
        private MapInstance(int id, MapItemSavedData data) {
            Objects.requireNonNull(MapTextureManager.this);
            super();
            this.requiresUpload = true;
            this.data = data;
            this.texture = new DynamicTexture(() -> "Map " + id, 128, 128, true);
            this.location = Identifier.withDefaultNamespace("map/" + id);
            MapTextureManager.this.textureManager.register(this.location, this.texture);
        }
 
        private void replaceMapData(MapItemSavedData data) {
            boolean dataChanged = this.data != data;
            this.data = data;
            this.requiresUpload |= dataChanged;
        }
 
        public void forceUpload() {
            this.requiresUpload = true;
        }
 
        private void updateTextureIfNeeded() {
            if (this.requiresUpload) {
                NativeImage pixels = this.texture.getPixels();
 
                for (int y = 0; y < 128; y++) {
                    for (int x = 0; x < 128; x++) {
                        int i = x + y * 128;
                        pixels.setPixel(x, y, MapColor.getColorFromPackedId(this.data.colors[i]));
                    }
                }
 
                this.texture.upload();
                this.requiresUpload = false;
            }
        }
 
        @Override
        public void close() {
            this.texture.close();
        }
    }
}

引用的其他类

  • DynamicTexture

    • 引用位置: 构造调用
    • 关联成员: DynamicTexture()
  • TextureManager

    • 引用位置: 参数/字段
  • Identifier

    • 引用位置: 方法调用/返回值
    • 关联成员: Identifier.withDefaultNamespace()
  • MapColor

    • 引用位置: 方法调用
    • 关联成员: MapColor.getColorFromPackedId()
  • MapId

    • 引用位置: 参数
  • MapItemSavedData

    • 引用位置: 参数