Skip to content

Commit 9d46ccb

Browse files
committed
Vertex Mapping and misc
1 parent 968de6a commit 9d46ccb

File tree

8 files changed

+126
-61
lines changed

8 files changed

+126
-61
lines changed

common/src/main/kotlin/com/lambda/graphics/renderer/esp/BlockEspRenderer.kt renamed to common/src/main/kotlin/com/lambda/graphics/renderer/esp/ChunkedESP.kt

Lines changed: 30 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,12 @@ package com.lambda.graphics.renderer.esp
22

33
import com.lambda.event.Muteable
44
import com.lambda.event.events.RenderEvent
5+
import com.lambda.event.events.TickEvent
56
import com.lambda.event.events.WorldEvent
67
import com.lambda.event.listener.SafeListener.Companion.listener
78
import com.lambda.graphics.renderer.esp.DirectionMask.exclude
89
import com.lambda.graphics.renderer.esp.DirectionMask.mask
10+
import com.lambda.module.modules.client.RenderSettings
911
import com.mojang.blaze3d.systems.RenderSystem.recordRenderCall
1012
import kotlinx.coroutines.*
1113
import net.minecraft.util.math.BlockPos
@@ -15,21 +17,27 @@ import net.minecraft.world.BlockView
1517
import net.minecraft.world.chunk.WorldChunk
1618
import java.awt.Color
1719
import java.util.concurrent.ConcurrentHashMap
20+
import java.util.concurrent.ConcurrentLinkedDeque
1821
import java.util.concurrent.Executors.newSingleThreadExecutor
1922

20-
class BlockEspRenderer private constructor(
23+
class ChunkedESP private constructor(
2124
private val owner: Any,
2225
private val filter: (BlockView, BlockPos) -> Boolean,
2326
private val painter: (BlockView, BlockPos) -> Pair<Color, Color>
2427
) {
2528
private val rendererMap = ConcurrentHashMap<WorldChunk, EspChunk>()
2629
private val WorldChunk.renderer get() = rendererMap.getOrPut(this) {
27-
EspChunk(this, this@BlockEspRenderer)
30+
EspChunk(this, this@ChunkedESP)
2831
}
2932

33+
private val uploadPool = ConcurrentLinkedDeque<() -> Unit>()
34+
3035
init {
3136
listener<WorldEvent.BlockUpdate> { event ->
32-
world.getWorldChunk(event.pos).renderer.update = true
37+
world.getWorldChunk(event.pos).renderer.apply {
38+
update = true
39+
updateNeighbors()
40+
}
3341
}
3442

3543
listener<WorldEvent.ChunkEvent.Load> { event ->
@@ -40,6 +48,12 @@ class BlockEspRenderer private constructor(
4048
rendererMap.remove(event.chunk)?.updateNeighbors()
4149
}
4250

51+
owner.listener<TickEvent.Pre> {
52+
repeat(RenderSettings.chunksPerTick) {
53+
uploadPool.poll()?.invoke()
54+
}
55+
}
56+
4357
owner.listener<RenderEvent.World> {
4458
rendererMap.values.forEach {
4559
it.renderer?.render()
@@ -53,20 +67,19 @@ class BlockEspRenderer private constructor(
5367
if ((owner as? Muteable)?.isMuted == true) continue
5468
rendererMap.values.forEach {
5569
it.tick()
56-
delay(1)
5770
}
5871
}
5972
}
6073
}
6174

6275
companion object {
63-
fun Any.newEspRenderer(
76+
fun Any.newChunkedESP(
6477
filter: (BlockView, BlockPos) -> Boolean,
6578
painter: (BlockView, BlockPos) -> Pair<Color, Color>
66-
) = BlockEspRenderer(this, filter, painter)
79+
) = ChunkedESP(this, filter, painter)
6780
}
6881

69-
private class EspChunk(val chunk: WorldChunk, val owner: BlockEspRenderer) {
82+
private class EspChunk(val chunk: WorldChunk, val owner: ChunkedESP) {
7083
private val scope = CoroutineScope(newSingleThreadExecutor().asCoroutineDispatcher())
7184

7285
var renderer: EspRenderer? = null
@@ -107,10 +120,19 @@ class BlockEspRenderer private constructor(
107120
checkAndDraw(newRenderer, BlockPos(x, y, z))
108121
}
109122

110-
runOnMainThreadAndWait {
123+
val upload = {
111124
newRenderer.upload()
112125
renderer = newRenderer
113126
}
127+
128+
when (RenderSettings.uploadScheduler) {
129+
RenderSettings.UploadScheduler.Instant -> {
130+
runOnMainThreadAndWait(upload)
131+
}
132+
RenderSettings.UploadScheduler.Delayed -> {
133+
owner.uploadPool.add(upload)
134+
}
135+
}
114136
}
115137
}
116138

common/src/main/kotlin/com/lambda/graphics/renderer/esp/EspRenderer.kt

Lines changed: 45 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.lambda.graphics.renderer.esp
22

33
import com.lambda.Lambda.mc
4+
import com.lambda.graphics.buffer.vao.IRenderContext
45
import com.lambda.graphics.buffer.vao.VAO
56
import com.lambda.graphics.buffer.vao.vertex.BufferUsage
67
import com.lambda.graphics.buffer.vao.vertex.VertexAttrib
@@ -15,16 +16,21 @@ import com.lambda.graphics.renderer.esp.DirectionMask.UP
1516
import com.lambda.graphics.renderer.esp.DirectionMask.WEST
1617
import com.lambda.graphics.renderer.esp.DirectionMask.hasDirection
1718
import com.lambda.graphics.shader.Shader
19+
import com.lambda.module.modules.client.RenderSettings
1820
import com.lambda.util.primitives.extension.max
1921
import com.lambda.util.primitives.extension.min
2022
import net.minecraft.util.math.Box
2123
import java.awt.Color
24+
import java.util.concurrent.ConcurrentHashMap
2225

23-
class EspRenderer {
24-
private val filled = VAO(VertexMode.TRIANGLES, VertexAttrib.Group.STATIC_RENDERER, BufferUsage.STATIC)
25-
private var updateFilled = false
26+
class EspRenderer(usage: BufferUsage = BufferUsage.STATIC) {
27+
private val filled = VAO(VertexMode.TRIANGLES, VertexAttrib.Group.STATIC_RENDERER, usage)
28+
private val filledVertices = ConcurrentHashMap<Vertex, Int>()
29+
30+
private val outline = VAO(VertexMode.LINES, VertexAttrib.Group.STATIC_RENDERER, usage)
31+
private val outlineVertices = ConcurrentHashMap<Vertex, Int>()
2632

27-
private val outline = VAO(VertexMode.LINES, VertexAttrib.Group.STATIC_RENDERER, BufferUsage.STATIC)
33+
private var updateFilled = false
2834
private var updateOutline = false
2935

3036
var outlineWidth = 1.0
@@ -41,14 +47,14 @@ class EspRenderer {
4147

4248
grow(8)
4349

44-
val blb by lazy { vec3(pos1.x, pos1.y, pos1.z).color(color).end() }
45-
val blf by lazy { vec3(pos1.x, pos1.y, pos2.z).color(color).end() }
46-
val brb by lazy { vec3(pos2.x, pos1.y, pos1.z).color(color).end() }
47-
val brf by lazy { vec3(pos2.x, pos1.y, pos2.z).color(color).end() }
48-
val tlb by lazy { vec3(pos1.x, pos2.y, pos1.z).color(color).end() }
49-
val tlf by lazy { vec3(pos1.x, pos2.y, pos2.z).color(color).end() }
50-
val trb by lazy { vec3(pos2.x, pos2.y, pos1.z).color(color).end() }
51-
val trf by lazy { vec3(pos2.x, pos2.y, pos2.z).color(color).end() }
50+
val blb by vertex(filledVertices, pos1.x, pos1.y, pos1.z, color)
51+
val blf by vertex(filledVertices, pos1.x, pos1.y, pos2.z, color)
52+
val brb by vertex(filledVertices, pos2.x, pos1.y, pos1.z, color)
53+
val brf by vertex(filledVertices, pos2.x, pos1.y, pos2.z, color)
54+
val tlb by vertex(filledVertices, pos1.x, pos2.y, pos1.z, color)
55+
val tlf by vertex(filledVertices, pos1.x, pos2.y, pos2.z, color)
56+
val trb by vertex(filledVertices, pos2.x, pos2.y, pos1.z, color)
57+
val trf by vertex(filledVertices, pos2.x, pos2.y, pos2.z, color)
5258

5359
if (sides.hasDirection(EAST)) putQuad(brb, trb, trf, brf)
5460
if (sides.hasDirection(WEST)) putQuad(blb, blf, tlf, tlb)
@@ -65,14 +71,14 @@ class EspRenderer {
6571

6672
grow(8)
6773

68-
val blb by lazy { vec3(pos1.x, pos1.y, pos1.z).color(color).end() }
69-
val blf by lazy { vec3(pos1.x, pos1.y, pos2.z).color(color).end() }
70-
val brb by lazy { vec3(pos2.x, pos1.y, pos1.z).color(color).end() }
71-
val brf by lazy { vec3(pos2.x, pos1.y, pos2.z).color(color).end() }
72-
val tlb by lazy { vec3(pos1.x, pos2.y, pos1.z).color(color).end() }
73-
val tlf by lazy { vec3(pos1.x, pos2.y, pos2.z).color(color).end() }
74-
val trb by lazy { vec3(pos2.x, pos2.y, pos1.z).color(color).end() }
75-
val trf by lazy { vec3(pos2.x, pos2.y, pos2.z).color(color).end() }
74+
val blb by vertex(outlineVertices, pos1.x, pos1.y, pos1.z, color)
75+
val blf by vertex(outlineVertices, pos1.x, pos1.y, pos2.z, color)
76+
val brb by vertex(outlineVertices, pos2.x, pos1.y, pos1.z, color)
77+
val brf by vertex(outlineVertices, pos2.x, pos1.y, pos2.z, color)
78+
val tlb by vertex(outlineVertices, pos1.x, pos2.y, pos1.z, color)
79+
val tlf by vertex(outlineVertices, pos1.x, pos2.y, pos2.z, color)
80+
val trb by vertex(outlineVertices, pos2.x, pos2.y, pos1.z, color)
81+
val trf by vertex(outlineVertices, pos2.x, pos2.y, pos2.z, color)
7682

7783
val hasEast = sides.hasDirection(EAST)
7884
val hasWest = sides.hasDirection(WEST)
@@ -118,10 +124,29 @@ class EspRenderer {
118124
}
119125

120126
fun clear() {
127+
filledVertices.clear()
128+
outlineVertices.clear()
129+
121130
filled.clear()
122131
outline.clear()
123132
}
124133

134+
private fun IRenderContext.vertex(
135+
storage: MutableMap<Vertex, Int>,
136+
x: Double, y: Double, z: Double,
137+
color: Color
138+
) = lazy {
139+
val newVertex = {
140+
vec3(x, y, z).color(color).end()
141+
}
142+
143+
if (RenderSettings.vertexMapping) {
144+
storage.getOrPut(Vertex(x, y, z, color), newVertex)
145+
} else newVertex()
146+
}
147+
148+
private data class Vertex(val x: Double, val y: Double, val z: Double, val color: Color)
149+
125150
companion object {
126151
private val shader = Shader("renderer/pos_color", "renderer/box_static")
127152
}

common/src/main/kotlin/com/lambda/graphics/renderer/gui/font/FontRenderer.kt

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import com.lambda.graphics.buffer.vao.vertex.VertexAttrib
55
import com.lambda.graphics.buffer.vao.vertex.VertexMode
66
import com.lambda.graphics.renderer.gui.font.glyph.GlyphInfo
77
import com.lambda.graphics.shader.Shader
8-
import com.lambda.module.modules.client.FontSettings
8+
import com.lambda.module.modules.client.RenderSettings
99
import com.lambda.util.math.ColorUtils.a
1010
import com.lambda.util.math.ColorUtils.setAlpha
1111
import com.lambda.util.math.Vec2d
@@ -125,7 +125,7 @@ class FontRenderer(
125125
// Render chars
126126
font[text[index]]?.let { info ->
127127
// Draw a shadow before
128-
if (shadow && FontSettings.shadow && shadowShift > 0.0) {
128+
if (shadow && RenderSettings.shadow && shadowShift > 0.0) {
129129
draw(info, shadowColor, shadowShift)
130130
}
131131

@@ -139,9 +139,9 @@ class FontRenderer(
139139

140140
private fun getShadowColor(color: Color): Color {
141141
return Color(
142-
(color.red * FontSettings.shadowBrightness).toInt(),
143-
(color.green * FontSettings.shadowBrightness).toInt(),
144-
(color.blue * FontSettings.shadowBrightness).toInt(),
142+
(color.red * RenderSettings.shadowBrightness).toInt(),
143+
(color.green * RenderSettings.shadowBrightness).toInt(),
144+
(color.blue * RenderSettings.shadowBrightness).toInt(),
145145
color.alpha
146146
)
147147
}
@@ -161,8 +161,8 @@ class FontRenderer(
161161
companion object {
162162
private val shader = Shader("renderer/font")
163163

164-
private val shadowShift get() = FontSettings.shadowShift * 5.0
165-
private val baselineOffset get() = FontSettings.baselineOffset * 2.0f - 10f
166-
private val gap get() = FontSettings.gapSetting * 0.5f - 0.8f
164+
private val shadowShift get() = RenderSettings.shadowShift * 5.0
165+
private val baselineOffset get() = RenderSettings.baselineOffset * 2.0f - 10f
166+
private val gap get() = RenderSettings.gap * 0.5f - 0.8f
167167
}
168168
}

common/src/main/kotlin/com/lambda/graphics/renderer/gui/font/glyph/EmojiGlyphs.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ package com.lambda.graphics.renderer.gui.font.glyph
33
import com.google.common.math.IntMath.pow
44
import com.lambda.Lambda.LOG
55
import com.lambda.graphics.texture.MipmapTexture
6-
import com.lambda.module.modules.client.FontSettings
6+
import com.lambda.module.modules.client.RenderSettings
77
import com.lambda.util.math.Vec2d
88
import java.awt.Color
99
import java.awt.Graphics2D
@@ -89,7 +89,7 @@ class EmojiGlyphs(zipUrl: String) {
8989
fun bind() {
9090
with(fontTexture) {
9191
bind(GL_TEXTURE_SLOT)
92-
setLOD(FontSettings.lodBias.toFloat())
92+
setLOD(RenderSettings.lodBias.toFloat())
9393
}
9494
}
9595

common/src/main/kotlin/com/lambda/graphics/renderer/gui/font/glyph/FontGlyphs.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ package com.lambda.graphics.renderer.gui.font.glyph
33
import com.lambda.Lambda
44
import com.lambda.graphics.texture.MipmapTexture
55
import com.lambda.graphics.texture.TextureUtils.getCharImage
6-
import com.lambda.module.modules.client.FontSettings
6+
import com.lambda.module.modules.client.RenderSettings
77
import com.lambda.util.math.Vec2d
88
import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap
99
import java.awt.Color
@@ -64,7 +64,7 @@ class FontGlyphs(font: Font) {
6464
fun bind() {
6565
with(fontTexture) {
6666
bind(GL_TEXTURE_SLOT)
67-
setLOD(FontSettings.lodBias.toFloat())
67+
setLOD(RenderSettings.lodBias.toFloat())
6868
}
6969
}
7070

common/src/main/kotlin/com/lambda/module/modules/client/FontSettings.kt

Lines changed: 0 additions & 19 deletions
This file was deleted.
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
package com.lambda.module.modules.client
2+
3+
import com.lambda.module.Module
4+
import com.lambda.module.tag.ModuleTag
5+
6+
object RenderSettings : Module(
7+
name = "RenderSettings",
8+
description = "Renderer configuration",
9+
defaultTags = setOf(ModuleTag.CLIENT)
10+
) {
11+
private val page by setting("Page", Page.Font)
12+
13+
// Font
14+
val shadow by setting("Shadow", true) { page == Page.Font }
15+
val shadowBrightness by setting("Shadow Brightness", 0.35, 0.0..0.5, 0.01) { page == Page.Font && shadow }
16+
val shadowShift by setting("Shadow Shift", 1.0, 0.0..2.0, 0.05) { page == Page.Font && shadow }
17+
val gap by setting("Gap", 1.5, -10.0..10.0, 0.5) { page == Page.Font }
18+
val baselineOffset by setting("Vertical Offset", 0.0, -10.0..10.0, 0.5) { page == Page.Font }
19+
private val lodBiasSetting by setting("Smoothing", 0.0, -10.0..10.0, 0.5) { page == Page.Font }
20+
21+
// ESP
22+
val uploadScheduler by setting("Upload Scheduler", UploadScheduler.Instant) { page == Page.ESP }
23+
val chunksPerTick by setting("Chunks", 8, 1..32, 1, unit = " / tick") { page == Page.ESP && uploadScheduler == UploadScheduler.Delayed }
24+
val vertexMapping by setting("Vertex Mapping", true) { page == Page.ESP }
25+
26+
val lodBias get() = lodBiasSetting * 0.25f - 0.75f
27+
28+
private enum class Page {
29+
Font,
30+
ESP
31+
}
32+
33+
enum class UploadScheduler {
34+
Instant,
35+
Delayed
36+
}
37+
}

common/src/main/kotlin/com/lambda/module/modules/render/BlockESP.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package com.lambda.module.modules.render
22

33
import com.lambda.Lambda.mc
4-
import com.lambda.graphics.renderer.esp.BlockEspRenderer.Companion.newEspRenderer
4+
import com.lambda.graphics.renderer.esp.ChunkedESP.Companion.newChunkedESP
55
import com.lambda.module.Module
66
import com.lambda.module.tag.ModuleTag
77
import com.lambda.util.math.ColorUtils.setAlpha
@@ -32,7 +32,7 @@ object BlockESP : Module(
3232
val outlineColor = Color(100, 150, 255).setAlpha(0.5)
3333
val filledColor = outlineColor.setAlpha(0.2)
3434

35-
newEspRenderer(
35+
newChunkedESP(
3636
{ view, pos -> view.getBlockState(pos).block.defaultState == Blocks.GRASS_BLOCK.defaultState },
3737
{ _, _ -> filledColor to outlineColor }
3838
)

0 commit comments

Comments
 (0)