render block collision outline box

This commit is contained in:
Bixilon 2021-05-16 14:40:25 +02:00
parent 4311eaabaa
commit 8a78d75fa6
No known key found for this signature in database
GPG Key ID: 5CAD791931B09AC4
2 changed files with 35 additions and 11 deletions

View File

@ -18,4 +18,5 @@ import com.squareup.moshi.Json
data class OtherGameConfig( data class OtherGameConfig(
@Json(name = "anti_moire_pattern") var antiMoirePattern: Boolean = true, @Json(name = "anti_moire_pattern") var antiMoirePattern: Boolean = true,
@Json(name = "flower_random_offset") var flowerRandomOffset: Boolean = true, @Json(name = "flower_random_offset") var flowerRandomOffset: Boolean = true,
@Json(name = "render_block_outline_collision_box") var renderBlockOutlineCollisionBox: Boolean = false,
) )

View File

@ -13,6 +13,7 @@
package de.bixilon.minosoft.gui.rendering.chunk.block.outline package de.bixilon.minosoft.gui.rendering.chunk.block.outline
import de.bixilon.minosoft.Minosoft
import de.bixilon.minosoft.data.Gamemodes import de.bixilon.minosoft.data.Gamemodes
import de.bixilon.minosoft.data.mappings.ResourceLocation import de.bixilon.minosoft.data.mappings.ResourceLocation
import de.bixilon.minosoft.data.mappings.blocks.BlockState import de.bixilon.minosoft.data.mappings.blocks.BlockState
@ -38,13 +39,16 @@ class BlockOutlineRenderer(
private var currentOutlineBlockState: BlockState? = null private var currentOutlineBlockState: BlockState? = null
private var outlineMesh: BlockOutlineMesh? = null private var outlineMesh: BlockOutlineMesh? = null
private var collisionMesh: BlockOutlineMesh? = null
private val outlineShader = Shader( private val outlineShader = Shader(
resourceLocation = ResourceLocation(ProtocolDefinition.MINOSOFT_NAMESPACE, "chunk/block/outline"), resourceLocation = ResourceLocation(ProtocolDefinition.MINOSOFT_NAMESPACE, "chunk/block/outline"),
) )
private val outlineColor = ChatColors.RED
private val collisionColor = ChatColors.BLUE
override fun init() { override fun init() {
outlineShader.load(connection.assetsManager) outlineShader.load(connection.assetsManager)
outlineShader.use().setRGBColor("tintColor", ChatColors.RED)
} }
private fun drawLine(start: Vec3, end: Vec3, mesh: BlockOutlineMesh) { private fun drawLine(start: Vec3, end: Vec3, mesh: BlockOutlineMesh) {
@ -59,10 +63,10 @@ class BlockOutlineRenderer(
mesh.addVertex(Vec3(end.x, end.y, end.z) + rotatedLineWidth) mesh.addVertex(Vec3(end.x, end.y, end.z) + rotatedLineWidth)
} }
private fun drawVoxelShape(shape: VoxelShape, blockPosition: Vec3, mesh: BlockOutlineMesh) { private fun drawVoxelShape(shape: VoxelShape, blockPosition: Vec3, mesh: BlockOutlineMesh, margin: Float = 0.0f) {
for (aabb in shape) { for (aabb in shape) {
val min = blockPosition + aabb.min val min = blockPosition + aabb.min - margin
val max = blockPosition + aabb.max val max = blockPosition + aabb.max + margin
fun drawSideQuad(x: Float) { fun drawSideQuad(x: Float) {
drawLine(Vec3(x, min.y, min.z), Vec3(x, max.y, min.z), mesh) drawLine(Vec3(x, min.y, min.z), Vec3(x, max.y, min.z), mesh)
@ -85,17 +89,24 @@ class BlockOutlineRenderer(
} }
} }
private fun draw(mesh: BlockOutlineMesh) { private fun draw(outlineMesh: BlockOutlineMesh, collisionMesh: BlockOutlineMesh?) {
glDisable(GL_CULL_FACE) glDisable(GL_CULL_FACE)
outlineShader.use() outlineShader.use()
mesh.draw() outlineShader.setRGBColor("tintColor", outlineColor)
outlineMesh.draw()
collisionMesh?.let {
outlineShader.setRGBColor("tintColor", collisionColor)
it.draw()
}
glEnable(GL_CULL_FACE) glEnable(GL_CULL_FACE)
} }
private fun unload() { private fun unload() {
outlineMesh ?: return outlineMesh ?: return
outlineMesh?.unload() outlineMesh?.unload()
collisionMesh?.unload()
this.outlineMesh = null this.outlineMesh = null
this.collisionMesh = null
this.currentOutlinePosition = null this.currentOutlinePosition = null
this.currentOutlineBlockState = null this.currentOutlineBlockState = null
} }
@ -104,8 +115,7 @@ class BlockOutlineRenderer(
val raycastHit = renderWindow.inputHandler.camera.getTargetBlock() val raycastHit = renderWindow.inputHandler.camera.getTargetBlock()
var outlineMesh = outlineMesh var outlineMesh = outlineMesh
var collisionMesh = collisionMesh
if (raycastHit == null) { if (raycastHit == null) {
unload() unload()
@ -125,20 +135,33 @@ class BlockOutlineRenderer(
} }
if (raycastHit.blockPosition == currentOutlinePosition && raycastHit.blockState == currentOutlineBlockState) { if (raycastHit.blockPosition == currentOutlinePosition && raycastHit.blockState == currentOutlineBlockState) {
draw(outlineMesh!!) draw(outlineMesh!!, collisionMesh)
return return
} }
outlineMesh?.unload() outlineMesh?.unload()
collisionMesh?.unload()
outlineMesh = BlockOutlineMesh() outlineMesh = BlockOutlineMesh()
drawVoxelShape(raycastHit.blockState.outlineShape, raycastHit.blockPosition.getWorldOffset(raycastHit.blockState.block).plus(raycastHit.blockPosition), outlineMesh) val blockOffset = raycastHit.blockPosition.getWorldOffset(raycastHit.blockState.block).plus(raycastHit.blockPosition)
drawVoxelShape(raycastHit.blockState.outlineShape, blockOffset, outlineMesh)
outlineMesh.load() outlineMesh.load()
if (Minosoft.config.config.game.other.renderBlockOutlineCollisionBox) {
collisionMesh = BlockOutlineMesh()
drawVoxelShape(raycastHit.blockState.collisionShape, blockOffset, collisionMesh, 0.005f)
collisionMesh.load()
this.collisionMesh = collisionMesh
}
this.currentOutlinePosition = raycastHit.blockPosition this.currentOutlinePosition = raycastHit.blockPosition
this.currentOutlineBlockState = raycastHit.blockState this.currentOutlineBlockState = raycastHit.blockState
this.outlineMesh = outlineMesh this.outlineMesh = outlineMesh
draw(outlineMesh) draw(outlineMesh, collisionMesh)
} }