Skip to content

Commit 25ca05f

Browse files
Use accesswidener instead of mutable interfaces, improve fast dynamic resolution
1 parent 279dbe7 commit 25ca05f

6 files changed

Lines changed: 70 additions & 43 deletions

File tree

build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ version = project.mod_version
1111
group = project.maven_group
1212

1313
minecraft {
14-
14+
accessWidener "src/main/resources/${project.mod_name}.accesswidener"
1515
}
1616

1717
repositories {

src/main/java/io/github/ultimateboomer/resolutioncontrol/ResolutionControlMod.java

Lines changed: 37 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -395,7 +395,29 @@ public void updateFramebufferSize() {
395395
public void resizeMinecraftFramebuffers() {
396396
initMinecraftFramebuffers();
397397

398-
minecraftFramebuffers.forEach(this::resize);
398+
if (getEnableFastDynamicResolution()) {
399+
client.worldRenderer.entityOutlinesFramebuffer
400+
= DynamicResolutionHandler.INSTANCE.getCurrentFramebuffer(
401+
client.worldRenderer.entityOutlinesFramebuffer);
402+
client.worldRenderer.translucentFramebuffer
403+
= DynamicResolutionHandler.INSTANCE.getCurrentFramebuffer(
404+
client.worldRenderer.translucentFramebuffer);
405+
client.worldRenderer.entityFramebuffer
406+
= DynamicResolutionHandler.INSTANCE.getCurrentFramebuffer(
407+
client.worldRenderer.entityFramebuffer);
408+
client.worldRenderer.particlesFramebuffer
409+
= DynamicResolutionHandler.INSTANCE.getCurrentFramebuffer(
410+
client.worldRenderer.particlesFramebuffer);
411+
client.worldRenderer.weatherFramebuffer
412+
= DynamicResolutionHandler.INSTANCE.getCurrentFramebuffer(
413+
client.worldRenderer.weatherFramebuffer);
414+
client.worldRenderer.cloudsFramebuffer
415+
= DynamicResolutionHandler.INSTANCE.getCurrentFramebuffer(
416+
client.worldRenderer.cloudsFramebuffer);
417+
} else {
418+
minecraftFramebuffers.forEach(this::resize);
419+
}
420+
399421
}
400422

401423
public void calculateSize() {
@@ -418,11 +440,19 @@ public void resize(@Nullable Framebuffer framebuffer) {
418440
MinecraftClient.IS_SYSTEM_MAC
419441
);
420442
} else {
421-
framebuffer.resize(
422-
getWindow().getFramebufferWidth(),
423-
getWindow().getFramebufferHeight(),
424-
MinecraftClient.IS_SYSTEM_MAC
425-
);
443+
if (getEnableFastDynamicResolution()) {
444+
framebuffer.resize(
445+
getWindow().getWidth(),
446+
getWindow().getHeight(),
447+
MinecraftClient.IS_SYSTEM_MAC
448+
);
449+
} else {
450+
framebuffer.resize(
451+
getWindow().getFramebufferWidth(),
452+
getWindow().getFramebufferHeight(),
453+
MinecraftClient.IS_SYSTEM_MAC
454+
);
455+
}
426456
}
427457
shouldScale = prev;
428458
}
@@ -432,7 +462,7 @@ private Window getWindow() {
432462
}
433463

434464
private void setClientFramebuffer(Framebuffer framebuffer) {
435-
((MutableMinecraftClient) client).setFramebuffer(framebuffer);
465+
client.framebuffer = framebuffer;
436466
}
437467

438468
public KeyBinding getSettingsKey() {
@@ -467,9 +497,4 @@ public void setLastSettingsScreen(Class<? extends SettingsScreen> ordinal) {
467497
this.lastSettingsScreen = ordinal;
468498
}
469499

470-
public interface MutableMinecraftClient {
471-
void setFramebuffer(Framebuffer framebuffer);
472-
473-
int getFps();
474-
}
475500
}

src/main/java/io/github/ultimateboomer/resolutioncontrol/mixin/MinecraftClientMixin.java

Lines changed: 1 addition & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -2,39 +2,18 @@
22

33
import io.github.ultimateboomer.resolutioncontrol.ResolutionControlMod;
44
import net.minecraft.client.MinecraftClient;
5-
import net.minecraft.client.gl.Framebuffer;
6-
import org.spongepowered.asm.mixin.Final;
75
import org.spongepowered.asm.mixin.Mixin;
8-
import org.spongepowered.asm.mixin.Mutable;
9-
import org.spongepowered.asm.mixin.Shadow;
106
import org.spongepowered.asm.mixin.injection.At;
117
import org.spongepowered.asm.mixin.injection.Inject;
128
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
139

1410
@Mixin(MinecraftClient.class)
15-
public abstract class MinecraftClientMixin implements ResolutionControlMod.MutableMinecraftClient {
16-
@Mutable
17-
@Final
18-
@Shadow
19-
private Framebuffer framebuffer;
20-
21-
@Shadow private static int currentFps;
22-
23-
@Override
24-
public void setFramebuffer(Framebuffer framebuffer) {
25-
this.framebuffer = framebuffer;
26-
}
27-
11+
public abstract class MinecraftClientMixin {
2812
@Inject(method = "<init>", at = @At(value = "NEW", target = "net/minecraft/client/gl/Framebuffer"))
2913
private void onInitFramebuffer(CallbackInfo ci) {
3014
ResolutionControlMod mod = ResolutionControlMod.getInstance();
3115
if (mod.isScreenshotFramebufferAlwaysAllocated()) {
3216
mod.initScreenshotFramebuffer();
3317
}
3418
}
35-
36-
@Override
37-
public int getFps() {
38-
return currentFps;
39-
}
4019
}

src/main/java/io/github/ultimateboomer/resolutioncontrol/util/DynamicResolutionHandler.java

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import it.unimi.dsi.fastutil.objects.ObjectArrayList;
77
import net.minecraft.client.MinecraftClient;
88
import net.minecraft.client.gl.Framebuffer;
9+
import net.minecraft.text.LiteralText;
910

1011
import java.util.Collection;
1112
import java.util.HashMap;
@@ -45,17 +46,24 @@ public void tick() {
4546
private void update() {
4647
MinecraftClient client = MinecraftClient.getInstance();
4748

48-
int fps = ((ResolutionControlMod.MutableMinecraftClient) client).getFps();
49+
int fps = MinecraftClient.currentFps;
4950

50-
if (fps > 130) {
51-
currentScale = Math.min(currentScale + 1, scales.size() - 1);
52-
ResolutionControlMod.getInstance().updateFramebufferSize();
53-
} else if (fps < 110) {
54-
currentScale = Math.max(currentScale - 1, 0);
55-
ResolutionControlMod.getInstance().updateFramebufferSize();
51+
if (fps > 80) {
52+
setCurrentScale(Math.min(currentScale + 1, scales.size() - 1));
53+
} else if (fps < 60) {
54+
setCurrentScale(Math.max(currentScale - 1, 0));
5655
}
56+
}
5757

58-
System.out.println("Res: " + getCurrentScale());
58+
private void setCurrentScale(int currentScale) {
59+
boolean equal = this.currentScale == currentScale;
60+
this.currentScale = currentScale;
61+
62+
if (!equal) {
63+
ResolutionControlMod.getInstance().updateFramebufferSize();
64+
MinecraftClient.getInstance().player.sendMessage(
65+
new LiteralText("Res: " + getCurrentScale()), false);
66+
}
5967
}
6068

6169
public double getCurrentScale() {

src/main/resources/fabric.mod.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
"mixins": [
3030
"resolutioncontrol.mixins.json"
3131
],
32+
"accessWidener": "resolutioncontrol.accesswidener",
3233
"depends": {
3334
"fabricloader": ">=0.4.0",
3435
"fabric": "*"
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
accessWidener v1 named
2+
3+
accessible field net/minecraft/client/MinecraftClient framebuffer Lnet/minecraft/client/gl/Framebuffer;
4+
accessible field net/minecraft/client/MinecraftClient currentFps I
5+
6+
mutable field net/minecraft/client/MinecraftClient framebuffer Lnet/minecraft/client/gl/Framebuffer;
7+
8+
accessible field net/minecraft/client/render/WorldRenderer entityOutlinesFramebuffer Lnet/minecraft/client/gl/Framebuffer;
9+
accessible field net/minecraft/client/render/WorldRenderer translucentFramebuffer Lnet/minecraft/client/gl/Framebuffer;
10+
accessible field net/minecraft/client/render/WorldRenderer entityFramebuffer Lnet/minecraft/client/gl/Framebuffer;
11+
accessible field net/minecraft/client/render/WorldRenderer particlesFramebuffer Lnet/minecraft/client/gl/Framebuffer;
12+
accessible field net/minecraft/client/render/WorldRenderer weatherFramebuffer Lnet/minecraft/client/gl/Framebuffer;
13+
accessible field net/minecraft/client/render/WorldRenderer cloudsFramebuffer Lnet/minecraft/client/gl/Framebuffer;
14+

0 commit comments

Comments
 (0)