mirror of
https://gitlab.bixilon.de/bixilon/minosoft.git
synced 2025-09-13 09:26:11 -04:00
improve skeletal drawing, replace SkeletalVertexConsumer with SkeletalConsumer
This commit is contained in:
parent
85dc9329f9
commit
2280c5b35f
@ -16,11 +16,11 @@ package de.bixilon.minosoft.gui.rendering.chunk.entities.renderer.storage.chest
|
|||||||
import de.bixilon.kotlinglm.vec3.Vec3
|
import de.bixilon.kotlinglm.vec3.Vec3
|
||||||
import de.bixilon.kutil.primitive.FloatUtil.matches
|
import de.bixilon.kutil.primitive.FloatUtil.matches
|
||||||
import de.bixilon.minosoft.gui.rendering.RenderContext
|
import de.bixilon.minosoft.gui.rendering.RenderContext
|
||||||
import de.bixilon.minosoft.gui.rendering.skeletal.SkeletalMesh
|
|
||||||
import de.bixilon.minosoft.gui.rendering.skeletal.baked.BakedSkeletalModel
|
import de.bixilon.minosoft.gui.rendering.skeletal.baked.BakedSkeletalModel
|
||||||
import de.bixilon.minosoft.gui.rendering.skeletal.baked.BakedSkeletalTransform
|
import de.bixilon.minosoft.gui.rendering.skeletal.baked.BakedSkeletalTransform
|
||||||
import de.bixilon.minosoft.gui.rendering.skeletal.baked.animation.keyframe.instance.KeyframeInstance.Companion.NOT_OVER
|
import de.bixilon.minosoft.gui.rendering.skeletal.baked.animation.keyframe.instance.KeyframeInstance.Companion.NOT_OVER
|
||||||
import de.bixilon.minosoft.gui.rendering.skeletal.baked.animation.keyframe.instance.KeyframeInstance.Companion.OVER
|
import de.bixilon.minosoft.gui.rendering.skeletal.baked.animation.keyframe.instance.KeyframeInstance.Companion.OVER
|
||||||
|
import de.bixilon.minosoft.gui.rendering.skeletal.mesh.SkeletalMesh
|
||||||
import de.bixilon.minosoft.gui.rendering.util.vec.vec3.Vec3Util.EMPTY
|
import de.bixilon.minosoft.gui.rendering.util.vec.vec3.Vec3Util.EMPTY
|
||||||
import de.bixilon.minosoft.test.IT
|
import de.bixilon.minosoft.test.IT
|
||||||
import org.testng.Assert.assertEquals
|
import org.testng.Assert.assertEquals
|
||||||
|
@ -14,17 +14,13 @@
|
|||||||
package de.bixilon.minosoft.gui.rendering.skeletal
|
package de.bixilon.minosoft.gui.rendering.skeletal
|
||||||
|
|
||||||
import de.bixilon.kotlinglm.vec2.Vec2
|
import de.bixilon.kotlinglm.vec2.Vec2
|
||||||
|
import de.bixilon.kotlinglm.vec3.Vec3
|
||||||
|
import de.bixilon.minosoft.gui.rendering.skeletal.mesh.SkeletalConsumer
|
||||||
import de.bixilon.minosoft.gui.rendering.system.base.texture.shader.ShaderTexture
|
import de.bixilon.minosoft.gui.rendering.system.base.texture.shader.ShaderTexture
|
||||||
|
|
||||||
class DummySkeletalConsumer : SkeletalVertexConsumer {
|
class DummySkeletalConsumer : SkeletalConsumer {
|
||||||
override val order: IntArray
|
|
||||||
get() = TODO("Not yet implemented")
|
|
||||||
|
|
||||||
override fun addVertex(position: FloatArray, transformedUV: Vec2, transform: Float, textureShaderId: Float) {
|
override fun addQuad(positions: Array<Vec3>, uv: Array<Vec2>, transform: Int, texture: ShaderTexture) {
|
||||||
TODO("Not yet implemented")
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun addVertex(position: FloatArray, uv: Vec2, transform: Int, texture: ShaderTexture) {
|
|
||||||
TODO("Not yet implemented")
|
TODO("Not yet implemented")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -22,7 +22,7 @@ import org.lwjgl.system.MemoryUtil.memAllocFloat
|
|||||||
class SkeletalManager(
|
class SkeletalManager(
|
||||||
val context: RenderContext,
|
val context: RenderContext,
|
||||||
) {
|
) {
|
||||||
private val uniformBuffer = context.system.createFloatUniformBuffer(memAllocFloat(TRANSFORMS * Mat4.length))
|
private val uniformBuffer = context.system.createFloatUniformBuffer(memAllocFloat(MAX_TRANSFORMS * Mat4.length))
|
||||||
val shader = context.system.createShader(minosoft("skeletal")) { SkeletalShader(it, uniformBuffer) }
|
val shader = context.system.createShader(minosoft("skeletal")) { SkeletalShader(it, uniformBuffer) }
|
||||||
|
|
||||||
fun init() {
|
fun init() {
|
||||||
@ -30,31 +30,24 @@ class SkeletalManager(
|
|||||||
}
|
}
|
||||||
|
|
||||||
fun postInit() {
|
fun postInit() {
|
||||||
shader.native.defines["TRANSFORMS"] = TRANSFORMS
|
shader.native.defines["TRANSFORMS"] = MAX_TRANSFORMS
|
||||||
shader.load()
|
shader.load()
|
||||||
shader.light = 0xFF
|
shader.light = 0xFF
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun prepareDraw() {
|
fun upload(instance: SkeletalInstance) {
|
||||||
if (context.system.shader == shader.native) {
|
instance.transform.pack(uniformBuffer.buffer, instance.position)
|
||||||
// probably already prepared
|
uniformBuffer.upload(0 until instance.model.transformCount * Mat4.length)
|
||||||
return
|
|
||||||
}
|
|
||||||
context.system.reset()
|
|
||||||
shader.use()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fun draw(instance: SkeletalInstance, light: Int) {
|
fun draw(instance: SkeletalInstance, light: Int) {
|
||||||
prepareDraw()
|
|
||||||
shader.light = light
|
shader.light = light
|
||||||
|
|
||||||
instance.transform.pack(uniformBuffer.buffer, instance.position)
|
|
||||||
uniformBuffer.upload(0 until instance.model.transformCount * Mat4.length)
|
|
||||||
|
|
||||||
instance.model.mesh.draw()
|
instance.model.mesh.draw()
|
||||||
}
|
}
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
private const val TRANSFORMS = 128
|
private const val MAX_TRANSFORMS = 128
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -14,8 +14,8 @@
|
|||||||
package de.bixilon.minosoft.gui.rendering.skeletal.baked
|
package de.bixilon.minosoft.gui.rendering.skeletal.baked
|
||||||
|
|
||||||
import de.bixilon.minosoft.gui.rendering.RenderContext
|
import de.bixilon.minosoft.gui.rendering.RenderContext
|
||||||
import de.bixilon.minosoft.gui.rendering.skeletal.SkeletalMesh
|
|
||||||
import de.bixilon.minosoft.gui.rendering.skeletal.instance.SkeletalInstance
|
import de.bixilon.minosoft.gui.rendering.skeletal.instance.SkeletalInstance
|
||||||
|
import de.bixilon.minosoft.gui.rendering.skeletal.mesh.SkeletalMesh
|
||||||
import de.bixilon.minosoft.gui.rendering.skeletal.model.animations.SkeletalAnimation
|
import de.bixilon.minosoft.gui.rendering.skeletal.model.animations.SkeletalAnimation
|
||||||
|
|
||||||
data class BakedSkeletalModel(
|
data class BakedSkeletalModel(
|
||||||
|
@ -17,7 +17,7 @@ import de.bixilon.kotlinglm.vec3.Vec3
|
|||||||
import de.bixilon.kutil.collections.CollectionUtil.extend
|
import de.bixilon.kutil.collections.CollectionUtil.extend
|
||||||
import de.bixilon.minosoft.data.registries.identified.ResourceLocation
|
import de.bixilon.minosoft.data.registries.identified.ResourceLocation
|
||||||
import de.bixilon.minosoft.gui.rendering.models.block.element.ModelElement.Companion.BLOCK_SIZE
|
import de.bixilon.minosoft.gui.rendering.models.block.element.ModelElement.Companion.BLOCK_SIZE
|
||||||
import de.bixilon.minosoft.gui.rendering.skeletal.SkeletalVertexConsumer
|
import de.bixilon.minosoft.gui.rendering.skeletal.mesh.SkeletalConsumer
|
||||||
import de.bixilon.minosoft.gui.rendering.skeletal.model.elements.SkeletalElement
|
import de.bixilon.minosoft.gui.rendering.skeletal.model.elements.SkeletalElement
|
||||||
import de.bixilon.minosoft.gui.rendering.skeletal.model.elements.SkeletalRotation
|
import de.bixilon.minosoft.gui.rendering.skeletal.model.elements.SkeletalRotation
|
||||||
import de.bixilon.minosoft.gui.rendering.skeletal.model.textures.SkeletalTextureInstance
|
import de.bixilon.minosoft.gui.rendering.skeletal.model.textures.SkeletalTextureInstance
|
||||||
@ -31,7 +31,7 @@ data class SkeletalBakeContext(
|
|||||||
val rotations: List<SkeletalRotation> = emptyList(),
|
val rotations: List<SkeletalRotation> = emptyList(),
|
||||||
|
|
||||||
val textures: Map<ResourceLocation, SkeletalTextureInstance>,
|
val textures: Map<ResourceLocation, SkeletalTextureInstance>,
|
||||||
val consumer: SkeletalVertexConsumer,
|
val consumer: SkeletalConsumer,
|
||||||
) {
|
) {
|
||||||
|
|
||||||
fun copy(element: SkeletalElement): SkeletalBakeContext {
|
fun copy(element: SkeletalElement): SkeletalBakeContext {
|
||||||
|
@ -33,18 +33,25 @@ class SkeletalInstance(
|
|||||||
var light = 0xFF
|
var light = 0xFF
|
||||||
|
|
||||||
|
|
||||||
fun draw() {
|
|
||||||
animation.draw()
|
|
||||||
context.skeletal.draw(this, light)
|
|
||||||
}
|
|
||||||
|
|
||||||
fun draw(light: Int) {
|
fun draw(light: Int) {
|
||||||
this.light = light
|
this.light = light
|
||||||
context.skeletal.draw(this, light)
|
draw()
|
||||||
|
}
|
||||||
|
|
||||||
|
fun draw() {
|
||||||
|
animation.draw()
|
||||||
|
|
||||||
|
context.system.reset()
|
||||||
|
val shader = context.skeletal.shader
|
||||||
|
shader.use()
|
||||||
|
shader.light = light
|
||||||
|
draw(shader)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun draw(shader: Shader) {
|
fun draw(shader: Shader) {
|
||||||
TODO()
|
shader.use()
|
||||||
|
context.skeletal.upload(this)
|
||||||
|
model.mesh.draw()
|
||||||
}
|
}
|
||||||
|
|
||||||
fun update(position: Vec3, rotation: Vec3) {
|
fun update(position: Vec3, rotation: Vec3) {
|
||||||
|
@ -11,14 +11,13 @@
|
|||||||
* This software is not affiliated with Mojang AB, the original developer of Minecraft.
|
* This software is not affiliated with Mojang AB, the original developer of Minecraft.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package de.bixilon.minosoft.gui.rendering.skeletal
|
package de.bixilon.minosoft.gui.rendering.skeletal.mesh
|
||||||
|
|
||||||
import de.bixilon.kotlinglm.vec2.Vec2
|
import de.bixilon.kotlinglm.vec2.Vec2
|
||||||
|
import de.bixilon.kotlinglm.vec3.Vec3
|
||||||
import de.bixilon.minosoft.gui.rendering.system.base.texture.shader.ShaderTexture
|
import de.bixilon.minosoft.gui.rendering.system.base.texture.shader.ShaderTexture
|
||||||
import de.bixilon.minosoft.gui.rendering.util.mesh.AbstractVertexConsumer
|
|
||||||
|
|
||||||
interface SkeletalVertexConsumer : AbstractVertexConsumer {
|
interface SkeletalConsumer {
|
||||||
|
|
||||||
fun addVertex(position: FloatArray, uv: Vec2, transform: Int, texture: ShaderTexture)
|
fun addQuad(positions: Array<Vec3>, uv: Array<Vec2>, transform: Int, texture: ShaderTexture)
|
||||||
fun addVertex(position: FloatArray, transformedUV: Vec2, transform: Float, textureShaderId: Float)
|
|
||||||
}
|
}
|
@ -11,7 +11,7 @@
|
|||||||
* This software is not affiliated with Mojang AB, the original developer of Minecraft.
|
* This software is not affiliated with Mojang AB, the original developer of Minecraft.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package de.bixilon.minosoft.gui.rendering.skeletal
|
package de.bixilon.minosoft.gui.rendering.skeletal.mesh
|
||||||
|
|
||||||
import de.bixilon.kotlinglm.vec2.Vec2
|
import de.bixilon.kotlinglm.vec2.Vec2
|
||||||
import de.bixilon.kotlinglm.vec3.Vec3
|
import de.bixilon.kotlinglm.vec3.Vec3
|
||||||
@ -21,22 +21,25 @@ import de.bixilon.minosoft.gui.rendering.system.base.texture.shader.ShaderTextur
|
|||||||
import de.bixilon.minosoft.gui.rendering.util.mesh.Mesh
|
import de.bixilon.minosoft.gui.rendering.util.mesh.Mesh
|
||||||
import de.bixilon.minosoft.gui.rendering.util.mesh.MeshStruct
|
import de.bixilon.minosoft.gui.rendering.util.mesh.MeshStruct
|
||||||
|
|
||||||
class SkeletalMesh(context: RenderContext, initialCacheSize: Int) : Mesh(context, SkeletalMeshStruct, initialCacheSize = initialCacheSize), SkeletalVertexConsumer {
|
class SkeletalMesh(context: RenderContext, initialCacheSize: Int) : Mesh(context, SkeletalMeshStruct, initialCacheSize = initialCacheSize), SkeletalConsumer {
|
||||||
|
|
||||||
override fun addVertex(position: FloatArray, uv: Vec2, transform: Int, texture: ShaderTexture) {
|
private fun addVertex(position: FloatArray, transformedUV: Vec2, transform: Float, textureShaderId: Float) {
|
||||||
val transformedUV = texture.transformUV(uv)
|
|
||||||
data.add(position)
|
|
||||||
data.add(transformedUV.array)
|
|
||||||
data.add(transform.buffer(), texture.shaderId.buffer())
|
|
||||||
}
|
|
||||||
|
|
||||||
@Deprecated("Pretty rendering specific")
|
|
||||||
override fun addVertex(position: FloatArray, transformedUV: Vec2, transform: Float, textureShaderId: Float) {
|
|
||||||
data.add(position)
|
data.add(position)
|
||||||
data.add(transformedUV.array)
|
data.add(transformedUV.array)
|
||||||
data.add(transform, textureShaderId)
|
data.add(transform, textureShaderId)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun addQuad(positions: Array<Vec3>, uv: Array<Vec2>, transform: Int, texture: ShaderTexture) {
|
||||||
|
val transform = transform.buffer()
|
||||||
|
val textureShaderId = texture.shaderId.buffer()
|
||||||
|
|
||||||
|
for (index in 0 until order.size step 2) {
|
||||||
|
val indexPosition = positions[order[index]].array
|
||||||
|
val transformedUV = texture.transformUV(uv[order[index + 1]])
|
||||||
|
addVertex(indexPosition, transformedUV, transform, textureShaderId)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
data class SkeletalMeshStruct(
|
data class SkeletalMeshStruct(
|
||||||
val position: Vec3,
|
val position: Vec3,
|
@ -16,10 +16,10 @@ package de.bixilon.minosoft.gui.rendering.skeletal.model
|
|||||||
import de.bixilon.kotlinglm.vec3.Vec3
|
import de.bixilon.kotlinglm.vec3.Vec3
|
||||||
import de.bixilon.minosoft.data.registries.identified.ResourceLocation
|
import de.bixilon.minosoft.data.registries.identified.ResourceLocation
|
||||||
import de.bixilon.minosoft.gui.rendering.RenderContext
|
import de.bixilon.minosoft.gui.rendering.RenderContext
|
||||||
import de.bixilon.minosoft.gui.rendering.skeletal.SkeletalMesh
|
|
||||||
import de.bixilon.minosoft.gui.rendering.skeletal.SkeletalVertexConsumer
|
|
||||||
import de.bixilon.minosoft.gui.rendering.skeletal.baked.BakedSkeletalModel
|
import de.bixilon.minosoft.gui.rendering.skeletal.baked.BakedSkeletalModel
|
||||||
import de.bixilon.minosoft.gui.rendering.skeletal.baked.BakedSkeletalTransform
|
import de.bixilon.minosoft.gui.rendering.skeletal.baked.BakedSkeletalTransform
|
||||||
|
import de.bixilon.minosoft.gui.rendering.skeletal.mesh.SkeletalConsumer
|
||||||
|
import de.bixilon.minosoft.gui.rendering.skeletal.mesh.SkeletalMesh
|
||||||
import de.bixilon.minosoft.gui.rendering.skeletal.model.animations.SkeletalAnimation
|
import de.bixilon.minosoft.gui.rendering.skeletal.model.animations.SkeletalAnimation
|
||||||
import de.bixilon.minosoft.gui.rendering.skeletal.model.elements.SkeletalElement
|
import de.bixilon.minosoft.gui.rendering.skeletal.model.elements.SkeletalElement
|
||||||
import de.bixilon.minosoft.gui.rendering.skeletal.model.textures.SkeletalTexture
|
import de.bixilon.minosoft.gui.rendering.skeletal.model.textures.SkeletalTexture
|
||||||
@ -76,7 +76,7 @@ data class SkeletalModel(
|
|||||||
return Pair(baseTransform, transformId.get())
|
return Pair(baseTransform, transformId.get())
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun buildElements(consumer: SkeletalVertexConsumer, textures: Map<ResourceLocation, SkeletalTextureInstance>, transform: BakedSkeletalTransform) {
|
private fun buildElements(consumer: SkeletalConsumer, textures: Map<ResourceLocation, SkeletalTextureInstance>, transform: BakedSkeletalTransform) {
|
||||||
for ((name, element) in elements) {
|
for ((name, element) in elements) {
|
||||||
element.bake(consumer, textures, transform)
|
element.bake(consumer, textures, transform)
|
||||||
}
|
}
|
||||||
|
@ -16,9 +16,9 @@ package de.bixilon.minosoft.gui.rendering.skeletal.model.elements
|
|||||||
import de.bixilon.kotlinglm.vec3.Vec3
|
import de.bixilon.kotlinglm.vec3.Vec3
|
||||||
import de.bixilon.minosoft.data.direction.Directions
|
import de.bixilon.minosoft.data.direction.Directions
|
||||||
import de.bixilon.minosoft.data.registries.identified.ResourceLocation
|
import de.bixilon.minosoft.data.registries.identified.ResourceLocation
|
||||||
import de.bixilon.minosoft.gui.rendering.skeletal.SkeletalVertexConsumer
|
|
||||||
import de.bixilon.minosoft.gui.rendering.skeletal.baked.BakedSkeletalTransform
|
import de.bixilon.minosoft.gui.rendering.skeletal.baked.BakedSkeletalTransform
|
||||||
import de.bixilon.minosoft.gui.rendering.skeletal.baked.SkeletalBakeContext
|
import de.bixilon.minosoft.gui.rendering.skeletal.baked.SkeletalBakeContext
|
||||||
|
import de.bixilon.minosoft.gui.rendering.skeletal.mesh.SkeletalConsumer
|
||||||
import de.bixilon.minosoft.gui.rendering.skeletal.model.textures.SkeletalTextureInstance
|
import de.bixilon.minosoft.gui.rendering.skeletal.model.textures.SkeletalTextureInstance
|
||||||
import de.bixilon.minosoft.gui.rendering.util.vec.vec3.Vec3Util.EMPTY
|
import de.bixilon.minosoft.gui.rendering.util.vec.vec3.Vec3Util.EMPTY
|
||||||
|
|
||||||
@ -35,7 +35,7 @@ data class SkeletalElement(
|
|||||||
val children: Map<String, SkeletalElement> = emptyMap(),
|
val children: Map<String, SkeletalElement> = emptyMap(),
|
||||||
) {
|
) {
|
||||||
|
|
||||||
fun bake(consumer: SkeletalVertexConsumer, textures: Map<ResourceLocation, SkeletalTextureInstance>, transform: BakedSkeletalTransform) {
|
fun bake(consumer: SkeletalConsumer, textures: Map<ResourceLocation, SkeletalTextureInstance>, transform: BakedSkeletalTransform) {
|
||||||
if (!enabled) return
|
if (!enabled) return
|
||||||
|
|
||||||
val context = SkeletalBakeContext(transform = transform, textures = textures, consumer = consumer)
|
val context = SkeletalBakeContext(transform = transform, textures = textures, consumer = consumer)
|
||||||
|
@ -22,7 +22,6 @@ import de.bixilon.minosoft.gui.rendering.models.block.element.ModelElement.Compa
|
|||||||
import de.bixilon.minosoft.gui.rendering.models.block.element.face.FaceUV
|
import de.bixilon.minosoft.gui.rendering.models.block.element.face.FaceUV
|
||||||
import de.bixilon.minosoft.gui.rendering.models.block.legacy.ModelBakeUtil
|
import de.bixilon.minosoft.gui.rendering.models.block.legacy.ModelBakeUtil
|
||||||
import de.bixilon.minosoft.gui.rendering.skeletal.baked.SkeletalBakeContext
|
import de.bixilon.minosoft.gui.rendering.skeletal.baked.SkeletalBakeContext
|
||||||
import de.bixilon.minosoft.gui.rendering.system.base.MeshUtil.buffer
|
|
||||||
import de.bixilon.minosoft.gui.rendering.util.vec.vec3.Vec3Util.rotateAssign
|
import de.bixilon.minosoft.gui.rendering.util.vec.vec3.Vec3Util.rotateAssign
|
||||||
|
|
||||||
data class SkeletalFace(
|
data class SkeletalFace(
|
||||||
@ -51,14 +50,6 @@ data class SkeletalFace(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
context.consumer.addQuad(positions, texturePositions, transform, texture.texture)
|
||||||
val transform = transform.buffer()
|
|
||||||
val textureShaderId = texture.texture.shaderId.buffer()
|
|
||||||
|
|
||||||
for (index in 0 until context.consumer.order.size step 2) {
|
|
||||||
val indexPosition = positions[context.consumer.order[index]].array
|
|
||||||
val transformedUV = texture.texture.transformUV(texturePositions[context.consumer.order[index + 1]])
|
|
||||||
context.consumer.addVertex(indexPosition, transformedUV, transform, textureShaderId)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user