|
24 | 24 | import net.minecraft.client.render.GameRenderer; |
25 | 25 | import net.minecraft.resource.Resource; |
26 | 26 | import net.minecraft.resource.ResourceFactory; |
| 27 | +import net.minecraft.resource.ResourcePack; |
27 | 28 | import net.minecraft.util.Identifier; |
28 | 29 | import net.raphimc.immediatelyfast.ImmediatelyFast; |
29 | 30 | import net.raphimc.immediatelyfast.compat.CoreShaderBlacklist; |
| 31 | +import net.raphimc.immediatelyfast.feature.core.ImmediatelyFastResourcePackMetadata; |
30 | 32 | import org.spongepowered.asm.mixin.Final; |
31 | 33 | import org.spongepowered.asm.mixin.Mixin; |
32 | 34 | import org.spongepowered.asm.mixin.Shadow; |
|
35 | 37 | import org.spongepowered.asm.mixin.injection.Inject; |
36 | 38 | import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; |
37 | 39 |
|
38 | | -import java.util.ArrayList; |
39 | | -import java.util.List; |
40 | | -import java.util.Map; |
| 40 | +import java.io.IOException; |
| 41 | +import java.util.*; |
41 | 42 |
|
42 | 43 | @Mixin(GameRenderer.class) |
43 | 44 | public abstract class MixinGameRenderer { |
44 | 45 |
|
45 | | - @Shadow |
46 | | - @Final |
47 | | - MinecraftClient client; |
48 | | - |
49 | 46 | @Shadow |
50 | 47 | @Final |
51 | 48 | private Map<String, ShaderProgram> programs; |
52 | 49 |
|
53 | 50 | @Inject(method = "loadPrograms", at = @At("RETURN")) |
54 | 51 | private void checkForCoreShaderModifications(ResourceFactory factory, CallbackInfo ci) { |
55 | | - boolean modified = false; |
56 | | - for (Map.Entry<String, ShaderProgram> shaderProgramEntry : this.programs.entrySet()) { |
57 | | - if (!CoreShaderBlacklist.isBlacklisted(shaderProgramEntry.getKey())) continue; |
| 52 | + if (ImmediatelyFast.config.experimental_disable_resource_pack_conflict_handling) { |
| 53 | + return; |
| 54 | + } |
58 | 55 |
|
59 | | - final Identifier vertexShaderIdentifier = new Identifier("shaders/core/" + shaderProgramEntry.getValue().getVertexShader().getName() + ".vsh"); |
60 | | - final Resource vertexShaderResource = factory.getResource(vertexShaderIdentifier).orElse(null); |
61 | | - if (vertexShaderResource != null && !vertexShaderResource.getPack().equals(this.client.getDefaultResourcePack())) { |
62 | | - modified = true; |
63 | | - break; |
| 56 | + ResourcePack resourcePackWhichBreaksFontAtlasResizing = null; |
| 57 | + ResourcePack resourcePackWhichBreaksHudBatching = null; |
| 58 | + try { |
| 59 | + final Set<ResourcePack> breakingResourcePacks = new HashSet<>(); |
| 60 | + for (Map.Entry<String, ShaderProgram> shaderProgramEntry : this.programs.entrySet()) { |
| 61 | + if (!CoreShaderBlacklist.isBlacklisted(shaderProgramEntry.getKey())) continue; |
| 62 | + |
| 63 | + final Identifier vertexShaderIdentifier = new Identifier("shaders/core/" + shaderProgramEntry.getValue().getVertexShader().getName() + ".vsh"); |
| 64 | + final ResourcePack vertexShaderResourcePack = factory.getResource(vertexShaderIdentifier).map(Resource::getPack).orElse(null); |
| 65 | + if (vertexShaderResourcePack != null && !vertexShaderResourcePack.equals(MinecraftClient.getInstance().getDefaultResourcePack())) { |
| 66 | + breakingResourcePacks.add(vertexShaderResourcePack); |
| 67 | + } |
| 68 | + final Identifier fragmentShaderIdentifier = new Identifier("shaders/core/" + shaderProgramEntry.getValue().getFragmentShader().getName() + ".fsh"); |
| 69 | + final ResourcePack fragmentShaderResourcePack = factory.getResource(fragmentShaderIdentifier).map(Resource::getPack).orElse(null); |
| 70 | + if (fragmentShaderResourcePack != null && !fragmentShaderResourcePack.equals(MinecraftClient.getInstance().getDefaultResourcePack())) { |
| 71 | + breakingResourcePacks.add(fragmentShaderResourcePack); |
| 72 | + } |
64 | 73 | } |
65 | | - final Identifier fragmentShaderIdentifier = new Identifier("shaders/core/" + shaderProgramEntry.getValue().getFragmentShader().getName() + ".fsh"); |
66 | | - final Resource fragmentShaderResource = factory.getResource(fragmentShaderIdentifier).orElse(null); |
67 | | - if (fragmentShaderResource != null && !fragmentShaderResource.getPack().equals(this.client.getDefaultResourcePack())) { |
68 | | - modified = true; |
69 | | - break; |
| 74 | + for (ResourcePack resourcePack : breakingResourcePacks) { |
| 75 | + ImmediatelyFastResourcePackMetadata metadata = resourcePack.parseMetadata(ImmediatelyFastResourcePackMetadata.SERIALIZER); |
| 76 | + if (metadata == null) { |
| 77 | + metadata = ImmediatelyFastResourcePackMetadata.DEFAULT; |
| 78 | + } |
| 79 | + if (!metadata.compatibleFeatures().contains("font_atlas_resizing")) { |
| 80 | + resourcePackWhichBreaksFontAtlasResizing = resourcePack; |
| 81 | + } |
| 82 | + if (!metadata.compatibleFeatures().contains("hud_batching")) { |
| 83 | + resourcePackWhichBreaksHudBatching = resourcePack; |
| 84 | + } |
70 | 85 | } |
| 86 | + } catch (IOException e) { |
| 87 | + ImmediatelyFast.LOGGER.error("Failed to check for core shader modifications", e); |
71 | 88 | } |
72 | 89 |
|
73 | | - if (modified && !ImmediatelyFast.config.experimental_disable_resource_pack_conflict_handling) { |
74 | | - ImmediatelyFast.LOGGER.warn("Core shader modifications detected. Temporarily disabling some parts of ImmediatelyFast."); |
75 | | - if (ImmediatelyFast.runtimeConfig.font_atlas_resizing) { |
76 | | - ImmediatelyFast.runtimeConfig.font_atlas_resizing = false; |
77 | | - this.immediatelyFast$reloadFontStorages(); |
78 | | - } |
79 | | - |
80 | | - ImmediatelyFast.runtimeConfig.hud_batching = false; |
| 90 | + if (ImmediatelyFast.runtimeConfig.font_atlas_resizing && resourcePackWhichBreaksFontAtlasResizing != null) { |
| 91 | + ImmediatelyFast.LOGGER.warn("Resource pack " + resourcePackWhichBreaksFontAtlasResizing.getName() + " is not compatible with font atlas resizing. Temporarily disabling font atlas resizing."); |
| 92 | + ImmediatelyFast.runtimeConfig.font_atlas_resizing = false; |
| 93 | + this.immediatelyFast$reloadFontStorages(); |
81 | 94 | } else { |
82 | 95 | if (!ImmediatelyFast.runtimeConfig.font_atlas_resizing && ImmediatelyFast.config.font_atlas_resizing) { |
83 | 96 | ImmediatelyFast.runtimeConfig.font_atlas_resizing = true; |
84 | 97 | this.immediatelyFast$reloadFontStorages(); |
85 | 98 | } |
86 | | - |
| 99 | + } |
| 100 | + if (ImmediatelyFast.runtimeConfig.hud_batching && resourcePackWhichBreaksHudBatching != null) { |
| 101 | + ImmediatelyFast.LOGGER.warn("Resource pack " + resourcePackWhichBreaksHudBatching.getName() + " is not compatible with HUD batching. Temporarily disabling HUD batching."); |
| 102 | + ImmediatelyFast.runtimeConfig.hud_batching = false; |
| 103 | + } else { |
87 | 104 | ImmediatelyFast.runtimeConfig.hud_batching = ImmediatelyFast.config.hud_batching; |
88 | 105 | } |
89 | 106 | } |
|
0 commit comments