From 71e1d781d203999330b298bcf360bb5a5caf7156 Mon Sep 17 00:00:00 2001 From: dima-dencep Date: Wed, 2 Jul 2025 22:27:04 +0700 Subject: [PATCH 01/23] Port to 1.21.6 --- build.gradle | 78 ++++++++++--------- common/build.gradle | 27 ++----- .../geckolib/GeoCubeAccessor.java | 3 +- .../geckolib/GeoCubeMixin_geckoOnly.java | 2 +- .../geckolib/GeoRendererMixin_geckoOnly.java | 10 +-- .../playeranim/CapeLayerMixin_playerAnim.java | 9 ++- .../ElytraLayerMixin_playerAnim.java | 5 +- .../playeranim/HumanoidArmorLayerMixin.java | 1 + .../ItemInHandLayerMixin_playerAnim.java | 7 +- .../LivingEntityMixin_playerAnim.java | 5 +- ...vingEntityRendererAccessor_playerAnim.java | 16 ---- .../playeranim/ModelMixin_playerAnim.java | 5 +- .../PlayerModelMixin_playerAnim.java | 25 +++--- .../PlayerRendererMixin_playerAnim.java | 1 + .../resources/bendable_cuboids.mixins.json | 1 - fabric/build.gradle | 60 ++++---------- forge/build.gradle | 48 ++++-------- gradle.properties | 28 +++---- settings.gradle | 2 +- 19 files changed, 129 insertions(+), 204 deletions(-) delete mode 100644 common/src/main/java/com/zigythebird/bendable_cuboids/mixin/playeranim/LivingEntityRendererAccessor_playerAnim.java diff --git a/build.gradle b/build.gradle index 6caf39f..0e431ce 100644 --- a/build.gradle +++ b/build.gradle @@ -1,7 +1,7 @@ plugins { - id "com.github.johnrengelman.shadow" version "8.1.1" apply false + id "com.gradleup.shadow" version "8.3.8" apply false id "architectury-plugin" version "3.4-SNAPSHOT" - id "dev.architectury.loom" version "1.9-SNAPSHOT" apply false + id "dev.architectury.loom" version "1.10-SNAPSHOT" apply false } architectury { @@ -15,7 +15,41 @@ subprojects { silentMojangMappingsLicense() } + dependencies { + minecraft "com.mojang:minecraft:${rootProject.minecraft_version}" + mappings loom.layered() { + officialMojangMappings() + parchment("org.parchmentmc.data:parchment-${rootProject.minecraft_version}:${rootProject.parchment_version}@zip") + } + } +} + +allprojects { + apply plugin: "java" + apply plugin: "architectury-plugin" + apply plugin: "maven-publish" + + base.archivesName = rootProject.archives_base_name + version = "${rootProject.mod_version}+mc${rootProject.minecraft_version}" + group = rootProject.maven_group + repositories { + // Fix issue with lwjgl-freetype not being found on macOS + maven { + url "https://libraries.minecraft.net" + content { + includeModule("org.lwjgl", "lwjgl-freetype") + } + } + maven { + name = "NeoForged" + url = "https://maven.neoforged.net/releases" + } + maven { + name = "RedlanceMinecraft" + url = "https://repo.redlance.org/public" + } + mavenLocal() maven { name = "Modrinth" url = "https://api.modrinth.com/maven" @@ -23,10 +57,6 @@ subprojects { includeGroup "maven.modrinth" } } - maven { - name "zigythebirdMods" - url "https://maven.zigythebird.com/mods" - } maven { name = 'GeckoLib' url 'https://dl.cloudsmith.io/public/geckolib3/geckolib/maven/' @@ -36,26 +66,6 @@ subprojects { } } - dependencies { - minecraft "com.mojang:minecraft:${rootProject.minecraft_version}" - mappings loom.officialMojangMappings() - } -} - -allprojects { - apply plugin: "java" - apply plugin: "architectury-plugin" - apply plugin: "maven-publish" - - archivesBaseName = rootProject.archives_base_name - version = rootProject.mod_version - group = rootProject.maven_group - - repositories { - maven { url "https://maven.neoforged.net/releases" } - mavenLocal() - } - tasks.withType(JavaCompile) { options.encoding = "UTF-8" options.release.set 21 @@ -64,16 +74,10 @@ allprojects { java { withSourcesJar() } -} -project.ext.keys = new Properties() -ext.ENV = System.getenv() -ext.keysExists = ENV.MAVEN_PASS != null -if (keysExists) { - project.ext.keys.kosmx_maven = ENV.MAVEN_PASS - project.ext.keys.maven_user = ENV.MAVEN_USER -} else { - project.ext.keys.kosmx_maven = "V2h5IGRpZCB5b3UgZGVjb2RlIGl0PyAg" - project.ext.keys.maven_user = "username" + publishing { + repositories { + // TODO + } + } } - diff --git a/common/build.gradle b/common/build.gradle index a9dbdb2..8d6e829 100644 --- a/common/build.gradle +++ b/common/build.gradle @@ -7,32 +7,21 @@ loom { } dependencies { - modImplementation "net.fabricmc:fabric-loader:${rootProject.loader_version}" + modImplementation "net.fabricmc:fabric-loader:${rootProject.fabric_loader_version}" - modCompileOnly "software.bernie.geckolib:geckolib-fabric-${minecraft_version}:${geckolib_version}" - modCompileOnly "com.zigythebird.playeranim:player_animation_library-neoforge-${minecraft_version}:${player_anim_version}" + modCompileOnly "software.bernie.geckolib:geckolib-fabric-${rootProject.minecraft_version}:${rootProject.geckolib_version}" + modCompileOnly "com.zigythebird.playeranim:PlayerAnimationLibCommon:${rootProject.player_anim_version}" + compileOnly "com.zigythebird.playeranim:PlayerAnimationLibCore:${rootProject.player_anim_version}" + + // third-party modCompileOnly "maven.modrinth:3dskinlayers:D4TLEY5I" } publishing { publications { - maven(MavenPublication) { - groupId = "com.zigythebird.bendable_cuboids" - artifactId = "bendable_cuboids-common-$minecraft_version" - version = rootProject.mod_version + mavenCommon(MavenPublication) { + artifactId = "BendableCuboidsCommon" from components.java } } - - repositories { - if (System.getenv("GITHUB_ACTOR") != null) { - maven { - url = "https://maven.zigythebird.com/mods" - credentials(PasswordCredentials) - authentication { - basic(BasicAuthentication) - } - } - } - } } diff --git a/common/src/main/java/com/zigythebird/bendable_cuboids/impl/compatibility/geckolib/GeoCubeAccessor.java b/common/src/main/java/com/zigythebird/bendable_cuboids/impl/compatibility/geckolib/GeoCubeAccessor.java index 977bc3c..32f7c62 100644 --- a/common/src/main/java/com/zigythebird/bendable_cuboids/impl/compatibility/geckolib/GeoCubeAccessor.java +++ b/common/src/main/java/com/zigythebird/bendable_cuboids/impl/compatibility/geckolib/GeoCubeAccessor.java @@ -1,7 +1,6 @@ package com.zigythebird.bendable_cuboids.impl.compatibility.geckolib; -import com.zigythebird.bendable_cuboids.impl.BendableCuboid; -import com.zigythebird.playeranim.math.Pair; +import it.unimi.dsi.fastutil.Pair; public interface GeoCubeAccessor { void setBendableCuboid(Pair bendableCuboid); diff --git a/common/src/main/java/com/zigythebird/bendable_cuboids/mixin/geckolib/GeoCubeMixin_geckoOnly.java b/common/src/main/java/com/zigythebird/bendable_cuboids/mixin/geckolib/GeoCubeMixin_geckoOnly.java index bcf6305..47ca18a 100644 --- a/common/src/main/java/com/zigythebird/bendable_cuboids/mixin/geckolib/GeoCubeMixin_geckoOnly.java +++ b/common/src/main/java/com/zigythebird/bendable_cuboids/mixin/geckolib/GeoCubeMixin_geckoOnly.java @@ -2,7 +2,7 @@ import com.zigythebird.bendable_cuboids.impl.compatibility.geckolib.GeckoLibBendableCuboid; import com.zigythebird.bendable_cuboids.impl.compatibility.geckolib.GeoCubeAccessor; -import com.zigythebird.playeranim.math.Pair; +import it.unimi.dsi.fastutil.Pair; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Unique; import software.bernie.geckolib.cache.object.GeoCube; diff --git a/common/src/main/java/com/zigythebird/bendable_cuboids/mixin/geckolib/GeoRendererMixin_geckoOnly.java b/common/src/main/java/com/zigythebird/bendable_cuboids/mixin/geckolib/GeoRendererMixin_geckoOnly.java index dd744bb..3d34f06 100644 --- a/common/src/main/java/com/zigythebird/bendable_cuboids/mixin/geckolib/GeoRendererMixin_geckoOnly.java +++ b/common/src/main/java/com/zigythebird/bendable_cuboids/mixin/geckolib/GeoRendererMixin_geckoOnly.java @@ -10,8 +10,6 @@ import com.zigythebird.bendable_cuboids.impl.compatibility.geckolib.GeckoRenderUtil; import com.zigythebird.bendable_cuboids.impl.compatibility.geckolib.GeoCubeAccessor; import com.zigythebird.playeranim.accessors.IAnimatedPlayer; -import com.zigythebird.playeranim.bones.PlayerAnimBone; -import com.zigythebird.playeranim.math.Pair; import net.minecraft.client.player.AbstractClientPlayer; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; @@ -27,15 +25,15 @@ import software.bernie.geckolib.cache.object.GeoBone; import software.bernie.geckolib.cache.object.GeoCube; import software.bernie.geckolib.renderer.GeoArmorRenderer; -import software.bernie.geckolib.renderer.GeoRenderer; +import software.bernie.geckolib.renderer.base.GeoRenderer; import java.util.ArrayList; import java.util.List; @Mixin(GeoRenderer.class) public interface GeoRendererMixin_geckoOnly { - @Inject(method = "defaultRender", at = @At(value = "INVOKE", target = "Lsoftware/bernie/geckolib/renderer/GeoRenderer;preRender(Lcom/mojang/blaze3d/vertex/PoseStack;Lsoftware/bernie/geckolib/animatable/GeoAnimatable;Lsoftware/bernie/geckolib/cache/object/BakedGeoModel;Lnet/minecraft/client/renderer/MultiBufferSource;Lcom/mojang/blaze3d/vertex/VertexConsumer;ZFIII)V"), remap = false) - private void initBend(PoseStack poseStack, T animatable, MultiBufferSource bufferSource, @Nullable RenderType renderType, @Nullable VertexConsumer buffer, float partialTick, int packedLight, CallbackInfo ci, @Local BakedGeoModel model) { + /*@Inject(method = "defaultRender", at = @At(value = "INVOKE", target = "Lsoftware/bernie/geckolib/renderer/base/GeoRenderer;preRender(Lsoftware/bernie/geckolib/renderer/base/GeoRenderState;Lcom/mojang/blaze3d/vertex/PoseStack;Lsoftware/bernie/geckolib/cache/object/BakedGeoModel;Lnet/minecraft/client/renderer/MultiBufferSource;Lcom/mojang/blaze3d/vertex/VertexConsumer;ZIII)V"), remap = false) + private void initBend(R renderState, PoseStack poseStack, MultiBufferSource bufferSource, @Nullable RenderType renderType, @Nullable VertexConsumer buffer, CallbackInfo ci, @Local BakedGeoModel model) { if ((GeoRenderer)(Object)this instanceof GeoArmorRenderer armorRenderer) { bendableCuboids$initBend(List.of(armorRenderer.getGeoModel().getBone("armorLeftArm").orElse(null)), Direction.UP, "left_arm", model); bendableCuboids$initBend(List.of(armorRenderer.getGeoModel().getBone("armorRightArm").orElse(null)), Direction.UP, "right_arm", model); @@ -101,5 +99,5 @@ private boolean renderCube(GeoRenderer instance, PoseStack poseStack, GeoCube cu } bendableCuboids$initBend(bone.getChildBones(), direction, parent, model); } - } + }*/ } diff --git a/common/src/main/java/com/zigythebird/bendable_cuboids/mixin/playeranim/CapeLayerMixin_playerAnim.java b/common/src/main/java/com/zigythebird/bendable_cuboids/mixin/playeranim/CapeLayerMixin_playerAnim.java index 5ac2589..3b59071 100644 --- a/common/src/main/java/com/zigythebird/bendable_cuboids/mixin/playeranim/CapeLayerMixin_playerAnim.java +++ b/common/src/main/java/com/zigythebird/bendable_cuboids/mixin/playeranim/CapeLayerMixin_playerAnim.java @@ -6,9 +6,9 @@ import com.zigythebird.bendable_cuboids.impl.compatibility.PlayerBendHelper; import com.zigythebird.playeranim.accessors.IPlayerAnimationState; import com.zigythebird.playeranim.animation.PlayerAnimManager; -import com.zigythebird.playeranim.bones.PlayerAnimBone; import com.zigythebird.playeranim.mixin.CapeLayerAccessor; import com.zigythebird.playeranim.util.RenderUtil; +import com.zigythebird.playeranimcore.bones.PlayerAnimBone; import net.minecraft.client.model.HumanoidModel; import net.minecraft.client.model.PlayerModel; import net.minecraft.client.model.geom.EntityModelSet; @@ -29,6 +29,7 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @Mixin(CapeLayer.class) +@SuppressWarnings({"UnstableApiUsage","rawtypes"}) public abstract class CapeLayerMixin_playerAnim extends RenderLayer { @Shadow @Final private HumanoidModel model; @@ -52,20 +53,20 @@ private void render(PoseStack poseStack, MultiBufferSource multiBufferSource, in poseStack.translate(torso.x / 16, torso.y / 16, torso.z / 16); poseStack.mulPose((new Quaternionf()).rotateXYZ(torso.xRot, torso.yRot, torso.zRot)); - PlayerBendHelper.applyTorsoBendToMatrix(poseStack, bone.getBendAxis(), bone.getBend()); + PlayerBendHelper.applyTorsoBendToMatrix(poseStack, 0, bone.getBend()); poseStack.translate(0.0F, 0.0F, 0.125F); poseStack.mulPose(Axis.YP.rotationDegrees(180)); ModelPart part = capeLayer.getCape(); PlayerAnimBone bone1 = ((IPlayerAnimationState)playerRenderState).playerAnimLib$getAnimProcessor().getBone("cape"); bone1.setToInitialPose(); - bone1.setBendAxis(bone.getBendAxis()); + // bone1.setBendAxis(bone.getBendAxis()); bone1.setBend(bone.getBend()); emote.get3DTransform(bone1); RenderUtil.translatePartToBone(part, bone1, part.getInitialPose()); - PlayerBendHelper.bend(part, bone1.getBendAxis(), bone1.getBend()); + PlayerBendHelper.bend(part, 0, bone1.getBend()); } else { PlayerBendHelper.bend(capeLayer.getCape(), 0, 0); } diff --git a/common/src/main/java/com/zigythebird/bendable_cuboids/mixin/playeranim/ElytraLayerMixin_playerAnim.java b/common/src/main/java/com/zigythebird/bendable_cuboids/mixin/playeranim/ElytraLayerMixin_playerAnim.java index d2d1eec..e5254b9 100644 --- a/common/src/main/java/com/zigythebird/bendable_cuboids/mixin/playeranim/ElytraLayerMixin_playerAnim.java +++ b/common/src/main/java/com/zigythebird/bendable_cuboids/mixin/playeranim/ElytraLayerMixin_playerAnim.java @@ -4,7 +4,7 @@ import com.zigythebird.bendable_cuboids.impl.compatibility.PlayerBendHelper; import com.zigythebird.playeranim.accessors.IPlayerAnimationState; import com.zigythebird.playeranim.animation.PlayerAnimManager; -import com.zigythebird.playeranim.bones.PlayerAnimBone; +import com.zigythebird.playeranimcore.bones.PlayerAnimBone; import net.minecraft.client.model.EntityModel; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.entity.RenderLayerParent; @@ -18,6 +18,7 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @Mixin(WingsLayer.class) +@SuppressWarnings("UnstableApiUsage") public abstract class ElytraLayerMixin_playerAnim> extends RenderLayer { public ElytraLayerMixin_playerAnim(RenderLayerParent renderLayerParent) { super(renderLayerParent); @@ -39,7 +40,7 @@ private void inject(PoseStack poseStack, MultiBufferSource multiBufferSource, in poseStack.translate(bone2.getPosX() / 16, bone2.getPosX() / 16, bone2.getPosX() / 16); poseStack.mulPose((new Quaternionf()).rotateXYZ(-bone2.getRotX(), bone2.getRotY(), -bone2.getRotZ())); poseStack.scale(bone2.getScaleX(), bone2.getScaleY(), bone2.getScaleZ()); - PlayerBendHelper.applyTorsoBendToMatrix(poseStack, bone.getBendAxis(), bone.getBend()); + PlayerBendHelper.applyTorsoBendToMatrix(poseStack, 0, bone.getBend()); } } } diff --git a/common/src/main/java/com/zigythebird/bendable_cuboids/mixin/playeranim/HumanoidArmorLayerMixin.java b/common/src/main/java/com/zigythebird/bendable_cuboids/mixin/playeranim/HumanoidArmorLayerMixin.java index 6f9ddca..b1996a7 100644 --- a/common/src/main/java/com/zigythebird/bendable_cuboids/mixin/playeranim/HumanoidArmorLayerMixin.java +++ b/common/src/main/java/com/zigythebird/bendable_cuboids/mixin/playeranim/HumanoidArmorLayerMixin.java @@ -11,6 +11,7 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @Mixin(HumanoidArmorLayer.class) +@SuppressWarnings("rawtypes") public class HumanoidArmorLayerMixin { @Inject(method = "(Lnet/minecraft/client/renderer/entity/RenderLayerParent;Lnet/minecraft/client/model/HumanoidModel;Lnet/minecraft/client/model/HumanoidModel;Lnet/minecraft/client/model/HumanoidModel;Lnet/minecraft/client/model/HumanoidModel;Lnet/minecraft/client/renderer/entity/layers/EquipmentLayerRenderer;)V", at = @At("TAIL")) private void init(RenderLayerParent renderLayerParent, HumanoidModel humanoidModel, HumanoidModel humanoidModel2, HumanoidModel humanoidModel3, HumanoidModel humanoidModel4, EquipmentLayerRenderer equipmentLayerRenderer, CallbackInfo ci) { diff --git a/common/src/main/java/com/zigythebird/bendable_cuboids/mixin/playeranim/ItemInHandLayerMixin_playerAnim.java b/common/src/main/java/com/zigythebird/bendable_cuboids/mixin/playeranim/ItemInHandLayerMixin_playerAnim.java index 3005caa..c0feffd 100644 --- a/common/src/main/java/com/zigythebird/bendable_cuboids/mixin/playeranim/ItemInHandLayerMixin_playerAnim.java +++ b/common/src/main/java/com/zigythebird/bendable_cuboids/mixin/playeranim/ItemInHandLayerMixin_playerAnim.java @@ -2,7 +2,7 @@ import com.mojang.blaze3d.vertex.PoseStack; import com.zigythebird.playeranim.accessors.IPlayerAnimationState; -import com.zigythebird.playeranim.bones.PlayerAnimBone; +import com.zigythebird.playeranimcore.bones.PlayerAnimBone; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.entity.layers.ItemInHandLayer; import net.minecraft.client.renderer.entity.state.ArmedEntityRenderState; @@ -16,8 +16,9 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @Mixin(ItemInHandLayer.class) +@SuppressWarnings("UnstableApiUsage") public class ItemInHandLayerMixin_playerAnim { - @Inject(method = "renderArmWithItem", at = @At(value = "INVOKE", target = "Lcom/mojang/blaze3d/vertex/PoseStack;mulPose(Lorg/joml/Quaternionf;)V", ordinal = 0)) + @Inject(method = "renderArmWithItem", at = @At(value = "INVOKE", target = "Lcom/mojang/blaze3d/vertex/PoseStack;mulPose(Lorg/joml/Quaternionfc;)V", ordinal = 0)) private void renderMixin(S armedEntityRenderState, ItemStackRenderState itemStackRenderState, HumanoidArm humanoidArm, PoseStack poseStack, MultiBufferSource multiBufferSource, int i, CallbackInfo ci){ if(armedEntityRenderState instanceof IPlayerAnimationState state){ if(state.playerAnimLib$getAnimManager().isActive()){ @@ -25,7 +26,7 @@ private void renderMixin(S armedEntityRenderState, ItemStackRenderState itemStac state.playerAnimLib$getAnimManager().get3DTransform(bone); float offset = 0.25f; poseStack.translate(0, offset, 0); - Vector3f axis = new Vector3f((float) Math.cos(-bone.getBendAxis()), 0, (float) -Math.sin(-bone.getBendAxis())); + Vector3f axis = new Vector3f((float) Math.cos(-0), 0, (float) -Math.sin(-0)); poseStack.mulPose(new Quaternionf().rotateAxis(bone.getBend(), axis)); poseStack.translate(0, - offset, 0); } diff --git a/common/src/main/java/com/zigythebird/bendable_cuboids/mixin/playeranim/LivingEntityMixin_playerAnim.java b/common/src/main/java/com/zigythebird/bendable_cuboids/mixin/playeranim/LivingEntityMixin_playerAnim.java index 3aeab17..9dd87c8 100644 --- a/common/src/main/java/com/zigythebird/bendable_cuboids/mixin/playeranim/LivingEntityMixin_playerAnim.java +++ b/common/src/main/java/com/zigythebird/bendable_cuboids/mixin/playeranim/LivingEntityMixin_playerAnim.java @@ -5,7 +5,7 @@ import com.zigythebird.bendable_cuboids.impl.compatibility.PlayerBendHelper; import com.zigythebird.playeranim.accessors.IPlayerAnimationState; import com.zigythebird.playeranim.accessors.IUpperPartHelper; -import com.zigythebird.playeranim.bones.PlayerAnimBone; +import com.zigythebird.playeranimcore.bones.PlayerAnimBone; import net.minecraft.client.model.EntityModel; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.entity.LivingEntityRenderer; @@ -17,13 +17,14 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @Mixin(value = LivingEntityRenderer.class, priority = 2000) +@SuppressWarnings("UnstableApiUsage") public class LivingEntityMixin_playerAnim> { @Inject(method = "render(Lnet/minecraft/client/renderer/entity/state/LivingEntityRenderState;Lcom/mojang/blaze3d/vertex/PoseStack;Lnet/minecraft/client/renderer/MultiBufferSource;I)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/entity/layers/RenderLayer;render(Lcom/mojang/blaze3d/vertex/PoseStack;Lnet/minecraft/client/renderer/MultiBufferSource;ILnet/minecraft/client/renderer/entity/state/EntityRenderState;FF)V")) private void inject(S livingEntityRenderState, PoseStack poseStack, MultiBufferSource multiBufferSource, int i, CallbackInfo ci, @Local RenderLayer layer) { if (livingEntityRenderState instanceof IPlayerAnimationState state && state.playerAnimLib$getAnimManager().isActive() && ((IUpperPartHelper) layer).playerAnimLib$isUpperPart()) { PlayerAnimBone bone = state.playerAnimLib$getAnimProcessor().getBone("torso"); state.playerAnimLib$getAnimManager().get3DTransform(bone); - PlayerBendHelper.applyTorsoBendToMatrix(poseStack, bone.getBendAxis(), bone.getBend()); + PlayerBendHelper.applyTorsoBendToMatrix(poseStack, 0, bone.getBend()); } } } diff --git a/common/src/main/java/com/zigythebird/bendable_cuboids/mixin/playeranim/LivingEntityRendererAccessor_playerAnim.java b/common/src/main/java/com/zigythebird/bendable_cuboids/mixin/playeranim/LivingEntityRendererAccessor_playerAnim.java deleted file mode 100644 index 6512f70..0000000 --- a/common/src/main/java/com/zigythebird/bendable_cuboids/mixin/playeranim/LivingEntityRendererAccessor_playerAnim.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.zigythebird.bendable_cuboids.mixin.playeranim; - -import net.minecraft.client.model.EntityModel; -import net.minecraft.client.renderer.entity.LivingEntityRenderer; -import net.minecraft.client.renderer.entity.layers.RenderLayer; -import net.minecraft.client.renderer.entity.state.LivingEntityRenderState; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.gen.Accessor; - -import java.util.List; - -@Mixin(LivingEntityRenderer.class) -public interface LivingEntityRendererAccessor_playerAnim> { - @Accessor - List> getLayers(); -} diff --git a/common/src/main/java/com/zigythebird/bendable_cuboids/mixin/playeranim/ModelMixin_playerAnim.java b/common/src/main/java/com/zigythebird/bendable_cuboids/mixin/playeranim/ModelMixin_playerAnim.java index ff2ebe8..e559307 100644 --- a/common/src/main/java/com/zigythebird/bendable_cuboids/mixin/playeranim/ModelMixin_playerAnim.java +++ b/common/src/main/java/com/zigythebird/bendable_cuboids/mixin/playeranim/ModelMixin_playerAnim.java @@ -6,7 +6,7 @@ import com.zigythebird.playeranim.accessors.IMutableModel; import com.zigythebird.playeranim.accessors.IUpperPartHelper; import com.zigythebird.playeranim.animation.PlayerAnimManager; -import com.zigythebird.playeranim.bones.PlayerAnimBone; +import com.zigythebird.playeranimcore.bones.PlayerAnimBone; import net.minecraft.client.model.Model; import net.minecraft.client.model.PlayerModel; import org.spongepowered.asm.mixin.Mixin; @@ -15,6 +15,7 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @Mixin(Model.class) +@SuppressWarnings("UnstableApiUsage") public abstract class ModelMixin_playerAnim { @Inject(method = "renderToBuffer(Lcom/mojang/blaze3d/vertex/PoseStack;Lcom/mojang/blaze3d/vertex/VertexConsumer;III)V", at = @At("HEAD"), cancellable = true) public void renderToBuffer(PoseStack matrices, VertexConsumer vertices, int light, int overlay, int color, CallbackInfo ci) { @@ -28,7 +29,7 @@ public void renderToBuffer(PoseStack matrices, VertexConsumer vertices, int ligh PlayerAnimManager emoteSupplier = ((IMutableModel)playerModel).playerAnimLib$getAnimation(); PlayerAnimBone bone = new PlayerAnimBone("torso"); emoteSupplier.get3DTransform(bone); - PlayerBendHelper.applyTorsoBendToMatrix(matrices, bone.getBendAxis(), bone.getBend()); + PlayerBendHelper.applyTorsoBendToMatrix(matrices, 0, bone.getBend()); ((PlayerModelAccessor_playerAnim)playerModel).getBodyParts().forEach((part)->{ if(((IUpperPartHelper) part).playerAnimLib$isUpperPart()){ part.render(matrices, vertices, light, overlay, color); diff --git a/common/src/main/java/com/zigythebird/bendable_cuboids/mixin/playeranim/PlayerModelMixin_playerAnim.java b/common/src/main/java/com/zigythebird/bendable_cuboids/mixin/playeranim/PlayerModelMixin_playerAnim.java index f72db71..9915abb 100644 --- a/common/src/main/java/com/zigythebird/bendable_cuboids/mixin/playeranim/PlayerModelMixin_playerAnim.java +++ b/common/src/main/java/com/zigythebird/bendable_cuboids/mixin/playeranim/PlayerModelMixin_playerAnim.java @@ -5,8 +5,8 @@ import com.zigythebird.playeranim.accessors.IMutableModel; import com.zigythebird.playeranim.accessors.IPlayerAnimationState; import com.zigythebird.playeranim.accessors.IUpperPartHelper; -import com.zigythebird.playeranim.animation.AnimationProcessor; -import com.zigythebird.playeranim.bones.PlayerAnimBone; +import com.zigythebird.playeranimcore.animation.AnimationProcessor; +import com.zigythebird.playeranimcore.bones.PlayerAnimBone; import net.minecraft.client.model.PlayerModel; import net.minecraft.client.model.geom.ModelPart; import net.minecraft.client.renderer.entity.state.PlayerRenderState; @@ -17,6 +17,7 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @Mixin(value = PlayerModel.class, priority = 2002) +@SuppressWarnings("UnstableApiUsage") public abstract class PlayerModelMixin_playerAnim implements IMutableModel { @Inject(method = "", at = @At("RETURN")) private void initBendableStuff(ModelPart modelPart, boolean bl, CallbackInfo ci) { @@ -39,17 +40,17 @@ private void setupPlayerAnimation(PlayerRenderState playerRenderState, CallbackI PlayerAnimBone rightLeg = processor.getBone("right_leg"); PlayerAnimBone leftLeg = processor.getBone("left_leg"); - PlayerBendHelper.bend(model.body, torso.getBendAxis(), torso.getBend()); - PlayerBendHelper.bend(model.rightArm, rightArm.getBendAxis(), rightArm.getBend()); - PlayerBendHelper.bend(model.leftArm, leftArm.getBendAxis(), leftArm.getBend()); - PlayerBendHelper.bend(model.rightLeg, rightLeg.getBendAxis(), rightLeg.getBend()); - PlayerBendHelper.bend(model.leftLeg, leftLeg.getBendAxis(), leftLeg.getBend()); + PlayerBendHelper.bend(model.body, 0, torso.getBend()); + PlayerBendHelper.bend(model.rightArm, 0, rightArm.getBend()); + PlayerBendHelper.bend(model.leftArm, 0, leftArm.getBend()); + PlayerBendHelper.bend(model.rightLeg, 0, rightLeg.getBend()); + PlayerBendHelper.bend(model.leftLeg, 0, leftLeg.getBend()); - PlayerBendHelper.bend(model.jacket, torso.getBendAxis(), torso.getBend()); - PlayerBendHelper.bend(model.rightSleeve, rightArm.getBendAxis(), rightArm.getBend()); - PlayerBendHelper.bend(model.leftSleeve, leftArm.getBendAxis(), leftArm.getBend()); - PlayerBendHelper.bend(model.rightPants, rightLeg.getBendAxis(), rightLeg.getBend()); - PlayerBendHelper.bend(model.leftPants, leftLeg.getBendAxis(), leftLeg.getBend()); + PlayerBendHelper.bend(model.jacket, 0, torso.getBend()); + PlayerBendHelper.bend(model.rightSleeve, 0, rightArm.getBend()); + PlayerBendHelper.bend(model.leftSleeve, 0, leftArm.getBend()); + PlayerBendHelper.bend(model.rightPants, 0, rightLeg.getBend()); + PlayerBendHelper.bend(model.leftPants, 0, leftLeg.getBend()); } else { resetBend(model.body); diff --git a/common/src/main/java/com/zigythebird/bendable_cuboids/mixin/playeranim/PlayerRendererMixin_playerAnim.java b/common/src/main/java/com/zigythebird/bendable_cuboids/mixin/playeranim/PlayerRendererMixin_playerAnim.java index 170316e..03dc37f 100644 --- a/common/src/main/java/com/zigythebird/bendable_cuboids/mixin/playeranim/PlayerRendererMixin_playerAnim.java +++ b/common/src/main/java/com/zigythebird/bendable_cuboids/mixin/playeranim/PlayerRendererMixin_playerAnim.java @@ -18,6 +18,7 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @Mixin(value = PlayerRenderer.class, priority = 2000) +@SuppressWarnings("UnstableApiUsage") public abstract class PlayerRendererMixin_playerAnim extends LivingEntityRenderer { public PlayerRendererMixin_playerAnim(EntityRendererProvider.Context context, PlayerModel entityModel, float f) { super(context, entityModel, f); diff --git a/common/src/main/resources/bendable_cuboids.mixins.json b/common/src/main/resources/bendable_cuboids.mixins.json index 25583fb..53a93c1 100644 --- a/common/src/main/resources/bendable_cuboids.mixins.json +++ b/common/src/main/resources/bendable_cuboids.mixins.json @@ -13,7 +13,6 @@ "playeranim.HumanoidArmorLayerMixin", "playeranim.ItemInHandLayerMixin_playerAnim", "playeranim.LivingEntityMixin_playerAnim", - "playeranim.LivingEntityRendererAccessor_playerAnim", "playeranim.ModelMixin_playerAnim", "playeranim.PlayerCapeModelAccessor_playerAnim", "playeranim.PlayerCapeModelMixin_playerAnim", diff --git a/fabric/build.gradle b/fabric/build.gradle index cdfe837..b7c76b8 100644 --- a/fabric/build.gradle +++ b/fabric/build.gradle @@ -1,5 +1,9 @@ plugins { - id "com.github.johnrengelman.shadow" + id "com.gradleup.shadow" +} + +loom { + accessWidenerPath = project(":common").loom.accessWidenerPath } architectury { @@ -7,31 +11,21 @@ architectury { fabric() } -loom { - accessWidenerPath = project(":common").loom.accessWidenerPath -} - configurations { common - shadowCommon // Don't use shadow from the shadow plugin because we don't want IDEA to index this. + shadowCommon compileClasspath.extendsFrom common runtimeClasspath.extendsFrom common developmentFabric.extendsFrom common } -repositories { - maven { url "https://maven.terraformersmc.com/releases/" } - maven { url "https://maven.kosmx.dev/" } -} - - dependencies { - modImplementation "net.fabricmc:fabric-loader:${rootProject.loader_version}" - + modImplementation "net.fabricmc:fabric-loader:${rootProject.fabric_loader_version}" common(project(path: ":common", configuration: "namedElements")) { transitive false } shadowCommon(project(path: ":common", configuration: "transformProductionFabric")) { transitive false } + modImplementation "com.zigythebird.playeranim:PlayerAnimationLibFabric:${rootProject.player_anim_version}" modLocalRuntime "software.bernie.geckolib:geckolib-fabric-${minecraft_version}:${geckolib_version}" } @@ -43,22 +37,16 @@ processResources { } } -shadowJar { - exclude "architectury.common.json" - - configurations = [project.configurations.shadowCommon] - archiveClassifier.set("dev-shadow") -} - remapJar { injectAccessWidener = true + inputFile.set shadowJar.archiveFile dependsOn shadowJar - archiveClassifier.set(null) + archiveClassifier.set null } jar { - archiveClassifier.set("dev") + archiveClassifier.set "dev" } sourcesJar { @@ -75,31 +63,9 @@ components.java { publishing { publications { - maven(MavenPublication) { - groupId = "com.zigythebird.bendable_cuboids" - artifactId = "bendable_cuboids-fabric-$minecraft_version" - version = rootProject.mod_version + mavenFabric(MavenPublication) { + artifactId = "BendableCuboidsFabric" from components.java } } - - repositories { - if(System.getenv("GITHUB_ACTOR") != null) { - maven { - name = "GitHubPackages" - url = "https://maven.pkg.github.com/zigythebird/bendable_cuboids" - credentials { - username = System.getenv("GITHUB_ACTOR") - password = System.getenv("GITHUB_TOKEN") - } - } - } - maven { - url = "https://maven.zigythebird.com/mods" - credentials(PasswordCredentials) - authentication { - basic(BasicAuthentication) - } - } - } } diff --git a/forge/build.gradle b/forge/build.gradle index f2cf03d..44b4464 100644 --- a/forge/build.gradle +++ b/forge/build.gradle @@ -1,5 +1,9 @@ plugins { - id "com.github.johnrengelman.shadow" + id "com.gradleup.shadow" +} + +loom { + accessWidenerPath = project(":common").loom.accessWidenerPath } architectury { @@ -7,26 +11,22 @@ architectury { neoForge() } -loom { - accessWidenerPath = project(":common").loom.accessWidenerPath -} - configurations { common - shadowCommon // Don't use shadow from the shadow plugin because we don't want IDEA to index this. + shadowCommon compileClasspath.extendsFrom common runtimeClasspath.extendsFrom common developmentNeoForge.extendsFrom common } dependencies { - neoForge "net.neoforged:neoforge:${rootProject.forge_version}" + neoForge "net.neoforged:neoforge:${rootProject.neoforge_version}" common(project(path: ":common", configuration: "namedElements")) { transitive false } shadowCommon(project(path: ":common", configuration: "transformProductionNeoForge")) { transitive = false } + modImplementation "com.zigythebird.playeranim:PlayerAnimationLibNeo:${rootProject.player_anim_version}" modLocalRuntime "software.bernie.geckolib:geckolib-neoforge-${minecraft_version}:${geckolib_version}" - modLocalRuntime "com.zigythebird.playeranim:player_animation_library-neoforge-${minecraft_version}:${player_anim_version}" } processResources { @@ -42,7 +42,7 @@ shadowJar { exclude "architectury.common.json" configurations = [project.configurations.shadowCommon] - archiveClassifier.set("dev-shadow") + archiveClassifier.set "dev-shadow" } remapJar { @@ -50,11 +50,11 @@ remapJar { inputFile.set shadowJar.archiveFile dependsOn shadowJar - archiveClassifier.set(null) + archiveClassifier.set null } jar { - archiveClassifier.set("dev") + archiveClassifier.set "dev" } sourcesJar { @@ -71,31 +71,9 @@ components.java { publishing { publications { - maven(MavenPublication) { - groupId = "com.zigythebird.bendable_cuboids" - artifactId = "bendable_cuboids-neoforge-$minecraft_version" - version = rootProject.mod_version + mavenNeoForge(MavenPublication) { + artifactId = "BendableCuboidsNeo" from components.java } } - - repositories { - if(System.getenv("GITHUB_ACTOR") != null) { - maven { - name = "GitHubPackages" - url = "https://maven.pkg.github.com/zigythebird/bendable_cuboids" - credentials { - username = System.getenv("GITHUB_ACTOR") - password = System.getenv("GITHUB_TOKEN") - } - } - } - maven { - url = "https://maven.zigythebird.com/mods" - credentials(PasswordCredentials) - authentication { - basic(BasicAuthentication) - } - } - } } diff --git a/gradle.properties b/gradle.properties index 52618e9..1066f19 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,18 +1,18 @@ +# Done to increase the memory available to Gradle. org.gradle.jvmargs=-Xmx4G +org.gradle.parallel=true -mod_version=1.0.0+1.21.4 -maven_group=com.zigythebird.bendable_cuboids -archives_base_name=bendable_cuboids +# Mod properties +mod_version = 1.0.0 +maven_group = com.zigythebird.bendable_cuboids +archives_base_name = BendableCuboids -minecraft_version=1.21.4 -loader_version=0.16.9 +# Minecraft properties +minecraft_version = 1.21.6 +parchment_version = 2025.06.26-nightly-20250626.125431-1 -#Fabric api -fabric_version=0.112.2+1.21.4 - -#Forge thingy -forge_version=21.4.84-beta - -#Other mods -player_anim_version=0.5.0-BETA -geckolib_version=4.8.4 \ No newline at end of file +# Dependencies +fabric_loader_version = 0.16.14 +neoforge_version = 21.6.20-beta +player_anim_version=0.3.8+dev+mc1.21.6 +geckolib_version=5.2.0 diff --git a/settings.gradle b/settings.gradle index 5a5f8d2..ebd18d6 100644 --- a/settings.gradle +++ b/settings.gradle @@ -11,4 +11,4 @@ include("common") include("fabric") include("forge") -rootProject.name = "bendy-lib" +rootProject.name = "BendableCuboids" From 9a2d9158061bddaa7957347fe2de5c700ce18c8f Mon Sep 17 00:00:00 2001 From: dima-dencep Date: Wed, 2 Jul 2025 22:58:14 +0700 Subject: [PATCH 02/23] Update build.gradle --- fabric/build.gradle | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/fabric/build.gradle b/fabric/build.gradle index b7c76b8..1ab5a9d 100644 --- a/fabric/build.gradle +++ b/fabric/build.gradle @@ -37,6 +37,11 @@ processResources { } } +shadowJar { + configurations = [project.configurations.shadowCommon] + archiveClassifier.set "dev-shadow" +} + remapJar { injectAccessWidener = true From 8659179f4ee9b09fccd7dad033eccf15d308025c Mon Sep 17 00:00:00 2001 From: ZigyTheBird <105124180+ZigyTheBird@users.noreply.github.com> Date: Sat, 5 Jul 2025 10:10:21 +0330 Subject: [PATCH 03/23] Fixed a lot of the remaining issues --- .../bendable_cuboids/impl/BendUtil.java | 45 ++++++++----------- .../bendable_cuboids/impl/BendableCuboid.java | 21 ++++----- .../impl/compatibility/PlayerBendHelper.java | 8 ++-- .../geckolib/GeckoLibBendableCuboid.java | 6 +-- .../playeranim/CapeLayerMixin_playerAnim.java | 44 ++++++------------ .../ElytraLayerMixin_playerAnim.java | 37 ++++++++------- .../ItemInHandLayerMixin_playerAnim.java | 6 +-- .../LivingEntityMixin_playerAnim.java | 2 +- .../playeranim/ModelMixin_playerAnim.java | 2 +- .../PlayerModelMixin_playerAnim.java | 22 ++++----- .../PlayerRendererMixin_playerAnim.java | 5 ++- .../player_animations/bend_test.json | 10 ++--- 12 files changed, 93 insertions(+), 115 deletions(-) diff --git a/common/src/main/java/com/zigythebird/bendable_cuboids/impl/BendUtil.java b/common/src/main/java/com/zigythebird/bendable_cuboids/impl/BendUtil.java index 1542097..941ab46 100644 --- a/common/src/main/java/com/zigythebird/bendable_cuboids/impl/BendUtil.java +++ b/common/src/main/java/com/zigythebird/bendable_cuboids/impl/BendUtil.java @@ -1,6 +1,7 @@ package com.zigythebird.bendable_cuboids.impl; import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.math.Axis; import com.zigythebird.bendable_cuboids.impl.compatibility.PlayerBendHelper; import net.minecraft.client.model.HumanoidModel; import net.minecraft.client.model.PlayerModel; @@ -10,24 +11,22 @@ import java.lang.Math; public class BendUtil { - public static BendApplier getBend(BendableCuboid cuboid, float bendAxis, float bendValue) { - return getBend(cuboid.getBendDirection(), cuboid.getBendX(), cuboid.getBendY(), cuboid.getBendZ(), - cuboid.basePlane, cuboid.otherPlane, false, cuboid.bendHeight(), bendAxis, bendValue); + private static final Vector3f Z_AXIS = new Vector3f(0, 0, 1); + + public static BendApplier getBend(BendableCuboid cuboid, float bendValue) { + return getBend(cuboid.getBendX(), cuboid.getBendY(), cuboid.getBendZ(), + cuboid.basePlane, cuboid.otherPlane, false, cuboid.bendHeight(), bendValue); } /** * Applies the transformation to every position in posSupplier - * @param bendAxis axis for the bend * @param bendValue bend value */ - public static BendApplier getBend(Direction bendDirection, float bendX, float bendY, float bendZ, Plane basePlane, Plane otherPlane, - boolean mirrorBend, float bendHeight, float bendAxis, float bendValue) { - Vector3f axis = new Vector3f((float) Math.cos(bendAxis), 0, (float) Math.sin(bendAxis)); - Matrix3f matrix3f = new Matrix3f().set(bendDirection.getRotation()); - axis.mul(matrix3f); + public static BendApplier getBend(float bendX, float bendY, float bendZ, Plane basePlane, Plane otherPlane, + boolean mirrorBend, float bendHeight, float bendValue) { if (mirrorBend) bendValue *= -1; final float finalBend = bendValue; - Matrix4f transformMatrix = applyBendToMatrix(new Matrix4f(), bendX, bendY, bendZ, bendAxis, bendValue); + Matrix4f transformMatrix = applyBendToMatrix(new Matrix4f(), bendX, bendY, bendZ, bendValue); float halfSize = bendHeight/2; @@ -55,29 +54,25 @@ else if (distFromBase + distFromOther <= bendHeight && distFromOther > v) { }); } - public static BendApplier getBendLegacy(BendableCuboid cuboid, float bendAxis, float bendValue) { + public static BendApplier getBendLegacy(BendableCuboid cuboid, float bendValue) { return getBendLegacy(cuboid.getBendDirection(), cuboid.getBendX(), cuboid.getBendY(), cuboid.getBendZ(), - cuboid.basePlane, cuboid.otherPlane, cuboid.isBendInverted(), false, cuboid.bendHeight(), bendAxis, bendValue); + cuboid.basePlane, cuboid.otherPlane, cuboid.isBendInverted(), false, cuboid.bendHeight(), bendValue); } /** * Bends in the old pre-1.21.6 way which is more stretchy, but works in more situations, like for GeckoLib armor. - * @param bendAxis axis for the bend * @param bendValue bend value */ public static BendApplier getBendLegacy(Direction bendDirection, float bendX, float bendY, float bendZ, Plane basePlane, Plane otherPlane, - boolean isBendInverted, boolean mirrorBend, float bendHeight, float bendAxis, float bendValue) { - Vector3f axis = new Vector3f((float) Math.cos(bendAxis), 0, (float) Math.sin(bendAxis)); - Matrix3f matrix3f = new Matrix3f().set(bendDirection.getRotation()); - axis.mul(matrix3f); + boolean isBendInverted, boolean mirrorBend, float bendHeight, float bendValue) { if (mirrorBend) bendValue *= -1; final float finalBend = bendValue; - Matrix4f transformMatrix = applyBendToMatrix(new Matrix4f(), bendX, bendY, bendZ, bendAxis, bendValue); + Matrix4f transformMatrix = applyBendToMatrix(new Matrix4f(), bendX, bendY, bendZ, bendValue); Vector3f directionUnit; directionUnit = bendDirection.step(); - directionUnit.cross(axis); + directionUnit.cross(Z_AXIS); //parallel to the bend's axis and to the cube's bend direction Plane bendPlane = new Plane(directionUnit, new Vector3f(bendX, bendY, bendZ)); float halfSize = bendHeight/2; @@ -112,21 +107,17 @@ else if (isInBendArea) { }); } - public static Matrix4f applyBendToMatrix(Matrix4f transformMatrix, float bendX, float bendY, float bendZ, float bendAxis, float bendValue) { - Vector3f axis = new Vector3f((float) Math.cos(bendAxis), 0, (float) Math.sin(bendAxis)); - + public static Matrix4f applyBendToMatrix(Matrix4f transformMatrix, float bendX, float bendY, float bendZ, float bendValue) { transformMatrix.translate(bendX, bendY, bendZ); - transformMatrix.rotate(bendValue, axis); + transformMatrix.rotateX(bendValue); transformMatrix.translate(-bendX, -bendY, -bendZ); return transformMatrix; } - public static PoseStack applyBendToMatrix(PoseStack transformMatrix, float bendX, float bendY, float bendZ, float bendAxis, float bendValue) { - Vector3f axis = new Vector3f((float) Math.cos(bendAxis), 0, (float) Math.sin(bendAxis)); - + public static PoseStack applyBendToMatrix(PoseStack transformMatrix, float bendX, float bendY, float bendZ, float bendValue) { transformMatrix.translate(bendX, bendY, bendZ); - transformMatrix.mulPose(new Quaternionf().rotateAxis(bendValue, axis)); + transformMatrix.mulPose(Axis.XP.rotation(bendValue)); transformMatrix.translate(-bendX, -bendY, -bendZ); return transformMatrix; diff --git a/common/src/main/java/com/zigythebird/bendable_cuboids/impl/BendableCuboid.java b/common/src/main/java/com/zigythebird/bendable_cuboids/impl/BendableCuboid.java index ebbcfe1..2a37c86 100644 --- a/common/src/main/java/com/zigythebird/bendable_cuboids/impl/BendableCuboid.java +++ b/common/src/main/java/com/zigythebird/bendable_cuboids/impl/BendableCuboid.java @@ -31,7 +31,7 @@ public class BendableCuboid { protected final Plane otherPlane; protected final float fullSize; - protected float bend, bendAxis; + protected float bend; /** * To see how you can make existing model parts bendable look at {@link PlayerBendHelper} @@ -48,25 +48,24 @@ public BendableCuboid(Quad[] sides, RememberingPos[] positions, float fixX, floa this.otherPlane = otherPlane; this.fullSize = fullSize; - this.applyBend(0, 0);//Init values to render + this.applyBend(0);//Init values to render } /** * Apply bend on this cuboid * Values are in radians - * @param bendAxis bend axis (rotY can be used instead) * @param bendValue bend value (Same as rotX) * @return Transformation matrix for transforming children */ - public Matrix4f applyBend(float bendAxis, float bendValue) { - this.bend = bendValue; this.bendAxis = bendAxis; - BendApplier bendApplier = BendUtil.getBend(this, bendAxis, bendValue); + public Matrix4f applyBend(float bendValue) { + this.bend = bendValue; + BendApplier bendApplier = BendUtil.getBend(this, bendValue); this.iteratePositions(bendApplier.consumer()); return bendApplier.matrix4f(); } - public Matrix4f applyBendDegrees(float bendAxis, float bendValue) { - return applyBend(bendAxis * Mth.DEG_TO_RAD, bendValue * Mth.DEG_TO_RAD); + public Matrix4f applyBendDegrees(float bendValue) { + return applyBend(bendValue * Mth.DEG_TO_RAD); } public Direction getBendDirection() { @@ -117,10 +116,6 @@ public float getBend() { return bend; } - public float getBendAxis() { - return bendAxis; - } - public void render(PoseStack.Pose matrices, VertexConsumer vertexConsumer, int light, int overlay, int color) { for(Quad quad:sides) { quad.render(matrices, vertexConsumer, light, overlay, color); @@ -129,7 +124,7 @@ public void render(PoseStack.Pose matrices, VertexConsumer vertexConsumer, int l public void copyState(BendableCuboid other) { if(other instanceof BendableCuboid b){ - this.applyBend(b.bendAxis, b.bend); //This works only in J16 or higher + this.applyBend(b.bend); //This works only in J16 or higher } } diff --git a/common/src/main/java/com/zigythebird/bendable_cuboids/impl/compatibility/PlayerBendHelper.java b/common/src/main/java/com/zigythebird/bendable_cuboids/impl/compatibility/PlayerBendHelper.java index e36ea29..b884dcf 100644 --- a/common/src/main/java/com/zigythebird/bendable_cuboids/impl/compatibility/PlayerBendHelper.java +++ b/common/src/main/java/com/zigythebird/bendable_cuboids/impl/compatibility/PlayerBendHelper.java @@ -11,14 +11,14 @@ import java.util.Optional; public class PlayerBendHelper { - public static void bend(ModelPart modelPart, float axis, float rotation) { + public static void bend(ModelPart modelPart, float rotation) { Optional optionalMutableCuboid = ModelPartAccessor.optionalGetCuboid(modelPart, 0); if (optionalMutableCuboid.isPresent()) { MutableCuboid cuboid = optionalMutableCuboid.get(); // Don't enable bend until rotation is bigger than epsilon. // This should avoid unnecessary heavy calculations. if (Math.abs(rotation) >= 0.0001f && cuboid.bendableCuboids$hasMutator("bend")) { - cuboid.bendableCuboids$getAndActivateMutator("bend").applyBend(axis, rotation); + cuboid.bendableCuboids$getAndActivateMutator("bend").applyBend(rotation); } else cuboid.bendableCuboids$getAndActivateMutator(null); } @@ -36,7 +36,7 @@ public static void initCapeBend(ModelPart modelPart) { })); } - public static void applyTorsoBendToMatrix(PoseStack poseStack, float axis, float bend) { - BendUtil.applyBendToMatrix(poseStack, 0, 0.375F, 0, axis, bend); + public static void applyTorsoBendToMatrix(PoseStack poseStack, float bend) { + BendUtil.applyBendToMatrix(poseStack, 0, 0.375F, 0, bend); } } diff --git a/common/src/main/java/com/zigythebird/bendable_cuboids/impl/compatibility/geckolib/GeckoLibBendableCuboid.java b/common/src/main/java/com/zigythebird/bendable_cuboids/impl/compatibility/geckolib/GeckoLibBendableCuboid.java index 46ab927..491337c 100644 --- a/common/src/main/java/com/zigythebird/bendable_cuboids/impl/compatibility/geckolib/GeckoLibBendableCuboid.java +++ b/common/src/main/java/com/zigythebird/bendable_cuboids/impl/compatibility/geckolib/GeckoLibBendableCuboid.java @@ -12,10 +12,10 @@ public GeckoLibBendableCuboid(Quad[] sides, RememberingPos[] positions, float fi super(sides, positions, fixX, fixY, fixZ, direction, basePlane, otherPlane, fullSize); } - public Matrix4f applyBend(float bendAxis, float bendValue, PoseStack poseStack) { - this.bend = bendValue; this.bendAxis = bendAxis; + public Matrix4f applyBend(float bendValue, PoseStack poseStack) { + this.bend = bendValue; BendApplier bendApplier = BendUtil.getBendLegacy(this.getBendDirection(), this.getBendX(), this.getBendY(), this.getBendZ(), - this.basePlane, this.otherPlane, this.isBendInverted(), direction == Direction.UP, this.bendHeight(), bendAxis, direction == Direction.UP ? bendValue : -bendValue); + this.basePlane, this.otherPlane, this.isBendInverted(), direction == Direction.UP, this.bendHeight(), direction == Direction.UP ? bendValue : -bendValue); this.iteratePositions(vector3f -> { Vector4f vector = new Vector4f(vector3f.x, vector3f.y, vector3f.z, 1).mul(poseStack.last().pose()); Vector3f vector3f1 = bendApplier.consumer().apply(new Vector3f(vector.x, vector.y, vector.z)); diff --git a/common/src/main/java/com/zigythebird/bendable_cuboids/mixin/playeranim/CapeLayerMixin_playerAnim.java b/common/src/main/java/com/zigythebird/bendable_cuboids/mixin/playeranim/CapeLayerMixin_playerAnim.java index 3b59071..8247625 100644 --- a/common/src/main/java/com/zigythebird/bendable_cuboids/mixin/playeranim/CapeLayerMixin_playerAnim.java +++ b/common/src/main/java/com/zigythebird/bendable_cuboids/mixin/playeranim/CapeLayerMixin_playerAnim.java @@ -1,6 +1,7 @@ package com.zigythebird.bendable_cuboids.mixin.playeranim; import com.llamalad7.mixinextras.injector.v2.WrapWithCondition; +import com.llamalad7.mixinextras.sugar.Local; import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.math.Axis; import com.zigythebird.bendable_cuboids.impl.compatibility.PlayerBendHelper; @@ -11,15 +12,12 @@ import com.zigythebird.playeranimcore.bones.PlayerAnimBone; import net.minecraft.client.model.HumanoidModel; import net.minecraft.client.model.PlayerModel; -import net.minecraft.client.model.geom.EntityModelSet; import net.minecraft.client.model.geom.ModelPart; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.entity.RenderLayerParent; import net.minecraft.client.renderer.entity.layers.CapeLayer; import net.minecraft.client.renderer.entity.layers.RenderLayer; -import net.minecraft.client.renderer.entity.state.HumanoidRenderState; import net.minecraft.client.renderer.entity.state.PlayerRenderState; -import net.minecraft.client.resources.model.EquipmentAssetManager; import org.joml.Quaternionf; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; @@ -29,53 +27,39 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @Mixin(CapeLayer.class) -@SuppressWarnings({"UnstableApiUsage","rawtypes"}) -public abstract class CapeLayerMixin_playerAnim extends RenderLayer { +public abstract class CapeLayerMixin_playerAnim extends RenderLayer { @Shadow @Final private HumanoidModel model; - @Inject(method = "", at = @At("TAIL")) - private void init(RenderLayerParent renderLayerParent, EntityModelSet entityModelSet, EquipmentAssetManager equipmentAssetManager, CallbackInfo ci) { - PlayerBendHelper.initCapeBend(((PlayerCapeModelAccessor_playerAnim)model).getCape()); - } - - public CapeLayerMixin_playerAnim(RenderLayerParent renderLayerParent) { + private CapeLayerMixin_playerAnim(RenderLayerParent renderLayerParent, Void v) { super(renderLayerParent); } @Inject(method = "render(Lcom/mojang/blaze3d/vertex/PoseStack;Lnet/minecraft/client/renderer/MultiBufferSource;ILnet/minecraft/client/renderer/entity/state/PlayerRenderState;FF)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/model/HumanoidModel;renderToBuffer(Lcom/mojang/blaze3d/vertex/PoseStack;Lcom/mojang/blaze3d/vertex/VertexConsumer;II)V")) private void render(PoseStack poseStack, MultiBufferSource multiBufferSource, int i, PlayerRenderState playerRenderState, float f, float g, CallbackInfo ci) { - PlayerAnimManager emote = ((IPlayerAnimationState) playerRenderState).playerAnimLib$getAnimManager(); if (model instanceof CapeLayerAccessor capeLayer) { - if (emote.isActive()) { - PlayerAnimBone bone = ((IPlayerAnimationState) playerRenderState).playerAnimLib$getAnimProcessor().getBone("torso"); - emote.get3DTransform(bone); + PlayerAnimManager emote = ((IPlayerAnimationState)playerRenderState).playerAnimLib$getAnimManager(); + if (emote != null && emote.isActive()) { ModelPart torso = this.getParentModel().body; + PlayerAnimBone bone = ((IPlayerAnimationState)playerRenderState).playerAnimLib$getAnimProcessor().getBone("cape"); poseStack.translate(torso.x / 16, torso.y / 16, torso.z / 16); - poseStack.mulPose((new Quaternionf()).rotateXYZ(torso.xRot, torso.yRot, torso.zRot)); - PlayerBendHelper.applyTorsoBendToMatrix(poseStack, 0, bone.getBend()); + poseStack.mulPose((new Quaternionf()).rotateZYX(torso.zRot, torso.yRot, torso.xRot)); + PlayerBendHelper.applyTorsoBendToMatrix(poseStack, bone.getBend()); poseStack.translate(0.0F, 0.0F, 0.125F); - poseStack.mulPose(Axis.YP.rotationDegrees(180)); + poseStack.mulPose(Axis.YP.rotation(3.14159f)); ModelPart part = capeLayer.getCape(); - PlayerAnimBone bone1 = ((IPlayerAnimationState)playerRenderState).playerAnimLib$getAnimProcessor().getBone("cape"); - bone1.setToInitialPose(); - // bone1.setBendAxis(bone.getBendAxis()); - bone1.setBend(bone.getBend()); - emote.get3DTransform(bone1); - - RenderUtil.translatePartToBone(part, bone1, part.getInitialPose()); + bone.setToInitialPose(); + emote.get3DTransform(bone); - PlayerBendHelper.bend(part, 0, bone1.getBend()); - } else { - PlayerBendHelper.bend(capeLayer.getCape(), 0, 0); + RenderUtil.translatePartToBone(part, bone); } } } - @WrapWithCondition(method = "render(Lcom/mojang/blaze3d/vertex/PoseStack;Lnet/minecraft/client/renderer/MultiBufferSource;ILnet/minecraft/client/renderer/entity/state/PlayerRenderState;FF)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/model/HumanoidModel;setupAnim(Lnet/minecraft/client/renderer/entity/state/HumanoidRenderState;)V")) - private boolean setupAnim(HumanoidModel instance, T playerRenderState) { + @WrapWithCondition(method = "render(Lcom/mojang/blaze3d/vertex/PoseStack;Lnet/minecraft/client/renderer/MultiBufferSource;ILnet/minecraft/client/renderer/entity/state/PlayerRenderState;FF)V", at = @At(value = "INVOKE", target = "Lcom/mojang/blaze3d/vertex/PoseStack;translate(FFF)V")) + private boolean translate(PoseStack instance, float f, float g, float h, @Local(argsOnly = true) PlayerRenderState playerRenderState) { PlayerAnimManager emote = ((IPlayerAnimationState)playerRenderState).playerAnimLib$getAnimManager(); return emote == null || !emote.isActive(); } diff --git a/common/src/main/java/com/zigythebird/bendable_cuboids/mixin/playeranim/ElytraLayerMixin_playerAnim.java b/common/src/main/java/com/zigythebird/bendable_cuboids/mixin/playeranim/ElytraLayerMixin_playerAnim.java index e5254b9..dcd32a7 100644 --- a/common/src/main/java/com/zigythebird/bendable_cuboids/mixin/playeranim/ElytraLayerMixin_playerAnim.java +++ b/common/src/main/java/com/zigythebird/bendable_cuboids/mixin/playeranim/ElytraLayerMixin_playerAnim.java @@ -4,6 +4,8 @@ import com.zigythebird.bendable_cuboids.impl.compatibility.PlayerBendHelper; import com.zigythebird.playeranim.accessors.IPlayerAnimationState; import com.zigythebird.playeranim.animation.PlayerAnimManager; +import com.zigythebird.playeranim.util.RenderUtil; +import com.zigythebird.playeranimcore.animation.AnimationProcessor; import com.zigythebird.playeranimcore.bones.PlayerAnimBone; import net.minecraft.client.model.EntityModel; import net.minecraft.client.renderer.MultiBufferSource; @@ -11,7 +13,6 @@ import net.minecraft.client.renderer.entity.layers.RenderLayer; import net.minecraft.client.renderer.entity.layers.WingsLayer; import net.minecraft.client.renderer.entity.state.HumanoidRenderState; -import org.joml.Quaternionf; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; @@ -24,23 +25,29 @@ public ElytraLayerMixin_playerAnim(RenderLayerParent renderLayerParent) { super(renderLayerParent); } - @Inject(method = "render(Lcom/mojang/blaze3d/vertex/PoseStack;Lnet/minecraft/client/renderer/MultiBufferSource;ILnet/minecraft/client/renderer/entity/state/HumanoidRenderState;FF)V", at = @At(value = "INVOKE", target = "Lcom/mojang/blaze3d/vertex/PoseStack;translate(FFF)V")) + @Inject(method = "render(Lcom/mojang/blaze3d/vertex/PoseStack;Lnet/minecraft/client/renderer/MultiBufferSource;ILnet/minecraft/client/renderer/entity/state/HumanoidRenderState;FF)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/entity/layers/EquipmentLayerRenderer;renderLayers(Lnet/minecraft/client/resources/model/EquipmentClientInfo$LayerType;Lnet/minecraft/resources/ResourceKey;Lnet/minecraft/client/model/Model;Lnet/minecraft/world/item/ItemStack;Lcom/mojang/blaze3d/vertex/PoseStack;Lnet/minecraft/client/renderer/MultiBufferSource;ILnet/minecraft/resources/ResourceLocation;)V")) private void inject(PoseStack poseStack, MultiBufferSource multiBufferSource, int i, S humanoidRenderState, float f, float g, CallbackInfo ci) { if (humanoidRenderState instanceof IPlayerAnimationState animationState) { PlayerAnimManager emote = animationState.playerAnimLib$getAnimManager(); - if (emote.isActive()) { - PlayerAnimBone bone = animationState.playerAnimLib$getAnimProcessor().getBone("torso"); - PlayerAnimBone bone1 = animationState.playerAnimLib$getAnimProcessor().getBone("cape"); - PlayerAnimBone bone2 = animationState.playerAnimLib$getAnimProcessor().getBone("elytra"); - emote.get3DTransform(bone); - bone1.copyOtherBone(bone); - emote.get3DTransform(bone1); - bone2.copyOtherBone(bone1); - emote.get3DTransform(bone2); - poseStack.translate(bone2.getPosX() / 16, bone2.getPosX() / 16, bone2.getPosX() / 16); - poseStack.mulPose((new Quaternionf()).rotateXYZ(-bone2.getRotX(), bone2.getRotY(), -bone2.getRotZ())); - poseStack.scale(bone2.getScaleX(), bone2.getScaleY(), bone2.getScaleZ()); - PlayerBendHelper.applyTorsoBendToMatrix(poseStack, 0, bone.getBend()); + if (emote != null && emote.isActive()) { + AnimationProcessor processor = animationState.playerAnimLib$getAnimProcessor(); + PlayerAnimBone torso = processor.getBone("torso"); + PlayerAnimBone cape = processor.getBone("cape"); + PlayerAnimBone elytra = processor.getBone("elytra"); + torso.setToInitialPose(); + cape.setToInitialPose(); + elytra.setToInitialPose(); + emote.get3DTransform(torso); + emote.get3DTransform(cape); + emote.get3DTransform(elytra); + elytra.applyOtherBone(cape); + elytra.mulPos(-1); + elytra.mulRot(-1, 1, -1); + torso.positionY *= -1; + float bend = elytra.getBend(); + elytra.applyOtherBone(torso); + RenderUtil.translateMatrixToBone(poseStack, elytra); + PlayerBendHelper.applyTorsoBendToMatrix(poseStack, bend); } } } diff --git a/common/src/main/java/com/zigythebird/bendable_cuboids/mixin/playeranim/ItemInHandLayerMixin_playerAnim.java b/common/src/main/java/com/zigythebird/bendable_cuboids/mixin/playeranim/ItemInHandLayerMixin_playerAnim.java index c0feffd..2897535 100644 --- a/common/src/main/java/com/zigythebird/bendable_cuboids/mixin/playeranim/ItemInHandLayerMixin_playerAnim.java +++ b/common/src/main/java/com/zigythebird/bendable_cuboids/mixin/playeranim/ItemInHandLayerMixin_playerAnim.java @@ -1,6 +1,7 @@ package com.zigythebird.bendable_cuboids.mixin.playeranim; import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.math.Axis; import com.zigythebird.playeranim.accessors.IPlayerAnimationState; import com.zigythebird.playeranimcore.bones.PlayerAnimBone; import net.minecraft.client.renderer.MultiBufferSource; @@ -8,8 +9,6 @@ import net.minecraft.client.renderer.entity.state.ArmedEntityRenderState; import net.minecraft.client.renderer.item.ItemStackRenderState; import net.minecraft.world.entity.HumanoidArm; -import org.joml.Quaternionf; -import org.joml.Vector3f; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; @@ -26,8 +25,7 @@ private void renderMixin(S armedEntityRenderState, ItemStackRenderState itemStac state.playerAnimLib$getAnimManager().get3DTransform(bone); float offset = 0.25f; poseStack.translate(0, offset, 0); - Vector3f axis = new Vector3f((float) Math.cos(-0), 0, (float) -Math.sin(-0)); - poseStack.mulPose(new Quaternionf().rotateAxis(bone.getBend(), axis)); + poseStack.mulPose(Axis.XP.rotation(bone.getBend())); poseStack.translate(0, - offset, 0); } } diff --git a/common/src/main/java/com/zigythebird/bendable_cuboids/mixin/playeranim/LivingEntityMixin_playerAnim.java b/common/src/main/java/com/zigythebird/bendable_cuboids/mixin/playeranim/LivingEntityMixin_playerAnim.java index 9dd87c8..68110a8 100644 --- a/common/src/main/java/com/zigythebird/bendable_cuboids/mixin/playeranim/LivingEntityMixin_playerAnim.java +++ b/common/src/main/java/com/zigythebird/bendable_cuboids/mixin/playeranim/LivingEntityMixin_playerAnim.java @@ -24,7 +24,7 @@ private void inject(S livingEntityRenderState, PoseStack poseStack, MultiBufferS if (livingEntityRenderState instanceof IPlayerAnimationState state && state.playerAnimLib$getAnimManager().isActive() && ((IUpperPartHelper) layer).playerAnimLib$isUpperPart()) { PlayerAnimBone bone = state.playerAnimLib$getAnimProcessor().getBone("torso"); state.playerAnimLib$getAnimManager().get3DTransform(bone); - PlayerBendHelper.applyTorsoBendToMatrix(poseStack, 0, bone.getBend()); + PlayerBendHelper.applyTorsoBendToMatrix(poseStack, bone.getBend()); } } } diff --git a/common/src/main/java/com/zigythebird/bendable_cuboids/mixin/playeranim/ModelMixin_playerAnim.java b/common/src/main/java/com/zigythebird/bendable_cuboids/mixin/playeranim/ModelMixin_playerAnim.java index e559307..88699a9 100644 --- a/common/src/main/java/com/zigythebird/bendable_cuboids/mixin/playeranim/ModelMixin_playerAnim.java +++ b/common/src/main/java/com/zigythebird/bendable_cuboids/mixin/playeranim/ModelMixin_playerAnim.java @@ -29,7 +29,7 @@ public void renderToBuffer(PoseStack matrices, VertexConsumer vertices, int ligh PlayerAnimManager emoteSupplier = ((IMutableModel)playerModel).playerAnimLib$getAnimation(); PlayerAnimBone bone = new PlayerAnimBone("torso"); emoteSupplier.get3DTransform(bone); - PlayerBendHelper.applyTorsoBendToMatrix(matrices, 0, bone.getBend()); + PlayerBendHelper.applyTorsoBendToMatrix(matrices, bone.getBend()); ((PlayerModelAccessor_playerAnim)playerModel).getBodyParts().forEach((part)->{ if(((IUpperPartHelper) part).playerAnimLib$isUpperPart()){ part.render(matrices, vertices, light, overlay, color); diff --git a/common/src/main/java/com/zigythebird/bendable_cuboids/mixin/playeranim/PlayerModelMixin_playerAnim.java b/common/src/main/java/com/zigythebird/bendable_cuboids/mixin/playeranim/PlayerModelMixin_playerAnim.java index 9915abb..699ebd4 100644 --- a/common/src/main/java/com/zigythebird/bendable_cuboids/mixin/playeranim/PlayerModelMixin_playerAnim.java +++ b/common/src/main/java/com/zigythebird/bendable_cuboids/mixin/playeranim/PlayerModelMixin_playerAnim.java @@ -40,17 +40,17 @@ private void setupPlayerAnimation(PlayerRenderState playerRenderState, CallbackI PlayerAnimBone rightLeg = processor.getBone("right_leg"); PlayerAnimBone leftLeg = processor.getBone("left_leg"); - PlayerBendHelper.bend(model.body, 0, torso.getBend()); - PlayerBendHelper.bend(model.rightArm, 0, rightArm.getBend()); - PlayerBendHelper.bend(model.leftArm, 0, leftArm.getBend()); - PlayerBendHelper.bend(model.rightLeg, 0, rightLeg.getBend()); - PlayerBendHelper.bend(model.leftLeg, 0, leftLeg.getBend()); + PlayerBendHelper.bend(model.body, torso.getBend()); + PlayerBendHelper.bend(model.rightArm, rightArm.getBend()); + PlayerBendHelper.bend(model.leftArm, leftArm.getBend()); + PlayerBendHelper.bend(model.rightLeg, rightLeg.getBend()); + PlayerBendHelper.bend(model.leftLeg, leftLeg.getBend()); - PlayerBendHelper.bend(model.jacket, 0, torso.getBend()); - PlayerBendHelper.bend(model.rightSleeve, 0, rightArm.getBend()); - PlayerBendHelper.bend(model.leftSleeve, 0, leftArm.getBend()); - PlayerBendHelper.bend(model.rightPants, 0, rightLeg.getBend()); - PlayerBendHelper.bend(model.leftPants, 0, leftLeg.getBend()); + PlayerBendHelper.bend(model.jacket, torso.getBend()); + PlayerBendHelper.bend(model.rightSleeve, rightArm.getBend()); + PlayerBendHelper.bend(model.leftSleeve, leftArm.getBend()); + PlayerBendHelper.bend(model.rightPants, rightLeg.getBend()); + PlayerBendHelper.bend(model.leftPants, leftLeg.getBend()); } else { resetBend(model.body); @@ -69,6 +69,6 @@ private void setupPlayerAnimation(PlayerRenderState playerRenderState, CallbackI @Unique private static void resetBend(ModelPart part) { - PlayerBendHelper.bend(part, 0, 0); + PlayerBendHelper.bend(part, 0); } } diff --git a/common/src/main/java/com/zigythebird/bendable_cuboids/mixin/playeranim/PlayerRendererMixin_playerAnim.java b/common/src/main/java/com/zigythebird/bendable_cuboids/mixin/playeranim/PlayerRendererMixin_playerAnim.java index 03dc37f..13d2001 100644 --- a/common/src/main/java/com/zigythebird/bendable_cuboids/mixin/playeranim/PlayerRendererMixin_playerAnim.java +++ b/common/src/main/java/com/zigythebird/bendable_cuboids/mixin/playeranim/PlayerRendererMixin_playerAnim.java @@ -27,7 +27,10 @@ public PlayerRendererMixin_playerAnim(EntityRendererProvider.Context context, Pl @Inject(method = "renderHand", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/model/geom/ModelPart;render(Lcom/mojang/blaze3d/vertex/PoseStack;Lcom/mojang/blaze3d/vertex/VertexConsumer;II)V")) private void renderHand(PoseStack poseStack, MultiBufferSource multiBufferSource, int i, ResourceLocation resourceLocation, ModelPart modelPart, boolean bl, CallbackInfo ci) { if (((IMutableModel)this.getModel()).playerAnimLib$getAnimation() == null || !((IMutableModel)this.getModel()).playerAnimLib$getAnimation().getFirstPersonMode().isEnabled()) { - PlayerBendHelper.bend(modelPart, 0, 0); + PlayerModel playermodel = (PlayerModel)this.getModel(); + PlayerBendHelper.bend(modelPart, 0); + PlayerBendHelper.bend(playermodel.rightSleeve, 0); + PlayerBendHelper.bend(playermodel.leftSleeve, 0); } } } diff --git a/common/src/main/resources/assets/bendable_cuboids/player_animations/bend_test.json b/common/src/main/resources/assets/bendable_cuboids/player_animations/bend_test.json index ec40752..526d017 100644 --- a/common/src/main/resources/assets/bendable_cuboids/player_animations/bend_test.json +++ b/common/src/main/resources/assets/bendable_cuboids/player_animations/bend_test.json @@ -6,27 +6,27 @@ "bones": { "torso": { "bend": { - "vector": [0, 25, 0] + "vector": [25, 0, 0] } }, "right_arm": { "bend": { - "vector": [0, -62.5, 0] + "vector": [-62.5, 0, 0] } }, "left_arm": { "bend": { - "vector": [0, -47.5, 0] + "vector": [-47.5, 0, 0] } }, "head": { "bend": { - "vector": [0, 30, 0] + "vector": [30, 0, 0] } }, "left_leg": { "bend": { - "vector": [0, -35, 0] + "vector": [-35, 0, 0] } } } From 119999d1413a94ffc61b45805f3e1fc576bc84c4 Mon Sep 17 00:00:00 2001 From: ZigyTheBird <105124180+ZigyTheBird@users.noreply.github.com> Date: Sat, 5 Jul 2025 12:28:06 +0330 Subject: [PATCH 04/23] Don't include test anims in built jar --- build.gradle | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/build.gradle b/build.gradle index 0e431ce..ad402e9 100644 --- a/build.gradle +++ b/build.gradle @@ -71,6 +71,11 @@ allprojects { options.release.set 21 } + jar { + if (!rootProject.version.toString().contains("dev") && !project.gradle.startParameter.taskNames.contains("runClient")) + processResources.exclude('assets/bendable_cuboids/player_animations/*') + } + java { withSourcesJar() } From f079254fc54b51b26b3fab2f8162dc3a02b90cd1 Mon Sep 17 00:00:00 2001 From: ZigyTheBird <105124180+ZigyTheBird@users.noreply.github.com> Date: Mon, 7 Jul 2025 22:55:47 +0330 Subject: [PATCH 05/23] GeckoLib armor compat needs more love (removed) --- build.gradle | 14 --- common/build.gradle | 4 - .../bendable_cuboids/ModMixinPlugin.java | 8 +- .../geckolib/GeckoLibBendableCuboid.java | 28 ----- .../GeckoLibBendableCuboidBuilder.java | 114 ------------------ .../geckolib/GeckoRenderUtil.java | 46 ------- .../geckolib/GeoCubeAccessor.java | 8 -- .../geckolib/GeoCubeMixin_geckoOnly.java | 24 ---- .../geckolib/GeoRendererMixin_geckoOnly.java | 103 ---------------- fabric/build.gradle | 1 - forge/build.gradle | 1 - 11 files changed, 1 insertion(+), 350 deletions(-) delete mode 100644 common/src/main/java/com/zigythebird/bendable_cuboids/impl/compatibility/geckolib/GeckoLibBendableCuboid.java delete mode 100644 common/src/main/java/com/zigythebird/bendable_cuboids/impl/compatibility/geckolib/GeckoLibBendableCuboidBuilder.java delete mode 100644 common/src/main/java/com/zigythebird/bendable_cuboids/impl/compatibility/geckolib/GeckoRenderUtil.java delete mode 100644 common/src/main/java/com/zigythebird/bendable_cuboids/impl/compatibility/geckolib/GeoCubeAccessor.java delete mode 100644 common/src/main/java/com/zigythebird/bendable_cuboids/mixin/geckolib/GeoCubeMixin_geckoOnly.java delete mode 100644 common/src/main/java/com/zigythebird/bendable_cuboids/mixin/geckolib/GeoRendererMixin_geckoOnly.java diff --git a/build.gradle b/build.gradle index ad402e9..7cc7630 100644 --- a/build.gradle +++ b/build.gradle @@ -50,20 +50,6 @@ allprojects { url = "https://repo.redlance.org/public" } mavenLocal() - maven { - name = "Modrinth" - url = "https://api.modrinth.com/maven" - content { - includeGroup "maven.modrinth" - } - } - maven { - name = 'GeckoLib' - url 'https://dl.cloudsmith.io/public/geckolib3/geckolib/maven/' - content { - includeGroup("software.bernie.geckolib") - } - } } tasks.withType(JavaCompile) { diff --git a/common/build.gradle b/common/build.gradle index 8d6e829..aceabb2 100644 --- a/common/build.gradle +++ b/common/build.gradle @@ -9,12 +9,8 @@ loom { dependencies { modImplementation "net.fabricmc:fabric-loader:${rootProject.fabric_loader_version}" - modCompileOnly "software.bernie.geckolib:geckolib-fabric-${rootProject.minecraft_version}:${rootProject.geckolib_version}" modCompileOnly "com.zigythebird.playeranim:PlayerAnimationLibCommon:${rootProject.player_anim_version}" compileOnly "com.zigythebird.playeranim:PlayerAnimationLibCore:${rootProject.player_anim_version}" - - // third-party - modCompileOnly "maven.modrinth:3dskinlayers:D4TLEY5I" } publishing { diff --git a/common/src/main/java/com/zigythebird/bendable_cuboids/ModMixinPlugin.java b/common/src/main/java/com/zigythebird/bendable_cuboids/ModMixinPlugin.java index be53520..3d3e66a 100644 --- a/common/src/main/java/com/zigythebird/bendable_cuboids/ModMixinPlugin.java +++ b/common/src/main/java/com/zigythebird/bendable_cuboids/ModMixinPlugin.java @@ -12,13 +12,7 @@ public class ModMixinPlugin implements IMixinConfigPlugin { @Override public boolean shouldApplyMixin(String targetClassName, String mixinClassName) { - if (mixinClassName.endsWith("_geckoOnly") && !hasClass("software.bernie.geckolib.GeckoLib")) { - return false; - } - if (mixinClassName.endsWith("_playerAnim") && !hasClass("com.zigythebird.playeranim.PlayerAnimLibMod")) { - return false; - } - return true; + return !mixinClassName.endsWith("_playerAnim") || hasClass("com.zigythebird.playeranim.PlayerAnimLibMod"); } private static boolean hasClass(String name) { diff --git a/common/src/main/java/com/zigythebird/bendable_cuboids/impl/compatibility/geckolib/GeckoLibBendableCuboid.java b/common/src/main/java/com/zigythebird/bendable_cuboids/impl/compatibility/geckolib/GeckoLibBendableCuboid.java deleted file mode 100644 index 491337c..0000000 --- a/common/src/main/java/com/zigythebird/bendable_cuboids/impl/compatibility/geckolib/GeckoLibBendableCuboid.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.zigythebird.bendable_cuboids.impl.compatibility.geckolib; - -import com.mojang.blaze3d.vertex.PoseStack; -import com.zigythebird.bendable_cuboids.impl.*; -import net.minecraft.core.Direction; -import org.joml.Matrix4f; -import org.joml.Vector3f; -import org.joml.Vector4f; - -public class GeckoLibBendableCuboid extends BendableCuboid { - public GeckoLibBendableCuboid(Quad[] sides, RememberingPos[] positions, float fixX, float fixY, float fixZ, Direction direction, Plane basePlane, Plane otherPlane, float fullSize) { - super(sides, positions, fixX, fixY, fixZ, direction, basePlane, otherPlane, fullSize); - } - - public Matrix4f applyBend(float bendValue, PoseStack poseStack) { - this.bend = bendValue; - BendApplier bendApplier = BendUtil.getBendLegacy(this.getBendDirection(), this.getBendX(), this.getBendY(), this.getBendZ(), - this.basePlane, this.otherPlane, this.isBendInverted(), direction == Direction.UP, this.bendHeight(), direction == Direction.UP ? bendValue : -bendValue); - this.iteratePositions(vector3f -> { - Vector4f vector = new Vector4f(vector3f.x, vector3f.y, vector3f.z, 1).mul(poseStack.last().pose()); - Vector3f vector3f1 = bendApplier.consumer().apply(new Vector3f(vector.x, vector.y, vector.z)); - vector.set(vector3f1.x, vector3f1.y, vector3f1.z, 1); - vector.mul(poseStack.last().pose().invert(new Matrix4f())); - return vector3f.set(vector.x, vector.y, vector.z); - }); - return bendApplier.matrix4f(); - } -} diff --git a/common/src/main/java/com/zigythebird/bendable_cuboids/impl/compatibility/geckolib/GeckoLibBendableCuboidBuilder.java b/common/src/main/java/com/zigythebird/bendable_cuboids/impl/compatibility/geckolib/GeckoLibBendableCuboidBuilder.java deleted file mode 100644 index bea2580..0000000 --- a/common/src/main/java/com/zigythebird/bendable_cuboids/impl/compatibility/geckolib/GeckoLibBendableCuboidBuilder.java +++ /dev/null @@ -1,114 +0,0 @@ -package com.zigythebird.bendable_cuboids.impl.compatibility.geckolib; - -import com.zigythebird.bendable_cuboids.impl.*; -import org.joml.Vector3f; -import software.bernie.geckolib.cache.object.BakedGeoModel; -import software.bernie.geckolib.cache.object.GeoCube; -import software.bernie.geckolib.cache.object.GeoQuad; -import software.bernie.geckolib.cache.object.GeoVertex; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashMap; - -public class GeckoLibBendableCuboidBuilder extends BendableCuboidBuilder { - public GeckoLibBendableCuboid build(GeoCube cube, BakedGeoModel model, String root) { - ArrayList planes = new ArrayList<>(); - HashMap positions = new HashMap<>(); - - GeoVertex geoVertex1 = cube.quads()[2].vertices()[3]; - GeoVertex geoVertex2 = cube.quads()[2].vertices()[2]; - GeoVertex geoVertex3 = cube.quads()[2].vertices()[1]; - GeoVertex geoVertex4 = cube.quads()[2].vertices()[0]; - GeoVertex geoVertex5 = cube.quads()[3].vertices()[2]; - GeoVertex geoVertex6 = cube.quads()[3].vertices()[3]; - GeoVertex geoVertex7 = cube.quads()[3].vertices()[0]; - GeoVertex geoVertex8 = cube.quads()[3].vertices()[1]; - - Vector3f vertex1 = geoVertex1.position(); - Vector3f vertex2 = geoVertex2.position(); - Vector3f vertex3 = geoVertex3.position(); - Vector3f vertex4 = geoVertex4.position(); - Vector3f vertex5 = geoVertex5.position(); - Vector3f vertex6 = geoVertex6.position(); - Vector3f vertex7 = geoVertex7.position(); - Vector3f vertex8 = geoVertex8.position(); - - boolean mirror = cube.mirror(); - float textureWidth = (float) model.properties().textureWidth(); - float textureHeight = (float) model.properties().textureHeight(); - - createAndAddQuads(planes, positions, new Vector3f[]{vertex6, vertex5, vertex2}, cube.quads()[5], textureWidth, textureHeight, mirror); - createAndAddQuads(planes, positions, new Vector3f[]{vertex3, vertex4, vertex7}, cube.quads()[4], textureWidth, textureHeight, mirror); - createAndAddQuads(planes, positions, new Vector3f[]{vertex1, vertex5, vertex4}, cube.quads()[0], textureWidth, textureHeight, mirror); - createAndAddQuads(planes, positions, new Vector3f[]{vertex2, vertex1, vertex3}, cube.quads()[3], textureWidth, textureHeight, mirror); - createAndAddQuads(planes, positions, new Vector3f[]{vertex6, vertex2, vertex7}, cube.quads()[1], textureWidth, textureHeight, mirror); - createAndAddQuads(planes, positions, new Vector3f[]{vertex5, vertex6, vertex8}, cube.quads()[2], textureWidth, textureHeight, mirror); - - Vector3f center = new Vector3f(); - center.add(vertex1); - center.add(vertex2); - center.add(vertex3); - center.add(vertex4); - center.add(vertex5); - center.add(vertex6); - center.add(vertex7); - center.add(vertex8); - center.mul(2); - - Plane aPlane; - Plane bPlane; - float fullSize; - float bendX; - float bendY; - float bendZ = 0; - if (root.contains("arm")) { - aPlane = new Plane(direction.step(), -10); - bPlane = new Plane(direction.step(), 2); - fullSize = 12; - bendX = root.contains("left") ? 0.5F : -0.5F; - bendY = 4; - } - else { - aPlane = new Plane(direction.step(), root.equals("torso") ? 12 : -12); - bPlane = new Plane(direction.step(), 0); - fullSize = root.equals("torso") ? -12 : 12; - bendX = 0; - bendY = 6; - } - return new GeckoLibBendableCuboid(planes.toArray(new BendableCuboid.Quad[0]), positions.values().toArray(new RememberingPos[0]), bendX, bendY, bendZ, direction, aPlane, bPlane, fullSize); - } - - protected void createAndAddQuads(Collection quads, HashMap positions, Vector3f[] edges, GeoQuad quad, float textureWidth, float textureHeight, boolean mirror) { - float u1 = textureWidth * quad.vertices()[3].texU(); - float u2 = textureWidth * quad.vertices()[1].texU(); - float v1 = textureHeight * quad.vertices()[2].texV(); - float v2 = textureHeight * quad.vertices()[0].texV(); - float du = u2 < u1 ? 1 : -1; - float dv = v1 < v2 ? 1 : -1; - for (float localU = u2; localU != u1; localU += du) { - for (float localV = v1; localV != v2; localV += dv) { - float localU2 = localU + du; - float localV2 = localV + dv; - RememberingPos rp0 = getOrCreate(positions, transformVector(new Vector3f(edges[0]), new Vector3f(edges[1]), new Vector3f(edges[2]), u2, v1, u1, v2, localU2, localV)); - RememberingPos rp1 = getOrCreate(positions, transformVector(new Vector3f(edges[0]), new Vector3f(edges[1]), new Vector3f(edges[2]), u2, v1, u1, v2, localU2, localV2)); - RememberingPos rp2 = getOrCreate(positions, transformVector(new Vector3f(edges[0]), new Vector3f(edges[1]), new Vector3f(edges[2]), u2, v1, u1, v2, localU, localV2)); - RememberingPos rp3 = getOrCreate(positions, transformVector(new Vector3f(edges[0]), new Vector3f(edges[1]), new Vector3f(edges[2]), u2, v1, u1, v2, localU, localV)); - quads.add(new BendableCuboid.Quad(new RememberingPos[]{rp3, rp0, rp1, rp2}, localU2/textureWidth, localV/textureHeight, localU/textureWidth, localV2/textureHeight, mirror)); - } - } - } - - protected Vector3f transformVector(Vector3f pos, Vector3f vectorU, Vector3f vectorV, float u1, float v1, float u2, float v2, float u, float v) { - pos.mul(16); - vectorU.mul(16); - vectorV.mul(16); - vectorU.sub(pos); - vectorU.mul((u - u1)/(u2-u1)); - vectorV.sub(pos); - vectorV.mul((v - v1)/(v2-v1)); - pos.add(vectorU); - pos.add(vectorV); - return pos; - } -} diff --git a/common/src/main/java/com/zigythebird/bendable_cuboids/impl/compatibility/geckolib/GeckoRenderUtil.java b/common/src/main/java/com/zigythebird/bendable_cuboids/impl/compatibility/geckolib/GeckoRenderUtil.java deleted file mode 100644 index 510bade..0000000 --- a/common/src/main/java/com/zigythebird/bendable_cuboids/impl/compatibility/geckolib/GeckoRenderUtil.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.zigythebird.bendable_cuboids.impl.compatibility.geckolib; - -import com.mojang.blaze3d.vertex.PoseStack; -import com.mojang.math.Axis; -import software.bernie.geckolib.cache.object.GeoBone; - -public class GeckoRenderUtil { - public static void translateMatrixToBone(PoseStack poseStack, GeoBone bone) { - poseStack.translate(-bone.getPosX(), bone.getPosY(), bone.getPosZ()); - } - - public static void rotateMatrixAroundBone(PoseStack poseStack, GeoBone bone) { - if (bone.getRotZ() != 0.0F) { - poseStack.mulPose(Axis.ZP.rotation(bone.getRotZ())); - } - - if (bone.getRotY() != 0.0F) { - poseStack.mulPose(Axis.YP.rotation(bone.getRotY())); - } - - if (bone.getRotX() != 0.0F) { - poseStack.mulPose(Axis.XP.rotation(bone.getRotX())); - } - - } - - public static void scaleMatrixForBone(PoseStack poseStack, GeoBone bone) { - poseStack.scale(bone.getScaleX(), bone.getScaleY(), bone.getScaleZ()); - } - - public static void translateToPivotPoint(PoseStack poseStack, GeoBone bone) { - poseStack.translate(bone.getPivotX(), bone.getPivotY(), bone.getPivotZ()); - } - - public static void translateAwayFromPivotPoint(PoseStack poseStack, GeoBone bone) { - poseStack.translate(-bone.getPivotX(), -bone.getPivotY(), -bone.getPivotZ()); - } - - public static void prepMatrixForBone(PoseStack poseStack, GeoBone bone) { - translateMatrixToBone(poseStack, bone); - translateToPivotPoint(poseStack, bone); - rotateMatrixAroundBone(poseStack, bone); - scaleMatrixForBone(poseStack, bone); - translateAwayFromPivotPoint(poseStack, bone); - } -} diff --git a/common/src/main/java/com/zigythebird/bendable_cuboids/impl/compatibility/geckolib/GeoCubeAccessor.java b/common/src/main/java/com/zigythebird/bendable_cuboids/impl/compatibility/geckolib/GeoCubeAccessor.java deleted file mode 100644 index 32f7c62..0000000 --- a/common/src/main/java/com/zigythebird/bendable_cuboids/impl/compatibility/geckolib/GeoCubeAccessor.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.zigythebird.bendable_cuboids.impl.compatibility.geckolib; - -import it.unimi.dsi.fastutil.Pair; - -public interface GeoCubeAccessor { - void setBendableCuboid(Pair bendableCuboid); - Pair getBendableCuboid(); -} diff --git a/common/src/main/java/com/zigythebird/bendable_cuboids/mixin/geckolib/GeoCubeMixin_geckoOnly.java b/common/src/main/java/com/zigythebird/bendable_cuboids/mixin/geckolib/GeoCubeMixin_geckoOnly.java deleted file mode 100644 index 47ca18a..0000000 --- a/common/src/main/java/com/zigythebird/bendable_cuboids/mixin/geckolib/GeoCubeMixin_geckoOnly.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.zigythebird.bendable_cuboids.mixin.geckolib; - -import com.zigythebird.bendable_cuboids.impl.compatibility.geckolib.GeckoLibBendableCuboid; -import com.zigythebird.bendable_cuboids.impl.compatibility.geckolib.GeoCubeAccessor; -import it.unimi.dsi.fastutil.Pair; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Unique; -import software.bernie.geckolib.cache.object.GeoCube; - -@Mixin(GeoCube.class) -public class GeoCubeMixin_geckoOnly implements GeoCubeAccessor { - @Unique - Pair bendableCuboid; - - @Override - public void setBendableCuboid(Pair bendableCuboid) { - this.bendableCuboid = bendableCuboid; - } - - @Override - public Pair getBendableCuboid() { - return bendableCuboid; - } -} diff --git a/common/src/main/java/com/zigythebird/bendable_cuboids/mixin/geckolib/GeoRendererMixin_geckoOnly.java b/common/src/main/java/com/zigythebird/bendable_cuboids/mixin/geckolib/GeoRendererMixin_geckoOnly.java deleted file mode 100644 index 3d34f06..0000000 --- a/common/src/main/java/com/zigythebird/bendable_cuboids/mixin/geckolib/GeoRendererMixin_geckoOnly.java +++ /dev/null @@ -1,103 +0,0 @@ -package com.zigythebird.bendable_cuboids.mixin.geckolib; - -import com.llamalad7.mixinextras.injector.v2.WrapWithCondition; -import com.llamalad7.mixinextras.sugar.Local; -import com.mojang.blaze3d.vertex.PoseStack; -import com.mojang.blaze3d.vertex.VertexConsumer; -import com.zigythebird.bendable_cuboids.impl.BendUtil; -import com.zigythebird.bendable_cuboids.impl.compatibility.geckolib.GeckoLibBendableCuboid; -import com.zigythebird.bendable_cuboids.impl.compatibility.geckolib.GeckoLibBendableCuboidBuilder; -import com.zigythebird.bendable_cuboids.impl.compatibility.geckolib.GeckoRenderUtil; -import com.zigythebird.bendable_cuboids.impl.compatibility.geckolib.GeoCubeAccessor; -import com.zigythebird.playeranim.accessors.IAnimatedPlayer; -import net.minecraft.client.player.AbstractClientPlayer; -import net.minecraft.client.renderer.MultiBufferSource; -import net.minecraft.client.renderer.RenderType; -import net.minecraft.core.Direction; -import org.jetbrains.annotations.Nullable; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Unique; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import software.bernie.geckolib.animatable.GeoAnimatable; -import software.bernie.geckolib.cache.object.BakedGeoModel; -import software.bernie.geckolib.cache.object.GeoBone; -import software.bernie.geckolib.cache.object.GeoCube; -import software.bernie.geckolib.renderer.GeoArmorRenderer; -import software.bernie.geckolib.renderer.base.GeoRenderer; - -import java.util.ArrayList; -import java.util.List; - -@Mixin(GeoRenderer.class) -public interface GeoRendererMixin_geckoOnly { - /*@Inject(method = "defaultRender", at = @At(value = "INVOKE", target = "Lsoftware/bernie/geckolib/renderer/base/GeoRenderer;preRender(Lsoftware/bernie/geckolib/renderer/base/GeoRenderState;Lcom/mojang/blaze3d/vertex/PoseStack;Lsoftware/bernie/geckolib/cache/object/BakedGeoModel;Lnet/minecraft/client/renderer/MultiBufferSource;Lcom/mojang/blaze3d/vertex/VertexConsumer;ZIII)V"), remap = false) - private void initBend(R renderState, PoseStack poseStack, MultiBufferSource bufferSource, @Nullable RenderType renderType, @Nullable VertexConsumer buffer, CallbackInfo ci, @Local BakedGeoModel model) { - if ((GeoRenderer)(Object)this instanceof GeoArmorRenderer armorRenderer) { - bendableCuboids$initBend(List.of(armorRenderer.getGeoModel().getBone("armorLeftArm").orElse(null)), Direction.UP, "left_arm", model); - bendableCuboids$initBend(List.of(armorRenderer.getGeoModel().getBone("armorRightArm").orElse(null)), Direction.UP, "right_arm", model); - bendableCuboids$initBend(List.of(armorRenderer.getGeoModel().getBone("armorBody").orElse(null)), Direction.DOWN, "torso", model); - bendableCuboids$initBend(List.of(armorRenderer.getGeoModel().getBone("armorRightLeg").orElse(null)), Direction.UP, "right_leg", model); - bendableCuboids$initBend(List.of(armorRenderer.getGeoModel().getBone("armorLeftLeg").orElse(null)), Direction.UP, "left_leg", model); - } - } - - @Inject(method = "renderRecursively", at = @At(value = "INVOKE", target = "Lsoftware/bernie/geckolib/util/RenderUtil;prepMatrixForBone(Lcom/mojang/blaze3d/vertex/PoseStack;Lsoftware/bernie/geckolib/cache/object/GeoBone;)V"), remap = false) - private void renderBone(PoseStack poseStack, T animatable, GeoBone bone, RenderType renderType, MultiBufferSource bufferSource, VertexConsumer buffer, boolean isReRender, float partialTick, int packedLight, int packedOverlay, int renderColor, CallbackInfo ci) { - if ((GeoRenderer)(Object)this instanceof GeoArmorRenderer armorRenderer && armorRenderer.getCurrentEntity() instanceof AbstractClientPlayer player) { - String name = bone.getName(); - if (name.equals("armorRightArm") || name.equals("armorLeftArm") || name.equals("armorHead")) { - PlayerAnimBone bone1 = new PlayerAnimBone("torso"); - ((IAnimatedPlayer)player).playerAnimLib$getAnimManager().get3DTransform(bone1); - if (Math.abs(bone1.getBend()) >= 0.0001f) { - BendUtil.applyBendToMatrix(poseStack, 0, 1.125F, 0, bone1.getBendAxis(), -bone1.getBend()); - } - } - } - } - - @WrapWithCondition(method = "renderCubesOfBone", at = @At(value = "INVOKE", target = "Lsoftware/bernie/geckolib/renderer/GeoRenderer;renderCube(Lcom/mojang/blaze3d/vertex/PoseStack;Lsoftware/bernie/geckolib/cache/object/GeoCube;Lcom/mojang/blaze3d/vertex/VertexConsumer;III)V"), remap = false) - private boolean renderCube(GeoRenderer instance, PoseStack poseStack, GeoCube cube, VertexConsumer buffer, int packedLight, int packedOverlay, int renderColor, @Local(argsOnly = true) GeoBone geoBone) { - if (instance instanceof GeoArmorRenderer armorRenderer && armorRenderer.getCurrentEntity() instanceof AbstractClientPlayer player) { - Pair bendableCuboid = ((GeoCubeAccessor)(Object)cube).getBendableCuboid(); - if (bendableCuboid == null) return true; - PlayerAnimBone bone = new PlayerAnimBone(bendableCuboid.getLeft()); - ((IAnimatedPlayer)player).playerAnimLib$getAnimManager().get3DTransform(bone); - if (Math.abs(bone.getBend()) >= 0.0001f) { - PoseStack offset = new PoseStack(); - offset.translate(-5.5, -14, 0); - for (GeoBone bone1 : playerAnimLib$getParents(new ArrayList<>(), geoBone)) { - GeckoRenderUtil.prepMatrixForBone(offset, bone1); - } - bendableCuboid.getRight().applyBend(bone.getBendAxis(), bone.getBend(), offset); - bendableCuboid.getRight().render(poseStack.last(), buffer, packedLight, packedOverlay, renderColor); - return false; - } - } - return true; - } - - @Unique - private List playerAnimLib$getParents(List list, GeoBone bone) { - if (bone == null || list.contains(bone) || bone.getName().equals("armorRightArm") || bone.getName().equals("armorLeftArm") - || bone.getName().equals("armorRightLeg") || bone.getName().equals("armorLeftLeg") || bone.getName().equals("armorBody")) return list; - list.addFirst(bone); - return playerAnimLib$getParents(list, bone.getParent()); - } - - @Unique - private void bendableCuboids$initBend(List bones, Direction direction, String parent, BakedGeoModel model) { - if (bones == null) return; - for (GeoBone bone : bones) { - if (bone == null) continue; - for (GeoCube cube : bone.getCubes()) { - if (((GeoCubeAccessor)(Object)cube).getBendableCuboid() != null) continue; - GeckoLibBendableCuboidBuilder builder = new GeckoLibBendableCuboidBuilder(); - builder.setDirection(direction); - ((GeoCubeAccessor)(Object)cube).setBendableCuboid(new Pair<>(parent, builder.build(cube, model, parent))); - } - bendableCuboids$initBend(bone.getChildBones(), direction, parent, model); - } - }*/ -} diff --git a/fabric/build.gradle b/fabric/build.gradle index 1ab5a9d..1b58af6 100644 --- a/fabric/build.gradle +++ b/fabric/build.gradle @@ -26,7 +26,6 @@ dependencies { shadowCommon(project(path: ":common", configuration: "transformProductionFabric")) { transitive false } modImplementation "com.zigythebird.playeranim:PlayerAnimationLibFabric:${rootProject.player_anim_version}" - modLocalRuntime "software.bernie.geckolib:geckolib-fabric-${minecraft_version}:${geckolib_version}" } processResources { diff --git a/forge/build.gradle b/forge/build.gradle index 44b4464..b92dffd 100644 --- a/forge/build.gradle +++ b/forge/build.gradle @@ -26,7 +26,6 @@ dependencies { shadowCommon(project(path: ":common", configuration: "transformProductionNeoForge")) { transitive = false } modImplementation "com.zigythebird.playeranim:PlayerAnimationLibNeo:${rootProject.player_anim_version}" - modLocalRuntime "software.bernie.geckolib:geckolib-neoforge-${minecraft_version}:${geckolib_version}" } processResources { From ee193c4138feaa314a777940e8f2e0eed0489b12 Mon Sep 17 00:00:00 2001 From: dima-dencep Date: Tue, 8 Jul 2025 02:50:01 +0700 Subject: [PATCH 06/23] Update to 1.21.7 --- .gitignore | 3 ++- build.gradle | 4 ++-- gradle.properties | 10 +++++----- 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/.gitignore b/.gitignore index ccb0c56..c2d2c4d 100644 --- a/.gitignore +++ b/.gitignore @@ -16,4 +16,5 @@ classes/ .metadata .vscode .settings -*.launch \ No newline at end of file +*.launch +.DS_Store diff --git a/build.gradle b/build.gradle index 7cc7630..471df5a 100644 --- a/build.gradle +++ b/build.gradle @@ -19,7 +19,7 @@ subprojects { minecraft "com.mojang:minecraft:${rootProject.minecraft_version}" mappings loom.layered() { officialMojangMappings() - parchment("org.parchmentmc.data:parchment-${rootProject.minecraft_version}:${rootProject.parchment_version}@zip") + parchment("org.parchmentmc.data:parchment-1.21.6:${rootProject.parchment_version}@zip") } } } @@ -36,7 +36,7 @@ allprojects { repositories { // Fix issue with lwjgl-freetype not being found on macOS maven { - url "https://libraries.minecraft.net" + url = "https://libraries.minecraft.net" content { includeModule("org.lwjgl", "lwjgl-freetype") } diff --git a/gradle.properties b/gradle.properties index 1066f19..4e46a0d 100644 --- a/gradle.properties +++ b/gradle.properties @@ -8,11 +8,11 @@ maven_group = com.zigythebird.bendable_cuboids archives_base_name = BendableCuboids # Minecraft properties -minecraft_version = 1.21.6 -parchment_version = 2025.06.26-nightly-20250626.125431-1 +minecraft_version = 1.21.7 +parchment_version = 2025.06.29 # Dependencies fabric_loader_version = 0.16.14 -neoforge_version = 21.6.20-beta -player_anim_version=0.3.8+dev+mc1.21.6 -geckolib_version=5.2.0 +neoforge_version = 21.7.8-beta +player_anim_version = 0.3.8+dev+mc1.21.6 +geckolib_version = 5.2.0 From 5de50bfa11e1b67b8d38ec57f702a802fc84b6d2 Mon Sep 17 00:00:00 2001 From: dima-dencep Date: Tue, 8 Jul 2025 03:09:51 +0700 Subject: [PATCH 07/23] Maven --- .github/workflows/main.yml | 3 +-- build.gradle | 9 ++++++++- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 161eaf9..4c37e49 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -25,6 +25,5 @@ jobs: - name: Publish package run: gradle publish --no-daemon env: - MAVEN_USER: ${{ secrets.MAVEN_USER }} - MAVEN_PASS: ${{ secrets.MAVEN_PASS }} + MAVEN_PASSWORD: ${{ secrets.REDLANCE_PASSWORD }} GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/build.gradle b/build.gradle index 471df5a..2611402 100644 --- a/build.gradle +++ b/build.gradle @@ -68,7 +68,14 @@ allprojects { publishing { repositories { - // TODO + maven { + name = "RedlanceMinecraft" + url = "https://repo.redlance.org/public" + credentials { + username = "dima_dencep" + password = System.getenv("MAVEN_PASSWORD") + } + } } } } From 0e2e75f2e0acbbf4e0b610ddfb4b8b5737eaf3ed Mon Sep 17 00:00:00 2001 From: ZigyTheBird <105124180+ZigyTheBird@users.noreply.github.com> Date: Mon, 7 Jul 2025 23:41:13 +0330 Subject: [PATCH 08/23] Remove annoying GitHub task --- .github/workflows/codeql-analysis.yml | 69 --------------------------- .github/workflows/main.yml | 2 +- 2 files changed, 1 insertion(+), 70 deletions(-) delete mode 100644 .github/workflows/codeql-analysis.yml diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml deleted file mode 100644 index eaf02df..0000000 --- a/.github/workflows/codeql-analysis.yml +++ /dev/null @@ -1,69 +0,0 @@ -# For most projects, this workflow file will not need changing; you simply need -# to commit it to your repository. -# -# You may wish to alter this file to override the set of languages analyzed, -# or to provide custom queries or build logic. -# -# ******** NOTE ******** -# We have attempted to detect the languages in your repository. Please check -# the `language` matrix defined below to confirm you have the correct set of -# supported CodeQL languages. -# -name: "CodeQL" - -on: [push, pull_request, workflow_dispatch] - -jobs: - analyze: - name: Analyze - runs-on: ubuntu-latest - permissions: - actions: read - contents: read - security-events: write - - strategy: - fail-fast: false - matrix: - language: [ 'java' ] - # CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python' ] - # Learn more: - # https://docs.github.com/en/free-pro-team@latest/github/finding-security-vulnerabilities-and-errors-in-your-code/configuring-code-scanning#changing-the-languages-that-are-analyzed - - steps: - - name: Checkout repository - uses: actions/checkout@v3 - - # Initializes the CodeQL tools for scanning. - - name: Setup Java JDK - uses: actions/setup-java@v2 - with: - distribution: 'adopt' - java-version: '21' - - name: Initialize CodeQL - uses: github/codeql-action/init@v2 - with: - languages: ${{ matrix.language }} - # If you wish to specify custom queries, you can do so here or in a config file. - # By default, queries listed here will override any specified in a config file. - # Prefix the list here with "+" to use these queries and those in the config file. - # queries: ./path/to/local/query, your-org/your-repo/queries@main - - # Autobuild attempts to build any compiled languages (C/C++, C#, or Java). - # If this step fails, then you should remove it and run the build manually (see below) - - name: Autobuild - uses: github/codeql-action/autobuild@v2 - - # ℹ️ Command-line programs to run using the OS shell. - # 📚 https://git.io/JvXDl - - # ✏️ If the Autobuild fails above, remove it and uncomment the following three lines - # and modify them (or add more) to build your code if your project - # uses a compiled language - - #- run: | - # make bootstrap - # make release - - - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@v2 diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 4c37e49..2295aa6 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -1,6 +1,6 @@ # This is a basic workflow to help you get started with Actions -name: CI +name: Publish to Maven Repository. # Controls when the action will run. on: [workflow_dispatch] From 89657f553dde3957b0bfccee70b15a8c1e063e39 Mon Sep 17 00:00:00 2001 From: ZigyTheBird <105124180+ZigyTheBird@users.noreply.github.com> Date: Tue, 8 Jul 2025 20:24:12 +0330 Subject: [PATCH 09/23] Publish script --- .github/workflows/{main.yml => maven.yml} | 0 .github/workflows/release.yml | 159 ++++++++++++++++++++++ CHANGELOG.md | 1 + fabric/src/main/resources/fabric.mod.json | 3 +- gradle.properties | 1 - 5 files changed, 162 insertions(+), 2 deletions(-) rename .github/workflows/{main.yml => maven.yml} (100%) create mode 100644 .github/workflows/release.yml create mode 100644 CHANGELOG.md diff --git a/.github/workflows/main.yml b/.github/workflows/maven.yml similarity index 100% rename from .github/workflows/main.yml rename to .github/workflows/maven.yml diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000..7da51c7 --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,159 @@ +name: Publish on Modrinth & CurseForge + +on: + workflow_dispatch: + secrets: + CURSEFORGE_TOKEN: + required: true + MODRINTH_TOKEN: + required: true + +jobs: + build: + runs-on: ubuntu-latest + steps: + - name: Checkout Branch + uses: actions/checkout@v3 + + - name: Get Artifact Id + uses: actions/github-script@v5 + env: + branch: ${{ github.head_ref || github.ref_name }} + id: artifact_id + with: + result-encoding: string + script: | + // use env branch replace / with _ + return process.env.branch.replace(/\//g, '_') + + - name: Setup Java + uses: actions/setup-java@v4 + with: + distribution: 'adopt' + java-version: 21 + + - name: Grant Execute Permission + run: chmod +x gradlew + + - name: Build + run: | + ./gradlew build + + - name: Upload To Artifacts + uses: actions/upload-artifact@v4 + with: + name: ${{ steps.artifact_id.outputs.result }} + path: | + ./dist/**/* + ./fabric/build/libs + ./neoforge/build/libs + ./gradle.properties + + deploy: + runs-on: ubuntu-latest + needs: + - build + steps: + - name: Checkout Branch + uses: actions/checkout@v3 + + - name: Get Artifact Id + uses: actions/github-script@v5 + env: + branch: ${{ github.head_ref || github.ref_name }} + id: artifact_id + with: + result-encoding: string + script: | + // use env branch replace / with _ + return process.env.branch.replace(/\//g, '_') + + - name: Download Artifacts + uses: actions/download-artifact@v4 + with: + name: ${{ steps.artifact_id.outputs.result }} + + - name: Load Gradle Properties + uses: christian-draeger/read-properties@1.1.1 + id: gradle_properties + with: + path: './gradle.properties' + properties: 'java_version minecraft_version mod_version' + + - name: Check For Fabric Jar + uses: actions/github-script@v5 + id: fabric_release + with: + result-encoding: string + script: | + const fs = require("fs") + return fs.readdirSync("./fabric/build/libs")[0] || false; + + - name: Check For Forge Jar + uses: actions/github-script@v5 + id: forge_release + with: + result-encoding: string + script: | + const fs = require("fs") + return fs.readdirSync("./neoforge/build/libs")[0] || false; + + - name: Run Publish Fabric + if: ${{ steps.fabric_release.outputs.result != 'false' }} + uses: Kir-Antipov/mc-publish@v3.3 + with: + modrinth-id: OI3FlFon + modrinth-token: ${{ secrets.MODRINTH_TOKEN }} + modrinth-featured: false + modrinth-unfeature-mode: any + + curseforge-id: 1302303 + curseforge-token: ${{ secrets.CURSEFORGE_TOKEN }} + + name: ${{ steps.gradle_properties.outputs.mod_version }}+${{ steps.gradle_properties.outputs.minecraft_version }}-Fabric + version: ${{ steps.gradle_properties.outputs.mod_version }} + + files: | + ./fabric/build/libs/!(*-@(dev|sources|javadoc|all|dev-shadow)).jar + ./fabric/build/libs/*-@(dev|sources|javadoc|all|dev-shadow).jar + version-type: release + + loaders: fabric + game-versions: ${{ steps.gradle_properties.outputs.minecraft_version }} + + changelog-file: CHANGELOG.md + + java: ${{ steps.gradle_properties.outputs.java_version }} + retry-attempts: 5 + retry-delay: 60000 + fail-mode: skip + + - name: Run Publish Forge + if: ${{ steps.forge_release.outputs.result != 'false' }} + uses: Kir-Antipov/mc-publish@v3.3 + with: + modrinth-id: OI3FlFon + modrinth-token: ${{ secrets.MODRINTH_TOKEN }} + modrinth-featured: false + modrinth-unfeature-mode: any + + curseforge-id: 1302303 + curseforge-token: ${{ secrets.CURSEFORGE_TOKEN }} + + name: ${{ steps.gradle_properties.outputs.mod_version }}+${{ steps.gradle_properties.outputs.minecraft_version }}-NeoForge + version: ${{ steps.gradle_properties.outputs.mod_version }} + + files: | + ./neoforge/build/libs/!(*-@(dev|sources|javadoc|all|dev-shadow)).jar + ./neoforge/build/libs/*-@(dev|sources|javadoc|all|dev-shadow).jar + version-type: release + + loaders: neoforge + game-versions: ${{ steps.gradle_properties.outputs.minecraft_version }} + + changelog-file: CHANGELOG.md + + java: ${{ steps.gradle_properties.outputs.java_version }} + retry-attempts: 5 + retry-delay: 60000 + fail-mode: skip diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..eda771d --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1 @@ +RELEASE! \ No newline at end of file diff --git a/fabric/src/main/resources/fabric.mod.json b/fabric/src/main/resources/fabric.mod.json index 2721807..b0f6d90 100644 --- a/fabric/src/main/resources/fabric.mod.json +++ b/fabric/src/main/resources/fabric.mod.json @@ -29,7 +29,8 @@ }, "custom": { "modmenu": { - "badges": ["library"] + "badges": ["library"], + "parent": "player_animation_library" }, "sodium:options": { "mixin.features.render.entity": false, diff --git a/gradle.properties b/gradle.properties index 4e46a0d..950c8c0 100644 --- a/gradle.properties +++ b/gradle.properties @@ -15,4 +15,3 @@ parchment_version = 2025.06.29 fabric_loader_version = 0.16.14 neoforge_version = 21.7.8-beta player_anim_version = 0.3.8+dev+mc1.21.6 -geckolib_version = 5.2.0 From af3be32a1b9eaabb2193f06e8f6f89c56e0bf7e5 Mon Sep 17 00:00:00 2001 From: ZigyTheBird <105124180+ZigyTheBird@users.noreply.github.com> Date: Tue, 8 Jul 2025 20:25:55 +0330 Subject: [PATCH 10/23] Update gradle.properties --- gradle.properties | 1 + 1 file changed, 1 insertion(+) diff --git a/gradle.properties b/gradle.properties index 950c8c0..89d1e97 100644 --- a/gradle.properties +++ b/gradle.properties @@ -10,6 +10,7 @@ archives_base_name = BendableCuboids # Minecraft properties minecraft_version = 1.21.7 parchment_version = 2025.06.29 +java_version = 21 # Dependencies fabric_loader_version = 0.16.14 From 261984f30229fc1052c7cdf32e7fcd1cdd98fe20 Mon Sep 17 00:00:00 2001 From: dima-dencep Date: Wed, 9 Jul 2025 00:59:02 +0700 Subject: [PATCH 11/23] Fixes --- common/src/main/resources/bendable_cuboids.mixins.json | 6 +----- fabric/src/main/resources/fabric.mod.json | 9 ++------- forge/src/main/resources/META-INF/neoforge.mods.toml | 7 +------ gradle.properties | 5 ++--- 4 files changed, 6 insertions(+), 21 deletions(-) diff --git a/common/src/main/resources/bendable_cuboids.mixins.json b/common/src/main/resources/bendable_cuboids.mixins.json index 53a93c1..b603b53 100644 --- a/common/src/main/resources/bendable_cuboids.mixins.json +++ b/common/src/main/resources/bendable_cuboids.mixins.json @@ -22,9 +22,5 @@ ], "injectors": { "defaultRequire": 1 - }, - "mixins": [ - "geckolib.GeoCubeMixin_geckoOnly", - "geckolib.GeoRendererMixin_geckoOnly" - ] + } } \ No newline at end of file diff --git a/fabric/src/main/resources/fabric.mod.json b/fabric/src/main/resources/fabric.mod.json index b0f6d90..098f390 100644 --- a/fabric/src/main/resources/fabric.mod.json +++ b/fabric/src/main/resources/fabric.mod.json @@ -24,18 +24,13 @@ "bendable_cuboids.mixins.json" ], "depends": { - "fabricloader": ">=0.16.9", - "minecraft": ">=1.21.4" + "fabricloader": ">=0.16.14", + "minecraft": ">=1.21.7" }, "custom": { "modmenu": { "badges": ["library"], "parent": "player_animation_library" - }, - "sodium:options": { - "mixin.features.render.entity": false, - "mixin.features.render.entity.cull": true, - "mixin.features.render.entity.shadow": true } } } \ No newline at end of file diff --git a/forge/src/main/resources/META-INF/neoforge.mods.toml b/forge/src/main/resources/META-INF/neoforge.mods.toml index 4263585..7f738e4 100644 --- a/forge/src/main/resources/META-INF/neoforge.mods.toml +++ b/forge/src/main/resources/META-INF/neoforge.mods.toml @@ -17,15 +17,10 @@ Adds model cubes that can be bent, for example like arms in MC Story Mode! [[mixins]] config = "bendable_cuboids.mixins.json" -[mods."sodium:options"] -"mixin.features.render.entity" = false -"mixin.features.render.entity.cull" = true -"mixin.features.render.entity.shadow" = true - [[dependencies.bendable_cuboids]] modId = "minecraft" type = "required" mandatory = true -versionRange = "[1.21,)" +versionRange = "[1.21.7,)" ordering = "NONE" side = "CLIENT" \ No newline at end of file diff --git a/gradle.properties b/gradle.properties index 89d1e97..eadd2d7 100644 --- a/gradle.properties +++ b/gradle.properties @@ -10,9 +10,8 @@ archives_base_name = BendableCuboids # Minecraft properties minecraft_version = 1.21.7 parchment_version = 2025.06.29 -java_version = 21 # Dependencies fabric_loader_version = 0.16.14 -neoforge_version = 21.7.8-beta -player_anim_version = 0.3.8+dev+mc1.21.6 +neoforge_version = 21.7.11-beta +player_anim_version = 1.0.0+dev+mc1.21.7 From 68b20bc91d69fe200ed08f403c5203383e9b3917 Mon Sep 17 00:00:00 2001 From: dima-dencep Date: Wed, 9 Jul 2025 08:35:05 +0700 Subject: [PATCH 12/23] Fix shadows --- .../impl/BendableCuboidBuilder.java | 23 ++++----------- .../impl/BendableCuboidData.java | 19 ++++++++----- .../bendable_cuboids/mixin/CuboidMutator.java | 28 ++++++++----------- gradle.properties | 4 +-- 4 files changed, 32 insertions(+), 42 deletions(-) diff --git a/common/src/main/java/com/zigythebird/bendable_cuboids/impl/BendableCuboidBuilder.java b/common/src/main/java/com/zigythebird/bendable_cuboids/impl/BendableCuboidBuilder.java index 16a2beb..bc8d9e1 100644 --- a/common/src/main/java/com/zigythebird/bendable_cuboids/impl/BendableCuboidBuilder.java +++ b/common/src/main/java/com/zigythebird/bendable_cuboids/impl/BendableCuboidBuilder.java @@ -36,17 +36,6 @@ public BendableCuboid build(BendableCuboidData data) { Vector3f vertex7 = new Vector3f(pmaxX, pmaxY, pmaxZ); //east north up Vector3f vertex8 = new Vector3f(pminX, pmaxY, pmaxZ); //west north up - Vector3f center = new Vector3f(); - center.add(vertex1); - center.add(vertex2); - center.add(vertex3); - center.add(vertex4); - center.add(vertex5); - center.add(vertex6); - center.add(vertex7); - center.add(vertex8); - center.div(8); - int j = data.u; int k = (int) (data.u + data.sizeZ); int l = (int) (data.u + data.sizeZ + data.sizeX); @@ -59,12 +48,12 @@ public BendableCuboid build(BendableCuboidData data) { float textureWidth = data.textureWidth; float textureHeight = data.textureHeight; boolean mirror = data.mirror; - createAndAddQuads(planes, positions, new Vector3f[]{vertex6, vertex5, vertex2}, k, p, l, q, textureWidth, textureHeight, mirror); //down - createAndAddQuads(planes, positions, new Vector3f[]{vertex3, vertex4, vertex7}, l, q, m, p, textureWidth, textureHeight, mirror); //up - createAndAddQuads(planes, positions, new Vector3f[]{vertex1, vertex5, vertex4}, j, q, k, r, textureWidth, textureHeight, mirror); //west - createAndAddQuads(planes, positions, new Vector3f[]{vertex2, vertex1, vertex3}, k, q, l, r, textureWidth, textureHeight, mirror); //south - createAndAddQuads(planes, positions, new Vector3f[]{vertex6, vertex2, vertex7}, l, q, n, r, textureWidth, textureHeight, mirror); //east - createAndAddQuads(planes, positions, new Vector3f[]{vertex5, vertex6, vertex8}, n, q, o, r, textureWidth, textureHeight, mirror); //north + if (data.visibleFaces.contains(Direction.DOWN)) createAndAddQuads(planes, positions, new Vector3f[]{vertex6, vertex5, vertex2}, k, p, l, q, textureWidth, textureHeight, mirror); //down + if (data.visibleFaces.contains(Direction.UP)) createAndAddQuads(planes, positions, new Vector3f[]{vertex3, vertex4, vertex7}, l, q, m, p, textureWidth, textureHeight, mirror); //up + if (data.visibleFaces.contains(Direction.WEST)) createAndAddQuads(planes, positions, new Vector3f[]{vertex1, vertex5, vertex4}, j, q, k, r, textureWidth, textureHeight, mirror); //west + if (data.visibleFaces.contains(Direction.NORTH)) createAndAddQuads(planes, positions, new Vector3f[]{vertex2, vertex1, vertex3}, k, q, l, r, textureWidth, textureHeight, mirror); //north + if (data.visibleFaces.contains(Direction.EAST)) createAndAddQuads(planes, positions, new Vector3f[]{vertex6, vertex2, vertex7}, l, q, n, r, textureWidth, textureHeight, mirror); //east + if (data.visibleFaces.contains(Direction.SOUTH)) createAndAddQuads(planes, positions, new Vector3f[]{vertex5, vertex6, vertex8}, n, q, o, r, textureWidth, textureHeight, mirror); //south Vector3f pivot = new Vector3f(0, 0, 0); if (data.pivot >= 0) { diff --git a/common/src/main/java/com/zigythebird/bendable_cuboids/impl/BendableCuboidData.java b/common/src/main/java/com/zigythebird/bendable_cuboids/impl/BendableCuboidData.java index 4e9cec6..7acda0b 100644 --- a/common/src/main/java/com/zigythebird/bendable_cuboids/impl/BendableCuboidData.java +++ b/common/src/main/java/com/zigythebird/bendable_cuboids/impl/BendableCuboidData.java @@ -1,5 +1,9 @@ package com.zigythebird.bendable_cuboids.impl; +import net.minecraft.core.Direction; + +import java.util.Set; + public class BendableCuboidData { /** * Size parameters @@ -8,13 +12,14 @@ public class BendableCuboidData { public float extraX, extraY, extraZ; public int u, v; public boolean mirror = false; - public int textureWidth, textureHeight; //That will be int + public float textureWidth, textureHeight; //That will be int public int pivot; //public float bendX, bendY, bendZ; + public Set visibleFaces; public BendableCuboidData() {} - public BendableCuboidData(int u, int v, float x, float y, float z, float sizeX, float sizeY, float sizeZ, float extraX, float extraY, float extraZ, boolean mirror, float textureWidth, float textureHeight, int pivot) { + public BendableCuboidData(int u, int v, float x, float y, float z, float sizeX, float sizeY, float sizeZ, float extraX, float extraY, float extraZ, boolean mirror, float textureWidth, float textureHeight, Set visibleFaces, int pivot) { this.u = u; this.v = v; this.x = x; @@ -28,12 +33,12 @@ public BendableCuboidData(int u, int v, float x, float y, float z, float sizeX, this.extraZ = extraZ; this.mirror = mirror; this.pivot = pivot; - //Casting - this.textureWidth = (int) textureWidth; - this.textureHeight = (int) textureHeight; + this.textureWidth = textureWidth; + this.textureHeight = textureHeight; + this.visibleFaces = visibleFaces; } - public BendableCuboidData(int u, int v, float x, float y, float z, float sizeX, float sizeY, float sizeZ, float extraX, float extraY, float extraZ, boolean mirror, float textureWidth, float textureHeight) { - this(u, v, x, y, z, sizeX, sizeY, sizeZ, extraX, extraY, extraZ, mirror, textureWidth, textureHeight, -1); + public BendableCuboidData(int u, int v, float x, float y, float z, float sizeX, float sizeY, float sizeZ, float extraX, float extraY, float extraZ, boolean mirror, float textureWidth, float textureHeight, Set visibleFaces) { + this(u, v, x, y, z, sizeX, sizeY, sizeZ, extraX, extraY, extraZ, mirror, textureWidth, textureHeight, visibleFaces, -1); } } diff --git a/common/src/main/java/com/zigythebird/bendable_cuboids/mixin/CuboidMutator.java b/common/src/main/java/com/zigythebird/bendable_cuboids/mixin/CuboidMutator.java index de74cf3..167718f 100644 --- a/common/src/main/java/com/zigythebird/bendable_cuboids/mixin/CuboidMutator.java +++ b/common/src/main/java/com/zigythebird/bendable_cuboids/mixin/CuboidMutator.java @@ -1,12 +1,12 @@ package com.zigythebird.bendable_cuboids.mixin; - import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.VertexConsumer; import com.zigythebird.bendable_cuboids.api.MutableCuboid; import com.zigythebird.bendable_cuboids.impl.BendableCuboid; import com.zigythebird.bendable_cuboids.impl.BendableCuboidData; import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.core.Direction; import net.minecraft.util.Tuple; import org.jetbrains.annotations.Nullable; import org.spongepowered.asm.mixin.*; @@ -18,27 +18,25 @@ import java.util.Set; import java.util.function.Function; -@SuppressWarnings({"rawtypes", "unused"}) @Mixin(ModelPart.Cube.class) public class CuboidMutator implements MutableCuboid { - - @Shadow @Final public float minX; - @Shadow @Final public float minY; - @Shadow @Final public float minZ; + @Shadow + @Final + public float minX; + @Shadow + @Final + public float minY; + @Shadow + @Final + public float minZ; //Store the mutators and the mutator builders. - @Mutable - @Shadow @Final - public ModelPart.Polygon[] polygons; @Unique private final HashMap mutators = new HashMap<>(); @Unique private final HashMap> mutatorBuilders = new HashMap<>(); - @Unique - private ModelPart.Polygon[] originalQuads; - @Unique private BendableCuboidData partData; @@ -51,12 +49,10 @@ public class CuboidMutator implements MutableCuboid { private String activeMutatorID; @Inject(method = "", at = @At(value = "RETURN")) - private void constructor(int u, int v, float x, float y, float z, float sizeX, float sizeY, float sizeZ, float extraX, float extraY, float extraZ, boolean mirror, float textureWidth, float textureHeight, Set set, CallbackInfo ci){ - partData = new BendableCuboidData(u, v, minX, minY, minZ, sizeX, sizeY, sizeZ, extraX, extraY, extraZ, mirror, textureWidth, textureHeight); - originalQuads = this.polygons; + private void constructor(int u, int v, float x, float y, float z, float sizeX, float sizeY, float sizeZ, float extraX, float extraY, float extraZ, boolean mirror, float textureWidth, float textureHeight, Set visibleFaces, CallbackInfo ci){ + partData = new BendableCuboidData(u, v, minX, minY, minZ, sizeX, sizeY, sizeZ, extraX, extraY, extraZ, mirror, textureWidth, textureHeight, visibleFaces); } - @Override public boolean bendableCuboids$registerMutator(String name, Function builder) { if(mutatorBuilders.containsKey(name)) return false; diff --git a/gradle.properties b/gradle.properties index eadd2d7..5004dd7 100644 --- a/gradle.properties +++ b/gradle.properties @@ -3,7 +3,7 @@ org.gradle.jvmargs=-Xmx4G org.gradle.parallel=true # Mod properties -mod_version = 1.0.0 +mod_version = 1.0.0+dev maven_group = com.zigythebird.bendable_cuboids archives_base_name = BendableCuboids @@ -14,4 +14,4 @@ parchment_version = 2025.06.29 # Dependencies fabric_loader_version = 0.16.14 neoforge_version = 21.7.11-beta -player_anim_version = 1.0.0+dev+mc1.21.7 +player_anim_version = 1.0.0+mc1.21.7 From 35714b68be15d14c174d6b1c7a08bfd09f2646f8 Mon Sep 17 00:00:00 2001 From: dima-dencep Date: Wed, 9 Jul 2025 08:55:35 +0700 Subject: [PATCH 13/23] optimize --- .../impl/BendableCuboidBuilder.java | 48 +++++++++++-------- 1 file changed, 29 insertions(+), 19 deletions(-) diff --git a/common/src/main/java/com/zigythebird/bendable_cuboids/impl/BendableCuboidBuilder.java b/common/src/main/java/com/zigythebird/bendable_cuboids/impl/BendableCuboidBuilder.java index bc8d9e1..34226db 100644 --- a/common/src/main/java/com/zigythebird/bendable_cuboids/impl/BendableCuboidBuilder.java +++ b/common/src/main/java/com/zigythebird/bendable_cuboids/impl/BendableCuboidBuilder.java @@ -77,33 +77,43 @@ public BendableCuboid build(BendableCuboidData data) { protected void createAndAddQuads(Collection quads, HashMap positions, Vector3f[] edges, int u1, int v1, int u2, int v2, float textureWidth, float textureHeight, boolean mirror) { int du = u2 < u1 ? 1 : -1; int dv = v1 < v2 ? 1 : -1; + + Vector3f origin = edges[0]; + Vector3f vecU = new Vector3f(edges[1]).sub(origin); + Vector3f vecV = new Vector3f(edges[2]).sub(origin); + + float uFracScale = 1.0f / (u1 - u2); + Vector3f uStep = vecU.mul(du * uFracScale); + + float vFracScale = 1.0f / (v2 - v1); + Vector3f vStep = vecV.mul(dv * vFracScale); + + Vector3f uPos = new Vector3f(origin); + for (int localU = u2; localU != u1; localU += du) { + Vector3f nextUPos = new Vector3f(uPos).add(uStep); + + Vector3f vPos = new Vector3f(uPos); + Vector3f nextVPos = new Vector3f(nextUPos); + for (int localV = v1; localV != v2; localV += dv) { int localU2 = localU + du; int localV2 = localV + dv; - RememberingPos rp0 = getOrCreate(positions, transformVector(new Vector3f(edges[0]), new Vector3f(edges[1]), new Vector3f(edges[2]), u2, v1, u1, v2, localU2, localV)); - RememberingPos rp1 = getOrCreate(positions, transformVector(new Vector3f(edges[0]), new Vector3f(edges[1]), new Vector3f(edges[2]), u2, v1, u1, v2, localU2, localV2)); - RememberingPos rp2 = getOrCreate(positions, transformVector(new Vector3f(edges[0]), new Vector3f(edges[1]), new Vector3f(edges[2]), u2, v1, u1, v2, localU, localV2)); - RememberingPos rp3 = getOrCreate(positions, transformVector(new Vector3f(edges[0]), new Vector3f(edges[1]), new Vector3f(edges[2]), u2, v1, u1, v2, localU, localV)); - quads.add(new BendableCuboid.Quad(new RememberingPos[]{rp3, rp0, rp1, rp2}, localU2/textureWidth, localV/textureHeight, localU/textureWidth, localV2/textureHeight, mirror)); + + RememberingPos rp3 = getOrCreate(positions, vPos); + RememberingPos rp0 = getOrCreate(positions, nextVPos); + vPos.add(vStep); + nextVPos.add(vStep); + RememberingPos rp2 = getOrCreate(positions, vPos); + RememberingPos rp1 = getOrCreate(positions, nextVPos); + + quads.add(new BendableCuboid.Quad(new RememberingPos[]{rp3, rp0, rp1, rp2}, localU2 / textureWidth, localV / textureHeight, localU / textureWidth, localV2 / textureHeight, mirror)); } + uPos = nextUPos; } } - protected Vector3f transformVector(Vector3f pos, Vector3f vectorU, Vector3f vectorV, int u1, int v1, int u2, int v2, int u, int v) { - vectorU.sub(pos); - vectorU.mul(((float)u - u1)/(u2-u1)); - vectorV.sub(pos); - vectorV.mul(((float)v - v1)/(v2-v1)); - pos.add(vectorU); - pos.add(vectorV); - return pos; - } - protected RememberingPos getOrCreate(HashMap positions, Vector3f pos) { - if(!positions.containsKey(pos)){ - positions.put(pos, new RememberingPos(pos)); - } - return positions.get(pos); + return positions.computeIfAbsent(pos, p -> new RememberingPos(new Vector3f(p))); } } From ab7ec1b0e22884531d7e57b022a5862d8f9c4a65 Mon Sep 17 00:00:00 2001 From: dima-dencep Date: Wed, 9 Jul 2025 10:06:42 +0700 Subject: [PATCH 14/23] Rewrite --- .../bendable_cuboids/api/Bendable.java | 5 + .../bendable_cuboids/api/BendableCube.java | 54 +++++ .../api/BendableModelPart.java | 11 + .../api/ModelPartAccessor.java | 31 --- .../bendable_cuboids/api/MutableCuboid.java | 64 ----- .../bendable_cuboids/impl/BendUtil.java | 9 +- .../bendable_cuboids/impl/BendableCuboid.java | 186 --------------- .../impl/BendableCuboidBuilder.java | 119 ---------- .../impl/BendableCuboidData.java | 45 +--- .../impl/MutableModelPart.java | 53 ----- .../bendable_cuboids/impl/Quad.java | 110 +++++++++ .../impl/accessors/IModelPartAccessor.java | 15 -- .../impl/accessors/IPlayerModel.java | 6 - .../impl/compatibility/PlayerBendHelper.java | 35 ++- .../bendable_cuboids/mixin/CubeMixin.java | 220 ++++++++++++++++++ .../bendable_cuboids/mixin/CuboidMutator.java | 140 ----------- .../mixin/IModelPartMixin.java | 71 ------ .../mixin/ModelPartMixin.java | 24 ++ .../main/resources/architectury.common.json | 8 + .../resources/bendable_cuboids.mixins.json | 4 +- 20 files changed, 462 insertions(+), 748 deletions(-) create mode 100644 common/src/main/java/com/zigythebird/bendable_cuboids/api/Bendable.java create mode 100644 common/src/main/java/com/zigythebird/bendable_cuboids/api/BendableCube.java create mode 100644 common/src/main/java/com/zigythebird/bendable_cuboids/api/BendableModelPart.java delete mode 100644 common/src/main/java/com/zigythebird/bendable_cuboids/api/ModelPartAccessor.java delete mode 100644 common/src/main/java/com/zigythebird/bendable_cuboids/api/MutableCuboid.java delete mode 100644 common/src/main/java/com/zigythebird/bendable_cuboids/impl/BendableCuboid.java delete mode 100644 common/src/main/java/com/zigythebird/bendable_cuboids/impl/BendableCuboidBuilder.java delete mode 100644 common/src/main/java/com/zigythebird/bendable_cuboids/impl/MutableModelPart.java create mode 100644 common/src/main/java/com/zigythebird/bendable_cuboids/impl/Quad.java delete mode 100644 common/src/main/java/com/zigythebird/bendable_cuboids/impl/accessors/IModelPartAccessor.java delete mode 100644 common/src/main/java/com/zigythebird/bendable_cuboids/impl/accessors/IPlayerModel.java create mode 100644 common/src/main/java/com/zigythebird/bendable_cuboids/mixin/CubeMixin.java delete mode 100644 common/src/main/java/com/zigythebird/bendable_cuboids/mixin/CuboidMutator.java delete mode 100644 common/src/main/java/com/zigythebird/bendable_cuboids/mixin/IModelPartMixin.java create mode 100644 common/src/main/java/com/zigythebird/bendable_cuboids/mixin/ModelPartMixin.java diff --git a/common/src/main/java/com/zigythebird/bendable_cuboids/api/Bendable.java b/common/src/main/java/com/zigythebird/bendable_cuboids/api/Bendable.java new file mode 100644 index 0000000..2c6bb36 --- /dev/null +++ b/common/src/main/java/com/zigythebird/bendable_cuboids/api/Bendable.java @@ -0,0 +1,5 @@ +package com.zigythebird.bendable_cuboids.api; + +public interface Bendable { + float getBend(); +} diff --git a/common/src/main/java/com/zigythebird/bendable_cuboids/api/BendableCube.java b/common/src/main/java/com/zigythebird/bendable_cuboids/api/BendableCube.java new file mode 100644 index 0000000..1f5c57b --- /dev/null +++ b/common/src/main/java/com/zigythebird/bendable_cuboids/api/BendableCube.java @@ -0,0 +1,54 @@ +package com.zigythebird.bendable_cuboids.api; + +import com.zigythebird.bendable_cuboids.impl.Plane; +import net.minecraft.core.Direction; +import net.minecraft.util.Mth; +import org.joml.Matrix4f; + +/** + * Should be pretty self-explanatory... + * Bend XYZ are the coordinates of the bend's center + * If you don't know the math behind it, don't try to edit. + *

+ * Use {@link BendableCube#applyBend} to bend the cube + */ +public interface BendableCube extends Bendable { + /** + * Apply bend on this cuboid + * Values are in radians + * @param bendValue bend value (Same as rotX) + * @return Transformation matrix for transforming children + */ + Matrix4f applyBend(float bendValue); + + default Matrix4f applyBendDegrees(float bendValue) { + return applyBend(bendValue * Mth.DEG_TO_RAD); + } + + Direction getBendDirection(); + + float getBendX(); + float getBendY(); + float getBendZ(); + + Plane getBasePlane(); + Plane getOtherPlane(); + + /** + * Distance between the two opposite surface of the cuboid. + * Calculate two plane distance is inefficient. + * Try to override it (If you have size) + * @return the size of the cube + */ + float bendHeight(); + + default boolean isBendInverted() { + return getBendDirection() == Direction.UP || getBendDirection() == Direction.SOUTH || getBendDirection() == Direction.EAST; + } + + default void rebuild(Direction direction) { + rebuild(direction, -1); + } + + void rebuild(Direction direction, int pivot); +} diff --git a/common/src/main/java/com/zigythebird/bendable_cuboids/api/BendableModelPart.java b/common/src/main/java/com/zigythebird/bendable_cuboids/api/BendableModelPart.java new file mode 100644 index 0000000..6bf020a --- /dev/null +++ b/common/src/main/java/com/zigythebird/bendable_cuboids/api/BendableModelPart.java @@ -0,0 +1,11 @@ +package com.zigythebird.bendable_cuboids.api; + +import org.jetbrains.annotations.Nullable; + +public interface BendableModelPart { + /** + * Get a cuboid, and cast it to {@link BendableCube} + */ + @Nullable + BendableCube bc$getCuboid(int index); +} diff --git a/common/src/main/java/com/zigythebird/bendable_cuboids/api/ModelPartAccessor.java b/common/src/main/java/com/zigythebird/bendable_cuboids/api/ModelPartAccessor.java deleted file mode 100644 index 5480743..0000000 --- a/common/src/main/java/com/zigythebird/bendable_cuboids/api/ModelPartAccessor.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.zigythebird.bendable_cuboids.api; - -import com.zigythebird.bendable_cuboids.impl.accessors.IModelPartAccessor; -import net.minecraft.client.model.geom.ModelPart; - -import java.util.List; -import java.util.Map; -import java.util.Optional; - -/** - * Access to children and cuboids in {@link ModelPart} - * Don't have to reinterpret the object... - */ -public final class ModelPartAccessor { - - public static Map getChildren(ModelPart modelPart){ - return ((IModelPartAccessor)modelPart).bendableCuboids$getChildren(); - } - - /** - * Get a cuboid, and cast it to {@link MutableCuboid} - */ - public static Optional optionalGetCuboid(ModelPart modelPart, int index){ - if(modelPart == null || getCuboids(modelPart) == null || getCuboids(modelPart).size() <= index) return Optional.empty(); - return Optional.of((MutableCuboid)getCuboids(modelPart).get(index)); - } - - public static List getCuboids(ModelPart modelPart){ - return ((IModelPartAccessor)modelPart).bendableCuboids$getCuboids(); - } -} diff --git a/common/src/main/java/com/zigythebird/bendable_cuboids/api/MutableCuboid.java b/common/src/main/java/com/zigythebird/bendable_cuboids/api/MutableCuboid.java deleted file mode 100644 index 8b6bed2..0000000 --- a/common/src/main/java/com/zigythebird/bendable_cuboids/api/MutableCuboid.java +++ /dev/null @@ -1,64 +0,0 @@ -package com.zigythebird.bendable_cuboids.api; - -import com.zigythebird.bendable_cuboids.impl.BendableCuboid; -import com.zigythebird.bendable_cuboids.impl.BendableCuboidData; -import net.minecraft.util.Tuple; -import org.jetbrains.annotations.Nullable; - -import java.util.function.Function; - -public interface MutableCuboid { - - /** - * Register a mutator to a cuboid - * @param name registration name - * @param builder BendableCuboid builder - * @return is the registration success - */ - boolean bendableCuboids$registerMutator(String name, Function builder); - - /** - * Unregister a mutator - * @param name registration name - * @return could unregister something - */ - boolean bendableCuboids$unregisterMutator(String name); - - /** - * Get the active mutator and its identifier - * @return null, if no active - */ - @Nullable - Tuple bendableCuboids$getActiveMutator(); - - /** - * Check if mutator with key exists - * @param key key - * @return is the mutator registered (even if not active) - */ - boolean bendableCuboids$hasMutator(String key); - - @Nullable - Function bendableCuboids$getCuboidBuilder(String key); - - /** - * Get a mutator - * @param name mutator identifier - * @return null, if no mutator exists or created - */ - @Nullable - @Deprecated - //it can be removed in any future version - BendableCuboid bendableCuboids$getMutator(String name); - - /** - * Get a mutator and make it the active - * @param name mutator identifier - * @return null, if no registered - */ - @Nullable - BendableCuboid bendableCuboids$getAndActivateMutator(@Nullable String name); - - void bendableCuboids$copyStateFrom(MutableCuboid other); - -} diff --git a/common/src/main/java/com/zigythebird/bendable_cuboids/impl/BendUtil.java b/common/src/main/java/com/zigythebird/bendable_cuboids/impl/BendUtil.java index 941ab46..5e910f1 100644 --- a/common/src/main/java/com/zigythebird/bendable_cuboids/impl/BendUtil.java +++ b/common/src/main/java/com/zigythebird/bendable_cuboids/impl/BendUtil.java @@ -2,6 +2,7 @@ import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.math.Axis; +import com.zigythebird.bendable_cuboids.api.BendableCube; import com.zigythebird.bendable_cuboids.impl.compatibility.PlayerBendHelper; import net.minecraft.client.model.HumanoidModel; import net.minecraft.client.model.PlayerModel; @@ -13,9 +14,9 @@ public class BendUtil { private static final Vector3f Z_AXIS = new Vector3f(0, 0, 1); - public static BendApplier getBend(BendableCuboid cuboid, float bendValue) { + public static BendApplier getBend(BendableCube cuboid, float bendValue) { return getBend(cuboid.getBendX(), cuboid.getBendY(), cuboid.getBendZ(), - cuboid.basePlane, cuboid.otherPlane, false, cuboid.bendHeight(), bendValue); + cuboid.getBasePlane(), cuboid.getOtherPlane(), false, cuboid.bendHeight(), bendValue); } /** @@ -54,9 +55,9 @@ else if (distFromBase + distFromOther <= bendHeight && distFromOther > v) { }); } - public static BendApplier getBendLegacy(BendableCuboid cuboid, float bendValue) { + public static BendApplier getBendLegacy(BendableCube cuboid, float bendValue) { return getBendLegacy(cuboid.getBendDirection(), cuboid.getBendX(), cuboid.getBendY(), cuboid.getBendZ(), - cuboid.basePlane, cuboid.otherPlane, cuboid.isBendInverted(), false, cuboid.bendHeight(), bendValue); + cuboid.getBasePlane(), cuboid.getOtherPlane(), cuboid.isBendInverted(), false, cuboid.bendHeight(), bendValue); } /** diff --git a/common/src/main/java/com/zigythebird/bendable_cuboids/impl/BendableCuboid.java b/common/src/main/java/com/zigythebird/bendable_cuboids/impl/BendableCuboid.java deleted file mode 100644 index 2a37c86..0000000 --- a/common/src/main/java/com/zigythebird/bendable_cuboids/impl/BendableCuboid.java +++ /dev/null @@ -1,186 +0,0 @@ -package com.zigythebird.bendable_cuboids.impl; - -import com.mojang.blaze3d.vertex.PoseStack; -import com.mojang.blaze3d.vertex.VertexConsumer; -import com.zigythebird.bendable_cuboids.impl.compatibility.PlayerBendHelper; -import net.minecraft.core.Direction; -import net.minecraft.util.Mth; -import org.joml.Matrix4f; -import org.joml.Vector3f; -import org.joml.Vector4f; - -import java.util.function.Function; - -/** - * Should be pretty self-explanatory... - * Bend XYZ are the coordinates of the bend's center - * If you don't know the math behind it, don't try to edit. - *

- * Use {@link BendableCuboid#applyBend} to bend the cube - */ -public class BendableCuboid { - protected final Quad[] sides; - protected final RememberingPos[] positions; - - //to shift the matrix to the center axis - protected final float fixX; - protected final float fixY; - protected final float fixZ; - protected final Direction direction; - protected final Plane basePlane; - protected final Plane otherPlane; - protected final float fullSize; - - protected float bend; - - /** - * To see how you can make existing model parts bendable look at {@link PlayerBendHelper} - * Or you can use {@link BendableCuboidBuilder#build}. - */ - public BendableCuboid(Quad[] sides, RememberingPos[] positions, float fixX, float fixY, float fixZ, Direction direction, Plane basePlane, Plane otherPlane, float fullSize) { - this.sides = sides; - this.positions = positions; - this.fixX = fixX; - this.fixY = fixY; - this.fixZ = fixZ; - this.direction = direction; - this.basePlane = basePlane; - this.otherPlane = otherPlane; - this.fullSize = fullSize; - - this.applyBend(0);//Init values to render - } - - /** - * Apply bend on this cuboid - * Values are in radians - * @param bendValue bend value (Same as rotX) - * @return Transformation matrix for transforming children - */ - public Matrix4f applyBend(float bendValue) { - this.bend = bendValue; - BendApplier bendApplier = BendUtil.getBend(this, bendValue); - this.iteratePositions(bendApplier.consumer()); - return bendApplier.matrix4f(); - } - - public Matrix4f applyBendDegrees(float bendValue) { - return applyBend(bendValue * Mth.DEG_TO_RAD); - } - - public Direction getBendDirection() { - return this.direction; - } - - public float getBendX() { - return fixX; - } - - public float getBendY() { - return fixY; - } - - public float getBendZ() { - return fixZ; - } - - public Plane getBasePlane() { - return basePlane; - } - - public Plane getOtherSidePlane() { - return otherPlane; - } - - /** - * Distance between the two opposite surface of the cuboid. - * Calculate two plane distance is inefficient. - * Try to override it (If you have size) - * @return the size of the cube - */ - public float bendHeight() { - return fullSize; - } - - public boolean isBendInverted() { - return getBendDirection() == Direction.UP || getBendDirection() == Direction.SOUTH || getBendDirection() == Direction.EAST; - } - - public void iteratePositions(Function function) { - for(RememberingPos pos: positions){ - pos.setPos(function.apply(pos.getOriginalPos())); - } - } - - public float getBend() { - return bend; - } - - public void render(PoseStack.Pose matrices, VertexConsumer vertexConsumer, int light, int overlay, int color) { - for(Quad quad:sides) { - quad.render(matrices, vertexConsumer, light, overlay, color); - } - } - - public void copyState(BendableCuboid other) { - if(other instanceof BendableCuboid b){ - this.applyBend(b.bend); //This works only in J16 or higher - } - } - - /* - * A replica of {@link ModelPart.Quad} - * with IVertex and render() - */ - public static class Quad { - public final RepositionableVertex[] vertices; - - public Quad(RememberingPos[] vertices, float u1, float v1, float u2, float v2, boolean flip) { - this.vertices = new RepositionableVertex[4]; - this.vertices[0] = new RepositionableVertex(u2, v1, vertices[0]); - this.vertices[1] = new RepositionableVertex(u1, v1, vertices[1]); - this.vertices[2] = new RepositionableVertex(u1, v2, vertices[2]); - this.vertices[3] = new RepositionableVertex(u2, v2, vertices[3]); - if (flip){ - int i = vertices.length; - - for(int j = 0; j < i / 2; ++j) { - RepositionableVertex vertex = this.vertices[j]; - this.vertices[j] = this.vertices[i - 1 - j]; - this.vertices[i - 1 - j] = vertex; - } - } - } - - public void render(PoseStack.Pose matrices, VertexConsumer vertexConsumer, int light, int overlay, int color) { - Vector3f normal = this.getDirection(); - normal.mul(matrices.normal()); - - for (int i = 0; i != 4; ++i){ - IVertex vertex = this.vertices[i]; - Vector3f vertexPos = vertex.getPos(); - Vector4f pos = new Vector4f(vertexPos.x/16f, vertexPos.y/16f, vertexPos.z/16f, 1); - pos.mul(matrices.pose()); - vertexConsumer.addVertex(pos.x, pos.y, pos.z, color, vertex.getU(), vertex.getV(), overlay, light, normal.x, normal.y, normal.z); - } - } - - /** - * calculate the normal vector from the vertices' coordinates with cross-product - * @return the normal vector (direction) - */ - private Vector3f getDirection() { - Vector3f buf = new Vector3f(vertices[3].getPos()); - buf.mul(-1); - Vector3f vecB = new Vector3f(vertices[1].getPos()); - vecB.add(buf); - buf = new Vector3f(vertices[2].getPos()); - buf.mul(-1); - Vector3f vecA = new Vector3f(vertices[0].getPos()); - vecA.add(buf); - vecA.cross(vecB); - // Return the cross-product, if it's zero then return anything non-zero to not cause crash... - return vecA.normalize().isFinite() ? vecA : Direction.NORTH.step(); - } - } -} diff --git a/common/src/main/java/com/zigythebird/bendable_cuboids/impl/BendableCuboidBuilder.java b/common/src/main/java/com/zigythebird/bendable_cuboids/impl/BendableCuboidBuilder.java deleted file mode 100644 index 34226db..0000000 --- a/common/src/main/java/com/zigythebird/bendable_cuboids/impl/BendableCuboidBuilder.java +++ /dev/null @@ -1,119 +0,0 @@ -package com.zigythebird.bendable_cuboids.impl; - -import net.minecraft.core.Direction; -import org.joml.Vector3f; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashMap; - -public class BendableCuboidBuilder { - public Direction direction; - - public BendableCuboidBuilder setDirection(Direction d) { - this.direction = d; - return this; - } - - public BendableCuboid build(BendableCuboidData data) { - ArrayList planes = new ArrayList<>(); - HashMap positions = new HashMap<>(); - float minX = data.x, minY = data.y, minZ = data.z, maxX = data.x + data.sizeX, maxY = data.y + data.sizeY, maxZ = data.z + data.sizeZ; - float pminX = data.x - data.extraX, pminY = data.y - data.extraY, pminZ = data.z - data.extraZ, pmaxX = maxX + data.extraX, pmaxY = maxY + data.extraY, pmaxZ = maxZ + data.extraZ; - if(data.mirror){ - float tmp = pminX; - pminX = pmaxX; - pmaxX = tmp; - } - - //this is copy from MC's cuboid constructor - Vector3f vertex1 = new Vector3f(pminX, pminY, pminZ); //west south down - Vector3f vertex2 = new Vector3f(pmaxX, pminY, pminZ); //east south down - Vector3f vertex3 = new Vector3f(pmaxX, pmaxY, pminZ); //east south up - Vector3f vertex4 = new Vector3f(pminX, pmaxY, pminZ); //west south up - Vector3f vertex5 = new Vector3f(pminX, pminY, pmaxZ); //west north down - Vector3f vertex6 = new Vector3f(pmaxX, pminY, pmaxZ); //east north down - Vector3f vertex7 = new Vector3f(pmaxX, pmaxY, pmaxZ); //east north up - Vector3f vertex8 = new Vector3f(pminX, pmaxY, pmaxZ); //west north up - - int j = data.u; - int k = (int) (data.u + data.sizeZ); - int l = (int) (data.u + data.sizeZ + data.sizeX); - int m = (int) (data.u + data.sizeZ + data.sizeX + data.sizeX); - int n = (int) (data.u + data.sizeZ + data.sizeX + data.sizeZ); - int o = (int) (data.u + data.sizeZ + data.sizeX + data.sizeZ + data.sizeX); - int p = data.v; - int q = (int) (data.v + data.sizeZ); - int r = (int) (data.v + data.sizeZ + data.sizeY); - float textureWidth = data.textureWidth; - float textureHeight = data.textureHeight; - boolean mirror = data.mirror; - if (data.visibleFaces.contains(Direction.DOWN)) createAndAddQuads(planes, positions, new Vector3f[]{vertex6, vertex5, vertex2}, k, p, l, q, textureWidth, textureHeight, mirror); //down - if (data.visibleFaces.contains(Direction.UP)) createAndAddQuads(planes, positions, new Vector3f[]{vertex3, vertex4, vertex7}, l, q, m, p, textureWidth, textureHeight, mirror); //up - if (data.visibleFaces.contains(Direction.WEST)) createAndAddQuads(planes, positions, new Vector3f[]{vertex1, vertex5, vertex4}, j, q, k, r, textureWidth, textureHeight, mirror); //west - if (data.visibleFaces.contains(Direction.NORTH)) createAndAddQuads(planes, positions, new Vector3f[]{vertex2, vertex1, vertex3}, k, q, l, r, textureWidth, textureHeight, mirror); //north - if (data.visibleFaces.contains(Direction.EAST)) createAndAddQuads(planes, positions, new Vector3f[]{vertex6, vertex2, vertex7}, l, q, n, r, textureWidth, textureHeight, mirror); //east - if (data.visibleFaces.contains(Direction.SOUTH)) createAndAddQuads(planes, positions, new Vector3f[]{vertex5, vertex6, vertex8}, n, q, o, r, textureWidth, textureHeight, mirror); //south - - Vector3f pivot = new Vector3f(0, 0, 0); - if (data.pivot >= 0) { - float size = direction.step().mul(maxX - minX, maxY - minY, maxZ - minZ).length(); - if (data.pivot <= size) { - pivot = direction.step().mul(size - (data.pivot * 2)); - vertex7 = vertex7.sub(pivot); - } - } - boolean bl = direction == Direction.UP || direction == Direction.SOUTH || direction == Direction.EAST; - Plane aPlane = new Plane(direction.step(), vertex7); - Plane bPlane = new Plane(direction.step(), vertex1); - float fullSize = - direction.step().dot(vertex1) + direction.step().dot(vertex7); - float bendX = (data.sizeX + data.x + data.x - pivot.x())/2; - float bendY = (data.sizeY + data.y + data.y - pivot.y())/2; - float bendZ = (data.sizeZ + data.z + data.z - pivot.z())/2; - return new BendableCuboid(planes.toArray(new BendableCuboid.Quad[0]), positions.values().toArray(new RememberingPos[0]), bendX, bendY, bendZ, direction, bl ? aPlane : bPlane, bl ? bPlane : aPlane, fullSize); - } - - //edge[2] can be calculated from edge 0, 1, 3... - protected void createAndAddQuads(Collection quads, HashMap positions, Vector3f[] edges, int u1, int v1, int u2, int v2, float textureWidth, float textureHeight, boolean mirror) { - int du = u2 < u1 ? 1 : -1; - int dv = v1 < v2 ? 1 : -1; - - Vector3f origin = edges[0]; - Vector3f vecU = new Vector3f(edges[1]).sub(origin); - Vector3f vecV = new Vector3f(edges[2]).sub(origin); - - float uFracScale = 1.0f / (u1 - u2); - Vector3f uStep = vecU.mul(du * uFracScale); - - float vFracScale = 1.0f / (v2 - v1); - Vector3f vStep = vecV.mul(dv * vFracScale); - - Vector3f uPos = new Vector3f(origin); - - for (int localU = u2; localU != u1; localU += du) { - Vector3f nextUPos = new Vector3f(uPos).add(uStep); - - Vector3f vPos = new Vector3f(uPos); - Vector3f nextVPos = new Vector3f(nextUPos); - - for (int localV = v1; localV != v2; localV += dv) { - int localU2 = localU + du; - int localV2 = localV + dv; - - RememberingPos rp3 = getOrCreate(positions, vPos); - RememberingPos rp0 = getOrCreate(positions, nextVPos); - vPos.add(vStep); - nextVPos.add(vStep); - RememberingPos rp2 = getOrCreate(positions, vPos); - RememberingPos rp1 = getOrCreate(positions, nextVPos); - - quads.add(new BendableCuboid.Quad(new RememberingPos[]{rp3, rp0, rp1, rp2}, localU2 / textureWidth, localV / textureHeight, localU / textureWidth, localV2 / textureHeight, mirror)); - } - uPos = nextUPos; - } - } - - protected RememberingPos getOrCreate(HashMap positions, Vector3f pos) { - return positions.computeIfAbsent(pos, p -> new RememberingPos(new Vector3f(p))); - } -} diff --git a/common/src/main/java/com/zigythebird/bendable_cuboids/impl/BendableCuboidData.java b/common/src/main/java/com/zigythebird/bendable_cuboids/impl/BendableCuboidData.java index 7acda0b..b098b9a 100644 --- a/common/src/main/java/com/zigythebird/bendable_cuboids/impl/BendableCuboidData.java +++ b/common/src/main/java/com/zigythebird/bendable_cuboids/impl/BendableCuboidData.java @@ -4,41 +4,12 @@ import java.util.Set; -public class BendableCuboidData { - /** - * Size parameters - */ - public float x, y, z, sizeX, sizeY, sizeZ; - public float extraX, extraY, extraZ; - public int u, v; - public boolean mirror = false; - public float textureWidth, textureHeight; //That will be int - public int pivot; - //public float bendX, bendY, bendZ; - public Set visibleFaces; - - public BendableCuboidData() {} - - public BendableCuboidData(int u, int v, float x, float y, float z, float sizeX, float sizeY, float sizeZ, float extraX, float extraY, float extraZ, boolean mirror, float textureWidth, float textureHeight, Set visibleFaces, int pivot) { - this.u = u; - this.v = v; - this.x = x; - this.y = y; - this.z = z; - this.sizeX = sizeX; - this.sizeY = sizeY; - this.sizeZ = sizeZ; - this.extraX = extraX; - this.extraY = extraY; - this.extraZ = extraZ; - this.mirror = mirror; - this.pivot = pivot; - this.textureWidth = textureWidth; - this.textureHeight = textureHeight; - this.visibleFaces = visibleFaces; - } - - public BendableCuboidData(int u, int v, float x, float y, float z, float sizeX, float sizeY, float sizeZ, float extraX, float extraY, float extraZ, boolean mirror, float textureWidth, float textureHeight, Set visibleFaces) { - this(u, v, x, y, z, sizeX, sizeY, sizeZ, extraX, extraY, extraZ, mirror, textureWidth, textureHeight, visibleFaces, -1); - } +public record BendableCuboidData( + int u, int v, + float sizeX, float sizeY, float sizeZ, + float extraX, float extraY, float extraZ, + boolean mirror, + float textureWidth, float textureHeight, + Set visibleFaces +) { } diff --git a/common/src/main/java/com/zigythebird/bendable_cuboids/impl/MutableModelPart.java b/common/src/main/java/com/zigythebird/bendable_cuboids/impl/MutableModelPart.java deleted file mode 100644 index 25998bb..0000000 --- a/common/src/main/java/com/zigythebird/bendable_cuboids/impl/MutableModelPart.java +++ /dev/null @@ -1,53 +0,0 @@ -package com.zigythebird.bendable_cuboids.impl; - -import com.mojang.blaze3d.vertex.PoseStack; -import com.mojang.blaze3d.vertex.VertexConsumer; -import com.zigythebird.bendable_cuboids.api.ModelPartAccessor; -import com.zigythebird.bendable_cuboids.api.MutableCuboid; -import it.unimi.dsi.fastutil.objects.ObjectArrayList; -import it.unimi.dsi.fastutil.objects.ObjectList; -import net.minecraft.client.model.geom.ModelPart; -import org.jetbrains.annotations.Nullable; - -import java.util.List; -import java.util.Map; - -/** - * ModelPart to support BendableCuboids - *

- * If you want to mutate existing Cuboids, see {@link ModelPartAccessor} and {@link MutableCuboid} - * - * This can be used with {@link BendableCuboid}. - */ -public abstract class MutableModelPart extends ModelPart { - - @Nullable - @Deprecated - private MutableModelPart last = null; - - protected final ObjectList BendableCuboids = new ObjectArrayList<>(); - - public MutableModelPart(List cuboids, Map children) { - super(cuboids, children); - } - - @Override - public void render(PoseStack matrices, VertexConsumer vertices, int light, int overlay, int color) { - super.render(matrices, vertices, light, overlay); - if(!BendableCuboids.isEmpty()){ - matrices.pushPose(); - this.translateAndRotate(matrices); - this.renderBendableCuboids(matrices.last(), vertices, light, overlay, color); - matrices.popPose(); - } - } - - protected void renderBendableCuboids(PoseStack.Pose matrices, VertexConsumer vertexConsumer, int light, int overlay, int color) { - this.BendableCuboids.forEach((cuboid)-> cuboid.render(matrices, vertexConsumer, light, overlay, color)); - } - - public void addBendableCuboid(BendableCuboid cuboid){ - this.BendableCuboids.add(cuboid); - } - -} diff --git a/common/src/main/java/com/zigythebird/bendable_cuboids/impl/Quad.java b/common/src/main/java/com/zigythebird/bendable_cuboids/impl/Quad.java new file mode 100644 index 0000000..ce01eb3 --- /dev/null +++ b/common/src/main/java/com/zigythebird/bendable_cuboids/impl/Quad.java @@ -0,0 +1,110 @@ +package com.zigythebird.bendable_cuboids.impl; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import net.minecraft.core.Direction; +import org.joml.Vector3f; +import org.joml.Vector4f; + +import java.util.List; +import java.util.Map; + +/* + * A replica of {@link ModelPart.Quad} + * with IVertex and render() + */ +public class Quad { + public final RepositionableVertex[] vertices; + + public Quad(RememberingPos[] vertices, float u1, float v1, float u2, float v2, boolean flip) { + this.vertices = new RepositionableVertex[4]; + this.vertices[0] = new RepositionableVertex(u2, v1, vertices[0]); + this.vertices[1] = new RepositionableVertex(u1, v1, vertices[1]); + this.vertices[2] = new RepositionableVertex(u1, v2, vertices[2]); + this.vertices[3] = new RepositionableVertex(u2, v2, vertices[3]); + if (flip){ + int i = vertices.length; + + for(int j = 0; j < i / 2; ++j) { + RepositionableVertex vertex = this.vertices[j]; + this.vertices[j] = this.vertices[i - 1 - j]; + this.vertices[i - 1 - j] = vertex; + } + } + } + + public void render(PoseStack.Pose matrices, VertexConsumer vertexConsumer, int light, int overlay, int color) { + Vector3f normal = this.getDirection(); + normal.mul(matrices.normal()); + + for (int i = 0; i != 4; ++i){ + IVertex vertex = this.vertices[i]; + Vector3f vertexPos = vertex.getPos(); + Vector4f pos = new Vector4f(vertexPos.x/16f, vertexPos.y/16f, vertexPos.z/16f, 1); + pos.mul(matrices.pose()); + vertexConsumer.addVertex(pos.x, pos.y, pos.z, color, vertex.getU(), vertex.getV(), overlay, light, normal.x, normal.y, normal.z); + } + } + + /** + * calculate the normal vector from the vertices' coordinates with cross-product + * @return the normal vector (direction) + */ + private Vector3f getDirection() { + Vector3f buf = new Vector3f(vertices[3].getPos()); + buf.mul(-1); + Vector3f vecB = new Vector3f(vertices[1].getPos()); + vecB.add(buf); + buf = new Vector3f(vertices[2].getPos()); + buf.mul(-1); + Vector3f vecA = new Vector3f(vertices[0].getPos()); + vecA.add(buf); + vecA.cross(vecB); + // Return the cross-product, if it's zero then return anything non-zero to not cause crash... + return vecA.normalize().isFinite() ? vecA : Direction.NORTH.step(); + } + + // edge[2] can be calculated from edge 0, 1, 3... + public static void createAndAddQuads(List quads, Map positions, Vector3f[] edges, int u1, int v1, int u2, int v2, float textureWidth, float textureHeight, boolean mirror) { + int du = u2 < u1 ? 1 : -1; + int dv = 0; + + Vector3f origin = edges[0]; + Vector3f vecU = new Vector3f(edges[1]).sub(origin); + Vector3f vecV = new Vector3f(edges[2]).sub(origin); + + float uFracScale = 1.0f / (u1 - u2); + Vector3f uStep = vecU.mul(du * uFracScale); + + float vFracScale = 1.0f / (v2 - v1); + Vector3f vStep = vecV.mul(dv * vFracScale); + + Vector3f uPos = new Vector3f(origin); + + for (int localU = u2; localU != u1; localU += du) { + Vector3f nextUPos = new Vector3f(uPos).add(uStep); + + Vector3f vPos = new Vector3f(uPos); + Vector3f nextVPos = new Vector3f(nextUPos); + + for (int localV = v1; localV != v2; localV += dv) { + int localU2 = localU + du; + int localV2 = localV + dv; + + RememberingPos rp3 = getOrCreate(positions, vPos); + RememberingPos rp0 = getOrCreate(positions, nextVPos); + vPos.add(vStep); + nextVPos.add(vStep); + RememberingPos rp2 = getOrCreate(positions, vPos); + RememberingPos rp1 = getOrCreate(positions, nextVPos); + + quads.add(new Quad(new RememberingPos[]{rp3, rp0, rp1, rp2}, localU2 / textureWidth, localV / textureHeight, localU / textureWidth, localV2 / textureHeight, mirror)); + } + uPos = nextUPos; + } + } + + public static RememberingPos getOrCreate(Map positions, Vector3f pos) { + return positions.computeIfAbsent(pos, p -> new RememberingPos(new Vector3f(p))); + } +} diff --git a/common/src/main/java/com/zigythebird/bendable_cuboids/impl/accessors/IModelPartAccessor.java b/common/src/main/java/com/zigythebird/bendable_cuboids/impl/accessors/IModelPartAccessor.java deleted file mode 100644 index 1238bd8..0000000 --- a/common/src/main/java/com/zigythebird/bendable_cuboids/impl/accessors/IModelPartAccessor.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.zigythebird.bendable_cuboids.impl.accessors; - -import net.minecraft.client.model.geom.ModelPart; - -import java.util.List; -import java.util.Map; - -/** - * Basic operation to access cuboid in ModelPart - */ -public interface IModelPartAccessor { - List bendableCuboids$getCuboids(); - - Map bendableCuboids$getChildren(); //easy to search in it :D -} diff --git a/common/src/main/java/com/zigythebird/bendable_cuboids/impl/accessors/IPlayerModel.java b/common/src/main/java/com/zigythebird/bendable_cuboids/impl/accessors/IPlayerModel.java deleted file mode 100644 index d7f7e84..0000000 --- a/common/src/main/java/com/zigythebird/bendable_cuboids/impl/accessors/IPlayerModel.java +++ /dev/null @@ -1,6 +0,0 @@ -package com.zigythebird.bendable_cuboids.impl.accessors; - -public interface IPlayerModel { - void bendableCuboids$prepForFirstPersonRender(); - boolean bendableCuboids$isFirstPersonRender(); -} diff --git a/common/src/main/java/com/zigythebird/bendable_cuboids/impl/compatibility/PlayerBendHelper.java b/common/src/main/java/com/zigythebird/bendable_cuboids/impl/compatibility/PlayerBendHelper.java index b884dcf..fbe7dab 100644 --- a/common/src/main/java/com/zigythebird/bendable_cuboids/impl/compatibility/PlayerBendHelper.java +++ b/common/src/main/java/com/zigythebird/bendable_cuboids/impl/compatibility/PlayerBendHelper.java @@ -1,39 +1,34 @@ package com.zigythebird.bendable_cuboids.impl.compatibility; import com.mojang.blaze3d.vertex.PoseStack; +import com.zigythebird.bendable_cuboids.api.BendableCube; +import com.zigythebird.bendable_cuboids.api.BendableModelPart; import com.zigythebird.bendable_cuboids.impl.BendUtil; -import com.zigythebird.bendable_cuboids.api.ModelPartAccessor; -import com.zigythebird.bendable_cuboids.api.MutableCuboid; -import com.zigythebird.bendable_cuboids.impl.BendableCuboidBuilder; import net.minecraft.client.model.geom.ModelPart; import net.minecraft.core.Direction; -import java.util.Optional; - public class PlayerBendHelper { public static void bend(ModelPart modelPart, float rotation) { - Optional optionalMutableCuboid = ModelPartAccessor.optionalGetCuboid(modelPart, 0); - if (optionalMutableCuboid.isPresent()) { - MutableCuboid cuboid = optionalMutableCuboid.get(); - // Don't enable bend until rotation is bigger than epsilon. - // This should avoid unnecessary heavy calculations. - if (Math.abs(rotation) >= 0.0001f && cuboid.bendableCuboids$hasMutator("bend")) { - cuboid.bendableCuboids$getAndActivateMutator("bend").applyBend(rotation); - } - else cuboid.bendableCuboids$getAndActivateMutator(null); + BendableCube cube = ((BendableModelPart) modelPart).bc$getCuboid(0); + if (cube == null) return; + + // Don't enable bend until rotation is bigger than epsilon. + // This should avoid unnecessary heavy calculations. + if (Math.abs(rotation) >= 0.0001f) { + cube.applyBend(rotation); + } else { + cube.applyBend(0); } } public static void initBend(ModelPart modelPart, Direction direction) { - ModelPartAccessor.optionalGetCuboid(modelPart, 0).ifPresent(mutableModelPart -> mutableModelPart.bendableCuboids$registerMutator("bend", data -> new BendableCuboidBuilder().setDirection(direction).build(data))); + BendableCube cube = ((BendableModelPart) modelPart).bc$getCuboid(0); + if (cube != null) cube.rebuild(direction); } public static void initCapeBend(ModelPart modelPart) { - ModelPartAccessor.optionalGetCuboid(modelPart, 0).ifPresent(mutableModelPart -> mutableModelPart.bendableCuboids$registerMutator("bend", data -> { - data.pivot = 6; - - return new BendableCuboidBuilder().setDirection(Direction.UP).build(data); - })); + BendableCube cube = ((BendableModelPart) modelPart).bc$getCuboid(0); + if (cube != null) cube.rebuild(Direction.UP, 6); } public static void applyTorsoBendToMatrix(PoseStack poseStack, float bend) { diff --git a/common/src/main/java/com/zigythebird/bendable_cuboids/mixin/CubeMixin.java b/common/src/main/java/com/zigythebird/bendable_cuboids/mixin/CubeMixin.java new file mode 100644 index 0000000..4e311b9 --- /dev/null +++ b/common/src/main/java/com/zigythebird/bendable_cuboids/mixin/CubeMixin.java @@ -0,0 +1,220 @@ +package com.zigythebird.bendable_cuboids.mixin; + +import com.llamalad7.mixinextras.injector.wrapmethod.WrapMethod; +import com.llamalad7.mixinextras.injector.wrapoperation.Operation; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import com.zigythebird.bendable_cuboids.api.BendableCube; +import com.zigythebird.bendable_cuboids.impl.*; +import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.core.Direction; +import org.joml.Matrix4f; +import org.joml.Vector3f; +import org.spongepowered.asm.mixin.*; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import java.util.*; +import java.util.function.Function; + +import static com.zigythebird.bendable_cuboids.impl.Quad.createAndAddQuads; + +@Mixin(ModelPart.Cube.class) +public class CubeMixin implements BendableCube { + @Shadow + @Final + public float minX; + @Shadow + @Final + public float minY; + @Shadow + @Final + public float minZ; + @Shadow + @Final + public float maxX; + @Shadow + @Final + public float maxY; + @Shadow + @Final + public float maxZ; + + @Unique + private BendableCuboidData bc$data; + + @Unique + private final Vector3f[] bc$vertices = new Vector3f[8]; + @Unique + private Quad[] sides; + @Unique + private RememberingPos[] positions; + + @Unique + protected float bc$fixX; + @Unique + protected float bc$fixY; + @Unique + protected float bc$fixZ; + @Unique + protected Direction bc$direction; + @Unique + protected Plane bc$basePlane; + @Unique + protected Plane bc$otherPlane; + @Unique + protected float bc$fullSize; + + @Unique + protected float bc$bend; + + @Inject(method = "", at = @At(value = "RETURN")) + private void constructor(int u, int v, float x, float y, float z, float sizeX, float sizeY, float sizeZ, float extraX, float extraY, float extraZ, boolean mirror, float textureWidth, float textureHeight, Set visibleFaces, CallbackInfo ci){ + this.bc$data = new BendableCuboidData(u, v, sizeX, sizeY, sizeZ, extraX, extraY, extraZ, mirror, textureWidth, textureHeight, visibleFaces); + } + + @Override + public void rebuild(Direction direction, int point) { + if (this.sides == null || this.positions == null) bc$build(); + + this.bc$direction = direction; + + Vector3f pivot = new Vector3f(0, 0, 0); + if (point >= 0) { + float size = direction.step().mul(bc$data.sizeX(), bc$data.sizeY(), bc$data.sizeZ()).length(); + if (point <= size) { + pivot = direction.step().mul(size - (point * 2)); + bc$vertices[6] = bc$vertices[6].sub(pivot); + } + } + boolean bl = direction == Direction.UP || direction == Direction.SOUTH || direction == Direction.EAST; + Plane aPlane = new Plane(direction.step(), bc$vertices[6]); + Plane bPlane = new Plane(direction.step(), bc$vertices[0]); + this.bc$basePlane = bl ? aPlane : bPlane; + this.bc$otherPlane = bl ? bPlane : aPlane; + + this.bc$fullSize = -direction.step().dot(bc$vertices[0]) + direction.step().dot(bc$vertices[6]); + this.bc$fixX = (bc$data.sizeX() + minX + minX - pivot.x())/2; + this.bc$fixY = (bc$data.sizeY() + minY + minY - pivot.y())/2; + this.bc$fixZ = (bc$data.sizeZ() + minZ + minZ - pivot.z())/2; + } + + @Unique + private void bc$build() { + List planes = new ArrayList<>(); + Map positions = new HashMap<>(); + float pminX = minX - bc$data.extraX(), pminY = minY - bc$data.extraY(), pminZ = minZ - bc$data.extraZ(), pmaxX = maxX + bc$data.extraX(), pmaxY = maxY + bc$data.extraY(), pmaxZ = maxZ + bc$data.extraZ(); + if (bc$data.mirror()) { + float tmp = pminX; + pminX = pmaxX; + pmaxX = tmp; + } + + //this is copy from MC's cuboid constructor + this.bc$vertices[0] = new Vector3f(pminX, pminY, pminZ); //west south down + this.bc$vertices[1] = new Vector3f(pmaxX, pminY, pminZ); //east south down + this.bc$vertices[2] = new Vector3f(pmaxX, pmaxY, pminZ); //east south up + this.bc$vertices[3] = new Vector3f(pminX, pmaxY, pminZ); //west south up + this.bc$vertices[4] = new Vector3f(pminX, pminY, pmaxZ); //west north down + this.bc$vertices[5] = new Vector3f(pmaxX, pminY, pmaxZ); //east north down + this.bc$vertices[6] = new Vector3f(pmaxX, pmaxY, pmaxZ); //east north up + this.bc$vertices[7] = new Vector3f(pminX, pmaxY, pmaxZ); //west north up + + int j = bc$data.u(); + int k = (int) (bc$data.u() + bc$data.sizeZ()); + int l = (int) (bc$data.u() + bc$data.sizeZ() + bc$data.sizeX()); + int m = (int) (bc$data.u() + bc$data.sizeZ() + bc$data.sizeX() + bc$data.sizeX()); + int n = (int) (bc$data.u() + bc$data.sizeZ() + bc$data.sizeX() + bc$data.sizeZ()); + int o = (int) (bc$data.u() + bc$data.sizeZ() + bc$data.sizeX() + bc$data.sizeZ() + bc$data.sizeX()); + int p = bc$data.v(); + int q = (int) (bc$data.v() + bc$data.sizeZ()); + int r = (int) (bc$data.v() + bc$data.sizeZ() + bc$data.sizeY()); + float textureWidth = bc$data.textureWidth(); + float textureHeight = bc$data.textureHeight(); + boolean mirror = bc$data.mirror(); + if (bc$data.visibleFaces().contains(Direction.DOWN)) createAndAddQuads(planes, positions, new Vector3f[]{bc$vertices[5], bc$vertices[4], bc$vertices[1]}, k, p, l, q, textureWidth, textureHeight, mirror); //down + if (bc$data.visibleFaces().contains(Direction.UP)) createAndAddQuads(planes, positions, new Vector3f[]{bc$vertices[2], bc$vertices[3], bc$vertices[6]}, l, q, m, p, textureWidth, textureHeight, mirror); //up + if (bc$data.visibleFaces().contains(Direction.WEST)) createAndAddQuads(planes, positions, new Vector3f[]{bc$vertices[0], bc$vertices[4], bc$vertices[3]}, j, q, k, r, textureWidth, textureHeight, mirror); //west + if (bc$data.visibleFaces().contains(Direction.NORTH)) createAndAddQuads(planes, positions, new Vector3f[]{bc$vertices[1], bc$vertices[0], bc$vertices[2]}, k, q, l, r, textureWidth, textureHeight, mirror); //north + if (bc$data.visibleFaces().contains(Direction.EAST)) createAndAddQuads(planes, positions, new Vector3f[]{bc$vertices[5], bc$vertices[1], bc$vertices[6]}, l, q, n, r, textureWidth, textureHeight, mirror); //east + if (bc$data.visibleFaces().contains(Direction.SOUTH)) createAndAddQuads(planes, positions, new Vector3f[]{bc$vertices[4], bc$vertices[5], bc$vertices[7]}, n, q, o, r, textureWidth, textureHeight, mirror); //south + + this.sides = planes.toArray(new Quad[0]); + this.positions = positions.values().toArray(new RememberingPos[0]); + } + + @WrapMethod(method = "compile") + private void bc$render(PoseStack.Pose pose, VertexConsumer buffer, int packedLight, int packedOverlay, int color, Operation original) { + if (bc$bend == 0) { + original.call(pose, buffer, packedLight, packedOverlay, color); + return; + } + + for (Quad quad : sides) { + quad.render(pose, buffer, packedLight, packedOverlay, color); + } + } + + /** + * Apply bend on this cuboid + * Values are in radians + * @param bendValue bend value (Same as rotX) + * @return Transformation matrix for transforming children + */ + @Override + public Matrix4f applyBend(float bendValue) { + this.bc$bend = bendValue; + BendApplier bendApplier = BendUtil.getBend(this, bendValue); + bc$iteratePositions(bendApplier.consumer()); + return bendApplier.matrix4f(); + } + + + @Override + public Direction getBendDirection() { + return this.bc$direction; + } + + @Override + public float getBendX() { + return this.bc$fixX; + } + + @Override + public float getBendY() { + return this.bc$fixY; + } + + @Override + public float getBendZ() { + return this.bc$fixZ; + } + + @Override + public Plane getBasePlane() { + return this.bc$basePlane; + } + + @Override + public Plane getOtherPlane() { + return this.bc$otherPlane; + } + + @Override + public float bendHeight() { + return this.bc$fullSize; + } + + @Unique + public void bc$iteratePositions(Function function) { + for (RememberingPos pos: this.positions) { + pos.setPos(function.apply(pos.getOriginalPos())); + } + } + + @Override + public float getBend() { + return this.bc$bend; + } +} diff --git a/common/src/main/java/com/zigythebird/bendable_cuboids/mixin/CuboidMutator.java b/common/src/main/java/com/zigythebird/bendable_cuboids/mixin/CuboidMutator.java deleted file mode 100644 index 167718f..0000000 --- a/common/src/main/java/com/zigythebird/bendable_cuboids/mixin/CuboidMutator.java +++ /dev/null @@ -1,140 +0,0 @@ -package com.zigythebird.bendable_cuboids.mixin; - -import com.mojang.blaze3d.vertex.PoseStack; -import com.mojang.blaze3d.vertex.VertexConsumer; -import com.zigythebird.bendable_cuboids.api.MutableCuboid; -import com.zigythebird.bendable_cuboids.impl.BendableCuboid; -import com.zigythebird.bendable_cuboids.impl.BendableCuboidData; -import net.minecraft.client.model.geom.ModelPart; -import net.minecraft.core.Direction; -import net.minecraft.util.Tuple; -import org.jetbrains.annotations.Nullable; -import org.spongepowered.asm.mixin.*; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -import java.util.HashMap; -import java.util.Set; -import java.util.function.Function; - -@Mixin(ModelPart.Cube.class) -public class CuboidMutator implements MutableCuboid { - @Shadow - @Final - public float minX; - @Shadow - @Final - public float minY; - @Shadow - @Final - public float minZ; - //Store the mutators and the mutator builders. - - @Unique - private final HashMap mutators = new HashMap<>(); - - @Unique - private final HashMap> mutatorBuilders = new HashMap<>(); - - @Unique - private BendableCuboidData partData; - - @Nullable - @Unique - private BendableCuboid activeMutator; - - @Nullable - @Unique - private String activeMutatorID; - - @Inject(method = "", at = @At(value = "RETURN")) - private void constructor(int u, int v, float x, float y, float z, float sizeX, float sizeY, float sizeZ, float extraX, float extraY, float extraZ, boolean mirror, float textureWidth, float textureHeight, Set visibleFaces, CallbackInfo ci){ - partData = new BendableCuboidData(u, v, minX, minY, minZ, sizeX, sizeY, sizeZ, extraX, extraY, extraZ, mirror, textureWidth, textureHeight, visibleFaces); - } - - @Override - public boolean bendableCuboids$registerMutator(String name, Function builder) { - if(mutatorBuilders.containsKey(name)) return false; - if(builder == null) throw new NullPointerException("builder can not be null"); - mutatorBuilders.put(name, builder); - return true; - } - - @Override - public boolean bendableCuboids$unregisterMutator(String name) { - if(mutatorBuilders.remove(name) != null){ - if(name.equals(activeMutatorID)){ - activeMutator = null; - activeMutatorID = null; - } - mutators.remove(name); - - return true; - } - return false; - } - - @Nullable - @Override - public Tuple bendableCuboids$getActiveMutator() { - return activeMutator == null ? null : new Tuple<>(activeMutatorID, activeMutator); - } - - @Override - public boolean bendableCuboids$hasMutator(String key) { - return mutators.containsKey(key) || mutatorBuilders.containsKey(key); - } - - @Nullable - @Override - public Function bendableCuboids$getCuboidBuilder(String key) { - return mutatorBuilders.get(key); - } - - @Nullable - @Override - public BendableCuboid bendableCuboids$getMutator(String name) { - return mutators.get(name); - } - - @Nullable - @Override - public BendableCuboid bendableCuboids$getAndActivateMutator(@Nullable String name) { - if(name == null){ - activeMutatorID = null; - activeMutator = null; - return null; - } - if(mutatorBuilders.containsKey(name)){ - if(!mutators.containsKey(name)){ - mutators.put(name, mutatorBuilders.get(name).apply(partData)); - } - activeMutatorID = name; - return activeMutator = mutators.get(name); - } - return null; - } - - @SuppressWarnings("ConstantConditions") - @Override - public void bendableCuboids$copyStateFrom(MutableCuboid other) { - if(other.bendableCuboids$getActiveMutator() == null){ - activeMutator = null; - activeMutatorID = null; - } - else { - if(this.bendableCuboids$getAndActivateMutator(other.bendableCuboids$getActiveMutator().getA()) != null){ - activeMutator.copyState(other.bendableCuboids$getActiveMutator().getB()); - } - } - } - - @Inject(method = "compile", at = @At(value = "HEAD"), cancellable = true) - private void renderRedirect(PoseStack.Pose entry, VertexConsumer vertexConsumer, int light, int overlay, int color, CallbackInfo ci){ - if(bendableCuboids$getActiveMutator() != null){ - bendableCuboids$getActiveMutator().getB().render(entry, vertexConsumer, light, overlay, color); - ci.cancel(); - } - } -} diff --git a/common/src/main/java/com/zigythebird/bendable_cuboids/mixin/IModelPartMixin.java b/common/src/main/java/com/zigythebird/bendable_cuboids/mixin/IModelPartMixin.java deleted file mode 100644 index 7cb6519..0000000 --- a/common/src/main/java/com/zigythebird/bendable_cuboids/mixin/IModelPartMixin.java +++ /dev/null @@ -1,71 +0,0 @@ -package com.zigythebird.bendable_cuboids.mixin; - -import com.llamalad7.mixinextras.injector.wrapoperation.Operation; -import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; -import com.mojang.blaze3d.vertex.PoseStack; -import com.mojang.blaze3d.vertex.VertexConsumer; -import com.zigythebird.bendable_cuboids.api.MutableCuboid; -import com.zigythebird.bendable_cuboids.impl.accessors.IModelPartAccessor; -import net.minecraft.client.model.geom.ModelPart; -import org.spongepowered.asm.mixin.Final; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.Unique; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -import java.util.Iterator; -import java.util.List; -import java.util.Map; - -@Mixin(ModelPart.class) -public abstract class IModelPartMixin implements IModelPartAccessor { - @Shadow @Final private Map children; - - @Shadow @Final private List cubes; - - @Unique - private boolean bendableCuboids$hasMutatedCuboid = false; - - @Override - public List bendableCuboids$getCuboids() { - bendableCuboids$hasMutatedCuboid = true; - return cubes; - } - - @Override - public Map bendableCuboids$getChildren() { - return children; - } - - @Inject(method = "copyFrom", at = @At("RETURN")) - private void copyTransformExtended(ModelPart part, CallbackInfo ci){ - if (((IModelPartAccessor)part).bendableCuboids$getCuboids() == null || cubes == null) return; // Not copying state - Iterator iterator0 = ((IModelPartAccessor)part).bendableCuboids$getCuboids().iterator(); - Iterator iterator1 = cubes.iterator(); - - while (iterator0.hasNext() && iterator1.hasNext()){ - MutableCuboid cuboid1 = (MutableCuboid) iterator1.next(); - MutableCuboid cuboid0 = (MutableCuboid) iterator0.next(); - cuboid1.bendableCuboids$copyStateFrom(cuboid0); - } - } - - @WrapOperation(method = "render(Lcom/mojang/blaze3d/vertex/PoseStack;Lcom/mojang/blaze3d/vertex/VertexConsumer;III)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/model/geom/ModelPart;compile(Lcom/mojang/blaze3d/vertex/PoseStack$Pose;Lcom/mojang/blaze3d/vertex/VertexConsumer;III)V"), require = 0) //It might not find anything if OF already broke the game - private void redirectRenderCuboids(ModelPart modelPart, PoseStack.Pose entry, VertexConsumer vertexConsumer, int light, int overlay, int color, Operation original){ - bendableCuboids$redirectedFunction(modelPart, entry, vertexConsumer, light, overlay, color, original); - } - - @Unique - private void bendableCuboids$redirectedFunction(ModelPart modelPart, PoseStack.Pose entry, VertexConsumer vertexConsumer, int light, int overlay, int color, Operation original) { - if(!bendableCuboids$hasMutatedCuboid || cubes.size() == 1 && ((MutableCuboid)cubes.get(0)).bendableCuboids$getActiveMutator() == null){ - original.call(modelPart, entry, vertexConsumer, light, overlay, color); - } - else { - for(ModelPart.Cube cuboid:cubes){ - cuboid.compile(entry, vertexConsumer, light, overlay, color); - } - } - } -} diff --git a/common/src/main/java/com/zigythebird/bendable_cuboids/mixin/ModelPartMixin.java b/common/src/main/java/com/zigythebird/bendable_cuboids/mixin/ModelPartMixin.java new file mode 100644 index 0000000..0399f7c --- /dev/null +++ b/common/src/main/java/com/zigythebird/bendable_cuboids/mixin/ModelPartMixin.java @@ -0,0 +1,24 @@ +package com.zigythebird.bendable_cuboids.mixin; + +import com.zigythebird.bendable_cuboids.api.BendableCube; +import com.zigythebird.bendable_cuboids.api.BendableModelPart; +import net.minecraft.client.model.geom.ModelPart; +import org.jetbrains.annotations.Nullable; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; + +import java.util.List; + +@Mixin(ModelPart.class) +public class ModelPartMixin implements BendableModelPart { + @Shadow + @Final + private List cubes; + + @Override + public @Nullable BendableCube bc$getCuboid(int index) { + if (index > this.cubes.size() || index < 0) return null; + return this.cubes.get(index); + } +} diff --git a/common/src/main/resources/architectury.common.json b/common/src/main/resources/architectury.common.json index f7316ae..2c678b6 100644 --- a/common/src/main/resources/architectury.common.json +++ b/common/src/main/resources/architectury.common.json @@ -1,3 +1,11 @@ { + "injected_interfaces": { + "net/minecraft/class_630$class_628": [ + "com/zigythebird/bendable_cuboids/api/BendableCube" + ], + "net/minecraft/class_630": [ + "com/zigythebird/bendable_cuboids/api/BendableModelPart" + ] + }, "accessWidener": "bendable_cuboids.accesswidener" } \ No newline at end of file diff --git a/common/src/main/resources/bendable_cuboids.mixins.json b/common/src/main/resources/bendable_cuboids.mixins.json index b603b53..d85cbca 100644 --- a/common/src/main/resources/bendable_cuboids.mixins.json +++ b/common/src/main/resources/bendable_cuboids.mixins.json @@ -5,8 +5,8 @@ "plugin": "com.zigythebird.bendable_cuboids.ModMixinPlugin", "compatibilityLevel": "JAVA_21", "client": [ - "CuboidMutator", - "IModelPartMixin", + "CubeMixin", + "ModelPartMixin", "playeranim.CapeLayerAccessor_playerAnim", "playeranim.CapeLayerMixin_playerAnim", "playeranim.ElytraLayerMixin_playerAnim", From 1ee42605b532ecac9a87dd181c5465580413abfe Mon Sep 17 00:00:00 2001 From: dima-dencep Date: Wed, 9 Jul 2025 10:23:26 +0700 Subject: [PATCH 15/23] Reduce quads --- .../bendable_cuboids/impl/Quad.java | 38 +++++++------------ 1 file changed, 14 insertions(+), 24 deletions(-) diff --git a/common/src/main/java/com/zigythebird/bendable_cuboids/impl/Quad.java b/common/src/main/java/com/zigythebird/bendable_cuboids/impl/Quad.java index ce01eb3..11bd3e7 100644 --- a/common/src/main/java/com/zigythebird/bendable_cuboids/impl/Quad.java +++ b/common/src/main/java/com/zigythebird/bendable_cuboids/impl/Quad.java @@ -66,41 +66,31 @@ private Vector3f getDirection() { // edge[2] can be calculated from edge 0, 1, 3... public static void createAndAddQuads(List quads, Map positions, Vector3f[] edges, int u1, int v1, int u2, int v2, float textureWidth, float textureHeight, boolean mirror) { - int du = u2 < u1 ? 1 : -1; - int dv = 0; + int dv = v2 > v1 ? 1 : -1; Vector3f origin = edges[0]; - Vector3f vecU = new Vector3f(edges[1]).sub(origin); Vector3f vecV = new Vector3f(edges[2]).sub(origin); - float uFracScale = 1.0f / (u1 - u2); - Vector3f uStep = vecU.mul(du * uFracScale); - float vFracScale = 1.0f / (v2 - v1); - Vector3f vStep = vecV.mul(dv * vFracScale); + Vector3f vStep = new Vector3f(vecV).mul(dv * vFracScale); Vector3f uPos = new Vector3f(origin); + Vector3f nextUPos = new Vector3f(edges[1]); - for (int localU = u2; localU != u1; localU += du) { - Vector3f nextUPos = new Vector3f(uPos).add(uStep); - - Vector3f vPos = new Vector3f(uPos); - Vector3f nextVPos = new Vector3f(nextUPos); + Vector3f vPos = new Vector3f(uPos); + Vector3f nextVPos = new Vector3f(nextUPos); - for (int localV = v1; localV != v2; localV += dv) { - int localU2 = localU + du; - int localV2 = localV + dv; + for (int localV = v1; localV != v2; localV += dv) { + int localV2 = localV + dv; - RememberingPos rp3 = getOrCreate(positions, vPos); - RememberingPos rp0 = getOrCreate(positions, nextVPos); - vPos.add(vStep); - nextVPos.add(vStep); - RememberingPos rp2 = getOrCreate(positions, vPos); - RememberingPos rp1 = getOrCreate(positions, nextVPos); + RememberingPos rp3 = getOrCreate(positions, vPos); + RememberingPos rp0 = getOrCreate(positions, nextVPos); + vPos.add(vStep); + nextVPos.add(vStep); + RememberingPos rp2 = getOrCreate(positions, vPos); + RememberingPos rp1 = getOrCreate(positions, nextVPos); - quads.add(new Quad(new RememberingPos[]{rp3, rp0, rp1, rp2}, localU2 / textureWidth, localV / textureHeight, localU / textureWidth, localV2 / textureHeight, mirror)); - } - uPos = nextUPos; + quads.add(new Quad(new RememberingPos[]{rp3, rp0, rp1, rp2}, u1 / textureWidth, localV / textureHeight, u2 / textureWidth, localV2 / textureHeight, mirror)); } } From 9ee7bbc04e689a8cdbc208284bf324a4668137f2 Mon Sep 17 00:00:00 2001 From: dima-dencep Date: Wed, 9 Jul 2025 10:35:19 +0700 Subject: [PATCH 16/23] Reduce quads --- .../bendable_cuboids/impl/Quad.java | 25 ++++++++++++------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/common/src/main/java/com/zigythebird/bendable_cuboids/impl/Quad.java b/common/src/main/java/com/zigythebird/bendable_cuboids/impl/Quad.java index 11bd3e7..0070447 100644 --- a/common/src/main/java/com/zigythebird/bendable_cuboids/impl/Quad.java +++ b/common/src/main/java/com/zigythebird/bendable_cuboids/impl/Quad.java @@ -66,22 +66,29 @@ private Vector3f getDirection() { // edge[2] can be calculated from edge 0, 1, 3... public static void createAndAddQuads(List quads, Map positions, Vector3f[] edges, int u1, int v1, int u2, int v2, float textureWidth, float textureHeight, boolean mirror) { - int dv = v2 > v1 ? 1 : -1; + boolean positiveDirection = v2 > v1; + int dv = positiveDirection ? 2 : -2; Vector3f origin = edges[0]; Vector3f vecV = new Vector3f(edges[2]).sub(origin); - float vFracScale = 1.0f / (v2 - v1); - Vector3f vStep = new Vector3f(vecV).mul(dv * vFracScale); - - Vector3f uPos = new Vector3f(origin); - Vector3f nextUPos = new Vector3f(edges[1]); - Vector3f vPos = new Vector3f(uPos); - Vector3f nextVPos = new Vector3f(nextUPos); + Vector3f vPos = new Vector3f(origin); + Vector3f nextVPos = new Vector3f(edges[1]); - for (int localV = v1; localV != v2; localV += dv) { + for (int localV = v1; positiveDirection ? localV < v2 : localV > v2; localV += dv) { int localV2 = localV + dv; + if (positiveDirection) { + if (localV2 > v2) { + localV2 = v2; + } + } else { // negative direction + if (localV2 < v2) { + localV2 = v2; + } + } + int actual_dv = localV2 - localV; + Vector3f vStep = new Vector3f(vecV).mul(actual_dv * vFracScale); RememberingPos rp3 = getOrCreate(positions, vPos); RememberingPos rp0 = getOrCreate(positions, nextVPos); From 8de67d131aa15e0083424414857b1464bcb88f6f Mon Sep 17 00:00:00 2001 From: dima-dencep Date: Wed, 9 Jul 2025 11:03:29 +0700 Subject: [PATCH 17/23] 4 quads! --- .../bendable_cuboids/impl/Quad.java | 48 ++++++++++++++----- .../bendable_cuboids/mixin/CubeMixin.java | 18 +++---- 2 files changed, 45 insertions(+), 21 deletions(-) diff --git a/common/src/main/java/com/zigythebird/bendable_cuboids/impl/Quad.java b/common/src/main/java/com/zigythebird/bendable_cuboids/impl/Quad.java index 0070447..0ef58c4 100644 --- a/common/src/main/java/com/zigythebird/bendable_cuboids/impl/Quad.java +++ b/common/src/main/java/com/zigythebird/bendable_cuboids/impl/Quad.java @@ -3,6 +3,7 @@ import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.VertexConsumer; import net.minecraft.core.Direction; +import net.minecraft.util.Mth; import org.joml.Vector3f; import org.joml.Vector4f; @@ -14,6 +15,8 @@ * with IVertex and render() */ public class Quad { + private static final float[] ARM_QUADS = new float[] {4, 2, 2, 4}; + public final RepositionableVertex[] vertices; public Quad(RememberingPos[] vertices, float u1, float v1, float u2, float v2, boolean flip) { @@ -65,9 +68,9 @@ private Vector3f getDirection() { } // edge[2] can be calculated from edge 0, 1, 3... - public static void createAndAddQuads(List quads, Map positions, Vector3f[] edges, int u1, int v1, int u2, int v2, float textureWidth, float textureHeight, boolean mirror) { + public static void createAndAddQuads(List quads, Map positions, Vector3f[] edges, float u1, float v1, float u2, float v2, float textureWidth, float textureHeight, boolean mirror) { boolean positiveDirection = v2 > v1; - int dv = positiveDirection ? 2 : -2; + float totalTexHeight = Mth.abs(v2 - v1); Vector3f origin = edges[0]; Vector3f vecV = new Vector3f(edges[2]).sub(origin); @@ -75,20 +78,39 @@ public static void createAndAddQuads(List quads, Map v2; localV += dv) { - int localV2 = localV + dv; - if (positiveDirection) { - if (localV2 > v2) { - localV2 = v2; + for (float localV = v1; positiveDirection ? localV < v2 : localV > v2; ) { + float dv; + if (quadHeights != null) { + if (layerIndex >= quadHeights.length) { + break; } - } else { // negative direction - if (localV2 < v2) { - localV2 = v2; + dv = positiveDirection ? quadHeights[layerIndex] : -quadHeights[layerIndex]; + layerIndex++; + } else { + dv = positiveDirection ? 2 : -2; + } + + float localV2 = localV + dv; + if (quadHeights == null) { + if (positiveDirection) { + if (localV2 > v2) { + localV2 = v2; + } + } else { + if (localV2 < v2) { + localV2 = v2; + } } } - int actual_dv = localV2 - localV; - Vector3f vStep = new Vector3f(vecV).mul(actual_dv * vFracScale); + + float actual_dv = localV2 - localV; + if (actual_dv == 0) break; + vStep.set(vecV).mul(actual_dv * vFracScale); RememberingPos rp3 = getOrCreate(positions, vPos); RememberingPos rp0 = getOrCreate(positions, nextVPos); @@ -98,6 +120,8 @@ public static void createAndAddQuads(List quads, Map Date: Thu, 10 Jul 2025 17:50:05 +0700 Subject: [PATCH 18/23] Update Quad.java --- .../main/java/com/zigythebird/bendable_cuboids/impl/Quad.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/src/main/java/com/zigythebird/bendable_cuboids/impl/Quad.java b/common/src/main/java/com/zigythebird/bendable_cuboids/impl/Quad.java index 0ef58c4..5b467aa 100644 --- a/common/src/main/java/com/zigythebird/bendable_cuboids/impl/Quad.java +++ b/common/src/main/java/com/zigythebird/bendable_cuboids/impl/Quad.java @@ -15,7 +15,7 @@ * with IVertex and render() */ public class Quad { - private static final float[] ARM_QUADS = new float[] {4, 2, 2, 4}; + private static final float[] ARM_QUADS = new float[] {3, 1, 2, 2, 1, 3}; public final RepositionableVertex[] vertices; From 2e35747e7d7d1a32acf7c303b78e61a0590d8b1a Mon Sep 17 00:00:00 2001 From: dima-dencep Date: Fri, 11 Jul 2025 15:54:49 +0700 Subject: [PATCH 19/23] Remove hardcode --- .../zigythebird/bendable_cuboids/impl/Quad.java | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/common/src/main/java/com/zigythebird/bendable_cuboids/impl/Quad.java b/common/src/main/java/com/zigythebird/bendable_cuboids/impl/Quad.java index 5b467aa..831f5ee 100644 --- a/common/src/main/java/com/zigythebird/bendable_cuboids/impl/Quad.java +++ b/common/src/main/java/com/zigythebird/bendable_cuboids/impl/Quad.java @@ -7,6 +7,7 @@ import org.joml.Vector3f; import org.joml.Vector4f; +import java.util.Arrays; import java.util.List; import java.util.Map; @@ -15,8 +16,6 @@ * with IVertex and render() */ public class Quad { - private static final float[] ARM_QUADS = new float[] {3, 1, 2, 2, 1, 3}; - public final RepositionableVertex[] vertices; public Quad(RememberingPos[] vertices, float u1, float v1, float u2, float v2, boolean flip) { @@ -80,7 +79,17 @@ public static void createAndAddQuads(List quads, Map 0 && totalTexHeight % 3.0f == 0) { + int segmentHeight = (int) (totalTexHeight / 3.0f); + if (segmentHeight > 0) { + quadHeights = new float[2 + segmentHeight]; + quadHeights[0] = segmentHeight; + Arrays.fill(quadHeights, 1, 1 + segmentHeight, 1.0f); + quadHeights[1 + segmentHeight] = segmentHeight; + } + } + int layerIndex = 0; for (float localV = v1; positiveDirection ? localV < v2 : localV > v2; ) { From c18bd04e8231edaa0dfb76d0c6678ed4fbc3ff93 Mon Sep 17 00:00:00 2001 From: dima-dencep Date: Fri, 11 Jul 2025 16:49:15 +0700 Subject: [PATCH 20/23] Update Quad.java --- .../bendable_cuboids/impl/Quad.java | 61 ++++++++++++++++--- 1 file changed, 52 insertions(+), 9 deletions(-) diff --git a/common/src/main/java/com/zigythebird/bendable_cuboids/impl/Quad.java b/common/src/main/java/com/zigythebird/bendable_cuboids/impl/Quad.java index 831f5ee..0ad79ae 100644 --- a/common/src/main/java/com/zigythebird/bendable_cuboids/impl/Quad.java +++ b/common/src/main/java/com/zigythebird/bendable_cuboids/impl/Quad.java @@ -73,15 +73,18 @@ public static void createAndAddQuads(List quads, Map 0 && totalTexHeight % 3.0f == 0) { - int segmentHeight = (int) (totalTexHeight / 3.0f); + segmentHeight = (int) (totalTexHeight / 3.0f); if (segmentHeight > 0) { quadHeights = new float[2 + segmentHeight]; quadHeights[0] = segmentHeight; @@ -94,11 +97,15 @@ public static void createAndAddQuads(List quads, Map v2; ) { float dv; + boolean isMiddleSegment = false; if (quadHeights != null) { if (layerIndex >= quadHeights.length) { break; } dv = positiveDirection ? quadHeights[layerIndex] : -quadHeights[layerIndex]; + if (layerIndex > 0 && layerIndex <= segmentHeight) { + isMiddleSegment = true; + } layerIndex++; } else { dv = positiveDirection ? 2 : -2; @@ -121,14 +128,50 @@ public static void createAndAddQuads(List quads, Map 1.0f) { + boolean uPositive = u2 > u1; + float du = uPositive ? 1.0f : -1.0f; + + Vector3f uScanPosBottom = new Vector3f(vPos); + Vector3f uScanPosTop = new Vector3f(vPos).add(vStep); + + for (float localU = u1; uPositive ? localU < u2 : localU > u2; ) { + float localU2 = localU + du; + if (uPositive) { + if (localU2 > u2) localU2 = u2; + } else { + if (localU2 < u2) localU2 = u2; + } + if (localU == localU2) break; + + float actual_du = localU2 - localU; + Vector3f uStep = new Vector3f(vecU).mul(actual_du * uFracScale); + + RememberingPos bottomLeft = getOrCreate(positions, uScanPosBottom); + RememberingPos topLeft = getOrCreate(positions, uScanPosTop); + + uScanPosBottom.add(uStep); + uScanPosTop.add(uStep); - quads.add(new Quad(new RememberingPos[]{rp3, rp0, rp1, rp2}, u1 / textureWidth, localV / textureHeight, u2 / textureWidth, localV2 / textureHeight, mirror)); + RememberingPos bottomRight = getOrCreate(positions, uScanPosBottom); + RememberingPos topRight = getOrCreate(positions, uScanPosTop); + + quads.add(new Quad(new RememberingPos[]{bottomLeft, bottomRight, topRight, topLeft}, localU / textureWidth, localV / textureHeight, localU2 / textureWidth, localV2 / textureHeight, mirror)); + + localU = localU2; + } + + vPos.add(vStep); + nextVPos.add(vStep); + } else { + RememberingPos rp3 = getOrCreate(positions, vPos); + RememberingPos rp0 = getOrCreate(positions, nextVPos); + vPos.add(vStep); + nextVPos.add(vStep); + RememberingPos rp2 = getOrCreate(positions, vPos); + RememberingPos rp1 = getOrCreate(positions, nextVPos); + quads.add(new Quad(new RememberingPos[]{rp3, rp0, rp1, rp2}, u1 / textureWidth, localV / textureHeight, u2 / textureWidth, localV2 / textureHeight, mirror)); + } localV = localV2; } From dc792dded849edd605a4c37e5a4f1a1102e6427d Mon Sep 17 00:00:00 2001 From: ZigyTheBird <105124180+ZigyTheBird@users.noreply.github.com> Date: Fri, 11 Jul 2025 20:28:11 +0330 Subject: [PATCH 21/23] Fix bend UV --- .../zigythebird/bendable_cuboids/impl/Quad.java | 14 ++++++-------- forge/build.gradle | 1 + 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/common/src/main/java/com/zigythebird/bendable_cuboids/impl/Quad.java b/common/src/main/java/com/zigythebird/bendable_cuboids/impl/Quad.java index 0ad79ae..0ad6dc0 100644 --- a/common/src/main/java/com/zigythebird/bendable_cuboids/impl/Quad.java +++ b/common/src/main/java/com/zigythebird/bendable_cuboids/impl/Quad.java @@ -108,7 +108,7 @@ public static void createAndAddQuads(List quads, Map quads, Map u2; ) { - float localU2 = localU + du; + for (float localU = u2; localU != u1; localU -= du) { + float localU2 = localU - du; if (uPositive) { if (localU2 > u2) localU2 = u2; } else { @@ -150,15 +150,13 @@ public static void createAndAddQuads(List quads, Map Date: Fri, 11 Jul 2025 22:25:59 +0330 Subject: [PATCH 22/23] Fix slight bend clipping --- .../java/com/zigythebird/bendable_cuboids/impl/BendUtil.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/common/src/main/java/com/zigythebird/bendable_cuboids/impl/BendUtil.java b/common/src/main/java/com/zigythebird/bendable_cuboids/impl/BendUtil.java index 5e910f1..c68dc0b 100644 --- a/common/src/main/java/com/zigythebird/bendable_cuboids/impl/BendUtil.java +++ b/common/src/main/java/com/zigythebird/bendable_cuboids/impl/BendUtil.java @@ -34,13 +34,13 @@ public static BendApplier getBend(float bendX, float bendY, float bendZ, Plane b return new BendApplier(transformMatrix, pos -> { float distFromBase = Math.abs(basePlane.distanceTo(pos)); float distFromOther = Math.abs(otherPlane.distanceTo(pos)); - float s = (float) Math.clamp(Math.tan(finalBend/2)*pos.z, -2f, 2f); + float s = (float) Math.tan(finalBend/2)*pos.z; if (mirrorBend) { float temp = distFromBase; distFromBase = distFromOther; distFromOther = temp; } - float v = halfSize - (s < 0 ? Math.abs(s)/2 : Math.abs(s)); + float v = halfSize - (s < 0 ? Math.min(Math.abs(s)/2, 1) : Math.abs(s)); if (distFromBase < distFromOther) { if (distFromBase + distFromOther <= bendHeight && distFromBase > v) pos.y = bendY + s; From 44403b544c7fe83085f244bc7a5aa87a98d86fbe Mon Sep 17 00:00:00 2001 From: dima-dencep Date: Sat, 12 Jul 2025 17:23:54 +0700 Subject: [PATCH 23/23] Breaks --- fabric/src/main/resources/fabric.mod.json | 4 ++++ .../main/resources/META-INF/neoforge.mods.toml | 17 +++++++++++++++-- 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/fabric/src/main/resources/fabric.mod.json b/fabric/src/main/resources/fabric.mod.json index 098f390..fb13e39 100644 --- a/fabric/src/main/resources/fabric.mod.json +++ b/fabric/src/main/resources/fabric.mod.json @@ -27,6 +27,10 @@ "fabricloader": ">=0.16.14", "minecraft": ">=1.21.7" }, + "breaks": { + "ears": "*", + "skinlayers3d": "*" + }, "custom": { "modmenu": { "badges": ["library"], diff --git a/forge/src/main/resources/META-INF/neoforge.mods.toml b/forge/src/main/resources/META-INF/neoforge.mods.toml index 7f738e4..eea5cb0 100644 --- a/forge/src/main/resources/META-INF/neoforge.mods.toml +++ b/forge/src/main/resources/META-INF/neoforge.mods.toml @@ -20,7 +20,20 @@ config = "bendable_cuboids.mixins.json" [[dependencies.bendable_cuboids]] modId = "minecraft" type = "required" -mandatory = true versionRange = "[1.21.7,)" ordering = "NONE" -side = "CLIENT" \ No newline at end of file +side = "CLIENT" + +[[dependencies.bendable_cuboids]] +modId = "ears" +type = "incompatible" +versionRange = "[1.0,)" +ordering = "NONE" +side = "CLIENT" + +[[dependencies.bendable_cuboids]] +modId = "skinlayers3d" +type = "incompatible" +versionRange = "[1.0,)" +ordering = "NONE" +side = "CLIENT"