diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/framebuffer/world/overlay/Overlay.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/framebuffer/world/overlay/Overlay.kt
index a4845e9ea..ba8b00409 100644
--- a/src/main/java/de/bixilon/minosoft/gui/rendering/framebuffer/world/overlay/Overlay.kt
+++ b/src/main/java/de/bixilon/minosoft/gui/rendering/framebuffer/world/overlay/Overlay.kt
@@ -20,4 +20,6 @@ interface Overlay : Drawable {
fun init() {}
fun postInit() {}
+
+ fun update() {}
}
diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/framebuffer/world/overlay/OverlayManager.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/framebuffer/world/overlay/OverlayManager.kt
index 9297494e8..0dec58d0a 100644
--- a/src/main/java/de/bixilon/minosoft/gui/rendering/framebuffer/world/overlay/OverlayManager.kt
+++ b/src/main/java/de/bixilon/minosoft/gui/rendering/framebuffer/world/overlay/OverlayManager.kt
@@ -40,6 +40,7 @@ class OverlayManager(
override fun draw() {
for (overlay in overlays) {
+ overlay.update()
if (!overlay.render) {
continue
}
diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/framebuffer/world/overlay/overlays/DefaultOverlays.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/framebuffer/world/overlay/overlays/DefaultOverlays.kt
index f1531ed46..de9ecf15d 100644
--- a/src/main/java/de/bixilon/minosoft/gui/rendering/framebuffer/world/overlay/overlays/DefaultOverlays.kt
+++ b/src/main/java/de/bixilon/minosoft/gui/rendering/framebuffer/world/overlay/overlays/DefaultOverlays.kt
@@ -13,10 +13,12 @@
package de.bixilon.minosoft.gui.rendering.framebuffer.world.overlay.overlays
+import de.bixilon.minosoft.gui.rendering.framebuffer.world.overlay.overlays.simple.WallOverlay
import de.bixilon.minosoft.gui.rendering.framebuffer.world.overlay.overlays.simple.WaterOverlay
object DefaultOverlays {
val OVERLAYS = listOf(
+ WallOverlay,
WaterOverlay,
)
}
diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/framebuffer/world/overlay/overlays/simple/SimpleOverlay.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/framebuffer/world/overlay/overlays/simple/SimpleOverlay.kt
index d277be350..e5b309f15 100644
--- a/src/main/java/de/bixilon/minosoft/gui/rendering/framebuffer/world/overlay/overlays/simple/SimpleOverlay.kt
+++ b/src/main/java/de/bixilon/minosoft/gui/rendering/framebuffer/world/overlay/overlays/simple/SimpleOverlay.kt
@@ -30,10 +30,8 @@ abstract class SimpleOverlay(
protected open val shader: Shader = renderWindow.shaderManager.genericTexture2dShader
private var mesh = SimpleTextureMesh(renderWindow)
protected var tintColor: RGBColor? = null
-
- override fun postInit() {
- updateMesh()
- }
+ protected open var uvStart = Vec2(0.0f, 0.0f)
+ protected open var uvEnd = Vec2(1.0f, 1.0f)
protected fun updateMesh() {
@@ -42,13 +40,13 @@ abstract class SimpleOverlay(
}
mesh = SimpleTextureMesh(renderWindow)
- mesh.addZQuad(Vec2(-1.0f, -1.0f), z, Vec2(+1.0f, +1.0f)) { position, uv -> mesh.addVertex(position, texture, uv, tintColor) }
+ mesh.addZQuad(Vec2(-1.0f, -1.0f), z, Vec2(+1.0f, +1.0f), uvStart, uvEnd) { position, uv -> mesh.addVertex(position, texture, uv, tintColor) }
mesh.load()
}
override fun draw() {
renderWindow.renderSystem.reset(blending = true)
- updateMesh()
+ updateMesh() // ToDo: Don't update every time
shader.use()
mesh.draw()
}
diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/framebuffer/world/overlay/overlays/simple/WallOverlay.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/framebuffer/world/overlay/overlays/simple/WallOverlay.kt
new file mode 100644
index 000000000..ac696cf82
--- /dev/null
+++ b/src/main/java/de/bixilon/minosoft/gui/rendering/framebuffer/world/overlay/overlays/simple/WallOverlay.kt
@@ -0,0 +1,67 @@
+/*
+ * Minosoft
+ * Copyright (C) 2020-2022 Moritz Zwerger
+ *
+ * This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along with this program. If not, see .
+ *
+ * This software is not affiliated with Mojang AB, the original developer of Minecraft.
+ */
+
+package de.bixilon.minosoft.gui.rendering.framebuffer.world.overlay.overlays.simple
+
+import de.bixilon.kutil.cast.CastUtil.unsafeNull
+import de.bixilon.minosoft.data.abilities.Gamemodes
+import de.bixilon.minosoft.data.registries.blocks.BlockState
+import de.bixilon.minosoft.data.registries.blocks.types.FluidBlock
+import de.bixilon.minosoft.data.text.RGBColor
+import de.bixilon.minosoft.gui.rendering.RenderWindow
+import de.bixilon.minosoft.gui.rendering.framebuffer.world.overlay.OverlayFactory
+import de.bixilon.minosoft.gui.rendering.system.base.texture.texture.AbstractTexture
+import de.bixilon.minosoft.gui.rendering.util.VecUtil
+import de.bixilon.minosoft.gui.rendering.util.VecUtil.blockPosition
+import de.bixilon.minosoft.gui.rendering.util.vec.vec3.Vec3iUtil.EMPTY
+import glm_.vec2.Vec2
+import glm_.vec3.Vec3i
+import java.util.*
+
+class WallOverlay(renderWindow: RenderWindow, z: Float) : SimpleOverlay(renderWindow, z) {
+ private val player = renderWindow.connection.player
+ override var texture: AbstractTexture = unsafeNull()
+ private var blockState: BlockState? = null
+ private var position: Vec3i = Vec3i.EMPTY
+ override val render: Boolean
+ get() {
+ val blockState = blockState
+ return player.gamemode != Gamemodes.SPECTATOR && blockState != null && blockState.block !is FluidBlock
+ }
+ override var uvEnd: Vec2
+ get() = Vec2(0.3f, renderWindow.window.sizef.x / renderWindow.window.sizef.y / 3.0f) // To make pixels squares and make it look more like minecraft
+ set(value) {}
+ private val random = Random()
+
+ override fun update() {
+ position = player.eyePosition.blockPosition
+ blockState = renderWindow.connection.world[position]
+ }
+
+ override fun draw() {
+ random.setSeed(VecUtil.generatePositionHash(position.x, position.y, position.z))
+ texture = blockState?.blockModel?.getParticleTexture(random, position) ?: return
+
+ tintColor = RGBColor(0.1f, 0.1f, 0.1f, 1.0f)
+
+ super.draw()
+ }
+
+
+ companion object : OverlayFactory {
+
+ override fun build(renderWindow: RenderWindow, z: Float): WallOverlay {
+ return WallOverlay(renderWindow, z)
+ }
+ }
+}
diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/framebuffer/world/overlay/overlays/simple/WaterOverlay.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/framebuffer/world/overlay/overlays/simple/WaterOverlay.kt
index 045e052e1..b9c1a9049 100644
--- a/src/main/java/de/bixilon/minosoft/gui/rendering/framebuffer/world/overlay/overlays/simple/WaterOverlay.kt
+++ b/src/main/java/de/bixilon/minosoft/gui/rendering/framebuffer/world/overlay/overlays/simple/WaterOverlay.kt
@@ -13,6 +13,7 @@
package de.bixilon.minosoft.gui.rendering.framebuffer.world.overlay.overlays.simple
+import de.bixilon.minosoft.data.abilities.Gamemodes
import de.bixilon.minosoft.data.registries.fluid.water.WaterFluid
import de.bixilon.minosoft.data.text.RGBColor
import de.bixilon.minosoft.gui.rendering.RenderWindow
@@ -22,9 +23,10 @@ import de.bixilon.minosoft.gui.rendering.textures.TextureUtil.texture
import de.bixilon.minosoft.util.KUtil.toResourceLocation
class WaterOverlay(renderWindow: RenderWindow, z: Float) : SimpleOverlay(renderWindow, z) {
+ private val player = renderWindow.connection.player
override val texture: AbstractTexture = renderWindow.textureManager.staticTextures.createTexture("minecraft:misc/underwater".toResourceLocation().texture())
override val render: Boolean
- get() = renderWindow.connection.player.submergedFluid is WaterFluid
+ get() = player.gamemode != Gamemodes.SPECTATOR && player.submergedFluid is WaterFluid
override fun draw() {
val brightness = renderWindow.connection.world.getBrightness(renderWindow.connection.player.positionInfo.blockPosition)