From d1c05d07227044c427db71bc12418d4a4f47fadc Mon Sep 17 00:00:00 2001 From: Michael Zangl Date: Mon, 28 Dec 2015 13:35:10 +0100 Subject: [PATCH] Re-enabled rendering of build markers. --- .../minecraft/minebot/ai/AIController.java | 27 +++++-- .../ai/profiler/InterceptingProfiler.java | 39 ++++++++++ .../minebot/ai/render/RenderHelper.java | 76 ++++++++++++------- .../minebot/ai/utils/PrivateFieldUtils.java | 25 +++++- 4 files changed, 128 insertions(+), 39 deletions(-) create mode 100644 Minebot/src/net/famzangl/minecraft/minebot/ai/profiler/InterceptingProfiler.java diff --git a/Minebot/src/net/famzangl/minecraft/minebot/ai/AIController.java b/Minebot/src/net/famzangl/minecraft/minebot/ai/AIController.java index 7245595a..7be27485 100644 --- a/Minebot/src/net/famzangl/minecraft/minebot/ai/AIController.java +++ b/Minebot/src/net/famzangl/minecraft/minebot/ai/AIController.java @@ -26,6 +26,7 @@ import net.famzangl.minecraft.minebot.ai.command.IAIControllable; import net.famzangl.minecraft.minebot.ai.net.MinebotNetHandler; import net.famzangl.minecraft.minebot.ai.net.NetworkHelper; +import net.famzangl.minecraft.minebot.ai.profiler.InterceptingProfiler; import net.famzangl.minecraft.minebot.ai.render.BuildMarkerRenderer; import net.famzangl.minecraft.minebot.ai.render.PosMarkerRenderer; import net.famzangl.minecraft.minebot.ai.strategy.AIStrategy; @@ -115,7 +116,7 @@ public void ungrabMouseCursor() { } private boolean dead; - private AIStrategy currentStrategy; + private volatile AIStrategy currentStrategy; private AIStrategy deactivatedStrategy; @@ -134,6 +135,8 @@ public void ungrabMouseCursor() { private BuildMarkerRenderer buildMarkerRenderer; private NetworkHelper networkHelper; + private InterceptingProfiler profilerHelper; + private RenderTickEvent activeDrawEvent; public AIController() { AIChatController.getRegistry().setControlled(this); @@ -142,6 +145,14 @@ public AIController() { @SubscribeEvent public void connect(ClientConnectedToServerEvent e) { networkHelper = MinebotNetHandler.inject(this, e.manager, e.handler); + profilerHelper = InterceptingProfiler.inject(getMinecraft()); + // Hook into net.minecraft.client.renderer.RenderGlobal.drawBlockDamageTexture(Tessellator, WorldRenderer, Entity, float) + profilerHelper.addLisener("hand", new Runnable() { + @Override + public void run() { + drawMakers(); + } + }); } /** @@ -327,10 +338,14 @@ public void resetOnGameEnd2(PlayerRespawnEvent unload) { * @param event */ @SubscribeEvent - public void drawMarkers(RenderTickEvent event) { - if (event.phase != Phase.END) { + public void beforeDrawMarkers(RenderTickEvent event) { + if (event.phase != Phase.START) { return; } + activeDrawEvent = event; + } + + public void drawMakers() { final Entity view = getMinecraft().getRenderViewEntity(); if (!(view instanceof EntityPlayerSP)) { return; @@ -341,17 +356,17 @@ public void drawMarkers(RenderTickEvent event) { if (markerRenderer == null) { markerRenderer = new PosMarkerRenderer(1, 0, 0); } - markerRenderer.render(event, this, pos1, pos2); + markerRenderer.render(activeDrawEvent, this, pos1, pos2); } else if (player.getHeldItem() != null && player.getHeldItem().getItem() == Items.stick) { if (buildMarkerRenderer == null) { buildMarkerRenderer = new BuildMarkerRenderer(); } - buildMarkerRenderer.render(event, this); + buildMarkerRenderer.render(activeDrawEvent, this); } AIStrategy strat = currentStrategy; if (strat != null) { - strat.drawMarkers(event, this); + strat.drawMarkers(activeDrawEvent, this); } } diff --git a/Minebot/src/net/famzangl/minecraft/minebot/ai/profiler/InterceptingProfiler.java b/Minebot/src/net/famzangl/minecraft/minebot/ai/profiler/InterceptingProfiler.java new file mode 100644 index 00000000..2749474e --- /dev/null +++ b/Minebot/src/net/famzangl/minecraft/minebot/ai/profiler/InterceptingProfiler.java @@ -0,0 +1,39 @@ +package net.famzangl.minecraft.minebot.ai.profiler; + +import java.util.concurrent.ConcurrentHashMap; + +import net.famzangl.minecraft.minebot.ai.utils.PrivateFieldUtils; +import net.minecraft.client.Minecraft; +import net.minecraft.profiler.Profiler; + +/** + * This is a special profiler class that allows you to run some code when + * minecraft reaches a start of a profiler section. + * + * @author michael + * + */ +public class InterceptingProfiler extends Profiler { + + private ConcurrentHashMap runOnSection = new ConcurrentHashMap(); + + @Override + public void startSection(String name) { + Runnable runnable = runOnSection.get(name); + if (runnable != null) { + runnable.run(); + } + super.startSection(name); + } + + public void addLisener(String name, Runnable r) { + runOnSection.put(name, r); + } + + public static InterceptingProfiler inject(Minecraft minecraft) { + InterceptingProfiler profiler = new InterceptingProfiler(); + // set minecraft.mcProfiler + PrivateFieldUtils.setFieldValue(minecraft, Minecraft.class, Profiler.class, profiler); + return profiler; + } +} diff --git a/Minebot/src/net/famzangl/minecraft/minebot/ai/render/RenderHelper.java b/Minebot/src/net/famzangl/minecraft/minebot/ai/render/RenderHelper.java index 0a60c209..29801069 100644 --- a/Minebot/src/net/famzangl/minecraft/minebot/ai/render/RenderHelper.java +++ b/Minebot/src/net/famzangl/minecraft/minebot/ai/render/RenderHelper.java @@ -17,9 +17,13 @@ package net.famzangl.minecraft.minebot.ai.render; import net.famzangl.minecraft.minebot.ai.AIHelper; +import net.minecraft.client.renderer.GlStateManager; import net.minecraft.client.renderer.OpenGlHelper; import net.minecraft.client.renderer.Tessellator; import net.minecraft.client.renderer.WorldRenderer; +import net.minecraft.client.renderer.vertex.DefaultVertexFormats; +import net.minecraft.client.renderer.vertex.VertexFormat; +import net.minecraft.client.renderer.vertex.VertexFormatElement; import net.minecraft.entity.Entity; import net.minecraft.util.BlockPos; import net.minecraftforge.fml.common.gameevent.TickEvent.RenderTickEvent; @@ -37,10 +41,13 @@ public class RenderHelper { private static final double MAX = 1.05; private static final double MIN = -0.05; - private boolean hadBlend; + public static final VertexFormat VF = new VertexFormat(); + static { + VF.setElement(new VertexFormatElement(0, VertexFormatElement.EnumType.FLOAT, VertexFormatElement.EnumUsage.POSITION, 3)); + VF.setElement(new VertexFormatElement(0, VertexFormatElement.EnumType.UBYTE, VertexFormatElement.EnumUsage.COLOR, 4)); + } public void renderStart(RenderTickEvent event, AIHelper helper) { - final Tessellator tessellator = Tessellator.getInstance(); final Entity player = helper.getMinecraft().getRenderViewEntity(); final double x = player.lastTickPosX + (player.posX - player.lastTickPosX) * event.renderTickTime; @@ -49,42 +56,53 @@ public void renderStart(RenderTickEvent event, AIHelper helper) { final double z = player.lastTickPosZ + (player.posZ - player.lastTickPosZ) * event.renderTickTime; - GL11.glBlendFunc(GL11.GL_DST_COLOR, GL11.GL_SRC_COLOR); - GL11.glDisable(GL11.GL_TEXTURE_2D); - - OpenGlHelper.glBlendFunc(774, 768, 1, 0); - GL11.glColor4f(1.0F, 1.0F, 1.0F, 0.5F); - GL11.glPushMatrix(); - GL11.glPolygonOffset(-3.0F, -3.0F); - GL11.glEnable(GL11.GL_POLYGON_OFFSET_FILL); - GL11.glEnable(GL11.GL_ALPHA_TEST); - hadBlend = GL11.glIsEnabled(GL11.GL_BLEND); - GL11.glEnable(GL11.GL_BLEND); - tessellator.getWorldRenderer().startDrawingQuads(); - tessellator.getWorldRenderer().setTranslation(-x, -y, -z); + preRender(); + Tessellator tessellator = Tessellator.getInstance(); + WorldRenderer worldrenderer = tessellator.getWorldRenderer(); + worldrenderer.setVertexFormat(VF); + worldrenderer.setTranslation(-x, -y, -z); + worldrenderer.startDrawingQuads(); + // worldrenderer.markDirty(); } + private void preRender() + { + GlStateManager.disableTexture2D(); + GlStateManager.enableBlend(); + GlStateManager.tryBlendFuncSeparate(GL11.GL_DST_COLOR, GL11.GL_SRC_COLOR, 1, 0); + + GlStateManager.color(1.0F, 1.0F, 1.0F, 1.0F); + GlStateManager.doPolygonOffset(-3.0F, -3.0F); + GlStateManager.enablePolygonOffset(); + GlStateManager.alphaFunc(516, 0.1F); + GlStateManager.enableAlpha(); + GlStateManager.pushMatrix(); + } + + private void postRender() + { + GlStateManager.disableAlpha(); + GlStateManager.doPolygonOffset(0.0F, 0.0F); + GlStateManager.disablePolygonOffset(); + GlStateManager.enableAlpha(); + GlStateManager.depthMask(true); + GlStateManager.popMatrix(); + GlStateManager.disableBlend(); + GlStateManager.enableTexture2D(); + } protected void renderEnd() { final Tessellator tessellator = Tessellator.getInstance(); - + WorldRenderer worldrenderer = tessellator.getWorldRenderer(); tessellator.draw(); - tessellator.getWorldRenderer().setTranslation(0.0D, 0.0D, 0.0D); - GL11.glDisable(GL11.GL_ALPHA_TEST); - GL11.glPolygonOffset(0.0F, 0.0F); - GL11.glDisable(GL11.GL_POLYGON_OFFSET_FILL); - GL11.glEnable(GL11.GL_ALPHA_TEST); - if (!hadBlend) { - GL11.glDisable(GL11.GL_BLEND); - } - GL11.glEnable(GL11.GL_TEXTURE_2D); - GL11.glDepthMask(true); - GL11.glPopMatrix(); + worldrenderer.setTranslation(0.0D, 0.0D, 0.0D); + postRender(); } protected void renderMarker(BlockPos m, float r, float g, float b, float a) { final Tessellator tessellator = Tessellator.getInstance(); - tessellator.getWorldRenderer().setColorRGBA_F(r, g, b, a); - renderMarkerP(tessellator.getWorldRenderer(), m.getX(), m.getY(), m.getZ()); + WorldRenderer renderer = tessellator.getWorldRenderer(); + renderer.setColorRGBA_F(r, g, b, a); + renderMarkerP(renderer, m.getX(), m.getY(), m.getZ()); } private void renderMarkerP(WorldRenderer worldRenderer, int x, int y, int z) { diff --git a/Minebot/src/net/famzangl/minecraft/minebot/ai/utils/PrivateFieldUtils.java b/Minebot/src/net/famzangl/minecraft/minebot/ai/utils/PrivateFieldUtils.java index de6db9d1..99c834af 100644 --- a/Minebot/src/net/famzangl/minecraft/minebot/ai/utils/PrivateFieldUtils.java +++ b/Minebot/src/net/famzangl/minecraft/minebot/ai/utils/PrivateFieldUtils.java @@ -61,10 +61,28 @@ public static T getFieldValue(Object o, Class baseClass, throw new IllegalArgumentException(e); } } + } - if (f.getType().isArray()) { - Class componentType = f.getType().getComponentType(); - if (componentType == ItemStack.class) { + throw new IllegalArgumentException("No field of type " + fieldType + + " in " + baseClass); + } + public static void setFieldValue(Object o, Class baseClass, + Class fieldType, T value) { + if (o == null) { + throw new NullPointerException(); + } + if (!baseClass.isAssignableFrom(o.getClass())) { + throw new IllegalArgumentException("Got a " + o.getClass().getName() + " but expected a " + baseClass.getName()); + } + for (Field f : baseClass.getDeclaredFields()) { + if (typeEquals(f.getType(), fieldType) && !Modifier.isStatic(f.getModifiers())) { + f.setAccessible(true); + try { + f.set(o, value); + return; + } catch (IllegalAccessException e) { + e.printStackTrace(); + throw new IllegalArgumentException(e); } } } @@ -72,7 +90,6 @@ public static T getFieldValue(Object o, Class baseClass, throw new IllegalArgumentException("No field of type " + fieldType + " in " + baseClass); } - public static boolean typeEquals(Class a, Class b) { return a.equals(b); }