diff --git a/src/integration-test/resources/model/skeletal/dummy.smodel b/src/integration-test/resources/model/skeletal/dummy.smodel index 0d446ba56..3dcb5fc79 100644 --- a/src/integration-test/resources/model/skeletal/dummy.smodel +++ b/src/integration-test/resources/model/skeletal/dummy.smodel @@ -23,6 +23,7 @@ "transform": "head", "offset": [0, 5, 0], "from": [-5, 0, -5], + "rotation": [0, 0, 180], "to": [5, 10, 5], "uv": [10, 0], "faces": "all" diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/entities/renderer/player/PlayerModelMesh.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/entities/renderer/player/PlayerModelMesh.kt index 7b77b8c7d..bc4b7e6fc 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/entities/renderer/player/PlayerModelMesh.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/entities/renderer/player/PlayerModelMesh.kt @@ -47,7 +47,8 @@ class PlayerModelMesh(context: RenderContext, initialCacheSize: Int = 1000) : Ab } private fun String.getSkinPart(): SkinParts? = when (this) { - "body.head.hat" -> SkinParts.HAT + "head.hat" -> SkinParts.HAT + "body.jacket" -> SkinParts.JACKET // TODO else -> null } diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/skeletal/model/elements/SkeletalElement.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/skeletal/model/elements/SkeletalElement.kt index a45eba641..84c22a1cb 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/skeletal/model/elements/SkeletalElement.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/skeletal/model/elements/SkeletalElement.kt @@ -24,14 +24,14 @@ import de.bixilon.minosoft.gui.rendering.skeletal.mesh.AbstractSkeletalMesh 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.util.json.SkeletalFaceDeserializer +import de.bixilon.minosoft.util.json.SkeletalRotationDeserializer data class SkeletalElement( val from: Vec3, val to: Vec3, val offset: Vec3 = Vec3.EMPTY, - val rotation: SkeletalRotation? = null, + @JsonDeserialize(using = SkeletalRotationDeserializer::class) val rotation: SkeletalRotation? = null, val inflate: Float = 0.0f, - val enabled: Boolean = true, val texture: ResourceLocation? = null, val uv: Vec2i? = null, val transform: String? = null, @@ -41,14 +41,11 @@ data class SkeletalElement( ) { fun bake(consumer: AbstractSkeletalMesh, textures: Map, transform: BakedSkeletalTransform, path: String) { - if (!enabled) return - val context = SkeletalBakeContext(transform = transform, textures = textures, consumer = consumer) return bake(context, path) } private fun bake(context: SkeletalBakeContext, path: String) { - if (!enabled) return val context = context.copy(this) diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/skeletal/model/elements/SkeletalFace.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/skeletal/model/elements/SkeletalFace.kt index de7568714..301e390a6 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/skeletal/model/elements/SkeletalFace.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/skeletal/model/elements/SkeletalFace.kt @@ -49,7 +49,7 @@ data class SkeletalFace( val normal = Vec3(direction.vector) for (rotation in context.rotations) { - val origin = rotation.origin!! / BLOCK_SIZE + val origin = rotation.origin!! val rad = -GLM.radians(rotation.value) val vec = Vec3(0, positions) diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/skeletal/model/elements/SkeletalRotation.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/skeletal/model/elements/SkeletalRotation.kt index 0e090063d..6e113eb49 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/skeletal/model/elements/SkeletalRotation.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/skeletal/model/elements/SkeletalRotation.kt @@ -14,6 +14,7 @@ package de.bixilon.minosoft.gui.rendering.skeletal.model.elements import de.bixilon.kotlinglm.vec3.Vec3 +import de.bixilon.minosoft.gui.rendering.models.block.element.ModelElement.Companion.BLOCK_SIZE import de.bixilon.minosoft.gui.rendering.util.vec.vec3.Vec3Util.EMPTY data class SkeletalRotation( @@ -23,7 +24,10 @@ data class SkeletalRotation( ) { fun apply(offset: Vec3, from: Vec3, to: Vec3): SkeletalRotation { - val origin = (this.origin ?: ((to + from) / 2.0f)) + offset + var origin = this.origin + if (origin == null) { + origin = ((to + from) / 2.0f / BLOCK_SIZE) + offset + } return SkeletalRotation(value, origin, rescale) } diff --git a/src/main/java/de/bixilon/minosoft/util/json/SkeletalFaceDeserializer.kt b/src/main/java/de/bixilon/minosoft/util/json/SkeletalFaceDeserializer.kt index 0005b0e10..09d188238 100644 --- a/src/main/java/de/bixilon/minosoft/util/json/SkeletalFaceDeserializer.kt +++ b/src/main/java/de/bixilon/minosoft/util/json/SkeletalFaceDeserializer.kt @@ -48,8 +48,7 @@ object SkeletalFaceDeserializer : StdDeserializer> override fun deserialize(parser: JsonParser, context: DeserializationContext?): Map { val codec = parser.codec - val next = parser.currentToken - when (next) { + when (parser.currentToken) { JsonToken.START_OBJECT -> return codec.readValue(parser, MAP) JsonToken.START_ARRAY -> { val directions: Array = codec.readValue(parser, Array::class.java) diff --git a/src/main/java/de/bixilon/minosoft/util/json/SkeletalRotationDeserializer.kt b/src/main/java/de/bixilon/minosoft/util/json/SkeletalRotationDeserializer.kt new file mode 100644 index 000000000..5cf89f1a8 --- /dev/null +++ b/src/main/java/de/bixilon/minosoft/util/json/SkeletalRotationDeserializer.kt @@ -0,0 +1,37 @@ +/* + * Minosoft + * 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. + * + * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with this program. If not, see . + * + * This software is not affiliated with Mojang AB, the original developer of Minecraft. + */ + +package de.bixilon.minosoft.util.json + +import com.fasterxml.jackson.core.JsonParser +import com.fasterxml.jackson.core.JsonToken +import com.fasterxml.jackson.databind.DeserializationContext +import com.fasterxml.jackson.databind.deser.std.StdDeserializer +import de.bixilon.kotlinglm.vec3.Vec3 +import de.bixilon.minosoft.gui.rendering.skeletal.model.elements.SkeletalRotation + +object SkeletalRotationDeserializer : StdDeserializer(SkeletalRotation::class.java) { + + override fun deserialize(parser: JsonParser, context: DeserializationContext?): SkeletalRotation { + return when (parser.currentToken) { + JsonToken.START_OBJECT -> parser.readValueAs(SkeletalRotation::class.java) + JsonToken.START_ARRAY -> { + val rotation = parser.readValueAs(FloatArray::class.java) + if (rotation.size != 3) throw IllegalArgumentException("Invalid count of components: ${rotation.size}") + SkeletalRotation(Vec3(0, rotation)) + } + + else -> throw IllegalArgumentException("Can not skeletal rotation: $parser") + } + } +} diff --git a/src/main/resources/assets/minecraft/models/block/entities/shulker_box.smodel b/src/main/resources/assets/minecraft/models/block/entities/shulker_box.smodel index 1738bdbf9..e4d8f60ea 100644 --- a/src/main/resources/assets/minecraft/models/block/entities/shulker_box.smodel +++ b/src/main/resources/assets/minecraft/models/block/entities/shulker_box.smodel @@ -5,9 +5,7 @@ "to": [8, 8, 8], "texture": "minecraft:shulker", "uv": [0, 28], - "rotation": { - "value": [0, 0, 180] - }, + "rotation": [0, 0, 180], "faces": "all" }, "lid": { @@ -15,9 +13,7 @@ "from": [-8, 4, -8], "to": [8, 16, 8], "texture": "minecraft:shulker", - "rotation": { - "value": [0, 0, 180] - }, + "rotation": [0, 0, 180], "uv": [0, 0], "faces": "all" } diff --git a/src/main/resources/assets/minecraft/models/entities/player/wide.smodel b/src/main/resources/assets/minecraft/models/entities/player/wide.smodel index 886ea28c0..eeb3bd6d3 100644 --- a/src/main/resources/assets/minecraft/models/entities/player/wide.smodel +++ b/src/main/resources/assets/minecraft/models/entities/player/wide.smodel @@ -1,28 +1,39 @@ { "elements": { "body": { - "from": [-4, 12, -2], - "to": [4, 24, 2], + "offset": [0, 12, 0], + "from": [-4, 0, -2], + "to": [4, 12, 2], "texture": "minecraft:skin", "uv": [16, 16], + "rotation": [180, 0, 0], "faces": "all", "children": { - "head": { - "offset": [0, 24, 0], + "jacket": { + "from": [-4, 0, -2], + "to": [4, 12, 2], + "inflate": 0.25, + "uv": [16, 32], + "faces": "all" + } + } + }, + "head": { + "offset": [0, 24, 0], + "from": [-4, 0, -4], + "to": [4, 8, 4], + "uv": [0, 0], + "rotation": [180, 0, 0], + "texture": "minecraft:skin", + "transform": "head", + "faces": "all", + "children": { + "hat": { "from": [-4, 0, -4], "to": [4, 8, 4], - "uv": [0, 0], - "transform": "head", - "faces": "all", - "children": { - "hat": { - "from": [-4, 0, -4], - "to": [4, 8, 4], - "inflate": 0.5, - "uv": [32, 0], - "faces": "all" - } - } + "inflate": 0.5, + "uv": [32, 0], + "faces": "all" } } }