Просмотр исходного кода

能在 GUI 中渲染缩放后的物品

LTCatt 6 лет назад
Родитель
Сommit
b546491784

+ 49 - 0
src/main/java/com/hexdragon/corere/renderer/ItemRendererRe.java

@@ -0,0 +1,49 @@
+package com.hexdragon.corere.renderer;
+import com.mojang.blaze3d.matrix.MatrixStack;
+import com.mojang.blaze3d.platform.GlStateManager;
+import com.mojang.blaze3d.systems.RenderSystem;
+import net.minecraft.client.Minecraft;
+import net.minecraft.client.renderer.IRenderTypeBuffer;
+import net.minecraft.client.renderer.ItemRenderer;
+import net.minecraft.client.renderer.RenderHelper;
+import net.minecraft.client.renderer.model.IBakedModel;
+import net.minecraft.client.renderer.model.ItemCameraTransforms;
+import net.minecraft.client.renderer.texture.AtlasTexture;
+import net.minecraft.client.renderer.texture.OverlayTexture;
+import net.minecraft.item.ItemStack;
+
+public class ItemRendererRe {
+
+    // 将缩放后的 ItemStack 渲染进 GUI
+    public static void renderItemModelIntoGUIScaled(ItemRenderer renderer, ItemStack stack, int x, int y, int size) {
+        // 获取相关参数
+        Minecraft minecraft = Minecraft.getInstance();
+        IBakedModel bakedmodel = renderer.getItemModelWithOverrides(stack, null, minecraft.player);
+        // 以下代码来自 ItemRenderer.renderItemModelIntoGUI
+        RenderSystem.pushMatrix();
+        minecraft.textureManager.bindTexture(AtlasTexture.LOCATION_BLOCKS_TEXTURE);
+        minecraft.textureManager.getTexture(AtlasTexture.LOCATION_BLOCKS_TEXTURE).setBlurMipmapDirect(false, false);
+        RenderSystem.enableRescaleNormal();
+        RenderSystem.enableAlphaTest();
+        RenderSystem.defaultAlphaFunc();
+        RenderSystem.enableBlend();
+        RenderSystem.blendFunc(GlStateManager.SourceFactor.SRC_ALPHA, GlStateManager.DestFactor.ONE_MINUS_SRC_ALPHA);
+        RenderSystem.color4f(1.0F, 1.0F, 1.0F, 1.0F);
+        RenderSystem.translatef((float) x, (float) y, 200.0F);
+        RenderSystem.translatef(8.0F, 8.0F, 0.0F);
+        RenderSystem.scalef(1.0F, -1.0F, 1.0F);
+        RenderSystem.scalef(size, size, size); // 主要就改了这句
+        MatrixStack matrixstack = new MatrixStack();
+        IRenderTypeBuffer.Impl irendertypebuffer$impl = Minecraft.getInstance().getRenderTypeBuffers().getBufferSource();
+        boolean flag = !bakedmodel.isSideLit();
+        if (flag) RenderHelper.setupGuiFlatDiffuseLighting();
+        renderer.renderItem(stack, ItemCameraTransforms.TransformType.GUI, false, matrixstack, irendertypebuffer$impl, 15728880, OverlayTexture.NO_OVERLAY, bakedmodel);
+        irendertypebuffer$impl.finish();
+        RenderSystem.enableDepthTest();
+        if (flag) RenderHelper.setupGui3DDiffuseLighting();
+        RenderSystem.disableAlphaTest();
+        RenderSystem.disableRescaleNormal();
+        RenderSystem.popMatrix();
+    }
+
+}

+ 5 - 4
src/main/java/com/hexdragon/enchrebirth/block/anvil/AnvilScreenRe.java

@@ -1,5 +1,6 @@
 package com.hexdragon.enchrebirth.block.anvil;
 
+import com.hexdragon.corere.renderer.ItemRendererRe;
 import com.hexdragon.enchrebirth.Main;
 import com.hexdragon.enchrebirth.registry.RegMain;
 import com.mojang.blaze3d.matrix.MatrixStack;
@@ -34,12 +35,12 @@ public class AnvilScreenRe extends ContainerScreen<AnvilContainerRe> {
         if ((this.container.getSlot(0).getHasStack() || this.container.getSlot(1).getHasStack()) && !this.container.getSlot(2).getHasStack()) {
             this.blit(matrixStack, i + 103, j + 26, this.xSize, 0, 28, 21);
         }
-        // 渲染当前铁砧的物品
-        this.itemRenderer.zLevel = 100.0F;
+        // 获取当前铁砧的物品
         final ItemStack[] stack = new ItemStack[1];
         this.container.worldPosCallable.consume((world, blockPos) -> stack[0] = new ItemStack(world.getTileEntity(blockPos).getBlockState().getBlock().asItem()));
-        this.itemRenderer.renderItemAndEffectIntoGUI(new ItemStack(RegMain.itemDamagedNetheriteAnvil.get()), i + 20, j + 109);
-        this.itemRenderer.zLevel = 0.0F;
+        if (stack[0] == null) stack[0] = new ItemStack(RegMain.itemDamagedNetheriteAnvil.get()); // 获取失败就渲染…… 测试用
+        // 渲染这个物品
+        ItemRendererRe.renderItemModelIntoGUIScaled(this.itemRenderer, stack[0], i + 21, j + 15, 64);
     }
 
     protected void drawGuiContainerForegroundLayer(MatrixStack matrixStack, int x, int y) {