From afa85443aa9ca583a340d83cce7015eeab032423 Mon Sep 17 00:00:00 2001 From: Traben Date: Tue, 4 Aug 2026 14:47:39 +1000 Subject: [PATCH 1/7] 26.2 --- build.gradle.kts | 19 ++- gradle.properties | 2 +- root.gradle.kts | 5 +- settings.gradle.kts | 3 +- .../entity_texture_features/ETFApi.java | 5 + .../compat/SodiumGetBufferInjector.java | 12 +- .../config/ETFConfig.java | 8 +- .../config/screens/ETFConfigScreenMain.java | 133 +++++++++--------- .../screens/skin/ETFConfigScreenSkinTool.java | 17 +-- .../skin/ETFConfigScreenSkinToolOutcome.java | 3 +- ...ETFConfigScreenSkinToolPixelSelection.java | 3 +- .../features/ETFManager.java | 3 +- .../features/ETFRenderContext.java | 11 +- .../player/ETFPlayerFeatureRenderer.java | 4 +- .../features/player/ETFPlayerTexture.java | 4 +- .../etf_properties/VariantProperty.java | 2 + .../MoonPhaseProperty.java | 4 +- .../optifine_properties/SizeProperty.java | 4 + .../texture_handlers/ETFArmorHandler.java | 20 +-- .../features/texture_handlers/ETFTexture.java | 4 + .../mixin/mixins/MixinBufferBuilder.java | 8 +- .../mixin/mixins/MixinModelPart.java | 4 +- .../mixin/mixins/MixinPackScreen.java | 3 +- .../mixin/mixins/MixinSpriteIdentifier.java | 8 +- ...MixinVertexConsumerProvider$Immediate.java | 46 +++++- .../MixinVertexMultiConsumer$Double.java | 15 +- .../block/MixinSkullBlockEntityRenderer.java | 50 +++---- .../mixins/entity/misc/MixinBlockEntity.java | 5 +- .../MixinBlockEntityRenderDispatcher.java | 1 - .../misc/MixinBlockEntityRenderState.java | 2 + .../mixin/mixins/entity/misc/MixinEntity.java | 9 +- .../renderer/MixinLivingEntityRenderer.java | 1 - .../renderer/MixinPaintingEntityRenderer.java | 15 +- .../renderer/MixinPlayerEntityRenderer.java | 7 +- ...MixinMooshroomMushroomFeatureRenderer.java | 5 +- .../MixinShoulderParrotFeatureRenderer.java | 12 +- .../MixinBatchableBufferSource.java | 5 +- .../MixinFullyBufferedMultiBufferSource.java | 3 +- .../MixinCustomizableModelPart.java | 3 +- .../mods/sodium/MixinModelPartSodium.java | 3 +- .../mods/sodium/MixinSodiumBufferBuilder.java | 7 +- .../mixins/submit/Mixin_ModelRenderer.java | 82 +++++++++++ .../utils/ETFUtils2.java | 42 +++--- .../utils/ETFVertexConsumer.java | 5 +- .../utils/UEntityTypes.java | 17 +++ .../utils/URenderTypeToVertexConsumer.java | 31 ++++ .../utils/UScreen.java | 15 ++ .../tconfig/gui/TConfigEntryListWidget.java | 9 +- .../traben/tconfig/gui/TConfigScreen.java | 3 +- .../gui/entries/TConfigEntryCategory.java | 5 +- .../TConfigEntryCustomScreenOpener.java | 3 +- .../entity_texture_features.mixins.json | 3 +- .../entity_texture_features_15.accesswidener | 45 ++++++ versions/26.1-fabric/gradle.properties | 2 +- versions/26.1-forge/gradle.properties | 3 + versions/26.1-neoforge/gradle.properties | 4 +- versions/26.2-fabric/gradle.properties | 2 + versions/26.2-forge/gradle.properties | 2 + versions/26.2-neoforge/gradle.properties | 3 + 59 files changed, 535 insertions(+), 219 deletions(-) create mode 100644 src/main/java/traben/entity_texture_features/mixin/mixins/submit/Mixin_ModelRenderer.java create mode 100644 src/main/java/traben/entity_texture_features/utils/UEntityTypes.java create mode 100644 src/main/java/traben/entity_texture_features/utils/URenderTypeToVertexConsumer.java create mode 100644 src/main/java/traben/entity_texture_features/utils/UScreen.java create mode 100644 src/main/resources/entity_texture_features_15.accesswidener create mode 100644 versions/26.1-forge/gradle.properties create mode 100644 versions/26.2-fabric/gradle.properties create mode 100644 versions/26.2-forge/gradle.properties create mode 100644 versions/26.2-neoforge/gradle.properties diff --git a/build.gradle.kts b/build.gradle.kts index 7d0e3eed..76d286c4 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -42,6 +42,7 @@ base.archivesName.set("entity_texture_features-$modVersion-${project.name}") val manuallyAccessTransform = mcVersion >= 26_00_00 && platform.isNeoForge val accessWidener = "entity_texture_features_" + when { + mcVersion >= 26_02_00 -> 15 mcVersion >= 26_01_00 -> 14 mcVersion >= 1_21_11 -> 13 mcVersion >= 1_21_09 -> 12 @@ -93,14 +94,13 @@ dependencies { fun modImpl(modPrefix: String, vararg versions: Pair): Boolean { for ((versionMC, versionMod) in versions) { if (platform.mcVersion >= versionMC) { - if (versionMod != null) { + return if (versionMod != null) { modImplementation("$modPrefix$versionMod") { exclude("net.fabricmc.fabric-api") isTransitive = true } - return true - } - break + true + } else false } } return false @@ -115,7 +115,8 @@ dependencies { infix fun String.setVar(enabled: Boolean) = preprocess.vars.put(this, if (enabled) 1 else 0) "3DSKINLAYERS" setVar modImpl("maven.modrinth:3dskinlayers:", - 26_01_00 to null, + 26_02_00 to null, // TODO + 26_01_00 to ver("8kxiY3G1", null, null), 1_21_02 to ver("R1cL8Kvt", "lmgrljtK", "9V8JcyMQ"), 1_21_00 to ver("hRPGTUwZ", "Gx8v5lo4", "vj8UV3SS"), 1_20_06 to ver("SrazSQ8a", "CKyYI9pm", "eSgdmwEr"), @@ -126,7 +127,8 @@ dependencies { "SODIUM" setVar ( modImpl("maven.modrinth:sodium:", - 26_01_00 to ver("Amr4VcZo", null, null), + 26_02_00 to ver("3QgJXuSK", null, "5dWEDeL4"), + 26_01_00 to ver("1rha2U1D", null, "I6y5LD6f"), 1_21_05 to ver("fVbw1C7i", null, "dfyNHRhw"), 1_21_04 to ver("c3YkZvne", null, "XgEfENfn"), 1_21_03 to ver("rLBgU2jc", null, "M0CXIL7c"), @@ -143,7 +145,8 @@ dependencies { "IRIS" setVar ( modImpl("maven.modrinth:iris:", - 26_01_00 to ver("4cGUAiJ6", null, null), + 26_02_00 to ver("3uIIps8q", null, null), + 26_01_00 to ver("MwcLS51S", null, "YEGDGnJM"), //1_21_11 to ver("TSXvi2yD", null, "t3ruzodq"), //"k9tHcfnb"), //todo why does this break 1_21_06 to ver("l77DAK6U", null, "t3ruzodq"), //"xA5cxBvz"), // same here 1_21_05 to ver("U6evbjd0", null, "t3ruzodq"), //"KAopiPos"), @@ -159,6 +162,7 @@ dependencies { ) "IMMEDIATELYFAST" setVar modImpl("maven.modrinth:immediatelyfast:", + 26_02_00 to null, // TODO 26_01_00 to ver("lRuSLf0Y", null, "KibcXkbk"), 1_21_06 to ver("9JPEk4KN", null, "d8kpGqVx"), 1_21_05 to ver("kcSoZlE9", null, "43iGBJDV"), @@ -169,6 +173,7 @@ dependencies { if (platform.isFabric) { modImpl("maven.modrinth:modmenu:", + 26_02_00 to "TLnEHUyx", 26_01_00 to "XIDyVLo7", 1_21_05 to "R7uVB42W", 1_21_02 to "PcJvQYqu", diff --git a/gradle.properties b/gradle.properties index 7ee84501..70d9468a 100644 --- a/gradle.properties +++ b/gradle.properties @@ -8,7 +8,7 @@ essential.defaults.loom.mappings=mojmap loom.ignoreDependencyLoomVersionValidation=true -mod_version=7.1 +mod_version=7.1.1 maven_group=traben.entity_texture_features archives_base_name=entity_texture_features diff --git a/root.gradle.kts b/root.gradle.kts index 7167ab2e..340f4760 100644 --- a/root.gradle.kts +++ b/root.gradle.kts @@ -7,7 +7,7 @@ plugins { // Advanced users may use multiple (potentially independent) multi-version trees in different sub-projects. // This is currently equivalent to applying `com.replaymod.preprocess-root`. kotlin("jvm") version "2.3.0" apply false - id("gg.essential.loom") version "1.15.49" apply false // https://repo.essential.gg/#/public/gg/essential/loom/gg.essential.loom.gradle.plugin + id("gg.essential.loom") version "1.15.50" apply false // https://repo.essential.gg/#/public/gg/essential/loom/gg.essential.loom.gradle.plugin id("gg.essential.multi-version.root") } @@ -58,7 +58,8 @@ preprocess { // val fabric = createNode("26.1-fabric", 26_01_00, "mojmap") // fabric.link(n) - null.connectToVersion(26_01_00, forge = false, neoforge = true) + null.connectToVersion(26_02_00, forge = false, neoforge = true) + .connectToVersion(26_01_00, forge = false, neoforge = true) .connectToVersion(1_21_11) .connectToVersion(1_21_09) .connectToVersion(1_21_06) diff --git a/settings.gradle.kts b/settings.gradle.kts index 75ef3f37..634acf12 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -13,7 +13,7 @@ pluginManagement { // We also recommend specifying your desired version here if you're using more than one of the plugins, // so you do not have to change the version in multilpe places when updating. plugins { - val egtVersion = "0.7.0-alpha.5" + val egtVersion = "0.7.2" id("gg.essential.multi-version.root") version egtVersion id("gg.essential.multi-version.api-validation") version egtVersion } @@ -39,6 +39,7 @@ fun MutableList.version(mcVersion: Int, forge: Boolean = true, neoforge: } mutableListOf() + .version(26_02_00, forge = false, neoforge = true) .version(26_01_00, forge = false, neoforge = true) .version(12111) .version(12109) diff --git a/src/main/java/traben/entity_texture_features/ETFApi.java b/src/main/java/traben/entity_texture_features/ETFApi.java index d359ec8c..ca5bb567 100644 --- a/src/main/java/traben/entity_texture_features/ETFApi.java +++ b/src/main/java/traben/entity_texture_features/ETFApi.java @@ -3,7 +3,10 @@ import com.mojang.blaze3d.vertex.PoseStack; import net.minecraft.client.model.Model; import net.minecraft.client.model.geom.ModelPart; +//#if MC < 26.2 import net.minecraft.client.renderer.MultiBufferSource; +//#endif + //#if MC >= 12103 import net.minecraft.client.renderer.entity.state.EntityRenderState; //#endif @@ -294,6 +297,7 @@ public static ResourceLocation getCurrentETFEmissiveTextureOfBlockEntityOrNull(@ return null; } + //#if MC < 26.2 /** * To render your entity using its emissive textures you can simply call this method sometime after * your entity model is rendered, but before you pop or modify the matrix stack @@ -383,6 +387,7 @@ public static void renderETFEmissiveModelPart( etfTexture.renderEmissive(matrixStack, vertexConsumerProvider, modelPart); } } + //#endif /** * This should only be used if you want to handle your own variation code. diff --git a/src/main/java/traben/entity_texture_features/compat/SodiumGetBufferInjector.java b/src/main/java/traben/entity_texture_features/compat/SodiumGetBufferInjector.java index fd579228..44c239e5 100644 --- a/src/main/java/traben/entity_texture_features/compat/SodiumGetBufferInjector.java +++ b/src/main/java/traben/entity_texture_features/compat/SodiumGetBufferInjector.java @@ -10,12 +10,12 @@ //$$ import java.lang.reflect.Method; //$$ import java.util.Objects; //#endif -import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; import org.apache.logging.log4j.util.TriConsumer; import com.mojang.blaze3d.vertex.VertexConsumer; import traben.entity_texture_features.utils.ETFUtils2; +import traben.entity_texture_features.utils.URenderTypeToVertexConsumer; /** @@ -24,14 +24,14 @@ */ public abstract class SodiumGetBufferInjector { - private static final TriConsumer INSTANCE = get(); + private static final TriConsumer INSTANCE = get(); - public static void inject(MultiBufferSource provider, RenderType renderLayer, VertexConsumer vertexConsumer) { + public static void inject(URenderTypeToVertexConsumer provider, RenderType renderLayer, VertexConsumer vertexConsumer) { if (INSTANCE != null) INSTANCE.accept(provider, renderLayer, vertexConsumer); } - private static TriConsumer get() { + private static TriConsumer get() { //#if MC < 12100 && MC != 12002 && SODIUM //$$ //$$ try { @@ -47,7 +47,7 @@ private static TriConsumer get() } //#if MC < 12100 && MC != 12002 && SODIUM //$$ -//$$ private static class Impl implements TriConsumer { +//$$ private static class Impl implements TriConsumer { //$$ Impl() { //$$ Objects.requireNonNull(ExtendedBufferBuilder.class); //$$ var methods = ExtendedBufferBuilder.class.getMethods(); @@ -64,7 +64,7 @@ private static TriConsumer get() //$$ } //$$ //$$ @Override -//$$ public void accept(final MultiBufferSource vertexConsumerProvider, final RenderType renderLayer, final VertexConsumer vertexConsumer) { +//$$ public void accept(final URenderTypeToVertexConsumer vertexConsumerProvider, final RenderType renderLayer, final VertexConsumer vertexConsumer) { //$$ if (vertexConsumer instanceof ExtendedBufferBuilder buff) { //$$ VertexConsumer delegate = (VertexConsumer) (Object) buff.sodium$getDelegate(); //$$ if (delegate instanceof ETFVertexConsumer) { diff --git a/src/main/java/traben/entity_texture_features/config/ETFConfig.java b/src/main/java/traben/entity_texture_features/config/ETFConfig.java index 88ad1604..beea8281 100644 --- a/src/main/java/traben/entity_texture_features/config/ETFConfig.java +++ b/src/main/java/traben/entity_texture_features/config/ETFConfig.java @@ -20,6 +20,8 @@ import traben.entity_texture_features.features.property_reading.properties.RandomProperties; import traben.entity_texture_features.features.state.ETFEntityRenderState; import traben.entity_texture_features.utils.ETFUtils2; +import traben.entity_texture_features.utils.UEntityTypes; +import traben.entity_texture_features.utils.UScreen; import traben.tconfig.TConfig; import traben.entity_texture_features.utils.ETFEntity; import traben.tconfig.gui.entries.*; @@ -270,7 +272,7 @@ private TConfigEntryCategory getEntitySettings() { var category = new TConfigEntryCategory("config.entity_features.per_entity_settings"); try { BuiltInRegistries.ENTITY_TYPE.forEach(entityType -> { - if (entityType == EntityType.PLAYER) return; + if (entityType == UEntityTypes.PLAYER) return; String translationKey = entityType.getDescriptionId(); var entityCategory = new TConfigEntryCategory(translationKey); addEntityConfigs(entityCategory, translationKey); @@ -376,9 +378,9 @@ private TConfigEntry getPlayerSkinEditorButton() { return canLaunchSkinTool ? new TConfigEntryCustomScreenOpener("config.entity_texture_features.player_skin_editor.button.enabled", reasonText.toString(), - () -> new ETFConfigScreenSkinTool(Minecraft.getInstance().screen), false) : + () -> new ETFConfigScreenSkinTool(UScreen.currentScreen()), false) : new TConfigEntryCustomScreenOpener("config.entity_texture_features.player_skin_editor.button.disabled", reasonText.toString(), - () -> new ETFConfigScreenSkinTool(Minecraft.getInstance().screen), false).setEnabled(false); + () -> new ETFConfigScreenSkinTool(UScreen.currentScreen()), false).setEnabled(false); } @Override diff --git a/src/main/java/traben/entity_texture_features/config/screens/ETFConfigScreenMain.java b/src/main/java/traben/entity_texture_features/config/screens/ETFConfigScreenMain.java index 979bbe31..fb0c5a77 100644 --- a/src/main/java/traben/entity_texture_features/config/screens/ETFConfigScreenMain.java +++ b/src/main/java/traben/entity_texture_features/config/screens/ETFConfigScreenMain.java @@ -1,9 +1,5 @@ package traben.entity_texture_features.config.screens; -import com.mojang.blaze3d.platform.Lighting; -import com.mojang.blaze3d.systems.RenderSystem; -import com.mojang.blaze3d.vertex.PoseStack; -import com.mojang.blaze3d.vertex.VertexConsumer; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiGraphics; import net.minecraft.client.gui.components.Button; @@ -12,10 +8,19 @@ import net.minecraft.client.model.CreeperModel; import net.minecraft.client.model.geom.ModelPart; import net.minecraft.client.model.geom.builders.CubeDeformation; +//#if MC < 1.21.6 import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.entity.EntityRenderDispatcher; import net.minecraft.client.renderer.texture.OverlayTexture; +import com.mojang.blaze3d.platform.Lighting; +import com.mojang.blaze3d.systems.RenderSystem; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import net.minecraft.world.entity.player.Inventory; +import org.jetbrains.annotations.Nullable; +import org.joml.Matrix4f; +//#endif import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.entity.Entity; @@ -24,14 +29,12 @@ import net.minecraft.world.entity.animal.sniffer.Sniffer; import net.minecraft.world.entity.boss.enderdragon.EnderDragon; import net.minecraft.world.entity.monster.Guardian; -import net.minecraft.world.entity.player.Inventory; -import org.jetbrains.annotations.Nullable; -import org.joml.Matrix4f; import org.joml.Quaternionf; import traben.entity_texture_features.ETF; import traben.entity_texture_features.config.ETFConfigWarning; import traben.entity_texture_features.config.ETFConfigWarnings; import traben.entity_texture_features.utils.ETFUtils2; +import traben.entity_texture_features.utils.UScreen; import traben.tconfig.gui.TConfigScreenMain; import traben.tconfig.gui.entries.TConfigEntryCategory; @@ -127,7 +130,7 @@ protected void init() { super.init(); if (shownWarning) { this.addRenderableWidget(Button.builder(Component.translatable("config.entity_features.warnings_main"), - (button) -> Objects.requireNonNull(minecraft).setScreen(new ETFConfigScreenWarnings(this, warningsFound))) + (button) -> UScreen.setScreen(new ETFConfigScreenWarnings(this, warningsFound))) .bounds((int) (this.width * 0.1), (int) (this.height * 0.1) - 15, (int) (this.width * 0.2), 20 ).build()); } @@ -183,23 +186,23 @@ protected void init() { //$$ context.pose().popPose(); //#endif } - - private void renderETFLogoCreepers(final GuiGraphics context, final int mouseX, final int mouseY) { - int y = (int) (this.height * 0.75); - int x = (int) (this.width * 0.33); - float g = (float) -Math.atan(((-mouseY + this.height / 2f) / 40.0F)); - float g2 = (float) -Math.atan(((-mouseX + this.width / 3f) / 400.0F)); - Quaternionf quaternionf = (new Quaternionf()).rotateZ(3.1415927F).rotateY(g2); - Quaternionf quaternionf2 = (new Quaternionf()).rotateX(-(g * 20.0F * 0.017453292F)); - quaternionf.mul(quaternionf2); - - + //#if MC < 1.21.6 + //$$ private void renderETFLogoCreepers(final GuiGraphics context, final int mouseX, final int mouseY) { + //$$ int y = (int) (this.height * 0.75); + //$$ int x = (int) (this.width * 0.33); + //$$ float g = (float) -Math.atan(((-mouseY + this.height / 2f) / 40.0F)); + //$$ float g2 = (float) -Math.atan(((-mouseX + this.width / 3f) / 400.0F)); + //$$ Quaternionf quaternionf = (new Quaternionf()).rotateZ(3.1415927F).rotateY(g2); + //$$ Quaternionf quaternionf2 = (new Quaternionf()).rotateX(-(g * 20.0F * 0.017453292F)); + //$$ quaternionf.mul(quaternionf2); + //$$ + //$$ //#if MC>=12106 - PoseStack matrixStack = new PoseStack(); - matrixStack.translate(x, y, 150.0); - float scaling = (float) (this.height * 0.3); - matrixStack.mulPose((new Matrix4f()).scaling(scaling, scaling, -scaling)); - matrixStack.mulPose(quaternionf); + //$$ PoseStack matrixStack = new PoseStack(); + //$$ matrixStack.translate(x, y, 150.0); + //$$ float scaling = (float) (this.height * 0.3); + //$$ matrixStack.mulPose((new Matrix4f()).scaling(scaling, scaling, -scaling)); + //$$ matrixStack.mulPose(quaternionf); //#else //$$ context.pose().pushPose(); //$$ context.pose().translate(x, y, 150.0); @@ -213,39 +216,40 @@ private void renderETFLogoCreepers(final GuiGraphics context, final int mouseX, //$$ Lighting.setupForEntityInInventory(); //$$ PoseStack matrixStack = context.pose(); //#endif - - float sin1 = (float) (Math.sin(System.currentTimeMillis() / 500d) / 32); - float sin2 = (float) (Math.sin(System.currentTimeMillis() / 500d + 1) / 32); - float sin3 = (float) (Math.sin(System.currentTimeMillis() / 500d + 2) / 32); - + //$$ + //$$ float sin1 = (float) (Math.sin(System.currentTimeMillis() / 500d) / 32); + //$$ float sin2 = (float) (Math.sin(System.currentTimeMillis() / 500d + 1) / 32); + //$$ float sin3 = (float) (Math.sin(System.currentTimeMillis() / 500d + 2) / 32); + //$$ //#if MC>=12106 - MultiBufferSource bufferSource = Minecraft.getInstance().renderBuffers().bufferSource(); + //$$ MultiBufferSource bufferSource = Minecraft.getInstance().renderBuffers().bufferSource(); //#elseif MC < 12103 //$$ MultiBufferSource bufferSource = context.bufferSource(); //#else //$$ MultiBufferSource bufferSource = context.bufferSource; //#endif - - matrixStack.pushPose(); - matrixStack.translate(-0.6, -sin1, 0); - matrixStack.scale(1 + sin1, 1 + sin1, 1 + sin1); - LOGO_CREEPER.renderSimple(matrixStack, bufferSource, YELLOW); - matrixStack.popPose(); - matrixStack.pushPose(); - matrixStack.translate(0, -sin2, 0); - matrixStack.scale(1 + sin2, 1 + sin2, 1 + sin2); - LOGO_CREEPER.renderSimple(matrixStack, bufferSource, RED); - matrixStack.popPose(); - matrixStack.pushPose(); - matrixStack.translate(0.6, -sin3, 0); - matrixStack.scale(1 + sin3, 1 + sin3, 1 + sin3); - LOGO_CREEPER.renderSimple(matrixStack, bufferSource, BLUE); - matrixStack.popPose(); - + //$$ + //$$ matrixStack.pushPose(); + //$$ matrixStack.translate(-0.6, -sin1, 0); + //$$ matrixStack.scale(1 + sin1, 1 + sin1, 1 + sin1); + //$$ LOGO_CREEPER.renderSimple(matrixStack, bufferSource, YELLOW); + //$$ matrixStack.popPose(); + //$$ matrixStack.pushPose(); + //$$ matrixStack.translate(0, -sin2, 0); + //$$ matrixStack.scale(1 + sin2, 1 + sin2, 1 + sin2); + //$$ LOGO_CREEPER.renderSimple(matrixStack, bufferSource, RED); + //$$ matrixStack.popPose(); + //$$ matrixStack.pushPose(); + //$$ matrixStack.translate(0.6, -sin3, 0); + //$$ matrixStack.scale(1 + sin3, 1 + sin3, 1 + sin3); + //$$ LOGO_CREEPER.renderSimple(matrixStack, bufferSource, BLUE); + //$$ matrixStack.popPose(); + //$$ //#if MC<12106 //$$ Lighting.setupFor3DItems(); //#endif - } + //$$ } + //#endif private void renderEntitySample(final GuiGraphics context, final int mouseX, final int mouseY) { int y = (int) (this.height * 0.75); @@ -300,28 +304,29 @@ public LogoCreeperRenderer() { root.getChild("left_front_leg").z += 2; } - - public void renderSimple(final PoseStack matrix, final MultiBufferSource vcp, ResourceLocation texture) { - matrix.pushPose(); - matrix.scale(-1.0F, -1.0F, 1.0F); - matrix.translate(0.0F, -1.501F, 0.0F); - RenderType rendertype = + //#if MC < 1.21.6 + //$$ public void renderSimple(final PoseStack matrix, final MultiBufferSource vcp, ResourceLocation texture) { + //$$ matrix.pushPose(); + //$$ matrix.scale(-1.0F, -1.0F, 1.0F); + //$$ matrix.translate(0.0F, -1.501F, 0.0F); + //$$ RenderType rendertype = //#if MC>= 12111 //$$ net.minecraft.client.renderer.rendertype.RenderTypes //#else - RenderType + //$$ RenderType //#endif - .entitySolid(texture); - //noinspection ConstantValue - if (rendertype != null) { - VertexConsumer vertexconsumer = vcp.getBuffer(rendertype); - root.render(matrix, vertexconsumer, 15728880, OverlayTexture.NO_OVERLAY + //$$ .entitySolid(texture); + //$$ //noinspection ConstantValue + //$$ if (rendertype != null) { + //$$ VertexConsumer vertexconsumer = vcp.getBuffer(rendertype); + //$$ root.render(matrix, vertexconsumer, 15728880, OverlayTexture.NO_OVERLAY //#if MC < 12100 //$$ , 1F, 1F, 1F, 1F //#endif - ); - } - matrix.popPose(); - } + //$$ ); + //$$ } + //$$ matrix.popPose(); + //$$ } + //#endif } } diff --git a/src/main/java/traben/entity_texture_features/config/screens/skin/ETFConfigScreenSkinTool.java b/src/main/java/traben/entity_texture_features/config/screens/skin/ETFConfigScreenSkinTool.java index 87e71441..f321e5c7 100644 --- a/src/main/java/traben/entity_texture_features/config/screens/skin/ETFConfigScreenSkinTool.java +++ b/src/main/java/traben/entity_texture_features/config/screens/skin/ETFConfigScreenSkinTool.java @@ -25,6 +25,7 @@ import traben.entity_texture_features.features.ETFManager; import traben.entity_texture_features.features.player.ETFPlayerTexture; import traben.entity_texture_features.utils.ETFUtils2; +import traben.entity_texture_features.utils.UScreen; import java.nio.file.Path; import java.util.Objects; @@ -132,14 +133,14 @@ protected void init() { onExit(); ETFUtils2.logError("could not load tool as skin could not be loaded"); - Objects.requireNonNull(minecraft).setScreen(parent); + UScreen.setScreen(parent); } } this.addRenderableWidget(getETFButton(this.width / 2 - 210, (int) (this.height * 0.9), 200, 20, CommonComponents.GUI_CANCEL, (button) -> { onExit(); - Objects.requireNonNull(minecraft).setScreen(parent); + UScreen.setScreen(parent); })); this.addRenderableWidget(getETFButton((int) (this.width * 0.024), (int) (this.height * 0.2), 20, 20, @@ -153,7 +154,7 @@ protected void init() { if (Minecraft.getInstance().player != null) { result = printPlayerSkinCopy(); } - Objects.requireNonNull(minecraft).setScreen(new ETFConfigScreenSkinToolOutcome(parent, result, currentEditorSkin)); + UScreen.setScreen(new ETFConfigScreenSkinToolOutcome(parent, result, currentEditorSkin)); onExit(); }); this.addRenderableWidget(printSkinFileButton); @@ -335,7 +336,7 @@ protected void init() { emissiveSelectButton = getETFButton((int) (this.width * 0.695), (int) (this.height * 0.5), (int) (this.width * 0.275), 20, ETF.getTextFromTranslation("config." + MOD_ID + ".player_skin_editor.emissive_select.button"), - (button) -> Objects.requireNonNull(minecraft).setScreen(new ETFConfigScreenSkinToolPixelSelection(this, ETFConfigScreenSkinToolPixelSelection.SelectionMode.EMISSIVE)) + (button) -> UScreen.setScreen(new ETFConfigScreenSkinToolPixelSelection(this, ETFConfigScreenSkinToolPixelSelection.SelectionMode.EMISSIVE)) ); enchantButton = getETFButton((int) (this.width * 0.25), (int) (this.height * 0.6), (int) (this.width * 0.42), 20, @@ -359,7 +360,7 @@ protected void init() { enchantSelectButton = getETFButton((int) (this.width * 0.695), (int) (this.height * 0.6), (int) (this.width * 0.275), 20, ETF.getTextFromTranslation("config." + MOD_ID + ".player_skin_editor.enchant_select.button"), - (button) -> Objects.requireNonNull(minecraft).setScreen(new ETFConfigScreenSkinToolPixelSelection(this, ETFConfigScreenSkinToolPixelSelection.SelectionMode.ENCHANTED)) + (button) -> UScreen.setScreen(new ETFConfigScreenSkinToolPixelSelection(this, ETFConfigScreenSkinToolPixelSelection.SelectionMode.ENCHANTED)) ); updateButtons(); @@ -502,7 +503,7 @@ public void applyExistingOverlayToSkin(ResourceLocation overlayTexture) { // //ignore an already applied overlay texture with identical pixels // if (skin != overlay) { if (allowOverrides == null) { - Minecraft.getInstance().setScreen(new ConfirmScreen(Component.nullToEmpty(""), this)); + UScreen.setScreen(new ConfirmScreen(Component.nullToEmpty(""), this)); if (allowOverrides == null) allowOverrides = false; } if (!allowOverrides) { @@ -961,7 +962,7 @@ public void onClose() { //#endif ); } - Minecraft.getInstance().setScreen(this.parent); + UScreen.setScreen(this.parent); } @Override @@ -975,7 +976,7 @@ protected void init() { addRenderableWidget(Button.builder(CommonComponents.GUI_YES, (button) -> { allowOverrides = true; - Minecraft.getInstance().setScreen(this.parent); + UScreen.setScreen(this.parent); }).bounds(width / 2 - 210, height / 2 + 50, 200, 20).build()); addRenderableWidget(Button.builder(CommonComponents.GUI_NO, (button) -> onClose()).bounds(width / 2 + 10, height / 2 + 50, 200, 20).build()); diff --git a/src/main/java/traben/entity_texture_features/config/screens/skin/ETFConfigScreenSkinToolOutcome.java b/src/main/java/traben/entity_texture_features/config/screens/skin/ETFConfigScreenSkinToolOutcome.java index 1ed1d04c..ddfb542f 100644 --- a/src/main/java/traben/entity_texture_features/config/screens/skin/ETFConfigScreenSkinToolOutcome.java +++ b/src/main/java/traben/entity_texture_features/config/screens/skin/ETFConfigScreenSkinToolOutcome.java @@ -39,6 +39,7 @@ import traben.entity_texture_features.ETFException; import traben.entity_texture_features.features.ETFManager; import traben.entity_texture_features.utils.ETFUtils2; +import traben.entity_texture_features.utils.UScreen; import java.io.FileInputStream; import java.io.IOException; @@ -134,7 +135,7 @@ protected void init() { this.addRenderableWidget(getETFButton((int) (this.width * 0.55), (int) (this.height * 0.9), (int) (this.width * 0.2), 20, CommonComponents.GUI_DONE, - (button) -> Objects.requireNonNull(minecraft).setScreen(parent))); + (button) -> UScreen.setScreen(parent))); if (didSucceed) { this.addRenderableWidget(getETFButton((int) (this.width * 0.15), (int) (this.height * 0.6), (int) (this.width * 0.7), 20, ETF.getTextFromTranslation("config." + ETF.MOD_ID + ".player_skin_editor.print_skin.open"), diff --git a/src/main/java/traben/entity_texture_features/config/screens/skin/ETFConfigScreenSkinToolPixelSelection.java b/src/main/java/traben/entity_texture_features/config/screens/skin/ETFConfigScreenSkinToolPixelSelection.java index bf9a111d..3af243d9 100644 --- a/src/main/java/traben/entity_texture_features/config/screens/skin/ETFConfigScreenSkinToolPixelSelection.java +++ b/src/main/java/traben/entity_texture_features/config/screens/skin/ETFConfigScreenSkinToolPixelSelection.java @@ -17,6 +17,7 @@ import org.joml.Quaternionf; import traben.entity_texture_features.ETF; import traben.entity_texture_features.utils.ETFUtils2; +import traben.entity_texture_features.utils.UScreen; import java.util.ArrayList; import java.util.HashSet; @@ -69,7 +70,7 @@ protected void init() { this.addRenderableWidget(getETFButton((int) (this.width * 0.55), (int) (this.height * 0.9), (int) (this.width * 0.2), 20, CommonComponents.GUI_BACK, - (button) -> Objects.requireNonNull(minecraft).setScreen(parent))); + (button) -> UScreen.setScreen(parent))); int pixelSize = (int) (this.height * 0.7 / 64); diff --git a/src/main/java/traben/entity_texture_features/features/ETFManager.java b/src/main/java/traben/entity_texture_features/features/ETFManager.java index 6c050381..c5e22bdb 100644 --- a/src/main/java/traben/entity_texture_features/features/ETFManager.java +++ b/src/main/java/traben/entity_texture_features/features/ETFManager.java @@ -25,6 +25,7 @@ import net.minecraft.server.packs.PackResources; import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.player.Player; +import traben.entity_texture_features.utils.UScreen; import static traben.entity_texture_features.ETF.MOD_ID; import static traben.entity_texture_features.features.player.ETFPlayerTexture.SKIN_NAMESPACE; @@ -287,7 +288,7 @@ public ETFPlayerTexture getPlayerTexture(ETFPlayerEntity player, ResourceLocatio (possibleSkin.player == null && possibleSkin.isCorrectObjectForThisSkin(rendererGivenSkin))) { return null; } else if (possibleSkin.isCorrectObjectForThisSkin(rendererGivenSkin) - || Minecraft.getInstance().screen instanceof ETFConfigScreenSkinTool) { + || UScreen.currentScreen() instanceof ETFConfigScreenSkinTool) { return possibleSkin; } } diff --git a/src/main/java/traben/entity_texture_features/features/ETFRenderContext.java b/src/main/java/traben/entity_texture_features/features/ETFRenderContext.java index dea98f8a..c2682130 100644 --- a/src/main/java/traben/entity_texture_features/features/ETFRenderContext.java +++ b/src/main/java/traben/entity_texture_features/features/ETFRenderContext.java @@ -14,9 +14,9 @@ import java.util.UUID; import java.util.function.Supplier; -import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; import net.minecraft.resources.ResourceLocation; +import traben.entity_texture_features.utils.URenderTypeToVertexConsumer; @Deprecated // todo collapse into ETFEntityRenderState as best as i can public class ETFRenderContext { @@ -67,11 +67,15 @@ public static ETFEntityRenderState getCurrentEntityState() { return currentEntity; } + //TODO see usage for details, just temp to get 26.2 out on release day + public static boolean temp_markRenderingEntity = false; + public static void setCurrentEntity(ETFEntityRenderState currentEntity) { allowRenderLayerTextureModify = true; currentEntityNBT = null; entityNBT_UUID = null; ETFRenderContext.currentEntity = currentEntity; + temp_markRenderingEntity = true; } public static boolean canRenderInBrightMode() { @@ -120,6 +124,7 @@ public static void reset() { limitModifyToProperties = false; currentEntityNBT = null; entityNBT_UUID = null; + temp_markRenderingEntity = false; } @SuppressWarnings("unused")//used in EMF @@ -216,7 +221,7 @@ && isAllowedToRenderLayerTextureModify()) { return value; } - public static void insertETFDataIntoVertexConsumer(MultiBufferSource provider, RenderType renderLayer, VertexConsumer vertexConsumer) { + public static void insertETFDataIntoVertexConsumer(URenderTypeToVertexConsumer provider, RenderType renderLayer, VertexConsumer vertexConsumer) { if (isCurrentlyRenderingEntity() && vertexConsumer instanceof ETFVertexConsumer etfVertexConsumer) { //need to store etf texture of consumer and original render layer //store provider as well for future actions @@ -226,7 +231,7 @@ public static void insertETFDataIntoVertexConsumer(MultiBufferSource provider, R public static boolean isCurrentlyRenderingEntity() { //#if MC >= 12109 - return true; // todo consequences of this?? + return currentEntity != null || temp_markRenderingEntity; //#else //$$ return currentEntity != null; //#endif diff --git a/src/main/java/traben/entity_texture_features/features/player/ETFPlayerFeatureRenderer.java b/src/main/java/traben/entity_texture_features/features/player/ETFPlayerFeatureRenderer.java index 3d8e4ac5..96e484dd 100644 --- a/src/main/java/traben/entity_texture_features/features/player/ETFPlayerFeatureRenderer.java +++ b/src/main/java/traben/entity_texture_features/features/player/ETFPlayerFeatureRenderer.java @@ -9,7 +9,9 @@ import net.minecraft.client.model.geom.builders.CubeListBuilder; import net.minecraft.client.model.geom.builders.MeshDefinition; import net.minecraft.client.model.geom.builders.PartDefinition; -import net.minecraft.client.renderer.MultiBufferSource; +//#if MC < 1.21.9 +//$$ import net.minecraft.client.renderer.MultiBufferSource; +//#endif import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.entity.ItemRenderer; import net.minecraft.client.renderer.entity.RenderLayerParent; diff --git a/src/main/java/traben/entity_texture_features/features/player/ETFPlayerTexture.java b/src/main/java/traben/entity_texture_features/features/player/ETFPlayerTexture.java index a8636407..f0900575 100644 --- a/src/main/java/traben/entity_texture_features/features/player/ETFPlayerTexture.java +++ b/src/main/java/traben/entity_texture_features/features/player/ETFPlayerTexture.java @@ -28,11 +28,13 @@ //#endif +import traben.entity_texture_features.utils.UScreen; //#if MC >= 12104 import net.minecraft.client.player.AbstractClientPlayer; import net.minecraft.client.renderer.texture.SkinTextureDownloader; import net.minecraft.world.level.block.entity.SkullBlockEntity; import org.jetbrains.annotations.NotNull; + import java.io.IOException; import java.nio.file.Path; //#else @@ -826,7 +828,7 @@ private void skinFailed(String reason) { } private void skinFailed(@Nullable String reason, boolean retryLater) { - if (!(Minecraft.getInstance().screen instanceof ETFConfigScreenSkinTool)) { + if (!(UScreen.currentScreen() instanceof ETFConfigScreenSkinTool)) { ETFManager.getInstance().PLAYER_TEXTURE_MAP.put(player.etf$getUuid(), new ETFPlayerTexture(normalVanillaSkinIdentifier, retryLater)); } else if (reason != null) { diff --git a/src/main/java/traben/entity_texture_features/features/property_reading/properties/etf_properties/VariantProperty.java b/src/main/java/traben/entity_texture_features/features/property_reading/properties/etf_properties/VariantProperty.java index 5751b682..5f48c784 100644 --- a/src/main/java/traben/entity_texture_features/features/property_reading/properties/etf_properties/VariantProperty.java +++ b/src/main/java/traben/entity_texture_features/features/property_reading/properties/etf_properties/VariantProperty.java @@ -112,10 +112,12 @@ protected boolean shouldForceLowerCaseCheck() { && shulkerBoxBlockEntity.getBlockState().getBlock() instanceof ShulkerBoxBlock shulkerBoxBlock) { return String.valueOf(shulkerBoxBlock.getColor()); } + //#if MC < 26.2 if (etfEntity instanceof BedBlockEntity bedBlockEntity && bedBlockEntity.getBlockState().getBlock() instanceof BedBlock bedBlock) { return String.valueOf(bedBlock.getColor()); } + //#endif if (etfEntity instanceof DecoratedPotBlockEntity pot) { //#if MC >= 12006 PotDecorations sherds = pot.getDecorations(); diff --git a/src/main/java/traben/entity_texture_features/features/property_reading/properties/optifine_properties/MoonPhaseProperty.java b/src/main/java/traben/entity_texture_features/features/property_reading/properties/optifine_properties/MoonPhaseProperty.java index d20a549f..e7151fd7 100644 --- a/src/main/java/traben/entity_texture_features/features/property_reading/properties/optifine_properties/MoonPhaseProperty.java +++ b/src/main/java/traben/entity_texture_features/features/property_reading/properties/optifine_properties/MoonPhaseProperty.java @@ -33,7 +33,9 @@ public static MoonPhaseProperty getPropertyOrNull(Properties properties, int pro @Override protected int getValueFromEntity(ETFEntityRenderState entity) { - //#if MC >= 26.1 + //#if MC >= 26.2 + //$$ return Minecraft.getInstance().gameRenderer.gameRenderState().levelRenderState.skyRenderState.moonPhase.index(); + //#elseif MC >= 26.1 //$$ return Minecraft.getInstance().gameRenderer.getGameRenderState().levelRenderState.skyRenderState.moonPhase.index(); //#elseif MC >= 12111 //$$ return Minecraft.getInstance().gameRenderer.getLevelRenderState().skyRenderState.moonPhase.index(); diff --git a/src/main/java/traben/entity_texture_features/features/property_reading/properties/optifine_properties/SizeProperty.java b/src/main/java/traben/entity_texture_features/features/property_reading/properties/optifine_properties/SizeProperty.java index a25007c0..196b46dc 100644 --- a/src/main/java/traben/entity_texture_features/features/property_reading/properties/optifine_properties/SizeProperty.java +++ b/src/main/java/traben/entity_texture_features/features/property_reading/properties/optifine_properties/SizeProperty.java @@ -9,7 +9,11 @@ import java.util.Properties; import net.minecraft.world.entity.monster.Phantom; +//#if MC >= 26.2 +//$$ import net.minecraft.world.entity.monster.cubemob.Slime; +//#else import net.minecraft.world.entity.monster.Slime; +//#endif public class SizeProperty extends SimpleIntegerArrayProperty { diff --git a/src/main/java/traben/entity_texture_features/features/texture_handlers/ETFArmorHandler.java b/src/main/java/traben/entity_texture_features/features/texture_handlers/ETFArmorHandler.java index 72452757..43b890e7 100644 --- a/src/main/java/traben/entity_texture_features/features/texture_handlers/ETFArmorHandler.java +++ b/src/main/java/traben/entity_texture_features/features/texture_handlers/ETFArmorHandler.java @@ -22,7 +22,6 @@ import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.VertexConsumer; -import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.texture.OverlayTexture; import net.minecraft.client.model.Model; @@ -33,6 +32,7 @@ import traben.entity_texture_features.features.ETFManager; import traben.entity_texture_features.features.ETFRenderContext; import traben.entity_texture_features.utils.ETFUtils2; +import traben.entity_texture_features.utils.URenderTypeToVertexConsumer; //todo 2 better cancelling out for post 1.21.2? //todo is the patching still required? @@ -68,17 +68,17 @@ public class ETFArmorHandler { //$$ return vanilla; //$$ } //$$ -//$$ public void renderBaseEmissive(final PoseStack matrices, final MultiBufferSource vertexConsumers, final Model model, final float red, final float green, final float blue) { +//$$ public void renderBaseEmissive(final PoseStack matrices, final URenderTypeToVertexConsumer vertexConsumers, final Model model, final float red, final float green, final float blue) { //$$ //$$ //UUID id = livingEntity.getUuid(); //$$ if (texture != null && ETF.config().getConfig().canDoEmissiveTextures()) { //$$ ResourceLocation emissive = texture.getEmissiveIdentifierOfCurrentState(); //$$ if (emissive != null) { -//$$ VertexConsumer textureVert;// = ItemRenderer.getArmorGlintConsumer(vertexConsumers, RenderLayer.getBeaconBeam(PATH_EMISSIVE_TEXTURE_IDENTIFIER.get(fileString), true), false, usesSecondLayer); +//$$ VertexConsumer textureVert;// = ItemRenderer.getArmorGlintConsumer(vertexConsumers.delegate, RenderLayer.getBeaconBeam(PATH_EMISSIVE_TEXTURE_IDENTIFIER.get(fileString), true), false, usesSecondLayer); //$$ //if (ETFManager.getEmissiveMode() == ETFManager.EmissiveRenderModes.BRIGHT) { -//$$ // textureVert = vertexConsumers.getBuffer(RenderLayer.getBeaconBeam(emissive, true));//ItemRenderer.getArmorGlintConsumer(vertexConsumers, RenderLayer.getBeaconBeam(emissive, true), false, usesSecondLayer); +//$$ // textureVert = vertexConsumers.getBuffer(RenderLayer.getBeaconBeam(emissive, true));//ItemRenderer.getArmorGlintConsumer(vertexConsumers.delegate, RenderLayer.getBeaconBeam(emissive, true), false, usesSecondLayer); //$$ //} else { -//$$ textureVert = vertexConsumers.getBuffer(RenderType.armorCutoutNoCull(emissive)); //ItemRenderer.getArmorGlintConsumer(vertexConsumers, RenderLayer.getEntityTranslucent(emissive), false, usesSecondLayer); +//$$ textureVert = vertexConsumers.getBuffer(RenderType.armorCutoutNoCull(emissive)); //ItemRenderer.getArmorGlintConsumer(vertexConsumers.delegate, RenderLayer.getEntityTranslucent(emissive), false, usesSecondLayer); //$$ //} //$$ ETFRenderContext.startSpecialRenderOverlayPhase(); //$$ //do not pop/push as we want the scaling to trickle down to trim rendering, so they appear over the emissive @@ -93,7 +93,7 @@ public class ETFArmorHandler { //$$ } //$$ //$$ } -//$$ public void renderTrimEmissive(final PoseStack matrices, final MultiBufferSource vertexConsumers, final Model model) { +//$$ public void renderTrimEmissive(final PoseStack matrices, final URenderTypeToVertexConsumer vertexConsumers, final Model model) { //$$ if(trimTexture != null && ETF.config().getConfig().canDoEmissiveTextures()){ //$$ //trimTexture.renderEmissive(matrices,vertexConsumers,model); //$$ ResourceLocation emissive = trimTexture.getEmissiveIdentifierOfCurrentState(); @@ -141,7 +141,7 @@ public void end(){ ETFRenderContext.preventTexturePatching(); } - public void renderTrimEmissive(final PoseStack matrices, final MultiBufferSource vertexConsumers, final Model model) { + public void renderTrimEmissive(final PoseStack matrices, final URenderTypeToVertexConsumer vertexConsumers, final Model model) { if(trimTexture != null && ETF.config().getConfig().canDoEmissiveTextures()){ ResourceLocation emissive = trimTexture.getEmissiveIdentifierOfCurrentState(); if (emissive != null) { @@ -155,7 +155,11 @@ public void renderTrimEmissive(final PoseStack matrices, final MultiBufferSource .armorCutoutNoCull(emissive)); // if (ETF.IRIS_DETECTED) matrices.scale(1.001f,1.001f,1.001f);//inflate - model.renderToBuffer(matrices, textureVert, ETF.EMISSIVE_FEATURE_LIGHT_VALUE, OverlayTexture.NO_OVERLAY); + model.renderToBuffer(matrices, textureVert, ETF.EMISSIVE_FEATURE_LIGHT_VALUE, OverlayTexture.NO_OVERLAY + //#if MC >= 26.2 + //$$ , -1 + //#endif + ); ETFRenderContext.endSpecialRenderOverlayPhase(); } } diff --git a/src/main/java/traben/entity_texture_features/features/texture_handlers/ETFTexture.java b/src/main/java/traben/entity_texture_features/features/texture_handlers/ETFTexture.java index 801e8048..839826df 100644 --- a/src/main/java/traben/entity_texture_features/features/texture_handlers/ETFTexture.java +++ b/src/main/java/traben/entity_texture_features/features/texture_handlers/ETFTexture.java @@ -6,7 +6,9 @@ import net.minecraft.client.Minecraft; import net.minecraft.client.model.Model; import net.minecraft.client.model.geom.ModelPart; +//#if MC < 26.2 import net.minecraft.client.renderer.MultiBufferSource; +//#endif import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.texture.OverlayTexture; import net.minecraft.client.renderer.texture.TextureAtlasSprite; @@ -478,6 +480,7 @@ public String toString() { return "[" + this.thisIdentifier.toString() + ", emissive=" + isEmissive() + ", blinks=" + doesBlink() + "]"; } + //#if MC < 26.2 public void renderEmissive(PoseStack matrixStack, MultiBufferSource vertexConsumerProvider, ModelPart modelPart) { renderEmissive(matrixStack, vertexConsumerProvider, modelPart, ETFManager.getEmissiveMode()); } @@ -514,6 +517,7 @@ public VertexConsumer getEmissiveVertexConsumer(MultiBufferSource vertexConsumer if (type == null) return null; return vertexConsumerProvider.getBuffer(type); } + //#endif @Nullable public RenderType getEmissiveRenderLayer(@Nullable Model model) { diff --git a/src/main/java/traben/entity_texture_features/mixin/mixins/MixinBufferBuilder.java b/src/main/java/traben/entity_texture_features/mixin/mixins/MixinBufferBuilder.java index 35130b05..29567317 100644 --- a/src/main/java/traben/entity_texture_features/mixin/mixins/MixinBufferBuilder.java +++ b/src/main/java/traben/entity_texture_features/mixin/mixins/MixinBufferBuilder.java @@ -10,15 +10,15 @@ import java.util.Optional; -import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; import net.minecraft.resources.ResourceLocation; +import traben.entity_texture_features.utils.URenderTypeToVertexConsumer; @Mixin(BufferBuilder.class) public class MixinBufferBuilder implements ETFVertexConsumer { @Unique - private MultiBufferSource etf$provider = null; + private URenderTypeToVertexConsumer etf$provider = null; @Unique private RenderType etf$renderLayer = null; @Unique @@ -30,7 +30,7 @@ public class MixinBufferBuilder implements ETFVertexConsumer { } @Override - public MultiBufferSource etf$getProvider() { + public URenderTypeToVertexConsumer etf$getProvider() { return etf$provider; } @@ -40,7 +40,7 @@ public class MixinBufferBuilder implements ETFVertexConsumer { } @Override - public void etf$initETFVertexConsumer(MultiBufferSource provider, RenderType renderLayer) { + public void etf$initETFVertexConsumer(URenderTypeToVertexConsumer provider, RenderType renderLayer) { etf$provider = provider; etf$renderLayer = renderLayer; diff --git a/src/main/java/traben/entity_texture_features/mixin/mixins/MixinModelPart.java b/src/main/java/traben/entity_texture_features/mixin/mixins/MixinModelPart.java index baead029..a77cf051 100644 --- a/src/main/java/traben/entity_texture_features/mixin/mixins/MixinModelPart.java +++ b/src/main/java/traben/entity_texture_features/mixin/mixins/MixinModelPart.java @@ -4,7 +4,6 @@ import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.VertexConsumer; import net.minecraft.client.model.geom.ModelPart; -import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -18,6 +17,7 @@ import traben.entity_texture_features.features.texture_handlers.ETFTexture; import traben.entity_texture_features.utils.ETFUtils2; import traben.entity_texture_features.utils.ETFVertexConsumer; +import traben.entity_texture_features.utils.URenderTypeToVertexConsumer; /** * this method figures out if a {@link ModelPart} is the top level of the children tree being rendered, @@ -68,7 +68,7 @@ public abstract class MixinModelPart { ETFTexture texture = etfVertexConsumer.etf$getETFTexture(); //is etf texture not null and does it special render? if (texture != null && (texture.isEmissive() || texture.isEnchanted())) { - MultiBufferSource provider = etfVertexConsumer.etf$getProvider(); + URenderTypeToVertexConsumer provider = etfVertexConsumer.etf$getProvider(); //very important this is captured before doing the special renders as they can potentially modify //the same ETFVertexConsumer down stream RenderType layer = etfVertexConsumer.etf$getRenderLayer(); diff --git a/src/main/java/traben/entity_texture_features/mixin/mixins/MixinPackScreen.java b/src/main/java/traben/entity_texture_features/mixin/mixins/MixinPackScreen.java index d8f79bf5..bcf7c796 100644 --- a/src/main/java/traben/entity_texture_features/mixin/mixins/MixinPackScreen.java +++ b/src/main/java/traben/entity_texture_features/mixin/mixins/MixinPackScreen.java @@ -27,6 +27,7 @@ import traben.entity_texture_features.config.ETFConfig; import traben.entity_texture_features.config.screens.ETFConfigScreenMain; import traben.entity_texture_features.utils.ETFUtils2; +import traben.entity_texture_features.utils.UScreen; import java.nio.file.Path; import java.util.Objects; @@ -92,7 +93,7 @@ protected MixinPackScreen(Component title) { //#else //$$ 0, 0, 20, etf$UNFOCUSED, //#endif - (button) -> Objects.requireNonNull(minecraft).setScreen(new ETFConfigScreenMain(this)) + (button) -> UScreen.setScreen(new ETFConfigScreenMain(this)) //#if MC >= 12002 , Component.nullToEmpty("") //#endif diff --git a/src/main/java/traben/entity_texture_features/mixin/mixins/MixinSpriteIdentifier.java b/src/main/java/traben/entity_texture_features/mixin/mixins/MixinSpriteIdentifier.java index 6df8086a..2a0804be 100644 --- a/src/main/java/traben/entity_texture_features/mixin/mixins/MixinSpriteIdentifier.java +++ b/src/main/java/traben/entity_texture_features/mixin/mixins/MixinSpriteIdentifier.java @@ -12,7 +12,6 @@ import java.util.function.Function; -import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.SpriteCoordinateExpander; import net.minecraft.client.resources.model.Material; @@ -24,7 +23,8 @@ @Mixin(Material.class) //#endif public class MixinSpriteIdentifier { - + //TODO really needs a look at +//#if MC < 26.2 @Inject(method = //#if MC >= 26.1 //$$ { @@ -38,7 +38,7 @@ public class MixinSpriteIdentifier { //#endif at = @At(value = "RETURN"), cancellable = true) private void etf$modifyIfRequired(CallbackInfoReturnable cir, - @Local(argsOnly = true) MultiBufferSource vertexConsumers, + @Local(argsOnly = true) net.minecraft.client.renderer.MultiBufferSource vertexConsumers, @Local(argsOnly = true) Function layerFactory) { if (cir.getReturnValue() instanceof SpriteCoordinateExpander spriteTexturedVertexConsumer) { @@ -71,5 +71,5 @@ public class MixinSpriteIdentifier { } } } - +//#endif } diff --git a/src/main/java/traben/entity_texture_features/mixin/mixins/MixinVertexConsumerProvider$Immediate.java b/src/main/java/traben/entity_texture_features/mixin/mixins/MixinVertexConsumerProvider$Immediate.java index 911f5cd8..97df45f6 100644 --- a/src/main/java/traben/entity_texture_features/mixin/mixins/MixinVertexConsumerProvider$Immediate.java +++ b/src/main/java/traben/entity_texture_features/mixin/mixins/MixinVertexConsumerProvider$Immediate.java @@ -1,5 +1,45 @@ package traben.entity_texture_features.mixin.mixins; +//#if MC >= 26.2 +//$$ import com.mojang.blaze3d.vertex.VertexConsumer; +//$$ import net.minecraft.client.renderer.feature.RenderTypeFeatureRenderer; +//$$ import net.minecraft.client.renderer.rendertype.RenderType; +//$$ import org.spongepowered.asm.mixin.Mixin; +//$$ import org.spongepowered.asm.mixin.injection.At; +//$$ import org.spongepowered.asm.mixin.injection.Inject; +//$$ import org.spongepowered.asm.mixin.injection.ModifyVariable; +//$$ import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; +//$$ import traben.entity_texture_features.compat.SodiumGetBufferInjector; +//$$ import traben.entity_texture_features.features.ETFRenderContext; +//$$ import traben.entity_texture_features.utils.URenderTypeToVertexConsumer; +//$$ +//$$ @Mixin(value = RenderTypeFeatureRenderer.class, priority = 800) +//$$ public class MixinVertexConsumerProvider$Immediate { +//$$ +//$$ +//$$ @ModifyVariable( +//$$ method = "getVertexBuilder", +//$$ at = @At(value = "HEAD"), +//$$ index = 1, argsOnly = true) +//$$ private RenderType etf$modifyRenderLayer(RenderType value) { +//$$ return ETFRenderContext.modifyRenderLayerIfRequired(value); +//$$ } +//$$ +//$$ +//$$ @Inject( +//$$ method = "getVertexBuilder", +//$$ at = @At(value = "RETURN")) +//$$ private void etf$injectIntoGetBufferReturn(RenderType renderLayer, CallbackInfoReturnable cir) { +//$$ var returned = cir.getReturnValue(); +//$$ var uSource = new URenderTypeToVertexConsumer((RenderTypeFeatureRenderer) (Object) this); +//$$ ETFRenderContext.insertETFDataIntoVertexConsumer(uSource, renderLayer, returned); +//$$ //quarantined class to contain all sodium interaction +//$$ //sodium ExtendedBufferBuilder classes contain a delegate that must instead have the above data passed into +//$$ SodiumGetBufferInjector.inject(uSource, renderLayer, returned); +//$$ } +//$$ +//$$ } +//#else import com.mojang.blaze3d.vertex.VertexConsumer; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; @@ -10,6 +50,7 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import traben.entity_texture_features.compat.SodiumGetBufferInjector; import traben.entity_texture_features.features.ETFRenderContext; +import traben.entity_texture_features.utils.URenderTypeToVertexConsumer; @Mixin(value = MultiBufferSource.BufferSource.class, priority = 800) public class MixinVertexConsumerProvider$Immediate { @@ -29,10 +70,11 @@ public class MixinVertexConsumerProvider$Immediate { at = @At(value = "RETURN")) private void etf$injectIntoGetBufferReturn(RenderType renderLayer, CallbackInfoReturnable cir) { var returned = cir.getReturnValue(); - ETFRenderContext.insertETFDataIntoVertexConsumer((MultiBufferSource) this, renderLayer, returned); + ETFRenderContext.insertETFDataIntoVertexConsumer(new URenderTypeToVertexConsumer((MultiBufferSource) this), renderLayer, returned); //quarantined class to contain all sodium interaction //sodium ExtendedBufferBuilder classes contain a delegate that must instead have the above data passed into - SodiumGetBufferInjector.inject((MultiBufferSource) this, renderLayer, returned); + SodiumGetBufferInjector.inject(new URenderTypeToVertexConsumer((MultiBufferSource) this), renderLayer, returned); } } +//#endif diff --git a/src/main/java/traben/entity_texture_features/mixin/mixins/MixinVertexMultiConsumer$Double.java b/src/main/java/traben/entity_texture_features/mixin/mixins/MixinVertexMultiConsumer$Double.java index 60d1b6b3..4b929495 100644 --- a/src/main/java/traben/entity_texture_features/mixin/mixins/MixinVertexMultiConsumer$Double.java +++ b/src/main/java/traben/entity_texture_features/mixin/mixins/MixinVertexMultiConsumer$Double.java @@ -1,5 +1,14 @@ package traben.entity_texture_features.mixin.mixins; +//#if MC >= 26.2 +//$$ +//$$ import org.spongepowered.asm.mixin.Mixin; +//$$ import traben.entity_texture_features.mixin.CancelTarget; +//$$ +//$$ @Mixin(CancelTarget.class) +//$$ public class MixinVertexMultiConsumer$Double{} +//#else + import com.mojang.blaze3d.vertex.VertexConsumer; import com.mojang.blaze3d.vertex.VertexMultiConsumer; import net.minecraft.client.renderer.MultiBufferSource; @@ -9,6 +18,7 @@ import org.spongepowered.asm.mixin.Shadow; import traben.entity_texture_features.features.texture_handlers.ETFTexture; import traben.entity_texture_features.utils.ETFVertexConsumer; +import traben.entity_texture_features.utils.URenderTypeToVertexConsumer; /** * This allows a Double VertexConsumer to be used as an ETFVertexConsumer @@ -34,7 +44,7 @@ public class MixinVertexMultiConsumer$Double implements ETFVertexConsumer { } @Override - public MultiBufferSource etf$getProvider() { + public URenderTypeToVertexConsumer etf$getProvider() { if (second instanceof ETFVertexConsumer etfSecond) { return etfSecond.etf$getProvider(); } @@ -56,7 +66,8 @@ public class MixinVertexMultiConsumer$Double implements ETFVertexConsumer { } @Override - public void etf$initETFVertexConsumer(MultiBufferSource provider, RenderType renderLayer) { + public void etf$initETFVertexConsumer(URenderTypeToVertexConsumer provider, RenderType renderLayer) { } } +//#endif diff --git a/src/main/java/traben/entity_texture_features/mixin/mixins/entity/block/MixinSkullBlockEntityRenderer.java b/src/main/java/traben/entity_texture_features/mixin/mixins/entity/block/MixinSkullBlockEntityRenderer.java index 2ad7eec5..d84c6943 100644 --- a/src/main/java/traben/entity_texture_features/mixin/mixins/entity/block/MixinSkullBlockEntityRenderer.java +++ b/src/main/java/traben/entity_texture_features/mixin/mixins/entity/block/MixinSkullBlockEntityRenderer.java @@ -1,36 +1,36 @@ package traben.entity_texture_features.mixin.mixins.entity.block; -import com.mojang.blaze3d.vertex.PoseStack; -import net.minecraft.client.Minecraft; -import net.minecraft.client.model.SkullModelBase; -import net.minecraft.client.renderer.MultiBufferSource; -import net.minecraft.client.renderer.RenderType; -import net.minecraft.client.renderer.blockentity.BlockEntityRenderer; -import net.minecraft.client.renderer.blockentity.SkullBlockRenderer; -import net.minecraft.core.Direction; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.level.block.SkullBlock; -import net.minecraft.world.level.block.entity.SkullBlockEntity; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.phys.Vec3; 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.ModifyArg; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import org.spongepowered.asm.mixin.injection.callback.LocalCapture; -import traben.entity_texture_features.ETF; -import traben.entity_texture_features.features.ETFManager; -import traben.entity_texture_features.features.ETFRenderContext; -import traben.entity_texture_features.features.player.ETFPlayerEntity; -import traben.entity_texture_features.features.player.ETFPlayerFeatureRenderer; -import traben.entity_texture_features.features.player.ETFPlayerTexture; //#if MC >= 12109 @Mixin(traben.entity_texture_features.mixin.CancelTarget.class) public abstract class MixinSkullBlockEntityRenderer { } // TODO 1.21.9 support //#else +//$$ import com.mojang.blaze3d.vertex.PoseStack; +//$$ import net.minecraft.client.Minecraft; +//$$ import net.minecraft.client.model.SkullModelBase; +//$$ import net.minecraft.client.renderer.MultiBufferSource; +//$$ import net.minecraft.client.renderer.RenderType; +//$$ import net.minecraft.client.renderer.blockentity.BlockEntityRenderer; +//$$ import net.minecraft.client.renderer.blockentity.SkullBlockRenderer; +//$$ import net.minecraft.core.Direction; +//$$ import net.minecraft.resources.ResourceLocation; +//$$ import net.minecraft.world.level.block.SkullBlock; +//$$ import net.minecraft.world.level.block.entity.SkullBlockEntity; +//$$ import net.minecraft.world.level.block.state.BlockState; +//$$ import net.minecraft.world.phys.Vec3; +//$$ 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.ModifyArg; +//$$ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +//$$ import org.spongepowered.asm.mixin.injection.callback.LocalCapture; +//$$ import traben.entity_texture_features.ETF; +//$$ import traben.entity_texture_features.features.ETFManager; +//$$ import traben.entity_texture_features.features.ETFRenderContext; +//$$ import traben.entity_texture_features.features.player.ETFPlayerEntity; +//$$ import traben.entity_texture_features.features.player.ETFPlayerFeatureRenderer; +//$$ import traben.entity_texture_features.features.player.ETFPlayerTexture; //$$ //$$ @Mixin(SkullBlockRenderer.class) //$$ public abstract class MixinSkullBlockEntityRenderer implements BlockEntityRenderer { diff --git a/src/main/java/traben/entity_texture_features/mixin/mixins/entity/misc/MixinBlockEntity.java b/src/main/java/traben/entity_texture_features/mixin/mixins/entity/misc/MixinBlockEntity.java index cdf9f673..248a7f11 100644 --- a/src/main/java/traben/entity_texture_features/mixin/mixins/entity/misc/MixinBlockEntity.java +++ b/src/main/java/traben/entity_texture_features/mixin/mixins/entity/misc/MixinBlockEntity.java @@ -11,7 +11,6 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.BedBlock; -import net.minecraft.world.level.block.entity.BedBlockEntity; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.properties.BedPart; @@ -92,13 +91,15 @@ public abstract class MixinBlockEntity implements ETFEntity { @Override public BlockPos etf$getBlockPos() { + //#if MC < 26.2 var self = (BlockEntity) ((Object) this); - if(self instanceof BedBlockEntity bed){ + if(self instanceof net.minecraft.world.level.block.entity.BedBlockEntity bed){ var state = bed.getBlockState(); if(state.getValue(BedBlock.PART) == BedPart.HEAD){ return getBlockPos().relative(state.getValue(BedBlock.FACING)); } } + //#endif return getBlockPos(); } diff --git a/src/main/java/traben/entity_texture_features/mixin/mixins/entity/misc/MixinBlockEntityRenderDispatcher.java b/src/main/java/traben/entity_texture_features/mixin/mixins/entity/misc/MixinBlockEntityRenderDispatcher.java index 994b955c..98c01366 100644 --- a/src/main/java/traben/entity_texture_features/mixin/mixins/entity/misc/MixinBlockEntityRenderDispatcher.java +++ b/src/main/java/traben/entity_texture_features/mixin/mixins/entity/misc/MixinBlockEntityRenderDispatcher.java @@ -2,7 +2,6 @@ import com.llamalad7.mixinextras.sugar.Local; import com.mojang.blaze3d.vertex.PoseStack; -import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.blockentity.BlockEntityRenderDispatcher; import net.minecraft.client.renderer.blockentity.BlockEntityRenderer; import net.minecraft.world.entity.Entity; diff --git a/src/main/java/traben/entity_texture_features/mixin/mixins/entity/misc/MixinBlockEntityRenderState.java b/src/main/java/traben/entity_texture_features/mixin/mixins/entity/misc/MixinBlockEntityRenderState.java index 84bd3103..a7c7a473 100644 --- a/src/main/java/traben/entity_texture_features/mixin/mixins/entity/misc/MixinBlockEntityRenderState.java +++ b/src/main/java/traben/entity_texture_features/mixin/mixins/entity/misc/MixinBlockEntityRenderState.java @@ -49,6 +49,8 @@ public class MixinBlockEntityRenderState implements HoldsETFRenderState { @ModifyExpressionValue(method = "extractBase", at = @At(value = "INVOKE",target = //#if MC >= 26.1 + //$$ "Lnet/minecraft/util/LightCoordsUtil;getLightCoords(Lnet/minecraft/world/level/BlockAndLightGetter;Lnet/minecraft/core/BlockPos;)I" + //#elseif MC >= 26.1 //$$ "Lnet/minecraft/client/renderer/LevelRenderer;getLightCoords(Lnet/minecraft/world/level/BlockAndLightGetter;Lnet/minecraft/core/BlockPos;)I" //#else "Lnet/minecraft/client/renderer/LevelRenderer;getLightColor(Lnet/minecraft/world/level/BlockAndTintGetter;Lnet/minecraft/core/BlockPos;)I" diff --git a/src/main/java/traben/entity_texture_features/mixin/mixins/entity/misc/MixinEntity.java b/src/main/java/traben/entity_texture_features/mixin/mixins/entity/misc/MixinEntity.java index 3c5a94c1..98b3d150 100644 --- a/src/main/java/traben/entity_texture_features/mixin/mixins/entity/misc/MixinEntity.java +++ b/src/main/java/traben/entity_texture_features/mixin/mixins/entity/misc/MixinEntity.java @@ -1,6 +1,5 @@ package traben.entity_texture_features.mixin.mixins.entity.misc; -import net.minecraft.advancements.critereon.NbtPredicate; import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.Component; @@ -138,7 +137,13 @@ public abstract class MixinEntity implements ETFEntity { @Override public CompoundTag etf$getNbt() { return ETFRenderContext.cacheEntityNBTForFrame(etf$getUuid(), - ()->NbtPredicate.getEntityTagToCompare(((Entity)((Object)this)))); + ()-> + //#if MC >= 26.2 + //$$ net.minecraft.advancements.predicates.NbtPredicate + //#else + net.minecraft.advancements.critereon.NbtPredicate + //#endif + .getEntityTagToCompare(((Entity)((Object)this)))); //try include id // if (saveAsPassenger(comp)) { // return comp; diff --git a/src/main/java/traben/entity_texture_features/mixin/mixins/entity/renderer/MixinLivingEntityRenderer.java b/src/main/java/traben/entity_texture_features/mixin/mixins/entity/renderer/MixinLivingEntityRenderer.java index f4c41bbf..9841378e 100644 --- a/src/main/java/traben/entity_texture_features/mixin/mixins/entity/renderer/MixinLivingEntityRenderer.java +++ b/src/main/java/traben/entity_texture_features/mixin/mixins/entity/renderer/MixinLivingEntityRenderer.java @@ -5,7 +5,6 @@ import com.llamalad7.mixinextras.sugar.ref.LocalRef; import com.mojang.blaze3d.vertex.PoseStack; import net.minecraft.client.model.EntityModel; -import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.entity.EntityRenderer; import net.minecraft.client.renderer.entity.EntityRendererProvider; import net.minecraft.client.renderer.entity.LivingEntityRenderer; diff --git a/src/main/java/traben/entity_texture_features/mixin/mixins/entity/renderer/MixinPaintingEntityRenderer.java b/src/main/java/traben/entity_texture_features/mixin/mixins/entity/renderer/MixinPaintingEntityRenderer.java index 3fc5863a..0910e7e6 100644 --- a/src/main/java/traben/entity_texture_features/mixin/mixins/entity/renderer/MixinPaintingEntityRenderer.java +++ b/src/main/java/traben/entity_texture_features/mixin/mixins/entity/renderer/MixinPaintingEntityRenderer.java @@ -5,7 +5,6 @@ import com.mojang.math.Axis; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.LevelRenderer; -import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.entity.EntityRenderer; import net.minecraft.client.renderer.entity.EntityRendererProvider; @@ -93,11 +92,11 @@ protected MixinPaintingEntityRenderer(EntityRendererProvider.Context ctx) { //#elseif MC >= 12103 //$$ @Inject(method = "render(Lnet/minecraft/client/renderer/entity/state/PaintingRenderState;Lcom/mojang/blaze3d/vertex/PoseStack;Lnet/minecraft/client/renderer/MultiBufferSource;I)V", //$$ at = @At(value = "HEAD"), cancellable = true) - //$$ private void etf$getSprites(final PaintingRenderState paintingRenderState, final PoseStack matrixStack, final MultiBufferSource vertexConsumerProvider, final int i, final CallbackInfo ci) { + //$$ private void etf$getSprites(final PaintingRenderState paintingRenderState, final PoseStack matrixStack, final net.minecraft.client.renderer.MultiBufferSource vertexConsumerProvider, final int i, final CallbackInfo ci) { //#else //$$ @Inject(method = "render(Lnet/minecraft/world/entity/decoration/Painting;FFLcom/mojang/blaze3d/vertex/PoseStack;Lnet/minecraft/client/renderer/MultiBufferSource;I)V", //$$ at = @At(value = "HEAD"), cancellable = true) - //$$ private void etf$getSprites(Painting paintingEntity, float f, float g, PoseStack matrixStack, MultiBufferSource vertexConsumerProvider, int i, CallbackInfo ci) { + //$$ private void etf$getSprites(Painting paintingEntity, float f, float g, PoseStack matrixStack, net.minecraft.client.renderer.MultiBufferSource vertexConsumerProvider, int i, CallbackInfo ci) { //#endif ETFEntityRenderState etfEntity = @@ -234,7 +233,7 @@ protected MixinPaintingEntityRenderer(EntityRendererProvider.Context ctx) { } //#if MC < 12109 //$$ @Unique - //$$ private void etf$renderETFPainting(PoseStack.Pose entry, MultiBufferSource vertexConsumerProvider, Painting entity, int width, int height, ETFSprite ETFPaintingSprite, ETFSprite ETFBackSprite) { + //$$ private void etf$renderETFPainting(PoseStack.Pose entry, net.minecraft.client.renderer.MultiBufferSource vertexConsumerProvider, Painting entity, int width, int height, ETFSprite ETFPaintingSprite, ETFSprite ETFBackSprite) { //$$ ETFRenderContext.preventRenderLayerTextureModify(); //$$ VertexConsumer vertexConsumerFront = vertexConsumerProvider.getBuffer(RenderType.entitySolid(ETFPaintingSprite.getSpriteVariant().atlasLocation())); //$$ etf$renderETFPaintingFront(entry, vertexConsumerFront, entity, width, height, ETFPaintingSprite.getSpriteVariant(), false); @@ -320,7 +319,11 @@ protected MixinPaintingEntityRenderer(EntityRendererProvider.Context ctx) { ae = Mth.floor(entity.getZ() + (double) ((y + z) / 2.0F / divider)); } + //#if MC >= 26.2 + //$$ light = net.minecraft.util.LightCoordsUtil.getLightCoords(entity.level(), new BlockPos(ac, ad, ae)); + //#else light = LevelRenderer.getLightColor(entity.level(), new BlockPos(ac, ad, ae)); + //#endif } float zConst = @@ -419,7 +422,11 @@ protected MixinPaintingEntityRenderer(EntityRendererProvider.Context ctx) { ae = Mth.floor(entity.getZ() + (double) ((y + z) / 2.0F / divider)); } + //#if MC >= 26.2 + //$$ light = net.minecraft.util.LightCoordsUtil.getLightCoords(entity.level(), new BlockPos(ac, ad, ae)); + //#else light = LevelRenderer.getLightColor(entity.level(), new BlockPos(ac, ad, ae)); + //#endif } float zConst = diff --git a/src/main/java/traben/entity_texture_features/mixin/mixins/entity/renderer/MixinPlayerEntityRenderer.java b/src/main/java/traben/entity_texture_features/mixin/mixins/entity/renderer/MixinPlayerEntityRenderer.java index c6c0d440..1ab658aa 100644 --- a/src/main/java/traben/entity_texture_features/mixin/mixins/entity/renderer/MixinPlayerEntityRenderer.java +++ b/src/main/java/traben/entity_texture_features/mixin/mixins/entity/renderer/MixinPlayerEntityRenderer.java @@ -6,7 +6,6 @@ import net.minecraft.client.model.PlayerModel; import net.minecraft.client.model.geom.ModelPart; import net.minecraft.client.player.AbstractClientPlayer; -import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.entity.EntityRendererProvider; import net.minecraft.client.renderer.entity.ItemRenderer; @@ -52,7 +51,7 @@ public abstract class MixinPlayerEntityRenderer implements ETFPlayerSkinHolder { //$$ @Shadow -//$$ protected abstract void renderNameTag(final PlayerRenderState playerRenderState, final Component component, final PoseStack poseStack, final MultiBufferSource multiBufferSource, final int i); +//$$ protected abstract void renderNameTag(final PlayerRenderState playerRenderState, final Component component, final PoseStack poseStack, final net.minecraft.client.renderer.MultiBufferSource multiBufferSource, final int i); //$$ //$$ //#else @@ -109,7 +108,7 @@ public MixinPlayerEntityRenderer(EntityRendererProvider.Context ctx, //$$ @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", //$$ shift = At.Shift.BEFORE), cancellable = true) - //$$ private void etf$redirectNicely(final PoseStack matrices, final MultiBufferSource vertexConsumers, final int light, final ResourceLocation resourceLocation, final ModelPart armAndSleeve, final boolean bl, final CallbackInfo ci) { + //$$ private void etf$redirectNicely(final PoseStack matrices, final net.minecraft.client.renderer.MultiBufferSource vertexConsumers, final int light, final ResourceLocation resourceLocation, final ModelPart armAndSleeve, final boolean bl, final CallbackInfo ci) { //$$ //todo redo all this, 1.21.2 really changed things //$$ if (Minecraft.getInstance().player == null) return; //$$ var player = Minecraft.getInstance().player; @@ -118,7 +117,7 @@ public MixinPlayerEntityRenderer(EntityRendererProvider.Context ctx, //$$ @Inject(method = "renderHand", //$$ at = @At(value = "INVOKE", target = "Lnet/minecraft/client/model/PlayerModel;setupAnim(Lnet/minecraft/world/entity/LivingEntity;FFFFF)V", //$$ shift = At.Shift.AFTER), cancellable = true) - //$$ private void etf$redirectNicely(PoseStack matrices, MultiBufferSource vertexConsumers, int light, AbstractClientPlayer player, ModelPart arm, ModelPart sleeve, CallbackInfo ci) { + //$$ private void etf$redirectNicely(PoseStack matrices, net.minecraft.client.renderer.MultiBufferSource vertexConsumers, int light, AbstractClientPlayer player, ModelPart arm, ModelPart sleeve, CallbackInfo ci) { //#endif //$$ if (ETF.config().getConfig().skinFeaturesEnabled) { //$$ ETFPlayerTexture thisETFPlayerTexture = ETFManager.getInstance().getPlayerTexture(player, diff --git a/src/main/java/traben/entity_texture_features/mixin/mixins/entity/renderer/feature/MixinMooshroomMushroomFeatureRenderer.java b/src/main/java/traben/entity_texture_features/mixin/mixins/entity/renderer/feature/MixinMooshroomMushroomFeatureRenderer.java index 1357ecc0..fb3851ec 100644 --- a/src/main/java/traben/entity_texture_features/mixin/mixins/entity/renderer/feature/MixinMooshroomMushroomFeatureRenderer.java +++ b/src/main/java/traben/entity_texture_features/mixin/mixins/entity/renderer/feature/MixinMooshroomMushroomFeatureRenderer.java @@ -21,7 +21,6 @@ import net.minecraft.client.model.geom.builders.CubeListBuilder; import net.minecraft.client.model.geom.builders.MeshDefinition; import net.minecraft.client.model.geom.builders.PartDefinition; -import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.entity.layers.MushroomCowMushroomLayer; import net.minecraft.resources.ResourceLocation; @@ -219,9 +218,9 @@ public abstract class MixinMooshroomMushroomFeatureRenderer { //$$ //rewritten as original didn't seem to work, I must have accidentally changed the vanilla mushroom texture when testing originally //$$ @Inject(method = "renderMushroomBlock", at = @At(value = "HEAD"), cancellable = true) //#if MC >= 12105 - //$$ private void etf$injected(final PoseStack matrices, final MultiBufferSource vertexConsumers, final int light, final boolean renderAsModel, final BlockState mushroomState, final int overlay, final BlockStateModel mushroomModel, final CallbackInfo ci) { + //$$ private void etf$injected(final PoseStack matrices, final net.minecraft.client.renderer.MultiBufferSource vertexConsumers, final int light, final boolean renderAsModel, final BlockState mushroomState, final int overlay, final BlockStateModel mushroomModel, final CallbackInfo ci) { //#else - //$$ private void etf$injected(PoseStack matrices, MultiBufferSource vertexConsumers, int light, boolean renderAsModel, BlockState mushroomState, int overlay, BakedModel mushroomModel, CallbackInfo ci) { + //$$ private void etf$injected(PoseStack matrices, net.minecraft.client.renderer.MultiBufferSource vertexConsumers, int light, boolean renderAsModel, BlockState mushroomState, int overlay, BakedModel mushroomModel, CallbackInfo ci) { //#endif //#endif Boolean shroomType = entity_texture_features$returnRedTrueBrownFalseVanillaNull(); diff --git a/src/main/java/traben/entity_texture_features/mixin/mixins/entity/renderer/feature/MixinShoulderParrotFeatureRenderer.java b/src/main/java/traben/entity_texture_features/mixin/mixins/entity/renderer/feature/MixinShoulderParrotFeatureRenderer.java index 50353cb9..89b9c72c 100644 --- a/src/main/java/traben/entity_texture_features/mixin/mixins/entity/renderer/feature/MixinShoulderParrotFeatureRenderer.java +++ b/src/main/java/traben/entity_texture_features/mixin/mixins/entity/renderer/feature/MixinShoulderParrotFeatureRenderer.java @@ -3,7 +3,6 @@ import com.llamalad7.mixinextras.sugar.Local; import com.mojang.blaze3d.vertex.PoseStack; import net.minecraft.client.model.PlayerModel; -import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.entity.RenderLayerParent; import net.minecraft.client.renderer.entity.layers.ParrotOnShoulderLayer; import net.minecraft.client.renderer.entity.layers.RenderLayer; @@ -11,9 +10,9 @@ import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.NbtOps; import net.minecraft.world.entity.Entity; -import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.animal.Parrot; import net.minecraft.world.entity.player.Player; +import net.minecraft.world.entity.EntityType; //#if MC >= 12103 import net.minecraft.client.renderer.entity.state.ParrotRenderState; @@ -41,6 +40,7 @@ import java.util.function.Consumer; import java.util.stream.Stream; +import traben.entity_texture_features.utils.UEntityTypes; //#if MC >= 12109 import net.minecraft.client.renderer.SubmitNodeCollector; import net.minecraft.client.renderer.entity.state.AvatarRenderState; @@ -87,7 +87,7 @@ public abstract class MixinShoulderParrotFeatureRenderer extends RenderLayer=12106 //$$ ValueInput valueInput = TagValueInput.create(ProblemReporter.DISCARDING, diff --git a/src/main/java/traben/entity_texture_features/mixin/mixins/mods/imediatelyfast/MixinBatchableBufferSource.java b/src/main/java/traben/entity_texture_features/mixin/mixins/mods/imediatelyfast/MixinBatchableBufferSource.java index 1f438ce6..e2c6ea19 100644 --- a/src/main/java/traben/entity_texture_features/mixin/mixins/mods/imediatelyfast/MixinBatchableBufferSource.java +++ b/src/main/java/traben/entity_texture_features/mixin/mixins/mods/imediatelyfast/MixinBatchableBufferSource.java @@ -13,6 +13,7 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import traben.entity_texture_features.compat.SodiumGetBufferInjector; import traben.entity_texture_features.features.ETFRenderContext; +import traben.entity_texture_features.utils.URenderTypeToVertexConsumer; @Pseudo @Mixin(value = BatchableBufferSource.class, priority = 800) @@ -33,12 +34,12 @@ public class MixinBatchableBufferSource { if (!ETFRenderContext.isCurrentlyRenderingEntity()) return; // faster cancel var returned = cir.getReturnValue(); - ETFRenderContext.insertETFDataIntoVertexConsumer((MultiBufferSource) this, renderLayer, returned); + ETFRenderContext.insertETFDataIntoVertexConsumer(new URenderTypeToVertexConsumer((MultiBufferSource) this), renderLayer, returned); //todo is this required with immedeately fast? // quarantined class to contain all sodium interaction // sodium ExtendedBufferBuilder classes contain a delegate that must instead have the above data passed into - SodiumGetBufferInjector.inject((MultiBufferSource) this, renderLayer, returned); + SodiumGetBufferInjector.inject(new URenderTypeToVertexConsumer((MultiBufferSource) this), renderLayer, returned); } } diff --git a/src/main/java/traben/entity_texture_features/mixin/mixins/mods/iris/MixinFullyBufferedMultiBufferSource.java b/src/main/java/traben/entity_texture_features/mixin/mixins/mods/iris/MixinFullyBufferedMultiBufferSource.java index 2944bef5..41434b93 100644 --- a/src/main/java/traben/entity_texture_features/mixin/mixins/mods/iris/MixinFullyBufferedMultiBufferSource.java +++ b/src/main/java/traben/entity_texture_features/mixin/mixins/mods/iris/MixinFullyBufferedMultiBufferSource.java @@ -20,6 +20,7 @@ import org.spongepowered.asm.mixin.injection.ModifyVariable; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import traben.entity_texture_features.features.ETFRenderContext; +import traben.entity_texture_features.utils.URenderTypeToVertexConsumer; /** @@ -56,7 +57,7 @@ public class MixinFullyBufferedMultiBufferSource { ) private void etf$injectIntoGetBufferReturn(RenderType renderLayer, CallbackInfoReturnable cir) { ETFRenderContext.insertETFDataIntoVertexConsumer( - (MultiBufferSource) this, + new URenderTypeToVertexConsumer((MultiBufferSource) this), renderLayer, cir.getReturnValue()); } diff --git a/src/main/java/traben/entity_texture_features/mixin/mixins/mods/skin_layers/MixinCustomizableModelPart.java b/src/main/java/traben/entity_texture_features/mixin/mixins/mods/skin_layers/MixinCustomizableModelPart.java index 5a162d0f..00a9ab1b 100644 --- a/src/main/java/traben/entity_texture_features/mixin/mixins/mods/skin_layers/MixinCustomizableModelPart.java +++ b/src/main/java/traben/entity_texture_features/mixin/mixins/mods/skin_layers/MixinCustomizableModelPart.java @@ -21,6 +21,7 @@ import traben.entity_texture_features.features.texture_handlers.ETFTexture; import traben.entity_texture_features.utils.ETFUtils2; import traben.entity_texture_features.utils.ETFVertexConsumer; +import traben.entity_texture_features.utils.URenderTypeToVertexConsumer; /** * this is a copy of {@link MixinModelPart} @@ -99,7 +100,7 @@ public abstract class MixinCustomizableModelPart { && vertexConsumer instanceof ETFVertexConsumer etfVertexConsumer) { ETFTexture texture = etfVertexConsumer.etf$getETFTexture(); if (texture != null && (texture.isEmissive() || texture.isEnchanted())) { - MultiBufferSource provider = etfVertexConsumer.etf$getProvider(); + URenderTypeToVertexConsumer provider = etfVertexConsumer.etf$getProvider(); RenderType layer = etfVertexConsumer.etf$getRenderLayer(); if (provider != null && layer != null) { //attempt special renders as eager OR checks diff --git a/src/main/java/traben/entity_texture_features/mixin/mixins/mods/sodium/MixinModelPartSodium.java b/src/main/java/traben/entity_texture_features/mixin/mixins/mods/sodium/MixinModelPartSodium.java index 305d84d7..cdfac4e0 100644 --- a/src/main/java/traben/entity_texture_features/mixin/mixins/mods/sodium/MixinModelPartSodium.java +++ b/src/main/java/traben/entity_texture_features/mixin/mixins/mods/sodium/MixinModelPartSodium.java @@ -28,6 +28,7 @@ public abstract class MixinModelPartSodium { } //$$ import traben.entity_texture_features.mixin.mixins.MixinModelPart; //$$ import traben.entity_texture_features.utils.ETFUtils2; //$$ import traben.entity_texture_features.utils.ETFVertexConsumer; +//$$ import traben.entity_texture_features.utils.URenderTypeToVertexConsumer; //$$ //$$ /** //$$ * this is a copy of {@link MixinModelPart} but for sodium's alternative model part render method @@ -81,7 +82,7 @@ public abstract class MixinModelPartSodium { } //$$ && writer instanceof ETFVertexConsumer etfVertexConsumer) { //$$ ETFTexture texture = etfVertexConsumer.etf$getETFTexture(); //$$ if (texture != null && (texture.isEmissive() || texture.isEnchanted())) { -//$$ MultiBufferSource provider = etfVertexConsumer.etf$getProvider(); +//$$ URenderTypeToVertexConsumer provider = etfVertexConsumer.etf$getProvider(); //$$ RenderType layer = etfVertexConsumer.etf$getRenderLayer(); //$$ if (provider != null && layer != null) { //$$ //attempt special renders as eager OR checks diff --git a/src/main/java/traben/entity_texture_features/mixin/mixins/mods/sodium/MixinSodiumBufferBuilder.java b/src/main/java/traben/entity_texture_features/mixin/mixins/mods/sodium/MixinSodiumBufferBuilder.java index 20408680..0af4010b 100644 --- a/src/main/java/traben/entity_texture_features/mixin/mixins/mods/sodium/MixinSodiumBufferBuilder.java +++ b/src/main/java/traben/entity_texture_features/mixin/mixins/mods/sodium/MixinSodiumBufferBuilder.java @@ -9,7 +9,6 @@ public class MixinSodiumBufferBuilder {} //#else //$$ import me.jellysquid.mods.sodium.client.render.vertex.buffer.SodiumBufferBuilder; -//$$ import net.minecraft.client.renderer.MultiBufferSource; //$$ import net.minecraft.client.renderer.RenderType; //$$ import net.minecraft.resources.ResourceLocation; //$$ import org.spongepowered.asm.mixin.Mixin; @@ -28,7 +27,7 @@ public class MixinSodiumBufferBuilder {} //$$ public class MixinSodiumBufferBuilder implements ETFVertexConsumer { //$$ //$$ @Unique -//$$ MultiBufferSource etf$provider = null; +//$$ traben.entity_texture_features.utils.URenderTypeToVertexConsumer etf$provider = null; //$$ @Unique //$$ RenderType etf$renderLayer = null; //$$ @Unique @@ -40,7 +39,7 @@ public class MixinSodiumBufferBuilder {} //$$ } //$$ //$$ @Override -//$$ public MultiBufferSource etf$getProvider() { +//$$ public traben.entity_texture_features.utils.URenderTypeToVertexConsumer etf$getProvider() { //$$ return etf$provider; //$$ } //$$ @@ -50,7 +49,7 @@ public class MixinSodiumBufferBuilder {} //$$ } //$$ //$$ @Override -//$$ public void etf$initETFVertexConsumer(MultiBufferSource provider, RenderType renderLayer) { +//$$ public void etf$initETFVertexConsumer(traben.entity_texture_features.utils.URenderTypeToVertexConsumer provider, RenderType renderLayer) { //$$ etf$provider = provider; //$$ //$$ etf$renderLayer = renderLayer; diff --git a/src/main/java/traben/entity_texture_features/mixin/mixins/submit/Mixin_ModelRenderer.java b/src/main/java/traben/entity_texture_features/mixin/mixins/submit/Mixin_ModelRenderer.java new file mode 100644 index 00000000..a6959844 --- /dev/null +++ b/src/main/java/traben/entity_texture_features/mixin/mixins/submit/Mixin_ModelRenderer.java @@ -0,0 +1,82 @@ +package traben.entity_texture_features.mixin.mixins.submit; + +import org.spongepowered.asm.mixin.Mixin; + +//#if MC >= 12109 +import net.minecraft.client.renderer.entity.state.EntityRenderState; +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 traben.entity_texture_features.ETF; +import traben.entity_texture_features.features.ETFRenderContext; +import traben.entity_texture_features.features.state.HoldsETFRenderState; +import com.llamalad7.mixinextras.sugar.Local; +import net.minecraft.client.renderer.feature.ModelFeatureRenderer; + +@Mixin(ModelFeatureRenderer.class) +public class Mixin_ModelRenderer { + + @Unique + private static void headLogic( + //#if MC >= 26.2 + //$$ net.minecraft.client.renderer.feature.ModelFeatureRenderer.Submit modelSubmit + //#else + net.minecraft.client.renderer.SubmitNodeStorage.ModelSubmit modelSubmit + //#endif + ) { + var state = modelSubmit.state(); + //TODO temp fix, will be replaced by improving EMFs implementation and moving upstream + + // Set up the current entity context for this render + if (state instanceof HoldsETFRenderState holds && holds.etf$getState() != null) { + ETFRenderContext.setCurrentEntity(holds.etf$getState()); + } else if (!(state instanceof EntityRenderState)) { // temp handle block entities and a few others weird instances, will be resolved by above todo + ETFRenderContext.temp_markRenderingEntity = true; + } else { + ETFRenderContext.reset(); + } + + // Handle emissive lighting setup + if (modelSubmit.lightCoords() == ETF.EMISSIVE_FEATURE_LIGHT_VALUE) + ETFRenderContext.startSpecialRenderOverlayPhase(); + } + + @Unique + private static void tailLogic() { + ETFRenderContext.endSpecialRenderOverlayPhase(); + ETFRenderContext.reset(); + } + + //#if MC >= 26.2 + //$$ @Inject(method = "prepareModel", at = @At(value = "HEAD")) + //$$ private void emf$initRender(final CallbackInfo ci, @Local(argsOnly = true) net.minecraft.client.renderer.feature.ModelFeatureRenderer.Submit modelSubmit) { + //$$ headLogic(modelSubmit); + //$$ } + //$$ + //$$ @Inject(method = "prepareModel", at = @At(value = "TAIL")) + //$$ private void emf$endRender(final CallbackInfo ci) { + //$$ tailLogic(); + //$$ } + //#else + @Inject(method = "renderModel", at = @At(value = "HEAD")) + private void emf$initRender(final CallbackInfo ci, @Local(argsOnly = true) net.minecraft.client.renderer.SubmitNodeStorage.ModelSubmit modelSubmit) { + headLogic(modelSubmit); + } + + @Inject(method = "renderTranslucents", at = @At(value = "TAIL")) + private void emf$endRender(final CallbackInfo ci) { + tailLogic(); + } + + @Inject(method = "renderBatch", at = @At(value = "TAIL")) + private void emf$endRender2(final CallbackInfo ci) { + tailLogic(); + } + //#endif + +} +//#else +//$$ @Mixin(traben.entity_texture_features.mixin.CancelTarget.class) +//$$ public interface Mixin_ModelRenderer { } +//#endif \ No newline at end of file diff --git a/src/main/java/traben/entity_texture_features/utils/ETFUtils2.java b/src/main/java/traben/entity_texture_features/utils/ETFUtils2.java index 86f1ae18..d96c2e84 100644 --- a/src/main/java/traben/entity_texture_features/utils/ETFUtils2.java +++ b/src/main/java/traben/entity_texture_features/utils/ETFUtils2.java @@ -5,14 +5,13 @@ //#if MC >= 26.1 //$$ import net.minecraft.client.renderer.rendertype.RenderTypes; -//$$ import com.mojang.blaze3d.vertex.VertexMultiConsumer; //$$ import net.minecraft.client.renderer.Sheets; //#endif //#if MC >= 12109 +import net.minecraft.client.renderer.Sheets; import net.minecraft.client.renderer.SubmitNodeCollector; //#endif import net.minecraft.client.renderer.texture.OverlayTexture; -import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import traben.entity_texture_features.ETF; @@ -33,7 +32,6 @@ import net.minecraft.ResourceLocationException; import net.minecraft.client.Minecraft; import net.minecraft.client.player.LocalPlayer; -import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.entity.ItemRenderer; import net.minecraft.client.renderer.texture.AbstractTexture; @@ -134,13 +132,14 @@ public static void submitEmissiveModelPart(final PoseStack matrixStack, final Su public static void submitEnchantedModelPart(final PoseStack matrixStack, final SubmitNodeCollector submit, final int light, final ModelPart modelPart, final @NotNull ResourceLocation enchanted) { submit.submitModelPart(modelPart, matrixStack, - //#if MC>= 12111 - //$$ net.minecraft.client.renderer.rendertype.RenderTypes + //TODO enchanted models needs refactoring + //#if MC >= 26.2 + //$$ net.minecraft.client.renderer.rendertype.RenderTypes.entityGlint(),light, OverlayTexture.NO_OVERLAY, null); + //#elseif MC >= 1.21.11 + //$$ net.minecraft.client.renderer.rendertype.RenderTypes.armorCutoutNoCull(enchanted), light, OverlayTexture.NO_OVERLAY, null, false, true); //#else - RenderType + RenderType.armorCutoutNoCull(enchanted), light, OverlayTexture.NO_OVERLAY, null, false, true); //#endif - .armorCutoutNoCull(enchanted), light, OverlayTexture.NO_OVERLAY, null, - false, true); } //#endif @@ -186,7 +185,7 @@ public static ResourceLocation getETFVariantNotNullForInjector(ResourceLocation return modified == null ? identifier : modified; } - public static boolean renderEmissive(ETFTexture texture, MultiBufferSource provider, RenderMethodForOverlay renderer) { + public static boolean renderEmissive(ETFTexture texture, URenderTypeToVertexConsumer provider, RenderMethodForOverlay renderer) { if (!ETF.config().getConfig().canDoEmissiveTextures()) return false; ResourceLocation emissive = texture.getEmissiveIdentifierOfCurrentState(); if (emissive != null) { @@ -224,21 +223,18 @@ public static boolean renderEmissive(ETFTexture texture, MultiBufferSource provi return false; } - //#if MC >= 26.1 - //$$ public static VertexConsumer getFoilBuffer(MultiBufferSource multiBufferSource, RenderType renderType, boolean bl, boolean bl2) { - //$$ if (bl2) { - //$$ return useTransparentGlint(renderType) ? VertexMultiConsumer.create(multiBufferSource.getBuffer(RenderTypes.glintTranslucent()), multiBufferSource.getBuffer(renderType)) : VertexMultiConsumer.create(multiBufferSource.getBuffer(bl ? RenderTypes.glint() : RenderTypes.entityGlint()), multiBufferSource.getBuffer(renderType)); - //$$ } else { - //$$ return multiBufferSource.getBuffer(renderType); - //$$ } + //#if MC >= 26.2 + //$$ //todo actual impl + //$$ public static VertexConsumer getFoilBuffer(URenderTypeToVertexConsumer multiBufferSource, RenderType renderType) { + //$$ return multiBufferSource.getBuffer(RenderTypes.entityGlint()); //$$ } - //$$ - //$$ private static boolean useTransparentGlint(RenderType renderType) { - //$$ return Minecraft.useShaderTransparency() && (renderType == Sheets.translucentItemSheet() || renderType == Sheets.translucentBlockItemSheet()); + //#elseif MC >= 26.1 + //$$ public static VertexConsumer getFoilBuffer(URenderTypeToVertexConsumer multiBufferSource, RenderType renderType) { + //$$ return com.mojang.blaze3d.vertex.VertexMultiConsumer.create(multiBufferSource.getBuffer(RenderTypes.entityGlint()), multiBufferSource.getBuffer(renderType)); //$$ } //#endif - public static boolean renderEnchanted(ETFTexture texture, MultiBufferSource provider, int light, RenderMethodForOverlay renderer) { + public static boolean renderEnchanted(ETFTexture texture, URenderTypeToVertexConsumer provider, int light, RenderMethodForOverlay renderer) { // attempt enchanted render ResourceLocation enchanted = texture.getEnchantIdentifierOfCurrentState(); if (enchanted != null) { @@ -246,9 +242,9 @@ public static boolean renderEnchanted(ETFTexture texture, MultiBufferSource prov ETFRenderContext.preventRenderLayerTextureModify(); VertexConsumer enchantedVertex = //#if MC >= 26.1 - //$$ getFoilBuffer(provider, RenderTypes.armorCutoutNoCull(enchanted), false, true); + //$$ getFoilBuffer(provider, RenderTypes.armorCutoutNoCull(enchanted)); //#elseif MC>=12109 - ItemRenderer.getFoilBuffer(provider, + ItemRenderer.getFoilBuffer(provider.delegate, //#if MC>= 12111 //$$ net.minecraft.client.renderer.rendertype.RenderTypes //#else @@ -256,7 +252,7 @@ public static boolean renderEnchanted(ETFTexture texture, MultiBufferSource prov //#endif .armorCutoutNoCull(enchanted), false, true); //#else - //$$ ItemRenderer.getArmorFoilBuffer(provider, + //$$ ItemRenderer.getArmorFoilBuffer(provider.delegate, //$$ RenderType.armorCutoutNoCull(enchanted), //#if MC < 12100 //$$ false, diff --git a/src/main/java/traben/entity_texture_features/utils/ETFVertexConsumer.java b/src/main/java/traben/entity_texture_features/utils/ETFVertexConsumer.java index a815a84c..1852c0ed 100644 --- a/src/main/java/traben/entity_texture_features/utils/ETFVertexConsumer.java +++ b/src/main/java/traben/entity_texture_features/utils/ETFVertexConsumer.java @@ -1,6 +1,5 @@ package traben.entity_texture_features.utils; -import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; import org.jetbrains.annotations.Nullable; import traben.entity_texture_features.features.texture_handlers.ETFTexture; @@ -18,10 +17,10 @@ public interface ETFVertexConsumer { ETFTexture etf$getETFTexture(); @Nullable - MultiBufferSource etf$getProvider(); + URenderTypeToVertexConsumer etf$getProvider(); @Nullable RenderType etf$getRenderLayer(); - void etf$initETFVertexConsumer(MultiBufferSource provider, RenderType renderLayer); + void etf$initETFVertexConsumer(URenderTypeToVertexConsumer provider, RenderType renderLayer); } diff --git a/src/main/java/traben/entity_texture_features/utils/UEntityTypes.java b/src/main/java/traben/entity_texture_features/utils/UEntityTypes.java new file mode 100644 index 00000000..0d6edcba --- /dev/null +++ b/src/main/java/traben/entity_texture_features/utils/UEntityTypes.java @@ -0,0 +1,17 @@ +package traben.entity_texture_features.utils; + + +import net.minecraft.world.entity.EntityType; +//#if MC >= 26.2 +//$$ import net.minecraft.world.entity.EntityTypes; +//#endif + +public abstract class UEntityTypes { + //#if MC >= 26.2 + //$$ public static EntityType PARROT = EntityTypes.PARROT; + //$$ public static EntityType PLAYER = EntityTypes.PLAYER; + //#else + public static EntityType PARROT = EntityType.PARROT; + public static EntityType PLAYER = EntityType.PLAYER; + //#endif +} diff --git a/src/main/java/traben/entity_texture_features/utils/URenderTypeToVertexConsumer.java b/src/main/java/traben/entity_texture_features/utils/URenderTypeToVertexConsumer.java new file mode 100644 index 00000000..0ba069f9 --- /dev/null +++ b/src/main/java/traben/entity_texture_features/utils/URenderTypeToVertexConsumer.java @@ -0,0 +1,31 @@ +package traben.entity_texture_features.utils; + +import com.mojang.blaze3d.vertex.VertexConsumer; +import net.minecraft.client.renderer.RenderType; + +public class URenderTypeToVertexConsumer { + + //#if MC >= 26.2 + //$$ public final net.minecraft.client.renderer.feature.RenderTypeFeatureRenderer featureRenderer; + //$$ + //$$ public URenderTypeToVertexConsumer(net.minecraft.client.renderer.feature.RenderTypeFeatureRenderer featureRenderer) { + //$$ this.featureRenderer = featureRenderer; + //$$ } + //$$ + //$$ public VertexConsumer getBuffer(RenderType type) { + //$$ return featureRenderer.getVertexBuilder(type); + //$$ } + //$$ + //#else + public final net.minecraft.client.renderer.MultiBufferSource delegate; + + public URenderTypeToVertexConsumer(net.minecraft.client.renderer.MultiBufferSource delegate) { + this.delegate = delegate; + } + + public VertexConsumer getBuffer(RenderType type) { + return delegate.getBuffer(type); + } + //#endif + +} diff --git a/src/main/java/traben/entity_texture_features/utils/UScreen.java b/src/main/java/traben/entity_texture_features/utils/UScreen.java new file mode 100644 index 00000000..93dd3cca --- /dev/null +++ b/src/main/java/traben/entity_texture_features/utils/UScreen.java @@ -0,0 +1,15 @@ +package traben.entity_texture_features.utils; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.screens.Screen; + +public abstract class UScreen { + + //#if MC >= 26.2 + //$$ public static Screen currentScreen() { return Minecraft.getInstance().gui.screen(); } + //$$ public static void setScreen(Screen screen) { Minecraft.getInstance().gui.setScreen(screen); } + //#else + public static Screen currentScreen() { return Minecraft.getInstance().screen; } + public static void setScreen(Screen screen) { Minecraft.getInstance().setScreen(screen); } + //#endif +} diff --git a/src/main/java/traben/tconfig/gui/TConfigEntryListWidget.java b/src/main/java/traben/tconfig/gui/TConfigEntryListWidget.java index 3c30dec0..d8c1dd37 100644 --- a/src/main/java/traben/tconfig/gui/TConfigEntryListWidget.java +++ b/src/main/java/traben/tconfig/gui/TConfigEntryListWidget.java @@ -10,6 +10,7 @@ import net.minecraft.client.input.MouseButtonInfo; //#endif import org.jetbrains.annotations.Nullable; +import traben.entity_texture_features.utils.UScreen; import traben.tconfig.gui.entries.TConfigEntry; public class TConfigEntryListWidget extends AbstractSelectionList { @@ -99,8 +100,8 @@ protected void renderListBackground(final GuiGraphics context) { int x = getX(); int width = getWidth(); setX(0); - assert Minecraft.getInstance().screen != null; - setWidth(Minecraft.getInstance().screen.width); + assert UScreen.currentScreen() != null; + setWidth(UScreen.currentScreen().width); super.renderListBackground(context); setX(x); setWidth(width); @@ -115,8 +116,8 @@ protected void renderListSeparators(final GuiGraphics context) { int x = getX(); int width = getWidth(); setX(0); - assert Minecraft.getInstance().screen != null; - setWidth(Minecraft.getInstance().screen.width); + assert UScreen.currentScreen() != null; + setWidth(UScreen.currentScreen().width); super.renderListSeparators(context); setX(x); setWidth(width); diff --git a/src/main/java/traben/tconfig/gui/TConfigScreen.java b/src/main/java/traben/tconfig/gui/TConfigScreen.java index 760ed23f..9b71de3d 100644 --- a/src/main/java/traben/tconfig/gui/TConfigScreen.java +++ b/src/main/java/traben/tconfig/gui/TConfigScreen.java @@ -11,6 +11,7 @@ import net.minecraft.network.chat.CommonComponents; import net.minecraft.network.chat.Component; import traben.entity_texture_features.ETF; +import traben.entity_texture_features.utils.UScreen; public class TConfigScreen extends Screen { private final boolean showBackButton; @@ -82,7 +83,7 @@ public boolean shouldCloseOnEsc() { @Override public void onClose() { - Minecraft.getInstance().setScreen(parent); + UScreen.setScreen(parent); } //#if MC < 12002 diff --git a/src/main/java/traben/tconfig/gui/entries/TConfigEntryCategory.java b/src/main/java/traben/tconfig/gui/entries/TConfigEntryCategory.java index deb04f9f..a7a53891 100644 --- a/src/main/java/traben/tconfig/gui/entries/TConfigEntryCategory.java +++ b/src/main/java/traben/tconfig/gui/entries/TConfigEntryCategory.java @@ -2,6 +2,7 @@ import com.demonwav.mcdev.annotations.Translatable; import org.jetbrains.annotations.NotNull; +import traben.entity_texture_features.utils.UScreen; import traben.tconfig.gui.TConfigScreenList; import java.util.Collection; @@ -46,7 +47,7 @@ public LinkedHashMap getOptions() { //don't need to init screen each time public TConfigScreenList getScreen() { if (screen == null) { - screen = new TConfigScreenList(translationKey, Minecraft.getInstance().screen, options.values().toArray(new TConfigEntry[0]), this::setValuesToDefault, this::resetValuesToInitial, align); + screen = new TConfigScreenList(translationKey, UScreen.currentScreen(), options.values().toArray(new TConfigEntry[0]), this::setValuesToDefault, this::resetValuesToInitial, align); screen.setRenderFeature(renderFeature); if (fullWidthBackgroundEvenIfSmaller) { screen.setWidgetBackgroundToFullWidth(); @@ -58,7 +59,7 @@ public TConfigScreenList getScreen() { @Override public AbstractWidget getWidget(final int x, final int y, final int width, final int height) { return new CategoryButton(x, y, width, height, getText(), - (button) -> Minecraft.getInstance().setScreen(getScreen())); + (button) -> UScreen.setScreen(getScreen())); } @Override diff --git a/src/main/java/traben/tconfig/gui/entries/TConfigEntryCustomScreenOpener.java b/src/main/java/traben/tconfig/gui/entries/TConfigEntryCustomScreenOpener.java index 15383927..2a3b6183 100644 --- a/src/main/java/traben/tconfig/gui/entries/TConfigEntryCustomScreenOpener.java +++ b/src/main/java/traben/tconfig/gui/entries/TConfigEntryCustomScreenOpener.java @@ -8,6 +8,7 @@ import net.minecraft.client.gui.components.AbstractWidget; import net.minecraft.client.gui.components.Button; import net.minecraft.client.gui.screens.Screen; +import traben.entity_texture_features.utils.UScreen; public class TConfigEntryCustomScreenOpener extends TConfigEntry { @@ -27,7 +28,7 @@ public TConfigEntryCustomScreenOpener(@Translatable final String text, @Translat this.screenIsSingleton = screenIsSingleton; this.setValuesDefault = setValuesDefault; this.resetValuesToInitial = resetValuesToInitial; - button = Button.builder(getText(), (button) -> Minecraft.getInstance().setScreen(getScreen())) + button = Button.builder(getText(), (button) -> UScreen.setScreen(getScreen())) .bounds(0, 0, 0, 0).tooltip(getTooltip()).build(); } diff --git a/src/main/resources/entity_texture_features.mixins.json b/src/main/resources/entity_texture_features.mixins.json index 957061b4..183711aa 100644 --- a/src/main/resources/entity_texture_features.mixins.json +++ b/src/main/resources/entity_texture_features.mixins.json @@ -59,6 +59,7 @@ "mods.iris.MixinInnerWrappedRenderType", "mods.iris.MixinOuterWrappedRenderType", "reloading.MixinMinecraftClient", - "reloading.MixinResourceReload" + "reloading.MixinResourceReload", + "submit.Mixin_ModelRenderer" ] } \ No newline at end of file diff --git a/src/main/resources/entity_texture_features_15.accesswidener b/src/main/resources/entity_texture_features_15.accesswidener new file mode 100644 index 00000000..52506fc5 --- /dev/null +++ b/src/main/resources/entity_texture_features_15.accesswidener @@ -0,0 +1,45 @@ +accessWidener v2 official + +accessible class net/minecraft/client/resources/SkinManager$TextureCache +accessible field net/minecraft/client/resources/SkinManager skinTextures Lnet/minecraft/client/resources/SkinManager$TextureCache; + +# for sprites reading from VertexConsumer +accessible field net/minecraft/client/renderer/SpriteCoordinateExpander sprite Lnet/minecraft/client/renderer/texture/TextureAtlasSprite; + +# for alternative texture modification +#accessible class net/minecraft/client/render/RenderPhase$Texture + +# for block entity renderers in config +accessible field net/minecraft/client/renderer/blockentity/BlockEntityRenderers PROVIDERS Ljava/util/Map; + +#accessible field net/minecraft/client/gui/widget/EntryListWidget MENU_LIST_BACKGROUND_TEXTURE Lnet/minecraft/util/Identifier; +#accessible field net/minecraft/client/gui/widget/EntryListWidget INWORLD_MENU_LIST_BACKGROUND_TEXTURE Lnet/minecraft/util/Identifier; + +accessible method net/minecraft/client/renderer/texture/SkinTextureDownloader processLegacySkin (Lcom/mojang/blaze3d/platform/NativeImage;Ljava/lang/String;)Lcom/mojang/blaze3d/platform/NativeImage; +accessible method net/minecraft/client/renderer/texture/SkinTextureDownloader downloadSkin (Ljava/nio/file/Path;Ljava/lang/String;)Lcom/mojang/blaze3d/platform/NativeImage; +accessible field net/minecraft/client/resources/SkinManager$TextureCache root Ljava/nio/file/Path; + +#accessible class com/mojang/blaze3d/vertex/VertexMultiConsumer$Double +#accessible class com/mojang/blaze3d/vertex/VertexMultiConsumer$Multiple + +#1.20.2 and earlier height setting +accessible field net/minecraft/client/gui/components/AbstractWidget height I + +accessible field com/mojang/blaze3d/vertex/BufferBuilder building Z + +accessible class net/minecraft/client/renderer/entity/layers/EquipmentLayerRenderer$TrimSpriteKey +accessible field net/minecraft/client/renderer/entity/layers/EquipmentLayerRenderer$TrimSpriteKey trim Lnet/minecraft/world/item/equipment/trim/ArmorTrim; +accessible field net/minecraft/client/renderer/entity/layers/EquipmentLayerRenderer$TrimSpriteKey layerType Lnet/minecraft/client/resources/model/EquipmentClientInfo$LayerType; + +accessible method net/minecraft/world/level/biome/Biome getHeightAdjustedTemperature (Lnet/minecraft/core/BlockPos;I)F + +#accessible field net/minecraft/client/resources/SkinManager sessionService Lcom/mojang/authlib/minecraft/MinecraftSessionService; + +accessible field net/minecraft/world/entity/LivingEntity lastEquipmentItems Ljava/util/Map; + +accessible field net/minecraft/client/renderer/rendertype/RenderSetup textures Ljava/util/Map; +accessible field net/minecraft/client/renderer/rendertype/RenderSetup$TextureBinding location Lnet/minecraft/resources/Identifier; +accessible method net/minecraft/client/gui/screens/inventory/InventoryScreen extractRenderState (Lnet/minecraft/world/entity/LivingEntity;)Lnet/minecraft/client/renderer/entity/state/EntityRenderState; +accessible method net/minecraft/client/renderer/texture/TextureAtlasSprite (Lnet/minecraft/resources/Identifier;Lnet/minecraft/client/renderer/texture/SpriteContents;IIIII)V + +accessible method net/minecraft/client/renderer/feature/RenderTypeFeatureRenderer getVertexBuilder (Lnet/minecraft/client/renderer/rendertype/RenderType;)Lcom/mojang/blaze3d/vertex/VertexConsumer; \ No newline at end of file diff --git a/versions/26.1-fabric/gradle.properties b/versions/26.1-fabric/gradle.properties index 0d233050..ac28b21f 100644 --- a/versions/26.1-fabric/gradle.properties +++ b/versions/26.1-fabric/gradle.properties @@ -1,2 +1,2 @@ -essential.defaults.loom.minecraft=com.mojang:minecraft:26.1-rc-2 +essential.defaults.loom.minecraft=com.mojang:minecraft:26.1 essential.defaults.loom.mappings= \ No newline at end of file diff --git a/versions/26.1-forge/gradle.properties b/versions/26.1-forge/gradle.properties new file mode 100644 index 00000000..6318a8e9 --- /dev/null +++ b/versions/26.1-forge/gradle.properties @@ -0,0 +1,3 @@ +essential.defaults.loom.forge=net.minecraftforge:forge:26.1-62.0.9 +essential.defaults.loom.minecraft=com.mojang:minecraft:26.1 +essential.defaults.loom.mappings= \ No newline at end of file diff --git a/versions/26.1-neoforge/gradle.properties b/versions/26.1-neoforge/gradle.properties index ed2024f7..9cf08302 100644 --- a/versions/26.1-neoforge/gradle.properties +++ b/versions/26.1-neoforge/gradle.properties @@ -1,3 +1,3 @@ -essential.defaults.loom.neoForge=net.neoforged:neoforge:26.1.0.0-alpha.15+pre-3 -essential.defaults.loom.minecraft=com.mojang:minecraft:26.1-pre-3 +essential.defaults.loom.neoForge=net.neoforged:neoforge:26.1.0.19-beta +essential.defaults.loom.minecraft=com.mojang:minecraft:26.1 essential.defaults.loom.mappings= \ No newline at end of file diff --git a/versions/26.2-fabric/gradle.properties b/versions/26.2-fabric/gradle.properties new file mode 100644 index 00000000..4abcd5f4 --- /dev/null +++ b/versions/26.2-fabric/gradle.properties @@ -0,0 +1,2 @@ +essential.defaults.loom.minecraft=com.mojang:minecraft:26.2 +essential.defaults.loom.mappings= \ No newline at end of file diff --git a/versions/26.2-forge/gradle.properties b/versions/26.2-forge/gradle.properties new file mode 100644 index 00000000..43d45a44 --- /dev/null +++ b/versions/26.2-forge/gradle.properties @@ -0,0 +1,2 @@ +essential.defaults.loom.minecraft=com.mojang:minecraft:26.2-rc-2 +essential.defaults.loom.mappings= \ No newline at end of file diff --git a/versions/26.2-neoforge/gradle.properties b/versions/26.2-neoforge/gradle.properties new file mode 100644 index 00000000..e665d32c --- /dev/null +++ b/versions/26.2-neoforge/gradle.properties @@ -0,0 +1,3 @@ +essential.defaults.loom.neoForge=net.neoforged:neoforge:26.2.0.1-beta +essential.defaults.loom.minecraft=com.mojang:minecraft:26.2 +essential.defaults.loom.mappings= \ No newline at end of file From 7d34f439999d7d59d925f662fb192da99b99fa4c Mon Sep 17 00:00:00 2001 From: Traben Date: Tue, 4 Aug 2026 14:51:54 +1000 Subject: [PATCH 2/7] 26.2 --- CHANGELOG.MD | 3 +++ .../properties/optifine_properties/SizeProperty.java | 8 +++++++- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.MD b/CHANGELOG.MD index b1fd1317..787c3c94 100644 --- a/CHANGELOG.MD +++ b/CHANGELOG.MD @@ -1,4 +1,7 @@ + +- fixed the size property breaking with slimes in 26.2 + [7.1] - Both EMF & ESF will need to update to be compatible with this version *(expect about half an hour for EMF to update)* - fixed immediatelyfast compat on 26.1+ diff --git a/src/main/java/traben/entity_texture_features/features/property_reading/properties/optifine_properties/SizeProperty.java b/src/main/java/traben/entity_texture_features/features/property_reading/properties/optifine_properties/SizeProperty.java index 196b46dc..5b7bc6c7 100644 --- a/src/main/java/traben/entity_texture_features/features/property_reading/properties/optifine_properties/SizeProperty.java +++ b/src/main/java/traben/entity_texture_features/features/property_reading/properties/optifine_properties/SizeProperty.java @@ -39,7 +39,13 @@ public static SizeProperty getPropertyOrNull(Properties properties, int property @Override protected int getValueFromEntity(ETFEntityRenderState entity) { - if (entity != null && entity.entity() instanceof Slime slime) { + if (entity != null && entity.entity() instanceof + //#if MC >= 26.2 + //$$ net.minecraft.world.entity.monster.cubemob.AbstractCubeMob slime // Changes for sulfur cube, now all 3 slimes share new generic type + //#else + Slime slime // Magma cube extends this in these versions + //#endif + ) { //magma cube too return slime.getSize() - 1; } else if (entity != null && entity.entity() instanceof Phantom phantom) { From 00e192cdb7852bbb76fc499cbc296738ebfcd443 Mon Sep 17 00:00:00 2001 From: Traben Date: Fri, 14 Aug 2026 17:57:32 +1000 Subject: [PATCH 3/7] uploader --- .github/workflows/release.yml | 15 +- build.gradle.kts | 94 +++++++++++- uploader.js | 164 -------------------- uploader_config.json | 278 ---------------------------------- 4 files changed, 99 insertions(+), 452 deletions(-) delete mode 100644 uploader.js delete mode 100644 uploader_config.json diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 9ff570b4..05e9c9f3 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -5,6 +5,9 @@ on: tags: - "v*" +permissions: + issues: write + jobs: build-release-upload: runs-on: ubuntu-latest @@ -53,14 +56,14 @@ jobs: run: cat discord_update.json # Build the mod - - run: ./gradlew build + - name: build + run: ./gradlew build - - name: upload mod - run: node uploader.js + - name: publish + run: ./gradlew publishMods env: - CF_TOKEN: ${{ secrets.CF_TOKEN }} - CF_COOKIE: ${{ secrets.CF_COOKIE }} - MODRINTH: ${{ secrets.MODRINTH }} + CURSEFORGE_TOKEN: ${{ secrets.CF_TOKEN }} + MODRINTH_TOKEN: ${{ secrets.MODRINTH }} - name: discord notification run: | diff --git a/build.gradle.kts b/build.gradle.kts index 76d286c4..9ee671fa 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -17,6 +17,8 @@ plugins { // You can also overwrite some of these if need be. See the `gg.essential.defaults.loom` README section. // Otherwise you'll need to configure those as usual for (architectury) loom. id("gg.essential.defaults") + + id("me.modmuss50.mod-publish-plugin") version "2.0.0-beta.1" } //tasks.compileKotlin.setJvmDefault("all") @@ -276,18 +278,102 @@ tasks.processResources { } } -tasks.register("copyArtifacts") { +tasks.register("buildBulkJars") { + dependsOn(tasks.build) + from(layout.buildDirectory.dir("libs").get()) into("${rootDir}\\jars") - mustRunAfter(tasks.build) delete(layout.buildDirectory.dir("libs").get()) } +private val versionRangeMap: Map> = mapOf( + "26.1" to arrayOf("26.1", "26.1.1", "26.1.2"), + "1.21.9" to arrayOf("1.21.9", "1.21.10"), + "1.21.6" to arrayOf("1.21.6", "1.21.7", "1.21.8"), + "1.21.3" to arrayOf("1.21.3", "1.21.2"), + "1.21" to arrayOf("1.21", "1.21.1"), + "1.20.1" to arrayOf("1.20.1", "1.20") +) + +private val String.versionRange: Array + get() = versionRangeMap[this] ?: arrayOf(this) + +private fun changelog(): String? { + val lines = rootProject.rootDir.resolve("CHANGELOG.MD").readText(Charsets.UTF_8).lines() + val sb = StringBuilder() + var inside = false + + for (rawLine in lines) { + val line = rawLine.trim() + if (line.startsWith("[")) { + if (line == "[$modVersion]") { + inside = true + continue + } else if (inside) { + // we've reached the next header after the section we wanted + break + } else { + // if first header wasn't the requested one + break + } + } + if (inside && line.isNotBlank()) { + sb.append(line).append("\n") + } + } + + if (sb.isEmpty()) null -tasks.build { - finalizedBy("copyArtifacts") + return sb.toString() } +publishMods { + val changes = changelog() + if (changes == null) { + println("No changelog entry found at top, assuming development build") + return@publishMods + } + + // https://modmuss50.github.io/mod-publish-plugin/ + file.set( + (if (platform.isUnobfuscated) tasks.jar + else tasks.named("remapJar")) + .get().archiveFile + ) + changelog.set(changes) + type.set(STABLE) + val ver = "$modVersion-${platform.loaderStr}-${platform.mcVersionStr}" + version.set(ver) + when { + platform.isFabric -> { + modLoaders.add("fabric") + modLoaders.add("quilt") + } + platform.isForge -> { + modLoaders.add("forge") + } + platform.isNeoForge -> { + modLoaders.add("neoforge") + } + else -> { + throw UnsupportedOperationException() + } + } + + displayName.set(ver) + + curseforge { + projectId.set("568563") + accessToken.set(providers.environmentVariable("CURSEFORGE_TOKEN")) + minecraftVersions.addAll(*platform.mcVersionStr.versionRange) + clientRequired.set(true) + } + modrinth { + projectId.set("BVzZfTc1") + accessToken.set(providers.environmentVariable("MODRINTH_TOKEN")) + minecraftVersions.addAll(*platform.mcVersionStr.versionRange) + } +} //region 26.1+ NEOFORGE ACCESS TRANSFORMER GENERATION diff --git a/uploader.js b/uploader.js deleted file mode 100644 index fb21b66b..00000000 --- a/uploader.js +++ /dev/null @@ -1,164 +0,0 @@ -// Credit to Ewan Howell for writing the initial script - -import config from "./uploader_config.json" with { type: "json" } -import fs from "node:fs" - -// read env vars -const cfToken = process.env.CF_TOKEN; -const cfCookie = process.env.CF_COOKIE; -const modrinth = process.env.MODRINTH; - -function readProp(key) { - const raw = fs.readFileSync("gradle.properties", "utf8"); - const lines = raw.split("\n"); - - for (const line of lines) { - const trimmed = line.trim(); - if (!trimmed || trimmed.startsWith("#")) continue; - const idx = trimmed.indexOf("="); - if (idx === -1) continue; - const k = trimmed.slice(0, idx).trim(); - const v = trimmed.slice(idx + 1).trim(); - if (k === key) return v; - } - return ""; -} - -const version = readProp("mod_version"); - -function changelog(version) { - const raw = fs.readFileSync("CHANGELOG.MD", "utf8"); - const lines = raw.split("\n"); - let thisVersion = ""; - let inside = false; - for (const rawLine of lines) { - const line = rawLine.trim(); - if (line.startsWith("[")) { - if (line === `[${version}]`) { - inside = true; - continue; - } else break; - } - if (inside) thisVersion += `${line}\n`; - } - return thisVersion; -} -const thisChangelog = changelog(version); - -function makeForm(data) { - const form = new FormData - for (const [k, v] of Object.entries(data)) { - if (v === undefined) continue - if (typeof v === "object") { - form.append(k, JSON.stringify(v)) - } else { - form.append(k, v) - } - } - return form -} - -// CurseForge Get Version Ids - -const cfVersionsRequest = await fetch(`https://authors.curseforge.com/_api/project-files/${config.curseforge}/create-project-file-form-data`, { - headers: { - cookie: cfCookie - } -}) - -if (!cfVersionsRequest.ok) { - throw new Error("CurseForge: Failed getting version list" + await cfVersionsRequest.text()) -} - -const cfVersions = await cfVersionsRequest.json() -//console.log('cfVersions:', JSON.stringify(cfVersions, null, 2)); - -const cfLoaders = cfVersions.versionsData[1].flatMap(e => e.choices) -const cfMcVersions = cfVersions.versionsData[3].flatMap(e => e.choices) - -// Upload Files - -for (const file of config.files) { - const name = `${file.versions[0]}-${file.loaders[0].toLowerCase()}` - - try { - const content = fs.readFileSync(`jars/${config.id}-${version}-${name}.jar`) - const blob = new Blob([content], { - type: "application/java-archive" - }) - - // CurseForge Upload File - - const cfForm = makeForm({ - metadata: { - changelog: thisChangelog, - changelogType: "markdown", - displayName: `${file.loaders[0]} - ${file.versions[0]} - ${version}`, - gameVersions: [ - 9638, - ...file.loaders.map(e => cfLoaders.find(v => v.name === e).id), - ...file.versions.map(e => cfMcVersions.find(v => v.name === e).id) - ], - releaseType: "release" - } - }) - - cfForm.append("file", blob, `${config.id}_${name}-${version}.jar`) - - const cfRequest = await fetch(`https://minecraft.curseforge.com/api/projects/${config.curseforge}/upload-file`, { - method: "POST", - headers: { - "X-Api-Token": cfToken - }, - body: cfForm - }) - - if (!cfRequest.ok) { - throw new Error(`CurseForge: Failed to upload "${name}"`) // - ${await cfRequest.text()}`) - } - - console.log(`CurseForge: File "${name}" uploaded`) - - // Modrinth Upload File - - const mrForm = makeForm({ - data: { - name: `${file.loaders[0]} - ${file.versions[0]}`, - // addressable version for use as dependency - version_number: `${version}-${file.loaders[0].toLowerCase()}-${file.versions[0]}`, // 7.0.5-fabric-1.21.9 - changelog: thisChangelog, - dependencies: config.dependency_modrinth ? [{ - project_id: config.dependency_modrinth, - dependency_type: "required" - }] : [], - game_versions: file.versions, - version_type: "release", - loaders: file.loaders.map(e => e.toLowerCase()), - featured: false, - project_id: config.modrinth, - file_parts: ["file"], - primary_file: "file" - } - }) - - mrForm.append("file", blob, `${config.id}_${name}-${version}.jar`) - - const mrRequest = await fetch("https://api.modrinth.com/v2/version", { - method: "POST", - headers: { - Authorization: modrinth - }, - body: mrForm - }).then(e => e.json()) - - if (mrRequest.error) { - throw new Error(`Modrinth: Failed to upload "${name}"`) // - ${JSON.stringify(mrRequest)}`) - } - - console.log(`Modrinth: File "${name}" uploaded`) - } catch (error) { - console.error(`File "${name}" FAILED!!!`, error) - } -} - -console.log("Finished uploading files") \ No newline at end of file diff --git a/uploader_config.json b/uploader_config.json deleted file mode 100644 index 099095eb..00000000 --- a/uploader_config.json +++ /dev/null @@ -1,278 +0,0 @@ -{ - "id": "entity_texture_features", - "curseforge": "568563", - "modrinth": "BVzZfTc1", - "files": [ - { - "loaders": [ - "Forge", - "NeoForge" - ], - "versions": [ - "1.20.1", - "1.20" - ] - }, - { - "loaders": [ - "Fabric", - "Quilt" - ], - "versions": [ - "1.20.1", - "1.20" - ] - }, - { - "loaders": [ - "Forge" - ], - "versions": [ - "1.20.2" - ] - }, - { - "loaders": [ - "NeoForge" - ], - "versions": [ - "1.20.2" - ] - }, - { - "loaders": [ - "Fabric", - "Quilt" - ], - "versions": [ - "1.20.2" - ] - }, - { - "loaders": [ - "Forge" - ], - "versions": [ - "1.20.4" - ] - }, - { - "loaders": [ - "NeoForge" - ], - "versions": [ - "1.20.4" - ] - }, - { - "loaders": [ - "Fabric", - "Quilt" - ], - "versions": [ - "1.20.4" - ] - }, - { - "loaders": [ - "Forge" - ], - "versions": [ - "1.20.6" - ] - }, - { - "loaders": [ - "NeoForge" - ], - "versions": [ - "1.20.6" - ] - }, - { - "loaders": [ - "Fabric", - "Quilt" - ], - "versions": [ - "1.20.6" - ] - }, - { - "loaders": [ - "Forge" - ], - "versions": [ - "1.21", - "1.21.1" - ] - }, - { - "loaders": [ - "NeoForge" - ], - "versions": [ - "1.21", - "1.21.1" - ] - }, - { - "loaders": [ - "Fabric", - "Quilt" - ], - "versions": [ - "1.21", - "1.21.1" - ] - }, - { - "loaders": [ - "Forge" - ], - "versions": [ - "1.21.3", - "1.21.2" - ] - }, - { - "loaders": [ - "NeoForge" - ], - "versions": [ - "1.21.3", - "1.21.2" - ] - }, - { - "loaders": [ - "Fabric", - "Quilt" - ], - "versions": [ - "1.21.3", - "1.21.2" - ] - }, - { - "loaders": [ - "Forge" - ], - "versions": [ - "1.21.4" - ] - }, - { - "loaders": [ - "NeoForge" - ], - "versions": [ - "1.21.4" - ] - }, - { - "loaders": [ - "Fabric", - "Quilt" - ], - "versions": [ - "1.21.4" - ] - }, - { - "loaders": [ - "Forge" - ], - "versions": [ - "1.21.5" - ] - }, - { - "loaders": [ - "NeoForge" - ], - "versions": [ - "1.21.5" - ] - }, - { - "loaders": [ - "Fabric", - "Quilt" - ], - "versions": [ - "1.21.5" - ] - }, - { - "loaders": [ - "Forge" - ], - "versions": [ - "1.21.6", - "1.21.7", - "1.21.8" - ] - }, - { - "loaders": [ - "NeoForge" - ], - "versions": [ - "1.21.6", - "1.21.7", - "1.21.8" - ] - }, - { - "loaders": [ - "Fabric", - "Quilt" - ], - "versions": [ - "1.21.6", - "1.21.7", - "1.21.8" - ] - }, - { - "loaders": [ - "Forge" - ], - "versions": [ - "1.21.9", - "1.21.10" - ] - }, - { - "loaders": [ - "NeoForge" - ], - "versions": [ - "1.21.9", - "1.21.10" - ] - }, - { - "loaders": [ - "Fabric", - "Quilt" - ], - "versions": [ - "1.21.9", - "1.21.10" - ] - }, - {"loaders": ["NeoForge"], - "versions": ["1.21.11"]}, - {"loaders": ["Forge"], - "versions": ["1.21.11"]}, - {"loaders": ["Fabric", "Quilt"], - "versions": ["1.21.11"]}, - - {"loaders": ["NeoForge"], - "versions": ["26.1", "26.1.1", "26.1.2"]}, - {"loaders": ["Fabric", "Quilt"], - "versions": ["26.1", "26.1.1", "26.1.2"]} - ] -} \ No newline at end of file From 0586b977908297a2f358c7aec26e814919beef52 Mon Sep 17 00:00:00 2001 From: Traben Date: Tue, 18 Aug 2026 09:53:30 +1000 Subject: [PATCH 4/7] refactored state --- gradle.properties | 2 +- .../traben/entity_texture_features/ETF.java | 1 + .../entity_texture_features/ETFApi.java | 4 +- .../entity_texture_features/ETFException.java | 4 +- .../compat/SodiumGetBufferInjector.java | 4 +- .../config/ETFConfig.java | 33 +- .../features/ETFManager.java | 11 +- .../features/ETFRenderContext.java | 236 +------------- .../player/ETFPlayerFeatureRenderer.java | 18 +- .../PropertiesRandomProvider.java | 4 +- .../optifine_properties/NBTProperty.java | 2 +- .../features/state/ETFEntityRenderState.java | 172 +++++++++++ .../ETFEntityRenderStateViaReference.java | 13 + .../features/state/ETFState.java | 290 ++++++++++++++++++ .../features/state/ETFSubmitData.java | 52 ++++ .../features/state/ETFSubmitExtension.java | 7 + .../texture_handlers/ETFArmorHandler.java | 52 ++-- .../features/texture_handlers/ETFTexture.java | 16 +- .../texture_handlers/ETFTextureVariator.java | 9 +- .../mixin/mixins/MixinGameRenderer.java | 19 ++ .../mixin/mixins/MixinLevelRenderer.java | 37 +++ .../mixin/mixins/MixinModelPart.java | 12 +- .../mixin/mixins/MixinSpriteIdentifier.java | 8 +- ...MixinVertexConsumerProvider$Immediate.java | 12 +- .../block/MixinSkullBlockEntityRenderer.java | 12 +- .../mixins/entity/misc/MixinBlockEntity.java | 9 +- .../MixinBlockEntityRenderDispatcher.java | 28 +- .../misc/MixinBlockEntityRenderState.java | 3 +- .../mixin/mixins/entity/misc/MixinEntity.java | 8 +- .../misc/MixinEntityRenderDispatcher.java | 27 +- .../entity/renderer/MixinEntityRenderer.java | 11 +- .../renderer/MixinIllusionerRenderer.java | 85 ++--- .../renderer/MixinLivingEntityRenderer.java | 27 +- .../renderer/MixinPaintingEntityRenderer.java | 14 +- .../renderer/MixinPlayerEntityRenderer.java | 10 +- .../feature/MixinElytraFeatureRenderer.java | 7 +- .../feature/MixinEyeFeatureRenderer.java | 22 +- .../MixinShoulderParrotFeatureRenderer.java | 88 +++--- .../MixinBatchableBufferSource.java | 8 +- .../MixinFullyBufferedMultiBufferSource.java | 6 +- .../MixinFullyBufferedMultiBufferSource.java | 6 +- .../MixinCustomizableModelPart.java | 12 +- .../mods/sodium/MixinModelPartSodium.java | 12 +- .../submit/Mixin_GuiEntityRenderer.java | 84 +++++ .../submit/Mixin_ModelPartRenderer.java | 39 +++ .../mixins/submit/Mixin_ModelRenderer.java | 63 ++-- .../submit/Mixin_ModelSubmit_AddData.java | 45 +++ .../Mixin_ChestSpecialRenderer_PassState.java | 41 +++ .../utils/ETFUtils2.java | 34 +- .../entity_texture_features.mixins.json | 8 +- versions/26.1-1.21.11.txt | 1 + 51 files changed, 1180 insertions(+), 548 deletions(-) create mode 100644 src/main/java/traben/entity_texture_features/features/state/ETFState.java create mode 100644 src/main/java/traben/entity_texture_features/features/state/ETFSubmitData.java create mode 100644 src/main/java/traben/entity_texture_features/features/state/ETFSubmitExtension.java create mode 100644 src/main/java/traben/entity_texture_features/mixin/mixins/MixinGameRenderer.java create mode 100644 src/main/java/traben/entity_texture_features/mixin/mixins/MixinLevelRenderer.java create mode 100644 src/main/java/traben/entity_texture_features/mixin/mixins/submit/Mixin_GuiEntityRenderer.java create mode 100644 src/main/java/traben/entity_texture_features/mixin/mixins/submit/Mixin_ModelPartRenderer.java create mode 100644 src/main/java/traben/entity_texture_features/mixin/mixins/submit/Mixin_ModelSubmit_AddData.java create mode 100644 src/main/java/traben/entity_texture_features/mixin/mixins/submit/backupstates/Mixin_ChestSpecialRenderer_PassState.java diff --git a/gradle.properties b/gradle.properties index 70d9468a..14d5c862 100644 --- a/gradle.properties +++ b/gradle.properties @@ -8,7 +8,7 @@ essential.defaults.loom.mappings=mojmap loom.ignoreDependencyLoomVersionValidation=true -mod_version=7.1.1 +mod_version=7.2 maven_group=traben.entity_texture_features archives_base_name=entity_texture_features diff --git a/src/main/java/traben/entity_texture_features/ETF.java b/src/main/java/traben/entity_texture_features/ETF.java index 9453567e..5514a11d 100644 --- a/src/main/java/traben/entity_texture_features/ETF.java +++ b/src/main/java/traben/entity_texture_features/ETF.java @@ -48,6 +48,7 @@ public class ETF { public static TConfigHandler warningConfigHandler = null; public static boolean IRIS_DETECTED = false; public static boolean FABRIC_API = false; + public static final int EYES_FEATURE_LIGHT_VALUE = ETFUtils2.FULL_BRIGHT + 1; public static ETFEntityRenderState.ETFRenderStateInit etfRenderStateConstructor = (it)-> new ETFEntityRenderStateViaReference(it); // todo 1.21+ impl that doesn't smuggle entity diff --git a/src/main/java/traben/entity_texture_features/ETFApi.java b/src/main/java/traben/entity_texture_features/ETFApi.java index ca5bb567..97e10b2f 100644 --- a/src/main/java/traben/entity_texture_features/ETFApi.java +++ b/src/main/java/traben/entity_texture_features/ETFApi.java @@ -20,13 +20,13 @@ import traben.entity_texture_features.config.ETFConfigWarning; import traben.entity_texture_features.config.ETFConfigWarnings; import traben.entity_texture_features.features.ETFManager; -import traben.entity_texture_features.features.ETFRenderContext; import traben.entity_texture_features.features.property_reading.PropertiesRandomProvider; import traben.entity_texture_features.features.property_reading.TrueRandomProvider; import traben.entity_texture_features.features.property_reading.properties.RandomProperties; import traben.entity_texture_features.features.property_reading.properties.RandomProperty; import traben.entity_texture_features.features.property_reading.properties.optifine_properties.BabyProperty; import traben.entity_texture_features.features.state.ETFEntityRenderState; +import traben.entity_texture_features.features.state.ETFState; import traben.entity_texture_features.features.state.HoldsETFRenderState; import traben.entity_texture_features.features.texture_handlers.ETFTexture; import traben.entity_texture_features.utils.ETFEntity; @@ -468,7 +468,7 @@ static ETFApi.ETFVariantSuffixProvider getVariantProviderOrNull(ResourceLocation //get optifine property provider or null PropertiesRandomProvider optifine = PropertiesRandomProvider.of(propertiesFileIdentifier, vanillaIdentifier, suffixKeyName); //get true random provider or null - TrueRandomProvider random = ETFRenderContext.isRandomLimitedToProperties() ? null : TrueRandomProvider.of(vanillaIdentifier); + TrueRandomProvider random = ETFState.onlyRandomizeViaPropertiesFiles ? null : TrueRandomProvider.of(vanillaIdentifier); //try fallback property if null if (optifine == null diff --git a/src/main/java/traben/entity_texture_features/ETFException.java b/src/main/java/traben/entity_texture_features/ETFException.java index 2c8baefb..2f3223e3 100644 --- a/src/main/java/traben/entity_texture_features/ETFException.java +++ b/src/main/java/traben/entity_texture_features/ETFException.java @@ -1,7 +1,7 @@ package traben.entity_texture_features; import net.minecraft.world.level.block.entity.BlockEntity; -import traben.entity_texture_features.features.ETFRenderContext; +import traben.entity_texture_features.features.state.ETFState; public class ETFException extends RuntimeException { public ETFException(String message) { @@ -9,7 +9,7 @@ public ETFException(String message) { } private static String amendMessage(String message) { - var entity = ETFRenderContext.getCurrentEntityState(); + var entity = ETFState.state(); return message + """ ---------------------- diff --git a/src/main/java/traben/entity_texture_features/compat/SodiumGetBufferInjector.java b/src/main/java/traben/entity_texture_features/compat/SodiumGetBufferInjector.java index 44c239e5..d0067119 100644 --- a/src/main/java/traben/entity_texture_features/compat/SodiumGetBufferInjector.java +++ b/src/main/java/traben/entity_texture_features/compat/SodiumGetBufferInjector.java @@ -4,7 +4,7 @@ //#if MC < 12100 && MC != 12002 && SODIUM //$$ import me.jellysquid.mods.sodium.client.render.vertex.buffer.ExtendedBufferBuilder; -//$$ import traben.entity_texture_features.features.ETFRenderContext; +//$$ import traben.entity_texture_features.features.state.ETFState; //$$ import traben.entity_texture_features.utils.ETFUtils2; //$$ import traben.entity_texture_features.utils.ETFVertexConsumer; //$$ import java.lang.reflect.Method; @@ -68,7 +68,7 @@ private static TriConsumer stackDebugPrinting, aBoolean -> stackDebugPrinting = aBoolean, false) ) ), new TConfigEntryCategory("config.entity_features.general_settings.title").add( new TConfigEntryEnumButton<>("config.entity_texture_features.allow_illegal_texture_paths.title", "config.entity_texture_features.allow_illegal_texture_paths.tooltip", diff --git a/src/main/java/traben/entity_texture_features/features/ETFManager.java b/src/main/java/traben/entity_texture_features/features/ETFManager.java index c5e22bdb..6fbaea90 100644 --- a/src/main/java/traben/entity_texture_features/features/ETFManager.java +++ b/src/main/java/traben/entity_texture_features/features/ETFManager.java @@ -10,6 +10,7 @@ import traben.entity_texture_features.features.player.ETFPlayerEntity; import traben.entity_texture_features.features.player.ETFPlayerTexture; import traben.entity_texture_features.features.state.ETFEntityRenderState; +import traben.entity_texture_features.features.state.ETFState; import traben.entity_texture_features.features.texture_handlers.ETFDirectory; import traben.entity_texture_features.features.texture_handlers.ETFTexture; import traben.entity_texture_features.features.texture_handlers.ETFTextureVariator; @@ -100,6 +101,7 @@ public static ETFManager getInstance() { } public static void resetInstance() { + ETFState.clear(); ETF.config().loadFromFile(); // instance based format solves the issue of hashmaps and arrays being clearing while also being accessed @@ -114,10 +116,11 @@ public static void resetInstance() { public static ETFConfig.EmissiveRenderModes getEmissiveMode() { var mode = ETF.config().getConfig().getEmissiveRenderMode(); - if (mode == ETFConfig.EmissiveRenderModes.BRIGHT - && ETFRenderContext.getCurrentEntityState() != null - && !ETFRenderContext.getCurrentEntityState().canRenderBright()) { - return ETFConfig.EmissiveRenderModes.DULL; + if (mode == ETFConfig.EmissiveRenderModes.BRIGHT) { + var state = ETFState.state(); + if (state != null && !state.canRenderBright()) { + return ETFConfig.EmissiveRenderModes.DULL; + } } return mode; } diff --git a/src/main/java/traben/entity_texture_features/features/ETFRenderContext.java b/src/main/java/traben/entity_texture_features/features/ETFRenderContext.java index c2682130..18bc5dba 100644 --- a/src/main/java/traben/entity_texture_features/features/ETFRenderContext.java +++ b/src/main/java/traben/entity_texture_features/features/ETFRenderContext.java @@ -1,239 +1,5 @@ package traben.entity_texture_features.features; - -import net.minecraft.nbt.CompoundTag; -import org.jetbrains.annotations.Nullable; -import traben.entity_texture_features.ETF; -import traben.entity_texture_features.config.ETFConfig; -import traben.entity_texture_features.features.state.ETFEntityRenderState; -import traben.entity_texture_features.utils.ETFRenderLayerWithTexture; -import traben.entity_texture_features.utils.ETFVertexConsumer; -import com.mojang.blaze3d.vertex.VertexConsumer; - -import java.util.Optional; -import java.util.UUID; -import java.util.function.Supplier; - -import net.minecraft.client.renderer.RenderType; -import net.minecraft.resources.ResourceLocation; -import traben.entity_texture_features.utils.URenderTypeToVertexConsumer; - -@Deprecated // todo collapse into ETFEntityRenderState as best as i can +@Deprecated(forRemoval = true) public class ETFRenderContext { - - public static boolean renderingFeatures = false; - private static boolean allowRenderLayerTextureModify = true; - - - private static boolean limitModifyToProperties = false; - private static ETFEntityRenderState currentEntity = null; - private static int currentModelPartDepth = 0; - private static boolean isInSpecialRenderOverlayPhase = false; - private static boolean allowedToPatch = false; - - public static CompoundTag cacheEntityNBTForFrame(UUID entityUUID, Supplier computeNBT) { - if(currentEntityNBT == null || !entityUUID.equals(entityNBT_UUID)){ - currentEntityNBT = computeNBT.get(); - entityNBT_UUID = entityUUID; - } - return currentEntityNBT; - } - - private static CompoundTag currentEntityNBT = null; - private static UUID entityNBT_UUID = null; - - public static boolean isRenderingFeatures() { - return renderingFeatures; - } - public static void setRenderingFeatures(boolean renderingFeatures) { - ETFRenderContext.renderingFeatures = renderingFeatures; - } - - public static boolean isAllowedToRenderLayerTextureModify() { - return allowRenderLayerTextureModify && ETF.config().getConfig().canDoCustomTextures(); - } - - public static void preventRenderLayerTextureModify() { - ETFRenderContext.allowRenderLayerTextureModify = false; - } - - public static void allowRenderLayerTextureModify() { - ETFRenderContext.allowRenderLayerTextureModify = true; - } - - @Nullable - @Deprecated /// todo replace these usages as best as i can to avoid entity smuggling in 1.21.2+ - public static ETFEntityRenderState getCurrentEntityState() { - return currentEntity; - } - - //TODO see usage for details, just temp to get 26.2 out on release day - public static boolean temp_markRenderingEntity = false; - - public static void setCurrentEntity(ETFEntityRenderState currentEntity) { - allowRenderLayerTextureModify = true; - currentEntityNBT = null; - entityNBT_UUID = null; - ETFRenderContext.currentEntity = currentEntity; - temp_markRenderingEntity = true; - } - - public static boolean canRenderInBrightMode() { - boolean setForBrightMode = ETFManager.getEmissiveMode() == ETFConfig.EmissiveRenderModes.BRIGHT; - if (setForBrightMode) { - if (currentEntity != null) { - return currentEntity.canRenderBright();// && !ETFRenderContext.getCurrentETFTexture().isPatched_CurrentlyOnlyArmor(); - } else { - //establish default rule - return true; - } - } - return false; - } - - public static boolean shouldEmissiveUseCullingLayer() {//todo required post 1.21.2? - if (currentEntity != null) { - return currentEntity.isBlockEntity(); - } else { - //establish default rule - return true; - } - } - - public static int getCurrentModelPartDepth() { - return currentModelPartDepth; - } - - public static void incrementCurrentModelPartDepth() { - currentModelPartDepth++; - } - - public static void decrementCurrentModelPartDepth() { - currentModelPartDepth--; - } - - public static void resetCurrentModelPartDepth() { - currentModelPartDepth = 0; - } - - public static void reset() { - currentModelPartDepth = 0; - currentEntity = null; - allowedToPatch = false; - allowRenderLayerTextureModify = true; - limitModifyToProperties = false; - currentEntityNBT = null; - entityNBT_UUID = null; - temp_markRenderingEntity = false; - } - - @SuppressWarnings("unused")//used in EMF - public static boolean isIsInSpecialRenderOverlayPhase() { - return isInSpecialRenderOverlayPhase; - } - - public static void startSpecialRenderOverlayPhase() { - ETFRenderContext.isInSpecialRenderOverlayPhase = true; - } - - public static void endSpecialRenderOverlayPhase() { - ETFRenderContext.isInSpecialRenderOverlayPhase = false; - } - - public static boolean isAllowedToPatch() { - return allowedToPatch; - } - - public static void allowTexturePatching() { - allowedToPatch = true; - } - - public static void allowOnlyPropertiesRandom(){ - limitModifyToProperties = true; - } - - public static void allowAllRandom(){ - limitModifyToProperties = false; - } - - public static boolean isRandomLimitedToProperties(){ - return limitModifyToProperties; - } - - public static void preventTexturePatching() { - allowedToPatch = false; - } - - public static RenderType modifyRenderLayerIfRequired(RenderType value) { - - if (isCurrentlyRenderingEntity() - && isAllowedToRenderLayerTextureModify()) { - var layer = ETF.config().getConfig().getRenderLayerOverride(); - if (layer != null - && !value.isOutline() - && value instanceof ETFRenderLayerWithTexture multiphase) { - - Optional texture = multiphase.etf$getId(); - if (texture.isPresent()) { - preventRenderLayerTextureModify(); - - RenderType forReturn = switch (layer) { - case TRANSLUCENT -> - //#if MC>= 12111 - //$$ net.minecraft.client.renderer.rendertype.RenderTypes - //#else - RenderType - //#endif - .entityTranslucent(texture.get()); - case TRANSLUCENT_CULL -> - //#if MC >= 12103 - - //#if MC>= 12111 - //$$ net.minecraft.client.renderer.rendertype.RenderTypes - //#else - RenderType - //#endif - .entityTranslucent(texture.get()); - //#else - //$$ RenderType.entityTranslucentCull(texture.get()); - //#endif - case END -> - //#if MC>= 12111 - //$$ net.minecraft.client.renderer.rendertype.RenderTypes - //#else - RenderType - //#endif - .endGateway(); - case OUTLINE -> - //#if MC>= 12111 - //$$ net.minecraft.client.renderer.rendertype.RenderTypes - //#else - RenderType - //#endif - .outline(texture.get()); - }; - allowRenderLayerTextureModify(); - return forReturn; - - } - } - } - return value; - } - - public static void insertETFDataIntoVertexConsumer(URenderTypeToVertexConsumer provider, RenderType renderLayer, VertexConsumer vertexConsumer) { - if (isCurrentlyRenderingEntity() && vertexConsumer instanceof ETFVertexConsumer etfVertexConsumer) { - //need to store etf texture of consumer and original render layer - //store provider as well for future actions - etfVertexConsumer.etf$initETFVertexConsumer(provider, renderLayer); - } - } - - public static boolean isCurrentlyRenderingEntity() { - //#if MC >= 12109 - return currentEntity != null || temp_markRenderingEntity; - //#else - //$$ return currentEntity != null; - //#endif - } } diff --git a/src/main/java/traben/entity_texture_features/features/player/ETFPlayerFeatureRenderer.java b/src/main/java/traben/entity_texture_features/features/player/ETFPlayerFeatureRenderer.java index 96e484dd..80480fd6 100644 --- a/src/main/java/traben/entity_texture_features/features/player/ETFPlayerFeatureRenderer.java +++ b/src/main/java/traben/entity_texture_features/features/player/ETFPlayerFeatureRenderer.java @@ -35,7 +35,7 @@ import traben.entity_texture_features.config.ETFConfig; import traben.entity_texture_features.config.screens.skin.ETFConfigScreenSkinTool; import traben.entity_texture_features.features.ETFManager; -import traben.entity_texture_features.features.ETFRenderContext; +import traben.entity_texture_features.features.state.ETFState; import traben.entity_texture_features.utils.ETFUtils2; //#if MC >= 12109 @@ -82,8 +82,8 @@ public static void renderSkullFeatures(PoseStack matrixStack, //$$ MultiBufferSource vertexConsumerProvider, //#endif int light, SkullModelBase skullModel, ETFPlayerTexture playerTexture, float yaw) { - ETFRenderContext.preventRenderLayerTextureModify(); - ETFRenderContext.startSpecialRenderOverlayPhase(); + ETFState.pushRenderLayerModifyState(false); + ETFState.startSpecialRenderOverlayPhase(); if (playerTexture.hasVillagerNose || playerTexture.texturedNoseIdentifier != null) { villagerNose.yRot = yaw * 0.017453292F; @@ -97,8 +97,8 @@ public static void renderSkullFeatures(PoseStack matrixStack, // ETFPlayerFeatureRenderer.renderEmmisive(matrixStack, vertexConsumerProvider, playerTexture, skullModel); ETFPlayerFeatureRenderer.renderEnchanted(matrixStack, vertexConsumerProvider, light, playerTexture, skullModel); - ETFRenderContext.endSpecialRenderOverlayPhase(); - ETFRenderContext.allowRenderLayerTextureModify(); + ETFState.endSpecialRenderOverlayPhase(); + ETFState.popRenderLayerModifyState(); } // private static void renderEmmisive(MatrixStack matrixStack, VertexConsumerProvider vertexConsumerProvider, ETFPlayerTexture playerTexture, Model model) { @@ -251,7 +251,7 @@ public void submit(final PoseStack matrices, final SubmitNodeCollector submit, f //$$ public void render(PoseStack matrices, MultiBufferSource submit, int light, T entity, float limbAngle, float limbDistance, float tickDelta, float animationProgress, float headYaw, float headPitch) { //#endif if (ETF.config().getConfig().skinFeaturesEnabled && skinHolder != null) { - ETFRenderContext.preventRenderLayerTextureModify(); + ETFState.pushRenderLayerModifyState(false); ETFPlayerTexture playerTexture = skinHolder.etf$getETFPlayerTexture(); if (playerTexture != null && playerTexture.hasFeatures) { @@ -263,7 +263,7 @@ public void submit(final PoseStack matrices, final SubmitNodeCollector submit, f light, getParentModel(), playerTexture); } - ETFRenderContext.allowRenderLayerTextureModify(); + ETFState.popRenderLayerModifyState(); } } @@ -276,7 +276,7 @@ public void renderFeatures(PoseStack matrixStack, //#endif int light, M model, ETFPlayerTexture playerTexture) { if (playerTexture.canUseFeaturesForThisPlayer()) { - ETFRenderContext.startSpecialRenderOverlayPhase(); + ETFState.startSpecialRenderOverlayPhase(); matrixStack.pushPose(); //#if MC >= 1.21.2 getParentModel().root().translateAndRotate(matrixStack); @@ -307,7 +307,7 @@ public void renderFeatures(PoseStack matrixStack, //ETFPlayerFeatureRenderer.renderEnchanted(matrixStack, vertexConsumerProvider, light, playerTexture, model); matrixStack.popPose(); - ETFRenderContext.endSpecialRenderOverlayPhase(); + ETFState.endSpecialRenderOverlayPhase(); } } diff --git a/src/main/java/traben/entity_texture_features/features/property_reading/PropertiesRandomProvider.java b/src/main/java/traben/entity_texture_features/features/property_reading/PropertiesRandomProvider.java index 90a87897..4c66bad3 100644 --- a/src/main/java/traben/entity_texture_features/features/property_reading/PropertiesRandomProvider.java +++ b/src/main/java/traben/entity_texture_features/features/property_reading/PropertiesRandomProvider.java @@ -6,10 +6,10 @@ import traben.entity_texture_features.ETFApi; import traben.entity_texture_features.ETFException; import traben.entity_texture_features.features.ETFManager; -import traben.entity_texture_features.features.ETFRenderContext; import traben.entity_texture_features.features.property_reading.properties.RandomProperties; import traben.entity_texture_features.features.property_reading.properties.generic_properties.SimpleIntegerArrayProperty; import traben.entity_texture_features.features.state.ETFEntityRenderState; +import traben.entity_texture_features.features.state.ETFState; import traben.entity_texture_features.features.texture_handlers.ETFDirectory; import traben.entity_texture_features.utils.ETFLruCache; import traben.entity_texture_features.utils.ETFUtils2; @@ -55,7 +55,7 @@ public static PropertiesRandomProvider of(ResourceLocation initialPropertiesFile return null; } if (vanillaIdentifier.getPath().endsWith(".png")) { - ETFManager.getInstance().grabSpecialProperties(props, ETFRenderContext.getCurrentEntityState()); + ETFManager.getInstance().grabSpecialProperties(props, ETFState.state()); } List propertyRules = PropertiesRandomProvider.getAllValidPropertyObjects(props, propertiesFileIdentifier, suffixKeyName); diff --git a/src/main/java/traben/entity_texture_features/features/property_reading/properties/optifine_properties/NBTProperty.java b/src/main/java/traben/entity_texture_features/features/property_reading/properties/optifine_properties/NBTProperty.java index 3a20f60e..e2ba824a 100644 --- a/src/main/java/traben/entity_texture_features/features/property_reading/properties/optifine_properties/NBTProperty.java +++ b/src/main/java/traben/entity_texture_features/features/property_reading/properties/optifine_properties/NBTProperty.java @@ -81,7 +81,7 @@ private static boolean isStringValidInt(String string) { return entity.nbt(); } - protected static final CompoundTag INTENTIONAL_FAILURE = new CompoundTag(); + public static final CompoundTag INTENTIONAL_FAILURE = new CompoundTag(); private static Set crashMessages = new HashSet<>(); private boolean nullMessage = true; diff --git a/src/main/java/traben/entity_texture_features/features/state/ETFEntityRenderState.java b/src/main/java/traben/entity_texture_features/features/state/ETFEntityRenderState.java index 890a12f5..7804a6f3 100644 --- a/src/main/java/traben/entity_texture_features/features/state/ETFEntityRenderState.java +++ b/src/main/java/traben/entity_texture_features/features/state/ETFEntityRenderState.java @@ -19,6 +19,7 @@ import traben.entity_texture_features.utils.ETFEntity; import traben.entity_texture_features.utils.ETFUtils2; import java.util.*; +import java.util.function.Supplier; public interface ETFEntityRenderState { @@ -60,13 +61,35 @@ public interface ETFEntityRenderState { float distanceTo(Entity entity); + CompoundTag cacheEntityNBTForState(UUID entityUUID, Supplier computeNBT); + default void preSubmitActivate(ETFSubmitData submitData, + //#if MC >= 26.2 + //$$ net.minecraft.client.renderer.feature.ModelFeatureRenderer.Submit vanillaSubmit + //#elseif MC >= 1.21.9 + net.minecraft.client.renderer.SubmitNodeStorage.ModelSubmit vanillaSubmit + //#else + //$$ Object vanillaSubmit + //#endif + ) { + + } + + default void activate(boolean inMount) { + + } + + default void deactivate(boolean inMount) { + + } + interface ETFRenderStateInit { ETFEntityRenderState make(ETFEntity entity); } + @SuppressWarnings("unused") static void setEtfRenderStateConstructor(String reason, ETFRenderStateInit init) { ETFUtils2.logMessage("Modifying ETF Render State constructor because: " + reason); // likely EMF or ESF ETF.etfRenderStateConstructor = init; @@ -76,4 +99,153 @@ static ETFEntityRenderState forEntity(ETFEntity entity) { return ETF.etfRenderStateConstructor.make(entity); } + //#if MC >= 1.21.2 + @Nullable + static ETFEntityRenderState from(net.minecraft.client.renderer.entity.state.EntityRenderState state) { + if (state instanceof HoldsETFRenderState holds) { + return holds.etf$getState(); + } + return null; + } + //#endif + + //region NULL + ETFEntityRenderState NULL = new Null(); + class Null implements ETFEntityRenderState { + + @Override + public UUID uuid() { + return null; + } + + @Override + public boolean canRenderBright() { + return false; + } + + @Override + public boolean isBlockEntity() { + return false; + } + + @Override + public EntityType entityType() { + return null; + } + + @Override + public Level world() { + return null; + } + + @Override + public BlockPos blockPos() { + return null; + } + + @Override + public int optifineId() { + return 0; + } + + @Override + public int optifineVehicleId() { + return 0; + } + + @Override + public int blockY() { + return 0; + } + + @Override + public CompoundTag nbt() { + return null; + } + + @Override + public boolean hasCustomName() { + return false; + } + + @Override + public Component customName() { + return null; + } + + @Override + public Team scoreboardTeam() { + return null; + } + + @Override + public Iterable itemsEquipped() { + return null; + } + + @Override + public Iterable handItems() { + return null; + } + + @Override + public Iterable armorItems() { + return null; + } + + @Override + public Vec3 velocity() { + return null; + } + + @Override + public Pose pose() { + return null; + } + + @Override + public String entityKey() { + return ""; + } + + @Override + public ETFEntity entity() { + return null; + } + + //#if MC>=12102 + + @Override + public EntityRenderState vanillaState() { + return null; + } + + @Override + public void setVanillaState(EntityRenderState vanillaState) { + } + //#endif + + //#if MC>=12109 + + @Override + public net.minecraft.client.renderer.blockentity.state.BlockEntityRenderState vanillaBlockState() { + return null; + } + + @Override + public void setVanillaBlockState(net.minecraft.client.renderer.blockentity.state.BlockEntityRenderState vanillaBlockState) { + } + //#endif + + @Override + public float distanceTo(Entity entity) { + return 0; + } + + @Override + public CompoundTag cacheEntityNBTForState(UUID entityUUID, Supplier computeNBT) { + return null; + } + } + //endregion } \ No newline at end of file diff --git a/src/main/java/traben/entity_texture_features/features/state/ETFEntityRenderStateViaReference.java b/src/main/java/traben/entity_texture_features/features/state/ETFEntityRenderStateViaReference.java index b6232f5e..42f8b202 100644 --- a/src/main/java/traben/entity_texture_features/features/state/ETFEntityRenderStateViaReference.java +++ b/src/main/java/traben/entity_texture_features/features/state/ETFEntityRenderStateViaReference.java @@ -17,6 +17,7 @@ import net.minecraft.world.scores.Team; import traben.entity_texture_features.utils.ETFEntity; import java.util.*; +import java.util.function.Supplier; // TODO implement caching version for 1.21.2+ as smuggling in the entity wont work forever public class ETFEntityRenderStateViaReference implements ETFEntityRenderState { @@ -160,4 +161,16 @@ public float distanceTo(Entity other) { return entity.etf$distanceTo(other); } + @Override + public CompoundTag cacheEntityNBTForState(UUID entityUUID, Supplier computeNBT) { + if(currentEntityNBT == null || !entityUUID.equals(entityNBT_UUID)){ + currentEntityNBT = computeNBT.get(); + entityNBT_UUID = entityUUID; + } + return currentEntityNBT; + } + + private CompoundTag currentEntityNBT = null; + private UUID entityNBT_UUID = null; + } \ No newline at end of file diff --git a/src/main/java/traben/entity_texture_features/features/state/ETFState.java b/src/main/java/traben/entity_texture_features/features/state/ETFState.java new file mode 100644 index 00000000..17d2cf93 --- /dev/null +++ b/src/main/java/traben/entity_texture_features/features/state/ETFState.java @@ -0,0 +1,290 @@ +package traben.entity_texture_features.features.state; + +import com.mojang.blaze3d.vertex.VertexConsumer; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.resources.ResourceLocation; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import traben.entity_texture_features.ETF; +import traben.entity_texture_features.config.ETFConfig; +import traben.entity_texture_features.features.ETFManager; +import traben.entity_texture_features.utils.ETFRenderLayerWithTexture; +import traben.entity_texture_features.utils.ETFUtils2; +import traben.entity_texture_features.utils.ETFVertexConsumer; +import traben.entity_texture_features.utils.URenderTypeToVertexConsumer; + +import java.util.Deque; +import java.util.EmptyStackException; +import java.util.NoSuchElementException; +import java.util.Optional; +import java.util.concurrent.ConcurrentLinkedDeque; + +/** + * Global state data for ETF + *

+ * Also allows global access to the currently mounted ETFEntityRenderState in the stack + */ +public abstract class ETFState { + + private static final Deque stateStack = new ConcurrentLinkedDeque<>(){ + @Override + public void push(ETFEntityRenderState etfEntityRenderState) { + super.push(etfEntityRenderState == null ? ETFEntityRenderState.NULL : etfEntityRenderState); + } + + @Override + public ETFEntityRenderState peek() { + var peeked = super.peek(); + if (peeked == ETFEntityRenderState.NULL) return null; + return peeked; + } + }; + + + public static void mount(@Nullable ETFEntityRenderState state) { + if (state != null && state() == state) return; + + var current = state(); + if (current != null) current.deactivate(true); + stateStack.push(state); + if (state != null) state.activate(true); + pushRenderLayerModifyState(true); + announceStack("mount"); + } + + public static void unMount() { + try { + var popped = stateStack.peek(); + if (popped != null) popped.deactivate(false); + stateStack.pop(); + var current = state(); + if (current != null) current.activate(false); + } catch (NoSuchElementException e) { + // You'd think the isEmpty() check would avoid this + } + currentModelPartDepth = 0; + popRenderLayerModifyState(); + announceStack("unmount"); + } + + public static void mountNone() { + mount(null); + } + + + public static @Nullable ETFEntityRenderState state() { + return stateStack.peek(); + } + + public static boolean isStateActive() { + return state() != null; + } + + public static void clear() { + var state = state(); + if (state != null) state.deactivate(false); + stateStack.clear(); + specialPhaseStack.clear(); + renderLayerModifyStack.clear(); + + currentModelPartDepth = 0; + onlyRandomizeViaPropertiesFiles = false; + isRenderingFeatures = false; + allowTexturePatching = false; + +// ETFSubmitData.endInstance(); + announceStack("clear"); + stackVerifyHasFailed = false; + } + + private static boolean stackVerifyHasFailed = false; + + public static void announceStack(String action) { + if (!stackVerifyHasFailed || !ETF.config().getConfig().stackDebugPrinting) return; + var str = new StringBuilder(); + str.append("ETF state stack: \n - action = ").append(action) + .append("\n - size = ").append(stateStack.size()).append("\n"); + int count = 1; + for (var state : stateStack) { + str.append(" ").append("-".repeat(count++)).append(" ").append(state != null ? state.entityKey() : "null").append("\n"); + } + ETFUtils2.logWarn(str.toString()); + new Exception().printStackTrace(); + } + + public static void stackVerify(ETFEntityRenderState shouldBeHere) { + boolean log = ETF.config().getConfig().stackDebugPrinting; + if (shouldBeHere == null) { + if (log) ETFUtils2.logWarn("ETFState stack verify called with null, this is likely a bug"); + stackVerifyHasFailed = true; + return; + } + + if (state() != shouldBeHere) { + stackVerifyHasFailed = false; + if (log) ETFUtils2.logWarn("ETFState stack is not correct"); + if (stateStack.contains(shouldBeHere)) { + if (log) ETFUtils2.logWarn("ETFState stack is too deep"); + while (!stateStack.isEmpty() && stateStack.peek() != shouldBeHere) { + if (log) ETFUtils2.logWarn("- unmounting " + stateStack.peek().entityKey() ); + unMount(); + } + } else { + // Error level failure, the above is somewhat expected if a crash or other mod mixin cancellation occurs + // but this is not, this also likely doesn't really fix it + ETFUtils2.logError("ETFState stack has popped early"); + mount(shouldBeHere); + } + stackVerifyHasFailed = true; + } + } + + public static void stackVerifyEmpty() { + if (!stateStack.isEmpty()) { + stackVerifyHasFailed = false; + boolean log = ETF.config().getConfig().stackDebugPrinting; + if (log) ETFUtils2.logWarn("ETFState stack is not empty on verifyEmpty, clearing stack"); + while (!stateStack.isEmpty()) { + if (log) ETFUtils2.logWarn("- unmounting " + stateStack.peek().entityKey() ); + unMount(); + } + stackVerifyHasFailed = true; + } + specialPhaseStack.clear(); + renderLayerModifyStack.clear(); + } + + + public static int currentModelPartDepth = 0; + + public static boolean isRenderingFeatures = false; + public static boolean onlyRandomizeViaPropertiesFiles = false; + public static boolean allowTexturePatching = false; + + // Stack here probably isn't required, merely a safeguard against early exiting of the phase + private static final Deque specialPhaseStack = new ConcurrentLinkedDeque<>(); + //region specialPhaseStack methods + @SuppressWarnings("unused") // EMF uses it + public static boolean isIsInSpecialRenderOverlayPhase() {return !specialPhaseStack.isEmpty();} + public static void startSpecialRenderOverlayPhase() { + specialPhaseStack.push(true); + } + public static void endSpecialRenderOverlayPhase() { + try { + if (!specialPhaseStack.isEmpty()) specialPhaseStack.pop(); + } catch (NoSuchElementException e) { + // You'd think the isEmpty() check would avoid this + } + } + //endregion + + private static final Deque renderLayerModifyStack = new ConcurrentLinkedDeque<>(); + //region allowRenderLayerTextureModify methods + public static boolean isAllowedToRenderLayerTextureModify() { + if (!ETF.config().getConfig().canDoCustomTextures()) return false; + Boolean peek = renderLayerModifyStack.peek(); + return peek == null || peek; + } + public static void pushRenderLayerModifyState(boolean allow) { + renderLayerModifyStack.push(allow); + } + public static void popRenderLayerModifyState() { + try { + if (!renderLayerModifyStack.isEmpty()) renderLayerModifyStack.pop(); + } catch (NoSuchElementException e) { + // You'd think the isEmpty() check would avoid this + } + } + //endregion + + public static RenderType modifyRenderLayerIfRequired(RenderType value) { + + if (isStateActive() + && isAllowedToRenderLayerTextureModify()) { + var layer = ETF.config().getConfig().getRenderLayerOverride(); + if (layer != null + && !value.isOutline() + && value instanceof ETFRenderLayerWithTexture multiphase) { + + Optional texture = multiphase.etf$getId(); + if (texture.isPresent()) { + pushRenderLayerModifyState(false); + + RenderType forReturn = switch (layer) { + case TRANSLUCENT -> + //#if MC>= 12111 + //$$ net.minecraft.client.renderer.rendertype.RenderTypes + //#else + RenderType + //#endif + .entityTranslucent(texture.get()); + case TRANSLUCENT_CULL -> + //#if MC >= 12103 + + //#if MC>= 12111 + //$$ net.minecraft.client.renderer.rendertype.RenderTypes + //#else + RenderType + //#endif + .entityTranslucent(texture.get()); + //#else + //$$ RenderType.entityTranslucentCull(texture.get()); + //#endif + case END -> + //#if MC>= 12111 + //$$ net.minecraft.client.renderer.rendertype.RenderTypes + //#else + RenderType + //#endif + .endGateway(); + case OUTLINE -> + //#if MC>= 12111 + //$$ net.minecraft.client.renderer.rendertype.RenderTypes + //#else + RenderType + //#endif + .outline(texture.get()); + }; + popRenderLayerModifyState(); + return forReturn; + + } + } + } + return value; + } + + public static void insertETFDataIntoVertexConsumer(URenderTypeToVertexConsumer provider, RenderType renderLayer, VertexConsumer vertexConsumer) { + if (isStateActive() && vertexConsumer instanceof ETFVertexConsumer etfVertexConsumer) { + // need to store etf texture of consumer and original render layer + // store provider as well for future actions + etfVertexConsumer.etf$initETFVertexConsumer(provider, renderLayer); + } + } + + public static boolean canRenderInBrightMode() { + boolean setForBrightMode = ETFManager.getEmissiveMode() == ETFConfig.EmissiveRenderModes.BRIGHT; + if (setForBrightMode) { + var currentEntity = state(); + if (currentEntity != null) { + return currentEntity.canRenderBright(); + } else { + // establish default rule + return true; + } + } + return false; + } + + //#if MC < 12103 + //$$ public static boolean shouldEmissiveUseCullingLayer() { + //$$ var currentEntity = state(); + //$$ if (currentEntity != null) { + //$$ return currentEntity.isBlockEntity(); + //$$ } else { + //$$ // establish default rule + //$$ return true; + //$$ } + //$$ } + //#endif +} diff --git a/src/main/java/traben/entity_texture_features/features/state/ETFSubmitData.java b/src/main/java/traben/entity_texture_features/features/state/ETFSubmitData.java new file mode 100644 index 00000000..f2a18150 --- /dev/null +++ b/src/main/java/traben/entity_texture_features/features/state/ETFSubmitData.java @@ -0,0 +1,52 @@ +package traben.entity_texture_features.features.state; + +import org.jetbrains.annotations.Nullable; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.function.BiConsumer; + +public class ETFSubmitData { + + public ETFEntityRenderState backupState = ETFState.state(); + + public final Map data = new HashMap<>(); + + + + + //#if MC >= 1.21.9 + public static final List= 26.2 + //$$ net.minecraft.client.renderer.feature.ModelFeatureRenderer.Submit + //#else + net.minecraft.client.renderer.SubmitNodeStorage.ModelSubmit + //#endif + >> DATA_IN = new ArrayList<>(); + + public static final List= 26.2 + //$$ net.minecraft.client.renderer.feature.ModelFeatureRenderer.Submit + //#else + net.minecraft.client.renderer.SubmitNodeStorage.ModelSubmit + //#endif + >> DATA_OUT = new ArrayList<>(); + + @Nullable + public static ETFSubmitData from( + //#if MC >= 26.2 + //$$ net.minecraft.client.renderer.feature.ModelFeatureRenderer.Submit modelSubmit + //#else + net.minecraft.client.renderer.SubmitNodeStorage.ModelSubmit modelSubmit + //#endif + ) { + //noinspection ConstantValue + return ((Object) modelSubmit) instanceof ETFSubmitExtension emf + ? ((ETFSubmitExtension) (Object) modelSubmit).emf$getData() + : null; + } + //#endif + +} diff --git a/src/main/java/traben/entity_texture_features/features/state/ETFSubmitExtension.java b/src/main/java/traben/entity_texture_features/features/state/ETFSubmitExtension.java new file mode 100644 index 00000000..209a441c --- /dev/null +++ b/src/main/java/traben/entity_texture_features/features/state/ETFSubmitExtension.java @@ -0,0 +1,7 @@ +package traben.entity_texture_features.features.state; + +import org.jetbrains.annotations.Nullable; + +public interface ETFSubmitExtension { + @Nullable ETFSubmitData emf$getData(); +} diff --git a/src/main/java/traben/entity_texture_features/features/texture_handlers/ETFArmorHandler.java b/src/main/java/traben/entity_texture_features/features/texture_handlers/ETFArmorHandler.java index 43b890e7..d560d942 100644 --- a/src/main/java/traben/entity_texture_features/features/texture_handlers/ETFArmorHandler.java +++ b/src/main/java/traben/entity_texture_features/features/texture_handlers/ETFArmorHandler.java @@ -30,7 +30,7 @@ import traben.entity_texture_features.ETF; import traben.entity_texture_features.features.ETFManager; -import traben.entity_texture_features.features.ETFRenderContext; +import traben.entity_texture_features.features.state.ETFState; import traben.entity_texture_features.utils.ETFUtils2; import traben.entity_texture_features.utils.URenderTypeToVertexConsumer; @@ -47,16 +47,16 @@ public class ETFArmorHandler { //$$ //$$ private ETFTexture texture = null; //$$ -//$$ public void start(){ -//$$ ETFRenderContext.preventRenderLayerTextureModify(); +//$$ public void start(){ +//$$ ETFState.pushRenderLayerModifyState(false); //$$ //todo ETFRenderContext.allowTexturePatching(); -//$$ } -//$$ public void end(){ -//$$ ETFRenderContext.allowRenderLayerTextureModify(); +//$$ } +//$$ public void end(){ +//$$ ETFState.popRenderLayerModifyState(); //$$ //todo ETFRenderContext.preventTexturePatching(); //$$ } //$$ -//$$ public ResourceLocation getBaseTexture(ResourceLocation vanilla) { +//$$ public ResourceLocation getBaseTexture(ResourceLocation vanilla) { //$$ if(ETF.config().getConfig().enableArmorAndTrims) { //$$ texture = ETFManager.getInstance().getETFTextureNoVariation(vanilla); //$$ //noinspection ConstantConditions @@ -80,44 +80,44 @@ public class ETFArmorHandler { //$$ //} else { //$$ textureVert = vertexConsumers.getBuffer(RenderType.armorCutoutNoCull(emissive)); //ItemRenderer.getArmorGlintConsumer(vertexConsumers.delegate, RenderLayer.getEntityTranslucent(emissive), false, usesSecondLayer); //$$ //} -//$$ ETFRenderContext.startSpecialRenderOverlayPhase(); +//$$ ETFState.startSpecialRenderOverlayPhase(); //$$ //do not pop/push as we want the scaling to trickle down to trim rendering, so they appear over the emissive //$$ if (ETF.IRIS_DETECTED) matrices.scale(1.001f,1.001f,1.001f); //$$ model.renderToBuffer(matrices, textureVert, ETF.EMISSIVE_FEATURE_LIGHT_VALUE, OverlayTexture.NO_OVERLAY -//#if MC < 12100 -//$$ , 1, 1, 1, 1.0F -//#endif -//$$ ); -//$$ ETFRenderContext.startSpecialRenderOverlayPhase(); + //#if MC < 12100 + //$$ , 1, 1, 1, 1.0F + //#endif +//$$ ); +//$$ ETFState.startSpecialRenderOverlayPhase(); //$$ } //$$ } -//$$ //$$ } +//$$ //$$ public void renderTrimEmissive(final PoseStack matrices, final URenderTypeToVertexConsumer vertexConsumers, final Model model) { //$$ if(trimTexture != null && ETF.config().getConfig().canDoEmissiveTextures()){ //$$ //trimTexture.renderEmissive(matrices,vertexConsumers,model); //$$ ResourceLocation emissive = trimTexture.getEmissiveIdentifierOfCurrentState(); //$$ if (emissive != null) { //$$ VertexConsumer textureVert= vertexConsumers.getBuffer(RenderType.armorCutoutNoCull(emissive)); -//$$ ETFRenderContext.startSpecialRenderOverlayPhase(); +//$$ ETFState.startSpecialRenderOverlayPhase(); //$$ if (ETF.IRIS_DETECTED) matrices.scale(1.001f,1.001f,1.001f); //$$ model.renderToBuffer(matrices, textureVert, ETF.EMISSIVE_FEATURE_LIGHT_VALUE, OverlayTexture.NO_OVERLAY //#if MC < 12100 //$$ , 1, 1, 1, 1.0F //#endif //$$ ); -//$$ ETFRenderContext.endSpecialRenderOverlayPhase(); +//$$ ETFState.endSpecialRenderOverlayPhase(); //$$ } //$$ } //$$ } //$$ //$$ //$$ public void setTrim(final -//$$ //#if MC >= 12006 -//$$ Holder -//$$ //#else -//$$ //$$ ArmorMaterial -//$$ //#endif + //#if MC >= 12006 + //$$ Holder + //#else + //$$ ArmorMaterial + //#endif //$$ armorMaterial, final ArmorTrim trim, final boolean leggings) { //$$ //$$ if(ETF.config().getConfig().enableArmorAndTrims) { @@ -133,19 +133,17 @@ public class ETFArmorHandler { //#else public void start(){ -// ETFRenderContext.setInflateEmissiveLayer(true); - ETFRenderContext.allowTexturePatching(); + ETFState.allowTexturePatching = true; } public void end(){ -// ETFRenderContext.setInflateEmissiveLayer(false); - ETFRenderContext.preventTexturePatching(); + ETFState.allowTexturePatching = false; } public void renderTrimEmissive(final PoseStack matrices, final URenderTypeToVertexConsumer vertexConsumers, final Model model) { if(trimTexture != null && ETF.config().getConfig().canDoEmissiveTextures()){ ResourceLocation emissive = trimTexture.getEmissiveIdentifierOfCurrentState(); if (emissive != null) { - ETFRenderContext.startSpecialRenderOverlayPhase(); + ETFState.startSpecialRenderOverlayPhase(); VertexConsumer textureVert = vertexConsumers.getBuffer( //#if MC>= 12111 //$$ net.minecraft.client.renderer.rendertype.RenderTypes @@ -160,7 +158,7 @@ public void renderTrimEmissive(final PoseStack matrices, final URenderTypeToVert //$$ , -1 //#endif ); - ETFRenderContext.endSpecialRenderOverlayPhase(); + ETFState.endSpecialRenderOverlayPhase(); } } trimTexture = null; diff --git a/src/main/java/traben/entity_texture_features/features/texture_handlers/ETFTexture.java b/src/main/java/traben/entity_texture_features/features/texture_handlers/ETFTexture.java index 839826df..967d1e3a 100644 --- a/src/main/java/traben/entity_texture_features/features/texture_handlers/ETFTexture.java +++ b/src/main/java/traben/entity_texture_features/features/texture_handlers/ETFTexture.java @@ -25,8 +25,8 @@ import traben.entity_texture_features.ETFException; import traben.entity_texture_features.config.ETFConfig; import traben.entity_texture_features.features.ETFManager; -import traben.entity_texture_features.features.ETFRenderContext; import traben.entity_texture_features.features.state.ETFEntityRenderState; +import traben.entity_texture_features.features.state.ETFState; import traben.entity_texture_features.utils.ETFEntity; import traben.entity_texture_features.utils.ETFUtils2; @@ -456,7 +456,7 @@ public boolean isEnchanted() { } public boolean canPatch() { - return ETFRenderContext.isAllowedToPatch() && this.thisIdentifier_Patched != null; + return ETFState.allowTexturePatching && this.thisIdentifier_Patched != null; } public boolean doesBlink() { @@ -488,9 +488,9 @@ public void renderEmissive(PoseStack matrixStack, MultiBufferSource vertexConsum public void renderEmissive(PoseStack matrixStack, MultiBufferSource vertexConsumerProvider, ModelPart modelPart, ETFConfig.EmissiveRenderModes modeToUsePossiblyManuallyChosen) { VertexConsumer vertexC = getEmissiveVertexConsumer(vertexConsumerProvider, null, modeToUsePossiblyManuallyChosen); if (vertexC != null) { - ETFRenderContext.startSpecialRenderOverlayPhase(); + ETFState.startSpecialRenderOverlayPhase(); modelPart.render(matrixStack, vertexC, ETF.EMISSIVE_FEATURE_LIGHT_VALUE, OverlayTexture.NO_OVERLAY); - ETFRenderContext.endSpecialRenderOverlayPhase(); + ETFState.endSpecialRenderOverlayPhase(); } } @@ -501,13 +501,13 @@ public void renderEmissive(PoseStack matrixStack, MultiBufferSource vertexConsum public void renderEmissive(PoseStack matrixStack, MultiBufferSource vertexConsumerProvider, Model model, ETFConfig.EmissiveRenderModes modeToUsePossiblyManuallyChosen) { VertexConsumer vertexC = getEmissiveVertexConsumer(vertexConsumerProvider, model, modeToUsePossiblyManuallyChosen); if (vertexC != null) { - ETFRenderContext.startSpecialRenderOverlayPhase(); + ETFState.startSpecialRenderOverlayPhase(); model.renderToBuffer(matrixStack, vertexC, ETF.EMISSIVE_FEATURE_LIGHT_VALUE, OverlayTexture.NO_OVERLAY //#if MC < 12100 //$$ , 1F, 1F, 1F, 1F //#endif ); - ETFRenderContext.endSpecialRenderOverlayPhase(); + ETFState.endSpecialRenderOverlayPhase(); } } @@ -526,9 +526,9 @@ public RenderType getEmissiveRenderLayer(@Nullable Model model) { @Nullable public RenderType getEmissiveRenderLayer(@Nullable Model model, ETFConfig.EmissiveRenderModes modeToUsePossiblyManuallyChosen) { - ETFRenderContext.preventRenderLayerTextureModify(); + ETFState.pushRenderLayerModifyState(false); var type = getEmissiveVertexConsumerWrapped(model, modeToUsePossiblyManuallyChosen); - ETFRenderContext.allowRenderLayerTextureModify(); + ETFState.popRenderLayerModifyState(); return type; } diff --git a/src/main/java/traben/entity_texture_features/features/texture_handlers/ETFTextureVariator.java b/src/main/java/traben/entity_texture_features/features/texture_handlers/ETFTextureVariator.java index 1e73effe..db78e2ce 100644 --- a/src/main/java/traben/entity_texture_features/features/texture_handlers/ETFTextureVariator.java +++ b/src/main/java/traben/entity_texture_features/features/texture_handlers/ETFTextureVariator.java @@ -5,9 +5,9 @@ import traben.entity_texture_features.ETFApi; import traben.entity_texture_features.config.ETFConfig; import traben.entity_texture_features.features.ETFManager; -import traben.entity_texture_features.features.ETFRenderContext; import traben.entity_texture_features.features.property_reading.PropertiesRandomProvider; import traben.entity_texture_features.features.state.ETFEntityRenderState; +import traben.entity_texture_features.features.state.ETFState; import traben.entity_texture_features.utils.ETFLruCache; import traben.entity_texture_features.utils.ETFUtils2; @@ -227,7 +227,7 @@ public void checkIfShouldExpireEntity(@NotNull ETFEntityRenderState entity,UUID } private ETFManager.TextureSource determineTextureSource(@NotNull ETFEntityRenderState entity) { - if (ETFRenderContext.isRenderingFeatures()) { + if (ETFState.isRenderingFeatures) { return ETFManager.TextureSource.ENTITY_FEATURE; } else if (entity.isBlockEntity()) { return ETFManager.TextureSource.BLOCK_ENTITY; @@ -251,8 +251,9 @@ private int determineNewSuffix(@NotNull ETFEntityRenderState entity, ETFManager. } private int getBaseEntitySuffixOrNew(@NotNull ETFEntityRenderState entity) { - int baseEntitySuffix = ETFRenderContext.getCurrentEntityState() == null ? -1 : // note this needs to refer to the entity set at the render dispatcher cant just used passes state - ETFManager.getInstance().LAST_SUFFIX_OF_ENTITY.get(ETFRenderContext.getCurrentEntityState().uuid()); + var state = ETFState.state(); + int baseEntitySuffix = state == null ? -1 : // note this needs to refer to the entity set at the render dispatcher cant just used passes state + ETFManager.getInstance().LAST_SUFFIX_OF_ENTITY.get(state.uuid()); if (baseEntitySuffix != -1 && variantMap.containsKey(baseEntitySuffix)) { return baseEntitySuffix; } else { diff --git a/src/main/java/traben/entity_texture_features/mixin/mixins/MixinGameRenderer.java b/src/main/java/traben/entity_texture_features/mixin/mixins/MixinGameRenderer.java new file mode 100644 index 00000000..6de3e166 --- /dev/null +++ b/src/main/java/traben/entity_texture_features/mixin/mixins/MixinGameRenderer.java @@ -0,0 +1,19 @@ +package traben.entity_texture_features.mixin.mixins; + + +import net.minecraft.client.renderer.GameRenderer; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import traben.entity_texture_features.features.state.ETFState; + +@Mixin(GameRenderer.class) +public class MixinGameRenderer { + + @Inject(method = "render", + at = @At(value = "HEAD")) + private void emf$injectCounter(final CallbackInfo ci) { + ETFState.stackVerifyEmpty(); + } +} \ No newline at end of file diff --git a/src/main/java/traben/entity_texture_features/mixin/mixins/MixinLevelRenderer.java b/src/main/java/traben/entity_texture_features/mixin/mixins/MixinLevelRenderer.java new file mode 100644 index 00000000..cc492997 --- /dev/null +++ b/src/main/java/traben/entity_texture_features/mixin/mixins/MixinLevelRenderer.java @@ -0,0 +1,37 @@ +package traben.entity_texture_features.mixin.mixins; + + +import net.minecraft.client.renderer.LevelRenderer; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import traben.entity_texture_features.features.state.ETFState; + +@Mixin(LevelRenderer.class) +public class MixinLevelRenderer { + //#if MC >= 1.21.9 + @Inject(method = { "submitEntities" , "submitBlockEntities" }, at = @At(value = "INVOKE", target = "Ljava/util/Iterator;next()Ljava/lang/Object;")) + //#elseif MC >= 1.21.2 + //$$ @Inject(method = { "renderEntities" , "renderBlockEntities" }, at = @At(value = "INVOKE", target = "Ljava/util/Iterator;next()Ljava/lang/Object;")) + //#else + //$$ @Inject(method = "renderLevel", at = @At(value = "INVOKE", target = "Ljava/util/Iterator;next()Ljava/lang/Object;"), slice = + //$$ @org.spongepowered.asm.mixin.injection.Slice(from = @At(value = "CONSTANT", args = "stringValue=entities"), to = @At(value = "CONSTANT", args = "stringValue=destroyProgress"))) + //#endif + private void emf$verify(final CallbackInfo ci) { + // These are the top level, stack should be clean + ETFState.stackVerifyEmpty(); + } + + //#if MC >= 1.21.9 + @Inject(method = { "submitEntities" , "submitBlockEntities" }, at = @At(value = "TAIL")) + //#elseif MC >= 1.21.2 + //$$ @Inject(method = { "renderEntities" , "renderBlockEntities" }, at = @At(value = "TAIL")) + //#else + //$$ @Inject(method = "renderLevel", at = @At(value = "CONSTANT", args = "stringValue=destroyProgress")) + //#endif + private void emf$verifyEnd(final CallbackInfo ci) { + // These are the top level, stack should be clean + ETFState.stackVerifyEmpty(); + } +} \ No newline at end of file diff --git a/src/main/java/traben/entity_texture_features/mixin/mixins/MixinModelPart.java b/src/main/java/traben/entity_texture_features/mixin/mixins/MixinModelPart.java index a77cf051..e96e234d 100644 --- a/src/main/java/traben/entity_texture_features/mixin/mixins/MixinModelPart.java +++ b/src/main/java/traben/entity_texture_features/mixin/mixins/MixinModelPart.java @@ -12,8 +12,8 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.ModifyVariable; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import traben.entity_texture_features.features.state.ETFState; import traben.entity_texture_features.mixin.mixins.mods.sodium.MixinModelPartSodium; -import traben.entity_texture_features.features.ETFRenderContext; import traben.entity_texture_features.features.texture_handlers.ETFTexture; import traben.entity_texture_features.utils.ETFUtils2; import traben.entity_texture_features.utils.ETFVertexConsumer; @@ -48,7 +48,7 @@ public abstract class MixinModelPart { @Inject(method = "render(Lcom/mojang/blaze3d/vertex/PoseStack;Lcom/mojang/blaze3d/vertex/VertexConsumer;III)V",at = @At(value = "HEAD")) private void etf$findOutIfInitialModelPart(final PoseStack poseStack, final VertexConsumer vertexConsumer, final int i, final int j, final int k, final CallbackInfo ci) { //#endif - ETFRenderContext.incrementCurrentModelPartDepth(); + ETFState.currentModelPartDepth++; } //#if MC < 12100 @@ -59,11 +59,11 @@ public abstract class MixinModelPart { private void etf$doEmissiveIfInitialPart(final PoseStack matrices, final VertexConsumer vertices, final int light, final int overlay, final int k, final CallbackInfo ci) { //#endif //run code if this is the initial topmost rendered part - if (ETFRenderContext.getCurrentModelPartDepth() > 1) { - ETFRenderContext.decrementCurrentModelPartDepth(); + if (ETFState.currentModelPartDepth > 1) { + ETFState.currentModelPartDepth--; } else { //top level model so try special rendering - if (ETFRenderContext.isCurrentlyRenderingEntity() && + if (ETFState.isStateActive() && vertices instanceof ETFVertexConsumer etfVertexConsumer) { ETFTexture texture = etfVertexConsumer.etf$getETFTexture(); //is etf texture not null and does it special render? @@ -96,7 +96,7 @@ public abstract class MixinModelPart { } } //ensure model count is reset - ETFRenderContext.resetCurrentModelPartDepth(); + ETFState.currentModelPartDepth = 0; } } //#if MC >= 12100 diff --git a/src/main/java/traben/entity_texture_features/mixin/mixins/MixinSpriteIdentifier.java b/src/main/java/traben/entity_texture_features/mixin/mixins/MixinSpriteIdentifier.java index 2a0804be..2a19d263 100644 --- a/src/main/java/traben/entity_texture_features/mixin/mixins/MixinSpriteIdentifier.java +++ b/src/main/java/traben/entity_texture_features/mixin/mixins/MixinSpriteIdentifier.java @@ -6,7 +6,7 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import traben.entity_texture_features.features.ETFManager; -import traben.entity_texture_features.features.ETFRenderContext; +import traben.entity_texture_features.features.state.ETFState; import traben.entity_texture_features.features.texture_handlers.ETFTexture; import com.mojang.blaze3d.vertex.VertexConsumer; @@ -54,13 +54,13 @@ public class MixinSpriteIdentifier { } - ETFTexture texture = ETFManager.getInstance().getETFTextureVariant(actualTexture, ETFRenderContext.getCurrentEntityState()); + ETFTexture texture = ETFManager.getInstance().getETFTextureVariant(actualTexture, ETFState.state()); //if texture is emissive or a variant then replace with a non sprite vertex consumer like regular entities if (!actualTexture.equals(texture.thisIdentifier) || texture.isEmissive() || texture.isEnchanted()) { - ETFRenderContext.preventRenderLayerTextureModify(); + ETFState.pushRenderLayerModifyState(false); RenderType layer = layerFactory.apply(texture.thisIdentifier); - ETFRenderContext.allowRenderLayerTextureModify(); + ETFState.popRenderLayerModifyState(); if (layer != null) { VertexConsumer consumer = vertexConsumers.getBuffer(layer); //noinspection ConstantValue diff --git a/src/main/java/traben/entity_texture_features/mixin/mixins/MixinVertexConsumerProvider$Immediate.java b/src/main/java/traben/entity_texture_features/mixin/mixins/MixinVertexConsumerProvider$Immediate.java index 97df45f6..f2e23b81 100644 --- a/src/main/java/traben/entity_texture_features/mixin/mixins/MixinVertexConsumerProvider$Immediate.java +++ b/src/main/java/traben/entity_texture_features/mixin/mixins/MixinVertexConsumerProvider$Immediate.java @@ -10,7 +10,7 @@ //$$ import org.spongepowered.asm.mixin.injection.ModifyVariable; //$$ import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; //$$ import traben.entity_texture_features.compat.SodiumGetBufferInjector; -//$$ import traben.entity_texture_features.features.ETFRenderContext; +//$$ import traben.entity_texture_features.features.state.ETFState; //$$ import traben.entity_texture_features.utils.URenderTypeToVertexConsumer; //$$ //$$ @Mixin(value = RenderTypeFeatureRenderer.class, priority = 800) @@ -22,7 +22,7 @@ //$$ at = @At(value = "HEAD"), //$$ index = 1, argsOnly = true) //$$ private RenderType etf$modifyRenderLayer(RenderType value) { -//$$ return ETFRenderContext.modifyRenderLayerIfRequired(value); +//$$ return ETFState.modifyRenderLayerIfRequired(value); //$$ } //$$ //$$ @@ -32,7 +32,7 @@ //$$ private void etf$injectIntoGetBufferReturn(RenderType renderLayer, CallbackInfoReturnable cir) { //$$ var returned = cir.getReturnValue(); //$$ var uSource = new URenderTypeToVertexConsumer((RenderTypeFeatureRenderer) (Object) this); -//$$ ETFRenderContext.insertETFDataIntoVertexConsumer(uSource, renderLayer, returned); +//$$ ETFState.insertETFDataIntoVertexConsumer(uSource, renderLayer, returned); //$$ //quarantined class to contain all sodium interaction //$$ //sodium ExtendedBufferBuilder classes contain a delegate that must instead have the above data passed into //$$ SodiumGetBufferInjector.inject(uSource, renderLayer, returned); @@ -49,7 +49,7 @@ import org.spongepowered.asm.mixin.injection.ModifyVariable; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import traben.entity_texture_features.compat.SodiumGetBufferInjector; -import traben.entity_texture_features.features.ETFRenderContext; +import traben.entity_texture_features.features.state.ETFState; import traben.entity_texture_features.utils.URenderTypeToVertexConsumer; @Mixin(value = MultiBufferSource.BufferSource.class, priority = 800) @@ -61,7 +61,7 @@ public class MixinVertexConsumerProvider$Immediate { at = @At(value = "HEAD"), index = 1, argsOnly = true) private RenderType etf$modifyRenderLayer(RenderType value) { - return ETFRenderContext.modifyRenderLayerIfRequired(value); + return ETFState.modifyRenderLayerIfRequired(value); } @@ -70,7 +70,7 @@ public class MixinVertexConsumerProvider$Immediate { at = @At(value = "RETURN")) private void etf$injectIntoGetBufferReturn(RenderType renderLayer, CallbackInfoReturnable cir) { var returned = cir.getReturnValue(); - ETFRenderContext.insertETFDataIntoVertexConsumer(new URenderTypeToVertexConsumer((MultiBufferSource) this), renderLayer, returned); + ETFState.insertETFDataIntoVertexConsumer(new URenderTypeToVertexConsumer((MultiBufferSource) this), renderLayer, returned); //quarantined class to contain all sodium interaction //sodium ExtendedBufferBuilder classes contain a delegate that must instead have the above data passed into SodiumGetBufferInjector.inject(new URenderTypeToVertexConsumer((MultiBufferSource) this), renderLayer, returned); diff --git a/src/main/java/traben/entity_texture_features/mixin/mixins/entity/block/MixinSkullBlockEntityRenderer.java b/src/main/java/traben/entity_texture_features/mixin/mixins/entity/block/MixinSkullBlockEntityRenderer.java index d84c6943..3a55299b 100644 --- a/src/main/java/traben/entity_texture_features/mixin/mixins/entity/block/MixinSkullBlockEntityRenderer.java +++ b/src/main/java/traben/entity_texture_features/mixin/mixins/entity/block/MixinSkullBlockEntityRenderer.java @@ -27,10 +27,10 @@ public abstract class MixinSkullBlockEntityRenderer { } // TODO 1.21.9 support //$$ import org.spongepowered.asm.mixin.injection.callback.LocalCapture; //$$ import traben.entity_texture_features.ETF; //$$ import traben.entity_texture_features.features.ETFManager; -//$$ import traben.entity_texture_features.features.ETFRenderContext; //$$ import traben.entity_texture_features.features.player.ETFPlayerEntity; //$$ import traben.entity_texture_features.features.player.ETFPlayerFeatureRenderer; //$$ import traben.entity_texture_features.features.player.ETFPlayerTexture; +//$$ import traben.entity_texture_features.features.state.ETFState; //$$ //$$ @Mixin(SkullBlockRenderer.class) //$$ public abstract class MixinSkullBlockEntityRenderer implements BlockEntityRenderer { @@ -48,14 +48,15 @@ public abstract class MixinSkullBlockEntityRenderer { } // TODO 1.21.9 support //$$ @Inject(method = RENDER_METHOD, //$$ at = @At(value = "HEAD")) //$$ private void etf$markNotToChange(CallbackInfo ci) { -//$$ ETFRenderContext.allowTexturePatching(); +//$$ ETFState.pushRenderLayerModifyState(true); +//$$ ETFState.allowTexturePatching = true; //$$ } //$$ //$$ @Inject(method = RENDER_METHOD, //$$ at = @At(value = "RETURN")) //$$ private void etf$markAllowedToChange(CallbackInfo ci) { -//$$ ETFRenderContext.allowRenderLayerTextureModify(); -//$$ ETFRenderContext.preventTexturePatching(); +//$$ ETFState.popRenderLayerModifyState(); +//$$ ETFState.allowTexturePatching = false; //$$ } //$$ //#if MC >= 12105 @@ -92,7 +93,8 @@ public abstract class MixinSkullBlockEntityRenderer { } // TODO 1.21.9 support //$$ //$$ entity_texture_features$thisETFPlayerTexture = ETFManager.getInstance().getPlayerTexture((ETFPlayerEntity) skullBlockEntity, identifier); //$$ if (entity_texture_features$thisETFPlayerTexture != null) { -//$$ ETFRenderContext.preventRenderLayerTextureModify(); +//$$ ETFState.popRenderLayerModifyState(); +//$$ ETFState.pushRenderLayerModifyState(false); //$$ } //$$ } //$$ } diff --git a/src/main/java/traben/entity_texture_features/mixin/mixins/entity/misc/MixinBlockEntity.java b/src/main/java/traben/entity_texture_features/mixin/mixins/entity/misc/MixinBlockEntity.java index 248a7f11..c2c1ec8b 100644 --- a/src/main/java/traben/entity_texture_features/mixin/mixins/entity/misc/MixinBlockEntity.java +++ b/src/main/java/traben/entity_texture_features/mixin/mixins/entity/misc/MixinBlockEntity.java @@ -26,13 +26,14 @@ import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.Unique; import traben.entity_texture_features.ETFApi; -import traben.entity_texture_features.features.ETFRenderContext; +import traben.entity_texture_features.features.state.ETFState; import traben.entity_texture_features.utils.ETFEntity; import traben.entity_texture_features.utils.ETFUtils2; import java.util.UUID; import static traben.entity_texture_features.ETFApi.getBlockEntityTypeToTranslationKey; +import static traben.entity_texture_features.features.property_reading.properties.optifine_properties.NBTProperty.INTENTIONAL_FAILURE; @Mixin(BlockEntity.class) public abstract class MixinBlockEntity implements ETFEntity { @@ -110,15 +111,17 @@ public abstract class MixinBlockEntity implements ETFEntity { @Override public CompoundTag etf$getNbt() { + var state = ETFState.state(); + if (state == null) return INTENTIONAL_FAILURE; //#if MC>=12106 - return ETFRenderContext.cacheEntityNBTForFrame(etf$getUuid(), + return state.cacheEntityNBTForState(etf$getUuid(), ()->{ TagValueOutput compound = TagValueOutput.createWithoutContext(ProblemReporter.DISCARDING); saveMetadata(compound); return compound.buildResult(); }); //#else - //$$ return ETFRenderContext.cacheEntityNBTForFrame(etf$getUuid(), + //$$ return state.cacheEntityNBTForState(etf$getUuid(), //$$ ()->{ //$$ CompoundTag compound = new CompoundTag(); //$$ saveMetadata(compound); diff --git a/src/main/java/traben/entity_texture_features/mixin/mixins/entity/misc/MixinBlockEntityRenderDispatcher.java b/src/main/java/traben/entity_texture_features/mixin/mixins/entity/misc/MixinBlockEntityRenderDispatcher.java index 98c01366..031d5106 100644 --- a/src/main/java/traben/entity_texture_features/mixin/mixins/entity/misc/MixinBlockEntityRenderDispatcher.java +++ b/src/main/java/traben/entity_texture_features/mixin/mixins/entity/misc/MixinBlockEntityRenderDispatcher.java @@ -1,6 +1,8 @@ package traben.entity_texture_features.mixin.mixins.entity.misc; import com.llamalad7.mixinextras.sugar.Local; +import com.llamalad7.mixinextras.sugar.Share; +import com.llamalad7.mixinextras.sugar.ref.LocalRef; import com.mojang.blaze3d.vertex.PoseStack; import net.minecraft.client.renderer.blockentity.BlockEntityRenderDispatcher; import net.minecraft.client.renderer.blockentity.BlockEntityRenderer; @@ -8,14 +10,15 @@ import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.phys.Vec3; import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.ModifyArg; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import traben.entity_texture_features.ETF; -import traben.entity_texture_features.features.ETFRenderContext; import traben.entity_texture_features.features.state.ETFEntityRenderState; +import traben.entity_texture_features.features.state.ETFState; import traben.entity_texture_features.features.state.HoldsETFRenderState; import traben.entity_texture_features.utils.ETFEntity; //#if MC >= 12109 @@ -36,24 +39,31 @@ public class MixinBlockEntityRenderDispatcher { @Inject(method = RENDER_METHOD, at = @At(value = "HEAD")) //#if MC >= 12109 - private static void etf$grabContext(final CallbackInfo ci, @Local(argsOnly = true) S state) { + private static void etf$grabContext(final CallbackInfo ci, @Local(argsOnly = true) S state, @Share("state_etf") LocalRef stateRef) { //#elseif MC >= 12104 - //$$ private static void etf$grabContext(final CallbackInfo ci, @Local(argsOnly = true) T blockEntity) { + //$$ private static void etf$grabContext(final CallbackInfo ci, @Local(argsOnly = true) T blockEntity, @Share("state_etf") LocalRef stateRef) { //#else - //$$ private static void etf$grabContext(final CallbackInfo ci, @Local(argsOnly = true) BlockEntity blockEntity) { + //$$ private static void etf$grabContext(final CallbackInfo ci, @Local(argsOnly = true) BlockEntity blockEntity, @Share("state_etf") LocalRef stateRef) { //#endif //#if MC >= 12109 - ETFRenderContext.setCurrentEntity(((HoldsETFRenderState) state).etf$getState()); + var etf = ((HoldsETFRenderState) state).etf$getState(); //#else - //$$ ETFRenderContext.setCurrentEntity(ETFEntityRenderState.forEntity((ETFEntity) blockEntity)); + //$$ var etf = ETFEntityRenderState.forEntity((ETFEntity) blockEntity); //#endif - + if (etf != null) { + ETFState.mount(etf); + } + stateRef.set(etf); } @Inject(method = RENDER_METHOD, at = @At(value = "RETURN")) - private static void etf$clearContext(CallbackInfo ci) { - ETFRenderContext.reset(); + private static void etf$clearContext(CallbackInfo ci, @Share("state_etf") LocalRef stateRef) { + if (stateRef.get() != null) { + ETFState.stackVerify(stateRef.get()); + ETFState.unMount(); + } + } //#if MC < 12109 diff --git a/src/main/java/traben/entity_texture_features/mixin/mixins/entity/misc/MixinBlockEntityRenderState.java b/src/main/java/traben/entity_texture_features/mixin/mixins/entity/misc/MixinBlockEntityRenderState.java index a7c7a473..a43d712b 100644 --- a/src/main/java/traben/entity_texture_features/mixin/mixins/entity/misc/MixinBlockEntityRenderState.java +++ b/src/main/java/traben/entity_texture_features/mixin/mixins/entity/misc/MixinBlockEntityRenderState.java @@ -15,8 +15,8 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import traben.entity_texture_features.ETF; -import traben.entity_texture_features.features.ETFRenderContext; import traben.entity_texture_features.features.state.ETFEntityRenderState; +import traben.entity_texture_features.features.state.ETFState; import traben.entity_texture_features.features.state.HoldsETFRenderState; import traben.entity_texture_features.utils.ETFEntity; @@ -43,7 +43,6 @@ public class MixinBlockEntityRenderState implements HoldsETFRenderState { private static void etf$createRenderState(final BlockEntity blockEntity, final BlockEntityRenderState blockEntityRenderState, final ModelFeatureRenderer.CrumblingOverlay crumblingOverlay, final CallbackInfo ci) { var holder = (HoldsETFRenderState) blockEntityRenderState; holder.etf$initState((ETFEntity) blockEntity); - ETFRenderContext.setCurrentEntity(holder.etf$getState()); // either this or the one in the dispatcher is redundant but ill put both for now } @ModifyExpressionValue(method = "extractBase", diff --git a/src/main/java/traben/entity_texture_features/mixin/mixins/entity/misc/MixinEntity.java b/src/main/java/traben/entity_texture_features/mixin/mixins/entity/misc/MixinEntity.java index 98b3d150..b69e34b1 100644 --- a/src/main/java/traben/entity_texture_features/mixin/mixins/entity/misc/MixinEntity.java +++ b/src/main/java/traben/entity_texture_features/mixin/mixins/entity/misc/MixinEntity.java @@ -22,8 +22,8 @@ import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.Unique; -import traben.entity_texture_features.features.ETFRenderContext; import traben.entity_texture_features.features.state.ETFEntityRenderState; +import traben.entity_texture_features.features.state.ETFState; import traben.entity_texture_features.utils.ETFEntity; import java.util.ArrayList; @@ -31,6 +31,8 @@ import java.util.Map; import java.util.UUID; +import static traben.entity_texture_features.features.property_reading.properties.optifine_properties.NBTProperty.INTENTIONAL_FAILURE; + @Mixin(Entity.class) public abstract class MixinEntity implements ETFEntity { @@ -136,7 +138,9 @@ public abstract class MixinEntity implements ETFEntity { @Override public CompoundTag etf$getNbt() { - return ETFRenderContext.cacheEntityNBTForFrame(etf$getUuid(), + var state = ETFState.state(); + if (state == null) return INTENTIONAL_FAILURE; + return state.cacheEntityNBTForState(etf$getUuid(), ()-> //#if MC >= 26.2 //$$ net.minecraft.advancements.predicates.NbtPredicate diff --git a/src/main/java/traben/entity_texture_features/mixin/mixins/entity/misc/MixinEntityRenderDispatcher.java b/src/main/java/traben/entity_texture_features/mixin/mixins/entity/misc/MixinEntityRenderDispatcher.java index 0939651c..baae62f9 100644 --- a/src/main/java/traben/entity_texture_features/mixin/mixins/entity/misc/MixinEntityRenderDispatcher.java +++ b/src/main/java/traben/entity_texture_features/mixin/mixins/entity/misc/MixinEntityRenderDispatcher.java @@ -1,13 +1,15 @@ package traben.entity_texture_features.mixin.mixins.entity.misc; import com.llamalad7.mixinextras.sugar.Local; +import com.llamalad7.mixinextras.sugar.Share; +import com.llamalad7.mixinextras.sugar.ref.LocalRef; import net.minecraft.client.renderer.entity.EntityRenderDispatcher; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import traben.entity_texture_features.features.ETFRenderContext; import traben.entity_texture_features.features.state.ETFEntityRenderState; +import traben.entity_texture_features.features.state.ETFState; import traben.entity_texture_features.features.state.HoldsETFRenderState; import traben.entity_texture_features.utils.ETFEntity; @@ -24,14 +26,22 @@ public class MixinEntityRenderDispatcher { //$$ at = @At(value = "INVOKE", target = "Lcom/mojang/blaze3d/vertex/PoseStack;pushPose()V")) //#endif private - void etf$grabContext(final CallbackInfo ci, @SuppressWarnings("LocalMayBeArgsOnly") @Local S state) { - ETFRenderContext.setCurrentEntity(((HoldsETFRenderState) state).etf$getState()); + void etf$grabContext(final CallbackInfo ci, @SuppressWarnings("LocalMayBeArgsOnly") @Local S state, @Share("state_etf") LocalRef stateRef) { + var etf = ((HoldsETFRenderState) state).etf$getState(); + if (etf != null) { + ETFState.mount(etf); + } + stateRef.set(etf); } //#else //$$ @Inject(method = "render", //$$ at = @At(value = "HEAD")) - //$$ private void etf$grabContext(CallbackInfo ci, @Local(argsOnly = true) E entity) { - //$$ ETFRenderContext.setCurrentEntity(ETFEntityRenderState.forEntity((ETFEntity) entity)); + //$$ private void etf$grabContext(CallbackInfo ci, @Local(argsOnly = true) E entity, @Share("state_etf") LocalRef stateRef) { + //$$ var etf = ETFEntityRenderState.forEntity((ETFEntity) entity); + //$$ if (etf != null) { + //$$ ETFState.mount(etf); + //$$ } + //$$ stateRef.set(etf); //$$ } //#endif @@ -44,8 +54,11 @@ public class MixinEntityRenderDispatcher { //$$ "render", //#endif at = @At(value = "RETURN")) - private void etf$clearContext(CallbackInfo ci) { - ETFRenderContext.reset(); + private void etf$clearContext(CallbackInfo ci, @Share("state_etf") LocalRef stateRef) { + if (stateRef.get() != null) { + ETFState.stackVerify(stateRef.get()); + ETFState.unMount(); + } } } diff --git a/src/main/java/traben/entity_texture_features/mixin/mixins/entity/renderer/MixinEntityRenderer.java b/src/main/java/traben/entity_texture_features/mixin/mixins/entity/renderer/MixinEntityRenderer.java index 0f442ec9..f73cc2ab 100644 --- a/src/main/java/traben/entity_texture_features/mixin/mixins/entity/renderer/MixinEntityRenderer.java +++ b/src/main/java/traben/entity_texture_features/mixin/mixins/entity/renderer/MixinEntityRenderer.java @@ -14,22 +14,19 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import traben.entity_texture_features.ETF; -import traben.entity_texture_features.features.ETFRenderContext; +import traben.entity_texture_features.features.state.ETFState; import traben.entity_texture_features.features.state.HoldsETFRenderState; import traben.entity_texture_features.utils.ETFEntity; @Mixin(EntityRenderer.class) public abstract class MixinEntityRenderer= 12103 + //#if MC >= 12103 , S extends EntityRenderState> { @Inject(method = "extractRenderState", at = @At(value = "TAIL")) private void etf$createRenderState(final CallbackInfo ci, @Local(argsOnly = true) Entity entity, @Local(argsOnly = true) S state) { ((HoldsETFRenderState) state).etf$initState((ETFEntity) entity); - //#if MC >= 12109 - ETFRenderContext.setCurrentEntity(((HoldsETFRenderState) state).etf$getState()); // either this or the one in the dispatcher is redundant but ill put both for now - //#endif } //#else //$$ > { @@ -53,12 +50,12 @@ public abstract class MixinEntityRenderer= 12109 - private static final String RENDER = "submit(Lnet/minecraft/client/renderer/entity/state/IllusionerRenderState;Lcom/mojang/blaze3d/vertex/PoseStack;Lnet/minecraft/client/renderer/SubmitNodeCollector;Lnet/minecraft/client/renderer/state/CameraRenderState;)V"; - //#elseif MC >= 12103 - //$$ private static final String RENDER = "render(Lnet/minecraft/client/renderer/entity/state/IllusionerRenderState;Lcom/mojang/blaze3d/vertex/PoseStack;Lnet/minecraft/client/renderer/MultiBufferSource;I)V"; - //#else - //$$ private static final String RENDER = "render(Lnet/minecraft/world/entity/monster/Illusioner;FFLcom/mojang/blaze3d/vertex/PoseStack;Lnet/minecraft/client/renderer/MultiBufferSource;I)V"; - //#endif - - @Inject(method = RENDER, at = @At(value = "HEAD")) - private void etf$start(CallbackInfo ci - //#if MC>= 12103 - , @Local(argsOnly = true) net.minecraft.client.renderer.entity.state.IllusionerRenderState state - ) { ETFRenderContext.setCurrentEntity(((HoldsETFRenderState) state).etf$getState()); - //#else - //$$ , @Local(argsOnly = true) net.minecraft.world.entity.monster.Illusioner entity - //$$ ) { ETFRenderContext.setCurrentEntity(ETFEntityRenderState.forEntity((ETFEntity) entity)); - //#endif - } - - @Inject(method = RENDER, at = @At(value = "INVOKE", target = - //#if MC >= 12109 - "Lnet/minecraft/client/renderer/entity/IllagerRenderer;submit(Lnet/minecraft/client/renderer/entity/state/LivingEntityRenderState;Lcom/mojang/blaze3d/vertex/PoseStack;Lnet/minecraft/client/renderer/SubmitNodeCollector;Lnet/minecraft/client/renderer/state/CameraRenderState;)V" - //#elseif MC >= 12103 - //$$ "Lnet/minecraft/client/renderer/entity/IllagerRenderer;render(Lnet/minecraft/client/renderer/entity/state/LivingEntityRenderState;Lcom/mojang/blaze3d/vertex/PoseStack;Lnet/minecraft/client/renderer/MultiBufferSource;I)V" - //#elseif MC >= 12100 - //$$ "Lnet/minecraft/client/renderer/entity/IllagerRenderer;render(Lnet/minecraft/world/entity/LivingEntity;FFLcom/mojang/blaze3d/vertex/PoseStack;Lnet/minecraft/client/renderer/MultiBufferSource;I)V" - //#else - //$$ "Lnet/minecraft/client/renderer/entity/IllagerRenderer;render(Lnet/minecraft/world/entity/Mob;FFLcom/mojang/blaze3d/vertex/PoseStack;Lnet/minecraft/client/renderer/MultiBufferSource;I)V" - //#endif - )) - private void etf$loop(CallbackInfo ci) { - //assert main entity each loop - ETFRenderContext.setCurrentEntity(etf$heldEntity); - ETFRenderContext.allowRenderLayerTextureModify(); - ETFRenderContext.endSpecialRenderOverlayPhase(); - } +//TODO still needed with ETFState? +// @Unique +// private ETFEntityRenderState etf$heldEntity = null; +// +// //#if MC >= 12109 +// private static final String RENDER = "submit(Lnet/minecraft/client/renderer/entity/state/IllusionerRenderState;Lcom/mojang/blaze3d/vertex/PoseStack;Lnet/minecraft/client/renderer/SubmitNodeCollector;Lnet/minecraft/client/renderer/state/CameraRenderState;)V"; +// //#elseif MC >= 12103 +// //$$ private static final String RENDER = "render(Lnet/minecraft/client/renderer/entity/state/IllusionerRenderState;Lcom/mojang/blaze3d/vertex/PoseStack;Lnet/minecraft/client/renderer/MultiBufferSource;I)V"; +// //#else +// //$$ private static final String RENDER = "render(Lnet/minecraft/world/entity/monster/Illusioner;FFLcom/mojang/blaze3d/vertex/PoseStack;Lnet/minecraft/client/renderer/MultiBufferSource;I)V"; +// //#endif +// +// @Inject(method = RENDER, at = @At(value = "HEAD")) +// private void etf$start(CallbackInfo ci +// //#if MC>= 12103 +// , @Local(argsOnly = true) net.minecraft.client.renderer.entity.state.IllusionerRenderState state +// ) { ETFState.mount(((HoldsETFRenderState) state).etf$getState()); +// //#else +// //$$ , @Local(argsOnly = true) net.minecraft.world.entity.monster.Illusioner entity +// //$$ ) { ETFState.mount(ETFEntityRenderState.forEntity((ETFEntity) entity)); +// //#endif +// } +// +// @Inject(method = RENDER, at = @At(value = "INVOKE", target = +// //#if MC >= 12109 +// "Lnet/minecraft/client/renderer/entity/IllagerRenderer;submit(Lnet/minecraft/client/renderer/entity/state/LivingEntityRenderState;Lcom/mojang/blaze3d/vertex/PoseStack;Lnet/minecraft/client/renderer/SubmitNodeCollector;Lnet/minecraft/client/renderer/state/CameraRenderState;)V" +// //#elseif MC >= 12103 +// //$$ "Lnet/minecraft/client/renderer/entity/IllagerRenderer;render(Lnet/minecraft/client/renderer/entity/state/LivingEntityRenderState;Lcom/mojang/blaze3d/vertex/PoseStack;Lnet/minecraft/client/renderer/MultiBufferSource;I)V" +// //#elseif MC >= 12100 +// //$$ "Lnet/minecraft/client/renderer/entity/IllagerRenderer;render(Lnet/minecraft/world/entity/LivingEntity;FFLcom/mojang/blaze3d/vertex/PoseStack;Lnet/minecraft/client/renderer/MultiBufferSource;I)V" +// //#else +// //$$ "Lnet/minecraft/client/renderer/entity/IllagerRenderer;render(Lnet/minecraft/world/entity/Mob;FFLcom/mojang/blaze3d/vertex/PoseStack;Lnet/minecraft/client/renderer/MultiBufferSource;I)V" +// //#endif +// )) +// private void etf$loop(CallbackInfo ci) { +// //assert main entity each loop +// ETFRenderContext.setCurrentEntity(etf$heldEntity); +// ETFRenderContext.allowRenderLayerTextureModify(); +// ETFRenderContext.endSpecialRenderOverlayPhase(); +// } } diff --git a/src/main/java/traben/entity_texture_features/mixin/mixins/entity/renderer/MixinLivingEntityRenderer.java b/src/main/java/traben/entity_texture_features/mixin/mixins/entity/renderer/MixinLivingEntityRenderer.java index 9841378e..e64676e6 100644 --- a/src/main/java/traben/entity_texture_features/mixin/mixins/entity/renderer/MixinLivingEntityRenderer.java +++ b/src/main/java/traben/entity_texture_features/mixin/mixins/entity/renderer/MixinLivingEntityRenderer.java @@ -9,13 +9,14 @@ import net.minecraft.client.renderer.entity.EntityRendererProvider; import net.minecraft.client.renderer.entity.LivingEntityRenderer; import net.minecraft.world.entity.LivingEntity; +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 traben.entity_texture_features.features.ETFRenderContext; import traben.entity_texture_features.features.state.ETFEntityRenderState; +import traben.entity_texture_features.features.state.ETFState; import traben.entity_texture_features.features.state.HoldsETFRenderState; import traben.entity_texture_features.utils.ETFEntity; @@ -45,7 +46,7 @@ protected MixinLivingEntityRenderer(EntityRendererProvider.Context ctx) { //#endif @Inject(method = RENDER, at = @At(value = "INVOKE", target = "Ljava/util/List;iterator()Ljava/util/Iterator;")) - private void etf$markFeatures(CallbackInfo ci, @Share("shareState") LocalRef etf$heldEntity + private void etf$markFeatures(CallbackInfo ci, @Share("shareState") LocalRef<@Nullable ETFEntityRenderState> etf$heldEntity //#if MC>= 12103 , @Local(argsOnly = true) net.minecraft.client.renderer.entity.state.LivingEntityRenderState state ) { etf$heldEntity.set(((HoldsETFRenderState) state).etf$getState()); @@ -53,21 +54,21 @@ protected MixinLivingEntityRenderer(EntityRendererProvider.Context ctx) { //$$ , @Local(argsOnly = true) net.minecraft.world.entity.LivingEntity entity //$$ ) { etf$heldEntity.set(ETFEntityRenderState.forEntity((ETFEntity) entity)); //#endif - ETFRenderContext.allowRenderLayerTextureModify(); - ETFRenderContext.setRenderingFeatures(true); + ETFState.pushRenderLayerModifyState(true); + ETFState.isRenderingFeatures = true; } - @Inject(method = RENDER, at = @At(value = "INVOKE", target = "Ljava/util/Iterator;next()Ljava/lang/Object;")) - private void etf$markFeaturesLoopEnd(CallbackInfo ci, @Share("shareState") LocalRef etf$heldEntity) { - // assert main entity each loop in case of other entities within feature renderer - ETFRenderContext.setCurrentEntity(etf$heldEntity.get()); - ETFRenderContext.allowRenderLayerTextureModify(); - ETFRenderContext.endSpecialRenderOverlayPhase(); - } +// @Inject(method = RENDER, at = @At(value = "INVOKE", target = "Ljava/util/Iterator;next()Ljava/lang/Object;")) +// private void etf$markFeaturesLoopEnd(CallbackInfo ci, @Share("shareState") LocalRef<@Nullable ETFEntityRenderState> etf$heldEntity) { +// // assert main entity each loop in case of other entities within feature renderer +// ETFState.unMountTo(etf$heldEntity.get()); // should be redundunt now with ETFState impl but just in case +// } @Inject(method = RENDER, at = @At(value = "INVOKE", target = "Lcom/mojang/blaze3d/vertex/PoseStack;popPose()V")) - private void etf$markFeaturesEnd(CallbackInfo ci) { - ETFRenderContext.setRenderingFeatures(false); + private void etf$markFeaturesEnd(CallbackInfo ci, @Share("shareState") LocalRef<@Nullable ETFEntityRenderState> etf$heldEntity) { +// ETFState.unMountTo(etf$heldEntity.get()); + ETFState.isRenderingFeatures = false; + ETFState.popRenderLayerModifyState(); } diff --git a/src/main/java/traben/entity_texture_features/mixin/mixins/entity/renderer/MixinPaintingEntityRenderer.java b/src/main/java/traben/entity_texture_features/mixin/mixins/entity/renderer/MixinPaintingEntityRenderer.java index 0910e7e6..d60b8679 100644 --- a/src/main/java/traben/entity_texture_features/mixin/mixins/entity/renderer/MixinPaintingEntityRenderer.java +++ b/src/main/java/traben/entity_texture_features/mixin/mixins/entity/renderer/MixinPaintingEntityRenderer.java @@ -35,8 +35,8 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import traben.entity_texture_features.ETF; import traben.entity_texture_features.features.ETFManager; -import traben.entity_texture_features.features.ETFRenderContext; import traben.entity_texture_features.features.state.ETFEntityRenderState; +import traben.entity_texture_features.features.state.ETFState; import traben.entity_texture_features.features.state.HoldsETFRenderState; import traben.entity_texture_features.features.texture_handlers.ETFSprite; import traben.entity_texture_features.features.texture_handlers.ETFTexture; @@ -122,12 +122,12 @@ protected MixinPaintingEntityRenderer(EntityRendererProvider.Context ctx) { boolean aztec = "aztec".equals(paintingFileName); - if (aztec) ETFRenderContext.allowOnlyPropertiesRandom(); + if (aztec) ETFState.onlyRandomizeViaPropertiesFiles = true; ETFTexture frontTexture = ETFManager.getInstance().getETFTextureVariant(paintingTexture, etfEntity); ETFSprite etf$Sprite = frontTexture.getPaintingSprite(paintingSprite, paintingTexture); - if (aztec) ETFRenderContext.allowAllRandom(); + if (aztec) ETFState.onlyRandomizeViaPropertiesFiles = false; ETFTexture backTexture = ETFManager.getInstance().getETFTextureVariant(etf$BACK_SPRITE_ID, etfEntity); ETFSprite etf$BackSprite = backTexture.getPaintingSprite(backSprite, etf$BACK_SPRITE_ID); @@ -160,7 +160,7 @@ protected MixinPaintingEntityRenderer(EntityRendererProvider.Context ctx) { ; //#if MC>= 12109 - ETFRenderContext.preventRenderLayerTextureModify(); + ETFState.pushRenderLayerModifyState(false); var type = //#if MC>= 12111 //$$ net.minecraft.client.renderer.rendertype.RenderTypes @@ -189,7 +189,7 @@ protected MixinPaintingEntityRenderer(EntityRendererProvider.Context ctx) { RenderType //#endif .entityTranslucent(etf$BackSprite.getEmissive().atlasLocation()); - ETFRenderContext.allowRenderLayerTextureModify(); + ETFState.popRenderLayerModifyState(); submitNodeCollector.submitCustomGeometry(matrixStack, type, (pose, vertexConsumer) -> etf$renderETFPaintingFront(pose, vertexConsumer, paintingEntity, width, height, etf$Sprite.getSpriteVariant(), false)); @@ -234,7 +234,7 @@ protected MixinPaintingEntityRenderer(EntityRendererProvider.Context ctx) { //#if MC < 12109 //$$ @Unique //$$ private void etf$renderETFPainting(PoseStack.Pose entry, net.minecraft.client.renderer.MultiBufferSource vertexConsumerProvider, Painting entity, int width, int height, ETFSprite ETFPaintingSprite, ETFSprite ETFBackSprite) { - //$$ ETFRenderContext.preventRenderLayerTextureModify(); + //$$ ETFState.pushRenderLayerModifyState(false); //$$ VertexConsumer vertexConsumerFront = vertexConsumerProvider.getBuffer(RenderType.entitySolid(ETFPaintingSprite.getSpriteVariant().atlasLocation())); //$$ etf$renderETFPaintingFront(entry, vertexConsumerFront, entity, width, height, ETFPaintingSprite.getSpriteVariant(), false); //$$ @@ -250,7 +250,7 @@ protected MixinPaintingEntityRenderer(EntityRendererProvider.Context ctx) { //$$ vertexConsumerFront = vertexConsumerProvider.getBuffer(RenderType.entityTranslucent(ETFBackSprite.getEmissive().atlasLocation())); //$$ etf$renderETFPaintingBack(entry, vertexConsumerFront, entity, width, height, ETFBackSprite.getEmissive(), true); //$$ } - //$$ ETFRenderContext.allowRenderLayerTextureModify(); + //$$ ETFState.popRenderLayerModifyState(); //$$ } //#endif diff --git a/src/main/java/traben/entity_texture_features/mixin/mixins/entity/renderer/MixinPlayerEntityRenderer.java b/src/main/java/traben/entity_texture_features/mixin/mixins/entity/renderer/MixinPlayerEntityRenderer.java index 1ab658aa..c183d6d4 100644 --- a/src/main/java/traben/entity_texture_features/mixin/mixins/entity/renderer/MixinPlayerEntityRenderer.java +++ b/src/main/java/traben/entity_texture_features/mixin/mixins/entity/renderer/MixinPlayerEntityRenderer.java @@ -23,10 +23,10 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import traben.entity_texture_features.ETF; import traben.entity_texture_features.features.ETFManager; -import traben.entity_texture_features.features.ETFRenderContext; import traben.entity_texture_features.features.player.ETFPlayerFeatureRenderer; import traben.entity_texture_features.features.player.ETFPlayerSkinHolder; import traben.entity_texture_features.features.player.ETFPlayerTexture; +import traben.entity_texture_features.features.state.ETFState; import traben.entity_texture_features.features.state.HoldsETFRenderState; //#if MC < 12109 @@ -130,7 +130,7 @@ public MixinPlayerEntityRenderer(EntityRendererProvider.Context ctx, //$$ if (thisETFPlayerTexture != null && thisETFPlayerTexture.hasFeatures) { //$$ ResourceLocation etfTexture = thisETFPlayerTexture.getBaseTextureIdentifierOrNullForVanilla(player); //$$ if (etfTexture != null) { - //$$ ETFRenderContext.preventRenderLayerTextureModify(); + //$$ ETFState.pushRenderLayerModifyState(false); //#if MC <= 12100 //$$ arm.xRot = 0.0F; //$$ sleeve.xRot = 0.0F; @@ -145,7 +145,7 @@ public MixinPlayerEntityRenderer(EntityRendererProvider.Context ctx, //#endif //$$ ); //$$ - //$$ ETFRenderContext.startSpecialRenderOverlayPhase(); + //$$ ETFState.startSpecialRenderOverlayPhase(); //$$ ResourceLocation emissive = thisETFPlayerTexture.getBaseTextureEmissiveIdentifierOrNullForNone(); //$$ if (emissive != null) { //$$ VertexConsumer vc2 = vertexConsumers.getBuffer(RenderType.entityTranslucent(emissive)); @@ -172,9 +172,9 @@ public MixinPlayerEntityRenderer(EntityRendererProvider.Context ctx, //#endif //$$ ); //$$ } - //$$ ETFRenderContext.endSpecialRenderOverlayPhase(); + //$$ ETFState.endSpecialRenderOverlayPhase(); //$$ - //$$ ETFRenderContext.allowRenderLayerTextureModify(); + //$$ ETFState.popRenderLayerModifyState(); //$$ //don't further render vanilla arms //$$ ci.cancel(); //$$ } diff --git a/src/main/java/traben/entity_texture_features/mixin/mixins/entity/renderer/feature/MixinElytraFeatureRenderer.java b/src/main/java/traben/entity_texture_features/mixin/mixins/entity/renderer/feature/MixinElytraFeatureRenderer.java index a3b89a08..feeadafe 100644 --- a/src/main/java/traben/entity_texture_features/mixin/mixins/entity/renderer/feature/MixinElytraFeatureRenderer.java +++ b/src/main/java/traben/entity_texture_features/mixin/mixins/entity/renderer/feature/MixinElytraFeatureRenderer.java @@ -5,9 +5,10 @@ import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import traben.entity_texture_features.features.ETFRenderContext; +import traben.entity_texture_features.features.state.ETFState; //#if MC >= 12103 import net.minecraft.client.renderer.entity.layers.WingsLayer; + @Mixin(WingsLayer.class) public abstract class MixinElytraFeatureRenderer { //#else @@ -27,7 +28,7 @@ public abstract class MixinElytraFeatureRenderer { , at = @At(value = "HEAD")) private void etf$markPatchable(CallbackInfo ci) { - ETFRenderContext.allowTexturePatching(); + ETFState.allowTexturePatching = true; } @Inject(method = @@ -41,7 +42,7 @@ public abstract class MixinElytraFeatureRenderer { , at = @At(value = "RETURN")) private void etf$markPatchableEnd(CallbackInfo ci) { - ETFRenderContext.preventTexturePatching(); + ETFState.allowTexturePatching = false; } } diff --git a/src/main/java/traben/entity_texture_features/mixin/mixins/entity/renderer/feature/MixinEyeFeatureRenderer.java b/src/main/java/traben/entity_texture_features/mixin/mixins/entity/renderer/feature/MixinEyeFeatureRenderer.java index 6a3179f7..8786e22a 100644 --- a/src/main/java/traben/entity_texture_features/mixin/mixins/entity/renderer/feature/MixinEyeFeatureRenderer.java +++ b/src/main/java/traben/entity_texture_features/mixin/mixins/entity/renderer/feature/MixinEyeFeatureRenderer.java @@ -7,10 +7,13 @@ import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.ModifyArg; -import traben.entity_texture_features.features.ETFRenderContext; +import org.spongepowered.asm.mixin.injection.ModifyVariable; +import traben.entity_texture_features.features.state.ETFState; import traben.entity_texture_features.utils.ETFRenderLayerWithTexture; import traben.entity_texture_features.utils.ETFUtils2; +import static traben.entity_texture_features.ETF.EYES_FEATURE_LIGHT_VALUE; + @Mixin(EyesLayer.class) public abstract class MixinEyeFeatureRenderer { @@ -30,8 +33,7 @@ public abstract class MixinEyeFeatureRenderer { ResourceLocation variant = ETFUtils2.getETFVariantNotNullForInjector(id); if (!id.equals(variant)) { //if there is a variant then lets send a layer with it - boolean allowed = ETFRenderContext.isAllowedToRenderLayerTextureModify(); - ETFRenderContext.preventRenderLayerTextureModify(); + ETFState.pushRenderLayerModifyState(false); RenderType layer2 = //#if MC>= 12111 @@ -41,7 +43,7 @@ public abstract class MixinEyeFeatureRenderer { //#endif .eyes(variant); - if (allowed) ETFRenderContext.allowRenderLayerTextureModify(); + ETFState.popRenderLayerModifyState(); return layer2; } @@ -50,6 +52,18 @@ public abstract class MixinEyeFeatureRenderer { return layer; } + @SuppressWarnings("SameReturnValue") + @ModifyVariable(method = + //#if MC >= 12109 + "submit" + //#else + //$$ "render" + //#endif + , at = @At(value = "HEAD"), argsOnly = true, ordinal = 0) + private int emf$markEyeLight(int i) { + return EYES_FEATURE_LIGHT_VALUE; + } + } diff --git a/src/main/java/traben/entity_texture_features/mixin/mixins/entity/renderer/feature/MixinShoulderParrotFeatureRenderer.java b/src/main/java/traben/entity_texture_features/mixin/mixins/entity/renderer/feature/MixinShoulderParrotFeatureRenderer.java index 89b9c72c..1d956b53 100644 --- a/src/main/java/traben/entity_texture_features/mixin/mixins/entity/renderer/feature/MixinShoulderParrotFeatureRenderer.java +++ b/src/main/java/traben/entity_texture_features/mixin/mixins/entity/renderer/feature/MixinShoulderParrotFeatureRenderer.java @@ -31,8 +31,8 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.ModifyArg; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import traben.entity_texture_features.features.ETFRenderContext; import traben.entity_texture_features.features.state.ETFEntityRenderState; +import traben.entity_texture_features.features.state.ETFState; import traben.entity_texture_features.features.state.HoldsETFRenderState; import traben.entity_texture_features.utils.ETFEntity; @@ -59,11 +59,6 @@ public abstract class MixinShoulderParrotFeatureRenderer extends RenderLayer extends RenderLayer> { //#endif -//#if MC < 12109 -//$$ @Unique -//$$ private ETFEntityRenderState etf$heldEntity = null; -//#endif - //#if MC >= 12109 public MixinShoulderParrotFeatureRenderer() {super(null);} @@ -88,21 +83,19 @@ public abstract class MixinShoulderParrotFeatureRenderer extends RenderLayer= 12103 @@ -115,9 +108,11 @@ public abstract class MixinShoulderParrotFeatureRenderer extends RenderLayer> etf$alterEntity(final Consumer> action, @Local(argsOnly = true) T t, @Local CompoundTag nbtCompound) { +//$$ private Consumer> etf$alterEntity(final Consumer> action, @Local(argsOnly = true) T playerEntity, @Local CompoundTag nbtCompound) { //$$ return (v)-> { -//$$ etf$HEADalterEntity(t, nbtCompound); +//$$ if (nbtCompound != null) { +//$$ Optional optionalEntity = EntityType.create(nbtCompound, playerEntity.level()); +//$$ if (optionalEntity.isPresent() && optionalEntity.get() instanceof Parrot parrot) { +//$$ ETFState.mount(ETFEntityRenderState.forEntity((ETFEntity) parrot)); +//$$ } else { +//$$ ETFState.mountNone(); +//$$ } +//$$ } else { +//$$ ETFState.mountNone(); +//$$ } //$$ action.accept(v); -//$$ etf$TAILresetEntity(); +//$$ ETFState.unMount(); //$$ }; //$$ } //$$ -//$$ @Unique -//$$ private void etf$HEADalterEntity(T playerEntity, CompoundTag nbtCompound) { -//$$ if (nbtCompound != null) { -//$$ -//$$ etf$heldEntity = ETFRenderContext.getCurrentEntityState(); -//$$ -//$$ Optional optionalEntity = EntityType.create(nbtCompound, playerEntity.level()); -//$$ if (optionalEntity.isPresent() && optionalEntity.get() instanceof Parrot parrot) { -//$$ ETFRenderContext.setCurrentEntity(ETFEntityRenderState.forEntity((ETFEntity) parrot)); -//$$ } -//$$ } -//$$ } -//$$ -//$$ @Unique -//$$ private void etf$TAILresetEntity() { -//$$ if (etf$heldEntity != null) { -//$$ ETFRenderContext.setCurrentEntity(etf$heldEntity); -//$$ } -//$$ etf$heldEntity = null; -//$$ } -//$$ //#endif } diff --git a/src/main/java/traben/entity_texture_features/mixin/mixins/mods/imediatelyfast/MixinBatchableBufferSource.java b/src/main/java/traben/entity_texture_features/mixin/mixins/mods/imediatelyfast/MixinBatchableBufferSource.java index e2c6ea19..15fc3b43 100644 --- a/src/main/java/traben/entity_texture_features/mixin/mixins/mods/imediatelyfast/MixinBatchableBufferSource.java +++ b/src/main/java/traben/entity_texture_features/mixin/mixins/mods/imediatelyfast/MixinBatchableBufferSource.java @@ -12,7 +12,7 @@ import org.spongepowered.asm.mixin.injection.ModifyVariable; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import traben.entity_texture_features.compat.SodiumGetBufferInjector; -import traben.entity_texture_features.features.ETFRenderContext; +import traben.entity_texture_features.features.state.ETFState; import traben.entity_texture_features.utils.URenderTypeToVertexConsumer; @Pseudo @@ -24,17 +24,17 @@ public class MixinBatchableBufferSource { at = @At(value = "HEAD"), ordinal = 0, argsOnly = true, require = 0) private RenderType etf$modifyRenderLayer2(RenderType value) { - return ETFRenderContext.modifyRenderLayerIfRequired(value); + return ETFState.modifyRenderLayerIfRequired(value); } @Inject( method = "getBuffer", at = @At(value = "RETURN"), require = 0) private void etf$injectIntoGetBufferReturn(RenderType renderLayer, CallbackInfoReturnable cir) { - if (!ETFRenderContext.isCurrentlyRenderingEntity()) return; // faster cancel + if (!ETFState.isStateActive()) return; // faster cancel var returned = cir.getReturnValue(); - ETFRenderContext.insertETFDataIntoVertexConsumer(new URenderTypeToVertexConsumer((MultiBufferSource) this), renderLayer, returned); + ETFState.insertETFDataIntoVertexConsumer(new URenderTypeToVertexConsumer((MultiBufferSource) this), renderLayer, returned); //todo is this required with immedeately fast? // quarantined class to contain all sodium interaction diff --git a/src/main/java/traben/entity_texture_features/mixin/mixins/mods/iris/MixinFullyBufferedMultiBufferSource.java b/src/main/java/traben/entity_texture_features/mixin/mixins/mods/iris/MixinFullyBufferedMultiBufferSource.java index 41434b93..74ad5e7e 100644 --- a/src/main/java/traben/entity_texture_features/mixin/mixins/mods/iris/MixinFullyBufferedMultiBufferSource.java +++ b/src/main/java/traben/entity_texture_features/mixin/mixins/mods/iris/MixinFullyBufferedMultiBufferSource.java @@ -19,7 +19,7 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.ModifyVariable; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; -import traben.entity_texture_features.features.ETFRenderContext; +import traben.entity_texture_features.features.state.ETFState; import traben.entity_texture_features.utils.URenderTypeToVertexConsumer; @@ -43,7 +43,7 @@ public class MixinFullyBufferedMultiBufferSource { //#endif ) private RenderType etf$modifyRenderLayer(RenderType value) { - RenderType newLayer = ETFRenderContext.modifyRenderLayerIfRequired(value); + RenderType newLayer = ETFState.modifyRenderLayerIfRequired(value); return newLayer == null ? value : newLayer; } @@ -56,7 +56,7 @@ public class MixinFullyBufferedMultiBufferSource { //#endif ) private void etf$injectIntoGetBufferReturn(RenderType renderLayer, CallbackInfoReturnable cir) { - ETFRenderContext.insertETFDataIntoVertexConsumer( + ETFState.insertETFDataIntoVertexConsumer( new URenderTypeToVertexConsumer((MultiBufferSource) this), renderLayer, cir.getReturnValue()); diff --git a/src/main/java/traben/entity_texture_features/mixin/mixins/mods/iris/old/MixinFullyBufferedMultiBufferSource.java b/src/main/java/traben/entity_texture_features/mixin/mixins/mods/iris/old/MixinFullyBufferedMultiBufferSource.java index b5206260..179ece97 100644 --- a/src/main/java/traben/entity_texture_features/mixin/mixins/mods/iris/old/MixinFullyBufferedMultiBufferSource.java +++ b/src/main/java/traben/entity_texture_features/mixin/mixins/mods/iris/old/MixinFullyBufferedMultiBufferSource.java @@ -11,7 +11,7 @@ //$$ import org.spongepowered.asm.mixin.injection.Inject; //$$ import org.spongepowered.asm.mixin.injection.ModifyVariable; //$$ import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; -//$$ import traben.entity_texture_features.features.ETFRenderContext; +//$$ import traben.entity_texture_features.features.state.ETFState; //$$ //$$ /** //$$ * this is a copy of {@link net.minecraft.client.renderer.MultiBufferSource.BufferSource} but for iris's @@ -27,7 +27,7 @@ //$$ at = @At(value = "HEAD"), //$$ index = 1, argsOnly = true) //$$ private RenderType etf$modifyRenderLayer(RenderType value) { -//$$ RenderType newLayer = ETFRenderContext.modifyRenderLayerIfRequired(value); +//$$ RenderType newLayer = ETFState.modifyRenderLayerIfRequired(value); //$$ return newLayer == null ? value : newLayer; //$$ } //$$ @@ -35,7 +35,7 @@ //$$ method = "getBuffer", //$$ at = @At(value = "RETURN")) //$$ private void etf$injectIntoGetBufferReturn(RenderType renderLayer, CallbackInfoReturnable cir) { -//$$ ETFRenderContext.insertETFDataIntoVertexConsumer( +//$$ ETFState.insertETFDataIntoVertexConsumer( //$$ (MultiBufferSource) this, //$$ renderLayer, //$$ cir.getReturnValue()); diff --git a/src/main/java/traben/entity_texture_features/mixin/mixins/mods/skin_layers/MixinCustomizableModelPart.java b/src/main/java/traben/entity_texture_features/mixin/mixins/mods/skin_layers/MixinCustomizableModelPart.java index 00a9ab1b..5a26d6df 100644 --- a/src/main/java/traben/entity_texture_features/mixin/mixins/mods/skin_layers/MixinCustomizableModelPart.java +++ b/src/main/java/traben/entity_texture_features/mixin/mixins/mods/skin_layers/MixinCustomizableModelPart.java @@ -16,8 +16,8 @@ import org.spongepowered.asm.mixin.injection.ModifyVariable; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import traben.entity_texture_features.ETF; +import traben.entity_texture_features.features.state.ETFState; import traben.entity_texture_features.mixin.mixins.MixinModelPart; -import traben.entity_texture_features.features.ETFRenderContext; import traben.entity_texture_features.features.texture_handlers.ETFTexture; import traben.entity_texture_features.utils.ETFUtils2; import traben.entity_texture_features.utils.ETFVertexConsumer; @@ -54,7 +54,7 @@ public abstract class MixinCustomizableModelPart { ) private void etf$findOutIfInitialModelPart(CallbackInfo ci) { if (ETF.config().getConfig().use3DSkinLayerPatch) { - ETFRenderContext.incrementCurrentModelPartDepth(); + ETFState.currentModelPartDepth++; } } @@ -93,10 +93,10 @@ public abstract class MixinCustomizableModelPart { ) { if (ETF.config().getConfig().use3DSkinLayerPatch) { //run code if this is the initial topmost rendered part - if (ETFRenderContext.getCurrentModelPartDepth() != 1) { - ETFRenderContext.decrementCurrentModelPartDepth(); + if (ETFState.currentModelPartDepth != 1) { + ETFState.currentModelPartDepth--; } else { - if (ETFRenderContext.isCurrentlyRenderingEntity() + if (ETFState.isStateActive() && vertexConsumer instanceof ETFVertexConsumer etfVertexConsumer) { ETFTexture texture = etfVertexConsumer.etf$getETFTexture(); if (texture != null && (texture.isEmissive() || texture.isEnchanted())) { @@ -122,7 +122,7 @@ public abstract class MixinCustomizableModelPart { } } //ensure model count is reset - ETFRenderContext.resetCurrentModelPartDepth(); + ETFState.currentModelPartDepth = 0; } } } diff --git a/src/main/java/traben/entity_texture_features/mixin/mixins/mods/sodium/MixinModelPartSodium.java b/src/main/java/traben/entity_texture_features/mixin/mixins/mods/sodium/MixinModelPartSodium.java index cdfac4e0..9a0e952b 100644 --- a/src/main/java/traben/entity_texture_features/mixin/mixins/mods/sodium/MixinModelPartSodium.java +++ b/src/main/java/traben/entity_texture_features/mixin/mixins/mods/sodium/MixinModelPartSodium.java @@ -23,7 +23,7 @@ public abstract class MixinModelPartSodium { } //$$ import org.spongepowered.asm.mixin.injection.Inject; //$$ import org.spongepowered.asm.mixin.injection.ModifyVariable; //$$ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -//$$ import traben.entity_texture_features.features.ETFRenderContext; +//$$ import traben.entity_texture_features.features.state.ETFState; //$$ import traben.entity_texture_features.features.texture_handlers.ETFTexture; //$$ import traben.entity_texture_features.mixin.mixins.MixinModelPart; //$$ import traben.entity_texture_features.utils.ETFUtils2; @@ -51,7 +51,7 @@ public abstract class MixinModelPartSodium { } //$$ @Inject(method = "render", //$$ at = @At(value = "HEAD")) //$$ private static void etf$findOutIfInitialModelPart(PoseStack matrixStack, VertexBufferWriter writer, ModelPart part, int light, int overlay, int color, CallbackInfo ci) { -//$$ ETFRenderContext.incrementCurrentModelPartDepth(); +//$$ ETFState.currentModelPartDepth++; //$$ } //$$ //$$ @Unique @@ -75,10 +75,10 @@ public abstract class MixinModelPartSodium { } //$$ at = @At(value = "RETURN")) //$$ private static void etf$doEmissiveIfInitialPart(PoseStack matrixStack, VertexBufferWriter writer, ModelPart part, int light, int overlay, int color, CallbackInfo ci) { //$$ //run code if this is the initial topmost rendered part -//$$ if (ETFRenderContext.getCurrentModelPartDepth() > 1) { -//$$ ETFRenderContext.decrementCurrentModelPartDepth(); +//$$ if (ETFState.currentModelPartDepth > 1) { +//$$ ETFState.currentModelPartDepth--; //$$ } else { -//$$ if (ETFRenderContext.isCurrentlyRenderingEntity() +//$$ if (ETFState.isStateActive() //$$ && writer instanceof ETFVertexConsumer etfVertexConsumer) { //$$ ETFTexture texture = etfVertexConsumer.etf$getETFTexture(); //$$ if (texture != null && (texture.isEmissive() || texture.isEnchanted())) { @@ -105,7 +105,7 @@ public abstract class MixinModelPartSodium { } //$$ } //$$ } //$$ //ensure model count is reset -//$$ ETFRenderContext.resetCurrentModelPartDepth(); +//$$ ETFState.currentModelPartDepth = 0; //$$ } //$$ } //$$ //todo check the 1.21 stuff is needed for sodium diff --git a/src/main/java/traben/entity_texture_features/mixin/mixins/submit/Mixin_GuiEntityRenderer.java b/src/main/java/traben/entity_texture_features/mixin/mixins/submit/Mixin_GuiEntityRenderer.java new file mode 100644 index 00000000..15ce0556 --- /dev/null +++ b/src/main/java/traben/entity_texture_features/mixin/mixins/submit/Mixin_GuiEntityRenderer.java @@ -0,0 +1,84 @@ +package traben.entity_texture_features.mixin.mixins.submit; + +import org.spongepowered.asm.mixin.Mixin; + +//#if MC >= 12109 +import net.minecraft.client.gui.render.pip.GuiEntityRenderer; +import net.minecraft.client.gui.render.state.pip.GuiEntityRenderState; +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 traben.entity_texture_features.ETF; +import traben.entity_texture_features.features.state.ETFState; +import traben.entity_texture_features.features.state.HoldsETFRenderState; +import com.llamalad7.mixinextras.sugar.Local; + +//#if MC >= 26.2 +//$$ @Mixin(net.minecraft.client.gui.render.pip.PictureInPictureRenderer.class) +//#else +@Mixin(GuiEntityRenderer.class) +//#endif +public class Mixin_GuiEntityRenderer { + + //#if MC >= 26.2 + //$$ @Inject(method = "prepare", + //$$ at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/feature/FeatureRenderDispatcher;renderAllFeatures(Lnet/minecraft/client/renderer/SubmitNodeStorage;)V")) + //$$ private void emf$initRender2(final CallbackInfo ci, @Local(argsOnly = true) T guiEntityRenderState) { + //$$ // things get reset by the render dispatcher, re-assert before the actual render + //$$ if (guiEntityRenderState instanceof GuiEntityRenderState gui) { + //$$ assertEmfState(gui); + //$$ } + //$$ } + //$$ + //$$ @Inject(method = "prepare", at = @At(value = "TAIL")) + //$$ private void emf$endRender(final CallbackInfo ci, @Local(argsOnly = true) T guiEntityRenderState) { + //$$ if (guiEntityRenderState instanceof GuiEntityRenderState gui) { + //$$ end(gui); + //$$ } + //$$ } + //#else + @Inject(method = "renderToTexture(Lnet/minecraft/client/gui/render/state/pip/GuiEntityRenderState;Lcom/mojang/blaze3d/vertex/PoseStack;)V", + at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/feature/FeatureRenderDispatcher;renderAllFeatures()V")) + private void emf$initRender2(final CallbackInfo ci, @Local(argsOnly = true) GuiEntityRenderState guiEntityRenderState) { + // things get reset by the render dispatcher, re-assert before the actual render + assertEmfState(guiEntityRenderState); + } + + @Inject(method = "renderToTexture(Lnet/minecraft/client/gui/render/state/pip/GuiEntityRenderState;Lcom/mojang/blaze3d/vertex/PoseStack;)V", at = @At(value = "TAIL")) + private void emf$endRender(final CallbackInfo ci, @Local(argsOnly = true) GuiEntityRenderState guiEntityRenderState) { + end(guiEntityRenderState); + } + //#endif + + @Unique + private static void assertEmfState(final GuiEntityRenderState guiEntityRenderState) { + var state = guiEntityRenderState.renderState(); + if (state instanceof HoldsETFRenderState holds && holds.etf$getState() != null) { + var emf = holds.etf$getState(); + ETFState.mount(emf); + } else { + ETFState.mountNone(); + } + + var light = state.lightCoords; + if (light == ETF.EMISSIVE_FEATURE_LIGHT_VALUE || light == ETF.EYES_FEATURE_LIGHT_VALUE) { + ETFState.startSpecialRenderOverlayPhase(); + } + } + + + @Unique + private static void end(GuiEntityRenderState guiEntityRenderState) { + var light = guiEntityRenderState.renderState().lightCoords; + if (light == ETF.EMISSIVE_FEATURE_LIGHT_VALUE || light == ETF.EYES_FEATURE_LIGHT_VALUE) { + ETFState.endSpecialRenderOverlayPhase(); + } + ETFState.unMount(); + } + +} +//#else +//$$ @Mixin(traben.entity_texture_features.mixin.CancelTarget.class) +//$$ public interface Mixin_GuiEntityRenderer { } +//#endif \ No newline at end of file diff --git a/src/main/java/traben/entity_texture_features/mixin/mixins/submit/Mixin_ModelPartRenderer.java b/src/main/java/traben/entity_texture_features/mixin/mixins/submit/Mixin_ModelPartRenderer.java new file mode 100644 index 00000000..d4eb94a8 --- /dev/null +++ b/src/main/java/traben/entity_texture_features/mixin/mixins/submit/Mixin_ModelPartRenderer.java @@ -0,0 +1,39 @@ +package traben.entity_texture_features.mixin.mixins.submit; + +import org.spongepowered.asm.mixin.Mixin; + +//#if MC >= 12109 && MC < 26.2 +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import traben.entity_texture_features.ETF; +import com.llamalad7.mixinextras.sugar.Local; +import net.minecraft.client.renderer.SubmitNodeStorage; +import net.minecraft.client.renderer.feature.ModelPartFeatureRenderer; +import traben.entity_texture_features.features.state.ETFState; + +@Mixin(ModelPartFeatureRenderer.class) +public class Mixin_ModelPartRenderer { + + @Inject(method = "render", at = @At(value = "INVOKE", target = "Lcom/mojang/blaze3d/vertex/PoseStack;last()Lcom/mojang/blaze3d/vertex/PoseStack$Pose;")) + private void emf$initRender(final CallbackInfo ci, @Local SubmitNodeStorage.ModelPartSubmit modelSubmit) { + var light = modelSubmit.lightCoords(); + if (light == ETF.EMISSIVE_FEATURE_LIGHT_VALUE || light == ETF.EYES_FEATURE_LIGHT_VALUE) { + ETFState.startSpecialRenderOverlayPhase(); + } + + } + + @Inject(method = "render", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/SubmitNodeStorage$ModelPartSubmit;crumblingOverlay()Lnet/minecraft/client/renderer/feature/ModelFeatureRenderer$CrumblingOverlay;")) + private void emf$endRender(final CallbackInfo ci, @Local SubmitNodeStorage.ModelPartSubmit modelSubmit) { + var light = modelSubmit.lightCoords(); + if (light == ETF.EMISSIVE_FEATURE_LIGHT_VALUE || light == ETF.EYES_FEATURE_LIGHT_VALUE) { + ETFState.endSpecialRenderOverlayPhase(); + } + } + +} +//#else +//$$ @Mixin(traben.entity_texture_features.mixin.CancelTarget.class) +//$$ public interface Mixin_ModelPartRenderer { } +//#endif \ No newline at end of file diff --git a/src/main/java/traben/entity_texture_features/mixin/mixins/submit/Mixin_ModelRenderer.java b/src/main/java/traben/entity_texture_features/mixin/mixins/submit/Mixin_ModelRenderer.java index a6959844..7cfab5ce 100644 --- a/src/main/java/traben/entity_texture_features/mixin/mixins/submit/Mixin_ModelRenderer.java +++ b/src/main/java/traben/entity_texture_features/mixin/mixins/submit/Mixin_ModelRenderer.java @@ -3,13 +3,13 @@ import org.spongepowered.asm.mixin.Mixin; //#if MC >= 12109 -import net.minecraft.client.renderer.entity.state.EntityRenderState; 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 traben.entity_texture_features.ETF; -import traben.entity_texture_features.features.ETFRenderContext; +import traben.entity_texture_features.features.state.ETFState; +import traben.entity_texture_features.features.state.ETFSubmitData; import traben.entity_texture_features.features.state.HoldsETFRenderState; import com.llamalad7.mixinextras.sugar.Local; import net.minecraft.client.renderer.feature.ModelFeatureRenderer; @@ -18,7 +18,7 @@ public class Mixin_ModelRenderer { @Unique - private static void headLogic( + private void headLogic( //#if MC >= 26.2 //$$ net.minecraft.client.renderer.feature.ModelFeatureRenderer.Submit modelSubmit //#else @@ -26,26 +26,46 @@ private static void headLogic( //#endif ) { var state = modelSubmit.state(); - //TODO temp fix, will be replaced by improving EMFs implementation and moving upstream + ETFSubmitData data = ETFSubmitData.from(modelSubmit); // Set up the current entity context for this render if (state instanceof HoldsETFRenderState holds && holds.etf$getState() != null) { - ETFRenderContext.setCurrentEntity(holds.etf$getState()); - } else if (!(state instanceof EntityRenderState)) { // temp handle block entities and a few others weird instances, will be resolved by above todo - ETFRenderContext.temp_markRenderingEntity = true; + var etf = holds.etf$getState(); + etf.preSubmitActivate(data, modelSubmit); + ETFState.mount(etf); + } else if (data != null && data.backupState != null) { // block entity backup + var etf = data.backupState; + etf.preSubmitActivate(data, modelSubmit); + ETFState.mount(etf); } else { - ETFRenderContext.reset(); + ETFState.mountNone(); } - // Handle emissive lighting setup - if (modelSubmit.lightCoords() == ETF.EMISSIVE_FEATURE_LIGHT_VALUE) - ETFRenderContext.startSpecialRenderOverlayPhase(); + // Handle emissive/eyes lighting setup + var light = modelSubmit.lightCoords(); + if (light == ETF.EMISSIVE_FEATURE_LIGHT_VALUE || light == ETF.EYES_FEATURE_LIGHT_VALUE) { + ETFState.startSpecialRenderOverlayPhase(); + } + + if (data != null) { + ETFSubmitData.DATA_OUT.forEach(entry -> entry.accept(data, modelSubmit)); + } } @Unique - private static void tailLogic() { - ETFRenderContext.endSpecialRenderOverlayPhase(); - ETFRenderContext.reset(); + private static void tailLogic( + //#if MC >= 26.2 + //$$ net.minecraft.client.renderer.feature.ModelFeatureRenderer.Submit modelSubmit + //#else + net.minecraft.client.renderer.SubmitNodeStorage.ModelSubmit modelSubmit + //#endif + ) { + var light = modelSubmit.lightCoords(); + if (light == ETF.EMISSIVE_FEATURE_LIGHT_VALUE || light == ETF.EYES_FEATURE_LIGHT_VALUE) { + ETFState.endSpecialRenderOverlayPhase(); + } + + ETFState.unMount(); } //#if MC >= 26.2 @@ -55,8 +75,8 @@ private static void tailLogic() { //$$ } //$$ //$$ @Inject(method = "prepareModel", at = @At(value = "TAIL")) - //$$ private void emf$endRender(final CallbackInfo ci) { - //$$ tailLogic(); + //$$ private void emf$endRender(final CallbackInfo ci, @Local(argsOnly = true) net.minecraft.client.renderer.feature.ModelFeatureRenderer.Submit modelSubmit) { + //$$ tailLogic(modelSubmit); //$$ } //#else @Inject(method = "renderModel", at = @At(value = "HEAD")) @@ -64,14 +84,9 @@ private static void tailLogic() { headLogic(modelSubmit); } - @Inject(method = "renderTranslucents", at = @At(value = "TAIL")) - private void emf$endRender(final CallbackInfo ci) { - tailLogic(); - } - - @Inject(method = "renderBatch", at = @At(value = "TAIL")) - private void emf$endRender2(final CallbackInfo ci) { - tailLogic(); + @Inject(method = "renderModel", at = @At(value = "TAIL")) + private void emf$endRender(final CallbackInfo ci, @Local(argsOnly = true) net.minecraft.client.renderer.SubmitNodeStorage.ModelSubmit modelSubmit) { + tailLogic(modelSubmit); } //#endif diff --git a/src/main/java/traben/entity_texture_features/mixin/mixins/submit/Mixin_ModelSubmit_AddData.java b/src/main/java/traben/entity_texture_features/mixin/mixins/submit/Mixin_ModelSubmit_AddData.java new file mode 100644 index 00000000..9154c41b --- /dev/null +++ b/src/main/java/traben/entity_texture_features/mixin/mixins/submit/Mixin_ModelSubmit_AddData.java @@ -0,0 +1,45 @@ +package traben.entity_texture_features.mixin.mixins.submit; + +import org.jetbrains.annotations.Nullable; +import org.spongepowered.asm.mixin.Mixin; + +//#if MC>=12109 +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 traben.entity_texture_features.features.state.ETFSubmitData; +import traben.entity_texture_features.features.state.ETFSubmitExtension; + +//#if MC >= 26.2 +//$$ @Mixin(net.minecraft.client.renderer.feature.ModelFeatureRenderer.Submit.class) +//#else +@Mixin(net.minecraft.client.renderer.SubmitNodeStorage.ModelSubmit.class) +//#endif +public abstract class Mixin_ModelSubmit_AddData implements ETFSubmitExtension { + + @Unique private final @Nullable ETFSubmitData data = new ETFSubmitData(); + + @Override + public @Nullable ETFSubmitData emf$getData() { + return data; + } + + @Inject(method = "", at = @At("RETURN")) + private void emf$initBackupState(CallbackInfo ci) { + if (data != null) { + ETFSubmitData.DATA_IN.forEach(entry -> entry.accept(data, ( + //#if MC >= 26.2 + //$$ net.minecraft.client.renderer.feature.ModelFeatureRenderer.Submit + //#else + net.minecraft.client.renderer.SubmitNodeStorage.ModelSubmit + //#endif + ) (Object) this)); + } + } + +} +//#else +//$$ @Mixin(traben.entity_texture_features.mixin.CancelTarget.class) +//$$ public interface Mixin_ModelSubmit_AddData { } +//#endif diff --git a/src/main/java/traben/entity_texture_features/mixin/mixins/submit/backupstates/Mixin_ChestSpecialRenderer_PassState.java b/src/main/java/traben/entity_texture_features/mixin/mixins/submit/backupstates/Mixin_ChestSpecialRenderer_PassState.java new file mode 100644 index 00000000..abd426a5 --- /dev/null +++ b/src/main/java/traben/entity_texture_features/mixin/mixins/submit/backupstates/Mixin_ChestSpecialRenderer_PassState.java @@ -0,0 +1,41 @@ +package traben.entity_texture_features.mixin.mixins.submit.backupstates; + +//#if MC >=12109 + +import net.minecraft.client.renderer.special.ChestSpecialRenderer; +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.entity.ChestBlockEntity; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import traben.entity_texture_features.features.state.ETFEntityRenderState; +import traben.entity_texture_features.features.state.ETFState; +import traben.entity_texture_features.features.state.ETFSubmitData; +import traben.entity_texture_features.utils.ETFEntity; + +@Mixin(ChestSpecialRenderer.class) +public class Mixin_ChestSpecialRenderer_PassState { + + @Inject(method = "submit", at = @At(value = "HEAD")) + private static void emf$dummyState(CallbackInfo ci) { + var state = ETFEntityRenderState.forEntity( + // TODO do we really need the actual chest type here? this is just so inventory anims can play + (ETFEntity) new ChestBlockEntity(BlockPos.ZERO, Blocks.CHEST.defaultBlockState())); + ETFState.mount(state); + } + + @Inject(method = "submit", at = @At(value = "TAIL")) + private static void emf$reset(CallbackInfo ci) { + ETFState.unMount(); + } + +} +//#else +//$$ import org.spongepowered.asm.mixin.Mixin; +//$$ import traben.entity_texture_features.mixin.CancelTarget; +//$$ +//$$ @Mixin(CancelTarget.class) +//$$ public class Mixin_ChestSpecialRenderer_PassState { } +//#endif \ No newline at end of file diff --git a/src/main/java/traben/entity_texture_features/utils/ETFUtils2.java b/src/main/java/traben/entity_texture_features/utils/ETFUtils2.java index d96c2e84..7b6ef1de 100644 --- a/src/main/java/traben/entity_texture_features/utils/ETFUtils2.java +++ b/src/main/java/traben/entity_texture_features/utils/ETFUtils2.java @@ -18,8 +18,8 @@ import traben.entity_texture_features.config.ETFConfigWarning; import traben.entity_texture_features.config.ETFConfigWarnings; import traben.entity_texture_features.features.ETFManager; -import traben.entity_texture_features.features.ETFRenderContext; import traben.entity_texture_features.features.state.ETFEntityRenderState; +import traben.entity_texture_features.features.state.ETFState; import traben.entity_texture_features.features.texture_handlers.ETFTexture; import com.mojang.blaze3d.platform.NativeImage; import com.mojang.blaze3d.vertex.VertexConsumer; @@ -169,16 +169,16 @@ public static void printDebugImage(NativeImage image) { public static ResourceLocation getETFVariantNotNullForInjector(ResourceLocation identifier) { // do not modify texture if (identifier == null - || ETFRenderContext.getCurrentEntityState() == null - || !ETFRenderContext.isAllowedToRenderLayerTextureModify()) + || !ETFState.isStateActive() + || !ETFState.isAllowedToRenderLayerTextureModify()) return identifier; // get etf modified texture - ETFTexture etfTexture = ETFManager.getInstance().getETFTextureVariant(identifier, ETFRenderContext.getCurrentEntityState()); - if (ETFRenderContext.isAllowedToPatch()) { + ETFTexture etfTexture = ETFManager.getInstance().getETFTextureVariant(identifier, ETFState.state()); + if (ETFState.allowTexturePatching) { etfTexture.assertPatchedTextures(); } - ResourceLocation modified = etfTexture.getTextureIdentifier(ETFRenderContext.getCurrentEntityState()); + ResourceLocation modified = etfTexture.getTextureIdentifier(ETFState.state()); // check not null just to be safe, it shouldn't be however //noinspection ConstantValue @@ -189,11 +189,10 @@ public static boolean renderEmissive(ETFTexture texture, URenderTypeToVertexCons if (!ETF.config().getConfig().canDoEmissiveTextures()) return false; ResourceLocation emissive = texture.getEmissiveIdentifierOfCurrentState(); if (emissive != null) { - boolean wasAllowed = ETFRenderContext.isAllowedToRenderLayerTextureModify(); - ETFRenderContext.preventRenderLayerTextureModify(); + ETFState.pushRenderLayerModifyState(false); VertexConsumer emissiveConsumer = provider.getBuffer( - ETFRenderContext.canRenderInBrightMode() ? + ETFState.canRenderInBrightMode() ? //#if MC>= 12111 //$$ net.minecraft.client.renderer.rendertype.RenderTypes @@ -202,7 +201,7 @@ public static boolean renderEmissive(ETFTexture texture, URenderTypeToVertexCons //#endif .beaconBeam(emissive, true) : //#if MC < 12103 - //$$ ETFRenderContext.shouldEmissiveUseCullingLayer() ? + //$$ ETFState.shouldEmissiveUseCullingLayer() ? //$$ RenderType.entityTranslucentCull(emissive) : //#endif @@ -213,11 +212,11 @@ public static boolean renderEmissive(ETFTexture texture, URenderTypeToVertexCons //#endif .entityTranslucent(emissive)); - if (wasAllowed) ETFRenderContext.allowRenderLayerTextureModify(); + ETFState.popRenderLayerModifyState(); - ETFRenderContext.startSpecialRenderOverlayPhase(); + ETFState.startSpecialRenderOverlayPhase(); renderer.render(emissiveConsumer, ETF.EMISSIVE_FEATURE_LIGHT_VALUE); - ETFRenderContext.endSpecialRenderOverlayPhase(); + ETFState.endSpecialRenderOverlayPhase(); return true; } return false; @@ -238,8 +237,7 @@ public static boolean renderEnchanted(ETFTexture texture, URenderTypeToVertexCon // attempt enchanted render ResourceLocation enchanted = texture.getEnchantIdentifierOfCurrentState(); if (enchanted != null) { - boolean wasAllowed = ETFRenderContext.isAllowedToRenderLayerTextureModify(); - ETFRenderContext.preventRenderLayerTextureModify(); + ETFState.pushRenderLayerModifyState(false); VertexConsumer enchantedVertex = //#if MC >= 26.1 //$$ getFoilBuffer(provider, RenderTypes.armorCutoutNoCull(enchanted)); @@ -259,11 +257,11 @@ public static boolean renderEnchanted(ETFTexture texture, URenderTypeToVertexCon //#endif //$$ true); //#endif - if (wasAllowed) ETFRenderContext.allowRenderLayerTextureModify(); + ETFState.popRenderLayerModifyState(); - ETFRenderContext.startSpecialRenderOverlayPhase(); + ETFState.startSpecialRenderOverlayPhase(); renderer.render(enchantedVertex, light); - ETFRenderContext.endSpecialRenderOverlayPhase(); + ETFState.endSpecialRenderOverlayPhase(); return true; } return false; diff --git a/src/main/resources/entity_texture_features.mixins.json b/src/main/resources/entity_texture_features.mixins.json index 183711aa..097e8dd3 100644 --- a/src/main/resources/entity_texture_features.mixins.json +++ b/src/main/resources/entity_texture_features.mixins.json @@ -29,6 +29,8 @@ }, "client": [ "MixinBufferBuilder", + "MixinGameRenderer", + "MixinLevelRenderer", "MixinModelPart", "MixinMultiPhase", "MixinPackScreen", @@ -60,6 +62,10 @@ "mods.iris.MixinOuterWrappedRenderType", "reloading.MixinMinecraftClient", "reloading.MixinResourceReload", - "submit.Mixin_ModelRenderer" + "submit.Mixin_GuiEntityRenderer", + "submit.Mixin_ModelPartRenderer", + "submit.Mixin_ModelRenderer", + "submit.Mixin_ModelSubmit_AddData", + "submit.backupstates.Mixin_ChestSpecialRenderer_PassState" ] } \ No newline at end of file diff --git a/versions/26.1-1.21.11.txt b/versions/26.1-1.21.11.txt index d13d0013..f9335953 100644 --- a/versions/26.1-1.21.11.txt +++ b/versions/26.1-1.21.11.txt @@ -26,3 +26,4 @@ net.minecraft.client.renderer.entity.ItemEntityRenderer net.minecraft.client.ren net.minecraft.client.renderer.block.model.BlockModel net.minecraft.client.renderer.block.model.BlockStateModel net.minecraft.client.renderer.state.level.CameraRenderState net.minecraft.client.renderer.state.CameraRenderState +net.minecraft.client.renderer.state.gui.pip.GuiEntityRenderState net.minecraft.client.gui.render.state.pip.GuiEntityRenderState From 363a5490e4da31e0d4d231df08ef03e032499bad Mon Sep 17 00:00:00 2001 From: Traben Date: Thu, 20 Aug 2026 10:43:40 +1000 Subject: [PATCH 5/7] account for extra wrappers --- .../MixinBufferBuilder.java | 2 +- .../MixinSheetedDecalTextureGen.java | 65 ++++++++++++++++++ .../MixinSpriteCoordExpander.java | 67 +++++++++++++++++++ ...MixinVertexConsumerProvider$Immediate.java | 2 +- .../MixinVertexMultiConsumer$Double.java | 3 +- .../entity_texture_features.mixins.json | 24 ++++--- 6 files changed, 148 insertions(+), 15 deletions(-) rename src/main/java/traben/entity_texture_features/mixin/mixins/{ => vertexconsumers}/MixinBufferBuilder.java (96%) create mode 100644 src/main/java/traben/entity_texture_features/mixin/mixins/vertexconsumers/MixinSheetedDecalTextureGen.java create mode 100644 src/main/java/traben/entity_texture_features/mixin/mixins/vertexconsumers/MixinSpriteCoordExpander.java rename src/main/java/traben/entity_texture_features/mixin/mixins/{ => vertexconsumers}/MixinVertexConsumerProvider$Immediate.java (98%) rename src/main/java/traben/entity_texture_features/mixin/mixins/{ => vertexconsumers}/MixinVertexMultiConsumer$Double.java (95%) diff --git a/src/main/java/traben/entity_texture_features/mixin/mixins/MixinBufferBuilder.java b/src/main/java/traben/entity_texture_features/mixin/mixins/vertexconsumers/MixinBufferBuilder.java similarity index 96% rename from src/main/java/traben/entity_texture_features/mixin/mixins/MixinBufferBuilder.java rename to src/main/java/traben/entity_texture_features/mixin/mixins/vertexconsumers/MixinBufferBuilder.java index 29567317..3b4d4967 100644 --- a/src/main/java/traben/entity_texture_features/mixin/mixins/MixinBufferBuilder.java +++ b/src/main/java/traben/entity_texture_features/mixin/mixins/vertexconsumers/MixinBufferBuilder.java @@ -1,4 +1,4 @@ -package traben.entity_texture_features.mixin.mixins; +package traben.entity_texture_features.mixin.mixins.vertexconsumers; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Unique; diff --git a/src/main/java/traben/entity_texture_features/mixin/mixins/vertexconsumers/MixinSheetedDecalTextureGen.java b/src/main/java/traben/entity_texture_features/mixin/mixins/vertexconsumers/MixinSheetedDecalTextureGen.java new file mode 100644 index 00000000..3231d637 --- /dev/null +++ b/src/main/java/traben/entity_texture_features/mixin/mixins/vertexconsumers/MixinSheetedDecalTextureGen.java @@ -0,0 +1,65 @@ +package traben.entity_texture_features.mixin.mixins.vertexconsumers; + +import com.mojang.blaze3d.vertex.SheetedDecalTextureGenerator; +import com.mojang.blaze3d.vertex.VertexConsumer; +import net.minecraft.client.renderer.RenderType; +import org.jetbrains.annotations.Nullable; +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 traben.entity_texture_features.features.texture_handlers.ETFTexture; +import traben.entity_texture_features.utils.ETFVertexConsumer; +import traben.entity_texture_features.utils.URenderTypeToVertexConsumer; + +@Mixin(SheetedDecalTextureGenerator.class) +public class MixinSheetedDecalTextureGen implements ETFVertexConsumer { + + @Shadow + @Final + private VertexConsumer delegate; + + @Unique + private @Nullable ETFVertexConsumer etfDelegate() { + if (delegate instanceof ETFVertexConsumer etfDelegate) { + return etfDelegate; + } else { + return null; + } + } + + @Override + public ETFTexture etf$getETFTexture() { + var etf = etfDelegate(); + if (etf != null) { + return etf.etf$getETFTexture(); + } + return null; + } + + @Override + public URenderTypeToVertexConsumer etf$getProvider() { + var etf = etfDelegate(); + if (etf != null) { + return etf.etf$getProvider(); + } + return null; + } + + @Override + public RenderType etf$getRenderLayer() { + var etf = etfDelegate(); + if (etf != null) { + return etf.etf$getRenderLayer(); + } + return null; + } + + @Override + public void etf$initETFVertexConsumer(URenderTypeToVertexConsumer provider, RenderType renderLayer) { + var etf = etfDelegate(); + if (etf != null) { + etf.etf$initETFVertexConsumer(provider, renderLayer); + } + } +} diff --git a/src/main/java/traben/entity_texture_features/mixin/mixins/vertexconsumers/MixinSpriteCoordExpander.java b/src/main/java/traben/entity_texture_features/mixin/mixins/vertexconsumers/MixinSpriteCoordExpander.java new file mode 100644 index 00000000..c38d186b --- /dev/null +++ b/src/main/java/traben/entity_texture_features/mixin/mixins/vertexconsumers/MixinSpriteCoordExpander.java @@ -0,0 +1,67 @@ +package traben.entity_texture_features.mixin.mixins.vertexconsumers; + +import com.mojang.blaze3d.vertex.VertexConsumer; +import net.minecraft.client.renderer.SpriteCoordinateExpander; +import org.jetbrains.annotations.Nullable; +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 traben.entity_texture_features.features.texture_handlers.ETFTexture; +import traben.entity_texture_features.utils.ETFVertexConsumer; + +import net.minecraft.client.renderer.RenderType; +import traben.entity_texture_features.utils.URenderTypeToVertexConsumer; + +@Mixin(SpriteCoordinateExpander.class) +public class MixinSpriteCoordExpander implements ETFVertexConsumer { + + @Shadow + @Final + private VertexConsumer delegate; + + @Unique + private @Nullable ETFVertexConsumer etfDelegate() { + if (delegate instanceof ETFVertexConsumer etfDelegate) { + return etfDelegate; + } else { + return null; + } + } + + @Override + public ETFTexture etf$getETFTexture() { + var etf = etfDelegate(); + if (etf != null) { + return etf.etf$getETFTexture(); + } + return null; + } + + @Override + public URenderTypeToVertexConsumer etf$getProvider() { + var etf = etfDelegate(); + if (etf != null) { + return etf.etf$getProvider(); + + } + return null; + } + + @Override + public RenderType etf$getRenderLayer() { + var etf = etfDelegate(); + if (etf != null) { + return etf.etf$getRenderLayer(); + } + return null; + } + + @Override + public void etf$initETFVertexConsumer(URenderTypeToVertexConsumer provider, RenderType renderLayer) { + var etf = etfDelegate(); + if (etf != null) { + etf.etf$initETFVertexConsumer(provider, renderLayer); + } + } +} diff --git a/src/main/java/traben/entity_texture_features/mixin/mixins/MixinVertexConsumerProvider$Immediate.java b/src/main/java/traben/entity_texture_features/mixin/mixins/vertexconsumers/MixinVertexConsumerProvider$Immediate.java similarity index 98% rename from src/main/java/traben/entity_texture_features/mixin/mixins/MixinVertexConsumerProvider$Immediate.java rename to src/main/java/traben/entity_texture_features/mixin/mixins/vertexconsumers/MixinVertexConsumerProvider$Immediate.java index f2e23b81..aa19a855 100644 --- a/src/main/java/traben/entity_texture_features/mixin/mixins/MixinVertexConsumerProvider$Immediate.java +++ b/src/main/java/traben/entity_texture_features/mixin/mixins/vertexconsumers/MixinVertexConsumerProvider$Immediate.java @@ -1,4 +1,4 @@ -package traben.entity_texture_features.mixin.mixins; +package traben.entity_texture_features.mixin.mixins.vertexconsumers; //#if MC >= 26.2 //$$ import com.mojang.blaze3d.vertex.VertexConsumer; diff --git a/src/main/java/traben/entity_texture_features/mixin/mixins/MixinVertexMultiConsumer$Double.java b/src/main/java/traben/entity_texture_features/mixin/mixins/vertexconsumers/MixinVertexMultiConsumer$Double.java similarity index 95% rename from src/main/java/traben/entity_texture_features/mixin/mixins/MixinVertexMultiConsumer$Double.java rename to src/main/java/traben/entity_texture_features/mixin/mixins/vertexconsumers/MixinVertexMultiConsumer$Double.java index 4b929495..ad1a3417 100644 --- a/src/main/java/traben/entity_texture_features/mixin/mixins/MixinVertexMultiConsumer$Double.java +++ b/src/main/java/traben/entity_texture_features/mixin/mixins/vertexconsumers/MixinVertexMultiConsumer$Double.java @@ -1,4 +1,4 @@ -package traben.entity_texture_features.mixin.mixins; +package traben.entity_texture_features.mixin.mixins.vertexconsumers; //#if MC >= 26.2 //$$ @@ -11,7 +11,6 @@ import com.mojang.blaze3d.vertex.VertexConsumer; import com.mojang.blaze3d.vertex.VertexMultiConsumer; -import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; diff --git a/src/main/resources/entity_texture_features.mixins.json b/src/main/resources/entity_texture_features.mixins.json index 097e8dd3..712038be 100644 --- a/src/main/resources/entity_texture_features.mixins.json +++ b/src/main/resources/entity_texture_features.mixins.json @@ -5,6 +5,12 @@ "package": "traben.entity_texture_features.mixin.mixins", "plugin": "traben.entity_texture_features.mixin.Plugin", "mixins": [ + ], + "injectors": { + "maxShiftBy": 2, + "defaultRequire": 1 + }, + "client": [ "MixinIdentifier", "entity.block.MixinMobSpawnerLogic", "entity.misc.MixinBlazeEntity", @@ -21,14 +27,7 @@ "mods.iris.old.MixinOuterWrappedRenderType", "mods.skin_layers.MixinCustomizableModelPart", "mods.sodium.MixinModelPartSodium", - "mods.sodium.MixinSodiumBufferBuilder" - ], - "injectors": { - "maxShiftBy": 2, - "defaultRequire": 1 - }, - "client": [ - "MixinBufferBuilder", + "mods.sodium.MixinSodiumBufferBuilder", "MixinGameRenderer", "MixinLevelRenderer", "MixinModelPart", @@ -37,8 +36,6 @@ "MixinPlayerSkinTexture", "MixinRenderLayer", "MixinSpriteIdentifier", - "MixinVertexConsumerProvider$Immediate", - "MixinVertexMultiConsumer$Double", "accessor.TooltipAccessor", "entity.block.MixinSkullBlockEntityRenderer", "entity.misc.MixinBlockEntityRenderDispatcher", @@ -66,6 +63,11 @@ "submit.Mixin_ModelPartRenderer", "submit.Mixin_ModelRenderer", "submit.Mixin_ModelSubmit_AddData", - "submit.backupstates.Mixin_ChestSpecialRenderer_PassState" + "submit.backupstates.Mixin_ChestSpecialRenderer_PassState", + "vertexconsumers.MixinBufferBuilder", + "vertexconsumers.MixinSheetedDecalTextureGen", + "vertexconsumers.MixinSpriteCoordExpander", + "vertexconsumers.MixinVertexConsumerProvider$Immediate", + "vertexconsumers.MixinVertexMultiConsumer$Double" ] } \ No newline at end of file From 3bf0648dfd0f72869139f990b80fa7b0a20ca64c Mon Sep 17 00:00:00 2001 From: Traben Date: Fri, 21 Aug 2026 16:48:44 +1000 Subject: [PATCH 6/7] account for extra wrappers --- CHANGELOG.MD | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.MD b/CHANGELOG.MD index 787c3c94..ecb6158b 100644 --- a/CHANGELOG.MD +++ b/CHANGELOG.MD @@ -1,6 +1,9 @@ - +[?] - fixed the size property breaking with slimes in 26.2 +- fixed various texture layer issues +- fixed various block entity issues +- fixed various issues affecting EMF [7.1] - Both EMF & ESF will need to update to be compatible with this version *(expect about half an hour for EMF to update)* From 44f84d3b882e25c4ced04ff7fe3d93ca69af6c97 Mon Sep 17 00:00:00 2001 From: Traben Date: Fri, 21 Aug 2026 22:54:31 +1000 Subject: [PATCH 7/7] fix for sodium 1.21.2-8 --- build.gradle.kts | 1 + .../mixin/mixins/MixinLevelRenderer.java | 6 +-- .../mods/sodium/MixinSodiumWorldRenderer.java | 38 +++++++++++++++++++ .../entity_texture_features.mixins.json | 35 ++++++++--------- 4 files changed, 60 insertions(+), 20 deletions(-) create mode 100644 src/main/java/traben/entity_texture_features/mixin/mixins/mods/sodium/MixinSodiumWorldRenderer.java diff --git a/build.gradle.kts b/build.gradle.kts index 9ee671fa..ed9d3b25 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -131,6 +131,7 @@ dependencies { modImpl("maven.modrinth:sodium:", 26_02_00 to ver("3QgJXuSK", null, "5dWEDeL4"), 26_01_00 to ver("1rha2U1D", null, "I6y5LD6f"), + 1_21_09 to ver("fVbw1C7i", null, "dfyNHRhw"), 1_21_05 to ver("fVbw1C7i", null, "dfyNHRhw"), 1_21_04 to ver("c3YkZvne", null, "XgEfENfn"), 1_21_03 to ver("rLBgU2jc", null, "M0CXIL7c"), diff --git a/src/main/java/traben/entity_texture_features/mixin/mixins/MixinLevelRenderer.java b/src/main/java/traben/entity_texture_features/mixin/mixins/MixinLevelRenderer.java index cc492997..da1e1320 100644 --- a/src/main/java/traben/entity_texture_features/mixin/mixins/MixinLevelRenderer.java +++ b/src/main/java/traben/entity_texture_features/mixin/mixins/MixinLevelRenderer.java @@ -8,12 +8,12 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import traben.entity_texture_features.features.state.ETFState; -@Mixin(LevelRenderer.class) +@Mixin(value = LevelRenderer.class, priority = 1010) // Compat to let sodium 1.21.2-8 mixin apply firsy public class MixinLevelRenderer { //#if MC >= 1.21.9 @Inject(method = { "submitEntities" , "submitBlockEntities" }, at = @At(value = "INVOKE", target = "Ljava/util/Iterator;next()Ljava/lang/Object;")) //#elseif MC >= 1.21.2 - //$$ @Inject(method = { "renderEntities" , "renderBlockEntities" }, at = @At(value = "INVOKE", target = "Ljava/util/Iterator;next()Ljava/lang/Object;")) + //$$ @Inject(method = { "renderEntities" , "renderBlockEntities" }, at = @At(value = "INVOKE", target = "Ljava/util/Iterator;next()Ljava/lang/Object;"), require = 1) // See MixinSodiumWorldRenderer for require //#else //$$ @Inject(method = "renderLevel", at = @At(value = "INVOKE", target = "Ljava/util/Iterator;next()Ljava/lang/Object;"), slice = //$$ @org.spongepowered.asm.mixin.injection.Slice(from = @At(value = "CONSTANT", args = "stringValue=entities"), to = @At(value = "CONSTANT", args = "stringValue=destroyProgress"))) @@ -26,7 +26,7 @@ public class MixinLevelRenderer { //#if MC >= 1.21.9 @Inject(method = { "submitEntities" , "submitBlockEntities" }, at = @At(value = "TAIL")) //#elseif MC >= 1.21.2 - //$$ @Inject(method = { "renderEntities" , "renderBlockEntities" }, at = @At(value = "TAIL")) + //$$ @Inject(method = { "renderEntities" , "renderBlockEntities" }, at = @At(value = "TAIL"), require = 1) // See MixinSodiumWorldRenderer for require //#else //$$ @Inject(method = "renderLevel", at = @At(value = "CONSTANT", args = "stringValue=destroyProgress")) //#endif diff --git a/src/main/java/traben/entity_texture_features/mixin/mixins/mods/sodium/MixinSodiumWorldRenderer.java b/src/main/java/traben/entity_texture_features/mixin/mixins/mods/sodium/MixinSodiumWorldRenderer.java new file mode 100644 index 00000000..0ac53a20 --- /dev/null +++ b/src/main/java/traben/entity_texture_features/mixin/mixins/mods/sodium/MixinSodiumWorldRenderer.java @@ -0,0 +1,38 @@ +package traben.entity_texture_features.mixin.mixins.mods.sodium; + +//#if !SODIUM || MC < 1.21.2 || MC >= 1.21.9 +import org.spongepowered.asm.mixin.Mixin; +import traben.entity_texture_features.mixin.CancelTarget; + +@Mixin(CancelTarget.class) +public class MixinSodiumWorldRenderer { } +//#else +//$$ import net.caffeinemc.mods.sodium.client.render.SodiumWorldRenderer; +//$$ import org.spongepowered.asm.mixin.Mixin; +//$$ import org.spongepowered.asm.mixin.Pseudo; +//$$ import org.spongepowered.asm.mixin.injection.At; +//$$ import org.spongepowered.asm.mixin.injection.Inject; +//$$ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +//$$ import traben.entity_texture_features.features.state.ETFState; +//$$ +//$$ // Sodium uses a mixin override on these version to entirely replace the block entity rendering +//$$ // It's already no longer an issue in modern versions +//$$ +//$$ @Pseudo +//$$ @Mixin(SodiumWorldRenderer.class) +//$$ public class MixinSodiumWorldRenderer { // See MixinLevelRenderer +//$$ @Inject(method = "renderBlockEntity(Lcom/mojang/blaze3d/vertex/PoseStack;Lnet/minecraft/client/renderer/RenderBuffers;Lit/unimi/dsi/fastutil/longs/Long2ObjectMap;FLnet/minecraft/client/renderer/MultiBufferSource$BufferSource;DDDLnet/minecraft/client/renderer/blockentity/BlockEntityRenderDispatcher;Lnet/minecraft/world/level/block/entity/BlockEntity;Lnet/minecraft/client/player/LocalPlayer;Lcom/llamalad7/mixinextras/sugar/ref/LocalBooleanRef;)V", +//$$ at = @At(value = "HEAD"), remap = false) +//$$ private static void emf$verify(final CallbackInfo ci) { +//$$ // These are the top level, stack should be clean +//$$ ETFState.stackVerifyEmpty(); +//$$ } +//$$ +//$$ @Inject(method = "renderBlockEntity(Lcom/mojang/blaze3d/vertex/PoseStack;Lnet/minecraft/client/renderer/RenderBuffers;Lit/unimi/dsi/fastutil/longs/Long2ObjectMap;FLnet/minecraft/client/renderer/MultiBufferSource$BufferSource;DDDLnet/minecraft/client/renderer/blockentity/BlockEntityRenderDispatcher;Lnet/minecraft/world/level/block/entity/BlockEntity;Lnet/minecraft/client/player/LocalPlayer;Lcom/llamalad7/mixinextras/sugar/ref/LocalBooleanRef;)V", +//$$ at = @At(value = "TAIL"), remap = false) +//$$ private static void emf$verifyEnd(final CallbackInfo ci) { +//$$ // These are the top level, stack should be clean +//$$ ETFState.stackVerifyEmpty(); +//$$ } +//$$ } +//#endif \ No newline at end of file diff --git a/src/main/resources/entity_texture_features.mixins.json b/src/main/resources/entity_texture_features.mixins.json index 712038be..14a5e0fd 100644 --- a/src/main/resources/entity_texture_features.mixins.json +++ b/src/main/resources/entity_texture_features.mixins.json @@ -11,24 +11,8 @@ "defaultRequire": 1 }, "client": [ - "MixinIdentifier", - "entity.block.MixinMobSpawnerLogic", - "entity.misc.MixinBlazeEntity", - "entity.misc.MixinBlockEntity", - "entity.misc.MixinEntity", - "entity.misc.MixinGlowSquidEntity", - "entity.misc.MixinMob_LeashNBTFix", - "entity.misc.MixinPhantomEntity", - "entity.misc.MixinPlayerEntity", - "entity.misc.MixinSkullBlockEntity", - "mods.imediatelyfast.MixinBatchableBufferSource", - "mods.iris.old.MixinFullyBufferedMultiBufferSource", - "mods.iris.old.MixinInnerWrappedRenderType", - "mods.iris.old.MixinOuterWrappedRenderType", - "mods.skin_layers.MixinCustomizableModelPart", - "mods.sodium.MixinModelPartSodium", - "mods.sodium.MixinSodiumBufferBuilder", "MixinGameRenderer", + "MixinIdentifier", "MixinLevelRenderer", "MixinModelPart", "MixinMultiPhase", @@ -37,11 +21,20 @@ "MixinRenderLayer", "MixinSpriteIdentifier", "accessor.TooltipAccessor", + "entity.block.MixinMobSpawnerLogic", "entity.block.MixinSkullBlockEntityRenderer", + "entity.misc.MixinBlazeEntity", + "entity.misc.MixinBlockEntity", "entity.misc.MixinBlockEntityRenderDispatcher", "entity.misc.MixinBlockEntityRenderState", + "entity.misc.MixinEntity", "entity.misc.MixinEntityRenderDispatcher", "entity.misc.MixinEntityRenderState", + "entity.misc.MixinGlowSquidEntity", + "entity.misc.MixinMob_LeashNBTFix", + "entity.misc.MixinPhantomEntity", + "entity.misc.MixinPlayerEntity", + "entity.misc.MixinSkullBlockEntity", "entity.renderer.MixinEndCrystalRenderer", "entity.renderer.MixinEnderDragonEntityRenderer", "entity.renderer.MixinEntityRenderer", @@ -54,9 +47,17 @@ "entity.renderer.feature.MixinMooshroomMushroomFeatureRenderer", "entity.renderer.feature.MixinShoulderParrotFeatureRenderer", "entity.renderer.feature.MixinWardenExtraTextureParts", + "mods.imediatelyfast.MixinBatchableBufferSource", "mods.iris.MixinFullyBufferedMultiBufferSource", "mods.iris.MixinInnerWrappedRenderType", "mods.iris.MixinOuterWrappedRenderType", + "mods.iris.old.MixinFullyBufferedMultiBufferSource", + "mods.iris.old.MixinInnerWrappedRenderType", + "mods.iris.old.MixinOuterWrappedRenderType", + "mods.skin_layers.MixinCustomizableModelPart", + "mods.sodium.MixinModelPartSodium", + "mods.sodium.MixinSodiumBufferBuilder", + "mods.sodium.MixinSodiumWorldRenderer", "reloading.MixinMinecraftClient", "reloading.MixinResourceReload", "submit.Mixin_GuiEntityRenderer",