Audit-2 : strip EF extension chain + AnimationConfig dead fields (-334 LOC)

H-02 (EF extension chain DEAD) :
- Delete 5 unreferenced EF-derived files :
  - event/EntityPatchRegistryEvent (ModLoader event for third-party patch
    registration — no third-party EF mods to host).
  - event/RegisterResourceLayersEvent (extra renderer layers registration
    event — no consumers).
  - render/layer/LayerUtil (+ empty package) — sole LayerProvider interface
    only used by the deleted RegisterResourceLayersEvent.
  - render/item/RenderItemBase (+ empty package) — abstract weapon renderer
    stub, TiedUp does not host weapon trails.
  - asset/SelfAccessor — AssetAccessor variant never created.
- PatchedRenderersEvent : drop inner classes RegisterItemRenderer (tied to
  RenderItemBase) and Modify (never posted). Keep Add, used by
  TiedUpRenderEngine.
- JsonAssetLoader : remove loadArmature(ArmatureContructor) + its private
  getJoint helper. Armatures are loaded via the GLB path in Phase 1 — this
  EF JSON route has no callers.
- TiedUpRigRegistry : drop inner interface ArmatureContructor (EF-style
  typo preserved) now that loadArmature is gone.
- EntityPatchProvider : drop CUSTOM_CAPABILITIES map + putCustomEntityPatch
  + clearCustom. No third-party extension surface needed ; inline the
  provider lookup to CAPABILITIES only.

H-03 (TiedUpAnimationConfig dead fields) :
- Remove enableOriginalModel, enableAnimatedFirstPersonModel,
  enableCosmetics, enablePovAction, autoSwitchCamera, preferenceWork,
  combatPreferredItems, miningPreferredItems. None had callers — they were
  inherited from EF ClientConfig without a TiedUp consumer.
- Keep activateComputeShader — read at SkinnedMesh.java:249 to toggle the
  GPU skinning path.

Compile green, 20/20 rig tests still green.
This commit is contained in:
notevil
2026-04-23 04:55:07 +02:00
parent 647894508d
commit 4152f9fc71
10 changed files with 15 additions and 349 deletions

View File

@@ -6,39 +6,24 @@
package com.tiedup.remake.rig;
import java.util.Set;
/**
* Remplace {@code yesman.epicfight.config.ClientConfig} du fork upstream.
* Expose uniquement les flags pertinents au pipeline animation/rendu RIG.
*
* <p><b>Note Phase 0</b> : tous les flags sont des {@code static final} avec
* <p><b>Note Phase 0</b> : les flags sont des {@code static final} avec
* valeurs par défaut hardcodées. À convertir en {@code ForgeConfigSpec} réel
* (TOML config file) Phase 2 ou plus tard si on veut permettre la
* configuration utilisateur.</p>
*
* <p>Valeurs combat (autoSwitchCamera, preferenceWork, combatPreferredItems,
* miningPreferredItems) = defaults no-op, on ne les utilise pas. Les refs
* restantes dans LocalPlayerPatch/ClientPlayerPatch seront strippées en
* Phase 2 quand on simplifiera ces classes.</p>
*/
public final class TiedUpAnimationConfig {
private TiedUpAnimationConfig() {}
// Rendu
/**
* Toggle pour le chemin "compute shader" de {@code SkinnedMesh.draw} —
* quand true et qu'un {@code ComputeShaderSetup} est disponible, la mesh
* est skinnée côté GPU (plus rapide sur modèles lourds). False (défaut)
* = skin CPU comme vanilla.
*/
public static final boolean activateComputeShader = false;
public static final boolean enableOriginalModel = true; // rendu vanilla model = on par défaut
public static final boolean enableAnimatedFirstPersonModel = true;
public static final boolean enableCosmetics = true;
public static final boolean enablePovAction = false; // POV action combat → off
public static final boolean autoSwitchCamera = false; // combat camera switch → off
// Combat (stubs pour compat refs LocalPlayerPatch Phase 0 — à supprimer
// en Phase 2 avec le reste du strip combat)
public static final Object preferenceWork = new Object() {
public boolean checkHitResult() { return false; }
};
public static final Set<Object> combatPreferredItems = Set.of();
public static final Set<Object> miningPreferredItems = Set.of();
}

View File

@@ -6,12 +6,8 @@
package com.tiedup.remake.rig;
import java.util.Map;
import net.minecraft.resources.ResourceLocation;
import com.tiedup.remake.rig.anim.types.DirectStaticAnimation;
import com.tiedup.remake.rig.armature.Armature;
import com.tiedup.remake.rig.armature.Joint;
/**
* Remplace les registries {@code yesman.epicfight.gameasset.Animations} et
@@ -19,13 +15,9 @@ import com.tiedup.remake.rig.armature.Joint;
* n'utilise PAS les animations combat EF (BIPED_IDLE, BIPED_WALK, etc. —
* ARR assets) — on authore les nôtres en Phase 4 via addon Blender.
*
* <p>Ce registry expose juste :</p>
* <ul>
* <li>{@link #EMPTY_ANIMATION} — animation singleton "ne fait rien", référencée
* par LayerOffAnimation et StaticAnimation pour le défaut.</li>
* <li>{@link ArmatureContructor} — interface fonctionnelle pour construire
* des armatures custom (re-exposée depuis {@code TiedUpRigRegistry.ArmatureContructor}).</li>
* </ul>
* <p>Ce registry expose juste {@link #EMPTY_ANIMATION} — animation singleton
* "ne fait rien", référencée par LayerOffAnimation et StaticAnimation pour
* le défaut.</p>
*
* <p>Les vrais registries TiedUp (TiedUpAnimationRegistry, TiedUpArmatures,
* TiedUpMeshRegistry) sont prévus en Phase 2-3 et gèreront le scan resource
@@ -55,14 +47,4 @@ public final class TiedUpRigRegistry {
return EMPTY_ANIMATION_REGISTRY_NAME;
}
};
/**
* Interface fonctionnelle de construction d'armature. Re-exposée depuis
* {@code TiedUpRigRegistry.ArmatureContructor} upstream pour que les callers
* (JsonAssetLoader, etc.) aient accès au même type.
*/
@FunctionalInterface
public interface ArmatureContructor<T extends Armature> {
T invoke(String name, int jointNumber, Joint joint, Map<String, Joint> jointMap);
}
}

View File

@@ -70,7 +70,6 @@ import com.tiedup.remake.rig.math.MathUtils;
import com.tiedup.remake.rig.math.OpenMatrix4f;
import com.tiedup.remake.rig.math.Vec3f;
import com.tiedup.remake.rig.math.Vec4f;
import com.tiedup.remake.rig.TiedUpRigRegistry.ArmatureContructor;
import com.tiedup.remake.rig.TiedUpRigConstants;
public class JsonAssetLoader {
@@ -456,119 +455,6 @@ public class JsonAssetLoader {
}
}
public <T extends Armature> T loadArmature(ArmatureContructor<T> constructor) {
if (this.resourceLocation == null) {
throw new AssetLoadingException("Can't load armature: Resource location is null.");
}
JsonObject obj = this.rootJson.getAsJsonObject("armature");
TransformFormat transformFormat = getAsTransformFormatOrDefault(obj, "armature_format");
JsonObject hierarchy = obj.get("hierarchy").getAsJsonArray().get(0).getAsJsonObject();
JsonArray nameAsVertexGroups = obj.getAsJsonArray("joints");
Map<String, Integer> jointIds = Maps.newHashMap();
int id = 0;
for (int i = 0; i < nameAsVertexGroups.size(); i++) {
String name = nameAsVertexGroups.get(i).getAsString();
if (name.equals(COORD_BONE)) {
continue;
}
jointIds.put(name, id);
id++;
}
Map<String, Joint> jointMap = Maps.newHashMap();
Joint joint = getJoint(hierarchy, jointIds, jointMap, transformFormat, true);
joint.initOriginTransform(new OpenMatrix4f());
String armatureName = this.resourceLocation.toString().replaceAll("(animmodels/|\\.json)", "");
return constructor.invoke(armatureName, jointMap.size(), joint, jointMap);
}
private static Joint getJoint(JsonObject object, Map<String, Integer> jointIdMap, Map<String, Joint> jointMap, TransformFormat transformFormat, boolean root) {
String name = object.get("name").getAsString();
if (!jointIdMap.containsKey(name)) {
throw new AssetLoadingException("Can't load joint: joint name " + name + " doesn't exist in armature hierarchy.");
}
// Skip Coord bone
if (name.equals(COORD_BONE)) {
JsonArray coordChildren = object.get("children").getAsJsonArray();
if (coordChildren.isEmpty()) {
throw new AssetLoadingException("No children for Coord bone");
} else if (coordChildren.size() > 1) {
throw new AssetLoadingException("Coord bone can't have multiple children");
} else {
return getJoint(coordChildren.get(0).getAsJsonObject(), jointIdMap, jointMap, transformFormat, false);
}
}
JsonElement transform = GsonHelper.getNonNull(object, "transform");
// WORKAROUND: The case when transform format is wrongly specified!
if (transformFormat == TransformFormat.ATTRIBUTES && transform.isJsonArray()) {
transformFormat = TransformFormat.MATRIX;
} else if (transformFormat == TransformFormat.MATRIX && transform.isJsonObject()) {
transformFormat = TransformFormat.ATTRIBUTES;
}
OpenMatrix4f localMatrix = null;
switch (transformFormat) {
case MATRIX -> {
float[] matrixElements = ParseUtil.toFloatArrayPrimitive(GsonHelper.convertToJsonArray(transform, "transform"));
localMatrix = OpenMatrix4f.load(null, matrixElements);
localMatrix.transpose();
if (root) {
localMatrix.mulFront(BLENDER_TO_MINECRAFT_COORD);
}
}
case ATTRIBUTES -> {
JsonObject transformObject = transform.getAsJsonObject();
JsonArray locArray = transformObject.get("loc").getAsJsonArray();
JsonArray rotArray = transformObject.get("rot").getAsJsonArray();
JsonArray scaArray = transformObject.get("sca").getAsJsonArray();
JointTransform jointTransform
= JointTransform.fromPrimitives(
locArray.get(0).getAsFloat()
, locArray.get(1).getAsFloat()
, locArray.get(2).getAsFloat()
, -rotArray.get(1).getAsFloat()
, -rotArray.get(2).getAsFloat()
, -rotArray.get(3).getAsFloat()
, rotArray.get(0).getAsFloat()
, scaArray.get(0).getAsFloat()
, scaArray.get(1).getAsFloat()
, scaArray.get(2).getAsFloat()
);
localMatrix = jointTransform.toMatrix();
if (root) {
localMatrix.mulFront(BLENDER_TO_MINECRAFT_COORD);
}
}
}
Joint joint = new Joint(name, jointIdMap.get(name), localMatrix);
jointMap.put(name, joint);
if (object.has("children")) {
for (JsonElement children : object.get("children").getAsJsonArray()) {
joint.addSubJoints(getJoint(children.getAsJsonObject(), jointIdMap, jointMap, transformFormat, false));
}
}
return joint;
}
public AnimationClip loadClipForAnimation(StaticAnimation animation) {
if (this.rootJson == null) {
throw new AssetLoadingException("Can't find animation in path: " + animation);

View File

@@ -1,25 +0,0 @@
/*
* 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.asset;
import net.minecraft.resources.ResourceLocation;
public record SelfAccessor<A>(ResourceLocation registryName, A asset) implements AssetAccessor<A> {
public static <A> SelfAccessor<A> create(ResourceLocation registryName, A asset) {
return new SelfAccessor<> (registryName, asset);
}
@Override
public A get() {
return this.asset;
}
@Override
public boolean inRegistry() {
return false;
}
}

View File

@@ -1,29 +0,0 @@
/*
* 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.event;
import java.util.Map;
import java.util.function.Function;
import java.util.function.Supplier;
import net.minecraft.world.entity.Entity;
import net.minecraft.world.entity.EntityType;
import net.minecraftforge.eventbus.api.Event;
import net.minecraftforge.fml.event.IModBusEvent;
import com.tiedup.remake.rig.patch.EntityPatch;
public class EntityPatchRegistryEvent extends Event implements IModBusEvent {
private final Map<EntityType<?>, Function<Entity, Supplier<EntityPatch<?>>>> typeEntry;
public EntityPatchRegistryEvent(Map<EntityType<?>, Function<Entity, Supplier<EntityPatch<?>>>> typeEntry) {
this.typeEntry = typeEntry;
}
public Map<EntityType<?>, Function<Entity, Supplier<EntityPatch<?>>>> getTypeEntry() {
return this.typeEntry;
}
}

View File

@@ -9,61 +9,29 @@ package com.tiedup.remake.rig.event;
import java.util.Map;
import java.util.function.Function;
import com.google.gson.JsonElement;
import net.minecraft.client.renderer.entity.EntityRendererProvider;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.entity.EntityType;
import net.minecraftforge.eventbus.api.Event;
import net.minecraftforge.fml.event.IModBusEvent;
import com.tiedup.remake.rig.render.PatchedEntityRenderer;
import com.tiedup.remake.rig.render.item.RenderItemBase;
@SuppressWarnings("rawtypes")
public abstract class PatchedRenderersEvent extends Event implements IModBusEvent {
public static class RegisterItemRenderer extends PatchedRenderersEvent {
private final Map<ResourceLocation, Function<JsonElement, RenderItemBase>> itemRenderers;
public RegisterItemRenderer(Map<ResourceLocation, Function<JsonElement, RenderItemBase>> itemRenderers) {
this.itemRenderers = itemRenderers;
}
public void addItemRenderer(ResourceLocation rl, Function<JsonElement, RenderItemBase> provider) {
if (this.itemRenderers.containsKey(rl)) {
throw new IllegalArgumentException("Item renderer " + rl + " already registered.");
}
this.itemRenderers.put(rl, provider);
}
}
public static class Add extends PatchedRenderersEvent {
private final Map<EntityType<?>, Function<EntityType<?>, PatchedEntityRenderer>> entityRendererProvider;
private final EntityRendererProvider.Context context;
public Add(Map<EntityType<?>, Function<EntityType<?>, PatchedEntityRenderer>> entityRendererProvider, EntityRendererProvider.Context context) {
this.entityRendererProvider = entityRendererProvider;
this.context = context;
}
public void addPatchedEntityRenderer(EntityType<?> entityType, Function<EntityType<?>, PatchedEntityRenderer> provider) {
this.entityRendererProvider.put(entityType, provider);
}
public EntityRendererProvider.Context getContext() {
return this.context;
}
}
public static class Modify extends PatchedRenderersEvent {
private final Map<EntityType<?>, PatchedEntityRenderer> renderers;
public Modify(Map<EntityType<?>, PatchedEntityRenderer> renderers) {
this.renderers = renderers;
}
public PatchedEntityRenderer get(EntityType<?> entityType) {
return this.renderers.get(entityType);
}
}
}

View File

@@ -1,30 +0,0 @@
/*
* 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.event;
import java.util.Map;
import net.minecraft.client.model.EntityModel;
import net.minecraft.client.renderer.entity.LivingEntityRenderer;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.entity.LivingEntity;
import net.minecraftforge.eventbus.api.Event;
import com.tiedup.remake.rig.mesh.SkinnedMesh;
import com.tiedup.remake.rig.render.layer.LayerUtil;
import com.tiedup.remake.rig.patch.LivingEntityPatch;
public class RegisterResourceLayersEvent<E extends LivingEntity, T extends LivingEntityPatch<E>, M extends EntityModel<E>, R extends LivingEntityRenderer<E, M>, AM extends SkinnedMesh> extends Event {
private final Map<ResourceLocation, LayerUtil.LayerProvider<E, T, M, R, AM>> layersbyid;
public RegisterResourceLayersEvent(Map<ResourceLocation, LayerUtil.LayerProvider<E, T, M, R, AM>> layersbyid) {
this.layersbyid = layersbyid;
}
public void register(ResourceLocation rl, LayerUtil.LayerProvider<E, T, M, R, AM> layerAdder) {
this.layersbyid.put(rl, layerAdder);
}
}

View File

@@ -30,9 +30,7 @@ import com.tiedup.remake.rig.TiedUpRigConstants;
* <ul>
* <li>Pas de projectile (ProjectilePatch / ArrowPatch strippés)</li>
* <li>Pas de GlobalMobPatch fallback sur gamerule stun</li>
* <li>Pas d'EntityPatchRegistryEvent posté à ModLoader (pas de tiers mods EF pour l'instant)</li>
* <li>{@link #CUSTOM_CAPABILITIES} reste exposé via {@link #putCustomEntityPatch(EntityType, Function)}
* pour un hook d'extension future</li>
* <li>Pas d'event posté à ModLoader (pas de tiers mods EF pour l'instant)</li>
* </ul>
*
* <p><b>Attention MCA</b> : on ne doit PAS enregistrer {@link EntityType#VILLAGER}
@@ -50,9 +48,6 @@ public class EntityPatchProvider implements ICapabilityProvider, NonNullSupplier
/** Provider map populée au setup, lu au spawn entity. */
private static final Map<EntityType<?>, Function<Entity, Supplier<EntityPatch<?>>>> CAPABILITIES = Maps.newHashMap();
/** Hook extension pour mods/datapacks tiers. Prioritaire sur {@link #CAPABILITIES}. */
private static final Map<EntityType<?>, Function<Entity, Supplier<EntityPatch<?>>>> CUSTOM_CAPABILITIES = Maps.newHashMap();
/**
* À appeler en {@code FMLCommonSetupEvent.event.enqueueWork(...)}.
*
@@ -92,32 +87,13 @@ public class EntityPatchProvider implements ICapabilityProvider, NonNullSupplier
);
}
/**
* Enregistre un patch provider custom pour un {@link EntityType} donné.
* Utilisé pour extensions tierces (compat mods) ou datapack-driven patches.
*
* <p>Prioritaire sur {@link #CAPABILITIES} : un call custom override la
* version par défaut si elle existe.</p>
*/
public static void putCustomEntityPatch(EntityType<?> entityType, Function<Entity, Supplier<EntityPatch<?>>> provider) {
CUSTOM_CAPABILITIES.put(entityType, provider);
}
/**
* Nettoie les custom patches (typiquement au datapack reload).
*/
public static void clearCustom() {
CUSTOM_CAPABILITIES.clear();
}
// ---------- instance ----------
private EntityPatch<?> capability;
private final LazyOptional<EntityPatch<?>> optional = LazyOptional.of(this);
public EntityPatchProvider(Entity entity) {
Function<Entity, Supplier<EntityPatch<?>>> provider =
CUSTOM_CAPABILITIES.getOrDefault(entity.getType(), CAPABILITIES.get(entity.getType()));
Function<Entity, Supplier<EntityPatch<?>>> provider = CAPABILITIES.get(entity.getType());
if (provider != null) {
try {

View File

@@ -1,15 +0,0 @@
/*
* 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 {
}

View File

@@ -1,32 +0,0 @@
/*
* 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<E>,
M extends EntityModel<E>,
R extends LivingEntityRenderer<E, M>,
AM extends SkinnedMesh
> {
void addLayer(R renderer);
}
}