diff --git a/build.gradle b/build.gradle index d14fb18..0d0a235 100644 --- a/build.gradle +++ b/build.gradle @@ -66,7 +66,7 @@ minecraft { // However, it must be at "META-INF/accesstransformer.cfg" in the final mod jar to be loaded by Forge. // This default location is a best practice to automatically put the file in the right place in the final jar. // See https://docs.minecraftforge.net/en/latest/advanced/accesstransformers/ for more information. - // accessTransformer = file('src/main/resources/META-INF/accesstransformer.cfg') + accessTransformer = file('src/main/resources/META-INF/accesstransformer.cfg') // Default run configurations. // These can be tweaked, removed, or duplicated as needed. diff --git a/src/main/java/com/tiedup/remake/rig/TiedUpRigConstants.java b/src/main/java/com/tiedup/remake/rig/TiedUpRigConstants.java index 2e30a5f..c86ccb8 100644 --- a/src/main/java/com/tiedup/remake/rig/TiedUpRigConstants.java +++ b/src/main/java/com/tiedup/remake/rig/TiedUpRigConstants.java @@ -99,16 +99,28 @@ public final class TiedUpRigConstants { /** * En dev env : log via le consumer + throw l'exception. - * En prod : log seulement. Équivalent EF {@code TiedUpRigConstants.logAndStacktraceIfDevSide}. + * En prod : log seulement. Équivalent EF {@code EpicFightMod.logAndStacktraceIfDevSide}. */ - public static void logAndStacktraceIfDevSide( + public static void logAndStacktraceIfDevSide( java.util.function.BiConsumer logAction, String message, - java.util.function.Function exceptionFactory + java.util.function.Function exceptionFactory + ) { + logAndStacktraceIfDevSide(logAction, message, exceptionFactory, message); + } + + public static void logAndStacktraceIfDevSide( + java.util.function.BiConsumer logAction, + String message, + java.util.function.Function exceptionFactory, + String stackTraceMessage ) { logAction.accept(LOGGER, message); if (IS_DEV_ENV) { - throw exceptionFactory.apply(message); + Throwable t = exceptionFactory.apply(stackTraceMessage); + if (t instanceof RuntimeException re) throw re; + if (t instanceof Error err) throw err; + throw new RuntimeException(t); } } } diff --git a/src/main/java/com/tiedup/remake/rig/anim/AnimationManager.java b/src/main/java/com/tiedup/remake/rig/anim/AnimationManager.java index 1f81340..479ea4f 100644 --- a/src/main/java/com/tiedup/remake/rig/anim/AnimationManager.java +++ b/src/main/java/com/tiedup/remake/rig/anim/AnimationManager.java @@ -23,7 +23,7 @@ import java.util.function.Predicate; import java.util.stream.Collectors; import java.util.stream.Stream; -import org.apache.logging.log4j.Logger; +import org.slf4j.Logger; import com.google.common.collect.ImmutableMap; import com.google.common.collect.Lists; diff --git a/src/main/java/com/tiedup/remake/rig/anim/client/property/TrailInfo.java b/src/main/java/com/tiedup/remake/rig/anim/client/property/TrailInfo.java new file mode 100644 index 0000000..0feec1a --- /dev/null +++ b/src/main/java/com/tiedup/remake/rig/anim/client/property/TrailInfo.java @@ -0,0 +1,29 @@ +/* + * Derived from Epic Fight (https://github.com/Epic-Fight/epicfight) + * by the Epic Fight Team, licensed under GPLv3. + * Modifications © 2026 TiedUp! Remake Contributors, distributed under GPLv3. + */ + +package com.tiedup.remake.rig.anim.client.property; + +import com.google.gson.JsonElement; + +import net.minecraft.core.particles.SimpleParticleType; +import net.minecraft.world.phys.Vec3; + +/** + * Stub RIG Phase 0 — combat weapon particle trail. Pas utilisé dans TiedUp + * (bondage, pas d'armes actives), mais on garde l'API typée pour JSON compat. + * {@code deserialize} retourne toujours un trail neutre non-playable, donc + * le block dans StaticAnimation est court-circuité (voir {@link #playable()}). + */ +public record TrailInfo(String joint, SimpleParticleType particle, boolean playable) { + public static TrailInfo deserialize(JsonElement element) { + return new TrailInfo("", null, false); + } + + public Vec3 start() { return Vec3.ZERO; } + public Vec3 end() { return Vec3.ZERO; } + public float startTime() { return 0.0F; } + public float endTime() { return 0.0F; } +} diff --git a/src/main/java/com/tiedup/remake/rig/anim/types/ActionAnimation.java b/src/main/java/com/tiedup/remake/rig/anim/types/ActionAnimation.java index 1062f09..c66ace9 100644 --- a/src/main/java/com/tiedup/remake/rig/anim/types/ActionAnimation.java +++ b/src/main/java/com/tiedup/remake/rig/anim/types/ActionAnimation.java @@ -6,6 +6,10 @@ package com.tiedup.remake.rig.anim.types; +import net.minecraft.world.phys.Vec3; + +import com.tiedup.remake.rig.anim.AnimationVariables; +import com.tiedup.remake.rig.anim.AnimationVariables.IndependentAnimationVariableKey; import com.tiedup.remake.rig.anim.property.AnimationProperty.ActionAnimationProperty; import com.tiedup.remake.rig.armature.Armature; import com.tiedup.remake.rig.asset.AssetAccessor; @@ -19,6 +23,13 @@ import com.tiedup.remake.rig.asset.AssetAccessor; */ public class ActionAnimation extends MainFrameAnimation { + // Variables indépendantes propagées à MoveCoordFunctions (position de départ + // en coord monde + produit scalaire lookVec initial pour lerp anim→world). + public static final IndependentAnimationVariableKey BEGINNING_LOCATION = + AnimationVariables.independent((animator) -> animator.getEntityPatch().getOriginal().position(), true); + public static final IndependentAnimationVariableKey INITIAL_LOOK_VEC_DOT = + AnimationVariables.independent((animator) -> 1.0F, true); + public ActionAnimation(float transitionTime, boolean isRepeat, String registryName, AssetAccessor armature) { super(transitionTime, isRepeat, registryName, armature); } @@ -34,4 +45,18 @@ public class ActionAnimation extends MainFrameAnimation { public ActionAnimation addProperty(ActionAnimationProperty property, V value) { return this; } + + /** + * Stub — LinkAnimation.modifyPose appelle ça pour aligner la root joint + * en espace monde pendant la transition. No-op en TiedUp. + */ + public void correctRootJoint( + com.tiedup.remake.rig.anim.types.LinkAnimation linkAnimation, + com.tiedup.remake.rig.anim.Pose pose, + com.tiedup.remake.rig.patch.LivingEntityPatch entitypatch, + float time, + float partialTicks + ) { + // no-op + } } diff --git a/src/main/java/com/tiedup/remake/rig/anim/types/AttackAnimation.java b/src/main/java/com/tiedup/remake/rig/anim/types/AttackAnimation.java index e765701..0eff923 100644 --- a/src/main/java/com/tiedup/remake/rig/anim/types/AttackAnimation.java +++ b/src/main/java/com/tiedup/remake/rig/anim/types/AttackAnimation.java @@ -9,6 +9,8 @@ package com.tiedup.remake.rig.anim.types; import java.util.Collections; import java.util.List; +import net.minecraft.world.InteractionHand; + import com.tiedup.remake.rig.armature.Armature; import com.tiedup.remake.rig.asset.AssetAccessor; @@ -44,13 +46,34 @@ public class AttackAnimation extends ActionAnimation { super(isRepeat, registryName, armature); } + /** + * Stub — MoveCoordFunctions appelle ça pour calculer la reach mid-anim. + * On retourne toujours une Phase neutre (mainHand, pas de colliders), + * donc le reach retombe sur {@code entitypatch.getReach(MAIN_HAND)}. + */ + public Phase getPhaseByTime(float elapsedTime) { + return new Phase(); + } + /** * Phase d'attaque. Stub pour satisfaire {@code phase.getColliders()} - * en JsonAssetLoader. + * en JsonAssetLoader + {@code phase.hand} en MoveCoordFunctions. */ public static class Phase { - public Object[] getColliders() { - return new Object[0]; + public final InteractionHand hand = InteractionHand.MAIN_HAND; + + public JointColliderPair[] getColliders() { + return new JointColliderPair[0]; + } + } + + /** + * Stub — (Joint, Collider) pair pour les hitboxes combat. Non utilisé + * en TiedUp, juste un placeholder typé pour que JsonAssetLoader:592 compile. + */ + public static class JointColliderPair { + public com.tiedup.remake.rig.armature.Joint getFirst() { + return null; } } } diff --git a/src/main/java/com/tiedup/remake/rig/anim/types/StaticAnimation.java b/src/main/java/com/tiedup/remake/rig/anim/types/StaticAnimation.java index 992cef8..aaffa60 100644 --- a/src/main/java/com/tiedup/remake/rig/anim/types/StaticAnimation.java +++ b/src/main/java/com/tiedup/remake/rig/anim/types/StaticAnimation.java @@ -116,6 +116,11 @@ public class StaticAnimation extends DynamicAnimation implements InverseKinemati this.filehash = getFileHash(this.resourceLocation); } + /* Resourcepack animations — transitionTime par défaut */ + public StaticAnimation(boolean isRepeat, String path, AssetAccessor armature) { + this(TiedUpRigConstants.GENERAL_ANIMATION_TRANSITION_TIME, isRepeat, path, armature); + } + /* Resourcepack animations */ public StaticAnimation(float transitionTime, boolean isRepeat, String path, AssetAccessor armature) { super(transitionTime, isRepeat); diff --git a/src/main/java/com/tiedup/remake/rig/armature/types/ToolHolderArmature.java b/src/main/java/com/tiedup/remake/rig/armature/types/ToolHolderArmature.java new file mode 100644 index 0000000..be8851e --- /dev/null +++ b/src/main/java/com/tiedup/remake/rig/armature/types/ToolHolderArmature.java @@ -0,0 +1,21 @@ +/* + * Derived from Epic Fight (https://github.com/Epic-Fight/epicfight) + * by the Epic Fight Team, licensed under GPLv3. + * Modifications © 2026 TiedUp! Remake Contributors, distributed under GPLv3. + */ + +package com.tiedup.remake.rig.armature.types; + +import com.tiedup.remake.rig.armature.Joint; + +/** + * Interface pour armatures portant un outil (main gauche/droite + dos). + * TiedUp gardera cette convention pour maintenir la compat avec les JSON EF + * (rig équivalent : Tool_R, Tool_L, Tool_Back). Dans les faits, dans un + * contexte bondage, "outil" = menottes, laisse, cage, etc. + */ +public interface ToolHolderArmature { + Joint leftToolJoint(); + Joint rightToolJoint(); + Joint backToolJoint(); +} diff --git a/src/main/java/com/tiedup/remake/rig/cloth/ClothSimulator.java b/src/main/java/com/tiedup/remake/rig/cloth/ClothSimulator.java index d7dbda8..67013e2 100644 --- a/src/main/java/com/tiedup/remake/rig/cloth/ClothSimulator.java +++ b/src/main/java/com/tiedup/remake/rig/cloth/ClothSimulator.java @@ -415,10 +415,11 @@ public class ClothSimulator extends AbstractSimulator, ClothSimulator.ClothOBBCollider> entry : this.clothColliders) { - entry.getSecond().draw(poseStack, Minecraft.getInstance().renderBuffers().bufferSource(), 0xFFFFFFFF); - } + // no-op Phase 0 } // Remove entity inverted world translation while keeping the scale diff --git a/src/main/java/com/tiedup/remake/rig/mesh/HumanoidMesh.java b/src/main/java/com/tiedup/remake/rig/mesh/HumanoidMesh.java index e36409c..d63d2e7 100644 --- a/src/main/java/com/tiedup/remake/rig/mesh/HumanoidMesh.java +++ b/src/main/java/com/tiedup/remake/rig/mesh/HumanoidMesh.java @@ -49,17 +49,9 @@ public class HumanoidMesh extends SkinnedMesh { } public AssetAccessor getHumanoidArmorModel(EquipmentSlot slot) { - switch (slot) { - case HEAD: - return Meshes.HELMET; - case CHEST: - return Meshes.CHESTPLATE; - case LEGS: - return Meshes.LEGGINS; - case FEET: - return Meshes.BOOTS; - default: - return null; - } + // RIG : Meshes.{HELMET,CHESTPLATE,LEGGINS,BOOTS} strippés en Phase 0 (armor rendering + // hors scope bondage V1). Re-implém Phase 2 si besoin de rendre armures vanilla + // sur le rig — pour l'instant retour null = armor rendering off. + return null; } } diff --git a/src/main/java/com/tiedup/remake/rig/mesh/transformer/VanillaModelTransformer.java b/src/main/java/com/tiedup/remake/rig/mesh/transformer/VanillaModelTransformer.java new file mode 100644 index 0000000..aa34dba --- /dev/null +++ b/src/main/java/com/tiedup/remake/rig/mesh/transformer/VanillaModelTransformer.java @@ -0,0 +1,55 @@ +/* + * Derived from Epic Fight (https://github.com/Epic-Fight/epicfight) + * by the Epic Fight Team, licensed under GPLv3. + * Modifications © 2026 TiedUp! Remake Contributors, distributed under GPLv3. + */ + +package com.tiedup.remake.rig.mesh.transformer; + +import java.util.List; +import java.util.function.Supplier; + +import net.minecraft.client.model.geom.ModelPart; + +import com.tiedup.remake.rig.math.OpenMatrix4f; +import com.tiedup.remake.rig.mesh.Mesh; +import com.tiedup.remake.rig.mesh.MeshPartDefinition; + +/** + * Stub RIG Phase 0 — le transformer complet EF (HumanoidModel → SkinnedMesh + * runtime conversion) n'est pas porté : TiedUp utilise exclusivement GLB + + * JSON EF pour la définition des meshes. Seule la record + * {@link VanillaMeshPartDefinition} est conservée, car référencée par + * {@code JsonAssetLoader} pour instancier les parts nommées. + * + *

Phase 2 : décider si on fork le transformer pour garder la compat runtime + * avec les modèles vanilla (armor rendering), ou si on reroute vers GLB only.

+ */ +public class VanillaModelTransformer { + + public record VanillaMeshPartDefinition( + String partName, + Mesh.RenderProperties renderProperties, + List path, + OpenMatrix4f invertedParentTransform, + ModelPart root + ) implements MeshPartDefinition { + + public static MeshPartDefinition of(String partName, Mesh.RenderProperties renderProperties) { + return new VanillaMeshPartDefinition(partName, renderProperties, null, null, null); + } + + public static MeshPartDefinition of(String partName) { + return new VanillaMeshPartDefinition(partName, null, null, null, null); + } + + public static MeshPartDefinition of(String partName, List path, OpenMatrix4f invertedParentTransform, ModelPart root) { + return new VanillaMeshPartDefinition(partName, null, path, invertedParentTransform, root); + } + + @Override + public Supplier getModelPartAnimationProvider() { + return () -> null; + } + } +} diff --git a/src/main/java/com/tiedup/remake/rig/patch/LivingEntityPatch.java b/src/main/java/com/tiedup/remake/rig/patch/LivingEntityPatch.java index 4c63d4d..56b049d 100644 --- a/src/main/java/com/tiedup/remake/rig/patch/LivingEntityPatch.java +++ b/src/main/java/com/tiedup/remake/rig/patch/LivingEntityPatch.java @@ -8,6 +8,7 @@ package com.tiedup.remake.rig.patch; import javax.annotation.Nullable; +import net.minecraft.world.InteractionHand; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.phys.Vec3; @@ -65,6 +66,10 @@ public abstract class LivingEntityPatch extends EntityPa return 1.0F; } + public float getReach(InteractionHand hand) { + return getReach(); + } + public float getYRot() { return this.original.getYRot(); } diff --git a/src/main/java/com/tiedup/remake/rig/patch/PlayerPatch.java b/src/main/java/com/tiedup/remake/rig/patch/PlayerPatch.java new file mode 100644 index 0000000..b47449c --- /dev/null +++ b/src/main/java/com/tiedup/remake/rig/patch/PlayerPatch.java @@ -0,0 +1,17 @@ +/* + * Derived from Epic Fight (https://github.com/Epic-Fight/epicfight) + * by the Epic Fight Team, licensed under GPLv3. + * Modifications © 2026 TiedUp! Remake Contributors, distributed under GPLv3. + */ + +package com.tiedup.remake.rig.patch; + +import net.minecraft.world.entity.player.Player; + +/** + * Stub RIG Phase 0 — patch de capability attaché à un {@link Player}. + * Re-implém complète Phase 2 (séparation ClientPlayerPatch / ServerPlayerPatch, + * input handling, first-person, cam sync). + */ +public abstract class PlayerPatch extends LivingEntityPatch { +} diff --git a/src/main/java/com/tiedup/remake/rig/physics/ik/InverseKinematicsProvider.java b/src/main/java/com/tiedup/remake/rig/physics/ik/InverseKinematicsProvider.java index b5f1e9e..1cdd541 100644 --- a/src/main/java/com/tiedup/remake/rig/physics/ik/InverseKinematicsProvider.java +++ b/src/main/java/com/tiedup/remake/rig/physics/ik/InverseKinematicsProvider.java @@ -6,6 +6,7 @@ package com.tiedup.remake.rig.physics.ik; +import com.tiedup.remake.rig.physics.SimulationProvider; import com.tiedup.remake.rig.physics.ik.InverseKinematicsSimulator.InverseKinematicsBuilder; import com.tiedup.remake.rig.physics.ik.InverseKinematicsSimulator.InverseKinematicsObject; @@ -19,13 +20,15 @@ import com.tiedup.remake.rig.physics.ik.InverseKinematicsSimulator.InverseKinema * Conservé comme interface vide pour que {@code StaticAnimation * implements InverseKinematicsProvider} compile.

*/ -public interface InverseKinematicsProvider { +public interface InverseKinematicsProvider + extends SimulationProvider { /** * Crée les données de simulation IK. Stub par défaut : no-op. * Surchargé dans les classes qui auraient réellement de l'IK (aucune * en TiedUp). */ + @Override default InverseKinematicsObject createSimulationData( InverseKinematicsProvider provider, InverseKinematicsSimulatable simOwner, diff --git a/src/main/java/com/tiedup/remake/rig/physics/ik/InverseKinematicsSimulator.java b/src/main/java/com/tiedup/remake/rig/physics/ik/InverseKinematicsSimulator.java index 9f16716..444aa95 100644 --- a/src/main/java/com/tiedup/remake/rig/physics/ik/InverseKinematicsSimulator.java +++ b/src/main/java/com/tiedup/remake/rig/physics/ik/InverseKinematicsSimulator.java @@ -6,6 +6,13 @@ package com.tiedup.remake.rig.physics.ik; +import java.util.Optional; +import java.util.function.BooleanSupplier; + +import com.tiedup.remake.rig.armature.Joint; +import com.tiedup.remake.rig.physics.PhysicsSimulator; +import com.tiedup.remake.rig.physics.SimulationObject; + /** * RIG stub. Upstream EF : simulateur d'inverse kinematics (solveur CCD * ou FABRIK) utilisé pour attacher des membres à des points cibles @@ -15,15 +22,24 @@ package com.tiedup.remake.rig.physics.ik; * AnimationProperty compilent. Les nested types sont des stubs sans * logique.

*/ -public class InverseKinematicsSimulator { +public class InverseKinematicsSimulator implements PhysicsSimulator { - public static class InverseKinematicsObject { + @Override public void tick(InverseKinematicsSimulatable object) {} + @Override public boolean isRunning(Joint key) { return false; } + @Override public void runUntil(Joint key, InverseKinematicsProvider provider, InverseKinematicsBuilder builder, BooleanSupplier when) {} + @Override public void runWhen(Joint key, InverseKinematicsProvider provider, InverseKinematicsBuilder builder, BooleanSupplier when) {} + @Override public void restart(Joint key) {} + @Override public void stop(Joint key) {} + @Override public Optional getRunningObject(Joint key) { return Optional.empty(); } + + + public static class InverseKinematicsObject implements SimulationObject { public InverseKinematicsObject(InverseKinematicsBuilder builder) { // no-op } } - public static class InverseKinematicsBuilder { + public static class InverseKinematicsBuilder extends SimulationObject.SimulationObjectBuilder { // no-op stub } @@ -35,8 +51,8 @@ public class InverseKinematicsSimulator { public BakedInverseKinematicsDefinition bake( Object armature, Object jointTransforms, - float correctY, - float correctZ) { + boolean correctY, + boolean correctZ) { return new BakedInverseKinematicsDefinition(); } } diff --git a/src/main/java/com/tiedup/remake/rig/render/PatchedEntityRenderer.java b/src/main/java/com/tiedup/remake/rig/render/PatchedEntityRenderer.java new file mode 100644 index 0000000..0116073 --- /dev/null +++ b/src/main/java/com/tiedup/remake/rig/render/PatchedEntityRenderer.java @@ -0,0 +1,15 @@ +/* + * Derived from Epic Fight (https://github.com/Epic-Fight/epicfight) + * by the Epic Fight Team, licensed under GPLv3. + * Modifications © 2026 TiedUp! Remake Contributors, distributed under GPLv3. + */ + +package com.tiedup.remake.rig.render; + +/** + * Stub RIG Phase 0 — renderer EF substituant {@code EntityRenderer} vanilla + * pour les entités riggées. Implémentation complète Phase 2 (pipeline : + * pose → armature → skinning → VertexConsumer). + */ +public abstract class PatchedEntityRenderer { +} diff --git a/src/main/java/com/tiedup/remake/rig/render/TiedUpRenderTypes.java b/src/main/java/com/tiedup/remake/rig/render/TiedUpRenderTypes.java index ea42c6f..82292ba 100644 --- a/src/main/java/com/tiedup/remake/rig/render/TiedUpRenderTypes.java +++ b/src/main/java/com/tiedup/remake/rig/render/TiedUpRenderTypes.java @@ -48,7 +48,7 @@ public final class TiedUpRenderTypes extends RenderType { private static final BiFunction TRIANGULATED_OUTLINE = Util.memoize((texLocation, cullStateShard) -> { return RenderType.create( - TiedUpRigConstants.prefix("outline"), + TiedUpRigConstants.prefix("outline").toString(), DefaultVertexFormat.POSITION_COLOR_TEX, VertexFormat.Mode.TRIANGLES, 256, @@ -288,7 +288,7 @@ public final class TiedUpRenderTypes extends RenderType { private static final RenderType ENTITY_UI_COLORED = create( - TiedUpRigConstants.prefix("ui_color") + TiedUpRigConstants.prefix("ui_color").toString() , DefaultVertexFormat.POSITION_COLOR , VertexFormat.Mode.QUADS , 256 @@ -304,7 +304,7 @@ public final class TiedUpRenderTypes extends RenderType { private static final Function ENTITY_UI_TEXTURE = Util.memoize( (textureLocation) -> create( - TiedUpRigConstants.prefix("ui_texture") + TiedUpRigConstants.prefix("ui_texture").toString() , DefaultVertexFormat.POSITION_TEX , VertexFormat.Mode.QUADS , 256 @@ -321,7 +321,7 @@ public final class TiedUpRenderTypes extends RenderType { ); private static final RenderType OBB = create( - TiedUpRigConstants.prefix("debug_collider") + TiedUpRigConstants.prefix("debug_collider").toString() , DefaultVertexFormat.POSITION_COLOR_NORMAL , VertexFormat.Mode.LINE_STRIP , 256 @@ -339,7 +339,7 @@ public final class TiedUpRenderTypes extends RenderType { ); private static final RenderType DEBUG_QUADS = create( - TiedUpRigConstants.prefix("debug_quad") + TiedUpRigConstants.prefix("debug_quad").toString() , DefaultVertexFormat.POSITION_COLOR , VertexFormat.Mode.QUADS , 256 @@ -355,7 +355,7 @@ public final class TiedUpRenderTypes extends RenderType { ); private static final RenderType GUI_TRIANGLE = create( - TiedUpRigConstants.prefix("gui_triangle") + TiedUpRigConstants.prefix("gui_triangle").toString() , DefaultVertexFormat.POSITION_COLOR , VertexFormat.Mode.TRIANGLES , 256 @@ -370,7 +370,7 @@ public final class TiedUpRenderTypes extends RenderType { private static final Function OVERLAY_MODEL = Util.memoize(texLocation -> { return create( - TiedUpRigConstants.prefix("overlay_model"), + TiedUpRigConstants.prefix("overlay_model").toString(), DefaultVertexFormat.NEW_ENTITY, VertexFormat.Mode.TRIANGLES, 256, @@ -391,7 +391,7 @@ public final class TiedUpRenderTypes extends RenderType { private static final RenderType ENTITY_AFTERIMAGE_WHITE = create( - TiedUpRigConstants.prefix("entity_afterimage"), + TiedUpRigConstants.prefix("entity_afterimage").toString(), DefaultVertexFormat.PARTICLE, VertexFormat.Mode.TRIANGLES, 256, @@ -410,7 +410,7 @@ public final class TiedUpRenderTypes extends RenderType { private static final RenderType ITEM_AFTERIMAGE_WHITE = create( - TiedUpRigConstants.prefix("item_afterimage"), + TiedUpRigConstants.prefix("item_afterimage").toString(), DefaultVertexFormat.PARTICLE, VertexFormat.Mode.QUADS, 256, @@ -429,7 +429,7 @@ public final class TiedUpRenderTypes extends RenderType { private static final Function ENTITY_PARTICLE = Util.memoize(texLocation -> { return create( - TiedUpRigConstants.prefix("entity_particle"), + TiedUpRigConstants.prefix("entity_particle").toString(), DefaultVertexFormat.NEW_ENTITY, VertexFormat.Mode.TRIANGLES, 256, @@ -449,7 +449,7 @@ public final class TiedUpRenderTypes extends RenderType { private static final RenderType ITEM_PARTICLE = create( - TiedUpRigConstants.prefix("item_particle"), + TiedUpRigConstants.prefix("item_particle").toString(), DefaultVertexFormat.NEW_ENTITY, VertexFormat.Mode.QUADS, 256, @@ -468,7 +468,7 @@ public final class TiedUpRenderTypes extends RenderType { private static final Function ENTITY_PARTICLE_STENCIL = Util.memoize(texLocation -> { return create( - TiedUpRigConstants.prefix("entity_particle_stencil"), + TiedUpRigConstants.prefix("entity_particle_stencil").toString(), DefaultVertexFormat.POSITION_TEX, VertexFormat.Mode.TRIANGLES, 256, @@ -484,7 +484,7 @@ public final class TiedUpRenderTypes extends RenderType { private static final RenderType ITEM_PARTICLE_STENCIL = create( - TiedUpRigConstants.prefix("item_particle_stencil"), + TiedUpRigConstants.prefix("item_particle_stencil").toString(), DefaultVertexFormat.POSITION_TEX, VertexFormat.Mode.QUADS, 256, @@ -499,7 +499,7 @@ public final class TiedUpRenderTypes extends RenderType { private static final RenderType.CompositeRenderType BLOCK_HIGHLIGHT = create( - TiedUpRigConstants.prefix("block_highlight"), + TiedUpRigConstants.prefix("block_highlight").toString(), DefaultVertexFormat.BLOCK, VertexFormat.Mode.QUADS, 256, @@ -627,7 +627,7 @@ public final class TiedUpRenderTypes extends RenderType { CompositeRenderType glintRenderType = WORLD_RENDERTYPES_COLORED_GLINT.computeIfAbsent( owner, k -> create( - TiedUpRigConstants.prefix("colored_glint"), + TiedUpRigConstants.prefix("colored_glint").toString(), DefaultVertexFormat.POSITION_TEX, VertexFormat.Mode.TRIANGLES, 256, diff --git a/src/main/java/com/tiedup/remake/rig/render/compute/ComputeShaderProvider.java b/src/main/java/com/tiedup/remake/rig/render/compute/ComputeShaderProvider.java index 61b69ca..2ef0490 100644 --- a/src/main/java/com/tiedup/remake/rig/render/compute/ComputeShaderProvider.java +++ b/src/main/java/com/tiedup/remake/rig/render/compute/ComputeShaderProvider.java @@ -20,6 +20,11 @@ public final class ComputeShaderProvider { return null; } + /** Stub : compute shader jamais supporté en Phase 0 → CPU skinning uniquement. */ + public static boolean supportComputeShader() { + return false; + } + /** Stub no-op pour Iris init (référence pour IRISCompat éventuel). */ public static void initIris() { // no-op Phase 0 diff --git a/src/main/java/com/tiedup/remake/rig/render/compute/ComputeShaderSetup.java b/src/main/java/com/tiedup/remake/rig/render/compute/ComputeShaderSetup.java index b81a002..209199f 100644 --- a/src/main/java/com/tiedup/remake/rig/render/compute/ComputeShaderSetup.java +++ b/src/main/java/com/tiedup/remake/rig/render/compute/ComputeShaderSetup.java @@ -13,6 +13,7 @@ import net.minecraft.client.renderer.RenderType; import com.tiedup.remake.rig.mesh.Mesh; import com.tiedup.remake.rig.armature.Armature; import com.tiedup.remake.rig.math.OpenMatrix4f; +import com.tiedup.remake.rig.TiedUpRigConstants; /** * RIG stub. Upstream EF : ComputeShaderSetup = binding OpenGL 4.3+ compute @@ -25,6 +26,28 @@ import com.tiedup.remake.rig.math.OpenMatrix4f; */ public abstract class ComputeShaderSetup { + /** Pool de matrices réutilisées par SkinnedMesh pour le CPU skinning. */ + public static final OpenMatrix4f[] TOTAL_POSES = new OpenMatrix4f[TiedUpRigConstants.MAX_JOINTS]; + public static final OpenMatrix4f[] TOTAL_NORMALS = new OpenMatrix4f[TiedUpRigConstants.MAX_JOINTS]; + + static { + for (int i = 0; i < TiedUpRigConstants.MAX_JOINTS; i++) { + TOTAL_POSES[i] = new OpenMatrix4f(); + TOTAL_NORMALS[i] = new OpenMatrix4f(); + } + } + + /** + * Stub inner class — utilisé par {@code SkinnedMesh.SkinnedMeshPart.partVBO}. + * Le CPU path ne crée jamais d'instance, ne pointe que le type. + */ + public static class MeshPartBuffer { + public void destroyBuffers() {} + } + + /** Libération des buffers VBO (GPU path). No-op sur le stub. */ + public void destroyBuffers() {} + /** No-op stub : le chemin GPU compute n'est jamais emprunté. */ public void drawWithShader( Object mesh, diff --git a/src/main/java/com/tiedup/remake/rig/render/item/RenderItemBase.java b/src/main/java/com/tiedup/remake/rig/render/item/RenderItemBase.java new file mode 100644 index 0000000..37af767 --- /dev/null +++ b/src/main/java/com/tiedup/remake/rig/render/item/RenderItemBase.java @@ -0,0 +1,15 @@ +/* + * Derived from Epic Fight (https://github.com/Epic-Fight/epicfight) + * by the Epic Fight Team, licensed under GPLv3. + * Modifications © 2026 TiedUp! Remake Contributors, distributed under GPLv3. + */ + +package com.tiedup.remake.rig.render.item; + +/** + * Stub RIG Phase 0 — renderer pour les items (EF : weapons avec trail, + * tools). TiedUp : re-implém Phase 3 pour menottes/laisse/cage rendues + * attachées aux joints Tool_R/Tool_L via ItemStack injection. + */ +public abstract class RenderItemBase { +} diff --git a/src/main/java/com/tiedup/remake/rig/render/layer/LayerUtil.java b/src/main/java/com/tiedup/remake/rig/render/layer/LayerUtil.java new file mode 100644 index 0000000..267ab33 --- /dev/null +++ b/src/main/java/com/tiedup/remake/rig/render/layer/LayerUtil.java @@ -0,0 +1,32 @@ +/* + * Derived from Epic Fight (https://github.com/Epic-Fight/epicfight) + * by the Epic Fight Team, licensed under GPLv3. + * Modifications © 2026 TiedUp! Remake Contributors, distributed under GPLv3. + */ + +package com.tiedup.remake.rig.render.layer; + +import net.minecraft.client.model.EntityModel; +import net.minecraft.client.renderer.entity.LivingEntityRenderer; +import net.minecraft.world.entity.LivingEntity; + +import com.tiedup.remake.rig.mesh.SkinnedMesh; +import com.tiedup.remake.rig.patch.LivingEntityPatch; + +/** + * Stub RIG Phase 0 — registry de layers additionnels (armor, glow, cape...) + * pour renderers EF. Implém complète Phase 2. + */ +public class LayerUtil { + + @FunctionalInterface + public interface LayerProvider< + E extends LivingEntity, + T extends LivingEntityPatch, + M extends EntityModel, + R extends LivingEntityRenderer, + AM extends SkinnedMesh + > { + void addLayer(R renderer); + } +} diff --git a/src/main/java/com/tiedup/remake/rig/util/AttackResult.java b/src/main/java/com/tiedup/remake/rig/util/AttackResult.java new file mode 100644 index 0000000..6bb16b1 --- /dev/null +++ b/src/main/java/com/tiedup/remake/rig/util/AttackResult.java @@ -0,0 +1,42 @@ +/* + * Derived from Epic Fight (https://github.com/Epic-Fight/epicfight) + * by the Epic Fight Team, licensed under GPLv3. + * Modifications © 2026 TiedUp! Remake Contributors, distributed under GPLv3. + */ + +package com.tiedup.remake.rig.util; + +/** + * Stub RIG Phase 0 — encodage résultat d'attaque combat EF. Utilisé uniquement + * comme type pour {@code ATTACK_RESULT} StateFactor côté EntityState. Pas de + * logique combat dans TiedUp — logique porté Phase 2 si besoin hitboxes menottes. + */ +public class AttackResult { + public final ResultType resultType; + public final float damage; + + public AttackResult(ResultType resultType, float damage) { + this.resultType = resultType; + this.damage = damage; + } + + public static AttackResult success(float damage) { return new AttackResult(ResultType.SUCCESS, damage); } + public static AttackResult blocked(float damage) { return new AttackResult(ResultType.BLOCKED, damage); } + public static AttackResult missed(float damage) { return new AttackResult(ResultType.MISSED, damage); } + public static AttackResult of(ResultType resultType, float damage) { return new AttackResult(resultType, damage); } + + public static enum ResultType { + SUCCESS(true, true), MISSED(false, false), BLOCKED(false, true); + + boolean dealtDamage; + boolean shouldCount; + + ResultType(boolean dealtDamage, boolean countAsHitEntity) { + this.dealtDamage = dealtDamage; + this.shouldCount = countAsHitEntity; + } + + public boolean dealtDamage() { return this.dealtDamage; } + public boolean shouldCount() { return this.shouldCount; } + } +} diff --git a/src/main/resources/META-INF/accesstransformer.cfg b/src/main/resources/META-INF/accesstransformer.cfg new file mode 100644 index 0000000..ffef14d --- /dev/null +++ b/src/main/resources/META-INF/accesstransformer.cfg @@ -0,0 +1,127 @@ +public net.minecraft.client.Minecraft m_202354_()Z # startAttack +public net.minecraft.client.gui.components.AbstractSelectionList f_93399_ # scrolling +protected-f net.minecraft.client.gui.components.AbstractSelectionList f_93387_ # itemHeight +public net.minecraft.client.gui.components.AbstractSliderButton m_93611_(D)V # setValue +public net.minecraft.client.gui.components.BossHealthOverlay f_93697_ # GUI_BARS_LOCATION +public net.minecraft.client.gui.components.EditBox f_94089_ # responder +public net.minecraft.client.gui.GuiGraphics f_279587_ # scissorStack +public net.minecraft.client.gui.GuiGraphics m_280479_(Lnet/minecraft/resources/ResourceLocation;IIIIIFFFFFFFF)V # innerBlit +public net.minecraft.client.gui.GuiGraphics$ScissorStack +public net.minecraft.client.gui.GuiGraphics$ScissorStack f_279656_ # stack +public net.minecraft.client.gui.screens.Screen f_267454_ # initialized +public net.minecraft.client.Camera f_90562_ # eyeHeight +public net.minecraft.client.Camera f_90563_ # eyeHeightOld +public net.minecraft.client.Camera m_90566_(D)D # getMaxZoom +public net.minecraft.client.Camera m_90568_(DDD)V # move +public net.minecraft.client.Camera m_90572_(FF)V # setRotation +public net.minecraft.client.Camera m_90584_(DDD)V # setPosition +public net.minecraft.client.KeyboardHandler m_90913_(Ljava/lang/String;[Ljava/lang/Object;)V # debugFeedbackTranslated +public net.minecraft.client.player.LocalPlayer f_108583_ # sprintToggleTimer +public net.minecraft.client.renderer.MultiBufferSource$BufferSource f_109905_ # fixedBuffers +public-f net.minecraft.client.renderer.block.model.ItemOverrides f_111735_ # overrides +public-f net.minecraft.client.renderer.block.model.ItemOverrides f_173461_ # properties +public net.minecraft.client.renderer.block.model.ItemOverrides$BakedOverride ([Lnet/minecraft/client/renderer/block/model/ItemOverrides$PropertyMatcher;Lnet/minecraft/client/resources/model/BakedModel;)V +public net.minecraft.client.renderer.block.model.ItemOverrides$PropertyMatcher (IF)V +public net.minecraft.client.renderer.block.model.ItemOverrides$PropertyMatcher +public net.minecraft.client.renderer.entity.layers.HumanoidArmorLayer f_117070_ # ARMOR_LOCATION_CACHE +public net.minecraft.client.renderer.entity.layers.HumanoidArmorLayer m_117078_(Lnet/minecraft/world/entity/EquipmentSlot;)Lnet/minecraft/client/model/HumanoidModel; # getArmorModel +public net.minecraft.client.renderer.entity.layers.ElytraLayer f_116935_ # elytraModel +public net.minecraft.client.renderer.entity.LivingEntityRenderer f_115291_ # layers +public net.minecraft.client.renderer.GameRenderer m_109141_(Lnet/minecraft/client/Camera;FZ)D # getFov +public net.minecraft.client.renderer.ItemInHandRenderer m_109366_(Lcom/mojang/blaze3d/vertex/PoseStack;Lnet/minecraft/client/renderer/MultiBufferSource;ILnet/minecraft/world/item/ItemStack;)V # renderMap +public net.minecraft.client.renderer.LightTexture f_109870_ # lightTexture +public net.minecraft.client.renderer.OutlineBufferSource f_109922_ # teamR +public net.minecraft.client.renderer.OutlineBufferSource f_109923_ # teamG +public net.minecraft.client.renderer.OutlineBufferSource f_109924_ # teamB +public net.minecraft.client.renderer.OutlineBufferSource f_109925_ # teamA +public net.minecraft.client.renderer.RenderStateShard f_110133_ # name +public net.minecraft.client.renderer.RenderStateShard$ShaderStateShard f_173136_ # shader +public net.minecraft.client.renderer.RenderStateShard$TextureStateShard f_110329_ # blur +public net.minecraft.client.renderer.RenderStateShard$TextureStateShard f_110330_ # mipmap +public net.minecraft.client.renderer.RenderStateShard$TextureStateShard f_110328_ # texture +public net.minecraft.client.renderer.RenderType f_110389_ # format +public net.minecraft.client.renderer.RenderType f_110393_ # sortOnUpload +public-f net.minecraft.client.renderer.RenderType$CompositeState +public net.minecraft.client.renderer.RenderType$CompositeState (Lnet/minecraft/client/renderer/RenderStateShard$EmptyTextureStateShard;Lnet/minecraft/client/renderer/RenderStateShard$ShaderStateShard;Lnet/minecraft/client/renderer/RenderStateShard$TransparencyStateShard;Lnet/minecraft/client/renderer/RenderStateShard$DepthTestStateShard;Lnet/minecraft/client/renderer/RenderStateShard$CullStateShard;Lnet/minecraft/client/renderer/RenderStateShard$LightmapStateShard;Lnet/minecraft/client/renderer/RenderStateShard$OverlayStateShard;Lnet/minecraft/client/renderer/RenderStateShard$LayeringStateShard;Lnet/minecraft/client/renderer/RenderStateShard$OutputStateShard;Lnet/minecraft/client/renderer/RenderStateShard$TexturingStateShard;Lnet/minecraft/client/renderer/RenderStateShard$WriteMaskStateShard;Lnet/minecraft/client/renderer/RenderStateShard$LineStateShard;Lnet/minecraft/client/renderer/RenderStateShard$ColorLogicStateShard;Lnet/minecraft/client/renderer/RenderType$OutlineProperty;)V +public net.minecraft.client.renderer.RenderType$CompositeRenderType +public net.minecraft.client.renderer.RenderType$CompositeRenderType f_110511_ # state +public-f net.minecraft.client.renderer.RenderType$CompositeRenderType f_110513_ # outline +public net.minecraft.client.renderer.RenderType$CompositeRenderType (Ljava/lang/String;Lcom/mojang/blaze3d/vertex/VertexFormat;Lcom/mojang/blaze3d/vertex/VertexFormat$Mode;IZZLnet/minecraft/client/renderer/RenderType$CompositeState;)V +public net.minecraft.client.renderer.RenderType$CompositeState f_110576_ # textureState +public net.minecraft.client.renderer.RenderType$CompositeState f_173274_ # shaderState +public net.minecraft.client.renderer.RenderType$CompositeState f_110577_ # transparencyState +public net.minecraft.client.renderer.RenderType$CompositeState f_110581_ # depthTestState +public net.minecraft.client.renderer.RenderType$CompositeState f_110582_ # cullState +public net.minecraft.client.renderer.RenderType$CompositeState f_110583_ # lightmapState +public net.minecraft.client.renderer.RenderType$CompositeState f_110584_ # overlayState +public net.minecraft.client.renderer.RenderType$CompositeState f_110586_ # layeringState +public net.minecraft.client.renderer.RenderType$CompositeState f_110587_ # outputState +public net.minecraft.client.renderer.RenderType$CompositeState f_110588_ # texturingState +public net.minecraft.client.renderer.RenderType$CompositeState f_110589_ # writeMaskState +public net.minecraft.client.renderer.RenderType$CompositeState f_110590_ # lineState +public net.minecraft.client.renderer.RenderType$CompositeState f_285566_ # colorLogicState +public net.minecraft.client.renderer.RenderType$CompositeState f_110591_ # outlineProperty +public-f net.minecraft.client.renderer.RenderType$CompositeState f_110592_ # states +public net.minecraft.client.renderer.RenderType$OutlineProperty +public net.minecraft.client.renderer.entity.EntityRenderDispatcher f_114363_ # playerRenderers +public net.minecraft.client.renderer.entity.player.PlayerRenderer m_117818_(Lnet/minecraft/client/player/AbstractClientPlayer;)V # setModelProperties +public net.minecraft.client.renderer.entity.layers.VillagerProfessionLayer f_117623_ # typeHatCache +public net.minecraft.client.renderer.entity.layers.VillagerProfessionLayer f_117624_ # professionHatCache +public net.minecraft.client.renderer.entity.layers.VillagerProfessionLayer m_117668_(Ljava/lang/String;Lnet/minecraft/resources/ResourceLocation;)Lnet/minecraft/resources/ResourceLocation; # getResourceLocation +public net.minecraft.client.multiplayer.ClientLevel f_104561_ # connection +public net.minecraft.client.multiplayer.PlayerInfo m_105341_()V # registerTextures +public net.minecraft.client.model.geom.ModelPart f_104212_ # cubes +public net.minecraft.client.model.geom.ModelPart f_104213_ # childrens +public-f net.minecraft.client.model.geom.ModelPart$Cube f_104341_ # polygons +public-f net.minecraft.client.model.geom.ModelPart$Polygon f_104360_ # normal +public-f net.minecraft.client.model.geom.ModelPart$Polygon f_104359_ # vertices +public net.minecraft.client.model.geom.ModelPart$Polygon +public net.minecraft.client.model.geom.ModelPart$Vertex +public net.minecraft.nbt.CompoundTag f_128329_ # tags +public net.minecraft.world.level.dimension.end.EndDragonFight f_64060_ # dragonEvent +public net.minecraft.world.level.GameRules$BooleanValue m_46252_(ZLjava/util/function/BiConsumer;)Lnet/minecraft/world/level/GameRules$Type; # create +public net.minecraft.world.level.GameRules$IntegerValue m_46294_(ILjava/util/function/BiConsumer;)Lnet/minecraft/world/level/GameRules$Type; # create +public net.minecraft.world.level.GameRules$BooleanValue m_46250_(Z)Lnet/minecraft/world/level/GameRules$Type; # create +public com.mojang.math.Quaternion f_80119_ # i +public com.mojang.math.Quaternion f_80120_ # j +public com.mojang.math.Quaternion f_80121_ # k +public com.mojang.math.Quaternion f_80122_ # r +public net.minecraft.client.particle.Particle m_107271_(F)V # setAlpha +public-f net.minecraft.world.entity.ai.attributes.AttributeMap f_22141_ # supplier +public net.minecraft.world.entity.ai.attributes.AttributeSupplier f_22241_ # instances +public net.minecraft.world.entity.ai.Brain f_21845_ # availableBehaviorsByPriority +public net.minecraft.world.entity.ai.goal.target.NearestAttackableTargetGoal f_26048_ # targetType +public net.minecraft.world.entity.ai.goal.target.NearestAttackableTargetGoal f_26051_ # targetConditions +public-f net.minecraft.world.entity.boss.enderdragon.EnderDragon f_31074_ # phaseManager +public net.minecraft.world.entity.boss.enderdragon.phases.EnderDragonPhase m_31402_(Ljava/lang/Class;Ljava/lang/String;)Lnet/minecraft/world/entity/boss/enderdragon/phases/EnderDragonPhase; # create +public net.minecraft.world.entity.boss.enderdragon.phases.EnderDragonPhaseManager f_31409_ # dragon +public net.minecraft.world.entity.boss.enderdragon.EnderDragon f_31075_ # growlTime +public net.minecraft.world.entity.boss.wither.WitherBoss f_31423_ # xRotHeads +public net.minecraft.world.entity.boss.wither.WitherBoss f_31425_ # xRotOHeads +public net.minecraft.world.entity.boss.wither.WitherBoss f_31424_ # yRotHeads +public net.minecraft.world.entity.boss.wither.WitherBoss f_31426_ # yRotOHeads +public net.minecraft.world.entity.boss.wither.WitherBoss f_31430_ # bossEvent +public net.minecraft.world.entity.boss.wither.WitherBoss m_31514_(I)D # getHeadX +public net.minecraft.world.entity.boss.wither.WitherBoss m_31516_(I)D # getHeadY +public net.minecraft.world.entity.boss.wither.WitherBoss m_31518_(I)D # getHeadZ +public net.minecraft.world.entity.boss.wither.WitherBoss m_31457_(ILnet/minecraft/world/entity/LivingEntity;)V # performRangedAttack +public net.minecraft.world.entity.boss.wither.WitherBoss m_31448_(IDDDZ)V # performRangedAttack +public net.minecraft.world.entity.monster.EnderMan f_32473_ # SCREAMING +public net.minecraft.world.entity.monster.EnderMan m_32529_()Z # teleport +public net.minecraft.world.entity.projectile.AbstractArrow f_36703_ # inGround +public net.minecraft.world.entity.projectile.ThrownTrident f_37556_ # dealtDamage +public net.minecraft.world.entity.projectile.ThrownTrident f_37555_ # tridentItem +public net.minecraft.world.entity.AreaEffectCloud f_19686_ # victims +public net.minecraft.world.entity.Entity f_19815_ # dimensions +public net.minecraft.world.entity.Entity f_19861_ # onGround +public net.minecraft.world.entity.Entity m_20015_(Lnet/minecraft/world/phys/Vec3;FF)Lnet/minecraft/world/phys/Vec3; # getInputVector +public net.minecraft.world.entity.LivingEntity f_20898_ # lastHurt +public net.minecraft.world.entity.LivingEntity f_20903_ # lerpSteps +public net.minecraft.world.entity.LivingEntity f_20904_ # lerpX +public net.minecraft.world.entity.LivingEntity f_20905_ # lerpY +public net.minecraft.world.entity.LivingEntity f_20906_ # lerpZ +public net.minecraft.world.entity.LivingEntity f_20907_ # lerpYRot +public net.minecraft.world.entity.LivingEntity f_20922_ # attackStrengthTicker +public net.minecraft.world.entity.LivingEntity f_20954_ # noJumpDelay +public net.minecraft.world.item.ItemStack (Ljava/lang/Void;)V # constructor +public net.minecraft.world.damagesource.CombatTracker f_19277_ # mob