DEADSOFTWARE

Refactor rendering
[cavedroid.git] / core / src / ru / deadsoftware / cavedroid / game / render / DebugRenderer.kt
1 package ru.deadsoftware.cavedroid.game.render
3 import com.badlogic.gdx.graphics.Color
4 import com.badlogic.gdx.graphics.g2d.SpriteBatch
5 import com.badlogic.gdx.graphics.glutils.ShapeRenderer
6 import com.badlogic.gdx.math.Rectangle
7 import ru.deadsoftware.cavedroid.MainConfig
8 import ru.deadsoftware.cavedroid.game.GameScope
9 import ru.deadsoftware.cavedroid.game.debug.DebugInfoStringsProvider
10 import ru.deadsoftware.cavedroid.game.mobs.MobsController
11 import ru.deadsoftware.cavedroid.game.model.block.Block
12 import ru.deadsoftware.cavedroid.game.world.GameWorld
13 import ru.deadsoftware.cavedroid.misc.Assets
14 import ru.deadsoftware.cavedroid.misc.utils.bl
15 import ru.deadsoftware.cavedroid.misc.utils.forEachBlockInArea
16 import ru.deadsoftware.cavedroid.misc.utils.px
17 import javax.inject.Inject
19 @GameScope
20 class DebugRenderer @Inject constructor(
21 private val mainConfig: MainConfig,
22 private val gameWorld: GameWorld,
23 private val mobsController: MobsController,
24 private val debugInfoStringsProvider: DebugInfoStringsProvider,
25 ) : IGameRenderer {
27 override val renderLayer get() = RENDER_LAYER
29 private fun SpriteBatch.drawString(str: String, x: Float, y: Float) {
30 Assets.minecraftFont.draw(this, str, x, y)
31 }
33 private fun getMinimapColor(x: Int, y: Int): Color? {
34 val foregroundBlock = gameWorld.getForeMap(x, y)
36 return if (!foregroundBlock.isNone()) {
37 when (foregroundBlock) {
38 is Block.Water -> Color.BLUE
39 is Block.Lava -> Color.RED
40 else -> Color.BLACK
41 }
42 } else if (gameWorld.hasBackAt(x, y)) {
43 Color.DARK_GRAY
44 } else {
45 null
46 }
47 }
49 private fun drawMinimap(
50 spriteBatch: SpriteBatch,
51 shapeRenderer: ShapeRenderer,
52 minimapX: Float,
53 minimapY: Float,
54 minimapSize: Float
55 ) {
56 val mapArea = Rectangle(
57 /* x = */ mobsController.player.x - (minimapSize.px / 2),
58 /* y = */ mobsController.player.y - (minimapSize.px / 2),
59 /* width = */ minimapSize.px,
60 /* height = */ minimapSize.px
61 )
63 spriteBatch.end()
64 shapeRenderer.begin(ShapeRenderer.ShapeType.Filled)
65 shapeRenderer.color = Color.LIGHT_GRAY
66 shapeRenderer.rect(minimapX, minimapY, minimapSize, minimapSize)
68 forEachBlockInArea(mapArea) { x, y ->
69 getMinimapColor(x, y)?.let { color ->
70 shapeRenderer.setColor(color)
71 shapeRenderer.rect(
72 /* x = */ minimapX + (x - mapArea.x.bl),
73 /* y = */ minimapY + (y - mapArea.y.bl),
74 /* width = */ 1f,
75 /* height = */ 1f
76 )
77 }
78 }
80 shapeRenderer.color = Color.OLIVE
81 shapeRenderer.rect(minimapX + minimapSize / 2, minimapY + minimapSize / 2, 1f, 2f)
82 shapeRenderer.end()
83 spriteBatch.begin()
84 }
86 private fun drawDebugInfo(spriteBatch: SpriteBatch) {
87 debugInfoStringsProvider.getDebugStrings().forEachIndexed { index, str ->
88 spriteBatch.drawString(str, 0f, index * 10f)
89 }
90 }
92 override fun draw(spriteBatch: SpriteBatch, shapeRenderer: ShapeRenderer, viewport: Rectangle, delta: Float) {
93 if (mainConfig.isShowInfo) {
94 drawDebugInfo(spriteBatch)
95 }
97 if (mainConfig.isShowMap) {
98 drawMinimap(
99 spriteBatch = spriteBatch,
100 shapeRenderer = shapeRenderer,
101 minimapX = viewport.width - MinimapConfig.margin - MinimapConfig.size,
102 minimapY = MinimapConfig.margin,
103 minimapSize = MinimapConfig.size
109 companion object {
110 private const val RENDER_LAYER = Int.MAX_VALUE
112 private data object MinimapConfig {
113 const val margin = 24f
114 const val size = 64f