From 215e1d46d09ef0dcb0656bea94e73a0a40458d02 Mon Sep 17 00:00:00 2001 From: Ran-Mewo <43445785+Ran-Mewo@users.noreply.github.com> Date: Sun, 29 Mar 2026 19:29:01 +1100 Subject: [PATCH 01/27] wao --- build.gradle | 684 +----------------- buildSrc/build.gradle | 24 + buildSrc/src/main/groovy/dh-loader.gradle | 450 ++++++++++++ buildSrc/src/main/groovy/root.gradle | 44 ++ .../src/main/groovy/unimined-fabric.gradle | 13 + .../src/main/groovy/unimined-forge.gradle | 17 + .../src/main/groovy/unimined-neoforge.gradle | 16 + common/build.gradle | 40 +- coreSubProjects | 2 +- fabric/build.gradle | 153 +--- forge/build.gradle | 104 +-- forge/gradle.properties | 1 - gradle.properties | 5 - gradle/wrapper/gradle-wrapper.properties | 2 +- neoforge/build.gradle | 91 +-- neoforge/gradle.properties | 1 - settings.gradle | 153 +--- versionProperties/1.20.6.properties | 2 +- versionProperties/1.21.1.properties | 2 +- versionProperties/1.21.10.properties | 2 +- versionProperties/1.21.11.properties | 2 +- versionProperties/1.21.3.properties | 2 +- versionProperties/1.21.4.properties | 2 +- versionProperties/1.21.5.properties | 2 +- versionProperties/1.21.6.properties | 2 +- versionProperties/1.21.8.properties | 2 +- versionProperties/1.21.9.properties | 2 +- 27 files changed, 657 insertions(+), 1163 deletions(-) create mode 100644 buildSrc/build.gradle create mode 100644 buildSrc/src/main/groovy/dh-loader.gradle create mode 100644 buildSrc/src/main/groovy/root.gradle create mode 100644 buildSrc/src/main/groovy/unimined-fabric.gradle create mode 100644 buildSrc/src/main/groovy/unimined-forge.gradle create mode 100644 buildSrc/src/main/groovy/unimined-neoforge.gradle delete mode 100644 forge/gradle.properties delete mode 100644 neoforge/gradle.properties diff --git a/build.gradle b/build.gradle index df7c0ba84..7a8162a82 100644 --- a/build.gradle +++ b/build.gradle @@ -1,684 +1,8 @@ -import com.github.jengelman.gradle.plugins.shadow.transformers.Transformer -import com.github.jengelman.gradle.plugins.shadow.transformers.TransformerContext -import org.apache.tools.zip.ZipEntry - -import javax.annotation.Nonnull -import org.apache.tools.zip.ZipOutputStream - -import java.util.function.Function -import java.util.function.Predicate - - plugins { - id "java" - - // Plugin to put dependencies inside our final jar - id "com.github.johnrengelman.shadow" version '8.1.1' apply false - - // Plugin to create merged jars - id "io.github.pacifistmc.forgix" version "1.3.4" - - // Manifold preprocessor - id "systems.manifold.manifold-gradle-plugin" version "0.0.2-alpha" - - // Architectury is used here only as a replacement for forge's own loom - id "dev.architectury.loom" version "1.13-SNAPSHOT" apply false + id 'root' + id 'io.github.pacifistmc.forgix' version '2.+' } - -/** - * Creates the list of preprocessors to use. - * - * @param mcVers array of all MC versions - * @param mcIndex array index of the currently active MC version - */ -def writeBuildGradlePredefine(List mcVers, int mcIndex) -{ - // Build the list of preprocessors to use - StringBuilder sb = new StringBuilder(); - - sb.append("# DON'T TOUCH THIS FILE, This is handled by the build script\n"); - - - for (int i = 0; i < mcVers.size(); i++) - { - String verStr = mcVers[i].replace(".", "_"); - sb.append("MC_" + verStr + "=" + i.toString() + "\n"); - - if (mcIndex == i) - { - sb.append("MC_VER=" + i.toString() + "\n"); - } - } - - - // Check if this is a development build - if (mod_version.toLowerCase().contains("dev")) - { - // WARNING: only use this for logging, we don't want to have confusion - // when a method doesn't work correctly in the release build. - sb.append("DEV_BUILD=\n"); - } - - new File(projectDir, "build.properties").text = sb.toString() -} - - -// Transfers the values set in settings.gradle to the rest of the project -project.gradle.ext.getProperties().each { prop -> - rootProject.ext.set(prop.key, prop.value) - //println "Added prop [key:" + prop.key + ", value:" + prop.value + "]" -} -// Sets up manifold stuff -writeBuildGradlePredefine(rootProject.mcVers, rootProject.mcIndex) - -// Sets up the version string (the name we use for our jar) -rootProject.versionStr = rootProject.mod_version + "-" + rootProject.minecraft_version // + "-" + new Date().format("yyyy_MM_dd_HH_mm") - -class NativeTransformer implements Transformer { - private Predicate fileMatcher - private Function filePathMapper - - private final HashMap replacements = new HashMap() - private final HashMap rewrittenFiles = new HashMap() - private var nativeRelocator - - public File rootDir - - void matchFiles(Predicate matcher) { - fileMatcher = matcher - } - - void mapPaths(Function mapper) { - filePathMapper = mapper - } - - void relocateNative(String target, String replacement) { - if (replacement.length() > target.length()) { - throw new GradleException("Length of value \"${replacement}\" exceeds the length of \"${target}\": ${replacement.length()} > ${target.length()}") - } - - replacements.put(target, replacement) - } - - @Override - boolean canTransformResource(@Nonnull FileTreeElement element) { - return fileMatcher.test(element.name) - } - - @Override - void transform(@Nonnull TransformerContext context) { - byte[] content = context.is.readAllBytes() - - if (nativeRelocator == null) { - nativeRelocator = new NativeRelocator(rootDir.toPath().resolve("relocate_natives")) - } - - try { - String path = filePathMapper != null - ? filePathMapper.apply(context.path) - : context.path - content = nativeRelocator.processBinary(path, content, replacements) - - rewrittenFiles.put(path, content) - } - catch (Throwable e) { - throw new GradleException("Failed to relocate", e) - } - } - - @Override - boolean hasTransformedResource() { return !rewrittenFiles.isEmpty() } - - @Override - void modifyOutputStream(@Nonnull ZipOutputStream os, boolean preserveFileTimestamps) { - for (Map.Entry rewrittenFile : rewrittenFiles.entrySet()) { - os.putNextEntry(new ZipEntry(rewrittenFile.key)) - os.write(rewrittenFile.value) - } - } -} - -subprojects { p -> - // Does the same as "p == project(":common") || p == project(":fabric") || p == project(":quilt") || p == project(":forge") || p == project("WhateverWeAddLaterOn")" - // Useful later on so we dont have duplicated code - def isMinecraftSubProject = p != project(":core") && p != project(":api") - - - // Apply plugins - apply plugin: "java" - apply plugin: "com.github.johnrengelman.shadow" - if (isMinecraftSubProject) - apply plugin: "systems.manifold.manifold-gradle-plugin" - - // Apply forge's loom - if ((findProject(":forge") && p == project(":forge")) || - (findProject(":neoforge") && p == project(":neoforge")) - ) - { - apply plugin: "dev.architectury.loom" - } - - - // Set the manifold version (may not be required tough) - manifold { - manifoldVersion = rootProject.manifold_version - } - - - // set up custom configurations (configurations are a way to handle dependencies) - configurations { - // extends the shadowJar configuration - shadowMe - // have implemented dependencies automatically embedded in the final jar - implementation.extendsFrom(shadowMe) - - // Configuration fpr core & api - coreProjects - shadowMe.extendsFrom(coreProjects) - - - // FIXME this additional configuration is necessary because forge - // needs forgeRuntimeLibrary, although adding it to shadowMe - // causes runtime issues where the libraries aren't properly added - forgeShadowMe - // this should match shadowMe pretty closely - implementation.extendsFrom(forgeShadowMe) - shadowMe.extendsFrom(forgeShadowMe) - forgeRuntimeLibrary.extendsFrom(forgeShadowMe) - - - if (isMinecraftSubProject && p != project(":common")) { - // Shadow common - common - shadowCommon // Don't use shadow from the shadow plugin because we don't want IDEA to index this. - compileClasspath.extendsFrom common - runtimeClasspath.extendsFrom common - if (findProject(":forge")) - developmentForge.extendsFrom common - if (findProject(":neoforge")) - developmentNeoForge.extendsFrom common - compileClasspath.extendsFrom coreProjects - runtimeClasspath.extendsFrom coreProjects - if (findProject(":forge")) - developmentForge.extendsFrom coreProjects - if (findProject(":neoforge")) - developmentNeoForge.extendsFrom coreProjects - } - } - - - dependencies { - //=====================// - // shared dependencies // - //=====================// - - // Manifold - if (isMinecraftSubProject) { - annotationProcessor("systems.manifold:manifold-preprocessor:${rootProject.manifold_version}") - } - - // Log4j - if (p == project(":core")) - { - // the standalone core jar needs logging shaded otherwise it won't run - forgeShadowMe("org.apache.logging.log4j:log4j-api:${rootProject.log4j_version}") - forgeShadowMe("org.apache.logging.log4j:log4j-core:${rootProject.log4j_version}") - } - else - { - // When running in MC, MC already includes logging - implementation("org.apache.logging.log4j:log4j-api:${rootProject.log4j_version}") - implementation("org.apache.logging.log4j:log4j-core:${rootProject.log4j_version}") - } - - - // JOML - if (project.hasProperty("embed_joml") && embed_joml == "true") - forgeShadowMe("org.joml:joml:${rootProject.joml_version}") - else - implementation("org.joml:joml:${rootProject.joml_version}") - - // JUnit tests - implementation("org.junit.jupiter:junit-jupiter:5.8.2") - implementation("org.junit.jupiter:junit-jupiter-engine:5.8.2") - implementation("junit:junit:4.13") - - // FastUtil - // Note: MC 1.16 uses 8.2.1, and versions after use 8.5.12 - // We cannot relocate this library since we call some MC classes that reference it - implementation("it.unimi.dsi:fastutil:${rootProject.fastutil_version}") - - forgeShadowMe("com.github.luben:zstd-jni:${rootProject.zstd_version}") - - // Compression - forgeShadowMe("org.lz4:lz4-java:${rootProject.lz4_version}") // LZ4 - forgeShadowMe("org.tukaani:xz:${rootProject.xz_version}") // LZMA - - // Sqlite Database - forgeShadowMe("org.xerial:sqlite-jdbc:${rootProject.sqlite_jdbc_version}") - - // NightConfig (includes Toml & Json) - forgeShadowMe("com.electronwill.night-config:toml:${rootProject.nightconfig_version}") - forgeShadowMe("com.electronwill.night-config:json:${rootProject.nightconfig_version}") - - // SVG (not needed atm) -// forgeShadowMe("com.formdev:svgSalamander:${rootProject.svgSalamander_version}") - - // Netty - implementation("io.netty:netty-buffer:${rootProject.netty_version}") - - - - //==========================// - // conditional dependencies // - //==========================// - - - // Add core - if (isMinecraftSubProject) { - coreProjects(project(":core")) { - // Remove Junit test libraries - exclude group: "org.junit.jupiter", module: "junit-jupiter" - exclude group: "org.junit.jupiter", module: "junit-jupiter-engine" - exclude group: "junit", module: "junit" - // Removed dependencies - transitive false - } - } - - // Add the api - if (p != project(":api")) { - coreProjects(project(":api")) { - // Remove Junit test libraries - exclude group: "org.junit.jupiter", module: "junit-jupiter" - exclude group: "org.junit.jupiter", module: "junit-jupiter-engine" - exclude group: "junit", module: "junit" - // Removed dependencies - transitive false - } - } - - // Add common - if (isMinecraftSubProject && p != project(":common")) { - // Common - common(project(":common")) { transitive false } - shadowCommon(project(":common")) { transitive false } - } - } - - - shadowJar { - configurations = [project.configurations.shadowMe] - if (isMinecraftSubProject && p != project(":common")) { - configurations.push(project.configurations.shadowCommon) // Shadow the common subproject - relocate "com.seibel.distanthorizons.common", "loaderCommon.${p.name}.com.seibel.distanthorizons.common" // Move the loader files to a different location - } - def librariesLocation = "DistantHorizons.libraries" - - // Compression (LZ4) - relocate "net.jpountz", "${librariesLocation}.jpountz" - - // Logging - relocate "org.slf4j", "${librariesLocation}.slf4j" - - // Sqlite Database - // librariesLocation isn't used because it's too long for replacing paths in native libraries - // Allowing strings larger than the original string would require shifting the entire binary's contents - relocate "org.sqlite", "dh_sqlite", { - exclude "org/sqlite/native/**" - } - relocate "jdbc:sqlite", "jdbc:dh_sqlite" - - transform(NativeTransformer) { - rootDir = project.rootDir - - matchFiles { it.startsWith("org/sqlite") } - mapPaths { it.replace("org/sqlite", "dh_sqlite") } - - relocateNative "org/sqlite", "dh_sqlite" - relocateNative "org_sqlite", "dh_1sqlite" - } - - // ZStd - // librariesLocation isn't used because it's too long for replacing paths in native libraries - // Allowing strings larger than the original string would require shifting the entire binary's contents - relocate "com.github.luben", "dhcomgithubluben" - relocate "libzstd-jni", "libzstd-jni_dh" - relocate "zstd-jni", "zstd-jni_dh" - - transform(NativeTransformer) { - rootDir = project.rootDir - - matchFiles { it.contains("libzstd-jni") && !it.contains("aix/ppc64") } - mapPaths { it.replace("libzstd-jni", "libzstd-jni_dh") } - - relocateNative "com/github/luben", "dhcomgithubluben" - relocateNative "com_github_luben", "dhcomgithubluben" - } - - - // JOML - if (project.hasProperty("embed_joml") && embed_joml == "true") - relocate "org.joml", "${librariesLocation}.joml" - - // NightConfig (includes Toml & Json) - relocate "com.electronwill.nightconfig", "${librariesLocation}.electronwill.nightconfig" - - // Netty - // Don't relocate, it causes problems with using MC's FriendlyByteBufs -// relocate "io.netty", "${librariesLocation}.netty" - - mergeServiceFiles() - } - // Using jar.finalizedBy(shadowJar) causes issues so we do this scuffed bypass - jar.dependsOn(shadowJar) - - - // Put stuff from gradle.properties into the mod info - // Note: these resources are only included in the mod jars, the core and API jars don't include these files - processResources { - def resourceTargets = [ // Location of where to inject the properties - // Holds info like git commit - "build_info.json", - - // Properties for each of the loaders - "fabric.mod.json", - "quilt.mod.json", - "META-INF/mods.toml", - "META-INF/neoforge.mods.toml", - - // The mixins for each of the loaders - //"DistantHorizons."+ p.name +".fabricLike.mixins.json" - ] - def intoTargets = ["$buildDir/resources/main/"] // Location of the built resources folder - - // Fix forge version numbering system as it is weird - // For whatever reason forge uses [1.18, 1.18.1, 1.18.2) instead of the standard ["1.18", "1.18.1", "1.18.2"] - def compatible_forgemc_versions = "${compatible_minecraft_versions}".replaceAll("\"", "").replaceAll("]", ",)") -// println compatible_forgemc_versions - - // Quilt's custom contributors system - // This has to be like - // "Person": "Developer", "Another person": "Developer" - def quilt_contributors = [] - def mod_author_list = mod_authors.replaceAll("\"", "").replace("[", "").replace("]", "").split(",") - for (dev in mod_author_list) { - quilt_contributors.push("\"${dev.strip()}\": \"Developer\"") - } - quilt_contributors.reverse() - //println quilt_contributors.join(", ") - - - // These "hasProperty"'s are so that they can be passed through the cli (ie in the CI) - try { - if (infoGitCommit == "null") - infoGitCommit = 'git rev-parse --verify HEAD'.execute().text.trim() - if (infoGitBranch == "null") - infoGitBranch = 'git symbolic-ref --short HEAD'.execute().text.trim() - } catch (Exception e) { - infoGitCommit = infoGitBranch = "Git not found" - println "Git or Git project not found" - } - - // The left side is what gets replaced in the mod info and the right side is where to get it from in the gradle.properties - def replaceProperties = [ - version : mod_version, - mod_name : mod_readable_name, - group : maven_group, - authors : mod_authors, - description : mod_description, - homepage : mod_homepage, - source : mod_source, - issues : mod_issues, - discord : mod_discord, - minecraft_version : minecraft_version, - compatible_minecraft_versions: compatible_minecraft_versions, - compatible_forgemc_versions : compatible_forgemc_versions, - java_version : java_version, - quilt_contributors : "{"+quilt_contributors.join(", ")+"}", - - info_git_commit : infoGitBranch, - info_git_branch : infoGitCommit, - info_build_source : infoBuildSource, - - fabric_incompatibility_list : fabric_incompatibility_list, - fabric_recommend_list : fabric_recommend_list, - - neoforge_version_range : neoforge_version_range, - ] - - // replace any properties in the sub-projects with the values defined here - inputs.properties replaceProperties - replaceProperties.put "project", project - filesMatching(resourceTargets) { - expand replaceProperties - } - - intoTargets.each { target -> - if (file(target).exists()) { - copy { - from(sourceSets.main.resources) { - include resourceTargets - expand replaceProperties - } - into target - } - } - } - - - - // ==================== Delete un-needed files ==================== - // Jank solution to remove all unused accesswideners - // (neo)forge (well, mainly architectury) requires the original accesswidener file, meaning we require this jank solution to keep it - exclude { file -> - if (file.name.contains(".distanthorizons.accesswidener") && file.name != "${accessWidenerVersion}.distanthorizons.accesswidener") { - return true - } - return false - } - } - - - // Adds the standalone jar's entrypoint - jar { - from "LICENSE.txt" - manifest { - attributes( - 'Implementation-Title': rootProject.mod_name, - 'Implementation-Version': rootProject.mod_version, - 'Multi-Release': true, // needed for logging in the standalone core jar - 'Main-Class': 'com.seibel.distanthorizons.core.jar.JarMain', // When changing the main of the jar change this line - ) - } - } - - // this can be un-commented if we ever wanted to make DH modular (AKA use a module-info.java file) again - /* - // Tells gradle where to look for other modules - // Why isn't the classpath added to the modules path by default? - if (p == project(":core")) { - compileJava { - inputs.property('moduleName', 'dhApi') - doFirst { - options.compilerArgs = [ - '--module-path', classpath.asPath - ] - classpath = files() - } - } - } - */ -} - -allprojects { p -> - // Does the same as "p == project(":common") || p == project(":fabric") || p == project(":quilt") || p == project(":forge") || p == project("WhateverWeAddLaterOn")" - // Useful later on so we dont have duplicated code - def isMinecraftSubProject = p != project(":core") && p != project(":api") - - - apply plugin: "java" - apply plugin: "maven-publish" - - // Sets the name of the jar, the version will contain the name of the project if it isn't the root project - archivesBaseName = rootProject.mod_name - version = (project == rootProject ? "" : project.name + "-") + rootProject.versionStr - group = rootProject.maven_group - - // this is the text that appears at the top of the overview (home) page - // and is used when bookmarking a page - javadoc.title = rootProject.mod_name + "-" + project.name - - // Some annotations arent "technically" part of the official java standard, - // so we define it ourself here - javadoc { - configure( options ) { - tags( - 'todo:X"', - 'apiNote:a:API Note:', - 'implSpec:a:Implementation Requirements:', - 'implNote:a:Implementation Note:' - ) - } - } - - - repositories { - // Mojang overrides (added to fix downloading the wrong LWJGL libs on M1 Mac's and potentially other arm64 based machines) - maven { url "https://libraries.minecraft.net/" } - - // The central repo - mavenCentral() - - // Used for Google's Collect library - maven { url "https://repo.enonic.com/public/" } - - // For parchment mappings - // versions can be found here: https://ldtteam.jfrog.io/ui/native/parchmentmc-public/org/parchmentmc/data/ - maven { url "https://maven.parchmentmc.org" } - - // For Architectury API - maven { url "https://maven.architectury.dev" } - - // For Git repositories - maven { url "https://jitpack.io" } - - // For Manifold Preprocessor - maven { url "https://oss.sonatype.org/content/repositories/snapshots/" } - - // Required for importing Modrinth mods - maven { - name = "Modrinth" - url = "https://api.modrinth.com/maven" - content { - includeGroup "maven.modrinth" - } - } - - // Required for importing CursedForge mods - maven { - url "https://www.cursemaven.com" - content { - includeGroup "curse.maven" - } - } - - // VanillaGradle and Mixins in common - maven { url "https://repo.spongepowered.org/maven/" } - - // Canvas mod - maven { url "https://maven.vram.io/" } - // ModMenu mod - maven { url "https://maven.terraformersmc.com/" } - - // neoforge - maven { url "https://maven.neoforged.net/releases/" } - - // These 3 are for importing mods that arnt on CursedForge, Modrinth, GitHub, GitLab or anywhere opensource - flatDir { - dirs "${rootDir}/mods/fabric" - content { - includeGroup "fabric-mod" - } - } - flatDir { - dirs "${rootDir}/mods/quilt" - content { - includeGroup "quilt-mod" - } - } - flatDir { - dirs "${rootDir}/mods/forge" - content { - includeGroup "forge-mod" - } - } - } - - // Adds some dependencies that are in vanilla but not in core - if (p == project(":core")) { - OperatingSystem os = org.gradle.nativeplatform.platform.internal.DefaultNativePlatform.currentOperatingSystem; - - // Set the OS lwjgl is using to the current os - project.ext.lwjglNatives = "natives-" + os.toFamilyName() - - dependencies { - // All of these dependencies are in Vanilla Minecraft, but we need to depend on them as we arent importing Minecraft in the core - - // Imports most of lwjgl's libraries - implementation platform("org.lwjgl:lwjgl-bom:${rootProject.lwjgl_version}") - - // REMEMBER: Don't shadow stuff here, these are just the libs that are included in Minecraft so that the core can use them - implementation "org.lwjgl:lwjgl" - implementation "org.lwjgl:lwjgl-assimp" - implementation "org.lwjgl:lwjgl-glfw" - // OpenGL is removed since DH now handles rendering in the "Common" project - // so we can use OpenGL for old MC versions and Blaze3D (IE Vulkan) for newer ones -// implementation "org.lwjgl:lwjgl-openal" -// implementation "org.lwjgl:lwjgl-opengl" - implementation "org.lwjgl:lwjgl-stb" - implementation "org.lwjgl:lwjgl-tinyfd" - runtimeOnly "org.lwjgl:lwjgl::$lwjglNatives" - runtimeOnly "org.lwjgl:lwjgl-assimp::$lwjglNatives" - runtimeOnly "org.lwjgl:lwjgl-glfw::$lwjglNatives" -// runtimeOnly "org.lwjgl:lwjgl-openal::$lwjglNatives" -// runtimeOnly "org.lwjgl:lwjgl-opengl::$lwjglNatives" - runtimeOnly "org.lwjgl:lwjgl-stb::$lwjglNatives" - runtimeOnly "org.lwjgl:lwjgl-tinyfd::$lwjglNatives" - implementation "org.joml:joml:${rootProject.joml_version}" - - - // Some other dependencies - implementation("org.jetbrains:annotations:16.0.2") - implementation("com.google.code.findbugs:jsr305:3.0.2") - implementation("com.google.common:google-collect:0.5") - implementation("com.google.guava:guava:31.1-jre") - } - } - - - task copyCommonLoaderResources(type: Copy) { - from project(":common").file("src/main/resources/${accessWidenerVersion}.distanthorizons.accesswidener") - into(file(p.file("build/resources/main"))) - rename "${accessWidenerVersion}.distanthorizons.accesswidener", "distanthorizons.accesswidener" - } - - task copyCoreResources(type: Copy) { - from fileTree(project(":core").file("src/main/resources")) - into p.file("build/resources/main") - } - - tasks.withType(JavaCompile) { - if (isMinecraftSubProject) { - options.release = rootProject.java_version as Integer - } else { - options.release = 8; // Core & Api should use Java 8 no matter what - } - options.encoding = "UTF-8" - } - - java { - withSourcesJar() - } +forgix { + autoRun = true } diff --git a/buildSrc/build.gradle b/buildSrc/build.gradle new file mode 100644 index 000000000..3253068ae --- /dev/null +++ b/buildSrc/build.gradle @@ -0,0 +1,24 @@ +plugins { + id 'groovy-gradle-plugin' +} + +repositories { + gradlePluginPortal() + mavenCentral() + maven { url = 'https://maven.wagyourtail.xyz/releases' } + maven { url = 'https://maven.outlands.top/releases' } + maven { url = 'https://maven.wagyourtail.xyz/snapshots' } + maven { url = 'https://maven.architectury.dev/' } + maven { url = 'https://maven.fabricmc.net/' } + maven { url = 'https://maven.neoforged.net/releases/' } + maven { url = 'https://maven.minecraftforge.net/' } + maven { url = 'https://repo.spongepowered.org/repository/maven-public/' } + maven { url = 'https://oss.sonatype.org/content/repositories/snapshots/' } +} + +dependencies { + implementation 'com.gradleup.shadow:shadow-gradle-plugin:9.0.0' + implementation 'xyz.wagyourtail.unimined:xyz.wagyourtail.unimined.gradle.plugin:1.4.16-kappa' + implementation 'xyz.wagyourtail:manifold-gradle:1.0.0-SNAPSHOT' + implementation 'xyz.wagyourtail.jvmdowngrader:xyz.wagyourtail.jvmdowngrader.gradle.plugin:1.3.4' +} diff --git a/buildSrc/src/main/groovy/dh-loader.gradle b/buildSrc/src/main/groovy/dh-loader.gradle new file mode 100644 index 000000000..433f033ab --- /dev/null +++ b/buildSrc/src/main/groovy/dh-loader.gradle @@ -0,0 +1,450 @@ +import com.github.jengelman.gradle.plugins.shadow.transformers.ResourceTransformer +import com.github.jengelman.gradle.plugins.shadow.transformers.TransformerContext +import org.apache.tools.zip.ZipEntry +import org.apache.tools.zip.ZipOutputStream + +import javax.annotation.Nonnull +import java.util.function.Function +import java.util.function.Predicate + +// Convention plugin for all MC-facing subprojects (common + loaders). +// Common uses this directly; loaders use it via unimined-fabric/forge/neoforge. +// IMPORTANT: unimined MUST be applied before shadow/jvmdowngrader +// so its afterEvaluate runs first and can modify configs. + +plugins { + id 'java' + id 'maven-publish' + id 'xyz.wagyourtail.unimined' + id 'com.gradleup.shadow' + id 'xyz.wagyourtail.manifold' + id 'xyz.wagyourtail.jvmdowngrader' +} + +def isNotCommonProject = project.name != "common" + + +// ==================== Version Properties ==================== + +project.gradle.ext.getProperties().each { prop -> + rootProject.ext.set(prop.key, prop.value) +} + +manifold { + version = rootProject.manifold_version +} + + +// ==================== Repositories ==================== + +repositories { + maven { url "https://libraries.minecraft.net/" } + mavenCentral() + maven { url "https://repo.enonic.com/public/" } + maven { url "https://maven.parchmentmc.org" } + maven { url "https://maven.architectury.dev" } + maven { url "https://jitpack.io" } + maven { url "https://oss.sonatype.org/content/repositories/snapshots/" } + maven { + name = "Modrinth" + url = "https://api.modrinth.com/maven" + content { includeGroup "maven.modrinth" } + } + maven { + url "https://www.cursemaven.com" + content { includeGroup "curse.maven" } + } + maven { url "https://repo.spongepowered.org/maven/" } + maven { url "https://maven.terraformersmc.com/" } + maven { url "https://maven.neoforged.net/releases/" } + flatDir { + dirs "${rootDir}/mods/fabric" + content { includeGroup "fabric-mod" } + } + flatDir { + dirs "${rootDir}/mods/quilt" + content { includeGroup "quilt-mod" } + } + flatDir { + dirs "${rootDir}/mods/forge" + content { includeGroup "forge-mod" } + } +} + + +// ==================== Java Config ==================== + +tasks.withType(JavaCompile).configureEach { + options.release = rootProject.java_version as Integer + options.encoding = "UTF-8" +} + +java { + sourceCompatibility = JavaVersion.toVersion(gradle.ext.java_version as Integer) + targetCompatibility = JavaVersion.toVersion(gradle.ext.java_version as Integer) + withSourcesJar() +} + + +// ==================== Loader-Only Config ==================== + +if (isNotCommonProject) { + base { archivesName = rootProject.mod_name } + rootProject.ext.versionStr = rootProject.mod_version + "-" + rootProject.minecraft_version + version = project.name + "-" + rootProject.versionStr + group = rootProject.maven_group + + javadoc.title = rootProject.mod_name + "-" + project.name + javadoc { + configure(options) { + tags( + 'todo:X"', + 'apiNote:a:API Note:', + 'implSpec:a:Implementation Requirements:', + 'implNote:a:Implementation Note:' + ) + } + } + + tasks.withType(GenerateModuleMetadata).configureEach { + enabled = false + } + tasks.withType(Test).configureEach { + enabled = false + } + compileTestJava.enabled = false + tasks.withType(Sign).configureEach { + enabled = false + } + + jar { + from "LICENSE.txt" + manifest { + attributes( + 'Implementation-Title': rootProject.mod_name, + 'Implementation-Version': rootProject.mod_version, + 'Multi-Release': true, + 'Main-Class': 'com.seibel.distanthorizons.core.jar.JarMain', + ) + } + } +} + + +// ==================== Unimined Minecraft Config ==================== + +unimined.minecraft(sourceSets.main, true) { + version gradle.ext.minecraft_version + + mappings { + mojmap() + devNamespace "mojmap" + } +} + +if (isNotCommonProject) { + // Mixin remapping and common project wiring + unimined.minecraft(sourceSets.main, true) { + mods.modImplementation { + mixinRemap { + reset() + enableBaseMixin() + enableMixinExtra() + } + } + } + + dependencies { + implementation(project(":common")) + } + + processResources { + from project(":common").sourceSets.main.resources + } + + tasks.withType(JavaCompile).configureEach { + source(project(":common").sourceSets.main.allSource) + } +} else { + // Common: fabric for compilation + access widener, no jar remapping or runs + unimined.minecraft { + fabric { + loader gradle.ext.fabric_loader_version + accessWidener project.file("src/main/resources/${gradle.ext.accessWidenerVersion}.distanthorizons.accesswidener") + } + defaultRemapJar = false + runs.off = true + } +} + + +// ==================== Configurations ==================== + +evaluationDependsOn(":core") + +configurations { + shadowMe + coreProjects + shadowMe.extendsFrom(coreProjects) + implementation.extendsFrom(shadowMe) + + common + implementation.extendsFrom(common) +} + + +// ==================== Dependencies ==================== + +// Copy core's compileOnly deps so MC-provided deps are visible without redeclaring them. +project(":core").configurations.compileOnly.allDependencies.each { dep -> + if (!(dep instanceof ProjectDependency)) + dependencies.add("compileOnly", dep) +} + +dependencies { + // Manifold preprocessor & strings + annotationProcessor(manifold.module("preprocessor")) + annotationProcessor(manifold.module("strings")) + + // NightConfig: implementation in core (bundled) but Unimined strips it from compile classpath + compileOnly("com.electronwill.night-config:toml:${rootProject.nightconfig_version}") + + // Core & API projects — bundled into shadow jar + coreProjects(project(":core")) + coreProjects(project(":api")) + + // JOML: shadow for old MC versions that don't bundle it (core has it compileOnly already) + if (project.hasProperty("embed_joml") && embed_joml == "true") + shadowMe("org.joml:joml:${rootProject.joml_version}") + + // Common project dependency + if (isNotCommonProject) + common(project(":common")) { transitive false } +} + + +// ==================== NativeTransformer ==================== + +class NativeTransformer implements ResourceTransformer { + private Predicate fileMatcher + private Function filePathMapper + + private final HashMap replacements = new HashMap() + private final HashMap rewrittenFiles = new HashMap() + private nativeRelocator + + public File rootDir + + void matchFiles(Predicate matcher) { + fileMatcher = matcher + } + + void mapPaths(Function mapper) { + filePathMapper = mapper + } + + void relocateNative(String target, String replacement) { + if (replacement.length() > target.length()) { + throw new GradleException("Length of value \"${replacement}\" exceeds the length of \"${target}\": ${replacement.length()} > ${target.length()}") + } + replacements.put(target, replacement) + } + + @Override + boolean canTransformResource(@Nonnull FileTreeElement element) { + return fileMatcher != null && fileMatcher.test(element.relativePath.pathString) + } + + @Override + void transform(@Nonnull TransformerContext context) { + byte[] content = context.inputStream.readAllBytes() + + if (nativeRelocator == null) { + nativeRelocator = new NativeRelocator(rootDir.toPath().resolve("relocate_natives")) + } + + try { + String path = filePathMapper != null + ? filePathMapper.apply(context.path) + : context.path + content = nativeRelocator.processBinary(path, content, replacements) + rewrittenFiles.put(path, content) + } + catch (Throwable e) { + throw new GradleException("Failed to relocate", e) + } + } + + @Override + boolean hasTransformedResource() { return !rewrittenFiles.isEmpty() } + + @Override + void modifyOutputStream(@Nonnull ZipOutputStream os, boolean preserveFileTimestamps) { + for (Map.Entry rewrittenFile : rewrittenFiles.entrySet()) { + os.putNextEntry(new ZipEntry(rewrittenFile.key)) + os.write(rewrittenFile.value) + } + } +} + + +// ==================== Shadow JAR (loaders only) ==================== + +if (isNotCommonProject) { + shadowJar { + configurations = [project.configurations.shadowMe] + relocate "com.seibel.distanthorizons.common", "loaderCommon.${project.name}.com.seibel.distanthorizons.common" + def librariesLocation = "DistantHorizons.libraries" + + // LZ4 + relocate "net.jpountz", "${librariesLocation}.jpountz" + + // SLF4J + relocate "org.slf4j", "${librariesLocation}.slf4j" + + // SQLite + relocate "org.sqlite", "dh_sqlite", { exclude "org/sqlite/native/**" } + relocate "jdbc:sqlite", "jdbc:dh_sqlite" + + transform(NativeTransformer) { + rootDir = project.rootDir + matchFiles { it.startsWith("org/sqlite") } + mapPaths { it.replace("org/sqlite", "dh_sqlite") } + relocateNative "org/sqlite", "dh_sqlite" + relocateNative "org_sqlite", "dh_1sqlite" + } + + // ZStd + relocate "com.github.luben", "dhcomgithubluben" + relocate "libzstd-jni", "libzstd-jni_dh" + relocate "zstd-jni", "zstd-jni_dh" + + transform(NativeTransformer) { + rootDir = project.rootDir + matchFiles { it.contains("libzstd-jni") && !it.contains("aix/ppc64") } + mapPaths { it.replace("libzstd-jni", "libzstd-jni_dh") } + relocateNative "com/github/luben", "dhcomgithubluben" + relocateNative "com_github_luben", "dhcomgithubluben" + } + + // JOML (conditional) + if (project.hasProperty("embed_joml") && embed_joml == "true") + relocate "org.joml", "${librariesLocation}.joml" + + // NightConfig + relocate "com.electronwill.nightconfig", "${librariesLocation}.electronwill.nightconfig" + + mergeServiceFiles() + } + afterEvaluate { + tasks.named("remapJar").configure { + dependsOn(shadowJar) + inputFile.set(shadowJar.archiveFile) + } + + // Make run tasks use the shadow jar so relocated deps (NightConfig, etc.) work in dev. + // Without this, NeoForge's bundled NightConfig 3.8.x conflicts with DH's 3.6.6. + tasks.withType(JavaExec).configureEach { runTask -> + dependsOn(shadowJar) + classpath = files(shadowJar.archiveFile) + classpath.filter { file -> + !file.path.contains(project.buildDir.path) && + !file.path.contains("core${File.separator}build") && + !file.path.contains("api${File.separator}build") && + !file.path.contains("common${File.separator}build") + } + } + } +} + + +// ==================== Process Resources (loaders only) ==================== + +if (isNotCommonProject) { + processResources { + def resourceTargets = [ + "build_info.json", + "fabric.mod.json", + "quilt.mod.json", + "META-INF/mods.toml", + "META-INF/neoforge.mods.toml", + ] + + def compatible_forgemc_versions = "${rootProject.compatible_minecraft_versions}".replaceAll("\"", "").replaceAll("]", ",)") + + // Quilt contributors + def quilt_contributors = [] + def mod_author_list = rootProject.mod_authors.replaceAll("\"", "").replace("[", "").replace("]", "").split(",") + for (dev in mod_author_list) { + quilt_contributors.push("\"${dev.strip()}\": \"Developer\"") + } + quilt_contributors.reverse() + + try { + if (rootProject.infoGitCommit == "null") + rootProject.ext.infoGitCommit = 'git rev-parse --verify HEAD'.execute().text.trim() + if (rootProject.infoGitBranch == "null") + rootProject.ext.infoGitBranch = 'git symbolic-ref --short HEAD'.execute().text.trim() + } catch (Exception e) { + rootProject.ext.infoGitCommit = "Git not found" + rootProject.ext.infoGitBranch = "Git not found" + } + + def replaceProperties = [ + version : rootProject.mod_version, + mod_name : rootProject.mod_readable_name, + group : rootProject.maven_group, + authors : rootProject.mod_authors, + description : rootProject.mod_description, + homepage : rootProject.mod_homepage, + source : rootProject.mod_source, + issues : rootProject.mod_issues, + discord : rootProject.mod_discord, + minecraft_version : rootProject.minecraft_version, + compatible_minecraft_versions: rootProject.compatible_minecraft_versions, + compatible_forgemc_versions : compatible_forgemc_versions, + java_version : rootProject.java_version, + quilt_contributors : "{" + quilt_contributors.join(", ") + "}", + info_git_commit : rootProject.infoGitBranch, + info_git_branch : rootProject.infoGitCommit, + info_build_source : rootProject.infoBuildSource, + fabric_incompatibility_list : rootProject.fabric_incompatibility_list, + fabric_recommend_list : rootProject.fabric_recommend_list, + neoforge_version_range : rootProject.neoforge_version_range, + ] + + inputs.properties replaceProperties + replaceProperties.put "project", project + filesMatching(resourceTargets) { + expand replaceProperties + } + + // Remove unused access wideners + exclude { file -> + if (file.name.contains(".distanthorizons.accesswidener") && file.name != "${rootProject.accessWidenerVersion}.distanthorizons.accesswidener") { + return true + } + return false + } + } + + + // ==================== Resource Copy Tasks ==================== + + task copyCommonLoaderResources(type: Copy) { + from project(":common").file("src/main/resources/${rootProject.accessWidenerVersion}.distanthorizons.accesswidener") + into(file(project.file("build/resources/main"))) + rename "${rootProject.accessWidenerVersion}.distanthorizons.accesswidener", "distanthorizons.accesswidener" + } + + task copyCoreResources(type: Copy) { + from fileTree(project(":core").file("src/main/resources")) + into project.file("build/resources/main") + } + + + // ==================== JVMDowngrader ==================== + + jvmdg.downgradeTo = JavaVersion.toVersion(rootProject.java_version) + downgradeJar.archiveClassifier.set(null) + shadeDowngradedApi.archiveClassifier.set(null) +} diff --git a/buildSrc/src/main/groovy/root.gradle b/buildSrc/src/main/groovy/root.gradle new file mode 100644 index 000000000..6fd5802c4 --- /dev/null +++ b/buildSrc/src/main/groovy/root.gradle @@ -0,0 +1,44 @@ +plugins { + id 'java' +} + +// Transfer version properties from settings.gradle to project +project.gradle.ext.getProperties().each { prop -> + rootProject.ext.set(prop.key, prop.value) +} + +// Version string for archives +rootProject.ext.versionStr = rootProject.mod_version + "-" + rootProject.minecraft_version +rootProject.allprojects { + version = (it == rootProject ? "" : it.name + "-") + rootProject.versionStr + group = rootProject.maven_group +} + +// Create build.properties with preprocessor definitions +def writePreprocessorDefinitions() { + StringBuilder sb = new StringBuilder() + sb.append("# DON'T TOUCH THIS FILE, This is handled by the build script\n") + + gradle.ext.mcVers.eachWithIndex { ver, idx -> + sb.append("MC_${ver.replace('.', '_')}=${idx}\n") + if (gradle.ext.mcIndex == idx) + sb.append("MC_VER=${idx}\n") + } + + if (rootProject.mod_version.toLowerCase().contains("dev")) { + sb.append("DEV_BUILD=\n") + } + + new File(rootDir, "build.properties").text = sb.toString() +} +writePreprocessorDefinitions() + +// Wire JVMDowngrader to process remapped jars +gradle.projectsEvaluated { + rootProject.subprojects.each { + if (it.tasks.findByName('remapJar') == null) return + it.tasks.downgradeJar.inputFile = it.tasks.remapJar.archiveFile + it.tasks.jar.finalizedBy(it.tasks.remapJar) + it.tasks.remapJar.finalizedBy(it.tasks.shadeDowngradedApi) + } +} \ No newline at end of file diff --git a/buildSrc/src/main/groovy/unimined-fabric.gradle b/buildSrc/src/main/groovy/unimined-fabric.gradle new file mode 100644 index 000000000..9e3de7851 --- /dev/null +++ b/buildSrc/src/main/groovy/unimined-fabric.gradle @@ -0,0 +1,13 @@ +plugins { + id 'dh-loader' +} + +unimined.minecraft { + fabric { + loader gradle.ext.fabric_loader_version + accessWidener project(":common").file("src/main/resources/${gradle.ext.accessWidenerVersion}.distanthorizons.accesswidener") + } +} + +runClient.javaLauncher = null +runServer.javaLauncher = null diff --git a/buildSrc/src/main/groovy/unimined-forge.gradle b/buildSrc/src/main/groovy/unimined-forge.gradle new file mode 100644 index 000000000..587553a8f --- /dev/null +++ b/buildSrc/src/main/groovy/unimined-forge.gradle @@ -0,0 +1,17 @@ +plugins { + id 'dh-loader' +} + +def awFile = project(":common").file("src/main/resources/${gradle.ext.accessWidenerVersion}.distanthorizons.accesswidener") + +unimined.minecraft { + forge { + loader gradle.ext.forge_version + useToolchains = false + mixinConfig("DistantHorizons.forge.mixins.json") + accessTransformer aw2at(awFile) + } +} + +runClient.javaLauncher = null +runServer.javaLauncher = null diff --git a/buildSrc/src/main/groovy/unimined-neoforge.gradle b/buildSrc/src/main/groovy/unimined-neoforge.gradle new file mode 100644 index 000000000..a97de717a --- /dev/null +++ b/buildSrc/src/main/groovy/unimined-neoforge.gradle @@ -0,0 +1,16 @@ +plugins { + id 'dh-loader' +} + +def awFile = project(":common").file("src/main/resources/${gradle.ext.accessWidenerVersion}.distanthorizons.accesswidener") + +unimined.minecraft { + neoForged { + loader gradle.ext.neoforge_version + useToolchains = false + accessTransformer aw2at(awFile) + } +} + +runClient.javaLauncher = null +runServer.javaLauncher = null diff --git a/common/build.gradle b/common/build.gradle index 40870f24e..018764b41 100644 --- a/common/build.gradle +++ b/common/build.gradle @@ -1,41 +1,3 @@ - -// temporary fix for broken spongepowered version -buildscript { - configurations.configureEach { - resolutionStrategy { - force 'org.spongepowered:vanillagradle:0.2.1-20240507.024226-82' - // newer versions can be found by going to the link: - // https://repo.spongepowered.org/#browse/browse:maven-public:org%2Fspongepowered%2Fvanillagradle%2F0.2.1-SNAPSHOT - } - } -} - plugins { - id "org.spongepowered.gradle.vanilla" version "0.2.1-SNAPSHOT" + id 'dh-loader' } - -minecraft { - accessWideners(project(":common").file("src/main/resources/${accessWidenerVersion}.distanthorizons.accesswidener")) - version(rootProject.minecraft_version) -} - -dependencies { - // So mixins can be written in common - compileOnly group:'org.spongepowered', name:'mixin', version:'0.8.5' -} - - -publishing { - publications { - mavenCommon(MavenPublication) { - artifactId = rootProject.mod_readable_name - from components.java - } - } - - // See https://docs.gradle.org/current/userguide/publishing_maven.html for information on how to set up publishing. - repositories { - // Add repositories to publish to here. - } -} - diff --git a/coreSubProjects b/coreSubProjects index 2b8cddd42..ecb3dce96 160000 --- a/coreSubProjects +++ b/coreSubProjects @@ -1 +1 @@ -Subproject commit 2b8cddd424cb26040de8c85bb9cdaf7c06bc67f1 +Subproject commit ecb3dce963dce25a80c5be4d76ec22f7a49de67c diff --git a/fabric/build.gradle b/fabric/build.gradle index 0609d4659..5951c2005 100644 --- a/fabric/build.gradle +++ b/fabric/build.gradle @@ -1,110 +1,24 @@ plugins { - id "fabric-loom" version "1.10-SNAPSHOT" -} - -loom { - accessWidenerPath = project(":common").file("src/main/resources/${accessWidenerVersion}.distanthorizons.accesswidener") - - // "runs" isn't required, but when we do need it then it can be useful - runs { - client { - client() - setConfigName("Fabric Client") - ideConfigGenerated(true) // When true a run configuration file will be generated for IDE's. By default only set to true for the root project. - runDir("../run/client") - vmArgs( - // https://github.com/FabricMC/fabric-loom/issues/915#issuecomment-1609154390 - "-Dminecraft.api.auth.host=https://nope.invalid", - "-Dminecraft.api.account.host=https://nope.invalid", - "-Dminecraft.api.session.host=https://nope.invalid", - "-Dminecraft.api.services.host=https://nope.invalid", - // https://netty.io/wiki/reference-counted-objects.html#leak-detection-levels - "-Dio.netty.leakDetection.level=advanced", - "-XX:+UseZGC", - "-XX:+ZGenerational" - ) - programArgs( - "--username", "Dev", - // "--renderDebugLabels" is a Mojang command to show render names in RenderDoc - "--renderDebugLabels", - // "--tracy" is a Mojang command to allow individual frames to be debugged using Tracy https://github.com/wolfpld/tracy/releases/tag/v0.13.1 - "--tracy") - } - server { - server() - setConfigName("Fabric Server") - ideConfigGenerated(true) - runDir("../run/server") - vmArgs("-Dio.netty.leakDetection.level=advanced") - } - } -} - -remapJar { - inputFile = shadowJar.archiveFile - dependsOn shadowJar + id 'unimined-fabric' } -configurations { - // The addModJar basically embeds the mod to the built jar - addModJar - include.extendsFrom addModJar - modImplementation.extendsFrom addModJar -} - - +// ==================== Dependencies ==================== def addMod(path, enabled) { if (enabled == "2") dependencies { modImplementation(path) } else if (enabled == "1") - dependencies { modCompileOnly(path) } + dependencies { compileOnly(path) } } dependencies { - minecraft "com.mojang:minecraft:${rootProject.minecraft_version}" - mappings loom.layered() { - // Mojmap mappings - officialMojangMappings() - // Parchment mappings (it adds parameter mappings & javadoc) - parchment("org.parchmentmc.data:parchment-${rootProject.parchment_version}@zip") - } // Fabric loader modImplementation "net.fabricmc:fabric-loader:${rootProject.fabric_loader_version}" - -// annotationProcessor "javax.annotation:javax.annotation-api:1.3.2" -// implementation("javax.annotation:javax.annotation-api:1.3.2") -// runtimeOnly "javax.annotation:javax.annotation-api:1.3.2" -// compileOnly "javax.annotation:javax.annotation-api:1.3.2" -// modImplementation "javax.annotation:javax.annotation-api:1.3.2" - - // Fabric API - addModJar(fabricApi.module("fabric-api-base", rootProject.fabric_api_version)) - addModJar(fabricApi.module("fabric-lifecycle-events-v1", rootProject.fabric_api_version)) - if (buildVersionBefore(minecraft_version, "1.21.9")) - { - addModJar(fabricApi.module("fabric-resource-loader-v0", rootProject.fabric_api_version)) - } - else // > 1.21.9 - { - addModJar(fabricApi.module("fabric-resource-loader-v0", rootProject.fabric_api_version)) - addModJar(fabricApi.module("fabric-resource-loader-v1", rootProject.fabric_api_version)) - } - addModJar(fabricApi.module("fabric-events-interaction-v0", rootProject.fabric_api_version)) - addModJar(fabricApi.module("fabric-rendering-v1", rootProject.fabric_api_version)) - addModJar(fabricApi.module("fabric-networking-api-v1", rootProject.fabric_api_version)) - addModJar(fabricApi.module("fabric-entity-events-v1", rootProject.fabric_api_version)) - if (buildVersionBefore(minecraft_version, "1.19.2")) - addModJar(fabricApi.module("fabric-command-api-v1", rootProject.fabric_api_version)) - else - addModJar(fabricApi.module("fabric-command-api-v2", rootProject.fabric_api_version)) - - // used by mod menu in MC 1.20.6+ - addModJar(fabricApi.module("fabric-screen-api-v1", rootProject.fabric_api_version)) - addModJar(fabricApi.module("fabric-key-binding-api-v1", rootProject.fabric_api_version)) - + // Fabric API (bundled as jar-in-jar so users don't need to install it separately) + modImplementation "net.fabricmc.fabric-api:fabric-api:${rootProject.fabric_api_version}" + include "net.fabricmc.fabric-api:fabric-api:${rootProject.fabric_api_version}" // Mod Menu addMod("com.terraformersmc:modmenu:${rootProject.modmenu_version}", rootProject.enable_mod_menu) @@ -117,11 +31,7 @@ dependencies { // Sodium addMod("maven.modrinth:sodium:${rootProject.sodium_version}", rootProject.enable_sodium) - if (rootProject.enable_sodium == "2") { - implementation "org.joml:joml:1.10.2" - modImplementation(fabricApi.module("fabric-rendering-data-attachment-v1", rootProject.fabric_api_version)) - modImplementation(fabricApi.module("fabric-rendering-fluids-v1", rootProject.fabric_api_version)) - } + if (rootProject.enable_sodium == "2") implementation "org.joml:joml:1.10.2" // Lithium addMod("maven.modrinth:lithium:${rootProject.lithium_version}", rootProject.enable_lithium) @@ -133,65 +43,32 @@ dependencies { addMod("com.github.quiqueck:BCLib:${rootProject.bclib_version}", rootProject.enable_bclib) // Canvas - addMod("io.vram:canvas-fabric-${project.canvas_version}", rootProject.enable_canvas) + addMod("io.vram:canvas-fabric-${rootProject.canvas_version}", rootProject.enable_canvas) // Immersive Portals if (rootProject.enable_immersive_portals == "1") { - modCompileOnly("com.github.iPortalTeam.ImmersivePortalsMod:imm_ptl_core:${project.immersive_portals_version}") + modCompileOnly("com.github.iPortalTeam.ImmersivePortalsMod:imm_ptl_core:${rootProject.immersive_portals_version}") } else if (rootProject.enable_immersive_portals == "2") { - modImplementation ("com.github.iPortalTeam.ImmersivePortalsMod:imm_ptl_core:${project.immersive_portals_version}") { + modImplementation ("com.github.iPortalTeam.ImmersivePortalsMod:imm_ptl_core:${rootProject.immersive_portals_version}") { exclude(group: "net.fabricmc.fabric-api") transitive(false) } - modImplementation ("com.github.iPortalTeam.ImmersivePortalsMod:q_misc_util:${project.immersive_portals_version}") { + modImplementation("com.github.iPortalTeam.ImmersivePortalsMod:q_misc_util:${rootProject.immersive_portals_version}") { exclude(group: "net.fabricmc.fabric-api") transitive(false) } - modImplementation ("com.github.iPortalTeam.ImmersivePortalsMod:build:${project.immersive_portals_version}") { + modImplementation("com.github.iPortalTeam.ImmersivePortalsMod:build:${rootProject.immersive_portals_version}") { exclude(group: "net.fabricmc.fabric-api") transitive(false) } - modImplementation("net.fabricmc.fabric-api:fabric-api:${rootProject.fabric_api_version}") api("com.github.LlamaLad7:MixinExtras:0.2.0-beta.4") annotationProcessor("com.github.LlamaLad7:MixinExtras:0.2.0-beta.4") } } -private static boolean buildVersionBefore(String minecraft_version, String compareVersion) -{ - int sortValue = sortSemanticVersionOldestToNewest(minecraft_version, compareVersion); - return sortValue == -1; -} -/** - * input format: "major.minor.patch" - * needed so we can sort versions with different length strings - * IE: 1.21.1 should come before 1.21.10 - */ -private static int sortSemanticVersionOldestToNewest(String version1, String version2) -{ - String[] parts1 = version1.split("\\."); - String[] parts2 = version2.split("\\."); - - int major1 = Integer.parseInt(parts1[0]); - int major2 = Integer.parseInt(parts2[0]); - if (major1 != major2) - { - return Integer.compare(major1, major2); - } - - int minor1 = Integer.parseInt(parts1[1]); - int minor2 = Integer.parseInt(parts2[1]); - if (minor1 != minor2) - { - return Integer.compare(minor1, minor2); - } - - int patch1 = Integer.parseInt(parts1[2]); - int patch2 = Integer.parseInt(parts2[2]); - return Integer.compare(patch1, patch2); -} +// ==================== Tasks ==================== task deleteResources(type: Delete) { delete file("build/resources/main") @@ -202,14 +79,12 @@ processResources { dependsOn(copyCommonLoaderResources) } -runClient { +tasks.named('runClient') { dependsOn(copyCoreResources) dependsOn(copyCommonLoaderResources) -// jvmArgs([ "-XX:-OmitStackTraceInFastThrow", minecraftMemoryJavaArg ]) finalizedBy(deleteResources) } - sourcesJar { def commonSources = project(":common").sourcesJar dependsOn commonSources diff --git a/forge/build.gradle b/forge/build.gradle index e9fc94579..b28418f08 100644 --- a/forge/build.gradle +++ b/forge/build.gradle @@ -1,107 +1,38 @@ plugins { - // Note: This is only needed for multi-loader projects - // The main architectury loom version is set at the start of the root build.gradle - id "architectury-plugin" version "3.4-SNAPSHOT" + id 'unimined-forge' } -sourceCompatibility = targetCompatibility = JavaVersion.VERSION_21 -architectury { - platformSetupLoomIde() - forge() -} - -//loom { -// forge { -// convertAccessWideners.set(true) -// extraAccessWideners.add("lod.accesswidener") -// mixinConfigs("DistantHorizons.mixins.json") -// } -//} - -loom { - silentMojangMappingsLicense() // Shut the licencing warning - accessWidenerPath = project(":common").file("src/main/resources/${accessWidenerVersion}.distanthorizons.accesswidener") - - forge { - convertAccessWideners = true - extraAccessWideners.add loom.accessWidenerPath.get().asFile.name - - mixinConfigs = [ - "DistantHorizons.forge.mixins.json" - ] - } - - // "runs" isn't required, but when we do need it then it can be useful - runs { - client { - client() - setConfigName("Forge Client") - ideConfigGenerated(false) // When true a run configuration file will be generated for IDE's. By default only set to true for the root project. - runDir("../run/client") - vmArgs( - // https://github.com/FabricMC/fabric-loom/issues/915#issuecomment-1609154390 - "-Dminecraft.api.auth.host=https://nope.invalid", - "-Dminecraft.api.account.host=https://nope.invalid", - "-Dminecraft.api.session.host=https://nope.invalid", - "-Dminecraft.api.services.host=https://nope.invalid", - // https://netty.io/wiki/reference-counted-objects.html#leak-detection-levels - "-Dio.netty.leakDetection.level=advanced" - ) - programArgs("--username", "Dev") - } - server { - server() - setConfigName("Forge Server") - ideConfigGenerated(false) - runDir("../run/server") - vmArgs("-Dio.netty.leakDetection.level=advanced") - } - } -} - -remapJar { - inputFile = shadowJar.archiveFile - dependsOn shadowJar -} +// ==================== Mod Dependency Helper ==================== def addMod(path, enabled) { if (enabled == "2") - dependencies { implementation(path) } + dependencies { modImplementation(path) } else if (enabled == "1") - dependencies { modCompileOnly(path) } + dependencies { compileOnly(path) } } + +// ==================== Dependencies ==================== + dependencies { - minecraft "com.mojang:minecraft:${rootProject.minecraft_version}" - mappings loom.layered() { - // Mojmap mappings - officialMojangMappings() - // Parchment mappings (it adds parameter mappings & javadoc) - parchment("org.parchmentmc.data:parchment-${rootProject.parchment_version}@zip") - } - - // Forge - forge "net.minecraftforge:forge:${rootProject.minecraft_version}-${rootProject.forge_version}" - + // TerraForged addMod("curse.maven:TerraForged-363820:${rootProject.terraforged_version}", rootProject.enable_terraforged) + // TerraFirmaCraft addMod("curse.maven:TerraFirmaCraft-302973:4616004", rootProject.enable_terrafirmacraft) - - if ( // Only run on MC 1.20.6 or later - // FIXME: Add an environment variable for the Major, Minor, and Patch version number of Minecraft - minecraft_version.split("\\.")[1].toInteger() >= 20 && - ( - minecraft_version.split("\\.").length > 1 && // Incase there isn't a minor version - minecraft_version.split("\\.")[2].toInteger() >= 6 - ) - ) { - // (potential) hack fix, force jopt-simple to be exactly 5.0.4 because Mojang ships that version, but some transitive dependencies request 6.0+ - implementation('net.sf.jopt-simple:jopt-simple:5.0.4') //{ version { strictly '5.0.4' } } + // TODO: Check if this is still needed and if so ensure this code works for MC 26.1+ + // (potential) hack fix for MC 1.20.6 and later, force jopt-simple to be exactly 5.0.4 because Mojang ships that version, but some transitive dependencies request 6.0+ + def mcParts = rootProject.minecraft_version.split("\\.") + if (mcParts[1].toInteger() >= 20 && (mcParts.length > 2 && mcParts[2].toInteger() >= 6)) { + implementation('net.sf.jopt-simple:jopt-simple:5.0.4') } } + +// ==================== Tasks ==================== + task deleteResources(type: Delete) { delete file("build/resources/main") } @@ -119,4 +50,3 @@ tasks.named('runClient') { dependsOn(tasks.named('copyAllResources')) finalizedBy(deleteResources) } - diff --git a/forge/gradle.properties b/forge/gradle.properties deleted file mode 100644 index 32f842a63..000000000 --- a/forge/gradle.properties +++ /dev/null @@ -1 +0,0 @@ -loom.platform=forge \ No newline at end of file diff --git a/gradle.properties b/gradle.properties index ba7b2f522..12e455bf9 100644 --- a/gradle.properties +++ b/gradle.properties @@ -34,11 +34,6 @@ fastutil_version=8.2.1 log4j_version=2.23.1 joml_version=1.10.2 -# Architectury config -# this is necessary for MC 1.21.3 because including Sodium and Iris throws "Mod was built with a newer version of Loom (1.8.9), you are using Loom (1.7.415)" -loom.ignoreDependencyLoomVersionValidation=true - - # These are here so they can be changed with cmd arguments # If they are null, they would be automatically set # (This is mainly used for the CI) diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index cea7a793a..c61a118f7 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.12-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-9.4.1-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/neoforge/build.gradle b/neoforge/build.gradle index f23c2c45b..9809b552b 100644 --- a/neoforge/build.gradle +++ b/neoforge/build.gradle @@ -1,110 +1,43 @@ plugins { - // Note: This is only needed for multi-loader projects - // The main architectury loom version is set at the start of the root build.gradle - id "architectury-plugin" version "3.4-SNAPSHOT" -} - -sourceCompatibility = targetCompatibility = JavaVersion.VERSION_17 - -architectury { - platformSetupLoomIde() - neoForge() -} - -loom { - silentMojangMappingsLicense() // Shut the licencing warning - accessWidenerPath = project(":common").file("src/main/resources/${accessWidenerVersion}.distanthorizons.accesswidener") - - neoForge { - // Access wideners are defined in the `remapJar.atAccessWideners` - - // Mixins are defined in the `mods.toml` - } - mixin { - // Mixins are defined in the `mods.toml` - } - - // "runs" isn't required, but when we do need it then it can be useful - runs { - client { - client() - setConfigName("NeoForge Client") - ideConfigGenerated(false) // When true a run configuration file will be generated for IDE's. By default only set to true for the root project. - runDir("../run/client") - vmArgs( - "-Dio.netty.leakDetection.level=advanced", - "-XX:+UseZGC") // https://netty.io/wiki/reference-counted-objects.html#leak-detection-levels - programArgs( - "--username", "Dev", - // "--renderDebugLabels" is a Mojang command to show render names in RenderDoc - "--renderDebugLabels", - // "--tracy" is a Mojang command to allow individual frames to be debugged using Tracy https://github.com/wolfpld/tracy/releases/tag/v0.13.1 - "--tracy") - } - server { - server() - setConfigName("NeoForge Server") - ideConfigGenerated(false) - runDir("../run/server") - vmArgs("-Dio.netty.leakDetection.level=advanced") - } - } + id 'unimined-neoforge' } +// ==================== Mod Dependency Helper ==================== def addMod(path, enabled) { if (enabled == "2") - dependencies { implementation(path) } + dependencies { modImplementation(path) } else if (enabled == "1") - dependencies { modCompileOnly(path) } + dependencies { compileOnly(path) } } -dependencies { - minecraft "com.mojang:minecraft:${rootProject.minecraft_version}" - mappings loom.layered() - { - // Mojmap mappings - officialMojangMappings() - // Parchment mappings (it adds parameter mappings & javadoc) - parchment("org.parchmentmc.data:parchment-${rootProject.parchment_version}@zip") - } - - - // Neoforge - neoForge "net.neoforged:neoforge:${rootProject.neoforge_version}" + +// ==================== Dependencies ==================== + +dependencies { // Iris addMod("maven.modrinth:iris:${rootProject.neo_iris_version}", rootProject.neo_enable_iris) - } +// ==================== Tasks ==================== task deleteResources(type: Delete) { delete file("build/resources/main") } -tasks.register('copyAllResources') { +processResources { dependsOn(copyCoreResources) dependsOn(copyCommonLoaderResources) } -processResources { - dependsOn(tasks.named('copyAllResources')) -} - tasks.named('runClient') { - dependsOn(tasks.named('copyAllResources')) + dependsOn(copyCoreResources) + dependsOn(copyCommonLoaderResources) finalizedBy(deleteResources) } -remapJar { - inputFile = shadowJar.archiveFile - dependsOn shadowJar - - atAccessWideners.add("distanthorizons.accesswidener") -} - sourcesJar { def commonSources = project(":common").sourcesJar dependsOn commonSources diff --git a/neoforge/gradle.properties b/neoforge/gradle.properties deleted file mode 100644 index 85e1db4b7..000000000 --- a/neoforge/gradle.properties +++ /dev/null @@ -1 +0,0 @@ -loom.platform=neoForge \ No newline at end of file diff --git a/settings.gradle b/settings.gradle index 41c8850ea..f7ca39e42 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1,49 +1,5 @@ -pluginManagement { - repositories { - maven { - name "Fabric" - url "https://maven.fabricmc.net/" - } - maven { - name "Forge" - url "https://maven.minecraftforge.net/" - } - maven { - name "NeoForge Releases" - url "https://maven.neoforged.net/releases/" - } - maven { - name "NeoForge Snapshot" - url "https://maven.neoforged.net/snapshots/" - } - maven { - name "Architectury" - url "https://maven.architectury.dev/" - } - maven { - name "Quilt" - url "https://maven.quiltmc.org/repository/release" - } - maven { // Used for Vanilla Minecraft's libraries - name "Sponge" - url "https://repo.spongepowered.org/repository/maven-public/" - } - maven { - name "ParchmentMC" - url "https://maven.parchmentmc.org" - } - mavenCentral() - gradlePluginPortal() - - // Not needed, but useful for debugging gradle plugins - mavenLocal() - } -} - - - -// Throw an error and a little help message if the user forgot to clone the core sub-project -if (!file("./coreSubProjects/LICENSE.txt").exists()) { // the LICENCE.txt file should always, and only exist if the core-sub-project was cloned +// Throw an error if the core sub-project wasn't cloned +if (!file("./coreSubProjects/LICENSE.txt").exists()) { println(''' It seems that the core sub project was not included... please make sure that when you were cloning the repo, you were using the `--recurse-submodules` flag on git. @@ -55,98 +11,55 @@ If you still need help with compiling, please read the Readme.md } +def loadVersionProperties() { + def mcVers = fileTree("versionProperties").files.collect { it.name.replaceAll("\\.properties", "") } + .sort { a, b -> + def aParts = a.tokenize('.'); def bParts = b.tokenize('.') + for (int i = 0; i < Math.min(aParts.size(), bParts.size()); i++) { + def aNum = aParts[i].isInteger() ? aParts[i].toInteger() : aParts[i] + def bNum = bParts[i].isInteger() ? bParts[i].toInteger() : bParts[i] + def compare = aNum <=> bNum + if (compare != 0) return compare + } + return aParts.size() <=> bParts.size() + } + def mcVersion = hasProperty("mcVer") ? mcVer : "" + def mcIndex = mcVers.indexOf(mcVersion) -/** Loads the VersionProperties fiel for the currently selected Minecraft version. */ -def loadProperties() -{ - def defaultMcVersion = "1.20.1" // 1.20.1 is our current most stable version so we use that if no version was defined - - def mcVersion = "" - def mcVers = fileTree("versionProperties").files.name // Get all the files in "versionProperties" - for (int i = 0; i < mcVers.size(); i++) - { - String version = mcVers[i]; - version = version.replaceAll("\\.properties", "") // As we are getting the file names, we should remove the ".properties" at the end to get the versions - mcVers[i] = version; + if (mcIndex == -1) { + def defaultVersion = "1.20.1" + println "No mcVer set or invalid. Defaulting to ${defaultVersion}." + println "Tip: Use -PmcVer=\"${defaultVersion}\" to set the MC version." + mcVersion = defaultVersion + mcIndex = mcVers.indexOf(defaultVersion) + assert mcIndex != -1 : "Default MC version ${defaultVersion} not found in ${mcVers}" } - mcVers.sort((a,b) -> sortSemanticVersionOldestToNewest(a,b)) // Sort so it always goes from oldest to newest + println "Available MC versions: ${mcVers}" + println "Loading properties file: ${mcVersion}.properties" - int mcIndex = -1 - println "Avalible MC versions: ${mcVers}" - if (hasProperty("mcVer")) - { - mcVersion = mcVer - mcIndex = mcVers.indexOf(mcVer) - } - - if (mcIndex == -1) - { - println "No mcVer set or the set mcVer is invalid! Defaulting to ${defaultMcVersion}." - println "Tip: Use -PmcVer=\"${defaultMcVersion}\" in cmd arg to set mcVer." - mcVersion = defaultMcVersion - mcIndex = mcVers.indexOf(defaultMcVersion) - assert mcIndex != -1 - } - - println "Loading properties file at " + mcVersion + ".properties" def props = new Properties() - props.load(new FileInputStream("$rootDir/versionProperties/"+"$mcVersion"+".properties")) + props.load(new FileInputStream("$rootDir/versionProperties/${mcVersion}.properties")) - props.each { prop -> - gradle.ext.set(prop.key, prop.value) - // println "Added prop [key:" + prop.key + ", value:" + prop.value + "]" - } + props.each { key, value -> gradle.ext.set(key, value) } gradle.ext.mcVers = mcVers gradle.ext.mcIndex = mcIndex } -/** - * input format: "major.minor.patch" - * needed so we can sort versions with different length strings - * IE: 1.21.1 should come before 1.21.10 - */ -private static int sortSemanticVersionOldestToNewest(String version1, String version2) -{ - String[] parts1 = version1.split("\\."); - String[] parts2 = version2.split("\\."); - - int major1 = Integer.parseInt(parts1[0]); - int major2 = Integer.parseInt(parts2[0]); - if (major1 != major2) - { - return Integer.compare(major1, major2); - } - - int minor1 = Integer.parseInt(parts1[1]); - int minor2 = Integer.parseInt(parts2[1]); - if (minor1 != minor2) - { - return Integer.compare(minor1, minor2); - } - - int patch1 = Integer.parseInt(parts1[2]); - int patch2 = Integer.parseInt(parts2[2]); - return Integer.compare(patch1, patch2); -} - -loadProperties() +loadVersionProperties() - - -// Minecraft independent sub-projects +// Minecraft-independent sub-projects include("core") project(":core").projectDir = file('coreSubProjects/core') include("api") project(":api").projectDir = file('coreSubProjects/api') -// Minecraft dependent sub-projects +// Minecraft-dependent sub-projects include("common") -// Enables or disables the subprojects depending on whats in the versionProperties/mcVer.properties -for (loader in ((String) gradle.builds_for).split(",")) { - def loaderName = loader.strip() // Strip it in case a space is added before or after the comma - println "Adding loader " + loaderName +((String) gradle.builds_for).split(",").each { loader -> + def loaderName = loader.trim() + println "Adding loader: ${loaderName}" include(loaderName) } diff --git a/versionProperties/1.20.6.properties b/versionProperties/1.20.6.properties index e3096bd7c..5693b1b3a 100644 --- a/versionProperties/1.20.6.properties +++ b/versionProperties/1.20.6.properties @@ -47,7 +47,7 @@ fabric_api_version=0.97.8+1.20.6 # NeoForge loader forge_version= -neoforge_version=20.6.136 +neoforge_version=136 neoforge_version_range=[*,) # NeoForge mod versions diff --git a/versionProperties/1.21.1.properties b/versionProperties/1.21.1.properties index a1535ff55..475422676 100644 --- a/versionProperties/1.21.1.properties +++ b/versionProperties/1.21.1.properties @@ -47,7 +47,7 @@ fabric_api_version=0.115.0+1.21.1 # NeoForge loader forge_version= -neoforge_version=21.1.216 +neoforge_version=216 neoforge_version_range=[*,) # NeoForge mod versions diff --git a/versionProperties/1.21.10.properties b/versionProperties/1.21.10.properties index 0904bac2f..cb48d1485 100644 --- a/versionProperties/1.21.10.properties +++ b/versionProperties/1.21.10.properties @@ -45,7 +45,7 @@ fabric_api_version=0.138.3+1.21.10 # NeoForge loader forge_version= -neoforge_version=21.10.56-beta +neoforge_version=56-beta neoforge_version_range=[21.10.6-beta,) # NeoForge mod versions diff --git a/versionProperties/1.21.11.properties b/versionProperties/1.21.11.properties index 24be330c0..b5b4c8908 100644 --- a/versionProperties/1.21.11.properties +++ b/versionProperties/1.21.11.properties @@ -45,7 +45,7 @@ fabric_api_version=0.139.4+1.21.11 # NeoForge loader forge_version= -neoforge_version=21.11.38-beta +neoforge_version=38-beta neoforge_version_range=[*,) # NeoForge mod versions diff --git a/versionProperties/1.21.3.properties b/versionProperties/1.21.3.properties index a6dedbe66..f9da295ff 100644 --- a/versionProperties/1.21.3.properties +++ b/versionProperties/1.21.3.properties @@ -47,7 +47,7 @@ fabric_api_version=0.110.0+1.21.3 # NeoForge loader forge_version= -neoforge_version=21.3.86 +neoforge_version=86 neoforge_version_range=[*,) # NeoForge mod versions diff --git a/versionProperties/1.21.4.properties b/versionProperties/1.21.4.properties index a753d179d..a79c98dc2 100644 --- a/versionProperties/1.21.4.properties +++ b/versionProperties/1.21.4.properties @@ -46,7 +46,7 @@ fabric_api_version=0.110.5+1.21.4 # NeoForge loader forge_version= -neoforge_version=21.4.147 +neoforge_version=147 # version range may not be necessary, but having compiled DH for an older version caused issues with shaders neoforge_version_range=[21.4.147,) diff --git a/versionProperties/1.21.5.properties b/versionProperties/1.21.5.properties index 7c306a476..2d3308215 100644 --- a/versionProperties/1.21.5.properties +++ b/versionProperties/1.21.5.properties @@ -46,7 +46,7 @@ fabric_api_version=0.119.5+1.21.5 # NeoForge loader forge_version= -neoforge_version=21.5.87 +neoforge_version=87 neoforge_version_range=[*,) # NeoForge mod versions diff --git a/versionProperties/1.21.6.properties b/versionProperties/1.21.6.properties index 11bbe88a6..45692e302 100644 --- a/versionProperties/1.21.6.properties +++ b/versionProperties/1.21.6.properties @@ -45,7 +45,7 @@ fabric_api_version=0.127.0+1.21.6 # NeoForge loader forge_version= -neoforge_version=21.6.20-beta +neoforge_version=20-beta # around 6.19 neo changed how their render API works, failing to meet this causes the game to crash neoforge_version_range=[21.6.19-beta,) diff --git a/versionProperties/1.21.8.properties b/versionProperties/1.21.8.properties index 5f8dd7e04..6330dff60 100644 --- a/versionProperties/1.21.8.properties +++ b/versionProperties/1.21.8.properties @@ -45,7 +45,7 @@ fabric_api_version=0.133.4+1.21.8 # NeoForge loader forge_version= -neoforge_version=21.8.52 +neoforge_version=52 # around 6.19 neo changed how their render API works, failing to meet this causes the game to crash neoforge_version_range=[*,) diff --git a/versionProperties/1.21.9.properties b/versionProperties/1.21.9.properties index c177f4caa..82ff98a6a 100644 --- a/versionProperties/1.21.9.properties +++ b/versionProperties/1.21.9.properties @@ -45,7 +45,7 @@ fabric_api_version=0.134.0+1.21.9 # NeoForge loader forge_version= -neoforge_version=21.9.15-beta +neoforge_version=15-beta # sometime before 21.9.15-beta Neoforge changed how their rendering API events handle levels # so we can't support both versions at once neoforge_version_range=[21.9.15-beta,) From 85c07b11c68f9b16a26db80a060229e3092f6320 Mon Sep 17 00:00:00 2001 From: Ran-Mewo <43445785+Ran-Mewo@users.noreply.github.com> Date: Mon, 30 Mar 2026 00:51:58 +1100 Subject: [PATCH 02/27] meows --- buildSrc/src/main/groovy/dh-loader.gradle | 1 - 1 file changed, 1 deletion(-) diff --git a/buildSrc/src/main/groovy/dh-loader.gradle b/buildSrc/src/main/groovy/dh-loader.gradle index 433f033ab..e4806022d 100644 --- a/buildSrc/src/main/groovy/dh-loader.gradle +++ b/buildSrc/src/main/groovy/dh-loader.gradle @@ -204,7 +204,6 @@ project(":core").configurations.compileOnly.allDependencies.each { dep -> dependencies { // Manifold preprocessor & strings annotationProcessor(manifold.module("preprocessor")) - annotationProcessor(manifold.module("strings")) // NightConfig: implementation in core (bundled) but Unimined strips it from compile classpath compileOnly("com.electronwill.night-config:toml:${rootProject.nightconfig_version}") From a0f1b72089c264b14c2f92fa37627be1b729f629 Mon Sep 17 00:00:00 2001 From: Ran-Mewo <43445785+Ran-Mewo@users.noreply.github.com> Date: Mon, 30 Mar 2026 01:13:28 +1100 Subject: [PATCH 03/27] fix merged jars for CI --- .gitlab-ci.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 34252342f..e977e7371 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -46,8 +46,7 @@ build: # this both runs the unit tests and assembles the code - ./gradlew clean -PmcVer="${MC_VER}" -PinfoGitCommit="${CI_COMMIT_SHA}" -PinfoGitBranch="${CI_COMMIT_BRANCH}" -PinfoBuildSource="GitLab CI (${CI_PIPELINE_ID})" --gradle-user-home cache/; - ./gradlew build -PmcVer="${MC_VER}" -PinfoGitCommit="${CI_COMMIT_SHA}" -PinfoGitBranch="${CI_COMMIT_BRANCH}" -PinfoBuildSource="GitLab CI (${CI_PIPELINE_ID})" --gradle-user-home cache/; - - ./gradlew mergeJars -PmcVer="${MC_VER}" -PinfoGitCommit="${CI_COMMIT_SHA}" -PinfoGitBranch="${CI_COMMIT_BRANCH}" -PinfoBuildSource="GitLab CI (${CI_PIPELINE_ID})" --gradle-user-home cache/; - - cp ./fabric/build/libs/* ./forge/build/libs/* ./neoforge/build/libs/* ./build/merged/* . || true + - cp ./fabric/build/libs/* ./forge/build/libs/* ./neoforge/build/libs/* ./build/forgix/* . || true artifacts: name: "NightlyBuild_${MC_VER}-${CI_COMMIT_SHORT_SHA}-${CI_COMMIT_TIMESTAMP}" paths: From 4ac9de05df362fc04041a76503f98a14b8e8c13d Mon Sep 17 00:00:00 2001 From: Ran-Mewo <43445785+Ran-Mewo@users.noreply.github.com> Date: Mon, 30 Mar 2026 02:07:40 +1100 Subject: [PATCH 04/27] wao! --- buildSrc/src/main/groovy/dh-loader.gradle | 2 ++ versionProperties/1.21.10.properties | 4 ++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/buildSrc/src/main/groovy/dh-loader.gradle b/buildSrc/src/main/groovy/dh-loader.gradle index e4806022d..d89d435e4 100644 --- a/buildSrc/src/main/groovy/dh-loader.gradle +++ b/buildSrc/src/main/groovy/dh-loader.gradle @@ -151,6 +151,8 @@ if (isNotCommonProject) { enableBaseMixin() enableMixinExtra() } + // Some Fabric API modules ship AW in 'named' namespace instead of 'intermediary' + catchAWNamespaceAssertion() } } diff --git a/versionProperties/1.21.10.properties b/versionProperties/1.21.10.properties index cb48d1485..759d1675d 100644 --- a/versionProperties/1.21.10.properties +++ b/versionProperties/1.21.10.properties @@ -15,7 +15,7 @@ lwjgl_version=3.2.3 # Fabric loader fabric_loader_version=0.17.3 -fabric_api_version=0.138.3+1.21.10 +fabric_api_version=0.138.4+1.21.10 modmenu_version=16.0.0-rc.1 starlight_version_fabric= phosphor_version_fabric= @@ -45,7 +45,7 @@ fabric_api_version=0.138.3+1.21.10 # NeoForge loader forge_version= -neoforge_version=56-beta +neoforge_version=64 neoforge_version_range=[21.10.6-beta,) # NeoForge mod versions From 528a12ac83550efb6c94569657ea8cd566c9b182 Mon Sep 17 00:00:00 2001 From: Ran-Mewo <43445785+Ran-Mewo@users.noreply.github.com> Date: Mon, 30 Mar 2026 02:20:00 +1100 Subject: [PATCH 05/27] fix javadocs --- buildSrc/src/main/groovy/dh-loader.gradle | 10 ---------- buildSrc/src/main/groovy/root.gradle | 14 +++++++++++++- 2 files changed, 13 insertions(+), 11 deletions(-) diff --git a/buildSrc/src/main/groovy/dh-loader.gradle b/buildSrc/src/main/groovy/dh-loader.gradle index d89d435e4..eb1afb9d7 100644 --- a/buildSrc/src/main/groovy/dh-loader.gradle +++ b/buildSrc/src/main/groovy/dh-loader.gradle @@ -95,16 +95,6 @@ if (isNotCommonProject) { group = rootProject.maven_group javadoc.title = rootProject.mod_name + "-" + project.name - javadoc { - configure(options) { - tags( - 'todo:X"', - 'apiNote:a:API Note:', - 'implSpec:a:Implementation Requirements:', - 'implNote:a:Implementation Note:' - ) - } - } tasks.withType(GenerateModuleMetadata).configureEach { enabled = false diff --git a/buildSrc/src/main/groovy/root.gradle b/buildSrc/src/main/groovy/root.gradle index 6fd5802c4..4f34000fc 100644 --- a/buildSrc/src/main/groovy/root.gradle +++ b/buildSrc/src/main/groovy/root.gradle @@ -12,6 +12,18 @@ rootProject.ext.versionStr = rootProject.mod_version + "-" + rootProject.minecra rootProject.allprojects { version = (it == rootProject ? "" : it.name + "-") + rootProject.versionStr group = rootProject.maven_group + + // Custom javadoc tags for all subprojects + plugins.withType(JavaPlugin) { + javadoc { + options.tags( + 'todo:X"', + 'apiNote:a:API Note:', + 'implSpec:a:Implementation Requirements:', + 'implNote:a:Implementation Note:' + ) + } + } } // Create build.properties with preprocessor definitions @@ -41,4 +53,4 @@ gradle.projectsEvaluated { it.tasks.jar.finalizedBy(it.tasks.remapJar) it.tasks.remapJar.finalizedBy(it.tasks.shadeDowngradedApi) } -} \ No newline at end of file +} From 0647bdbab30c8e92c272ef8f2c9aec144637ee1e Mon Sep 17 00:00:00 2001 From: James Seibel Date: Sun, 29 Mar 2026 21:17:44 -0500 Subject: [PATCH 06/27] update manifold 25.1.31 -> 26.1.6 --- coreSubProjects | 2 +- gradle.properties | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/coreSubProjects b/coreSubProjects index ecb3dce96..d45a1379b 160000 --- a/coreSubProjects +++ b/coreSubProjects @@ -1 +1 @@ -Subproject commit ecb3dce963dce25a80c5be4d76ec22f7a49de67c +Subproject commit d45a1379bd0225d013fbb19a2084e160c3733009 diff --git a/gradle.properties b/gradle.properties index 12e455bf9..a2f7d123d 100644 --- a/gradle.properties +++ b/gradle.properties @@ -18,7 +18,7 @@ mod_issues=https://gitlab.com/jeseibel/distant-horizons/-/issues mod_discord=https://discord.gg/xAB8G4cENx # Global Plugin Versions -manifold_version=2025.1.31 +manifold_version=2026.1.6 # 2023.1.17 can be used if there are mystery Java compiler issues nightconfig_version=3.6.6 lz4_version=1.8.0 From 2674b945bb91cbf59e0d0b59a4713d4dd327fd58 Mon Sep 17 00:00:00 2001 From: Ran-Mewo <43445785+Ran-Mewo@users.noreply.github.com> Date: Mon, 30 Mar 2026 17:06:51 +1100 Subject: [PATCH 07/27] fix neoforg --- buildSrc/src/main/groovy/dh-loader.gradle | 5 +++-- coreSubProjects | 2 +- gradle.properties | 2 +- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/buildSrc/src/main/groovy/dh-loader.gradle b/buildSrc/src/main/groovy/dh-loader.gradle index eb1afb9d7..8627d0442 100644 --- a/buildSrc/src/main/groovy/dh-loader.gradle +++ b/buildSrc/src/main/groovy/dh-loader.gradle @@ -334,14 +334,15 @@ if (isNotCommonProject) { } // Make run tasks use the shadow jar so relocated deps (NightConfig, etc.) work in dev. - // Without this, NeoForge's bundled NightConfig 3.8.x conflicts with DH's 3.6.6. + def shadowedFiles = configurations.shadowMe.resolve().collect { it.name }.toSet() // Filter out jars that are already bundled+relocated in the shadow jar to avoid classpath conflicts (e.g. DH's NightConfig vs NeoForge's). tasks.withType(JavaExec).configureEach { runTask -> dependsOn(shadowJar) classpath = files(shadowJar.archiveFile) + classpath.filter { file -> !file.path.contains(project.buildDir.path) && !file.path.contains("core${File.separator}build") && !file.path.contains("api${File.separator}build") && - !file.path.contains("common${File.separator}build") + !file.path.contains("common${File.separator}build") && + !shadowedFiles.contains(file.name) } } } diff --git a/coreSubProjects b/coreSubProjects index d45a1379b..1ec342928 160000 --- a/coreSubProjects +++ b/coreSubProjects @@ -1 +1 @@ -Subproject commit d45a1379bd0225d013fbb19a2084e160c3733009 +Subproject commit 1ec342928f69981f394d96edb5ebce5f6ce90117 diff --git a/gradle.properties b/gradle.properties index a2f7d123d..343a6ad13 100644 --- a/gradle.properties +++ b/gradle.properties @@ -20,7 +20,7 @@ mod_discord=https://discord.gg/xAB8G4cENx # Global Plugin Versions manifold_version=2026.1.6 # 2023.1.17 can be used if there are mystery Java compiler issues -nightconfig_version=3.6.6 +nightconfig_version=3.8.3 lz4_version=1.8.0 xz_version=1.9 zstd_version=1.5.7-6 From 6270b03005bdd726337cd25e62daf5354d847514 Mon Sep 17 00:00:00 2001 From: Ran-Mewo <43445785+Ran-Mewo@users.noreply.github.com> Date: Mon, 30 Mar 2026 17:17:45 +1100 Subject: [PATCH 08/27] update unimined to support 26.1 --- buildSrc/build.gradle | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/buildSrc/build.gradle b/buildSrc/build.gradle index 3253068ae..ed8a3ab78 100644 --- a/buildSrc/build.gradle +++ b/buildSrc/build.gradle @@ -5,20 +5,20 @@ plugins { repositories { gradlePluginPortal() mavenCentral() - maven { url = 'https://maven.wagyourtail.xyz/releases' } - maven { url = 'https://maven.outlands.top/releases' } - maven { url = 'https://maven.wagyourtail.xyz/snapshots' } - maven { url = 'https://maven.architectury.dev/' } - maven { url = 'https://maven.fabricmc.net/' } - maven { url = 'https://maven.neoforged.net/releases/' } - maven { url = 'https://maven.minecraftforge.net/' } - maven { url = 'https://repo.spongepowered.org/repository/maven-public/' } - maven { url = 'https://oss.sonatype.org/content/repositories/snapshots/' } + maven { url = 'https://maven.wagyourtail.xyz/releases' } // Jvmdowngrader & unimined libs + maven { url = 'https://maven.outlands.top/releases' } // Hosts the kappa fork of unimined + maven { url = 'https://maven.wagyourtail.xyz/snapshots' } // The manifold gradle plugin we use + maven { url = 'https://maven.architectury.dev/' } // Minecraft mod libs + maven { url = 'https://maven.fabricmc.net/' } // Fabric + maven { url = 'https://maven.neoforged.net/releases/' } // NeoForge + maven { url = 'https://maven.minecraftforge.net/' } // Forge + maven { url = 'https://repo.spongepowered.org/repository/maven-public/' } // Hosts minecraft libs + maven { url = 'https://oss.sonatype.org/content/repositories/snapshots/' } // Hosts a few dependencies we use } dependencies { implementation 'com.gradleup.shadow:shadow-gradle-plugin:9.0.0' - implementation 'xyz.wagyourtail.unimined:xyz.wagyourtail.unimined.gradle.plugin:1.4.16-kappa' + implementation 'xyz.wagyourtail.unimined:xyz.wagyourtail.unimined.gradle.plugin:1.4.17-kappa' implementation 'xyz.wagyourtail:manifold-gradle:1.0.0-SNAPSHOT' implementation 'xyz.wagyourtail.jvmdowngrader:xyz.wagyourtail.jvmdowngrader.gradle.plugin:1.3.4' } From c245ed65981f580270f909be63c9dcfacd85de08 Mon Sep 17 00:00:00 2001 From: Ran-Mewo <43445785+Ran-Mewo@users.noreply.github.com> Date: Mon, 30 Mar 2026 17:45:31 +1100 Subject: [PATCH 09/27] improve filtering logic --- buildSrc/src/main/groovy/dh-loader.gradle | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/buildSrc/src/main/groovy/dh-loader.gradle b/buildSrc/src/main/groovy/dh-loader.gradle index 8627d0442..d94732d08 100644 --- a/buildSrc/src/main/groovy/dh-loader.gradle +++ b/buildSrc/src/main/groovy/dh-loader.gradle @@ -333,8 +333,11 @@ if (isNotCommonProject) { inputFile.set(shadowJar.archiveFile) } - // Make run tasks use the shadow jar so relocated deps (NightConfig, etc.) work in dev. - def shadowedFiles = configurations.shadowMe.resolve().collect { it.name }.toSet() // Filter out jars that are already bundled+relocated in the shadow jar to avoid classpath conflicts (e.g. DH's NightConfig vs NeoForge's). + // Make run tasks use the shadow jar so relocated deps work in dev. + // Filter out jars bundled in the shadow jar, but keep jars that the loader also + // needs (e.g. NightConfig — DH relocates it, but NeoForge needs the original). + def shadowedPaths = configurations.shadowMe.resolve().collect { it.path }.toSet() + def loaderPaths = configurations.minecraftLibraries.resolve().collect { it.path }.toSet() tasks.withType(JavaExec).configureEach { runTask -> dependsOn(shadowJar) classpath = files(shadowJar.archiveFile) + classpath.filter { file -> @@ -342,7 +345,7 @@ if (isNotCommonProject) { !file.path.contains("core${File.separator}build") && !file.path.contains("api${File.separator}build") && !file.path.contains("common${File.separator}build") && - !shadowedFiles.contains(file.name) + !(shadowedPaths.contains(file.path) && !loaderPaths.contains(file.path)) } } } From 7794958804a019fe0d75b4913057f315616969e6 Mon Sep 17 00:00:00 2001 From: James Seibel Date: Mon, 30 Mar 2026 07:49:36 -0500 Subject: [PATCH 10/27] Start MC 26 porting --- buildSrc/src/main/groovy/dh-loader.gradle | 2 +- .../blaze/BlazeDebugWireframeRenderer.java | 63 +++++++++---------- .../blaze/BlazeDhGenericObjectRenderer.java | 15 +++-- .../render/blaze/BlazeDhTerrainRenderer.java | 25 ++++---- .../blaze/apply/BlazeDhApplyRenderer.java | 25 ++++---- .../blaze/apply/BlazeDhCopyRenderer.java | 21 +++---- .../BlazeDhFarFadeRenderer.java | 1 - .../postProcessing/BlazeDhFogRenderer.java | 1 - .../common/wrappers/VersionConstants.java | 4 +- gradle.properties | 4 +- versionProperties/1.26.1.properties | 59 +++++++++++++++++ 11 files changed, 137 insertions(+), 83 deletions(-) create mode 100644 versionProperties/1.26.1.properties diff --git a/buildSrc/src/main/groovy/dh-loader.gradle b/buildSrc/src/main/groovy/dh-loader.gradle index d94732d08..02aad4ffa 100644 --- a/buildSrc/src/main/groovy/dh-loader.gradle +++ b/buildSrc/src/main/groovy/dh-loader.gradle @@ -128,7 +128,7 @@ unimined.minecraft(sourceSets.main, true) { mappings { mojmap() - devNamespace "mojmap" + //devNamespace "mojmap" } } diff --git a/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/BlazeDebugWireframeRenderer.java b/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/BlazeDebugWireframeRenderer.java index cd71bb320..e76d489e9 100644 --- a/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/BlazeDebugWireframeRenderer.java +++ b/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/BlazeDebugWireframeRenderer.java @@ -29,7 +29,6 @@ import com.mojang.blaze3d.buffers.GpuBufferSlice; import com.mojang.blaze3d.buffers.Std140Builder; import com.mojang.blaze3d.buffers.Std140SizeCalculator; import com.mojang.blaze3d.pipeline.RenderPipeline; -import com.mojang.blaze3d.platform.DepthTestFunction; import com.mojang.blaze3d.platform.PolygonMode; import com.mojang.blaze3d.shaders.UniformType; import com.mojang.blaze3d.systems.CommandEncoder; @@ -140,16 +139,16 @@ public class BlazeDebugWireframeRenderer extends AbstractDebugWireframeRenderer private void createPipelines() { VertexFormat vertexFormat = VertexFormat.builder() - .add("vPosition", BlazeDhVertexFormatUtil.FLOAT_XYZ_POS) + //.add("vPosition", BlazeDhVertexFormatUtil.FLOAT_XYZ_POS) .build(); RenderPipeline.Builder pipelineBuilder = RenderPipeline.builder(); { pipelineBuilder.withCull(false); - pipelineBuilder.withDepthWrite(true); - pipelineBuilder.withDepthTestFunction(DepthTestFunction.LESS_DEPTH_TEST); - pipelineBuilder.withColorWrite(true); - pipelineBuilder.withoutBlend(); + //pipelineBuilder.withDepthWrite(true); + //pipelineBuilder.withDepthTestFunction(DepthTestFunction.LESS_DEPTH_TEST); + //pipelineBuilder.withColorWrite(true); + //pipelineBuilder.withoutBlend(); pipelineBuilder.withPolygonMode(PolygonMode.WIREFRAME); pipelineBuilder.withLocation(Identifier.parse("distanthorizons:debug_wireframe_renderer")); @@ -229,11 +228,11 @@ public class BlazeDebugWireframeRenderer extends AbstractDebugWireframeRenderer { this.init(); - if (BlazeDhMetaRenderer.INSTANCE.dhColorTextureWrapper.isEmpty() - || BlazeDhMetaRenderer.INSTANCE.dhDepthTextureWrapper.isEmpty()) - { - return; - } + //if (BlazeDhMetaRenderer.INSTANCE.dhColorTextureWrapper.isEmpty() + // || BlazeDhMetaRenderer.INSTANCE.dhDepthTextureWrapper.isEmpty()) + //{ + // return; + //} // shouldn't happen, but just in case if (box == null) @@ -298,27 +297,27 @@ public class BlazeDebugWireframeRenderer extends AbstractDebugWireframeRenderer // render // - try (RenderPass renderPass = commandEncoder.createRenderPass( - this::getRenderPassName, - BlazeDhMetaRenderer.INSTANCE.dhColorTextureWrapper.textureView, - /*optionalClearColorAsInt*/ OptionalInt.empty(), - BlazeDhMetaRenderer.INSTANCE.dhDepthTextureWrapper.textureView, - /*optionalDepthValueAsDouble*/ OptionalDouble.empty())) - { - // Bind instance data // - renderPass.setUniform("uniformBlock", this.uniformBuffer); - - renderPass.setPipeline(this.pipeline); - renderPass.setIndexBuffer(this.boxIndexBuffer, VertexFormat.IndexType.INT); - - renderPass.setVertexBuffer(0, this.boxVertexBuffer); - - renderPass.drawIndexed( - /*indexStart*/ 0, - /*firstIndex*/0, - /*indexCount*/BOX_OUTLINE_INDICES.length, - /*instanceCount*/1); - } + //try (RenderPass renderPass = commandEncoder.createRenderPass( + // this::getRenderPassName, + // BlazeDhMetaRenderer.INSTANCE.dhColorTextureWrapper.textureView, + // /*optionalClearColorAsInt*/ OptionalInt.empty(), + // BlazeDhMetaRenderer.INSTANCE.dhDepthTextureWrapper.textureView, + // /*optionalDepthValueAsDouble*/ OptionalDouble.empty())) + //{ + // // Bind instance data // + // renderPass.setUniform("uniformBlock", this.uniformBuffer); + // + // renderPass.setPipeline(this.pipeline); + // renderPass.setIndexBuffer(this.boxIndexBuffer, VertexFormat.IndexType.INT); + // + // renderPass.setVertexBuffer(0, this.boxVertexBuffer); + // + // renderPass.drawIndexed( + // /*indexStart*/ 0, + // /*firstIndex*/0, + // /*indexCount*/BOX_OUTLINE_INDICES.length, + // /*instanceCount*/1); + //} } private String getRenderPassName() { return "distantHorizons:McDebugRenderer"; } diff --git a/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/BlazeDhGenericObjectRenderer.java b/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/BlazeDhGenericObjectRenderer.java index 18fdf02f5..abb61caac 100644 --- a/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/BlazeDhGenericObjectRenderer.java +++ b/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/BlazeDhGenericObjectRenderer.java @@ -30,7 +30,6 @@ import com.mojang.blaze3d.buffers.Std140Builder; import com.mojang.blaze3d.buffers.Std140SizeCalculator; import com.mojang.blaze3d.pipeline.BlendFunction; import com.mojang.blaze3d.pipeline.RenderPipeline; -import com.mojang.blaze3d.platform.DepthTestFunction; import com.mojang.blaze3d.platform.PolygonMode; import com.mojang.blaze3d.shaders.UniformType; import com.mojang.blaze3d.systems.CommandEncoder; @@ -132,9 +131,9 @@ public class BlazeDhGenericObjectRenderer implements IDhGenericRenderer this.init = true; this.vertexFormat = VertexFormat.builder() - .add("vPosition", BlazeDhVertexFormatUtil.FLOAT_XYZ_POS) - .add("aColor", BlazeDhVertexFormatUtil.RGBA_UBYTE_COLOR) - .add("aMaterial", BlazeDhVertexFormatUtil.IRIS_MATERIAL) + //.add("vPosition", BlazeDhVertexFormatUtil.FLOAT_XYZ_POS) + //.add("aColor", BlazeDhVertexFormatUtil.RGBA_UBYTE_COLOR) + //.add("aMaterial", BlazeDhVertexFormatUtil.IRIS_MATERIAL) .build(); this.createPipelines(); @@ -149,10 +148,10 @@ public class BlazeDhGenericObjectRenderer implements IDhGenericRenderer RenderPipeline.Builder pipelineBuilder = RenderPipeline.builder(); { pipelineBuilder.withCull(true); - pipelineBuilder.withDepthWrite(true); - pipelineBuilder.withDepthTestFunction(DepthTestFunction.LESS_DEPTH_TEST); - pipelineBuilder.withBlend(BlendFunction.TRANSLUCENT); - pipelineBuilder.withColorWrite(true); + //pipelineBuilder.withDepthWrite(true); + //pipelineBuilder.withDepthTestFunction(DepthTestFunction.LESS_DEPTH_TEST); + //pipelineBuilder.withBlend(BlendFunction.TRANSLUCENT); + //pipelineBuilder.withColorWrite(true); pipelineBuilder.withPolygonMode(PolygonMode.FILL); pipelineBuilder.withLocation(Identifier.parse("distanthorizons:generic")); diff --git a/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/BlazeDhTerrainRenderer.java b/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/BlazeDhTerrainRenderer.java index 3350a5b0d..72a3ea985 100644 --- a/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/BlazeDhTerrainRenderer.java +++ b/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/BlazeDhTerrainRenderer.java @@ -11,7 +11,6 @@ import com.mojang.blaze3d.buffers.Std140Builder; import com.mojang.blaze3d.buffers.Std140SizeCalculator; import com.mojang.blaze3d.pipeline.BlendFunction; import com.mojang.blaze3d.pipeline.RenderPipeline; -import com.mojang.blaze3d.platform.DepthTestFunction; import com.mojang.blaze3d.platform.PolygonMode; import com.mojang.blaze3d.shaders.UniformType; import com.mojang.blaze3d.systems.CommandEncoder; @@ -85,21 +84,21 @@ public class BlazeDhTerrainRenderer implements IDhTerrainRenderer VertexFormat vertexFormat = VertexFormat.builder() - .add("vPosition", BlazeDhVertexFormatUtil.SHORT_XYZ_POS) - .add("meta", BlazeDhVertexFormatUtil.META) - .add("vColor", BlazeDhVertexFormatUtil.RGBA_UBYTE_COLOR) - .add("irisMaterial", BlazeDhVertexFormatUtil.IRIS_MATERIAL) - .add("irisNormal", BlazeDhVertexFormatUtil.IRIS_NORMAL) - .add("paddingTwo", BlazeDhVertexFormatUtil.BYTE_PAD) - .add("paddingThree", BlazeDhVertexFormatUtil.BYTE_PAD) // padding is to make sure the format is a multiple of 4 + //.add("vPosition", BlazeDhVertexFormatUtil.SHORT_XYZ_POS) + //.add("meta", BlazeDhVertexFormatUtil.META) + //.add("vColor", BlazeDhVertexFormatUtil.RGBA_UBYTE_COLOR) + //.add("irisMaterial", BlazeDhVertexFormatUtil.IRIS_MATERIAL) + //.add("irisNormal", BlazeDhVertexFormatUtil.IRIS_NORMAL) + //.add("paddingTwo", BlazeDhVertexFormatUtil.BYTE_PAD) + //.add("paddingThree", BlazeDhVertexFormatUtil.BYTE_PAD) // padding is to make sure the format is a multiple of 4 .build(); RenderPipeline.Builder pipelineBuilder = RenderPipeline.builder(); { pipelineBuilder.withCull(true); - pipelineBuilder.withDepthWrite(true); - pipelineBuilder.withDepthTestFunction(DepthTestFunction.LESS_DEPTH_TEST); - pipelineBuilder.withColorWrite(true); + //pipelineBuilder.withDepthWrite(true); + //pipelineBuilder.withDepthTestFunction(DepthTestFunction.LESS_DEPTH_TEST); + //pipelineBuilder.withColorWrite(true); pipelineBuilder.withPolygonMode(PolygonMode.FILL); pipelineBuilder.withLocation(Identifier.parse("distanthorizons:lod_render")); @@ -117,13 +116,13 @@ public class BlazeDhTerrainRenderer implements IDhTerrainRenderer // opaque { - pipelineBuilder.withoutBlend(); + //pipelineBuilder.withoutBlend(); this.opaquePipeline = pipelineBuilder.build(); } // transparent { - pipelineBuilder.withBlend(BlendFunction.TRANSLUCENT); + //pipelineBuilder.withBlend(BlendFunction.TRANSLUCENT); this.transparentPipeline = pipelineBuilder.build(); } diff --git a/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/apply/BlazeDhApplyRenderer.java b/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/apply/BlazeDhApplyRenderer.java index 83accc661..a26aea2cc 100644 --- a/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/apply/BlazeDhApplyRenderer.java +++ b/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/apply/BlazeDhApplyRenderer.java @@ -27,7 +27,6 @@ public class BlazeDhApplyRenderer {} import com.mojang.blaze3d.buffers.GpuBuffer; import com.mojang.blaze3d.pipeline.BlendFunction; import com.mojang.blaze3d.pipeline.RenderPipeline; -import com.mojang.blaze3d.platform.DepthTestFunction; import com.mojang.blaze3d.platform.PolygonMode; import com.mojang.blaze3d.shaders.UniformType; import com.mojang.blaze3d.systems.CommandEncoder; @@ -151,24 +150,24 @@ public class BlazeDhApplyRenderer } VertexFormat vertexFormat = VertexFormat.builder() - .add("vPosition", BlazeDhVertexFormatUtil.SCREEN_POS) + //.add("vPosition", BlazeDhVertexFormatUtil.SCREEN_POS) .build(); RenderPipeline.Builder pipelineBuilder = RenderPipeline.builder(); { pipelineBuilder.withCull(false); - pipelineBuilder.withDepthWrite(false); - pipelineBuilder.withDepthTestFunction(DepthTestFunction.NO_DEPTH_TEST); - pipelineBuilder.withColorWrite(true); + //pipelineBuilder.withDepthWrite(false); + //pipelineBuilder.withDepthTestFunction(DepthTestFunction.NO_DEPTH_TEST); + //pipelineBuilder.withColorWrite(true); - if (this.blendFunction != null) - { - pipelineBuilder.withBlend(this.blendFunction); - } - else - { - pipelineBuilder.withoutBlend(); - } + //if (this.blendFunction != null) + //{ + // pipelineBuilder.withBlend(this.blendFunction); + //} + //else + //{ + // pipelineBuilder.withoutBlend(); + //} pipelineBuilder.withPolygonMode(PolygonMode.FILL); pipelineBuilder.withLocation(Identifier.parse(this.identifierName)); // TODO will complain if capital letters are included diff --git a/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/apply/BlazeDhCopyRenderer.java b/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/apply/BlazeDhCopyRenderer.java index 7286a0758..f6df0734b 100644 --- a/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/apply/BlazeDhCopyRenderer.java +++ b/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/apply/BlazeDhCopyRenderer.java @@ -26,7 +26,6 @@ public class BlazeDhCopyRenderer {} import com.mojang.blaze3d.buffers.GpuBuffer; import com.mojang.blaze3d.pipeline.RenderPipeline; -import com.mojang.blaze3d.platform.DepthTestFunction; import com.mojang.blaze3d.platform.PolygonMode; import com.mojang.blaze3d.systems.CommandEncoder; import com.mojang.blaze3d.systems.GpuDevice; @@ -85,10 +84,10 @@ public class BlazeDhCopyRenderer RenderPipeline.Builder pipelineBuilder = RenderPipeline.builder(); { pipelineBuilder.withCull(false); - pipelineBuilder.withDepthWrite(false); - pipelineBuilder.withDepthTestFunction(DepthTestFunction.NO_DEPTH_TEST); - pipelineBuilder.withColorWrite(true); - pipelineBuilder.withoutBlend(); + //pipelineBuilder.withDepthWrite(false); + //pipelineBuilder.withDepthTestFunction(DepthTestFunction.NO_DEPTH_TEST); + //pipelineBuilder.withColorWrite(true); + //pipelineBuilder.withoutBlend(); pipelineBuilder.withPolygonMode(PolygonMode.FILL); pipelineBuilder.withLocation(Identifier.parse("distanthorizons:copy_render")); @@ -119,17 +118,17 @@ public class BlazeDhCopyRenderer BlazeTextureWrapper sourceColorTextureWrapper, BlazeTextureViewWrapper destinationColorTextureWrapper) { - this.render( - sourceColorTextureWrapper.textureView, sourceColorTextureWrapper.textureSampler, - destinationColorTextureWrapper.textureView); + //this.render( + // sourceColorTextureWrapper.textureView, sourceColorTextureWrapper.textureSampler, + // destinationColorTextureWrapper.textureView); } public void render( BlazeTextureWrapper sourceColorTextureWrapper, BlazeTextureWrapper destinationColorTextureWrapper) { - this.render( - sourceColorTextureWrapper.textureView, sourceColorTextureWrapper.textureSampler, - destinationColorTextureWrapper.textureView); + //this.render( + // sourceColorTextureWrapper.textureView, sourceColorTextureWrapper.textureSampler, + // destinationColorTextureWrapper.textureView); } private void render( diff --git a/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/postProcessing/BlazeDhFarFadeRenderer.java b/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/postProcessing/BlazeDhFarFadeRenderer.java index 8d1d0a451..75d819d71 100644 --- a/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/postProcessing/BlazeDhFarFadeRenderer.java +++ b/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/postProcessing/BlazeDhFarFadeRenderer.java @@ -29,7 +29,6 @@ import com.mojang.blaze3d.buffers.GpuBufferSlice; import com.mojang.blaze3d.buffers.Std140Builder; import com.mojang.blaze3d.buffers.Std140SizeCalculator; import com.mojang.blaze3d.pipeline.RenderPipeline; -import com.mojang.blaze3d.platform.DepthTestFunction; import com.mojang.blaze3d.platform.PolygonMode; import com.mojang.blaze3d.shaders.UniformType; import com.mojang.blaze3d.systems.CommandEncoder; diff --git a/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/postProcessing/BlazeDhFogRenderer.java b/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/postProcessing/BlazeDhFogRenderer.java index 4d20e9c65..94a7400c9 100644 --- a/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/postProcessing/BlazeDhFogRenderer.java +++ b/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/postProcessing/BlazeDhFogRenderer.java @@ -30,7 +30,6 @@ import com.mojang.blaze3d.buffers.Std140Builder; import com.mojang.blaze3d.buffers.Std140SizeCalculator; import com.mojang.blaze3d.pipeline.BlendFunction; import com.mojang.blaze3d.pipeline.RenderPipeline; -import com.mojang.blaze3d.platform.DepthTestFunction; import com.mojang.blaze3d.platform.DestFactor; import com.mojang.blaze3d.platform.PolygonMode; import com.mojang.blaze3d.platform.SourceFactor; diff --git a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/VersionConstants.java b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/VersionConstants.java index 1a6ff387e..42d126437 100644 --- a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/VersionConstants.java +++ b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/VersionConstants.java @@ -93,6 +93,8 @@ public class VersionConstants implements IVersionConstants return "1.21.10"; #elif MC_VER == MC_1_21_11 return "1.21.11"; + #elif MC_VER == MC_1_26_1 + return "21.6"; #else ERROR MC version constant missing #endif @@ -102,7 +104,7 @@ public class VersionConstants implements IVersionConstants @Override public EDhApiRenderApi getDefaultRenderingApi() { - #if MC_VER <= MC_1_21_11 + #if MC_VER <= MC_1_26_1 return EDhApiRenderApi.OPEN_GL; #else ERROR MC version constant missing diff --git a/gradle.properties b/gradle.properties index 343a6ad13..53feaec03 100644 --- a/gradle.properties +++ b/gradle.properties @@ -18,7 +18,7 @@ mod_issues=https://gitlab.com/jeseibel/distant-horizons/-/issues mod_discord=https://discord.gg/xAB8G4cENx # Global Plugin Versions -manifold_version=2026.1.6 +manifold_version=2025.1.31 # 2023.1.17 can be used if there are mystery Java compiler issues nightconfig_version=3.8.3 lz4_version=1.8.0 @@ -46,7 +46,7 @@ versionStr= # This defines what MC version Intellij will use for the preprocessor # and what version is used automatically by build and run commands -mcVer=1.21.11 +mcVer=1.26.1 # Defines the maximum amount of memory Minecraft is allowed when run in a development environment #minecraftMemoryJavaArg="-Xmx4G" diff --git a/versionProperties/1.26.1.properties b/versionProperties/1.26.1.properties new file mode 100644 index 000000000..7e8aa8304 --- /dev/null +++ b/versionProperties/1.26.1.properties @@ -0,0 +1,59 @@ +# 1.26.1 version +java_version=25 +minecraft_version=26.1 +parchment_version=1.21:2024.07.28 +compatible_minecraft_versions=["26.1"] +accessWidenerVersion=1_21_11 +builds_for= +#fabric,neoforge +# forge is broken due to gradle/build script issues + +# Netty +netty_version=4.1.97.Final + +# LWJGL +lwjgl_version=3.3.3 + +# Fabric loader +fabric_loader_version=0.18.5 +fabric_api_version=0.144.3+26.1 +modmenu_version=18.0.0-alpha.7 +starlight_version_fabric= +phosphor_version_fabric= +lithium_version= +sodium_version=mc1.21.11-0.8.7-fabric +iris_version=1.10.7+26.1-fabric +bclib_version= +immersive_portals_version= +canvas_version= + +fabric_incompatibility_list={ } +fabric_recommend_list={} + +# Fabric mod run +# 0 = Don't enable and don't run +# 1 = Can be referenced in code but doesn't run +# 2 = Can be referenced in code and runs in client +enable_mod_menu=2 +enable_starlight=0 +enable_phosphor=0 +enable_sodium=1 +enable_lithium=0 +enable_iris=1 +enable_bclib=0 +enable_immersive_portals=0 +enable_canvas=0 + +# NeoForge loader +forge_version= +neoforge_version=26.1.0.1-beta +neoforge_version_range=[*,) + +# NeoForge mod versions +neo_iris_version= + +# (Neo)Forge mod run +# 0 = Don't enable and don't run +# 1 = Can be referenced in code but doesn't run +# 2 = Can be referenced in code and runs in client +neo_enable_iris=0 \ No newline at end of file From 21dc0f13c91a0cb5a7f0a0a142b6e4473ddcc485 Mon Sep 17 00:00:00 2001 From: Ran-Mewo <43445785+Ran-Mewo@users.noreply.github.com> Date: Tue, 31 Mar 2026 00:22:13 +1100 Subject: [PATCH 11/27] JVM Args & Don't use mappings on 26.1+ --- buildSrc/src/main/groovy/dh-loader.gradle | 28 ++++++++++++++++++++--- versionProperties/1.26.1.properties | 9 ++++---- 2 files changed, 29 insertions(+), 8 deletions(-) diff --git a/buildSrc/src/main/groovy/dh-loader.gradle b/buildSrc/src/main/groovy/dh-loader.gradle index 02aad4ffa..e6b7a0087 100644 --- a/buildSrc/src/main/groovy/dh-loader.gradle +++ b/buildSrc/src/main/groovy/dh-loader.gradle @@ -126,9 +126,11 @@ if (isNotCommonProject) { unimined.minecraft(sourceSets.main, true) { version gradle.ext.minecraft_version - mappings { - mojmap() - //devNamespace "mojmap" + if (gradle.ext.minecraft_version.startsWith("1.")) { // 26.1+ doesn't use obfuscation + mappings { + mojmap() + devNamespace "mojmap" + } } } @@ -347,6 +349,26 @@ if (isNotCommonProject) { !file.path.contains("common${File.separator}build") && !(shadowedPaths.contains(file.path) && !loaderPaths.contains(file.path)) } + + // Shared run directory so all loaders use the same worlds + def isClient = runTask.name.toLowerCase().contains("client") + runTask.workingDir = rootProject.file("run/${isClient ? 'client' : 'server'}") + + // JVM args + runTask.jvmArgs( + "-Dio.netty.leakDetection.level=advanced", + "-XX:+UseZGC", + "-XX:+ZGenerational", + ) + if (isClient) { + runTask.jvmArgs( + "-Dminecraft.api.auth.host=https://nope.invalid", + "-Dminecraft.api.account.host=https://nope.invalid", + "-Dminecraft.api.session.host=https://nope.invalid", + "-Dminecraft.api.services.host=https://nope.invalid", + ) + runTask.args("--username", "Dev", "--renderDebugLabels", "--tracy") + } } } } diff --git a/versionProperties/1.26.1.properties b/versionProperties/1.26.1.properties index 7e8aa8304..a5587f8be 100644 --- a/versionProperties/1.26.1.properties +++ b/versionProperties/1.26.1.properties @@ -4,8 +4,7 @@ minecraft_version=26.1 parchment_version=1.21:2024.07.28 compatible_minecraft_versions=["26.1"] accessWidenerVersion=1_21_11 -builds_for= -#fabric,neoforge +builds_for=fabric,neoforge # forge is broken due to gradle/build script issues # Netty @@ -34,7 +33,7 @@ fabric_recommend_list={} # 0 = Don't enable and don't run # 1 = Can be referenced in code but doesn't run # 2 = Can be referenced in code and runs in client -enable_mod_menu=2 +enable_mod_menu=0 enable_starlight=0 enable_phosphor=0 enable_sodium=1 @@ -46,7 +45,7 @@ enable_canvas=0 # NeoForge loader forge_version= -neoforge_version=26.1.0.1-beta +neoforge_version=1-beta neoforge_version_range=[*,) # NeoForge mod versions @@ -56,4 +55,4 @@ neo_iris_version= # 0 = Don't enable and don't run # 1 = Can be referenced in code but doesn't run # 2 = Can be referenced in code and runs in client -neo_enable_iris=0 \ No newline at end of file +neo_enable_iris=0 From 9a087025fe549d751bf6b51fce0599fee2ea6ea1 Mon Sep 17 00:00:00 2001 From: Ran-Mewo <43445785+Ran-Mewo@users.noreply.github.com> Date: Tue, 31 Mar 2026 12:21:11 +1100 Subject: [PATCH 12/27] update stuffs --- Dockerfile | 2 +- gradle.properties | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Dockerfile b/Dockerfile index 8df81edfb..3044ee64e 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM eclipse-temurin:17-jdk +FROM eclipse-temurin:25-jdk WORKDIR /home/build/ COPY ./gradlew . diff --git a/gradle.properties b/gradle.properties index 53feaec03..393d8b95d 100644 --- a/gradle.properties +++ b/gradle.properties @@ -18,7 +18,7 @@ mod_issues=https://gitlab.com/jeseibel/distant-horizons/-/issues mod_discord=https://discord.gg/xAB8G4cENx # Global Plugin Versions -manifold_version=2025.1.31 +manifold_version=2026.1.6 # 2023.1.17 can be used if there are mystery Java compiler issues nightconfig_version=3.8.3 lz4_version=1.8.0 From 80f30dfd74f594f2ece3107899891fde205e58f4 Mon Sep 17 00:00:00 2001 From: James Seibel Date: Fri, 3 Apr 2026 07:51:53 -0500 Subject: [PATCH 13/27] Continue porting to MC 26 --- .../postProcessing/BlazeDhSsaoRenderer.java | 9 ++- .../BlazeVanillaFadeRenderer.java | 9 ++- .../test/BlazeDhTestTriangleRenderer.java | 9 ++- .../wrappers/block/AbstractDhTintGetter.java | 7 ++- .../block/ClientBlockStateColorCache.java | 61 +++++++++++++++++-- .../common/wrappers/gui/ClassicConfigGUI.java | 2 - 6 files changed, 72 insertions(+), 25 deletions(-) diff --git a/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/postProcessing/BlazeDhSsaoRenderer.java b/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/postProcessing/BlazeDhSsaoRenderer.java index 87f0e91b1..5ad2286e0 100644 --- a/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/postProcessing/BlazeDhSsaoRenderer.java +++ b/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/postProcessing/BlazeDhSsaoRenderer.java @@ -30,7 +30,6 @@ import com.mojang.blaze3d.buffers.Std140Builder; import com.mojang.blaze3d.buffers.Std140SizeCalculator; import com.mojang.blaze3d.pipeline.BlendFunction; import com.mojang.blaze3d.pipeline.RenderPipeline; -import com.mojang.blaze3d.platform.DepthTestFunction; import com.mojang.blaze3d.platform.DestFactor; import com.mojang.blaze3d.platform.PolygonMode; import com.mojang.blaze3d.platform.SourceFactor; @@ -113,10 +112,10 @@ public class BlazeDhSsaoRenderer implements IDhSsaoRenderer RenderPipeline.Builder pipelineBuilder = RenderPipeline.builder(); { pipelineBuilder.withCull(false); - pipelineBuilder.withDepthWrite(false); - pipelineBuilder.withDepthTestFunction(DepthTestFunction.NO_DEPTH_TEST); - pipelineBuilder.withColorWrite(true); - pipelineBuilder.withoutBlend(); + //pipelineBuilder.withDepthWrite(false); + //pipelineBuilder.withDepthTestFunction(DepthTestFunction.NO_DEPTH_TEST); + //pipelineBuilder.withColorWrite(true); + //pipelineBuilder.withoutBlend(); pipelineBuilder.withPolygonMode(PolygonMode.FILL); pipelineBuilder.withLocation(Identifier.parse("distanthorizons:ssao_render")); diff --git a/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/postProcessing/BlazeVanillaFadeRenderer.java b/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/postProcessing/BlazeVanillaFadeRenderer.java index f1d7166c2..e5dfd13d3 100644 --- a/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/postProcessing/BlazeVanillaFadeRenderer.java +++ b/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/postProcessing/BlazeVanillaFadeRenderer.java @@ -29,7 +29,6 @@ import com.mojang.blaze3d.buffers.GpuBufferSlice; import com.mojang.blaze3d.buffers.Std140Builder; import com.mojang.blaze3d.buffers.Std140SizeCalculator; import com.mojang.blaze3d.pipeline.RenderPipeline; -import com.mojang.blaze3d.platform.DepthTestFunction; import com.mojang.blaze3d.platform.PolygonMode; import com.mojang.blaze3d.shaders.UniformType; import com.mojang.blaze3d.systems.CommandEncoder; @@ -109,10 +108,10 @@ public class BlazeVanillaFadeRenderer implements IDhVanillaFadeRenderer RenderPipeline.Builder pipelineBuilder = RenderPipeline.builder(); { pipelineBuilder.withCull(false); - pipelineBuilder.withDepthWrite(false); - pipelineBuilder.withDepthTestFunction(DepthTestFunction.NO_DEPTH_TEST); - pipelineBuilder.withColorWrite(true); - pipelineBuilder.withoutBlend(); + //pipelineBuilder.withDepthWrite(false); + //pipelineBuilder.withDepthTestFunction(DepthTestFunction.NO_DEPTH_TEST); + //pipelineBuilder.withColorWrite(true); + //pipelineBuilder.withoutBlend(); pipelineBuilder.withPolygonMode(PolygonMode.FILL); pipelineBuilder.withLocation(Identifier.parse("distanthorizons:mc_vanilla_fade_render")); diff --git a/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/test/BlazeDhTestTriangleRenderer.java b/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/test/BlazeDhTestTriangleRenderer.java index aaa295de2..02db7b725 100644 --- a/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/test/BlazeDhTestTriangleRenderer.java +++ b/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/test/BlazeDhTestTriangleRenderer.java @@ -27,7 +27,6 @@ public class BlazeDhTestTriangleRenderer {} import com.mojang.blaze3d.buffers.GpuBuffer; import com.mojang.blaze3d.buffers.GpuBufferSlice; import com.mojang.blaze3d.pipeline.RenderPipeline; -import com.mojang.blaze3d.platform.DepthTestFunction; import com.mojang.blaze3d.platform.PolygonMode; import com.mojang.blaze3d.systems.CommandEncoder; import com.mojang.blaze3d.systems.GpuDevice; @@ -104,10 +103,10 @@ public class BlazeDhTestTriangleRenderer implements IDhTestTriangleRenderer RenderPipeline.Builder pipelineBuilder = RenderPipeline.builder(); { pipelineBuilder.withCull(false); - pipelineBuilder.withDepthWrite(false); - pipelineBuilder.withDepthTestFunction(DepthTestFunction.NO_DEPTH_TEST); - pipelineBuilder.withColorWrite(true); - pipelineBuilder.withoutBlend(); + //pipelineBuilder.withDepthWrite(false); + //pipelineBuilder.withDepthTestFunction(DepthTestFunction.NO_DEPTH_TEST); + //pipelineBuilder.withColorWrite(true); + //pipelineBuilder.withoutBlend(); pipelineBuilder.withPolygonMode(PolygonMode.FILL); pipelineBuilder.withLocation(Identifier.parse("distanthorizons:test_render")); diff --git a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/block/AbstractDhTintGetter.java b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/block/AbstractDhTintGetter.java index 1d7ccb579..1c12cd54b 100644 --- a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/block/AbstractDhTintGetter.java +++ b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/block/AbstractDhTintGetter.java @@ -10,11 +10,9 @@ import com.seibel.distanthorizons.core.util.ColorUtil; import com.seibel.distanthorizons.core.util.FullDataPointUtil; import com.seibel.distanthorizons.core.wrapperInterfaces.world.IClientLevelWrapper; -import it.unimi.dsi.fastutil.longs.LongArrayList; import net.minecraft.client.Minecraft; import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.core.BlockPos; -import net.minecraft.world.level.BlockAndTintGetter; import net.minecraft.world.level.ColorResolver; import net.minecraft.world.level.biome.Biome; @@ -30,6 +28,11 @@ import org.jetbrains.annotations.Nullable; import net.minecraft.core.Holder; #endif +#if MC_VER <= MC_1_21_11 +import net.minecraft.world.level.BlockAndTintGetter; +#else +import net.minecraft.client.renderer.block.BlockAndTintGetter; +#endif public abstract class AbstractDhTintGetter implements BlockAndTintGetter { diff --git a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/block/ClientBlockStateColorCache.java b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/block/ClientBlockStateColorCache.java index 6f0108895..b2fe09cb2 100644 --- a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/block/ClientBlockStateColorCache.java +++ b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/block/ClientBlockStateColorCache.java @@ -27,7 +27,6 @@ import com.seibel.distanthorizons.core.pos.blockPos.DhBlockPosMutable; import com.seibel.distanthorizons.core.util.ColorUtil; import com.seibel.distanthorizons.core.wrapperInterfaces.world.IClientLevelWrapper; import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.block.model.BakedQuad; import net.minecraft.client.renderer.texture.TextureAtlasSprite; import net.minecraft.core.Direction; import net.minecraft.world.level.block.*; @@ -47,8 +46,12 @@ import java.util.List; import java.util.concurrent.locks.ReentrantLock; #if MC_VER < MC_1_21_5 -#else +#elif MC_VER <= MC_1_21_11 import net.minecraft.client.renderer.block.model.BlockModelPart; +import net.minecraft.client.renderer.block.model.BakedQuad; +#else +import net.minecraft.client.renderer.block.dispatch.BlockStateModelPart; +import net.minecraft.client.resources.model.geometry.BakedQuad; #endif /** @@ -123,6 +126,7 @@ public class ClientBlockStateColorCache private static final int[] linearToSrgbTable = new int[] { + //region 0x0073000d, 0x007a000d, 0x0080000d, 0x0087000d, 0x008d000d, 0x0094000d, 0x009a000d, 0x00a1000d, 0x00a7001a, 0x00b4001a, 0x00c1001a, 0x00ce001a, 0x00da001a, 0x00e7001a, 0x00f4001a, 0x0101001a, 0x010e0033, 0x01280033, 0x01410033, 0x015b0033, 0x01750033, 0x018f0033, 0x01a80033, 0x01c20033, @@ -136,9 +140,11 @@ public class ClientBlockStateColorCache 0x31d105b0, 0x34a80555, 0x37520507, 0x39d504c5, 0x3c37048b, 0x3e7c0458, 0x40a8042a, 0x42bd0401, 0x44c20798, 0x488e071e, 0x4c1c06b6, 0x4f76065d, 0x52a50610, 0x55ac05cc, 0x5892058f, 0x5b590559, 0x5e0c0a23, 0x631c0980, 0x67db08f6, 0x6c55087f, 0x70940818, 0x74a007bd, 0x787d076c, 0x7c330723, + //endregion }; private static final float[] srgbToLinearTable = new float[] + //region { 0.0f, 0.000303527f, 0.000607054f, 0.00091058103f, 0.001214108f, 0.001517635f, 0.0018211621f, 0.002124689f, 0.002428216f, 0.002731743f, 0.00303527f, 0.0033465356f, 0.003676507f, 0.004024717f, 0.004391442f, @@ -172,6 +178,7 @@ public class ClientBlockStateColorCache 0.78353804f, 0.79129815f, 0.79910296f, 0.8069525f, 0.8148468f, 0.822786f, 0.8307701f, 0.83879924f, 0.84687346f, 0.8549928f, 0.8631574f, 0.87136734f, 0.8796226f, 0.8879232f, 0.89626956f, 0.90466136f, 0.913099f, 0.92158204f, 0.93011117f, 0.9386859f, 0.9473069f, 0.9559735f, 0.9646866f, 0.9734455f, 0.98225087f, 0.9911022f, 1.0f + //endregion }; private static final ThreadLocal TintWithoutLevelOverrideGetter = ThreadLocal.withInitial(() -> new TintWithoutLevelOverrider()); @@ -239,11 +246,18 @@ public class ClientBlockStateColorCache { BakedQuad firstQuad = quads.get(0); + #if MC_VER <= MC_1_21_11 this.needPostTinting = firstQuad.isTinted(); + #else + this.needPostTinting = firstQuad.materialInfo().isTinted(); + #endif + #if MC_VER <= MC_1_21_4 this.tintIndex = firstQuad.getTintIndex(); - #else + #elif MC_VER <= MC_1_21_11 this.tintIndex = firstQuad.tintIndex(); + #else + this.tintIndex = firstQuad.materialInfo().tintIndex(); #endif #if MC_VER < MC_1_17_1 @@ -254,10 +268,14 @@ public class ClientBlockStateColorCache this.baseColor = calculateColorFromTexture( firstQuad.getSprite(), EColorMode.getColorMode(this.blockState.getBlock())); - #else + #elif MC_VER <= MC_1_21_11 this.baseColor = calculateColorFromTexture( firstQuad.sprite(), EColorMode.getColorMode(this.blockState.getBlock())); + #else + this.baseColor = calculateColorFromTexture( + firstQuad.materialInfo().sprite(), + EColorMode.getColorMode(this.blockState.getBlock())); #endif } else @@ -304,7 +322,7 @@ public class ClientBlockStateColorCache #if MC_VER < MC_1_21_5 quads = MC.getModelManager().getBlockModelShaper(). getBlockModel(effectiveBlockState).getQuads(effectiveBlockState, direction, RANDOM); - #else + #elif MC_VER <= MC_1_21_11 List blockModelPartList = MC.getModelManager().getBlockModelShaper(). getBlockModel(effectiveBlockState).collectParts(RANDOM); @@ -317,6 +335,17 @@ public class ClientBlockStateColorCache quads.addAll(blockModelPartList.get(i).getQuads(direction)); } } + #else + List blockModelPartList = new ArrayList<>(); + MC.getModelManager().getBlockStateModelSet() + .get(effectiveBlockState).collectParts(RANDOM, blockModelPartList); + + quads = new ArrayList<>(); + for (int i = 0; i < blockModelPartList.size(); i++) + { + // if direction is null this will return the unculled quads + quads.addAll(blockModelPartList.get(i).getQuads(direction)); + } #endif return quads; @@ -457,7 +486,11 @@ public class ClientBlockStateColorCache private int getParticleIconColor() { return calculateColorFromTexture( - Minecraft.getInstance().getModelManager().getBlockModelShaper().getParticleIcon(this.blockState), + #if MC_VER <= MC_1_21_11 + Minecraft.getInstance().getModelManager().getBlockModelShaper().getParticleIcon(this.blockState), + #else + Minecraft.getInstance().getModelManager().getBlockStateModelSet().get(this.blockState).particleMaterial().sprite(), + #endif EColorMode.getColorMode(this.blockState.getBlock())); } @@ -500,12 +533,20 @@ public class ClientBlockStateColorCache { // one or more tint values weren't calculated, // we need MC's color resolver + #if MC_VER <= MC_1_21_11 tintColor = Minecraft.getInstance() .getBlockColors() .getColor(this.blockState, tintOverride, McObjectConverter.Convert(blockPos), this.tintIndex); + #else + tintColor = Minecraft.getInstance() + .getBlockColors() + .getTintSources(this.blockState) + .get(this.tintIndex) + .color(this.blockState); + #endif } } catch (UnsupportedOperationException e) @@ -528,12 +569,20 @@ public class ClientBlockStateColorCache tintColor = tintOverride.tryGetBlockTint(new DhBlockPosMutable(blockPos)); if (tintColor == AbstractDhTintGetter.INVALID_COLOR) { + #if MC_VER <= MC_1_21_11 tintColor = Minecraft.getInstance() .getBlockColors() .getColor(this.blockState, tintOverride, McObjectConverter.Convert(blockPos), this.tintIndex); + #else + tintColor = Minecraft.getInstance() + .getBlockColors() + .getTintSources(this.blockState) + .get(this.tintIndex) + .color(this.blockState); + #endif } } } diff --git a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/gui/ClassicConfigGUI.java b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/gui/ClassicConfigGUI.java index 4413f3abf..5d4f83240 100644 --- a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/gui/ClassicConfigGUI.java +++ b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/gui/ClassicConfigGUI.java @@ -71,8 +71,6 @@ import static com.seibel.distanthorizons.common.wrappers.gui.GuiHelper.Translata * Based upon TinyConfig but is highly modified * https://github.com/Minenash/TinyConfig * - * Note: floats don't work with this system, use doubles. - * * @author coolGi * @author Motschen * @author James Seibel From 877c824e58510a1adbee71f263b9ae72a140d9ab Mon Sep 17 00:00:00 2001 From: James Seibel Date: Fri, 3 Apr 2026 20:02:32 -0500 Subject: [PATCH 14/27] continue porting to MC 26 (2) --- buildSrc/src/main/groovy/dh-loader.gradle | 4 +- .../commonMixins/MixinChunkMapCommon.java | 17 +++++-- .../BlazeDhFarFadeRenderer.java | 8 ++-- .../postProcessing/BlazeDhFogRenderer.java | 8 ++-- .../blaze/util/BlazeDhVertexFormatUtil.java | 18 +++---- .../common/wrappers/McObjectConverter.java | 9 ++++ .../common/wrappers/block/BiomeWrapper.java | 33 +++++++++---- .../wrappers/block/BlockStateWrapper.java | 29 +++++++---- .../block/ClientBlockStateColorCache.java | 1 + .../block/TextureAtlasSpriteWrapper.java | 1 + .../wrappers/block/TintGetterOverride.java | 9 ++++ .../block/TintWithoutLevelOverrider.java | 25 +++++++++- .../common/wrappers/chunk/ChunkWrapper.java | 5 ++ .../common/wrappers/gui/ClassicConfigGUI.java | 48 +++++++++++++++---- .../wrappers/gui/DhDebugScreenEntry.java | 13 +++++ .../common/wrappers/gui/DhScreen.java | 37 ++++++++++---- .../common/wrappers/gui/MinecraftScreen.java | 30 +++++++++--- .../wrappers/gui/TexturedButtonWidget.java | 20 +++++--- .../wrappers/gui/updater/ChangelogScreen.java | 20 ++++++-- .../wrappers/gui/updater/UpdateModScreen.java | 16 +++++-- .../minecraft/MinecraftClientWrapper.java | 13 ++++- .../minecraft/MinecraftRenderWrapper.java | 8 +++- .../InternalServerGenerator.java | 8 +++- .../ChunkCompoundTagParser.java | 10 +++- .../mimicObject/DhLitWorldGenRegion.java | 40 ++++++++++------ .../RegionFileStorageExternalCache.java | 9 +++- .../WorldGenStructFeatManager.java | 7 ++- .../params/GlobalWorldGenParams.java | 6 ++- gradle.properties | 2 +- 29 files changed, 345 insertions(+), 109 deletions(-) diff --git a/buildSrc/src/main/groovy/dh-loader.gradle b/buildSrc/src/main/groovy/dh-loader.gradle index e6b7a0087..5966071c8 100644 --- a/buildSrc/src/main/groovy/dh-loader.gradle +++ b/buildSrc/src/main/groovy/dh-loader.gradle @@ -357,8 +357,8 @@ if (isNotCommonProject) { // JVM args runTask.jvmArgs( "-Dio.netty.leakDetection.level=advanced", - "-XX:+UseZGC", - "-XX:+ZGenerational", + //"-XX:+UseZGC", + //"-XX:+ZGenerational", ) if (isClient) { runTask.jvmArgs( diff --git a/common/src/main/java/com/seibel/distanthorizons/common/commonMixins/MixinChunkMapCommon.java b/common/src/main/java/com/seibel/distanthorizons/common/commonMixins/MixinChunkMapCommon.java index e28f25fd5..4f04819d0 100644 --- a/common/src/main/java/com/seibel/distanthorizons/common/commonMixins/MixinChunkMapCommon.java +++ b/common/src/main/java/com/seibel/distanthorizons/common/commonMixins/MixinChunkMapCommon.java @@ -4,6 +4,7 @@ import com.seibel.distanthorizons.common.wrappers.chunk.ChunkWrapper; import com.seibel.distanthorizons.common.wrappers.world.ServerLevelWrapper; import com.seibel.distanthorizons.core.api.internal.ServerApi; import com.seibel.distanthorizons.core.api.internal.SharedApi; +import com.seibel.distanthorizons.core.pos.DhChunkPos; import com.seibel.distanthorizons.core.wrapperInterfaces.world.IServerLevelWrapper; import net.minecraft.server.level.ServerLevel; import net.minecraft.world.level.chunk.ChunkAccess; @@ -17,8 +18,18 @@ public class MixinChunkMapCommon { IServerLevelWrapper levelWrapper = ServerLevelWrapper.getWrapper(level); + int chunkPosX; + int chunkPosZ; + #if MC_VER <= MC_1_21_11 + chunkPosX = chunk.getPos().x; + chunkPosZ = chunk.getPos().z; + #else + chunkPosX = chunk.getPos().x(); + chunkPosZ = chunk.getPos().z(); + #endif + // is this position already being updated? - if (SharedApi.isChunkAtChunkPosAlreadyUpdating(levelWrapper, chunk.getPos().x, chunk.getPos().z)) + if (SharedApi.isChunkAtChunkPosAlreadyUpdating(levelWrapper, chunkPosX, chunkPosZ)) { return; } @@ -39,7 +50,7 @@ public class MixinChunkMapCommon // MC has a tendency to try saving incomplete or corrupted chunks (which show up as empty or black chunks) // this logic should prevent that from happening - #if MC_VER == MC_1_16_5 || MC_VER == MC_1_17_1 + #if MC_VER <= MC_1_17_1 if (chunk.isUnsaved() || chunk.getUpgradeData() != null || !chunk.isLightCorrect()) { return; @@ -56,7 +67,7 @@ public class MixinChunkMapCommon // biome validation // // some chunks may be missing their biomes, which cause issues when attempting to save them - #if MC_VER == MC_1_16_5 || MC_VER == MC_1_17_1 + #if MC_VER <= MC_1_17_1 if (chunk.getBiomes() == null) { return; diff --git a/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/postProcessing/BlazeDhFarFadeRenderer.java b/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/postProcessing/BlazeDhFarFadeRenderer.java index 75d819d71..6faa8a1fe 100644 --- a/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/postProcessing/BlazeDhFarFadeRenderer.java +++ b/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/postProcessing/BlazeDhFarFadeRenderer.java @@ -100,10 +100,10 @@ public class BlazeDhFarFadeRenderer implements IDhFarFadeRenderer RenderPipeline.Builder pipelineBuilder = RenderPipeline.builder(); { pipelineBuilder.withCull(false); - pipelineBuilder.withDepthWrite(false); - pipelineBuilder.withDepthTestFunction(DepthTestFunction.NO_DEPTH_TEST); - pipelineBuilder.withColorWrite(true); - pipelineBuilder.withoutBlend(); + //pipelineBuilder.withDepthWrite(false); + //pipelineBuilder.withDepthTestFunction(DepthTestFunction.NO_DEPTH_TEST); + //pipelineBuilder.withColorWrite(true); + //pipelineBuilder.withoutBlend(); pipelineBuilder.withPolygonMode(PolygonMode.FILL); pipelineBuilder.withLocation(Identifier.parse("distanthorizons:far_fade")); diff --git a/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/postProcessing/BlazeDhFogRenderer.java b/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/postProcessing/BlazeDhFogRenderer.java index 94a7400c9..1157a2801 100644 --- a/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/postProcessing/BlazeDhFogRenderer.java +++ b/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/postProcessing/BlazeDhFogRenderer.java @@ -121,10 +121,10 @@ public class BlazeDhFogRenderer implements IDhFogRenderer RenderPipeline.Builder pipelineBuilder = RenderPipeline.builder(); { pipelineBuilder.withCull(false); - pipelineBuilder.withDepthWrite(false); - pipelineBuilder.withDepthTestFunction(DepthTestFunction.NO_DEPTH_TEST); - pipelineBuilder.withColorWrite(true); - pipelineBuilder.withoutBlend(); + //pipelineBuilder.withDepthWrite(false); + //pipelineBuilder.withDepthTestFunction(DepthTestFunction.NO_DEPTH_TEST); + //pipelineBuilder.withColorWrite(true); + //pipelineBuilder.withoutBlend(); pipelineBuilder.withPolygonMode(PolygonMode.FILL); pipelineBuilder.withLocation(Identifier.parse("distanthorizons:fog_render")); diff --git a/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/util/BlazeDhVertexFormatUtil.java b/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/util/BlazeDhVertexFormatUtil.java index 5de6f3be2..f7ef4e83b 100644 --- a/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/util/BlazeDhVertexFormatUtil.java +++ b/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/util/BlazeDhVertexFormatUtil.java @@ -57,18 +57,18 @@ public class BlazeDhVertexFormatUtil try { - SCREEN_POS = VertexFormatElement.register(/*id*/22, /*index*/0, VertexFormatElement.Type.FLOAT, VertexFormatElement.Usage.POSITION, /*count*/ 2); - RGBA_FLOAT_COLOR = VertexFormatElement.register(/*id*/23, /*index*/0, VertexFormatElement.Type.FLOAT, VertexFormatElement.Usage.COLOR, /*count*/ 4); + SCREEN_POS = null;//VertexFormatElement.register(/*id*/22, /*index*/0, VertexFormatElement.Type.FLOAT, VertexFormatElement.Usage.POSITION, /*count*/ 2); + RGBA_FLOAT_COLOR = null;//VertexFormatElement.register(/*id*/23, /*index*/0, VertexFormatElement.Type.FLOAT, VertexFormatElement.Usage.COLOR, /*count*/ 4); - SHORT_XYZ_POS = VertexFormatElement.register(/*id*/24, /*index*/0, VertexFormatElement.Type.USHORT, VertexFormatElement.Usage.POSITION, /*count*/ 3); - BYTE_PAD = VertexFormatElement.register(/*id*/25, /*index*/0, VertexFormatElement.Type.BYTE, VertexFormatElement.Usage.GENERIC, /*count*/ 1); + SHORT_XYZ_POS = null;//VertexFormatElement.register(/*id*/24, /*index*/0, VertexFormatElement.Type.USHORT, VertexFormatElement.Usage.POSITION, /*count*/ 3); + BYTE_PAD = null;//VertexFormatElement.register(/*id*/25, /*index*/0, VertexFormatElement.Type.BYTE, VertexFormatElement.Usage.GENERIC, /*count*/ 1); - META = VertexFormatElement.register(/*id*/26, /*index*/0, VertexFormatElement.Type.USHORT, VertexFormatElement.Usage.GENERIC, /*count*/ 1); - RGBA_UBYTE_COLOR = VertexFormatElement.register(/*id*/27, /*index*/0, VertexFormatElement.Type.UBYTE, VertexFormatElement.Usage.COLOR, /*count*/ 4); - IRIS_MATERIAL = VertexFormatElement.register(/*id*/28, /*index*/0, VertexFormatElement.Type.BYTE, VertexFormatElement.Usage.GENERIC, /*count*/ 1); - IRIS_NORMAL = VertexFormatElement.register(/*id*/29, /*index*/0, VertexFormatElement.Type.BYTE, VertexFormatElement.Usage.GENERIC, /*count*/ 1); + META = null;//VertexFormatElement.register(/*id*/26, /*index*/0, VertexFormatElement.Type.USHORT, VertexFormatElement.Usage.GENERIC, /*count*/ 1); + RGBA_UBYTE_COLOR = null;//VertexFormatElement.register(/*id*/27, /*index*/0, VertexFormatElement.Type.UBYTE, VertexFormatElement.Usage.COLOR, /*count*/ 4); + IRIS_MATERIAL = null;//VertexFormatElement.register(/*id*/28, /*index*/0, VertexFormatElement.Type.BYTE, VertexFormatElement.Usage.GENERIC, /*count*/ 1); + IRIS_NORMAL = null;//VertexFormatElement.register(/*id*/29, /*index*/0, VertexFormatElement.Type.BYTE, VertexFormatElement.Usage.GENERIC, /*count*/ 1); - FLOAT_XYZ_POS = VertexFormatElement.register(/*id*/30, /*index*/0, VertexFormatElement.Type.FLOAT, VertexFormatElement.Usage.POSITION, /*count*/ 3); + FLOAT_XYZ_POS = null;//VertexFormatElement.register(/*id*/30, /*index*/0, VertexFormatElement.Type.FLOAT, VertexFormatElement.Usage.POSITION, /*count*/ 3); } catch (Exception e) { diff --git a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/McObjectConverter.java b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/McObjectConverter.java index 4eba1f648..cff8c85e7 100644 --- a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/McObjectConverter.java +++ b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/McObjectConverter.java @@ -139,7 +139,16 @@ public class McObjectConverter } public static BlockPos Convert(DhBlockPos wrappedPos) { return new BlockPos(wrappedPos.getX(), wrappedPos.getY(), wrappedPos.getZ()); } + public static ChunkPos Convert(DhChunkPos wrappedPos) { return new ChunkPos(wrappedPos.getX(), wrappedPos.getZ()); } + public static DhChunkPos Convert(ChunkPos mcPos) + { + #if MC_VER <= MC_1_21_11 + return new DhChunkPos(mcPos.x, mcPos.z); + #else + return new DhChunkPos(mcPos.x(), mcPos.z()); + #endif + } public static Direction Convert(EDhDirection lodDirection) { return directions[lodDirection.ordinal()]; } public static EDhDirection Convert(Direction direction) { return lodDirections[direction.ordinal()]; } diff --git a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/block/BiomeWrapper.java b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/block/BiomeWrapper.java index 1253f9131..f147aeea9 100644 --- a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/block/BiomeWrapper.java +++ b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/block/BiomeWrapper.java @@ -49,6 +49,7 @@ import net.minecraft.core.registries.Registries; import net.minecraft.resources.ResourceLocation; #else import net.minecraft.resources.Identifier; +import net.minecraft.core.component.DataComponentMap; #endif import net.minecraft.world.level.biome.Biome; @@ -221,17 +222,17 @@ public class BiomeWrapper implements IBiomeWrapper Level level = (Level)levelWrapper.getWrappedMcObject(); net.minecraft.core.RegistryAccess registryAccess = level.registryAccess(); - #if MC_VER < MC_1_21_11 + #if MC_VER <= MC_1_21_10 ResourceLocation resourceLocation; #else Identifier resourceLocation; #endif - #if MC_VER == MC_1_16_5 || MC_VER == MC_1_17_1 + #if MC_VER <= MC_1_17_1 resourceLocation = registryAccess.registryOrThrow(Registry.BIOME_REGISTRY).getKey(this.biome); - #elif MC_VER == MC_1_18_2 || MC_VER == MC_1_19_2 + #elif MC_VER <= MC_1_19_2 resourceLocation = registryAccess.registryOrThrow(Registry.BIOME_REGISTRY).getKey(this.biome.value()); - #elif MC_VER < MC_1_21_3 + #elif MC_VER <= MC_1_21_4 resourceLocation = registryAccess.registryOrThrow(Registries.BIOME).getKey(this.biome.value()); #else resourceLocation = registryAccess.lookupOrThrow(Registries.BIOME).getKey(this.biome.value()); @@ -240,7 +241,7 @@ public class BiomeWrapper implements IBiomeWrapper if (resourceLocation == null) { String biomeName; - #if MC_VER == MC_1_16_5 || MC_VER == MC_1_17_1 + #if MC_VER <= MC_1_17_1 biomeName = this.biome.toString(); #else biomeName = this.biome.value().toString(); @@ -354,18 +355,18 @@ public class BiomeWrapper implements IBiomeWrapper boolean success; - #if MC_VER == MC_1_16_5 || MC_VER == MC_1_17_1 + #if MC_VER <= MC_1_17_1 Biome biome = registryAccess.registryOrThrow(Registry.BIOME_REGISTRY).get(resourceLocation); success = (biome != null); - #elif MC_VER == MC_1_18_2 || MC_VER == MC_1_19_2 + #elif MC_VER <= MC_1_19_2 Biome unwrappedBiome = registryAccess.registryOrThrow(Registry.BIOME_REGISTRY).get(resourceLocation); success = (unwrappedBiome != null); Holder biome = new Holder.Direct<>(unwrappedBiome); - #elif MC_VER < MC_1_21_3 + #elif MC_VER <= MC_1_21_4 Biome unwrappedBiome = registryAccess.registryOrThrow(Registries.BIOME).get(resourceLocation); success = (unwrappedBiome != null); Holder biome = new Holder.Direct<>(unwrappedBiome); - #else + #elif MC_VER <= MC_1_21_11 Holder biome; Optional> optionalBiomeHolder = registryAccess.lookupOrThrow(Registries.BIOME).get(resourceLocation); if (optionalBiomeHolder.isPresent()) @@ -379,6 +380,20 @@ public class BiomeWrapper implements IBiomeWrapper success = false; biome = null; } + #else + Holder biome; + Optional> optionalBiomeHolder = registryAccess.lookupOrThrow(Registries.BIOME).get(resourceLocation); + if (optionalBiomeHolder.isPresent()) + { + Biome unwrappedBiome = optionalBiomeHolder.get().value(); + success = (unwrappedBiome != null); + biome = new Holder.Direct<>(unwrappedBiome, DataComponentMap.EMPTY); + } + else + { + success = false; + biome = null; + } #endif return new BiomeDeserializeResult(success, biome); diff --git a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/block/BlockStateWrapper.java b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/block/BlockStateWrapper.java index b34a1c228..fcdcdb2c1 100644 --- a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/block/BlockStateWrapper.java +++ b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/block/BlockStateWrapper.java @@ -214,7 +214,14 @@ public class BlockStateWrapper implements IBlockStateWrapper if (blockState != null) { // check if this block has any tags - Stream> tags = blockState.getTags(); + + Stream> tags; + #if MC_VER <= MC_1_21_11 + tags = blockState.getTags(); + #else + tags = blockState.tags(); + #endif + this.isBeaconBaseBlock = tags.anyMatch((TagKey tag) -> tag.location().getPath().toLowerCase().contains("beacon_base_blocks")); } else @@ -667,22 +674,23 @@ public class BlockStateWrapper implements IBlockStateWrapper // older versions of MC have a static registry - #if MC_VER > MC_1_17_1 + #if MC_VER <= MC_1_16_5 + #else Level level = (Level)levelWrapper.getWrappedMcObject(); net.minecraft.core.RegistryAccess registryAccess = level.registryAccess(); #endif - #if MC_VER < MC_1_21_11 + #if MC_VER <= MC_1_21_10 ResourceLocation resourceLocation; #else Identifier resourceLocation; #endif - #if MC_VER == MC_1_16_5 || MC_VER == MC_1_17_1 + #if MC_VER <= MC_1_17_1 resourceLocation = Registry.BLOCK.getKey(this.blockState.getBlock()); - #elif MC_VER == MC_1_18_2 || MC_VER == MC_1_19_2 + #elif MC_VER <= MC_1_19_2 resourceLocation = registryAccess.registryOrThrow(Registry.BLOCK_REGISTRY).getKey(this.blockState.getBlock()); - #elif MC_VER < MC_1_21_3 + #elif MC_VER <= MC_1_21_4 resourceLocation = registryAccess.registryOrThrow(Registries.BLOCK).getKey(this.blockState.getBlock()); #else resourceLocation = registryAccess.lookupOrThrow(Registries.BLOCK).getKey(this.blockState.getBlock()); @@ -771,18 +779,19 @@ public class BlockStateWrapper implements IBlockStateWrapper try { - #if MC_VER > MC_1_17_1 + #if MC_VER <= MC_1_16_5 + #else LodUtil.assertTrue(levelWrapper != null && levelWrapper.getWrappedMcObject() != null); Level level = (Level)levelWrapper.getWrappedMcObject(); #endif Block block; - #if MC_VER == MC_1_16_5 || MC_VER == MC_1_17_1 + #if MC_VER <= MC_1_17_1 block = Registry.BLOCK.get(resourceLocation); - #elif MC_VER == MC_1_18_2 || MC_VER == MC_1_19_2 + #elif MC_VER <= MC_1_19_2 net.minecraft.core.RegistryAccess registryAccess = level.registryAccess(); block = registryAccess.registryOrThrow(Registry.BLOCK_REGISTRY).get(resourceLocation); - #elif MC_VER < MC_1_21_3 + #elif MC_VER <= MC_1_21_4 net.minecraft.core.RegistryAccess registryAccess = level.registryAccess(); block = registryAccess.registryOrThrow(Registries.BLOCK).get(resourceLocation); #else diff --git a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/block/ClientBlockStateColorCache.java b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/block/ClientBlockStateColorCache.java index b2fe09cb2..48f4caf95 100644 --- a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/block/ClientBlockStateColorCache.java +++ b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/block/ClientBlockStateColorCache.java @@ -46,6 +46,7 @@ import java.util.List; import java.util.concurrent.locks.ReentrantLock; #if MC_VER < MC_1_21_5 +import net.minecraft.client.renderer.block.model.BakedQuad; #elif MC_VER <= MC_1_21_11 import net.minecraft.client.renderer.block.model.BlockModelPart; import net.minecraft.client.renderer.block.model.BakedQuad; diff --git a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/block/TextureAtlasSpriteWrapper.java b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/block/TextureAtlasSpriteWrapper.java index 6d89fb043..81c441c30 100644 --- a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/block/TextureAtlasSpriteWrapper.java +++ b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/block/TextureAtlasSpriteWrapper.java @@ -19,6 +19,7 @@ package com.seibel.distanthorizons.common.wrappers.block; +import com.seibel.distanthorizons.common.wrappers.chunk.ChunkWrapper; import net.minecraft.client.renderer.texture.TextureAtlasSprite; #if MC_VER < MC_1_17_1 diff --git a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/block/TintGetterOverride.java b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/block/TintGetterOverride.java index f55d1a59e..1e9bfb0e4 100644 --- a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/block/TintGetterOverride.java +++ b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/block/TintGetterOverride.java @@ -63,8 +63,10 @@ public class TintGetterOverride extends AbstractDhTintGetter // methods // //=========// + #if MC_VER <= MC_1_21_11 @Override public float getShade(Direction direction, boolean bl) { return this.parent.getShade(direction, bl); } + #endif @Override public LevelLightEngine getLightEngine() { return this.parent.getLightEngine(); } @@ -175,6 +177,13 @@ public class TintGetterOverride extends AbstractDhTintGetter @Override public int getSectionYFromSectionIndex(int i) { return this.parent.getSectionYFromSectionIndex(i); } + #endif + + + #if MC_VER <= MC_1_21_11 + #else + @Override + public CardinalLighting cardinalLighting() { return CardinalLighting.DEFAULT; } #endif diff --git a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/block/TintWithoutLevelOverrider.java b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/block/TintWithoutLevelOverrider.java index a613bed4f..406b625c7 100644 --- a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/block/TintWithoutLevelOverrider.java +++ b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/block/TintWithoutLevelOverrider.java @@ -19,8 +19,6 @@ package com.seibel.distanthorizons.common.wrappers.block; -import com.seibel.distanthorizons.core.dataObjects.fullData.sources.FullDataSourceV2; -import com.seibel.distanthorizons.core.wrapperInterfaces.world.IClientLevelWrapper; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.world.level.LevelReader; @@ -30,6 +28,12 @@ import net.minecraft.world.level.lighting.LevelLightEngine; import net.minecraft.world.level.material.FluidState; import org.jetbrains.annotations.Nullable; +#if MC_VER <= MC_1_21_11 +#else +import net.minecraft.world.level.CardinalLighting; +#endif + + public class TintWithoutLevelOverrider extends AbstractDhTintGetter { @@ -46,9 +50,12 @@ public class TintWithoutLevelOverrider extends AbstractDhTintGetter // methods // //=========// + #if MC_VER <= MC_1_21_11 @Override public float getShade(Direction direction, boolean shade) { throw new UnsupportedOperationException("ERROR: getShade() called on TintWithoutLevelOverrider. Object is for tinting only."); } + #endif + @Override public LevelLightEngine getLightEngine() { throw new UnsupportedOperationException("ERROR: getLightEngine() called on TintWithoutLevelOverrider. Object is for tinting only."); } @@ -87,4 +94,18 @@ public class TintWithoutLevelOverrider extends AbstractDhTintGetter #endif + + //=================// + // post MC 1.21.11 // + //=================// + + #if MC_VER <= MC_1_21_11 + #else + @Override + public CardinalLighting cardinalLighting() + { throw new UnsupportedOperationException("ERROR: cardinalLighting() called on TintWithoutLevelOverrider. Object is for tinting only."); } + #endif + + + } diff --git a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/chunk/ChunkWrapper.java b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/chunk/ChunkWrapper.java index 9a6e13199..022c3fb93 100644 --- a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/chunk/ChunkWrapper.java +++ b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/chunk/ChunkWrapper.java @@ -122,7 +122,12 @@ public class ChunkWrapper implements IChunkWrapper { this.chunk = chunk; this.wrappedLevel = wrappedLevel; + + #if MC_VER <= MC_1_21_11 this.chunkPos = new DhChunkPos(chunk.getPos().x, chunk.getPos().z); + #else + this.chunkPos = new DhChunkPos(chunk.getPos().x(), chunk.getPos().z()); + #endif } @Override diff --git a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/gui/ClassicConfigGUI.java b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/gui/ClassicConfigGUI.java index 5d4f83240..92da56ae0 100644 --- a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/gui/ClassicConfigGUI.java +++ b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/gui/ClassicConfigGUI.java @@ -46,8 +46,10 @@ import org.jetbrains.annotations.Nullable; #if MC_VER < MC_1_20_1 import com.mojang.blaze3d.vertex.PoseStack; import net.minecraft.client.gui.GuiComponent; -#else +#elif MC_VER <= MC_1_21_11 import net.minecraft.client.gui.GuiGraphics; +#else +import net.minecraft.client.gui.GuiGraphicsExtractor; #endif #if MC_VER >= MC_1_17_1 @@ -581,7 +583,7 @@ public class ClassicConfigGUI widget.insertText(String.valueOf(configEntry.get())); Predicate processor = configGuiInfo.tooltipFunction.apply(widget, this.doneButton); - widget.setFilter(processor); + //widget.setFilter(processor); this.configListWidget.addButton(this, configEntry, widget, resetButton, null, textComponent); @@ -698,17 +700,26 @@ public class ClassicConfigGUI @Override #if MC_VER < MC_1_20_1 public void render(PoseStack matrices, int mouseX, int mouseY, float delta) - #else + #elif MC_VER <= MC_1_21_11 public void render(GuiGraphics matrices, int mouseX, int mouseY, float delta) + #else + public void extractRenderState(GuiGraphicsExtractor matrices, int mouseX, int mouseY, float delta) #endif { #if MC_VER < MC_1_20_2 // 1.20.2 now enables this by default in the `this.list.render` function - this.renderBackground(matrices); // Renders background - #else + this.renderBackground(matrices); + #elif MC_VER <= MC_1_21_11 super.render(matrices, mouseX, mouseY, delta); + #else + super.extractRenderState(matrices, mouseX, mouseY, delta); #endif - this.configListWidget.render(matrices, mouseX, mouseY, delta); // Render buttons + // Render buttons + #if MC_VER <= MC_1_21_11 + this.configListWidget.render(matrices, mouseX, mouseY, delta); + #else + this.configListWidget.extractRenderState(matrices, mouseX, mouseY, delta); + #endif // Render config title @@ -751,7 +762,7 @@ public class ClassicConfigGUI #if MC_VER < MC_1_20_1 private void renderTooltip(PoseStack matrices, int mouseX, int mouseY, float delta) #else - private void renderTooltip(GuiGraphics matrices, int mouseX, int mouseY, float delta) + private void renderTooltip(GuiGraphicsExtractor matrices, int mouseX, int mouseY, float delta) #endif { AbstractWidget hoveredWidget = this.configListWidget.getHoveredButton(mouseX, mouseY); @@ -953,8 +964,10 @@ public class ClassicConfigGUI public void render(PoseStack matrices, int index, int y, int x, int entryWidth, int entryHeight, int mouseX, int mouseY, boolean hovered, float tickDelta) #elif MC_VER < MC_1_21_9 public void render(GuiGraphics matrices, int index, int y, int x, int entryWidth, int entryHeight, int mouseX, int mouseY, boolean hovered, float tickDelta) - #else + #elif MC_VER <= MC_1_21_11 public void renderContent(GuiGraphics matrices, int mouseX, int mouseY, boolean hovered, float tickDelta) + #else + public void extractContent(GuiGraphicsExtractor matrices, int mouseX, int mouseY, boolean hovered, float tickDelta) #endif { try @@ -973,19 +986,31 @@ public class ClassicConfigGUI if (this.button != null) { SetY(this.button, y); + #if MC_VER <= MC_1_21_11 this.button.render(matrices, mouseX, mouseY, tickDelta); + #else + this.button.extractRenderState(matrices, mouseX, mouseY, tickDelta); + #endif } if (this.resetButton != null) { SetY(this.resetButton, y); + #if MC_VER <= MC_1_21_11 this.resetButton.render(matrices, mouseX, mouseY, tickDelta); + #else + this.resetButton.extractRenderState(matrices, mouseX, mouseY, tickDelta); + #endif } if (this.indexButton != null) { SetY(this.indexButton, y); + #if MC_VER <= MC_1_21_11 this.indexButton.render(matrices, mouseX, mouseY, tickDelta); + #else + this.indexButton.extractRenderState(matrices, mouseX, mouseY, tickDelta); + #endif } if (this.text != null) @@ -1034,11 +1059,16 @@ public class ClassicConfigGUI this.text, textXPos, y + 5, 0xFFFFFF); - #else + #elif MC_VER <= MC_1_21_11 matrices.drawString(textRenderer, this.text, textXPos, y + 5, 0xFFFFFFFF); + #else + matrices.text(textRenderer, + this.text, + textXPos, y + 5, + 0xFFFFFFFF); #endif } } diff --git a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/gui/DhDebugScreenEntry.java b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/gui/DhDebugScreenEntry.java index 775e7c5f1..4a06bc23d 100644 --- a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/gui/DhDebugScreenEntry.java +++ b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/gui/DhDebugScreenEntry.java @@ -3,6 +3,7 @@ package com.seibel.distanthorizons.common.wrappers.gui; #if MC_VER < MC_1_21_9 // not supported for older MC versions #else + import com.seibel.distanthorizons.core.logging.f3.F3Screen; import com.seibel.distanthorizons.coreapi.ModInfo; @@ -19,6 +20,8 @@ import net.minecraft.world.level.chunk.LevelChunk; #if MC_VER <= MC_1_21_10 import net.minecraft.resources.ResourceLocation; +#else +import net.minecraft.resources.Identifier; #endif #endif @@ -32,6 +35,7 @@ public class DhDebugScreenEntry implements net.minecraft.client.gui.components.d { public static void register() { + #if MC_VER <= MC_1_21_11 // This method is private, so its access will need to be widened DebugScreenEntries.register( // The id, this will be displayed on the options screen @@ -44,6 +48,15 @@ public class DhDebugScreenEntry implements net.minecraft.client.gui.components.d // The screen entry new DhDebugScreenEntry() ); + #else + DebugScreenEntries.allEntries().put( + // The id, this will be displayed on the options screen + Identifier.fromNamespaceAndPath(ModInfo.RESOURCE_NAMESPACE, "distant_horizons"), + + // The screen entry + new DhDebugScreenEntry() + ); + #endif } diff --git a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/gui/DhScreen.java b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/gui/DhScreen.java index 34ce892b1..b2f4f3571 100644 --- a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/gui/DhScreen.java +++ b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/gui/DhScreen.java @@ -1,15 +1,19 @@ package com.seibel.distanthorizons.common.wrappers.gui; import net.minecraft.client.gui.Font; -#if MC_VER < MC_1_20_1 -import com.mojang.blaze3d.vertex.PoseStack; -#else -import net.minecraft.client.gui.GuiGraphics; -#endif + import net.minecraft.client.gui.components.Button; import net.minecraft.client.gui.screens.Screen; import net.minecraft.network.chat.Component; +#if MC_VER < MC_1_20_1 +import com.mojang.blaze3d.vertex.PoseStack; +#elif MC_VER <= MC_1_21_11 +import net.minecraft.client.gui.GuiGraphics; +#else +import net.minecraft.client.gui.GuiGraphicsExtractor; +#endif + import java.util.List; public class DhScreen extends Screen @@ -73,7 +77,7 @@ public class DhScreen extends Screen { guiStack.renderTooltip(font, text, x, y); } - #else + #elif MC_VER <= MC_1_21_11 protected void DhDrawCenteredString(GuiGraphics guiStack, Font font, Component text, int x, int y, int color) { guiStack.drawCenteredString(font, text, x, y, color); @@ -82,10 +86,6 @@ public class DhScreen extends Screen { guiStack.drawString(font, text, x, y, color); } - //protected void DhRenderTooltip(GuiGraphics guiStack, Font font, List text, int x, int y) - //{ - // //guiStack.renderTooltip(font, text, x, y); - //} protected void DhRenderComponentTooltip(GuiGraphics guiStack, Font font, List comp, int x, int y) { guiStack.setComponentTooltipForNextFrame(font, comp, x, y); @@ -94,6 +94,23 @@ public class DhScreen extends Screen { guiStack.setTooltipForNextFrame(font, text, x, y); } + #else + protected void DhDrawCenteredString(GuiGraphicsExtractor guiStack, Font font, Component text, int x, int y, int color) + { + guiStack.centeredText(font, text, x, y, color); + } + protected void DhDrawString(GuiGraphicsExtractor guiStack, Font font, Component text, int x, int y, int color) + { + guiStack.text(font, text, x, y, color); + } + protected void DhRenderComponentTooltip(GuiGraphicsExtractor guiStack, Font font, List comp, int x, int y) + { + guiStack.setComponentTooltipForNextFrame(font, comp, x, y); + } + protected void DhRenderTooltip(GuiGraphicsExtractor guiStack, Font font, Component text, int x, int y) + { + guiStack.setTooltipForNextFrame(font, text, x, y); + } #endif diff --git a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/gui/MinecraftScreen.java b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/gui/MinecraftScreen.java index 7b35a173f..9e1f4ae30 100644 --- a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/gui/MinecraftScreen.java +++ b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/gui/MinecraftScreen.java @@ -1,16 +1,24 @@ package com.seibel.distanthorizons.common.wrappers.gui; import com.mojang.blaze3d.platform.Window; -import com.mojang.blaze3d.vertex.PoseStack; + + import com.seibel.distanthorizons.core.config.gui.AbstractScreen; + import net.minecraft.client.Minecraft; -#if MC_VER >= MC_1_20_1 -import net.minecraft.client.gui.GuiGraphics; -#endif import net.minecraft.client.gui.components.ContainerObjectSelectionList; import net.minecraft.client.gui.screens.Screen; + import org.jetbrains.annotations.NotNull; +#if MC_VER < MC_1_20_1 +import com.mojang.blaze3d.vertex.PoseStack; +#elif MC_VER <= MC_1_21_11 +import net.minecraft.client.gui.GuiGraphics; +#else +import net.minecraft.client.gui.GuiGraphicsExtractor; +#endif + import java.nio.file.Path; import java.util.*; @@ -74,8 +82,10 @@ public class MinecraftScreen @Override #if MC_VER < MC_1_20_1 public void render(PoseStack matrices, int mouseX, int mouseY, float delta) - #else + #elif MC_VER <= MC_1_21_11 public void render(GuiGraphics matrices, int mouseX, int mouseY, float delta) + #else + public void extractRenderState(GuiGraphicsExtractor matrices, int mouseX, int mouseY, float delta) #endif { #if MC_VER < MC_1_20_2 @@ -86,13 +96,21 @@ public class MinecraftScreen // background blur is already being rendered, rendering again causes the game to crash #endif + #if MC_VER <= MC_1_21_11 this.configListWidget.render(matrices, mouseX, mouseY, delta); // Renders the items in the render list (currently only used to tint background darker) - + #else + this.configListWidget.extractRenderState(matrices, mouseX, mouseY, delta); // Renders the items in the render list (currently only used to tint background darker) + #endif + this.screen.mouseX = mouseX; this.screen.mouseY = mouseY; this.screen.render(delta); // Render everything on the main screen + #if MC_VER <= MC_1_21_11 super.render(matrices, mouseX, mouseY, delta); // Render the vanilla stuff (currently only used for the background and tint) + #else + super.extractRenderState(matrices, mouseX, mouseY, delta); // Renders the items in the render list (currently only used to tint background darker) + #endif } #if MC_VER <= MC_1_21_10 diff --git a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/gui/TexturedButtonWidget.java b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/gui/TexturedButtonWidget.java index c83a91ee5..436daa73f 100644 --- a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/gui/TexturedButtonWidget.java +++ b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/gui/TexturedButtonWidget.java @@ -45,9 +45,12 @@ import net.minecraft.client.renderer.RenderType; import net.minecraft.client.gui.GuiGraphics; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.RenderPipelines; -#else +#elif MC_VER <= MC_1_21_11 import net.minecraft.client.gui.GuiGraphics; import net.minecraft.client.renderer.RenderPipelines; +#else +import net.minecraft.client.gui.GuiGraphicsExtractor; +import net.minecraft.client.renderer.RenderPipelines; #endif #if MC_VER <= MC_1_21_10 @@ -196,9 +199,12 @@ public class TexturedButtonWidget extends Button #if MC_VER < MC_1_21_11 @Override public void renderWidget(GuiGraphics matrices, int mouseX, int mouseY, float delta) - #else + #elif MC_VER <= MC_1_21_11 @Override protected void renderContents(GuiGraphics matrices, int mouseX, int mouseY, float delta) + #else + @Override + protected void extractContents(GuiGraphicsExtractor matrices, int mouseX, int mouseY, float delta) #endif { if (this.renderBackground) @@ -212,11 +218,11 @@ public class TexturedButtonWidget extends Button this.getX(), this.getY(), this.getWidth(), this.getHeight()); #else - matrices.blitSprite( - RenderPipelines.GUI_TEXTURED, - SPRITES.get(this.active, this.isHoveredOrFocused()), - this.getX(), this.getY(), - this.getWidth(), this.getHeight()); + //matrices.blitSprite( + // RenderPipelines.GUI_TEXTURED, + // SPRITES.get(this.active, this.isHoveredOrFocused()), + // this.getX(), this.getY(), + // this.getWidth(), this.getHeight()); #endif } diff --git a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/gui/updater/ChangelogScreen.java b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/gui/updater/ChangelogScreen.java index d234b960c..c578c0451 100644 --- a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/gui/updater/ChangelogScreen.java +++ b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/gui/updater/ChangelogScreen.java @@ -23,8 +23,10 @@ import net.minecraft.client.gui.narration.NarratableEntry; #if MC_VER < MC_1_20_1 import net.minecraft.client.gui.GuiComponent; import com.mojang.blaze3d.vertex.PoseStack; -#else +#elif MC_VER <= MC_1_21_11 import net.minecraft.client.gui.GuiGraphics; +#else +import net.minecraft.client.gui.GuiGraphicsExtractor; #endif @@ -168,8 +170,10 @@ public class ChangelogScreen extends DhScreen @Override #if MC_VER < MC_1_20_1 public void render(PoseStack matrices, int mouseX, int mouseY, float delta) - #else + #elif MC_VER <= MC_1_21_11 public void render(GuiGraphics matrices, int mouseX, int mouseY, float delta) + #else + public void extractRenderState(GuiGraphicsExtractor matrices, int mouseX, int mouseY, float delta) #endif { #if MC_VER < MC_1_20_2 @@ -206,8 +210,14 @@ public class ChangelogScreen extends DhScreen // render order matters, otherwise on 1.20.6+ the blurred background will render on top of the text + #if MC_VER <= MC_1_21_11 super.render(matrices, mouseX, mouseY, delta); // Render the buttons this.changelogArea.render(matrices, mouseX, mouseY, delta); // Render the changelog + #else + super.extractRenderState(matrices, mouseX, mouseY, delta); // Render the buttons + this.changelogArea.extractRenderState(matrices, mouseX, mouseY, delta); // Render the changelog + #endif + this.DhDrawCenteredString(matrices, this.font, this.title, this.width / 2, 15, 0xFFFFFF); // Render title } @@ -264,10 +274,14 @@ public class ChangelogScreen extends DhScreen @Override public void render(GuiGraphics matrices, int index, int y, int x, int entryWidth, int entryHeight, int mouseX, int mouseY, boolean hovered, float tickDelta) { matrices.drawString(textRenderer, this.text, 12, y + 5, 0xFFFFFF); } - #else + #elif MC_VER <= MC_1_21_11 @Override public void renderContent(GuiGraphics matrices, int y, int x, boolean hovered, float tickDelta) { matrices.drawString(textRenderer, this.text, 12, y + 5, 0xFFFFFF); } + #else + @Override + public void extractContent(GuiGraphicsExtractor matrices, int y, int x, boolean hovered, float tickDelta) + { matrices.text(textRenderer, this.text, 12, y + 5, 0xFFFFFF); } #endif @Override diff --git a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/gui/updater/UpdateModScreen.java b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/gui/updater/UpdateModScreen.java index 5fe7872e5..077567c83 100644 --- a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/gui/updater/UpdateModScreen.java +++ b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/gui/updater/UpdateModScreen.java @@ -13,10 +13,12 @@ import com.seibel.distanthorizons.core.logging.DhLogger; import net.minecraft.client.gui.screens.Screen; -#if MC_VER >= MC_1_20_1 +#if MC_VER < MC_1_20_1 +import com.mojang.blaze3d.vertex.PoseStack; +#elif MC_VER <= MC_1_21_11 import net.minecraft.client.gui.GuiGraphics; #else -import com.mojang.blaze3d.vertex.PoseStack; +import net.minecraft.client.gui.GuiGraphicsExtractor; #endif #if MC_VER <= MC_1_21_10 @@ -172,8 +174,10 @@ public class UpdateModScreen extends DhScreen @Override #if MC_VER < MC_1_20_1 public void render(PoseStack matrices, int mouseX, int mouseY, float delta) - #else + #elif MC_VER <= MC_1_21_11 public void render(GuiGraphics matrices, int mouseX, int mouseY, float delta) + #else + public void extractRenderState(GuiGraphicsExtractor matrices, int mouseX, int mouseY, float delta) #endif { #if MC_VER < MC_1_20_2 @@ -184,8 +188,12 @@ public class UpdateModScreen extends DhScreen // background blur is already being rendered, rendering again causes the game to crash #endif + #if MC_VER <= MC_1_21_11 super.render(matrices, mouseX, mouseY, delta); // Render the buttons - + #else + super.extractRenderState(matrices, mouseX, mouseY, delta); + #endif + // Render the text's this.DhDrawCenteredString(matrices, this.font, Translatable(ModInfo.ID + ".updater.text1"), diff --git a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/minecraft/MinecraftClientWrapper.java b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/minecraft/MinecraftClientWrapper.java index 3e7dd09f9..408ba1d15 100644 --- a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/minecraft/MinecraftClientWrapper.java +++ b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/minecraft/MinecraftClientWrapper.java @@ -172,7 +172,12 @@ public class MinecraftClientWrapper implements IMinecraftClientWrapper, IMinecra #else ChunkPos playerPos = player.chunkPosition(); #endif + + #if MC_VER <= MC_1_21_11 return new DhChunkPos(playerPos.x, playerPos.z); + #else + return new DhChunkPos(playerPos.x(), playerPos.z()); + #endif } //endregion @@ -227,7 +232,11 @@ public class MinecraftClientWrapper implements IMinecraftClientWrapper, IMinecra RenderThreadTaskHandler.INSTANCE.queueRunningOnRenderThread("MinecraftClientWrapper sendChatMessage", () -> { + #if MC_VER <= MC_1_21_11 player.displayClientMessage(net.minecraft.network.chat.Component.translatable(string), /*isOverlay*/false); + #else + player.sendSystemMessage(net.minecraft.network.chat.Component.translatable(string)); + #endif }); #endif } @@ -243,8 +252,10 @@ public class MinecraftClientWrapper implements IMinecraftClientWrapper, IMinecra #if MC_VER < MC_1_19_2 player.displayClientMessage(new TextComponent(string), /*isOverlay*/true); - #else + #elif MC_VER <= MC_1_21_11 player.displayClientMessage(net.minecraft.network.chat.Component.translatable(string), /*isOverlay*/true); + #else + player.sendOverlayMessage(net.minecraft.network.chat.Component.translatable(string)); #endif } diff --git a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/minecraft/MinecraftRenderWrapper.java b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/minecraft/MinecraftRenderWrapper.java index fede80a71..e5388b07d 100644 --- a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/minecraft/MinecraftRenderWrapper.java +++ b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/minecraft/MinecraftRenderWrapper.java @@ -182,8 +182,10 @@ public class MinecraftRenderWrapper implements IMinecraftRenderWrapper return MC.getFrameTime(); #elif MC_VER < MC_1_21_3 return MC.getTimer().getRealtimeDeltaTicks(); - #else + #elif MC_VER <= MC_1_21_11 return MC.deltaTracker.getRealtimeDeltaTicks(); + #else + return MC.getDeltaTracker().getRealtimeDeltaTicks(); #endif } @@ -513,7 +515,11 @@ public class MinecraftRenderWrapper implements IMinecraftRenderWrapper if (MC.level != null) { Direction mcDir = McObjectConverter.Convert(lodDirection); + #if MC_VER <= MC_1_21_11 return MC.level.getShade(mcDir, true); + #else + return MC.level.cardinalLighting().byFace(mcDir); + #endif } else { diff --git a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/worldGeneration/InternalServerGenerator.java b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/worldGeneration/InternalServerGenerator.java index a0feb826f..a15a5fb79 100644 --- a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/worldGeneration/InternalServerGenerator.java +++ b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/worldGeneration/InternalServerGenerator.java @@ -1,6 +1,7 @@ package com.seibel.distanthorizons.common.wrappers.worldGeneration; import com.seibel.distanthorizons.api.DhApi; +import com.seibel.distanthorizons.common.wrappers.McObjectConverter; import com.seibel.distanthorizons.common.wrappers.chunk.ChunkWrapper; import com.seibel.distanthorizons.common.wrappers.worldGeneration.params.GlobalWorldGenParams; import com.seibel.distanthorizons.core.api.internal.ClientApi; @@ -245,7 +246,7 @@ public class InternalServerGenerator // ignore chunk update events for this position if (this.updateManager != null) { - this.updateManager.addPosToIgnore(new DhChunkPos(chunkPos.x, chunkPos.z)); + this.updateManager.addPosToIgnore(McObjectConverter.Convert(chunkPos)); } #if MC_VER < MC_1_21_5 @@ -258,7 +259,10 @@ public class InternalServerGenerator // probably not the most optimal to run updates here, but fast enough level.getChunkSource().distanceManager.runAllUpdates(level.getChunkSource().chunkMap); - ChunkHolder chunkHolder = level.getChunkSource().chunkMap.getUpdatingChunkIfPresent(chunkPos.toLong()); + ChunkHolder chunkHolder = level.getChunkSource().chunkMap + .getUpdatingChunkIfPresent( + #if MC_VER <= MC_1_21_11 chunkPos.toLong() #else chunkPos.pack() #endif + ); if (chunkHolder == null) { throw new IllegalStateException("No chunk chunkHolder for pos ["+chunkPos+"] after ticket has been added."); diff --git a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/worldGeneration/chunkFileHandling/ChunkCompoundTagParser.java b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/worldGeneration/chunkFileHandling/ChunkCompoundTagParser.java index 4ffef0959..f19e145d5 100644 --- a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/worldGeneration/chunkFileHandling/ChunkCompoundTagParser.java +++ b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/worldGeneration/chunkFileHandling/ChunkCompoundTagParser.java @@ -20,12 +20,14 @@ package com.seibel.distanthorizons.common.wrappers.worldGeneration.chunkFileHandling; import com.mojang.serialization.Codec; +import com.seibel.distanthorizons.common.wrappers.McObjectConverter; import com.seibel.distanthorizons.common.wrappers.chunk.ChunkWrapper; import com.seibel.distanthorizons.core.config.Config; import com.seibel.distanthorizons.core.level.IDhServerLevel; import com.seibel.distanthorizons.core.logging.DhLogger; import com.seibel.distanthorizons.core.logging.DhLoggerBuilder; +import com.seibel.distanthorizons.core.pos.DhChunkPos; import com.seibel.distanthorizons.core.util.LodUtil; import com.seibel.distanthorizons.core.wrapperInterfaces.chunk.ChunkLightStorage; @@ -673,7 +675,9 @@ public class ChunkCompoundTagParser { LOGGED_ERROR_MESSAGE_MAP.computeIfAbsent(message, (newMessage) -> { - LOGGER.warn("Unable to deserialize blocks for chunk section [" + chunkPos.x + ", " + sectionYIndex + ", " + chunkPos.z + "], error: ["+newMessage+"]. " + + DhChunkPos dhChunkPos = McObjectConverter.Convert(chunkPos); + + LOGGER.warn("Unable to deserialize blocks for chunk section [" + dhChunkPos.getX() + ", " + sectionYIndex + ", " + dhChunkPos.getZ() + "], error: ["+newMessage+"]. " + "This can probably be ignored, although if your world looks wrong, optimizing it via the single player menu then deleting your DH database(s) should fix the problem."); return newMessage; @@ -683,7 +687,9 @@ public class ChunkCompoundTagParser { LOGGED_ERROR_MESSAGE_MAP.computeIfAbsent(message, (newMessage) -> { - LOGGER.warn("Unable to deserialize biomes for chunk section [" + chunkPos.x + ", " + sectionYIndex + ", " + chunkPos.z + "], error: ["+newMessage+"]. " + + DhChunkPos dhChunkPos = McObjectConverter.Convert(chunkPos); + + LOGGER.warn("Unable to deserialize biomes for chunk section [" + dhChunkPos.getX() + ", " + sectionYIndex + ", " + dhChunkPos.getZ() + "], error: ["+newMessage+"]. " + "This can probably be ignored, although if your world looks wrong, optimizing it via the single player menu then deleting your DH database(s) should fix the problem."); return newMessage; diff --git a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/worldGeneration/mimicObject/DhLitWorldGenRegion.java b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/worldGeneration/mimicObject/DhLitWorldGenRegion.java index dcd9a36a0..c58b181f8 100644 --- a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/worldGeneration/mimicObject/DhLitWorldGenRegion.java +++ b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/worldGeneration/mimicObject/DhLitWorldGenRegion.java @@ -22,9 +22,12 @@ package com.seibel.distanthorizons.common.wrappers.worldGeneration.mimicObject; import java.lang.invoke.MethodHandles; import java.util.List; import java.util.concurrent.locks.ReentrantLock; + +import com.seibel.distanthorizons.common.wrappers.McObjectConverter; import com.seibel.distanthorizons.common.wrappers.chunk.ChunkWrapper; import com.seibel.distanthorizons.common.wrappers.worldGeneration.BatchGenerationEnvironment; import com.seibel.distanthorizons.core.logging.DhLoggerBuilder; +import com.seibel.distanthorizons.core.pos.DhChunkPos; import com.seibel.distanthorizons.core.util.LodUtil; import net.minecraft.world.level.block.EntityBlock; import net.minecraft.world.level.block.SpawnerBlock; @@ -89,7 +92,7 @@ public class DhLitWorldGenRegion extends WorldGenRegion public final int writeRadius; public final int size; - private final ChunkPos firstPos; + private final DhChunkPos firstPos; private final List cache; private final Long2ObjectOpenHashMap chunkMap = new Long2ObjectOpenHashMap(); @@ -149,7 +152,7 @@ public class DhLitWorldGenRegion extends WorldGenRegion centerChunk); #endif - this.firstPos = chunkList.get(0).getPos(); + this.firstPos = McObjectConverter.Convert(chunkList.get(0).getPos()); this.serverLevel = serverLevel; this.generator = generator; this.lightEngine = lightEngine; @@ -165,17 +168,22 @@ public class DhLitWorldGenRegion extends WorldGenRegion @Override public boolean ensureCanWrite(BlockPos blockPos) { - int i = SectionPos.blockToSectionCoord(blockPos.getX()); - int j = SectionPos.blockToSectionCoord(blockPos.getZ()); - ChunkPos chunkPos = this.getCenter(); - ChunkAccess center = this.getChunk(chunkPos.x, chunkPos.z); - int k = Math.abs(chunkPos.x - i); - int l = Math.abs(chunkPos.z - j); - if (k > this.writeRadius || l > this.writeRadius) + DhChunkPos chunkPos = McObjectConverter.Convert(this.getCenter()); + + int sectionCoordX = SectionPos.blockToSectionCoord(blockPos.getX()); + int sectionCoordZ = SectionPos.blockToSectionCoord(blockPos.getZ()); + + // TODO what do these "abs" positions mean? + int absX = Math.abs(chunkPos.getX() - sectionCoordX); + int absZ = Math.abs(chunkPos.getZ() - sectionCoordZ); + if (absX > this.writeRadius + || absZ > this.writeRadius) { return false; } + #if MC_VER >= MC_1_18_2 + ChunkAccess center = this.getChunk(chunkPos.getX(), chunkPos.getZ()); if (center.isUpgrading()) { LevelHeightAccessor levelHeightAccessor = center.getHeightAccessorForGeneration(); @@ -196,6 +204,7 @@ public class DhLitWorldGenRegion extends WorldGenRegion } } #endif + return true; } #endif @@ -401,17 +410,18 @@ public class DhLitWorldGenRegion extends WorldGenRegion /** Use this instead of super.hasChunk() to bypass C2ME concurrency checks */ public boolean superHasChunk(int x, int z) { - int k = x - this.firstPos.x; - int l = z - this.firstPos.z; - return l >= 0 && l < this.size && k >= 0 && k < this.size; + int xOffset = x - this.firstPos.getX(); + int zOffset = z - this.firstPos.getZ(); + return zOffset >= 0 && zOffset < this.size + && xOffset >= 0 && xOffset < this.size; } /** Use this instead of super.getChunk() to bypass C2ME concurrency checks */ private ChunkAccess superGetChunk(int x, int z) { - int k = x - this.firstPos.x; - int l = z - this.firstPos.z; - return this.cache.get(k + l * this.size); + int xOffset = x - this.firstPos.getX(); + int zOffset = z - this.firstPos.getZ(); + return this.cache.get(xOffset + zOffset * this.size); } diff --git a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/worldGeneration/mimicObject/RegionFileStorageExternalCache.java b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/worldGeneration/mimicObject/RegionFileStorageExternalCache.java index d7b2df37d..ae2fb9b04 100644 --- a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/worldGeneration/mimicObject/RegionFileStorageExternalCache.java +++ b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/worldGeneration/mimicObject/RegionFileStorageExternalCache.java @@ -69,8 +69,13 @@ public class RegionFileStorageExternalCache implements AutoCloseable } + long chunkPosLong; + #if MC_VER <= MC_1_21_11 + chunkPosLong = ChunkPos.asLong(chunkPos.getRegionX(), chunkPos.getRegionZ()); + #else + chunkPosLong = ChunkPos.pack(chunkPos.getRegionX(), chunkPos.getRegionZ()); + #endif - long chunkPosLong = ChunkPos.asLong(chunkPos.getRegionX(), chunkPos.getRegionZ()); RegionFile regionFile = null; // Check vanilla cache @@ -179,7 +184,7 @@ public class RegionFileStorageExternalCache implements AutoCloseable regionFile = new RegionFile(new RegionStorageInfo("level", null, "level type"), regionFilePath, storageFolderPath, false); #endif - this.regionFileCache.add(new RegionFileCache(ChunkPos.asLong(chunkPos.getRegionX(), chunkPos.getRegionZ()), regionFile)); + this.regionFileCache.add(new RegionFileCache(chunkPosLong, regionFile)); while (this.regionFileCache.size() > MAX_CACHE_SIZE) { this.regionFileCache.poll().file.close(); diff --git a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/worldGeneration/mimicObject/WorldGenStructFeatManager.java b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/worldGeneration/mimicObject/WorldGenStructFeatManager.java index 558b232c9..2d55f3bdf 100644 --- a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/worldGeneration/mimicObject/WorldGenStructFeatManager.java +++ b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/worldGeneration/mimicObject/WorldGenStructFeatManager.java @@ -28,6 +28,8 @@ import java.util.stream.Stream; import com.google.common.collect.ImmutableList; +import com.seibel.distanthorizons.common.wrappers.McObjectConverter; +import com.seibel.distanthorizons.core.pos.DhChunkPos; import it.unimi.dsi.fastutil.longs.LongSet; import net.minecraft.core.BlockPos; import net.minecraft.core.SectionPos; @@ -222,9 +224,10 @@ public class WorldGenStructFeatManager extends #if MC_VER < MC_1_19_2 StructureF } #else @Override - public List startsForStructure(ChunkPos sectionPos, Predicate predicate) + public List startsForStructure(ChunkPos chunkPos, Predicate predicate) { - ChunkAccess chunk = _getChunk(sectionPos.x, sectionPos.z, ChunkStatus.STRUCTURE_REFERENCES); + DhChunkPos dhChunkPos = McObjectConverter.Convert(chunkPos); + ChunkAccess chunk = _getChunk(dhChunkPos.getX(), dhChunkPos.getZ(), ChunkStatus.STRUCTURE_REFERENCES); if (chunk == null) return List.of(); // Copied from StructureFeatureManager::startsForFeature(...) diff --git a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/worldGeneration/params/GlobalWorldGenParams.java b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/worldGeneration/params/GlobalWorldGenParams.java index 2f5b729d0..d3d1fa551 100644 --- a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/worldGeneration/params/GlobalWorldGenParams.java +++ b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/worldGeneration/params/GlobalWorldGenParams.java @@ -113,10 +113,14 @@ public final class GlobalWorldGenParams this.worldOptions = worldData.worldGenOptions(); this.biomes = registry.registryOrThrow(Registries.BIOME); this.worldSeed = worldOptions.seed(); - #else + #elif MC_VER <= MC_1_21_11 this.worldOptions = worldData.worldGenOptions(); this.biomes = this.registry.lookupOrThrow(Registries.BIOME); this.worldSeed = this.worldOptions.seed(); + #else + this.worldOptions = null;//worldData.worldGenOptions(); + this.biomes = this.registry.lookupOrThrow(Registries.BIOME); + this.worldSeed = this.worldOptions.seed(); #endif #if MC_VER >= MC_1_18_2 diff --git a/gradle.properties b/gradle.properties index 393d8b95d..343a6ad13 100644 --- a/gradle.properties +++ b/gradle.properties @@ -46,7 +46,7 @@ versionStr= # This defines what MC version Intellij will use for the preprocessor # and what version is used automatically by build and run commands -mcVer=1.26.1 +mcVer=1.21.11 # Defines the maximum amount of memory Minecraft is allowed when run in a development environment #minecraftMemoryJavaArg="-Xmx4G" From a9388321d9063fb763a7b709b207ac18399a9afb Mon Sep 17 00:00:00 2001 From: James Seibel Date: Fri, 3 Apr 2026 20:46:50 -0500 Subject: [PATCH 15/27] Fix MC 1.21.11 compiling? --- .../distanthorizons/common/wrappers/gui/ClassicConfigGUI.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/gui/ClassicConfigGUI.java b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/gui/ClassicConfigGUI.java index 92da56ae0..889519a1e 100644 --- a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/gui/ClassicConfigGUI.java +++ b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/gui/ClassicConfigGUI.java @@ -761,6 +761,8 @@ public class ClassicConfigGUI #if MC_VER < MC_1_20_1 private void renderTooltip(PoseStack matrices, int mouseX, int mouseY, float delta) + #elif MC_VER <= MC_1_21_11 + private void renderTooltip(GuiGraphics matrices, int mouseX, int mouseY, float delta) #else private void renderTooltip(GuiGraphicsExtractor matrices, int mouseX, int mouseY, float delta) #endif From a3c9b0654a28bc99ad4b84047f02c4b4ef214cda Mon Sep 17 00:00:00 2001 From: James Seibel Date: Fri, 3 Apr 2026 21:15:43 -0500 Subject: [PATCH 16/27] Add MC 26 to the auto build script --- .gitlab-ci.yml | 1 + gradle.properties | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index e977e7371..e2afa4aeb 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -35,6 +35,7 @@ build: parallel: matrix: - MC_VER: [ + "1.26.1", "1.21.11", "1.21.10", "1.21.9", "1.21.8", "1.21.6", "1.21.5", "1.21.4", "1.21.3", "1.21.1", "1.20.6", "1.20.4", "1.20.2", "1.20.1", "1.19.4", "1.19.2", diff --git a/gradle.properties b/gradle.properties index 343a6ad13..393d8b95d 100644 --- a/gradle.properties +++ b/gradle.properties @@ -46,7 +46,7 @@ versionStr= # This defines what MC version Intellij will use for the preprocessor # and what version is used automatically by build and run commands -mcVer=1.21.11 +mcVer=1.26.1 # Defines the maximum amount of memory Minecraft is allowed when run in a development environment #minecraftMemoryJavaArg="-Xmx4G" From 1590abb489cf973a7a787c8f4ba1e79eae0836d9 Mon Sep 17 00:00:00 2001 From: James Seibel Date: Fri, 3 Apr 2026 22:38:23 -0500 Subject: [PATCH 17/27] up CI java version 21 -> 25 will probably break old MC versions, the CI script will probably need some tweaking. --- .gitlab-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index e2afa4aeb..be2d1016a 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,6 +1,6 @@ # use Eclipse's JDK # The ci should always use a unix(-like) OS to work -image: eclipse-temurin:21 +image: eclipse-temurin:25 # all stages need to be defined here stages: From 64fb45d74dd1e52b4d707f9c51d0db040dc357cf Mon Sep 17 00:00:00 2001 From: James Seibel Date: Sun, 5 Apr 2026 17:18:32 -0500 Subject: [PATCH 18/27] Fix access wideners --- .../1_26_1.distanthorizons.accesswidener | 56 +++++++++++++++++++ versionProperties/1.21.11.properties | 2 +- versionProperties/1.26.1.properties | 2 +- 3 files changed, 58 insertions(+), 2 deletions(-) create mode 100644 common/src/main/resources/1_26_1.distanthorizons.accesswidener diff --git a/common/src/main/resources/1_26_1.distanthorizons.accesswidener b/common/src/main/resources/1_26_1.distanthorizons.accesswidener new file mode 100644 index 000000000..ffde71cec --- /dev/null +++ b/common/src/main/resources/1_26_1.distanthorizons.accesswidener @@ -0,0 +1,56 @@ +accessWidener v1 official + +# used when determining where to save files to +accessible field net/minecraft/world/level/storage/SavedDataStorage dataFolder Ljava/nio/file/Path; +# used to help determine what folder a clientLevel is +accessible field net/minecraft/world/level/biome/BiomeManager biomeZoomSeed J + +# used when rendering +accessible method net/minecraft/client/renderer/GameRenderer getFov (Lnet/minecraft/client/Camera;FZ)F +accessible field net/minecraft/client/Minecraft deltaTracker Lnet/minecraft/client/DeltaTracker$Timer; +accessible field net/minecraft/client/renderer/LevelRenderer level Lnet/minecraft/client/multiplayer/ClientLevel; + + +# used for grabbing vanilla rendered chunks +accessible field net/minecraft/client/renderer/LevelRenderer visibleSections Lit/unimi/dsi/fastutil/objects/ObjectArrayList; + +# world generation +accessible field net/minecraft/world/level/chunk/LevelChunk loaded Z +accessible field net/minecraft/world/level/lighting/LightEngine storage Lnet/minecraft/world/level/lighting/LayerLightSectionStorage; +accessible method net/minecraft/world/level/lighting/LayerLightSectionStorage lightOnInSection (J)Z +accessible field net/minecraft/server/level/ServerChunkCache distanceManager Lnet/minecraft/server/level/DistanceManager; +accessible method net/minecraft/server/level/ChunkMap getUpdatingChunkIfPresent (J)Lnet/minecraft/server/level/ChunkHolder; +accessible method net/minecraft/server/level/ChunkMap tick (Ljava/util/function/BooleanSupplier;)V +accessible field net/minecraft/server/level/ServerLevel entityManager Lnet/minecraft/world/level/entity/PersistentEntitySectionManager; +accessible field net/minecraft/server/level/ChunkMap mainThreadExecutor Lnet/minecraft/util/thread/BlockableEventLoop; + +# getting existing chunks outside the main thread +accessible method net/minecraft/server/level/ChunkMap getVisibleChunkIfPresent (J)Lnet/minecraft/server/level/ChunkHolder; + +# lod generation from save file +accessible field net/minecraft/world/level/chunk/storage/SimpleRegionStorage worker Lnet/minecraft/world/level/chunk/storage/IOWorker; +accessible field net/minecraft/world/level/chunk/storage/IOWorker storage Lnet/minecraft/world/level/chunk/storage/RegionFileStorage; +accessible field net/minecraft/world/level/chunk/storage/RegionFileStorage regionCache Lit/unimi/dsi/fastutil/longs/Long2ObjectLinkedOpenHashMap; +accessible field net/minecraft/world/level/chunk/storage/RegionFileStorage folder Ljava/nio/file/Path; + +# grabbing textures +accessible class net/minecraft/client/renderer/texture/SpriteContents$AnimatedTexture +accessible method net/minecraft/client/renderer/texture/SpriteContents$AnimatedTexture getFrameX (I)I +accessible method net/minecraft/client/renderer/texture/SpriteContents$AnimatedTexture getFrameY (I)I +accessible field net/minecraft/client/renderer/texture/SpriteContents animatedTexture Lnet/minecraft/client/renderer/texture/SpriteContents$AnimatedTexture; +accessible field net/minecraft/client/renderer/texture/SpriteContents originalImage Lcom/mojang/blaze3d/platform/NativeImage; + +# UI stuff +accessible field net/minecraft/client/gui/components/AbstractButton SPRITES Lnet/minecraft/client/gui/components/WidgetSprites; +# Handles inserting the config button +accessible field net/minecraft/client/gui/layouts/HeaderAndFooterLayout headerFrame Lnet/minecraft/client/gui/layouts/FrameLayout; +accessible field net/minecraft/client/gui/layouts/FrameLayout children Ljava/util/List; +accessible class net/minecraft/client/gui/layouts/FrameLayout$ChildContainer +accessible field net/minecraft/client/gui/layouts/LinearLayout wrapped Lnet/minecraft/client/gui/layouts/GridLayout; +accessible method net/minecraft/client/gui/components/debug/DebugScreenEntries register (Ljava/lang/String;Lnet/minecraft/client/gui/components/debug/DebugScreenEntry;)Lnet/minecraft/resources/Identifier; + +# hacky stuff +accessible field net/minecraft/util/ThreadingDetector lock Ljava/util/concurrent/Semaphore; +mutable field net/minecraft/util/ThreadingDetector lock Ljava/util/concurrent/Semaphore; + + diff --git a/versionProperties/1.21.11.properties b/versionProperties/1.21.11.properties index b5b4c8908..5e73642ed 100644 --- a/versionProperties/1.21.11.properties +++ b/versionProperties/1.21.11.properties @@ -49,7 +49,7 @@ neoforge_version=38-beta neoforge_version_range=[*,) # NeoForge mod versions - neo_iris_version=1.10.2+1.21.11-neoforge + neo_iris_version=1.10.7+1.21.11-neoforge # (Neo)Forge mod run # 0 = Don't enable and don't run diff --git a/versionProperties/1.26.1.properties b/versionProperties/1.26.1.properties index a5587f8be..675c37ad2 100644 --- a/versionProperties/1.26.1.properties +++ b/versionProperties/1.26.1.properties @@ -3,7 +3,7 @@ java_version=25 minecraft_version=26.1 parchment_version=1.21:2024.07.28 compatible_minecraft_versions=["26.1"] -accessWidenerVersion=1_21_11 +accessWidenerVersion=1_26_1 builds_for=fabric,neoforge # forge is broken due to gradle/build script issues From ff459621e6b3d119393c6738b3b4b6e723a91bcf Mon Sep 17 00:00:00 2001 From: James Seibel Date: Sun, 5 Apr 2026 17:20:18 -0500 Subject: [PATCH 19/27] remove unused getFov() --- .../common/wrappers/minecraft/MinecraftRenderWrapper.java | 3 --- coreSubProjects | 2 +- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/minecraft/MinecraftRenderWrapper.java b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/minecraft/MinecraftRenderWrapper.java index e5388b07d..25c1bf4df 100644 --- a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/minecraft/MinecraftRenderWrapper.java +++ b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/minecraft/MinecraftRenderWrapper.java @@ -298,9 +298,6 @@ public class MinecraftRenderWrapper implements IMinecraftRenderWrapper } } - @Override - public double getFov(float partialTicks) { return MC.gameRenderer.getFov(MC.gameRenderer.getMainCamera(), partialTicks, true); } - /** Measured in chunks */ @Override public int getRenderDistance() diff --git a/coreSubProjects b/coreSubProjects index 1ec342928..71e6b9b58 160000 --- a/coreSubProjects +++ b/coreSubProjects @@ -1 +1 @@ -Subproject commit 1ec342928f69981f394d96edb5ebce5f6ce90117 +Subproject commit 71e6b9b58ef6d1add3f2eab4b2e372d60eda0e7f From d9191534d51fe783e0a5b841ff6e57ab84a9e932 Mon Sep 17 00:00:00 2001 From: James Seibel Date: Sun, 5 Apr 2026 17:21:14 -0500 Subject: [PATCH 20/27] add mod accessors --- .../neoforge/wrappers/modAccessor/IrisAccessor.java | 2 +- versionProperties/1.26.1.properties | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/neoforge/src/main/java/com/seibel/distanthorizons/neoforge/wrappers/modAccessor/IrisAccessor.java b/neoforge/src/main/java/com/seibel/distanthorizons/neoforge/wrappers/modAccessor/IrisAccessor.java index c9d301455..74fb4e33d 100644 --- a/neoforge/src/main/java/com/seibel/distanthorizons/neoforge/wrappers/modAccessor/IrisAccessor.java +++ b/neoforge/src/main/java/com/seibel/distanthorizons/neoforge/wrappers/modAccessor/IrisAccessor.java @@ -43,7 +43,7 @@ public class IrisAccessor implements IIrisAccessor @Override public String getModName() { - #if MC_VER == MC_1_21_9 || MC_VER == MC_1_21_11 + #if MC_VER == MC_1_21_9 return "iris"; // Iris doesn't support this MC version #else return Iris.MODID; diff --git a/versionProperties/1.26.1.properties b/versionProperties/1.26.1.properties index 675c37ad2..1be116c74 100644 --- a/versionProperties/1.26.1.properties +++ b/versionProperties/1.26.1.properties @@ -16,7 +16,7 @@ lwjgl_version=3.3.3 # Fabric loader fabric_loader_version=0.18.5 fabric_api_version=0.144.3+26.1 -modmenu_version=18.0.0-alpha.7 +modmenu_version=18.0.0-alpha.8 starlight_version_fabric= phosphor_version_fabric= lithium_version= @@ -33,7 +33,7 @@ fabric_recommend_list={} # 0 = Don't enable and don't run # 1 = Can be referenced in code but doesn't run # 2 = Can be referenced in code and runs in client -enable_mod_menu=0 +enable_mod_menu=2 enable_starlight=0 enable_phosphor=0 enable_sodium=1 @@ -49,10 +49,10 @@ neoforge_version=1-beta neoforge_version_range=[*,) # NeoForge mod versions -neo_iris_version= +neo_iris_version=1.10.9+26.1-neoforge # (Neo)Forge mod run # 0 = Don't enable and don't run # 1 = Can be referenced in code but doesn't run # 2 = Can be referenced in code and runs in client -neo_enable_iris=0 +neo_enable_iris=1 From b0f5e557443160fa0ca135b52a60a040c662daa7 Mon Sep 17 00:00:00 2001 From: James Seibel Date: Sun, 5 Apr 2026 17:21:31 -0500 Subject: [PATCH 21/27] extend Iris incompat blaze3D message --- .../seibel/distanthorizons/common/AbstractModInitializer.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/src/main/java/com/seibel/distanthorizons/common/AbstractModInitializer.java b/common/src/main/java/com/seibel/distanthorizons/common/AbstractModInitializer.java index 3c7c167b1..3e064e479 100644 --- a/common/src/main/java/com/seibel/distanthorizons/common/AbstractModInitializer.java +++ b/common/src/main/java/com/seibel/distanthorizons/common/AbstractModInitializer.java @@ -378,7 +378,7 @@ public abstract class AbstractModInitializer // Iris only supports nataive OpenGL if (renderApi != EDhApiRenderApi.OPEN_GL) { - String irisUnsupportedMessage = "Iris doesn't support DH when using the ["+EDhApiRenderApi.BLAZE_3D+"] rendering API, please change it to ["+EDhApiRenderApi.OPEN_GL+"] in DH's config file."; + String irisUnsupportedMessage = "Iris doesn't support DH when using the ["+EDhApiRenderApi.BLAZE_3D+"] rendering API, this will need to be fixed on Iris' end. As a temporary fix please change the rendering API to ["+EDhApiRenderApi.OPEN_GL+"] in DH's config file."; LOGGER.fatal(irisUnsupportedMessage); NativeDialogUtil.showDialog(ModInfo.READABLE_NAME, irisUnsupportedMessage, "ok", "error"); From 49d1587a71dc1275ce76b1d00b19d2e918d5444e Mon Sep 17 00:00:00 2001 From: James Seibel Date: Sun, 5 Apr 2026 17:22:12 -0500 Subject: [PATCH 22/27] re-add debug screen --- .../common/wrappers/gui/DhDebugScreenEntry.java | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/gui/DhDebugScreenEntry.java b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/gui/DhDebugScreenEntry.java index 4a06bc23d..6933238b7 100644 --- a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/gui/DhDebugScreenEntry.java +++ b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/gui/DhDebugScreenEntry.java @@ -48,10 +48,18 @@ public class DhDebugScreenEntry implements net.minecraft.client.gui.components.d // The screen entry new DhDebugScreenEntry() ); - #else + #elif MC_VER <= MC_1_21_11 DebugScreenEntries.allEntries().put( // The id, this will be displayed on the options screen Identifier.fromNamespaceAndPath(ModInfo.RESOURCE_NAMESPACE, "distant_horizons"), + + // The screen entry + new DhDebugScreenEntry() + ); + #else + DebugScreenEntries.register( + // The id, this will be displayed on the options screen + ModInfo.RESOURCE_NAMESPACE, // The screen entry new DhDebugScreenEntry() @@ -71,6 +79,8 @@ public class DhDebugScreenEntry implements net.minecraft.client.gui.components.d displayer.addLine(message); } + //region + //// The following will display like so if it is the only entry on the screen: //// First left! First Right! //// @@ -99,6 +109,8 @@ public class DhDebugScreenEntry implements net.minecraft.client.gui.components.d // //displayer.addToGroup(GROUP_TWO, "I am another group!"); //displayer.addToGroup(GROUP_TWO, "This will appear after with no line breaks!"); + + //endregion } @Override @@ -107,5 +119,8 @@ public class DhDebugScreenEntry implements net.minecraft.client.gui.components.d // Always show regardless of accessibility option return true; } + + + } #endif From 9b9e6b917944bd54c111c243e6a5799097ad7e83 Mon Sep 17 00:00:00 2001 From: James Seibel Date: Sun, 5 Apr 2026 17:23:14 -0500 Subject: [PATCH 23/27] fix world gen --- .../minecraft/MinecraftRenderWrapper.java | 21 ++++++++++++++++++- .../BatchGenerationEnvironment.java | 19 ++++++++++------- .../InternalServerGenerator.java | 2 +- .../mimicObject/DhLitWorldGenRegion.java | 12 +++++++++-- .../RegionFileStorageExternalCache.java | 4 ++-- .../params/GlobalWorldGenParams.java | 2 +- 6 files changed, 46 insertions(+), 14 deletions(-) diff --git a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/minecraft/MinecraftRenderWrapper.java b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/minecraft/MinecraftRenderWrapper.java index 25c1bf4df..a1846f3c8 100644 --- a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/minecraft/MinecraftRenderWrapper.java +++ b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/minecraft/MinecraftRenderWrapper.java @@ -40,6 +40,7 @@ import com.seibel.distanthorizons.core.wrapperInterfaces.misc.ILightMapWrapper; import net.minecraft.client.renderer.FogRenderer; import com.mojang.blaze3d.systems.RenderSystem; #else +import net.minecraft.client.renderer.fog.FogData; import net.minecraft.client.renderer.fog.FogRenderer; #endif @@ -255,12 +256,30 @@ public class MinecraftRenderWrapper implements IMinecraftRenderWrapper return Color.white; } + float darkenAmount; + #if MC_VER <= MC_1_21_11 + darkenAmount = MC.gameRenderer.getDarkenWorldAmount(MC.deltaTracker.getGameTimeDeltaPartialTick(true)); + #else + darkenAmount = MC.gameRenderer.getBossOverlayWorldDarkening(MC.deltaTracker.getGameTimeDeltaPartialTick(true)); + #endif + + #if MC_VER <= MC_1_21_11 Vector4f colorValues = mcFogRenderer.setupFog( MC.gameRenderer.getMainCamera(), MC.options.getEffectiveRenderDistance(), MC.deltaTracker, - MC.gameRenderer.getDarkenWorldAmount(MC.deltaTracker.getGameTimeDeltaPartialTick(true)), + darkenAmount, MC.level); + #else + FogData fogData = mcFogRenderer.setupFog( + MC.gameRenderer.getMainCamera(), + MC.options.getEffectiveRenderDistance(), + MC.deltaTracker, + darkenAmount, + MC.level); + Vector4f colorValues = fogData.color; + #endif + return new Color( Math.max(0f, Math.min(colorValues.x, 1f)), // r Math.max(0f, Math.min(colorValues.y, 1f)), // g diff --git a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/worldGeneration/BatchGenerationEnvironment.java b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/worldGeneration/BatchGenerationEnvironment.java index 4c156efba..22e888195 100644 --- a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/worldGeneration/BatchGenerationEnvironment.java +++ b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/worldGeneration/BatchGenerationEnvironment.java @@ -24,6 +24,7 @@ import com.google.common.collect.ImmutableMap; import com.seibel.distanthorizons.api.DhApi; import com.seibel.distanthorizons.api.enums.worldGeneration.EDhApiDistantGeneratorMode; import com.seibel.distanthorizons.api.enums.worldGeneration.EDhApiWorldGenerationStep; +import com.seibel.distanthorizons.common.wrappers.McObjectConverter; import com.seibel.distanthorizons.common.wrappers.world.ServerLevelWrapper; import com.seibel.distanthorizons.common.wrappers.worldGeneration.chunkFileHandling.ChunkFileReader; import com.seibel.distanthorizons.common.wrappers.worldGeneration.mimicObject.*; @@ -353,12 +354,12 @@ public final class BatchGenerationEnvironment implements IBatchGeneratorEnvironm while (existingChunkPosIterator.hasNext()) { ChunkPos chunkPos = existingChunkPosIterator.next(); - DhChunkPos dhChunkPos = new DhChunkPos(chunkPos.x, chunkPos.z); + DhChunkPos dhChunkPos = McObjectConverter.Convert(chunkPos); CompletableFuture getExistingChunkFuture // running async allows file IO to run in parallel when C2ME is present = this.chunkFileReader.createEmptyOrPreExistingChunkWrapperAsync( - chunkPos.x, chunkPos.z, + dhChunkPos.getX(), dhChunkPos.getZ(), chunkSkyLightingByDhPos, chunkBlockLightingByDhPos, chunkWrappersByDhPos); readFutureByDhChunkPos.put(dhChunkPos, getExistingChunkFuture); @@ -385,7 +386,7 @@ public final class BatchGenerationEnvironment implements IBatchGeneratorEnvironm while (emptyChunkPosIterator.hasNext()) { ChunkPos chunkPos = emptyChunkPosIterator.next(); - DhChunkPos dhChunkPos = new DhChunkPos(chunkPos.x, chunkPos.z); + DhChunkPos dhChunkPos = McObjectConverter.Convert(chunkPos); // create empty chunks outside the generation radius if (!readFutureByDhChunkPos.containsKey(dhChunkPos)) @@ -436,7 +437,11 @@ public final class BatchGenerationEnvironment implements IBatchGeneratorEnvironm relZ + refPosZ + zOffsetFinal)); ChunkAccess centerChunk = regionChunks.stream() + #if MC_VER <= MC_1_21_11 .filter((chunk) -> chunk.getPos().x == centerX && chunk.getPos().z == centerZ) + #else + .filter((chunk) -> chunk.getPos().x() == centerX && chunk.getPos().z() == centerZ) + #endif .findFirst() .orElseGet(() -> regionChunks.getFirst()); @@ -534,9 +539,9 @@ public final class BatchGenerationEnvironment implements IBatchGeneratorEnvironm Iterator iterator = ChunkPosGenStream.getIterator(genEvent.minPos.getX(), genEvent.minPos.getZ(), genEvent.widthInChunks, 0); while (iterator.hasNext()) { - ChunkPos pos = iterator.next(); - DhChunkPos dhPos = new DhChunkPos(pos.x, pos.z); - ChunkWrapper wrappedChunk = chunkWrappersByDhPos.get(dhPos); + ChunkPos chunkPos = iterator.next(); + DhChunkPos dhChunkPos = McObjectConverter.Convert(chunkPos); + ChunkWrapper wrappedChunk = chunkWrappersByDhPos.get(dhChunkPos); // only pass along chunks that have been generated up to BIOMES // this is to prevent issues with generating existing @@ -550,7 +555,7 @@ public final class BatchGenerationEnvironment implements IBatchGeneratorEnvironm if (!this.generatedChunkWithoutBiomeWarningLogged) { this.generatedChunkWithoutBiomeWarningLogged = true; - LOGGER.warn("Chunk [" + dhPos + "] wasn't generated up to BIOMES, world gen may appear empty."); + LOGGER.warn("Chunk [" + dhChunkPos + "] wasn't generated up to BIOMES, world gen may appear empty."); } } } diff --git a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/worldGeneration/InternalServerGenerator.java b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/worldGeneration/InternalServerGenerator.java index a15a5fb79..e73074b36 100644 --- a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/worldGeneration/InternalServerGenerator.java +++ b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/worldGeneration/InternalServerGenerator.java @@ -315,7 +315,7 @@ public class InternalServerGenerator { if (InternalServerGenerator.this.updateManager != null) { - InternalServerGenerator.this.updateManager.removePosToIgnore(new DhChunkPos(chunkPos.x, chunkPos.z)); + InternalServerGenerator.this.updateManager.removePosToIgnore(McObjectConverter.Convert(chunkPos)); } } }, MS_TO_IGNORE_CHUNK_AFTER_COMPLETION); diff --git a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/worldGeneration/mimicObject/DhLitWorldGenRegion.java b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/worldGeneration/mimicObject/DhLitWorldGenRegion.java index c58b181f8..8e16814a1 100644 --- a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/worldGeneration/mimicObject/DhLitWorldGenRegion.java +++ b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/worldGeneration/mimicObject/DhLitWorldGenRegion.java @@ -381,7 +381,15 @@ public class DhLitWorldGenRegion extends WorldGenRegion if (chunk == null) { // check memory - chunk = this.chunkMap.get(ChunkPos.asLong(chunkX, chunkZ)); + + long chunkPosAsLong; + #if MC_VER <= MC_1_21_11 + chunkPosAsLong = ChunkPos.asLong(chunkX, chunkZ); + #else + chunkPosAsLong = ChunkPos.pack(chunkX, chunkZ); + #endif + + chunk = this.chunkMap.get(chunkPosAsLong); if (chunk == null) { // chunk isn't in memory, generate a new one @@ -390,7 +398,7 @@ public class DhLitWorldGenRegion extends WorldGenRegion { throw new NullPointerException("The provided generator should not return null!"); } - this.chunkMap.put(ChunkPos.asLong(chunkX, chunkZ), chunk); + this.chunkMap.put(chunkPosAsLong, chunk); } } diff --git a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/worldGeneration/mimicObject/RegionFileStorageExternalCache.java b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/worldGeneration/mimicObject/RegionFileStorageExternalCache.java index ae2fb9b04..28c899038 100644 --- a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/worldGeneration/mimicObject/RegionFileStorageExternalCache.java +++ b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/worldGeneration/mimicObject/RegionFileStorageExternalCache.java @@ -89,7 +89,7 @@ public class RegionFileStorageExternalCache implements AutoCloseable { this.getRegionFileLock.lock(); - #if MC_VER == MC_1_16_5 || MC_VER == MC_1_17_1 + #if MC_VER <= MC_1_17_1 regionFile = this.storage.getRegionFile(chunkPos); // keeping the region cache size low helps prevent concurrency issues @@ -109,7 +109,7 @@ public class RegionFileStorageExternalCache implements AutoCloseable } catch (ArrayIndexOutOfBoundsException e) { - #if MC_VER == MC_1_16_5 || MC_VER == MC_1_17_1 + #if MC_VER <= MC_1_17_1 // the file just wasn't cached break; #else diff --git a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/worldGeneration/params/GlobalWorldGenParams.java b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/worldGeneration/params/GlobalWorldGenParams.java index d3d1fa551..2bb89d8ba 100644 --- a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/worldGeneration/params/GlobalWorldGenParams.java +++ b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/worldGeneration/params/GlobalWorldGenParams.java @@ -118,7 +118,7 @@ public final class GlobalWorldGenParams this.biomes = this.registry.lookupOrThrow(Registries.BIOME); this.worldSeed = this.worldOptions.seed(); #else - this.worldOptions = null;//worldData.worldGenOptions(); + this.worldOptions = server.getWorldGenSettings().options(); this.biomes = this.registry.lookupOrThrow(Registries.BIOME); this.worldSeed = this.worldOptions.seed(); #endif From cfd47adfda5ce322012622464a07132b08ce2be8 Mon Sep 17 00:00:00 2001 From: James Seibel Date: Sun, 5 Apr 2026 17:23:48 -0500 Subject: [PATCH 24/27] update fabric/neo api methods --- .../fabric/FabricClientProxy.java | 20 +++++-- .../fabric/FabricServerProxy.java | 53 ++++++++++++++++--- .../neoforge/NeoforgeClientProxy.java | 5 ++ .../NeoforgeMinecraftRenderWrapper.java | 1 - .../wrappers/NeoforgeTextureUnwrapper.java | 9 ++++ 5 files changed, 75 insertions(+), 13 deletions(-) diff --git a/fabric/src/main/java/com/seibel/distanthorizons/fabric/FabricClientProxy.java b/fabric/src/main/java/com/seibel/distanthorizons/fabric/FabricClientProxy.java index 8ec0cfb54..d22c5eb94 100644 --- a/fabric/src/main/java/com/seibel/distanthorizons/fabric/FabricClientProxy.java +++ b/fabric/src/main/java/com/seibel/distanthorizons/fabric/FabricClientProxy.java @@ -315,7 +315,16 @@ public class FabricClientProxy implements AbstractModInitializer.IEventProxy // networking event // //==================// - #if MC_VER >= MC_1_20_6 + #if MC_VER < MC_1_20_6 + ClientPlayNetworking.registerGlobalReceiver(AbstractPluginPacketSender.WRAPPER_PACKET_RESOURCE, (client, handler, buffer, packetSender) -> + { + AbstractNetworkMessage message = PACKET_SENDER.decodeMessage(buffer); + if (message != null) + { + ClientApi.INSTANCE.pluginMessageReceived(message); + } + }); + #elif MC_VER <= MC_1_21_11 PayloadTypeRegistry.playS2C().register(CommonPacketPayload.TYPE, new CommonPacketPayload.Codec()); ClientPlayNetworking.registerGlobalReceiver(CommonPacketPayload.TYPE, (payload, context) -> { @@ -326,13 +335,14 @@ public class FabricClientProxy implements AbstractModInitializer.IEventProxy ClientApi.INSTANCE.pluginMessageReceived(payload.message()); }); #else - ClientPlayNetworking.registerGlobalReceiver(AbstractPluginPacketSender.WRAPPER_PACKET_RESOURCE, (client, handler, buffer, packetSender) -> + PayloadTypeRegistry.clientboundPlay().register(CommonPacketPayload.TYPE, new CommonPacketPayload.Codec()); + ClientPlayNetworking.registerGlobalReceiver(CommonPacketPayload.TYPE, (payload, context) -> { - AbstractNetworkMessage message = PACKET_SENDER.decodeMessage(buffer); - if (message != null) + if (payload.message() == null) { - ClientApi.INSTANCE.pluginMessageReceived(message); + return; } + ClientApi.INSTANCE.pluginMessageReceived(payload.message()); }); #endif } diff --git a/fabric/src/main/java/com/seibel/distanthorizons/fabric/FabricServerProxy.java b/fabric/src/main/java/com/seibel/distanthorizons/fabric/FabricServerProxy.java index 0888f045c..cf0568fb5 100644 --- a/fabric/src/main/java/com/seibel/distanthorizons/fabric/FabricServerProxy.java +++ b/fabric/src/main/java/com/seibel/distanthorizons/fabric/FabricServerProxy.java @@ -18,11 +18,9 @@ import com.seibel.distanthorizons.core.wrapperInterfaces.world.IClientLevelWrapp import com.seibel.distanthorizons.core.wrapperInterfaces.world.ILevelWrapper; import com.seibel.distanthorizons.fabric.testing.TestChunkInputReplacerEvent; import com.seibel.distanthorizons.fabric.testing.TestWorldGenBindingEvent; -import net.fabricmc.fabric.api.entity.event.v1.ServerEntityWorldChangeEvents; import net.fabricmc.fabric.api.event.lifecycle.v1.ServerChunkEvents; import net.fabricmc.fabric.api.event.lifecycle.v1.ServerLifecycleEvents; import net.fabricmc.fabric.api.event.lifecycle.v1.ServerTickEvents; -import net.fabricmc.fabric.api.event.lifecycle.v1.ServerWorldEvents; import net.fabricmc.fabric.api.networking.v1.ServerPlayConnectionEvents; import net.fabricmc.fabric.api.networking.v1.ServerPlayNetworking; import net.minecraft.client.Minecraft; @@ -39,6 +37,14 @@ import net.fabricmc.fabric.api.networking.v1.PayloadTypeRegistry; import com.seibel.distanthorizons.core.network.messages.AbstractNetworkMessage; #endif +#if MC_VER <= MC_1_21_11 +import net.fabricmc.fabric.api.entity.event.v1.ServerEntityWorldChangeEvents; +import net.fabricmc.fabric.api.event.lifecycle.v1.ServerWorldEvents; +#else +import net.fabricmc.fabric.api.entity.event.v1.ServerEntityLevelChangeEvents; +import net.fabricmc.fabric.api.event.lifecycle.v1.ServerLevelEvents; +#endif + /** * This handles all events sent to the server, * and is the starting point for most of the mod. @@ -101,18 +107,31 @@ public class FabricServerProxy implements AbstractModInitializer.IEventProxy }); // ServerLevelLoadEvent + #if MC_VER <= MC_1_21_11 ServerWorldEvents.LOAD.register((server, level) -> + #else + ServerLevelEvents.LOAD.register((server, level) -> + #endif { ServerApi.INSTANCE.serverLevelLoadEvent(this.getServerLevelWrapper(level)); }); + // ServerLevelUnloadEvent + #if MC_VER <= MC_1_21_11 ServerWorldEvents.UNLOAD.register((server, level) -> + #else + ServerLevelEvents.UNLOAD.register((server, level) -> + #endif { ServerApi.INSTANCE.serverLevelUnloadEvent(this.getServerLevelWrapper(level)); }); // ServerChunkLoadEvent + #if MC_VER <= MC_1_21_11 ServerChunkEvents.CHUNK_LOAD.register((server, chunk) -> + #else + ServerChunkEvents.CHUNK_LOAD.register((server, chunk, generated) -> + #endif { ILevelWrapper level = this.getServerLevelWrapper((ServerLevel) chunk.getLevel()); ServerApi.INSTANCE.serverChunkLoadEvent( @@ -129,7 +148,12 @@ public class FabricServerProxy implements AbstractModInitializer.IEventProxy { ServerApi.INSTANCE.serverPlayerDisconnectEvent(this.getServerPlayerWrapper(handler.player)); }); + + #if MC_VER <= MC_1_21_11 ServerEntityWorldChangeEvents.AFTER_PLAYER_CHANGE_WORLD.register((player, originLevel, destinationLevel) -> + #else + ServerEntityLevelChangeEvents.AFTER_PLAYER_CHANGE_LEVEL.register((player, originLevel, destinationLevel) -> + #endif { ServerApi.INSTANCE.serverPlayerLevelChangeEvent( this.getServerPlayerWrapper(player), @@ -138,7 +162,16 @@ public class FabricServerProxy implements AbstractModInitializer.IEventProxy ); }); - #if MC_VER >= MC_1_20_6 + #if MC_VER < MC_1_20_6 + ServerPlayNetworking.registerGlobalReceiver(AbstractPluginPacketSender.WRAPPER_PACKET_RESOURCE, (server, serverPlayer, handler, buffer, packetSender) -> + { + AbstractNetworkMessage message = PACKET_SENDER.decodeMessage(buffer); + if (message != null) + { + ServerApi.INSTANCE.pluginMessageReceived(ServerPlayerWrapper.getWrapper(serverPlayer), message); + } + }); + #elif MC_VER <= MC_1_21_11 PayloadTypeRegistry.playC2S().register(CommonPacketPayload.TYPE, new CommonPacketPayload.Codec()); if (this.isDedicatedServer) { @@ -154,13 +187,19 @@ public class FabricServerProxy implements AbstractModInitializer.IEventProxy ServerApi.INSTANCE.pluginMessageReceived(ServerPlayerWrapper.getWrapper(context.player()), payload.message()); }); #else - ServerPlayNetworking.registerGlobalReceiver(AbstractPluginPacketSender.WRAPPER_PACKET_RESOURCE, (server, serverPlayer, handler, buffer, packetSender) -> + PayloadTypeRegistry.serverboundPlay().register(CommonPacketPayload.TYPE, new CommonPacketPayload.Codec()); + if (this.isDedicatedServer) { - AbstractNetworkMessage message = PACKET_SENDER.decodeMessage(buffer); - if (message != null) + PayloadTypeRegistry.clientboundPlay().register(CommonPacketPayload.TYPE, new CommonPacketPayload.Codec()); + } + + ServerPlayNetworking.registerGlobalReceiver(CommonPacketPayload.TYPE, (payload, context) -> + { + if (payload.message() == null) { - ServerApi.INSTANCE.pluginMessageReceived(ServerPlayerWrapper.getWrapper(serverPlayer), message); + return; } + ServerApi.INSTANCE.pluginMessageReceived(ServerPlayerWrapper.getWrapper(context.player()), payload.message()); }); #endif } diff --git a/neoforge/src/main/java/com/seibel/distanthorizons/neoforge/NeoforgeClientProxy.java b/neoforge/src/main/java/com/seibel/distanthorizons/neoforge/NeoforgeClientProxy.java index 83de73fee..883705665 100644 --- a/neoforge/src/main/java/com/seibel/distanthorizons/neoforge/NeoforgeClientProxy.java +++ b/neoforge/src/main/java/com/seibel/distanthorizons/neoforge/NeoforgeClientProxy.java @@ -218,8 +218,13 @@ public class NeoforgeClientProxy implements AbstractModInitializer.IEventProxy #else + #if MC_VER <= MC_1_21_11 @SubscribeEvent public void afterLevelEntityRenderEvent(RenderLevelStageEvent.AfterEntities event) + #else + @SubscribeEvent + public void afterLevelEntityRenderEvent(RenderLevelStageEvent.AfterOpaqueFeatures event) + #endif { #if MC_VER < MC_1_21_9 ClientApi.RENDER_STATE.clientLevelWrapper = ClientLevelWrapper.getWrapperIfDifferent(ClientApi.RENDER_STATE.clientLevelWrapper, (ClientLevel)event.getLevel()); diff --git a/neoforge/src/main/java/com/seibel/distanthorizons/neoforge/wrappers/NeoforgeMinecraftRenderWrapper.java b/neoforge/src/main/java/com/seibel/distanthorizons/neoforge/wrappers/NeoforgeMinecraftRenderWrapper.java index d0da316f0..60e91805e 100644 --- a/neoforge/src/main/java/com/seibel/distanthorizons/neoforge/wrappers/NeoforgeMinecraftRenderWrapper.java +++ b/neoforge/src/main/java/com/seibel/distanthorizons/neoforge/wrappers/NeoforgeMinecraftRenderWrapper.java @@ -9,7 +9,6 @@ import com.seibel.distanthorizons.core.logging.DhLogger; #else import com.mojang.blaze3d.opengl.GlTexture; import com.mojang.blaze3d.textures.GpuTexture; -import net.neoforged.neoforge.client.blaze3d.validation.ValidationGpuTexture; #endif import java.lang.invoke.MethodHandles; diff --git a/neoforge/src/main/java/com/seibel/distanthorizons/neoforge/wrappers/NeoforgeTextureUnwrapper.java b/neoforge/src/main/java/com/seibel/distanthorizons/neoforge/wrappers/NeoforgeTextureUnwrapper.java index 6e0a23bd1..9ff3e025c 100644 --- a/neoforge/src/main/java/com/seibel/distanthorizons/neoforge/wrappers/NeoforgeTextureUnwrapper.java +++ b/neoforge/src/main/java/com/seibel/distanthorizons/neoforge/wrappers/NeoforgeTextureUnwrapper.java @@ -7,7 +7,12 @@ public class NeoforgeTextureUnwrapper import com.mojang.blaze3d.opengl.GlTexture; import com.mojang.blaze3d.textures.GpuTexture; + +#if MC_VER <= MC_1_21_11 import net.neoforged.neoforge.client.blaze3d.validation.ValidationGpuTexture; +#else +#endif + public class NeoforgeTextureUnwrapper { @@ -21,6 +26,7 @@ public class NeoforgeTextureUnwrapper { GlTexture glTexture; + #if MC_VER <= MC_1_21_11 if (gpuTexture instanceof ValidationGpuTexture) { ValidationGpuTexture validationTexture = (ValidationGpuTexture) gpuTexture; @@ -30,6 +36,9 @@ public class NeoforgeTextureUnwrapper { glTexture = (GlTexture) gpuTexture; } + #else + glTexture = (GlTexture) gpuTexture; + #endif int id = glTexture.glId(); return id; From c1766fb4396e3f55209d5cfa16eed1568cd4fbfa Mon Sep 17 00:00:00 2001 From: James Seibel Date: Sun, 5 Apr 2026 17:30:09 -0500 Subject: [PATCH 25/27] lightmap update --- .../mixins/client/MixinLightTexture.java | 17 +++++++- .../mixins/client/MixinLightTexture.java | 39 +++++++++++++++++-- 2 files changed, 51 insertions(+), 5 deletions(-) diff --git a/fabric/src/main/java/com/seibel/distanthorizons/fabric/mixins/client/MixinLightTexture.java b/fabric/src/main/java/com/seibel/distanthorizons/fabric/mixins/client/MixinLightTexture.java index 8329d4148..203052ddc 100644 --- a/fabric/src/main/java/com/seibel/distanthorizons/fabric/mixins/client/MixinLightTexture.java +++ b/fabric/src/main/java/com/seibel/distanthorizons/fabric/mixins/client/MixinLightTexture.java @@ -24,7 +24,6 @@ import com.seibel.distanthorizons.core.dependencyInjection.SingletonInjector; import com.seibel.distanthorizons.core.wrapperInterfaces.minecraft.IMinecraftClientWrapper; import com.seibel.distanthorizons.core.wrapperInterfaces.minecraft.IMinecraftRenderWrapper; import com.seibel.distanthorizons.core.wrapperInterfaces.world.IClientLevelWrapper; -import net.minecraft.client.renderer.LightTexture; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; @@ -43,8 +42,19 @@ import com.mojang.blaze3d.opengl.GlTexture; import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.textures.GpuTexture; #endif +#if MC_VER <= MC_1_21_11 +import net.minecraft.client.renderer.LightTexture; +#else +import net.minecraft.client.renderer.state.LightmapRenderState; +import net.minecraft.client.renderer.Lightmap; +#endif + +#if MC_VER <= MC_1_21_11 @Mixin(LightTexture.class) +#else +@Mixin(Lightmap.class) +#endif public class MixinLightTexture { @@ -67,8 +77,13 @@ public class MixinLightTexture + #if MC_VER <= MC_1_21_11 @Inject(method = "updateLightTexture(F)V", at = @At("RETURN")) public void updateLightTexture(float partialTicks, CallbackInfo ci) + #else + @Inject(method = "render(Lnet/minecraft/client/renderer/state/LightmapRenderState;)V", at = @At("RETURN")) + public void render(LightmapRenderState renderState, CallbackInfo ci) + #endif { IMinecraftClientWrapper mc = SingletonInjector.INSTANCE.get(IMinecraftClientWrapper.class); if (mc == null) diff --git a/neoforge/src/main/java/com/seibel/distanthorizons/neoforge/mixins/client/MixinLightTexture.java b/neoforge/src/main/java/com/seibel/distanthorizons/neoforge/mixins/client/MixinLightTexture.java index a7890a1f0..5612b9f76 100644 --- a/neoforge/src/main/java/com/seibel/distanthorizons/neoforge/mixins/client/MixinLightTexture.java +++ b/neoforge/src/main/java/com/seibel/distanthorizons/neoforge/mixins/client/MixinLightTexture.java @@ -25,11 +25,11 @@ import com.seibel.distanthorizons.core.wrapperInterfaces.minecraft.IMinecraftCli import com.seibel.distanthorizons.core.wrapperInterfaces.minecraft.IMinecraftRenderWrapper; import com.seibel.distanthorizons.core.wrapperInterfaces.world.IClientLevelWrapper; import com.seibel.distanthorizons.neoforge.wrappers.NeoforgeTextureUnwrapper; -import net.minecraft.client.renderer.LightTexture; 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 org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @@ -43,12 +43,23 @@ import com.mojang.blaze3d.opengl.GlTexture; import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.textures.GpuTexture; #else -import net.neoforged.neoforge.client.blaze3d.validation.ValidationGpuTexture; import com.mojang.blaze3d.opengl.GlTexture; import com.mojang.blaze3d.textures.GpuTexture; #endif +#if MC_VER <= MC_1_21_11 +import net.minecraft.client.renderer.LightTexture; +#else +import net.minecraft.client.renderer.Lightmap; +import net.minecraft.client.renderer.state.LightmapRenderState; +#endif + + +#if MC_VER <= MC_1_21_11 @Mixin(LightTexture.class) +#else +@Mixin(Lightmap.class) +#endif public class MixinLightTexture { #if MC_VER < MC_1_21_3 @@ -65,8 +76,19 @@ public class MixinLightTexture private GpuTexture texture; #endif + @Unique + private MinecraftRenderWrapper renderWrapper = null; + + + + + #if MC_VER <= MC_1_21_11 @Inject(method = "updateLightTexture(F)V", at = @At("RETURN")) public void updateLightTexture(float partialTicks, CallbackInfo ci) + #else + @Inject(method = "render(Lnet/minecraft/client/renderer/state/LightmapRenderState;)V", at = @At("RETURN")) + public void render(LightmapRenderState renderState, CallbackInfo ci) + #endif { IMinecraftClientWrapper mc = SingletonInjector.INSTANCE.get(IMinecraftClientWrapper.class); if (mc == null || mc.getWrappedClientLevel() == null) @@ -74,9 +96,18 @@ public class MixinLightTexture return; } - IClientLevelWrapper clientLevel = mc.getWrappedClientLevel(); - MinecraftRenderWrapper renderWrapper = (MinecraftRenderWrapper)SingletonInjector.INSTANCE.get(IMinecraftRenderWrapper.class); + if (clientLevel == null) + { + return; + } + + // lazy initialization to make sure we don't call this too early + if (this.renderWrapper == null) + { + this.renderWrapper = (MinecraftRenderWrapper)SingletonInjector.INSTANCE.get(IMinecraftRenderWrapper.class); + } + #if MC_VER < MC_1_21_3 renderWrapper.updateLightmap(this.lightPixels, clientLevel); From 3a34dc8626eca492e3b406458f09f92596ccc199 Mon Sep 17 00:00:00 2001 From: James Seibel Date: Sun, 5 Apr 2026 18:42:02 -0500 Subject: [PATCH 26/27] Create RenderPipelineBuilderWrapper and update test renderer --- .../test/BlazeDhTestTriangleRenderer.java | 64 ++-- .../blaze/util/BlazeDhVertexFormatUtil.java | 33 +- .../RenderPipelineBuilderWrapper.java | 334 ++++++++++++++++++ 3 files changed, 389 insertions(+), 42 deletions(-) create mode 100644 common/src/main/java/com/seibel/distanthorizons/common/render/blaze/wrappers/RenderPipelineBuilderWrapper.java diff --git a/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/test/BlazeDhTestTriangleRenderer.java b/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/test/BlazeDhTestTriangleRenderer.java index 02db7b725..0c22c1132 100644 --- a/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/test/BlazeDhTestTriangleRenderer.java +++ b/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/test/BlazeDhTestTriangleRenderer.java @@ -35,6 +35,8 @@ import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.textures.*; import com.mojang.blaze3d.vertex.VertexFormat; import com.seibel.distanthorizons.common.render.blaze.util.BlazeDhVertexFormatUtil; +import com.seibel.distanthorizons.common.render.blaze.wrappers.RenderPipelineBuilderWrapper; +import com.seibel.distanthorizons.common.render.blaze.wrappers.texture.BlazeTextureViewWrapper; import com.seibel.distanthorizons.core.logging.DhLogger; import com.seibel.distanthorizons.core.logging.DhLoggerBuilder; import com.seibel.distanthorizons.core.render.RenderParams; @@ -47,6 +49,12 @@ import java.nio.ByteOrder; import java.util.OptionalDouble; import java.util.OptionalInt; +#if MC_VER <= MC_1_21_11 +#else +import com.mojang.blaze3d.pipeline.DepthStencilState; +import com.mojang.blaze3d.platform.CompareOp; +#endif + /** * Renders the OpenGL/Vulkan triangle * to the center of the screen to confirm DH's @@ -64,7 +72,8 @@ public class BlazeDhTestTriangleRenderer implements IDhTestTriangleRenderer private RenderPipeline pipeline; private boolean init = false; - private GpuTextureView mcColorTextureView; + public final BlazeTextureViewWrapper mcColorTextureViewWrapper = new BlazeTextureViewWrapper(); + public final BlazeTextureViewWrapper mcDepthTextureViewWrapper = new BlazeTextureViewWrapper(); private GpuBuffer vboGpuBuffer; @@ -85,42 +94,28 @@ public class BlazeDhTestTriangleRenderer implements IDhTestTriangleRenderer } this.init = true; - - - VertexFormat vertexFormat = VertexFormat.builder() - .add("vPosition", BlazeDhVertexFormatUtil.SCREEN_POS) - .add("vColor", BlazeDhVertexFormatUtil.RGBA_FLOAT_COLOR) - .build(); - - //int breakpointOne = 0; - // needs to manually be set if the VertexFormatElement isn't registered - //this.vertexFormat.getOffsetsByElement()[this.posForm.id()] = 0; - //this.vertexFormat.getOffsetsByElement()[this.colForm.id()] = Float.BYTES * 2; - // - //int breakpointTwo = 0; - - - RenderPipeline.Builder pipelineBuilder = RenderPipeline.builder(); + RenderPipelineBuilderWrapper pipelineBuilder = new RenderPipelineBuilderWrapper(); { - pipelineBuilder.withCull(false); - //pipelineBuilder.withDepthWrite(false); - //pipelineBuilder.withDepthTestFunction(DepthTestFunction.NO_DEPTH_TEST); - //pipelineBuilder.withColorWrite(true); - //pipelineBuilder.withoutBlend(); - pipelineBuilder.withPolygonMode(PolygonMode.FILL); - pipelineBuilder.withLocation(Identifier.parse("distanthorizons:test_render")); + pipelineBuilder.withFaceCulling(false); + pipelineBuilder.withDepthWrite(false); + pipelineBuilder.withDepthTest(RenderPipelineBuilderWrapper.EDhDepthTest.NONE); + pipelineBuilder.withColorWrite(true); + pipelineBuilder.withoutBlend(); + pipelineBuilder.withName("triangle_test_render"); - pipelineBuilder.withVertexShader(Identifier.fromNamespaceAndPath("distanthorizons", "test/blaze/vert")); - pipelineBuilder.withFragmentShader(Identifier.fromNamespaceAndPath("distanthorizons", "test/blaze/frag")); + pipelineBuilder.withVertexShader("test/blaze/vert"); + pipelineBuilder.withFragmentShader("test/blaze/frag"); - pipelineBuilder.withVertexFormat(vertexFormat, VertexFormat.Mode.TRIANGLES); + VertexFormat vertexFormat = VertexFormat.builder() + .add("vPosition", BlazeDhVertexFormatUtil.SCREEN_POS) + .add("vColor", BlazeDhVertexFormatUtil.RGBA_FLOAT_COLOR) + .build(); + pipelineBuilder.withVertexFormat(vertexFormat); + + pipelineBuilder.withVertexMode(RenderPipelineBuilderWrapper.EDhVertexMode.TRIANGLES); } this.pipeline = pipelineBuilder.build(); - - this.mcColorTextureView = GPU_DEVICE.createTextureView(Minecraft.getInstance().getMainRenderTarget().getColorTexture()); - - this.uploadVertexData(); } private void uploadVertexData() @@ -169,11 +164,14 @@ public class BlazeDhTestTriangleRenderer implements IDhTestTriangleRenderer { this.tryInit(); + this.mcColorTextureViewWrapper.tryWrap(Minecraft.getInstance().getMainRenderTarget().getColorTexture()); + this.mcDepthTextureViewWrapper.tryWrap(Minecraft.getInstance().getMainRenderTarget().getDepthTexture()); + try (RenderPass renderPass = COMMAND_ENCODER.createRenderPass( this::getRenderPassName, - this.mcColorTextureView, + this.mcColorTextureViewWrapper.textureView, /*optionalClearColorAsInt*/ OptionalInt.empty(), - /*mcDepthTextureView*/ null, + this.mcDepthTextureViewWrapper.textureView, /*optionalDepthValueAsDouble*/ OptionalDouble.empty())) { renderPass.setVertexBuffer(0, this.vboGpuBuffer); diff --git a/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/util/BlazeDhVertexFormatUtil.java b/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/util/BlazeDhVertexFormatUtil.java index f7ef4e83b..8e8aa5302 100644 --- a/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/util/BlazeDhVertexFormatUtil.java +++ b/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/util/BlazeDhVertexFormatUtil.java @@ -57,18 +57,33 @@ public class BlazeDhVertexFormatUtil try { - SCREEN_POS = null;//VertexFormatElement.register(/*id*/22, /*index*/0, VertexFormatElement.Type.FLOAT, VertexFormatElement.Usage.POSITION, /*count*/ 2); - RGBA_FLOAT_COLOR = null;//VertexFormatElement.register(/*id*/23, /*index*/0, VertexFormatElement.Type.FLOAT, VertexFormatElement.Usage.COLOR, /*count*/ 4); + #if MC_VER <= MC_1_21_11 + SCREEN_POS = VertexFormatElement.register(/*id*/22, /*index*/0, VertexFormatElement.Type.FLOAT, VertexFormatElement.Usage.POSITION, /*count*/ 2); + RGBA_FLOAT_COLOR = VertexFormatElement.register(/*id*/23, /*index*/0, VertexFormatElement.Type.FLOAT, VertexFormatElement.Usage.COLOR, /*count*/ 4); - SHORT_XYZ_POS = null;//VertexFormatElement.register(/*id*/24, /*index*/0, VertexFormatElement.Type.USHORT, VertexFormatElement.Usage.POSITION, /*count*/ 3); - BYTE_PAD = null;//VertexFormatElement.register(/*id*/25, /*index*/0, VertexFormatElement.Type.BYTE, VertexFormatElement.Usage.GENERIC, /*count*/ 1); + SHORT_XYZ_POS = VertexFormatElement.register(/*id*/24, /*index*/0, VertexFormatElement.Type.USHORT, VertexFormatElement.Usage.POSITION, /*count*/ 3); + BYTE_PAD = VertexFormatElement.register(/*id*/25, /*index*/0, VertexFormatElement.Type.BYTE, VertexFormatElement.Usage.GENERIC, /*count*/ 1); - META = null;//VertexFormatElement.register(/*id*/26, /*index*/0, VertexFormatElement.Type.USHORT, VertexFormatElement.Usage.GENERIC, /*count*/ 1); - RGBA_UBYTE_COLOR = null;//VertexFormatElement.register(/*id*/27, /*index*/0, VertexFormatElement.Type.UBYTE, VertexFormatElement.Usage.COLOR, /*count*/ 4); - IRIS_MATERIAL = null;//VertexFormatElement.register(/*id*/28, /*index*/0, VertexFormatElement.Type.BYTE, VertexFormatElement.Usage.GENERIC, /*count*/ 1); - IRIS_NORMAL = null;//VertexFormatElement.register(/*id*/29, /*index*/0, VertexFormatElement.Type.BYTE, VertexFormatElement.Usage.GENERIC, /*count*/ 1); + META = VertexFormatElement.register(/*id*/26, /*index*/0, VertexFormatElement.Type.USHORT, VertexFormatElement.Usage.GENERIC, /*count*/ 1); + RGBA_UBYTE_COLOR = VertexFormatElement.register(/*id*/27, /*index*/0, VertexFormatElement.Type.UBYTE, VertexFormatElement.Usage.COLOR, /*count*/ 4); + IRIS_MATERIAL = VertexFormatElement.register(/*id*/28, /*index*/0, VertexFormatElement.Type.BYTE, VertexFormatElement.Usage.GENERIC, /*count*/ 1); + IRIS_NORMAL = VertexFormatElement.register(/*id*/29, /*index*/0, VertexFormatElement.Type.BYTE, VertexFormatElement.Usage.GENERIC, /*count*/ 1); - FLOAT_XYZ_POS = null;//VertexFormatElement.register(/*id*/30, /*index*/0, VertexFormatElement.Type.FLOAT, VertexFormatElement.Usage.POSITION, /*count*/ 3); + FLOAT_XYZ_POS = VertexFormatElement.register(/*id*/30, /*index*/0, VertexFormatElement.Type.FLOAT, VertexFormatElement.Usage.POSITION, /*count*/ 3); + #else + SCREEN_POS = VertexFormatElement.register(/*id*/22, /*index*/0, VertexFormatElement.Type.FLOAT, false, /*count*/ 2); + RGBA_FLOAT_COLOR = VertexFormatElement.register(/*id*/23, /*index*/0, VertexFormatElement.Type.FLOAT, false, /*count*/ 4); + + SHORT_XYZ_POS = VertexFormatElement.register(/*id*/24, /*index*/0, VertexFormatElement.Type.USHORT, false, /*count*/ 3); + BYTE_PAD = VertexFormatElement.register(/*id*/25, /*index*/0, VertexFormatElement.Type.BYTE, false, /*count*/ 1); + + META = VertexFormatElement.register(/*id*/26, /*index*/0, VertexFormatElement.Type.USHORT, false, /*count*/ 1); + RGBA_UBYTE_COLOR = VertexFormatElement.register(/*id*/27, /*index*/0, VertexFormatElement.Type.UBYTE, false, /*count*/ 4); + IRIS_MATERIAL = VertexFormatElement.register(/*id*/28, /*index*/0, VertexFormatElement.Type.BYTE, false, /*count*/ 1); + IRIS_NORMAL = VertexFormatElement.register(/*id*/29, /*index*/0, VertexFormatElement.Type.BYTE, false, /*count*/ 1); + + FLOAT_XYZ_POS = VertexFormatElement.register(/*id*/30, /*index*/0, VertexFormatElement.Type.FLOAT, false, /*count*/ 3); + #endif } catch (Exception e) { diff --git a/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/wrappers/RenderPipelineBuilderWrapper.java b/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/wrappers/RenderPipelineBuilderWrapper.java new file mode 100644 index 000000000..c4ae29d71 --- /dev/null +++ b/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/wrappers/RenderPipelineBuilderWrapper.java @@ -0,0 +1,334 @@ +package com.seibel.distanthorizons.common.render.blaze.wrappers; + +import com.mojang.blaze3d.pipeline.BlendFunction; +import com.mojang.blaze3d.pipeline.ColorTargetState; +import com.mojang.blaze3d.pipeline.DepthStencilState; +import com.mojang.blaze3d.pipeline.RenderPipeline; +import com.mojang.blaze3d.platform.CompareOp; +import com.mojang.blaze3d.platform.PolygonMode; +import com.mojang.blaze3d.vertex.VertexFormat; +import net.minecraft.resources.Identifier; + +import java.io.IOException; +import java.io.InputStream; +import java.util.Optional; + +public class RenderPipelineBuilderWrapper +{ + public static final String NAME_PREFIX = "distanthorizons:"; + + private static final String SHADER_RESOURCE_FOLDER = "assets/distanthorizons/shaders/"; + + private static final ClassLoader CLASS_LOADER = RenderPipelineBuilderWrapper.class.getClassLoader(); + + + private final RenderPipeline.Builder blazePipelineBuilder; + + // variables for specific builder options should be put next to their builder methods for simpler organization + + + + //=============// + // constructor // + //=============// + //region + + public RenderPipelineBuilderWrapper() + { + this.blazePipelineBuilder = RenderPipeline.builder(); + } + + //endregion + + + + //==========// + // building // + //==========// + //region + + private boolean writeDepth = false; + public RenderPipelineBuilderWrapper withDepthWrite(boolean write) + { + this.writeDepth = write; + return this; + } + + private boolean writeColor = false; + public RenderPipelineBuilderWrapper withColorWrite(boolean write) + { + this.writeColor = write; + return this; + } + + private BlendFunction blendFunction = null; + public RenderPipelineBuilderWrapper withBlendFunction(BlendFunction blendFunction) + { + this.blendFunction = blendFunction; + return this; + } + public RenderPipelineBuilderWrapper withoutBlend() + { + this.blendFunction = null; + return this; + } + + private EDhDepthTest depthTest; + public RenderPipelineBuilderWrapper withDepthTest(EDhDepthTest depthTest) + { + this.depthTest = depthTest; + return this; + } + + public RenderPipelineBuilderWrapper withFaceCulling(boolean culling) + { + this.blazePipelineBuilder.withCull(culling); + return this; + } + + public RenderPipelineBuilderWrapper withPolygonMode(EDhPolygonMode dhMode) + { + PolygonMode blazeMode; + switch (dhMode) + { + case FILL: + blazeMode = PolygonMode.FILL; + break; + case WIREFRAME: + blazeMode = PolygonMode.WIREFRAME; + break; + + default: + throw new UnsupportedOperationException("No polygonMode defined for type ["+dhMode+"]."); + } + + this.blazePipelineBuilder.withPolygonMode(blazeMode); + return this; + } + + public RenderPipelineBuilderWrapper withName(String name) throws IllegalArgumentException + { + // Identifiers must be of a specific format + if (!isValidIdentifier(name)) + { + throw new IllegalArgumentException("Non [a-z0-9/._-] character in name: ["+name+"]."); + } + + this.blazePipelineBuilder.withLocation(Identifier.parse(NAME_PREFIX + name)); + return this; + } + + private VertexFormat vertexFormat = null; + public RenderPipelineBuilderWrapper withVertexFormat(VertexFormat vertexFormat) + { + this.vertexFormat = vertexFormat; + return this; + } + + private EDhVertexMode vertexMode = null; + public RenderPipelineBuilderWrapper withVertexMode(EDhVertexMode vertexMode) + { + this.vertexMode = vertexMode; + return this; + } + + public RenderPipelineBuilderWrapper withVertexShader(String scriptResourcePath) { return this.withShader(EDhShaderType.VERTEX, scriptResourcePath); } + public RenderPipelineBuilderWrapper withFragmentShader(String scriptResourcePath) { return this.withShader(EDhShaderType.FRAGMENT, scriptResourcePath); } + private RenderPipelineBuilderWrapper withShader(EDhShaderType shaderType, String scriptResourcePath) + { + String fullShaderResourcePath = SHADER_RESOURCE_FOLDER + scriptResourcePath + shaderType.fileExtension; + + // confirm the shader file exists + try (InputStream scriptListInputStream = CLASS_LOADER.getResourceAsStream(fullShaderResourcePath)) + { + if (scriptListInputStream == null) + { + throw new NullPointerException("Failed to find the SQL Script list file [" + fullShaderResourcePath + "], no auto update scripts can be run."); + } + } + catch (IOException e) + { + // shouldn't happen, but just in case + throw new RuntimeException("Unexpected issue closing resource stream for shader type: ["+shaderType+"] at: ["+fullShaderResourcePath+"], error: ["+e.getMessage()+"].", e); + } + + + + if (shaderType == EDhShaderType.VERTEX) + { + this.blazePipelineBuilder.withVertexShader(Identifier.parse(NAME_PREFIX + scriptResourcePath)); + } + else + { + this.blazePipelineBuilder.withFragmentShader(Identifier.parse(NAME_PREFIX + scriptResourcePath)); + } + + return this; + } + + //endregion + + + + //=====// + // end // + //=====// + //region + + public RenderPipeline build() throws UnsupportedOperationException + { + // depth/color + { + #if MC_VER <= MC_1_21_11 + + this.blazePipelineBuilder.withDepthWrite(this.writeDepth); + this.blazePipelineBuilder.withColorWrite(this.writeColor); + + if (this.blendFunction != null) + { + this.blazePipelineBuilder.withBlend(this.blendFunction); + } + else + { + this.blazePipelineBuilder.withoutBlend(); + } + + switch (this.depthTest) + { + case NONE: + + break; + case LESS: + break; + } + this.blazePipelineBuilder.withDepthTestFunction(DepthTestFunction.NO_DEPTH_TEST); + + #else + + CompareOp compareOp; + switch (this.depthTest) + { + case NONE: + compareOp = CompareOp.ALWAYS_PASS; + break; + case LESS: + compareOp = CompareOp.LESS_THAN; + break; + + default: + throw new UnsupportedOperationException("No depth test defined for type ["+this.depthTest+"]."); + } + this.blazePipelineBuilder.withDepthStencilState(new DepthStencilState(compareOp, this.writeDepth)); + + this.blazePipelineBuilder.withColorTargetState( + new ColorTargetState( + Optional.ofNullable(this.blendFunction), + this.writeColor ? ColorTargetState.WRITE_ALL : ColorTargetState.WRITE_NONE + ) + ); + + #endif + } + + + // vertex format + { + VertexFormat.Mode blazeVertexMode; + switch (this.vertexMode) + { + case TRIANGLES: + blazeVertexMode = VertexFormat.Mode.TRIANGLES; + break; + case LINES: + blazeVertexMode = VertexFormat.Mode.DEBUG_LINES; + break; + + default: + throw new UnsupportedOperationException("No vertex mode defined for type ["+this.vertexMode+"]."); + } + + this.blazePipelineBuilder.withVertexFormat(vertexFormat, blazeVertexMode); + } + + return this.blazePipelineBuilder.build(); + } + + //endregion + + + + //================// + // helper methods // + //================// + //region + + private static boolean isValidIdentifier(String identifier) + { + for (int i = 0; i < identifier.length(); i++) + { + char ch = identifier.charAt(i); + if (!isValidNamespaceChar(ch)) + { + return false; + } + } + + return true; + } + private static boolean isValidNamespaceChar(final char ch) + { + return ch == '_' + || ch == '-' + // only lower case characters + || (ch >= 'a' && ch <= 'z') + || (ch >= '0' && ch <= '9') + || ch == '.'; + } + + //endregion + + + + //================// + // helper classes // + //================// + //region + + public enum EDhPolygonMode + { + FILL, + WIREFRAME; + } + + public enum EDhVertexMode + { + TRIANGLES, + LINES; + } + + public enum EDhDepthTest + { + NONE, + LESS; + } + + private enum EDhShaderType + { + FRAGMENT(".fsh"), + VERTEX(".vsh"); + + + public final String fileExtension; + + EDhShaderType(String fileExtension) + { + this.fileExtension = fileExtension; + } + } + + + //endregion + + + +} From 3f16d6774655dfe46b97c6c7e9c704328f2a2864 Mon Sep 17 00:00:00 2001 From: James Seibel Date: Wed, 8 Apr 2026 07:39:36 -0500 Subject: [PATCH 27/27] fix blaze3d rendering --- .../blaze/BlazeDebugWireframeRenderer.java | 34 ++++---- .../blaze/BlazeDhGenericObjectRenderer.java | 45 +++++----- .../render/blaze/BlazeDhTerrainRenderer.java | 63 ++++++++------ .../blaze/apply/BlazeDhApplyRenderer.java | 73 ++++++++-------- .../blaze/apply/BlazeDhCopyRenderer.java | 46 +++++----- .../BlazeGenericObjectVertexContainer.java | 5 ++ .../BlazeDhFarFadeRenderer.java | 41 +++++---- .../postProcessing/BlazeDhFogRenderer.java | 38 ++++---- .../postProcessing/BlazeDhSsaoRenderer.java | 37 ++++---- .../BlazeVanillaFadeRenderer.java | 34 +++++--- .../test/BlazeDhTestTriangleRenderer.java | 2 +- .../blaze/util/BlazeDhVertexFormatUtil.java | 2 +- .../render/blaze/util/BlazeUniformUtil.java | 10 ++- .../RenderPipelineBuilderWrapper.java | 21 ++++- .../buffer/BlazeVertexBufferWrapper.java | 22 +++++ .../client/MixinChunkSectionsToRender.java | 50 +++++++++++ .../mixins/client/MixinLevelRenderer.java | 86 +++++++++++++++++-- .../mixins/client/MixinLevelRenderer.java | 72 ++++++++++++++++ 18 files changed, 479 insertions(+), 202 deletions(-) diff --git a/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/BlazeDebugWireframeRenderer.java b/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/BlazeDebugWireframeRenderer.java index e76d489e9..70334a045 100644 --- a/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/BlazeDebugWireframeRenderer.java +++ b/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/BlazeDebugWireframeRenderer.java @@ -38,6 +38,7 @@ import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.VertexFormat; import com.seibel.distanthorizons.common.render.blaze.util.BlazeUniformUtil; import com.seibel.distanthorizons.common.render.blaze.util.BlazeDhVertexFormatUtil; +import com.seibel.distanthorizons.common.render.blaze.wrappers.RenderPipelineBuilderWrapper; import com.seibel.distanthorizons.core.dependencyInjection.SingletonInjector; import com.seibel.distanthorizons.core.logging.DhLogger; import com.seibel.distanthorizons.core.logging.DhLoggerBuilder; @@ -138,26 +139,27 @@ public class BlazeDebugWireframeRenderer extends AbstractDebugWireframeRenderer } private void createPipelines() { - VertexFormat vertexFormat = VertexFormat.builder() - //.add("vPosition", BlazeDhVertexFormatUtil.FLOAT_XYZ_POS) - .build(); - - RenderPipeline.Builder pipelineBuilder = RenderPipeline.builder(); + RenderPipelineBuilderWrapper pipelineBuilder = new RenderPipelineBuilderWrapper(); { - pipelineBuilder.withCull(false); - //pipelineBuilder.withDepthWrite(true); - //pipelineBuilder.withDepthTestFunction(DepthTestFunction.LESS_DEPTH_TEST); - //pipelineBuilder.withColorWrite(true); - //pipelineBuilder.withoutBlend(); - pipelineBuilder.withPolygonMode(PolygonMode.WIREFRAME); - pipelineBuilder.withLocation(Identifier.parse("distanthorizons:debug_wireframe_renderer")); + pipelineBuilder.withFaceCulling(false); + pipelineBuilder.withDepthWrite(true); + pipelineBuilder.withDepthTest(RenderPipelineBuilderWrapper.EDhDepthTest.LESS); + pipelineBuilder.withColorWrite(true); + pipelineBuilder.withoutBlend(); + pipelineBuilder.withPolygonMode(RenderPipelineBuilderWrapper.EDhPolygonMode.WIREFRAME); + pipelineBuilder.withName("debug_wireframe_renderer"); - pipelineBuilder.withVertexShader(Identifier.fromNamespaceAndPath("distanthorizons", "debug/blaze/vert")); - pipelineBuilder.withFragmentShader(Identifier.fromNamespaceAndPath("distanthorizons", "debug/blaze/frag")); + pipelineBuilder.withVertexShader("debug/blaze/vert"); + pipelineBuilder.withFragmentShader("debug/blaze/frag"); - pipelineBuilder.withUniform("uniformBlock", UniformType.UNIFORM_BUFFER); + pipelineBuilder.withUniformBuffer("uniformBlock"); - pipelineBuilder.withVertexFormat(vertexFormat, VertexFormat.Mode.DEBUG_LINES); + + VertexFormat vertexFormat = VertexFormat.builder() + .add("vPosition", BlazeDhVertexFormatUtil.FLOAT_XYZ_POS) + .build(); + pipelineBuilder.withVertexFormat(vertexFormat); + pipelineBuilder.withVertexMode(RenderPipelineBuilderWrapper.EDhVertexMode.LINES); } this.pipeline = pipelineBuilder.build(); diff --git a/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/BlazeDhGenericObjectRenderer.java b/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/BlazeDhGenericObjectRenderer.java index abb61caac..238176f2e 100644 --- a/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/BlazeDhGenericObjectRenderer.java +++ b/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/BlazeDhGenericObjectRenderer.java @@ -48,6 +48,7 @@ import com.seibel.distanthorizons.api.objects.render.DhApiRenderableBox; import com.seibel.distanthorizons.api.objects.render.DhApiRenderableBoxGroupShading; import com.seibel.distanthorizons.common.render.blaze.objects.BlazeGenericObjectVertexContainer; import com.seibel.distanthorizons.common.render.blaze.util.BlazeDhVertexFormatUtil; +import com.seibel.distanthorizons.common.render.blaze.wrappers.RenderPipelineBuilderWrapper; import com.seibel.distanthorizons.common.render.blaze.wrappers.texture.BlazeTextureViewWrapper; import com.seibel.distanthorizons.common.render.blaze.util.BlazeUniformUtil; import com.seibel.distanthorizons.common.wrappers.misc.LightMapWrapper; @@ -107,8 +108,6 @@ public class BlazeDhGenericObjectRenderer implements IDhGenericRenderer // rendering setup private boolean init = false; - private VertexFormat vertexFormat; - private RenderPipeline pipeline; private GpuBuffer vertUniformBuffer; @@ -130,12 +129,6 @@ public class BlazeDhGenericObjectRenderer implements IDhGenericRenderer } this.init = true; - this.vertexFormat = VertexFormat.builder() - //.add("vPosition", BlazeDhVertexFormatUtil.FLOAT_XYZ_POS) - //.add("aColor", BlazeDhVertexFormatUtil.RGBA_UBYTE_COLOR) - //.add("aMaterial", BlazeDhVertexFormatUtil.IRIS_MATERIAL) - .build(); - this.createPipelines(); if (RENDER_DEBUG_OBJECTS) @@ -145,26 +138,36 @@ public class BlazeDhGenericObjectRenderer implements IDhGenericRenderer } private void createPipelines() { - RenderPipeline.Builder pipelineBuilder = RenderPipeline.builder(); + RenderPipelineBuilderWrapper pipelineBuilder = new RenderPipelineBuilderWrapper(); { - pipelineBuilder.withCull(true); - //pipelineBuilder.withDepthWrite(true); - //pipelineBuilder.withDepthTestFunction(DepthTestFunction.LESS_DEPTH_TEST); - //pipelineBuilder.withBlend(BlendFunction.TRANSLUCENT); - //pipelineBuilder.withColorWrite(true); - pipelineBuilder.withPolygonMode(PolygonMode.FILL); - pipelineBuilder.withLocation(Identifier.parse("distanthorizons:generic")); + pipelineBuilder.withFaceCulling(true); + pipelineBuilder.withDepthWrite(true); + pipelineBuilder.withDepthTest(RenderPipelineBuilderWrapper.EDhDepthTest.LESS); + pipelineBuilder.withBlend(BlendFunction.TRANSLUCENT); // TRANSLUCENT = new BlendFunction(SourceFactor.SRC_ALPHA, DestFactor.ONE_MINUS_SRC_ALPHA, SourceFactor.ONE, DestFactor.ONE_MINUS_SRC_ALPHA); + pipelineBuilder.withColorWrite(true); + pipelineBuilder.withPolygonMode(RenderPipelineBuilderWrapper.EDhPolygonMode.FILL); + pipelineBuilder.withName("generic_objects"); - pipelineBuilder.withVertexShader(Identifier.fromNamespaceAndPath("distanthorizons", "generic/blaze/vert")); - pipelineBuilder.withFragmentShader(Identifier.fromNamespaceAndPath("distanthorizons", "generic/blaze/frag")); + pipelineBuilder.withVertexShader("generic/blaze/vert"); + pipelineBuilder.withFragmentShader("generic/blaze/frag"); pipelineBuilder.withSampler("uLightMap"); - pipelineBuilder.withUniform("vertUniformBlock", UniformType.UNIFORM_BUFFER); + pipelineBuilder.withUniformBuffer("vertUniformBlock"); - pipelineBuilder.withVertexFormat(this.vertexFormat, VertexFormat.Mode.TRIANGLES); - this.pipeline = pipelineBuilder.build(); + VertexFormat vertexFormat = VertexFormat.builder() + .add("vPosition", BlazeDhVertexFormatUtil.FLOAT_XYZ_POS) + .add("aColor", BlazeDhVertexFormatUtil.RGBA_UBYTE_COLOR) + .add("aMaterial", BlazeDhVertexFormatUtil.IRIS_MATERIAL) + + .add("paddingOne", BlazeDhVertexFormatUtil.BYTE_PAD) + .add("paddingTwo", BlazeDhVertexFormatUtil.BYTE_PAD) + .add("paddingThree", BlazeDhVertexFormatUtil.BYTE_PAD) + .build(); + pipelineBuilder.withVertexFormat(vertexFormat); + pipelineBuilder.withVertexMode(RenderPipelineBuilderWrapper.EDhVertexMode.TRIANGLES); } + this.pipeline = pipelineBuilder.build(); } private void addGenericDebugObjects() { diff --git a/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/BlazeDhTerrainRenderer.java b/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/BlazeDhTerrainRenderer.java index 72a3ea985..ba081ac71 100644 --- a/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/BlazeDhTerrainRenderer.java +++ b/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/BlazeDhTerrainRenderer.java @@ -21,6 +21,7 @@ import com.mojang.blaze3d.vertex.VertexFormat; import com.seibel.distanthorizons.api.methods.events.abstractEvents.DhApiBeforeBufferRenderEvent; import com.seibel.distanthorizons.common.render.blaze.util.BlazeDhVertexFormatUtil; import com.seibel.distanthorizons.common.render.blaze.util.BlazeUniformUtil; +import com.seibel.distanthorizons.common.render.blaze.wrappers.RenderPipelineBuilderWrapper; import com.seibel.distanthorizons.common.render.blaze.wrappers.texture.BlazeTextureViewWrapper; import com.seibel.distanthorizons.common.render.blaze.wrappers.uniform.BlazeLodUniformBufferWrapper; import com.seibel.distanthorizons.common.render.blaze.wrappers.buffer.BlazeVertexBufferWrapper; @@ -41,6 +42,7 @@ import com.seibel.distanthorizons.core.wrapperInterfaces.render.renderPass.IDhTe import com.seibel.distanthorizons.core.wrapperInterfaces.render.objects.IVertexBufferWrapper; import com.seibel.distanthorizons.coreapi.DependencyInjection.ApiEventInjector; import net.minecraft.resources.Identifier; +import org.lwjgl.system.MemoryUtil; import java.nio.ByteBuffer; import java.nio.ByteOrder; @@ -83,46 +85,48 @@ public class BlazeDhTerrainRenderer implements IDhTerrainRenderer - VertexFormat vertexFormat = VertexFormat.builder() - //.add("vPosition", BlazeDhVertexFormatUtil.SHORT_XYZ_POS) - //.add("meta", BlazeDhVertexFormatUtil.META) - //.add("vColor", BlazeDhVertexFormatUtil.RGBA_UBYTE_COLOR) - //.add("irisMaterial", BlazeDhVertexFormatUtil.IRIS_MATERIAL) - //.add("irisNormal", BlazeDhVertexFormatUtil.IRIS_NORMAL) - //.add("paddingTwo", BlazeDhVertexFormatUtil.BYTE_PAD) - //.add("paddingThree", BlazeDhVertexFormatUtil.BYTE_PAD) // padding is to make sure the format is a multiple of 4 - .build(); - - RenderPipeline.Builder pipelineBuilder = RenderPipeline.builder(); + RenderPipelineBuilderWrapper pipelineBuilder = new RenderPipelineBuilderWrapper(); { - pipelineBuilder.withCull(true); - //pipelineBuilder.withDepthWrite(true); - //pipelineBuilder.withDepthTestFunction(DepthTestFunction.LESS_DEPTH_TEST); - //pipelineBuilder.withColorWrite(true); - pipelineBuilder.withPolygonMode(PolygonMode.FILL); - pipelineBuilder.withLocation(Identifier.parse("distanthorizons:lod_render")); - - pipelineBuilder.withVertexShader(Identifier.fromNamespaceAndPath("distanthorizons", "lod/blaze/vert")); - pipelineBuilder.withFragmentShader(Identifier.fromNamespaceAndPath("distanthorizons", "lod/blaze/frag")); + pipelineBuilder.withFaceCulling(true); + pipelineBuilder.withDepthWrite(true); + pipelineBuilder.withDepthTest(RenderPipelineBuilderWrapper.EDhDepthTest.LESS); + pipelineBuilder.withColorWrite(true); + pipelineBuilder.withPolygonMode(RenderPipelineBuilderWrapper.EDhPolygonMode.FILL); + pipelineBuilder.withName("terrain"); pipelineBuilder.withSampler("uLightMap"); - pipelineBuilder.withUniform("vertUniqueUniformBlock", UniformType.UNIFORM_BUFFER); - pipelineBuilder.withUniform("vertSharedUniformBlock", UniformType.UNIFORM_BUFFER); - pipelineBuilder.withUniform("fragUniformBlock", UniformType.UNIFORM_BUFFER); + pipelineBuilder.withVertexShader("lod/blaze/vert"); + pipelineBuilder.withFragmentShader("lod/blaze/frag"); - pipelineBuilder.withVertexFormat(vertexFormat, VertexFormat.Mode.TRIANGLES); + pipelineBuilder.withUniformBuffer("vertUniqueUniformBlock"); + pipelineBuilder.withUniformBuffer("vertSharedUniformBlock"); + pipelineBuilder.withUniformBuffer("fragUniformBlock"); + + VertexFormat vertexFormat = VertexFormat.builder() + .add("vPosition", BlazeDhVertexFormatUtil.SHORT_XYZ_POS) + .add("meta", BlazeDhVertexFormatUtil.META) + .add("vColor", BlazeDhVertexFormatUtil.RGBA_UBYTE_COLOR) + .add("irisMaterial", BlazeDhVertexFormatUtil.IRIS_MATERIAL) + .add("irisNormal", BlazeDhVertexFormatUtil.IRIS_NORMAL) + .add("paddingTwo", BlazeDhVertexFormatUtil.BYTE_PAD) + .add("paddingThree", BlazeDhVertexFormatUtil.BYTE_PAD) // padding is to make sure the format is a multiple of 4 + .build(); + pipelineBuilder.withVertexFormat(vertexFormat); + + pipelineBuilder.withVertexMode(RenderPipelineBuilderWrapper.EDhVertexMode.TRIANGLES); } // opaque { - //pipelineBuilder.withoutBlend(); + pipelineBuilder.withoutBlend(); this.opaquePipeline = pipelineBuilder.build(); } // transparent { - //pipelineBuilder.withBlend(BlendFunction.TRANSLUCENT); + // TRANSLUCENT = new BlendFunction(SourceFactor.SRC_ALPHA, DestFactor.ONE_MINUS_SRC_ALPHA, SourceFactor.ONE, DestFactor.ONE_MINUS_SRC_ALPHA); + pipelineBuilder.withBlend(BlendFunction.TRANSLUCENT); this.transparentPipeline = pipelineBuilder.build(); } @@ -189,7 +193,7 @@ public class BlazeDhTerrainRenderer implements IDhTerrainRenderer .putMat4f() // uCombinedMatrix .get(); - ByteBuffer buffer = ByteBuffer.allocateDirect(uniformBufferSize); + ByteBuffer buffer = MemoryUtil.memAlloc(uniformBufferSize); buffer.order(ByteOrder.nativeOrder()); Std140Builder.intoBuffer(buffer) .putInt(0) // uIsWhiteWorld @@ -209,6 +213,8 @@ public class BlazeDhTerrainRenderer implements IDhTerrainRenderer GpuBufferSlice bufferSlice = new GpuBufferSlice(this.vertSharedUniformBuffer, 0, uniformBufferSize); COMMAND_ENCODER.writeToBuffer(bufferSlice, buffer); + + MemoryUtil.memFree(buffer); } profiler.popPush("set frag uniforms"); @@ -235,7 +241,7 @@ public class BlazeDhTerrainRenderer implements IDhTerrainRenderer // upload data // - ByteBuffer buffer = ByteBuffer.allocateDirect(uniformBufferSize); + ByteBuffer buffer = MemoryUtil.memAlloc(uniformBufferSize); buffer.order(ByteOrder.nativeOrder()); buffer = Std140Builder.intoBuffer(buffer) .putFloat(dhNearClipDistance) // uClipDistance @@ -251,6 +257,7 @@ public class BlazeDhTerrainRenderer implements IDhTerrainRenderer GpuBufferSlice bufferSlice = new GpuBufferSlice(this.fragUniformBuffer, 0, uniformBufferSize); COMMAND_ENCODER.writeToBuffer(bufferSlice, buffer); + MemoryUtil.memFree(buffer); } diff --git a/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/apply/BlazeDhApplyRenderer.java b/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/apply/BlazeDhApplyRenderer.java index a26aea2cc..239cb2ac7 100644 --- a/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/apply/BlazeDhApplyRenderer.java +++ b/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/apply/BlazeDhApplyRenderer.java @@ -27,8 +27,6 @@ public class BlazeDhApplyRenderer {} import com.mojang.blaze3d.buffers.GpuBuffer; import com.mojang.blaze3d.pipeline.BlendFunction; import com.mojang.blaze3d.pipeline.RenderPipeline; -import com.mojang.blaze3d.platform.PolygonMode; -import com.mojang.blaze3d.shaders.UniformType; import com.mojang.blaze3d.systems.CommandEncoder; import com.mojang.blaze3d.systems.GpuDevice; import com.mojang.blaze3d.systems.RenderPass; @@ -36,12 +34,13 @@ import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.textures.*; import com.mojang.blaze3d.vertex.VertexFormat; import com.seibel.distanthorizons.common.render.blaze.util.BlazeDhVertexFormatUtil; +import com.seibel.distanthorizons.common.render.blaze.wrappers.RenderPipelineBuilderWrapper; import com.seibel.distanthorizons.common.render.blaze.wrappers.texture.BlazeTextureViewWrapper; import com.seibel.distanthorizons.common.render.blaze.util.BlazePostProcessUtil; +import com.seibel.distanthorizons.common.render.blaze.wrappers.texture.BlazeTextureWrapper; import com.seibel.distanthorizons.core.logging.DhLogger; import com.seibel.distanthorizons.core.logging.DhLoggerBuilder; import com.seibel.distanthorizons.coreapi.ModInfo; -import net.minecraft.resources.Identifier; import org.jetbrains.annotations.Nullable; import java.util.Arrays; @@ -80,6 +79,10 @@ public class BlazeDhApplyRenderer private final BlazeTextureViewWrapper sourceDepthTextureViewWrapper = new BlazeTextureViewWrapper(); private final BlazeTextureViewWrapper destinationColorTextureViewWrapper = new BlazeTextureViewWrapper(); + /** We don't want to actually write any depth data, but blaze3D complains if we don't bind a depth texture. */ + private final BlazeTextureWrapper dummyDepthTextureWrapper = BlazeTextureWrapper.createDepth("apply_dummy_depth"); + + /** * Can be set for special application shaders that need @@ -133,8 +136,12 @@ public class BlazeDhApplyRenderer GpuTexture sourceDepthTexture, GpuTexture destinationColorTexture) { - this.createPipeline(); - this.vboGpuBuffer = BlazePostProcessUtil.createAndUploadScreenVertexData(this.name); + // one-time setup + if (this.pipeline == null) + { + this.createPipeline(); + this.vboGpuBuffer = BlazePostProcessUtil.createAndUploadScreenVertexData(this.name); + } this.sourceColorTextureViewWrapper.tryWrap(sourceColorTexture); this.sourceDepthTextureViewWrapper.tryWrap(sourceDepthTexture); @@ -144,48 +151,42 @@ public class BlazeDhApplyRenderer } private void createPipeline() { - if (this.pipeline != null) + RenderPipelineBuilderWrapper pipelineBuilder = new RenderPipelineBuilderWrapper(); { - return; - } - - VertexFormat vertexFormat = VertexFormat.builder() - //.add("vPosition", BlazeDhVertexFormatUtil.SCREEN_POS) - .build(); - - RenderPipeline.Builder pipelineBuilder = RenderPipeline.builder(); - { - pipelineBuilder.withCull(false); - //pipelineBuilder.withDepthWrite(false); - //pipelineBuilder.withDepthTestFunction(DepthTestFunction.NO_DEPTH_TEST); - //pipelineBuilder.withColorWrite(true); + pipelineBuilder.withFaceCulling(false); + pipelineBuilder.withDepthWrite(false); + pipelineBuilder.withDepthTest(RenderPipelineBuilderWrapper.EDhDepthTest.NONE); + pipelineBuilder.withColorWrite(true); - //if (this.blendFunction != null) - //{ - // pipelineBuilder.withBlend(this.blendFunction); - //} - //else - //{ - // pipelineBuilder.withoutBlend(); - //} + if (this.blendFunction != null) + { + pipelineBuilder.withBlend(this.blendFunction); + } + else + { + pipelineBuilder.withoutBlend(); + } - pipelineBuilder.withPolygonMode(PolygonMode.FILL); - pipelineBuilder.withLocation(Identifier.parse(this.identifierName)); // TODO will complain if capital letters are included + pipelineBuilder.withPolygonMode(RenderPipelineBuilderWrapper.EDhPolygonMode.FILL); + pipelineBuilder.withName(this.name); - // TODO manually validate paths to confirm they exist and end with ".fsh" or ".vsh", MC silently fails if the files are missing/improperly named - pipelineBuilder.withVertexShader(Identifier.fromNamespaceAndPath("distanthorizons", this.vertexShaderPath)); - pipelineBuilder.withFragmentShader(Identifier.fromNamespaceAndPath("distanthorizons", this.fragmentShaderPath)); + pipelineBuilder.withVertexShader(this.vertexShaderPath); + pipelineBuilder.withFragmentShader(this.fragmentShaderPath); for (int i = 0; i < this.uniformNames.length; i++) { String uniformName = this.uniformNames[i]; - pipelineBuilder.withUniform(uniformName, UniformType.UNIFORM_BUFFER); + pipelineBuilder.withUniformBuffer(uniformName); } pipelineBuilder.withSampler("uSourceColorTexture"); pipelineBuilder.withSampler("uSourceDepthTexture"); - pipelineBuilder.withVertexFormat(vertexFormat, VertexFormat.Mode.TRIANGLE_FAN); + VertexFormat vertexFormat = VertexFormat.builder() + .add("vPosition", BlazeDhVertexFormatUtil.SCREEN_POS) + .build(); + pipelineBuilder.withVertexFormat(vertexFormat); + pipelineBuilder.withVertexMode(RenderPipelineBuilderWrapper.EDhVertexMode.TRIANGLE_FAN); } this.pipeline = pipelineBuilder.build(); } @@ -222,11 +223,13 @@ public class BlazeDhApplyRenderer { this.tryInit(sourceColorTexture, sourceDepthTexture, destinationColorTexture); + this.dummyDepthTextureWrapper.tryCreateOrResize(); + try (RenderPass renderPass = COMMAND_ENCODER.createRenderPass( this::getIdentifierName, this.destinationColorTextureViewWrapper.textureView, /*optionalClearColorAsInt*/ OptionalInt.empty(), - /*depthTexture*/ null, + this.dummyDepthTextureWrapper.textureView, /*optionalDepthValueAsDouble*/ OptionalDouble.empty())) { renderPass.bindTexture("uSourceColorTexture", this.sourceColorTextureViewWrapper.textureView, this.sourceColorTextureViewWrapper.textureSampler); diff --git a/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/apply/BlazeDhCopyRenderer.java b/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/apply/BlazeDhCopyRenderer.java index f6df0734b..5f9469902 100644 --- a/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/apply/BlazeDhCopyRenderer.java +++ b/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/apply/BlazeDhCopyRenderer.java @@ -26,19 +26,17 @@ public class BlazeDhCopyRenderer {} import com.mojang.blaze3d.buffers.GpuBuffer; import com.mojang.blaze3d.pipeline.RenderPipeline; -import com.mojang.blaze3d.platform.PolygonMode; import com.mojang.blaze3d.systems.CommandEncoder; import com.mojang.blaze3d.systems.GpuDevice; import com.mojang.blaze3d.systems.RenderPass; import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.textures.*; -import com.mojang.blaze3d.vertex.VertexFormat; +import com.seibel.distanthorizons.common.render.blaze.wrappers.RenderPipelineBuilderWrapper; import com.seibel.distanthorizons.common.render.blaze.wrappers.texture.BlazeTextureViewWrapper; import com.seibel.distanthorizons.common.render.blaze.wrappers.texture.BlazeTextureWrapper; import com.seibel.distanthorizons.common.render.blaze.util.BlazePostProcessUtil; import com.seibel.distanthorizons.core.logging.DhLogger; import com.seibel.distanthorizons.core.logging.DhLoggerBuilder; -import net.minecraft.resources.Identifier; import java.util.OptionalDouble; import java.util.OptionalInt; @@ -62,6 +60,8 @@ public class BlazeDhCopyRenderer private GpuBuffer vboGpuBuffer; + private BlazeTextureWrapper dummyDepthTextureWrapper; + //=============// @@ -80,23 +80,25 @@ public class BlazeDhCopyRenderer this.init = true; + this.dummyDepthTextureWrapper = BlazeTextureWrapper.createDepth("dh_copy_depth_texture"); - RenderPipeline.Builder pipelineBuilder = RenderPipeline.builder(); + RenderPipelineBuilderWrapper pipelineBuilder = new RenderPipelineBuilderWrapper(); { - pipelineBuilder.withCull(false); - //pipelineBuilder.withDepthWrite(false); - //pipelineBuilder.withDepthTestFunction(DepthTestFunction.NO_DEPTH_TEST); - //pipelineBuilder.withColorWrite(true); - //pipelineBuilder.withoutBlend(); - pipelineBuilder.withPolygonMode(PolygonMode.FILL); - pipelineBuilder.withLocation(Identifier.parse("distanthorizons:copy_render")); + pipelineBuilder.withFaceCulling(false); + pipelineBuilder.withDepthWrite(false); + pipelineBuilder.withDepthTest(RenderPipelineBuilderWrapper.EDhDepthTest.NONE); + pipelineBuilder.withColorWrite(true); + pipelineBuilder.withoutBlend(); + pipelineBuilder.withPolygonMode(RenderPipelineBuilderWrapper.EDhPolygonMode.FILL); + pipelineBuilder.withName("copy"); - pipelineBuilder.withVertexShader(Identifier.fromNamespaceAndPath("distanthorizons", "copy/blaze/vert")); - pipelineBuilder.withFragmentShader(Identifier.fromNamespaceAndPath("distanthorizons", "copy/blaze/frag")); + pipelineBuilder.withVertexShader("copy/blaze/vert"); + pipelineBuilder.withFragmentShader("copy/blaze/frag"); pipelineBuilder.withSampler("uCopyTexture"); - pipelineBuilder.withVertexFormat(BlazePostProcessUtil.createVertexFormat(), VertexFormat.Mode.TRIANGLE_FAN); + pipelineBuilder.withVertexFormat(BlazePostProcessUtil.createVertexFormat()); + pipelineBuilder.withVertexMode(RenderPipelineBuilderWrapper.EDhVertexMode.TRIANGLE_FAN); } this.pipeline = pipelineBuilder.build(); @@ -118,17 +120,17 @@ public class BlazeDhCopyRenderer BlazeTextureWrapper sourceColorTextureWrapper, BlazeTextureViewWrapper destinationColorTextureWrapper) { - //this.render( - // sourceColorTextureWrapper.textureView, sourceColorTextureWrapper.textureSampler, - // destinationColorTextureWrapper.textureView); + this.render( + sourceColorTextureWrapper.textureView, sourceColorTextureWrapper.textureSampler, + destinationColorTextureWrapper.textureView); } public void render( BlazeTextureWrapper sourceColorTextureWrapper, BlazeTextureWrapper destinationColorTextureWrapper) { - //this.render( - // sourceColorTextureWrapper.textureView, sourceColorTextureWrapper.textureSampler, - // destinationColorTextureWrapper.textureView); + this.render( + sourceColorTextureWrapper.textureView, sourceColorTextureWrapper.textureSampler, + destinationColorTextureWrapper.textureView); } private void render( @@ -138,11 +140,13 @@ public class BlazeDhCopyRenderer { this.tryInit(); + this.dummyDepthTextureWrapper.tryCreateOrResize(); + try (RenderPass renderPass = COMMAND_ENCODER.createRenderPass( this::getRenderPassName, destinationTextureView, /*optionalClearColorAsInt*/ OptionalInt.empty(), - /*depthTexture*/ null, + this.dummyDepthTextureWrapper.textureView, /*optionalDepthValueAsDouble*/ OptionalDouble.empty())) { renderPass.bindTexture("uCopyTexture", sourceTextureView, sourceTextureSampler); diff --git a/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/objects/BlazeGenericObjectVertexContainer.java b/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/objects/BlazeGenericObjectVertexContainer.java index 58954ced6..c90414f6e 100644 --- a/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/objects/BlazeGenericObjectVertexContainer.java +++ b/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/objects/BlazeGenericObjectVertexContainer.java @@ -179,6 +179,11 @@ public class BlazeGenericObjectVertexContainer implements IDhGenericObjectVertex this.vertexBuffer.put(a); this.vertexBuffer.put(box.material); + + // padding so the vertex format's byte count is a multiple of 4 + this.vertexBuffer.put((byte)0); + this.vertexBuffer.put((byte)0); + this.vertexBuffer.put((byte)0); } } this.vertexBuffer.flip(); diff --git a/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/postProcessing/BlazeDhFarFadeRenderer.java b/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/postProcessing/BlazeDhFarFadeRenderer.java index 6faa8a1fe..5839e9800 100644 --- a/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/postProcessing/BlazeDhFarFadeRenderer.java +++ b/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/postProcessing/BlazeDhFarFadeRenderer.java @@ -29,17 +29,15 @@ import com.mojang.blaze3d.buffers.GpuBufferSlice; import com.mojang.blaze3d.buffers.Std140Builder; import com.mojang.blaze3d.buffers.Std140SizeCalculator; import com.mojang.blaze3d.pipeline.RenderPipeline; -import com.mojang.blaze3d.platform.PolygonMode; -import com.mojang.blaze3d.shaders.UniformType; import com.mojang.blaze3d.systems.CommandEncoder; import com.mojang.blaze3d.systems.GpuDevice; import com.mojang.blaze3d.systems.RenderPass; import com.mojang.blaze3d.systems.RenderSystem; -import com.mojang.blaze3d.vertex.VertexFormat; import com.seibel.distanthorizons.common.render.blaze.BlazeDhMetaRenderer; import com.seibel.distanthorizons.common.render.blaze.apply.BlazeDhCopyRenderer; import com.seibel.distanthorizons.common.render.blaze.util.BlazePostProcessUtil; import com.seibel.distanthorizons.common.render.blaze.util.BlazeUniformUtil; +import com.seibel.distanthorizons.common.render.blaze.wrappers.RenderPipelineBuilderWrapper; import com.seibel.distanthorizons.common.render.blaze.wrappers.texture.BlazeTextureViewWrapper; import com.seibel.distanthorizons.common.render.blaze.wrappers.texture.BlazeTextureWrapper; import com.seibel.distanthorizons.core.logging.DhLogger; @@ -49,7 +47,6 @@ import com.seibel.distanthorizons.core.util.RenderUtil; import com.seibel.distanthorizons.core.util.math.Mat4f; import com.seibel.distanthorizons.core.wrapperInterfaces.render.renderPass.IDhFarFadeRenderer; import net.minecraft.client.Minecraft; -import net.minecraft.resources.Identifier; import java.nio.ByteBuffer; import java.nio.ByteOrder; @@ -75,8 +72,11 @@ public class BlazeDhFarFadeRenderer implements IDhFarFadeRenderer private GpuBuffer vboGpuBuffer; - public final BlazeTextureWrapper dhFadeColorTextureWrapper = BlazeTextureWrapper.createColor("DhFadeColorTexture"); - public final BlazeTextureViewWrapper mcColorTextureViewWrapper = new BlazeTextureViewWrapper(); + private final BlazeTextureWrapper dhFadeColorTextureWrapper = BlazeTextureWrapper.createColor("dh_far_fade_color_texture"); + /** We don't want to actually write any depth data, but blaze3D complains if we don't bind a depth texture. */ + private final BlazeTextureWrapper dhFadeDepthTextureWrapper = BlazeTextureWrapper.createDepth("dh_far_fade_depth_texture"); + + private final BlazeTextureViewWrapper mcColorTextureViewWrapper = new BlazeTextureViewWrapper(); @@ -97,27 +97,28 @@ public class BlazeDhFarFadeRenderer implements IDhFarFadeRenderer - RenderPipeline.Builder pipelineBuilder = RenderPipeline.builder(); + RenderPipelineBuilderWrapper pipelineBuilder = new RenderPipelineBuilderWrapper(); { - pipelineBuilder.withCull(false); - //pipelineBuilder.withDepthWrite(false); - //pipelineBuilder.withDepthTestFunction(DepthTestFunction.NO_DEPTH_TEST); - //pipelineBuilder.withColorWrite(true); - //pipelineBuilder.withoutBlend(); - pipelineBuilder.withPolygonMode(PolygonMode.FILL); - pipelineBuilder.withLocation(Identifier.parse("distanthorizons:far_fade")); + pipelineBuilder.withFaceCulling(false); + pipelineBuilder.withDepthWrite(false); + pipelineBuilder.withDepthTest(RenderPipelineBuilderWrapper.EDhDepthTest.NONE); + pipelineBuilder.withColorWrite(true); + pipelineBuilder.withoutBlend(); + pipelineBuilder.withPolygonMode(RenderPipelineBuilderWrapper.EDhPolygonMode.FILL); + pipelineBuilder.withName("far_fade"); - pipelineBuilder.withVertexShader(Identifier.fromNamespaceAndPath("distanthorizons", "fade/blaze/vert")); - pipelineBuilder.withFragmentShader(Identifier.fromNamespaceAndPath("distanthorizons", "fade/blaze/dh_fade")); + pipelineBuilder.withVertexShader("fade/blaze/vert"); + pipelineBuilder.withFragmentShader("fade/blaze/dh_fade"); pipelineBuilder.withSampler("uMcColorTexture"); pipelineBuilder.withSampler("uDhDepthTexture"); pipelineBuilder.withSampler("uDhColorTexture"); - pipelineBuilder.withUniform("fragUniformBlock", UniformType.UNIFORM_BUFFER); + pipelineBuilder.withUniformBuffer("fragUniformBlock"); - pipelineBuilder.withVertexFormat(BlazePostProcessUtil.createVertexFormat(), VertexFormat.Mode.TRIANGLE_FAN); + pipelineBuilder.withVertexFormat(BlazePostProcessUtil.createVertexFormat()); + pipelineBuilder.withVertexMode(RenderPipelineBuilderWrapper.EDhVertexMode.TRIANGLE_FAN); } this.pipeline = pipelineBuilder.build(); @@ -152,6 +153,8 @@ public class BlazeDhFarFadeRenderer implements IDhFarFadeRenderer this.dhFadeColorTextureWrapper.tryCreateOrResize(); this.mcColorTextureViewWrapper.tryWrap(Minecraft.getInstance().getMainRenderTarget().getColorTexture()); + this.dhFadeDepthTextureWrapper.tryCreateOrResize(); + { int uniformBufferSize = new Std140SizeCalculator() .putFloat() // uStartFadeBlockDistance @@ -205,7 +208,7 @@ public class BlazeDhFarFadeRenderer implements IDhFarFadeRenderer this::getRenderPassName, this.dhFadeColorTextureWrapper.textureView, /*optionalClearColorAsInt*/ OptionalInt.empty(), - /*depthTexture*/ null, + this.dhFadeDepthTextureWrapper.textureView, /*optionalDepthValueAsDouble*/ OptionalDouble.empty())) { // MC texture diff --git a/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/postProcessing/BlazeDhFogRenderer.java b/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/postProcessing/BlazeDhFogRenderer.java index 1157a2801..a91025ae2 100644 --- a/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/postProcessing/BlazeDhFogRenderer.java +++ b/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/postProcessing/BlazeDhFogRenderer.java @@ -31,19 +31,17 @@ import com.mojang.blaze3d.buffers.Std140SizeCalculator; import com.mojang.blaze3d.pipeline.BlendFunction; import com.mojang.blaze3d.pipeline.RenderPipeline; import com.mojang.blaze3d.platform.DestFactor; -import com.mojang.blaze3d.platform.PolygonMode; import com.mojang.blaze3d.platform.SourceFactor; -import com.mojang.blaze3d.shaders.UniformType; import com.mojang.blaze3d.systems.CommandEncoder; import com.mojang.blaze3d.systems.GpuDevice; import com.mojang.blaze3d.systems.RenderPass; import com.mojang.blaze3d.systems.RenderSystem; -import com.mojang.blaze3d.vertex.VertexFormat; import com.seibel.distanthorizons.api.enums.rendering.EDhApiFogColorMode; import com.seibel.distanthorizons.api.enums.rendering.EDhApiHeightFogDirection; import com.seibel.distanthorizons.api.enums.rendering.EDhApiHeightFogMixMode; import com.seibel.distanthorizons.common.render.blaze.BlazeDhMetaRenderer; import com.seibel.distanthorizons.common.render.blaze.apply.BlazeDhApplyRenderer; +import com.seibel.distanthorizons.common.render.blaze.wrappers.RenderPipelineBuilderWrapper; import com.seibel.distanthorizons.common.render.blaze.wrappers.texture.BlazeTextureWrapper; import com.seibel.distanthorizons.common.render.blaze.util.BlazePostProcessUtil; import com.seibel.distanthorizons.common.render.blaze.util.BlazeUniformUtil; @@ -57,7 +55,6 @@ import com.seibel.distanthorizons.core.util.math.Mat4f; import com.seibel.distanthorizons.core.wrapperInterfaces.minecraft.IMinecraftClientWrapper; import com.seibel.distanthorizons.core.wrapperInterfaces.minecraft.IMinecraftRenderWrapper; import com.seibel.distanthorizons.core.wrapperInterfaces.render.renderPass.IDhFogRenderer; -import net.minecraft.resources.Identifier; import java.awt.*; import java.nio.ByteBuffer; @@ -90,7 +87,9 @@ public class BlazeDhFogRenderer implements IDhFogRenderer private GpuBuffer vboGpuBuffer; - public BlazeTextureWrapper fogColorTextureWrapper = BlazeTextureWrapper.createColor("DhFogColorTexture"); + private final BlazeTextureWrapper fogColorTextureWrapper = BlazeTextureWrapper.createColor("dh_fog_color_texture"); + /** We don't want to actually write any depth data, but blaze3D complains if we don't bind a depth texture. */ + private final BlazeTextureWrapper fogDepthTextureWrapper = BlazeTextureWrapper.createDepth("dh_fog_depth_texture"); @@ -118,24 +117,25 @@ public class BlazeDhFogRenderer implements IDhFogRenderer "apply/blaze/vert", "apply/blaze/frag" ); - RenderPipeline.Builder pipelineBuilder = RenderPipeline.builder(); + RenderPipelineBuilderWrapper pipelineBuilder = new RenderPipelineBuilderWrapper(); { - pipelineBuilder.withCull(false); - //pipelineBuilder.withDepthWrite(false); - //pipelineBuilder.withDepthTestFunction(DepthTestFunction.NO_DEPTH_TEST); - //pipelineBuilder.withColorWrite(true); - //pipelineBuilder.withoutBlend(); - pipelineBuilder.withPolygonMode(PolygonMode.FILL); - pipelineBuilder.withLocation(Identifier.parse("distanthorizons:fog_render")); + pipelineBuilder.withFaceCulling(false); + pipelineBuilder.withDepthWrite(false); + pipelineBuilder.withDepthTest(RenderPipelineBuilderWrapper.EDhDepthTest.NONE); + pipelineBuilder.withColorWrite(true); + pipelineBuilder.withoutBlend(); + pipelineBuilder.withPolygonMode(RenderPipelineBuilderWrapper.EDhPolygonMode.FILL); + pipelineBuilder.withName("fog_render"); - pipelineBuilder.withVertexShader(Identifier.fromNamespaceAndPath("distanthorizons", "fog/blaze/vert")); - pipelineBuilder.withFragmentShader(Identifier.fromNamespaceAndPath("distanthorizons", "fog/blaze/frag")); + pipelineBuilder.withVertexShader("fog/blaze/vert"); + pipelineBuilder.withFragmentShader("fog/blaze/frag"); pipelineBuilder.withSampler("uDhDepthTexture"); - pipelineBuilder.withUniform("fragUniformBlock", UniformType.UNIFORM_BUFFER); + pipelineBuilder.withUniformBuffer("fragUniformBlock"); - pipelineBuilder.withVertexFormat(BlazePostProcessUtil.createVertexFormat(), VertexFormat.Mode.TRIANGLE_FAN); + pipelineBuilder.withVertexFormat(BlazePostProcessUtil.createVertexFormat()); + pipelineBuilder.withVertexMode(RenderPipelineBuilderWrapper.EDhVertexMode.TRIANGLE_FAN); } this.pipeline = pipelineBuilder.build(); @@ -167,7 +167,7 @@ public class BlazeDhFogRenderer implements IDhFogRenderer this.fogColorTextureWrapper.tryCreateOrResize(); - + this.fogDepthTextureWrapper.tryCreateOrResize(); { int uniformBufferSize = new Std140SizeCalculator() @@ -338,7 +338,7 @@ public class BlazeDhFogRenderer implements IDhFogRenderer this::getRenderPassName, this.fogColorTextureWrapper.textureView, /*optionalClearColorAsInt*/ OptionalInt.empty(), - /*depthTexture*/ null, + this.fogDepthTextureWrapper.textureView, /*optionalDepthValueAsDouble*/ OptionalDouble.empty())) { renderPass.bindTexture("uDhDepthTexture", BlazeDhMetaRenderer.INSTANCE.dhDepthTextureWrapper.textureView, BlazeDhMetaRenderer.INSTANCE.dhDepthTextureWrapper.textureSampler); diff --git a/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/postProcessing/BlazeDhSsaoRenderer.java b/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/postProcessing/BlazeDhSsaoRenderer.java index 5ad2286e0..b7b80ee0d 100644 --- a/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/postProcessing/BlazeDhSsaoRenderer.java +++ b/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/postProcessing/BlazeDhSsaoRenderer.java @@ -31,16 +31,14 @@ import com.mojang.blaze3d.buffers.Std140SizeCalculator; import com.mojang.blaze3d.pipeline.BlendFunction; import com.mojang.blaze3d.pipeline.RenderPipeline; import com.mojang.blaze3d.platform.DestFactor; -import com.mojang.blaze3d.platform.PolygonMode; import com.mojang.blaze3d.platform.SourceFactor; -import com.mojang.blaze3d.shaders.UniformType; import com.mojang.blaze3d.systems.CommandEncoder; import com.mojang.blaze3d.systems.GpuDevice; import com.mojang.blaze3d.systems.RenderPass; import com.mojang.blaze3d.systems.RenderSystem; -import com.mojang.blaze3d.vertex.VertexFormat; import com.seibel.distanthorizons.common.render.blaze.BlazeDhMetaRenderer; import com.seibel.distanthorizons.common.render.blaze.apply.BlazeDhApplyRenderer; +import com.seibel.distanthorizons.common.render.blaze.wrappers.RenderPipelineBuilderWrapper; import com.seibel.distanthorizons.common.render.blaze.wrappers.texture.BlazeTextureWrapper; import com.seibel.distanthorizons.common.render.blaze.util.BlazePostProcessUtil; import com.seibel.distanthorizons.common.render.blaze.util.BlazeUniformUtil; @@ -52,7 +50,6 @@ import com.seibel.distanthorizons.core.util.RenderUtil; import com.seibel.distanthorizons.core.util.math.Mat4f; import com.seibel.distanthorizons.core.wrapperInterfaces.minecraft.IMinecraftRenderWrapper; import com.seibel.distanthorizons.core.wrapperInterfaces.render.renderPass.IDhSsaoRenderer; -import net.minecraft.resources.Identifier; import java.nio.ByteBuffer; import java.nio.ByteOrder; @@ -82,7 +79,9 @@ public class BlazeDhSsaoRenderer implements IDhSsaoRenderer private GpuBuffer vboGpuBuffer; - public BlazeTextureWrapper ssaoColorTextureWrapper = BlazeTextureWrapper.createColor("DhSsaoTexture"); + private final BlazeTextureWrapper ssaoColorTextureWrapper = BlazeTextureWrapper.createColor("dh_ssao_color_texture"); + /** We don't want to actually write any depth data, but blaze3D complains if we don't bind a depth texture. */ + private final BlazeTextureWrapper ssaoDepthTextureWrapper = BlazeTextureWrapper.createDepth("dh_ssao_depth_texture"); @@ -109,24 +108,25 @@ public class BlazeDhSsaoRenderer implements IDhSsaoRenderer /*uniforms*/ new String[] { "applyFragUniformBlock" } ); - RenderPipeline.Builder pipelineBuilder = RenderPipeline.builder(); + RenderPipelineBuilderWrapper pipelineBuilder = new RenderPipelineBuilderWrapper(); { - pipelineBuilder.withCull(false); - //pipelineBuilder.withDepthWrite(false); - //pipelineBuilder.withDepthTestFunction(DepthTestFunction.NO_DEPTH_TEST); - //pipelineBuilder.withColorWrite(true); - //pipelineBuilder.withoutBlend(); - pipelineBuilder.withPolygonMode(PolygonMode.FILL); - pipelineBuilder.withLocation(Identifier.parse("distanthorizons:ssao_render")); + pipelineBuilder.withFaceCulling(false); + pipelineBuilder.withDepthWrite(false); + pipelineBuilder.withDepthTest(RenderPipelineBuilderWrapper.EDhDepthTest.NONE); + pipelineBuilder.withColorWrite(true); + pipelineBuilder.withoutBlend(); + pipelineBuilder.withPolygonMode(RenderPipelineBuilderWrapper.EDhPolygonMode.FILL); + pipelineBuilder.withName("ssao_render"); - pipelineBuilder.withVertexShader(Identifier.fromNamespaceAndPath("distanthorizons", "ssao/blaze/vert")); - pipelineBuilder.withFragmentShader(Identifier.fromNamespaceAndPath("distanthorizons", "ssao/blaze/frag")); + pipelineBuilder.withVertexShader("ssao/blaze/vert"); + pipelineBuilder.withFragmentShader("ssao/blaze/frag"); pipelineBuilder.withSampler("uDhDepthTexture"); - pipelineBuilder.withUniform("fragUniformBlock", UniformType.UNIFORM_BUFFER); + pipelineBuilder.withUniformBuffer("fragUniformBlock"); - pipelineBuilder.withVertexFormat(BlazePostProcessUtil.createVertexFormat(), VertexFormat.Mode.TRIANGLE_FAN); + pipelineBuilder.withVertexFormat(BlazePostProcessUtil.createVertexFormat()); + pipelineBuilder.withVertexMode(RenderPipelineBuilderWrapper.EDhVertexMode.TRIANGLE_FAN); } this.pipeline = pipelineBuilder.build(); @@ -159,6 +159,7 @@ public class BlazeDhSsaoRenderer implements IDhSsaoRenderer // textures this.ssaoColorTextureWrapper.tryCreateOrResize(); + this.ssaoDepthTextureWrapper.tryCreateOrResize(); // frag uniforms { @@ -258,7 +259,7 @@ public class BlazeDhSsaoRenderer implements IDhSsaoRenderer this::getRenderPassName, this.ssaoColorTextureWrapper.textureView, /*optionalClearColorAsInt*/ OptionalInt.empty(), - /*depthTexture*/ null, + this.ssaoDepthTextureWrapper.textureView, /*optionalDepthValueAsDouble*/ OptionalDouble.empty())) { renderPass.bindTexture("uDhDepthTexture", BlazeDhMetaRenderer.INSTANCE.dhDepthTextureWrapper.textureView, BlazeDhMetaRenderer.INSTANCE.dhDepthTextureWrapper.textureSampler); diff --git a/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/postProcessing/BlazeVanillaFadeRenderer.java b/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/postProcessing/BlazeVanillaFadeRenderer.java index e5dfd13d3..73b3d4aa7 100644 --- a/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/postProcessing/BlazeVanillaFadeRenderer.java +++ b/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/postProcessing/BlazeVanillaFadeRenderer.java @@ -40,6 +40,7 @@ import com.seibel.distanthorizons.common.render.blaze.BlazeDhMetaRenderer; import com.seibel.distanthorizons.common.render.blaze.apply.BlazeDhCopyRenderer; import com.seibel.distanthorizons.common.render.blaze.util.BlazePostProcessUtil; import com.seibel.distanthorizons.common.render.blaze.util.BlazeUniformUtil; +import com.seibel.distanthorizons.common.render.blaze.wrappers.RenderPipelineBuilderWrapper; import com.seibel.distanthorizons.common.render.blaze.wrappers.texture.BlazeTextureViewWrapper; import com.seibel.distanthorizons.common.render.blaze.wrappers.texture.BlazeTextureWrapper; import com.seibel.distanthorizons.core.config.Config; @@ -81,7 +82,10 @@ public class BlazeVanillaFadeRenderer implements IDhVanillaFadeRenderer private GpuBuffer vboGpuBuffer; - public final BlazeTextureWrapper fadeColorTextureWrapper = BlazeTextureWrapper.createColor("DhVanillaFadeTexture"); + public final BlazeTextureWrapper fadeColorTextureWrapper = BlazeTextureWrapper.createColor("DhVanillaFadeColorTexture"); + /** We don't want to actually write any depth data, but blaze3D complains if we don't bind a depth texture. */ + private final BlazeTextureWrapper fadeDepthTextureWrapper = BlazeTextureWrapper.createDepth("DhVanillaFadeDepthTexture"); + public final BlazeTextureViewWrapper mcDepthTextureWrapper = new BlazeTextureViewWrapper(); public final BlazeTextureViewWrapper mcColorTextureWrapper = new BlazeTextureViewWrapper(); @@ -105,18 +109,18 @@ public class BlazeVanillaFadeRenderer implements IDhVanillaFadeRenderer - RenderPipeline.Builder pipelineBuilder = RenderPipeline.builder(); + RenderPipelineBuilderWrapper pipelineBuilder = new RenderPipelineBuilderWrapper(); { - pipelineBuilder.withCull(false); - //pipelineBuilder.withDepthWrite(false); - //pipelineBuilder.withDepthTestFunction(DepthTestFunction.NO_DEPTH_TEST); - //pipelineBuilder.withColorWrite(true); - //pipelineBuilder.withoutBlend(); - pipelineBuilder.withPolygonMode(PolygonMode.FILL); - pipelineBuilder.withLocation(Identifier.parse("distanthorizons:mc_vanilla_fade_render")); + pipelineBuilder.withFaceCulling(false); + pipelineBuilder.withDepthWrite(false); + pipelineBuilder.withDepthTest(RenderPipelineBuilderWrapper.EDhDepthTest.NONE); + pipelineBuilder.withColorWrite(true); + pipelineBuilder.withoutBlend(); + pipelineBuilder.withPolygonMode(RenderPipelineBuilderWrapper.EDhPolygonMode.FILL); + pipelineBuilder.withName("vanilla_fade"); - pipelineBuilder.withVertexShader(Identifier.fromNamespaceAndPath("distanthorizons", "fade/blaze/vert")); - pipelineBuilder.withFragmentShader(Identifier.fromNamespaceAndPath("distanthorizons", "fade/blaze/vanilla_fade")); + pipelineBuilder.withVertexShader("fade/blaze/vert"); + pipelineBuilder.withFragmentShader("fade/blaze/vanilla_fade"); pipelineBuilder.withSampler("uMcDepthTexture"); pipelineBuilder.withSampler("uCombinedMcDhColorTexture"); @@ -124,9 +128,10 @@ public class BlazeVanillaFadeRenderer implements IDhVanillaFadeRenderer pipelineBuilder.withSampler("uDhDepthTexture"); pipelineBuilder.withSampler("uDhColorTexture"); - pipelineBuilder.withUniform("fragUniformBlock", UniformType.UNIFORM_BUFFER); + pipelineBuilder.withUniformBuffer("fragUniformBlock"); - pipelineBuilder.withVertexFormat(BlazePostProcessUtil.createVertexFormat(), VertexFormat.Mode.TRIANGLE_FAN); + pipelineBuilder.withVertexFormat(BlazePostProcessUtil.createVertexFormat()); + pipelineBuilder.withVertexMode(RenderPipelineBuilderWrapper.EDhVertexMode.TRIANGLE_FAN); } this.pipeline = pipelineBuilder.build(); @@ -157,6 +162,7 @@ public class BlazeVanillaFadeRenderer implements IDhVanillaFadeRenderer // textures this.fadeColorTextureWrapper.tryCreateOrResize(); + this.fadeDepthTextureWrapper.tryCreateOrResize(); this.mcDepthTextureWrapper.tryWrap(Minecraft.getInstance().getMainRenderTarget().getDepthTexture()); this.mcColorTextureWrapper.tryWrap(Minecraft.getInstance().getMainRenderTarget().getColorTexture()); @@ -234,7 +240,7 @@ public class BlazeVanillaFadeRenderer implements IDhVanillaFadeRenderer this::getRenderPassName, this.fadeColorTextureWrapper.textureView, /*optionalClearColorAsInt*/ OptionalInt.empty(), - /*depthTexture*/ null, + this.fadeDepthTextureWrapper.textureView, /*optionalDepthValueAsDouble*/ OptionalDouble.empty())) { renderPass.bindTexture("uMcDepthTexture", this.mcDepthTextureWrapper.textureView, this.mcDepthTextureWrapper.textureSampler); diff --git a/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/test/BlazeDhTestTriangleRenderer.java b/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/test/BlazeDhTestTriangleRenderer.java index 0c22c1132..4d86c4def 100644 --- a/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/test/BlazeDhTestTriangleRenderer.java +++ b/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/test/BlazeDhTestTriangleRenderer.java @@ -101,7 +101,7 @@ public class BlazeDhTestTriangleRenderer implements IDhTestTriangleRenderer pipelineBuilder.withDepthTest(RenderPipelineBuilderWrapper.EDhDepthTest.NONE); pipelineBuilder.withColorWrite(true); pipelineBuilder.withoutBlend(); - pipelineBuilder.withName("triangle_test_render"); + pipelineBuilder.withName("triangle_test"); pipelineBuilder.withVertexShader("test/blaze/vert"); pipelineBuilder.withFragmentShader("test/blaze/frag"); diff --git a/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/util/BlazeDhVertexFormatUtil.java b/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/util/BlazeDhVertexFormatUtil.java index 8e8aa5302..d36a5305d 100644 --- a/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/util/BlazeDhVertexFormatUtil.java +++ b/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/util/BlazeDhVertexFormatUtil.java @@ -78,7 +78,7 @@ public class BlazeDhVertexFormatUtil BYTE_PAD = VertexFormatElement.register(/*id*/25, /*index*/0, VertexFormatElement.Type.BYTE, false, /*count*/ 1); META = VertexFormatElement.register(/*id*/26, /*index*/0, VertexFormatElement.Type.USHORT, false, /*count*/ 1); - RGBA_UBYTE_COLOR = VertexFormatElement.register(/*id*/27, /*index*/0, VertexFormatElement.Type.UBYTE, false, /*count*/ 4); + RGBA_UBYTE_COLOR = VertexFormatElement.register(/*id*/27, /*index*/0, VertexFormatElement.Type.UBYTE, true, /*count*/ 4); IRIS_MATERIAL = VertexFormatElement.register(/*id*/28, /*index*/0, VertexFormatElement.Type.BYTE, false, /*count*/ 1); IRIS_NORMAL = VertexFormatElement.register(/*id*/29, /*index*/0, VertexFormatElement.Type.BYTE, false, /*count*/ 1); diff --git a/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/util/BlazeUniformUtil.java b/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/util/BlazeUniformUtil.java index 6b40aaa11..8968ab014 100644 --- a/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/util/BlazeUniformUtil.java +++ b/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/util/BlazeUniformUtil.java @@ -9,9 +9,13 @@ import com.mojang.blaze3d.buffers.GpuBuffer; import com.mojang.blaze3d.systems.CommandEncoder; import com.mojang.blaze3d.systems.GpuDevice; import com.mojang.blaze3d.systems.RenderSystem; +import com.seibel.distanthorizons.core.logging.DhLogger; +import com.seibel.distanthorizons.core.logging.DhLoggerBuilder; public class BlazeUniformUtil { + private static final DhLogger LOGGER = new DhLoggerBuilder().build(); + private static final GpuDevice GPU_DEVICE = RenderSystem.getDevice(); private static final CommandEncoder COMMAND_ENCODER = GPU_DEVICE.createCommandEncoder(); @@ -22,7 +26,11 @@ public class BlazeUniformUtil if (vboGpuBuffer == null || vboGpuBuffer.size() < size) { - // GpuBuffer.USAGE_UNIFORM = 128 + if (vboGpuBuffer != null) + { + vboGpuBuffer.close(); + } + int usage = GpuBuffer.USAGE_COPY_DST | GpuBuffer.USAGE_VERTEX | GpuBuffer.USAGE_UNIFORM; diff --git a/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/wrappers/RenderPipelineBuilderWrapper.java b/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/wrappers/RenderPipelineBuilderWrapper.java index c4ae29d71..af57a9aba 100644 --- a/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/wrappers/RenderPipelineBuilderWrapper.java +++ b/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/wrappers/RenderPipelineBuilderWrapper.java @@ -6,6 +6,7 @@ import com.mojang.blaze3d.pipeline.DepthStencilState; import com.mojang.blaze3d.pipeline.RenderPipeline; import com.mojang.blaze3d.platform.CompareOp; import com.mojang.blaze3d.platform.PolygonMode; +import com.mojang.blaze3d.shaders.UniformType; import com.mojang.blaze3d.vertex.VertexFormat; import net.minecraft.resources.Identifier; @@ -62,7 +63,7 @@ public class RenderPipelineBuilderWrapper } private BlendFunction blendFunction = null; - public RenderPipelineBuilderWrapper withBlendFunction(BlendFunction blendFunction) + public RenderPipelineBuilderWrapper withBlend(BlendFunction blendFunction) { this.blendFunction = blendFunction; return this; @@ -118,6 +119,18 @@ public class RenderPipelineBuilderWrapper return this; } + public RenderPipelineBuilderWrapper withSampler(String name) throws IllegalArgumentException + { + this.blazePipelineBuilder.withSampler(name); + return this; + } + + public RenderPipelineBuilderWrapper withUniformBuffer(String name) throws IllegalArgumentException + { + this.blazePipelineBuilder.withUniform(name, UniformType.UNIFORM_BUFFER); + return this; + } + private VertexFormat vertexFormat = null; public RenderPipelineBuilderWrapper withVertexFormat(VertexFormat vertexFormat) { @@ -201,7 +214,7 @@ public class RenderPipelineBuilderWrapper case LESS: break; } - this.blazePipelineBuilder.withDepthTestFunction(DepthTestFunction.NO_DEPTH_TEST); + this.blazepipelineBuilder.withDepthTest(RenderPipelineBuilderWrapper.EDhDepthTest.NONE); #else @@ -239,6 +252,9 @@ public class RenderPipelineBuilderWrapper case TRIANGLES: blazeVertexMode = VertexFormat.Mode.TRIANGLES; break; + case TRIANGLE_FAN: + blazeVertexMode = VertexFormat.Mode.TRIANGLE_FAN; + break; case LINES: blazeVertexMode = VertexFormat.Mode.DEBUG_LINES; break; @@ -303,6 +319,7 @@ public class RenderPipelineBuilderWrapper public enum EDhVertexMode { TRIANGLES, + TRIANGLE_FAN, LINES; } diff --git a/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/wrappers/buffer/BlazeVertexBufferWrapper.java b/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/wrappers/buffer/BlazeVertexBufferWrapper.java index f98f975db..20475ab49 100644 --- a/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/wrappers/buffer/BlazeVertexBufferWrapper.java +++ b/common/src/main/java/com/seibel/distanthorizons/common/render/blaze/wrappers/buffer/BlazeVertexBufferWrapper.java @@ -13,20 +13,27 @@ import com.mojang.blaze3d.systems.RenderSystem; import com.seibel.distanthorizons.core.dataObjects.render.bufferBuilding.IndexBufferBuilder; import com.seibel.distanthorizons.core.dataObjects.render.bufferBuilding.LodQuadBuilder; import com.seibel.distanthorizons.core.dependencyInjection.SingletonInjector; +import com.seibel.distanthorizons.core.logging.DhLogger; +import com.seibel.distanthorizons.core.logging.DhLoggerBuilder; import com.seibel.distanthorizons.core.render.RenderThreadTaskHandler; import com.seibel.distanthorizons.core.wrapperInterfaces.render.AbstractDhRenderApiDefinition; import com.seibel.distanthorizons.core.wrapperInterfaces.render.objects.IVertexBufferWrapper; import org.lwjgl.system.MemoryUtil; import java.nio.ByteBuffer; +import java.util.concurrent.atomic.AtomicInteger; public class BlazeVertexBufferWrapper implements IVertexBufferWrapper { + private static final DhLogger LOGGER = new DhLoggerBuilder().build(); + private static final AbstractDhRenderApiDefinition RENDER_DEF = SingletonInjector.INSTANCE.get(AbstractDhRenderApiDefinition.class); private static final GpuDevice GPU_DEVICE = RenderSystem.getDevice(); private static final CommandEncoder COMMAND_ENCODER = GPU_DEVICE.createCommandEncoder(); + private static final AtomicInteger BUFFER_COUNT_REF = new AtomicInteger(0); + public final String name; public String getName() { return this.name; } @@ -111,6 +118,12 @@ public class BlazeVertexBufferWrapper implements IVertexBufferWrapper // due to a bug on Mac where it will attempt to render anything allocated in the buffer || oldVertexCount != vertexCount) { + if (this.vertexGpuBuffer == null) + { + BUFFER_COUNT_REF.incrementAndGet(); + //LOGGER.info("Create, count: ["+BUFFER_COUNT_REF.get()+"]"); + } + if (this.vertexGpuBuffer != null) { this.vertexGpuBuffer.close(); @@ -146,6 +159,11 @@ public class BlazeVertexBufferWrapper implements IVertexBufferWrapper if (this.indexGpuBuffer == null || oldIndexCount != this.indexCount) { + if (this.indexGpuBuffer == null) + { + BUFFER_COUNT_REF.incrementAndGet(); + } + if (this.indexGpuBuffer != null) { this.indexGpuBuffer.close(); @@ -180,13 +198,17 @@ public class BlazeVertexBufferWrapper implements IVertexBufferWrapper { if (this.vertexGpuBuffer != null) { + BUFFER_COUNT_REF.decrementAndGet(); this.vertexGpuBuffer.close(); } if (this.indexGpuBuffer != null) { + BUFFER_COUNT_REF.decrementAndGet(); this.indexGpuBuffer.close(); } + + //LOGGER.info("Close, count: ["+BUFFER_COUNT_REF.get()+"]"); } //endregion diff --git a/fabric/src/main/java/com/seibel/distanthorizons/fabric/mixins/client/MixinChunkSectionsToRender.java b/fabric/src/main/java/com/seibel/distanthorizons/fabric/mixins/client/MixinChunkSectionsToRender.java index 2581b5322..723b94f81 100644 --- a/fabric/src/main/java/com/seibel/distanthorizons/fabric/mixins/client/MixinChunkSectionsToRender.java +++ b/fabric/src/main/java/com/seibel/distanthorizons/fabric/mixins/client/MixinChunkSectionsToRender.java @@ -47,6 +47,11 @@ import com.mojang.blaze3d.textures.GpuSampler; public class MixinChunkSectionsToRender { + //===========// + // Pre MC 26 // + //===========// + //regino + #if MC_VER <= MC_1_21_11 #if MC_VER <= MC_1_21_10 // needs to fire at HEAD with a lower than normal order (less than 1000) @@ -74,6 +79,51 @@ public class MixinChunkSectionsToRender } } + //endregion + #else + + + + //============// + // post MC 26 // + //============// + //region + + // needs to fire at HEAD with a lower than normal order (less than 1000) + // otherwise it will be canceled by Sodium + @Inject(at = @At("HEAD"), method = "renderGroup", order = 800) + private void renderDeferredLayerHead(ChunkSectionLayerGroup chunkSectionLayerGroup, GpuSampler gpuSampler, CallbackInfo ci) + { + ClientApi.RENDER_STATE.clientLevelWrapper = ClientLevelWrapper.getWrapperIfDifferent(ClientApi.RENDER_STATE.clientLevelWrapper, Minecraft.getInstance().levelRenderer.level); + + + ClientApi.RENDER_STATE.canRenderOrThrow(); + + if (chunkSectionLayerGroup == ChunkSectionLayerGroup.TRANSLUCENT) + { + ClientApi.INSTANCE.renderDeferredLodsForShaders(); + } + else if (chunkSectionLayerGroup == ChunkSectionLayerGroup.OPAQUE) + { + ClientApi.INSTANCE.renderFadeTransparent(); + ClientApi.INSTANCE.renderLods(); + } + } + + @Inject(at = @At("RETURN"), method = "renderGroup", order = 800) + private void renderDeferredLayerReturn(ChunkSectionLayerGroup chunkSectionLayerGroup, GpuSampler gpuSampler, CallbackInfo ci) + { + ClientApi.RENDER_STATE.canRenderOrThrow(); + + if (chunkSectionLayerGroup == ChunkSectionLayerGroup.TRANSLUCENT) + { + ClientApi.INSTANCE.renderFadeOpaque(); + } + } + + //endregion + #endif + } diff --git a/fabric/src/main/java/com/seibel/distanthorizons/fabric/mixins/client/MixinLevelRenderer.java b/fabric/src/main/java/com/seibel/distanthorizons/fabric/mixins/client/MixinLevelRenderer.java index d84e5b61d..748b8c331 100644 --- a/fabric/src/main/java/com/seibel/distanthorizons/fabric/mixins/client/MixinLevelRenderer.java +++ b/fabric/src/main/java/com/seibel/distanthorizons/fabric/mixins/client/MixinLevelRenderer.java @@ -47,30 +47,39 @@ import org.joml.Matrix4fc; import org.joml.Vector4f; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; -#else +#elif MC_VER <= MC_1_21_11 import com.mojang.blaze3d.buffers.GpuBufferSlice; import com.mojang.blaze3d.resource.GraphicsResourceAllocator; import com.seibel.distanthorizons.common.wrappers.minecraft.MinecraftRenderWrapper; -import net.minecraft.client.Camera; import net.minecraft.client.DeltaTracker; import net.minecraft.client.renderer.chunk.ChunkSectionsToRender; -import org.joml.Matrix4f; import org.joml.Matrix4fc; import org.joml.Vector4f; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; +#else +import com.mojang.blaze3d.buffers.GpuBufferSlice; +import com.mojang.blaze3d.resource.GraphicsResourceAllocator; +import com.seibel.distanthorizons.common.wrappers.minecraft.MinecraftRenderWrapper; +import net.minecraft.client.DeltaTracker; +import net.minecraft.client.renderer.chunk.ChunkSectionsToRender; +import org.joml.Matrix4fc; +import org.joml.Vector4f; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; +import net.minecraft.client.renderer.state.level.CameraRenderState; #endif import com.seibel.distanthorizons.common.wrappers.McObjectConverter; import com.seibel.distanthorizons.common.wrappers.world.ClientLevelWrapper; -import com.seibel.distanthorizons.common.wrappers.minecraft.MinecraftRenderWrapper; import com.seibel.distanthorizons.core.api.internal.ClientApi; import com.seibel.distanthorizons.coreapi.ModInfo; import com.seibel.distanthorizons.core.logging.DhLoggerBuilder; -import net.minecraft.client.Minecraft; + import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.client.renderer.LevelRenderer; + import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.Unique; @@ -91,6 +100,13 @@ public class MixinLevelRenderer private static final DhLogger LOGGER = new DhLoggerBuilder().build(); + + //===========// + // Pre MC 26 // + //===========// + //region + #if MC_VER <= MC_1_21_11 + #if MC_VER < MC_1_17_1 @Inject(at = @At("HEAD"), method = "renderChunkLayer(Lnet/minecraft/client/renderer/RenderType;Lcom/mojang/blaze3d/vertex/PoseStack;DDD)V", @@ -128,7 +144,7 @@ public class MixinLevelRenderer Vector4f skyColor, boolean thinFog, CallbackInfo callback) #endif { - #if MC_VER == MC_1_16_5 + #if MC_VER <= MC_1_16_5 // get the matrices from the OpenGL fixed pipeline float[] mcProjMatrixRaw = new float[16]; GL32.glGetFloatv(GL32.GL_PROJECTION_MATRIX, mcProjMatrixRaw); @@ -190,6 +206,64 @@ public class MixinLevelRenderer } #endif + #endif + //endregion + + + + //============// + // post MC 26 // + //============// + //region + + #if MC_VER <= MC_1_21_11 + #else + + @Inject(at = @At("HEAD"), method = "prepareChunkRenders") + private void prepareChunkRenders(final Matrix4fc modelViewMatrix, CallbackInfoReturnable callback) + { + ClientApi.RENDER_STATE.clientLevelWrapper = ClientLevelWrapper.getWrapperIfDifferent(ClientApi.RENDER_STATE.clientLevelWrapper, this.level); + } + + @Inject(at = @At("HEAD"), method = "renderLevel") + public void renderLevel( + final GraphicsResourceAllocator resourceAllocator, final DeltaTracker deltaTracker, + final boolean renderBlockOutline, final CameraRenderState camera, + final Matrix4fc modelViewMatrix, final GpuBufferSlice terrainFog, + final Vector4f fogColor, final boolean shouldRenderSky, + final ChunkSectionsToRender chunkSectionsToRender, + CallbackInfo callback) + { + ClientApi.RENDER_STATE.mcModelViewMatrix = McObjectConverter.Convert(modelViewMatrix); + ClientApi.RENDER_STATE.mcProjectionMatrix = McObjectConverter.Convert(camera.projectionMatrix); + + ClientApi.RENDER_STATE.partialTickTime = MinecraftRenderWrapper.INSTANCE.getPartialTickTime(); + + } + + @Inject( + method = "addMainPass(Lcom/mojang/blaze3d/framegraph/FrameGraphBuilder;Lnet/minecraft/client/renderer/culling/Frustum;Lorg/joml/Matrix4fc;Lcom/mojang/blaze3d/buffers/GpuBufferSlice;ZLnet/minecraft/client/renderer/state/level/LevelRenderState;Lnet/minecraft/client/DeltaTracker;Lnet/minecraft/util/profiling/ProfilerFiller;Lnet/minecraft/client/renderer/chunk/ChunkSectionsToRender;)V", + at = @At( + value = "RETURN", + target = "Lcom/mojang/blaze3d/framegraph/FramePass;executes(Ljava/lang/Runnable;)V", + remap = false + ) + ) + public void addMainPass( + CallbackInfo ci) + { + // only crash during development + if (ModInfo.IS_DEV_BUILD) + { + ClientApi.RENDER_STATE.canRenderOrThrow(); + } + + ClientApi.INSTANCE.renderLods(); + + } + + #endif + //endregion diff --git a/neoforge/src/main/java/com/seibel/distanthorizons/neoforge/mixins/client/MixinLevelRenderer.java b/neoforge/src/main/java/com/seibel/distanthorizons/neoforge/mixins/client/MixinLevelRenderer.java index 091468719..169dd9659 100644 --- a/neoforge/src/main/java/com/seibel/distanthorizons/neoforge/mixins/client/MixinLevelRenderer.java +++ b/neoforge/src/main/java/com/seibel/distanthorizons/neoforge/mixins/client/MixinLevelRenderer.java @@ -35,6 +35,7 @@ import net.minecraft.client.DeltaTracker; import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.client.renderer.LevelRenderer; +import net.minecraft.client.renderer.state.level.CameraRenderState; import org.joml.Matrix4f; import org.joml.Matrix4fc; import org.joml.Vector4f; @@ -77,6 +78,12 @@ public class MixinLevelRenderer + //===========// + // Pre MC 26 // + //===========// + //region + #if MC_VER <= MC_1_21_11 + #if MC_VER < MC_1_21_6 @Inject(at = @At("HEAD"), method = "renderSectionLayer") private void renderChunkLayer(RenderType renderType, double x, double y, double z, Matrix4f modelViewMatrix, Matrix4f projectionMatrix, CallbackInfo callback) @@ -165,6 +172,71 @@ public class MixinLevelRenderer } #endif + #endif + //endregion + + + + //============// + // post MC 26 // + //============// + //region + + #if MC_VER <= MC_1_21_11 + #else + + @Inject(at = @At("HEAD"), method = "prepareChunkRenders") + private void prepareChunkRenders(final Matrix4fc modelViewMatrix, CallbackInfoReturnable callback) + { + ClientApi.RENDER_STATE.clientLevelWrapper = ClientLevelWrapper.getWrapperIfDifferent(ClientApi.RENDER_STATE.clientLevelWrapper, this.level); + } + + @Inject(at = @At("HEAD"), method = "renderLevel") + public void renderLevel( + final GraphicsResourceAllocator resourceAllocator, final DeltaTracker deltaTracker, + final boolean renderBlockOutline, final CameraRenderState camera, + final Matrix4fc modelViewMatrix, final GpuBufferSlice terrainFog, + final Vector4f fogColor, final boolean shouldRenderSky, + final ChunkSectionsToRender chunkSectionsToRender, + CallbackInfo callback) + { + ClientApi.RENDER_STATE.mcModelViewMatrix = McObjectConverter.Convert(modelViewMatrix); + ClientApi.RENDER_STATE.mcProjectionMatrix = McObjectConverter.Convert(camera.projectionMatrix); + + ClientApi.RENDER_STATE.partialTickTime = MinecraftRenderWrapper.INSTANCE.getPartialTickTime(); + + } + + @Inject( + method = "addMainPass(Lcom/mojang/blaze3d/framegraph/FrameGraphBuilder;Lnet/minecraft/client/renderer/culling/Frustum;Lorg/joml/Matrix4fc;Lcom/mojang/blaze3d/buffers/GpuBufferSlice;ZLnet/minecraft/client/renderer/state/level/LevelRenderState;Lnet/minecraft/client/DeltaTracker;Lnet/minecraft/util/profiling/ProfilerFiller;Lnet/minecraft/client/renderer/chunk/ChunkSectionsToRender;)V", + at = @At( + value = "RETURN", + target = "Lcom/mojang/blaze3d/framegraph/FramePass;executes(Ljava/lang/Runnable;)V", + remap = false + ) + ) + public void addMainPass( + CallbackInfo ci) + { + // only crash during development + if (ModInfo.IS_DEV_BUILD) + { + try + { + ClientApi.RENDER_STATE.canRenderOrThrow(); + } + catch (IllegalStateException e) + { + return; + } + } + + ClientApi.INSTANCE.renderLods(); + + } + + #endif + //endregion