skeletal fixes

This commit is contained in:
Moritz Zwerger 2023-10-16 21:04:34 +02:00
parent 29abea74bb
commit 6a55f94424
No known key found for this signature in database
GPG Key ID: 5CAD791931B09AC4
8 changed files with 39 additions and 16 deletions

View File

@ -26,7 +26,6 @@ import de.bixilon.minosoft.gui.rendering.models.loader.ModelLoader
import de.bixilon.minosoft.gui.rendering.models.loader.SkeletalLoader.Companion.bbModel
import de.bixilon.minosoft.gui.rendering.skeletal.baked.BakedSkeletalModel
import de.bixilon.minosoft.gui.rendering.textures.TextureUtil.texture
import de.bixilon.minosoft.gui.rendering.util.VecUtil.toVec3
class DoubleChestRenderer(
val entity: StorageBlockEntity,
@ -37,10 +36,14 @@ class DoubleChestRenderer(
light: Int,
) : StorageBlockEntityRenderer<StorageBlockEntity>(
blockState,
model.createInstance(context, (blockPosition - context.camera.offset.offset).toVec3, (blockState.getFacing()).rotation),
model.createInstance(context),
light,
) {
init {
skeletal?.update(blockPosition, blockState.getFacing())
}
companion object {
val DOUBLE_MODEL = minecraft("block/entities/double_chest").bbModel()
private val named = arrayOf(minecraft("left"), minecraft("right"))

View File

@ -26,7 +26,6 @@ import de.bixilon.minosoft.gui.rendering.models.loader.ModelLoader
import de.bixilon.minosoft.gui.rendering.models.loader.SkeletalLoader.Companion.sModel
import de.bixilon.minosoft.gui.rendering.skeletal.baked.BakedSkeletalModel
import de.bixilon.minosoft.gui.rendering.textures.TextureUtil.texture
import de.bixilon.minosoft.gui.rendering.util.VecUtil.toVec3
class SingleChestRenderer(
val entity: StorageBlockEntity,
@ -37,9 +36,12 @@ class SingleChestRenderer(
light: Int,
) : StorageBlockEntityRenderer<StorageBlockEntity>(
blockState,
model.createInstance(context, (blockPosition - context.camera.offset.offset).toVec3, blockState.getFacing().rotation),
model.createInstance(context),
light,
) {
init {
skeletal?.update(blockPosition, blockState.getFacing())
}
companion object {
val SINGLE_MODEL = minecraft("block/entities/single_chest").sModel()

View File

@ -13,8 +13,10 @@
package de.bixilon.minosoft.gui.rendering.chunk.entities.renderer.storage
import de.bixilon.minosoft.data.direction.Directions
import de.bixilon.minosoft.data.entities.block.container.storage.StorageBlockEntity
import de.bixilon.minosoft.data.registries.blocks.state.BlockState
import de.bixilon.minosoft.data.world.positions.BlockPosition
import de.bixilon.minosoft.gui.rendering.RenderContext
import de.bixilon.minosoft.gui.rendering.chunk.entities.BlockEntityRenderer
import de.bixilon.minosoft.gui.rendering.skeletal.instance.SkeletalInstance

View File

@ -13,7 +13,6 @@
package de.bixilon.minosoft.gui.rendering.skeletal.baked
import de.bixilon.kotlinglm.vec3.Vec3
import de.bixilon.minosoft.gui.rendering.RenderContext
import de.bixilon.minosoft.gui.rendering.skeletal.SkeletalMesh
import de.bixilon.minosoft.gui.rendering.skeletal.instance.SkeletalInstance
@ -40,12 +39,9 @@ data class BakedSkeletalModel(
}
fun createInstance(context: RenderContext, position: Vec3, rotation: Vec3): SkeletalInstance {
fun createInstance(context: RenderContext): SkeletalInstance {
val transforms = this.transform.instance()
val instance = SkeletalInstance(context, this, transforms)
instance.update(position, rotation)
return instance
return SkeletalInstance(context, this, transforms)
}
}

View File

@ -16,6 +16,7 @@ package de.bixilon.minosoft.gui.rendering.skeletal.baked
import de.bixilon.kotlinglm.vec3.Vec3
import de.bixilon.kutil.collections.CollectionUtil.extend
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.skeletal.SkeletalVertexConsumer
import de.bixilon.minosoft.gui.rendering.skeletal.model.elements.SkeletalElement
import de.bixilon.minosoft.gui.rendering.skeletal.model.elements.SkeletalRotation
@ -35,7 +36,7 @@ data class SkeletalBakeContext(
) {
fun copy(element: SkeletalElement): SkeletalBakeContext {
val offset = this.offset + (element.offset / 16.0f)
val offset = this.offset + (element.offset / BLOCK_SIZE)
val inflate = this.inflate + element.inflate
val transparency = this.transparency && element.transparency
val texture = element.texture ?: texture

View File

@ -15,6 +15,9 @@ package de.bixilon.minosoft.gui.rendering.skeletal.instance
import de.bixilon.kotlinglm.mat4x4.Mat4
import de.bixilon.kotlinglm.vec3.Vec3
import de.bixilon.kotlinglm.vec3.Vec3d
import de.bixilon.kotlinglm.vec3.Vec3i
import de.bixilon.minosoft.data.direction.Directions
import de.bixilon.minosoft.gui.rendering.RenderContext
import de.bixilon.minosoft.gui.rendering.shader.Shader
import de.bixilon.minosoft.gui.rendering.skeletal.baked.BakedSkeletalModel
@ -42,9 +45,19 @@ class SkeletalInstance(
fun update(position: Vec3, rotation: Vec3) {
val matrix = Mat4()
.translateAssign(Vec3(position - context.camera.offset.offset))
.translateAssign(position)
.rotateRadAssign(rotation)
transform.value = matrix
}
fun update(position: Vec3d, rotation: Vec3) {
update(Vec3(position - context.camera.offset.offset), rotation)
}
fun update(position: Vec3i, direction: Directions) {
val position = Vec3(position - context.camera.offset.offset)
position.x -= 0.5f; position.z -= 0.5f
update(position, direction.rotation)
}
}

View File

@ -25,12 +25,17 @@ class TransformInstance(
var value = Mat4()
fun pack(buffer: FloatBuffer) {
pack(buffer, value)
pack(buffer, Mat4())
}
private fun pack(buffer: FloatBuffer, parent: Mat4) {
val value = parent * value
val value = value * parent
val offset = this.id * Mat4.length
buffer.put(value.array, offset, Mat4.length)
for (index in 0 until Mat4.length) {
buffer.put(offset + index, value.array[index])
}
for ((name, child) in children) {
child.pack(buffer, value)
}
}
}

View File

@ -18,6 +18,7 @@ import de.bixilon.kotlinglm.vec3.Vec3
import de.bixilon.minosoft.data.Axes
import de.bixilon.minosoft.data.direction.Directions
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.face.FaceUV
import de.bixilon.minosoft.gui.rendering.models.block.legacy.ModelBakeUtil
import de.bixilon.minosoft.gui.rendering.skeletal.baked.SkeletalBakeContext
@ -30,7 +31,7 @@ data class SkeletalFace(
) {
fun bake(context: SkeletalBakeContext, direction: Directions, element: SkeletalElement, transform: Int) {
val positions = direction.getPositions(context.offset + element.from - context.inflate, context.offset + element.to + context.inflate)
val positions = direction.getPositions(context.offset + (element.from - context.inflate) / BLOCK_SIZE, context.offset + (element.to + context.inflate) / BLOCK_SIZE)
val texture = context.textures[texture ?: context.texture ?: throw IllegalStateException("element has no texture set!")] ?: throw IllegalStateException("Texture not found!")