diff --git a/src/main/java/de/bixilon/minosoft/data/direction/Directions.kt b/src/main/java/de/bixilon/minosoft/data/direction/Directions.kt index 58cbc7e4c..b9871fd5c 100644 --- a/src/main/java/de/bixilon/minosoft/data/direction/Directions.kt +++ b/src/main/java/de/bixilon/minosoft/data/direction/Directions.kt @@ -75,7 +75,7 @@ enum class Directions( return when (this) { DOWN -> arrayOf(Vec3(from.x, from.y, to.z), Vec3(to.x, from.y, to.z), Vec3(to.x, from.y, from.z), from) UP -> arrayOf(Vec3(from.x, to.y, from.z), Vec3(to.x, to.y, from.z), to, Vec3(from.x, to.y, to.z)) - NORTH -> arrayOf(Vec3(to.x, to.y, from.y), Vec3(from.x, to.y, from.z), from, Vec3(to.x, from.y, from.z)) + NORTH -> arrayOf(Vec3(to.x, to.y, from.z), Vec3(from.x, to.y, from.z), from, Vec3(to.x, from.y, from.z)) SOUTH -> arrayOf(Vec3(from.x, to.y, to.z), to, Vec3(to.x, from.y, to.z), Vec3(from.x, from.y, to.z)) WEST -> arrayOf(Vec3(from.x, to.y, from.z), Vec3(from.x, to.y, to.z), Vec3(from.x, from.y, to.z), from) EAST -> arrayOf(to, Vec3(to.x, to.y, from.z), Vec3(to.x, from.y, from.z), Vec3(to.x, from.y, to.z)) diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/models/unbaked/block/UnbakedBlockStateModel.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/models/unbaked/block/UnbakedBlockStateModel.kt index 1d0452319..4207b2091 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/models/unbaked/block/UnbakedBlockStateModel.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/models/unbaked/block/UnbakedBlockStateModel.kt @@ -24,8 +24,9 @@ import de.bixilon.minosoft.gui.rendering.models.unbaked.UnbakedBlockModel import de.bixilon.minosoft.gui.rendering.models.unbaked.UnbakedModel import de.bixilon.minosoft.gui.rendering.system.base.texture.texture.AbstractTexture import de.bixilon.minosoft.gui.rendering.textures.TextureUtil.texture -import de.bixilon.minosoft.gui.rendering.util.vec.vec2.Vec2Util.toVec2N +import de.bixilon.minosoft.gui.rendering.util.vec.vec2.Vec2iUtil.toVec2iN import de.bixilon.minosoft.gui.rendering.util.vec.vec3.Vec3Util.EMPTY +import de.bixilon.minosoft.gui.rendering.util.vec.vec3.Vec3Util.get import de.bixilon.minosoft.gui.rendering.util.vec.vec3.Vec3Util.set import de.bixilon.minosoft.util.KUtil.toBoolean import de.bixilon.minosoft.util.KUtil.toInt @@ -34,13 +35,15 @@ import de.bixilon.minosoft.util.KUtil.unsafeCast import glm_.func.rad import glm_.mat4x4.Mat4 import glm_.vec2.Vec2 +import glm_.vec2.Vec2i import glm_.vec3.Vec3 import glm_.vec4.Vec4 import glm_.vec4.swizzle.xyz +import glm_.vec4.swizzle.xz data class UnbakedBlockStateModel( val model: UnbakedBlockModel, - val rotation: Vec2?, + val rotation: Vec2i?, val uvLock: Boolean, val weight: Int, ) : UnbakedModel { @@ -81,9 +84,6 @@ data class UnbakedBlockStateModel( val rescale = element.rotation?.rescale ?: false for (face in element.faces) { val texture = resolvedTextures[face.texture.removePrefix("#")]!! // ToDo: Allow direct texture names? - if (texture.resourceLocation.path.contains("carved_pumpkin")) { - var a = 1 - } val positions = face.direction.getPositions(element.from, element.to) val rotationMatrix = Mat4() element.rotation?.let { @@ -97,7 +97,7 @@ data class UnbakedBlockStateModel( val direction = Directions.byDirection((rotationMatrix * Vec4(face.direction.vectorf, 1.0f)).xyz) for ((index, position) in positions.withIndex()) { - positions[index] = (rotationMatrix * Vec4(position, 1.0f)).xyz + positions[index] = (rotationMatrix * Vec4(position - 0.5f, 1.0f)).xyz + 0.5f } val texturePositions = arrayOf( @@ -107,6 +107,18 @@ data class UnbakedBlockStateModel( face.uvEnd, ).rotateLeft((face.rotation % 360) / 90).toTypedArray() + if (this.uvLock && this.rotation != null) { + val matrix = Mat4() + //matrix.rotateAssign(this.rotation.x.rad, Vec3(1,0,0)) + val rotationVec3 = Vec3(this.rotation, 0.0f) + val angle = rotationVec3[face.direction.axis] + matrix.rotateAssign(-angle.rad, direction.vectorf) + //matrix.rotateAssign(this.rotation.x.rad, Vec3(0,1,0)) + for ((index, position) in texturePositions.withIndex()) { + texturePositions[index] = (matrix * Vec4(position.x - 0.5f, 0.0f, position.y - 0.5f, 0.0f)).xz + 0.5f + } + } + faces[direction.ordinal] += BakedFace( faceSize = face.direction.getSize(element.from, element.to), @@ -133,7 +145,7 @@ data class UnbakedBlockStateModel( operator fun invoke(models: Map, data: Map): UnbakedBlockStateModel { return UnbakedBlockStateModel( model = models[data["model"].toResourceLocation()].unsafeCast(), - rotation = data.toVec2N(), + rotation = data.toVec2iN(), uvLock = data["uvlock"]?.toBoolean() ?: false, weight = data["weight"]?.toInt() ?: 1, )