File size: 5,430 Bytes
d46f4a3
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
package com.mojang.blaze3d.platform;

import com.mojang.blaze3d.DontObfuscate;
import com.mojang.blaze3d.systems.RenderSystem;
import com.mojang.logging.LogUtils;
import java.io.IOException;
import java.io.InputStream;
import java.nio.ByteBuffer;
import java.nio.channels.Channels;
import java.nio.channels.ReadableByteChannel;
import java.nio.channels.SeekableByteChannel;
import java.nio.file.Path;
import java.util.concurrent.ThreadLocalRandom;
import java.util.function.IntUnaryOperator;
import javax.annotation.Nullable;
import net.minecraft.SharedConstants;
import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn;
import org.lwjgl.system.MemoryUtil;
import org.slf4j.Logger;

@OnlyIn(Dist.CLIENT)
@DontObfuscate
public class TextureUtil {
    private static final Logger LOGGER = LogUtils.getLogger();
    public static final int MIN_MIPMAP_LEVEL = 0;
    private static final int DEFAULT_IMAGE_BUFFER_SIZE = 8192;

    public static int generateTextureId() {
        RenderSystem.assertOnRenderThreadOrInit();
        if (SharedConstants.IS_RUNNING_IN_IDE) {
            int[] aint = new int[ThreadLocalRandom.current().nextInt(15) + 1];
            GlStateManager._genTextures(aint);
            int i = GlStateManager._genTexture();
            GlStateManager._deleteTextures(aint);
            return i;
        } else {
            return GlStateManager._genTexture();
        }
    }

    public static void releaseTextureId(int p_85282_) {
        RenderSystem.assertOnRenderThreadOrInit();
        GlStateManager._deleteTexture(p_85282_);
    }

    public static void prepareImage(int p_85284_, int p_85285_, int p_85286_) {
        prepareImage(NativeImage.InternalGlFormat.RGBA, p_85284_, 0, p_85285_, p_85286_);
    }

    public static void prepareImage(NativeImage.InternalGlFormat p_85293_, int p_85294_, int p_85295_, int p_85296_) {
        prepareImage(p_85293_, p_85294_, 0, p_85295_, p_85296_);
    }

    public static void prepareImage(int p_85288_, int p_85289_, int p_85290_, int p_85291_) {
        prepareImage(NativeImage.InternalGlFormat.RGBA, p_85288_, p_85289_, p_85290_, p_85291_);
    }

    public static void prepareImage(NativeImage.InternalGlFormat p_85298_, int p_85299_, int p_85300_, int p_85301_, int p_85302_) {
        RenderSystem.assertOnRenderThreadOrInit();
        bind(p_85299_);
        if (p_85300_ >= 0) {
            GlStateManager._texParameter(3553, 33085, p_85300_);
            GlStateManager._texParameter(3553, 33082, 0);
            GlStateManager._texParameter(3553, 33083, p_85300_);
            GlStateManager._texParameter(3553, 34049, 0.0F);
        }

        for (int i = 0; i <= p_85300_; i++) {
            GlStateManager._texImage2D(3553, i, p_85298_.glFormat(), p_85301_ >> i, p_85302_ >> i, 0, 6408, 5121, null);
        }
    }

    private static void bind(int p_85310_) {
        RenderSystem.assertOnRenderThreadOrInit();
        GlStateManager._bindTexture(p_85310_);
    }

    public static ByteBuffer readResource(InputStream p_85304_) throws IOException {
        ReadableByteChannel readablebytechannel = Channels.newChannel(p_85304_);
        return readablebytechannel instanceof SeekableByteChannel seekablebytechannel
            ? readResource(readablebytechannel, (int)seekablebytechannel.size() + 1)
            : readResource(readablebytechannel, 8192);
    }

    private static ByteBuffer readResource(ReadableByteChannel p_273208_, int p_273297_) throws IOException {
        ByteBuffer bytebuffer = MemoryUtil.memAlloc(p_273297_);

        try {
            while (p_273208_.read(bytebuffer) != -1) {
                if (!bytebuffer.hasRemaining()) {
                    bytebuffer = MemoryUtil.memRealloc(bytebuffer, bytebuffer.capacity() * 2);
                }
            }

            return bytebuffer;
        } catch (IOException ioexception) {
            MemoryUtil.memFree(bytebuffer);
            throw ioexception;
        }
    }

    public static void writeAsPNG(Path p_261923_, String p_262070_, int p_261655_, int p_261576_, int p_261966_, int p_261775_) {
        writeAsPNG(p_261923_, p_262070_, p_261655_, p_261576_, p_261966_, p_261775_, null);
    }

    public static void writeAsPNG(
        Path p_285286_, String p_285408_, int p_285400_, int p_285244_, int p_285373_, int p_285206_, @Nullable IntUnaryOperator p_284988_
    ) {
        RenderSystem.assertOnRenderThread();
        bind(p_285400_);

        for (int i = 0; i <= p_285244_; i++) {
            int j = p_285373_ >> i;
            int k = p_285206_ >> i;

            try (NativeImage nativeimage = new NativeImage(j, k, false)) {
                nativeimage.downloadTexture(i, false);
                if (p_284988_ != null) {
                    nativeimage.applyToAllPixels(p_284988_);
                }

                Path path = p_285286_.resolve(p_285408_ + "_" + i + ".png");
                nativeimage.writeToFile(path);
                LOGGER.debug("Exported png to: {}", path.toAbsolutePath());
            } catch (IOException ioexception) {
                LOGGER.debug("Unable to write: ", (Throwable)ioexception);
            }
        }
    }

    public static Path getDebugTexturePath(Path p_262015_) {
        return p_262015_.resolve("screenshots").resolve("debug");
    }

    public static Path getDebugTexturePath() {
        return getDebugTexturePath(Path.of("."));
    }
}