|
| 1 | +/* |
| 2 | + * FDPClient Hacked Client |
| 3 | + * A free open source mixin-based injection hacked client for Minecraft using Minecraft Forge. |
| 4 | + * https://github.com/SkidderMC/FDPClient/ |
| 5 | + */ |
| 6 | +package net.ccbluex.liquidbounce.utils.render |
| 7 | + |
| 8 | +import net.ccbluex.liquidbounce.utils.client.MinecraftInstance |
| 9 | +import net.minecraft.client.renderer.GlStateManager |
| 10 | +import net.minecraft.client.renderer.Tessellator |
| 11 | +import net.minecraft.client.renderer.vertex.DefaultVertexFormats |
| 12 | +import net.minecraft.util.AxisAlignedBB |
| 13 | +import net.minecraft.util.BlockPos |
| 14 | +import org.lwjgl.opengl.GL11.* |
| 15 | +import java.awt.Color |
| 16 | + |
| 17 | +/** |
| 18 | + * 3D world rendering utilities |
| 19 | + * |
| 20 | + * @author Zywl |
| 21 | + */ |
| 22 | +object Render3D : MinecraftInstance { |
| 23 | + |
| 24 | + fun drawBlockBox(blockPos: BlockPos, color: Color, outline: Boolean) { |
| 25 | + val renderManager = mc.renderManager |
| 26 | + val timer = mc.timer |
| 27 | + |
| 28 | + val x = blockPos.x - renderManager.renderPosX |
| 29 | + val y = blockPos.y - renderManager.renderPosY |
| 30 | + val z = blockPos.z - renderManager.renderPosZ |
| 31 | + |
| 32 | + var axisAlignedBB = AxisAlignedBB.fromBounds(x, y, z, x + 1.0, y + 1.0, z + 1.0) |
| 33 | + val block = mc.theWorld.getBlockState(blockPos).block |
| 34 | + |
| 35 | + if (block != null) { |
| 36 | + val player = mc.thePlayer |
| 37 | + |
| 38 | + val posX = player.lastTickPosX + (player.posX - player.lastTickPosX) * timer.renderPartialTicks |
| 39 | + val posY = player.lastTickPosY + (player.posY - player.lastTickPosY) * timer.renderPartialTicks |
| 40 | + val posZ = player.lastTickPosZ + (player.posZ - player.lastTickPosZ) * timer.renderPartialTicks |
| 41 | + block.setBlockBoundsBasedOnState(mc.theWorld, blockPos) |
| 42 | + axisAlignedBB = block.getSelectedBoundingBox(mc.theWorld, blockPos) |
| 43 | + .expand(0.0020000000949949026, 0.0020000000949949026, 0.0020000000949949026) |
| 44 | + .offset(-posX, -posY, -posZ) |
| 45 | + } |
| 46 | + |
| 47 | + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA) |
| 48 | + RenderGL.enableGlCap(GL_BLEND) |
| 49 | + RenderGL.disableGlCap(GL_TEXTURE_2D, GL_DEPTH_TEST) |
| 50 | + glDepthMask(false) |
| 51 | + |
| 52 | + RenderGL.glColor(color.red, color.green, color.blue, if (color.alpha != 255) color.alpha else if (outline) 26 else 35) |
| 53 | + drawFilledBox(axisAlignedBB) |
| 54 | + |
| 55 | + if (outline) { |
| 56 | + glLineWidth(1f) |
| 57 | + RenderGL.enableGlCap(GL_LINE_SMOOTH) |
| 58 | + RenderGL.glColor(color.red, color.green, color.blue, 255) |
| 59 | + |
| 60 | + drawSelectionBoundingBox(axisAlignedBB) |
| 61 | + } |
| 62 | + |
| 63 | + GlStateManager.resetColor() |
| 64 | + glDepthMask(true) |
| 65 | + RenderGL.resetCaps() |
| 66 | + } |
| 67 | + |
| 68 | + fun drawSelectionBoundingBox(boundingBox: AxisAlignedBB) { |
| 69 | + val tessellator = Tessellator.getInstance() |
| 70 | + val worldrenderer = tessellator.worldRenderer |
| 71 | + |
| 72 | + worldrenderer.begin(GL_LINE_STRIP, DefaultVertexFormats.POSITION) |
| 73 | + |
| 74 | + worldrenderer.pos(boundingBox.minX, boundingBox.minY, boundingBox.minZ).endVertex() |
| 75 | + worldrenderer.pos(boundingBox.minX, boundingBox.minY, boundingBox.maxZ).endVertex() |
| 76 | + worldrenderer.pos(boundingBox.maxX, boundingBox.minY, boundingBox.maxZ).endVertex() |
| 77 | + worldrenderer.pos(boundingBox.maxX, boundingBox.minY, boundingBox.minZ).endVertex() |
| 78 | + worldrenderer.pos(boundingBox.minX, boundingBox.minY, boundingBox.minZ).endVertex() |
| 79 | + worldrenderer.pos(boundingBox.minX, boundingBox.maxY, boundingBox.minZ).endVertex() |
| 80 | + worldrenderer.pos(boundingBox.minX, boundingBox.maxY, boundingBox.maxZ).endVertex() |
| 81 | + worldrenderer.pos(boundingBox.maxX, boundingBox.maxY, boundingBox.maxZ).endVertex() |
| 82 | + worldrenderer.pos(boundingBox.maxX, boundingBox.maxY, boundingBox.minZ).endVertex() |
| 83 | + worldrenderer.pos(boundingBox.minX, boundingBox.maxY, boundingBox.minZ).endVertex() |
| 84 | + worldrenderer.pos(boundingBox.maxX, boundingBox.maxY, boundingBox.minZ).endVertex() |
| 85 | + worldrenderer.pos(boundingBox.maxX, boundingBox.minY, boundingBox.minZ).endVertex() |
| 86 | + worldrenderer.pos(boundingBox.maxX, boundingBox.minY, boundingBox.maxZ).endVertex() |
| 87 | + worldrenderer.pos(boundingBox.maxX, boundingBox.maxY, boundingBox.maxZ).endVertex() |
| 88 | + worldrenderer.pos(boundingBox.minX, boundingBox.maxY, boundingBox.maxZ).endVertex() |
| 89 | + worldrenderer.pos(boundingBox.minX, boundingBox.minY, boundingBox.maxZ).endVertex() |
| 90 | + |
| 91 | + tessellator.draw() |
| 92 | + } |
| 93 | + |
| 94 | + fun drawFilledBox(axisAlignedBB: AxisAlignedBB) { |
| 95 | + val tessellator = Tessellator.getInstance() |
| 96 | + val worldRenderer = tessellator.worldRenderer |
| 97 | + |
| 98 | + worldRenderer.begin(GL_QUADS, DefaultVertexFormats.POSITION) |
| 99 | + worldRenderer.pos(axisAlignedBB.minX, axisAlignedBB.minY, axisAlignedBB.minZ).endVertex() |
| 100 | + worldRenderer.pos(axisAlignedBB.minX, axisAlignedBB.maxY, axisAlignedBB.minZ).endVertex() |
| 101 | + worldRenderer.pos(axisAlignedBB.maxX, axisAlignedBB.minY, axisAlignedBB.minZ).endVertex() |
| 102 | + worldRenderer.pos(axisAlignedBB.maxX, axisAlignedBB.maxY, axisAlignedBB.minZ).endVertex() |
| 103 | + worldRenderer.pos(axisAlignedBB.maxX, axisAlignedBB.minY, axisAlignedBB.maxZ).endVertex() |
| 104 | + worldRenderer.pos(axisAlignedBB.maxX, axisAlignedBB.maxY, axisAlignedBB.maxZ).endVertex() |
| 105 | + worldRenderer.pos(axisAlignedBB.minX, axisAlignedBB.minY, axisAlignedBB.maxZ).endVertex() |
| 106 | + worldRenderer.pos(axisAlignedBB.minX, axisAlignedBB.maxY, axisAlignedBB.maxZ).endVertex() |
| 107 | + |
| 108 | + worldRenderer.pos(axisAlignedBB.maxX, axisAlignedBB.maxY, axisAlignedBB.minZ).endVertex() |
| 109 | + worldRenderer.pos(axisAlignedBB.maxX, axisAlignedBB.minY, axisAlignedBB.minZ).endVertex() |
| 110 | + worldRenderer.pos(axisAlignedBB.minX, axisAlignedBB.maxY, axisAlignedBB.minZ).endVertex() |
| 111 | + worldRenderer.pos(axisAlignedBB.minX, axisAlignedBB.minY, axisAlignedBB.minZ).endVertex() |
| 112 | + worldRenderer.pos(axisAlignedBB.minX, axisAlignedBB.maxY, axisAlignedBB.maxZ).endVertex() |
| 113 | + worldRenderer.pos(axisAlignedBB.minX, axisAlignedBB.minY, axisAlignedBB.maxZ).endVertex() |
| 114 | + worldRenderer.pos(axisAlignedBB.maxX, axisAlignedBB.maxY, axisAlignedBB.maxZ).endVertex() |
| 115 | + worldRenderer.pos(axisAlignedBB.maxX, axisAlignedBB.minY, axisAlignedBB.maxZ).endVertex() |
| 116 | + |
| 117 | + worldRenderer.pos(axisAlignedBB.minX, axisAlignedBB.maxY, axisAlignedBB.minZ).endVertex() |
| 118 | + worldRenderer.pos(axisAlignedBB.maxX, axisAlignedBB.maxY, axisAlignedBB.minZ).endVertex() |
| 119 | + worldRenderer.pos(axisAlignedBB.maxX, axisAlignedBB.maxY, axisAlignedBB.maxZ).endVertex() |
| 120 | + worldRenderer.pos(axisAlignedBB.minX, axisAlignedBB.maxY, axisAlignedBB.maxZ).endVertex() |
| 121 | + worldRenderer.pos(axisAlignedBB.minX, axisAlignedBB.maxY, axisAlignedBB.minZ).endVertex() |
| 122 | + worldRenderer.pos(axisAlignedBB.minX, axisAlignedBB.maxY, axisAlignedBB.maxZ).endVertex() |
| 123 | + worldRenderer.pos(axisAlignedBB.maxX, axisAlignedBB.maxY, axisAlignedBB.maxZ).endVertex() |
| 124 | + worldRenderer.pos(axisAlignedBB.maxX, axisAlignedBB.maxY, axisAlignedBB.minZ).endVertex() |
| 125 | + |
| 126 | + worldRenderer.pos(axisAlignedBB.minX, axisAlignedBB.minY, axisAlignedBB.minZ).endVertex() |
| 127 | + worldRenderer.pos(axisAlignedBB.maxX, axisAlignedBB.minY, axisAlignedBB.minZ).endVertex() |
| 128 | + worldRenderer.pos(axisAlignedBB.maxX, axisAlignedBB.minY, axisAlignedBB.maxZ).endVertex() |
| 129 | + worldRenderer.pos(axisAlignedBB.minX, axisAlignedBB.minY, axisAlignedBB.maxZ).endVertex() |
| 130 | + worldRenderer.pos(axisAlignedBB.minX, axisAlignedBB.minY, axisAlignedBB.minZ).endVertex() |
| 131 | + worldRenderer.pos(axisAlignedBB.minX, axisAlignedBB.minY, axisAlignedBB.maxZ).endVertex() |
| 132 | + worldRenderer.pos(axisAlignedBB.maxX, axisAlignedBB.minY, axisAlignedBB.maxZ).endVertex() |
| 133 | + worldRenderer.pos(axisAlignedBB.maxX, axisAlignedBB.minY, axisAlignedBB.minZ).endVertex() |
| 134 | + |
| 135 | + worldRenderer.pos(axisAlignedBB.minX, axisAlignedBB.minY, axisAlignedBB.minZ).endVertex() |
| 136 | + worldRenderer.pos(axisAlignedBB.minX, axisAlignedBB.maxY, axisAlignedBB.minZ).endVertex() |
| 137 | + worldRenderer.pos(axisAlignedBB.minX, axisAlignedBB.minY, axisAlignedBB.maxZ).endVertex() |
| 138 | + worldRenderer.pos(axisAlignedBB.minX, axisAlignedBB.maxY, axisAlignedBB.maxZ).endVertex() |
| 139 | + worldRenderer.pos(axisAlignedBB.maxX, axisAlignedBB.minY, axisAlignedBB.maxZ).endVertex() |
| 140 | + worldRenderer.pos(axisAlignedBB.maxX, axisAlignedBB.maxY, axisAlignedBB.maxZ).endVertex() |
| 141 | + worldRenderer.pos(axisAlignedBB.maxX, axisAlignedBB.minY, axisAlignedBB.minZ).endVertex() |
| 142 | + worldRenderer.pos(axisAlignedBB.maxX, axisAlignedBB.maxY, axisAlignedBB.minZ).endVertex() |
| 143 | + |
| 144 | + worldRenderer.pos(axisAlignedBB.minX, axisAlignedBB.maxY, axisAlignedBB.maxZ).endVertex() |
| 145 | + worldRenderer.pos(axisAlignedBB.minX, axisAlignedBB.minY, axisAlignedBB.maxZ).endVertex() |
| 146 | + worldRenderer.pos(axisAlignedBB.minX, axisAlignedBB.maxY, axisAlignedBB.minZ).endVertex() |
| 147 | + worldRenderer.pos(axisAlignedBB.minX, axisAlignedBB.minY, axisAlignedBB.minZ).endVertex() |
| 148 | + worldRenderer.pos(axisAlignedBB.maxX, axisAlignedBB.maxY, axisAlignedBB.minZ).endVertex() |
| 149 | + worldRenderer.pos(axisAlignedBB.maxX, axisAlignedBB.minY, axisAlignedBB.minZ).endVertex() |
| 150 | + worldRenderer.pos(axisAlignedBB.maxX, axisAlignedBB.maxY, axisAlignedBB.maxZ).endVertex() |
| 151 | + worldRenderer.pos(axisAlignedBB.maxX, axisAlignedBB.minY, axisAlignedBB.maxZ).endVertex() |
| 152 | + tessellator.draw() |
| 153 | + } |
| 154 | + |
| 155 | + fun drawAxisAlignedBB(axisAlignedBB: AxisAlignedBB, color: Color) { |
| 156 | + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA) |
| 157 | + glEnable(GL_BLEND) |
| 158 | + glLineWidth(2f) |
| 159 | + glDisable(GL_TEXTURE_2D) |
| 160 | + glDisable(GL_DEPTH_TEST) |
| 161 | + glDepthMask(false) |
| 162 | + RenderGL.glColor(color) |
| 163 | + drawFilledBox(axisAlignedBB) |
| 164 | + GlStateManager.resetColor() |
| 165 | + glEnable(GL_TEXTURE_2D) |
| 166 | + glEnable(GL_DEPTH_TEST) |
| 167 | + glDepthMask(true) |
| 168 | + glDisable(GL_BLEND) |
| 169 | + } |
| 170 | + |
| 171 | + fun drawPlatform(y: Double, color: Color, size: Double) { |
| 172 | + val renderManager = mc.renderManager |
| 173 | + drawAxisAlignedBB( |
| 174 | + AxisAlignedBB( |
| 175 | + size, y, size, -size, y - 0.01, -size |
| 176 | + ).offset(renderManager.renderPosX, renderManager.renderPosY, renderManager.renderPosZ), color |
| 177 | + ) |
| 178 | + } |
| 179 | +} |
0 commit comments