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