unify skeletal uv with block model uv

This commit is contained in:
Moritz Zwerger 2023-10-21 18:45:35 +02:00
parent 87b113fce9
commit c9188da5c6
No known key found for this signature in database
GPG Key ID: 5CAD791931B09AC4
6 changed files with 25 additions and 15 deletions

View File

@ -16,3 +16,13 @@ Entity rendering is a quite hard topic.
- BakedSkeletalModel (baked mesh)
- SkeletalInstance (renders baked mesh, contains transform values)
- Wrapper (indirectly accesses skeletal instance transforms)
## Model designing
### Block entities
Block entity models (e.g. chests) are always `facing`=`north` by default.
### Entities
Entities are always designed without any rotation (i.e. `yaw`=`0`)

View File

@ -13,14 +13,13 @@
package de.bixilon.minosoft.gui.rendering.skeletal
import de.bixilon.kotlinglm.vec2.Vec2
import de.bixilon.minosoft.gui.rendering.models.block.element.FaceVertexData
import de.bixilon.minosoft.gui.rendering.skeletal.mesh.SkeletalConsumer
import de.bixilon.minosoft.gui.rendering.system.base.texture.shader.ShaderTexture
class DummySkeletalConsumer : SkeletalConsumer {
override fun addQuad(positions: FaceVertexData, uv: Array<Vec2>, transform: Int, texture: ShaderTexture) {
override fun addQuad(positions: FaceVertexData, uv: FaceVertexData, transform: Int, texture: ShaderTexture) {
TODO("Not yet implemented")
}
}

View File

@ -13,11 +13,10 @@
package de.bixilon.minosoft.gui.rendering.skeletal.mesh
import de.bixilon.kotlinglm.vec2.Vec2
import de.bixilon.minosoft.gui.rendering.models.block.element.FaceVertexData
import de.bixilon.minosoft.gui.rendering.system.base.texture.shader.ShaderTexture
interface SkeletalConsumer {
fun addQuad(positions: FaceVertexData, uv: Array<Vec2>, transform: Int, texture: ShaderTexture)
fun addQuad(positions: FaceVertexData, uv: FaceVertexData, transform: Int, texture: ShaderTexture)
}

View File

@ -25,21 +25,20 @@ import de.bixilon.minosoft.gui.rendering.util.mesh.MeshStruct
class SkeletalMesh(context: RenderContext, initialCacheSize: Int) : Mesh(context, SkeletalMeshStruct, initialCacheSize = initialCacheSize), SkeletalConsumer {
override val order = context.system.quadOrder
private fun addVertex(position: FloatArray, offset: Int, transformedUV: Vec2, transform: Float, textureShaderId: Float) {
private fun addVertex(position: FaceVertexData, positionOffset: Int, uv: FaceVertexData, uvOffset: Int, transform: Float, textureShaderId: Float) {
data.add(
position[offset + 0], position[offset + 1], position[offset + 2],
position[positionOffset + 0], position[positionOffset + 1], position[positionOffset + 2],
uv[uvOffset + 0], uv[uvOffset + 1],
transform, textureShaderId
)
data.add(transformedUV.array)
data.add(transform, textureShaderId)
}
override fun addQuad(positions: FaceVertexData, uv: Array<Vec2>, transform: Int, texture: ShaderTexture) {
override fun addQuad(positions: FaceVertexData, uv: FaceVertexData, transform: Int, texture: ShaderTexture) {
val transform = transform.buffer()
val textureShaderId = texture.shaderId.buffer()
order.iterate { position, uvIndex ->
val transformedUV = texture.transformUV(uv[uvIndex])
addVertex(positions, position * Vec3.length, transformedUV, transform, textureShaderId)
addVertex(positions, position * Vec3.length, uv, uvIndex * Vec2.length, transform, textureShaderId)
}
}

View File

@ -46,7 +46,10 @@ data class SkeletalFace(
val texture = context.textures[texture ?: context.texture ?: throw IllegalStateException("Element has no texture set!")] ?: throw IllegalStateException("Texture not found!")
val texturePositions = getTexturePositions(uv.start / texture.properties.resolution, uv.end / texture.properties.resolution)
val uv = FaceUV(
texture.texture.transformUV(uv.start / texture.properties.resolution),
texture.texture.transformUV(uv.end / texture.properties.resolution),
).toArray(direction, 0)
for (rotation in context.rotations) {
@ -62,6 +65,6 @@ data class SkeletalFace(
}
}
context.consumer.addQuad(positions, texturePositions, transform, texture.texture)
context.consumer.addQuad(positions, uv, transform, texture.texture)
}
}

View File

@ -1,6 +1,6 @@
/*
* Minosoft
* Copyright (C) 2021 Moritz Zwerger
* Copyright (C) 2020-2023 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.
*
@ -16,7 +16,7 @@ package de.bixilon.minosoft.gui.rendering.system.base.buffer.vertex
enum class PrimitiveTypes(val vertices: Int) {
POINT(1),
LINE(2),
TRIANGLE(4),
TRIANGLE(3),
@Deprecated("Removed in OpenGL 3.1+")
QUAD(4),