mirror of
https://gitlab.bixilon.de/bixilon/minosoft.git
synced 2025-09-14 18:05:51 -04:00
Mat4::translateYAssign, improve text billboard code
This commit is contained in:
parent
00ab71e73b
commit
89960ff1f4
@ -15,7 +15,6 @@ package de.bixilon.minosoft.gui.rendering.entities.feature.text
|
|||||||
|
|
||||||
import de.bixilon.kotlinglm.mat4x4.Mat4
|
import de.bixilon.kotlinglm.mat4x4.Mat4
|
||||||
import de.bixilon.kotlinglm.vec2.Vec2
|
import de.bixilon.kotlinglm.vec2.Vec2
|
||||||
import de.bixilon.kotlinglm.vec3.Vec3
|
|
||||||
import de.bixilon.minosoft.data.text.ChatComponent
|
import de.bixilon.minosoft.data.text.ChatComponent
|
||||||
import de.bixilon.minosoft.gui.rendering.entities.feature.EntityRenderFeature
|
import de.bixilon.minosoft.gui.rendering.entities.feature.EntityRenderFeature
|
||||||
import de.bixilon.minosoft.gui.rendering.entities.renderer.EntityRenderer
|
import de.bixilon.minosoft.gui.rendering.entities.renderer.EntityRenderer
|
||||||
@ -23,6 +22,7 @@ import de.bixilon.minosoft.gui.rendering.font.renderer.component.ChatComponentRe
|
|||||||
import de.bixilon.minosoft.gui.rendering.font.renderer.element.TextRenderInfo
|
import de.bixilon.minosoft.gui.rendering.font.renderer.element.TextRenderInfo
|
||||||
import de.bixilon.minosoft.gui.rendering.font.renderer.element.TextRenderProperties
|
import de.bixilon.minosoft.gui.rendering.font.renderer.element.TextRenderProperties
|
||||||
import de.bixilon.minosoft.gui.rendering.system.base.DepthFunctions
|
import de.bixilon.minosoft.gui.rendering.system.base.DepthFunctions
|
||||||
|
import de.bixilon.minosoft.gui.rendering.util.mat.mat4.Mat4Util.translateYAssign
|
||||||
import de.bixilon.minosoft.gui.rendering.util.mesh.Mesh
|
import de.bixilon.minosoft.gui.rendering.util.mesh.Mesh
|
||||||
|
|
||||||
open class BillboardTextFeature(
|
open class BillboardTextFeature(
|
||||||
@ -31,6 +31,7 @@ open class BillboardTextFeature(
|
|||||||
) : EntityRenderFeature(renderer) {
|
) : EntityRenderFeature(renderer) {
|
||||||
private var mesh: BillboardTextMesh? = null
|
private var mesh: BillboardTextMesh? = null
|
||||||
private var info: TextRenderInfo? = null
|
private var info: TextRenderInfo? = null
|
||||||
|
private var matrix = Mat4()
|
||||||
var text: ChatComponent? = text
|
var text: ChatComponent? = text
|
||||||
set(value) {
|
set(value) {
|
||||||
if (field == value) return
|
if (field == value) return
|
||||||
@ -40,11 +41,12 @@ open class BillboardTextFeature(
|
|||||||
|
|
||||||
override fun update(millis: Long, delta: Float) {
|
override fun update(millis: Long, delta: Float) {
|
||||||
if (!enabled) return unload()
|
if (!enabled) return unload()
|
||||||
if (this.mesh != null) return // matrix, ...?
|
if (this.mesh == null) {
|
||||||
val text = this.text ?: return unload()
|
val text = this.text ?: return unload()
|
||||||
if (text.length == 0) return unload()
|
if (text.length == 0) return unload()
|
||||||
|
createMesh(text)
|
||||||
createMesh(text)
|
}
|
||||||
|
updateMatrix()
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun createMesh(text: ChatComponent) {
|
private fun createMesh(text: ChatComponent) {
|
||||||
@ -56,14 +58,21 @@ open class BillboardTextFeature(
|
|||||||
this.info = info
|
this.info = info
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun updateMatrix() {
|
||||||
|
val matrix = Mat4()
|
||||||
|
.translateYAssign(renderer.entity.eyeHeight + EYE_OFFSET)
|
||||||
|
|
||||||
|
// TODO: rotate with camera (billboard)
|
||||||
|
|
||||||
|
this.matrix = renderer.matrix * matrix
|
||||||
|
}
|
||||||
|
|
||||||
override fun draw() {
|
override fun draw() {
|
||||||
val mesh = this.mesh ?: return
|
val mesh = this.mesh ?: return
|
||||||
if (mesh.state != Mesh.MeshStates.LOADED) mesh.load()
|
if (mesh.state != Mesh.MeshStates.LOADED) mesh.load()
|
||||||
renderer.renderer.context.system.reset(depth = DepthFunctions.ALWAYS)
|
renderer.renderer.context.system.reset(depth = DepthFunctions.ALWAYS)
|
||||||
val shader = renderer.renderer.features.text.shader
|
val shader = renderer.renderer.features.text.shader
|
||||||
shader.use()
|
shader.use()
|
||||||
val matrix = Mat4()
|
|
||||||
.translateAssign(Vec3(renderer.entity.renderInfo.position + renderer.renderer.context.camera.offset.offset) + Vec3(0, 2, 0))
|
|
||||||
shader.matrix = matrix
|
shader.matrix = matrix
|
||||||
mesh.draw()
|
mesh.draw()
|
||||||
}
|
}
|
||||||
@ -82,5 +91,6 @@ open class BillboardTextFeature(
|
|||||||
private companion object {
|
private companion object {
|
||||||
val PROPERTIES = TextRenderProperties(allowNewLine = false)
|
val PROPERTIES = TextRenderProperties(allowNewLine = false)
|
||||||
val MAX_SIZE = Vec2(150.0f, PROPERTIES.lineHeight)
|
val MAX_SIZE = Vec2(150.0f, PROPERTIES.lineHeight)
|
||||||
|
const val EYE_OFFSET = 0.5f
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -29,6 +29,7 @@ import de.bixilon.minosoft.gui.rendering.entities.feature.hitbox.HitboxFeature
|
|||||||
import de.bixilon.minosoft.gui.rendering.entities.feature.text.EntityNameFeature
|
import de.bixilon.minosoft.gui.rendering.entities.feature.text.EntityNameFeature
|
||||||
import de.bixilon.minosoft.gui.rendering.util.mat.mat4.Mat4Util.reset
|
import de.bixilon.minosoft.gui.rendering.util.mat.mat4.Mat4Util.reset
|
||||||
import de.bixilon.minosoft.gui.rendering.util.mat.mat4.Mat4Util.rotateRadAssign
|
import de.bixilon.minosoft.gui.rendering.util.mat.mat4.Mat4Util.rotateRadAssign
|
||||||
|
import de.bixilon.minosoft.gui.rendering.util.mat.mat4.Mat4Util.translateYAssign
|
||||||
import de.bixilon.minosoft.util.interpolate.Interpolator
|
import de.bixilon.minosoft.util.interpolate.Interpolator
|
||||||
|
|
||||||
abstract class EntityRenderer<E : Entity>(
|
abstract class EntityRenderer<E : Entity>(
|
||||||
@ -53,13 +54,14 @@ abstract class EntityRenderer<E : Entity>(
|
|||||||
}
|
}
|
||||||
|
|
||||||
open fun updateMatrix(delta: Float) {
|
open fun updateMatrix(delta: Float) {
|
||||||
|
// TODO: update on demand
|
||||||
val position = Vec3(entity.renderInfo.position - renderer.context.camera.offset.offset)
|
val position = Vec3(entity.renderInfo.position - renderer.context.camera.offset.offset)
|
||||||
matrix.reset()
|
matrix.reset()
|
||||||
matrix.translateAssign(position)
|
matrix.translateAssign(position)
|
||||||
|
|
||||||
if (entity.isFlipped()) {
|
if (entity.isFlipped()) {
|
||||||
matrix
|
matrix
|
||||||
.translateAssign(Vec3(0.0f, entity.dimensions.y + 0.2f, 0.0f))
|
.translateYAssign(entity.dimensions.y + 0.2f)
|
||||||
.rotateRadAssign(FLIP_ROTATION)
|
.rotateRadAssign(FLIP_ROTATION)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -13,7 +13,6 @@
|
|||||||
|
|
||||||
package de.bixilon.minosoft.gui.rendering.entities.renderer.living.player
|
package de.bixilon.minosoft.gui.rendering.entities.renderer.living.player
|
||||||
|
|
||||||
import de.bixilon.kotlinglm.vec3.Vec3
|
|
||||||
import de.bixilon.kutil.observer.DataObserver.Companion.observe
|
import de.bixilon.kutil.observer.DataObserver.Companion.observe
|
||||||
import de.bixilon.minosoft.data.entities.Poses
|
import de.bixilon.minosoft.data.entities.Poses
|
||||||
import de.bixilon.minosoft.data.entities.entities.player.PlayerEntity
|
import de.bixilon.minosoft.data.entities.entities.player.PlayerEntity
|
||||||
@ -32,6 +31,7 @@ import de.bixilon.minosoft.gui.rendering.skeletal.mesh.SkeletalMeshBuilder
|
|||||||
import de.bixilon.minosoft.gui.rendering.system.base.texture.dynamic.DynamicTexture
|
import de.bixilon.minosoft.gui.rendering.system.base.texture.dynamic.DynamicTexture
|
||||||
import de.bixilon.minosoft.gui.rendering.system.base.texture.dynamic.DynamicTextureListener
|
import de.bixilon.minosoft.gui.rendering.system.base.texture.dynamic.DynamicTextureListener
|
||||||
import de.bixilon.minosoft.gui.rendering.system.base.texture.dynamic.DynamicTextureState
|
import de.bixilon.minosoft.gui.rendering.system.base.texture.dynamic.DynamicTextureState
|
||||||
|
import de.bixilon.minosoft.gui.rendering.util.mat.mat4.Mat4Util.translateYAssign
|
||||||
|
|
||||||
open class PlayerRenderer<E : PlayerEntity>(renderer: EntitiesRenderer, entity: E) : LivingEntityRenderer<E>(renderer, entity), DynamicTextureListener {
|
open class PlayerRenderer<E : PlayerEntity>(renderer: EntitiesRenderer, entity: E) : LivingEntityRenderer<E>(renderer, entity), DynamicTextureListener {
|
||||||
protected var model: PlayerModel? = null
|
protected var model: PlayerModel? = null
|
||||||
@ -116,7 +116,7 @@ open class PlayerRenderer<E : PlayerEntity>(renderer: EntitiesRenderer, entity:
|
|||||||
override fun updateMatrix(delta: Float) {
|
override fun updateMatrix(delta: Float) {
|
||||||
super.updateMatrix(delta)
|
super.updateMatrix(delta)
|
||||||
when (entity.pose) {
|
when (entity.pose) {
|
||||||
Poses.SNEAKING -> matrix.translateAssign(SNEAKING_OFFSET) // TODO: interpolate
|
Poses.SNEAKING -> matrix.translateYAssign(SNEAKING_OFFSET) // TODO: interpolate
|
||||||
else -> Unit
|
else -> Unit
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -129,7 +129,7 @@ open class PlayerRenderer<E : PlayerEntity>(renderer: EntitiesRenderer, entity:
|
|||||||
|
|
||||||
private val SKIN = minecraft("skin")
|
private val SKIN = minecraft("skin")
|
||||||
|
|
||||||
private val SNEAKING_OFFSET = Vec3(0.0f, -0.125f, 0.0f)
|
private const val SNEAKING_OFFSET = -0.125f
|
||||||
|
|
||||||
override fun create(renderer: EntitiesRenderer, entity: PlayerEntity) = PlayerRenderer(renderer, entity)
|
override fun create(renderer: EntitiesRenderer, entity: PlayerEntity) = PlayerRenderer(renderer, entity)
|
||||||
override fun buildMesh(context: RenderContext) = PlayerModelMesh(context)
|
override fun buildMesh(context: RenderContext) = PlayerModelMesh(context)
|
||||||
|
@ -17,6 +17,7 @@ import de.bixilon.kotlinglm.vec3.Vec3
|
|||||||
import kotlin.math.abs
|
import kotlin.math.abs
|
||||||
|
|
||||||
object SkeletalMeshUtil {
|
object SkeletalMeshUtil {
|
||||||
|
private const val ADD = +0.001f
|
||||||
|
|
||||||
private fun encodeY(part: Float): Int {
|
private fun encodeY(part: Float): Int {
|
||||||
if (part <= -1.0f) return 0
|
if (part <= -1.0f) return 0
|
||||||
@ -26,9 +27,9 @@ object SkeletalMeshUtil {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fun encodeNormal(normal: Vec3): Int {
|
fun encodeNormal(normal: Vec3): Int {
|
||||||
val x = (abs(normal.x) * 15.0f).toInt()
|
val x = (abs(normal.x + ADD) * 15.0f).toInt() and 0x0F
|
||||||
val y = encodeY(normal.y + 0.001f) and 0x0F
|
val y = encodeY(normal.y + ADD) and 0x0F
|
||||||
val z = (abs(normal.z) * 15.0f).toInt()
|
val z = (abs(normal.z + ADD) * 15.0f).toInt() and 0x0F
|
||||||
|
|
||||||
return (y shl 8) or (z shl 4) or (x)
|
return (y shl 8) or (z shl 4) or (x)
|
||||||
}
|
}
|
||||||
|
@ -26,6 +26,7 @@ import de.bixilon.minosoft.gui.rendering.sky.SkyRenderer
|
|||||||
import de.bixilon.minosoft.gui.rendering.system.base.BlendingFunctions
|
import de.bixilon.minosoft.gui.rendering.system.base.BlendingFunctions
|
||||||
import de.bixilon.minosoft.gui.rendering.system.base.RenderingCapabilities
|
import de.bixilon.minosoft.gui.rendering.system.base.RenderingCapabilities
|
||||||
import de.bixilon.minosoft.gui.rendering.system.base.texture.texture.Texture
|
import de.bixilon.minosoft.gui.rendering.system.base.texture.texture.Texture
|
||||||
|
import de.bixilon.minosoft.gui.rendering.util.mat.mat4.Mat4Util.translateYAssign
|
||||||
import de.bixilon.minosoft.gui.rendering.util.vec.vec3.Vec3Util.Z
|
import de.bixilon.minosoft.gui.rendering.util.vec.vec3.Vec3Util.Z
|
||||||
|
|
||||||
abstract class PlanetRenderer(
|
abstract class PlanetRenderer(
|
||||||
@ -80,7 +81,7 @@ abstract class PlanetRenderer(
|
|||||||
|
|
||||||
matrix.rotateAssign(calculateAngle().rad, Vec3.Z)
|
matrix.rotateAssign(calculateAngle().rad, Vec3.Z)
|
||||||
|
|
||||||
matrix.translateAssign(Vec3(0.0f, -modifier, 0.0f)) // moves the planet closer to the player (appears bigger)
|
matrix.translateYAssign(-modifier) // moves the planet closer to the player (appears bigger)
|
||||||
|
|
||||||
|
|
||||||
this.matrix = matrix
|
this.matrix = matrix
|
||||||
|
@ -54,7 +54,7 @@ object Mat4Util {
|
|||||||
System.arraycopy(empty.array, 0, array, 0, Mat4.length)
|
System.arraycopy(empty.array, 0, array, 0, Mat4.length)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun Mat4.rotateXAssign(rad:Float): Mat4 {
|
fun Mat4.rotateXAssign(rad: Float): Mat4 {
|
||||||
rotateX(this, rad)
|
rotateX(this, rad)
|
||||||
|
|
||||||
return this
|
return this
|
||||||
@ -150,4 +150,12 @@ object Mat4Util {
|
|||||||
m[0, 2] = res0z
|
m[0, 2] = res0z
|
||||||
m[0, 3] = res0w
|
m[0, 3] = res0w
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun Mat4.translateYAssign(vY: Float): Mat4 {
|
||||||
|
this[3, 0] += this[1, 0] * vY
|
||||||
|
this[3, 1] += this[1, 1] * vY
|
||||||
|
this[3, 2] += this[1, 2] * vY
|
||||||
|
this[3, 3] += this[1, 3] * vY
|
||||||
|
return this
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -45,8 +45,7 @@ void main() {
|
|||||||
}
|
}
|
||||||
finAllowTransparency = skinPart;
|
finAllowTransparency = skinPart;
|
||||||
run_skeletal(partTransformNormal, vinPosition);
|
run_skeletal(partTransformNormal, vinPosition);
|
||||||
vec4 light = getRGBColor(uTintColor & 0xFFFFFFu);
|
finTintColor *= getRGBColor(uTintColor & 0xFFFFFFu);
|
||||||
finTintColor *= light;
|
|
||||||
|
|
||||||
finTextureIndex = uIndexLayer >> 28u;
|
finTextureIndex = uIndexLayer >> 28u;
|
||||||
finTextureCoordinates = vec3(vinUV, ((uIndexLayer >> 12) & 0xFFFFu));
|
finTextureCoordinates = vec3(vinUV, ((uIndexLayer >> 12) & 0xFFFFu));
|
||||||
|
@ -16,6 +16,7 @@ package de.bixilon.minosoft.gui.rendering.util.mat.mat4
|
|||||||
import de.bixilon.kotlinglm.func.rad
|
import de.bixilon.kotlinglm.func.rad
|
||||||
import de.bixilon.kotlinglm.mat4x4.Mat4
|
import de.bixilon.kotlinglm.mat4x4.Mat4
|
||||||
import de.bixilon.kotlinglm.vec3.Vec3
|
import de.bixilon.kotlinglm.vec3.Vec3
|
||||||
|
import de.bixilon.minosoft.gui.rendering.util.mat.mat4.Mat4Util.translateYAssign
|
||||||
import org.junit.jupiter.api.Assertions.assertEquals
|
import org.junit.jupiter.api.Assertions.assertEquals
|
||||||
import org.junit.jupiter.api.Test
|
import org.junit.jupiter.api.Test
|
||||||
|
|
||||||
@ -44,4 +45,12 @@ class Mat4UtilTest {
|
|||||||
|
|
||||||
assertEquals(expected, actual)
|
assertEquals(expected, actual)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `custom translateYAssign`() {
|
||||||
|
val expected = Mat4().translateAssign(Vec3(0, 123.0f, 0))
|
||||||
|
val actual = Mat4().translateYAssign(123.0f)
|
||||||
|
|
||||||
|
assertEquals(expected, actual)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user