File size: 6,916 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
package net.minecraft.client.renderer;

import com.mojang.blaze3d.vertex.PoseStack;
import com.mojang.blaze3d.vertex.VertexConsumer;
import com.mojang.math.Axis;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.Font;
import net.minecraft.client.renderer.state.MapRenderState;
import net.minecraft.client.renderer.texture.TextureAtlasSprite;
import net.minecraft.client.resources.MapDecorationTextureManager;
import net.minecraft.client.resources.MapTextureManager;
import net.minecraft.util.Mth;
import net.minecraft.world.level.saveddata.maps.MapDecoration;
import net.minecraft.world.level.saveddata.maps.MapId;
import net.minecraft.world.level.saveddata.maps.MapItemSavedData;
import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn;
import org.joml.Matrix4f;

@OnlyIn(Dist.CLIENT)
public class MapRenderer {
    private static final float MAP_Z_OFFSET = -0.01F;
    private static final float DECORATION_Z_OFFSET = -0.001F;
    private static final int WIDTH = 128;
    private static final int HEIGHT = 128;
    private final MapTextureManager mapTextureManager;
    private final MapDecorationTextureManager decorationTextures;

    public MapRenderer(MapDecorationTextureManager p_368155_, MapTextureManager p_364062_) {
        this.decorationTextures = p_368155_;
        this.mapTextureManager = p_364062_;
    }

    public void render(MapRenderState p_362792_, PoseStack p_362536_, MultiBufferSource p_366211_, boolean p_369246_, int p_369313_) {
        Matrix4f matrix4f = p_362536_.last().pose();
        VertexConsumer vertexconsumer = p_366211_.getBuffer(RenderType.text(p_362792_.texture));
        vertexconsumer.addVertex(matrix4f, 0.0F, 128.0F, -0.01F).setColor(-1).setUv(0.0F, 1.0F).setLight(p_369313_);
        vertexconsumer.addVertex(matrix4f, 128.0F, 128.0F, -0.01F).setColor(-1).setUv(1.0F, 1.0F).setLight(p_369313_);
        vertexconsumer.addVertex(matrix4f, 128.0F, 0.0F, -0.01F).setColor(-1).setUv(1.0F, 0.0F).setLight(p_369313_);
        vertexconsumer.addVertex(matrix4f, 0.0F, 0.0F, -0.01F).setColor(-1).setUv(0.0F, 0.0F).setLight(p_369313_);
        int i = 0;

        for (MapRenderState.MapDecorationRenderState maprenderstate$mapdecorationrenderstate : p_362792_.decorations) {
            if (!p_369246_ || maprenderstate$mapdecorationrenderstate.renderOnFrame) {
                p_362536_.pushPose();
                p_362536_.translate(
                    (float)maprenderstate$mapdecorationrenderstate.x / 2.0F + 64.0F,
                    (float)maprenderstate$mapdecorationrenderstate.y / 2.0F + 64.0F,
                    -0.02F
                );
                p_362536_.mulPose(Axis.ZP.rotationDegrees((float)(maprenderstate$mapdecorationrenderstate.rot * 360) / 16.0F));
                p_362536_.scale(4.0F, 4.0F, 3.0F);
                p_362536_.translate(-0.125F, 0.125F, 0.0F);
                Matrix4f matrix4f1 = p_362536_.last().pose();
                TextureAtlasSprite textureatlassprite = maprenderstate$mapdecorationrenderstate.atlasSprite;
                if (textureatlassprite != null) {
                    VertexConsumer vertexconsumer1 = p_366211_.getBuffer(RenderType.text(textureatlassprite.atlasLocation()));
                    vertexconsumer1.addVertex(matrix4f1, -1.0F, 1.0F, (float)i * -0.001F)
                        .setColor(-1)
                        .setUv(textureatlassprite.getU0(), textureatlassprite.getV0())
                        .setLight(p_369313_);
                    vertexconsumer1.addVertex(matrix4f1, 1.0F, 1.0F, (float)i * -0.001F)
                        .setColor(-1)
                        .setUv(textureatlassprite.getU1(), textureatlassprite.getV0())
                        .setLight(p_369313_);
                    vertexconsumer1.addVertex(matrix4f1, 1.0F, -1.0F, (float)i * -0.001F)
                        .setColor(-1)
                        .setUv(textureatlassprite.getU1(), textureatlassprite.getV1())
                        .setLight(p_369313_);
                    vertexconsumer1.addVertex(matrix4f1, -1.0F, -1.0F, (float)i * -0.001F)
                        .setColor(-1)
                        .setUv(textureatlassprite.getU0(), textureatlassprite.getV1())
                        .setLight(p_369313_);
                    p_362536_.popPose();
                }

                if (maprenderstate$mapdecorationrenderstate.name != null) {
                    Font font = Minecraft.getInstance().font;
                    float f = (float)font.width(maprenderstate$mapdecorationrenderstate.name);
                    float f1 = Mth.clamp(25.0F / f, 0.0F, 6.0F / 9.0F);
                    p_362536_.pushPose();
                    p_362536_.translate(
                        (float)maprenderstate$mapdecorationrenderstate.x / 2.0F + 64.0F - f * f1 / 2.0F,
                        (float)maprenderstate$mapdecorationrenderstate.y / 2.0F + 64.0F + 4.0F,
                        -0.025F
                    );
                    p_362536_.scale(f1, f1, 1.0F);
                    p_362536_.translate(0.0F, 0.0F, -0.1F);
                    font.drawInBatch(
                        maprenderstate$mapdecorationrenderstate.name,
                        0.0F,
                        0.0F,
                        -1,
                        false,
                        p_362536_.last().pose(),
                        p_366211_,
                        Font.DisplayMode.NORMAL,
                        Integer.MIN_VALUE,
                        p_369313_,
                        false
                    );
                    p_362536_.popPose();
                }

                i++;
            }
        }
    }

    public void extractRenderState(MapId p_369210_, MapItemSavedData p_363765_, MapRenderState p_362963_) {
        p_362963_.texture = this.mapTextureManager.prepareMapTexture(p_369210_, p_363765_);
        p_362963_.decorations.clear();

        for (MapDecoration mapdecoration : p_363765_.getDecorations()) {
            p_362963_.decorations.add(this.extractDecorationRenderState(mapdecoration));
        }
    }

    private MapRenderState.MapDecorationRenderState extractDecorationRenderState(MapDecoration p_369459_) {
        MapRenderState.MapDecorationRenderState maprenderstate$mapdecorationrenderstate = new MapRenderState.MapDecorationRenderState();
        maprenderstate$mapdecorationrenderstate.atlasSprite = this.decorationTextures.get(p_369459_);
        maprenderstate$mapdecorationrenderstate.x = p_369459_.x();
        maprenderstate$mapdecorationrenderstate.y = p_369459_.y();
        maprenderstate$mapdecorationrenderstate.rot = p_369459_.rot();
        maprenderstate$mapdecorationrenderstate.name = p_369459_.name().orElse(null);
        maprenderstate$mapdecorationrenderstate.renderOnFrame = p_369459_.renderOnFrame();
        return maprenderstate$mapdecorationrenderstate;
    }
}