mirror of
https://gitlab.bixilon.de/bixilon/minosoft.git
synced 2025-09-19 12:25:12 -04:00
render block collision outline box
This commit is contained in:
parent
4311eaabaa
commit
8a78d75fa6
@ -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,
|
||||||
)
|
)
|
||||||
|
@ -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)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user