Skip to content

Commit 9989dc9

Browse files
committed
feat: redo skia impl & fix tons of bugs
1 parent 05b776b commit 9989dc9

45 files changed

Lines changed: 1941 additions & 424 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

bootstrap/build.gradle.kts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,13 +51,16 @@ dependencies {
5151

5252
provideIncludedDependencies(
5353
tripleVersion,
54-
mcData.loader.friendlyString
54+
mcData.loader.friendlyString,
55+
includeCompose = false
5556
).forEach {
5657
includeOrShade(compileOnly(it.dep)!!)
5758
}
5859

60+
includeOrShade(compileOnly(project(":modules:compose-bundle"))!!)
61+
5962
for (project in rootProject.project(":modules").subprojects) {
60-
if ("dependencies" !in project.path && "relocator" !in project.path) {
63+
if ("dependencies" !in project.path && "relocator" !in project.path && "compose-bundle" !in project.path) {
6164
includeOrShade(project(project.path))
6265
}
6366
}

buildSrc/src/main/kotlin/org/polyfrost/gradle/addDependencies.kt

Lines changed: 27 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -178,7 +178,7 @@ private val fabricApiModuleVersions = mapOf(
178178
* @param version The version of Minecraft. If null, the method is running inside the `:dependencies:legacy` module.
179179
* @param loader The mod loader being used.
180180
*/
181-
fun Project.provideIncludedDependencies(version: Triple<Int, Int, Int>?, loader: String?, shenanigans: String? = version?.toMCVer()): List<OCDependency> { // Either a String or ExternalModuleDependency
181+
fun Project.provideIncludedDependencies(version: Triple<Int, Int, Int>?, loader: String?, shenanigans: String? = version?.toMCVer(), includeCompose: Boolean = true): List<OCDependency> { // Either a String or ExternalModuleDependency
182182
project.logger.lifecycle("===> Adding dependencies for Minecraft ${version?.toMCVer()} & $loader")
183183

184184
val libs = rootProject
@@ -230,17 +230,9 @@ fun Project.provideIncludedDependencies(version: Triple<Int, Int, Int>?, loader:
230230

231231
deps.add(libs.findLibrary("hypixel-modapi").get().get())
232232
deps.add(libs.findLibrary("hypixel-data").get().get())
233-
deps.add(libs.findLibrary("jetbrains-compose-foundation").get().get())
234-
deps.add(libs.findLibrary("jetbrains-compose-material").get().get())
235-
deps.add(libs.findLibrary("jetbrains-compose-runtime").get().get())
236-
deps.add(libs.findLibrary("jetbrains-compose-ui").get().get())
237-
deps.add(libs.findLibrary("jetbrains-compose-ui-tooling-preview").get().get())
238-
deps.add(libs.findLibrary("jetbrains-compose-ui-util").get().get())
239-
deps.add(libs.findLibrary("jetbrains-skiko-awt").get().get())
240-
deps.add(libs.findLibrary("jetbrains-skiko-awt-runtime-windows-x64").get().get())
241-
deps.add(libs.findLibrary("jetbrains-skiko-awt-runtime-linux-x64").get().get())
242-
deps.add(libs.findLibrary("jetbrains-skiko-awt-runtime-macos-x64").get().get())
243-
deps.add(libs.findLibrary("jetbrains-skiko-awt-runtime-macos-arm64").get().get())
233+
if (includeCompose) {
234+
deps.addAll(provideComposeDependencies())
235+
}
244236
if (loader == "fabric") {
245237
deps.add(libs.findLibrary("fabric-language-kotlin").get().get())
246238
} else if (version != null && version.second > 12) { // forge / neoforge
@@ -258,9 +250,6 @@ fun Project.provideIncludedDependencies(version: Triple<Int, Int, Int>?, loader:
258250
}
259251
deps.add(libs.findLibrary("mixin-extras").get().get())
260252
deps.add(libs.findLibrary("mixin-squared").get().get())
261-
deps.add(libs.findLibrary("jetbrains-compose-navigation").get().get())
262-
deps.add(libs.findLibrary("jetbrains-lifecycle").get().get())
263-
deps.add(libs.findLibrary("jetbrains-viewmodel").get().get())
264253
deps.add(libs.findLibrary("commonmark").get().get())
265254
val actualDeps = mutableListOf<OCDependency>()
266255
for (dep in deps) {
@@ -274,6 +263,29 @@ fun Project.provideIncludedDependencies(version: Triple<Int, Int, Int>?, loader:
274263
return actualDeps
275264
}
276265

266+
fun Project.provideComposeDependencies(): List<Any> {
267+
val libs = rootProject
268+
.extensions
269+
.getByType<VersionCatalogsExtension>()
270+
.named("libs")
271+
return listOf(
272+
libs.findLibrary("jetbrains-compose-foundation").get().get(),
273+
libs.findLibrary("jetbrains-compose-material").get().get(),
274+
libs.findLibrary("jetbrains-compose-runtime").get().get(),
275+
libs.findLibrary("jetbrains-compose-ui").get().get(),
276+
libs.findLibrary("jetbrains-compose-ui-tooling-preview").get().get(),
277+
libs.findLibrary("jetbrains-compose-ui-util").get().get(),
278+
libs.findLibrary("jetbrains-skiko-awt").get().get(),
279+
libs.findLibrary("jetbrains-skiko-awt-runtime-windows-x64").get().get(),
280+
libs.findLibrary("jetbrains-skiko-awt-runtime-linux-x64").get().get(),
281+
libs.findLibrary("jetbrains-skiko-awt-runtime-macos-x64").get().get(),
282+
libs.findLibrary("jetbrains-skiko-awt-runtime-macos-arm64").get().get(),
283+
libs.findLibrary("jetbrains-compose-navigation").get().get(),
284+
libs.findLibrary("jetbrains-lifecycle").get().get(),
285+
libs.findLibrary("jetbrains-viewmodel").get().get(),
286+
)
287+
}
288+
277289
fun Project.provideFabricApiDependency(version: Triple<Int, Int, Int>): List<OCDependency> {
278290
val deps = mutableListOf<OCDependency>()
279291

minecraft/src/main/java/org/polyfrost/oneconfig/internal/OneConfig.java

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -169,7 +169,6 @@ private static void registerCommands() {
169169

170170
private static void registerKeybinds() {
171171
KeybindHelper.builder()
172-
.inScreens()
173172
.key(OmniKeys.KEY_RIGHT_SHIFT)
174173
.action(() -> {
175174
if (OmniClient.getWorld() == null && !OmniLoader.isDevelopment()) return;
@@ -188,16 +187,28 @@ private static void registerEventHandlers() {
188187
EventManager.register(InitializationEvent.class, e -> HudManager.INSTANCE.initialize());
189188
EventManager.register(HudRenderEvent.class, e -> {
190189
if (!SkiaCtx.INSTANCE.isReady()) return;
190+
191191
float sw = OmniClient.getWindow().getScreenWidth();
192192
float sh = OmniClient.getWindow().getScreenHeight();
193193
float scale = (float) OmniResolution.getScaleFactor();
194194
HudManager.guiScreenWidth = sw / scale;
195195
HudManager.guiScreenHeight = sh / scale;
196+
197+
// Update HUD visibility state for per-HUD filtering
198+
HudManager.isDebugScreenVisible = dev.deftu.omnicore.api.client.options.OmniVideoSettings.isDebugRendering();
199+
HudManager.isTabListVisible = org.lwjgl.glfw.GLFW.glfwGetKey(
200+
net.minecraft.client.Minecraft.getInstance().getWindow().getWindow(),
201+
org.lwjgl.glfw.GLFW.GLFW_KEY_TAB
202+
) == org.lwjgl.glfw.GLFW.GLFW_PRESS;
203+
HudManager.isGuiScreenOpen = Platform.screen().current() != null;
204+
196205
LegacyHudRenderer.INSTANCE.renderLive(e.ctx);
197206
SkiaCtx.INSTANCE.queueHudDraw(() -> {
198207
var ctx = new RenderContext(SkiaCtx.INSTANCE.getCanvas());
199208
HudManager.INSTANCE.render(ctx, sw, sh);
200209
});
210+
// Render Skia HUDs into the offscreen TextureTarget.
211+
// The mixin blits the texture onto MC's render target afterwards.
201212
SkiaCtx.INSTANCE.drawNow();
202213
});
203214
EventManager.register(HudEditorToggleEvent.class, e -> {
@@ -209,6 +220,13 @@ private static void registerEventHandlers() {
209220
}
210221
}
211222
});
223+
// Safety: if the HUD editor screen is closed by MC (e.g. player presses ESC)
224+
// without going through HudManager.closeEditor(), reset the editing flag
225+
EventManager.register(org.polyfrost.oneconfig.api.event.v1.events.ScreenOpenEvent.class, e -> {
226+
if (HudManager.INSTANCE.isEditing() && !(e.getScreen() instanceof HudEditorUIScreen)) {
227+
HudManager.INSTANCE.closeEditor();
228+
}
229+
});
212230
EventManager.register(InitializationEvent.class, e -> {
213231
ConfigManager.initialize();
214232
ConfigRegistry.INSTANCE.loadFrom(ConfigManager.active(), ConfigSource.OC);

minecraft/src/main/java/org/polyfrost/oneconfig/internal/OneConfigMixinInit.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -71,12 +71,12 @@ public List<String> getMixins() {
7171
mixins.add("compat.moulconfig.Mixin_MoulConfigAdapter_DandelionBp");
7272

7373
//#if MC>=1.19.2
74-
//$$mixins.add("Mixin_MinecraftClientResourceStuff");
75-
//$$mixins.add("compat.yacl.Mixin_YetAnotherConfigLib_Builder");
74+
//$$ mixins.add("Mixin_MinecraftClientResourceStuff");
75+
//$$ mixins.add("compat.yacl.Mixin_YetAnotherConfigLib_Builder");
7676
//#endif
7777

7878
//#if MC>=1.20.4
79-
//$$mixins.add("compat.rconfig.Mixin_Configurations");
79+
//$$ // mixins.add("compat.rconfig.Mixin_Configurations");
8080
//#endif
8181

8282
//#if MC>1.16
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package org.polyfrost.oneconfig.internal.mixin.compat.yacl;
2+
3+
import org.polyfrost.oneconfig.internal.compat.YACLCompat;
4+
import org.spongepowered.asm.mixin.Mixin;
5+
import org.spongepowered.asm.mixin.Pseudo;
6+
import org.spongepowered.asm.mixin.injection.At;
7+
import org.spongepowered.asm.mixin.injection.Inject;
8+
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
9+
10+
@Pseudo
11+
@Mixin(targets = "dev.isxander.yacl3.api.YetAnotherConfigLib", remap = false)
12+
public class Mixin_YetAnotherConfigLib_Builder {
13+
14+
@Inject(method = "generateScreen", at = @At("HEAD"))
15+
private void oneconfig$onGenerateScreen(Object parent, CallbackInfoReturnable<?> cir) {
16+
try {
17+
YACLCompat.parseYACL(this);
18+
} catch (Throwable ignored) {
19+
}
20+
}
21+
}
22+

minecraft/src/main/java/org/polyfrost/oneconfig/internal/mixin/events/Mixin_HudRenderEvent.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import dev.deftu.omnicore.api.client.render.OmniRenderingContext;
88
import org.polyfrost.oneconfig.api.event.v1.EventManager;
99
import org.polyfrost.oneconfig.api.event.v1.events.HudRenderEvent;
10+
import org.polyfrost.oneconfig.internal.ui.compose.SkiaCtx;
1011
import org.spongepowered.asm.mixin.Mixin;
1112
import org.spongepowered.asm.mixin.injection.At;
1213
import org.spongepowered.asm.mixin.injection.Inject;
@@ -17,9 +18,14 @@ public class Mixin_HudRenderEvent {
1718

1819
@Inject(method = "render", at = @At("TAIL"))
1920
private void renderHudCallback(GuiGraphics ctx, DeltaTracker deltaTracker, CallbackInfo ci) {
21+
//#if MC < 1.21.8
22+
ctx.flush();
23+
//#endif
2024
OmniRenderingContext context = OmniRenderingContext.from(ctx);
2125
float partialTicks = OmniRenderTicks.get();
2226
EventManager.INSTANCE.post(new HudRenderEvent(context, partialTicks));
27+
28+
SkiaCtx.INSTANCE.blitHud(ctx);
2329
}
2430

2531
}

minecraft/src/main/kotlin/org/polyfrost/oneconfig/internal/compat/MoulConfigCompat.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,7 @@ data object MoulConfigCompat {
119119
children.forEach {
120120
val tree = parseCategory(config, it, this) { parent -> map[parent] ?: this }
121121
map[it.identifier] = tree
122+
this.put(tree)
122123
}
123124
}
124125

@@ -141,6 +142,8 @@ data object MoulConfigCompat {
141142
return Tree.tree().apply {
142143
id = UUID.randomUUID().toString()
143144
this.category = categoryName
145+
this.title = displayName
146+
this.subcategory = displayName
144147
}
145148
}
146149

0 commit comments

Comments
 (0)