diff --git a/common/src/main/kotlin/com/lambda/event/events/RenderEvent.kt b/common/src/main/kotlin/com/lambda/event/events/RenderEvent.kt index cdfdd755c..e247e328b 100644 --- a/common/src/main/kotlin/com/lambda/event/events/RenderEvent.kt +++ b/common/src/main/kotlin/com/lambda/event/events/RenderEvent.kt @@ -4,19 +4,19 @@ import com.lambda.Lambda.mc import com.lambda.event.Event import com.lambda.event.callback.Cancellable import com.lambda.event.callback.ICancellable -import com.lambda.graphics.renderer.esp.global.BlockESPRenderer -import com.lambda.graphics.renderer.esp.global.EntityESPRenderer +import com.lambda.graphics.renderer.esp.global.StaticESP +import com.lambda.graphics.renderer.esp.global.DynamicESP import com.lambda.util.math.Vec2d abstract class RenderEvent : Event { class World : RenderEvent() - class BlockESP : RenderEvent() { - val renderer = BlockESPRenderer + class StaticESP : RenderEvent() { + val renderer = StaticESP } - class EntityESP : RenderEvent() { - val renderer = EntityESPRenderer + class DynamicESP : RenderEvent() { + val renderer = DynamicESP } abstract class GUI(val scale: Double) : RenderEvent() { diff --git a/common/src/main/kotlin/com/lambda/graphics/RenderMain.kt b/common/src/main/kotlin/com/lambda/graphics/RenderMain.kt index a232f1c72..53216f32d 100644 --- a/common/src/main/kotlin/com/lambda/graphics/RenderMain.kt +++ b/common/src/main/kotlin/com/lambda/graphics/RenderMain.kt @@ -7,8 +7,8 @@ import com.lambda.graphics.gl.GlStateUtils.setupGL import com.lambda.graphics.gl.Matrices import com.lambda.graphics.gl.Matrices.resetMatrix import com.lambda.graphics.gl.Matrices.translate -import com.lambda.graphics.renderer.esp.global.BlockESPRenderer -import com.lambda.graphics.renderer.esp.global.EntityESPRenderer +import com.lambda.graphics.renderer.esp.global.StaticESP +import com.lambda.graphics.renderer.esp.global.DynamicESP import com.lambda.module.modules.client.GuiSettings import com.lambda.util.math.Vec2d import com.mojang.blaze3d.systems.RenderSystem.getProjectionMatrix @@ -42,8 +42,8 @@ object RenderMain { setupGL { RenderEvent.World().post() - BlockESPRenderer.render() - EntityESPRenderer.render() + StaticESP.render() + DynamicESP.render() } } diff --git a/common/src/main/kotlin/com/lambda/graphics/renderer/esp/ChunkedESP.kt b/common/src/main/kotlin/com/lambda/graphics/renderer/esp/ChunkedESP.kt index 1a09e8eab..966fe139d 100644 --- a/common/src/main/kotlin/com/lambda/graphics/renderer/esp/ChunkedESP.kt +++ b/common/src/main/kotlin/com/lambda/graphics/renderer/esp/ChunkedESP.kt @@ -6,6 +6,8 @@ import com.lambda.event.events.WorldEvent import com.lambda.event.listener.SafeListener.Companion.concurrentListener import com.lambda.event.listener.SafeListener.Companion.listener import com.lambda.graphics.buffer.vao.vertex.BufferUsage +import com.lambda.graphics.renderer.esp.impl.ESPRenderer +import com.lambda.graphics.renderer.esp.impl.StaticESPRenderer import com.lambda.module.modules.client.RenderSettings import com.lambda.threading.awaitMainThread import net.minecraft.util.math.ChunkPos @@ -16,7 +18,7 @@ import java.util.concurrent.ConcurrentLinkedDeque class ChunkedESP private constructor( owner: Any, - private val update: ESPRenderer.(WorldView, Int, Int, Int) -> Unit + private val update: StaticESPRenderer.(WorldView, Int, Int, Int) -> Unit ) { private val rendererMap = ConcurrentHashMap() private val WorldChunk.renderer get() = rendererMap.getOrPut(pos.toLong()) { @@ -76,7 +78,7 @@ class ChunkedESP private constructor( companion object { fun Any.newChunkedESP( - update: ESPRenderer.(WorldView, Int, Int, Int) -> Unit + update: StaticESPRenderer.(WorldView, Int, Int, Int) -> Unit ) = ChunkedESP(this, update) } @@ -101,7 +103,7 @@ class ChunkedESP private constructor( suspend fun rebuild() { val newRenderer = awaitMainThread { - ESPRenderer(BufferUsage.STATIC) + StaticESPRenderer(BufferUsage.STATIC) } iterateChunk { x, y, z -> diff --git a/common/src/main/kotlin/com/lambda/graphics/renderer/esp/DynamicAABB.kt b/common/src/main/kotlin/com/lambda/graphics/renderer/esp/DynamicAABB.kt new file mode 100644 index 000000000..35dd9d6ec --- /dev/null +++ b/common/src/main/kotlin/com/lambda/graphics/renderer/esp/DynamicAABB.kt @@ -0,0 +1,50 @@ +package com.lambda.graphics.renderer.esp + +import com.lambda.util.math.VecUtils.minus +import com.lambda.util.math.VecUtils.plus +import com.lambda.util.primitives.extension.max +import com.lambda.util.primitives.extension.min +import com.lambda.util.primitives.extension.prevPos +import net.minecraft.entity.Entity +import net.minecraft.util.math.Box + +class DynamicAABB { + private var prev: Box? = null + private var curr: Box? = null + + fun update(box: Box) { + prev = curr + curr = box + + if (prev == null) { + prev = box + } + } + + fun reset() { + prev = null + curr = null + } + + fun getBoxPair(): Pair? { + prev?.let { previous -> + curr?.let { current -> + return previous to current + } + } + + return null + } + + companion object { + val Entity.dynamicBox get() = DynamicAABB().apply { + val box = boundingBox + + val delta = prevPos - pos + val prevBox = Box(box.min + delta, box.max + delta) + + update(prevBox) + update(box) + } + } +} \ No newline at end of file diff --git a/common/src/main/kotlin/com/lambda/graphics/renderer/esp/ESPRenderer.kt b/common/src/main/kotlin/com/lambda/graphics/renderer/esp/ESPRenderer.kt deleted file mode 100644 index c660dbcf7..000000000 --- a/common/src/main/kotlin/com/lambda/graphics/renderer/esp/ESPRenderer.kt +++ /dev/null @@ -1,71 +0,0 @@ -package com.lambda.graphics.renderer.esp - -import com.lambda.Lambda.mc -import com.lambda.graphics.buffer.vao.IRenderContext -import com.lambda.graphics.buffer.vao.VAO -import com.lambda.graphics.buffer.vao.vertex.BufferUsage -import com.lambda.graphics.buffer.vao.vertex.VertexAttrib -import com.lambda.graphics.buffer.vao.vertex.VertexMode -import com.lambda.graphics.gl.GlStateUtils.withFaceCulling -import com.lambda.graphics.gl.GlStateUtils.withLineWidth -import com.lambda.graphics.shader.Shader -import com.lambda.module.modules.client.RenderSettings -import java.awt.Color -import java.util.concurrent.ConcurrentHashMap - -open class ESPRenderer( - usage: BufferUsage -) { - val faces = VAO(VertexMode.TRIANGLES, VertexAttrib.Group.STATIC_RENDERER, usage) - val faceVertices = ConcurrentHashMap() - - val outlines = VAO(VertexMode.LINES, VertexAttrib.Group.STATIC_RENDERER, usage) - val outlineVertices = ConcurrentHashMap() - - var updateFaces = false - var updateOutlines = false - - fun upload() { - if (updateFaces) { - updateFaces = false - faces.upload() - } - - if (updateOutlines) { - updateOutlines = false - outlines.upload() - } - } - - fun render() { - shader.use() - shader["u_CameraPosition"] = mc.gameRenderer.camera.pos - - withFaceCulling(faces::render) - withLineWidth(RenderSettings.outlineWidth, outlines::render) - } - - fun clear() { - faceVertices.clear() - outlineVertices.clear() - - faces.clear() - outlines.clear() - } - - fun IRenderContext.vertex( - storage: MutableMap, - x: Double, y: Double, z: Double, - color: Color - ) = lazy { - storage.getOrPut(Vertex(x, y, z, color)) { - vec3(x, y, z).color(color).end() - } - } - - data class Vertex(val x: Double, val y: Double, val z: Double, val color: Color) - - companion object { - private val shader = Shader("renderer/pos_color", "renderer/box_static") - } -} \ No newline at end of file diff --git a/common/src/main/kotlin/com/lambda/graphics/renderer/esp/builders/DynamicESPBuilders.kt b/common/src/main/kotlin/com/lambda/graphics/renderer/esp/builders/DynamicESPBuilders.kt new file mode 100644 index 000000000..2d6ab1577 --- /dev/null +++ b/common/src/main/kotlin/com/lambda/graphics/renderer/esp/builders/DynamicESPBuilders.kt @@ -0,0 +1,98 @@ +package com.lambda.graphics.renderer.esp.builders + +import com.lambda.graphics.renderer.esp.DirectionMask +import com.lambda.graphics.renderer.esp.DirectionMask.hasDirection +import com.lambda.graphics.renderer.esp.DynamicAABB +import com.lambda.graphics.renderer.esp.impl.DynamicESPRenderer +import com.lambda.util.primitives.extension.max +import com.lambda.util.primitives.extension.min +import java.awt.Color + +fun DynamicESPRenderer.build( + box: DynamicAABB, + filledColor: Color, + outlineColor: Color, + sides: Int = DirectionMask.ALL, + outlineMode: DirectionMask.OutlineMode = DirectionMask.OutlineMode.OR +) { + buildFilled(box, filledColor, sides) + buildOutline(box, outlineColor, sides, outlineMode) +} + +fun DynamicESPRenderer.buildFilled( + box: DynamicAABB, + color: Color, + sides: Int = DirectionMask.ALL +) = faces.use { + val boxes = box.getBoxPair() ?: return@use + + val pos11 = boxes.first.min + val pos12 = boxes.first.max + val pos21 = boxes.second.min + val pos22 = boxes.second.max + + grow(8) + + val blb by lazy { vec3(pos11.x, pos11.y, pos11.z).vec3(pos21.x, pos21.y, pos21.z).color(color).end() } + val blf by lazy { vec3(pos11.x, pos11.y, pos12.z).vec3(pos21.x, pos21.y, pos22.z).color(color).end() } + val brb by lazy { vec3(pos12.x, pos11.y, pos11.z).vec3(pos22.x, pos21.y, pos21.z).color(color).end() } + val brf by lazy { vec3(pos12.x, pos11.y, pos12.z).vec3(pos22.x, pos21.y, pos22.z).color(color).end() } + val tlb by lazy { vec3(pos11.x, pos12.y, pos11.z).vec3(pos21.x, pos22.y, pos21.z).color(color).end() } + val tlf by lazy { vec3(pos11.x, pos12.y, pos12.z).vec3(pos21.x, pos22.y, pos22.z).color(color).end() } + val trb by lazy { vec3(pos12.x, pos12.y, pos11.z).vec3(pos22.x, pos22.y, pos21.z).color(color).end() } + val trf by lazy { vec3(pos12.x, pos12.y, pos12.z).vec3(pos22.x, pos22.y, pos22.z).color(color).end() } + + if (sides.hasDirection(DirectionMask.EAST)) putQuad(brb, trb, trf, brf) + if (sides.hasDirection(DirectionMask.WEST)) putQuad(blb, blf, tlf, tlb) + if (sides.hasDirection(DirectionMask.UP)) putQuad(tlb, tlf, trf, trb) + if (sides.hasDirection(DirectionMask.DOWN)) putQuad(blb, brb, brf, blf) + if (sides.hasDirection(DirectionMask.SOUTH)) putQuad(blf, brf, trf, tlf) + if (sides.hasDirection(DirectionMask.NORTH)) putQuad(blb, tlb, trb, brb) +} + +fun DynamicESPRenderer.buildOutline( + box: DynamicAABB, + color: Color, + sides: Int = DirectionMask.ALL, + outlineMode: DirectionMask.OutlineMode = DirectionMask.OutlineMode.OR +) = outlines.use { + val boxes = box.getBoxPair() ?: return@use + + val pos11 = boxes.first.min + val pos12 = boxes.first.max + val pos21 = boxes.second.min + val pos22 = boxes.second.max + + grow(8) + + val blb by lazy { vec3(pos11.x, pos11.y, pos11.z).vec3(pos21.x, pos21.y, pos21.z).color(color).end() } + val blf by lazy { vec3(pos11.x, pos11.y, pos12.z).vec3(pos21.x, pos21.y, pos22.z).color(color).end() } + val brb by lazy { vec3(pos12.x, pos11.y, pos11.z).vec3(pos22.x, pos21.y, pos21.z).color(color).end() } + val brf by lazy { vec3(pos12.x, pos11.y, pos12.z).vec3(pos22.x, pos21.y, pos22.z).color(color).end() } + val tlb by lazy { vec3(pos11.x, pos12.y, pos11.z).vec3(pos21.x, pos22.y, pos21.z).color(color).end() } + val tlf by lazy { vec3(pos11.x, pos12.y, pos12.z).vec3(pos21.x, pos22.y, pos22.z).color(color).end() } + val trb by lazy { vec3(pos12.x, pos12.y, pos11.z).vec3(pos22.x, pos22.y, pos21.z).color(color).end() } + val trf by lazy { vec3(pos12.x, pos12.y, pos12.z).vec3(pos22.x, pos22.y, pos22.z).color(color).end() } + + val hasEast = sides.hasDirection(DirectionMask.EAST) + val hasWest = sides.hasDirection(DirectionMask.WEST) + val hasUp = sides.hasDirection(DirectionMask.UP) + val hasDown = sides.hasDirection(DirectionMask.DOWN) + val hasSouth = sides.hasDirection(DirectionMask.SOUTH) + val hasNorth = sides.hasDirection(DirectionMask.NORTH) + + if (outlineMode.check(hasUp, hasNorth)) putLine(tlb, trb) + if (outlineMode.check(hasUp, hasSouth)) putLine(tlf, trf) + if (outlineMode.check(hasUp, hasWest)) putLine(tlb, tlf) + if (outlineMode.check(hasUp, hasEast)) putLine(trf, trb) + + if (outlineMode.check(hasDown, hasNorth)) putLine(blb, brb) + if (outlineMode.check(hasDown, hasSouth)) putLine(blf, brf) + if (outlineMode.check(hasDown, hasWest)) putLine(blb, blf) + if (outlineMode.check(hasDown, hasEast)) putLine(brb, brf) + + if (outlineMode.check(hasWest, hasNorth)) putLine(tlb, blb) + if (outlineMode.check(hasNorth, hasEast)) putLine(trb, brb) + if (outlineMode.check(hasEast, hasSouth)) putLine(trf, brf) + if (outlineMode.check(hasSouth, hasWest)) putLine(tlf, blf) +} \ No newline at end of file diff --git a/common/src/main/kotlin/com/lambda/graphics/renderer/esp/global/ESPBuilders.kt b/common/src/main/kotlin/com/lambda/graphics/renderer/esp/builders/StaticESPBuilders.kt similarity index 92% rename from common/src/main/kotlin/com/lambda/graphics/renderer/esp/global/ESPBuilders.kt rename to common/src/main/kotlin/com/lambda/graphics/renderer/esp/builders/StaticESPBuilders.kt index 1eac95176..b56836d01 100644 --- a/common/src/main/kotlin/com/lambda/graphics/renderer/esp/global/ESPBuilders.kt +++ b/common/src/main/kotlin/com/lambda/graphics/renderer/esp/builders/StaticESPBuilders.kt @@ -1,14 +1,15 @@ -package com.lambda.graphics.renderer.esp.global +package com.lambda.graphics.renderer.esp.builders import com.lambda.graphics.renderer.esp.DirectionMask import com.lambda.graphics.renderer.esp.DirectionMask.hasDirection -import com.lambda.graphics.renderer.esp.ESPRenderer +import com.lambda.graphics.renderer.esp.impl.ESPRenderer +import com.lambda.graphics.renderer.esp.impl.StaticESPRenderer import com.lambda.util.primitives.extension.max import com.lambda.util.primitives.extension.min import net.minecraft.util.math.Box import java.awt.Color -fun ESPRenderer.build( +fun StaticESPRenderer.build( box: Box, filledColor: Color, outlineColor: Color, @@ -19,20 +20,20 @@ fun ESPRenderer.build( buildOutline(box, outlineColor, sides, outlineMode) } -fun ESPRenderer.buildFilled( +fun StaticESPRenderer.buildFilled( box: Box, color: Color, sides: Int = DirectionMask.ALL ) = buildFilled(box, color, color, sides) -fun ESPRenderer.buildOutline( +fun StaticESPRenderer.buildOutline( box: Box, color: Color, sides: Int = DirectionMask.ALL, outlineMode: DirectionMask.OutlineMode = DirectionMask.OutlineMode.OR ) = buildOutline(box, color, color, sides, outlineMode) -fun ESPRenderer.buildFilled( +fun StaticESPRenderer.buildFilled( box: Box, colorBottom: Color, colorTop: Color = colorBottom, @@ -42,7 +43,6 @@ fun ESPRenderer.buildFilled( val pos2 = box.max grow(8) - updateFaces = true val blb by vertex(faceVertices, pos1.x, pos1.y, pos1.z, colorBottom) val blf by vertex(faceVertices, pos1.x, pos1.y, pos2.z, colorBottom) @@ -59,9 +59,11 @@ fun ESPRenderer.buildFilled( if (sides.hasDirection(DirectionMask.DOWN)) putQuad(blb, brb, brf, blf) if (sides.hasDirection(DirectionMask.SOUTH)) putQuad(blf, brf, trf, tlf) if (sides.hasDirection(DirectionMask.NORTH)) putQuad(blb, tlb, trb, brb) + + updateFaces = true } -fun ESPRenderer.buildOutline( +fun StaticESPRenderer.buildOutline( box: Box, colorBottom: Color, colorTop: Color = colorBottom, @@ -72,7 +74,6 @@ fun ESPRenderer.buildOutline( val pos2 = box.max grow(8) - updateOutlines = true val blb by vertex(outlineVertices, pos1.x, pos1.y, pos1.z, colorBottom) val blf by vertex(outlineVertices, pos1.x, pos1.y, pos2.z, colorBottom) @@ -104,4 +105,6 @@ fun ESPRenderer.buildOutline( if (outlineMode.check(hasNorth, hasEast)) putLine(trb, brb) if (outlineMode.check(hasEast, hasSouth)) putLine(trf, brf) if (outlineMode.check(hasSouth, hasWest)) putLine(tlf, blf) + + updateOutlines = true } \ No newline at end of file diff --git a/common/src/main/kotlin/com/lambda/graphics/renderer/esp/global/DynamicESP.kt b/common/src/main/kotlin/com/lambda/graphics/renderer/esp/global/DynamicESP.kt new file mode 100644 index 000000000..971ca80ac --- /dev/null +++ b/common/src/main/kotlin/com/lambda/graphics/renderer/esp/global/DynamicESP.kt @@ -0,0 +1,17 @@ +package com.lambda.graphics.renderer.esp.global + +import com.lambda.event.EventFlow.post +import com.lambda.event.events.RenderEvent +import com.lambda.event.events.TickEvent +import com.lambda.event.listener.SafeListener.Companion.listener +import com.lambda.graphics.renderer.esp.impl.DynamicESPRenderer + +object DynamicESP : DynamicESPRenderer() { + init { + listener { + clear() + RenderEvent.DynamicESP().post() + upload() + } + } +} \ No newline at end of file diff --git a/common/src/main/kotlin/com/lambda/graphics/renderer/esp/global/EntityESPRenderer.kt b/common/src/main/kotlin/com/lambda/graphics/renderer/esp/global/EntityESPRenderer.kt deleted file mode 100644 index c1b52a620..000000000 --- a/common/src/main/kotlin/com/lambda/graphics/renderer/esp/global/EntityESPRenderer.kt +++ /dev/null @@ -1,142 +0,0 @@ -package com.lambda.graphics.renderer.esp.global - -import com.lambda.Lambda -import com.lambda.event.EventFlow.post -import com.lambda.event.events.RenderEvent -import com.lambda.event.events.TickEvent -import com.lambda.event.listener.SafeListener.Companion.listener -import com.lambda.graphics.buffer.vao.VAO -import com.lambda.graphics.buffer.vao.vertex.VertexAttrib -import com.lambda.graphics.buffer.vao.vertex.VertexMode -import com.lambda.graphics.renderer.esp.DirectionMask -import com.lambda.graphics.renderer.esp.DirectionMask.hasDirection -import com.lambda.graphics.shader.Shader -import com.lambda.util.primitives.extension.max -import com.lambda.util.primitives.extension.min -import com.lambda.util.primitives.extension.partialTicks -import com.lambda.util.primitives.extension.prevPos -import net.minecraft.entity.Entity -import net.minecraft.util.math.Box -import java.awt.Color - -object EntityESPRenderer { - private val faces = VAO(VertexMode.TRIANGLES, VertexAttrib.Group.DYNAMIC_RENDERER) - private val outlines = VAO(VertexMode.LINES, VertexAttrib.Group.DYNAMIC_RENDERER) - private val shader = Shader("renderer/pos_color", "renderer/box_dynamic") - - fun build( - entity: Entity, - filledColor: Color, - outlineColor: Color, - sides: Int = DirectionMask.ALL, - outlineMode: DirectionMask.OutlineMode = DirectionMask.OutlineMode.OR - ) { - buildFilled(entity, filledColor, sides) - buildOutline(entity, outlineColor, sides, outlineMode) - } - - fun buildFilled( - entity: Entity, - color: Color, - sides: Int = DirectionMask.ALL - ) = faces.use { - val box = entity.boundingBox - - val delta = entity.prevPos.subtract(entity.pos) - val prevBox = Box(box.min.add(delta), box.max.add(delta)) - - val pos11 = prevBox.min - val pos12 = prevBox.max - val pos21 = box.min - val pos22 = box.max - - grow(8) - - val blb by lazy { vec3(pos11.x, pos11.y, pos11.z).vec3(pos21.x, pos21.y, pos21.z).color(color).end() } - val blf by lazy { vec3(pos11.x, pos11.y, pos12.z).vec3(pos21.x, pos21.y, pos22.z).color(color).end() } - val brb by lazy { vec3(pos12.x, pos11.y, pos11.z).vec3(pos22.x, pos21.y, pos21.z).color(color).end() } - val brf by lazy { vec3(pos12.x, pos11.y, pos12.z).vec3(pos22.x, pos21.y, pos22.z).color(color).end() } - val tlb by lazy { vec3(pos11.x, pos12.y, pos11.z).vec3(pos21.x, pos22.y, pos21.z).color(color).end() } - val tlf by lazy { vec3(pos11.x, pos12.y, pos12.z).vec3(pos21.x, pos22.y, pos22.z).color(color).end() } - val trb by lazy { vec3(pos12.x, pos12.y, pos11.z).vec3(pos22.x, pos22.y, pos21.z).color(color).end() } - val trf by lazy { vec3(pos12.x, pos12.y, pos12.z).vec3(pos22.x, pos22.y, pos22.z).color(color).end() } - - if (sides.hasDirection(DirectionMask.EAST)) putQuad(brb, brf, trf, trb) - if (sides.hasDirection(DirectionMask.WEST)) putQuad(blb, blf, tlf, tlb) - if (sides.hasDirection(DirectionMask.UP)) putQuad(tlb, tlf, trf, trb) - if (sides.hasDirection(DirectionMask.DOWN)) putQuad(blb, brb, brf, blf) - if (sides.hasDirection(DirectionMask.SOUTH)) putQuad(blf, brf, trf, tlf) - if (sides.hasDirection(DirectionMask.NORTH)) putQuad(blb, brb, trb, tlb) - } - - fun buildOutline( - entity: Entity, - color: Color, - sides: Int = DirectionMask.ALL, - outlineMode: DirectionMask.OutlineMode = DirectionMask.OutlineMode.OR - ) = outlines.use { - val box = entity.boundingBox - - val delta = entity.prevPos.subtract(entity.pos) - val prevBox = Box(box.min.add(delta), box.max.add(delta)) - - val pos11 = prevBox.min - val pos12 = prevBox.max - val pos21 = box.min - val pos22 = box.max - - grow(8) - - val blb by lazy { vec3(pos11.x, pos11.y, pos11.z).vec3(pos21.x, pos21.y, pos21.z).color(color).end() } - val blf by lazy { vec3(pos11.x, pos11.y, pos12.z).vec3(pos21.x, pos21.y, pos22.z).color(color).end() } - val brb by lazy { vec3(pos12.x, pos11.y, pos11.z).vec3(pos22.x, pos21.y, pos21.z).color(color).end() } - val brf by lazy { vec3(pos12.x, pos11.y, pos12.z).vec3(pos22.x, pos21.y, pos22.z).color(color).end() } - val tlb by lazy { vec3(pos11.x, pos12.y, pos11.z).vec3(pos21.x, pos22.y, pos21.z).color(color).end() } - val tlf by lazy { vec3(pos11.x, pos12.y, pos12.z).vec3(pos21.x, pos22.y, pos22.z).color(color).end() } - val trb by lazy { vec3(pos12.x, pos12.y, pos11.z).vec3(pos22.x, pos22.y, pos21.z).color(color).end() } - val trf by lazy { vec3(pos12.x, pos12.y, pos12.z).vec3(pos22.x, pos22.y, pos22.z).color(color).end() } - - val hasEast = sides.hasDirection(DirectionMask.EAST) - val hasWest = sides.hasDirection(DirectionMask.WEST) - val hasUp = sides.hasDirection(DirectionMask.UP) - val hasDown = sides.hasDirection(DirectionMask.DOWN) - val hasSouth = sides.hasDirection(DirectionMask.SOUTH) - val hasNorth = sides.hasDirection(DirectionMask.NORTH) - - if (outlineMode.check(hasUp, hasNorth)) putLine(tlb, trb) - if (outlineMode.check(hasUp, hasSouth)) putLine(tlf, trf) - if (outlineMode.check(hasUp, hasWest)) putLine(tlb, tlf) - if (outlineMode.check(hasUp, hasEast)) putLine(trf, trb) - - if (outlineMode.check(hasDown, hasNorth)) putLine(blb, brb) - if (outlineMode.check(hasDown, hasSouth)) putLine(blf, brf) - if (outlineMode.check(hasDown, hasWest)) putLine(blb, blf) - if (outlineMode.check(hasDown, hasEast)) putLine(brb, brf) - - if (outlineMode.check(hasWest, hasNorth)) putLine(tlb, blb) - if (outlineMode.check(hasNorth, hasEast)) putLine(trb, brb) - if (outlineMode.check(hasEast, hasSouth)) putLine(trf, brf) - if (outlineMode.check(hasSouth, hasWest)) putLine(tlf, blf) - } - - fun render() { - shader.use() - shader["u_TickDelta"] = Lambda.mc.partialTicks - shader["u_CameraPosition"] = Lambda.mc.gameRenderer.camera.pos - - faces.render() - outlines.render() - } - - init { - listener { - faces.clear() - outlines.clear() - - RenderEvent.EntityESP().post() - - faces.upload() - outlines.upload() - } - } -} \ No newline at end of file diff --git a/common/src/main/kotlin/com/lambda/graphics/renderer/esp/global/BlockESPRenderer.kt b/common/src/main/kotlin/com/lambda/graphics/renderer/esp/global/StaticESP.kt similarity index 70% rename from common/src/main/kotlin/com/lambda/graphics/renderer/esp/global/BlockESPRenderer.kt rename to common/src/main/kotlin/com/lambda/graphics/renderer/esp/global/StaticESP.kt index ff157f91e..79733d92f 100644 --- a/common/src/main/kotlin/com/lambda/graphics/renderer/esp/global/BlockESPRenderer.kt +++ b/common/src/main/kotlin/com/lambda/graphics/renderer/esp/global/StaticESP.kt @@ -5,13 +5,13 @@ import com.lambda.event.events.RenderEvent import com.lambda.event.events.TickEvent import com.lambda.event.listener.SafeListener.Companion.listener import com.lambda.graphics.buffer.vao.vertex.BufferUsage -import com.lambda.graphics.renderer.esp.ESPRenderer +import com.lambda.graphics.renderer.esp.impl.StaticESPRenderer -object BlockESPRenderer : ESPRenderer(BufferUsage.DYNAMIC) { +object StaticESP : StaticESPRenderer(BufferUsage.DYNAMIC) { init { listener { clear() - RenderEvent.BlockESP().post() + RenderEvent.StaticESP().post() upload() } } diff --git a/common/src/main/kotlin/com/lambda/graphics/renderer/esp/impl/DynamicESPRenderer.kt b/common/src/main/kotlin/com/lambda/graphics/renderer/esp/impl/DynamicESPRenderer.kt new file mode 100644 index 000000000..bf8f9a878 --- /dev/null +++ b/common/src/main/kotlin/com/lambda/graphics/renderer/esp/impl/DynamicESPRenderer.kt @@ -0,0 +1,5 @@ +package com.lambda.graphics.renderer.esp.impl + +import com.lambda.graphics.buffer.vao.vertex.BufferUsage + +open class DynamicESPRenderer : ESPRenderer(BufferUsage.DYNAMIC, true) \ No newline at end of file diff --git a/common/src/main/kotlin/com/lambda/graphics/renderer/esp/impl/ESPRenderer.kt b/common/src/main/kotlin/com/lambda/graphics/renderer/esp/impl/ESPRenderer.kt new file mode 100644 index 000000000..df7091f5c --- /dev/null +++ b/common/src/main/kotlin/com/lambda/graphics/renderer/esp/impl/ESPRenderer.kt @@ -0,0 +1,60 @@ +package com.lambda.graphics.renderer.esp.impl + +import com.lambda.Lambda.mc +import com.lambda.graphics.buffer.vao.VAO +import com.lambda.graphics.buffer.vao.vertex.BufferUsage +import com.lambda.graphics.buffer.vao.vertex.VertexAttrib +import com.lambda.graphics.buffer.vao.vertex.VertexMode +import com.lambda.graphics.gl.GlStateUtils.withFaceCulling +import com.lambda.graphics.gl.GlStateUtils.withLineWidth +import com.lambda.graphics.shader.Shader +import com.lambda.module.modules.client.RenderSettings +import com.lambda.util.primitives.extension.partialTicks + +abstract class ESPRenderer( + usage: BufferUsage, + tickedMode: Boolean +) { + val shader: Shader + val faces: VAO + val outlines: VAO + + init { + val mode = if (tickedMode) dynamicMode else staticMode + + shader = mode.first + faces = VAO(VertexMode.TRIANGLES, mode.second, usage) + outlines = VAO(VertexMode.LINES, mode.second, usage) + } + + open fun upload() { + faces.upload() + outlines.upload() + } + + fun render() { + shader.use() + shader["u_TickDelta"] = mc.partialTicks + shader["u_CameraPosition"] = mc.gameRenderer.camera.pos + + withFaceCulling(faces::render) + withLineWidth(RenderSettings.outlineWidth, outlines::render) + } + + open fun clear() { + faces.clear() + outlines.clear() + } + + companion object { + private val staticMode = Shader( + "renderer/pos_color", + "renderer/box_static" + ) to VertexAttrib.Group.STATIC_RENDERER + + private val dynamicMode = Shader( + "renderer/pos_color", + "renderer/box_dynamic" + ) to VertexAttrib.Group.DYNAMIC_RENDERER + } +} \ No newline at end of file diff --git a/common/src/main/kotlin/com/lambda/graphics/renderer/esp/impl/StaticESPRenderer.kt b/common/src/main/kotlin/com/lambda/graphics/renderer/esp/impl/StaticESPRenderer.kt new file mode 100644 index 000000000..0817f17e8 --- /dev/null +++ b/common/src/main/kotlin/com/lambda/graphics/renderer/esp/impl/StaticESPRenderer.kt @@ -0,0 +1,46 @@ +package com.lambda.graphics.renderer.esp.impl + +import com.lambda.graphics.buffer.vao.IRenderContext +import com.lambda.graphics.buffer.vao.vertex.BufferUsage +import java.awt.Color +import java.util.concurrent.ConcurrentHashMap + +open class StaticESPRenderer( + usage: BufferUsage = BufferUsage.STATIC +) : ESPRenderer(usage, false) { + val faceVertices = ConcurrentHashMap() + val outlineVertices = ConcurrentHashMap() + + var updateFaces = false + var updateOutlines = false + + override fun upload() { + if (updateFaces) { + updateFaces = false + faces.upload() + } + + if (updateOutlines) { + updateOutlines = false + outlines.upload() + } + } + + override fun clear() { + faceVertices.clear() + outlineVertices.clear() + super.clear() + } + + fun IRenderContext.vertex( + storage: MutableMap, + x: Double, y: Double, z: Double, + color: Color + ) = lazy { + storage.getOrPut(Vertex(x, y, z, color)) { + vec3(x, y, z).color(color).end() + } + } + + data class Vertex(val x: Double, val y: Double, val z: Double, val color: Color) +} \ No newline at end of file diff --git a/common/src/main/kotlin/com/lambda/interaction/construction/result/Drawable.kt b/common/src/main/kotlin/com/lambda/interaction/construction/result/Drawable.kt index 35a23edda..523aba06e 100644 --- a/common/src/main/kotlin/com/lambda/interaction/construction/result/Drawable.kt +++ b/common/src/main/kotlin/com/lambda/interaction/construction/result/Drawable.kt @@ -3,8 +3,8 @@ package com.lambda.interaction.construction.result import com.lambda.context.SafeContext import com.lambda.graphics.renderer.esp.DirectionMask import com.lambda.graphics.renderer.esp.DirectionMask.include -import com.lambda.graphics.renderer.esp.global.BlockESPRenderer -import com.lambda.graphics.renderer.esp.global.buildFilled +import com.lambda.graphics.renderer.esp.global.StaticESP +import com.lambda.graphics.renderer.esp.builders.buildFilled import com.lambda.util.BlockUtils.blockState import net.minecraft.block.BlockState import net.minecraft.util.math.BlockPos @@ -14,13 +14,11 @@ import net.minecraft.util.shape.VoxelShape import java.awt.Color interface Drawable { - val renderer get() = BlockESPRenderer - fun SafeContext.buildRenderer() fun SafeContext.withBox(box: Box, color: Color, mask: Int = DirectionMask.ALL) { - renderer.buildFilled(box, color, mask) -// renderer.buildOutline(box, color, mask) + StaticESP.buildFilled(box, color, mask) + //StaticESP.buildOutline(box, color, mask) } fun SafeContext.withState(blockState: BlockState, blockPos: BlockPos, color: Color, side: Direction) { diff --git a/common/src/main/kotlin/com/lambda/interaction/construction/result/PlaceResult.kt b/common/src/main/kotlin/com/lambda/interaction/construction/result/PlaceResult.kt index 28a0e52b9..7c79a30d6 100644 --- a/common/src/main/kotlin/com/lambda/interaction/construction/result/PlaceResult.kt +++ b/common/src/main/kotlin/com/lambda/interaction/construction/result/PlaceResult.kt @@ -3,11 +3,9 @@ package com.lambda.interaction.construction.result import baritone.api.pathing.goals.GoalBlock import baritone.api.pathing.goals.GoalInverted import com.lambda.context.SafeContext -import com.lambda.graphics.renderer.esp.global.buildOutline import com.lambda.interaction.construction.context.PlaceContext import com.lambda.task.tasks.BuildStructure.Companion.breakBlock import com.lambda.task.tasks.PlaceBlock.Companion.placeBlock -import com.lambda.util.BlockUtils.blockState import net.minecraft.block.BlockState import net.minecraft.item.ItemPlacementContext import net.minecraft.item.ItemStack diff --git a/common/src/main/kotlin/com/lambda/module/modules/debug/RenderTest.kt b/common/src/main/kotlin/com/lambda/module/modules/debug/RenderTest.kt index 4d969522b..e014b2321 100644 --- a/common/src/main/kotlin/com/lambda/module/modules/debug/RenderTest.kt +++ b/common/src/main/kotlin/com/lambda/module/modules/debug/RenderTest.kt @@ -1,9 +1,9 @@ package com.lambda.module.modules.debug import com.lambda.event.events.RenderEvent -import com.lambda.event.events.TickEvent import com.lambda.event.listener.SafeListener.Companion.listener -import com.lambda.graphics.renderer.esp.global.build +import com.lambda.graphics.renderer.esp.DynamicAABB.Companion.dynamicBox +import com.lambda.graphics.renderer.esp.builders.build import com.lambda.module.Module import com.lambda.module.tag.ModuleTag import com.lambda.util.math.ColorUtils.setAlpha @@ -28,12 +28,12 @@ object RenderTest : Module( private val filledColor = outlineColor.setAlpha(0.2) init { - listener { + listener { val entity = getClosestEntity(player.pos, 8.0) ?: return@listener - it.renderer.build(entity, filledColor, outlineColor) + it.renderer.build(entity.dynamicBox, filledColor, outlineColor) } - listener { + listener { it.renderer.build(Box.of(player.pos, 0.3, 0.3, 0.3), filledColor, outlineColor) } } diff --git a/common/src/main/kotlin/com/lambda/module/modules/render/BlockESP.kt b/common/src/main/kotlin/com/lambda/module/modules/render/BlockESP.kt index 9a1139126..b5a3e2aa7 100644 --- a/common/src/main/kotlin/com/lambda/module/modules/render/BlockESP.kt +++ b/common/src/main/kotlin/com/lambda/module/modules/render/BlockESP.kt @@ -4,9 +4,10 @@ import com.lambda.Lambda.mc import com.lambda.graphics.renderer.esp.ChunkedESP.Companion.newChunkedESP import com.lambda.graphics.renderer.esp.DirectionMask import com.lambda.graphics.renderer.esp.DirectionMask.buildSideMesh -import com.lambda.graphics.renderer.esp.ESPRenderer -import com.lambda.graphics.renderer.esp.global.buildFilled -import com.lambda.graphics.renderer.esp.global.buildOutline +import com.lambda.graphics.renderer.esp.impl.ESPRenderer +import com.lambda.graphics.renderer.esp.builders.buildFilled +import com.lambda.graphics.renderer.esp.builders.buildOutline +import com.lambda.graphics.renderer.esp.impl.StaticESPRenderer import com.lambda.module.Module import com.lambda.module.tag.ModuleTag import com.lambda.util.BlockUtils.blockState @@ -84,7 +85,7 @@ object BlockESP : Module( build(Box(blockPos), sides) } - private fun ESPRenderer.build( + private fun StaticESPRenderer.build( box: Box, sides: Int, ) { diff --git a/common/src/main/kotlin/com/lambda/task/tasks/BuildStructure.kt b/common/src/main/kotlin/com/lambda/task/tasks/BuildStructure.kt index fc27eb6f3..7e38e25c9 100644 --- a/common/src/main/kotlin/com/lambda/task/tasks/BuildStructure.kt +++ b/common/src/main/kotlin/com/lambda/task/tasks/BuildStructure.kt @@ -37,7 +37,7 @@ class BuildStructure @Ta5kBuilder constructor( } init { - listener { + listener { previousResults.filterIsInstance().forEach { res -> with(res) { buildRenderer()