From 2fb454ee965aa315462c0419f69e700fc703e9e4 Mon Sep 17 00:00:00 2001 From: IThundxr Date: Mon, 22 Dec 2025 19:27:09 -0500 Subject: [PATCH 01/59] Update dependencies for 1.21.11 --- .../gradle/subproject/SubprojectExtension.kt | 3 +- .../TransitiveSourceSetsExtension.kt | 8 ++--- common/build.gradle.kts | 6 ++-- fabric/build.gradle.kts | 6 ++-- gradle.properties | 33 +++++++++--------- gradle/wrapper/gradle-wrapper.jar | Bin 43583 -> 43705 bytes gradle/wrapper/gradle-wrapper.properties | 2 +- gradlew | 5 ++- neoforge/build.gradle.kts | 8 ++--- vanillinFabric/build.gradle.kts | 4 ++- vanillinNeoForge/build.gradle.kts | 7 ++-- 11 files changed, 43 insertions(+), 39 deletions(-) diff --git a/buildSrc/src/main/kotlin/dev/engine_room/gradle/subproject/SubprojectExtension.kt b/buildSrc/src/main/kotlin/dev/engine_room/gradle/subproject/SubprojectExtension.kt index d11d31f65..985f41ef0 100644 --- a/buildSrc/src/main/kotlin/dev/engine_room/gradle/subproject/SubprojectExtension.kt +++ b/buildSrc/src/main/kotlin/dev/engine_room/gradle/subproject/SubprojectExtension.kt @@ -107,7 +107,8 @@ open class SubprojectExtension(val project: Project) { add("mappings", loom.layered { officialMojangMappings() - parchment("org.parchmentmc.data:parchment-${parchment_minecraft_version}:${parchment_version}@zip") + if (parchment_version != "none") + parchment("org.parchmentmc.data:parchment-${parchment_minecraft_version}:${parchment_version}@zip") }) add("api", "com.google.code.findbugs:jsr305:3.0.2") diff --git a/buildSrc/src/main/kotlin/dev/engine_room/gradle/transitive/TransitiveSourceSetsExtension.kt b/buildSrc/src/main/kotlin/dev/engine_room/gradle/transitive/TransitiveSourceSetsExtension.kt index 2fb1478e7..b04550de4 100644 --- a/buildSrc/src/main/kotlin/dev/engine_room/gradle/transitive/TransitiveSourceSetsExtension.kt +++ b/buildSrc/src/main/kotlin/dev/engine_room/gradle/transitive/TransitiveSourceSetsExtension.kt @@ -33,9 +33,9 @@ open class TransitiveSourceSetsExtension(val project: Project) { transitives.forEach { (sourceSet, configurator) -> project.configurations.named(sourceSet.compileOnlyConfigurationName).configure { - extendsFrom(configs[sourceSet]) + extendsFrom(configs[sourceSet]!!) configurator.compileSourceSets.forEach { - extendsFrom(configs[it]) + extendsFrom(configs[it]!!) } } } @@ -51,9 +51,9 @@ open class TransitiveSourceSetsExtension(val project: Project) { transitives.forEach { (sourceSet, configurator) -> project.configurations.named(sourceSet.runtimeOnlyConfigurationName).configure { - extendsFrom(configs[sourceSet]) + extendsFrom(configs[sourceSet]!!) configurator.runtimeSourceSets.forEach { - extendsFrom(configs[it]) + extendsFrom(configs[it]!!) } } } diff --git a/common/build.gradle.kts b/common/build.gradle.kts index 8f5e344dc..b260c29af 100644 --- a/common/build.gradle.kts +++ b/common/build.gradle.kts @@ -118,8 +118,10 @@ jarSets { dependencies { modCompileOnly("net.fabricmc:fabric-loader:${property("fabric_loader_version")}") - modCompileOnly("maven.modrinth:sodium:${property("sodium_version")}-fabric") - modCompileOnly("maven.modrinth:iris:${property("iris_version")}-fabric") + if (property("enable_sodium_and_iris").toString().toBoolean()) { + modCompileOnly("maven.modrinth:sodium:${property("sodium_version")}-fabric") + modCompileOnly("maven.modrinth:iris:${property("iris_version")}-fabric") + } compileOnly(annotationProcessor("io.github.llamalad7:mixinextras-common:0.4.1")!!) diff --git a/fabric/build.gradle.kts b/fabric/build.gradle.kts index dd1332ed4..e2e2f4027 100644 --- a/fabric/build.gradle.kts +++ b/fabric/build.gradle.kts @@ -129,8 +129,10 @@ dependencies { modImplementation("net.fabricmc:fabric-loader:${property("fabric_loader_version")}") modApi("net.fabricmc.fabric-api:fabric-api:${property("fabric_api_version")}") - modCompileOnly("maven.modrinth:sodium:${property("sodium_version")}-fabric") - modCompileOnly("maven.modrinth:iris:${property("iris_version")}-fabric") + if (property("enable_sodium_and_iris").toString().toBoolean()) { + modCompileOnly("maven.modrinth:sodium:${property("sodium_version")}-fabric") + modCompileOnly("maven.modrinth:iris:${property("iris_version")}-fabric") + } "forApi"(project(path = common, configuration = "apiClasses")) "forLib"(project(path = common, configuration = "libClasses")) diff --git a/gradle.properties b/gradle.properties index a6ca9201c..4eef770fe 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,5 +1,6 @@ org.gradle.jvmargs = -Xmx3G org.gradle.daemon = false + # Common metadata mod_license = MIT mod_sources = https://github.com/Engine-Room/Flywheel @@ -20,31 +21,29 @@ flywheel_maven_version_range=[1.0.0,2.0) flywheel_semver_version_range=>=1.0.0 <2.0.0 # Mod dependency declarations -minecraft_semver_version_range = >=1.21.1 <1.21.2 -minecraft_maven_version_range = [1.21.1,1.21.2) -fabric_api_version_range = >=0.105.0 -neoforge_version_range = [21.1.66,) +minecraft_semver_version_range = 1.21.11 +minecraft_maven_version_range = [1.21.11] +fabric_api_version_range = >=0.139.4 +neoforge_version_range = [21.11.0-beta,) # General build dependency versions java_version = 21 -arch_loom_version = 1.7.412 -cursegradle_version = 1.4.0 -parchment_minecraft_version = 1.21 -parchment_version = 2024.07.07 +arch_loom_version = 1.13.467 +parchment_minecraft_version = 1.21.10 +parchment_version = 2025.10.12 # Minecraft build dependency versions -minecraft_version = 1.21.1 -neoforge_version = 21.1.66 -fabric_loader_version = 0.16.5 -fabric_api_version = 0.105.0+1.21.1 +minecraft_version = 1.21.11 +neoforge_version = 21.11.0-beta +fabric_loader_version = 0.18.2 +fabric_api_version = 0.139.4+1.21.11 # Build dependency mod versions -sodium_version = mc1.21.1-0.6.5 -iris_version = 1.8.0-beta.8+1.21.1 -# There is no oculus for 1.21.1 so we will only support iris -embeddium_version = 1.0.11+mc1.21.1 +enable_sodium_and_iris = false +sodium_version = mc1.21.11-0.8.0 +iris_version = 1.10.0+1.21.11 # Publication info flywheel_group=dev.engine-room.flywheel vanillin_group=dev.engine-room.vanillin -artifact_minecraft_version = 1.21.1 +artifact_minecraft_version = 1.21.11 diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index a4b76b9530d66f5e68d973ea569d8e19de379189..9bbc975c742b298b441bfb90dbc124400a3751b9 100644 GIT binary patch delta 34744 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 delta 34727 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�{ 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 a%EQ2*fnt2> /dev/null && printf '%s -' "$PWD" ) || exit +APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s\n' "$PWD" ) || exit # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD=maximum @@ -206,7 +205,7 @@ fi DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' # Collect all arguments for the java command: -# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, # and any embedded shellness will be escaped. # * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be # treated as '${Hostname}' itself on the command line. diff --git a/neoforge/build.gradle.kts b/neoforge/build.gradle.kts index 76b806956..616b9dcda 100644 --- a/neoforge/build.gradle.kts +++ b/neoforge/build.gradle.kts @@ -131,10 +131,10 @@ repositories { dependencies { neoForge("net.neoforged:neoforge:${property("neoforge_version")}") - modCompileOnly("maven.modrinth:sodium:${property("sodium_version")}-neoforge") - modCompileOnly("maven.modrinth:iris:${property("iris_version")}-neoforge") - - modCompileOnly("maven.modrinth:embeddium:${property("embeddium_version")}") + if (property("enable_sodium_and_iris").toString().toBoolean()) { + modCompileOnly("maven.modrinth:sodium:${property("sodium_version")}-neoforge") + modCompileOnly("maven.modrinth:iris:${property("iris_version")}-neoforge") + } "forApi"(project(path = common, configuration = "apiClasses")) "forLib"(project(path = common, configuration = "libClasses")) diff --git a/vanillinFabric/build.gradle.kts b/vanillinFabric/build.gradle.kts index 70a714cc3..38ebc8ea2 100644 --- a/vanillinFabric/build.gradle.kts +++ b/vanillinFabric/build.gradle.kts @@ -76,7 +76,9 @@ dependencies { modImplementation("net.fabricmc:fabric-loader:${property("fabric_loader_version")}") modApi("net.fabricmc.fabric-api:fabric-api:${property("fabric_api_version")}") - modCompileOnly("maven.modrinth:sodium:${property("sodium_version")}-fabric") + if (property("enable_sodium_and_iris").toString().toBoolean()) { + modCompileOnly("maven.modrinth:sodium:${property("sodium_version")}-fabric") + } compileOnly(project(path = common, configuration = "vanillinClasses")) compileOnly(project(path = common, configuration = "vanillinResources")) diff --git a/vanillinNeoForge/build.gradle.kts b/vanillinNeoForge/build.gradle.kts index 0064b88ed..caa7b9c9c 100644 --- a/vanillinNeoForge/build.gradle.kts +++ b/vanillinNeoForge/build.gradle.kts @@ -80,10 +80,9 @@ repositories { dependencies { neoForge("net.neoforged:neoforge:${property("neoforge_version")}") - modCompileOnly("maven.modrinth:sodium:${property("sodium_version")}-neoforge") - modCompileOnly("maven.modrinth:iris:${property("iris_version")}-neoforge") - - modCompileOnly("maven.modrinth:embeddium:${property("embeddium_version")}") + if (property("enable_sodium_and_iris").toString().toBoolean()) { + modCompileOnly("maven.modrinth:sodium:${property("sodium_version")}-neoforge") + } compileOnly(project(path = common, configuration = "vanillinClasses")) compileOnly(project(path = common, configuration = "vanillinResources")) From 7a48a382bb6997391f5a4aa69e3d5f02610c03ec Mon Sep 17 00:00:00 2001 From: IThundxr Date: Mon, 22 Dec 2025 20:03:12 -0500 Subject: [PATCH 02/59] ResourceLocation -> Identifier --- .../flywheel/api/instance/InstanceType.java | 10 +-- .../flywheel/api/material/CutoutShader.java | 6 +- .../flywheel/api/material/FogShader.java | 6 +- .../flywheel/api/material/LightShader.java | 6 +- .../flywheel/api/material/Material.java | 4 +- .../api/material/MaterialShaders.java | 10 +-- .../flywheel/api/registry/IdRegistry.java | 16 ++--- .../flywheel/backend/Backends.java | 6 +- .../flywheel/backend/InternalVertex.java | 6 +- .../backend/MaterialShaderIndices.java | 14 ++-- .../flywheel/backend/NoiseTextures.java | 7 +- .../flywheel/backend/compile/FlwPrograms.java | 6 +- .../backend/compile/IndirectPrograms.java | 30 ++++---- .../flywheel/backend/compile/OitPrograms.java | 18 ++--- .../flywheel/backend/compile/Pipeline.java | 12 ++-- .../backend/compile/PipelineCompiler.java | 20 +++--- .../flywheel/backend/compile/Pipelines.java | 10 +-- .../BufferTextureInstanceComponent.java | 4 +- .../component/InstanceStructComponent.java | 4 +- .../component/SsboInstanceComponent.java | 4 +- .../StringSubstitutionComponent.java | 4 +- .../component/UberShaderComponent.java | 20 +++--- .../backend/compile/core/Compile.java | 8 +-- .../compile/core/FailedCompilation.java | 6 +- .../backend/engine/TextureBinder.java | 12 ++-- .../flywheel/backend/glsl/LoadError.java | 28 ++++---- .../flywheel/backend/glsl/ShaderSources.java | 68 +++++++++---------- .../flywheel/backend/glsl/SourceFile.java | 22 +++--- .../flywheel/backend/glsl/SourceLines.java | 6 +- .../backend/glsl/error/ErrorBuilder.java | 4 +- .../glsl/generate/GlslVertexInput.java | 2 +- .../flywheel/backend/glsl/span/ErrorSpan.java | 2 +- .../flywheel/lib/backend/SimpleBackend.java | 4 +- .../flywheel/lib/instance/InstanceTypes.java | 19 +++--- .../lib/instance/SimpleInstanceType.java | 20 +++--- .../flywheel/lib/internal/FlwLibXplat.java | 6 +- .../flywheel/lib/material/CutoutShaders.java | 10 +-- .../flywheel/lib/material/FogShaders.java | 8 +-- .../flywheel/lib/material/LightShaders.java | 8 +-- .../lib/material/SimpleCutoutShader.java | 4 +- .../lib/material/SimpleFogShader.java | 4 +- .../lib/material/SimpleLightShader.java | 4 +- .../flywheel/lib/material/SimpleMaterial.java | 12 ++-- .../lib/material/SimpleMaterialShaders.java | 4 +- .../lib/material/StandardMaterialShaders.java | 10 +-- .../lib/model/baked/PartialModel.java | 21 +++--- .../flywheel/lib/util/IdentifierUtil.java | 67 ++++++++++++++++++ .../flywheel/lib/util/ResourceUtil.java | 67 ------------------ .../lib/visual/component/ShadowComponent.java | 5 +- .../flywheel/impl/BackendArgument.java | 8 +-- .../flywheel/impl/BackendManagerImpl.java | 8 +-- .../impl/registry/IdRegistryImpl.java | 26 +++---- .../backend/glsl/MockShaderSources.java | 40 +++++------ .../flywheel/backend/glsl/TestBase.java | 20 +++--- .../backend/glsl/TestErrorMessages.java | 10 +-- .../backend/glsl/TestShaderSourceLoading.java | 4 +- .../dev/engine_room/vanillin/Vanillin.java | 6 +- .../vanillin/VanillinInstanceTypes.java | 4 +- .../vanillin/elements/ShadowElement.java | 4 +- .../vanillin/mixin/text/BakedGlyphMixin.java | 10 +-- .../vanillin/mixin/text/FontAccessor.java | 4 +- .../vanillin/mixin/text/FontSetMixin.java | 4 +- .../vanillin/mixin/text/FontTextureMixin.java | 6 +- .../vanillin/text/BakedGlyphExtension.java | 6 +- .../vanillin/text/FontTextureExtension.java | 4 +- .../engine_room/vanillin/text/TextLayer.java | 6 +- .../engine_room/vanillin/text/TextUtil.java | 6 +- .../engine_room/vanillin/text/TextVisual.java | 8 +-- .../vanillin/visuals/MinecartVisual.java | 4 +- .../backend/compile/FlwProgramsReloader.java | 8 +-- .../model/baked/PartialModelEventHandler.java | 18 ++--- .../flywheel/impl/FabricFlwConfig.java | 10 +-- .../flywheel/impl/FlwLibXplatImpl.java | 7 +- .../model/baked/PartialModelEventHandler.java | 9 +-- .../flywheel/impl/FlwLibXplatImpl.java | 7 +- .../flywheel/impl/NeoForgeFlwConfig.java | 12 ++-- 76 files changed, 460 insertions(+), 453 deletions(-) create mode 100644 common/src/lib/java/dev/engine_room/flywheel/lib/util/IdentifierUtil.java delete mode 100644 common/src/lib/java/dev/engine_room/flywheel/lib/util/ResourceUtil.java diff --git a/common/src/api/java/dev/engine_room/flywheel/api/instance/InstanceType.java b/common/src/api/java/dev/engine_room/flywheel/api/instance/InstanceType.java index fd5c726b1..5081c54e3 100644 --- a/common/src/api/java/dev/engine_room/flywheel/api/instance/InstanceType.java +++ b/common/src/api/java/dev/engine_room/flywheel/api/instance/InstanceType.java @@ -1,7 +1,7 @@ package dev.engine_room.flywheel.api.instance; import dev.engine_room.flywheel.api.layout.Layout; -import net.minecraft.resources.ResourceLocation; +import net.minecraft.resources.Identifier; /** * An InstanceType contains metadata for a specific instance that Flywheel can interface with. @@ -44,9 +44,9 @@ public interface InstanceType { * space to world space in whatever way the instance type requires. * * @return The vertex shader for this instance type. - * @apiNote {@code flywheel/} is implicitly prepended to the {@link ResourceLocation}'s path. + * @apiNote {@code flywheel/} is implicitly prepended to the {@link Identifier}'s path. */ - ResourceLocation vertexShader(); + Identifier vertexShader(); /** * The cull shader of this instance type. @@ -56,7 +56,7 @@ public interface InstanceType { * by the vertex shader would be contained by the output bounding sphere. * * @return The cull shader for this instance type. - * @apiNote {@code flywheel/} is implicitly prepended to the {@link ResourceLocation}'s path. + * @apiNote {@code flywheel/} is implicitly prepended to the {@link Identifier}'s path. */ - ResourceLocation cullShader(); + Identifier cullShader(); } diff --git a/common/src/api/java/dev/engine_room/flywheel/api/material/CutoutShader.java b/common/src/api/java/dev/engine_room/flywheel/api/material/CutoutShader.java index d98910cd5..f4252f0c1 100644 --- a/common/src/api/java/dev/engine_room/flywheel/api/material/CutoutShader.java +++ b/common/src/api/java/dev/engine_room/flywheel/api/material/CutoutShader.java @@ -1,13 +1,13 @@ package dev.engine_room.flywheel.api.material; -import net.minecraft.resources.ResourceLocation; +import net.minecraft.resources.Identifier; /** * A shader that decides what colors should be discarded in the fragment shader. */ public interface CutoutShader { /** - * @apiNote {@code flywheel/} is implicitly prepended to the {@link ResourceLocation}'s path. + * @apiNote {@code flywheel/} is implicitly prepended to the {@link Identifier}'s path. */ - ResourceLocation source(); + Identifier source(); } diff --git a/common/src/api/java/dev/engine_room/flywheel/api/material/FogShader.java b/common/src/api/java/dev/engine_room/flywheel/api/material/FogShader.java index 9a77a873a..88f2fcb85 100644 --- a/common/src/api/java/dev/engine_room/flywheel/api/material/FogShader.java +++ b/common/src/api/java/dev/engine_room/flywheel/api/material/FogShader.java @@ -1,13 +1,13 @@ package dev.engine_room.flywheel.api.material; -import net.minecraft.resources.ResourceLocation; +import net.minecraft.resources.Identifier; /** * A shader that controls the fog effect on a material. */ public interface FogShader { /** - * @apiNote {@code flywheel/} is implicitly prepended to the {@link ResourceLocation}'s path. + * @apiNote {@code flywheel/} is implicitly prepended to the {@link Identifier}'s path. */ - ResourceLocation source(); + Identifier source(); } diff --git a/common/src/api/java/dev/engine_room/flywheel/api/material/LightShader.java b/common/src/api/java/dev/engine_room/flywheel/api/material/LightShader.java index 977d16764..d59819a90 100644 --- a/common/src/api/java/dev/engine_room/flywheel/api/material/LightShader.java +++ b/common/src/api/java/dev/engine_room/flywheel/api/material/LightShader.java @@ -1,13 +1,13 @@ package dev.engine_room.flywheel.api.material; -import net.minecraft.resources.ResourceLocation; +import net.minecraft.resources.Identifier; /** * A shader that controls the GPU-based light on a material. */ public interface LightShader { /** - * @apiNote {@code flywheel/} is implicitly prepended to the {@link ResourceLocation}'s path. + * @apiNote {@code flywheel/} is implicitly prepended to the {@link Identifier}'s path. */ - ResourceLocation source(); + Identifier source(); } diff --git a/common/src/api/java/dev/engine_room/flywheel/api/material/Material.java b/common/src/api/java/dev/engine_room/flywheel/api/material/Material.java index ae72a2fb3..2058670c4 100644 --- a/common/src/api/java/dev/engine_room/flywheel/api/material/Material.java +++ b/common/src/api/java/dev/engine_room/flywheel/api/material/Material.java @@ -1,6 +1,6 @@ package dev.engine_room.flywheel.api.material; -import net.minecraft.resources.ResourceLocation; +import net.minecraft.resources.Identifier; public interface Material { MaterialShaders shaders(); @@ -11,7 +11,7 @@ public interface Material { LightShader light(); - ResourceLocation texture(); + Identifier texture(); /** * Should this material have linear filtering applied to the diffuse sampler? diff --git a/common/src/api/java/dev/engine_room/flywheel/api/material/MaterialShaders.java b/common/src/api/java/dev/engine_room/flywheel/api/material/MaterialShaders.java index bb8dc76ad..8797e1ff1 100644 --- a/common/src/api/java/dev/engine_room/flywheel/api/material/MaterialShaders.java +++ b/common/src/api/java/dev/engine_room/flywheel/api/material/MaterialShaders.java @@ -1,18 +1,18 @@ package dev.engine_room.flywheel.api.material; -import net.minecraft.resources.ResourceLocation; +import net.minecraft.resources.Identifier; /** * A vertex and fragment shader pair that can be attached to a material. */ public interface MaterialShaders { /** - * @apiNote {@code flywheel/} is implicitly prepended to the {@link ResourceLocation}'s path. + * @apiNote {@code flywheel/} is implicitly prepended to the {@link Identifier}'s path. */ - ResourceLocation vertexSource(); + Identifier vertexSource(); /** - * @apiNote {@code flywheel/} is implicitly prepended to the {@link ResourceLocation}'s path. + * @apiNote {@code flywheel/} is implicitly prepended to the {@link Identifier}'s path. */ - ResourceLocation fragmentSource(); + Identifier fragmentSource(); } diff --git a/common/src/api/java/dev/engine_room/flywheel/api/registry/IdRegistry.java b/common/src/api/java/dev/engine_room/flywheel/api/registry/IdRegistry.java index a2528ce03..e53327d1d 100644 --- a/common/src/api/java/dev/engine_room/flywheel/api/registry/IdRegistry.java +++ b/common/src/api/java/dev/engine_room/flywheel/api/registry/IdRegistry.java @@ -7,26 +7,26 @@ import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.UnmodifiableView; -import net.minecraft.resources.ResourceLocation; +import net.minecraft.resources.Identifier; @ApiStatus.NonExtendable public interface IdRegistry extends Iterable { - void register(ResourceLocation id, T object); + void register(Identifier id, T object); - S registerAndGet(ResourceLocation id, S object); + S registerAndGet(Identifier id, S object); @Nullable - T get(ResourceLocation id); + T get(Identifier id); @Nullable - ResourceLocation getId(T object); + Identifier getId(T object); - T getOrThrow(ResourceLocation id); + T getOrThrow(Identifier id); - ResourceLocation getIdOrThrow(T object); + Identifier getIdOrThrow(T object); @UnmodifiableView - Set getAllIds(); + Set getAllIds(); @UnmodifiableView Collection getAll(); diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/Backends.java b/common/src/backend/java/dev/engine_room/flywheel/backend/Backends.java index d796248ae..da81c642f 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/Backends.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/Backends.java @@ -9,7 +9,7 @@ import dev.engine_room.flywheel.backend.gl.Driver; import dev.engine_room.flywheel.backend.gl.GlCompat; import dev.engine_room.flywheel.lib.backend.SimpleBackend; -import dev.engine_room.flywheel.lib.util.ResourceUtil; +import dev.engine_room.flywheel.lib.util.IdentifierUtil; import dev.engine_room.flywheel.lib.util.ShadersModHelper; public final class Backends { @@ -20,7 +20,7 @@ public final class Backends { .engineFactory(level -> new EngineImpl(level, new InstancedDrawManager(InstancingPrograms.get()), 256)) .priority(500) .supported(() -> GlCompat.SUPPORTS_INSTANCING && InstancingPrograms.allLoaded() && !ShadersModHelper.isShaderPackInUse()) - .register(ResourceUtil.rl("instancing")); + .register(IdentifierUtil.id("instancing")); /** * Use Compute shaders to cull instances. @@ -38,7 +38,7 @@ public final class Backends { } }) .supported(() -> GlCompat.SUPPORTS_INDIRECT && IndirectPrograms.allLoaded() && !ShadersModHelper.isShaderPackInUse()) - .register(ResourceUtil.rl("indirect")); + .register(IdentifierUtil.id("indirect")); private Backends() { } diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/InternalVertex.java b/common/src/backend/java/dev/engine_room/flywheel/backend/InternalVertex.java index beaab64ce..00d5496df 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/InternalVertex.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/InternalVertex.java @@ -6,10 +6,10 @@ import dev.engine_room.flywheel.api.layout.Layout; import dev.engine_room.flywheel.api.layout.LayoutBuilder; import dev.engine_room.flywheel.backend.gl.array.VertexAttribute; -import dev.engine_room.flywheel.lib.util.ResourceUtil; +import dev.engine_room.flywheel.lib.util.IdentifierUtil; import dev.engine_room.flywheel.lib.vertex.FullVertexView; import dev.engine_room.flywheel.lib.vertex.VertexView; -import net.minecraft.resources.ResourceLocation; +import net.minecraft.resources.Identifier; public final class InternalVertex { public static final Layout LAYOUT = LayoutBuilder.create() @@ -24,7 +24,7 @@ public final class InternalVertex { public static final List ATTRIBUTES = LayoutAttributes.attributes(LAYOUT); public static final int STRIDE = LAYOUT.byteSize(); - public static final ResourceLocation LAYOUT_SHADER = ResourceUtil.rl("internal/vertex_input.vert"); + public static final Identifier LAYOUT_SHADER = IdentifierUtil.id("internal/vertex_input.vert"); private InternalVertex() { } diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/MaterialShaderIndices.java b/common/src/backend/java/dev/engine_room/flywheel/backend/MaterialShaderIndices.java index 71fcbd112..cc9f12536 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/MaterialShaderIndices.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/MaterialShaderIndices.java @@ -11,7 +11,7 @@ import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap; import it.unimi.dsi.fastutil.objects.ObjectArrayList; import it.unimi.dsi.fastutil.objects.ObjectList; -import net.minecraft.resources.ResourceLocation; +import net.minecraft.resources.Identifier; public final class MaterialShaderIndices { private static final Index fogSources = new Index(); @@ -37,8 +37,8 @@ public static int cutoutIndex(CutoutShader cutoutShader) { } public static class Index { - private final Object2IntMap sources2Index; - private final ObjectList sources; + private final Object2IntMap sources2Index; + private final ObjectList sources; private Index() { this.sources2Index = new Object2IntOpenHashMap<>(); @@ -46,11 +46,11 @@ private Index() { this.sources = new ObjectArrayList<>(); } - public ResourceLocation get(int index) { + public Identifier get(int index) { return sources.get(index); } - public int index(ResourceLocation source) { + public int index(Identifier source) { var out = sources2Index.getInt(source); if (out == -1) { @@ -63,11 +63,11 @@ public int index(ResourceLocation source) { } @Unmodifiable - public List all() { + public List all() { return sources; } - private void add(ResourceLocation source) { + private void add(Identifier source) { if (sources2Index.putIfAbsent(source, sources.size()) == -1) { sources.add(source); } diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/NoiseTextures.java b/common/src/backend/java/dev/engine_room/flywheel/backend/NoiseTextures.java index ba1d66186..1885eea34 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/NoiseTextures.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/NoiseTextures.java @@ -2,6 +2,8 @@ import java.io.IOException; +import dev.engine_room.flywheel.lib.util.IdentifierUtil; + import org.jetbrains.annotations.UnknownNullability; import org.lwjgl.opengl.GL32; @@ -9,13 +11,12 @@ import com.mojang.blaze3d.systems.RenderSystem; import dev.engine_room.flywheel.backend.gl.GlTextureUnit; -import dev.engine_room.flywheel.lib.util.ResourceUtil; import net.minecraft.client.renderer.texture.DynamicTexture; -import net.minecraft.resources.ResourceLocation; +import net.minecraft.resources.Identifier; import net.minecraft.server.packs.resources.ResourceManager; public class NoiseTextures { - public static final ResourceLocation NOISE_TEXTURE = ResourceUtil.rl("textures/flywheel/noise/blue.png"); + public static final Identifier NOISE_TEXTURE = IdentifierUtil.id("textures/flywheel/noise/blue.png"); @UnknownNullability public static DynamicTexture BLUE_NOISE; diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/compile/FlwPrograms.java b/common/src/backend/java/dev/engine_room/flywheel/backend/compile/FlwPrograms.java index 2dbc6cfb8..67def8bc2 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/compile/FlwPrograms.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/compile/FlwPrograms.java @@ -8,14 +8,14 @@ import dev.engine_room.flywheel.api.Flywheel; import dev.engine_room.flywheel.backend.glsl.ShaderSources; import dev.engine_room.flywheel.backend.glsl.SourceComponent; -import dev.engine_room.flywheel.lib.util.ResourceUtil; -import net.minecraft.resources.ResourceLocation; +import dev.engine_room.flywheel.lib.util.IdentifierUtil; +import net.minecraft.resources.Identifier; import net.minecraft.server.packs.resources.ResourceManager; public final class FlwPrograms { public static final Logger LOGGER = LoggerFactory.getLogger(Flywheel.ID + "/backend/shaders"); - private static final ResourceLocation COMPONENTS_HEADER_FRAG = ResourceUtil.rl("internal/components_header.frag"); + private static final Identifier COMPONENTS_HEADER_FRAG = IdentifierUtil.id("internal/components_header.frag"); public static ShaderSources SOURCES; diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/compile/IndirectPrograms.java b/common/src/backend/java/dev/engine_room/flywheel/backend/compile/IndirectPrograms.java index d03980ed7..4526c0204 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/compile/IndirectPrograms.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/compile/IndirectPrograms.java @@ -20,19 +20,19 @@ import dev.engine_room.flywheel.backend.glsl.ShaderSources; import dev.engine_room.flywheel.backend.glsl.SourceComponent; import dev.engine_room.flywheel.backend.util.AtomicReferenceCounted; -import dev.engine_room.flywheel.lib.util.ResourceUtil; -import net.minecraft.resources.ResourceLocation; +import dev.engine_room.flywheel.lib.util.IdentifierUtil; +import net.minecraft.resources.Identifier; public class IndirectPrograms extends AtomicReferenceCounted { - private static final ResourceLocation CULL_SHADER_API_IMPL = ResourceUtil.rl("internal/indirect/cull_api_impl.glsl"); - private static final ResourceLocation CULL_SHADER_MAIN = ResourceUtil.rl("internal/indirect/cull.glsl"); - private static final ResourceLocation APPLY_SHADER_MAIN = ResourceUtil.rl("internal/indirect/apply.glsl"); - private static final ResourceLocation SCATTER_SHADER_MAIN = ResourceUtil.rl("internal/indirect/scatter.glsl"); - private static final ResourceLocation DOWNSAMPLE_FIRST = ResourceUtil.rl("internal/indirect/downsample_first.glsl"); - private static final ResourceLocation DOWNSAMPLE_SECOND = ResourceUtil.rl("internal/indirect/downsample_second.glsl"); + private static final Identifier CULL_SHADER_API_IMPL = IdentifierUtil.id("internal/indirect/cull_api_impl.glsl"); + private static final Identifier CULL_SHADER_MAIN = IdentifierUtil.id("internal/indirect/cull.glsl"); + private static final Identifier APPLY_SHADER_MAIN = IdentifierUtil.id("internal/indirect/apply.glsl"); + private static final Identifier SCATTER_SHADER_MAIN = IdentifierUtil.id("internal/indirect/scatter.glsl"); + private static final Identifier DOWNSAMPLE_FIRST = IdentifierUtil.id("internal/indirect/downsample_first.glsl"); + private static final Identifier DOWNSAMPLE_SECOND = IdentifierUtil.id("internal/indirect/downsample_second.glsl"); private static final Compile> CULL = new Compile<>(); - private static final Compile UTIL = new Compile<>(); + private static final Compile UTIL = new Compile<>(); private static final List EXTENSIONS = getExtensions(GlCompat.MAX_GLSL_VERSION); private static final List COMPUTE_EXTENSIONS = getComputeExtensions(GlCompat.MAX_GLSL_VERSION); @@ -42,10 +42,10 @@ public class IndirectPrograms extends AtomicReferenceCounted { private final PipelineCompiler pipeline; private final CompilationHarness> culling; - private final CompilationHarness utils; + private final CompilationHarness utils; private final OitPrograms oitPrograms; - private IndirectPrograms(PipelineCompiler pipeline, CompilationHarness> culling, CompilationHarness utils, OitPrograms oitPrograms) { + private IndirectPrograms(PipelineCompiler pipeline, CompilationHarness> culling, CompilationHarness utils, OitPrograms oitPrograms) { this.pipeline = pipeline; this.culling = culling; this.utils = utils; @@ -103,7 +103,7 @@ static void reload(ShaderSources sources, List vertexComponents private static CompilationHarness> createCullingCompiler(ShaderSources sources) { return CULL.program() .link(CULL.shader(GlCompat.MAX_GLSL_VERSION, ShaderType.COMPUTE) - .nameMapper(instanceType -> "culling/" + ResourceUtil.toDebugFileNameNoExtension(instanceType.cullShader())) + .nameMapper(instanceType -> "culling/" + IdentifierUtil.toDebugFileNameNoExtension(instanceType.cullShader())) .requireExtensions(COMPUTE_EXTENSIONS) .define("_FLW_SUBGROUP_SIZE", GlCompat.SUBGROUP_SIZE) .withResource(CULL_SHADER_API_IMPL) @@ -116,12 +116,12 @@ private static CompilationHarness> createCullingCompiler(ShaderS } /** - * A compiler for utility shaders, directly compiles the shader at the resource location specified by the parameter. + * A compiler for utility shaders, directly compiles the shader at the resource id specified by the parameter. */ - private static CompilationHarness createUtilCompiler(ShaderSources sources) { + private static CompilationHarness createUtilCompiler(ShaderSources sources) { return UTIL.program() .link(UTIL.shader(GlCompat.MAX_GLSL_VERSION, ShaderType.COMPUTE) - .nameMapper(resourceLocation -> "utilities/" + ResourceUtil.toDebugFileNameNoExtension(resourceLocation)) + .nameMapper(id -> "utilities/" + IdentifierUtil.toDebugFileNameNoExtension(id)) .requireExtensions(COMPUTE_EXTENSIONS) .define("_FLW_SUBGROUP_SIZE", GlCompat.SUBGROUP_SIZE) .withResource(s -> s)) diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/compile/OitPrograms.java b/common/src/backend/java/dev/engine_room/flywheel/backend/compile/OitPrograms.java index 3b55448eb..4ac78e7ea 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/compile/OitPrograms.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/compile/OitPrograms.java @@ -10,19 +10,19 @@ import dev.engine_room.flywheel.backend.gl.shader.ShaderType; import dev.engine_room.flywheel.backend.glsl.GlslVersion; import dev.engine_room.flywheel.backend.glsl.ShaderSources; -import dev.engine_room.flywheel.lib.util.ResourceUtil; -import net.minecraft.resources.ResourceLocation; +import dev.engine_room.flywheel.lib.util.IdentifierUtil; +import net.minecraft.resources.Identifier; public class OitPrograms { - private static final ResourceLocation FULLSCREEN = ResourceUtil.rl("internal/fullscreen.vert"); - static final ResourceLocation OIT_COMPOSITE = ResourceUtil.rl("internal/oit_composite.frag"); - static final ResourceLocation OIT_DEPTH = ResourceUtil.rl("internal/oit_depth.frag"); + private static final Identifier FULLSCREEN = IdentifierUtil.id("internal/fullscreen.vert"); + static final Identifier OIT_COMPOSITE = IdentifierUtil.id("internal/oit_composite.frag"); + static final Identifier OIT_DEPTH = IdentifierUtil.id("internal/oit_depth.frag"); - private static final Compile COMPILE = new Compile<>(); + private static final Compile COMPILE = new Compile<>(); - private final CompilationHarness harness; + private final CompilationHarness harness; - public OitPrograms(CompilationHarness harness) { + public OitPrograms(CompilationHarness harness) { this.harness = harness; } @@ -32,7 +32,7 @@ public static OitPrograms createFullscreenCompiler(ShaderSources sources) { .nameMapper($ -> "fullscreen/fullscreen") .withResource(FULLSCREEN)) .link(COMPILE.shader(GlCompat.MAX_GLSL_VERSION, ShaderType.FRAGMENT) - .nameMapper(rl -> "fullscreen/" + ResourceUtil.toDebugFileNameNoExtension(rl)) + .nameMapper(rl -> "fullscreen/" + IdentifierUtil.toDebugFileNameNoExtension(rl)) .onCompile((rl, compilation) -> { if (GlCompat.MAX_GLSL_VERSION.compareTo(GlslVersion.V400) < 0) { // Need to define FMA for the wavelet calculations diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/compile/Pipeline.java b/common/src/backend/java/dev/engine_room/flywheel/backend/compile/Pipeline.java index 92a11c4b4..849e1bad6 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/compile/Pipeline.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/compile/Pipeline.java @@ -9,9 +9,9 @@ import dev.engine_room.flywheel.api.instance.InstanceType; import dev.engine_room.flywheel.backend.gl.shader.GlProgram; import dev.engine_room.flywheel.backend.glsl.SourceComponent; -import net.minecraft.resources.ResourceLocation; +import net.minecraft.resources.Identifier; -public record Pipeline(ResourceLocation vertexMain, ResourceLocation fragmentMain, +public record Pipeline(Identifier vertexMain, Identifier fragmentMain, InstanceAssembler assembler, String compilerMarker, Consumer onLink) { @FunctionalInterface @@ -30,9 +30,9 @@ public static Builder builder() { public static class Builder { @Nullable - private ResourceLocation vertexMain; + private Identifier vertexMain; @Nullable - private ResourceLocation fragmentMain; + private Identifier fragmentMain; @Nullable private InstanceAssembler assembler; @Nullable @@ -40,12 +40,12 @@ public static class Builder { @Nullable private Consumer onLink; - public Builder vertexMain(ResourceLocation shader) { + public Builder vertexMain(Identifier shader) { this.vertexMain = shader; return this; } - public Builder fragmentMain(ResourceLocation shader) { + public Builder fragmentMain(Identifier shader) { this.fragmentMain = shader; return this; } diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/compile/PipelineCompiler.java b/common/src/backend/java/dev/engine_room/flywheel/backend/compile/PipelineCompiler.java index 7a73c4425..7900dffaf 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/compile/PipelineCompiler.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/compile/PipelineCompiler.java @@ -29,8 +29,8 @@ import dev.engine_room.flywheel.backend.glsl.generate.FnSignature; import dev.engine_room.flywheel.backend.glsl.generate.GlslExpr; import dev.engine_room.flywheel.lib.material.CutoutShaders; -import dev.engine_room.flywheel.lib.util.ResourceUtil; -import net.minecraft.resources.ResourceLocation; +import dev.engine_room.flywheel.lib.util.IdentifierUtil; +import net.minecraft.resources.Identifier; public final class PipelineCompiler { private static final Set ALL = Collections.newSetFromMap(new WeakHashMap<>()); @@ -40,8 +40,8 @@ public final class PipelineCompiler { private static UberShaderComponent FOG; private static UberShaderComponent CUTOUT; - private static final ResourceLocation API_IMPL_VERT = ResourceUtil.rl("internal/api_impl.vert"); - private static final ResourceLocation API_IMPL_FRAG = ResourceUtil.rl("internal/api_impl.frag"); + private static final Identifier API_IMPL_VERT = IdentifierUtil.id("internal/api_impl.vert"); + private static final Identifier API_IMPL_FRAG = IdentifierUtil.id("internal/api_impl.frag"); private final CompilationHarness harness; @@ -85,10 +85,10 @@ static PipelineCompiler create(ShaderSources sources, Pipeline pipeline, List { - var instance = ResourceUtil.toDebugFileNameNoExtension(key.instanceType() + var instance = IdentifierUtil.toDebugFileNameNoExtension(key.instanceType() .vertexShader()); - var material = ResourceUtil.toDebugFileNameNoExtension(key.materialShaders() + var material = IdentifierUtil.toDebugFileNameNoExtension(key.materialShaders() .vertexSource()); var context = key.contextShader() .nameLowerCase(); @@ -127,10 +127,10 @@ static PipelineCompiler create(ShaderSources sources, Pipeline pipeline, List { program.setSamplerBinding("_flw_instances", Samplers.INSTANCE_BUFFER); @@ -20,8 +20,8 @@ public final class Pipelines { public static final Pipeline INDIRECT = Pipeline.builder() .compilerMarker("indirect") - .vertexMain(ResourceUtil.rl("internal/indirect/main.vert")) - .fragmentMain(ResourceUtil.rl("internal/indirect/main.frag")) + .vertexMain(IdentifierUtil.id("internal/indirect/main.vert")) + .fragmentMain(IdentifierUtil.id("internal/indirect/main.frag")) .assembler(SsboInstanceComponent::new) .onLink($ -> { }) diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/compile/component/BufferTextureInstanceComponent.java b/common/src/backend/java/dev/engine_room/flywheel/backend/compile/component/BufferTextureInstanceComponent.java index aa421e13f..ac309eff6 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/compile/component/BufferTextureInstanceComponent.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/compile/component/BufferTextureInstanceComponent.java @@ -10,7 +10,7 @@ import dev.engine_room.flywheel.backend.glsl.generate.GlslExpr; import dev.engine_room.flywheel.backend.glsl.generate.GlslStmt; import dev.engine_room.flywheel.lib.math.MoreMath; -import dev.engine_room.flywheel.lib.util.ResourceUtil; +import dev.engine_room.flywheel.lib.util.IdentifierUtil; public class BufferTextureInstanceComponent extends InstanceAssemblerComponent { private static final String[] SWIZZLE_SELECTORS = { "x", "y", "z", "w" }; @@ -21,7 +21,7 @@ public BufferTextureInstanceComponent(InstanceType type) { @Override public String name() { - return ResourceUtil.rl("buffer_texture_instance_assembler").toString(); + return IdentifierUtil.id("buffer_texture_instance_assembler").toString(); } @Override diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/compile/component/InstanceStructComponent.java b/common/src/backend/java/dev/engine_room/flywheel/backend/compile/component/InstanceStructComponent.java index ac743e578..e3fb3083f 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/compile/component/InstanceStructComponent.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/compile/component/InstanceStructComponent.java @@ -8,7 +8,7 @@ import dev.engine_room.flywheel.backend.compile.LayoutInterpreter; import dev.engine_room.flywheel.backend.glsl.SourceComponent; import dev.engine_room.flywheel.backend.glsl.generate.GlslBuilder; -import dev.engine_room.flywheel.lib.util.ResourceUtil; +import dev.engine_room.flywheel.lib.util.IdentifierUtil; public class InstanceStructComponent implements SourceComponent { private static final String STRUCT_NAME = "FlwInstance"; @@ -21,7 +21,7 @@ public InstanceStructComponent(InstanceType type) { @Override public String name() { - return ResourceUtil.rl("instance_struct").toString(); + return IdentifierUtil.id("instance_struct").toString(); } @Override diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/compile/component/SsboInstanceComponent.java b/common/src/backend/java/dev/engine_room/flywheel/backend/compile/component/SsboInstanceComponent.java index 1151343db..b0492e17a 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/compile/component/SsboInstanceComponent.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/compile/component/SsboInstanceComponent.java @@ -11,7 +11,7 @@ import dev.engine_room.flywheel.backend.glsl.generate.GlslExpr; import dev.engine_room.flywheel.backend.glsl.generate.GlslStmt; import dev.engine_room.flywheel.lib.math.MoreMath; -import dev.engine_room.flywheel.lib.util.ResourceUtil; +import dev.engine_room.flywheel.lib.util.IdentifierUtil; public class SsboInstanceComponent extends InstanceAssemblerComponent { public SsboInstanceComponent(InstanceType type) { @@ -20,7 +20,7 @@ public SsboInstanceComponent(InstanceType type) { @Override public String name() { - return ResourceUtil.rl("ssbo_instance_assembler").toString(); + return IdentifierUtil.id("ssbo_instance_assembler").toString(); } @Override diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/compile/component/StringSubstitutionComponent.java b/common/src/backend/java/dev/engine_room/flywheel/backend/compile/component/StringSubstitutionComponent.java index 1960c283b..3e9b87d38 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/compile/component/StringSubstitutionComponent.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/compile/component/StringSubstitutionComponent.java @@ -4,7 +4,7 @@ import java.util.Map; import dev.engine_room.flywheel.backend.glsl.SourceComponent; -import dev.engine_room.flywheel.lib.util.ResourceUtil; +import dev.engine_room.flywheel.lib.util.IdentifierUtil; public final class StringSubstitutionComponent implements SourceComponent { private final SourceComponent source; @@ -42,7 +42,7 @@ public String source() { @Override public String name() { - return ResourceUtil.rl("string_substitution").toString() + " / " + source.name(); + return IdentifierUtil.id("string_substitution").toString() + " / " + source.name(); } @Override diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/compile/component/UberShaderComponent.java b/common/src/backend/java/dev/engine_room/flywheel/backend/compile/component/UberShaderComponent.java index f98aebd10..e58589e22 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/compile/component/UberShaderComponent.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/compile/component/UberShaderComponent.java @@ -18,29 +18,29 @@ import dev.engine_room.flywheel.backend.glsl.generate.GlslBuilder; import dev.engine_room.flywheel.backend.glsl.generate.GlslExpr; import dev.engine_room.flywheel.backend.glsl.generate.GlslSwitch; -import dev.engine_room.flywheel.lib.util.ResourceUtil; -import net.minecraft.resources.ResourceLocation; +import dev.engine_room.flywheel.lib.util.IdentifierUtil; +import net.minecraft.resources.Identifier; public class UberShaderComponent implements SourceComponent { - private final ResourceLocation name; + private final Identifier name; private final GlslExpr switchArg; private final List functionsToAdapt; private final List adaptedComponents; - private UberShaderComponent(ResourceLocation name, GlslExpr switchArg, List functionsToAdapt, List adaptedComponents) { + private UberShaderComponent(Identifier name, GlslExpr switchArg, List functionsToAdapt, List adaptedComponents) { this.name = name; this.switchArg = switchArg; this.functionsToAdapt = functionsToAdapt; this.adaptedComponents = adaptedComponents; } - public static Builder builder(ResourceLocation name) { + public static Builder builder(Identifier name) { return new Builder(name); } @Override public String name() { - return ResourceUtil.rl("uber_shader").toString() + " / " + name; + return IdentifierUtil.id("uber_shader").toString() + " / " + name; } @Override @@ -106,17 +106,17 @@ private record AdaptedFn(FnSignature signature, @Nullable GlslExpr defaultReturn } public static class Builder { - private final ResourceLocation name; - private final List materialSources = new ArrayList<>(); + private final Identifier name; + private final List materialSources = new ArrayList<>(); private final List adaptedFunctions = new ArrayList<>(); @Nullable private GlslExpr switchArg; - public Builder(ResourceLocation name) { + public Builder(Identifier name) { this.name = name; } - public Builder materialSources(List sources) { + public Builder materialSources(List sources) { this.materialSources.addAll(sources); return this; } diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/compile/core/Compile.java b/common/src/backend/java/dev/engine_room/flywheel/backend/compile/core/Compile.java index 28ae49964..58d1e3345 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/compile/core/Compile.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/compile/core/Compile.java @@ -18,7 +18,7 @@ import dev.engine_room.flywheel.backend.glsl.ShaderSources; import dev.engine_room.flywheel.backend.glsl.SourceComponent; import dev.engine_room.flywheel.lib.util.StringUtil; -import net.minecraft.resources.ResourceLocation; +import net.minecraft.resources.Identifier; /** * A typed provider for shader compiler builders. @@ -75,12 +75,12 @@ public ShaderCompiler withComponent(Function sourceFetche return with((key, $) -> sourceFetcher.apply(key)); } - public ShaderCompiler withResource(Function sourceFetcher) { + public ShaderCompiler withResource(Function sourceFetcher) { return with((key, loader) -> loader.get(sourceFetcher.apply(key))); } - public ShaderCompiler withResource(ResourceLocation resourceLocation) { - return withResource($ -> resourceLocation); + public ShaderCompiler withResource(Identifier id) { + return withResource($ -> id); } public ShaderCompiler onCompile(BiConsumer cb) { diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/compile/core/FailedCompilation.java b/common/src/backend/java/dev/engine_room/flywheel/backend/compile/core/FailedCompilation.java index 20f3b3012..5b119f906 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/compile/core/FailedCompilation.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/compile/core/FailedCompilation.java @@ -16,12 +16,12 @@ import dev.engine_room.flywheel.backend.glsl.error.ErrorBuilder; import dev.engine_room.flywheel.backend.glsl.error.ErrorLevel; import dev.engine_room.flywheel.backend.glsl.span.Span; -import dev.engine_room.flywheel.lib.util.ResourceUtil; +import dev.engine_room.flywheel.lib.util.IdentifierUtil; import dev.engine_room.flywheel.lib.util.StringUtil; -import net.minecraft.resources.ResourceLocation; +import net.minecraft.resources.Identifier; public class FailedCompilation { - public static final ResourceLocation GENERATED_SOURCE_NAME = ResourceUtil.rl("generated_source"); + public static final Identifier GENERATED_SOURCE_NAME = IdentifierUtil.id("generated_source"); private static final Pattern PATTERN_ONE = Pattern.compile("(\\d+)\\((\\d+)\\) : (.*)"); private static final Pattern PATTERN_TWO = Pattern.compile("(\\w+): (\\d+):(\\d+):(?: '(.+?)' :)?(.*)"); private final List files; diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/engine/TextureBinder.java b/common/src/backend/java/dev/engine_room/flywheel/backend/engine/TextureBinder.java index 5d5f48da2..805505ab9 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/engine/TextureBinder.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/engine/TextureBinder.java @@ -4,11 +4,11 @@ import dev.engine_room.flywheel.backend.Samplers; import net.minecraft.client.Minecraft; -import net.minecraft.resources.ResourceLocation; +import net.minecraft.resources.Identifier; public class TextureBinder { - public static void bind(ResourceLocation resourceLocation) { - RenderSystem.bindTexture(byName(resourceLocation)); + public static void bind(Identifier id) { + RenderSystem.bindTexture(byName(id)); } public static void bindLightAndOverlay() { @@ -35,12 +35,12 @@ public static void resetLightAndOverlay() { } /** - * Get a built-in texture by its resource location. + * Get a built-in texture by its resource id. * - * @param texture The texture's resource location. + * @param texture The texture's resource id. * @return The texture. */ - public static int byName(ResourceLocation texture) { + public static int byName(Identifier texture) { return Minecraft.getInstance() .getTextureManager() .getTexture(texture) diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/glsl/LoadError.java b/common/src/backend/java/dev/engine_room/flywheel/backend/glsl/LoadError.java index 5d4347ad4..c56189ed3 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/glsl/LoadError.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/glsl/LoadError.java @@ -9,17 +9,17 @@ import dev.engine_room.flywheel.backend.glsl.error.ErrorBuilder; import dev.engine_room.flywheel.backend.glsl.span.Span; -import net.minecraft.ResourceLocationException; -import net.minecraft.resources.ResourceLocation; +import net.minecraft.IdentifierException; +import net.minecraft.resources.Identifier; sealed public interface LoadError { ErrorBuilder generateMessage(); - record CircularDependency(ResourceLocation offender, List stack) implements LoadError { + record CircularDependency(Identifier offender, List stack) implements LoadError { public String format() { return stack.stream() - .dropWhile(l -> !l.equals(offender)) - .map(ResourceLocation::toString) + .dropWhile(id -> !id.equals(offender)) + .map(Identifier::toString) .collect(Collectors.joining(" -> ")); } @@ -31,12 +31,12 @@ public ErrorBuilder generateMessage() { } } - record IncludeError(ResourceLocation location, List> innerErrors) implements LoadError { + record IncludeError(Identifier id, List> innerErrors) implements LoadError { @Override public ErrorBuilder generateMessage() { var out = ErrorBuilder.create() - .error("could not load \"" + location + "\"") - .pointAtFile(location); + .error("could not load \"" + id + "\"") + .pointAtFile(id); for (var innerError : innerErrors) { var err = innerError.getSecond() @@ -49,29 +49,29 @@ public ErrorBuilder generateMessage() { } } - record IOError(ResourceLocation location, IOException exception) implements LoadError { + record IOError(Identifier id, IOException exception) implements LoadError { @Override public ErrorBuilder generateMessage() { if (exception instanceof FileNotFoundException) { return ErrorBuilder.create() - .error("\"" + location + "\" was not found"); + .error("\"" + id + "\" was not found"); } else { return ErrorBuilder.create() - .error("could not load \"" + location + "\" due to an IO error") + .error("could not load \"" + id + "\" due to an IO error") .note(exception.toString()); } } } - record ResourceError(ResourceLocation location) implements LoadError { + record ResourceError(Identifier id) implements LoadError { @Override public ErrorBuilder generateMessage() { return ErrorBuilder.create() - .error("\"" + location + "\" was not found"); + .error("\"" + id + "\" was not found"); } } - record MalformedInclude(ResourceLocationException exception) implements LoadError { + record MalformedInclude(IdentifierException exception) implements LoadError { @Override public ErrorBuilder generateMessage() { return ErrorBuilder.create() diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/glsl/ShaderSources.java b/common/src/backend/java/dev/engine_room/flywheel/backend/glsl/ShaderSources.java index 3a7274cfa..8c7bf7fbe 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/glsl/ShaderSources.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/glsl/ShaderSources.java @@ -13,7 +13,7 @@ import dev.engine_room.flywheel.backend.compile.FlwPrograms; import dev.engine_room.flywheel.lib.util.StringUtil; -import net.minecraft.resources.ResourceLocation; +import net.minecraft.resources.Identifier; import net.minecraft.server.packs.resources.Resource; import net.minecraft.server.packs.resources.ResourceManager; @@ -24,7 +24,7 @@ public class ShaderSources { public static final String SHADER_DIR = "flywheel/"; @VisibleForTesting - protected final Map cache; + protected final Map cache; public ShaderSources(ResourceManager manager) { var sourceFinder = new SourceFinder(manager); @@ -40,82 +40,82 @@ public ShaderSources(ResourceManager manager) { this.cache = sourceFinder.results; } - private static ResourceLocation locationWithoutFlywheelPrefix(ResourceLocation loc) { - return ResourceLocation.fromNamespaceAndPath(loc.getNamespace(), loc.getPath() + private static Identifier locationWithoutFlywheelPrefix(Identifier id) { + return Identifier.fromNamespaceAndPath(id.getNamespace(), id.getPath() .substring(SHADER_DIR.length())); } - public LoadResult find(ResourceLocation location) { - return cache.computeIfAbsent(location, loc -> new LoadResult.Failure(new LoadError.ResourceError(loc))); + public LoadResult find(Identifier id) { + return cache.computeIfAbsent(id, loc -> new LoadResult.Failure(new LoadError.ResourceError(loc))); } - public SourceFile get(ResourceLocation location) { - return find(location).unwrap(); + public SourceFile get(Identifier id) { + return find(id).unwrap(); } - private static boolean isShader(ResourceLocation loc) { - var path = loc.getPath(); + private static boolean isShader(Identifier id) { + var path = id.getPath(); return path.endsWith(".glsl") || path.endsWith(".vert") || path.endsWith(".frag") || path.endsWith(".comp"); } private static class SourceFinder { - private final Deque findStack = new ArrayDeque<>(); - private final Map results = new HashMap<>(); + private final Deque findStack = new ArrayDeque<>(); + private final Map results = new HashMap<>(); private final ResourceManager manager; public SourceFinder(ResourceManager manager) { this.manager = manager; } - public void rootLoad(ResourceLocation loc, Resource resource) { - var strippedLoc = locationWithoutFlywheelPrefix(loc); + public void rootLoad(Identifier id, Resource resource) { + var strippedId = locationWithoutFlywheelPrefix(id); - if (results.containsKey(strippedLoc)) { + if (results.containsKey(strippedId)) { // Some other source already #included this one. return; } - this.results.put(strippedLoc, readResource(strippedLoc, resource)); + this.results.put(strippedId, readResource(strippedId, resource)); } - public LoadResult recursiveLoad(ResourceLocation location) { - if (findStack.contains(location)) { - // Make a copy of the find stack with the offending location added on top to show the full path. - findStack.addLast(location); + public LoadResult recursiveLoad(Identifier id) { + if (findStack.contains(id)) { + // Make a copy of the find stack with the offending id added on top to show the full path. + findStack.addLast(id); var copy = List.copyOf(findStack); findStack.removeLast(); - return new LoadResult.Failure(new LoadError.CircularDependency(location, copy)); + return new LoadResult.Failure(new LoadError.CircularDependency(id, copy)); } - findStack.addLast(location); + findStack.addLast(id); - LoadResult out = _find(location); + LoadResult out = _find(id); findStack.removeLast(); return out; } - private LoadResult _find(ResourceLocation location) { + private LoadResult _find(Identifier id) { // Can't use computeIfAbsent because mutual recursion causes ConcurrentModificationExceptions - var out = results.get(location); + var out = results.get(id); if (out == null) { - out = load(location); - results.put(location, out); + out = load(id); + results.put(id, out); } return out; } - private LoadResult load(ResourceLocation loc) { - return manager.getResource(loc.withPrefix(SHADER_DIR)) - .map(resource -> readResource(loc, resource)) - .orElseGet(() -> new LoadResult.Failure(new LoadError.ResourceError(loc))); + private LoadResult load(Identifier id) { + return manager.getResource(id.withPrefix(SHADER_DIR)) + .map(resource -> readResource(id, resource)) + .orElseGet(() -> new LoadResult.Failure(new LoadError.ResourceError(id))); } - private LoadResult readResource(ResourceLocation loc, Resource resource) { + private LoadResult readResource(Identifier id, Resource resource) { try (InputStream stream = resource.open()) { String sourceString = new String(stream.readAllBytes(), StandardCharsets.UTF_8); - return SourceFile.parse(this::recursiveLoad, loc, sourceString); + return SourceFile.parse(this::recursiveLoad, id, sourceString); } catch (IOException e) { - return new LoadResult.Failure(new LoadError.IOError(loc, e)); + return new LoadResult.Failure(new LoadError.IOError(id, e)); } } } diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/glsl/SourceFile.java b/common/src/backend/java/dev/engine_room/flywheel/backend/glsl/SourceFile.java index 8a2241d76..ae75be6c5 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/glsl/SourceFile.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/glsl/SourceFile.java @@ -14,9 +14,9 @@ import dev.engine_room.flywheel.backend.glsl.span.Span; import dev.engine_room.flywheel.backend.glsl.span.StringSpan; -import dev.engine_room.flywheel.lib.util.ResourceUtil; -import net.minecraft.ResourceLocationException; -import net.minecraft.resources.ResourceLocation; +import dev.engine_room.flywheel.lib.util.IdentifierUtil; +import net.minecraft.IdentifierException; +import net.minecraft.resources.Identifier; /** * Immutable class representing a shader file. @@ -26,7 +26,7 @@ *

*/ public class SourceFile implements SourceComponent { - public final ResourceLocation name; + public final Identifier name; public final SourceLines source; @@ -39,7 +39,7 @@ public class SourceFile implements SourceComponent { public final String finalSource; - private SourceFile(ResourceLocation name, SourceLines source, ImmutableList imports, List included, String finalSource) { + private SourceFile(Identifier name, SourceLines source, ImmutableList imports, List included, String finalSource) { this.name = name; this.source = source; this.imports = imports; @@ -47,11 +47,11 @@ private SourceFile(ResourceLocation name, SourceLines source, ImmutableList sourceFinder, ResourceLocation name, String stringSource) { + public static LoadResult parse(Function sourceFinder, Identifier name, String stringSource) { var source = new SourceLines(name, stringSource); var imports = Import.parseImports(source); @@ -67,15 +67,15 @@ public static LoadResult parse(Function sourceFind continue; } - ResourceLocation location; + Identifier id; try { - location = ResourceUtil.parseFlywheelDefault(string); - } catch (ResourceLocationException e) { + id = IdentifierUtil.parseFlywheelDefault(string); + } catch (IdentifierException e) { failures.add(Pair.of(fileSpan, new LoadError.MalformedInclude(e))); continue; } - var result = sourceFinder.apply(location); + var result = sourceFinder.apply(id); if (result instanceof LoadResult.Success s) { included.add(s.unwrap()); diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/glsl/SourceLines.java b/common/src/backend/java/dev/engine_room/flywheel/backend/glsl/SourceLines.java index 934c40865..21993cb88 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/glsl/SourceLines.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/glsl/SourceLines.java @@ -9,12 +9,12 @@ import it.unimi.dsi.fastutil.ints.IntArrayList; import it.unimi.dsi.fastutil.ints.IntList; import it.unimi.dsi.fastutil.ints.IntLists; -import net.minecraft.resources.ResourceLocation; +import net.minecraft.resources.Identifier; public class SourceLines implements CharSequence { private static final Pattern NEW_LINE = Pattern.compile("(\\r\\n|\\r|\\n)"); - public final ResourceLocation name; + public final Identifier name; /** * 0-indexed line to char pos mapping. */ @@ -26,7 +26,7 @@ public class SourceLines implements CharSequence { private final ImmutableList lines; public final String raw; - public SourceLines(ResourceLocation name, String raw) { + public SourceLines(Identifier name, String raw) { this.name = name; this.raw = raw; this.lineStarts = createLineLookup(raw); diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/glsl/error/ErrorBuilder.java b/common/src/backend/java/dev/engine_room/flywheel/backend/glsl/error/ErrorBuilder.java index b23a05954..971709e12 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/glsl/error/ErrorBuilder.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/glsl/error/ErrorBuilder.java @@ -19,7 +19,7 @@ import dev.engine_room.flywheel.backend.glsl.error.lines.TextLine; import dev.engine_room.flywheel.backend.glsl.span.Span; import dev.engine_room.flywheel.lib.util.StringUtil; -import net.minecraft.resources.ResourceLocation; +import net.minecraft.resources.Identifier; public class ErrorBuilder { // set to false for testing @@ -69,7 +69,7 @@ public ErrorBuilder pointAtFile(SourceLines source) { return pointAtFile(source.name); } - public ErrorBuilder pointAtFile(ResourceLocation file) { + public ErrorBuilder pointAtFile(Identifier file) { return pointAtFile(file.toString()); } diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/glsl/generate/GlslVertexInput.java b/common/src/backend/java/dev/engine_room/flywheel/backend/glsl/generate/GlslVertexInput.java index 9763026b4..1c54f01ad 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/glsl/generate/GlslVertexInput.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/glsl/generate/GlslVertexInput.java @@ -22,6 +22,6 @@ public GlslVertexInput name(String name) { @Override public String prettyPrint() { - return "layout(location = " + binding + ") in " + type + " " + name + ";"; + return "layout(id = " + binding + ") in " + type + " " + name + ";"; } } diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/glsl/span/ErrorSpan.java b/common/src/backend/java/dev/engine_room/flywheel/backend/glsl/span/ErrorSpan.java index b975bb2ac..de4bd9a0e 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/glsl/span/ErrorSpan.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/glsl/span/ErrorSpan.java @@ -20,7 +20,7 @@ public ErrorSpan(SourceLines in, CharPos start, CharPos end) { @Override public Span subSpan(int from, int to) { - return new ErrorSpan(in, start, end); // the sub-span of an error is an error in the same location + return new ErrorSpan(in, start, end); // the sub-span of an error is an error in the same id } @Override diff --git a/common/src/lib/java/dev/engine_room/flywheel/lib/backend/SimpleBackend.java b/common/src/lib/java/dev/engine_room/flywheel/lib/backend/SimpleBackend.java index f7da878c7..8e51162ed 100644 --- a/common/src/lib/java/dev/engine_room/flywheel/lib/backend/SimpleBackend.java +++ b/common/src/lib/java/dev/engine_room/flywheel/lib/backend/SimpleBackend.java @@ -9,7 +9,7 @@ import dev.engine_room.flywheel.api.backend.Backend; import dev.engine_room.flywheel.api.backend.Engine; -import net.minecraft.resources.ResourceLocation; +import net.minecraft.resources.Identifier; import net.minecraft.world.level.LevelAccessor; public final class SimpleBackend implements Backend { @@ -68,7 +68,7 @@ public Builder supported(BooleanSupplier isSupported) { return this; } - public Backend register(ResourceLocation id) { + public Backend register(Identifier id) { Objects.requireNonNull(engineFactory); Objects.requireNonNull(isSupported); diff --git a/common/src/lib/java/dev/engine_room/flywheel/lib/instance/InstanceTypes.java b/common/src/lib/java/dev/engine_room/flywheel/lib/instance/InstanceTypes.java index 9e9152e1a..e93c0ccf6 100644 --- a/common/src/lib/java/dev/engine_room/flywheel/lib/instance/InstanceTypes.java +++ b/common/src/lib/java/dev/engine_room/flywheel/lib/instance/InstanceTypes.java @@ -1,5 +1,7 @@ package dev.engine_room.flywheel.lib.instance; +import dev.engine_room.flywheel.lib.util.IdentifierUtil; + import org.lwjgl.system.MemoryUtil; import dev.engine_room.flywheel.api.instance.InstanceType; @@ -7,7 +9,6 @@ import dev.engine_room.flywheel.api.layout.IntegerRepr; import dev.engine_room.flywheel.api.layout.LayoutBuilder; import dev.engine_room.flywheel.lib.util.ExtraMemoryOps; -import dev.engine_room.flywheel.lib.util.ResourceUtil; public final class InstanceTypes { public static final InstanceType TRANSFORMED = SimpleInstanceType.builder(TransformedInstance::new) @@ -26,8 +27,8 @@ public final class InstanceTypes { ExtraMemoryOps.put2x16(ptr + 8, instance.light); ExtraMemoryOps.putMatrix4f(ptr + 12, instance.pose); }) - .vertexShader(ResourceUtil.rl("instance/transformed.vert")) - .cullShader(ResourceUtil.rl("instance/cull/transformed.glsl")) + .vertexShader(IdentifierUtil.id("instance/transformed.vert")) + .cullShader(IdentifierUtil.id("instance/cull/transformed.glsl")) .build(); public static final InstanceType POSED = SimpleInstanceType.builder(PosedInstance::new) @@ -48,8 +49,8 @@ public final class InstanceTypes { ExtraMemoryOps.putMatrix4f(ptr + 12, instance.pose); ExtraMemoryOps.putMatrix3f(ptr + 76, instance.normal); }) - .vertexShader(ResourceUtil.rl("instance/posed.vert")) - .cullShader(ResourceUtil.rl("instance/cull/posed.glsl")) + .vertexShader(IdentifierUtil.id("instance/posed.vert")) + .cullShader(IdentifierUtil.id("instance/cull/posed.glsl")) .build(); public static final InstanceType ORIENTED = SimpleInstanceType.builder(OrientedInstance::new) @@ -76,8 +77,8 @@ public final class InstanceTypes { MemoryUtil.memPutFloat(ptr + 32, instance.pivotZ); ExtraMemoryOps.putQuaternionf(ptr + 36, instance.rotation); }) - .vertexShader(ResourceUtil.rl("instance/oriented.vert")) - .cullShader(ResourceUtil.rl("instance/cull/oriented.glsl")) + .vertexShader(IdentifierUtil.id("instance/oriented.vert")) + .cullShader(IdentifierUtil.id("instance/cull/oriented.glsl")) .build(); public static final InstanceType SHADOW = SimpleInstanceType.builder(ShadowInstance::new) @@ -99,8 +100,8 @@ public final class InstanceTypes { MemoryUtil.memPutFloat(ptr + 28, instance.alpha); MemoryUtil.memPutFloat(ptr + 32, instance.radius); }) - .vertexShader(ResourceUtil.rl("instance/shadow.vert")) - .cullShader(ResourceUtil.rl("instance/cull/shadow.glsl")) + .vertexShader(IdentifierUtil.id("instance/shadow.vert")) + .cullShader(IdentifierUtil.id("instance/cull/shadow.glsl")) .build(); private InstanceTypes() { diff --git a/common/src/lib/java/dev/engine_room/flywheel/lib/instance/SimpleInstanceType.java b/common/src/lib/java/dev/engine_room/flywheel/lib/instance/SimpleInstanceType.java index 81b14082e..57000303c 100644 --- a/common/src/lib/java/dev/engine_room/flywheel/lib/instance/SimpleInstanceType.java +++ b/common/src/lib/java/dev/engine_room/flywheel/lib/instance/SimpleInstanceType.java @@ -7,16 +7,16 @@ import dev.engine_room.flywheel.api.instance.InstanceType; import dev.engine_room.flywheel.api.instance.InstanceWriter; import dev.engine_room.flywheel.api.layout.Layout; -import net.minecraft.resources.ResourceLocation; +import net.minecraft.resources.Identifier; public final class SimpleInstanceType implements InstanceType { private final Factory factory; private final Layout layout; private final InstanceWriter writer; - private final ResourceLocation vertexShader; - private final ResourceLocation cullShader; + private final Identifier vertexShader; + private final Identifier cullShader; - public SimpleInstanceType(Factory factory, Layout layout, InstanceWriter writer, ResourceLocation vertexShader, ResourceLocation cullShader) { + public SimpleInstanceType(Factory factory, Layout layout, InstanceWriter writer, Identifier vertexShader, Identifier cullShader) { this.factory = factory; this.layout = layout; this.writer = writer; @@ -44,12 +44,12 @@ public InstanceWriter writer() { } @Override - public ResourceLocation vertexShader() { + public Identifier vertexShader() { return vertexShader; } @Override - public ResourceLocation cullShader() { + public Identifier cullShader() { return cullShader; } @@ -62,8 +62,8 @@ public static final class Builder { private final Factory factory; private Layout layout; private InstanceWriter writer; - private ResourceLocation vertexShader; - private ResourceLocation cullShader; + private Identifier vertexShader; + private Identifier cullShader; public Builder(Factory factory) { this.factory = factory; @@ -79,12 +79,12 @@ public Builder writer(InstanceWriter writer) { return this; } - public Builder vertexShader(ResourceLocation vertexShader) { + public Builder vertexShader(Identifier vertexShader) { this.vertexShader = vertexShader; return this; } - public Builder cullShader(ResourceLocation cullShader) { + public Builder cullShader(Identifier cullShader) { this.cullShader = cullShader; return this; } diff --git a/common/src/lib/java/dev/engine_room/flywheel/lib/internal/FlwLibXplat.java b/common/src/lib/java/dev/engine_room/flywheel/lib/internal/FlwLibXplat.java index bcc74eef9..ac363b090 100644 --- a/common/src/lib/java/dev/engine_room/flywheel/lib/internal/FlwLibXplat.java +++ b/common/src/lib/java/dev/engine_room/flywheel/lib/internal/FlwLibXplat.java @@ -1,20 +1,20 @@ package dev.engine_room.flywheel.lib.internal; +import net.minecraft.resources.Identifier; + import org.jetbrains.annotations.UnknownNullability; import dev.engine_room.flywheel.api.internal.DependencyInjection; import dev.engine_room.flywheel.lib.model.SimpleModel; import dev.engine_room.flywheel.lib.model.baked.BakedModelBuilder; import dev.engine_room.flywheel.lib.model.baked.BlockModelBuilder; -import net.minecraft.client.resources.model.BakedModel; import net.minecraft.client.resources.model.ModelManager; -import net.minecraft.resources.ResourceLocation; public interface FlwLibXplat { FlwLibXplat INSTANCE = DependencyInjection.load(FlwLibXplat.class, "dev.engine_room.flywheel.impl.FlwLibXplatImpl"); @UnknownNullability - BakedModel getBakedModel(ModelManager modelManager, ResourceLocation location); + BakedModel getBakedModel(ModelManager modelManager, Identifier location); SimpleModel buildBakedModelBuilder(BakedModelBuilder builder); diff --git a/common/src/lib/java/dev/engine_room/flywheel/lib/material/CutoutShaders.java b/common/src/lib/java/dev/engine_room/flywheel/lib/material/CutoutShaders.java index 0b107c39c..b7213ceff 100644 --- a/common/src/lib/java/dev/engine_room/flywheel/lib/material/CutoutShaders.java +++ b/common/src/lib/java/dev/engine_room/flywheel/lib/material/CutoutShaders.java @@ -1,25 +1,25 @@ package dev.engine_room.flywheel.lib.material; import dev.engine_room.flywheel.api.material.CutoutShader; -import dev.engine_room.flywheel.lib.util.ResourceUtil; +import dev.engine_room.flywheel.lib.util.IdentifierUtil; public final class CutoutShaders { /** * Do not discard any fragments based on alpha. */ - public static final CutoutShader OFF = new SimpleCutoutShader(ResourceUtil.rl("cutout/off.glsl")); + public static final CutoutShader OFF = new SimpleCutoutShader(IdentifierUtil.id("cutout/off.glsl")); /** * Discard fragments with alpha close to or equal to zero. */ - public static final CutoutShader EPSILON = new SimpleCutoutShader(ResourceUtil.rl("cutout/epsilon.glsl")); + public static final CutoutShader EPSILON = new SimpleCutoutShader(IdentifierUtil.id("cutout/epsilon.glsl")); /** * Discard fragments with alpha less than to 0.1. */ - public static final CutoutShader ONE_TENTH = new SimpleCutoutShader(ResourceUtil.rl("cutout/one_tenth.glsl")); + public static final CutoutShader ONE_TENTH = new SimpleCutoutShader(IdentifierUtil.id("cutout/one_tenth.glsl")); /** * Discard fragments with alpha less than to 0.5. */ - public static final CutoutShader HALF = new SimpleCutoutShader(ResourceUtil.rl("cutout/half.glsl")); + public static final CutoutShader HALF = new SimpleCutoutShader(IdentifierUtil.id("cutout/half.glsl")); private CutoutShaders() { } diff --git a/common/src/lib/java/dev/engine_room/flywheel/lib/material/FogShaders.java b/common/src/lib/java/dev/engine_room/flywheel/lib/material/FogShaders.java index 39f903c47..62bb37776 100644 --- a/common/src/lib/java/dev/engine_room/flywheel/lib/material/FogShaders.java +++ b/common/src/lib/java/dev/engine_room/flywheel/lib/material/FogShaders.java @@ -1,12 +1,12 @@ package dev.engine_room.flywheel.lib.material; import dev.engine_room.flywheel.api.material.FogShader; -import dev.engine_room.flywheel.lib.util.ResourceUtil; +import dev.engine_room.flywheel.lib.util.IdentifierUtil; public final class FogShaders { - public static final FogShader NONE = new SimpleFogShader(ResourceUtil.rl("fog/none.glsl")); - public static final FogShader LINEAR = new SimpleFogShader(ResourceUtil.rl("fog/linear.glsl")); - public static final FogShader LINEAR_FADE = new SimpleFogShader(ResourceUtil.rl("fog/linear_fade.glsl")); + public static final FogShader NONE = new SimpleFogShader(IdentifierUtil.id("fog/none.glsl")); + public static final FogShader LINEAR = new SimpleFogShader(IdentifierUtil.id("fog/linear.glsl")); + public static final FogShader LINEAR_FADE = new SimpleFogShader(IdentifierUtil.id("fog/linear_fade.glsl")); private FogShaders() { } diff --git a/common/src/lib/java/dev/engine_room/flywheel/lib/material/LightShaders.java b/common/src/lib/java/dev/engine_room/flywheel/lib/material/LightShaders.java index f9f373d64..b6b315559 100644 --- a/common/src/lib/java/dev/engine_room/flywheel/lib/material/LightShaders.java +++ b/common/src/lib/java/dev/engine_room/flywheel/lib/material/LightShaders.java @@ -1,12 +1,12 @@ package dev.engine_room.flywheel.lib.material; import dev.engine_room.flywheel.api.material.LightShader; -import dev.engine_room.flywheel.lib.util.ResourceUtil; +import dev.engine_room.flywheel.lib.util.IdentifierUtil; public final class LightShaders { - public static final LightShader SMOOTH_WHEN_EMBEDDED = new SimpleLightShader(ResourceUtil.rl("light/smooth_when_embedded.glsl")); - public static final LightShader SMOOTH = new SimpleLightShader(ResourceUtil.rl("light/smooth.glsl")); - public static final LightShader FLAT = new SimpleLightShader(ResourceUtil.rl("light/flat.glsl")); + public static final LightShader SMOOTH_WHEN_EMBEDDED = new SimpleLightShader(IdentifierUtil.id("light/smooth_when_embedded.glsl")); + public static final LightShader SMOOTH = new SimpleLightShader(IdentifierUtil.id("light/smooth.glsl")); + public static final LightShader FLAT = new SimpleLightShader(IdentifierUtil.id("light/flat.glsl")); private LightShaders() { } diff --git a/common/src/lib/java/dev/engine_room/flywheel/lib/material/SimpleCutoutShader.java b/common/src/lib/java/dev/engine_room/flywheel/lib/material/SimpleCutoutShader.java index 0756761da..55f6f44ad 100644 --- a/common/src/lib/java/dev/engine_room/flywheel/lib/material/SimpleCutoutShader.java +++ b/common/src/lib/java/dev/engine_room/flywheel/lib/material/SimpleCutoutShader.java @@ -1,7 +1,7 @@ package dev.engine_room.flywheel.lib.material; import dev.engine_room.flywheel.api.material.CutoutShader; -import net.minecraft.resources.ResourceLocation; +import net.minecraft.resources.Identifier; -public record SimpleCutoutShader(@Override ResourceLocation source) implements CutoutShader { +public record SimpleCutoutShader(@Override Identifier source) implements CutoutShader { } diff --git a/common/src/lib/java/dev/engine_room/flywheel/lib/material/SimpleFogShader.java b/common/src/lib/java/dev/engine_room/flywheel/lib/material/SimpleFogShader.java index cc67a8f69..6a38239da 100644 --- a/common/src/lib/java/dev/engine_room/flywheel/lib/material/SimpleFogShader.java +++ b/common/src/lib/java/dev/engine_room/flywheel/lib/material/SimpleFogShader.java @@ -1,7 +1,7 @@ package dev.engine_room.flywheel.lib.material; import dev.engine_room.flywheel.api.material.FogShader; -import net.minecraft.resources.ResourceLocation; +import net.minecraft.resources.Identifier; -public record SimpleFogShader(@Override ResourceLocation source) implements FogShader { +public record SimpleFogShader(@Override Identifier source) implements FogShader { } diff --git a/common/src/lib/java/dev/engine_room/flywheel/lib/material/SimpleLightShader.java b/common/src/lib/java/dev/engine_room/flywheel/lib/material/SimpleLightShader.java index 08158e741..b5d002237 100644 --- a/common/src/lib/java/dev/engine_room/flywheel/lib/material/SimpleLightShader.java +++ b/common/src/lib/java/dev/engine_room/flywheel/lib/material/SimpleLightShader.java @@ -1,7 +1,7 @@ package dev.engine_room.flywheel.lib.material; import dev.engine_room.flywheel.api.material.LightShader; -import net.minecraft.resources.ResourceLocation; +import net.minecraft.resources.Identifier; -public record SimpleLightShader(@Override ResourceLocation source) implements LightShader { +public record SimpleLightShader(@Override Identifier source) implements LightShader { } diff --git a/common/src/lib/java/dev/engine_room/flywheel/lib/material/SimpleMaterial.java b/common/src/lib/java/dev/engine_room/flywheel/lib/material/SimpleMaterial.java index 627fbd2bb..3c8e56987 100644 --- a/common/src/lib/java/dev/engine_room/flywheel/lib/material/SimpleMaterial.java +++ b/common/src/lib/java/dev/engine_room/flywheel/lib/material/SimpleMaterial.java @@ -9,7 +9,7 @@ import dev.engine_room.flywheel.api.material.MaterialShaders; import dev.engine_room.flywheel.api.material.Transparency; import dev.engine_room.flywheel.api.material.WriteMask; -import net.minecraft.resources.ResourceLocation; +import net.minecraft.resources.Identifier; import net.minecraft.world.inventory.InventoryMenu; public class SimpleMaterial implements Material { @@ -18,7 +18,7 @@ public class SimpleMaterial implements Material { protected final CutoutShader cutout; protected final LightShader light; - protected final ResourceLocation texture; + protected final Identifier texture; protected final boolean blur; protected final boolean mipmap; @@ -79,7 +79,7 @@ public LightShader light() { } @Override - public ResourceLocation texture() { + public Identifier texture() { return texture; } @@ -139,7 +139,7 @@ public static class Builder implements Material { protected CutoutShader cutout; protected LightShader light; - protected ResourceLocation texture; + protected Identifier texture; protected boolean blur; protected boolean mipmap; @@ -214,7 +214,7 @@ public Builder light(LightShader value) { return this; } - public Builder texture(ResourceLocation value) { + public Builder texture(Identifier value) { this.texture = value; return this; } @@ -294,7 +294,7 @@ public LightShader light() { } @Override - public ResourceLocation texture() { + public Identifier texture() { return texture; } diff --git a/common/src/lib/java/dev/engine_room/flywheel/lib/material/SimpleMaterialShaders.java b/common/src/lib/java/dev/engine_room/flywheel/lib/material/SimpleMaterialShaders.java index f39c1f4ea..892dfa132 100644 --- a/common/src/lib/java/dev/engine_room/flywheel/lib/material/SimpleMaterialShaders.java +++ b/common/src/lib/java/dev/engine_room/flywheel/lib/material/SimpleMaterialShaders.java @@ -1,7 +1,7 @@ package dev.engine_room.flywheel.lib.material; import dev.engine_room.flywheel.api.material.MaterialShaders; -import net.minecraft.resources.ResourceLocation; +import net.minecraft.resources.Identifier; -public record SimpleMaterialShaders(ResourceLocation vertexSource, ResourceLocation fragmentSource) implements MaterialShaders { +public record SimpleMaterialShaders(Identifier vertexSource, Identifier fragmentSource) implements MaterialShaders { } diff --git a/common/src/lib/java/dev/engine_room/flywheel/lib/material/StandardMaterialShaders.java b/common/src/lib/java/dev/engine_room/flywheel/lib/material/StandardMaterialShaders.java index 6892adb00..b192b0e87 100644 --- a/common/src/lib/java/dev/engine_room/flywheel/lib/material/StandardMaterialShaders.java +++ b/common/src/lib/java/dev/engine_room/flywheel/lib/material/StandardMaterialShaders.java @@ -1,17 +1,17 @@ package dev.engine_room.flywheel.lib.material; import dev.engine_room.flywheel.api.material.MaterialShaders; -import dev.engine_room.flywheel.lib.util.ResourceUtil; +import dev.engine_room.flywheel.lib.util.IdentifierUtil; public final class StandardMaterialShaders { public static final MaterialShaders DEFAULT = new SimpleMaterialShaders( - ResourceUtil.rl("material/default.vert"), ResourceUtil.rl("material/default.frag")); + IdentifierUtil.id("material/default.vert"), IdentifierUtil.id("material/default.frag")); - public static final MaterialShaders WIREFRAME = new SimpleMaterialShaders(ResourceUtil.rl("material/wireframe.vert"), ResourceUtil.rl("material/wireframe.frag")); + public static final MaterialShaders WIREFRAME = new SimpleMaterialShaders(IdentifierUtil.id("material/wireframe.vert"), IdentifierUtil.id("material/wireframe.frag")); - public static final MaterialShaders LINE = new SimpleMaterialShaders(ResourceUtil.rl("material/lines.vert"), ResourceUtil.rl("material/lines.frag")); + public static final MaterialShaders LINE = new SimpleMaterialShaders(IdentifierUtil.id("material/lines.vert"), IdentifierUtil.id("material/lines.frag")); - public static final MaterialShaders GLINT = new SimpleMaterialShaders(ResourceUtil.rl("material/glint.vert"), ResourceUtil.rl("material/default.frag")); + public static final MaterialShaders GLINT = new SimpleMaterialShaders(IdentifierUtil.id("material/glint.vert"), IdentifierUtil.id("material/default.frag")); private StandardMaterialShaders() { } diff --git a/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/PartialModel.java b/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/PartialModel.java index 0b80329e9..879a0b2ab 100644 --- a/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/PartialModel.java +++ b/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/PartialModel.java @@ -2,6 +2,8 @@ import java.util.concurrent.ConcurrentMap; +import net.minecraft.resources.Identifier; + import org.jetbrains.annotations.UnknownNullability; import com.google.common.collect.MapMaker; @@ -9,7 +11,6 @@ import dev.engine_room.flywheel.lib.internal.FlwLibXplat; import net.minecraft.client.Minecraft; import net.minecraft.client.resources.model.BakedModel; -import net.minecraft.resources.ResourceLocation; /** * A helper class for loading and accessing JSON models not directly used by any blocks or items. @@ -19,23 +20,23 @@ * Once Minecraft has finished baking all models, all PartialModels will have their bakedModel fields populated. */ public final class PartialModel { - static final ConcurrentMap ALL = new MapMaker().weakValues().makeMap(); + static final ConcurrentMap ALL = new MapMaker().weakValues().makeMap(); static boolean populateOnInit = false; - private final ResourceLocation modelLocation; + private final Identifier modelId; @UnknownNullability BakedModel bakedModel; - private PartialModel(ResourceLocation modelLocation) { - this.modelLocation = modelLocation; + private PartialModel(Identifier modelId) { + this.modelId = modelId; if (populateOnInit) { - bakedModel = FlwLibXplat.INSTANCE.getBakedModel(Minecraft.getInstance().getModelManager(), modelLocation); + bakedModel = FlwLibXplat.INSTANCE.getBakedModel(Minecraft.getInstance().getModelManager(), modelId); } } - public static PartialModel of(ResourceLocation modelLocation) { - return ALL.computeIfAbsent(modelLocation, PartialModel::new); + public static PartialModel of(Identifier modelId) { + return ALL.computeIfAbsent(modelId, PartialModel::new); } @UnknownNullability @@ -43,7 +44,7 @@ public BakedModel get() { return bakedModel; } - public ResourceLocation modelLocation() { - return modelLocation; + public Identifier modelId() { + return modelId; } } diff --git a/common/src/lib/java/dev/engine_room/flywheel/lib/util/IdentifierUtil.java b/common/src/lib/java/dev/engine_room/flywheel/lib/util/IdentifierUtil.java new file mode 100644 index 000000000..a2a2e0e2e --- /dev/null +++ b/common/src/lib/java/dev/engine_room/flywheel/lib/util/IdentifierUtil.java @@ -0,0 +1,67 @@ +package dev.engine_room.flywheel.lib.util; + +import com.mojang.brigadier.StringReader; +import com.mojang.brigadier.exceptions.CommandSyntaxException; +import com.mojang.brigadier.exceptions.SimpleCommandExceptionType; + +import dev.engine_room.flywheel.api.Flywheel; +import net.minecraft.IdentifierException; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.Identifier; + +public final class IdentifierUtil { + private static final SimpleCommandExceptionType ERROR_INVALID = new SimpleCommandExceptionType(Component.translatable("argument.id.invalid")); + + private IdentifierUtil() { + } + + public static Identifier id(String path) { + return Identifier.fromNamespaceAndPath(Flywheel.ID, path); + } + + /** + * Same as {@link Identifier#parse(String)}, but defaults to Flywheel namespace. + */ + public static Identifier parseFlywheelDefault(String id) { + String namespace = Flywheel.ID; + String path = id; + + int i = id.indexOf(Identifier.NAMESPACE_SEPARATOR); + if (i >= 0) { + path = id.substring(i + 1); + if (i >= 1) { + namespace = id.substring(0, i); + } + } + + return Identifier.fromNamespaceAndPath(namespace, path); + } + + /** + * Same as {@link Identifier#read(StringReader)}, but defaults to Flywheel namespace. + */ + public static Identifier readFlywheelDefault(StringReader reader) throws CommandSyntaxException { + int i = reader.getCursor(); + + while (reader.canRead() && Identifier.isAllowedInIdentifier(reader.peek())) { + reader.skip(); + } + + String s = reader.getString().substring(i, reader.getCursor()); + + try { + return parseFlywheelDefault(s); + } catch (IdentifierException e) { + reader.setCursor(i); + throw ERROR_INVALID.createWithContext(reader); + } + } + + /** + * Same as {@link Identifier#toDebugFileName()}, but also removes the file extension. + */ + public static String toDebugFileNameNoExtension(Identifier id) { + var stringLoc = id.toDebugFileName(); + return stringLoc.substring(0, stringLoc.lastIndexOf('.')); + } +} diff --git a/common/src/lib/java/dev/engine_room/flywheel/lib/util/ResourceUtil.java b/common/src/lib/java/dev/engine_room/flywheel/lib/util/ResourceUtil.java deleted file mode 100644 index b61d9292a..000000000 --- a/common/src/lib/java/dev/engine_room/flywheel/lib/util/ResourceUtil.java +++ /dev/null @@ -1,67 +0,0 @@ -package dev.engine_room.flywheel.lib.util; - -import com.mojang.brigadier.StringReader; -import com.mojang.brigadier.exceptions.CommandSyntaxException; -import com.mojang.brigadier.exceptions.SimpleCommandExceptionType; - -import dev.engine_room.flywheel.api.Flywheel; -import net.minecraft.ResourceLocationException; -import net.minecraft.network.chat.Component; -import net.minecraft.resources.ResourceLocation; - -public final class ResourceUtil { - private static final SimpleCommandExceptionType ERROR_INVALID = new SimpleCommandExceptionType(Component.translatable("argument.id.invalid")); - - private ResourceUtil() { - } - - public static ResourceLocation rl(String path) { - return ResourceLocation.fromNamespaceAndPath(Flywheel.ID, path); - } - - /** - * Same as {@link ResourceLocation#parse(String)}, but defaults to Flywheel namespace. - */ - public static ResourceLocation parseFlywheelDefault(String location) { - String namespace = Flywheel.ID; - String path = location; - - int i = location.indexOf(ResourceLocation.NAMESPACE_SEPARATOR); - if (i >= 0) { - path = location.substring(i + 1); - if (i >= 1) { - namespace = location.substring(0, i); - } - } - - return ResourceLocation.fromNamespaceAndPath(namespace, path); - } - - /** - * Same as {@link ResourceLocation#read(StringReader)}, but defaults to Flywheel namespace. - */ - public static ResourceLocation readFlywheelDefault(StringReader reader) throws CommandSyntaxException { - int i = reader.getCursor(); - - while (reader.canRead() && ResourceLocation.isAllowedInResourceLocation(reader.peek())) { - reader.skip(); - } - - String s = reader.getString().substring(i, reader.getCursor()); - - try { - return parseFlywheelDefault(s); - } catch (ResourceLocationException resourcelocationexception) { - reader.setCursor(i); - throw ERROR_INVALID.createWithContext(reader); - } - } - - /** - * Same as {@link ResourceLocation#toDebugFileName()}, but also removes the file extension. - */ - public static String toDebugFileNameNoExtension(ResourceLocation resourceLocation) { - var stringLoc = resourceLocation.toDebugFileName(); - return stringLoc.substring(0, stringLoc.lastIndexOf('.')); - } -} diff --git a/common/src/lib/java/dev/engine_room/flywheel/lib/visual/component/ShadowComponent.java b/common/src/lib/java/dev/engine_room/flywheel/lib/visual/component/ShadowComponent.java index 0f8d0a97d..fece5a5ea 100644 --- a/common/src/lib/java/dev/engine_room/flywheel/lib/visual/component/ShadowComponent.java +++ b/common/src/lib/java/dev/engine_room/flywheel/lib/visual/component/ShadowComponent.java @@ -1,5 +1,7 @@ package dev.engine_room.flywheel.lib.visual.component; +import net.minecraft.resources.Identifier; + import org.jetbrains.annotations.Nullable; import org.joml.Vector4f; import org.joml.Vector4fc; @@ -23,7 +25,6 @@ import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.core.Direction.Axis; -import net.minecraft.resources.ResourceLocation; import net.minecraft.util.Mth; import net.minecraft.world.entity.Entity; import net.minecraft.world.level.Level; @@ -42,7 +43,7 @@ * The shadow will be cast on blocks at most {@code min(radius, 2 * strength)} blocks below the entity.

*/ public final class ShadowComponent implements EntityComponent { - private static final ResourceLocation SHADOW_TEXTURE = ResourceLocation.withDefaultNamespace("textures/misc/shadow.png"); + private static final Identifier SHADOW_TEXTURE = Identifier.withDefaultNamespace("textures/misc/shadow.png"); private static final Material SHADOW_MATERIAL = SimpleMaterial.builder() .texture(SHADOW_TEXTURE) .mipmap(false) diff --git a/common/src/main/java/dev/engine_room/flywheel/impl/BackendArgument.java b/common/src/main/java/dev/engine_room/flywheel/impl/BackendArgument.java index 1ef3235fc..53efd9370 100644 --- a/common/src/main/java/dev/engine_room/flywheel/impl/BackendArgument.java +++ b/common/src/main/java/dev/engine_room/flywheel/impl/BackendArgument.java @@ -14,11 +14,11 @@ import com.mojang.brigadier.suggestion.SuggestionsBuilder; import dev.engine_room.flywheel.api.backend.Backend; -import dev.engine_room.flywheel.lib.util.ResourceUtil; +import dev.engine_room.flywheel.lib.util.IdentifierUtil; import net.minecraft.commands.SharedSuggestionProvider; import net.minecraft.commands.synchronization.SingletonArgumentInfo; import net.minecraft.network.chat.Component; -import net.minecraft.resources.ResourceLocation; +import net.minecraft.resources.Identifier; public class BackendArgument implements ArgumentType { private static final List EXAMPLES = List.of("off", "flywheel:off", "instancing"); @@ -32,7 +32,7 @@ public class BackendArgument implements ArgumentType { @Override public Backend parse(StringReader reader) throws CommandSyntaxException { - ResourceLocation id = ResourceUtil.readFlywheelDefault(reader); + Identifier id = IdentifierUtil.readFlywheelDefault(reader); Backend backend = Backend.REGISTRY.get(id); if (backend == null) { @@ -45,7 +45,7 @@ public Backend parse(StringReader reader) throws CommandSyntaxException { @Override public CompletableFuture listSuggestions(CommandContext context, SuggestionsBuilder builder) { String input = builder.getRemaining().toLowerCase(Locale.ROOT); - for (ResourceLocation id : Backend.REGISTRY.getAllIds()) { + for (Identifier id : Backend.REGISTRY.getAllIds()) { String idStr = id.toString(); if (SharedSuggestionProvider.matchesSubStr(input, idStr) || SharedSuggestionProvider.matchesSubStr(input, id.getPath())) { builder.suggest(idStr); diff --git a/common/src/main/java/dev/engine_room/flywheel/impl/BackendManagerImpl.java b/common/src/main/java/dev/engine_room/flywheel/impl/BackendManagerImpl.java index df4262e5a..1f968c689 100644 --- a/common/src/main/java/dev/engine_room/flywheel/impl/BackendManagerImpl.java +++ b/common/src/main/java/dev/engine_room/flywheel/impl/BackendManagerImpl.java @@ -5,9 +5,9 @@ import dev.engine_room.flywheel.api.backend.Backend; import dev.engine_room.flywheel.impl.visualization.VisualizationManagerImpl; import dev.engine_room.flywheel.lib.backend.SimpleBackend; -import dev.engine_room.flywheel.lib.util.ResourceUtil; +import dev.engine_room.flywheel.lib.util.IdentifierUtil; import net.minecraft.client.multiplayer.ClientLevel; -import net.minecraft.resources.ResourceLocation; +import net.minecraft.resources.Identifier; public final class BackendManagerImpl { public static final Backend OFF_BACKEND = SimpleBackend.builder() @@ -15,7 +15,7 @@ public final class BackendManagerImpl { throw new UnsupportedOperationException("Cannot create engine when backend is off."); }) .supported(() -> true) - .register(ResourceUtil.rl("off")); + .register(IdentifierUtil.id("off")); private static Backend backend = OFF_BACKEND; @@ -75,7 +75,7 @@ private static void chooseBackend() { } public static String getBackendString() { - ResourceLocation backendId = Backend.REGISTRY.getId(backend); + Identifier backendId = Backend.REGISTRY.getId(backend); if (backendId == null) { return "[unregistered]"; } diff --git a/common/src/main/java/dev/engine_room/flywheel/impl/registry/IdRegistryImpl.java b/common/src/main/java/dev/engine_room/flywheel/impl/registry/IdRegistryImpl.java index 3ea57ea30..1b70fb358 100644 --- a/common/src/main/java/dev/engine_room/flywheel/impl/registry/IdRegistryImpl.java +++ b/common/src/main/java/dev/engine_room/flywheel/impl/registry/IdRegistryImpl.java @@ -20,14 +20,14 @@ import it.unimi.dsi.fastutil.objects.Reference2ObjectOpenHashMap; import it.unimi.dsi.fastutil.objects.ReferenceCollection; import it.unimi.dsi.fastutil.objects.ReferenceCollections; -import net.minecraft.resources.ResourceLocation; +import net.minecraft.resources.Identifier; public class IdRegistryImpl implements IdRegistry { private static final ObjectList> ALL = new ObjectArrayList<>(); - private final Object2ReferenceMap map = Object2ReferenceMaps.synchronize(new Object2ReferenceOpenHashMap<>()); - private final Reference2ObjectMap reverseMap = Reference2ObjectMaps.synchronize(new Reference2ObjectOpenHashMap<>()); - private final ObjectSet keysView = ObjectSets.unmodifiable(map.keySet()); + private final Object2ReferenceMap map = Object2ReferenceMaps.synchronize(new Object2ReferenceOpenHashMap<>()); + private final Reference2ObjectMap reverseMap = Reference2ObjectMaps.synchronize(new Reference2ObjectOpenHashMap<>()); + private final ObjectSet keysView = ObjectSets.unmodifiable(map.keySet()); private final ReferenceCollection valuesView = ReferenceCollections.unmodifiable(map.values()); private boolean frozen; @@ -36,7 +36,7 @@ public IdRegistryImpl() { } @Override - public void register(ResourceLocation id, T object) { + public void register(Identifier id, T object) { if (frozen) { throw new IllegalStateException("Cannot register to frozen registry!"); } @@ -44,32 +44,32 @@ public void register(ResourceLocation id, T object) { if (oldValue != null) { throw new IllegalArgumentException("Cannot override registration for ID '" + id + "'!"); } - ResourceLocation oldId = reverseMap.put(object, id); + Identifier oldId = reverseMap.put(object, id); if (oldId != null) { throw new IllegalArgumentException("Cannot override ID '" + id + "' with registration for ID '" + oldId + "'!"); } } @Override - public S registerAndGet(ResourceLocation id, S object) { + public S registerAndGet(Identifier id, S object) { register(id, object); return object; } @Override @Nullable - public T get(ResourceLocation id) { + public T get(Identifier id) { return map.get(id); } @Override @Nullable - public ResourceLocation getId(T object) { + public Identifier getId(T object) { return reverseMap.get(object); } @Override - public T getOrThrow(ResourceLocation id) { + public T getOrThrow(Identifier id) { T object = get(id); if (object == null) { throw new IllegalArgumentException("Could not find object for ID '" + id + "'!"); @@ -78,8 +78,8 @@ public T getOrThrow(ResourceLocation id) { } @Override - public ResourceLocation getIdOrThrow(T object) { - ResourceLocation id = getId(object); + public Identifier getIdOrThrow(T object) { + Identifier id = getId(object); if (id == null) { throw new IllegalArgumentException("Could not find ID for object!"); } @@ -88,7 +88,7 @@ public ResourceLocation getIdOrThrow(T object) { @Override @UnmodifiableView - public Set getAllIds() { + public Set getAllIds() { return keysView; } diff --git a/common/src/test/java/dev/engine_room/flywheel/backend/glsl/MockShaderSources.java b/common/src/test/java/dev/engine_room/flywheel/backend/glsl/MockShaderSources.java index 4403088a5..d2a4d4bd6 100644 --- a/common/src/test/java/dev/engine_room/flywheel/backend/glsl/MockShaderSources.java +++ b/common/src/test/java/dev/engine_room/flywheel/backend/glsl/MockShaderSources.java @@ -7,56 +7,56 @@ import java.util.List; import java.util.Map; -import net.minecraft.resources.ResourceLocation; +import net.minecraft.resources.Identifier; public class MockShaderSources { - private final Map sources = new HashMap<>(); - private final Map cache = new HashMap<>(); - private final Deque findStack = new ArrayDeque<>(); + private final Map sources = new HashMap<>(); + private final Map cache = new HashMap<>(); + private final Deque findStack = new ArrayDeque<>(); public MockShaderSources() { } - public void add(ResourceLocation loc, String source) { + public void add(Identifier loc, String source) { sources.put(loc, source); } - public LoadResult find(ResourceLocation location) { - if (findStack.contains(location)) { - // Make a copy of the find stack with the offending location added on top to show the full path. - findStack.addLast(location); + public LoadResult find(Identifier id) { + if (findStack.contains(id)) { + // Make a copy of the find stack with the offending id added on top to show the full path. + findStack.addLast(id); var copy = List.copyOf(findStack); findStack.removeLast(); - return new LoadResult.Failure(new LoadError.CircularDependency(location, copy)); + return new LoadResult.Failure(new LoadError.CircularDependency(id, copy)); } - findStack.addLast(location); + findStack.addLast(id); - LoadResult out = load(location); + LoadResult out = load(id); findStack.removeLast(); return out; } - private LoadResult load(ResourceLocation loc) { - var out = cache.get(loc); + private LoadResult load(Identifier id) { + var out = cache.get(id); if (out != null) { return out; } - var loadResult = _load(loc); + var loadResult = _load(id); - cache.put(loc, loadResult); + cache.put(id, loadResult); return loadResult; } - private LoadResult _load(ResourceLocation loc) { - var maybeFound = sources.get(loc); + private LoadResult _load(Identifier id) { + var maybeFound = sources.get(id); if (maybeFound == null) { - return new LoadResult.Failure(new LoadError.IOError(loc, new FileNotFoundException(loc.toString()))); + return new LoadResult.Failure(new LoadError.IOError(id, new FileNotFoundException(id.toString()))); } - return SourceFile.parse(this::find, loc, maybeFound); + return SourceFile.parse(this::find, id, maybeFound); } } diff --git a/common/src/test/java/dev/engine_room/flywheel/backend/glsl/TestBase.java b/common/src/test/java/dev/engine_room/flywheel/backend/glsl/TestBase.java index 1e2860eb1..33dc85c7b 100644 --- a/common/src/test/java/dev/engine_room/flywheel/backend/glsl/TestBase.java +++ b/common/src/test/java/dev/engine_room/flywheel/backend/glsl/TestBase.java @@ -6,20 +6,20 @@ import java.util.List; -import dev.engine_room.flywheel.lib.util.ResourceUtil; -import net.minecraft.resources.ResourceLocation; +import dev.engine_room.flywheel.lib.util.IdentifierUtil; +import net.minecraft.resources.Identifier; public class TestBase { - public static final ResourceLocation FLW_A = ResourceUtil.rl("a.glsl"); - public static final ResourceLocation FLW_B = ResourceUtil.rl("b.glsl"); - public static final ResourceLocation FLW_C = ResourceUtil.rl("c.glsl"); + public static final Identifier FLW_A = IdentifierUtil.id("a.glsl"); + public static final Identifier FLW_B = IdentifierUtil.id("b.glsl"); + public static final Identifier FLW_C = IdentifierUtil.id("c.glsl"); public static T assertSingletonList(List list) { assertEquals(1, list.size()); return list.get(0); } - public static E findAndAssertError(Class clazz, MockShaderSources sources, ResourceLocation loc) { + public static E findAndAssertError(Class clazz, MockShaderSources sources, Identifier loc) { var result = sources.find(loc); var failure = assertInstanceOf(LoadResult.Failure.class, result); return assertInstanceOf(clazz, failure.error()); @@ -36,12 +36,12 @@ static E assertSimpleNestedErrorsToDepth(Class finalErr return assertInstanceOf(finalErrType, pair.getSecond()); } - public static SourceFile findAndAssertSuccess(MockShaderSources sources, ResourceLocation loc) { - var result = sources.find(loc); - return assertSuccessAndUnwrap(loc, result); + public static SourceFile findAndAssertSuccess(MockShaderSources sources, Identifier id) { + var result = sources.find(id); + return assertSuccessAndUnwrap(id, result); } - public static SourceFile assertSuccessAndUnwrap(ResourceLocation expectedName, LoadResult result) { + public static SourceFile assertSuccessAndUnwrap(Identifier expectedName, LoadResult result) { assertInstanceOf(LoadResult.Success.class, result); var file = result.unwrap(); diff --git a/common/src/test/java/dev/engine_room/flywheel/backend/glsl/TestErrorMessages.java b/common/src/test/java/dev/engine_room/flywheel/backend/glsl/TestErrorMessages.java index f1eff161d..26c06f476 100644 --- a/common/src/test/java/dev/engine_room/flywheel/backend/glsl/TestErrorMessages.java +++ b/common/src/test/java/dev/engine_room/flywheel/backend/glsl/TestErrorMessages.java @@ -7,7 +7,7 @@ import org.junit.jupiter.api.Test; import dev.engine_room.flywheel.backend.glsl.error.ErrorBuilder; -import net.minecraft.resources.ResourceLocation; +import net.minecraft.resources.Identifier; public class TestErrorMessages extends TestBase { @BeforeAll @@ -54,14 +54,14 @@ void testNestedIncludeMsg() { """, sources, FLW_A); } - public static void assertErrorMatches(String expected, MockShaderSources sources, ResourceLocation loc) { - var message = assertErrorAndGetMessage(sources, loc).build(); + public static void assertErrorMatches(String expected, MockShaderSources sources, Identifier id) { + var message = assertErrorAndGetMessage(sources, id).build(); assertEquals(expected.trim(), message.trim()); } - public static ErrorBuilder assertErrorAndGetMessage(MockShaderSources sources, ResourceLocation loc) { - var result = sources.find(loc); + public static ErrorBuilder assertErrorAndGetMessage(MockShaderSources sources, Identifier id) { + var result = sources.find(id); var failure = assertInstanceOf(LoadResult.Failure.class, result); return failure.error() .generateMessage(); diff --git a/common/src/test/java/dev/engine_room/flywheel/backend/glsl/TestShaderSourceLoading.java b/common/src/test/java/dev/engine_room/flywheel/backend/glsl/TestShaderSourceLoading.java index 57c635756..521a57424 100644 --- a/common/src/test/java/dev/engine_room/flywheel/backend/glsl/TestShaderSourceLoading.java +++ b/common/src/test/java/dev/engine_room/flywheel/backend/glsl/TestShaderSourceLoading.java @@ -48,7 +48,7 @@ void testMissingInclude() { var aErr = findAndAssertError(LoadError.IncludeError.class, sources, FLW_A); var ioErr = assertSimpleNestedErrorsToDepth(LoadError.IOError.class, aErr, 1); - assertEquals(FLW_B, ioErr.location()); + assertEquals(FLW_B, ioErr.id()); } @Test @@ -63,7 +63,7 @@ void testMalformedInclude() { var malformedInclude = assertSimpleNestedErrorsToDepth(LoadError.MalformedInclude.class, aErr, 1); var message = malformedInclude.exception() .getMessage(); - assertEquals("Non [a-z0-9/._-] character in path of location: flywheel:evil - wow", message); + assertEquals("Non [a-z0-9/._-] character in path of id: flywheel:evil - wow", message); } @Test diff --git a/common/src/vanillin/java/dev/engine_room/vanillin/Vanillin.java b/common/src/vanillin/java/dev/engine_room/vanillin/Vanillin.java index b6685402c..5c4d8c3d6 100644 --- a/common/src/vanillin/java/dev/engine_room/vanillin/Vanillin.java +++ b/common/src/vanillin/java/dev/engine_room/vanillin/Vanillin.java @@ -3,7 +3,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import net.minecraft.resources.ResourceLocation; +import net.minecraft.resources.Identifier; public class Vanillin { public static final String ID = "vanillin"; @@ -11,7 +11,7 @@ public class Vanillin { public static final Logger LOGGER = LoggerFactory.getLogger(ID); public static final Logger CONFIG_LOGGER = LoggerFactory.getLogger(ID + "/config"); - public static ResourceLocation rl(String path) { - return ResourceLocation.fromNamespaceAndPath(ID, path); + public static Identifier id(String path) { + return Identifier.fromNamespaceAndPath(ID, path); } } diff --git a/common/src/vanillin/java/dev/engine_room/vanillin/VanillinInstanceTypes.java b/common/src/vanillin/java/dev/engine_room/vanillin/VanillinInstanceTypes.java index b89fcfb48..c0b4e5493 100644 --- a/common/src/vanillin/java/dev/engine_room/vanillin/VanillinInstanceTypes.java +++ b/common/src/vanillin/java/dev/engine_room/vanillin/VanillinInstanceTypes.java @@ -26,7 +26,7 @@ public class VanillinInstanceTypes { MemoryUtil.memPutByte(ptr + 75, instance.alpha); ExtraMemoryOps.put2x16(ptr + 76, instance.light); }) - .vertexShader(Vanillin.rl("instance/glyph.vert")) - .cullShader(Vanillin.rl("instance/cull/glyph.glsl")) + .vertexShader(Vanillin.id("instance/glyph.vert")) + .cullShader(Vanillin.id("instance/cull/glyph.glsl")) .build(); } diff --git a/common/src/vanillin/java/dev/engine_room/vanillin/elements/ShadowElement.java b/common/src/vanillin/java/dev/engine_room/vanillin/elements/ShadowElement.java index 133a67ed3..df7e115aa 100644 --- a/common/src/vanillin/java/dev/engine_room/vanillin/elements/ShadowElement.java +++ b/common/src/vanillin/java/dev/engine_room/vanillin/elements/ShadowElement.java @@ -25,7 +25,7 @@ import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.core.Direction.Axis; -import net.minecraft.resources.ResourceLocation; +import net.minecraft.resources.Identifier; import net.minecraft.util.Mth; import net.minecraft.world.entity.Entity; import net.minecraft.world.level.block.RenderShape; @@ -43,7 +43,7 @@ * The shadow will be cast on blocks at most {@code min(radius, 2 * strength)} blocks below the entity.

*/ public final class ShadowElement extends AbstractVisual implements SimpleDynamicVisual { - private static final ResourceLocation SHADOW_TEXTURE = ResourceLocation.withDefaultNamespace("textures/misc/shadow.png"); + private static final Identifier SHADOW_TEXTURE = Identifier.withDefaultNamespace("textures/misc/shadow.png"); private static final Material SHADOW_MATERIAL = SimpleMaterial.builder() .texture(SHADOW_TEXTURE) .mipmap(false) diff --git a/common/src/vanillin/java/dev/engine_room/vanillin/mixin/text/BakedGlyphMixin.java b/common/src/vanillin/java/dev/engine_room/vanillin/mixin/text/BakedGlyphMixin.java index 90d5ab0d4..1019adc77 100644 --- a/common/src/vanillin/java/dev/engine_room/vanillin/mixin/text/BakedGlyphMixin.java +++ b/common/src/vanillin/java/dev/engine_room/vanillin/mixin/text/BakedGlyphMixin.java @@ -7,7 +7,7 @@ import dev.engine_room.vanillin.text.BakedGlyphExtension; import net.minecraft.client.gui.font.glyphs.BakedGlyph; -import net.minecraft.resources.ResourceLocation; +import net.minecraft.resources.Identifier; @Mixin(BakedGlyph.class) public class BakedGlyphMixin implements BakedGlyphExtension { @@ -37,7 +37,7 @@ public class BakedGlyphMixin implements BakedGlyphExtension { private float down; @Unique - private ResourceLocation flywheel$texture; + private Identifier flywheel$texture; @Override public float flywheel$u0() { @@ -80,12 +80,12 @@ public class BakedGlyphMixin implements BakedGlyphExtension { } @Override - public ResourceLocation flywheel$texture() { + public Identifier flywheel$texture() { return flywheel$texture; } @Override - public void flywheel$texture(ResourceLocation location) { - flywheel$texture = location; + public void flywheel$texture(Identifier id) { + flywheel$texture = id; } } diff --git a/common/src/vanillin/java/dev/engine_room/vanillin/mixin/text/FontAccessor.java b/common/src/vanillin/java/dev/engine_room/vanillin/mixin/text/FontAccessor.java index 70bec9f17..f21b99784 100644 --- a/common/src/vanillin/java/dev/engine_room/vanillin/mixin/text/FontAccessor.java +++ b/common/src/vanillin/java/dev/engine_room/vanillin/mixin/text/FontAccessor.java @@ -6,7 +6,7 @@ import net.minecraft.client.gui.Font; import net.minecraft.client.gui.font.FontSet; -import net.minecraft.resources.ResourceLocation; +import net.minecraft.resources.Identifier; @Mixin(Font.class) public interface FontAccessor { @@ -14,5 +14,5 @@ public interface FontAccessor { boolean flywheel$getFilterFishyGlyphs(); @Invoker("getFontSet") - FontSet flywheel$getFontSet(ResourceLocation fontLocation); + FontSet flywheel$getFontSet(Identifier fontId); } diff --git a/common/src/vanillin/java/dev/engine_room/vanillin/mixin/text/FontSetMixin.java b/common/src/vanillin/java/dev/engine_room/vanillin/mixin/text/FontSetMixin.java index e1d6138ce..17702dad9 100644 --- a/common/src/vanillin/java/dev/engine_room/vanillin/mixin/text/FontSetMixin.java +++ b/common/src/vanillin/java/dev/engine_room/vanillin/mixin/text/FontSetMixin.java @@ -11,7 +11,7 @@ import dev.engine_room.vanillin.text.FontTextureExtension; import net.minecraft.client.gui.font.FontSet; import net.minecraft.client.gui.font.FontTexture; -import net.minecraft.resources.ResourceLocation; +import net.minecraft.resources.Identifier; import net.minecraft.util.RandomSource; @Mixin(FontSet.class) @@ -22,7 +22,7 @@ public abstract class FontSetMixin { private static final RandomSource RANDOM = RandomSource.createThreadSafe(); @ModifyExpressionValue(method = "stitch", at = @At(value = "NEW", target = "net/minecraft/client/gui/font/FontTexture")) - private FontTexture flywheel$setNameAfterCreate(FontTexture original, @Local ResourceLocation name) { + private FontTexture flywheel$setNameAfterCreate(FontTexture original, @Local Identifier name) { // Forward the name to the FontTexture so we can forward the name to the BakedGlyphs it creates. // We need to know that to determine which Material to use when actually setting up instances. ((FontTextureExtension) original).flywheel$setName(name); diff --git a/common/src/vanillin/java/dev/engine_room/vanillin/mixin/text/FontTextureMixin.java b/common/src/vanillin/java/dev/engine_room/vanillin/mixin/text/FontTextureMixin.java index 614844218..fabac72f1 100644 --- a/common/src/vanillin/java/dev/engine_room/vanillin/mixin/text/FontTextureMixin.java +++ b/common/src/vanillin/java/dev/engine_room/vanillin/mixin/text/FontTextureMixin.java @@ -28,7 +28,7 @@ import net.minecraft.client.gui.font.FontTexture; import net.minecraft.client.gui.font.glyphs.BakedGlyph; import net.minecraft.client.renderer.texture.AbstractTexture; -import net.minecraft.resources.ResourceLocation; +import net.minecraft.resources.Identifier; @Mixin(FontTexture.class) public abstract class FontTextureMixin extends AbstractTexture implements FontTextureExtension { @@ -41,7 +41,7 @@ public abstract class FontTextureMixin extends AbstractTexture implements FontTe private boolean flywheel$flushScheduled = false; @Unique - private ResourceLocation flywheel$name; + private Identifier flywheel$name; @WrapOperation(method = "", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/font/FontTexture;getId()I")) private int flywheel$skipGetId(FontTexture instance, Operation original) { @@ -125,7 +125,7 @@ public abstract class FontTextureMixin extends AbstractTexture implements FontTe } @Override - public void flywheel$setName(ResourceLocation name) { + public void flywheel$setName(Identifier name) { flywheel$name = name; } } diff --git a/common/src/vanillin/java/dev/engine_room/vanillin/text/BakedGlyphExtension.java b/common/src/vanillin/java/dev/engine_room/vanillin/text/BakedGlyphExtension.java index ceea95bb3..1eb6a5733 100644 --- a/common/src/vanillin/java/dev/engine_room/vanillin/text/BakedGlyphExtension.java +++ b/common/src/vanillin/java/dev/engine_room/vanillin/text/BakedGlyphExtension.java @@ -1,6 +1,6 @@ package dev.engine_room.vanillin.text; -import net.minecraft.resources.ResourceLocation; +import net.minecraft.resources.Identifier; public interface BakedGlyphExtension { float flywheel$u0(); @@ -19,7 +19,7 @@ public interface BakedGlyphExtension { float flywheel$down(); - ResourceLocation flywheel$texture(); + Identifier flywheel$texture(); - void flywheel$texture(ResourceLocation location); + void flywheel$texture(Identifier id); } diff --git a/common/src/vanillin/java/dev/engine_room/vanillin/text/FontTextureExtension.java b/common/src/vanillin/java/dev/engine_room/vanillin/text/FontTextureExtension.java index b1e24ecbf..b81c75340 100644 --- a/common/src/vanillin/java/dev/engine_room/vanillin/text/FontTextureExtension.java +++ b/common/src/vanillin/java/dev/engine_room/vanillin/text/FontTextureExtension.java @@ -1,9 +1,9 @@ package dev.engine_room.vanillin.text; -import net.minecraft.resources.ResourceLocation; +import net.minecraft.resources.Identifier; public interface FontTextureExtension { - void flywheel$setName(ResourceLocation name); + void flywheel$setName(Identifier name); void flywheel$flush(); } diff --git a/common/src/vanillin/java/dev/engine_room/vanillin/text/TextLayer.java b/common/src/vanillin/java/dev/engine_room/vanillin/text/TextLayer.java index 2bf0c8cc4..24b242da6 100644 --- a/common/src/vanillin/java/dev/engine_room/vanillin/text/TextLayer.java +++ b/common/src/vanillin/java/dev/engine_room/vanillin/text/TextLayer.java @@ -15,7 +15,7 @@ import dev.engine_room.flywheel.lib.material.SimpleMaterial; import net.minecraft.client.gui.Font; import net.minecraft.network.chat.TextColor; -import net.minecraft.resources.ResourceLocation; +import net.minecraft.resources.Identifier; import net.minecraft.util.FastColor; public interface TextLayer { @@ -27,7 +27,7 @@ public interface TextLayer { GlyphPattern pattern(); /** - * A mapping from texture ResourceLocations to Flywheel materials. + * A mapping from texture Identifiers to Flywheel materials. * * @return A GlyphMaterial. */ @@ -131,7 +131,7 @@ static GlyphMaterial fromDisplayMode(Font.DisplayMode displayMode) { * @param texture The texture to use. * @return A material. */ - Material create(ResourceLocation texture); + Material create(Identifier texture); } @FunctionalInterface diff --git a/common/src/vanillin/java/dev/engine_room/vanillin/text/TextUtil.java b/common/src/vanillin/java/dev/engine_room/vanillin/text/TextUtil.java index 6ca2fb345..bcc2f9b12 100644 --- a/common/src/vanillin/java/dev/engine_room/vanillin/text/TextUtil.java +++ b/common/src/vanillin/java/dev/engine_room/vanillin/text/TextUtil.java @@ -4,11 +4,11 @@ import net.minecraft.client.gui.Font; import net.minecraft.client.gui.font.FontSet; import net.minecraft.client.gui.font.glyphs.BakedGlyph; -import net.minecraft.resources.ResourceLocation; +import net.minecraft.resources.Identifier; public class TextUtil { - public static FontSet getFontSet(Font font, ResourceLocation loc) { - return ((FontAccessor) font).flywheel$getFontSet(loc); + public static FontSet getFontSet(Font font, Identifier id) { + return ((FontAccessor) font).flywheel$getFontSet(id); } public static boolean getFilterFishyGlyphs(Font font) { diff --git a/common/src/vanillin/java/dev/engine_room/vanillin/text/TextVisual.java b/common/src/vanillin/java/dev/engine_room/vanillin/text/TextVisual.java index df2ff0fee..ff53dee1b 100644 --- a/common/src/vanillin/java/dev/engine_room/vanillin/text/TextVisual.java +++ b/common/src/vanillin/java/dev/engine_room/vanillin/text/TextVisual.java @@ -30,7 +30,7 @@ import net.minecraft.client.gui.font.glyphs.EmptyGlyph; import net.minecraft.client.renderer.texture.OverlayTexture; import net.minecraft.network.chat.Style; -import net.minecraft.resources.ResourceLocation; +import net.minecraft.resources.Identifier; import net.minecraft.util.FormattedCharSequence; import net.minecraft.util.FormattedCharSink; import net.minecraft.util.Mth; @@ -134,7 +134,7 @@ public GlyphMesh into() { } } - private record GlyphModelKey(@Nullable GlyphMeshKey meshKey, TextLayer.GlyphMaterial material, ResourceLocation texture) { + private record GlyphModelKey(@Nullable GlyphMeshKey meshKey, TextLayer.GlyphMaterial material, Identifier texture) { public Model into() { Mesh mesh; @@ -249,7 +249,7 @@ private static GlyphInstanceKey key(TextLayer layer, GlyphInfo glyphInfo, BakedG return key(layer, glyphWidth, glyphHeight, glyphExtension.flywheel$texture(), bold, bold ? glyphInfo.getBoldOffset() : 0, glyphInfo.getShadowOffset()); } - private static GlyphInstanceKey key(TextLayer layer, float glyphWidth, float glyphHeight, ResourceLocation texture, boolean bold, float boldOffset, float shadowOffset) { + private static GlyphInstanceKey key(TextLayer layer, float glyphWidth, float glyphHeight, Identifier texture, boolean bold, float boldOffset, float shadowOffset) { var meshKey = new GlyphMeshKey(glyphWidth, glyphHeight, layer.pattern(), bold, boldOffset, shadowOffset); var modelKey = new GlyphModelKey(meshKey, layer.material(), texture); return new GlyphInstanceKey(modelKey, layer.bias()); @@ -260,7 +260,7 @@ private static GlyphInstanceKey effectKey(BakedGlyph glyph, TextLayer layer) { return effectKey(glyphExtension.flywheel$texture(), layer.material(), layer.bias()); } - private static GlyphInstanceKey effectKey(ResourceLocation texture, TextLayer.GlyphMaterial material, int bias) { + private static GlyphInstanceKey effectKey(Identifier texture, TextLayer.GlyphMaterial material, int bias) { var modelKey = new GlyphModelKey(null, material, texture); return new GlyphInstanceKey(modelKey, bias); } diff --git a/common/src/vanillin/java/dev/engine_room/vanillin/visuals/MinecartVisual.java b/common/src/vanillin/java/dev/engine_room/vanillin/visuals/MinecartVisual.java index 1b495d6de..a413e6f56 100644 --- a/common/src/vanillin/java/dev/engine_room/vanillin/visuals/MinecartVisual.java +++ b/common/src/vanillin/java/dev/engine_room/vanillin/visuals/MinecartVisual.java @@ -19,7 +19,7 @@ import dev.engine_room.flywheel.lib.visual.SimpleDynamicVisual; import dev.engine_room.flywheel.lib.visual.SimpleTickableVisual; import net.minecraft.client.model.geom.ModelLayerLocation; -import net.minecraft.resources.ResourceLocation; +import net.minecraft.resources.Identifier; import net.minecraft.util.Mth; import net.minecraft.world.entity.vehicle.AbstractMinecart; import net.minecraft.world.level.block.RenderShape; @@ -27,7 +27,7 @@ import net.minecraft.world.phys.Vec3; public class MinecartVisual extends AbstractEntityVisual implements SimpleTickableVisual, SimpleDynamicVisual { - private static final ResourceLocation TEXTURE = ResourceLocation.withDefaultNamespace("textures/entity/minecart.png"); + private static final Identifier TEXTURE = Identifier.withDefaultNamespace("textures/entity/minecart.png"); private static final Material MATERIAL = SimpleMaterial.builder() .texture(TEXTURE) .mipmap(false) diff --git a/fabric/src/backend/java/dev/engine_room/flywheel/backend/compile/FlwProgramsReloader.java b/fabric/src/backend/java/dev/engine_room/flywheel/backend/compile/FlwProgramsReloader.java index 7782a5d7d..26fc002b0 100644 --- a/fabric/src/backend/java/dev/engine_room/flywheel/backend/compile/FlwProgramsReloader.java +++ b/fabric/src/backend/java/dev/engine_room/flywheel/backend/compile/FlwProgramsReloader.java @@ -1,15 +1,15 @@ package dev.engine_room.flywheel.backend.compile; import dev.engine_room.flywheel.backend.NoiseTextures; -import dev.engine_room.flywheel.lib.util.ResourceUtil; +import dev.engine_room.flywheel.lib.util.IdentifierUtil; import net.fabricmc.fabric.api.resource.SimpleSynchronousResourceReloadListener; -import net.minecraft.resources.ResourceLocation; +import net.minecraft.resources.Identifier; import net.minecraft.server.packs.resources.ResourceManager; public final class FlwProgramsReloader implements SimpleSynchronousResourceReloadListener { public static final FlwProgramsReloader INSTANCE = new FlwProgramsReloader(); - public static final ResourceLocation ID = ResourceUtil.rl("programs"); + public static final Identifier ID = IdentifierUtil.id("programs"); private FlwProgramsReloader() { } @@ -21,7 +21,7 @@ public void onResourceManagerReload(ResourceManager manager) { } @Override - public ResourceLocation getFabricId() { + public Identifier getFabricId() { return ID; } } diff --git a/fabric/src/lib/java/dev/engine_room/flywheel/lib/model/baked/PartialModelEventHandler.java b/fabric/src/lib/java/dev/engine_room/flywheel/lib/model/baked/PartialModelEventHandler.java index 62fb40ac3..a1328c466 100644 --- a/fabric/src/lib/java/dev/engine_room/flywheel/lib/model/baked/PartialModelEventHandler.java +++ b/fabric/src/lib/java/dev/engine_room/flywheel/lib/model/baked/PartialModelEventHandler.java @@ -4,12 +4,12 @@ import org.jetbrains.annotations.ApiStatus; -import dev.engine_room.flywheel.lib.util.ResourceUtil; +import dev.engine_room.flywheel.lib.util.IdentifierUtil; import net.fabricmc.fabric.api.resource.ResourceReloadListenerKeys; import net.fabricmc.fabric.api.resource.SimpleSynchronousResourceReloadListener; import net.minecraft.client.Minecraft; import net.minecraft.client.resources.model.ModelManager; -import net.minecraft.resources.ResourceLocation; +import net.minecraft.resources.Identifier; import net.minecraft.server.packs.resources.ResourceManager; @ApiStatus.Internal @@ -17,23 +17,23 @@ public final class PartialModelEventHandler { private PartialModelEventHandler() { } - public static ResourceLocation[] onRegisterAdditional() { - return PartialModel.ALL.keySet().toArray(ResourceLocation[]::new); + public static Identifier[] onRegisterAdditional() { + return PartialModel.ALL.keySet().toArray(Identifier[]::new); } public static void onBakingCompleted(ModelManager manager) { PartialModel.populateOnInit = true; for (PartialModel partial : PartialModel.ALL.values()) { - partial.bakedModel = manager.getModel(partial.modelLocation()); + partial.bakedModel = manager.getModel(partial.modelId()); } } public static final class ReloadListener implements SimpleSynchronousResourceReloadListener { public static final ReloadListener INSTANCE = new ReloadListener(); - public static final ResourceLocation ID = ResourceUtil.rl("partial_models"); - public static final List DEPENDENCIES = List.of(ResourceReloadListenerKeys.MODELS); + public static final Identifier ID = IdentifierUtil.id("partial_models"); + public static final List DEPENDENCIES = List.of(ResourceReloadListenerKeys.MODELS); private ReloadListener() { } @@ -44,12 +44,12 @@ public void onResourceManagerReload(ResourceManager resourceManager) { } @Override - public ResourceLocation getFabricId() { + public Identifier getFabricId() { return ID; } @Override - public List getFabricDependencies() { + public List getFabricDependencies() { return DEPENDENCIES; } } diff --git a/fabric/src/main/java/dev/engine_room/flywheel/impl/FabricFlwConfig.java b/fabric/src/main/java/dev/engine_room/flywheel/impl/FabricFlwConfig.java index 0e566a409..8f5769366 100644 --- a/fabric/src/main/java/dev/engine_room/flywheel/impl/FabricFlwConfig.java +++ b/fabric/src/main/java/dev/engine_room/flywheel/impl/FabricFlwConfig.java @@ -18,8 +18,8 @@ import dev.engine_room.flywheel.backend.FlwBackend; import dev.engine_room.flywheel.backend.compile.LightSmoothness; import net.fabricmc.loader.api.FabricLoader; -import net.minecraft.ResourceLocationException; -import net.minecraft.resources.ResourceLocation; +import net.minecraft.IdentifierException; +import net.minecraft.resources.Identifier; import net.minecraft.util.Mth; public class FabricFlwConfig implements FlwConfig { @@ -122,11 +122,11 @@ private void readBackend(JsonObject object) { } try { - this.backend = Backend.REGISTRY.getOrThrow(ResourceLocation.parse(value)); + this.backend = Backend.REGISTRY.getOrThrow(Identifier.parse(value)); useDefaultBackend = false; return; - } catch (ResourceLocationException e) { - msg = "'backend' value '" + value + "' is not a valid resource location"; + } catch (IdentifierException e) { + msg = "'backend' value '" + value + "' is not a valid resource id"; } catch (IllegalArgumentException e) { msg = "Backend with ID '" + value + "' is not registered"; } catch (Exception e) { diff --git a/fabric/src/main/java/dev/engine_room/flywheel/impl/FlwLibXplatImpl.java b/fabric/src/main/java/dev/engine_room/flywheel/impl/FlwLibXplatImpl.java index 733d53425..9e94045a9 100644 --- a/fabric/src/main/java/dev/engine_room/flywheel/impl/FlwLibXplatImpl.java +++ b/fabric/src/main/java/dev/engine_room/flywheel/impl/FlwLibXplatImpl.java @@ -1,5 +1,7 @@ package dev.engine_room.flywheel.impl; +import net.minecraft.resources.Identifier; + import org.jetbrains.annotations.UnknownNullability; import dev.engine_room.flywheel.lib.internal.FlwLibXplat; @@ -9,13 +11,12 @@ import dev.engine_room.flywheel.lib.model.baked.ModelBuilderImpl; import net.minecraft.client.resources.model.BakedModel; import net.minecraft.client.resources.model.ModelManager; -import net.minecraft.resources.ResourceLocation; public class FlwLibXplatImpl implements FlwLibXplat { @Override @UnknownNullability - public BakedModel getBakedModel(ModelManager modelManager, ResourceLocation location) { - return modelManager.getModel(location); + public BakedModel getBakedModel(ModelManager modelManager, Identifier id) { + return modelManager.getModel(id); } @Override diff --git a/neoforge/src/lib/java/dev/engine_room/flywheel/lib/model/baked/PartialModelEventHandler.java b/neoforge/src/lib/java/dev/engine_room/flywheel/lib/model/baked/PartialModelEventHandler.java index d87eee208..bc56b2f94 100644 --- a/neoforge/src/lib/java/dev/engine_room/flywheel/lib/model/baked/PartialModelEventHandler.java +++ b/neoforge/src/lib/java/dev/engine_room/flywheel/lib/model/baked/PartialModelEventHandler.java @@ -2,11 +2,12 @@ import java.util.Map; +import net.minecraft.resources.Identifier; + import org.jetbrains.annotations.ApiStatus; import net.minecraft.client.resources.model.BakedModel; import net.minecraft.client.resources.model.ModelResourceLocation; -import net.minecraft.resources.ResourceLocation; import net.neoforged.neoforge.client.event.ModelEvent; @ApiStatus.Internal @@ -15,8 +16,8 @@ private PartialModelEventHandler() { } public static void onRegisterAdditional(ModelEvent.RegisterAdditional event) { - for (ResourceLocation modelLocation : PartialModel.ALL.keySet()) { - event.register(ModelResourceLocation.standalone(modelLocation)); + for (Identifier modelId : PartialModel.ALL.keySet()) { + event.register(ModelResourceLocation.standalone(modelId)); } } @@ -25,7 +26,7 @@ public static void onBakingCompleted(ModelEvent.BakingCompleted event) { Map models = event.getModels(); for (PartialModel partial : PartialModel.ALL.values()) { - partial.bakedModel = models.get(ModelResourceLocation.standalone(partial.modelLocation())); + partial.bakedModel = models.get(ModelResourceLocation.standalone(partial.modelId())); } } } diff --git a/neoforge/src/main/java/dev/engine_room/flywheel/impl/FlwLibXplatImpl.java b/neoforge/src/main/java/dev/engine_room/flywheel/impl/FlwLibXplatImpl.java index c5ccd80f6..51c62e944 100644 --- a/neoforge/src/main/java/dev/engine_room/flywheel/impl/FlwLibXplatImpl.java +++ b/neoforge/src/main/java/dev/engine_room/flywheel/impl/FlwLibXplatImpl.java @@ -1,5 +1,7 @@ package dev.engine_room.flywheel.impl; +import net.minecraft.resources.Identifier; + import org.jetbrains.annotations.UnknownNullability; import dev.engine_room.flywheel.lib.internal.FlwLibXplat; @@ -10,13 +12,12 @@ import net.minecraft.client.resources.model.BakedModel; import net.minecraft.client.resources.model.ModelManager; import net.minecraft.client.resources.model.ModelResourceLocation; -import net.minecraft.resources.ResourceLocation; public class FlwLibXplatImpl implements FlwLibXplat { @Override @UnknownNullability - public BakedModel getBakedModel(ModelManager modelManager, ResourceLocation location) { - return modelManager.getModel(ModelResourceLocation.standalone(location)); + public BakedModel getBakedModel(ModelManager modelManager, Identifier id) { + return modelManager.getModel(ModelResourceLocation.standalone(id)); } @Override diff --git a/neoforge/src/main/java/dev/engine_room/flywheel/impl/NeoForgeFlwConfig.java b/neoforge/src/main/java/dev/engine_room/flywheel/impl/NeoForgeFlwConfig.java index d1445bc19..fc28e42b3 100644 --- a/neoforge/src/main/java/dev/engine_room/flywheel/impl/NeoForgeFlwConfig.java +++ b/neoforge/src/main/java/dev/engine_room/flywheel/impl/NeoForgeFlwConfig.java @@ -7,8 +7,8 @@ import dev.engine_room.flywheel.api.backend.BackendManager; import dev.engine_room.flywheel.backend.BackendConfig; import dev.engine_room.flywheel.backend.compile.LightSmoothness; -import net.minecraft.ResourceLocationException; -import net.minecraft.resources.ResourceLocation; +import net.minecraft.IdentifierException; +import net.minecraft.resources.Identifier; import net.neoforged.fml.ModContainer; import net.neoforged.fml.config.ModConfig; import net.neoforged.neoforge.common.ModConfigSpec; @@ -42,11 +42,11 @@ private static Backend parseBackend(String value) { return BackendManager.defaultBackend(); } - ResourceLocation backendId; + Identifier backendId; try { - backendId = ResourceLocation.parse(value); - } catch (ResourceLocationException e) { - FlwImpl.CONFIG_LOGGER.warn("'backend' value '{}' is not a valid resource location", value); + backendId = Identifier.parse(value); + } catch (IdentifierException e) { + FlwImpl.CONFIG_LOGGER.warn("'backend' value '{}' is not a valid resource id", value); return null; } From 736b9de7a4dacc0579ab22fbb8fe1bece258b1d2 Mon Sep 17 00:00:00 2001 From: IThundxr Date: Mon, 22 Dec 2025 20:11:38 -0500 Subject: [PATCH 03/59] Update GeneratePackageInfosTask and switch to @NullMarked from jspecify --- .../gradle/nullability/GeneratePackageInfosTask.kt | 9 +-------- .../flywheel/api/internal/package-info.java | 10 ++-------- .../flywheel/lib/internal/package-info.java | 10 ++-------- .../flywheel/lib/task/functional/package-info.java | 9 ++------- 4 files changed, 7 insertions(+), 31 deletions(-) diff --git a/buildSrc/src/main/kotlin/dev/engine_room/gradle/nullability/GeneratePackageInfosTask.kt b/buildSrc/src/main/kotlin/dev/engine_room/gradle/nullability/GeneratePackageInfosTask.kt index c8787fedd..62173f9e0 100644 --- a/buildSrc/src/main/kotlin/dev/engine_room/gradle/nullability/GeneratePackageInfosTask.kt +++ b/buildSrc/src/main/kotlin/dev/engine_room/gradle/nullability/GeneratePackageInfosTask.kt @@ -41,15 +41,8 @@ open class GeneratePackageInfosTask: DefaultTask() { NioExtensions.withWriter(target.resolve("package-info.java"), closureOf { val packageName = relativePath.toString().replace(File.separator, ".") - write(StringGroovyMethods.stripMargin("""@ParametersAreNonnullByDefault - |@FieldsAreNonnullByDefault - |@MethodsReturnNonnullByDefault + write(StringGroovyMethods.stripMargin("""@org.jspecify.annotations.NullMarked |package $packageName; - | - |import javax.annotation.ParametersAreNonnullByDefault; - | - |import net.minecraft.FieldsAreNonnullByDefault; - |import net.minecraft.MethodsReturnNonnullByDefault; |""")) }) } diff --git a/common/src/api/java/dev/engine_room/flywheel/api/internal/package-info.java b/common/src/api/java/dev/engine_room/flywheel/api/internal/package-info.java index 9f47a63f6..3854580d0 100644 --- a/common/src/api/java/dev/engine_room/flywheel/api/internal/package-info.java +++ b/common/src/api/java/dev/engine_room/flywheel/api/internal/package-info.java @@ -1,12 +1,6 @@ @ApiStatus.Internal -@ParametersAreNonnullByDefault -@FieldsAreNonnullByDefault -@MethodsReturnNonnullByDefault +@NullMarked package dev.engine_room.flywheel.api.internal; -import javax.annotation.ParametersAreNonnullByDefault; - import org.jetbrains.annotations.ApiStatus; - -import net.minecraft.FieldsAreNonnullByDefault; -import net.minecraft.MethodsReturnNonnullByDefault; +import org.jspecify.annotations.NullMarked; diff --git a/common/src/lib/java/dev/engine_room/flywheel/lib/internal/package-info.java b/common/src/lib/java/dev/engine_room/flywheel/lib/internal/package-info.java index 6b8384594..2533461ff 100644 --- a/common/src/lib/java/dev/engine_room/flywheel/lib/internal/package-info.java +++ b/common/src/lib/java/dev/engine_room/flywheel/lib/internal/package-info.java @@ -1,12 +1,6 @@ @ApiStatus.Internal -@ParametersAreNonnullByDefault -@FieldsAreNonnullByDefault -@MethodsReturnNonnullByDefault +@NullMarked package dev.engine_room.flywheel.lib.internal; -import javax.annotation.ParametersAreNonnullByDefault; - import org.jetbrains.annotations.ApiStatus; - -import net.minecraft.FieldsAreNonnullByDefault; -import net.minecraft.MethodsReturnNonnullByDefault; +import org.jspecify.annotations.NullMarked; diff --git a/common/src/lib/java/dev/engine_room/flywheel/lib/task/functional/package-info.java b/common/src/lib/java/dev/engine_room/flywheel/lib/task/functional/package-info.java index 54e74141a..32bf7cee2 100644 --- a/common/src/lib/java/dev/engine_room/flywheel/lib/task/functional/package-info.java +++ b/common/src/lib/java/dev/engine_room/flywheel/lib/task/functional/package-info.java @@ -5,12 +5,7 @@ * interface, but do not need to create additional closure objects to translate when the consumer wishes to ignore * the context object. */ -@ParametersAreNonnullByDefault -@FieldsAreNonnullByDefault -@MethodsReturnNonnullByDefault +@NullMarked package dev.engine_room.flywheel.lib.task.functional; -import javax.annotation.ParametersAreNonnullByDefault; - -import net.minecraft.FieldsAreNonnullByDefault; -import net.minecraft.MethodsReturnNonnullByDefault; +import org.jspecify.annotations.NullMarked; From 260d81bce4914ac93e9a5df65e25773b86f6589f Mon Sep 17 00:00:00 2001 From: IThundxr Date: Mon, 22 Dec 2025 20:14:15 -0500 Subject: [PATCH 04/59] Switch from jetbrains annotations to jspecify --- .../java/dev/engine_room/flywheel/api/instance/Instancer.java | 2 +- .../java/dev/engine_room/flywheel/api/internal/FlwApiLink.java | 2 +- .../java/dev/engine_room/flywheel/api/registry/IdRegistry.java | 2 +- .../dev/engine_room/flywheel/api/visual/BlockEntityVisual.java | 2 +- .../flywheel/api/visualization/VisualizationManager.java | 2 +- .../flywheel/api/visualization/VisualizerRegistry.java | 2 +- .../flywheel/backend/SkyLightSectionStorageExtension.java | 2 +- .../engine_room/flywheel/backend/compile/ContextShader.java | 2 +- .../engine_room/flywheel/backend/compile/IndirectPrograms.java | 2 +- .../flywheel/backend/compile/InstancingPrograms.java | 2 +- .../dev/engine_room/flywheel/backend/compile/Pipeline.java | 2 +- .../backend/compile/component/UberShaderComponent.java | 2 +- .../flywheel/backend/compile/core/FailedCompilation.java | 2 +- .../engine_room/flywheel/backend/compile/core/LinkResult.java | 3 --- .../dev/engine_room/flywheel/backend/engine/BaseInstancer.java | 2 +- .../dev/engine_room/flywheel/backend/engine/DrawManager.java | 2 +- .../java/dev/engine_room/flywheel/backend/engine/LightLut.java | 2 +- .../dev/engine_room/flywheel/backend/engine/LightStorage.java | 2 +- .../flywheel/backend/engine/MaterialRenderState.java | 2 +- .../java/dev/engine_room/flywheel/backend/engine/MeshPool.java | 2 +- .../flywheel/backend/engine/embed/EmbeddedEnvironment.java | 2 +- .../flywheel/backend/engine/indirect/IndirectInstancer.java | 2 +- .../flywheel/backend/engine/indirect/StagingBuffer.java | 2 +- .../flywheel/backend/engine/instancing/InstancedInstancer.java | 2 +- .../flywheel/backend/engine/uniform/PlayerUniforms.java | 2 +- .../flywheel/backend/engine/uniform/UniformBuffer.java | 2 +- .../java/dev/engine_room/flywheel/backend/glsl/SourceFile.java | 2 +- .../engine_room/flywheel/backend/glsl/error/ErrorBuilder.java | 2 +- .../flywheel/backend/glsl/generate/FnSignature.java | 2 +- .../engine_room/flywheel/backend/glsl/generate/GlslSwitch.java | 2 +- .../flywheel/backend/mixin/AbstractClientPlayerAccessor.java | 2 +- .../backend/mixin/light/SkyLightSectionStorageMixin.java | 2 +- .../dev/engine_room/flywheel/backend/util/MemoryBuffer.java | 2 +- .../dev/engine_room/flywheel/lib/backend/SimpleBackend.java | 2 +- .../java/dev/engine_room/flywheel/lib/instance/FlatLit.java | 2 +- .../lib/java/dev/engine_room/flywheel/lib/model/ModelUtil.java | 2 +- .../dev/engine_room/flywheel/lib/model/SimpleQuadMesh.java | 2 +- .../flywheel/lib/model/baked/BakedModelBuilder.java | 2 +- .../flywheel/lib/model/baked/BlockModelBuilder.java | 2 +- .../flywheel/lib/model/baked/EmptyVirtualBlockGetter.java | 2 +- .../dev/engine_room/flywheel/lib/model/baked/MeshHelper.java | 2 +- .../flywheel/lib/model/baked/SinglePosVirtualBlockGetter.java | 2 +- .../flywheel/lib/model/baked/VirtualLightEngine.java | 2 +- .../dev/engine_room/flywheel/lib/model/part/InstanceTree.java | 2 +- .../java/dev/engine_room/flywheel/lib/model/part/MeshTree.java | 2 +- .../dev/engine_room/flywheel/lib/model/part/ModelTree.java | 2 +- .../dev/engine_room/flywheel/lib/model/part/ModelTrees.java | 2 +- .../engine_room/flywheel/lib/util/ResourceReloadHolder.java | 2 +- .../engine_room/flywheel/lib/vertex/AbstractVertexView.java | 2 +- .../java/dev/engine_room/flywheel/lib/vertex/VertexView.java | 2 +- .../flywheel/lib/visual/AbstractBlockEntityVisual.java | 2 +- .../engine_room/flywheel/lib/visual/AbstractEntityVisual.java | 2 +- .../flywheel/lib/visual/EntityVisibilityTester.java | 2 +- .../flywheel/lib/visual/component/ShadowComponent.java | 2 +- .../lib/visualization/SimpleBlockEntityVisualizer.java | 2 +- .../flywheel/lib/visualization/SimpleEntityVisualizer.java | 2 +- .../flywheel/lib/visualization/VisualizationHelper.java | 2 +- .../java/dev/engine_room/flywheel/impl/FlwApiLinkImpl.java | 2 +- .../dev/engine_room/flywheel/impl/compat/OptifineCompat.java | 2 +- .../dev/engine_room/flywheel/impl/compat/SodiumCompat.java | 2 +- .../flywheel/impl/extension/BlockEntityTypeExtension.java | 2 +- .../flywheel/impl/extension/EntityTypeExtension.java | 2 +- .../engine_room/flywheel/impl/layout/LayoutBuilderImpl.java | 2 +- .../engine_room/flywheel/impl/mixin/BlockEntityTypeMixin.java | 2 +- .../dev/engine_room/flywheel/impl/mixin/EntityTypeMixin.java | 2 +- .../engine_room/flywheel/impl/mixin/LevelRendererMixin.java | 2 +- .../flywheel/impl/mixin/visualmanage/BlockEntityMixin.java | 2 +- .../dev/engine_room/flywheel/impl/registry/IdRegistryImpl.java | 2 +- .../src/main/java/dev/engine_room/flywheel/impl/task/Flag.java | 2 +- .../flywheel/impl/visualization/VisualizationManagerImpl.java | 2 +- .../flywheel/impl/visualization/VisualizerRegistryImpl.java | 2 +- .../impl/visualization/storage/BlockEntityStorage.java | 2 +- .../flywheel/impl/visualization/storage/Storage.java | 2 +- .../vanillin/java/dev/engine_room/vanillin/VanillaVisuals.java | 2 +- .../engine_room/vanillin/compose/ComposableEntityVisual.java | 2 +- .../engine_room/vanillin/compose/ConfiguredElementImpl.java | 2 +- .../vanillin/config/BlockEntityVisualizerBuilder.java | 2 +- .../java/dev/engine_room/vanillin/config/Configurator.java | 2 +- .../engine_room/vanillin/config/EntityVisualizerBuilder.java | 2 +- .../dev/engine_room/vanillin/config/VisualOverrideValue.java | 2 +- .../java/dev/engine_room/vanillin/elements/ShadowElement.java | 2 +- .../java/dev/engine_room/vanillin/item/ItemModelBuilder.java | 2 +- .../dev/engine_room/vanillin/mixin/text/FontTextureMixin.java | 2 +- .../java/dev/engine_room/vanillin/text/SimpleTextLayer.java | 2 +- .../vanillin/java/dev/engine_room/vanillin/text/TextLayer.java | 2 +- .../java/dev/engine_room/vanillin/text/TextVisual.java | 2 +- .../java/dev/engine_room/vanillin/visuals/ChestVisual.java | 2 +- .../dev/engine_room/vanillin/visuals/ItemDisplayVisual.java | 2 +- .../java/dev/engine_room/vanillin/visuals/MinecartVisual.java | 2 +- .../java/dev/engine_room/vanillin/visuals/SignVisual.java | 2 +- .../flywheel/lib/model/baked/BakedModelBufferer.java | 2 +- .../lib/model/baked/FabricSinglePosVirtualBlockGetter.java | 2 +- .../flywheel/lib/model/baked/UniversalMeshEmitter.java | 2 +- .../flywheel/lib/model/baked/BakedModelBufferer.java | 2 +- .../lib/model/baked/NeoForgeSinglePosVirtualBlockGetter.java | 2 +- .../java/dev/engine_room/flywheel/impl/NeoForgeFlwConfig.java | 2 +- 96 files changed, 95 insertions(+), 98 deletions(-) diff --git a/common/src/api/java/dev/engine_room/flywheel/api/instance/Instancer.java b/common/src/api/java/dev/engine_room/flywheel/api/instance/Instancer.java index 704f0a9b4..d1de1a04c 100644 --- a/common/src/api/java/dev/engine_room/flywheel/api/instance/Instancer.java +++ b/common/src/api/java/dev/engine_room/flywheel/api/instance/Instancer.java @@ -1,6 +1,6 @@ package dev.engine_room.flywheel.api.instance; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; import dev.engine_room.flywheel.api.backend.BackendImplemented; diff --git a/common/src/api/java/dev/engine_room/flywheel/api/internal/FlwApiLink.java b/common/src/api/java/dev/engine_room/flywheel/api/internal/FlwApiLink.java index 13e752154..7d4e10191 100644 --- a/common/src/api/java/dev/engine_room/flywheel/api/internal/FlwApiLink.java +++ b/common/src/api/java/dev/engine_room/flywheel/api/internal/FlwApiLink.java @@ -1,6 +1,6 @@ package dev.engine_room.flywheel.api.internal; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; import dev.engine_room.flywheel.api.backend.Backend; import dev.engine_room.flywheel.api.layout.LayoutBuilder; diff --git a/common/src/api/java/dev/engine_room/flywheel/api/registry/IdRegistry.java b/common/src/api/java/dev/engine_room/flywheel/api/registry/IdRegistry.java index e53327d1d..9b615f347 100644 --- a/common/src/api/java/dev/engine_room/flywheel/api/registry/IdRegistry.java +++ b/common/src/api/java/dev/engine_room/flywheel/api/registry/IdRegistry.java @@ -4,7 +4,7 @@ import java.util.Set; import org.jetbrains.annotations.ApiStatus; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; import org.jetbrains.annotations.UnmodifiableView; import net.minecraft.resources.Identifier; diff --git a/common/src/api/java/dev/engine_room/flywheel/api/visual/BlockEntityVisual.java b/common/src/api/java/dev/engine_room/flywheel/api/visual/BlockEntityVisual.java index ea1950376..1d57dbf5a 100644 --- a/common/src/api/java/dev/engine_room/flywheel/api/visual/BlockEntityVisual.java +++ b/common/src/api/java/dev/engine_room/flywheel/api/visual/BlockEntityVisual.java @@ -2,7 +2,7 @@ import java.util.function.Consumer; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; import dev.engine_room.flywheel.api.instance.Instance; import net.minecraft.world.level.block.entity.BlockEntity; diff --git a/common/src/api/java/dev/engine_room/flywheel/api/visualization/VisualizationManager.java b/common/src/api/java/dev/engine_room/flywheel/api/visualization/VisualizationManager.java index 33437d798..07a2b72a6 100644 --- a/common/src/api/java/dev/engine_room/flywheel/api/visualization/VisualizationManager.java +++ b/common/src/api/java/dev/engine_room/flywheel/api/visualization/VisualizationManager.java @@ -3,7 +3,7 @@ import java.util.SortedSet; import org.jetbrains.annotations.ApiStatus; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; import dev.engine_room.flywheel.api.backend.RenderContext; import dev.engine_room.flywheel.api.internal.FlwApiLink; diff --git a/common/src/api/java/dev/engine_room/flywheel/api/visualization/VisualizerRegistry.java b/common/src/api/java/dev/engine_room/flywheel/api/visualization/VisualizerRegistry.java index eda95a7e7..e85a14dd2 100644 --- a/common/src/api/java/dev/engine_room/flywheel/api/visualization/VisualizerRegistry.java +++ b/common/src/api/java/dev/engine_room/flywheel/api/visualization/VisualizerRegistry.java @@ -1,6 +1,6 @@ package dev.engine_room.flywheel.api.visualization; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; import dev.engine_room.flywheel.api.internal.FlwApiLink; import net.minecraft.world.entity.Entity; diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/SkyLightSectionStorageExtension.java b/common/src/backend/java/dev/engine_room/flywheel/backend/SkyLightSectionStorageExtension.java index fe3596c1e..977bfe979 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/SkyLightSectionStorageExtension.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/SkyLightSectionStorageExtension.java @@ -1,6 +1,6 @@ package dev.engine_room.flywheel.backend; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; import net.minecraft.world.level.chunk.DataLayer; diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/compile/ContextShader.java b/common/src/backend/java/dev/engine_room/flywheel/backend/compile/ContextShader.java index 7c8aac5dd..51a559747 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/compile/ContextShader.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/compile/ContextShader.java @@ -3,7 +3,7 @@ import java.util.Locale; import java.util.function.Consumer; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; import dev.engine_room.flywheel.backend.Samplers; import dev.engine_room.flywheel.backend.compile.core.Compilation; diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/compile/IndirectPrograms.java b/common/src/backend/java/dev/engine_room/flywheel/backend/compile/IndirectPrograms.java index 4526c0204..88a4ab763 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/compile/IndirectPrograms.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/compile/IndirectPrograms.java @@ -2,7 +2,7 @@ import java.util.List; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; import com.google.common.collect.ImmutableList; diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/compile/InstancingPrograms.java b/common/src/backend/java/dev/engine_room/flywheel/backend/compile/InstancingPrograms.java index 96704fbbc..de4ec99d8 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/compile/InstancingPrograms.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/compile/InstancingPrograms.java @@ -2,7 +2,7 @@ import java.util.List; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; import com.google.common.collect.ImmutableList; diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/compile/Pipeline.java b/common/src/backend/java/dev/engine_room/flywheel/backend/compile/Pipeline.java index 849e1bad6..c26515b8a 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/compile/Pipeline.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/compile/Pipeline.java @@ -3,7 +3,7 @@ import java.util.Objects; import java.util.function.Consumer; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; import dev.engine_room.flywheel.api.instance.Instance; import dev.engine_room.flywheel.api.instance.InstanceType; diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/compile/component/UberShaderComponent.java b/common/src/backend/java/dev/engine_room/flywheel/backend/compile/component/UberShaderComponent.java index e58589e22..ce75cf45b 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/compile/component/UberShaderComponent.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/compile/component/UberShaderComponent.java @@ -5,7 +5,7 @@ import java.util.List; import java.util.function.UnaryOperator; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/compile/core/FailedCompilation.java b/common/src/backend/java/dev/engine_room/flywheel/backend/compile/core/FailedCompilation.java index 5b119f906..de5763bad 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/compile/core/FailedCompilation.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/compile/core/FailedCompilation.java @@ -8,7 +8,7 @@ import java.util.stream.Collectors; import java.util.stream.Stream; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; import dev.engine_room.flywheel.backend.glsl.SourceFile; import dev.engine_room.flywheel.backend.glsl.SourceLines; diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/compile/core/LinkResult.java b/common/src/backend/java/dev/engine_room/flywheel/backend/compile/core/LinkResult.java index cb28347c6..aa6541d34 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/compile/core/LinkResult.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/compile/core/LinkResult.java @@ -1,7 +1,5 @@ package dev.engine_room.flywheel.backend.compile.core; -import org.jetbrains.annotations.NotNull; - import dev.engine_room.flywheel.backend.gl.shader.GlProgram; public sealed interface LinkResult { @@ -9,7 +7,6 @@ public sealed interface LinkResult { record Success(GlProgram program, String log) implements LinkResult { @Override - @NotNull public GlProgram unwrap() { return program; } diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/engine/BaseInstancer.java b/common/src/backend/java/dev/engine_room/flywheel/backend/engine/BaseInstancer.java index eae6d73cb..d7cd18295 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/engine/BaseInstancer.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/engine/BaseInstancer.java @@ -2,7 +2,7 @@ import java.util.ArrayList; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; import dev.engine_room.flywheel.api.instance.Instance; import dev.engine_room.flywheel.backend.util.AtomicBitSet; diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/engine/DrawManager.java b/common/src/backend/java/dev/engine_room/flywheel/backend/engine/DrawManager.java index 084874a9f..78ae964cf 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/engine/DrawManager.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/engine/DrawManager.java @@ -8,7 +8,7 @@ import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentLinkedQueue; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; import com.mojang.datafixers.util.Pair; diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/engine/LightLut.java b/common/src/backend/java/dev/engine_room/flywheel/backend/engine/LightLut.java index 987ae674b..23a32c7ac 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/engine/LightLut.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/engine/LightLut.java @@ -3,7 +3,7 @@ import java.util.function.BiConsumer; import java.util.function.Supplier; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; import it.unimi.dsi.fastutil.ints.IntArrayList; import net.minecraft.core.SectionPos; diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/engine/LightStorage.java b/common/src/backend/java/dev/engine_room/flywheel/backend/engine/LightStorage.java index db248009b..6a6ee8ac5 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/engine/LightStorage.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/engine/LightStorage.java @@ -3,7 +3,7 @@ import java.util.BitSet; import java.util.Objects; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; import org.lwjgl.system.MemoryUtil; import dev.engine_room.flywheel.api.task.Plan; diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/engine/MaterialRenderState.java b/common/src/backend/java/dev/engine_room/flywheel/backend/engine/MaterialRenderState.java index 74ddc681d..2834990ef 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/engine/MaterialRenderState.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/engine/MaterialRenderState.java @@ -2,7 +2,7 @@ import java.util.Comparator; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; import org.lwjgl.opengl.GL11; import com.mojang.blaze3d.platform.GlStateManager; diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/engine/MeshPool.java b/common/src/backend/java/dev/engine_room/flywheel/backend/engine/MeshPool.java index 57ed3724f..fc817d775 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/engine/MeshPool.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/engine/MeshPool.java @@ -5,7 +5,7 @@ import java.util.List; import java.util.Map; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; import org.lwjgl.opengl.GL32; import dev.engine_room.flywheel.api.model.Mesh; diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/engine/embed/EmbeddedEnvironment.java b/common/src/backend/java/dev/engine_room/flywheel/backend/engine/embed/EmbeddedEnvironment.java index e45dceec0..1e7c8afb6 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/engine/embed/EmbeddedEnvironment.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/engine/embed/EmbeddedEnvironment.java @@ -1,6 +1,6 @@ package dev.engine_room.flywheel.backend.engine.embed; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; import org.joml.Matrix3f; import org.joml.Matrix3fc; import org.joml.Matrix4f; diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/engine/indirect/IndirectInstancer.java b/common/src/backend/java/dev/engine_room/flywheel/backend/engine/indirect/IndirectInstancer.java index 2670ba777..b9a23ec2f 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/engine/indirect/IndirectInstancer.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/engine/indirect/IndirectInstancer.java @@ -5,7 +5,7 @@ import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicReference; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; import org.jetbrains.annotations.UnknownNullability; import org.joml.Vector4fc; import org.lwjgl.system.MemoryUtil; diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/engine/indirect/StagingBuffer.java b/common/src/backend/java/dev/engine_room/flywheel/backend/engine/indirect/StagingBuffer.java index efe107f92..a6c5d6771 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/engine/indirect/StagingBuffer.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/engine/indirect/StagingBuffer.java @@ -2,7 +2,7 @@ import java.util.function.LongConsumer; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; import org.lwjgl.opengl.GL45; import org.lwjgl.opengl.GL45C; import org.lwjgl.system.MemoryUtil; diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/engine/instancing/InstancedInstancer.java b/common/src/backend/java/dev/engine_room/flywheel/backend/engine/instancing/InstancedInstancer.java index c56b281eb..ab31df3fc 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/engine/instancing/InstancedInstancer.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/engine/instancing/InstancedInstancer.java @@ -3,7 +3,7 @@ import java.util.ArrayList; import java.util.List; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; import dev.engine_room.flywheel.api.instance.Instance; import dev.engine_room.flywheel.api.instance.InstanceWriter; diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/engine/uniform/PlayerUniforms.java b/common/src/backend/java/dev/engine_room/flywheel/backend/engine/uniform/PlayerUniforms.java index 1c2bc6b34..dbeb5e5a7 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/engine/uniform/PlayerUniforms.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/engine/uniform/PlayerUniforms.java @@ -1,6 +1,6 @@ package dev.engine_room.flywheel.backend.engine.uniform; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; import dev.engine_room.flywheel.api.backend.RenderContext; import dev.engine_room.flywheel.backend.FlwBackendXplat; diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/engine/uniform/UniformBuffer.java b/common/src/backend/java/dev/engine_room/flywheel/backend/engine/uniform/UniformBuffer.java index 4dacf1cc0..c07c0ce29 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/engine/uniform/UniformBuffer.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/engine/uniform/UniformBuffer.java @@ -1,6 +1,6 @@ package dev.engine_room.flywheel.backend.engine.uniform; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; import org.lwjgl.opengl.GL32; import dev.engine_room.flywheel.backend.gl.buffer.GlBuffer; diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/glsl/SourceFile.java b/common/src/backend/java/dev/engine_room/flywheel/backend/glsl/SourceFile.java index ae75be6c5..8d3c1e7a4 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/glsl/SourceFile.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/glsl/SourceFile.java @@ -7,7 +7,7 @@ import java.util.Set; import java.util.function.Function; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; import com.google.common.collect.ImmutableList; import com.mojang.datafixers.util.Pair; diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/glsl/error/ErrorBuilder.java b/common/src/backend/java/dev/engine_room/flywheel/backend/glsl/error/ErrorBuilder.java index 971709e12..07bc535e1 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/glsl/error/ErrorBuilder.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/glsl/error/ErrorBuilder.java @@ -5,7 +5,7 @@ import java.util.stream.Collectors; import java.util.stream.Stream; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; import org.jetbrains.annotations.VisibleForTesting; import dev.engine_room.flywheel.backend.glsl.SourceFile; diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/glsl/generate/FnSignature.java b/common/src/backend/java/dev/engine_room/flywheel/backend/glsl/generate/FnSignature.java index 6dd81ff65..1bf03bc24 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/glsl/generate/FnSignature.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/glsl/generate/FnSignature.java @@ -3,7 +3,7 @@ import java.util.Collection; import java.util.stream.Collectors; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; import com.google.common.collect.ImmutableList; import com.mojang.datafixers.util.Pair; diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/glsl/generate/GlslSwitch.java b/common/src/backend/java/dev/engine_room/flywheel/backend/glsl/generate/GlslSwitch.java index 5112165cb..e1588512f 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/glsl/generate/GlslSwitch.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/glsl/generate/GlslSwitch.java @@ -4,7 +4,7 @@ import java.util.List; import java.util.stream.Collectors; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; import com.mojang.datafixers.util.Pair; diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/mixin/AbstractClientPlayerAccessor.java b/common/src/backend/java/dev/engine_room/flywheel/backend/mixin/AbstractClientPlayerAccessor.java index 284653596..2be77ad8d 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/mixin/AbstractClientPlayerAccessor.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/mixin/AbstractClientPlayerAccessor.java @@ -1,6 +1,6 @@ package dev.engine_room.flywheel.backend.mixin; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.gen.Invoker; diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/mixin/light/SkyLightSectionStorageMixin.java b/common/src/backend/java/dev/engine_room/flywheel/backend/mixin/light/SkyLightSectionStorageMixin.java index 8e178e127..37f74f7fa 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/mixin/light/SkyLightSectionStorageMixin.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/mixin/light/SkyLightSectionStorageMixin.java @@ -1,6 +1,6 @@ package dev.engine_room.flywheel.backend.mixin.light; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; import org.spongepowered.asm.mixin.Mixin; import dev.engine_room.flywheel.backend.SkyLightSectionStorageExtension; diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/util/MemoryBuffer.java b/common/src/backend/java/dev/engine_room/flywheel/backend/util/MemoryBuffer.java index f87914414..71a5b130d 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/util/MemoryBuffer.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/util/MemoryBuffer.java @@ -1,6 +1,6 @@ package dev.engine_room.flywheel.backend.util; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; import dev.engine_room.flywheel.lib.memory.MemoryBlock; diff --git a/common/src/lib/java/dev/engine_room/flywheel/lib/backend/SimpleBackend.java b/common/src/lib/java/dev/engine_room/flywheel/lib/backend/SimpleBackend.java index 8e51162ed..79838edee 100644 --- a/common/src/lib/java/dev/engine_room/flywheel/lib/backend/SimpleBackend.java +++ b/common/src/lib/java/dev/engine_room/flywheel/lib/backend/SimpleBackend.java @@ -5,7 +5,7 @@ import java.util.function.Function; import java.util.function.IntSupplier; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; import dev.engine_room.flywheel.api.backend.Backend; import dev.engine_room.flywheel.api.backend.Engine; diff --git a/common/src/lib/java/dev/engine_room/flywheel/lib/instance/FlatLit.java b/common/src/lib/java/dev/engine_room/flywheel/lib/instance/FlatLit.java index 7cd26dab5..9fe9f4884 100644 --- a/common/src/lib/java/dev/engine_room/flywheel/lib/instance/FlatLit.java +++ b/common/src/lib/java/dev/engine_room/flywheel/lib/instance/FlatLit.java @@ -3,7 +3,7 @@ import java.util.Iterator; import java.util.stream.Stream; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; import dev.engine_room.flywheel.api.instance.Instance; import dev.engine_room.flywheel.lib.visual.AbstractBlockEntityVisual; diff --git a/common/src/lib/java/dev/engine_room/flywheel/lib/model/ModelUtil.java b/common/src/lib/java/dev/engine_room/flywheel/lib/model/ModelUtil.java index f53157e7c..e916a4c6c 100644 --- a/common/src/lib/java/dev/engine_room/flywheel/lib/model/ModelUtil.java +++ b/common/src/lib/java/dev/engine_room/flywheel/lib/model/ModelUtil.java @@ -2,7 +2,7 @@ import java.util.Collection; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; import org.joml.Vector3f; import org.joml.Vector4f; diff --git a/common/src/lib/java/dev/engine_room/flywheel/lib/model/SimpleQuadMesh.java b/common/src/lib/java/dev/engine_room/flywheel/lib/model/SimpleQuadMesh.java index e7ff25a5b..437b68e9e 100644 --- a/common/src/lib/java/dev/engine_room/flywheel/lib/model/SimpleQuadMesh.java +++ b/common/src/lib/java/dev/engine_room/flywheel/lib/model/SimpleQuadMesh.java @@ -1,6 +1,6 @@ package dev.engine_room.flywheel.lib.model; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; import org.joml.Vector4f; import org.joml.Vector4fc; diff --git a/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/BakedModelBuilder.java b/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/BakedModelBuilder.java index 478d9cf90..2770ad028 100644 --- a/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/BakedModelBuilder.java +++ b/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/BakedModelBuilder.java @@ -2,7 +2,7 @@ import java.util.function.BiFunction; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; import com.mojang.blaze3d.vertex.PoseStack; diff --git a/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/BlockModelBuilder.java b/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/BlockModelBuilder.java index 81bc3fa27..75da04b36 100644 --- a/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/BlockModelBuilder.java +++ b/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/BlockModelBuilder.java @@ -2,7 +2,7 @@ import java.util.function.BiFunction; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; import com.mojang.blaze3d.vertex.PoseStack; diff --git a/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/EmptyVirtualBlockGetter.java b/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/EmptyVirtualBlockGetter.java index a5439444d..1c24d2a0a 100644 --- a/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/EmptyVirtualBlockGetter.java +++ b/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/EmptyVirtualBlockGetter.java @@ -2,7 +2,7 @@ import java.util.function.ToIntFunction; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; import net.minecraft.core.BlockPos; import net.minecraft.world.level.block.Blocks; diff --git a/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/MeshHelper.java b/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/MeshHelper.java index c0191fc4c..093fdd332 100644 --- a/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/MeshHelper.java +++ b/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/MeshHelper.java @@ -2,7 +2,7 @@ import java.nio.ByteBuffer; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; import org.lwjgl.system.MemoryUtil; import com.mojang.blaze3d.vertex.MeshData; diff --git a/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/SinglePosVirtualBlockGetter.java b/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/SinglePosVirtualBlockGetter.java index 21d248724..5ff46754e 100644 --- a/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/SinglePosVirtualBlockGetter.java +++ b/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/SinglePosVirtualBlockGetter.java @@ -2,7 +2,7 @@ import java.util.function.ToIntFunction; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; import net.minecraft.core.BlockPos; import net.minecraft.world.level.block.Blocks; diff --git a/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/VirtualLightEngine.java b/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/VirtualLightEngine.java index e8b072384..cbb50b53d 100644 --- a/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/VirtualLightEngine.java +++ b/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/VirtualLightEngine.java @@ -2,7 +2,7 @@ import java.util.function.ToIntFunction; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; import net.minecraft.core.BlockPos; import net.minecraft.core.SectionPos; diff --git a/common/src/lib/java/dev/engine_room/flywheel/lib/model/part/InstanceTree.java b/common/src/lib/java/dev/engine_room/flywheel/lib/model/part/InstanceTree.java index 87776ec0b..a9aa9a9d9 100644 --- a/common/src/lib/java/dev/engine_room/flywheel/lib/model/part/InstanceTree.java +++ b/common/src/lib/java/dev/engine_room/flywheel/lib/model/part/InstanceTree.java @@ -5,7 +5,7 @@ import java.util.function.ObjIntConsumer; import org.jetbrains.annotations.ApiStatus; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; import org.joml.Matrix4f; import org.joml.Matrix4fc; import org.joml.Quaternionf; diff --git a/common/src/lib/java/dev/engine_room/flywheel/lib/model/part/MeshTree.java b/common/src/lib/java/dev/engine_room/flywheel/lib/model/part/MeshTree.java index 3575a4386..406729011 100644 --- a/common/src/lib/java/dev/engine_room/flywheel/lib/model/part/MeshTree.java +++ b/common/src/lib/java/dev/engine_room/flywheel/lib/model/part/MeshTree.java @@ -3,7 +3,7 @@ import java.util.Arrays; import java.util.NoSuchElementException; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; import com.mojang.blaze3d.vertex.PoseStack; diff --git a/common/src/lib/java/dev/engine_room/flywheel/lib/model/part/ModelTree.java b/common/src/lib/java/dev/engine_room/flywheel/lib/model/part/ModelTree.java index 5774ebf44..57c3cd652 100644 --- a/common/src/lib/java/dev/engine_room/flywheel/lib/model/part/ModelTree.java +++ b/common/src/lib/java/dev/engine_room/flywheel/lib/model/part/ModelTree.java @@ -4,7 +4,7 @@ import java.util.Map; import java.util.NoSuchElementException; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; import dev.engine_room.flywheel.api.model.Model; import net.minecraft.client.model.geom.PartPose; diff --git a/common/src/lib/java/dev/engine_room/flywheel/lib/model/part/ModelTrees.java b/common/src/lib/java/dev/engine_room/flywheel/lib/model/part/ModelTrees.java index 1f26053f4..84206cf81 100644 --- a/common/src/lib/java/dev/engine_room/flywheel/lib/model/part/ModelTrees.java +++ b/common/src/lib/java/dev/engine_room/flywheel/lib/model/part/ModelTrees.java @@ -5,7 +5,7 @@ import java.util.Map; import java.util.Set; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; import dev.engine_room.flywheel.api.material.Material; import dev.engine_room.flywheel.api.model.Mesh; diff --git a/common/src/lib/java/dev/engine_room/flywheel/lib/util/ResourceReloadHolder.java b/common/src/lib/java/dev/engine_room/flywheel/lib/util/ResourceReloadHolder.java index 9ff36d40c..1dc6c6003 100644 --- a/common/src/lib/java/dev/engine_room/flywheel/lib/util/ResourceReloadHolder.java +++ b/common/src/lib/java/dev/engine_room/flywheel/lib/util/ResourceReloadHolder.java @@ -6,7 +6,7 @@ import java.util.function.Supplier; import org.jetbrains.annotations.ApiStatus; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; public final class ResourceReloadHolder implements Supplier { private static final Set> ALL = Collections.newSetFromMap(new WeakHashMap<>()); diff --git a/common/src/lib/java/dev/engine_room/flywheel/lib/vertex/AbstractVertexView.java b/common/src/lib/java/dev/engine_room/flywheel/lib/vertex/AbstractVertexView.java index 7a7b506f3..2a18b0333 100644 --- a/common/src/lib/java/dev/engine_room/flywheel/lib/vertex/AbstractVertexView.java +++ b/common/src/lib/java/dev/engine_room/flywheel/lib/vertex/AbstractVertexView.java @@ -1,6 +1,6 @@ package dev.engine_room.flywheel.lib.vertex; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; public abstract class AbstractVertexView implements VertexView { protected long ptr; diff --git a/common/src/lib/java/dev/engine_room/flywheel/lib/vertex/VertexView.java b/common/src/lib/java/dev/engine_room/flywheel/lib/vertex/VertexView.java index 4c60462a2..a220d6a9c 100644 --- a/common/src/lib/java/dev/engine_room/flywheel/lib/vertex/VertexView.java +++ b/common/src/lib/java/dev/engine_room/flywheel/lib/vertex/VertexView.java @@ -1,6 +1,6 @@ package dev.engine_room.flywheel.lib.vertex; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; import org.lwjgl.system.MemoryUtil; import dev.engine_room.flywheel.api.vertex.MutableVertexList; diff --git a/common/src/lib/java/dev/engine_room/flywheel/lib/visual/AbstractBlockEntityVisual.java b/common/src/lib/java/dev/engine_room/flywheel/lib/visual/AbstractBlockEntityVisual.java index 25d05d481..769fa6f58 100644 --- a/common/src/lib/java/dev/engine_room/flywheel/lib/visual/AbstractBlockEntityVisual.java +++ b/common/src/lib/java/dev/engine_room/flywheel/lib/visual/AbstractBlockEntityVisual.java @@ -2,7 +2,7 @@ import java.util.Iterator; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; import org.jetbrains.annotations.UnknownNullability; import org.joml.FrustumIntersection; diff --git a/common/src/lib/java/dev/engine_room/flywheel/lib/visual/AbstractEntityVisual.java b/common/src/lib/java/dev/engine_room/flywheel/lib/visual/AbstractEntityVisual.java index 80ffa73a0..5f0cca2e7 100644 --- a/common/src/lib/java/dev/engine_room/flywheel/lib/visual/AbstractEntityVisual.java +++ b/common/src/lib/java/dev/engine_room/flywheel/lib/visual/AbstractEntityVisual.java @@ -1,6 +1,6 @@ package dev.engine_room.flywheel.lib.visual; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; import org.joml.FrustumIntersection; import org.joml.Vector3f; diff --git a/common/src/lib/java/dev/engine_room/flywheel/lib/visual/EntityVisibilityTester.java b/common/src/lib/java/dev/engine_room/flywheel/lib/visual/EntityVisibilityTester.java index 90e2e977e..3354a4665 100644 --- a/common/src/lib/java/dev/engine_room/flywheel/lib/visual/EntityVisibilityTester.java +++ b/common/src/lib/java/dev/engine_room/flywheel/lib/visual/EntityVisibilityTester.java @@ -1,6 +1,6 @@ package dev.engine_room.flywheel.lib.visual; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; import org.joml.FrustumIntersection; import dev.engine_room.flywheel.lib.math.MoreMath; diff --git a/common/src/lib/java/dev/engine_room/flywheel/lib/visual/component/ShadowComponent.java b/common/src/lib/java/dev/engine_room/flywheel/lib/visual/component/ShadowComponent.java index fece5a5ea..bfe488d7d 100644 --- a/common/src/lib/java/dev/engine_room/flywheel/lib/visual/component/ShadowComponent.java +++ b/common/src/lib/java/dev/engine_room/flywheel/lib/visual/component/ShadowComponent.java @@ -2,7 +2,7 @@ import net.minecraft.resources.Identifier; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; import org.joml.Vector4f; import org.joml.Vector4fc; diff --git a/common/src/lib/java/dev/engine_room/flywheel/lib/visualization/SimpleBlockEntityVisualizer.java b/common/src/lib/java/dev/engine_room/flywheel/lib/visualization/SimpleBlockEntityVisualizer.java index 6a82041aa..e4d393025 100644 --- a/common/src/lib/java/dev/engine_room/flywheel/lib/visualization/SimpleBlockEntityVisualizer.java +++ b/common/src/lib/java/dev/engine_room/flywheel/lib/visualization/SimpleBlockEntityVisualizer.java @@ -3,7 +3,7 @@ import java.util.Objects; import java.util.function.Predicate; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; import dev.engine_room.flywheel.api.visual.BlockEntityVisual; import dev.engine_room.flywheel.api.visualization.BlockEntityVisualizer; diff --git a/common/src/lib/java/dev/engine_room/flywheel/lib/visualization/SimpleEntityVisualizer.java b/common/src/lib/java/dev/engine_room/flywheel/lib/visualization/SimpleEntityVisualizer.java index 86e1832ea..c817c4a62 100644 --- a/common/src/lib/java/dev/engine_room/flywheel/lib/visualization/SimpleEntityVisualizer.java +++ b/common/src/lib/java/dev/engine_room/flywheel/lib/visualization/SimpleEntityVisualizer.java @@ -3,7 +3,7 @@ import java.util.Objects; import java.util.function.Predicate; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; import dev.engine_room.flywheel.api.visual.EntityVisual; import dev.engine_room.flywheel.api.visualization.EntityVisualizer; diff --git a/common/src/lib/java/dev/engine_room/flywheel/lib/visualization/VisualizationHelper.java b/common/src/lib/java/dev/engine_room/flywheel/lib/visualization/VisualizationHelper.java index 8b8f79860..da7796960 100644 --- a/common/src/lib/java/dev/engine_room/flywheel/lib/visualization/VisualizationHelper.java +++ b/common/src/lib/java/dev/engine_room/flywheel/lib/visualization/VisualizationHelper.java @@ -1,6 +1,6 @@ package dev.engine_room.flywheel.lib.visualization; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; import dev.engine_room.flywheel.api.visual.Effect; import dev.engine_room.flywheel.api.visual.Visual; diff --git a/common/src/main/java/dev/engine_room/flywheel/impl/FlwApiLinkImpl.java b/common/src/main/java/dev/engine_room/flywheel/impl/FlwApiLinkImpl.java index 6f03a7dab..8b5902314 100644 --- a/common/src/main/java/dev/engine_room/flywheel/impl/FlwApiLinkImpl.java +++ b/common/src/main/java/dev/engine_room/flywheel/impl/FlwApiLinkImpl.java @@ -1,6 +1,6 @@ package dev.engine_room.flywheel.impl; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; import dev.engine_room.flywheel.api.backend.Backend; import dev.engine_room.flywheel.api.internal.FlwApiLink; diff --git a/common/src/main/java/dev/engine_room/flywheel/impl/compat/OptifineCompat.java b/common/src/main/java/dev/engine_room/flywheel/impl/compat/OptifineCompat.java index 42dfe4687..4d14fd4ab 100644 --- a/common/src/main/java/dev/engine_room/flywheel/impl/compat/OptifineCompat.java +++ b/common/src/main/java/dev/engine_room/flywheel/impl/compat/OptifineCompat.java @@ -2,7 +2,7 @@ import java.lang.reflect.Field; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; import dev.engine_room.flywheel.impl.FlwImpl; diff --git a/common/src/main/java/dev/engine_room/flywheel/impl/compat/SodiumCompat.java b/common/src/main/java/dev/engine_room/flywheel/impl/compat/SodiumCompat.java index 130272c43..32cccd7f9 100644 --- a/common/src/main/java/dev/engine_room/flywheel/impl/compat/SodiumCompat.java +++ b/common/src/main/java/dev/engine_room/flywheel/impl/compat/SodiumCompat.java @@ -1,6 +1,6 @@ package dev.engine_room.flywheel.impl.compat; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; import dev.engine_room.flywheel.api.visualization.BlockEntityVisualizer; import dev.engine_room.flywheel.impl.FlwImpl; diff --git a/common/src/main/java/dev/engine_room/flywheel/impl/extension/BlockEntityTypeExtension.java b/common/src/main/java/dev/engine_room/flywheel/impl/extension/BlockEntityTypeExtension.java index b15f29c7a..93541d0c6 100644 --- a/common/src/main/java/dev/engine_room/flywheel/impl/extension/BlockEntityTypeExtension.java +++ b/common/src/main/java/dev/engine_room/flywheel/impl/extension/BlockEntityTypeExtension.java @@ -1,6 +1,6 @@ package dev.engine_room.flywheel.impl.extension; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; import dev.engine_room.flywheel.api.visualization.BlockEntityVisualizer; import net.minecraft.world.level.block.entity.BlockEntity; diff --git a/common/src/main/java/dev/engine_room/flywheel/impl/extension/EntityTypeExtension.java b/common/src/main/java/dev/engine_room/flywheel/impl/extension/EntityTypeExtension.java index 2b0f8927f..5aa6cc4da 100644 --- a/common/src/main/java/dev/engine_room/flywheel/impl/extension/EntityTypeExtension.java +++ b/common/src/main/java/dev/engine_room/flywheel/impl/extension/EntityTypeExtension.java @@ -1,6 +1,6 @@ package dev.engine_room.flywheel.impl.extension; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; import dev.engine_room.flywheel.api.visualization.EntityVisualizer; import net.minecraft.world.entity.Entity; diff --git a/common/src/main/java/dev/engine_room/flywheel/impl/layout/LayoutBuilderImpl.java b/common/src/main/java/dev/engine_room/flywheel/impl/layout/LayoutBuilderImpl.java index fbd2f8178..4472fee51 100644 --- a/common/src/main/java/dev/engine_room/flywheel/impl/layout/LayoutBuilderImpl.java +++ b/common/src/main/java/dev/engine_room/flywheel/impl/layout/LayoutBuilderImpl.java @@ -5,7 +5,7 @@ import java.util.Locale; import java.util.Set; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; import org.jetbrains.annotations.Range; import dev.engine_room.flywheel.api.layout.ElementType; diff --git a/common/src/main/java/dev/engine_room/flywheel/impl/mixin/BlockEntityTypeMixin.java b/common/src/main/java/dev/engine_room/flywheel/impl/mixin/BlockEntityTypeMixin.java index c429dae95..90c879844 100644 --- a/common/src/main/java/dev/engine_room/flywheel/impl/mixin/BlockEntityTypeMixin.java +++ b/common/src/main/java/dev/engine_room/flywheel/impl/mixin/BlockEntityTypeMixin.java @@ -1,6 +1,6 @@ package dev.engine_room.flywheel.impl.mixin; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Unique; diff --git a/common/src/main/java/dev/engine_room/flywheel/impl/mixin/EntityTypeMixin.java b/common/src/main/java/dev/engine_room/flywheel/impl/mixin/EntityTypeMixin.java index 91676872f..5d220ee7e 100644 --- a/common/src/main/java/dev/engine_room/flywheel/impl/mixin/EntityTypeMixin.java +++ b/common/src/main/java/dev/engine_room/flywheel/impl/mixin/EntityTypeMixin.java @@ -1,6 +1,6 @@ package dev.engine_room.flywheel.impl.mixin; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Unique; diff --git a/common/src/main/java/dev/engine_room/flywheel/impl/mixin/LevelRendererMixin.java b/common/src/main/java/dev/engine_room/flywheel/impl/mixin/LevelRendererMixin.java index 8fcccfdf6..c21f73893 100644 --- a/common/src/main/java/dev/engine_room/flywheel/impl/mixin/LevelRendererMixin.java +++ b/common/src/main/java/dev/engine_room/flywheel/impl/mixin/LevelRendererMixin.java @@ -2,7 +2,7 @@ import java.util.SortedSet; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; import org.joml.Matrix4f; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; diff --git a/common/src/main/java/dev/engine_room/flywheel/impl/mixin/visualmanage/BlockEntityMixin.java b/common/src/main/java/dev/engine_room/flywheel/impl/mixin/visualmanage/BlockEntityMixin.java index 5d6ae99ef..86cb2104a 100644 --- a/common/src/main/java/dev/engine_room/flywheel/impl/mixin/visualmanage/BlockEntityMixin.java +++ b/common/src/main/java/dev/engine_room/flywheel/impl/mixin/visualmanage/BlockEntityMixin.java @@ -1,6 +1,6 @@ package dev.engine_room.flywheel.impl.mixin.visualmanage; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; diff --git a/common/src/main/java/dev/engine_room/flywheel/impl/registry/IdRegistryImpl.java b/common/src/main/java/dev/engine_room/flywheel/impl/registry/IdRegistryImpl.java index 1b70fb358..b2df5eeeb 100644 --- a/common/src/main/java/dev/engine_room/flywheel/impl/registry/IdRegistryImpl.java +++ b/common/src/main/java/dev/engine_room/flywheel/impl/registry/IdRegistryImpl.java @@ -4,7 +4,7 @@ import java.util.Iterator; import java.util.Set; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; import org.jetbrains.annotations.UnmodifiableView; import dev.engine_room.flywheel.api.registry.IdRegistry; diff --git a/common/src/main/java/dev/engine_room/flywheel/impl/task/Flag.java b/common/src/main/java/dev/engine_room/flywheel/impl/task/Flag.java index e726f84c9..4807e2455 100644 --- a/common/src/main/java/dev/engine_room/flywheel/impl/task/Flag.java +++ b/common/src/main/java/dev/engine_room/flywheel/impl/task/Flag.java @@ -2,7 +2,7 @@ import java.util.concurrent.atomic.AtomicBoolean; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; /** * A flag that can be raised and lowered in a thread-safe fashion. diff --git a/common/src/main/java/dev/engine_room/flywheel/impl/visualization/VisualizationManagerImpl.java b/common/src/main/java/dev/engine_room/flywheel/impl/visualization/VisualizationManagerImpl.java index 4f88ef870..5f759d92d 100644 --- a/common/src/main/java/dev/engine_room/flywheel/impl/visualization/VisualizationManagerImpl.java +++ b/common/src/main/java/dev/engine_room/flywheel/impl/visualization/VisualizationManagerImpl.java @@ -5,7 +5,7 @@ import java.util.SortedSet; import org.jetbrains.annotations.Contract; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; import org.joml.FrustumIntersection; import org.joml.Matrix4f; diff --git a/common/src/main/java/dev/engine_room/flywheel/impl/visualization/VisualizerRegistryImpl.java b/common/src/main/java/dev/engine_room/flywheel/impl/visualization/VisualizerRegistryImpl.java index 43d605ed0..30fc255c6 100644 --- a/common/src/main/java/dev/engine_room/flywheel/impl/visualization/VisualizerRegistryImpl.java +++ b/common/src/main/java/dev/engine_room/flywheel/impl/visualization/VisualizerRegistryImpl.java @@ -1,6 +1,6 @@ package dev.engine_room.flywheel.impl.visualization; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; import dev.engine_room.flywheel.api.visualization.BlockEntityVisualizer; import dev.engine_room.flywheel.api.visualization.EntityVisualizer; diff --git a/common/src/main/java/dev/engine_room/flywheel/impl/visualization/storage/BlockEntityStorage.java b/common/src/main/java/dev/engine_room/flywheel/impl/visualization/storage/BlockEntityStorage.java index 86af9070b..b56518480 100644 --- a/common/src/main/java/dev/engine_room/flywheel/impl/visualization/storage/BlockEntityStorage.java +++ b/common/src/main/java/dev/engine_room/flywheel/impl/visualization/storage/BlockEntityStorage.java @@ -1,6 +1,6 @@ package dev.engine_room.flywheel.impl.visualization.storage; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; import dev.engine_room.flywheel.api.visual.BlockEntityVisual; import dev.engine_room.flywheel.api.visualization.VisualizationContext; diff --git a/common/src/main/java/dev/engine_room/flywheel/impl/visualization/storage/Storage.java b/common/src/main/java/dev/engine_room/flywheel/impl/visualization/storage/Storage.java index 8bc84204b..05190c541 100644 --- a/common/src/main/java/dev/engine_room/flywheel/impl/visualization/storage/Storage.java +++ b/common/src/main/java/dev/engine_room/flywheel/impl/visualization/storage/Storage.java @@ -5,7 +5,7 @@ import java.util.List; import java.util.Map; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; import dev.engine_room.flywheel.api.task.Plan; import dev.engine_room.flywheel.api.visual.DynamicVisual; diff --git a/common/src/vanillin/java/dev/engine_room/vanillin/VanillaVisuals.java b/common/src/vanillin/java/dev/engine_room/vanillin/VanillaVisuals.java index 0c8a60734..29bdc1698 100644 --- a/common/src/vanillin/java/dev/engine_room/vanillin/VanillaVisuals.java +++ b/common/src/vanillin/java/dev/engine_room/vanillin/VanillaVisuals.java @@ -4,7 +4,7 @@ import java.util.List; import java.util.function.Consumer; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; import dev.engine_room.vanillin.compose.ComposableEntityVisual; import dev.engine_room.vanillin.compose.ConfiguredElement; diff --git a/common/src/vanillin/java/dev/engine_room/vanillin/compose/ComposableEntityVisual.java b/common/src/vanillin/java/dev/engine_room/vanillin/compose/ComposableEntityVisual.java index 3f46ad8d1..8323cba84 100644 --- a/common/src/vanillin/java/dev/engine_room/vanillin/compose/ComposableEntityVisual.java +++ b/common/src/vanillin/java/dev/engine_room/vanillin/compose/ComposableEntityVisual.java @@ -1,6 +1,6 @@ package dev.engine_room.vanillin.compose; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; import dev.engine_room.flywheel.api.visual.DynamicVisual; import dev.engine_room.flywheel.api.visual.EntityVisual; diff --git a/common/src/vanillin/java/dev/engine_room/vanillin/compose/ConfiguredElementImpl.java b/common/src/vanillin/java/dev/engine_room/vanillin/compose/ConfiguredElementImpl.java index e91b4fb20..d926ae51b 100644 --- a/common/src/vanillin/java/dev/engine_room/vanillin/compose/ConfiguredElementImpl.java +++ b/common/src/vanillin/java/dev/engine_room/vanillin/compose/ConfiguredElementImpl.java @@ -2,7 +2,7 @@ import java.util.Objects; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; import dev.engine_room.flywheel.api.visual.Visual; import dev.engine_room.flywheel.api.visualization.VisualizationContext; diff --git a/common/src/vanillin/java/dev/engine_room/vanillin/config/BlockEntityVisualizerBuilder.java b/common/src/vanillin/java/dev/engine_room/vanillin/config/BlockEntityVisualizerBuilder.java index 8c8070999..bb39be3b1 100644 --- a/common/src/vanillin/java/dev/engine_room/vanillin/config/BlockEntityVisualizerBuilder.java +++ b/common/src/vanillin/java/dev/engine_room/vanillin/config/BlockEntityVisualizerBuilder.java @@ -3,7 +3,7 @@ import java.util.Objects; import java.util.function.Predicate; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; import dev.engine_room.flywheel.lib.visualization.SimpleBlockEntityVisualizer; import net.minecraft.client.renderer.blockentity.BlockEntityRenderer; diff --git a/common/src/vanillin/java/dev/engine_room/vanillin/config/Configurator.java b/common/src/vanillin/java/dev/engine_room/vanillin/config/Configurator.java index 28e97af02..56dbf61c6 100644 --- a/common/src/vanillin/java/dev/engine_room/vanillin/config/Configurator.java +++ b/common/src/vanillin/java/dev/engine_room/vanillin/config/Configurator.java @@ -5,7 +5,7 @@ import java.util.List; import java.util.Map; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; import dev.engine_room.flywheel.api.visualization.BlockEntityVisualizer; import dev.engine_room.flywheel.api.visualization.EntityVisualizer; diff --git a/common/src/vanillin/java/dev/engine_room/vanillin/config/EntityVisualizerBuilder.java b/common/src/vanillin/java/dev/engine_room/vanillin/config/EntityVisualizerBuilder.java index 6e9a8aa54..7f2541ed8 100644 --- a/common/src/vanillin/java/dev/engine_room/vanillin/config/EntityVisualizerBuilder.java +++ b/common/src/vanillin/java/dev/engine_room/vanillin/config/EntityVisualizerBuilder.java @@ -3,7 +3,7 @@ import java.util.Objects; import java.util.function.Predicate; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; import dev.engine_room.flywheel.lib.visualization.SimpleEntityVisualizer; import net.minecraft.client.renderer.entity.EntityRenderer; diff --git a/common/src/vanillin/java/dev/engine_room/vanillin/config/VisualOverrideValue.java b/common/src/vanillin/java/dev/engine_room/vanillin/config/VisualOverrideValue.java index 333e060d7..6bb0b0024 100644 --- a/common/src/vanillin/java/dev/engine_room/vanillin/config/VisualOverrideValue.java +++ b/common/src/vanillin/java/dev/engine_room/vanillin/config/VisualOverrideValue.java @@ -1,6 +1,6 @@ package dev.engine_room.vanillin.config; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; public enum VisualOverrideValue { DEFAULT, diff --git a/common/src/vanillin/java/dev/engine_room/vanillin/elements/ShadowElement.java b/common/src/vanillin/java/dev/engine_room/vanillin/elements/ShadowElement.java index df7e115aa..bafe7492f 100644 --- a/common/src/vanillin/java/dev/engine_room/vanillin/elements/ShadowElement.java +++ b/common/src/vanillin/java/dev/engine_room/vanillin/elements/ShadowElement.java @@ -1,6 +1,6 @@ package dev.engine_room.vanillin.elements; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; import org.joml.Vector4f; import org.joml.Vector4fc; diff --git a/common/src/vanillin/java/dev/engine_room/vanillin/item/ItemModelBuilder.java b/common/src/vanillin/java/dev/engine_room/vanillin/item/ItemModelBuilder.java index c0c190d96..a80e43784 100644 --- a/common/src/vanillin/java/dev/engine_room/vanillin/item/ItemModelBuilder.java +++ b/common/src/vanillin/java/dev/engine_room/vanillin/item/ItemModelBuilder.java @@ -7,7 +7,7 @@ import java.util.Set; import java.util.function.Function; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; import org.lwjgl.system.MemoryUtil; import com.google.common.collect.ImmutableList; diff --git a/common/src/vanillin/java/dev/engine_room/vanillin/mixin/text/FontTextureMixin.java b/common/src/vanillin/java/dev/engine_room/vanillin/mixin/text/FontTextureMixin.java index fabac72f1..2f97db4f8 100644 --- a/common/src/vanillin/java/dev/engine_room/vanillin/mixin/text/FontTextureMixin.java +++ b/common/src/vanillin/java/dev/engine_room/vanillin/mixin/text/FontTextureMixin.java @@ -3,7 +3,7 @@ import java.util.ArrayList; import java.util.List; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Unique; import org.spongepowered.asm.mixin.injection.At; diff --git a/common/src/vanillin/java/dev/engine_room/vanillin/text/SimpleTextLayer.java b/common/src/vanillin/java/dev/engine_room/vanillin/text/SimpleTextLayer.java index ab81ba7f0..81df30a36 100644 --- a/common/src/vanillin/java/dev/engine_room/vanillin/text/SimpleTextLayer.java +++ b/common/src/vanillin/java/dev/engine_room/vanillin/text/SimpleTextLayer.java @@ -2,7 +2,7 @@ import java.util.Objects; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; import org.joml.Vector2f; import org.joml.Vector2fc; diff --git a/common/src/vanillin/java/dev/engine_room/vanillin/text/TextLayer.java b/common/src/vanillin/java/dev/engine_room/vanillin/text/TextLayer.java index 24b242da6..92ef663ab 100644 --- a/common/src/vanillin/java/dev/engine_room/vanillin/text/TextLayer.java +++ b/common/src/vanillin/java/dev/engine_room/vanillin/text/TextLayer.java @@ -2,7 +2,7 @@ import java.util.function.Consumer; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; import org.joml.Vector2f; import org.joml.Vector2fc; diff --git a/common/src/vanillin/java/dev/engine_room/vanillin/text/TextVisual.java b/common/src/vanillin/java/dev/engine_room/vanillin/text/TextVisual.java index ff53dee1b..a6a70b79d 100644 --- a/common/src/vanillin/java/dev/engine_room/vanillin/text/TextVisual.java +++ b/common/src/vanillin/java/dev/engine_room/vanillin/text/TextVisual.java @@ -3,7 +3,7 @@ import java.util.ArrayList; import java.util.List; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; import org.jetbrains.annotations.UnknownNullability; import org.joml.Matrix4f; import org.joml.Vector2f; diff --git a/common/src/vanillin/java/dev/engine_room/vanillin/visuals/ChestVisual.java b/common/src/vanillin/java/dev/engine_room/vanillin/visuals/ChestVisual.java index fe4731189..b208ad9d0 100644 --- a/common/src/vanillin/java/dev/engine_room/vanillin/visuals/ChestVisual.java +++ b/common/src/vanillin/java/dev/engine_room/vanillin/visuals/ChestVisual.java @@ -5,7 +5,7 @@ import java.util.Map; import java.util.function.Consumer; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; import org.joml.Matrix4f; import org.joml.Matrix4fc; diff --git a/common/src/vanillin/java/dev/engine_room/vanillin/visuals/ItemDisplayVisual.java b/common/src/vanillin/java/dev/engine_room/vanillin/visuals/ItemDisplayVisual.java index c4eac759a..d0c963676 100644 --- a/common/src/vanillin/java/dev/engine_room/vanillin/visuals/ItemDisplayVisual.java +++ b/common/src/vanillin/java/dev/engine_room/vanillin/visuals/ItemDisplayVisual.java @@ -2,7 +2,7 @@ import java.util.Objects; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; import com.mojang.math.Transformation; diff --git a/common/src/vanillin/java/dev/engine_room/vanillin/visuals/MinecartVisual.java b/common/src/vanillin/java/dev/engine_room/vanillin/visuals/MinecartVisual.java index a413e6f56..ba3263467 100644 --- a/common/src/vanillin/java/dev/engine_room/vanillin/visuals/MinecartVisual.java +++ b/common/src/vanillin/java/dev/engine_room/vanillin/visuals/MinecartVisual.java @@ -1,6 +1,6 @@ package dev.engine_room.vanillin.visuals; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; import org.joml.Matrix4f; import org.joml.Matrix4fStack; diff --git a/common/src/vanillin/java/dev/engine_room/vanillin/visuals/SignVisual.java b/common/src/vanillin/java/dev/engine_room/vanillin/visuals/SignVisual.java index c121bbe1c..06401e383 100644 --- a/common/src/vanillin/java/dev/engine_room/vanillin/visuals/SignVisual.java +++ b/common/src/vanillin/java/dev/engine_room/vanillin/visuals/SignVisual.java @@ -4,7 +4,7 @@ import java.util.List; import java.util.function.Consumer; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; import org.joml.Matrix4f; import dev.engine_room.flywheel.api.instance.Instance; diff --git a/fabric/src/lib/java/dev/engine_room/flywheel/lib/model/baked/BakedModelBufferer.java b/fabric/src/lib/java/dev/engine_room/flywheel/lib/model/baked/BakedModelBufferer.java index 797db860f..7cccea13a 100644 --- a/fabric/src/lib/java/dev/engine_room/flywheel/lib/model/baked/BakedModelBufferer.java +++ b/fabric/src/lib/java/dev/engine_room/flywheel/lib/model/baked/BakedModelBufferer.java @@ -2,7 +2,7 @@ import java.util.Iterator; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; import com.mojang.blaze3d.vertex.MeshData; import com.mojang.blaze3d.vertex.PoseStack; diff --git a/fabric/src/lib/java/dev/engine_room/flywheel/lib/model/baked/FabricSinglePosVirtualBlockGetter.java b/fabric/src/lib/java/dev/engine_room/flywheel/lib/model/baked/FabricSinglePosVirtualBlockGetter.java index 7a860daf3..462c4642e 100644 --- a/fabric/src/lib/java/dev/engine_room/flywheel/lib/model/baked/FabricSinglePosVirtualBlockGetter.java +++ b/fabric/src/lib/java/dev/engine_room/flywheel/lib/model/baked/FabricSinglePosVirtualBlockGetter.java @@ -2,7 +2,7 @@ import java.util.function.ToIntFunction; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; import net.minecraft.core.BlockPos; import net.minecraft.world.level.block.entity.BlockEntity; diff --git a/fabric/src/lib/java/dev/engine_room/flywheel/lib/model/baked/UniversalMeshEmitter.java b/fabric/src/lib/java/dev/engine_room/flywheel/lib/model/baked/UniversalMeshEmitter.java index 5547b4791..71cfe8bb4 100644 --- a/fabric/src/lib/java/dev/engine_room/flywheel/lib/model/baked/UniversalMeshEmitter.java +++ b/fabric/src/lib/java/dev/engine_room/flywheel/lib/model/baked/UniversalMeshEmitter.java @@ -2,7 +2,7 @@ import java.util.function.Supplier; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; import org.jetbrains.annotations.UnknownNullability; import com.mojang.blaze3d.vertex.BufferBuilder; diff --git a/neoforge/src/lib/java/dev/engine_room/flywheel/lib/model/baked/BakedModelBufferer.java b/neoforge/src/lib/java/dev/engine_room/flywheel/lib/model/baked/BakedModelBufferer.java index bd052135d..f144fe41a 100644 --- a/neoforge/src/lib/java/dev/engine_room/flywheel/lib/model/baked/BakedModelBufferer.java +++ b/neoforge/src/lib/java/dev/engine_room/flywheel/lib/model/baked/BakedModelBufferer.java @@ -2,7 +2,7 @@ import java.util.Iterator; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; import com.mojang.blaze3d.vertex.MeshData; import com.mojang.blaze3d.vertex.PoseStack; diff --git a/neoforge/src/lib/java/dev/engine_room/flywheel/lib/model/baked/NeoForgeSinglePosVirtualBlockGetter.java b/neoforge/src/lib/java/dev/engine_room/flywheel/lib/model/baked/NeoForgeSinglePosVirtualBlockGetter.java index 41291b65e..993657380 100644 --- a/neoforge/src/lib/java/dev/engine_room/flywheel/lib/model/baked/NeoForgeSinglePosVirtualBlockGetter.java +++ b/neoforge/src/lib/java/dev/engine_room/flywheel/lib/model/baked/NeoForgeSinglePosVirtualBlockGetter.java @@ -2,7 +2,7 @@ import java.util.function.ToIntFunction; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; import net.minecraft.core.BlockPos; import net.minecraft.world.level.block.entity.BlockEntity; diff --git a/neoforge/src/main/java/dev/engine_room/flywheel/impl/NeoForgeFlwConfig.java b/neoforge/src/main/java/dev/engine_room/flywheel/impl/NeoForgeFlwConfig.java index fc28e42b3..09d6e0b47 100644 --- a/neoforge/src/main/java/dev/engine_room/flywheel/impl/NeoForgeFlwConfig.java +++ b/neoforge/src/main/java/dev/engine_room/flywheel/impl/NeoForgeFlwConfig.java @@ -1,7 +1,7 @@ package dev.engine_room.flywheel.impl; import org.apache.commons.lang3.tuple.Pair; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; import dev.engine_room.flywheel.api.backend.Backend; import dev.engine_room.flywheel.api.backend.BackendManager; From 230498afdfe9c43c521e2bdb64c29f550443fca5 Mon Sep 17 00:00:00 2001 From: IThundxr Date: Mon, 22 Dec 2025 20:16:24 -0500 Subject: [PATCH 05/59] FastColor.ARGB32 -> ARGB --- .../engine/uniform/PlayerUniforms.java | 8 +++---- .../lib/instance/ColoredLitInstance.java | 6 ++--- .../engine_room/vanillin/text/TextLayer.java | 24 +++++++++---------- .../vanillin/visuals/SignVisual.java | 12 +++++----- 4 files changed, 25 insertions(+), 25 deletions(-) diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/engine/uniform/PlayerUniforms.java b/common/src/backend/java/dev/engine_room/flywheel/backend/engine/uniform/PlayerUniforms.java index dbeb5e5a7..1314d21f5 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/engine/uniform/PlayerUniforms.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/engine/uniform/PlayerUniforms.java @@ -10,7 +10,7 @@ import net.minecraft.client.multiplayer.PlayerInfo; import net.minecraft.client.player.LocalPlayer; import net.minecraft.core.BlockPos; -import net.minecraft.util.FastColor; +import net.minecraft.util.ARGB; import net.minecraft.world.InteractionHand; import net.minecraft.world.item.BlockItem; import net.minecraft.world.item.Item; @@ -65,9 +65,9 @@ private static long writeTeamColor(long ptr, @Nullable PlayerTeam team) { Integer color = team.getColor().getColor(); if (color != null) { - int red = FastColor.ARGB32.red(color); - int green = FastColor.ARGB32.green(color); - int blue = FastColor.ARGB32.blue(color); + int red = ARGB.red(color); + int green = ARGB.green(color); + int blue = ARGB.blue(color); return writeVec4(ptr, red / 255f, green / 255f, blue / 255f, 1f); } else { return writeVec4(ptr, 1f, 1f, 1f, 1f); diff --git a/common/src/lib/java/dev/engine_room/flywheel/lib/instance/ColoredLitInstance.java b/common/src/lib/java/dev/engine_room/flywheel/lib/instance/ColoredLitInstance.java index e8f95baf5..7fd7eec44 100644 --- a/common/src/lib/java/dev/engine_room/flywheel/lib/instance/ColoredLitInstance.java +++ b/common/src/lib/java/dev/engine_room/flywheel/lib/instance/ColoredLitInstance.java @@ -2,7 +2,7 @@ import dev.engine_room.flywheel.api.instance.InstanceHandle; import dev.engine_room.flywheel.api.instance.InstanceType; -import net.minecraft.util.FastColor; +import net.minecraft.util.ARGB; public abstract class ColoredLitInstance extends AbstractInstance implements FlatLit { public byte red = (byte) 0xFF; @@ -17,11 +17,11 @@ public ColoredLitInstance(InstanceType type, Insta } public ColoredLitInstance colorArgb(int argb) { - return color(FastColor.ARGB32.red(argb), FastColor.ARGB32.green(argb), FastColor.ARGB32.blue(argb), FastColor.ARGB32.alpha(argb)); + return color(ARGB.red(argb), ARGB.green(argb), ARGB.blue(argb), ARGB.alpha(argb)); } public ColoredLitInstance colorRgb(int rgb) { - return color(FastColor.ARGB32.red(rgb), FastColor.ARGB32.green(rgb), FastColor.ARGB32.blue(rgb)); + return color(ARGB.red(rgb), ARGB.green(rgb), ARGB.blue(rgb)); } public ColoredLitInstance color(int red, int green, int blue, int alpha) { diff --git a/common/src/vanillin/java/dev/engine_room/vanillin/text/TextLayer.java b/common/src/vanillin/java/dev/engine_room/vanillin/text/TextLayer.java index 92ef663ab..c16df2889 100644 --- a/common/src/vanillin/java/dev/engine_room/vanillin/text/TextLayer.java +++ b/common/src/vanillin/java/dev/engine_room/vanillin/text/TextLayer.java @@ -2,9 +2,9 @@ import java.util.function.Consumer; -import org.jspecify.annotations.Nullable; import org.joml.Vector2f; import org.joml.Vector2fc; +import org.jspecify.annotations.Nullable; import dev.engine_room.flywheel.api.material.DepthTest; import dev.engine_room.flywheel.api.material.Material; @@ -16,7 +16,7 @@ import net.minecraft.client.gui.Font; import net.minecraft.network.chat.TextColor; import net.minecraft.resources.Identifier; -import net.minecraft.util.FastColor; +import net.minecraft.util.ARGB; public interface TextLayer { /** @@ -145,11 +145,11 @@ interface GlyphColor { static GlyphColor defaultTo(int color, float dimFactor) { int finalColor; if (dimFactor != 1.0f) { - finalColor = FastColor.ARGB32.color( - FastColor.ARGB32.alpha(color), - (int) (FastColor.ARGB32.red(color) * dimFactor), - (int) (FastColor.ARGB32.green(color) * dimFactor), - (int) (FastColor.ARGB32.blue(color) * dimFactor) + finalColor = ARGB.color( + ARGB.alpha(color), + (int) (ARGB.red(color) * dimFactor), + (int) (ARGB.green(color) * dimFactor), + (int) (ARGB.blue(color) * dimFactor) ); } else { finalColor = color; @@ -159,11 +159,11 @@ static GlyphColor defaultTo(int color, float dimFactor) { if (textColor != null) { int textColorArgb = textColor.getValue(); if (dimFactor != 1.0f) { - return FastColor.ARGB32.color( - FastColor.ARGB32.alpha(finalColor), - (int) (FastColor.ARGB32.red(textColorArgb) * dimFactor), - (int) (FastColor.ARGB32.green(textColorArgb) * dimFactor), - (int) (FastColor.ARGB32.blue(textColorArgb) * dimFactor) + return ARGB.color( + ARGB.alpha(finalColor), + (int) (ARGB.red(textColorArgb) * dimFactor), + (int) (ARGB.green(textColorArgb) * dimFactor), + (int) (ARGB.blue(textColorArgb) * dimFactor) ); } else { return (finalColor & 0xFF000000) | (textColorArgb & 0xFFFFFF); diff --git a/common/src/vanillin/java/dev/engine_room/vanillin/visuals/SignVisual.java b/common/src/vanillin/java/dev/engine_room/vanillin/visuals/SignVisual.java index 06401e383..8e976c278 100644 --- a/common/src/vanillin/java/dev/engine_room/vanillin/visuals/SignVisual.java +++ b/common/src/vanillin/java/dev/engine_room/vanillin/visuals/SignVisual.java @@ -4,8 +4,8 @@ import java.util.List; import java.util.function.Consumer; -import org.jspecify.annotations.Nullable; import org.joml.Matrix4f; +import org.jspecify.annotations.Nullable; import dev.engine_room.flywheel.api.instance.Instance; import dev.engine_room.flywheel.api.material.Material; @@ -26,7 +26,7 @@ import net.minecraft.client.model.geom.ModelLayers; import net.minecraft.client.renderer.LightTexture; import net.minecraft.client.renderer.Sheets; -import net.minecraft.util.FastColor; +import net.minecraft.util.ARGB; import net.minecraft.util.FormattedCharSequence; import net.minecraft.util.Mth; import net.minecraft.world.item.DyeColor; @@ -244,10 +244,10 @@ private static int getDarkColor(SignText signText) { return 0xFFF0EBCC; } - int r = (int) ((double) FastColor.ARGB32.red(colorArgb) * 0.4); - int g = (int) ((double) FastColor.ARGB32.green(colorArgb) * 0.4); - int b = (int) ((double) FastColor.ARGB32.blue(colorArgb) * 0.4); - return FastColor.ARGB32.color(0, r, g, b); + int r = (int) ((double) ARGB.red(colorArgb) * 0.4); + int g = (int) ((double) ARGB.green(colorArgb) * 0.4); + int b = (int) ((double) ARGB.blue(colorArgb) * 0.4); + return ARGB.color(0, r, g, b); } private static boolean hasObfuscation(FormattedCharSequence text) { From f9c9832185e3e2dafb28d0044d132604d99c9b65 Mon Sep 17 00:00:00 2001 From: IThundxr Date: Mon, 22 Dec 2025 21:27:11 -0500 Subject: [PATCH 06/59] 1.21.1 Porting I --- .../flywheel/backend/NoiseTextures.java | 18 ++-- .../flywheel/backend/compile/OitPrograms.java | 4 +- .../backend/engine/MaterialRenderState.java | 95 ++++++++++--------- .../flywheel/lib/internal/FlwLibLink.java | 6 ++ .../flywheel/lib/material/Materials.java | 12 ++- .../flywheel/lib/material/SimpleMaterial.java | 4 +- .../flywheel/lib/model/ModelUtil.java | 47 ++++++--- .../lib/model/baked/BakedModelBuilder.java | 7 +- .../lib/model/baked/BlockModelBuilder.java | 6 +- .../model/baked/EmptyVirtualBlockGetter.java | 2 +- .../baked/SinglePosVirtualBlockGetter.java | 2 +- .../baked/TransformingVertexConsumer.java | 12 +++ .../lib/model/baked/VirtualBlockGetter.java | 2 +- .../flywheel/lib/model/part/InstanceTree.java | 12 +-- .../flywheel/lib/model/part/ModelTrees.java | 2 +- .../flywheel/lib/model/part/VertexWriter.java | 12 +++ .../lib/visual/AbstractBlockEntityVisual.java | 2 +- .../lib/visual/AbstractEntityVisual.java | 5 +- .../lib/visual/EntityVisibilityTester.java | 5 +- .../lib/visual/component/FireComponent.java | 6 +- .../lib/visual/component/HitboxComponent.java | 5 +- .../flywheel/impl/FlwLibLinkImpl.java | 21 ++++ .../impl/mixin/EntityRendererAccessor.java | 17 ++++ .../main/resources/flywheel.impl.mixins.json | 1 + .../vanillin/elements/FireElement.java | 2 +- .../vanillin/visuals/BlockDisplayVisual.java | 4 +- .../vanillin/visuals/ItemDisplayVisual.java | 4 +- 27 files changed, 213 insertions(+), 102 deletions(-) create mode 100644 common/src/main/java/dev/engine_room/flywheel/impl/mixin/EntityRendererAccessor.java diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/NoiseTextures.java b/common/src/backend/java/dev/engine_room/flywheel/backend/NoiseTextures.java index 1885eea34..f3bccd22f 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/NoiseTextures.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/NoiseTextures.java @@ -2,8 +2,14 @@ import java.io.IOException; +import com.mojang.blaze3d.opengl.GlStateManager; + +import com.mojang.blaze3d.opengl.GlTexture; + import dev.engine_room.flywheel.lib.util.IdentifierUtil; +import net.minecraft.client.gui.render.TextureSetup; + import org.jetbrains.annotations.UnknownNullability; import org.lwjgl.opengl.GL32; @@ -36,17 +42,17 @@ public static void reload(ResourceManager manager) { .open()) { var image = NativeImage.read(NativeImage.Format.LUMINANCE, is); - BLUE_NOISE = new DynamicTexture(image); + BLUE_NOISE = new DynamicTexture(() -> "Flywheel Blue Noise", image); GlTextureUnit.T0.makeActive(); - BLUE_NOISE.bind(); + GlStateManager._bindTexture(((GlTexture) BLUE_NOISE.getTexture()).glId()); NoiseTextures.BLUE_NOISE.setFilter(true, false); - RenderSystem.texParameter(GL32.GL_TEXTURE_2D, GL32.GL_TEXTURE_WRAP_S, GL32.GL_REPEAT); - RenderSystem.texParameter(GL32.GL_TEXTURE_2D, GL32.GL_TEXTURE_WRAP_T, GL32.GL_REPEAT); + GlStateManager._texParameter(GL32.GL_TEXTURE_2D, GL32.GL_TEXTURE_WRAP_S, GL32.GL_REPEAT); + GlStateManager._texParameter(GL32.GL_TEXTURE_2D, GL32.GL_TEXTURE_WRAP_T, GL32.GL_REPEAT); - RenderSystem.bindTexture(0); - } catch (IOException e) { + GlStateManager._bindTexture(0); + } catch (IOException ignored) { } } diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/compile/OitPrograms.java b/common/src/backend/java/dev/engine_room/flywheel/backend/compile/OitPrograms.java index 4ac78e7ea..5e13b4ac3 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/compile/OitPrograms.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/compile/OitPrograms.java @@ -32,8 +32,8 @@ public static OitPrograms createFullscreenCompiler(ShaderSources sources) { .nameMapper($ -> "fullscreen/fullscreen") .withResource(FULLSCREEN)) .link(COMPILE.shader(GlCompat.MAX_GLSL_VERSION, ShaderType.FRAGMENT) - .nameMapper(rl -> "fullscreen/" + IdentifierUtil.toDebugFileNameNoExtension(rl)) - .onCompile((rl, compilation) -> { + .nameMapper(id -> "fullscreen/" + IdentifierUtil.toDebugFileNameNoExtension(id)) + .onCompile((id, compilation) -> { if (GlCompat.MAX_GLSL_VERSION.compareTo(GlslVersion.V400) < 0) { // Need to define FMA for the wavelet calculations compilation.define("fma(a, b, c) ((a) * (b) + (c))"); diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/engine/MaterialRenderState.java b/common/src/backend/java/dev/engine_room/flywheel/backend/engine/MaterialRenderState.java index 2834990ef..dffae42e7 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/engine/MaterialRenderState.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/engine/MaterialRenderState.java @@ -2,6 +2,9 @@ import java.util.Comparator; +import com.mojang.blaze3d.opengl.GlConst; +import com.mojang.blaze3d.opengl.GlStateManager; + import org.jspecify.annotations.Nullable; import org.lwjgl.opengl.GL11; @@ -39,7 +42,7 @@ public static void setupOit(Material material) { WriteMask mask = material.writeMask(); boolean writeColor = mask.color(); - RenderSystem.colorMask(writeColor, writeColor, writeColor, writeColor); + GlStateManager._colorMask(writeColor, writeColor, writeColor, writeColor); } private static void setupTexture(Material material) { @@ -55,58 +58,58 @@ private static void setupTexture(Material material) { private static void setupBackfaceCulling(boolean backfaceCulling) { if (backfaceCulling) { - RenderSystem.enableCull(); + GlStateManager._enableCull(); } else { - RenderSystem.disableCull(); + GlStateManager._disableCull(); } } private static void setupPolygonOffset(boolean polygonOffset) { if (polygonOffset) { - RenderSystem.polygonOffset(-1.0F, -10.0F); - RenderSystem.enablePolygonOffset(); + GlStateManager._polygonOffset(-1.0F, -10.0F); + GlStateManager._enablePolygonOffset(); } else { - RenderSystem.polygonOffset(0.0F, 0.0F); - RenderSystem.disablePolygonOffset(); + GlStateManager._polygonOffset(0.0F, 0.0F); + GlStateManager._disablePolygonOffset(); } } private static void setupDepthTest(DepthTest depthTest) { switch (depthTest) { case OFF -> { - RenderSystem.disableDepthTest(); + GlStateManager._disableDepthTest(); } case NEVER -> { - RenderSystem.enableDepthTest(); - RenderSystem.depthFunc(GL11.GL_NEVER); + GlStateManager._enableDepthTest(); + GlStateManager._depthFunc(GL11.GL_NEVER); } case LESS -> { - RenderSystem.enableDepthTest(); - RenderSystem.depthFunc(GL11.GL_LESS); + GlStateManager._enableDepthTest(); + GlStateManager._depthFunc(GL11.GL_LESS); } case EQUAL -> { - RenderSystem.enableDepthTest(); - RenderSystem.depthFunc(GL11.GL_EQUAL); + GlStateManager._enableDepthTest(); + GlStateManager._depthFunc(GL11.GL_EQUAL); } case LEQUAL -> { - RenderSystem.enableDepthTest(); - RenderSystem.depthFunc(GL11.GL_LEQUAL); + GlStateManager._enableDepthTest(); + GlStateManager._depthFunc(GL11.GL_LEQUAL); } case GREATER -> { - RenderSystem.enableDepthTest(); - RenderSystem.depthFunc(GL11.GL_GREATER); + GlStateManager._enableDepthTest(); + GlStateManager._depthFunc(GL11.GL_GREATER); } case NOTEQUAL -> { - RenderSystem.enableDepthTest(); - RenderSystem.depthFunc(GL11.GL_NOTEQUAL); + GlStateManager._enableDepthTest(); + GlStateManager._depthFunc(GL11.GL_NOTEQUAL); } case GEQUAL -> { - RenderSystem.enableDepthTest(); - RenderSystem.depthFunc(GL11.GL_GEQUAL); + GlStateManager._enableDepthTest(); + GlStateManager._depthFunc(GL11.GL_GEQUAL); } case ALWAYS -> { - RenderSystem.enableDepthTest(); - RenderSystem.depthFunc(GL11.GL_ALWAYS); + GlStateManager._enableDepthTest(); + GlStateManager._depthFunc(GL11.GL_ALWAYS); } } } @@ -114,35 +117,35 @@ private static void setupDepthTest(DepthTest depthTest) { private static void setupTransparency(Transparency transparency) { switch (transparency) { case OPAQUE -> { - RenderSystem.disableBlend(); + GlStateManager._disableBlend(); } case ADDITIVE -> { - RenderSystem.enableBlend(); - RenderSystem.blendFunc(GlStateManager.SourceFactor.ONE, GlStateManager.DestFactor.ONE); + GlStateManager._enableBlend(); + GlStateManager._blendFuncSeparate(GlConst.GL_ONE, GlConst.GL_ONE, GlConst.GL_ONE, GlConst.GL_ONE); } case LIGHTNING -> { - RenderSystem.enableBlend(); - RenderSystem.blendFunc(GlStateManager.SourceFactor.SRC_ALPHA, GlStateManager.DestFactor.ONE); + GlStateManager._enableBlend(); + GlStateManager._blendFuncSeparate(GlConst.GL_SRC_ALPHA, GlConst.GL_ONE, GlConst.GL_SRC_ALPHA, GlConst.GL_ONE); } case GLINT -> { - RenderSystem.enableBlend(); - RenderSystem.blendFuncSeparate(GlStateManager.SourceFactor.SRC_COLOR, GlStateManager.DestFactor.ONE, GlStateManager.SourceFactor.ZERO, GlStateManager.DestFactor.ONE); + GlStateManager._enableBlend(); + GlStateManager._blendFuncSeparate(GlConst.GL_SRC_COLOR, GlConst.GL_ONE, GlConst.GL_ZERO, GlConst.GL_ONE); } case CRUMBLING -> { - RenderSystem.enableBlend(); - RenderSystem.blendFuncSeparate(GlStateManager.SourceFactor.DST_COLOR, GlStateManager.DestFactor.SRC_COLOR, GlStateManager.SourceFactor.ONE, GlStateManager.DestFactor.ZERO); + GlStateManager._enableBlend(); + GlStateManager._blendFuncSeparate(GlConst.GL_DST_COLOR, GlConst.GL_SRC_COLOR, GlConst.GL_ONE, GlConst.GL_ZERO); } case TRANSLUCENT -> { - RenderSystem.enableBlend(); - RenderSystem.blendFuncSeparate(GlStateManager.SourceFactor.SRC_ALPHA, GlStateManager.DestFactor.ONE_MINUS_SRC_ALPHA, GlStateManager.SourceFactor.ONE, GlStateManager.DestFactor.ONE_MINUS_SRC_ALPHA); + GlStateManager._enableBlend(); + GlStateManager._blendFuncSeparate(GlConst.GL_SRC_ALPHA, GlConst.GL_ONE_MINUS_SRC_ALPHA, GlConst.GL_ONE, GlConst.GL_ONE_MINUS_SRC_ALPHA); } } } private static void setupWriteMask(WriteMask mask) { - RenderSystem.depthMask(mask.depth()); + GlStateManager._depthMask(mask.depth()); boolean writeColor = mask.color(); - RenderSystem.colorMask(writeColor, writeColor, writeColor, writeColor); + GlStateManager._colorMask(writeColor, writeColor, writeColor, writeColor); } public static void reset() { @@ -160,27 +163,27 @@ private static void resetTexture() { } private static void resetBackfaceCulling() { - RenderSystem.enableCull(); + GlStateManager._enableCull(); } private static void resetPolygonOffset() { - RenderSystem.polygonOffset(0.0F, 0.0F); - RenderSystem.disablePolygonOffset(); + GlStateManager._polygonOffset(0.0F, 0.0F); + GlStateManager._disablePolygonOffset(); } private static void resetDepthTest() { - RenderSystem.disableDepthTest(); - RenderSystem.depthFunc(GL11.GL_LEQUAL); + GlStateManager._disableDepthTest(); + GlStateManager._depthFunc(GL11.GL_LEQUAL); } private static void resetTransparency() { - RenderSystem.disableBlend(); - RenderSystem.defaultBlendFunc(); + GlStateManager._disableBlend(); + GlStateManager._blendFuncSeparate(GlConst.GL_SRC_ALPHA, GlConst.GL_ONE_MINUS_SRC_ALPHA, GlConst.GL_ONE, GlConst.GL_ZERO); } private static void resetWriteMask() { - RenderSystem.depthMask(true); - RenderSystem.colorMask(true, true, true, true); + GlStateManager._depthMask(true); + GlStateManager._colorMask(true, true, true, true); } public static boolean materialEquals(Material lhs, Material rhs) { diff --git a/common/src/lib/java/dev/engine_room/flywheel/lib/internal/FlwLibLink.java b/common/src/lib/java/dev/engine_room/flywheel/lib/internal/FlwLibLink.java index 203cca392..9b85a8819 100644 --- a/common/src/lib/java/dev/engine_room/flywheel/lib/internal/FlwLibLink.java +++ b/common/src/lib/java/dev/engine_room/flywheel/lib/internal/FlwLibLink.java @@ -11,6 +11,8 @@ import dev.engine_room.flywheel.api.internal.DependencyInjection; import dev.engine_room.flywheel.lib.transform.PoseTransformStack; import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.phys.AABB; public interface FlwLibLink { FlwLibLink INSTANCE = DependencyInjection.load(FlwLibLink.class, "dev.engine_room.flywheel.impl.FlwLibLinkImpl"); @@ -32,4 +34,8 @@ public interface FlwLibLink { boolean isShaderPackInUse(); boolean isRenderingShadowPass(); + + boolean isAffectedByCulling(T entity); + + AABB getCullingBoundingBox(T entity); } diff --git a/common/src/lib/java/dev/engine_room/flywheel/lib/material/Materials.java b/common/src/lib/java/dev/engine_room/flywheel/lib/material/Materials.java index 443556d20..7588cb49d 100644 --- a/common/src/lib/java/dev/engine_room/flywheel/lib/material/Materials.java +++ b/common/src/lib/java/dev/engine_room/flywheel/lib/material/Materials.java @@ -50,6 +50,16 @@ public final class Materials { .build(); public static final Material GLINT = SimpleMaterial.builder() + .texture(ItemRenderer.ENCHANTED_GLINT_ITEM) + .shaders(StandardMaterialShaders.GLINT) + .writeMask(WriteMask.COLOR) + .depthTest(DepthTest.EQUAL) + .backfaceCulling(false) + .blur(true) + .mipmap(false) + .build(); + + public static final Material TRANSLUCENT_GLINT = SimpleMaterial.builder() .texture(ItemRenderer.ENCHANTED_GLINT_ITEM) .shaders(StandardMaterialShaders.GLINT) .transparency(Transparency.GLINT) @@ -61,7 +71,7 @@ public final class Materials { .build(); public static final Material GLINT_ENTITY = SimpleMaterial.builderOf(GLINT) - .texture(ItemRenderer.ENCHANTED_GLINT_ENTITY) + .texture(ItemRenderer.ENCHANTED_GLINT_ARMOR) .build(); public static final Material TRANSLUCENT_ENTITY = SimpleMaterial.builder() diff --git a/common/src/lib/java/dev/engine_room/flywheel/lib/material/SimpleMaterial.java b/common/src/lib/java/dev/engine_room/flywheel/lib/material/SimpleMaterial.java index 3c8e56987..89c941dbd 100644 --- a/common/src/lib/java/dev/engine_room/flywheel/lib/material/SimpleMaterial.java +++ b/common/src/lib/java/dev/engine_room/flywheel/lib/material/SimpleMaterial.java @@ -9,8 +9,8 @@ import dev.engine_room.flywheel.api.material.MaterialShaders; import dev.engine_room.flywheel.api.material.Transparency; import dev.engine_room.flywheel.api.material.WriteMask; +import net.minecraft.client.renderer.texture.TextureAtlas; import net.minecraft.resources.Identifier; -import net.minecraft.world.inventory.InventoryMenu; public class SimpleMaterial implements Material { protected final MaterialShaders shaders; @@ -158,7 +158,7 @@ public Builder() { fog = FogShaders.LINEAR; cutout = CutoutShaders.OFF; light = LightShaders.SMOOTH_WHEN_EMBEDDED; - texture = InventoryMenu.BLOCK_ATLAS; + texture = TextureAtlas.LOCATION_BLOCKS; blur = false; mipmap = true; backfaceCulling = true; diff --git a/common/src/lib/java/dev/engine_room/flywheel/lib/model/ModelUtil.java b/common/src/lib/java/dev/engine_room/flywheel/lib/model/ModelUtil.java index e916a4c6c..736088e9b 100644 --- a/common/src/lib/java/dev/engine_room/flywheel/lib/model/ModelUtil.java +++ b/common/src/lib/java/dev/engine_room/flywheel/lib/model/ModelUtil.java @@ -2,9 +2,9 @@ import java.util.Collection; -import org.jspecify.annotations.Nullable; import org.joml.Vector3f; import org.joml.Vector4f; +import org.jspecify.annotations.Nullable; import dev.engine_room.flywheel.api.material.Material; import dev.engine_room.flywheel.api.model.Mesh; @@ -13,8 +13,10 @@ import dev.engine_room.flywheel.lib.material.Materials; import dev.engine_room.flywheel.lib.memory.MemoryBlock; import dev.engine_room.flywheel.lib.vertex.PosVertexView; -import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.Sheets; +import net.minecraft.client.renderer.chunk.ChunkSectionLayer; +import net.minecraft.client.renderer.rendertype.RenderType; +import net.minecraft.client.renderer.rendertype.RenderTypes; public final class ModelUtil { private static final float BOUNDING_SPHERE_EPSILON = 1e-4f; @@ -23,20 +25,17 @@ private ModelUtil() { } @Nullable - public static Material getMaterial(RenderType chunkRenderType, boolean shaded) { - if (chunkRenderType == RenderType.solid()) { + public static Material getMaterial(ChunkSectionLayer chunkSectionLayer, boolean shaded) { + if (chunkSectionLayer == ChunkSectionLayer.SOLID) { return shaded ? Materials.SOLID_BLOCK : Materials.SOLID_UNSHADED_BLOCK; } - if (chunkRenderType == RenderType.cutoutMipped()) { - return shaded ? Materials.CUTOUT_MIPPED_BLOCK : Materials.CUTOUT_MIPPED_UNSHADED_BLOCK; - } - if (chunkRenderType == RenderType.cutout()) { + if (chunkSectionLayer == ChunkSectionLayer.CUTOUT) { return shaded ? Materials.CUTOUT_BLOCK : Materials.CUTOUT_UNSHADED_BLOCK; } - if (chunkRenderType == RenderType.translucent()) { + if (chunkSectionLayer == ChunkSectionLayer.TRANSLUCENT) { return shaded ? Materials.TRANSLUCENT_BLOCK : Materials.TRANSLUCENT_UNSHADED_BLOCK; } - if (chunkRenderType == RenderType.tripwire()) { + if (chunkSectionLayer == ChunkSectionLayer.TRIPWIRE) { return shaded ? Materials.TRIPWIRE_BLOCK : Materials.TRIPWIRE_UNSHADED_BLOCK; } return null; @@ -44,7 +43,7 @@ public static Material getMaterial(RenderType chunkRenderType, boolean shaded) { @Nullable public static Material getItemMaterial(RenderType renderType) { - var chunkMaterial = getMaterial(renderType, true); + var chunkMaterial = getMaterial(convertLayerToType(renderType), true); if (chunkMaterial != null) { return chunkMaterial; @@ -58,14 +57,17 @@ public static Material getItemMaterial(RenderType renderType) { return Materials.SOLID_BLOCK; } - if (renderType == Sheets.translucentCullBlockSheet() || renderType == Sheets.translucentItemSheet()) { + if (renderType == Sheets.translucentItemSheet()) { return Materials.TRANSLUCENT_ENTITY; } - if (renderType == RenderType.glint() || renderType == RenderType.glintTranslucent()) { + if (renderType == RenderTypes.glint()) { return Materials.GLINT; } - if (renderType == RenderType.entityGlint() || renderType == RenderType.entityGlintDirect()) { + if (renderType == RenderTypes.glintTranslucent()) { + return Materials.TRANSLUCENT_GLINT; + } + if (renderType == RenderTypes.entityGlint()) { return Materials.GLINT_ENTITY; } return null; @@ -149,4 +151,21 @@ private static Vector3f computeCenterOfAABBContaining(VertexList vertexList) { return min.add(max) .mul(0.5f); } + + private static ChunkSectionLayer convertLayerToType(RenderType type) { + if (type == RenderTypes.solidMovingBlock()) { + return ChunkSectionLayer.SOLID; + } + if (type == RenderTypes.cutoutMovingBlock()) { + return ChunkSectionLayer.CUTOUT; + } + if (type == RenderTypes.translucentMovingBlock()) { + return ChunkSectionLayer.TRANSLUCENT; + } + if (type == RenderTypes.tripwireMovingBlock()) { + return ChunkSectionLayer.TRIPWIRE; + } + + return null; + } } diff --git a/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/BakedModelBuilder.java b/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/BakedModelBuilder.java index 2770ad028..b02e03390 100644 --- a/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/BakedModelBuilder.java +++ b/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/BakedModelBuilder.java @@ -2,6 +2,8 @@ import java.util.function.BiFunction; +import net.minecraft.client.renderer.chunk.ChunkSectionLayer; + import org.jspecify.annotations.Nullable; import com.mojang.blaze3d.vertex.PoseStack; @@ -10,7 +12,6 @@ import dev.engine_room.flywheel.lib.internal.FlwLibXplat; import dev.engine_room.flywheel.lib.model.ModelUtil; import dev.engine_room.flywheel.lib.model.SimpleModel; -import net.minecraft.client.renderer.RenderType; import net.minecraft.client.resources.model.BakedModel; import net.minecraft.core.BlockPos; import net.minecraft.world.level.BlockAndTintGetter; @@ -24,7 +25,7 @@ public final class BakedModelBuilder { @Nullable PoseStack poseStack; @Nullable - BiFunction materialFunc; + BiFunction materialFunc; public BakedModelBuilder(BakedModel bakedModel) { this.bakedModel = bakedModel; @@ -45,7 +46,7 @@ public BakedModelBuilder poseStack(@Nullable PoseStack poseStack) { return this; } - public BakedModelBuilder materialFunc(@Nullable BiFunction materialFunc) { + public BakedModelBuilder materialFunc(@Nullable BiFunction materialFunc) { this.materialFunc = materialFunc; return this; } diff --git a/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/BlockModelBuilder.java b/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/BlockModelBuilder.java index 75da04b36..9081fcf93 100644 --- a/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/BlockModelBuilder.java +++ b/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/BlockModelBuilder.java @@ -10,7 +10,7 @@ import dev.engine_room.flywheel.lib.internal.FlwLibXplat; import dev.engine_room.flywheel.lib.model.ModelUtil; import dev.engine_room.flywheel.lib.model.SimpleModel; -import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.chunk.ChunkSectionLayer; import net.minecraft.core.BlockPos; import net.minecraft.world.level.BlockAndTintGetter; @@ -21,7 +21,7 @@ public final class BlockModelBuilder { PoseStack poseStack; boolean renderFluids = false; @Nullable - BiFunction materialFunc; + BiFunction materialFunc; public BlockModelBuilder(BlockAndTintGetter level, Iterable positions) { this.level = level; @@ -38,7 +38,7 @@ public BlockModelBuilder renderFluids(boolean renderFluids) { return this; } - public BlockModelBuilder materialFunc(@Nullable BiFunction materialFunc) { + public BlockModelBuilder materialFunc(@Nullable BiFunction materialFunc) { this.materialFunc = materialFunc; return this; } diff --git a/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/EmptyVirtualBlockGetter.java b/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/EmptyVirtualBlockGetter.java index 1c24d2a0a..de57dbda6 100644 --- a/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/EmptyVirtualBlockGetter.java +++ b/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/EmptyVirtualBlockGetter.java @@ -41,7 +41,7 @@ public final int getHeight() { } @Override - public final int getMinBuildHeight() { + public int getMinY() { return 0; } } diff --git a/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/SinglePosVirtualBlockGetter.java b/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/SinglePosVirtualBlockGetter.java index 5ff46754e..729ad5565 100644 --- a/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/SinglePosVirtualBlockGetter.java +++ b/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/SinglePosVirtualBlockGetter.java @@ -67,7 +67,7 @@ public int getHeight() { } @Override - public int getMinBuildHeight() { + public int getMinY() { return pos.getY(); } } diff --git a/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/TransformingVertexConsumer.java b/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/TransformingVertexConsumer.java index 0e8b91380..7b92b550e 100644 --- a/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/TransformingVertexConsumer.java +++ b/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/TransformingVertexConsumer.java @@ -41,6 +41,12 @@ public VertexConsumer setColor(int red, int green, int blue, int alpha) { return this; } + @Override + public VertexConsumer setColor(int color) { + delegate.setColor(color); + return this; + } + @Override public VertexConsumer setUv(float u, float v) { delegate.setUv(u, v); @@ -68,4 +74,10 @@ public VertexConsumer setNormal(float x, float y, float z) { MatrixMath.transformNormalZ(matrix, x, y, z)); return this; } + + @Override + public VertexConsumer setLineWidth(float f) { + delegate.setLineWidth(f); + return this; + } } diff --git a/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/VirtualBlockGetter.java b/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/VirtualBlockGetter.java index 1b5782d43..808200da8 100644 --- a/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/VirtualBlockGetter.java +++ b/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/VirtualBlockGetter.java @@ -37,7 +37,7 @@ public LevelLightEngine getLightEngine() { @Override public int getBlockTint(BlockPos pos, ColorResolver resolver) { - Biome plainsBiome = Minecraft.getInstance().getConnection().registryAccess().registryOrThrow(Registries.BIOME).getOrThrow(Biomes.PLAINS); + Biome plainsBiome = Minecraft.getInstance().getConnection().registryAccess().lookupOrThrow(Registries.BIOME).getValueOrThrow(Biomes.PLAINS); return resolver.getColor(plainsBiome, pos.getX(), pos.getZ()); } } diff --git a/common/src/lib/java/dev/engine_room/flywheel/lib/model/part/InstanceTree.java b/common/src/lib/java/dev/engine_room/flywheel/lib/model/part/InstanceTree.java index a9aa9a9d9..09d73b94f 100644 --- a/common/src/lib/java/dev/engine_room/flywheel/lib/model/part/InstanceTree.java +++ b/common/src/lib/java/dev/engine_room/flywheel/lib/model/part/InstanceTree.java @@ -460,12 +460,12 @@ public PartPose storePose() { } public void loadPose(PartPose pose) { - x = pose.x; - y = pose.y; - z = pose.z; - xRot = pose.xRot; - yRot = pose.yRot; - zRot = pose.zRot; + x = pose.x(); + y = pose.y(); + z = pose.z(); + xRot = pose.xRot(); + yRot = pose.yRot(); + zRot = pose.zRot(); xScale = ModelPart.DEFAULT_SCALE; yScale = ModelPart.DEFAULT_SCALE; zScale = ModelPart.DEFAULT_SCALE; diff --git a/common/src/lib/java/dev/engine_room/flywheel/lib/model/part/ModelTrees.java b/common/src/lib/java/dev/engine_room/flywheel/lib/model/part/ModelTrees.java index 84206cf81..af8838143 100644 --- a/common/src/lib/java/dev/engine_room/flywheel/lib/model/part/ModelTrees.java +++ b/common/src/lib/java/dev/engine_room/flywheel/lib/model/part/ModelTrees.java @@ -78,6 +78,6 @@ private static ModelTree convert(String path, MeshTree meshTree, Set pat return new ModelTree(model, meshTree.initialPose(), children); } - private record ModelTreeKey(ModelLayerLocation layer, Set pathsToPrune, @Nullable net.minecraft.client.resources.model.Material texture, Material material) { + private record ModelTreeKey(ModelLayerLocation layer, Set pathsToPrune, net.minecraft.client.resources.model.@Nullable Material texture, Material material) { } } diff --git a/common/src/lib/java/dev/engine_room/flywheel/lib/model/part/VertexWriter.java b/common/src/lib/java/dev/engine_room/flywheel/lib/model/part/VertexWriter.java index 00d808ee3..744fda0c6 100644 --- a/common/src/lib/java/dev/engine_room/flywheel/lib/model/part/VertexWriter.java +++ b/common/src/lib/java/dev/engine_room/flywheel/lib/model/part/VertexWriter.java @@ -48,6 +48,12 @@ public VertexConsumer setColor(int red, int green, int blue, int alpha) { return this; } + @Override + public VertexConsumer setColor(int color) { + // ignore color + return this; + } + @Override public VertexConsumer setUv(float u, float v) { if (!filledTexture) { @@ -83,6 +89,12 @@ public VertexConsumer setNormal(float x, float y, float z) { return this; } + @Override + public VertexConsumer setLineWidth(float f) { + // ignore line width + return this; + } + private long vertexPtr() { return data.ptr() + (vertexCount - 1) * STRIDE; } diff --git a/common/src/lib/java/dev/engine_room/flywheel/lib/visual/AbstractBlockEntityVisual.java b/common/src/lib/java/dev/engine_room/flywheel/lib/visual/AbstractBlockEntityVisual.java index 769fa6f58..63bf3769f 100644 --- a/common/src/lib/java/dev/engine_room/flywheel/lib/visual/AbstractBlockEntityVisual.java +++ b/common/src/lib/java/dev/engine_room/flywheel/lib/visual/AbstractBlockEntityVisual.java @@ -96,7 +96,7 @@ public boolean isVisible(FrustumIntersection frustum) { */ public boolean doDistanceLimitThisFrame(DynamicVisual.Context context) { return !context.limiter() - .shouldUpdate(pos.distToCenterSqr(context.camera().getPosition())); + .shouldUpdate(pos.distToCenterSqr(context.camera().position())); } protected int computePackedLight() { diff --git a/common/src/lib/java/dev/engine_room/flywheel/lib/visual/AbstractEntityVisual.java b/common/src/lib/java/dev/engine_room/flywheel/lib/visual/AbstractEntityVisual.java index 5f0cca2e7..17be50263 100644 --- a/common/src/lib/java/dev/engine_room/flywheel/lib/visual/AbstractEntityVisual.java +++ b/common/src/lib/java/dev/engine_room/flywheel/lib/visual/AbstractEntityVisual.java @@ -1,8 +1,8 @@ package dev.engine_room.flywheel.lib.visual; -import org.jspecify.annotations.Nullable; import org.joml.FrustumIntersection; import org.joml.Vector3f; +import org.jspecify.annotations.Nullable; import dev.engine_room.flywheel.api.visual.DynamicVisual; import dev.engine_room.flywheel.api.visual.EntityVisual; @@ -12,6 +12,7 @@ import dev.engine_room.flywheel.api.visualization.VisualizationContext; import dev.engine_room.flywheel.api.visualization.VisualizationManager; import dev.engine_room.flywheel.lib.instance.FlatLit; +import dev.engine_room.flywheel.lib.internal.FlwLibLink; import net.minecraft.client.renderer.LightTexture; import net.minecraft.core.BlockPos; import net.minecraft.util.Mth; @@ -89,7 +90,7 @@ public Vector3f getVisualPosition(float partialTick) { } public boolean isVisible(FrustumIntersection frustum) { - return entity.noCulling || visibilityTester.check(frustum); + return FlwLibLink.INSTANCE.isAffectedByCulling(entity) || visibilityTester.check(frustum); } protected int computePackedLight(float partialTick) { diff --git a/common/src/lib/java/dev/engine_room/flywheel/lib/visual/EntityVisibilityTester.java b/common/src/lib/java/dev/engine_room/flywheel/lib/visual/EntityVisibilityTester.java index 3354a4665..d9c3e71af 100644 --- a/common/src/lib/java/dev/engine_room/flywheel/lib/visual/EntityVisibilityTester.java +++ b/common/src/lib/java/dev/engine_room/flywheel/lib/visual/EntityVisibilityTester.java @@ -1,8 +1,9 @@ package dev.engine_room.flywheel.lib.visual; -import org.jspecify.annotations.Nullable; import org.joml.FrustumIntersection; +import org.jspecify.annotations.Nullable; +import dev.engine_room.flywheel.lib.internal.FlwLibLink; import dev.engine_room.flywheel.lib.math.MoreMath; import net.minecraft.core.Vec3i; import net.minecraft.util.Mth; @@ -42,7 +43,7 @@ public EntityVisibilityTester(Entity entity, Vec3i renderOrigin, float scale) { * @return {@code true} if the Entity is visible, {@code false} otherwise. */ public boolean check(FrustumIntersection frustum) { - AABB aabb = entity.getBoundingBoxForCulling(); + AABB aabb = FlwLibLink.INSTANCE.getCullingBoundingBox(entity); // If we've never seen the entity before assume its visible. // Fixes entities freezing when they first spawn. diff --git a/common/src/lib/java/dev/engine_room/flywheel/lib/visual/component/FireComponent.java b/common/src/lib/java/dev/engine_room/flywheel/lib/visual/component/FireComponent.java index deb180e8a..a6a24434e 100644 --- a/common/src/lib/java/dev/engine_room/flywheel/lib/visual/component/FireComponent.java +++ b/common/src/lib/java/dev/engine_room/flywheel/lib/visual/component/FireComponent.java @@ -19,6 +19,7 @@ import dev.engine_room.flywheel.lib.model.SingleMeshModel; import dev.engine_room.flywheel.lib.util.RendererReloadCache; import dev.engine_room.flywheel.lib.visual.util.SmartRecycler; +import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.LightTexture; import net.minecraft.client.renderer.texture.TextureAtlasSprite; import net.minecraft.client.resources.model.ModelBakery; @@ -37,7 +38,8 @@ public final class FireComponent implements EntityComponent { // because Material#sprite is a surprisingly heavy operation // and because sprites are invalidated after a resource reload. private static final RendererReloadCache FIRE_MODELS = new RendererReloadCache<>(texture -> { - return new SingleMeshModel(new FireMesh(texture.sprite()), FIRE_MATERIAL); + TextureAtlasSprite sprite = Minecraft.getInstance().getAtlasManager().get(texture); + return new SingleMeshModel(new FireMesh(sprite), FIRE_MATERIAL); }); private final VisualizationContext context; @@ -95,7 +97,7 @@ private void setupInstances(DynamicVisual.Context context) { stack.translate(entityX - renderOrigin.getX(), entityY - renderOrigin.getY(), entityZ - renderOrigin.getZ()); stack.scale(scale, scale, scale); stack.mulPose(Axis.YP.rotationDegrees(-context.camera() - .getYRot())); + .yRot())); stack.translate(0.0F, 0.0F, -0.3F + (float) ((int) maxHeight) * 0.02F); for (int i = 0; y < maxHeight; ++i) { diff --git a/common/src/lib/java/dev/engine_room/flywheel/lib/visual/component/HitboxComponent.java b/common/src/lib/java/dev/engine_room/flywheel/lib/visual/component/HitboxComponent.java index d4d7ce8eb..24734f33c 100644 --- a/common/src/lib/java/dev/engine_room/flywheel/lib/visual/component/HitboxComponent.java +++ b/common/src/lib/java/dev/engine_room/flywheel/lib/visual/component/HitboxComponent.java @@ -10,6 +10,7 @@ import dev.engine_room.flywheel.lib.model.LineModelBuilder; import dev.engine_room.flywheel.lib.visual.util.SmartRecycler; import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.components.debug.DebugScreenEntries; import net.minecraft.client.renderer.LightTexture; import net.minecraft.util.Mth; import net.minecraft.world.entity.Entity; @@ -85,9 +86,7 @@ public HitboxComponent showEyeBox(boolean showEyeBox) { public void beginFrame(DynamicVisual.Context context) { recycler.resetCount(); - var shouldRenderHitBoxes = Minecraft.getInstance() - .getEntityRenderDispatcher() - .shouldRenderHitBoxes(); + var shouldRenderHitBoxes = Minecraft.getInstance().debugEntries.isCurrentlyEnabled(DebugScreenEntries.ENTITY_HITBOXES); if (shouldRenderHitBoxes && !entity.isInvisible() && !Minecraft.getInstance() .showOnlyReducedInfo()) { float partialTick = context.partialTick(); diff --git a/common/src/main/java/dev/engine_room/flywheel/impl/FlwLibLinkImpl.java b/common/src/main/java/dev/engine_room/flywheel/impl/FlwLibLinkImpl.java index 10244b19c..2cf5c8e98 100644 --- a/common/src/main/java/dev/engine_room/flywheel/impl/FlwLibLinkImpl.java +++ b/common/src/main/java/dev/engine_room/flywheel/impl/FlwLibLinkImpl.java @@ -11,11 +11,16 @@ import dev.engine_room.flywheel.impl.compat.IrisCompat; import dev.engine_room.flywheel.impl.compat.OptifineCompat; import dev.engine_room.flywheel.impl.extension.PoseStackExtension; +import dev.engine_room.flywheel.impl.mixin.EntityRendererAccessor; import dev.engine_room.flywheel.impl.mixin.ModelPartAccessor; import dev.engine_room.flywheel.impl.mixin.PoseStackAccessor; import dev.engine_room.flywheel.lib.internal.FlwLibLink; import dev.engine_room.flywheel.lib.transform.PoseTransformStack; +import net.minecraft.client.Minecraft; import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.client.renderer.entity.EntityRenderer; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.phys.AABB; public class FlwLibLinkImpl implements FlwLibLink { @Override @@ -74,4 +79,20 @@ public boolean isRenderingShadowPass() { return false; } } + + @Override + public boolean isAffectedByCulling(T entity) { + EntityRenderer renderer = Minecraft.getInstance() + .getEntityRenderDispatcher() + .getRenderer(entity); + return ((EntityRendererAccessor) renderer).flywheel$affectedByCulling(entity); + } + + @Override + public AABB getCullingBoundingBox(T entity) { + EntityRenderer renderer = Minecraft.getInstance() + .getEntityRenderDispatcher() + .getRenderer(entity); + return ((EntityRendererAccessor) renderer).flywheel$getBoundingBoxForCulling(entity); + } } diff --git a/common/src/main/java/dev/engine_room/flywheel/impl/mixin/EntityRendererAccessor.java b/common/src/main/java/dev/engine_room/flywheel/impl/mixin/EntityRendererAccessor.java new file mode 100644 index 000000000..2c4ad5a05 --- /dev/null +++ b/common/src/main/java/dev/engine_room/flywheel/impl/mixin/EntityRendererAccessor.java @@ -0,0 +1,17 @@ +package dev.engine_room.flywheel.impl.mixin; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Invoker; + +import net.minecraft.client.renderer.entity.EntityRenderer; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.phys.AABB; + +@Mixin(EntityRenderer.class) +public interface EntityRendererAccessor { + @Invoker("affectedByCulling") + boolean flywheel$affectedByCulling(T entity); + + @Invoker("getBoundingBoxForCulling") + AABB flywheel$getBoundingBoxForCulling(T entity); +} diff --git a/common/src/main/resources/flywheel.impl.mixins.json b/common/src/main/resources/flywheel.impl.mixins.json index 9b576d52d..17127784d 100644 --- a/common/src/main/resources/flywheel.impl.mixins.json +++ b/common/src/main/resources/flywheel.impl.mixins.json @@ -7,6 +7,7 @@ "client": [ "BlockEntityTypeMixin", "ClientChunkCacheMixin", + "EntityRendererAccessor", "EntityTypeMixin", "LevelMixin", "LevelRendererMixin", diff --git a/common/src/vanillin/java/dev/engine_room/vanillin/elements/FireElement.java b/common/src/vanillin/java/dev/engine_room/vanillin/elements/FireElement.java index 2a4c44e22..0cc6c34d7 100644 --- a/common/src/vanillin/java/dev/engine_room/vanillin/elements/FireElement.java +++ b/common/src/vanillin/java/dev/engine_room/vanillin/elements/FireElement.java @@ -97,7 +97,7 @@ private void setupInstances(DynamicVisual.Context context) { stack.translate(entityX - renderOrigin.getX(), entityY - renderOrigin.getY(), entityZ - renderOrigin.getZ()); stack.scale(scale, scale, scale); stack.mulPose(Axis.YP.rotationDegrees(-context.camera() - .getYRot())); + .yRot())); stack.translate(0.0F, 0.0F, -0.3F + (float) ((int) maxHeight) * 0.02F); for (int i = 0; y < maxHeight; ++i) { diff --git a/common/src/vanillin/java/dev/engine_room/vanillin/visuals/BlockDisplayVisual.java b/common/src/vanillin/java/dev/engine_room/vanillin/visuals/BlockDisplayVisual.java index 212e8bb82..331291b00 100644 --- a/common/src/vanillin/java/dev/engine_room/vanillin/visuals/BlockDisplayVisual.java +++ b/common/src/vanillin/java/dev/engine_room/vanillin/visuals/BlockDisplayVisual.java @@ -107,11 +107,11 @@ public void beginFrame(Context ctx) { } private static float cameraYrot(Camera camera) { - return camera.getYRot() - 180.0F; + return camera.yRot() - 180.0F; } private static float cameraXRot(Camera camera) { - return -camera.getXRot(); + return -camera.xRot(); } private static float entityYRot(Entity entity, float partialTick) { diff --git a/common/src/vanillin/java/dev/engine_room/vanillin/visuals/ItemDisplayVisual.java b/common/src/vanillin/java/dev/engine_room/vanillin/visuals/ItemDisplayVisual.java index d0c963676..d0ccf9871 100644 --- a/common/src/vanillin/java/dev/engine_room/vanillin/visuals/ItemDisplayVisual.java +++ b/common/src/vanillin/java/dev/engine_room/vanillin/visuals/ItemDisplayVisual.java @@ -122,11 +122,11 @@ public void beginFrame(Context ctx) { } private static float cameraYrot(Camera camera) { - return camera.getYRot() - 180.0F; + return camera.yRot() - 180.0F; } private static float cameraXRot(Camera camera) { - return -camera.getXRot(); + return -camera.xRot(); } private static float entityYRot(Entity entity, float partialTick) { From ab818bf40a2870939fad310700d89015538bd47c Mon Sep 17 00:00:00 2001 From: IThundxr Date: Mon, 22 Dec 2025 21:32:59 -0500 Subject: [PATCH 07/59] 1.21.1 Porting II --- .../flywheel/impl/mixin/LevelRendererMixin.java | 11 ++++++----- .../engine_room/flywheel/impl/FlwImplXplatImpl.java | 4 ++-- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/common/src/main/java/dev/engine_room/flywheel/impl/mixin/LevelRendererMixin.java b/common/src/main/java/dev/engine_room/flywheel/impl/mixin/LevelRendererMixin.java index c21f73893..4e8a4f1a2 100644 --- a/common/src/main/java/dev/engine_room/flywheel/impl/mixin/LevelRendererMixin.java +++ b/common/src/main/java/dev/engine_room/flywheel/impl/mixin/LevelRendererMixin.java @@ -2,8 +2,9 @@ import java.util.SortedSet; -import org.jspecify.annotations.Nullable; import org.joml.Matrix4f; +import org.joml.Vector4f; +import org.jspecify.annotations.Nullable; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -12,6 +13,8 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import com.mojang.blaze3d.buffers.GpuBufferSlice; +import com.mojang.blaze3d.resource.GraphicsResourceAllocator; import com.mojang.blaze3d.vertex.PoseStack; import dev.engine_room.flywheel.api.visualization.VisualizationManager; @@ -22,9 +25,7 @@ import net.minecraft.client.Camera; import net.minecraft.client.DeltaTracker; import net.minecraft.client.multiplayer.ClientLevel; -import net.minecraft.client.renderer.GameRenderer; import net.minecraft.client.renderer.LevelRenderer; -import net.minecraft.client.renderer.LightTexture; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderBuffers; import net.minecraft.server.level.BlockDestructionProgress; @@ -50,8 +51,8 @@ abstract class LevelRendererMixin { // @Inject(method = "renderLevel", at = @At("HEAD")) @Inject(method = "renderLevel", at = @At(value = "INVOKE_ASSIGN", target = "Lnet/minecraft/world/level/lighting/LevelLightEngine;runLightUpdates()I")) - private void flywheel$beginRender(DeltaTracker deltaTracker, boolean renderBlockOutline, Camera camera, GameRenderer gameRenderer, LightTexture lightTexture, Matrix4f modelMatrix, Matrix4f projectionMatrix, CallbackInfo ci) { - flywheel$renderContext = RenderContextImpl.create((LevelRenderer) (Object) this, level, renderBuffers, modelMatrix, projectionMatrix, camera, deltaTracker.getGameTimeDeltaPartialTick(false)); + private void flywheel$beginRender(GraphicsResourceAllocator graphicsResourceAllocator, DeltaTracker deltaTracker, boolean renderBlockOutline, Camera camera, Matrix4f frustumMatrix, Matrix4f projectionMatrix, Matrix4f cullingProjectionMatrix, GpuBufferSlice shaderFog, Vector4f fogColor, boolean renderSky, CallbackInfo ci) { + flywheel$renderContext = RenderContextImpl.create((LevelRenderer) (Object) this, level, renderBuffers, frustumMatrix, projectionMatrix, camera, deltaTracker.getGameTimeDeltaPartialTick(false)); VisualizationManager manager = VisualizationManager.get(level); if (manager != null) { diff --git a/neoforge/src/main/java/dev/engine_room/flywheel/impl/FlwImplXplatImpl.java b/neoforge/src/main/java/dev/engine_room/flywheel/impl/FlwImplXplatImpl.java index f754fc992..e4fbda838 100644 --- a/neoforge/src/main/java/dev/engine_room/flywheel/impl/FlwImplXplatImpl.java +++ b/neoforge/src/main/java/dev/engine_room/flywheel/impl/FlwImplXplatImpl.java @@ -2,13 +2,13 @@ import dev.engine_room.flywheel.api.event.ReloadLevelRendererEvent; import net.minecraft.client.multiplayer.ClientLevel; -import net.neoforged.fml.loading.LoadingModList; +import net.neoforged.fml.loading.FMLLoader; import net.neoforged.neoforge.common.NeoForge; public class FlwImplXplatImpl implements FlwImplXplat { @Override public boolean isModLoaded(String modId) { - return LoadingModList.get().getModFileById(modId) != null; + return FMLLoader.getCurrent().getLoadingModList().getModFileById(modId) != null; } @Override From dafc48088b3c00a6b37dfc8f1141b033469200f5 Mon Sep 17 00:00:00 2001 From: IThundxr Date: Fri, 26 Dec 2025 13:49:42 -0500 Subject: [PATCH 08/59] 1.21.1 Porting III --- .../flywheel/backend/NoiseTextures.java | 12 +- .../backend/engine/MaterialRenderState.java | 127 +++++++++--------- .../backend/engine/TextureBinder.java | 10 +- .../backend/engine/indirect/DepthPyramid.java | 7 +- .../engine/indirect/OitFramebuffer.java | 102 +++++++------- .../flywheel/backend/gl/GlStateTracker.java | 2 +- .../flywheel/backend/gl/GlTextureUnit.java | 10 +- .../backend/gl/array/GlVertexArray.java | 4 +- .../flywheel/backend/gl/buffer/GlBuffer.java | 2 +- .../backend/mixin/GlStateManagerAccessor.java | 14 ++ .../backend/mixin/GlStateManagerMixin.java | 2 +- .../resources/flywheel.backend.mixins.json | 17 +-- .../impl/mixin/fix/FixFabulousDepthMixin.java | 2 +- 13 files changed, 164 insertions(+), 147 deletions(-) create mode 100644 common/src/backend/java/dev/engine_room/flywheel/backend/mixin/GlStateManagerAccessor.java diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/NoiseTextures.java b/common/src/backend/java/dev/engine_room/flywheel/backend/NoiseTextures.java index f3bccd22f..8b3688a1a 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/NoiseTextures.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/NoiseTextures.java @@ -2,21 +2,15 @@ import java.io.IOException; -import com.mojang.blaze3d.opengl.GlStateManager; - -import com.mojang.blaze3d.opengl.GlTexture; - -import dev.engine_room.flywheel.lib.util.IdentifierUtil; - -import net.minecraft.client.gui.render.TextureSetup; - import org.jetbrains.annotations.UnknownNullability; import org.lwjgl.opengl.GL32; +import com.mojang.blaze3d.opengl.GlStateManager; +import com.mojang.blaze3d.opengl.GlTexture; import com.mojang.blaze3d.platform.NativeImage; -import com.mojang.blaze3d.systems.RenderSystem; import dev.engine_room.flywheel.backend.gl.GlTextureUnit; +import dev.engine_room.flywheel.lib.util.IdentifierUtil; import net.minecraft.client.renderer.texture.DynamicTexture; import net.minecraft.resources.Identifier; import net.minecraft.server.packs.resources.ResourceManager; diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/engine/MaterialRenderState.java b/common/src/backend/java/dev/engine_room/flywheel/backend/engine/MaterialRenderState.java index b6d262f1e..30d8ce19b 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/engine/MaterialRenderState.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/engine/MaterialRenderState.java @@ -2,13 +2,11 @@ import java.util.Comparator; -import com.mojang.blaze3d.opengl.GlConst; -import com.mojang.blaze3d.opengl.GlStateManager; - import org.jspecify.annotations.Nullable; import org.lwjgl.opengl.GL11; -import com.mojang.blaze3d.platform.GlStateManager; +import com.mojang.blaze3d.opengl.GlConst; +import com.mojang.blaze3d.opengl.GlStateManager; import com.mojang.blaze3d.systems.RenderSystem; import dev.engine_room.flywheel.api.material.DepthTest; @@ -76,69 +74,69 @@ private static void setupPolygonOffset(boolean polygonOffset) { private static void setupDepthTest(DepthTest depthTest) { switch (depthTest) { - case OFF -> { - GlStateManager._disableDepthTest(); - } - case NEVER -> { - GlStateManager._enableDepthTest(); - GlStateManager._depthFunc(GL11.GL_NEVER); - } - case LESS -> { - GlStateManager._enableDepthTest(); - GlStateManager._depthFunc(GL11.GL_LESS); - } - case EQUAL -> { - GlStateManager._enableDepthTest(); - GlStateManager._depthFunc(GL11.GL_EQUAL); - } - case LEQUAL -> { - GlStateManager._enableDepthTest(); - GlStateManager._depthFunc(GL11.GL_LEQUAL); - } - case GREATER -> { - GlStateManager._enableDepthTest(); - GlStateManager._depthFunc(GL11.GL_GREATER); - } - case NOTEQUAL -> { - GlStateManager._enableDepthTest(); - GlStateManager._depthFunc(GL11.GL_NOTEQUAL); - } - case GEQUAL -> { - GlStateManager._enableDepthTest(); - GlStateManager._depthFunc(GL11.GL_GEQUAL); - } - case ALWAYS -> { - GlStateManager._enableDepthTest(); - GlStateManager._depthFunc(GL11.GL_ALWAYS); - } + case OFF -> { + GlStateManager._disableDepthTest(); + } + case NEVER -> { + GlStateManager._enableDepthTest(); + GlStateManager._depthFunc(GL11.GL_NEVER); + } + case LESS -> { + GlStateManager._enableDepthTest(); + GlStateManager._depthFunc(GL11.GL_LESS); + } + case EQUAL -> { + GlStateManager._enableDepthTest(); + GlStateManager._depthFunc(GL11.GL_EQUAL); + } + case LEQUAL -> { + GlStateManager._enableDepthTest(); + GlStateManager._depthFunc(GL11.GL_LEQUAL); + } + case GREATER -> { + GlStateManager._enableDepthTest(); + GlStateManager._depthFunc(GL11.GL_GREATER); + } + case NOTEQUAL -> { + GlStateManager._enableDepthTest(); + GlStateManager._depthFunc(GL11.GL_NOTEQUAL); + } + case GEQUAL -> { + GlStateManager._enableDepthTest(); + GlStateManager._depthFunc(GL11.GL_GEQUAL); + } + case ALWAYS -> { + GlStateManager._enableDepthTest(); + GlStateManager._depthFunc(GL11.GL_ALWAYS); + } } } private static void setupTransparency(Transparency transparency) { switch (transparency) { - case OPAQUE -> { - GlStateManager._disableBlend(); - } - case ADDITIVE -> { - GlStateManager._enableBlend(); - GlStateManager._blendFuncSeparate(GlConst.GL_ONE, GlConst.GL_ONE, GlConst.GL_ONE, GlConst.GL_ONE); - } - case LIGHTNING -> { - GlStateManager._enableBlend(); - GlStateManager._blendFuncSeparate(GlConst.GL_SRC_ALPHA, GlConst.GL_ONE, GlConst.GL_SRC_ALPHA, GlConst.GL_ONE); - } - case GLINT -> { - GlStateManager._enableBlend(); - GlStateManager._blendFuncSeparate(GlConst.GL_SRC_COLOR, GlConst.GL_ONE, GlConst.GL_ZERO, GlConst.GL_ONE); - } - case CRUMBLING -> { - GlStateManager._enableBlend(); - GlStateManager._blendFuncSeparate(GlConst.GL_DST_COLOR, GlConst.GL_SRC_COLOR, GlConst.GL_ONE, GlConst.GL_ZERO); - } - case TRANSLUCENT -> { - GlStateManager._enableBlend(); - GlStateManager._blendFuncSeparate(GlConst.GL_SRC_ALPHA, GlConst.GL_ONE_MINUS_SRC_ALPHA, GlConst.GL_ONE, GlConst.GL_ONE_MINUS_SRC_ALPHA); - } + case OPAQUE -> { + GlStateManager._disableBlend(); + } + case ADDITIVE -> { + GlStateManager._enableBlend(); + GlStateManager._blendFuncSeparate(GlConst.GL_ONE, GlConst.GL_ONE, GlConst.GL_ONE, GlConst.GL_ONE); + } + case LIGHTNING -> { + GlStateManager._enableBlend(); + GlStateManager._blendFuncSeparate(GlConst.GL_SRC_ALPHA, GlConst.GL_ONE, GlConst.GL_SRC_ALPHA, GlConst.GL_ONE); + } + case GLINT -> { + GlStateManager._enableBlend(); + GlStateManager._blendFuncSeparate(GlConst.GL_SRC_COLOR, GlConst.GL_ONE, GlConst.GL_ZERO, GlConst.GL_ONE); + } + case CRUMBLING -> { + GlStateManager._enableBlend(); + GlStateManager._blendFuncSeparate(GlConst.GL_DST_COLOR, GlConst.GL_SRC_COLOR, GlConst.GL_ONE, GlConst.GL_ZERO); + } + case TRANSLUCENT -> { + GlStateManager._enableBlend(); + GlStateManager._blendFuncSeparate(GlConst.GL_SRC_ALPHA, GlConst.GL_ONE_MINUS_SRC_ALPHA, GlConst.GL_ONE, GlConst.GL_ONE_MINUS_SRC_ALPHA); + } } } @@ -297,9 +295,6 @@ public static int compare(Material lhs, Material rhs) { } cmp = lhs.writeMask() .compareTo(rhs.writeMask()); - if (cmp != 0) { - return cmp; - } - return 0; + return cmp; } } diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/engine/TextureBinder.java b/common/src/backend/java/dev/engine_room/flywheel/backend/engine/TextureBinder.java index 805505ab9..5f7ce9159 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/engine/TextureBinder.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/engine/TextureBinder.java @@ -1,5 +1,7 @@ package dev.engine_room.flywheel.backend.engine; +import com.mojang.blaze3d.opengl.GlStateManager; +import com.mojang.blaze3d.opengl.GlTexture; import com.mojang.blaze3d.systems.RenderSystem; import dev.engine_room.flywheel.backend.Samplers; @@ -8,7 +10,7 @@ public class TextureBinder { public static void bind(Identifier id) { - RenderSystem.bindTexture(byName(id)); + GlStateManager._bindTexture(byName(id)); } public static void bindLightAndOverlay() { @@ -19,6 +21,7 @@ public static void bindLightAndOverlay() { .setupOverlayColor(); RenderSystem.bindTexture(RenderSystem.getShaderTexture(1)); + Samplers.LIGHT.makeActive(); gameRenderer.lightTexture() .turnOnLightLayer(); @@ -41,9 +44,10 @@ public static void resetLightAndOverlay() { * @return The texture. */ public static int byName(Identifier texture) { - return Minecraft.getInstance() + return ((GlTexture) Minecraft.getInstance() .getTextureManager() .getTexture(texture) - .getId(); + .getTexture()) + .glId(); } } diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/engine/indirect/DepthPyramid.java b/common/src/backend/java/dev/engine_room/flywheel/backend/engine/indirect/DepthPyramid.java index 0f2f642b5..b6f9a83d9 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/engine/indirect/DepthPyramid.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/engine/indirect/DepthPyramid.java @@ -3,7 +3,9 @@ import org.lwjgl.opengl.GL32; import org.lwjgl.opengl.GL46; -import com.mojang.blaze3d.platform.GlStateManager; +import com.mojang.blaze3d.opengl.GlStateManager; +import com.mojang.blaze3d.opengl.GlTexture; +import com.mojang.blaze3d.textures.GpuTexture; import dev.engine_room.flywheel.backend.compile.IndirectPrograms; import dev.engine_room.flywheel.backend.gl.GlTextureUnit; @@ -32,7 +34,8 @@ public void generate() { createPyramidMips(mipLevels, width, height); - int depthBufferId = mainRenderTarget.getDepthTextureId(); + GpuTexture depthTexture = mainRenderTarget.getDepthTexture(); + int depthBufferId = depthTexture != null ? ((GlTexture) depthTexture).glId() : 0; GL46.glMemoryBarrier(GL46.GL_FRAMEBUFFER_BARRIER_BIT); diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/engine/indirect/OitFramebuffer.java b/common/src/backend/java/dev/engine_room/flywheel/backend/engine/indirect/OitFramebuffer.java index 693fe9cef..0c0d18246 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/engine/indirect/OitFramebuffer.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/engine/indirect/OitFramebuffer.java @@ -3,8 +3,11 @@ import org.lwjgl.opengl.GL32; import org.lwjgl.opengl.GL46; +import com.mojang.blaze3d.opengl.GlConst; +import com.mojang.blaze3d.opengl.GlDevice; +import com.mojang.blaze3d.opengl.GlStateManager; +import com.mojang.blaze3d.opengl.GlTexture; import com.mojang.blaze3d.pipeline.RenderTarget; -import com.mojang.blaze3d.platform.GlStateManager; import com.mojang.blaze3d.systems.RenderSystem; import dev.engine_room.flywheel.backend.NoiseTextures; @@ -61,17 +64,17 @@ public void prepare() { Samplers.COEFFICIENTS.makeActive(); // Bind zero to render system to make sure we clear their internal state - RenderSystem.bindTexture(0); + GlStateManager._bindTexture(0); GL32.glBindTexture(GL32.GL_TEXTURE_2D_ARRAY, coefficients); Samplers.DEPTH_RANGE.makeActive(); - RenderSystem.bindTexture(depthBounds); + GlStateManager._bindTexture(depthBounds); Samplers.NOISE.makeActive(); - NoiseTextures.BLUE_NOISE.bind(); + GlStateManager._bindTexture(((GlTexture) NoiseTextures.BLUE_NOISE.getTexture()).glId()); GlStateManager._glBindFramebuffer(GL32.GL_FRAMEBUFFER, fbo); - GL32.glFramebufferTexture(GL32.GL_FRAMEBUFFER, GL32.GL_DEPTH_ATTACHMENT, renderTarget.getDepthTextureId(), 0); + GL32.glFramebufferTexture(GL32.GL_FRAMEBUFFER, GL32.GL_DEPTH_ATTACHMENT, ((GlTexture) renderTarget.getDepthTexture()).glId(), 0); } /** @@ -79,11 +82,11 @@ public void prepare() { */ public void depthRange() { // No depth writes, but we'll still use the depth test. - RenderSystem.depthMask(false); - RenderSystem.colorMask(true, true, true, true); - RenderSystem.enableBlend(); - RenderSystem.blendFunc(GlStateManager.SourceFactor.ONE, GlStateManager.DestFactor.ONE); - RenderSystem.blendEquation(GL32.GL_MAX); + GlStateManager._depthMask(false); + GlStateManager._colorMask(true, true, true, true); + GlStateManager._enableBlend(); + GlStateManager._blendFuncSeparate(GlConst.GL_ONE, GlConst.GL_ONE, GlConst.GL_ONE, GlConst.GL_ONE); + GL32.glBlendEquation(GL32.GL_MAX); var far = Minecraft.getInstance().gameRenderer.getDepthFar(); @@ -92,8 +95,8 @@ public void depthRange() { GL46.glClearNamedFramebufferfv(fbo, GL46.GL_COLOR, 0, new float[]{-far, -far, 0, 0}); } else { GL32.glDrawBuffers(DEPTH_RANGE_DRAW_BUFFERS); - RenderSystem.clearColor(-far, -far, 0, 0); - RenderSystem.clear(GL32.GL_COLOR_BUFFER_BIT, false); + GL32.glClearColor(-far, -far, 0, 0); + GlStateManager._clear(GL32.GL_COLOR_BUFFER_BIT); } } @@ -102,11 +105,11 @@ public void depthRange() { */ public void renderTransmittance() { // No depth writes, but we'll still use the depth test - RenderSystem.depthMask(false); - RenderSystem.colorMask(true, true, true, true); - RenderSystem.enableBlend(); - RenderSystem.blendFunc(GlStateManager.SourceFactor.ONE, GlStateManager.DestFactor.ONE); - RenderSystem.blendEquation(GL32.GL_FUNC_ADD); + GlStateManager._depthMask(false); + GlStateManager._colorMask(true, true, true, true); + GlStateManager._enableBlend(); + GlStateManager._blendFuncSeparate(GlConst.GL_ONE, GlConst.GL_ONE, GlConst.GL_ONE, GlConst.GL_ONE); + GL32.glBlendEquation(GL32.GL_FUNC_ADD); if (GlCompat.SUPPORTS_DSA) { GL46.glNamedFramebufferDrawBuffers(fbo, RENDER_TRANSMITTANCE_DRAW_BUFFERS); @@ -117,8 +120,8 @@ public void renderTransmittance() { GL46.glClearNamedFramebufferfv(fbo, GL46.GL_COLOR, 3, CLEAR_TO_ZERO); } else { GL32.glDrawBuffers(RENDER_TRANSMITTANCE_DRAW_BUFFERS); - RenderSystem.clearColor(0, 0, 0, 0); - RenderSystem.clear(GL32.GL_COLOR_BUFFER_BIT, false); + GL32.glClearColor(0, 0, 0, 0); + GlStateManager._clear(GL32.GL_COLOR_BUFFER_BIT); } } @@ -128,10 +131,10 @@ public void renderTransmittance() { */ public void renderDepthFromTransmittance() { // Only write to depth, not color. - RenderSystem.depthMask(true); - RenderSystem.colorMask(false, false, false, false); - RenderSystem.disableBlend(); - RenderSystem.depthFunc(GL32.GL_ALWAYS); + GlStateManager._depthMask(true); + GlStateManager._colorMask(false, false, false, false); + GlStateManager._disableBlend(); + GlStateManager._depthFunc(GL32.GL_ALWAYS); if (GlCompat.SUPPORTS_DSA) { GL46.glNamedFramebufferDrawBuffers(fbo, DEPTH_ONLY_DRAW_BUFFERS); @@ -150,11 +153,11 @@ public void renderDepthFromTransmittance() { */ public void accumulate() { // No depth writes, but we'll still use the depth test - RenderSystem.depthMask(false); - RenderSystem.colorMask(true, true, true, true); - RenderSystem.enableBlend(); - RenderSystem.blendFunc(GlStateManager.SourceFactor.ONE, GlStateManager.DestFactor.ONE); - RenderSystem.blendEquation(GL32.GL_FUNC_ADD); + GlStateManager._depthMask(false); + GlStateManager._colorMask(true, true, true, true); + GlStateManager._enableBlend(); + GlStateManager._blendFuncSeparate(GlConst.GL_ONE, GlConst.GL_ONE, GlConst.GL_ONE, GlConst.GL_ONE); + GL32.glBlendEquation(GL32.GL_FUNC_ADD); if (GlCompat.SUPPORTS_DSA) { GL46.glNamedFramebufferDrawBuffers(fbo, ACCUMULATE_DRAW_BUFFERS); @@ -162,8 +165,8 @@ public void accumulate() { GL46.glClearNamedFramebufferfv(fbo, GL46.GL_COLOR, 0, CLEAR_TO_ZERO); } else { GL32.glDrawBuffers(ACCUMULATE_DRAW_BUFFERS); - RenderSystem.clearColor(0, 0, 0, 0); - RenderSystem.clear(GL32.GL_COLOR_BUFFER_BIT, false); + GL32.glClearColor(0, 0, 0, 0); + GlStateManager._clear(GL32.GL_COLOR_BUFFER_BIT); } } @@ -172,21 +175,18 @@ public void accumulate() { */ public void composite() { if (Minecraft.useShaderTransparency()) { - Minecraft.getInstance().levelRenderer.getItemEntityTarget() - .bindWrite(false); + bindRenderTarget(Minecraft.getInstance().levelRenderer.getItemEntityTarget()); } else { - Minecraft.getInstance() - .getMainRenderTarget() - .bindWrite(false); + bindRenderTarget(Minecraft.getInstance().getMainRenderTarget()); } // The composite shader writes out the closest depth to gl_FragDepth. // depthMask = true: OIT stuff renders on top of other transparent stuff. // depthMask = false: other transparent stuff renders on top of OIT stuff. // If Neo gets wavelet OIT we can use their hooks to be correct with everything. - RenderSystem.depthMask(true); - RenderSystem.colorMask(true, true, true, true); - RenderSystem.enableBlend(); + GlStateManager._depthMask(true); + GlStateManager._colorMask(true, true, true, true); + GlStateManager._enableBlend(); // We rely on the blend func to achieve: // final color = (1 - transmittance_total) * sum(color_f * alpha_f * transmittance_f) / sum(alpha_f * transmittance_f) @@ -194,21 +194,19 @@ public void composite() { // // Though note that the alpha value we emit in the fragment shader is actually (1. - transmittance_total). // The extra inversion step is so we can have a sane alpha value written out for the fabulous blit shader to consume. - RenderSystem.blendFuncSeparate(GlStateManager.SourceFactor.SRC_ALPHA, GlStateManager.DestFactor.ONE_MINUS_SRC_ALPHA, GlStateManager.SourceFactor.ONE, GlStateManager.DestFactor.ONE_MINUS_SRC_ALPHA); - RenderSystem.blendEquation(GL32.GL_FUNC_ADD); - RenderSystem.depthFunc(GL32.GL_ALWAYS); + GlStateManager._blendFuncSeparate(GlConst.GL_SRC_ALPHA, GlConst.GL_ONE_MINUS_SRC_ALPHA, GlConst.GL_ONE, GlConst.GL_ONE_MINUS_SRC_ALPHA); + GL32.glBlendEquation(GL32.GL_FUNC_ADD); + GlStateManager._depthFunc(GL32.GL_ALWAYS); GlTextureUnit.T0.makeActive(); - RenderSystem.bindTexture(accumulate); + GlStateManager._bindTexture(accumulate); programs.getOitCompositeProgram() .bind(); drawFullscreenQuad(); - Minecraft.getInstance() - .getMainRenderTarget() - .bindWrite(false); + bindRenderTarget(Minecraft.getInstance().getMainRenderTarget()); } public void delete() { @@ -240,9 +238,17 @@ private void deleteTextures() { // We sometimes get the same texture ID back when creating new textures, // so bind zero to clear the GlStateManager Samplers.COEFFICIENTS.makeActive(); - RenderSystem.bindTexture(0); + GlStateManager._bindTexture(0); Samplers.DEPTH_RANGE.makeActive(); - RenderSystem.bindTexture(0); + GlStateManager._bindTexture(0); + } + + private void bindRenderTarget(RenderTarget target) { + int i = ((GlTexture) target.getColorTexture()).getFbo( + ((GlDevice) RenderSystem.getDevice()).directStateAccess(), + target.getDepthTexture() + ); + GL32.glBindFramebuffer(GlConst.GL_FRAMEBUFFER, i); } private void maybeResizeFBO(int width, int height) { @@ -280,7 +286,7 @@ private void maybeResizeFBO(int width, int height) { accumulate = GL32.glGenTextures(); GlTextureUnit.T0.makeActive(); - RenderSystem.bindTexture(0); + GlStateManager._bindTexture(0); GL32.glBindTexture(GL32.GL_TEXTURE_2D, depthBounds); GL32.glTexImage2D(GL32.GL_TEXTURE_2D, 0, GL32.GL_RG32F, width, height, 0, GL46.GL_RGBA, GL46.GL_BYTE, 0); diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/gl/GlStateTracker.java b/common/src/backend/java/dev/engine_room/flywheel/backend/gl/GlStateTracker.java index 93c40c9c0..9988f4073 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/gl/GlStateTracker.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/gl/GlStateTracker.java @@ -1,6 +1,6 @@ package dev.engine_room.flywheel.backend.gl; -import com.mojang.blaze3d.platform.GlStateManager; +import com.mojang.blaze3d.opengl.GlStateManager; import dev.engine_room.flywheel.backend.gl.buffer.GlBufferType; diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/gl/GlTextureUnit.java b/common/src/backend/java/dev/engine_room/flywheel/backend/gl/GlTextureUnit.java index 75797f2ec..8a834e5a0 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/gl/GlTextureUnit.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/gl/GlTextureUnit.java @@ -2,7 +2,9 @@ import static org.lwjgl.opengl.GL13.GL_TEXTURE0; -import com.mojang.blaze3d.platform.GlStateManager; +import com.mojang.blaze3d.opengl.GlStateManager; + +import dev.engine_room.flywheel.backend.mixin.GlStateManagerAccessor; public enum GlTextureUnit { T0(0), @@ -53,10 +55,10 @@ public void makeActive() { } public static GlTextureUnit getActive() { - return fromGlEnum(GlStateManager._getActiveTexture()); + return fromGlEnum(GlStateManagerAccessor.flywheel$getActiveTexture()); } - public static GlTextureUnit fromGlEnum(int glEnum) { - return GlTextureUnit.values()[glEnum - GL_TEXTURE0]; + public static GlTextureUnit fromGlEnum(int activeTextureId) { + return GlTextureUnit.values()[activeTextureId]; } } diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/gl/array/GlVertexArray.java b/common/src/backend/java/dev/engine_room/flywheel/backend/gl/array/GlVertexArray.java index 28da1390a..76fac8209 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/gl/array/GlVertexArray.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/gl/array/GlVertexArray.java @@ -4,8 +4,6 @@ import org.lwjgl.opengl.GL32; -import com.mojang.blaze3d.platform.GlStateManager; - import dev.engine_room.flywheel.backend.gl.GlObject; import dev.engine_room.flywheel.backend.gl.GlStateTracker; @@ -41,6 +39,6 @@ public void bindForDraw() { @Override protected void deleteInternal(int handle) { - GlStateManager._glDeleteVertexArrays(handle); + GL32.glDeleteVertexArrays(handle); } } diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/gl/buffer/GlBuffer.java b/common/src/backend/java/dev/engine_room/flywheel/backend/gl/buffer/GlBuffer.java index 881c24239..3c1aed330 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/gl/buffer/GlBuffer.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/gl/buffer/GlBuffer.java @@ -1,6 +1,6 @@ package dev.engine_room.flywheel.backend.gl.buffer; -import com.mojang.blaze3d.platform.GlStateManager; +import com.mojang.blaze3d.opengl.GlStateManager; import dev.engine_room.flywheel.backend.gl.GlObject; import dev.engine_room.flywheel.lib.memory.FlwMemoryTracker; diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/mixin/GlStateManagerAccessor.java b/common/src/backend/java/dev/engine_room/flywheel/backend/mixin/GlStateManagerAccessor.java new file mode 100644 index 000000000..a4ce5d7db --- /dev/null +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/mixin/GlStateManagerAccessor.java @@ -0,0 +1,14 @@ +package dev.engine_room.flywheel.backend.mixin; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +import com.mojang.blaze3d.opengl.GlStateManager; + +@Mixin(GlStateManager.class) +public interface GlStateManagerAccessor { + @Accessor("activeTexture") + static int flywheel$getActiveTexture() { + throw new AssertionError(); + } +} diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/mixin/GlStateManagerMixin.java b/common/src/backend/java/dev/engine_room/flywheel/backend/mixin/GlStateManagerMixin.java index d1369f934..db5631d4c 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/mixin/GlStateManagerMixin.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/mixin/GlStateManagerMixin.java @@ -7,7 +7,7 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import com.mojang.blaze3d.platform.GlStateManager; +import com.mojang.blaze3d.opengl.GlStateManager; import dev.engine_room.flywheel.backend.engine.uniform.LevelUniforms; import dev.engine_room.flywheel.backend.gl.GlStateTracker; diff --git a/common/src/backend/resources/flywheel.backend.mixins.json b/common/src/backend/resources/flywheel.backend.mixins.json index dea705b60..54d1ba937 100644 --- a/common/src/backend/resources/flywheel.backend.mixins.json +++ b/common/src/backend/resources/flywheel.backend.mixins.json @@ -1,11 +1,12 @@ { - "required": true, - "minVersion": "0.8", - "package": "dev.engine_room.flywheel.backend.mixin", - "compatibilityLevel": "JAVA_21", - "refmap": "backend-flywheel.refmap.json", - "client": [ + "required" : true, + "minVersion" : "0.8", + "package" : "dev.engine_room.flywheel.backend.mixin", + "compatibilityLevel" : "JAVA_21", + "refmap" : "backend-flywheel.refmap.json", + "client" : [ "AbstractClientPlayerAccessor", + "GlStateManagerAccessor", "GlStateManagerMixin", "LevelRendererAccessor", "OptionsMixin", @@ -15,7 +16,7 @@ "light.SkyDataLayerStorageMapAccessor", "light.SkyLightSectionStorageMixin" ], - "injectors": { - "defaultRequire": 1 + "injectors" : { + "defaultRequire" : 1 } } diff --git a/common/src/main/java/dev/engine_room/flywheel/impl/mixin/fix/FixFabulousDepthMixin.java b/common/src/main/java/dev/engine_room/flywheel/impl/mixin/fix/FixFabulousDepthMixin.java index e8c79651d..b8298914b 100644 --- a/common/src/main/java/dev/engine_room/flywheel/impl/mixin/fix/FixFabulousDepthMixin.java +++ b/common/src/main/java/dev/engine_room/flywheel/impl/mixin/fix/FixFabulousDepthMixin.java @@ -5,7 +5,7 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import com.mojang.blaze3d.platform.GlStateManager; +import com.mojang.blaze3d.opengl.GlStateManager; import net.minecraft.client.renderer.LevelRenderer; From 1fca235bbc83a3fc7fa98d0f9aa21c3d68578e88 Mon Sep 17 00:00:00 2001 From: IThundxr Date: Sat, 27 Dec 2025 11:53:27 -0500 Subject: [PATCH 09/59] 1.21.1 Porting IV --- .../flywheel/backend/engine/EngineImpl.java | 2 +- .../backend/engine/MaterialRenderState.java | 32 ++++++++++++++++--- .../backend/engine/TextureBinder.java | 16 ++++------ .../backend/engine/uniform/FogUniforms.java | 25 ++++++--------- .../backend/engine/uniform/FrameUniforms.java | 14 ++++---- .../backend/engine/uniform/LevelUniforms.java | 30 +++++++++++------ .../engine/uniform/PlayerUniforms.java | 11 ++++--- .../backend/engine/uniform/UniformWriter.java | 5 +++ .../backend/gl/array/GlVertexArrayDSA.java | 2 +- .../backend/gl/array/GlVertexArrayGL3.java | 2 +- .../GlVertexArraySeparateAttributes.java | 2 +- .../backend/mixin/FogRendererMixin.java | 20 ++++++++++++ .../backend/mixin/GlStateManagerMixin.java | 11 ------- .../flywheel/backend/mixin/LightingMixin.java | 25 +++++++++++++++ .../backend/mixin/RenderSystemMixin.java | 26 +-------------- .../flywheel/flywheel/internal/api_impl.frag | 3 +- .../flywheel/flywheel/internal/api_impl.vert | 3 +- .../flywheel/flywheel/internal/common.vert | 3 +- .../flywheel/internal/fog_distance.glsl | 19 +++-------- .../flywheel/internal/uniforms/fog.glsl | 4 +-- .../resources/flywheel.backend.mixins.json | 2 ++ .../impl/mixin/LevelRendererMixin.java | 18 +++++------ 22 files changed, 153 insertions(+), 122 deletions(-) create mode 100644 common/src/backend/java/dev/engine_room/flywheel/backend/mixin/FogRendererMixin.java create mode 100644 common/src/backend/java/dev/engine_room/flywheel/backend/mixin/LightingMixin.java diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/engine/EngineImpl.java b/common/src/backend/java/dev/engine_room/flywheel/backend/engine/EngineImpl.java index b91212eff..690e540b2 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/engine/EngineImpl.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/engine/EngineImpl.java @@ -60,7 +60,7 @@ public Vec3i renderOrigin() { @Override public boolean updateRenderOrigin(Camera camera) { - Vec3 cameraPos = camera.getPosition(); + Vec3 cameraPos = camera.position(); double dx = renderOrigin.getX() - cameraPos.x; double dy = renderOrigin.getY() - cameraPos.y; double dz = renderOrigin.getZ() - cameraPos.z; diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/engine/MaterialRenderState.java b/common/src/backend/java/dev/engine_room/flywheel/backend/engine/MaterialRenderState.java index 30d8ce19b..468f75e04 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/engine/MaterialRenderState.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/engine/MaterialRenderState.java @@ -4,10 +4,18 @@ import org.jspecify.annotations.Nullable; import org.lwjgl.opengl.GL11; +import org.lwjgl.opengl.GL32; +import org.lwjgl.opengl.GL33C; import com.mojang.blaze3d.opengl.GlConst; +import com.mojang.blaze3d.opengl.GlSampler; import com.mojang.blaze3d.opengl.GlStateManager; +import com.mojang.blaze3d.opengl.GlTexture; import com.mojang.blaze3d.systems.RenderSystem; +import com.mojang.blaze3d.textures.FilterMode; +import com.mojang.blaze3d.textures.GpuSampler; +import com.mojang.blaze3d.textures.GpuTexture; +import com.mojang.blaze3d.textures.GpuTextureView; import dev.engine_room.flywheel.api.material.DepthTest; import dev.engine_room.flywheel.api.material.Material; @@ -48,10 +56,25 @@ private static void setupTexture(Material material) { AbstractTexture texture = Minecraft.getInstance() .getTextureManager() .getTexture(material.texture()); - texture.setFilter(material.blur(), material.mipmap()); - var textureId = texture.getId(); - RenderSystem.setShaderTexture(0, textureId); - RenderSystem.bindTexture(textureId); + + GpuTextureView textureView = texture.getTextureView(); + GlTexture glTexture = ((GlTexture) texture.getTexture()); + int i; + if ((glTexture.usage() & GpuTexture.USAGE_CUBEMAP_COMPATIBLE) != 0) { + i = GL32.GL_TEXTURE_CUBE_MAP; + GL11.glBindTexture(i, glTexture.glId()); + } else { + i = GL32.GL_TEXTURE_2D; + GlStateManager._bindTexture(glTexture.glId()); + } + + FilterMode filterMode = material.blur() ? FilterMode.LINEAR : FilterMode.NEAREST; + GpuSampler textureSampler = texture.getSampler(); + GlSampler sampler = (GlSampler) RenderSystem.getSamplerCache() + .getSampler(textureSampler.getAddressModeU(), textureSampler.getAddressModeV(), filterMode, filterMode, material.mipmap()); + GL33C.glBindSampler(Samplers.DIFFUSE.number, sampler.getId()); + GlStateManager._texParameter(i, GL32.GL_TEXTURE_BASE_LEVEL, textureView.baseMipLevel()); + GlStateManager._texParameter(i, GL32.GL_TEXTURE_MAX_LEVEL, textureView.baseMipLevel() + textureView.mipLevels() - 1); } private static void setupBackfaceCulling(boolean backfaceCulling) { @@ -157,7 +180,6 @@ public static void reset() { private static void resetTexture() { Samplers.DIFFUSE.makeActive(); - RenderSystem.setShaderTexture(0, 0); } private static void resetBackfaceCulling() { diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/engine/TextureBinder.java b/common/src/backend/java/dev/engine_room/flywheel/backend/engine/TextureBinder.java index 5f7ce9159..4a672a7fd 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/engine/TextureBinder.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/engine/TextureBinder.java @@ -17,24 +17,20 @@ public static void bindLightAndOverlay() { var gameRenderer = Minecraft.getInstance().gameRenderer; Samplers.OVERLAY.makeActive(); - gameRenderer.overlayTexture() - .setupOverlayColor(); - RenderSystem.bindTexture(RenderSystem.getShaderTexture(1)); + gameRenderer.overlayTexture().setupOverlayColor(); + GlStateManager._bindTexture(RenderSystem.getShaderTexture(1)); Samplers.LIGHT.makeActive(); - gameRenderer.lightTexture() - .turnOnLightLayer(); - RenderSystem.bindTexture(RenderSystem.getShaderTexture(2)); + gameRenderer.lightTexture().turnOnLightLayer(); + GlStateManager._bindTexture(RenderSystem.getShaderTexture(2)); } public static void resetLightAndOverlay() { var gameRenderer = Minecraft.getInstance().gameRenderer; - gameRenderer.overlayTexture() - .teardownOverlayColor(); - gameRenderer.lightTexture() - .turnOffLightLayer(); + gameRenderer.overlayTexture().teardownOverlayColor(); + gameRenderer.lightTexture().turnOffLightLayer(); } /** diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/engine/uniform/FogUniforms.java b/common/src/backend/java/dev/engine_room/flywheel/backend/engine/uniform/FogUniforms.java index 976f4d5a3..0bd3837de 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/engine/uniform/FogUniforms.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/engine/uniform/FogUniforms.java @@ -1,27 +1,20 @@ package dev.engine_room.flywheel.backend.engine.uniform; -import com.mojang.blaze3d.shaders.FogShape; -import com.mojang.blaze3d.systems.RenderSystem; +import org.joml.Vector4f; public final class FogUniforms extends UniformWriter { - private static final int SIZE = 4 * 7; + private static final int SIZE = 4 * 8; static final UniformBuffer BUFFER = new UniformBuffer(Uniforms.FOG_INDEX, SIZE); - public static void update() { + public static void update(Vector4f color, float environmentalStart, float environmentalEnd, + float renderDistanceStart, float renderDistanceEnd) { long ptr = BUFFER.ptr(); - var color = RenderSystem.getShaderFogColor(); - - ptr = writeFloat(ptr, color[0]); - ptr = writeFloat(ptr, color[1]); - ptr = writeFloat(ptr, color[2]); - ptr = writeFloat(ptr, color[3]); - ptr = writeFloat(ptr, RenderSystem.getShaderFogStart()); - ptr = writeFloat(ptr, RenderSystem.getShaderFogEnd()); - - var fogShape = RenderSystem.getShaderFogShape(); - // Shouldn't ever be null, but we've seen crashes here. - ptr = writeInt(ptr, (fogShape == null ? FogShape.SPHERE : fogShape).getIndex()); + ptr = writeVec4(ptr, color); + ptr = writeFloat(ptr, environmentalStart); + ptr = writeFloat(ptr, environmentalEnd); + ptr = writeFloat(ptr, renderDistanceStart); + ptr = writeFloat(ptr, renderDistanceEnd); BUFFER.markDirty(); } diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/engine/uniform/FrameUniforms.java b/common/src/backend/java/dev/engine_room/flywheel/backend/engine/uniform/FrameUniforms.java index 5a521b4c6..591d8de36 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/engine/uniform/FrameUniforms.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/engine/uniform/FrameUniforms.java @@ -10,12 +10,12 @@ import dev.engine_room.flywheel.api.visualization.VisualizationManager; import dev.engine_room.flywheel.backend.engine.indirect.DepthPyramid; import dev.engine_room.flywheel.backend.mixin.LevelRendererAccessor; -import net.minecraft.Util; import net.minecraft.client.Camera; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.GameRenderer; import net.minecraft.core.BlockPos; import net.minecraft.core.Vec3i; +import net.minecraft.util.Util; import net.minecraft.world.level.Level; import net.minecraft.world.phys.Vec3; @@ -69,7 +69,7 @@ public static void update(RenderContext context) { Vec3i renderOrigin = VisualizationManager.getOrThrow(context.level()) .renderOrigin(); var camera = context.camera(); - Vec3 cameraPos = camera.getPosition(); + Vec3 cameraPos = camera.position(); var camX = (float) (cameraPos.x - renderOrigin.getX()); var camY = (float) (cameraPos.y - renderOrigin.getY()); var camZ = (float) (cameraPos.z - renderOrigin.getZ()); @@ -81,8 +81,8 @@ public static void update(RenderContext context) { VIEW_PROJECTION.translate(-camX, -camY, -camZ); CAMERA_POS.set(camX, camY, camZ); - CAMERA_LOOK.set(camera.getLookVector()); - CAMERA_ROT.set(camera.getXRot(), camera.getYRot()); + CAMERA_LOOK.set(camera.forwardVector()); + CAMERA_ROT.set(camera.xRot(), camera.yRot()); if (firstWrite) { setPrev(); @@ -185,9 +185,9 @@ private static long writeCameraIn(long ptr, Camera camera) { return ptr; } - Level level = camera.getEntity().level(); - BlockPos blockPos = camera.getBlockPosition(); - Vec3 cameraPos = camera.getPosition(); + Level level = camera.entity().level(); + BlockPos blockPos = camera.blockPosition(); + Vec3 cameraPos = camera.position(); return writeInFluidAndBlock(ptr, level, blockPos, cameraPos); } diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/engine/uniform/LevelUniforms.java b/common/src/backend/java/dev/engine_room/flywheel/backend/engine/uniform/LevelUniforms.java index 126f08a2a..dd9656e5d 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/engine/uniform/LevelUniforms.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/engine/uniform/LevelUniforms.java @@ -3,10 +3,15 @@ import org.joml.Vector3f; import dev.engine_room.flywheel.api.backend.RenderContext; +import net.minecraft.client.Camera; import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.resources.ResourceKey; +import net.minecraft.util.ARGB; +import net.minecraft.world.attribute.EnvironmentAttributeProbe; +import net.minecraft.world.attribute.EnvironmentAttributes; import net.minecraft.world.level.Level; -import net.minecraft.world.phys.Vec3; +import net.minecraft.world.level.dimension.DimensionType; +import net.minecraft.world.level.dimension.DimensionType.CardinalLightType; public final class LevelUniforms extends UniformWriter { private static final int SIZE = 16 * 4 + 4 * 12; @@ -23,11 +28,13 @@ public static void update(RenderContext context) { ClientLevel level = context.level(); float partialTick = context.partialTick(); + Camera camera = context.camera(); + EnvironmentAttributeProbe probe = camera.attributeProbe(); - Vec3 skyColor = level.getSkyColor(context.camera().getPosition(), partialTick); - Vec3 cloudColor = level.getCloudColor(partialTick); - ptr = writeVec4(ptr, (float) skyColor.x, (float) skyColor.y, (float) skyColor.z, 1f); - ptr = writeVec4(ptr, (float) cloudColor.x, (float) cloudColor.y, (float) cloudColor.z, 1f); + int skyColor = probe.getValue(EnvironmentAttributes.SKY_COLOR, partialTick); + int cloudColor = probe.getValue(EnvironmentAttributes.CLOUD_COLOR, partialTick); + ptr = writeVec4(ptr, ARGB.redFloat(skyColor), ARGB.greenFloat(skyColor), ARGB.blueFloat(skyColor), 1f); + ptr = writeVec4(ptr, ARGB.redFloat(cloudColor), ARGB.greenFloat(cloudColor), ARGB.blueFloat(cloudColor), 1f); ptr = writeVec3(ptr, LIGHT0_DIRECTION); ptr = writeVec3(ptr, LIGHT1_DIRECTION); @@ -40,19 +47,22 @@ public static void update(RenderContext context) { ptr = writeInt(ptr, level.dimensionType().hasSkyLight() ? 1 : 0); - ptr = writeFloat(ptr, level.getSunAngle(partialTick)); + float sunAngle = probe.getValue(EnvironmentAttributes.SUN_ANGLE, partialTick); + ptr = writeFloat(ptr, sunAngle); - ptr = writeFloat(ptr, level.getMoonBrightness()); - ptr = writeInt(ptr, level.getMoonPhase()); + int moonPhase = probe.getValue(EnvironmentAttributes.MOON_PHASE, partialTick).index(); + ptr = writeFloat(ptr, DimensionType.MOON_BRIGHTNESS_PER_PHASE[moonPhase]); + ptr = writeInt(ptr, moonPhase); ptr = writeInt(ptr, level.isRaining() ? 1 : 0); ptr = writeFloat(ptr, level.getRainLevel(partialTick)); ptr = writeInt(ptr, level.isThundering() ? 1 : 0); ptr = writeFloat(ptr, level.getThunderLevel(partialTick)); - ptr = writeFloat(ptr, level.getSkyDarken(partialTick)); + ptr = writeFloat(ptr, level.getSkyDarken()); - ptr = writeInt(ptr, level.effects().constantAmbientLight() ? 1 : 0); + CardinalLightType lightType = level.dimensionType().cardinalLightType(); + ptr = writeInt(ptr, lightType == CardinalLightType.NETHER ? 1 : 0); // TODO: use defines for custom dimension ids int dimensionId; diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/engine/uniform/PlayerUniforms.java b/common/src/backend/java/dev/engine_room/flywheel/backend/engine/uniform/PlayerUniforms.java index 1314d21f5..c76dc1934 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/engine/uniform/PlayerUniforms.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/engine/uniform/PlayerUniforms.java @@ -6,7 +6,6 @@ import dev.engine_room.flywheel.backend.FlwBackendXplat; import dev.engine_room.flywheel.backend.mixin.AbstractClientPlayerAccessor; import net.minecraft.client.Minecraft; -import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.client.multiplayer.PlayerInfo; import net.minecraft.client.player.LocalPlayer; import net.minecraft.core.BlockPos; @@ -14,8 +13,10 @@ import net.minecraft.world.InteractionHand; import net.minecraft.world.item.BlockItem; import net.minecraft.world.item.Item; +import net.minecraft.world.level.Level; import net.minecraft.world.level.LightLayer; import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.lighting.LightEngine; import net.minecraft.world.phys.Vec3; import net.minecraft.world.scores.PlayerTeam; @@ -78,10 +79,10 @@ private static long writeTeamColor(long ptr, @Nullable PlayerTeam team) { } private static long writeEyeBrightness(long ptr, LocalPlayer player) { - ClientLevel level = player.clientLevel; + Level level = player.level(); int blockBrightness = level.getBrightness(LightLayer.BLOCK, player.blockPosition()); int skyBrightness = level.getBrightness(LightLayer.SKY, player.blockPosition()); - int maxBrightness = level.getMaxLightLevel(); + int maxBrightness = LightEngine.MAX_LEVEL; return writeVec2(ptr, (float) blockBrightness / (float) maxBrightness, (float) skyBrightness / (float) maxBrightness); @@ -95,7 +96,7 @@ private static long writeHeldLight(long ptr, LocalPlayer player) { if (handItem instanceof BlockItem blockItem) { Block block = blockItem.getBlock(); int blockLight = FlwBackendXplat.INSTANCE - .getLightEmission(block.defaultBlockState(), player.clientLevel, player.blockPosition()); + .getLightEmission(block.defaultBlockState(), player.level(), player.blockPosition()); if (heldLight < blockLight) { heldLight = blockLight; } @@ -106,7 +107,7 @@ private static long writeHeldLight(long ptr, LocalPlayer player) { } private static long writeEyeIn(long ptr, LocalPlayer player) { - ClientLevel level = player.clientLevel; + Level level = player.level(); Vec3 eyePos = player.getEyePosition(); BlockPos blockPos = BlockPos.containing(eyePos); return writeInFluidAndBlock(ptr, level, blockPos, eyePos); diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/engine/uniform/UniformWriter.java b/common/src/backend/java/dev/engine_room/flywheel/backend/engine/uniform/UniformWriter.java index 81b2ba6b1..01b0ca08e 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/engine/uniform/UniformWriter.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/engine/uniform/UniformWriter.java @@ -2,6 +2,7 @@ import org.joml.Matrix4f; import org.joml.Vector3fc; +import org.joml.Vector4f; import org.lwjgl.system.MemoryUtil; import dev.engine_room.flywheel.lib.util.ExtraMemoryOps; @@ -50,6 +51,10 @@ static long writeVec4(long ptr, float x, float y, float z, float w) { return ptr + 16; } + static long writeVec4(long ptr, Vector4f vec) { + return writeVec4(ptr, vec.x(), vec.y(), vec.z(), vec.w()); + } + static long writeIVec2(long ptr, int x, int y) { MemoryUtil.memPutInt(ptr, x); MemoryUtil.memPutInt(ptr + 4, y); diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/gl/array/GlVertexArrayDSA.java b/common/src/backend/java/dev/engine_room/flywheel/backend/gl/array/GlVertexArrayDSA.java index a3c67b0d2..a815bd9be 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/gl/array/GlVertexArrayDSA.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/gl/array/GlVertexArrayDSA.java @@ -8,7 +8,7 @@ import org.lwjgl.system.Checks; import dev.engine_room.flywheel.backend.gl.GlCompat; -import net.minecraft.Util; +import net.minecraft.util.Util; public class GlVertexArrayDSA extends GlVertexArray { public static final boolean SUPPORTED = isSupported(); diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/gl/array/GlVertexArrayGL3.java b/common/src/backend/java/dev/engine_room/flywheel/backend/gl/array/GlVertexArrayGL3.java index 785b17fca..8b5777668 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/gl/array/GlVertexArrayGL3.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/gl/array/GlVertexArrayGL3.java @@ -13,7 +13,7 @@ import dev.engine_room.flywheel.backend.gl.GlCompat; import dev.engine_room.flywheel.backend.gl.buffer.GlBufferType; -import net.minecraft.Util; +import net.minecraft.util.Util; public abstract class GlVertexArrayGL3 extends GlVertexArray { private final BitSet attributeDirty = new BitSet(MAX_ATTRIBS); diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/gl/array/GlVertexArraySeparateAttributes.java b/common/src/backend/java/dev/engine_room/flywheel/backend/gl/array/GlVertexArraySeparateAttributes.java index 6488ea03d..9b6cf27ac 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/gl/array/GlVertexArraySeparateAttributes.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/gl/array/GlVertexArraySeparateAttributes.java @@ -10,7 +10,7 @@ import dev.engine_room.flywheel.backend.gl.GlCompat; import dev.engine_room.flywheel.backend.gl.GlStateTracker; import dev.engine_room.flywheel.backend.gl.buffer.GlBufferType; -import net.minecraft.Util; +import net.minecraft.util.Util; public class GlVertexArraySeparateAttributes extends GlVertexArray { public static final boolean SUPPORTED = isSupported(); diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/mixin/FogRendererMixin.java b/common/src/backend/java/dev/engine_room/flywheel/backend/mixin/FogRendererMixin.java new file mode 100644 index 000000000..b6cd19ec1 --- /dev/null +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/mixin/FogRendererMixin.java @@ -0,0 +1,20 @@ +package dev.engine_room.flywheel.backend.mixin; + +import java.nio.ByteBuffer; + +import org.joml.Vector4f; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import dev.engine_room.flywheel.backend.engine.uniform.FogUniforms; +import net.minecraft.client.renderer.fog.FogRenderer; + +@Mixin(FogRenderer.class) +abstract class FogRendererMixin { + @Inject(method = "updateBuffer", at = @At("HEAD")) + private static void flywheel$updateFogUniform(ByteBuffer buffer, int position, Vector4f fogColor, float environmentalStart, float environmentalEnd, float renderDistanceStart, float renderDistanceEnd, float skyEnd, float cloudEnd, CallbackInfo ci) { + FogUniforms.update(fogColor, environmentalStart, environmentalEnd, renderDistanceStart, renderDistanceEnd); + } +} diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/mixin/GlStateManagerMixin.java b/common/src/backend/java/dev/engine_room/flywheel/backend/mixin/GlStateManagerMixin.java index db5631d4c..fda021bca 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/mixin/GlStateManagerMixin.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/mixin/GlStateManagerMixin.java @@ -1,7 +1,5 @@ package dev.engine_room.flywheel.backend.mixin; -import org.joml.Matrix4f; -import org.joml.Vector3f; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; @@ -9,7 +7,6 @@ import com.mojang.blaze3d.opengl.GlStateManager; -import dev.engine_room.flywheel.backend.engine.uniform.LevelUniforms; import dev.engine_room.flywheel.backend.gl.GlStateTracker; import dev.engine_room.flywheel.backend.gl.buffer.GlBufferType; @@ -29,12 +26,4 @@ abstract class GlStateManagerMixin { private static void flywheel$onUseProgram(int program, CallbackInfo ci) { GlStateTracker._setProgram(program); } - - @Inject(method = "setupLevelDiffuseLighting", at = @At("HEAD")) - private static void flywheel$onSetupLevelDiffuseLighting(Vector3f vector3f, Vector3f vector3f2, Matrix4f matrix4f, CallbackInfo ci) { - // Capture the light directions before they're transformed into screen space - // Basically all usages of assigning light direction go through here so I think this is safe - LevelUniforms.LIGHT0_DIRECTION.set(vector3f); - LevelUniforms.LIGHT1_DIRECTION.set(vector3f2); - } } diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/mixin/LightingMixin.java b/common/src/backend/java/dev/engine_room/flywheel/backend/mixin/LightingMixin.java new file mode 100644 index 000000000..cba6e9cab --- /dev/null +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/mixin/LightingMixin.java @@ -0,0 +1,25 @@ +package dev.engine_room.flywheel.backend.mixin; + +import org.joml.Vector3f; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import com.mojang.blaze3d.platform.Lighting; +import com.mojang.blaze3d.platform.Lighting.Entry; + +import dev.engine_room.flywheel.backend.engine.uniform.LevelUniforms; + +@Mixin(Lighting.class) +public class LightingMixin { + @Inject(method = "updateBuffer", at = @At("HEAD")) + private static void flywheel$updateLightDirection(Entry entry, Vector3f light0, Vector3f light1, CallbackInfo ci) { + if (entry == Entry.LEVEL) { + // Capture the light directions before they're transformed into screen space + // Basically all usages of assigning light direction go through here so I think this is safe + LevelUniforms.LIGHT0_DIRECTION.set(light0); + LevelUniforms.LIGHT1_DIRECTION.set(light1); + } + } +} diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/mixin/RenderSystemMixin.java b/common/src/backend/java/dev/engine_room/flywheel/backend/mixin/RenderSystemMixin.java index b08444dc7..75f5c20ac 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/mixin/RenderSystemMixin.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/mixin/RenderSystemMixin.java @@ -7,36 +7,12 @@ import com.mojang.blaze3d.systems.RenderSystem; -import dev.engine_room.flywheel.backend.engine.uniform.FogUniforms; import dev.engine_room.flywheel.backend.gl.GlCompat; @Mixin(value = RenderSystem.class, remap = false) abstract class RenderSystemMixin { - @Inject(method = "initRenderer(IZ)V", at = @At("RETURN")) + @Inject(method = "initRenderer", at = @At("RETURN")) private static void flywheel$onInitRenderer(CallbackInfo ci) { GlCompat.init(); } - - @Inject(method = "setShaderFogStart(F)V", at = @At("RETURN")) - private static void flywheel$onSetFogStart(CallbackInfo ci) { - FogUniforms.update(); - } - - @Inject(method = "setShaderFogEnd(F)V", at = @At("RETURN")) - private static void flywheel$onSetFogEnd(CallbackInfo ci) { - FogUniforms.update(); - } - - // Fabric fails to resolve the mixin in prod when the full signature is specified. - // I suspect it's because this method references a class name in its signature, - // and that needs to be remapped while the function names in RenderSystem are marked with @DontObfuscate. - @Inject(method = "setShaderFogShape", at = @At("RETURN")) - private static void flywheel$onSetFogShape(CallbackInfo ci) { - FogUniforms.update(); - } - - @Inject(method = "setShaderFogColor(FFFF)V", at = @At("RETURN")) - private static void flywheel$onSetFogColor(CallbackInfo ci) { - FogUniforms.update(); - } } diff --git a/common/src/backend/resources/assets/flywheel/flywheel/internal/api_impl.frag b/common/src/backend/resources/assets/flywheel/flywheel/internal/api_impl.frag index af16b80e2..120d69fb0 100644 --- a/common/src/backend/resources/assets/flywheel/flywheel/internal/api_impl.frag +++ b/common/src/backend/resources/assets/flywheel/flywheel/internal/api_impl.frag @@ -9,7 +9,8 @@ flat in ivec2 flw_vertexOverlay; in vec2 flw_vertexLight; in vec3 flw_vertexNormal; -in float flw_distance; +in float flw_sphericalDistance; +in float flw_cylindricalDistance; vec4 flw_sampleColor; diff --git a/common/src/backend/resources/assets/flywheel/flywheel/internal/api_impl.vert b/common/src/backend/resources/assets/flywheel/flywheel/internal/api_impl.vert index 266f4e436..05ae813e4 100644 --- a/common/src/backend/resources/assets/flywheel/flywheel/internal/api_impl.vert +++ b/common/src/backend/resources/assets/flywheel/flywheel/internal/api_impl.vert @@ -9,7 +9,8 @@ flat out ivec2 flw_vertexOverlay; out vec2 flw_vertexLight; out vec3 flw_vertexNormal; -out float flw_distance; +out float flw_sphericalDistance; +out float flw_cylindricalDistance; FlwMaterial flw_material; diff --git a/common/src/backend/resources/assets/flywheel/flywheel/internal/common.vert b/common/src/backend/resources/assets/flywheel/flywheel/internal/common.vert index 3c2ffecdc..2ea08f3ea 100644 --- a/common/src/backend/resources/assets/flywheel/flywheel/internal/common.vert +++ b/common/src/backend/resources/assets/flywheel/flywheel/internal/common.vert @@ -93,7 +93,8 @@ void _flw_main(in FlwInstance instance, in uint stableInstanceID, in uint baseVe flw_vertexNormal = normalize(flw_vertexNormal); - flw_distance = fogDistance(flw_vertexPos.xyz, flw_cameraPos, flw_fogShape); + flw_sphericalDistance = sphericalDistance(flw_vertexPos.xyz, flw_cameraPos); + flw_cylindricalDistance = cylindricalDistance(flw_vertexPos.xyz, flw_cameraPos); gl_Position = flw_viewProjection * flw_vertexPos; diff --git a/common/src/backend/resources/assets/flywheel/flywheel/internal/fog_distance.glsl b/common/src/backend/resources/assets/flywheel/flywheel/internal/fog_distance.glsl index 7cedf058d..28bb896c2 100644 --- a/common/src/backend/resources/assets/flywheel/flywheel/internal/fog_distance.glsl +++ b/common/src/backend/resources/assets/flywheel/flywheel/internal/fog_distance.glsl @@ -1,21 +1,10 @@ -float sphericalDistance(vec3 relativePos) { - return length(relativePos); +float sphericalDistance(vec3 worldPos, vec3 cameraPos) { + return length(worldPos - cameraPos); } -float cylindricalDistance(vec3 relativePos) { +float cylindricalDistance(vec3 worldPos, vec3 cameraPos) { + vec3 relativePos = worldPos - cameraPos; float distXZ = length(relativePos.xz); float distY = abs(relativePos.y); return max(distXZ, distY); } - -float fogDistance(vec3 relativePos, int fogShape) { - if (fogShape == 0) { - return sphericalDistance(relativePos); - } else { - return cylindricalDistance(relativePos); - } -} - -float fogDistance(vec3 worldPos, vec3 cameraPos, int fogShape) { - return fogDistance(worldPos - cameraPos, fogShape); -} diff --git a/common/src/backend/resources/assets/flywheel/flywheel/internal/uniforms/fog.glsl b/common/src/backend/resources/assets/flywheel/flywheel/internal/uniforms/fog.glsl index 877c1aa16..d6e799773 100644 --- a/common/src/backend/resources/assets/flywheel/flywheel/internal/uniforms/fog.glsl +++ b/common/src/backend/resources/assets/flywheel/flywheel/internal/uniforms/fog.glsl @@ -1,5 +1,5 @@ layout(std140) uniform _FlwFogUniforms { vec4 flw_fogColor; - vec2 flw_fogRange; - int flw_fogShape; + vec2 flw_environmentalRange; + vec2 flw_renderDistanceRange; }; diff --git a/common/src/backend/resources/flywheel.backend.mixins.json b/common/src/backend/resources/flywheel.backend.mixins.json index 54d1ba937..cd7b13f55 100644 --- a/common/src/backend/resources/flywheel.backend.mixins.json +++ b/common/src/backend/resources/flywheel.backend.mixins.json @@ -6,9 +6,11 @@ "refmap" : "backend-flywheel.refmap.json", "client" : [ "AbstractClientPlayerAccessor", + "FogRendererMixin", "GlStateManagerAccessor", "GlStateManagerMixin", "LevelRendererAccessor", + "LightingMixin", "OptionsMixin", "RenderSystemMixin", "light.LayerLightSectionStorageAccessor", diff --git a/common/src/main/java/dev/engine_room/flywheel/impl/mixin/LevelRendererMixin.java b/common/src/main/java/dev/engine_room/flywheel/impl/mixin/LevelRendererMixin.java index 4e8a4f1a2..73088ba69 100644 --- a/common/src/main/java/dev/engine_room/flywheel/impl/mixin/LevelRendererMixin.java +++ b/common/src/main/java/dev/engine_room/flywheel/impl/mixin/LevelRendererMixin.java @@ -1,5 +1,6 @@ package dev.engine_room.flywheel.impl.mixin; +import java.util.Iterator; import java.util.SortedSet; import org.joml.Matrix4f; @@ -13,9 +14,10 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import com.google.common.collect.Iterators; +import com.llamalad7.mixinextras.injector.ModifyExpressionValue; import com.mojang.blaze3d.buffers.GpuBufferSlice; import com.mojang.blaze3d.resource.GraphicsResourceAllocator; -import com.mojang.blaze3d.vertex.PoseStack; import dev.engine_room.flywheel.api.visualization.VisualizationManager; import dev.engine_room.flywheel.impl.FlwImplXplat; @@ -26,7 +28,6 @@ import net.minecraft.client.DeltaTracker; import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.client.renderer.LevelRenderer; -import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderBuffers; import net.minecraft.server.level.BlockDestructionProgress; import net.minecraft.world.entity.Entity; @@ -72,7 +73,7 @@ abstract class LevelRendererMixin { } } - @Inject(method = "renderLevel", at = @At(value = "INVOKE_STRING", target = "Lnet/minecraft/util/profiling/ProfilerFiller;popPush(Ljava/lang/String;)V", args = "ldc=blockentities")) + @Inject(method = "renderLevel", at = @At(value = "INVOKE_STRING", target = "Lnet/minecraft/util/profiling/ProfilerFiller;popPush(Ljava/lang/String;)V", args = "ldc=blockEntities")) private void flywheel$beforeBlockEntities(CallbackInfo ci) { if (flywheel$renderContext != null) { VisualizationManager manager = VisualizationManager.get(level); @@ -82,7 +83,7 @@ abstract class LevelRendererMixin { } } - @Inject(method = "renderLevel", at = @At(value = "INVOKE_STRING", target = "Lnet/minecraft/util/profiling/ProfilerFiller;popPush(Ljava/lang/String;)V", args = "ldc=destroyProgress")) + @Inject(method = "renderBlockDestroyAnimation", at = @At("HEAD")) private void flywheel$beforeRenderCrumbling(CallbackInfo ci) { if (flywheel$renderContext != null) { VisualizationManager manager = VisualizationManager.get(level); @@ -92,10 +93,9 @@ abstract class LevelRendererMixin { } } - @Inject(method = "renderEntity", at = @At("HEAD"), cancellable = true) - private void flywheel$decideNotToRenderEntity(Entity entity, double camX, double camY, double camZ, float partialTick, PoseStack poseStack, MultiBufferSource bufferSource, CallbackInfo ci) { - if (VisualizationManager.supportsVisualization(entity.level()) && VisualizationHelper.skipVanillaRender(entity)) { - ci.cancel(); - } + @ModifyExpressionValue(method = "extractVisibleEntities", at = @At(value = "INVOKE", target = "Ljava/lang/Iterable;iterator()Ljava/util/Iterator;")) + private Iterator flywheel$decideNotToRenderEntity(Iterator original) { + return Iterators.filter(original, entity -> !(VisualizationManager.supportsVisualization(entity.level()) && + VisualizationHelper.skipVanillaRender(entity))); } } From dd16a1e3adda0f00d5b7be6c5e285122fcfcb720 Mon Sep 17 00:00:00 2001 From: IThundxr Date: Sat, 27 Dec 2025 12:05:55 -0500 Subject: [PATCH 10/59] 1.21.1 Porting V --- .../flywheel/lib/material/Materials.java | 7 ------- .../flywheel/lib/model/ModelUtil.java | 19 +++++++++---------- 2 files changed, 9 insertions(+), 17 deletions(-) diff --git a/common/src/lib/java/dev/engine_room/flywheel/lib/material/Materials.java b/common/src/lib/java/dev/engine_room/flywheel/lib/material/Materials.java index c9ca50f1e..92b19239c 100644 --- a/common/src/lib/java/dev/engine_room/flywheel/lib/material/Materials.java +++ b/common/src/lib/java/dev/engine_room/flywheel/lib/material/Materials.java @@ -14,13 +14,6 @@ public final class Materials { .cardinalLightingMode(CardinalLightingMode.OFF) .build(); - public static final Material CUTOUT_MIPPED_BLOCK = SimpleMaterial.builder() - .cutout(CutoutShaders.HALF) - .build(); - public static final Material CUTOUT_MIPPED_UNSHADED_BLOCK = SimpleMaterial.builderOf(CUTOUT_MIPPED_BLOCK) - .cardinalLightingMode(CardinalLightingMode.OFF) - .build(); - public static final Material CUTOUT_BLOCK = SimpleMaterial.builder() .cutout(CutoutShaders.ONE_TENTH) .mipmap(false) diff --git a/common/src/lib/java/dev/engine_room/flywheel/lib/model/ModelUtil.java b/common/src/lib/java/dev/engine_room/flywheel/lib/model/ModelUtil.java index b8f1d8929..ade96a188 100644 --- a/common/src/lib/java/dev/engine_room/flywheel/lib/model/ModelUtil.java +++ b/common/src/lib/java/dev/engine_room/flywheel/lib/model/ModelUtil.java @@ -2,9 +2,9 @@ import java.util.Collection; +import org.jetbrains.annotations.Nullable; import org.joml.Vector3f; import org.joml.Vector4f; -import org.jspecify.annotations.Nullable; import dev.engine_room.flywheel.api.material.CardinalLightingMode; import dev.engine_room.flywheel.api.material.Material; @@ -23,14 +23,14 @@ public final class ModelUtil { private static final float BOUNDING_SPHERE_EPSILON = 1e-4f; - private static final RenderType[] CHUNK_LAYERS = new RenderType[]{RenderType.solid(), RenderType.cutoutMipped(), RenderType.cutout(), RenderType.translucent(), RenderType.tripwire()}; + private static final ChunkSectionLayer[] CHUNK_LAYERS = new ChunkSectionLayer[]{ChunkSectionLayer.SOLID, ChunkSectionLayer.CUTOUT, ChunkSectionLayer.TRANSLUCENT, ChunkSectionLayer.TRIPWIRE}; // Array of chunk materials to make lookups easier. // Index by (renderTypeIdx * 4 + shaded * 2 + ambientOcclusion). private static final Material[] CHUNK_MATERIALS = new Material[20]; static { - Material[] baseChunkMaterials = new Material[]{Materials.SOLID_BLOCK, Materials.CUTOUT_MIPPED_BLOCK, Materials.CUTOUT_BLOCK, Materials.TRANSLUCENT_BLOCK, Materials.TRIPWIRE_BLOCK,}; + Material[] baseChunkMaterials = new Material[]{Materials.SOLID_BLOCK, Materials.CUTOUT_BLOCK, Materials.TRANSLUCENT_BLOCK, Materials.TRIPWIRE_BLOCK}; for (int chunkLayerIdx = 0; chunkLayerIdx < CHUNK_LAYERS.length; chunkLayerIdx++) { int baseMaterialIdx = chunkLayerIdx * 4; Material baseChunkMaterial = baseChunkMaterials[chunkLayerIdx]; @@ -57,12 +57,12 @@ private ModelUtil() { } @Nullable - public static Material getMaterial(RenderType chunkRenderType, boolean shaded) { + public static Material getMaterial(ChunkSectionLayer chunkRenderType, boolean shaded) { return getMaterial(chunkRenderType, shaded, true); } - @org.jetbrains.annotations.Nullable - public static Material getMaterial(RenderType chunkRenderType, boolean shaded, boolean ambientOcclusion) { + @Nullable + public static Material getMaterial(ChunkSectionLayer chunkRenderType, boolean shaded, boolean ambientOcclusion) { for (int chunkLayerIdx = 0; chunkLayerIdx < CHUNK_LAYERS.length; ++chunkLayerIdx) { if (chunkRenderType == CHUNK_LAYERS[chunkLayerIdx]) { int shadedIdx = shaded ? 1 : 0; @@ -78,7 +78,7 @@ public static Material getMaterial(RenderType chunkRenderType, boolean shaded, b @Nullable public static Material getItemMaterial(RenderType renderType) { - var chunkMaterial = getMaterial(convertLayerToType(renderType), true, false); + var chunkMaterial = getMaterial(renderType, true, false); if (chunkMaterial != null) { return chunkMaterial; @@ -92,17 +92,16 @@ public static Material getItemMaterial(RenderType renderType) { return Materials.SOLID_BLOCK; } - if (renderType == Sheets.translucentItemSheet()) { + if (renderType == Sheets.translucentBlockItemSheet() || renderType == Sheets.translucentItemSheet()) { return Materials.TRANSLUCENT_ENTITY; } - if (renderType == RenderTypes.glint()) { return Materials.GLINT; } if (renderType == RenderTypes.glintTranslucent()) { return Materials.TRANSLUCENT_GLINT; } - if (renderType == RenderTypes.entityGlint()) { + if (renderType == RenderTypes.entityGlint() || renderType == RenderTypes.armorEntityGlint()) { return Materials.GLINT_ENTITY; } return null; From 83fc920989455eb887cccf94164b7fe5940d0a11 Mon Sep 17 00:00:00 2001 From: IThundxr Date: Sat, 27 Dec 2025 13:24:23 -0500 Subject: [PATCH 11/59] 1.21.1 Porting VI --- .../model/baked/BlockMaterialFunction.java | 4 +- .../lib/model/baked/BlockModelBuilder.java | 4 +- .../flywheel/lib/model/baked/MeshEmitter.java | 12 +++-- .../lib/model/baked/MeshEmitterManager.java | 19 ++++---- .../flywheel/lib/model/part/ModelTrees.java | 5 +- .../lib/visual/component/HitboxComponent.java | 4 +- .../flywheel/impl/compat/CompatMod.java | 1 - .../engine_room/vanillin/VanillaVisuals.java | 2 +- .../engine_room/vanillin/VanillinXplat.java | 1 - .../engine_room/vanillin/VisualElements.java | 4 +- .../config/BlockEntityVisualizerBuilder.java | 3 +- .../config/EntityVisualizerBuilder.java | 3 +- .../vanillin/elements/FireElement.java | 4 +- .../vanillin/elements/HitboxElement.java | 5 +- .../item/SodiumAnimatedTextureCompat.java | 6 +-- .../vanillin/mixin/ChestRendererAccessor.java | 14 ++++++ .../vanillin/visuals/BellVisual.java | 2 +- .../vanillin/visuals/ChestVisual.java | 20 ++++---- .../vanillin/visuals/ItemFrameVisual.java | 46 +++++++------------ .../vanillin/visuals/MinecartVisual.java | 4 +- .../vanillin/visuals/TntMinecartVisual.java | 2 +- .../vanillin/resources/vanillin.mixins.json | 17 +++---- .../model/baked/FabricMeshEmitterManager.java | 13 ++---- .../flywheel/impl/FlwCommands.java | 5 +- .../flywheel/impl/FlywheelFabric.java | 4 +- .../impl/mixin/fabric/MinecraftMixin.java | 4 +- gradle.properties | 8 ++-- .../NeoForgeSinglePosVirtualBlockGetter.java | 2 +- .../lib/model/baked/NeoforgeMeshEmitter.java | 40 ++++++++++------ .../model/baked/PartialModelEventHandler.java | 2 - .../flywheel/impl/FlywheelNeoForge.java | 4 -- .../flywheel/impl/compat/EmbeddiumCompat.java | 33 ------------- .../resources/META-INF/neoforge.mods.toml | 6 --- 33 files changed, 136 insertions(+), 167 deletions(-) create mode 100644 common/src/vanillin/java/dev/engine_room/vanillin/mixin/ChestRendererAccessor.java delete mode 100644 neoforge/src/main/java/dev/engine_room/flywheel/impl/compat/EmbeddiumCompat.java diff --git a/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/BlockMaterialFunction.java b/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/BlockMaterialFunction.java index c8b177ec8..ab3e506c3 100644 --- a/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/BlockMaterialFunction.java +++ b/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/BlockMaterialFunction.java @@ -3,9 +3,9 @@ import org.jetbrains.annotations.Nullable; import dev.engine_room.flywheel.api.material.Material; -import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.chunk.ChunkSectionLayer; public interface BlockMaterialFunction { @Nullable - Material apply(RenderType chunkRenderType, boolean shaded, boolean ambientOcclusion); + Material apply(ChunkSectionLayer chunkRenderType, boolean shaded, boolean ambientOcclusion); } diff --git a/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/BlockModelBuilder.java b/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/BlockModelBuilder.java index fed6734a8..765e8bc5e 100644 --- a/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/BlockModelBuilder.java +++ b/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/BlockModelBuilder.java @@ -39,7 +39,7 @@ public BlockModelBuilder renderFluids(boolean renderFluids) { } @Deprecated(forRemoval = true) - public BlockModelBuilder materialFunc(@Nullable BiFunction materialFunc) { + public BlockModelBuilder materialFunc(@Nullable BiFunction materialFunc) { if (materialFunc != null) { this.materialFunc = (chunkRenderType, shaded, ambientOcclusion) -> materialFunc.apply(chunkRenderType, shaded); } else { @@ -48,7 +48,7 @@ public BlockModelBuilder materialFunc(@Nullable BiFunction { - private static final RenderType[] CHUNK_LAYERS = RenderType.chunkBufferLayers().toArray(RenderType[]::new); + private static final ChunkSectionLayer[] CHUNK_LAYERS = ChunkSectionLayer.values(); - private final Reference2ReferenceMap emitterMap = new Reference2ReferenceArrayMap<>(); + private final Reference2ReferenceMap emitterMap = new Reference2ReferenceArrayMap<>(); private final ByteBufferBuilderStack byteBufferBuilderStack = new ByteBufferBuilderStack(); @UnknownNullability private BlockMaterialFunction blockMaterialFunction; - MeshEmitterManager(BiFunction meshEmitterFactory) { - for (RenderType renderType : CHUNK_LAYERS) { - emitterMap.put(renderType, meshEmitterFactory.apply(byteBufferBuilderStack, renderType)); + MeshEmitterManager(BiFunction meshEmitterFactory) { + for (ChunkSectionLayer chunkSectionLayer : CHUNK_LAYERS) { + emitterMap.put(chunkSectionLayer, meshEmitterFactory.apply(byteBufferBuilderStack, chunkSectionLayer)); } } @@ -62,10 +63,10 @@ public SimpleModel end() { } @Nullable - public BufferBuilder getBuffer(RenderType renderType, boolean shade, boolean ao) { - Material key = blockMaterialFunction.apply(renderType, shade, ao); + public BufferBuilder getBuffer(ChunkSectionLayer chunkSectionLayer, boolean shade, boolean ao) { + Material key = blockMaterialFunction.apply(chunkSectionLayer, shade, ao); if (key != null) { - return emitterMap.get(renderType).getBuffer(key); + return emitterMap.get(chunkSectionLayer).getBuffer(key); } else { return null; } diff --git a/common/src/lib/java/dev/engine_room/flywheel/lib/model/part/ModelTrees.java b/common/src/lib/java/dev/engine_room/flywheel/lib/model/part/ModelTrees.java index af8838143..c1bccb4da 100644 --- a/common/src/lib/java/dev/engine_room/flywheel/lib/model/part/ModelTrees.java +++ b/common/src/lib/java/dev/engine_room/flywheel/lib/model/part/ModelTrees.java @@ -13,12 +13,15 @@ import dev.engine_room.flywheel.lib.model.RetexturedMesh; import dev.engine_room.flywheel.lib.model.SingleMeshModel; import dev.engine_room.flywheel.lib.util.RendererReloadCache; +import net.minecraft.client.Minecraft; import net.minecraft.client.model.geom.ModelLayerLocation; import net.minecraft.client.renderer.texture.TextureAtlasSprite; +import net.minecraft.client.resources.model.AtlasManager; public final class ModelTrees { private static final RendererReloadCache CACHE = new RendererReloadCache<>(k -> { - ModelTree tree = convert("", MeshTree.of(k.layer), k.pathsToPrune, k.texture != null ? k.texture.sprite() : null, k.material); + AtlasManager atlas = Minecraft.getInstance().getAtlasManager(); + ModelTree tree = convert("", MeshTree.of(k.layer), k.pathsToPrune, k.texture != null ? atlas.get(k.texture) : null, k.material); if (tree == null) { throw new IllegalArgumentException("Cannot prune root node!"); diff --git a/common/src/lib/java/dev/engine_room/flywheel/lib/visual/component/HitboxComponent.java b/common/src/lib/java/dev/engine_room/flywheel/lib/visual/component/HitboxComponent.java index 24734f33c..bfa0c095f 100644 --- a/common/src/lib/java/dev/engine_room/flywheel/lib/visual/component/HitboxComponent.java +++ b/common/src/lib/java/dev/engine_room/flywheel/lib/visual/component/HitboxComponent.java @@ -86,7 +86,9 @@ public HitboxComponent showEyeBox(boolean showEyeBox) { public void beginFrame(DynamicVisual.Context context) { recycler.resetCount(); - var shouldRenderHitBoxes = Minecraft.getInstance().debugEntries.isCurrentlyEnabled(DebugScreenEntries.ENTITY_HITBOXES); + var shouldRenderHitBoxes = Minecraft.getInstance() + .debugEntries + .isCurrentlyEnabled(DebugScreenEntries.ENTITY_HITBOXES); if (shouldRenderHitBoxes && !entity.isInvisible() && !Minecraft.getInstance() .showOnlyReducedInfo()) { float partialTick = context.partialTick(); diff --git a/common/src/main/java/dev/engine_room/flywheel/impl/compat/CompatMod.java b/common/src/main/java/dev/engine_room/flywheel/impl/compat/CompatMod.java index 8217cb963..c53fa9ecd 100644 --- a/common/src/main/java/dev/engine_room/flywheel/impl/compat/CompatMod.java +++ b/common/src/main/java/dev/engine_room/flywheel/impl/compat/CompatMod.java @@ -3,7 +3,6 @@ import dev.engine_room.flywheel.impl.FlwImplXplat; public enum CompatMod { - EMBEDDIUM("embeddium"), IRIS("iris"), SODIUM("sodium"); diff --git a/common/src/vanillin/java/dev/engine_room/vanillin/VanillaVisuals.java b/common/src/vanillin/java/dev/engine_room/vanillin/VanillaVisuals.java index dc2c570ec..e321dc704 100644 --- a/common/src/vanillin/java/dev/engine_room/vanillin/VanillaVisuals.java +++ b/common/src/vanillin/java/dev/engine_room/vanillin/VanillaVisuals.java @@ -28,7 +28,7 @@ import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.decoration.ItemFrame; -import net.minecraft.world.entity.vehicle.AbstractMinecart; +import net.minecraft.world.entity.vehicle.minecart.AbstractMinecart; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.entity.BlockEntityType; diff --git a/common/src/vanillin/java/dev/engine_room/vanillin/VanillinXplat.java b/common/src/vanillin/java/dev/engine_room/vanillin/VanillinXplat.java index 5234e9128..25d66b97c 100644 --- a/common/src/vanillin/java/dev/engine_room/vanillin/VanillinXplat.java +++ b/common/src/vanillin/java/dev/engine_room/vanillin/VanillinXplat.java @@ -3,7 +3,6 @@ import org.jetbrains.annotations.Nullable; import dev.engine_room.flywheel.api.internal.DependencyInjection; -import net.minecraft.client.color.item.ItemColor; import net.minecraft.world.item.Item; public interface VanillinXplat { diff --git a/common/src/vanillin/java/dev/engine_room/vanillin/VisualElements.java b/common/src/vanillin/java/dev/engine_room/vanillin/VisualElements.java index 07ce6c628..9345e8f83 100644 --- a/common/src/vanillin/java/dev/engine_room/vanillin/VisualElements.java +++ b/common/src/vanillin/java/dev/engine_room/vanillin/VisualElements.java @@ -15,8 +15,8 @@ import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.decoration.ItemFrame; import net.minecraft.world.entity.item.ItemEntity; -import net.minecraft.world.entity.vehicle.AbstractMinecart; -import net.minecraft.world.entity.vehicle.MinecartTNT; +import net.minecraft.world.entity.vehicle.minecart.AbstractMinecart; +import net.minecraft.world.entity.vehicle.minecart.MinecartTNT; // TODO: A way to get other elements in a visual, likely using these as keys. public class VisualElements { diff --git a/common/src/vanillin/java/dev/engine_room/vanillin/config/BlockEntityVisualizerBuilder.java b/common/src/vanillin/java/dev/engine_room/vanillin/config/BlockEntityVisualizerBuilder.java index bb39be3b1..f2ea30d43 100644 --- a/common/src/vanillin/java/dev/engine_room/vanillin/config/BlockEntityVisualizerBuilder.java +++ b/common/src/vanillin/java/dev/engine_room/vanillin/config/BlockEntityVisualizerBuilder.java @@ -13,8 +13,7 @@ public class BlockEntityVisualizerBuilder { private final Configurator configurator; private final BlockEntityType type; - @Nullable - private SimpleBlockEntityVisualizer.Factory visualFactory; + private SimpleBlockEntityVisualizer.@Nullable Factory visualFactory; @Nullable private Predicate skipVanillaRender; diff --git a/common/src/vanillin/java/dev/engine_room/vanillin/config/EntityVisualizerBuilder.java b/common/src/vanillin/java/dev/engine_room/vanillin/config/EntityVisualizerBuilder.java index 7f2541ed8..0b1cd7dc3 100644 --- a/common/src/vanillin/java/dev/engine_room/vanillin/config/EntityVisualizerBuilder.java +++ b/common/src/vanillin/java/dev/engine_room/vanillin/config/EntityVisualizerBuilder.java @@ -18,8 +18,7 @@ public final class EntityVisualizerBuilder { private final Configurator configurator; private final EntityType type; - @Nullable - private SimpleEntityVisualizer.Factory visualFactory; + private SimpleEntityVisualizer.@Nullable Factory visualFactory; @Nullable private Predicate skipVanillaRender; diff --git a/common/src/vanillin/java/dev/engine_room/vanillin/elements/FireElement.java b/common/src/vanillin/java/dev/engine_room/vanillin/elements/FireElement.java index 0cc6c34d7..1c6f0a49c 100644 --- a/common/src/vanillin/java/dev/engine_room/vanillin/elements/FireElement.java +++ b/common/src/vanillin/java/dev/engine_room/vanillin/elements/FireElement.java @@ -21,6 +21,7 @@ import dev.engine_room.flywheel.lib.visual.AbstractVisual; import dev.engine_room.flywheel.lib.visual.SimpleDynamicVisual; import dev.engine_room.flywheel.lib.visual.util.SmartRecycler; +import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.LightTexture; import net.minecraft.client.renderer.texture.TextureAtlasSprite; import net.minecraft.client.resources.model.ModelBakery; @@ -39,7 +40,8 @@ public final class FireElement extends AbstractVisual implements SimpleDynamicVi // because Material#sprite is a surprisingly heavy operation // and because sprites are invalidated after a resource reload. private static final RendererReloadCache FIRE_MODELS = new RendererReloadCache<>(texture -> { - return new SingleMeshModel(new FireMesh(texture.sprite()), FIRE_MATERIAL); + TextureAtlasSprite sprite = Minecraft.getInstance().getAtlasManager().get(texture); + return new SingleMeshModel(new FireMesh(sprite), FIRE_MATERIAL); }); private final Entity entity; diff --git a/common/src/vanillin/java/dev/engine_room/vanillin/elements/HitboxElement.java b/common/src/vanillin/java/dev/engine_room/vanillin/elements/HitboxElement.java index 41dd4b245..b73523de3 100644 --- a/common/src/vanillin/java/dev/engine_room/vanillin/elements/HitboxElement.java +++ b/common/src/vanillin/java/dev/engine_room/vanillin/elements/HitboxElement.java @@ -12,6 +12,7 @@ import dev.engine_room.flywheel.lib.visual.SimpleDynamicVisual; import dev.engine_room.flywheel.lib.visual.util.SmartRecycler; import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.components.debug.DebugScreenEntries; import net.minecraft.client.renderer.LightTexture; import net.minecraft.util.Mth; import net.minecraft.world.entity.Entity; @@ -108,8 +109,8 @@ public void animate(float partialTick) { recycler.resetCount(); var shouldRenderHitBoxes = Minecraft.getInstance() - .getEntityRenderDispatcher() - .shouldRenderHitBoxes(); + .debugEntries + .isCurrentlyEnabled(DebugScreenEntries.ENTITY_HITBOXES); if (shouldRenderHitBoxes && !entity.isInvisible() && !Minecraft.getInstance() .showOnlyReducedInfo()) { double entityX = Mth.lerp(partialTick, entity.xOld, entity.getX()); diff --git a/common/src/vanillin/java/dev/engine_room/vanillin/item/SodiumAnimatedTextureCompat.java b/common/src/vanillin/java/dev/engine_room/vanillin/item/SodiumAnimatedTextureCompat.java index 031808fa7..51e1ee30a 100644 --- a/common/src/vanillin/java/dev/engine_room/vanillin/item/SodiumAnimatedTextureCompat.java +++ b/common/src/vanillin/java/dev/engine_room/vanillin/item/SodiumAnimatedTextureCompat.java @@ -4,7 +4,7 @@ import it.unimi.dsi.fastutil.objects.ReferenceArraySet; import it.unimi.dsi.fastutil.objects.ReferenceSet; import it.unimi.dsi.fastutil.objects.ReferenceSets; -import net.caffeinemc.mods.sodium.client.render.texture.SpriteUtil; +import net.caffeinemc.mods.sodium.api.texture.SpriteUtil; import net.minecraft.client.renderer.texture.TextureAtlasSprite; /** @@ -42,14 +42,14 @@ public static void onReloadRenderer() { private static final class Internals { private static void add(TextureAtlasSprite sprite) { - if (SpriteUtil.hasAnimation(sprite)) { + if (SpriteUtil.INSTANCE.hasAnimation(sprite)) { VISIBLE.add(sprite); } } private static void beginFrame() { for (var sprite : VISIBLE) { - SpriteUtil.markSpriteActive(sprite); + SpriteUtil.INSTANCE.markSpriteActive(sprite); } } } diff --git a/common/src/vanillin/java/dev/engine_room/vanillin/mixin/ChestRendererAccessor.java b/common/src/vanillin/java/dev/engine_room/vanillin/mixin/ChestRendererAccessor.java new file mode 100644 index 000000000..fc01a7875 --- /dev/null +++ b/common/src/vanillin/java/dev/engine_room/vanillin/mixin/ChestRendererAccessor.java @@ -0,0 +1,14 @@ +package dev.engine_room.vanillin.mixin; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Invoker; + +import net.minecraft.client.renderer.blockentity.ChestRenderer; +import net.minecraft.client.renderer.blockentity.state.ChestRenderState; +import net.minecraft.world.level.block.entity.BlockEntity; + +@Mixin(ChestRenderer.class) +public interface ChestRendererAccessor { + @Invoker("getChestMaterial") + ChestRenderState.ChestMaterialType flywheel$getChestMaterial(BlockEntity blockEntity, boolean xmasTextures); +} diff --git a/common/src/vanillin/java/dev/engine_room/vanillin/visuals/BellVisual.java b/common/src/vanillin/java/dev/engine_room/vanillin/visuals/BellVisual.java index cd6788c67..7f52c22bf 100644 --- a/common/src/vanillin/java/dev/engine_room/vanillin/visuals/BellVisual.java +++ b/common/src/vanillin/java/dev/engine_room/vanillin/visuals/BellVisual.java @@ -34,7 +34,7 @@ public class BellVisual extends AbstractBlockEntityVisual imple public BellVisual(VisualizationContext ctx, BellBlockEntity blockEntity, float partialTick) { super(ctx, blockEntity, partialTick); - instances = InstanceTree.create(instancerProvider(), ModelTrees.of(ModelLayers.BELL, BellRenderer.BELL_RESOURCE_LOCATION, MATERIAL)); + instances = InstanceTree.create(instancerProvider(), ModelTrees.of(ModelLayers.BELL, BellRenderer.BELL_TEXTURE, MATERIAL)); bellBody = instances.childOrThrow("bell_body"); BlockPos visualPos = getVisualPosition(); diff --git a/common/src/vanillin/java/dev/engine_room/vanillin/visuals/ChestVisual.java b/common/src/vanillin/java/dev/engine_room/vanillin/visuals/ChestVisual.java index b208ad9d0..c9f5622a8 100644 --- a/common/src/vanillin/java/dev/engine_room/vanillin/visuals/ChestVisual.java +++ b/common/src/vanillin/java/dev/engine_room/vanillin/visuals/ChestVisual.java @@ -1,13 +1,12 @@ package dev.engine_room.vanillin.visuals; -import java.util.Calendar; import java.util.EnumMap; import java.util.Map; import java.util.function.Consumer; -import org.jspecify.annotations.Nullable; import org.joml.Matrix4f; import org.joml.Matrix4fc; +import org.jspecify.annotations.Nullable; import dev.engine_room.flywheel.api.instance.Instance; import dev.engine_room.flywheel.api.material.Material; @@ -18,13 +17,16 @@ import dev.engine_room.flywheel.lib.model.part.ModelTrees; import dev.engine_room.flywheel.lib.visual.AbstractBlockEntityVisual; import dev.engine_room.flywheel.lib.visual.SimpleDynamicVisual; +import dev.engine_room.vanillin.mixin.ChestRendererAccessor; import it.unimi.dsi.fastutil.floats.Float2FloatFunction; import it.unimi.dsi.fastutil.longs.LongSet; +import net.minecraft.client.Minecraft; import net.minecraft.client.model.geom.ModelLayerLocation; import net.minecraft.client.model.geom.ModelLayers; import net.minecraft.client.renderer.LevelRenderer; import net.minecraft.client.renderer.LightTexture; import net.minecraft.client.renderer.Sheets; +import net.minecraft.client.renderer.blockentity.ChestRenderer; import net.minecraft.core.BlockPos; import net.minecraft.core.SectionPos; import net.minecraft.util.Mth; @@ -61,8 +63,7 @@ public class ChestVisual extends Abstrac @Nullable private final Matrix4fc initialPose; private final BrightnessCombiner brightnessCombiner = new BrightnessCombiner(); - @Nullable - private final DoubleBlockCombiner.NeighborCombineResult neighborCombineResult; + private final DoubleBlockCombiner.@Nullable NeighborCombineResult neighborCombineResult; @Nullable private final Float2FloatFunction lidProgress; @@ -74,7 +75,11 @@ public ChestVisual(VisualizationContext ctx, T blockEntity, float partialTick) { Block block = blockState.getBlock(); if (block instanceof AbstractChestBlock chestBlock) { ChestType chestType = blockState.hasProperty(ChestBlock.TYPE) ? blockState.getValue(ChestBlock.TYPE) : ChestType.SINGLE; - net.minecraft.client.resources.model.Material texture = Sheets.chooseMaterial(blockEntity, chestType, isChristmas()); + ChestRenderer renderer = (ChestRenderer) Minecraft.getInstance().getBlockEntityRenderDispatcher().getRenderer(blockEntity); + net.minecraft.client.resources.model.Material texture = Sheets.chooseMaterial( + ((ChestRendererAccessor) renderer).flywheel$getChestMaterial(blockEntity, ChestRenderer.xmasTextures()), + chestType + ); instances = InstanceTree.create(instancerProvider(), ModelTrees.of(LAYER_LOCATIONS.get(chestType), texture, MATERIAL)); lid = instances.childOrThrow("lid"); lock = instances.childOrThrow("lock"); @@ -95,11 +100,6 @@ public ChestVisual(VisualizationContext ctx, T blockEntity, float partialTick) { } } - private static boolean isChristmas() { - Calendar calendar = Calendar.getInstance(); - return calendar.get(Calendar.MONTH) + 1 == 12 && calendar.get(Calendar.DATE) >= 24 && calendar.get(Calendar.DATE) <= 26; - } - private Matrix4f createInitialPose() { BlockPos visualPos = getVisualPosition(); float horizontalAngle = blockState.getValue(ChestBlock.FACING).toYRot(); diff --git a/common/src/vanillin/java/dev/engine_room/vanillin/visuals/ItemFrameVisual.java b/common/src/vanillin/java/dev/engine_room/vanillin/visuals/ItemFrameVisual.java index 7d6a44ce1..a0653e6a5 100644 --- a/common/src/vanillin/java/dev/engine_room/vanillin/visuals/ItemFrameVisual.java +++ b/common/src/vanillin/java/dev/engine_room/vanillin/visuals/ItemFrameVisual.java @@ -14,8 +14,8 @@ import dev.engine_room.vanillin.item.ItemModels; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.LightTexture; -import net.minecraft.client.resources.model.ModelManager; -import net.minecraft.client.resources.model.ModelResourceLocation; +import net.minecraft.client.renderer.block.model.BlockStateModel; +import net.minecraft.client.resources.model.BlockStateDefinitions; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.util.Mth; @@ -25,29 +25,18 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; import net.minecraft.world.level.LightLayer; +import net.minecraft.world.level.block.state.BlockState; public class ItemFrameVisual extends AbstractVisual implements EntityVisual, SimpleDynamicVisual { - private static final ModelResourceLocation FRAME_LOCATION = ModelResourceLocation.vanilla("item_frame", "map=false"); - private static final ModelResourceLocation MAP_FRAME_LOCATION = ModelResourceLocation.vanilla("item_frame", "map=true"); - private static final ModelResourceLocation GLOW_FRAME_LOCATION = ModelResourceLocation.vanilla("glow_item_frame", "map=false"); - private static final ModelResourceLocation GLOW_MAP_FRAME_LOCATION = ModelResourceLocation.vanilla("glow_item_frame", "map=true"); - - public static final RendererReloadCache MODEL_RESOURCE_LOCATION = new RendererReloadCache<>(mrl -> { - ModelManager modelManager = Minecraft.getInstance() - .getModelManager() - .getBlockModelShaper() - .getModelManager(); - - return new BakedModelBuilder(modelManager.getModel(mrl)) - .build(); - }); + public static final RendererReloadCache MODEL_RESOURCE_LOCATION = new RendererReloadCache<>(model -> + new BakedModelBuilder(model).build()); private final Matrix4f baseTransform = new Matrix4f(); private final TransformedInstance frame; private final TransformedInstance item; private final ItemFrame entity; - private ModelResourceLocation lastFrameLocation; + private BlockStateModel lastFrameModel; private ItemStack lastItemStack; public ItemFrameVisual(VisualizationContext ctx, ItemFrame entity, float partialTick) { @@ -58,8 +47,8 @@ public ItemFrameVisual(VisualizationContext ctx, ItemFrame entity, float partial lastItemStack = entity.getItem() .copy(); - lastFrameLocation = getFrameModelResourceLoc(entity, lastItemStack); - var frameModel = MODEL_RESOURCE_LOCATION.get(lastFrameLocation); + lastFrameModel = getFrameModel(); + var frameModel = MODEL_RESOURCE_LOCATION.get(lastFrameModel); frame = ctx.instancerProvider() .instancer(InstanceTypes.TRANSFORMED, frameModel) @@ -103,13 +92,13 @@ public void animate(float partialTick) { baseTransform.rotateXYZ(Mth.DEG_TO_RAD * entity.getXRot(), Mth.DEG_TO_RAD * (180.0f - entity.getYRot()), 0.0f); var stack = entity.getItem(); - var frameLocation = getFrameModelResourceLoc(entity, stack); + var frameModel = getFrameModel(); - if (frameLocation != lastFrameLocation) { + if (frameModel != lastFrameModel) { visualizationContext.instancerProvider() - .instancer(InstanceTypes.TRANSFORMED, MODEL_RESOURCE_LOCATION.get(frameLocation)) + .instancer(InstanceTypes.TRANSFORMED, MODEL_RESOURCE_LOCATION.get(frameModel)) .stealInstance(frame); - lastFrameLocation = frameLocation; + lastFrameModel = frameModel; } frame.setVisible(!invisible); @@ -171,12 +160,9 @@ protected int getBlockLightLevel(BlockPos pos) { return entity.getType() == EntityType.GLOW_ITEM_FRAME ? Math.max(5, getBlockLightLevelBase(pos)) : getBlockLightLevelBase(pos); } - public static ModelResourceLocation getFrameModelResourceLoc(ItemFrame entity, ItemStack item) { - boolean bl = entity.getType() == EntityType.GLOW_ITEM_FRAME; - if (item.is(Items.FILLED_MAP)) { - return bl ? GLOW_MAP_FRAME_LOCATION : MAP_FRAME_LOCATION; - } else { - return bl ? GLOW_FRAME_LOCATION : FRAME_LOCATION; - } + public BlockStateModel getFrameModel() { + boolean isGlowing = entity.getType() == EntityType.GLOW_ITEM_FRAME; + BlockState state = BlockStateDefinitions.getItemFrameFakeState(isGlowing, false); + return Minecraft.getInstance().getBlockRenderer().getBlockModel(state); } } diff --git a/common/src/vanillin/java/dev/engine_room/vanillin/visuals/MinecartVisual.java b/common/src/vanillin/java/dev/engine_room/vanillin/visuals/MinecartVisual.java index ba3263467..dbe06008d 100644 --- a/common/src/vanillin/java/dev/engine_room/vanillin/visuals/MinecartVisual.java +++ b/common/src/vanillin/java/dev/engine_room/vanillin/visuals/MinecartVisual.java @@ -1,8 +1,8 @@ package dev.engine_room.vanillin.visuals; -import org.jspecify.annotations.Nullable; import org.joml.Matrix4f; import org.joml.Matrix4fStack; +import org.jspecify.annotations.Nullable; import dev.engine_room.flywheel.api.material.Material; import dev.engine_room.flywheel.api.visual.DynamicVisual; @@ -21,7 +21,7 @@ import net.minecraft.client.model.geom.ModelLayerLocation; import net.minecraft.resources.Identifier; import net.minecraft.util.Mth; -import net.minecraft.world.entity.vehicle.AbstractMinecart; +import net.minecraft.world.entity.vehicle.minecart.AbstractMinecart; import net.minecraft.world.level.block.RenderShape; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.Vec3; diff --git a/common/src/vanillin/java/dev/engine_room/vanillin/visuals/TntMinecartVisual.java b/common/src/vanillin/java/dev/engine_room/vanillin/visuals/TntMinecartVisual.java index 7cf6d0736..b21f04caf 100644 --- a/common/src/vanillin/java/dev/engine_room/vanillin/visuals/TntMinecartVisual.java +++ b/common/src/vanillin/java/dev/engine_room/vanillin/visuals/TntMinecartVisual.java @@ -7,7 +7,7 @@ import net.minecraft.client.model.geom.ModelLayers; import net.minecraft.client.renderer.texture.OverlayTexture; import net.minecraft.util.Mth; -import net.minecraft.world.entity.vehicle.MinecartTNT; +import net.minecraft.world.entity.vehicle.minecart.MinecartTNT; public class TntMinecartVisual extends MinecartVisual { private static final int WHITE_OVERLAY = OverlayTexture.pack(OverlayTexture.u(1.0F), 10); diff --git a/common/src/vanillin/resources/vanillin.mixins.json b/common/src/vanillin/resources/vanillin.mixins.json index 0b196dae8..6944cdfd1 100644 --- a/common/src/vanillin/resources/vanillin.mixins.json +++ b/common/src/vanillin/resources/vanillin.mixins.json @@ -1,13 +1,14 @@ { - "required" : true, - "minVersion" : "0.8", - "package" : "dev.engine_room.vanillin.mixin", - "compatibilityLevel" : "JAVA_21", - "refmap" : "vanillin.refmap.json", - "client" : [ + "required": true, + "minVersion": "0.8", + "package": "dev.engine_room.vanillin.mixin", + "compatibilityLevel": "JAVA_21", + "refmap": "vanillin.refmap.json", + "client": [ + "ChestRendererAccessor", "item.ItemOverridesAccessor" ], - "injectors" : { - "defaultRequire" : 1 + "injectors": { + "defaultRequire": 1 } } diff --git a/fabric/src/lib/java/dev/engine_room/flywheel/lib/model/baked/FabricMeshEmitterManager.java b/fabric/src/lib/java/dev/engine_room/flywheel/lib/model/baked/FabricMeshEmitterManager.java index 48666aafb..1c200ca40 100644 --- a/fabric/src/lib/java/dev/engine_room/flywheel/lib/model/baked/FabricMeshEmitterManager.java +++ b/fabric/src/lib/java/dev/engine_room/flywheel/lib/model/baked/FabricMeshEmitterManager.java @@ -2,22 +2,17 @@ import java.util.function.Supplier; -import org.jspecify.annotations.Nullable; import org.jetbrains.annotations.UnknownNullability; +import org.jspecify.annotations.Nullable; import com.mojang.blaze3d.vertex.BufferBuilder; import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.VertexConsumer; import dev.engine_room.flywheel.lib.model.SimpleModel; -import net.fabricmc.fabric.api.renderer.v1.material.BlendMode; -import net.fabricmc.fabric.api.renderer.v1.material.RenderMaterial; -import net.fabricmc.fabric.api.renderer.v1.model.ForwardingBakedModel; -import net.fabricmc.fabric.api.renderer.v1.render.RenderContext; import net.fabricmc.fabric.api.util.TriState; -import net.minecraft.client.renderer.RenderType; +import net.irisshaders.iris.gl.blending.BlendMode; import net.minecraft.client.renderer.block.model.BakedQuad; -import net.minecraft.client.resources.model.BakedModel; import net.minecraft.core.BlockPos; import net.minecraft.util.RandomSource; import net.minecraft.world.level.BlockAndTintGetter; @@ -123,9 +118,9 @@ public void putBulkData(PoseStack.Pose pose, BakedQuad quad, float red, float gr } @Override - public void putBulkData(PoseStack.Pose pose, BakedQuad quad, float[] brightness, float red, float green, float blue, float alpha, int[] lightmap, int packedOverlay, boolean readAlpha) { + public void putBulkData(PoseStack.Pose pose, BakedQuad quad, float[] brightness, float red, float green, float blue, float alpha, int[] lightmap, int packedOverlay) { if (currentDelegate != null) { - currentDelegate.putBulkData(pose, quad, brightness, red, green, blue, alpha, lightmap, packedOverlay, readAlpha); + currentDelegate.putBulkData(pose, quad, brightness, red, green, blue, alpha, lightmap, packedOverlay); } } diff --git a/fabric/src/main/java/dev/engine_room/flywheel/impl/FlwCommands.java b/fabric/src/main/java/dev/engine_room/flywheel/impl/FlwCommands.java index 7a0cee7b4..f469ae03d 100644 --- a/fabric/src/main/java/dev/engine_room/flywheel/impl/FlwCommands.java +++ b/fabric/src/main/java/dev/engine_room/flywheel/impl/FlwCommands.java @@ -17,6 +17,7 @@ import net.fabricmc.fabric.api.client.command.v2.FabricClientCommandSource; import net.minecraft.client.Minecraft; import net.minecraft.commands.CommandBuildContext; +import net.minecraft.commands.CommandSourceStack; import net.minecraft.commands.arguments.coordinates.BlockPosArgument; import net.minecraft.commands.arguments.coordinates.Coordinates; import net.minecraft.core.BlockPos; @@ -199,7 +200,7 @@ private static LiteralArgumentBuilder createDebugComm } // Client version of BlockPosArgument.getBlockPos - private static BlockPos getBlockPos(CommandContext context, String name) { - return context.getArgument(name, Coordinates.class).getBlockPos(context.getSource().getPlayer().createCommandSourceStack()); + public static BlockPos getBlockPos(CommandContext context, String name) { + return context.getArgument(name, Coordinates.class).getBlockPos((CommandSourceStack) context.getSource()); } } diff --git a/fabric/src/main/java/dev/engine_room/flywheel/impl/FlywheelFabric.java b/fabric/src/main/java/dev/engine_room/flywheel/impl/FlywheelFabric.java index 3a4ce1c91..c85184b09 100644 --- a/fabric/src/main/java/dev/engine_room/flywheel/impl/FlywheelFabric.java +++ b/fabric/src/main/java/dev/engine_room/flywheel/impl/FlywheelFabric.java @@ -72,9 +72,7 @@ private static void setupLib() { ReloadLevelRendererCallback.EVENT.register(level -> RendererReloadCache.onReloadLevelRenderer()); EndClientResourceReloadCallback.EVENT.register((minecraft, resourceManager, initialReload, error) -> ResourceReloadHolder.onEndClientResourceReload()); - ModelLoadingPlugin.register(ctx -> { - ctx.addModels(PartialModelEventHandler.onRegisterAdditional()); - }); + ModelLoadingPlugin.register(ctx -> ctx.addModels(PartialModelEventHandler.onRegisterAdditional())); ResourceManagerHelper.get(PackType.CLIENT_RESOURCES).registerReloadListener(PartialModelEventHandler.ReloadListener.INSTANCE); } diff --git a/fabric/src/main/java/dev/engine_room/flywheel/impl/mixin/fabric/MinecraftMixin.java b/fabric/src/main/java/dev/engine_room/flywheel/impl/mixin/fabric/MinecraftMixin.java index f87736ad1..dfdc9f9b1 100644 --- a/fabric/src/main/java/dev/engine_room/flywheel/impl/mixin/fabric/MinecraftMixin.java +++ b/fabric/src/main/java/dev/engine_room/flywheel/impl/mixin/fabric/MinecraftMixin.java @@ -15,14 +15,14 @@ abstract class MinecraftMixin { @Shadow public ClientLevel level; - @Inject(method = "setLevel(Lnet/minecraft/client/multiplayer/ClientLevel;Lnet/minecraft/client/gui/screens/ReceivingLevelScreen$Reason;)V", at = @At("HEAD")) + @Inject(method = "setLevel", at = @At("HEAD")) private void flywheel$onSetLevel(CallbackInfo ci) { if (level != null) { LevelAttached.invalidateLevel(level); } } - @Inject(method = "disconnect(Lnet/minecraft/client/gui/screens/Screen;)V", at = @At("HEAD")) + @Inject(method = "disconnect(Lnet/minecraft/client/gui/screens/Screen;ZZ)V", at = @At("HEAD")) private void flywheel$onDisconnect(CallbackInfo ci) { if (level != null) { LevelAttached.invalidateLevel(level); diff --git a/gradle.properties b/gradle.properties index 5be811f4e..5748736f2 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,6 +1,8 @@ org.gradle.jvmargs = -Xmx3G org.gradle.daemon = false +loom.ignoreDependencyLoomVersionValidation = true + # Common metadata mod_license = MIT mod_sources = https://github.com/Engine-Room/Flywheel @@ -39,9 +41,9 @@ fabric_loader_version = 0.18.2 fabric_api_version = 0.139.4+1.21.11 # Build dependency mod versions -enable_sodium_and_iris = false -sodium_version = mc1.21.11-0.8.0 -iris_version = 1.10.0+1.21.11 +enable_sodium_and_iris = true +sodium_version = mc1.21.11-0.8.2 +iris_version = 1.10.4+1.21.11 # Publication info flywheel_group=dev.engine-room.flywheel diff --git a/neoforge/src/lib/java/dev/engine_room/flywheel/lib/model/baked/NeoForgeSinglePosVirtualBlockGetter.java b/neoforge/src/lib/java/dev/engine_room/flywheel/lib/model/baked/NeoForgeSinglePosVirtualBlockGetter.java index 993657380..5eb2d475e 100644 --- a/neoforge/src/lib/java/dev/engine_room/flywheel/lib/model/baked/NeoForgeSinglePosVirtualBlockGetter.java +++ b/neoforge/src/lib/java/dev/engine_room/flywheel/lib/model/baked/NeoForgeSinglePosVirtualBlockGetter.java @@ -7,7 +7,7 @@ import net.minecraft.core.BlockPos; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.state.BlockState; -import net.neoforged.neoforge.client.model.data.ModelData; +import net.neoforged.neoforge.model.data.ModelData; public class NeoForgeSinglePosVirtualBlockGetter extends SinglePosVirtualBlockGetter { @Nullable diff --git a/neoforge/src/lib/java/dev/engine_room/flywheel/lib/model/baked/NeoforgeMeshEmitter.java b/neoforge/src/lib/java/dev/engine_room/flywheel/lib/model/baked/NeoforgeMeshEmitter.java index ded11be75..4e443239c 100644 --- a/neoforge/src/lib/java/dev/engine_room/flywheel/lib/model/baked/NeoforgeMeshEmitter.java +++ b/neoforge/src/lib/java/dev/engine_room/flywheel/lib/model/baked/NeoforgeMeshEmitter.java @@ -8,19 +8,19 @@ import com.mojang.blaze3d.vertex.VertexConsumer; import dev.engine_room.flywheel.api.material.Material; -import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.block.ModelBlockRenderer; import net.minecraft.client.renderer.block.model.BakedQuad; +import net.minecraft.client.renderer.chunk.ChunkSectionLayer; @ApiStatus.Internal public class NeoforgeMeshEmitter extends MeshEmitter implements VertexConsumer { - private final RenderType renderType; + private final ChunkSectionLayer chunkSectionLayer; private boolean defaultAo; - NeoforgeMeshEmitter(ByteBufferBuilderStack byteBufferBuilderStack, RenderType renderType) { - super(byteBufferBuilderStack, renderType); - this.renderType = renderType; + NeoforgeMeshEmitter(ByteBufferBuilderStack byteBufferBuilderStack, ChunkSectionLayer chunkSectionLayer) { + super(byteBufferBuilderStack, chunkSectionLayer); + this.chunkSectionLayer = chunkSectionLayer; } /** @@ -36,7 +36,7 @@ public void prepareForModelLayer(boolean defaultAo) { @Nullable private BufferBuilder getBuffer(boolean shade, boolean ao) { - Material key = blockMaterialFunction.apply(renderType, shade, ao); + Material key = blockMaterialFunction.apply(chunkSectionLayer, shade, ao); if (key != null) { return getBuffer(key); } else { @@ -46,7 +46,7 @@ private BufferBuilder getBuffer(boolean shade, boolean ao) { @Nullable private BufferBuilder getBuffer(BakedQuad quad) { - boolean shade = quad.isShade(); + boolean shade = quad.shade(); boolean ao = quad.hasAmbientOcclusion() && defaultAo; return getBuffer(shade, ao); } @@ -60,40 +60,50 @@ public void putBulkData(PoseStack.Pose pose, BakedQuad quad, float red, float gr } @Override - public void putBulkData(PoseStack.Pose pose, BakedQuad quad, float[] brightness, float red, float green, float blue, float alpha, int[] lightmap, int packedOverlay, boolean readAlpha) { + public void putBulkData(PoseStack.Pose pose, BakedQuad quad, float[] brightness, float red, float green, float blue, float alpha, int[] lightmap, int packedOverlay) { BufferBuilder bufferBuilder = getBuffer(quad); if (bufferBuilder != null) { - bufferBuilder.putBulkData(pose, quad, brightness, red, green, blue, alpha, lightmap, packedOverlay, readAlpha); + bufferBuilder.putBulkData(pose, quad, brightness, red, green, blue, alpha, lightmap, packedOverlay); } } @Override public VertexConsumer addVertex(float x, float y, float z) { - throw new UnsupportedOperationException("ForgeMeshEmitter only supports putBulkData!"); + throw new UnsupportedOperationException("NeoForgeMeshEmitter only supports putBulkData!"); } @Override public VertexConsumer setColor(int red, int green, int blue, int alpha) { - throw new UnsupportedOperationException("ForgeMeshEmitter only supports putBulkData!"); + throw new UnsupportedOperationException("NeoForgeMeshEmitter only supports putBulkData!"); + } + + @Override + public VertexConsumer setColor(int color) { + throw new UnsupportedOperationException("NeoForgeMeshEmitter only supports putBulkData!"); } @Override public VertexConsumer setUv(float u, float v) { - throw new UnsupportedOperationException("ForgeMeshEmitter only supports putBulkData!"); + throw new UnsupportedOperationException("NeoForgeMeshEmitter only supports putBulkData!"); } @Override public VertexConsumer setUv1(int u, int v) { - throw new UnsupportedOperationException("ForgeMeshEmitter only supports putBulkData!"); + throw new UnsupportedOperationException("NeoForgeMeshEmitter only supports putBulkData!"); } @Override public VertexConsumer setUv2(int u, int v) { - throw new UnsupportedOperationException("ForgeMeshEmitter only supports putBulkData!"); + throw new UnsupportedOperationException("NeoForgeMeshEmitter only supports putBulkData!"); } @Override public VertexConsumer setNormal(float normalX, float normalY, float normalZ) { - throw new UnsupportedOperationException("ForgeMeshEmitter only supports putBulkData!"); + throw new UnsupportedOperationException("NeoForgeMeshEmitter only supports putBulkData!"); + } + + @Override + public VertexConsumer setLineWidth(float f) { + throw new UnsupportedOperationException("NeoForgeMeshEmitter only supports putBulkData!"); } } diff --git a/neoforge/src/lib/java/dev/engine_room/flywheel/lib/model/baked/PartialModelEventHandler.java b/neoforge/src/lib/java/dev/engine_room/flywheel/lib/model/baked/PartialModelEventHandler.java index bc56b2f94..387d59715 100644 --- a/neoforge/src/lib/java/dev/engine_room/flywheel/lib/model/baked/PartialModelEventHandler.java +++ b/neoforge/src/lib/java/dev/engine_room/flywheel/lib/model/baked/PartialModelEventHandler.java @@ -6,8 +6,6 @@ import org.jetbrains.annotations.ApiStatus; -import net.minecraft.client.resources.model.BakedModel; -import net.minecraft.client.resources.model.ModelResourceLocation; import net.neoforged.neoforge.client.event.ModelEvent; @ApiStatus.Internal diff --git a/neoforge/src/main/java/dev/engine_room/flywheel/impl/FlywheelNeoForge.java b/neoforge/src/main/java/dev/engine_room/flywheel/impl/FlywheelNeoForge.java index ea451b17e..2362fbddc 100644 --- a/neoforge/src/main/java/dev/engine_room/flywheel/impl/FlywheelNeoForge.java +++ b/neoforge/src/main/java/dev/engine_room/flywheel/impl/FlywheelNeoForge.java @@ -8,7 +8,6 @@ import dev.engine_room.flywheel.api.event.ReloadLevelRendererEvent; import dev.engine_room.flywheel.backend.compile.FlwProgramsReloader; import dev.engine_room.flywheel.backend.engine.uniform.Uniforms; -import dev.engine_room.flywheel.impl.compat.EmbeddiumCompat; import dev.engine_room.flywheel.impl.visualization.VisualizationEventHandler; import dev.engine_room.flywheel.lib.model.baked.PartialModelEventHandler; import dev.engine_room.flywheel.lib.util.LevelAttached; @@ -23,7 +22,6 @@ import net.neoforged.fml.common.Mod; import net.neoforged.fml.event.lifecycle.FMLCommonSetupEvent; import net.neoforged.neoforge.client.event.CustomizeGuiOverlayEvent; -import net.neoforged.neoforge.client.event.RegisterClientReloadListenersEvent; import net.neoforged.neoforge.common.NeoForge; import net.neoforged.neoforge.event.entity.EntityJoinLevelEvent; import net.neoforged.neoforge.event.entity.EntityLeaveLevelEvent; @@ -50,8 +48,6 @@ public FlywheelNeoForge(IEventBus modEventBus, ModContainer modContainer) { CrashReportCallables.registerCrashCallable("Flywheel Backend", BackendManagerImpl::getBackendString); FlwImpl.init(); - - EmbeddiumCompat.init(); } private static void registerImplEventListeners(IEventBus gameEventBus, IEventBus modEventBus) { diff --git a/neoforge/src/main/java/dev/engine_room/flywheel/impl/compat/EmbeddiumCompat.java b/neoforge/src/main/java/dev/engine_room/flywheel/impl/compat/EmbeddiumCompat.java deleted file mode 100644 index cd1e5e138..000000000 --- a/neoforge/src/main/java/dev/engine_room/flywheel/impl/compat/EmbeddiumCompat.java +++ /dev/null @@ -1,33 +0,0 @@ -package dev.engine_room.flywheel.impl.compat; - -import org.embeddedt.embeddium.api.ChunkDataBuiltEvent; - -import dev.engine_room.flywheel.impl.FlwImpl; -import dev.engine_room.flywheel.lib.visualization.VisualizationHelper; - -public final class EmbeddiumCompat { - public static final boolean ACTIVE = CompatMod.EMBEDDIUM.isLoaded; - - static { - if (ACTIVE) { - FlwImpl.LOGGER.debug("Detected Embeddium"); - } - } - - private EmbeddiumCompat() { - } - - public static void init() { - if (ACTIVE) { - Internals.init(); - } - } - - private static final class Internals { - static void init() { - ChunkDataBuiltEvent.BUS.addListener(event -> { - event.getDataBuilder().removeBlockEntitiesIf(VisualizationHelper::tryAddBlockEntity); - }); - } - } -} diff --git a/neoforge/src/main/resources/META-INF/neoforge.mods.toml b/neoforge/src/main/resources/META-INF/neoforge.mods.toml index 28a8cd00e..08df87d64 100644 --- a/neoforge/src/main/resources/META-INF/neoforge.mods.toml +++ b/neoforge/src/main/resources/META-INF/neoforge.mods.toml @@ -33,12 +33,6 @@ type = "required" versionRange = "${neoforge_version_range}" side = "CLIENT" -[[dependencies.${ flywheel_id }]] -modId = "embeddium" -type = "optional" -versionRange = "[0.3.25,)" -side = "CLIENT" - [[dependencies.${ flywheel_id }]] modId = "sodium" type = "optional" From 74a9b78157de506d46d192d232c813a184eac05d Mon Sep 17 00:00:00 2001 From: IThundxr Date: Sat, 27 Dec 2025 15:37:10 -0500 Subject: [PATCH 12/59] 1.21.1 Porting VII --- .../flywheel/backend/gl/GlStateTracker.java | 4 +- .../flywheel/backend/gl/GlTextureUnit.java | 5 +- .../flywheel/backend/gl/shader/GlProgram.java | 6 +- .../flywheel/lib/internal/FlwLibXplat.java | 14 +---- .../flywheel/lib/model/Models.java | 8 +-- .../lib/model/baked/BlockModelBuilder.java | 31 ++++++++--- ...delBuilder.java => LevelModelBuilder.java} | 42 +++++--------- .../lib/model/baked/MeshEmitterManager.java | 5 +- .../lib/model/baked/PartialModel.java | 15 +++-- .../flywheel/impl/FlwDebugInfo.java | 55 ++++++++++--------- .../vanillin/visuals/ItemFrameVisual.java | 5 +- .../lib/model/baked/BakedModelBufferer.java | 31 ++++++----- .../model/baked/FabricMeshEmitterManager.java | 7 ++- .../lib/model/baked/ModelBuilderImpl.java | 6 +- .../model/baked/PartialModelEventHandler.java | 2 +- .../flywheel/impl/FlwLibXplatImpl.java | 23 ++------ .../lib/model/baked/BakedModelBufferer.java | 41 +++++++------- .../lib/model/baked/ModelBuilderImpl.java | 6 +- .../model/baked/PartialModelEventHandler.java | 2 +- .../flywheel/impl/FlwLibXplatImpl.java | 24 ++------ .../flywheel/impl/FlywheelNeoForge.java | 14 ++--- 21 files changed, 160 insertions(+), 186 deletions(-) rename common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/{BakedModelBuilder.java => LevelModelBuilder.java} (54%) diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/gl/GlStateTracker.java b/common/src/backend/java/dev/engine_room/flywheel/backend/gl/GlStateTracker.java index 9988f4073..dfe5fd69b 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/gl/GlStateTracker.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/gl/GlStateTracker.java @@ -1,8 +1,10 @@ package dev.engine_room.flywheel.backend.gl; +import com.mojang.blaze3d.opengl.GlConst; import com.mojang.blaze3d.opengl.GlStateManager; import dev.engine_room.flywheel.backend.gl.buffer.GlBufferType; +import dev.engine_room.flywheel.backend.mixin.GlStateManagerAccessor; /** * Tracks bound buffers/vbos because GlStateManager doesn't do that for us. @@ -37,7 +39,7 @@ public static void _setProgram(int id) { } public static State getRestoreState() { - return new State(BUFFERS.clone(), vao, program, GlStateManager._getActiveTexture()); + return new State(BUFFERS.clone(), vao, program, GlStateManagerAccessor.flywheel$getActiveTexture() + GlConst.GL_TEXTURE0); } public static void bindVao(int vao) { diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/gl/GlTextureUnit.java b/common/src/backend/java/dev/engine_room/flywheel/backend/gl/GlTextureUnit.java index 8a834e5a0..0e0e0658c 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/gl/GlTextureUnit.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/gl/GlTextureUnit.java @@ -1,7 +1,6 @@ package dev.engine_room.flywheel.backend.gl; -import static org.lwjgl.opengl.GL13.GL_TEXTURE0; - +import com.mojang.blaze3d.opengl.GlConst; import com.mojang.blaze3d.opengl.GlStateManager; import dev.engine_room.flywheel.backend.mixin.GlStateManagerAccessor; @@ -47,7 +46,7 @@ public enum GlTextureUnit { GlTextureUnit(int unit) { this.number = unit; - this.glEnum = GL_TEXTURE0 + unit; + this.glEnum = GlConst.GL_TEXTURE0 + unit; } public void makeActive() { diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/gl/shader/GlProgram.java b/common/src/backend/java/dev/engine_room/flywheel/backend/gl/shader/GlProgram.java index 9438ef355..d45e0bf2c 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/gl/shader/GlProgram.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/gl/shader/GlProgram.java @@ -20,7 +20,7 @@ import org.joml.Matrix4fc; import org.slf4j.Logger; -import com.mojang.blaze3d.shaders.ProgramManager; +import com.mojang.blaze3d.opengl.GlStateManager; import com.mojang.logging.LogUtils; import dev.engine_room.flywheel.backend.gl.GlObject; @@ -38,11 +38,11 @@ public GlProgram(int handle) { } public void bind() { - ProgramManager.glUseProgram(handle()); + GlStateManager._glUseProgram(handle()); } public static void unbind() { - ProgramManager.glUseProgram(0); + GlStateManager._glUseProgram(0); } public void setFloat(String glslName, float value) { diff --git a/common/src/lib/java/dev/engine_room/flywheel/lib/internal/FlwLibXplat.java b/common/src/lib/java/dev/engine_room/flywheel/lib/internal/FlwLibXplat.java index ac363b090..d59eed38f 100644 --- a/common/src/lib/java/dev/engine_room/flywheel/lib/internal/FlwLibXplat.java +++ b/common/src/lib/java/dev/engine_room/flywheel/lib/internal/FlwLibXplat.java @@ -1,22 +1,14 @@ package dev.engine_room.flywheel.lib.internal; -import net.minecraft.resources.Identifier; - -import org.jetbrains.annotations.UnknownNullability; - import dev.engine_room.flywheel.api.internal.DependencyInjection; import dev.engine_room.flywheel.lib.model.SimpleModel; -import dev.engine_room.flywheel.lib.model.baked.BakedModelBuilder; import dev.engine_room.flywheel.lib.model.baked.BlockModelBuilder; -import net.minecraft.client.resources.model.ModelManager; +import dev.engine_room.flywheel.lib.model.baked.LevelModelBuilder; public interface FlwLibXplat { FlwLibXplat INSTANCE = DependencyInjection.load(FlwLibXplat.class, "dev.engine_room.flywheel.impl.FlwLibXplatImpl"); - @UnknownNullability - BakedModel getBakedModel(ModelManager modelManager, Identifier location); - - SimpleModel buildBakedModelBuilder(BakedModelBuilder builder); - SimpleModel buildBlockModelBuilder(BlockModelBuilder builder); + + SimpleModel buildLevelModelBuilder(LevelModelBuilder builder); } diff --git a/common/src/lib/java/dev/engine_room/flywheel/lib/model/Models.java b/common/src/lib/java/dev/engine_room/flywheel/lib/model/Models.java index 80948eaef..b6f8d6b7d 100644 --- a/common/src/lib/java/dev/engine_room/flywheel/lib/model/Models.java +++ b/common/src/lib/java/dev/engine_room/flywheel/lib/model/Models.java @@ -6,8 +6,8 @@ import com.mojang.blaze3d.vertex.PoseStack; import dev.engine_room.flywheel.api.model.Model; -import dev.engine_room.flywheel.lib.model.baked.BakedModelBuilder; import dev.engine_room.flywheel.lib.model.baked.BlockModelBuilder; +import dev.engine_room.flywheel.lib.model.baked.LevelModelBuilder; import dev.engine_room.flywheel.lib.model.baked.PartialModel; import dev.engine_room.flywheel.lib.model.baked.SinglePosVirtualBlockGetter; import dev.engine_room.flywheel.lib.transform.TransformStack; @@ -23,10 +23,10 @@ * method with the same parameters will return the same object. */ public final class Models { - private static final RendererReloadCache BLOCK_STATE = new RendererReloadCache<>(it -> new BlockModelBuilder(SinglePosVirtualBlockGetter.createFullDark() + private static final RendererReloadCache BLOCK_STATE = new RendererReloadCache<>(it -> new LevelModelBuilder(SinglePosVirtualBlockGetter.createFullDark() .blockState(it), List.of(BlockPos.ZERO)) .build()); - private static final RendererReloadCache PARTIAL = new RendererReloadCache<>(it -> new BakedModelBuilder(it.get()) + private static final RendererReloadCache PARTIAL = new RendererReloadCache<>(it -> new BlockModelBuilder(it.get()) .build()); private static final RendererReloadCache, Model> TRANSFORMED_PARTIAL = new RendererReloadCache<>(TransformedPartial::create); @@ -92,7 +92,7 @@ private record TransformedPartial(PartialModel partial, T key, BiConsumer positions; + final BlockStateModel blockModel; + @Nullable + BlockAndTintGetter level; + @Nullable + BlockPos pos; @Nullable PoseStack poseStack; - boolean renderFluids = false; @Nullable BlockMaterialFunction materialFunc; - public BlockModelBuilder(BlockAndTintGetter level, Iterable positions) { + public BlockModelBuilder(BlockStateModel blockModel) { + this.blockModel = blockModel; + } + + public BlockModelBuilder level(@Nullable BlockAndTintGetter level) { this.level = level; - this.positions = positions; + return this; } - public BlockModelBuilder poseStack(@Nullable PoseStack poseStack) { - this.poseStack = poseStack; + public BlockModelBuilder pos(@Nullable BlockPos pos) { + this.pos = pos; return this; } - public BlockModelBuilder renderFluids(boolean renderFluids) { - this.renderFluids = renderFluids; + public BlockModelBuilder poseStack(@Nullable PoseStack poseStack) { + this.poseStack = poseStack; return this; } @@ -54,6 +61,12 @@ public BlockModelBuilder materialFunc(@Nullable BlockMaterialFunction materialFu } public SimpleModel build() { + if (level == null) { + level = EmptyVirtualBlockGetter.FULL_DARK; + } + if (pos == null) { + pos = BlockPos.ZERO; + } if (materialFunc == null) { materialFunc = ModelUtil::getMaterial; } diff --git a/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/BakedModelBuilder.java b/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/LevelModelBuilder.java similarity index 54% rename from common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/BakedModelBuilder.java rename to common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/LevelModelBuilder.java index a2e0bbefa..1447e36d9 100644 --- a/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/BakedModelBuilder.java +++ b/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/LevelModelBuilder.java @@ -2,8 +2,6 @@ import java.util.function.BiFunction; -import net.minecraft.client.renderer.chunk.ChunkSectionLayer; - import org.jspecify.annotations.Nullable; import com.mojang.blaze3d.vertex.PoseStack; @@ -12,42 +10,36 @@ import dev.engine_room.flywheel.lib.internal.FlwLibXplat; import dev.engine_room.flywheel.lib.model.ModelUtil; import dev.engine_room.flywheel.lib.model.SimpleModel; -import net.minecraft.client.resources.model.BakedModel; +import net.minecraft.client.renderer.chunk.ChunkSectionLayer; import net.minecraft.core.BlockPos; import net.minecraft.world.level.BlockAndTintGetter; -public final class BakedModelBuilder { - final BakedModel bakedModel; - @Nullable - BlockAndTintGetter level; - @Nullable - BlockPos pos; +public final class LevelModelBuilder { + final BlockAndTintGetter level; + final Iterable positions; @Nullable PoseStack poseStack; + boolean renderFluids = false; @Nullable BlockMaterialFunction materialFunc; - public BakedModelBuilder(BakedModel bakedModel) { - this.bakedModel = bakedModel; - } - - public BakedModelBuilder level(@Nullable BlockAndTintGetter level) { + public LevelModelBuilder(BlockAndTintGetter level, Iterable positions) { this.level = level; - return this; + this.positions = positions; } - public BakedModelBuilder pos(@Nullable BlockPos pos) { - this.pos = pos; + public LevelModelBuilder poseStack(@Nullable PoseStack poseStack) { + this.poseStack = poseStack; return this; } - public BakedModelBuilder poseStack(@Nullable PoseStack poseStack) { - this.poseStack = poseStack; + public LevelModelBuilder renderFluids(boolean renderFluids) { + this.renderFluids = renderFluids; return this; } @Deprecated(forRemoval = true) - public BakedModelBuilder materialFunc(@Nullable BiFunction materialFunc) { + public LevelModelBuilder materialFunc(@Nullable BiFunction materialFunc) { if (materialFunc != null) { this.materialFunc = (chunkRenderType, shaded, ambientOcclusion) -> materialFunc.apply(chunkRenderType, shaded); } else { @@ -56,22 +48,16 @@ public BakedModelBuilder materialFunc(@Nullable BiFunction { private static final ChunkSectionLayer[] CHUNK_LAYERS = ChunkSectionLayer.values(); @@ -31,8 +30,8 @@ class MeshEmitterManager { } } - public T getEmitter(RenderType renderType) { - return emitterMap.get(renderType); + public T getEmitter(ChunkSectionLayer chunkSectionLayer) { + return emitterMap.get(chunkSectionLayer); } public void prepare(BlockMaterialFunction blockMaterialFunction) { diff --git a/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/PartialModel.java b/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/PartialModel.java index 879a0b2ab..231f3da40 100644 --- a/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/PartialModel.java +++ b/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/PartialModel.java @@ -2,22 +2,21 @@ import java.util.concurrent.ConcurrentMap; -import net.minecraft.resources.Identifier; - import org.jetbrains.annotations.UnknownNullability; import com.google.common.collect.MapMaker; import dev.engine_room.flywheel.lib.internal.FlwLibXplat; import net.minecraft.client.Minecraft; -import net.minecraft.client.resources.model.BakedModel; +import net.minecraft.client.renderer.block.model.BlockStateModel; +import net.minecraft.resources.Identifier; /** * A helper class for loading and accessing JSON models not directly used by any blocks or items. *
* Creating a PartialModel will make Minecraft automatically load the associated modelLocation. *
- * Once Minecraft has finished baking all models, all PartialModels will have their bakedModel fields populated. + * Once Minecraft has finished baking all models, all PartialModels will have their blockStateModel fields populated. */ public final class PartialModel { static final ConcurrentMap ALL = new MapMaker().weakValues().makeMap(); @@ -25,13 +24,13 @@ public final class PartialModel { private final Identifier modelId; @UnknownNullability - BakedModel bakedModel; + BlockStateModel blockStateModel; private PartialModel(Identifier modelId) { this.modelId = modelId; if (populateOnInit) { - bakedModel = FlwLibXplat.INSTANCE.getBakedModel(Minecraft.getInstance().getModelManager(), modelId); + blockStateModel = FlwLibXplat.INSTANCE.getBakedModel(Minecraft.getInstance().getModelManager(), modelId); } } @@ -40,8 +39,8 @@ public static PartialModel of(Identifier modelId) { } @UnknownNullability - public BakedModel get() { - return bakedModel; + public BlockStateModel get() { + return blockStateModel; } public Identifier modelId() { diff --git a/common/src/main/java/dev/engine_room/flywheel/impl/FlwDebugInfo.java b/common/src/main/java/dev/engine_room/flywheel/impl/FlwDebugInfo.java index 438a42038..e15708aee 100644 --- a/common/src/main/java/dev/engine_room/flywheel/impl/FlwDebugInfo.java +++ b/common/src/main/java/dev/engine_room/flywheel/impl/FlwDebugInfo.java @@ -1,6 +1,6 @@ package dev.engine_room.flywheel.impl; -import java.util.List; +import java.net.URI; import org.jetbrains.annotations.Nullable; @@ -16,11 +16,16 @@ import it.unimi.dsi.fastutil.ints.IntList; import net.minecraft.ChatFormatting; import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.components.debug.DebugScreenDisplayer; +import net.minecraft.client.gui.components.debug.DebugScreenEntry; import net.minecraft.core.Vec3i; -import net.minecraft.network.chat.ClickEvent; +import net.minecraft.network.chat.ClickEvent.CopyToClipboard; +import net.minecraft.network.chat.ClickEvent.OpenUrl; import net.minecraft.network.chat.Component; -import net.minecraft.network.chat.HoverEvent; +import net.minecraft.network.chat.HoverEvent.ShowText; import net.minecraft.network.chat.Style; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.chunk.LevelChunk; public final class FlwDebugInfo { @@ -66,13 +71,13 @@ public static Component getDebugCommandInfo() { return Component.literal(debugInfoString) .append(Component.literal("\n\nClick to copy debug info to clipboard") .withStyle(Style.EMPTY.withUnderlined(true) - .withClickEvent(new ClickEvent(ClickEvent.Action.COPY_TO_CLIPBOARD, debugInfoString)) - .withHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, Component.literal(debugInfoString))))) + .withClickEvent(new CopyToClipboard(debugInfoString)) + .withHoverEvent(new ShowText(Component.literal(debugInfoString))))) .append(Component.literal("\n\nClick to open an issue on GitHub") .withStyle(Style.EMPTY.withUnderlined(true) .withColor(ChatFormatting.BLUE) - .withClickEvent(new ClickEvent(ClickEvent.Action.OPEN_URL, "https://github.com/Engine-Room/Flywheel/issues")) - .withHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, Component.literal("Opens URL:\nhttps://github.com/Engine-Room/Flywheel/issues"))))); + .withClickEvent(new OpenUrl(URI.create("https://github.com/Engine-Room/Flywheel/issues"))) + .withHoverEvent(new ShowText(Component.literal("Opens URL:\nhttps://github.com/Engine-Room/Flywheel/issues"))))); } @@ -247,25 +252,25 @@ private static void addOpenGLDebugInfo(StringBuilder out) { appendLine(out, "Shading Language Version: ").append(GlCompat.GL_SHADING_LANGUAGE_VERSION_STRING); } - public static void addDebugInfo(Minecraft minecraft, List systemInfo) { - if (minecraft.showOnlyReducedInfo()) { - return; - } + public static class FlwDebugEntry implements DebugScreenEntry { + // TODO - Check if this should use a group instead + @Override + public void display(DebugScreenDisplayer displayer, @Nullable Level level, @Nullable LevelChunk clientChunk, @Nullable LevelChunk serverChunk) { + displayer.addLine(""); + displayer.addLine("Flywheel: " + FlwImplXplat.INSTANCE.getVersionStr()); + displayer.addLine("Backend: " + BackendManagerImpl.getBackendString()); + displayer.addLine("Update limiting: " + (FlwConfig.INSTANCE.limitUpdates() ? "on" : "off")); + + VisualizationManager manager = VisualizationManager.get(level); + if (manager != null) { + displayer.addLine("B: " + manager.blockEntities().visualCount() + + ", E: " + manager.entities().visualCount() + + ", F: " + manager.effects().visualCount()); + Vec3i renderOrigin = manager.renderOrigin(); + displayer.addLine("Origin: " + renderOrigin.getX() + ", " + renderOrigin.getY() + ", " + renderOrigin.getZ()); + } - systemInfo.add(""); - systemInfo.add("Flywheel: " + FlwImplXplat.INSTANCE.getVersionStr()); - systemInfo.add("Backend: " + BackendManagerImpl.getBackendString()); - systemInfo.add("Update limiting: " + (FlwConfig.INSTANCE.limitUpdates() ? "on" : "off")); - - VisualizationManager manager = VisualizationManager.get(minecraft.level); - if (manager != null) { - systemInfo.add("B: " + manager.blockEntities().visualCount() - + ", E: " + manager.entities().visualCount() - + ", F: " + manager.effects().visualCount()); - Vec3i renderOrigin = manager.renderOrigin(); - systemInfo.add("Origin: " + renderOrigin.getX() + ", " + renderOrigin.getY() + ", " + renderOrigin.getZ()); + displayer.addLine("Memory Usage: CPU: " + StringUtil.formatBytes(FlwMemoryTracker.getCpuMemory()) + ", GPU: " + StringUtil.formatBytes(FlwMemoryTracker.getGpuMemory())); } - - systemInfo.add("Memory Usage: CPU: " + StringUtil.formatBytes(FlwMemoryTracker.getCpuMemory()) + ", GPU: " + StringUtil.formatBytes(FlwMemoryTracker.getGpuMemory())); } } diff --git a/common/src/vanillin/java/dev/engine_room/vanillin/visuals/ItemFrameVisual.java b/common/src/vanillin/java/dev/engine_room/vanillin/visuals/ItemFrameVisual.java index a0653e6a5..58cd026ed 100644 --- a/common/src/vanillin/java/dev/engine_room/vanillin/visuals/ItemFrameVisual.java +++ b/common/src/vanillin/java/dev/engine_room/vanillin/visuals/ItemFrameVisual.java @@ -1,5 +1,7 @@ package dev.engine_room.vanillin.visuals; +import dev.engine_room.flywheel.lib.model.baked.BlockModelBuilder; + import org.joml.Matrix4f; import dev.engine_room.flywheel.api.model.Model; @@ -7,7 +9,6 @@ import dev.engine_room.flywheel.api.visualization.VisualizationContext; import dev.engine_room.flywheel.lib.instance.InstanceTypes; import dev.engine_room.flywheel.lib.instance.TransformedInstance; -import dev.engine_room.flywheel.lib.model.baked.BakedModelBuilder; import dev.engine_room.flywheel.lib.util.RendererReloadCache; import dev.engine_room.flywheel.lib.visual.AbstractVisual; import dev.engine_room.flywheel.lib.visual.SimpleDynamicVisual; @@ -29,7 +30,7 @@ public class ItemFrameVisual extends AbstractVisual implements EntityVisual, SimpleDynamicVisual { public static final RendererReloadCache MODEL_RESOURCE_LOCATION = new RendererReloadCache<>(model -> - new BakedModelBuilder(model).build()); + new BlockModelBuilder(model).build()); private final Matrix4f baseTransform = new Matrix4f(); diff --git a/fabric/src/lib/java/dev/engine_room/flywheel/lib/model/baked/BakedModelBufferer.java b/fabric/src/lib/java/dev/engine_room/flywheel/lib/model/baked/BakedModelBufferer.java index a78682ac7..e135a68eb 100644 --- a/fabric/src/lib/java/dev/engine_room/flywheel/lib/model/baked/BakedModelBufferer.java +++ b/fabric/src/lib/java/dev/engine_room/flywheel/lib/model/baked/BakedModelBufferer.java @@ -1,6 +1,12 @@ package dev.engine_room.flywheel.lib.model.baked; +import java.util.ArrayList; import java.util.Iterator; +import java.util.List; + +import net.minecraft.client.renderer.block.model.BlockModelPart; +import net.minecraft.client.renderer.block.model.BlockStateModel; +import net.minecraft.client.renderer.chunk.ChunkSectionLayer; import org.jspecify.annotations.Nullable; @@ -10,11 +16,9 @@ import dev.engine_room.flywheel.lib.model.SimpleModel; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.ItemBlockRenderTypes; -import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.block.BlockRenderDispatcher; import net.minecraft.client.renderer.block.ModelBlockRenderer; import net.minecraft.client.renderer.texture.OverlayTexture; -import net.minecraft.client.resources.model.BakedModel; import net.minecraft.core.BlockPos; import net.minecraft.util.RandomSource; import net.minecraft.world.level.BlockAndTintGetter; @@ -28,19 +32,16 @@ final class BakedModelBufferer { private BakedModelBufferer() { } - public static SimpleModel bufferModel(BakedModel model, BlockPos pos, BlockAndTintGetter level, BlockState state, @Nullable PoseStack poseStack, BlockMaterialFunction blockMaterialFunction) { + public static SimpleModel bufferModel(BlockStateModel model, BlockPos pos, BlockAndTintGetter level, BlockState state, @Nullable PoseStack poseStack, BlockMaterialFunction blockMaterialFunction) { ThreadLocalObjects objects = THREAD_LOCAL_OBJECTS.get(); if (poseStack == null) { poseStack = objects.identityPoseStack; } - RandomSource random = objects.random; FabricMeshEmitterManager emitters = objects.emitters; emitters.prepare(blockMaterialFunction); - long seed = state.getSeed(pos); - - RenderType defaultLayer = ItemBlockRenderTypes.getChunkRenderType(state); + ChunkSectionLayer defaultLayer = ItemBlockRenderTypes.getChunkRenderType(state); boolean useAo = Minecraft.useAmbientOcclusion(); // See ModelBlockRenderer#tesselateBlock boolean defaultAo = useAo && state.getLightEmission() == 0 && model.useAmbientOcclusion(); @@ -50,7 +51,7 @@ public static SimpleModel bufferModel(BakedModel model, BlockPos pos, BlockAndTi Minecraft.getInstance() .getBlockRenderer() .getModelRenderer() - .tesselateBlock(level, model, state, pos, poseStack, emitters, false, random, seed, OverlayTexture.NO_OVERLAY); + .tesselateBlock(level, model, state, pos, poseStack, emitters, false, OverlayTexture.NO_OVERLAY); poseStack.popPose(); return emitters.end(); @@ -84,9 +85,9 @@ public static SimpleModel bufferBlocks(Iterator posIterator, BlockAndT FluidState fluidState = state.getFluidState(); if (!fluidState.isEmpty()) { - RenderType renderType = ItemBlockRenderTypes.getRenderLayer(fluidState); + ChunkSectionLayer layer = ItemBlockRenderTypes.getRenderLayer(fluidState); - BufferBuilder bufferBuilder = emitters.getBuffer(renderType, true, false); + BufferBuilder bufferBuilder = emitters.getBuffer(layer, true, false); if (bufferBuilder != null) { transformingWrapper.prepare(bufferBuilder, poseStack); @@ -100,18 +101,18 @@ public static SimpleModel bufferBlocks(Iterator posIterator, BlockAndT } if (state.getRenderShape() == RenderShape.MODEL) { - long seed = state.getSeed(pos); - BakedModel model = renderDispatcher.getBlockModel(state); + BlockStateModel model = renderDispatcher.getBlockModel(state); - RenderType defaultLayer = ItemBlockRenderTypes.getChunkRenderType(state); + ChunkSectionLayer defaultLayer = ItemBlockRenderTypes.getChunkRenderType(state); // See ModelBlockRenderer#tesselateBlock - boolean defaultAo = useAo && state.getLightEmission() == 0 && model.useAmbientOcclusion(); + boolean defaultAo = useAo && state.getLightEmission() == 0 && ((BlockModelPart) parts.getFirst()).useAmbientOcclusion(); model = emitters.prepareForModel(model, defaultLayer, useAo, defaultAo); poseStack.pushPose(); poseStack.translate(pos.getX(), pos.getY(), pos.getZ()); - blockRenderer.tesselateBlock(level, model, state, pos, poseStack, emitters, true, random, seed, OverlayTexture.NO_OVERLAY); + List parts = model.collectParts(random); + blockRenderer.tesselateBlock(level, parts, state, pos, poseStack, emitters, true, OverlayTexture.NO_OVERLAY); poseStack.popPose(); } } diff --git a/fabric/src/lib/java/dev/engine_room/flywheel/lib/model/baked/FabricMeshEmitterManager.java b/fabric/src/lib/java/dev/engine_room/flywheel/lib/model/baked/FabricMeshEmitterManager.java index 1c200ca40..57d984d41 100644 --- a/fabric/src/lib/java/dev/engine_room/flywheel/lib/model/baked/FabricMeshEmitterManager.java +++ b/fabric/src/lib/java/dev/engine_room/flywheel/lib/model/baked/FabricMeshEmitterManager.java @@ -2,6 +2,9 @@ import java.util.function.Supplier; +import net.minecraft.client.renderer.block.model.BlockStateModel; +import net.minecraft.client.renderer.chunk.ChunkSectionLayer; + import org.jetbrains.annotations.UnknownNullability; import org.jspecify.annotations.Nullable; @@ -22,7 +25,7 @@ class FabricMeshEmitterManager extends MeshEmitterManager implement private final WrapperModel wrapperModel = new WrapperModel(); @UnknownNullability - private RenderType defaultLayer; + private ChunkSectionLayer defaultLayer; private boolean useAo; private boolean defaultAo; @Nullable @@ -32,7 +35,7 @@ class FabricMeshEmitterManager extends MeshEmitterManager implement super(MeshEmitter::new); } - public BakedModel prepareForModel(BakedModel model, RenderType defaultLayer, boolean useAo, boolean defaultAo) { + public BlockStateModel prepareForModel(BlockStateModel model, ChunkSectionLayer defaultLayer, boolean useAo, boolean defaultAo) { this.defaultLayer = defaultLayer; this.useAo = useAo; this.defaultAo = defaultAo; diff --git a/fabric/src/lib/java/dev/engine_room/flywheel/lib/model/baked/ModelBuilderImpl.java b/fabric/src/lib/java/dev/engine_room/flywheel/lib/model/baked/ModelBuilderImpl.java index 4a0bcc4dd..dad85c46a 100644 --- a/fabric/src/lib/java/dev/engine_room/flywheel/lib/model/baked/ModelBuilderImpl.java +++ b/fabric/src/lib/java/dev/engine_room/flywheel/lib/model/baked/ModelBuilderImpl.java @@ -11,13 +11,13 @@ public final class ModelBuilderImpl { private ModelBuilderImpl() { } - public static SimpleModel buildBakedModelBuilder(BakedModelBuilder builder) { + public static SimpleModel buildBlockModelBuilder(BlockModelBuilder builder) { BlockState blockState = builder.level.getBlockState(builder.pos); - return BakedModelBufferer.bufferModel(builder.bakedModel, builder.pos, builder.level, blockState, builder.poseStack, builder.materialFunc); + return BakedModelBufferer.bufferModel(builder.blockModel, builder.pos, builder.level, blockState, builder.poseStack, builder.materialFunc); } - public static SimpleModel buildBlockModelBuilder(BlockModelBuilder builder) { + public static SimpleModel buildLevelModelBuilder(LevelModelBuilder builder) { return BakedModelBufferer.bufferBlocks(builder.positions.iterator(), builder.level, builder.poseStack, builder.renderFluids, builder.materialFunc); } } diff --git a/fabric/src/lib/java/dev/engine_room/flywheel/lib/model/baked/PartialModelEventHandler.java b/fabric/src/lib/java/dev/engine_room/flywheel/lib/model/baked/PartialModelEventHandler.java index a1328c466..2e178ae05 100644 --- a/fabric/src/lib/java/dev/engine_room/flywheel/lib/model/baked/PartialModelEventHandler.java +++ b/fabric/src/lib/java/dev/engine_room/flywheel/lib/model/baked/PartialModelEventHandler.java @@ -25,7 +25,7 @@ public static void onBakingCompleted(ModelManager manager) { PartialModel.populateOnInit = true; for (PartialModel partial : PartialModel.ALL.values()) { - partial.bakedModel = manager.getModel(partial.modelId()); + partial.blockStateModel = manager.getModel(partial.modelId()); } } diff --git a/fabric/src/main/java/dev/engine_room/flywheel/impl/FlwLibXplatImpl.java b/fabric/src/main/java/dev/engine_room/flywheel/impl/FlwLibXplatImpl.java index 9e94045a9..87135cca1 100644 --- a/fabric/src/main/java/dev/engine_room/flywheel/impl/FlwLibXplatImpl.java +++ b/fabric/src/main/java/dev/engine_room/flywheel/impl/FlwLibXplatImpl.java @@ -1,31 +1,20 @@ package dev.engine_room.flywheel.impl; -import net.minecraft.resources.Identifier; - -import org.jetbrains.annotations.UnknownNullability; +import dev.engine_room.flywheel.lib.model.baked.BlockModelBuilder; +import dev.engine_room.flywheel.lib.model.baked.LevelModelBuilder; import dev.engine_room.flywheel.lib.internal.FlwLibXplat; import dev.engine_room.flywheel.lib.model.SimpleModel; -import dev.engine_room.flywheel.lib.model.baked.BakedModelBuilder; -import dev.engine_room.flywheel.lib.model.baked.BlockModelBuilder; import dev.engine_room.flywheel.lib.model.baked.ModelBuilderImpl; -import net.minecraft.client.resources.model.BakedModel; -import net.minecraft.client.resources.model.ModelManager; public class FlwLibXplatImpl implements FlwLibXplat { @Override - @UnknownNullability - public BakedModel getBakedModel(ModelManager modelManager, Identifier id) { - return modelManager.getModel(id); - } - - @Override - public SimpleModel buildBakedModelBuilder(BakedModelBuilder builder) { - return ModelBuilderImpl.buildBakedModelBuilder(builder); + public SimpleModel buildBlockModelBuilder(BlockModelBuilder builder) { + return ModelBuilderImpl.buildBlockModelBuilder(builder); } @Override - public SimpleModel buildBlockModelBuilder(BlockModelBuilder builder) { - return ModelBuilderImpl.buildBlockModelBuilder(builder); + public SimpleModel buildLevelModelBuilder(LevelModelBuilder builder) { + return ModelBuilderImpl.buildLevelModelBuilder(builder); } } diff --git a/neoforge/src/lib/java/dev/engine_room/flywheel/lib/model/baked/BakedModelBufferer.java b/neoforge/src/lib/java/dev/engine_room/flywheel/lib/model/baked/BakedModelBufferer.java index 258727033..842f740e6 100644 --- a/neoforge/src/lib/java/dev/engine_room/flywheel/lib/model/baked/BakedModelBufferer.java +++ b/neoforge/src/lib/java/dev/engine_room/flywheel/lib/model/baked/BakedModelBufferer.java @@ -1,6 +1,7 @@ package dev.engine_room.flywheel.lib.model.baked; import java.util.Iterator; +import java.util.List; import org.jspecify.annotations.Nullable; @@ -10,20 +11,21 @@ import dev.engine_room.flywheel.lib.model.SimpleModel; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.ItemBlockRenderTypes; -import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.block.BlockRenderDispatcher; import net.minecraft.client.renderer.block.ModelBlockRenderer; +import net.minecraft.client.renderer.block.model.BlockModelPart; +import net.minecraft.client.renderer.block.model.BlockStateModel; +import net.minecraft.client.renderer.chunk.ChunkSectionLayer; +import net.minecraft.client.renderer.rendertype.RenderType; import net.minecraft.client.renderer.texture.OverlayTexture; -import net.minecraft.client.resources.model.BakedModel; import net.minecraft.core.BlockPos; import net.minecraft.util.RandomSource; +import net.minecraft.util.TriState; import net.minecraft.world.level.BlockAndTintGetter; import net.minecraft.world.level.block.RenderShape; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.material.FluidState; -import net.neoforged.neoforge.client.ChunkRenderTypeSet; -import net.neoforged.neoforge.client.model.data.ModelData; -import net.neoforged.neoforge.common.util.TriState; +import net.neoforged.neoforge.model.data.ModelData; final class BakedModelBufferer { private static final ThreadLocal THREAD_LOCAL_OBJECTS = ThreadLocal.withInitial(ThreadLocalObjects::new); @@ -31,7 +33,7 @@ final class BakedModelBufferer { private BakedModelBufferer() { } - public static SimpleModel bufferModel(BakedModel model, BlockPos pos, BlockAndTintGetter level, BlockState state, @Nullable PoseStack poseStack, BlockMaterialFunction blockMaterialFunction) { + public static SimpleModel bufferModel(BlockStateModel model, BlockPos pos, BlockAndTintGetter level, BlockState state, @Nullable PoseStack poseStack, BlockMaterialFunction blockMaterialFunction) { ThreadLocalObjects objects = THREAD_LOCAL_OBJECTS.get(); if (poseStack == null) { poseStack = objects.identityPoseStack; @@ -45,27 +47,26 @@ public static SimpleModel bufferModel(BakedModel model, BlockPos pos, BlockAndTi .getBlockRenderer() .getModelRenderer(); + List parts = model.collectParts(level, pos, state, random); + long seed = state.getSeed(pos); - ModelData modelData = model.getModelData(level, pos, state, level.getModelData(pos)); random.setSeed(seed); - ChunkRenderTypeSet renderTypes = model.getRenderTypes(state, random, modelData); + ChunkSectionLayer layer = parts.getFirst().getRenderType(state); // See ModelBlockRenderer#tesselateBlock boolean defaultAo = state.getLightEmission(level, pos) == 0; boolean aoEnabled = Minecraft.useAmbientOcclusion(); - for (RenderType renderType : renderTypes) { - TriState useAo = model.useAmbientOcclusion(state, modelData, renderType); + TriState useAo = parts.getFirst().ambientOcclusion(); - boolean defaultAoLayer = aoEnabled && (useAo.isTrue() || (useAo.isDefault() && defaultAo)); + boolean defaultAoLayer = aoEnabled && (useAo.isTrue() || (useAo.isDefault() && defaultAo)); - NeoforgeMeshEmitter emitter = emitters.getEmitter(renderType); - emitter.prepareForModelLayer(defaultAoLayer); + NeoforgeMeshEmitter emitter = emitters.getEmitter(layer); + emitter.prepareForModelLayer(defaultAoLayer); - poseStack.pushPose(); - blockRenderer.tesselateBlock(level, model, state, pos, poseStack, emitter, false, random, seed, OverlayTexture.NO_OVERLAY, modelData, renderType); - poseStack.popPose(); - } + poseStack.pushPose(); + blockRenderer.tesselateBlock(level, parts, state, pos, poseStack, emitter, false, OverlayTexture.NO_OVERLAY); + poseStack.popPose(); return emitters.end(); } @@ -98,9 +99,9 @@ public static SimpleModel bufferBlocks(Iterator posIterator, BlockAndT FluidState fluidState = state.getFluidState(); if (!fluidState.isEmpty()) { - RenderType renderType = ItemBlockRenderTypes.getRenderLayer(fluidState); + ChunkSectionLayer layer = ItemBlockRenderTypes.getRenderLayer(fluidState); - BufferBuilder bufferBuilder = emitters.getBuffer(renderType, true, false); + BufferBuilder bufferBuilder = emitters.getBuffer(layer, true, false); if (bufferBuilder != null) { transformingWrapper.prepare(bufferBuilder, poseStack); @@ -115,7 +116,7 @@ public static SimpleModel bufferBlocks(Iterator posIterator, BlockAndT if (state.getRenderShape() == RenderShape.MODEL) { long seed = state.getSeed(pos); - BakedModel model = renderDispatcher.getBlockModel(state); + BlockStateModel model = renderDispatcher.getBlockModel(state); ModelData modelData = model.getModelData(level, pos, state, level.getModelData(pos)); random.setSeed(seed); ChunkRenderTypeSet renderTypes = model.getRenderTypes(state, random, modelData); diff --git a/neoforge/src/lib/java/dev/engine_room/flywheel/lib/model/baked/ModelBuilderImpl.java b/neoforge/src/lib/java/dev/engine_room/flywheel/lib/model/baked/ModelBuilderImpl.java index 4a0bcc4dd..6e92d1766 100644 --- a/neoforge/src/lib/java/dev/engine_room/flywheel/lib/model/baked/ModelBuilderImpl.java +++ b/neoforge/src/lib/java/dev/engine_room/flywheel/lib/model/baked/ModelBuilderImpl.java @@ -11,13 +11,13 @@ public final class ModelBuilderImpl { private ModelBuilderImpl() { } - public static SimpleModel buildBakedModelBuilder(BakedModelBuilder builder) { + public static SimpleModel buildBlockModelBuilder(BlockModelBuilder builder) { BlockState blockState = builder.level.getBlockState(builder.pos); - return BakedModelBufferer.bufferModel(builder.bakedModel, builder.pos, builder.level, blockState, builder.poseStack, builder.materialFunc); + return BakedModelBufferer.bufferModel(builder.blockStateModel, builder.pos, builder.level, blockState, builder.poseStack, builder.materialFunc); } - public static SimpleModel buildBlockModelBuilder(BlockModelBuilder builder) { + public static SimpleModel buildLevelModelBuilder(LevelModelBuilder builder) { return BakedModelBufferer.bufferBlocks(builder.positions.iterator(), builder.level, builder.poseStack, builder.renderFluids, builder.materialFunc); } } diff --git a/neoforge/src/lib/java/dev/engine_room/flywheel/lib/model/baked/PartialModelEventHandler.java b/neoforge/src/lib/java/dev/engine_room/flywheel/lib/model/baked/PartialModelEventHandler.java index 387d59715..ef99d740a 100644 --- a/neoforge/src/lib/java/dev/engine_room/flywheel/lib/model/baked/PartialModelEventHandler.java +++ b/neoforge/src/lib/java/dev/engine_room/flywheel/lib/model/baked/PartialModelEventHandler.java @@ -24,7 +24,7 @@ public static void onBakingCompleted(ModelEvent.BakingCompleted event) { Map models = event.getModels(); for (PartialModel partial : PartialModel.ALL.values()) { - partial.bakedModel = models.get(ModelResourceLocation.standalone(partial.modelId())); + partial.blockStateModel = models.get(ModelResourceLocation.standalone(partial.modelId())); } } } diff --git a/neoforge/src/main/java/dev/engine_room/flywheel/impl/FlwLibXplatImpl.java b/neoforge/src/main/java/dev/engine_room/flywheel/impl/FlwLibXplatImpl.java index 51c62e944..65d323aca 100644 --- a/neoforge/src/main/java/dev/engine_room/flywheel/impl/FlwLibXplatImpl.java +++ b/neoforge/src/main/java/dev/engine_room/flywheel/impl/FlwLibXplatImpl.java @@ -1,32 +1,20 @@ package dev.engine_room.flywheel.impl; -import net.minecraft.resources.Identifier; - -import org.jetbrains.annotations.UnknownNullability; +import dev.engine_room.flywheel.lib.model.baked.BlockModelBuilder; import dev.engine_room.flywheel.lib.internal.FlwLibXplat; import dev.engine_room.flywheel.lib.model.SimpleModel; -import dev.engine_room.flywheel.lib.model.baked.BakedModelBuilder; -import dev.engine_room.flywheel.lib.model.baked.BlockModelBuilder; +import dev.engine_room.flywheel.lib.model.baked.LevelModelBuilder; import dev.engine_room.flywheel.lib.model.baked.ModelBuilderImpl; -import net.minecraft.client.resources.model.BakedModel; -import net.minecraft.client.resources.model.ModelManager; -import net.minecraft.client.resources.model.ModelResourceLocation; public class FlwLibXplatImpl implements FlwLibXplat { @Override - @UnknownNullability - public BakedModel getBakedModel(ModelManager modelManager, Identifier id) { - return modelManager.getModel(ModelResourceLocation.standalone(id)); - } - - @Override - public SimpleModel buildBakedModelBuilder(BakedModelBuilder builder) { - return ModelBuilderImpl.buildBakedModelBuilder(builder); + public SimpleModel buildBlockModelBuilder(BlockModelBuilder builder) { + return ModelBuilderImpl.buildBlockModelBuilder(builder); } @Override - public SimpleModel buildBlockModelBuilder(BlockModelBuilder builder) { - return ModelBuilderImpl.buildBlockModelBuilder(builder); + public SimpleModel buildLevelModelBuilder(LevelModelBuilder builder) { + return ModelBuilderImpl.buildLevelModelBuilder(builder); } } diff --git a/neoforge/src/main/java/dev/engine_room/flywheel/impl/FlywheelNeoForge.java b/neoforge/src/main/java/dev/engine_room/flywheel/impl/FlywheelNeoForge.java index 2362fbddc..bd21d07d0 100644 --- a/neoforge/src/main/java/dev/engine_room/flywheel/impl/FlywheelNeoForge.java +++ b/neoforge/src/main/java/dev/engine_room/flywheel/impl/FlywheelNeoForge.java @@ -1,5 +1,9 @@ package dev.engine_room.flywheel.impl; +import dev.engine_room.flywheel.impl.FlwDebugInfo.FlwDebugEntry; +import dev.engine_room.flywheel.lib.util.IdentifierUtil; +import net.neoforged.neoforge.client.event.RegisterDebugEntriesEvent; + import org.apache.maven.artifact.versioning.ArtifactVersion; import org.jetbrains.annotations.UnknownNullability; @@ -64,15 +68,7 @@ private static void registerImplEventListeners(IEventBus gameEventBus, IEventBus gameEventBus.addListener(FlwCommands::registerClientCommands); - gameEventBus.addListener((CustomizeGuiOverlayEvent.DebugText e) -> { - Minecraft minecraft = Minecraft.getInstance(); - - if (!minecraft.getDebugOverlay().showDebugScreen()) { - return; - } - - FlwDebugInfo.addDebugInfo(minecraft, e.getRight()); - }); + gameEventBus.addListener((RegisterDebugEntriesEvent e) -> e.register(IdentifierUtil.id("flw_debug_info"), new FlwDebugEntry())); modEventBus.addListener((EndClientResourceReloadEvent e) -> BackendManagerImpl.onEndClientResourceReload(e.error().isPresent())); From d41f0086c167f7b8d57e6758945f181638f16eb1 Mon Sep 17 00:00:00 2001 From: IThundxr Date: Sat, 27 Dec 2025 21:28:24 -0500 Subject: [PATCH 13/59] 1.21.1 Porting VIII --- .../flywheel/api/material/Material.java | 2 +- .../backend/engine/LightDataCollector.java | 2 +- .../flywheel/backend/util/AtomicBitSet.java | 5 +- .../flywheel/lib/model/ModelUtil.java | 8 +-- .../model/baked/BlockMaterialFunction.java | 2 +- .../lib/model/baked/MeshEmitterManager.java | 2 +- .../flywheel/impl/FlwDebugInfo.java | 2 +- .../engine_room/vanillin/VanillinXplat.java | 2 +- .../engine_room/vanillin/item/ItemModels.java | 2 +- ...erer.java => BlockStateModelBufferer.java} | 34 +++++----- .../model/baked/FabricMeshEmitterManager.java | 64 +++++++++++-------- .../lib/model/baked/ModelBuilderImpl.java | 4 +- gradle.properties | 2 +- ...erer.java => BlockStateModelBufferer.java} | 41 ++++++------ .../lib/model/baked/ModelBuilderImpl.java | 4 +- .../lib/model/baked/NeoforgeMeshEmitter.java | 2 +- .../vanillin/VanillinXplatImpl.java | 2 +- 17 files changed, 92 insertions(+), 88 deletions(-) rename fabric/src/lib/java/dev/engine_room/flywheel/lib/model/baked/{BakedModelBufferer.java => BlockStateModelBufferer.java} (88%) rename neoforge/src/lib/java/dev/engine_room/flywheel/lib/model/baked/{BakedModelBufferer.java => BlockStateModelBufferer.java} (81%) diff --git a/common/src/api/java/dev/engine_room/flywheel/api/material/Material.java b/common/src/api/java/dev/engine_room/flywheel/api/material/Material.java index 537ff10fb..afe6b6b87 100644 --- a/common/src/api/java/dev/engine_room/flywheel/api/material/Material.java +++ b/common/src/api/java/dev/engine_room/flywheel/api/material/Material.java @@ -1,6 +1,6 @@ package dev.engine_room.flywheel.api.material; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; import net.minecraft.resources.Identifier; diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/engine/LightDataCollector.java b/common/src/backend/java/dev/engine_room/flywheel/backend/engine/LightDataCollector.java index 1639ee7cc..8f8563343 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/engine/LightDataCollector.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/engine/LightDataCollector.java @@ -3,7 +3,7 @@ import java.util.BitSet; import java.util.Objects; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; import org.lwjgl.system.MemoryUtil; import dev.engine_room.flywheel.backend.SkyLightSectionStorageExtension; diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/util/AtomicBitSet.java b/common/src/backend/java/dev/engine_room/flywheel/backend/util/AtomicBitSet.java index 23a43eab3..a6fa378d2 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/util/AtomicBitSet.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/util/AtomicBitSet.java @@ -6,7 +6,7 @@ import java.util.BitSet; import java.util.concurrent.atomic.AtomicReference; -import org.jetbrains.annotations.NotNull; +import org.jspecify.annotations.NonNull; // https://github.com/Netflix/hollow/blob/master/hollow/src/main/java/com/netflix/hollow/core/memory/ThreadSafeBitSet.java // Refactored to remove unused methods, deduplicate some code segments, and add extra functionality with #forEachSetSpan @@ -481,8 +481,7 @@ private long[] segmentForPosition(int segmentIndex) { return expandToFit(segmentIndex).getSegment(segmentIndex); } - @NotNull - private AtomicBitSet.AtomicBitSetSegments expandToFit(int segmentIndex) { + private AtomicBitSet.@NonNull AtomicBitSetSegments expandToFit(int segmentIndex) { AtomicBitSetSegments visibleSegments = segments.get(); while (visibleSegments.numSegments() <= segmentIndex) { diff --git a/common/src/lib/java/dev/engine_room/flywheel/lib/model/ModelUtil.java b/common/src/lib/java/dev/engine_room/flywheel/lib/model/ModelUtil.java index ade96a188..7313849c0 100644 --- a/common/src/lib/java/dev/engine_room/flywheel/lib/model/ModelUtil.java +++ b/common/src/lib/java/dev/engine_room/flywheel/lib/model/ModelUtil.java @@ -2,7 +2,7 @@ import java.util.Collection; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; import org.joml.Vector3f; import org.joml.Vector4f; @@ -78,12 +78,6 @@ public static Material getMaterial(ChunkSectionLayer chunkRenderType, boolean sh @Nullable public static Material getItemMaterial(RenderType renderType) { - var chunkMaterial = getMaterial(renderType, true, false); - - if (chunkMaterial != null) { - return chunkMaterial; - } - if (renderType == Sheets.cutoutBlockSheet()) { return Materials.CUTOUT_BLOCK; } diff --git a/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/BlockMaterialFunction.java b/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/BlockMaterialFunction.java index ab3e506c3..f438d03be 100644 --- a/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/BlockMaterialFunction.java +++ b/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/BlockMaterialFunction.java @@ -1,6 +1,6 @@ package dev.engine_room.flywheel.lib.model.baked; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; import dev.engine_room.flywheel.api.material.Material; import net.minecraft.client.renderer.chunk.ChunkSectionLayer; diff --git a/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/MeshEmitterManager.java b/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/MeshEmitterManager.java index 6534e8767..195e20e7d 100644 --- a/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/MeshEmitterManager.java +++ b/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/MeshEmitterManager.java @@ -2,7 +2,7 @@ import java.util.function.BiFunction; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; import org.jetbrains.annotations.UnknownNullability; import com.google.common.collect.ImmutableList; diff --git a/common/src/main/java/dev/engine_room/flywheel/impl/FlwDebugInfo.java b/common/src/main/java/dev/engine_room/flywheel/impl/FlwDebugInfo.java index e15708aee..f623ae21f 100644 --- a/common/src/main/java/dev/engine_room/flywheel/impl/FlwDebugInfo.java +++ b/common/src/main/java/dev/engine_room/flywheel/impl/FlwDebugInfo.java @@ -2,7 +2,7 @@ import java.net.URI; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; import dev.engine_room.flywheel.api.visualization.VisualizationManager; import dev.engine_room.flywheel.backend.engine.AbstractInstancer; diff --git a/common/src/vanillin/java/dev/engine_room/vanillin/VanillinXplat.java b/common/src/vanillin/java/dev/engine_room/vanillin/VanillinXplat.java index 25d66b97c..ed5b88c0b 100644 --- a/common/src/vanillin/java/dev/engine_room/vanillin/VanillinXplat.java +++ b/common/src/vanillin/java/dev/engine_room/vanillin/VanillinXplat.java @@ -1,6 +1,6 @@ package dev.engine_room.vanillin; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; import dev.engine_room.flywheel.api.internal.DependencyInjection; import net.minecraft.world.item.Item; diff --git a/common/src/vanillin/java/dev/engine_room/vanillin/item/ItemModels.java b/common/src/vanillin/java/dev/engine_room/vanillin/item/ItemModels.java index 4b9119e77..7dca45116 100644 --- a/common/src/vanillin/java/dev/engine_room/vanillin/item/ItemModels.java +++ b/common/src/vanillin/java/dev/engine_room/vanillin/item/ItemModels.java @@ -7,7 +7,7 @@ import java.util.List; import java.util.Set; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; import org.joml.Matrix3f; import org.joml.Matrix4f; import org.joml.Vector3f; diff --git a/fabric/src/lib/java/dev/engine_room/flywheel/lib/model/baked/BakedModelBufferer.java b/fabric/src/lib/java/dev/engine_room/flywheel/lib/model/baked/BlockStateModelBufferer.java similarity index 88% rename from fabric/src/lib/java/dev/engine_room/flywheel/lib/model/baked/BakedModelBufferer.java rename to fabric/src/lib/java/dev/engine_room/flywheel/lib/model/baked/BlockStateModelBufferer.java index e135a68eb..764546601 100644 --- a/fabric/src/lib/java/dev/engine_room/flywheel/lib/model/baked/BakedModelBufferer.java +++ b/fabric/src/lib/java/dev/engine_room/flywheel/lib/model/baked/BlockStateModelBufferer.java @@ -1,13 +1,8 @@ package dev.engine_room.flywheel.lib.model.baked; -import java.util.ArrayList; import java.util.Iterator; import java.util.List; -import net.minecraft.client.renderer.block.model.BlockModelPart; -import net.minecraft.client.renderer.block.model.BlockStateModel; -import net.minecraft.client.renderer.chunk.ChunkSectionLayer; - import org.jspecify.annotations.Nullable; import com.mojang.blaze3d.vertex.BufferBuilder; @@ -18,6 +13,9 @@ import net.minecraft.client.renderer.ItemBlockRenderTypes; import net.minecraft.client.renderer.block.BlockRenderDispatcher; import net.minecraft.client.renderer.block.ModelBlockRenderer; +import net.minecraft.client.renderer.block.model.BlockModelPart; +import net.minecraft.client.renderer.block.model.BlockStateModel; +import net.minecraft.client.renderer.chunk.ChunkSectionLayer; import net.minecraft.client.renderer.texture.OverlayTexture; import net.minecraft.core.BlockPos; import net.minecraft.util.RandomSource; @@ -26,10 +24,10 @@ import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.material.FluidState; -final class BakedModelBufferer { +final class BlockStateModelBufferer { private static final ThreadLocal THREAD_LOCAL_OBJECTS = ThreadLocal.withInitial(ThreadLocalObjects::new); - private BakedModelBufferer() { + private BlockStateModelBufferer() { } public static SimpleModel bufferModel(BlockStateModel model, BlockPos pos, BlockAndTintGetter level, BlockState state, @Nullable PoseStack poseStack, BlockMaterialFunction blockMaterialFunction) { @@ -37,21 +35,24 @@ public static SimpleModel bufferModel(BlockStateModel model, BlockPos pos, Block if (poseStack == null) { poseStack = objects.identityPoseStack; } + RandomSource random = objects.random; FabricMeshEmitterManager emitters = objects.emitters; emitters.prepare(blockMaterialFunction); - ChunkSectionLayer defaultLayer = ItemBlockRenderTypes.getChunkRenderType(state); - boolean useAo = Minecraft.useAmbientOcclusion(); + List parts = model.collectParts(random); + // See ModelBlockRenderer#tesselateBlock - boolean defaultAo = useAo && state.getLightEmission() == 0 && model.useAmbientOcclusion(); - model = emitters.prepareForModel(model, defaultLayer, useAo, defaultAo); + boolean useAo = Minecraft.useAmbientOcclusion(); + boolean defaultAo = useAo && state.getLightEmission() == 0 && parts.getFirst().useAmbientOcclusion(); + model = emitters.prepareForModel(model, useAo, defaultAo); + parts = model.collectParts(random); poseStack.pushPose(); Minecraft.getInstance() .getBlockRenderer() .getModelRenderer() - .tesselateBlock(level, model, state, pos, poseStack, emitters, false, OverlayTexture.NO_OVERLAY); + .tesselateBlock(level, parts, state, pos, poseStack, emitters, false, OverlayTexture.NO_OVERLAY); poseStack.popPose(); return emitters.end(); @@ -102,16 +103,15 @@ public static SimpleModel bufferBlocks(Iterator posIterator, BlockAndT if (state.getRenderShape() == RenderShape.MODEL) { BlockStateModel model = renderDispatcher.getBlockModel(state); - - ChunkSectionLayer defaultLayer = ItemBlockRenderTypes.getChunkRenderType(state); + List parts = model.collectParts(random); // See ModelBlockRenderer#tesselateBlock - boolean defaultAo = useAo && state.getLightEmission() == 0 && ((BlockModelPart) parts.getFirst()).useAmbientOcclusion(); - model = emitters.prepareForModel(model, defaultLayer, useAo, defaultAo); + boolean defaultAo = useAo && state.getLightEmission() == 0 && parts.getFirst().useAmbientOcclusion(); + model = emitters.prepareForModel(model, useAo, defaultAo); + parts = model.collectParts(random); poseStack.pushPose(); poseStack.translate(pos.getX(), pos.getY(), pos.getZ()); - List parts = model.collectParts(random); blockRenderer.tesselateBlock(level, parts, state, pos, poseStack, emitters, true, OverlayTexture.NO_OVERLAY); poseStack.popPose(); } diff --git a/fabric/src/lib/java/dev/engine_room/flywheel/lib/model/baked/FabricMeshEmitterManager.java b/fabric/src/lib/java/dev/engine_room/flywheel/lib/model/baked/FabricMeshEmitterManager.java index 57d984d41..e80e21a9f 100644 --- a/fabric/src/lib/java/dev/engine_room/flywheel/lib/model/baked/FabricMeshEmitterManager.java +++ b/fabric/src/lib/java/dev/engine_room/flywheel/lib/model/baked/FabricMeshEmitterManager.java @@ -1,9 +1,6 @@ package dev.engine_room.flywheel.lib.model.baked; -import java.util.function.Supplier; - -import net.minecraft.client.renderer.block.model.BlockStateModel; -import net.minecraft.client.renderer.chunk.ChunkSectionLayer; +import java.util.function.Predicate; import org.jetbrains.annotations.UnknownNullability; import org.jspecify.annotations.Nullable; @@ -13,10 +10,16 @@ import com.mojang.blaze3d.vertex.VertexConsumer; import dev.engine_room.flywheel.lib.model.SimpleModel; +import net.fabricmc.fabric.api.client.model.loading.v1.wrapper.WrapperBlockStateModel; +import net.fabricmc.fabric.api.renderer.v1.mesh.QuadEmitter; +import net.fabricmc.fabric.api.renderer.v1.mesh.QuadTransform; +import net.fabricmc.fabric.api.renderer.v1.mesh.QuadView; import net.fabricmc.fabric.api.util.TriState; -import net.irisshaders.iris.gl.blending.BlendMode; import net.minecraft.client.renderer.block.model.BakedQuad; +import net.minecraft.client.renderer.block.model.BlockStateModel; +import net.minecraft.client.renderer.chunk.ChunkSectionLayer; import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; import net.minecraft.util.RandomSource; import net.minecraft.world.level.BlockAndTintGetter; import net.minecraft.world.level.block.state.BlockState; @@ -35,8 +38,7 @@ class FabricMeshEmitterManager extends MeshEmitterManager implement super(MeshEmitter::new); } - public BlockStateModel prepareForModel(BlockStateModel model, ChunkSectionLayer defaultLayer, boolean useAo, boolean defaultAo) { - this.defaultLayer = defaultLayer; + public BlockStateModel prepareForModel(BlockStateModel model, boolean useAo, boolean defaultAo) { this.useAo = useAo; this.defaultAo = defaultAo; wrapperModel.setWrapped(model); @@ -49,13 +51,12 @@ public SimpleModel end() { return super.end(); } - private void prepareForGeometry(RenderMaterial material) { - BlendMode blendMode = material.blendMode(); - RenderType layer = blendMode == BlendMode.DEFAULT ? defaultLayer : blendMode.blockRenderLayer; - boolean shade = !material.disableDiffuse(); - TriState aoMode = material.ambientOcclusion(); + private void prepareForGeometry(QuadView quad) { + ChunkSectionLayer renderLayer = quad.renderLayer(); + boolean shade = !quad.diffuseShade(); + TriState aoMode = quad.ambientOcclusion(); boolean ao = useAo && aoMode.orElse(defaultAo); - currentDelegate = getBuffer(layer, shade, ao); + currentDelegate = getBuffer(renderLayer, shade, ao); } @Override @@ -74,6 +75,14 @@ public VertexConsumer setColor(int red, int green, int blue, int alpha) { return this; } + @Override + public VertexConsumer setColor(int color) { + if (currentDelegate != null) { + currentDelegate.setColor(color); + } + return this; + } + @Override public VertexConsumer setUv(float u, float v) { if (currentDelegate != null) { @@ -106,6 +115,14 @@ public VertexConsumer setNormal(float x, float y, float z) { return this; } + @Override + public VertexConsumer setLineWidth(float f) { + if (currentDelegate != null) { + currentDelegate.setLineWidth(f); + } + return this; + } + @Override public void addVertex(float x, float y, float z, int color, float u, float v, int packedOverlay, int packedLight, float normalX, float normalY, float normalZ) { if (currentDelegate != null) { @@ -127,26 +144,21 @@ public void putBulkData(PoseStack.Pose pose, BakedQuad quad, float[] brightness, } } - private class WrapperModel extends ForwardingBakedModel { - private final RenderContext.QuadTransform quadTransform = quad -> { - FabricMeshEmitterManager.this.prepareForGeometry(quad.material()); + private class WrapperModel extends WrapperBlockStateModel { + private final QuadTransform quadTransform = quad -> { + FabricMeshEmitterManager.this.prepareForGeometry(quad); return true; }; - public void setWrapped(@Nullable BakedModel wrapped) { + public void setWrapped(@Nullable BlockStateModel wrapped) { this.wrapped = wrapped; } @Override - public boolean isVanillaAdapter() { - return false; - } - - @Override - public void emitBlockQuads(BlockAndTintGetter level, BlockState state, BlockPos pos, Supplier randomSupplier, RenderContext context) { - context.pushTransform(quadTransform); - super.emitBlockQuads(level, state, pos, randomSupplier, context); - context.popTransform(); + public void emitQuads(QuadEmitter emitter, BlockAndTintGetter blockView, BlockPos pos, BlockState state, RandomSource random, Predicate<@Nullable Direction> cullTest) { + emitter.pushTransform(quadTransform); + super.emitQuads(emitter, blockView, pos, state, random, cullTest); + emitter.popTransform(); } } } diff --git a/fabric/src/lib/java/dev/engine_room/flywheel/lib/model/baked/ModelBuilderImpl.java b/fabric/src/lib/java/dev/engine_room/flywheel/lib/model/baked/ModelBuilderImpl.java index dad85c46a..741aa54c3 100644 --- a/fabric/src/lib/java/dev/engine_room/flywheel/lib/model/baked/ModelBuilderImpl.java +++ b/fabric/src/lib/java/dev/engine_room/flywheel/lib/model/baked/ModelBuilderImpl.java @@ -14,10 +14,10 @@ private ModelBuilderImpl() { public static SimpleModel buildBlockModelBuilder(BlockModelBuilder builder) { BlockState blockState = builder.level.getBlockState(builder.pos); - return BakedModelBufferer.bufferModel(builder.blockModel, builder.pos, builder.level, blockState, builder.poseStack, builder.materialFunc); + return BlockStateModelBufferer.bufferModel(builder.blockModel, builder.pos, builder.level, blockState, builder.poseStack, builder.materialFunc); } public static SimpleModel buildLevelModelBuilder(LevelModelBuilder builder) { - return BakedModelBufferer.bufferBlocks(builder.positions.iterator(), builder.level, builder.poseStack, builder.renderFluids, builder.materialFunc); + return BlockStateModelBufferer.bufferBlocks(builder.positions.iterator(), builder.level, builder.poseStack, builder.renderFluids, builder.materialFunc); } } diff --git a/gradle.properties b/gradle.properties index 5748736f2..d356c8f06 100644 --- a/gradle.properties +++ b/gradle.properties @@ -38,7 +38,7 @@ parchment_version = 2025.10.12 minecraft_version = 1.21.11 neoforge_version = 21.11.0-beta fabric_loader_version = 0.18.2 -fabric_api_version = 0.139.4+1.21.11 +fabric_api_version = 0.140.2+1.21.11 # Build dependency mod versions enable_sodium_and_iris = true diff --git a/neoforge/src/lib/java/dev/engine_room/flywheel/lib/model/baked/BakedModelBufferer.java b/neoforge/src/lib/java/dev/engine_room/flywheel/lib/model/baked/BlockStateModelBufferer.java similarity index 81% rename from neoforge/src/lib/java/dev/engine_room/flywheel/lib/model/baked/BakedModelBufferer.java rename to neoforge/src/lib/java/dev/engine_room/flywheel/lib/model/baked/BlockStateModelBufferer.java index 842f740e6..7ff1b753a 100644 --- a/neoforge/src/lib/java/dev/engine_room/flywheel/lib/model/baked/BakedModelBufferer.java +++ b/neoforge/src/lib/java/dev/engine_room/flywheel/lib/model/baked/BlockStateModelBufferer.java @@ -16,7 +16,6 @@ import net.minecraft.client.renderer.block.model.BlockModelPart; import net.minecraft.client.renderer.block.model.BlockStateModel; import net.minecraft.client.renderer.chunk.ChunkSectionLayer; -import net.minecraft.client.renderer.rendertype.RenderType; import net.minecraft.client.renderer.texture.OverlayTexture; import net.minecraft.core.BlockPos; import net.minecraft.util.RandomSource; @@ -25,12 +24,12 @@ import net.minecraft.world.level.block.RenderShape; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.material.FluidState; -import net.neoforged.neoforge.model.data.ModelData; +import net.neoforged.neoforge.client.config.NeoForgeClientConfig; -final class BakedModelBufferer { +final class BlockStateModelBufferer { private static final ThreadLocal THREAD_LOCAL_OBJECTS = ThreadLocal.withInitial(ThreadLocalObjects::new); - private BakedModelBufferer() { + private BlockStateModelBufferer() { } public static SimpleModel bufferModel(BlockStateModel model, BlockPos pos, BlockAndTintGetter level, BlockState state, @Nullable PoseStack poseStack, BlockMaterialFunction blockMaterialFunction) { @@ -54,12 +53,12 @@ public static SimpleModel bufferModel(BlockStateModel model, BlockPos pos, Block ChunkSectionLayer layer = parts.getFirst().getRenderType(state); // See ModelBlockRenderer#tesselateBlock - boolean defaultAo = state.getLightEmission(level, pos) == 0; boolean aoEnabled = Minecraft.useAmbientOcclusion(); - + boolean perPartAO = NeoForgeClientConfig.INSTANCE.handleAmbientOcclusionPerPart.getAsBoolean(); + boolean defaultAo = state.getLightEmission(level, pos) == 0; TriState useAo = parts.getFirst().ambientOcclusion(); - boolean defaultAoLayer = aoEnabled && (useAo.isTrue() || (useAo.isDefault() && defaultAo)); + boolean defaultAoLayer = aoEnabled && ((perPartAO && useAo.isTrue()) || (useAo.isDefault() && defaultAo)); NeoforgeMeshEmitter emitter = emitters.getEmitter(layer); emitter.prepareForModelLayer(defaultAoLayer); @@ -116,27 +115,27 @@ public static SimpleModel bufferBlocks(Iterator posIterator, BlockAndT if (state.getRenderShape() == RenderShape.MODEL) { long seed = state.getSeed(pos); - BlockStateModel model = renderDispatcher.getBlockModel(state); - ModelData modelData = model.getModelData(level, pos, state, level.getModelData(pos)); random.setSeed(seed); - ChunkRenderTypeSet renderTypes = model.getRenderTypes(state, random, modelData); + + BlockStateModel model = renderDispatcher.getBlockModel(state); + List parts = model.collectParts(level, pos, state, random); + + ChunkSectionLayer layer = ItemBlockRenderTypes.getChunkRenderType(state); // See ModelBlockRenderer#tesselateBlock + boolean perPartAO = NeoForgeClientConfig.INSTANCE.handleAmbientOcclusionPerPart.getAsBoolean(); boolean defaultAo = state.getLightEmission(level, pos) == 0; + TriState useAo = parts.getFirst().ambientOcclusion(); - for (RenderType renderType : renderTypes) { - TriState useAo = model.useAmbientOcclusion(state, modelData, renderType); + boolean defaultAoLayer = aoEnabled && ((perPartAO && useAo.isTrue()) || (useAo.isDefault() && defaultAo)); - boolean defaultAoLayer = aoEnabled && (useAo.isTrue() || (useAo.isDefault() && defaultAo)); + NeoforgeMeshEmitter emitter = emitters.getEmitter(layer); + emitter.prepareForModelLayer(defaultAoLayer); - NeoforgeMeshEmitter emitter = emitters.getEmitter(renderType); - emitter.prepareForModelLayer(defaultAoLayer); - - poseStack.pushPose(); - poseStack.translate(pos.getX(), pos.getY(), pos.getZ()); - blockRenderer.tesselateBlock(level, model, state, pos, poseStack, emitter, true, random, seed, OverlayTexture.NO_OVERLAY, modelData, renderType); - poseStack.popPose(); - } + poseStack.pushPose(); + poseStack.translate(pos.getX(), pos.getY(), pos.getZ()); + blockRenderer.tesselateBlock(level, parts, state, pos, poseStack, emitter, true, OverlayTexture.NO_OVERLAY); + poseStack.popPose(); } } diff --git a/neoforge/src/lib/java/dev/engine_room/flywheel/lib/model/baked/ModelBuilderImpl.java b/neoforge/src/lib/java/dev/engine_room/flywheel/lib/model/baked/ModelBuilderImpl.java index 6e92d1766..741aa54c3 100644 --- a/neoforge/src/lib/java/dev/engine_room/flywheel/lib/model/baked/ModelBuilderImpl.java +++ b/neoforge/src/lib/java/dev/engine_room/flywheel/lib/model/baked/ModelBuilderImpl.java @@ -14,10 +14,10 @@ private ModelBuilderImpl() { public static SimpleModel buildBlockModelBuilder(BlockModelBuilder builder) { BlockState blockState = builder.level.getBlockState(builder.pos); - return BakedModelBufferer.bufferModel(builder.blockStateModel, builder.pos, builder.level, blockState, builder.poseStack, builder.materialFunc); + return BlockStateModelBufferer.bufferModel(builder.blockModel, builder.pos, builder.level, blockState, builder.poseStack, builder.materialFunc); } public static SimpleModel buildLevelModelBuilder(LevelModelBuilder builder) { - return BakedModelBufferer.bufferBlocks(builder.positions.iterator(), builder.level, builder.poseStack, builder.renderFluids, builder.materialFunc); + return BlockStateModelBufferer.bufferBlocks(builder.positions.iterator(), builder.level, builder.poseStack, builder.renderFluids, builder.materialFunc); } } diff --git a/neoforge/src/lib/java/dev/engine_room/flywheel/lib/model/baked/NeoforgeMeshEmitter.java b/neoforge/src/lib/java/dev/engine_room/flywheel/lib/model/baked/NeoforgeMeshEmitter.java index 4e443239c..46a56d58d 100644 --- a/neoforge/src/lib/java/dev/engine_room/flywheel/lib/model/baked/NeoforgeMeshEmitter.java +++ b/neoforge/src/lib/java/dev/engine_room/flywheel/lib/model/baked/NeoforgeMeshEmitter.java @@ -1,7 +1,7 @@ package dev.engine_room.flywheel.lib.model.baked; import org.jetbrains.annotations.ApiStatus; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; import com.mojang.blaze3d.vertex.BufferBuilder; import com.mojang.blaze3d.vertex.PoseStack; diff --git a/vanillinFabric/src/main/java/dev/engine_room/vanillin/VanillinXplatImpl.java b/vanillinFabric/src/main/java/dev/engine_room/vanillin/VanillinXplatImpl.java index df1cf7db7..8a853a672 100644 --- a/vanillinFabric/src/main/java/dev/engine_room/vanillin/VanillinXplatImpl.java +++ b/vanillinFabric/src/main/java/dev/engine_room/vanillin/VanillinXplatImpl.java @@ -1,6 +1,6 @@ package dev.engine_room.vanillin; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; import dev.engine_room.vanillin.fabric.mixin.item.ItemColorsAccessor; import dev.engine_room.vanillin.fabric.mixin.item.MinecraftAccessor; From cb51e7f0607bcb0b4cece08584161502d3d675e4 Mon Sep 17 00:00:00 2001 From: IThundxr Date: Sat, 27 Dec 2025 21:44:44 -0500 Subject: [PATCH 14/59] 1.21.1 Porting IX --- .../dev/engine_room/vanillin/item/ItemModels.java | 13 +++++++------ .../dev/engine_room/vanillin/VanillinFabric.java | 4 ++-- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/common/src/vanillin/java/dev/engine_room/vanillin/item/ItemModels.java b/common/src/vanillin/java/dev/engine_room/vanillin/item/ItemModels.java index 7dca45116..1dff8a2c8 100644 --- a/common/src/vanillin/java/dev/engine_room/vanillin/item/ItemModels.java +++ b/common/src/vanillin/java/dev/engine_room/vanillin/item/ItemModels.java @@ -7,11 +7,11 @@ import java.util.List; import java.util.Set; -import org.jspecify.annotations.Nullable; import org.joml.Matrix3f; import org.joml.Matrix4f; import org.joml.Vector3f; import org.joml.Vector4f; +import org.jspecify.annotations.Nullable; import org.lwjgl.system.MemoryStack; import com.mojang.blaze3d.vertex.DefaultVertexFormat; @@ -38,6 +38,7 @@ import net.minecraft.client.renderer.ItemBlockRenderTypes; import net.minecraft.client.renderer.block.model.BakedQuad; import net.minecraft.client.renderer.block.model.ItemOverrides; +import net.minecraft.client.renderer.item.ItemModel; import net.minecraft.client.renderer.texture.OverlayTexture; import net.minecraft.client.resources.model.BakedModel; import net.minecraft.client.resources.model.ModelResourceLocation; @@ -45,6 +46,7 @@ import net.minecraft.client.resources.model.SimpleBakedModel; import net.minecraft.client.resources.model.WeightedBakedModel; import net.minecraft.core.Direction; +import net.minecraft.core.component.DataComponents; import net.minecraft.core.registries.Registries; import net.minecraft.data.models.ItemModelGenerators; import net.minecraft.resources.ResourceLocation; @@ -60,7 +62,7 @@ import net.minecraft.world.level.block.StainedGlassPaneBlock; public class ItemModels { - public static final TagKey NO_INSTANCING = TagKey.create(Registries.ITEM, Vanillin.rl("no_instancing")); + public static final TagKey NO_INSTANCING = TagKey.create(Registries.ITEM, Vanillin.id("no_instancing")); private static final Model EMPTY_MODEL = new SimpleModel(List.of()); private static final RendererReloadCache MESH_CACHE = new RendererReloadCache<>(key -> bakeMesh(key.model(), key.displayContext())); @@ -100,11 +102,10 @@ private static boolean doesNotHaveItemColors(Item item) { return VanillinXplat.INSTANCE.itemColors(item) == null; } - public static BakedModel getModel(ItemStack stack) { + public static ItemModel getModel(ItemStack stack) { return Minecraft.getInstance() - .getItemRenderer() - .getItemModelShaper() - .getItemModel(stack); + .getModelManager() + .getItemModel(stack.get(DataComponents.ITEM_MODEL)); } @Nullable diff --git a/vanillinFabric/src/main/java/dev/engine_room/vanillin/VanillinFabric.java b/vanillinFabric/src/main/java/dev/engine_room/vanillin/VanillinFabric.java index ca9ffca6d..77ac5acc2 100644 --- a/vanillinFabric/src/main/java/dev/engine_room/vanillin/VanillinFabric.java +++ b/vanillinFabric/src/main/java/dev/engine_room/vanillin/VanillinFabric.java @@ -3,7 +3,7 @@ import dev.engine_room.flywheel.api.event.ReloadLevelRendererCallback; import dev.engine_room.vanillin.item.SodiumAnimatedTextureCompat; import net.fabricmc.api.ClientModInitializer; -import net.fabricmc.fabric.api.client.rendering.v1.WorldRenderEvents; +import net.fabricmc.fabric.api.client.rendering.v1.world.WorldRenderEvents; public class VanillinFabric implements ClientModInitializer { @Override @@ -14,6 +14,6 @@ public void onInitializeClient() { FabricVanillinConfig.INSTANCE.save(); ReloadLevelRendererCallback.EVENT.register(level -> SodiumAnimatedTextureCompat.onReloadRenderer()); - WorldRenderEvents.START.register(context -> SodiumAnimatedTextureCompat.beginFrame()); + WorldRenderEvents.START_MAIN.register(context -> SodiumAnimatedTextureCompat.beginFrame()); } } From 843af3336005a70873a7bdfe79c775f1457a0fee Mon Sep 17 00:00:00 2001 From: PepperCode1 <44146161+PepperCode1@users.noreply.github.com> Date: Thu, 8 Jan 2026 12:36:14 -0800 Subject: [PATCH 15/59] Partial(lyPorted)Model --- .../visualization/VisualizationManager.java | 1 + .../flywheel/backend/NoiseTextures.java | 6 +- .../backend/compile/FlwProgramsReloader.java | 4 + .../backend/engine/MaterialRenderState.java | 187 +++++++----------- .../backend/engine/TextureBinder.java | 43 ++-- .../engine/indirect/IndirectDrawManager.java | 6 - .../engine/indirect/OitFramebuffer.java | 24 ++- .../instancing/InstancedDrawManager.java | 6 - .../backend/engine/uniform/FogUniforms.java | 16 +- .../backend/engine/uniform/LevelUniforms.java | 12 +- .../backend/engine/uniform/UniformWriter.java | 4 +- .../flywheel/backend/gl/GlStateTracker.java | 5 +- .../flywheel/backend/gl/GlTextureUnit.java | 17 +- .../backend/gl/array/GlVertexArray.java | 3 +- .../glsl/generate/GlslVertexInput.java | 2 +- .../flywheel/backend/glsl/span/ErrorSpan.java | 2 +- .../backend/mixin/FogRendererMixin.java | 11 +- .../flywheel/backend/mixin/LightingMixin.java | 8 +- .../backend/mixin/RenderSystemMixin.java | 2 +- .../flywheel/flywheel/internal/common.frag | 2 +- .../flywheel/internal/uniforms/fog.glsl | 6 +- .../flywheel/internal/uniforms/level.glsl | 5 +- .../resources/flywheel.backend.mixins.json | 16 +- .../flywheel/lib/internal/FlwLibLink.java | 8 +- .../flywheel/lib/internal/FlwLibXplat.java | 4 + .../flywheel/lib/material/Materials.java | 29 ++- .../flywheel/lib/model/ModelUtil.java | 32 +-- .../model/baked/BlockMaterialFunction.java | 2 +- .../lib/model/baked/BlockModelBuilder.java | 2 +- .../model/baked/EmptyVirtualBlockGetter.java | 2 +- .../lib/model/baked/LevelModelBuilder.java | 2 +- .../flywheel/lib/model/baked/MeshEmitter.java | 15 +- .../lib/model/baked/MeshEmitterManager.java | 23 +-- .../lib/model/baked/PartialModel.java | 33 ++-- .../baked/TransformingVertexConsumer.java | 4 +- .../flywheel/lib/model/part/VertexWriter.java | 2 +- .../flywheel/lib/util/IdentifierUtil.java | 6 +- .../lib/visual/AbstractEntityVisual.java | 2 +- .../lib/visual/EntityVisibilityTester.java | 2 +- .../lib/visual/component/HitboxComponent.java | 1 + .../flywheel/impl/FlwDebugInfo.java | 3 +- .../flywheel/impl/FlwLibLinkImpl.java | 32 +-- .../impl/mixin/LevelRendererMixin.java | 9 +- .../VisualizationManagerImpl.java | 4 +- .../engine_room/vanillin/VanillaVisuals.java | 20 +- .../engine_room/vanillin/VanillinXplat.java | 5 - .../vanillin/elements/HitboxElement.java | 1 + .../mixin/item/ItemOverridesAccessor.java | 13 -- .../vanillin/visuals/ChestVisual.java | 1 + .../vanillin/visuals/ItemFrameVisual.java | 37 ++-- .../vanillin/resources/vanillin.mixins.json | 3 +- docs/flywheel/api/stage/fragment.glsl | 3 +- docs/flywheel/api/uniforms/fog.glsl | 6 +- docs/flywheel/api/uniforms/level.glsl | 5 +- .../backend/compile/FlwProgramsReloader.java | 27 --- .../model/baked/BlockStateModelBufferer.java | 22 +-- .../lib/model/baked/FabricMeshEmitter.java | 118 +++++++++++ .../model/baked/FabricMeshEmitterManager.java | 103 +--------- .../lib/model/baked/FabricPartialModel.java | 74 +++++++ .../model/baked/PartialModelEventHandler.java | 56 ------ .../flywheel/impl/FlwCommands.java | 9 +- .../flywheel/impl/FlwLibXplatImpl.java | 13 +- .../flywheel/impl/FlywheelFabric.java | 16 +- .../mixin/fabric/DebugScreenOverlayMixin.java | 26 --- .../impl/mixin/fabric/MinecraftMixin.java | 3 +- .../model/baked/BlockStateModelBufferer.java | 66 +++---- ...hEmitter.java => NeoForgeMeshEmitter.java} | 37 +--- .../baked/NeoForgeMeshEmitterManager.java | 24 +++ .../lib/model/baked/NeoForgePartialModel.java | 62 ++++++ .../model/baked/PartialModelEventHandler.java | 30 --- .../flywheel/impl/FlwLibXplatImpl.java | 11 +- .../flywheel/impl/FlywheelNeoForge.java | 20 +- .../neoforge/ModelBlockRendererMixin.java | 22 +-- .../flywheel.impl.neoforge.mixins.json | 13 -- .../flywheel/FlywheelTestModClient.java | 2 +- 75 files changed, 716 insertions(+), 737 deletions(-) rename {neoforge => common}/src/backend/java/dev/engine_room/flywheel/backend/compile/FlwProgramsReloader.java (77%) delete mode 100644 common/src/vanillin/java/dev/engine_room/vanillin/mixin/item/ItemOverridesAccessor.java delete mode 100644 fabric/src/backend/java/dev/engine_room/flywheel/backend/compile/FlwProgramsReloader.java create mode 100644 fabric/src/lib/java/dev/engine_room/flywheel/lib/model/baked/FabricMeshEmitter.java create mode 100644 fabric/src/lib/java/dev/engine_room/flywheel/lib/model/baked/FabricPartialModel.java delete mode 100644 fabric/src/lib/java/dev/engine_room/flywheel/lib/model/baked/PartialModelEventHandler.java delete mode 100644 fabric/src/main/java/dev/engine_room/flywheel/impl/mixin/fabric/DebugScreenOverlayMixin.java rename neoforge/src/lib/java/dev/engine_room/flywheel/lib/model/baked/{NeoforgeMeshEmitter.java => NeoForgeMeshEmitter.java} (66%) create mode 100644 neoforge/src/lib/java/dev/engine_room/flywheel/lib/model/baked/NeoForgeMeshEmitterManager.java create mode 100644 neoforge/src/lib/java/dev/engine_room/flywheel/lib/model/baked/NeoForgePartialModel.java delete mode 100644 neoforge/src/lib/java/dev/engine_room/flywheel/lib/model/baked/PartialModelEventHandler.java delete mode 100644 neoforge/src/main/resources/flywheel.impl.neoforge.mixins.json diff --git a/common/src/api/java/dev/engine_room/flywheel/api/visualization/VisualizationManager.java b/common/src/api/java/dev/engine_room/flywheel/api/visualization/VisualizationManager.java index 07a2b72a6..c6d215169 100644 --- a/common/src/api/java/dev/engine_room/flywheel/api/visualization/VisualizationManager.java +++ b/common/src/api/java/dev/engine_room/flywheel/api/visualization/VisualizationManager.java @@ -57,6 +57,7 @@ interface RenderDispatcher { */ void onStartLevelRender(RenderContext ctx); + // TODO 1.21.11: update method name and doc /** * Render instances. * diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/NoiseTextures.java b/common/src/backend/java/dev/engine_room/flywheel/backend/NoiseTextures.java index 8b3688a1a..9228289cd 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/NoiseTextures.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/NoiseTextures.java @@ -36,17 +36,19 @@ public static void reload(ResourceManager manager) { .open()) { var image = NativeImage.read(NativeImage.Format.LUMINANCE, is); + // TODO 1.21.11: maybe we should not use DynamicTexture here and do gen/upload manually BLUE_NOISE = new DynamicTexture(() -> "Flywheel Blue Noise", image); GlTextureUnit.T0.makeActive(); GlStateManager._bindTexture(((GlTexture) BLUE_NOISE.getTexture()).glId()); - NoiseTextures.BLUE_NOISE.setFilter(true, false); + GlStateManager._texParameter(GL32.GL_TEXTURE_2D, GL32.GL_TEXTURE_MIN_FILTER, GL32.GL_LINEAR); + GlStateManager._texParameter(GL32.GL_TEXTURE_2D, GL32.GL_TEXTURE_MAG_FILTER, GL32.GL_LINEAR); GlStateManager._texParameter(GL32.GL_TEXTURE_2D, GL32.GL_TEXTURE_WRAP_S, GL32.GL_REPEAT); GlStateManager._texParameter(GL32.GL_TEXTURE_2D, GL32.GL_TEXTURE_WRAP_T, GL32.GL_REPEAT); GlStateManager._bindTexture(0); - } catch (IOException ignored) { + } catch (IOException e) { } } diff --git a/neoforge/src/backend/java/dev/engine_room/flywheel/backend/compile/FlwProgramsReloader.java b/common/src/backend/java/dev/engine_room/flywheel/backend/compile/FlwProgramsReloader.java similarity index 77% rename from neoforge/src/backend/java/dev/engine_room/flywheel/backend/compile/FlwProgramsReloader.java rename to common/src/backend/java/dev/engine_room/flywheel/backend/compile/FlwProgramsReloader.java index e3350f108..23017874b 100644 --- a/neoforge/src/backend/java/dev/engine_room/flywheel/backend/compile/FlwProgramsReloader.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/compile/FlwProgramsReloader.java @@ -1,10 +1,14 @@ package dev.engine_room.flywheel.backend.compile; import dev.engine_room.flywheel.backend.NoiseTextures; +import dev.engine_room.flywheel.lib.util.IdentifierUtil; +import net.minecraft.resources.Identifier; import net.minecraft.server.packs.resources.ResourceManager; import net.minecraft.server.packs.resources.ResourceManagerReloadListener; public final class FlwProgramsReloader implements ResourceManagerReloadListener { + public static final Identifier ID = IdentifierUtil.id("programs"); + public static final FlwProgramsReloader INSTANCE = new FlwProgramsReloader(); private FlwProgramsReloader() { diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/engine/MaterialRenderState.java b/common/src/backend/java/dev/engine_room/flywheel/backend/engine/MaterialRenderState.java index 468f75e04..5ed0ce1a4 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/engine/MaterialRenderState.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/engine/MaterialRenderState.java @@ -4,18 +4,14 @@ import org.jspecify.annotations.Nullable; import org.lwjgl.opengl.GL11; -import org.lwjgl.opengl.GL32; -import org.lwjgl.opengl.GL33C; import com.mojang.blaze3d.opengl.GlConst; import com.mojang.blaze3d.opengl.GlSampler; import com.mojang.blaze3d.opengl.GlStateManager; -import com.mojang.blaze3d.opengl.GlTexture; +import com.mojang.blaze3d.opengl.GlTextureView; import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.textures.FilterMode; import com.mojang.blaze3d.textures.GpuSampler; -import com.mojang.blaze3d.textures.GpuTexture; -import com.mojang.blaze3d.textures.GpuTextureView; import dev.engine_room.flywheel.api.material.DepthTest; import dev.engine_room.flywheel.api.material.Material; @@ -52,29 +48,18 @@ public static void setupOit(Material material) { } private static void setupTexture(Material material) { - Samplers.DIFFUSE.makeActive(); AbstractTexture texture = Minecraft.getInstance() .getTextureManager() .getTexture(material.texture()); - GpuTextureView textureView = texture.getTextureView(); - GlTexture glTexture = ((GlTexture) texture.getTexture()); - int i; - if ((glTexture.usage() & GpuTexture.USAGE_CUBEMAP_COMPATIBLE) != 0) { - i = GL32.GL_TEXTURE_CUBE_MAP; - GL11.glBindTexture(i, glTexture.glId()); - } else { - i = GL32.GL_TEXTURE_2D; - GlStateManager._bindTexture(glTexture.glId()); - } - + // TODO 1.21.11: give the Material more control, such as using default filter mode, address modes, AF, max LOD? FilterMode filterMode = material.blur() ? FilterMode.LINEAR : FilterMode.NEAREST; - GpuSampler textureSampler = texture.getSampler(); + GpuSampler defaultSampler = texture.getSampler(); GlSampler sampler = (GlSampler) RenderSystem.getSamplerCache() - .getSampler(textureSampler.getAddressModeU(), textureSampler.getAddressModeV(), filterMode, filterMode, material.mipmap()); - GL33C.glBindSampler(Samplers.DIFFUSE.number, sampler.getId()); - GlStateManager._texParameter(i, GL32.GL_TEXTURE_BASE_LEVEL, textureView.baseMipLevel()); - GlStateManager._texParameter(i, GL32.GL_TEXTURE_MAX_LEVEL, textureView.baseMipLevel() + textureView.mipLevels() - 1); + .getSampler(defaultSampler.getAddressModeU(), defaultSampler.getAddressModeV(), filterMode, filterMode, material.mipmap()); + + /// TODO 1.21.11: should cubemap textures be allowed? + TextureBinder.bind(Samplers.DIFFUSE.number, (GlTextureView) texture.getTextureView(), sampler); } private static void setupBackfaceCulling(boolean backfaceCulling) { @@ -97,69 +82,69 @@ private static void setupPolygonOffset(boolean polygonOffset) { private static void setupDepthTest(DepthTest depthTest) { switch (depthTest) { - case OFF -> { - GlStateManager._disableDepthTest(); - } - case NEVER -> { - GlStateManager._enableDepthTest(); - GlStateManager._depthFunc(GL11.GL_NEVER); - } - case LESS -> { - GlStateManager._enableDepthTest(); - GlStateManager._depthFunc(GL11.GL_LESS); - } - case EQUAL -> { - GlStateManager._enableDepthTest(); - GlStateManager._depthFunc(GL11.GL_EQUAL); - } - case LEQUAL -> { - GlStateManager._enableDepthTest(); - GlStateManager._depthFunc(GL11.GL_LEQUAL); - } - case GREATER -> { - GlStateManager._enableDepthTest(); - GlStateManager._depthFunc(GL11.GL_GREATER); - } - case NOTEQUAL -> { - GlStateManager._enableDepthTest(); - GlStateManager._depthFunc(GL11.GL_NOTEQUAL); - } - case GEQUAL -> { - GlStateManager._enableDepthTest(); - GlStateManager._depthFunc(GL11.GL_GEQUAL); - } - case ALWAYS -> { - GlStateManager._enableDepthTest(); - GlStateManager._depthFunc(GL11.GL_ALWAYS); - } + case OFF -> { + GlStateManager._disableDepthTest(); + } + case NEVER -> { + GlStateManager._enableDepthTest(); + GlStateManager._depthFunc(GL11.GL_NEVER); + } + case LESS -> { + GlStateManager._enableDepthTest(); + GlStateManager._depthFunc(GL11.GL_LESS); + } + case EQUAL -> { + GlStateManager._enableDepthTest(); + GlStateManager._depthFunc(GL11.GL_EQUAL); + } + case LEQUAL -> { + GlStateManager._enableDepthTest(); + GlStateManager._depthFunc(GL11.GL_LEQUAL); + } + case GREATER -> { + GlStateManager._enableDepthTest(); + GlStateManager._depthFunc(GL11.GL_GREATER); + } + case NOTEQUAL -> { + GlStateManager._enableDepthTest(); + GlStateManager._depthFunc(GL11.GL_NOTEQUAL); + } + case GEQUAL -> { + GlStateManager._enableDepthTest(); + GlStateManager._depthFunc(GL11.GL_GEQUAL); + } + case ALWAYS -> { + GlStateManager._enableDepthTest(); + GlStateManager._depthFunc(GL11.GL_ALWAYS); + } } } private static void setupTransparency(Transparency transparency) { switch (transparency) { - case OPAQUE -> { - GlStateManager._disableBlend(); - } - case ADDITIVE -> { - GlStateManager._enableBlend(); - GlStateManager._blendFuncSeparate(GlConst.GL_ONE, GlConst.GL_ONE, GlConst.GL_ONE, GlConst.GL_ONE); - } - case LIGHTNING -> { - GlStateManager._enableBlend(); - GlStateManager._blendFuncSeparate(GlConst.GL_SRC_ALPHA, GlConst.GL_ONE, GlConst.GL_SRC_ALPHA, GlConst.GL_ONE); - } - case GLINT -> { - GlStateManager._enableBlend(); - GlStateManager._blendFuncSeparate(GlConst.GL_SRC_COLOR, GlConst.GL_ONE, GlConst.GL_ZERO, GlConst.GL_ONE); - } - case CRUMBLING -> { - GlStateManager._enableBlend(); - GlStateManager._blendFuncSeparate(GlConst.GL_DST_COLOR, GlConst.GL_SRC_COLOR, GlConst.GL_ONE, GlConst.GL_ZERO); - } - case TRANSLUCENT -> { - GlStateManager._enableBlend(); - GlStateManager._blendFuncSeparate(GlConst.GL_SRC_ALPHA, GlConst.GL_ONE_MINUS_SRC_ALPHA, GlConst.GL_ONE, GlConst.GL_ONE_MINUS_SRC_ALPHA); - } + case OPAQUE -> { + GlStateManager._disableBlend(); + } + case ADDITIVE -> { + GlStateManager._enableBlend(); + GlStateManager._blendFuncSeparate(GlConst.GL_ONE, GlConst.GL_ONE, GlConst.GL_ONE, GlConst.GL_ONE); + } + case LIGHTNING -> { + GlStateManager._enableBlend(); + GlStateManager._blendFuncSeparate(GlConst.GL_SRC_ALPHA, GlConst.GL_ONE, GlConst.GL_SRC_ALPHA, GlConst.GL_ONE); + } + case GLINT -> { + GlStateManager._enableBlend(); + GlStateManager._blendFuncSeparate(GlConst.GL_SRC_COLOR, GlConst.GL_ONE, GlConst.GL_ZERO, GlConst.GL_ONE); + } + case CRUMBLING -> { + GlStateManager._enableBlend(); + GlStateManager._blendFuncSeparate(GlConst.GL_DST_COLOR, GlConst.GL_SRC_COLOR, GlConst.GL_ONE, GlConst.GL_ZERO); + } + case TRANSLUCENT -> { + GlStateManager._enableBlend(); + GlStateManager._blendFuncSeparate(GlConst.GL_SRC_ALPHA, GlConst.GL_ONE_MINUS_SRC_ALPHA, GlConst.GL_ONE, GlConst.GL_ONE_MINUS_SRC_ALPHA); + } } } @@ -169,43 +154,6 @@ private static void setupWriteMask(WriteMask mask) { GlStateManager._colorMask(writeColor, writeColor, writeColor, writeColor); } - public static void reset() { - resetTexture(); - resetBackfaceCulling(); - resetPolygonOffset(); - resetDepthTest(); - resetTransparency(); - resetWriteMask(); - } - - private static void resetTexture() { - Samplers.DIFFUSE.makeActive(); - } - - private static void resetBackfaceCulling() { - GlStateManager._enableCull(); - } - - private static void resetPolygonOffset() { - GlStateManager._polygonOffset(0.0F, 0.0F); - GlStateManager._disablePolygonOffset(); - } - - private static void resetDepthTest() { - GlStateManager._disableDepthTest(); - GlStateManager._depthFunc(GL11.GL_LEQUAL); - } - - private static void resetTransparency() { - GlStateManager._disableBlend(); - GlStateManager._blendFuncSeparate(GlConst.GL_SRC_ALPHA, GlConst.GL_ONE_MINUS_SRC_ALPHA, GlConst.GL_ONE, GlConst.GL_ZERO); - } - - private static void resetWriteMask() { - GlStateManager._depthMask(true); - GlStateManager._colorMask(true, true, true, true); - } - public static boolean materialEquals(Material lhs, Material rhs) { if (lhs == rhs) { return true; @@ -317,6 +265,9 @@ public static int compare(Material lhs, Material rhs) { } cmp = lhs.writeMask() .compareTo(rhs.writeMask()); - return cmp; + if (cmp != 0) { + return cmp; + } + return 0; } } diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/engine/TextureBinder.java b/common/src/backend/java/dev/engine_room/flywheel/backend/engine/TextureBinder.java index 4a672a7fd..5d9e6f5ae 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/engine/TextureBinder.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/engine/TextureBinder.java @@ -1,36 +1,49 @@ package dev.engine_room.flywheel.backend.engine; +import org.lwjgl.opengl.GL33C; + +import com.mojang.blaze3d.opengl.GlConst; +import com.mojang.blaze3d.opengl.GlSampler; import com.mojang.blaze3d.opengl.GlStateManager; import com.mojang.blaze3d.opengl.GlTexture; +import com.mojang.blaze3d.opengl.GlTextureView; import com.mojang.blaze3d.systems.RenderSystem; +import com.mojang.blaze3d.textures.FilterMode; +import com.mojang.blaze3d.textures.GpuTexture; import dev.engine_room.flywheel.backend.Samplers; import net.minecraft.client.Minecraft; import net.minecraft.resources.Identifier; public class TextureBinder { + // TODO 1.21.11 public static void bind(Identifier id) { GlStateManager._bindTexture(byName(id)); } - public static void bindLightAndOverlay() { - var gameRenderer = Minecraft.getInstance().gameRenderer; - - Samplers.OVERLAY.makeActive(); - gameRenderer.overlayTexture().setupOverlayColor(); - GlStateManager._bindTexture(RenderSystem.getShaderTexture(1)); - - - Samplers.LIGHT.makeActive(); - gameRenderer.lightTexture().turnOnLightLayer(); - GlStateManager._bindTexture(RenderSystem.getShaderTexture(2)); + // Taken from GlCommandEncoder.trySetup + public static void bind(int unit, GlTextureView textureView, GlSampler sampler) { + GlStateManager._activeTexture(GlConst.GL_TEXTURE0 + unit); + GlTexture texture = textureView.texture(); + int i; + if ((texture.usage() & GpuTexture.USAGE_CUBEMAP_COMPATIBLE) != 0) { + i = GL33C.GL_TEXTURE_CUBE_MAP; + GL33C.glBindTexture(i, texture.glId()); + } else { + i = GL33C.GL_TEXTURE_2D; + GlStateManager._bindTexture(texture.glId()); + } + + GL33C.glBindSampler(unit, sampler.getId()); + GlStateManager._texParameter(i, GL33C.GL_TEXTURE_BASE_LEVEL, textureView.baseMipLevel()); + GlStateManager._texParameter(i, GL33C.GL_TEXTURE_MAX_LEVEL, textureView.baseMipLevel() + textureView.mipLevels() - 1); } - public static void resetLightAndOverlay() { + public static void bindLightAndOverlay() { var gameRenderer = Minecraft.getInstance().gameRenderer; - - gameRenderer.overlayTexture().teardownOverlayColor(); - gameRenderer.lightTexture().turnOffLightLayer(); + GlSampler sampler = (GlSampler) RenderSystem.getSamplerCache().getClampToEdge(FilterMode.LINEAR); + bind(Samplers.OVERLAY.number, (GlTextureView) gameRenderer.overlayTexture().getTextureView(), sampler); + bind(Samplers.LIGHT.number, (GlTextureView) gameRenderer.lightTexture().getTextureView(), sampler); } /** diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/engine/indirect/IndirectDrawManager.java b/common/src/backend/java/dev/engine_room/flywheel/backend/engine/indirect/IndirectDrawManager.java index 5211ba7a9..895fcb68a 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/engine/indirect/IndirectDrawManager.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/engine/indirect/IndirectDrawManager.java @@ -188,9 +188,6 @@ public void render(LightStorage lightStorage, EnvironmentStorage environmentStor oitFramebuffer.composite(); } - - MaterialRenderState.reset(); - TextureBinder.resetLightAndOverlay(); } @Override @@ -277,9 +274,6 @@ public void renderCrumbling(List crumblingBlocks) { } } - MaterialRenderState.reset(); - TextureBinder.resetLightAndOverlay(); - block.free(); } diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/engine/indirect/OitFramebuffer.java b/common/src/backend/java/dev/engine_room/flywheel/backend/engine/indirect/OitFramebuffer.java index 0c0d18246..bf23f4137 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/engine/indirect/OitFramebuffer.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/engine/indirect/OitFramebuffer.java @@ -1,6 +1,7 @@ package dev.engine_room.flywheel.backend.engine.indirect; import org.lwjgl.opengl.GL32; +import org.lwjgl.opengl.GL33C; import org.lwjgl.opengl.GL46; import com.mojang.blaze3d.opengl.GlConst; @@ -63,7 +64,7 @@ public void prepare() { maybeResizeFBO(renderTarget.width, renderTarget.height); Samplers.COEFFICIENTS.makeActive(); - // Bind zero to render system to make sure we clear their internal state + // Bind zero to state manager to make sure we clear its internal state GlStateManager._bindTexture(0); GL32.glBindTexture(GL32.GL_TEXTURE_2D_ARRAY, coefficients); @@ -74,7 +75,8 @@ public void prepare() { GlStateManager._bindTexture(((GlTexture) NoiseTextures.BLUE_NOISE.getTexture()).glId()); GlStateManager._glBindFramebuffer(GL32.GL_FRAMEBUFFER, fbo); - GL32.glFramebufferTexture(GL32.GL_FRAMEBUFFER, GL32.GL_DEPTH_ATTACHMENT, ((GlTexture) renderTarget.getDepthTexture()).glId(), 0); + GlTexture depthTexture = (GlTexture) renderTarget.getDepthTexture(); + GL32.glFramebufferTexture(GL32.GL_FRAMEBUFFER, GL32.GL_DEPTH_ATTACHMENT, depthTexture != null ? depthTexture.glId() : 0, 0); } /** @@ -209,6 +211,16 @@ public void composite() { bindRenderTarget(Minecraft.getInstance().getMainRenderTarget()); } + private static void bindRenderTarget(RenderTarget target) { + GlTexture colorTexture = (GlTexture) target.getColorTexture(); + int i = colorTexture.getFbo( + ((GlDevice) RenderSystem.getDevice()).directStateAccess(), + target.getDepthTexture() + ); + GL32.glBindFramebuffer(GL33C.GL_FRAMEBUFFER, i); + GlStateManager._viewport(0, 0, colorTexture.getWidth(0), colorTexture.getHeight(0)); + } + public void delete() { deleteTextures(); GL32.glDeleteVertexArrays(vao); @@ -243,14 +255,6 @@ private void deleteTextures() { GlStateManager._bindTexture(0); } - private void bindRenderTarget(RenderTarget target) { - int i = ((GlTexture) target.getColorTexture()).getFbo( - ((GlDevice) RenderSystem.getDevice()).directStateAccess(), - target.getDepthTexture() - ); - GL32.glBindFramebuffer(GlConst.GL_FRAMEBUFFER, i); - } - private void maybeResizeFBO(int width, int height) { if (lastWidth == width && lastHeight == height) { return; diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/engine/instancing/InstancedDrawManager.java b/common/src/backend/java/dev/engine_room/flywheel/backend/engine/instancing/InstancedDrawManager.java index efe46c879..5d5a2b2f3 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/engine/instancing/InstancedDrawManager.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/engine/instancing/InstancedDrawManager.java @@ -142,9 +142,6 @@ public void render(LightStorage lightStorage, EnvironmentStorage environmentStor oitFramebuffer.composite(); } - - MaterialRenderState.reset(); - TextureBinder.resetLightAndOverlay(); } private void submitDraws() { @@ -293,9 +290,6 @@ public void renderCrumbling(List crumblingBlocks) { } } } - - MaterialRenderState.reset(); - TextureBinder.resetLightAndOverlay(); } @Override diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/engine/uniform/FogUniforms.java b/common/src/backend/java/dev/engine_room/flywheel/backend/engine/uniform/FogUniforms.java index 0bd3837de..fdeafd4de 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/engine/uniform/FogUniforms.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/engine/uniform/FogUniforms.java @@ -1,20 +1,20 @@ package dev.engine_room.flywheel.backend.engine.uniform; -import org.joml.Vector4f; +import org.joml.Vector4fc; public final class FogUniforms extends UniformWriter { - private static final int SIZE = 4 * 8; + private static final int SIZE = 4 * 10; static final UniformBuffer BUFFER = new UniformBuffer(Uniforms.FOG_INDEX, SIZE); - public static void update(Vector4f color, float environmentalStart, float environmentalEnd, - float renderDistanceStart, float renderDistanceEnd) { + public static void update(Vector4fc color, float environmentalStart, float environmentalEnd, + float renderDistanceStart, float renderDistanceEnd, float skyEnd, float cloudEnd) { long ptr = BUFFER.ptr(); ptr = writeVec4(ptr, color); - ptr = writeFloat(ptr, environmentalStart); - ptr = writeFloat(ptr, environmentalEnd); - ptr = writeFloat(ptr, renderDistanceStart); - ptr = writeFloat(ptr, renderDistanceEnd); + ptr = writeVec2(ptr, environmentalStart, environmentalEnd); + ptr = writeVec2(ptr, renderDistanceStart, renderDistanceEnd); + ptr = writeFloat(ptr, skyEnd); + ptr = writeFloat(ptr, cloudEnd); BUFFER.markDirty(); } diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/engine/uniform/LevelUniforms.java b/common/src/backend/java/dev/engine_room/flywheel/backend/engine/uniform/LevelUniforms.java index dd9656e5d..871cf58b4 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/engine/uniform/LevelUniforms.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/engine/uniform/LevelUniforms.java @@ -11,10 +11,9 @@ import net.minecraft.world.attribute.EnvironmentAttributes; import net.minecraft.world.level.Level; import net.minecraft.world.level.dimension.DimensionType; -import net.minecraft.world.level.dimension.DimensionType.CardinalLightType; public final class LevelUniforms extends UniformWriter { - private static final int SIZE = 16 * 4 + 4 * 12; + private static final int SIZE = 16 * 4 + 4 * 15; static final UniformBuffer BUFFER = new UniformBuffer(Uniforms.LEVEL_INDEX, SIZE); public static final Vector3f LIGHT0_DIRECTION = new Vector3f(); @@ -49,10 +48,16 @@ public static void update(RenderContext context) { float sunAngle = probe.getValue(EnvironmentAttributes.SUN_ANGLE, partialTick); ptr = writeFloat(ptr, sunAngle); + float moonAngle = probe.getValue(EnvironmentAttributes.MOON_ANGLE, partialTick); + ptr = writeFloat(ptr, moonAngle); + float starAngle = probe.getValue(EnvironmentAttributes.STAR_ANGLE, partialTick); + ptr = writeFloat(ptr, starAngle); int moonPhase = probe.getValue(EnvironmentAttributes.MOON_PHASE, partialTick).index(); ptr = writeFloat(ptr, DimensionType.MOON_BRIGHTNESS_PER_PHASE[moonPhase]); ptr = writeInt(ptr, moonPhase); + float starBrightness = probe.getValue(EnvironmentAttributes.STAR_BRIGHTNESS, partialTick); + ptr = writeFloat(ptr, starBrightness); ptr = writeInt(ptr, level.isRaining() ? 1 : 0); ptr = writeFloat(ptr, level.getRainLevel(partialTick)); @@ -61,8 +66,7 @@ public static void update(RenderContext context) { ptr = writeFloat(ptr, level.getSkyDarken()); - CardinalLightType lightType = level.dimensionType().cardinalLightType(); - ptr = writeInt(ptr, lightType == CardinalLightType.NETHER ? 1 : 0); + ptr = writeInt(ptr, level.dimensionType().cardinalLightType().ordinal()); // TODO: use defines for custom dimension ids int dimensionId; diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/engine/uniform/UniformWriter.java b/common/src/backend/java/dev/engine_room/flywheel/backend/engine/uniform/UniformWriter.java index 01b0ca08e..b099c17c6 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/engine/uniform/UniformWriter.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/engine/uniform/UniformWriter.java @@ -2,7 +2,7 @@ import org.joml.Matrix4f; import org.joml.Vector3fc; -import org.joml.Vector4f; +import org.joml.Vector4fc; import org.lwjgl.system.MemoryUtil; import dev.engine_room.flywheel.lib.util.ExtraMemoryOps; @@ -51,7 +51,7 @@ static long writeVec4(long ptr, float x, float y, float z, float w) { return ptr + 16; } - static long writeVec4(long ptr, Vector4f vec) { + static long writeVec4(long ptr, Vector4fc vec) { return writeVec4(ptr, vec.x(), vec.y(), vec.z(), vec.w()); } diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/gl/GlStateTracker.java b/common/src/backend/java/dev/engine_room/flywheel/backend/gl/GlStateTracker.java index dfe5fd69b..f0d74e1f9 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/gl/GlStateTracker.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/gl/GlStateTracker.java @@ -1,6 +1,7 @@ package dev.engine_room.flywheel.backend.gl; -import com.mojang.blaze3d.opengl.GlConst; +import org.lwjgl.opengl.GL33C; + import com.mojang.blaze3d.opengl.GlStateManager; import dev.engine_room.flywheel.backend.gl.buffer.GlBufferType; @@ -39,7 +40,7 @@ public static void _setProgram(int id) { } public static State getRestoreState() { - return new State(BUFFERS.clone(), vao, program, GlStateManagerAccessor.flywheel$getActiveTexture() + GlConst.GL_TEXTURE0); + return new State(BUFFERS.clone(), vao, program, GlStateManagerAccessor.flywheel$getActiveTexture() + GL33C.GL_TEXTURE0); } public static void bindVao(int vao) { diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/gl/GlTextureUnit.java b/common/src/backend/java/dev/engine_room/flywheel/backend/gl/GlTextureUnit.java index 0e0e0658c..41eb0aefa 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/gl/GlTextureUnit.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/gl/GlTextureUnit.java @@ -1,6 +1,7 @@ package dev.engine_room.flywheel.backend.gl; -import com.mojang.blaze3d.opengl.GlConst; +import static org.lwjgl.opengl.GL13.GL_TEXTURE0; + import com.mojang.blaze3d.opengl.GlStateManager; import dev.engine_room.flywheel.backend.mixin.GlStateManagerAccessor; @@ -41,12 +42,14 @@ public enum GlTextureUnit { ; + private static final GlTextureUnit[] VALUES = values(); + public final int number; public final int glEnum; GlTextureUnit(int unit) { this.number = unit; - this.glEnum = GlConst.GL_TEXTURE0 + unit; + this.glEnum = GL_TEXTURE0 + unit; } public void makeActive() { @@ -54,10 +57,14 @@ public void makeActive() { } public static GlTextureUnit getActive() { - return fromGlEnum(GlStateManagerAccessor.flywheel$getActiveTexture()); + return fromIndex(GlStateManagerAccessor.flywheel$getActiveTexture()); + } + + public static GlTextureUnit fromGlEnum(int glEnum) { + return VALUES[glEnum - GL_TEXTURE0]; } - public static GlTextureUnit fromGlEnum(int activeTextureId) { - return GlTextureUnit.values()[activeTextureId]; + public static GlTextureUnit fromIndex(int index) { + return VALUES[index]; } } diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/gl/array/GlVertexArray.java b/common/src/backend/java/dev/engine_room/flywheel/backend/gl/array/GlVertexArray.java index 76fac8209..444d7abb7 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/gl/array/GlVertexArray.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/gl/array/GlVertexArray.java @@ -3,6 +3,7 @@ import java.util.List; import org.lwjgl.opengl.GL32; +import org.lwjgl.opengl.GL33C; import dev.engine_room.flywheel.backend.gl.GlObject; import dev.engine_room.flywheel.backend.gl.GlStateTracker; @@ -39,6 +40,6 @@ public void bindForDraw() { @Override protected void deleteInternal(int handle) { - GL32.glDeleteVertexArrays(handle); + GL33C.glDeleteVertexArrays(handle); } } diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/glsl/generate/GlslVertexInput.java b/common/src/backend/java/dev/engine_room/flywheel/backend/glsl/generate/GlslVertexInput.java index 1c54f01ad..9763026b4 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/glsl/generate/GlslVertexInput.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/glsl/generate/GlslVertexInput.java @@ -22,6 +22,6 @@ public GlslVertexInput name(String name) { @Override public String prettyPrint() { - return "layout(id = " + binding + ") in " + type + " " + name + ";"; + return "layout(location = " + binding + ") in " + type + " " + name + ";"; } } diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/glsl/span/ErrorSpan.java b/common/src/backend/java/dev/engine_room/flywheel/backend/glsl/span/ErrorSpan.java index de4bd9a0e..b975bb2ac 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/glsl/span/ErrorSpan.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/glsl/span/ErrorSpan.java @@ -20,7 +20,7 @@ public ErrorSpan(SourceLines in, CharPos start, CharPos end) { @Override public Span subSpan(int from, int to) { - return new ErrorSpan(in, start, end); // the sub-span of an error is an error in the same id + return new ErrorSpan(in, start, end); // the sub-span of an error is an error in the same location } @Override diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/mixin/FogRendererMixin.java b/common/src/backend/java/dev/engine_room/flywheel/backend/mixin/FogRendererMixin.java index b6cd19ec1..af60a24d4 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/mixin/FogRendererMixin.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/mixin/FogRendererMixin.java @@ -1,20 +1,21 @@ package dev.engine_room.flywheel.backend.mixin; -import java.nio.ByteBuffer; - import org.joml.Vector4f; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import com.llamalad7.mixinextras.sugar.Local; + import dev.engine_room.flywheel.backend.engine.uniform.FogUniforms; +import net.minecraft.client.renderer.fog.FogData; import net.minecraft.client.renderer.fog.FogRenderer; @Mixin(FogRenderer.class) abstract class FogRendererMixin { - @Inject(method = "updateBuffer", at = @At("HEAD")) - private static void flywheel$updateFogUniform(ByteBuffer buffer, int position, Vector4f fogColor, float environmentalStart, float environmentalEnd, float renderDistanceStart, float renderDistanceEnd, float skyEnd, float cloudEnd, CallbackInfo ci) { - FogUniforms.update(fogColor, environmentalStart, environmentalEnd, renderDistanceStart, renderDistanceEnd); + @Inject(method = "setupFog(Lnet/minecraft/client/Camera;ILnet/minecraft/client/DeltaTracker;FLnet/minecraft/client/multiplayer/ClientLevel;)Lorg/joml/Vector4f;", at = @At("RETURN")) + private static void flywheel$onReturnSetupFog(CallbackInfo ci, @Local Vector4f fogColor, @Local FogData fogData) { + FogUniforms.update(fogColor, fogData.environmentalStart, fogData.environmentalEnd, fogData.renderDistanceStart, fogData.renderDistanceEnd, fogData.skyEnd, fogData.cloudEnd); } } diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/mixin/LightingMixin.java b/common/src/backend/java/dev/engine_room/flywheel/backend/mixin/LightingMixin.java index cba6e9cab..3919ac6af 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/mixin/LightingMixin.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/mixin/LightingMixin.java @@ -12,12 +12,10 @@ import dev.engine_room.flywheel.backend.engine.uniform.LevelUniforms; @Mixin(Lighting.class) -public class LightingMixin { - @Inject(method = "updateBuffer", at = @At("HEAD")) - private static void flywheel$updateLightDirection(Entry entry, Vector3f light0, Vector3f light1, CallbackInfo ci) { +abstract class LightingMixin { + @Inject(method = "updateBuffer(Lcom/mojang/blaze3d/platform/Lighting$Entry;Lorg/joml/Vector3f;Lorg/joml/Vector3f;)V", at = @At("HEAD")) + private static void flywheel$onHeadUpdateBuffer(Entry entry, Vector3f light0, Vector3f light1, CallbackInfo ci) { if (entry == Entry.LEVEL) { - // Capture the light directions before they're transformed into screen space - // Basically all usages of assigning light direction go through here so I think this is safe LevelUniforms.LIGHT0_DIRECTION.set(light0); LevelUniforms.LIGHT1_DIRECTION.set(light1); } diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/mixin/RenderSystemMixin.java b/common/src/backend/java/dev/engine_room/flywheel/backend/mixin/RenderSystemMixin.java index 75f5c20ac..cd205ed75 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/mixin/RenderSystemMixin.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/mixin/RenderSystemMixin.java @@ -11,7 +11,7 @@ @Mixin(value = RenderSystem.class, remap = false) abstract class RenderSystemMixin { - @Inject(method = "initRenderer", at = @At("RETURN")) + @Inject(method = "initRenderer(JIZLcom/mojang/blaze3d/shaders/ShaderSource;Z)V", at = @At("RETURN")) private static void flywheel$onInitRenderer(CallbackInfo ci) { GlCompat.init(); } diff --git a/common/src/backend/resources/assets/flywheel/flywheel/internal/common.frag b/common/src/backend/resources/assets/flywheel/flywheel/internal/common.frag index f6652b8b2..e2736fa5b 100644 --- a/common/src/backend/resources/assets/flywheel/flywheel/internal/common.frag +++ b/common/src/backend/resources/assets/flywheel/flywheel/internal/common.frag @@ -74,7 +74,7 @@ float _flw_diffuseFactor() { if (flw_material.cardinalLightingMode == 2u) { return diffuseFromLightDirections(flw_vertexNormal); } else if (flw_material.cardinalLightingMode == 1u) { - if (flw_constantAmbientLight == 1u) { + if (flw_cardinalLightType == 1u) { return diffuseNether(flw_vertexNormal); } else { return diffuse(flw_vertexNormal); diff --git a/common/src/backend/resources/assets/flywheel/flywheel/internal/uniforms/fog.glsl b/common/src/backend/resources/assets/flywheel/flywheel/internal/uniforms/fog.glsl index d6e799773..349ae7c13 100644 --- a/common/src/backend/resources/assets/flywheel/flywheel/internal/uniforms/fog.glsl +++ b/common/src/backend/resources/assets/flywheel/flywheel/internal/uniforms/fog.glsl @@ -1,5 +1,7 @@ layout(std140) uniform _FlwFogUniforms { vec4 flw_fogColor; - vec2 flw_environmentalRange; - vec2 flw_renderDistanceRange; + vec2 flw_fogEnvironmentalRange; + vec2 flw_fogRenderDistanceRange; + float flw_fogSkyEnd; + float flw_fogCloudEnd; }; diff --git a/common/src/backend/resources/assets/flywheel/flywheel/internal/uniforms/level.glsl b/common/src/backend/resources/assets/flywheel/flywheel/internal/uniforms/level.glsl index 231196aac..1e41e7c1e 100644 --- a/common/src/backend/resources/assets/flywheel/flywheel/internal/uniforms/level.glsl +++ b/common/src/backend/resources/assets/flywheel/flywheel/internal/uniforms/level.glsl @@ -13,10 +13,13 @@ layout(std140) uniform _FlwLevelUniforms { uint flw_levelHasSkyLight; float flw_sunAngle; + float flw_moonAngle; + float flw_starAngle; float flw_moonBrightness; /** There are normally only 8 moon phases. */ uint flw_moonPhase; + float flw_starBrightness; uint flw_isRaining; float flw_rainLevel; @@ -25,7 +28,7 @@ layout(std140) uniform _FlwLevelUniforms { float flw_skyDarken; - uint flw_constantAmbientLight; + uint flw_cardinalLightType; /** Use FLW_DIMENSION_* ids to determine the dimension. May eventually be implemented for custom dimensions. */ uint flw_dimension; diff --git a/common/src/backend/resources/flywheel.backend.mixins.json b/common/src/backend/resources/flywheel.backend.mixins.json index cd7b13f55..d46f95b8f 100644 --- a/common/src/backend/resources/flywheel.backend.mixins.json +++ b/common/src/backend/resources/flywheel.backend.mixins.json @@ -1,10 +1,10 @@ { - "required" : true, - "minVersion" : "0.8", - "package" : "dev.engine_room.flywheel.backend.mixin", - "compatibilityLevel" : "JAVA_21", - "refmap" : "backend-flywheel.refmap.json", - "client" : [ + "required": true, + "minVersion": "0.8", + "package": "dev.engine_room.flywheel.backend.mixin", + "compatibilityLevel": "JAVA_21", + "refmap": "backend-flywheel.refmap.json", + "client": [ "AbstractClientPlayerAccessor", "FogRendererMixin", "GlStateManagerAccessor", @@ -18,7 +18,7 @@ "light.SkyDataLayerStorageMapAccessor", "light.SkyLightSectionStorageMixin" ], - "injectors" : { - "defaultRequire" : 1 + "injectors": { + "defaultRequire": 1 } } diff --git a/common/src/lib/java/dev/engine_room/flywheel/lib/internal/FlwLibLink.java b/common/src/lib/java/dev/engine_room/flywheel/lib/internal/FlwLibLink.java index 9b85a8819..d8355e9f5 100644 --- a/common/src/lib/java/dev/engine_room/flywheel/lib/internal/FlwLibLink.java +++ b/common/src/lib/java/dev/engine_room/flywheel/lib/internal/FlwLibLink.java @@ -27,6 +27,10 @@ public interface FlwLibLink { Deque getPoseStack(PoseStack stack); + boolean affectedByCulling(T entity); + + AABB getBoundingBoxForCulling(T entity); + boolean isIrisLoaded(); boolean isOptifineInstalled(); @@ -34,8 +38,4 @@ public interface FlwLibLink { boolean isShaderPackInUse(); boolean isRenderingShadowPass(); - - boolean isAffectedByCulling(T entity); - - AABB getCullingBoundingBox(T entity); } diff --git a/common/src/lib/java/dev/engine_room/flywheel/lib/internal/FlwLibXplat.java b/common/src/lib/java/dev/engine_room/flywheel/lib/internal/FlwLibXplat.java index d59eed38f..caa75a6ef 100644 --- a/common/src/lib/java/dev/engine_room/flywheel/lib/internal/FlwLibXplat.java +++ b/common/src/lib/java/dev/engine_room/flywheel/lib/internal/FlwLibXplat.java @@ -4,10 +4,14 @@ import dev.engine_room.flywheel.lib.model.SimpleModel; import dev.engine_room.flywheel.lib.model.baked.BlockModelBuilder; import dev.engine_room.flywheel.lib.model.baked.LevelModelBuilder; +import dev.engine_room.flywheel.lib.model.baked.PartialModel; +import net.minecraft.resources.Identifier; public interface FlwLibXplat { FlwLibXplat INSTANCE = DependencyInjection.load(FlwLibXplat.class, "dev.engine_room.flywheel.impl.FlwLibXplatImpl"); + PartialModel createPartialModel(Identifier modelId); + SimpleModel buildBlockModelBuilder(BlockModelBuilder builder); SimpleModel buildLevelModelBuilder(LevelModelBuilder builder); diff --git a/common/src/lib/java/dev/engine_room/flywheel/lib/material/Materials.java b/common/src/lib/java/dev/engine_room/flywheel/lib/material/Materials.java index 92b19239c..d8d768339 100644 --- a/common/src/lib/java/dev/engine_room/flywheel/lib/material/Materials.java +++ b/common/src/lib/java/dev/engine_room/flywheel/lib/material/Materials.java @@ -6,7 +6,9 @@ import dev.engine_room.flywheel.api.material.Transparency; import dev.engine_room.flywheel.api.material.WriteMask; import net.minecraft.client.renderer.entity.ItemRenderer; +import net.minecraft.client.renderer.texture.TextureAtlas; +// FIXME 1.21.11: use default blur/mipmap from AbstractTexture for all materials here, and by default public final class Materials { public static final Material SOLID_BLOCK = SimpleMaterial.builder() .build(); @@ -15,14 +17,14 @@ public final class Materials { .build(); public static final Material CUTOUT_BLOCK = SimpleMaterial.builder() - .cutout(CutoutShaders.ONE_TENTH) - .mipmap(false) + .cutout(CutoutShaders.HALF) .build(); public static final Material CUTOUT_UNSHADED_BLOCK = SimpleMaterial.builderOf(CUTOUT_BLOCK) .cardinalLightingMode(CardinalLightingMode.OFF) .build(); public static final Material TRANSLUCENT_BLOCK = SimpleMaterial.builder() + .cutout(CutoutShaders.EPSILON) .transparency(Transparency.ORDER_INDEPENDENT) .build(); public static final Material TRANSLUCENT_UNSHADED_BLOCK = SimpleMaterial.builderOf(TRANSLUCENT_BLOCK) @@ -38,34 +40,25 @@ public final class Materials { .build(); public static final Material GLINT = SimpleMaterial.builder() - .texture(ItemRenderer.ENCHANTED_GLINT_ITEM) - .shaders(StandardMaterialShaders.GLINT) - .writeMask(WriteMask.COLOR) - .depthTest(DepthTest.EQUAL) - .backfaceCulling(false) - .blur(true) - .mipmap(false) - .build(); - - public static final Material TRANSLUCENT_GLINT = SimpleMaterial.builder() .texture(ItemRenderer.ENCHANTED_GLINT_ITEM) .shaders(StandardMaterialShaders.GLINT) .transparency(Transparency.GLINT) .writeMask(WriteMask.COLOR) .depthTest(DepthTest.EQUAL) .backfaceCulling(false) - .blur(true) - .mipmap(false) .build(); + // FIXME 1.21.11: missing TextureTransform.ENTITY_GLINT_TEXTURING public static final Material GLINT_ENTITY = SimpleMaterial.builderOf(GLINT) - .texture(ItemRenderer.ENCHANTED_GLINT_ARMOR) .build(); - public static final Material TRANSLUCENT_ENTITY = SimpleMaterial.builder() + public static final Material TRANSLUCENT_ITEM_ENTITY_BLOCK = SimpleMaterial.builder() + .transparency(Transparency.TRANSLUCENT) + .build(); + + public static final Material TRANSLUCENT_ITEM_ENTITY_ITEM = SimpleMaterial.builder() + .texture(TextureAtlas.LOCATION_ITEMS) .transparency(Transparency.TRANSLUCENT) - .cutout(CutoutShaders.ONE_TENTH) - .mipmap(false) .build(); private Materials() { diff --git a/common/src/lib/java/dev/engine_room/flywheel/lib/model/ModelUtil.java b/common/src/lib/java/dev/engine_room/flywheel/lib/model/ModelUtil.java index 7313849c0..5cfdd0d76 100644 --- a/common/src/lib/java/dev/engine_room/flywheel/lib/model/ModelUtil.java +++ b/common/src/lib/java/dev/engine_room/flywheel/lib/model/ModelUtil.java @@ -2,9 +2,9 @@ import java.util.Collection; -import org.jspecify.annotations.Nullable; import org.joml.Vector3f; import org.joml.Vector4f; +import org.jspecify.annotations.Nullable; import dev.engine_room.flywheel.api.material.CardinalLightingMode; import dev.engine_room.flywheel.api.material.Material; @@ -23,14 +23,14 @@ public final class ModelUtil { private static final float BOUNDING_SPHERE_EPSILON = 1e-4f; - private static final ChunkSectionLayer[] CHUNK_LAYERS = new ChunkSectionLayer[]{ChunkSectionLayer.SOLID, ChunkSectionLayer.CUTOUT, ChunkSectionLayer.TRANSLUCENT, ChunkSectionLayer.TRIPWIRE}; + private static final ChunkSectionLayer[] CHUNK_LAYERS = ChunkSectionLayer.values(); // Array of chunk materials to make lookups easier. // Index by (renderTypeIdx * 4 + shaded * 2 + ambientOcclusion). - private static final Material[] CHUNK_MATERIALS = new Material[20]; + private static final Material[] CHUNK_MATERIALS = new Material[16]; static { - Material[] baseChunkMaterials = new Material[]{Materials.SOLID_BLOCK, Materials.CUTOUT_BLOCK, Materials.TRANSLUCENT_BLOCK, Materials.TRIPWIRE_BLOCK}; + Material[] baseChunkMaterials = new Material[]{Materials.SOLID_BLOCK, Materials.CUTOUT_BLOCK, Materials.TRANSLUCENT_BLOCK, Materials.TRIPWIRE_BLOCK,}; for (int chunkLayerIdx = 0; chunkLayerIdx < CHUNK_LAYERS.length; chunkLayerIdx++) { int baseMaterialIdx = chunkLayerIdx * 4; Material baseChunkMaterial = baseChunkMaterials[chunkLayerIdx]; @@ -57,14 +57,14 @@ private ModelUtil() { } @Nullable - public static Material getMaterial(ChunkSectionLayer chunkRenderType, boolean shaded) { - return getMaterial(chunkRenderType, shaded, true); + public static Material getMaterial(ChunkSectionLayer chunkSectionLayer, boolean shaded) { + return getMaterial(chunkSectionLayer, shaded, true); } @Nullable - public static Material getMaterial(ChunkSectionLayer chunkRenderType, boolean shaded, boolean ambientOcclusion) { + public static Material getMaterial(ChunkSectionLayer chunkSectionLayer, boolean shaded, boolean ambientOcclusion) { for (int chunkLayerIdx = 0; chunkLayerIdx < CHUNK_LAYERS.length; ++chunkLayerIdx) { - if (chunkRenderType == CHUNK_LAYERS[chunkLayerIdx]) { + if (chunkSectionLayer == CHUNK_LAYERS[chunkLayerIdx]) { int shadedIdx = shaded ? 1 : 0; int ambientOcclusionIdx = ambientOcclusion ? 1 : 0; @@ -86,16 +86,18 @@ public static Material getItemMaterial(RenderType renderType) { return Materials.SOLID_BLOCK; } - if (renderType == Sheets.translucentBlockItemSheet() || renderType == Sheets.translucentItemSheet()) { - return Materials.TRANSLUCENT_ENTITY; + if (renderType == Sheets.translucentBlockItemSheet()) { + return Materials.TRANSLUCENT_ITEM_ENTITY_BLOCK; } - if (renderType == RenderTypes.glint()) { - return Materials.GLINT; + + if (renderType == Sheets.translucentItemSheet()) { + return Materials.TRANSLUCENT_ITEM_ENTITY_ITEM; } - if (renderType == RenderTypes.glintTranslucent()) { - return Materials.TRANSLUCENT_GLINT; + + if (renderType == RenderTypes.glint() || renderType == RenderTypes.glintTranslucent()) { + return Materials.GLINT; } - if (renderType == RenderTypes.entityGlint() || renderType == RenderTypes.armorEntityGlint()) { + if (renderType == RenderTypes.entityGlint()) { return Materials.GLINT_ENTITY; } return null; diff --git a/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/BlockMaterialFunction.java b/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/BlockMaterialFunction.java index f438d03be..a99c3dec7 100644 --- a/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/BlockMaterialFunction.java +++ b/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/BlockMaterialFunction.java @@ -7,5 +7,5 @@ public interface BlockMaterialFunction { @Nullable - Material apply(ChunkSectionLayer chunkRenderType, boolean shaded, boolean ambientOcclusion); + Material apply(ChunkSectionLayer chunkSectionLayer, boolean shaded, boolean ambientOcclusion); } diff --git a/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/BlockModelBuilder.java b/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/BlockModelBuilder.java index 2bd1a62aa..0b0e77270 100644 --- a/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/BlockModelBuilder.java +++ b/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/BlockModelBuilder.java @@ -48,7 +48,7 @@ public BlockModelBuilder poseStack(@Nullable PoseStack poseStack) { @Deprecated(forRemoval = true) public BlockModelBuilder materialFunc(@Nullable BiFunction materialFunc) { if (materialFunc != null) { - this.materialFunc = (chunkRenderType, shaded, ambientOcclusion) -> materialFunc.apply(chunkRenderType, shaded); + this.materialFunc = (chunkSectionLayer, shaded, ambientOcclusion) -> materialFunc.apply(chunkSectionLayer, shaded); } else { this.materialFunc = null; } diff --git a/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/EmptyVirtualBlockGetter.java b/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/EmptyVirtualBlockGetter.java index de57dbda6..1bd6829c4 100644 --- a/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/EmptyVirtualBlockGetter.java +++ b/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/EmptyVirtualBlockGetter.java @@ -41,7 +41,7 @@ public final int getHeight() { } @Override - public int getMinY() { + public final int getMinY() { return 0; } } diff --git a/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/LevelModelBuilder.java b/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/LevelModelBuilder.java index 1447e36d9..3748c3ba5 100644 --- a/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/LevelModelBuilder.java +++ b/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/LevelModelBuilder.java @@ -41,7 +41,7 @@ public LevelModelBuilder renderFluids(boolean renderFluids) { @Deprecated(forRemoval = true) public LevelModelBuilder materialFunc(@Nullable BiFunction materialFunc) { if (materialFunc != null) { - this.materialFunc = (chunkRenderType, shaded, ambientOcclusion) -> materialFunc.apply(chunkRenderType, shaded); + this.materialFunc = (chunkSectionLayer, shaded, ambientOcclusion) -> materialFunc.apply(chunkSectionLayer, shaded); } else { this.materialFunc = null; } diff --git a/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/MeshEmitter.java b/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/MeshEmitter.java index 036d75ef4..094af2030 100644 --- a/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/MeshEmitter.java +++ b/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/MeshEmitter.java @@ -3,18 +3,20 @@ import java.util.Arrays; import org.jetbrains.annotations.UnknownNullability; +import org.jspecify.annotations.Nullable; import com.google.common.collect.ImmutableList; import com.mojang.blaze3d.pipeline.RenderPipeline; import com.mojang.blaze3d.vertex.BufferBuilder; import com.mojang.blaze3d.vertex.ByteBufferBuilder; +import com.mojang.blaze3d.vertex.VertexConsumer; import dev.engine_room.flywheel.api.material.Material; import dev.engine_room.flywheel.api.model.Mesh; import dev.engine_room.flywheel.api.model.Model; import net.minecraft.client.renderer.chunk.ChunkSectionLayer; -class MeshEmitter { +abstract class MeshEmitter implements VertexConsumer { private static final int INITIAL_CAPACITY = 1; private final ByteBufferBuilderStack byteBufferBuilderStack; @@ -105,6 +107,17 @@ public BufferBuilder getBuffer(Material material) { return bufferBuilder; } + // TODO 1.21.11: cache the last used buffer? + @Nullable + public BufferBuilder getBuffer(boolean shade, boolean ao) { + Material key = blockMaterialFunction.apply(chunkSectionLayer, shade, ao); + if (key != null) { + return getBuffer(key); + } else { + return null; + } + } + private void resize(int capacity) { BufferBuilder[] newBufferBuilders = new BufferBuilder[capacity]; Material[] newMaterials = new Material[capacity]; diff --git a/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/MeshEmitterManager.java b/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/MeshEmitterManager.java index 195e20e7d..9a8103f99 100644 --- a/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/MeshEmitterManager.java +++ b/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/MeshEmitterManager.java @@ -2,13 +2,8 @@ import java.util.function.BiFunction; -import org.jspecify.annotations.Nullable; -import org.jetbrains.annotations.UnknownNullability; - import com.google.common.collect.ImmutableList; -import com.mojang.blaze3d.vertex.BufferBuilder; -import dev.engine_room.flywheel.api.material.Material; import dev.engine_room.flywheel.api.model.Model; import dev.engine_room.flywheel.lib.model.SimpleModel; import it.unimi.dsi.fastutil.objects.Reference2ReferenceArrayMap; @@ -18,12 +13,9 @@ class MeshEmitterManager { private static final ChunkSectionLayer[] CHUNK_LAYERS = ChunkSectionLayer.values(); - private final Reference2ReferenceMap emitterMap = new Reference2ReferenceArrayMap<>(); + final Reference2ReferenceMap emitterMap = new Reference2ReferenceArrayMap<>(); private final ByteBufferBuilderStack byteBufferBuilderStack = new ByteBufferBuilderStack(); - @UnknownNullability - private BlockMaterialFunction blockMaterialFunction; - MeshEmitterManager(BiFunction meshEmitterFactory) { for (ChunkSectionLayer chunkSectionLayer : CHUNK_LAYERS) { emitterMap.put(chunkSectionLayer, meshEmitterFactory.apply(byteBufferBuilderStack, chunkSectionLayer)); @@ -35,7 +27,6 @@ public T getEmitter(ChunkSectionLayer chunkSectionLayer) { } public void prepare(BlockMaterialFunction blockMaterialFunction) { - this.blockMaterialFunction = blockMaterialFunction; byteBufferBuilderStack.reset(); for (MeshEmitter emitter : emitterMap.values()) { @@ -50,8 +41,6 @@ public void prepareForBlock() { } public SimpleModel end() { - blockMaterialFunction = null; - ImmutableList.Builder meshes = ImmutableList.builder(); for (MeshEmitter emitter : emitterMap.values()) { @@ -60,14 +49,4 @@ public SimpleModel end() { return new SimpleModel(meshes.build()); } - - @Nullable - public BufferBuilder getBuffer(ChunkSectionLayer chunkSectionLayer, boolean shade, boolean ao) { - Material key = blockMaterialFunction.apply(chunkSectionLayer, shade, ao); - if (key != null) { - return emitterMap.get(chunkSectionLayer).getBuffer(key); - } else { - return null; - } - } } diff --git a/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/PartialModel.java b/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/PartialModel.java index 231f3da40..3ab6be8cb 100644 --- a/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/PartialModel.java +++ b/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/PartialModel.java @@ -1,41 +1,34 @@ package dev.engine_room.flywheel.lib.model.baked; -import java.util.concurrent.ConcurrentMap; - +import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.UnknownNullability; -import com.google.common.collect.MapMaker; - import dev.engine_room.flywheel.lib.internal.FlwLibXplat; -import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.block.model.BlockStateModel; +import net.minecraft.client.renderer.block.model.SimpleModelWrapper; import net.minecraft.resources.Identifier; /** * A helper class for loading and accessing JSON models not directly used by any blocks or items. - *
- * Creating a PartialModel will make Minecraft automatically load the associated modelLocation. - *
- * Once Minecraft has finished baking all models, all PartialModels will have their blockStateModel fields populated. + * + *

Creating a PartialModel will make Minecraft automatically load the associated modelId and bake the model as a + * {@link SimpleModelWrapper}. + * + *

Once Minecraft has finished baking all models, all PartialModels will have their blockStateModel fields populated. + * Newly created PartialModels will contain a null model until the next resource reload is finished. */ -public final class PartialModel { - static final ConcurrentMap ALL = new MapMaker().weakValues().makeMap(); - static boolean populateOnInit = false; - - private final Identifier modelId; +@ApiStatus.NonExtendable +public class PartialModel { + final Identifier modelId; @UnknownNullability BlockStateModel blockStateModel; - private PartialModel(Identifier modelId) { + PartialModel(Identifier modelId) { this.modelId = modelId; - - if (populateOnInit) { - blockStateModel = FlwLibXplat.INSTANCE.getBakedModel(Minecraft.getInstance().getModelManager(), modelId); - } } public static PartialModel of(Identifier modelId) { - return ALL.computeIfAbsent(modelId, PartialModel::new); + return FlwLibXplat.INSTANCE.createPartialModel(modelId); } @UnknownNullability diff --git a/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/TransformingVertexConsumer.java b/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/TransformingVertexConsumer.java index 7b92b550e..d8af3dea1 100644 --- a/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/TransformingVertexConsumer.java +++ b/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/TransformingVertexConsumer.java @@ -76,8 +76,8 @@ public VertexConsumer setNormal(float x, float y, float z) { } @Override - public VertexConsumer setLineWidth(float f) { - delegate.setLineWidth(f); + public VertexConsumer setLineWidth(float width) { + delegate.setLineWidth(width); return this; } } diff --git a/common/src/lib/java/dev/engine_room/flywheel/lib/model/part/VertexWriter.java b/common/src/lib/java/dev/engine_room/flywheel/lib/model/part/VertexWriter.java index 744fda0c6..cb526fbc1 100644 --- a/common/src/lib/java/dev/engine_room/flywheel/lib/model/part/VertexWriter.java +++ b/common/src/lib/java/dev/engine_room/flywheel/lib/model/part/VertexWriter.java @@ -90,7 +90,7 @@ public VertexConsumer setNormal(float x, float y, float z) { } @Override - public VertexConsumer setLineWidth(float f) { + public VertexConsumer setLineWidth(float width) { // ignore line width return this; } diff --git a/common/src/lib/java/dev/engine_room/flywheel/lib/util/IdentifierUtil.java b/common/src/lib/java/dev/engine_room/flywheel/lib/util/IdentifierUtil.java index a2a2e0e2e..3a9d0f983 100644 --- a/common/src/lib/java/dev/engine_room/flywheel/lib/util/IdentifierUtil.java +++ b/common/src/lib/java/dev/engine_room/flywheel/lib/util/IdentifierUtil.java @@ -2,16 +2,12 @@ import com.mojang.brigadier.StringReader; import com.mojang.brigadier.exceptions.CommandSyntaxException; -import com.mojang.brigadier.exceptions.SimpleCommandExceptionType; import dev.engine_room.flywheel.api.Flywheel; import net.minecraft.IdentifierException; -import net.minecraft.network.chat.Component; import net.minecraft.resources.Identifier; public final class IdentifierUtil { - private static final SimpleCommandExceptionType ERROR_INVALID = new SimpleCommandExceptionType(Component.translatable("argument.id.invalid")); - private IdentifierUtil() { } @@ -53,7 +49,7 @@ public static Identifier readFlywheelDefault(StringReader reader) throws Command return parseFlywheelDefault(s); } catch (IdentifierException e) { reader.setCursor(i); - throw ERROR_INVALID.createWithContext(reader); + throw Identifier.ERROR_INVALID.createWithContext(reader); } } diff --git a/common/src/lib/java/dev/engine_room/flywheel/lib/visual/AbstractEntityVisual.java b/common/src/lib/java/dev/engine_room/flywheel/lib/visual/AbstractEntityVisual.java index 17be50263..fcc235ab3 100644 --- a/common/src/lib/java/dev/engine_room/flywheel/lib/visual/AbstractEntityVisual.java +++ b/common/src/lib/java/dev/engine_room/flywheel/lib/visual/AbstractEntityVisual.java @@ -90,7 +90,7 @@ public Vector3f getVisualPosition(float partialTick) { } public boolean isVisible(FrustumIntersection frustum) { - return FlwLibLink.INSTANCE.isAffectedByCulling(entity) || visibilityTester.check(frustum); + return !FlwLibLink.INSTANCE.affectedByCulling(entity) || visibilityTester.check(frustum); } protected int computePackedLight(float partialTick) { diff --git a/common/src/lib/java/dev/engine_room/flywheel/lib/visual/EntityVisibilityTester.java b/common/src/lib/java/dev/engine_room/flywheel/lib/visual/EntityVisibilityTester.java index d9c3e71af..095b98e24 100644 --- a/common/src/lib/java/dev/engine_room/flywheel/lib/visual/EntityVisibilityTester.java +++ b/common/src/lib/java/dev/engine_room/flywheel/lib/visual/EntityVisibilityTester.java @@ -43,7 +43,7 @@ public EntityVisibilityTester(Entity entity, Vec3i renderOrigin, float scale) { * @return {@code true} if the Entity is visible, {@code false} otherwise. */ public boolean check(FrustumIntersection frustum) { - AABB aabb = FlwLibLink.INSTANCE.getCullingBoundingBox(entity); + AABB aabb = FlwLibLink.INSTANCE.getBoundingBoxForCulling(entity); // If we've never seen the entity before assume its visible. // Fixes entities freezing when they first spawn. diff --git a/common/src/lib/java/dev/engine_room/flywheel/lib/visual/component/HitboxComponent.java b/common/src/lib/java/dev/engine_room/flywheel/lib/visual/component/HitboxComponent.java index bfa0c095f..99887fefc 100644 --- a/common/src/lib/java/dev/engine_room/flywheel/lib/visual/component/HitboxComponent.java +++ b/common/src/lib/java/dev/engine_room/flywheel/lib/visual/component/HitboxComponent.java @@ -16,6 +16,7 @@ import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.LivingEntity; +// TODO 1.21.11: vanilla changed hitbox rendering and moved it to the debug renderer system (EntityHitboxDebugRenderer) public final class HitboxComponent implements EntityComponent { // 010------110 // /| /| diff --git a/common/src/main/java/dev/engine_room/flywheel/impl/FlwDebugInfo.java b/common/src/main/java/dev/engine_room/flywheel/impl/FlwDebugInfo.java index f623ae21f..5733af886 100644 --- a/common/src/main/java/dev/engine_room/flywheel/impl/FlwDebugInfo.java +++ b/common/src/main/java/dev/engine_room/flywheel/impl/FlwDebugInfo.java @@ -253,10 +253,9 @@ private static void addOpenGLDebugInfo(StringBuilder out) { } public static class FlwDebugEntry implements DebugScreenEntry { - // TODO - Check if this should use a group instead + // TODO 1.21.11: Check if this should use a group instead, and if this information should be split across multiple entries @Override public void display(DebugScreenDisplayer displayer, @Nullable Level level, @Nullable LevelChunk clientChunk, @Nullable LevelChunk serverChunk) { - displayer.addLine(""); displayer.addLine("Flywheel: " + FlwImplXplat.INSTANCE.getVersionStr()); displayer.addLine("Backend: " + BackendManagerImpl.getBackendString()); displayer.addLine("Update limiting: " + (FlwConfig.INSTANCE.limitUpdates() ? "on" : "off")); diff --git a/common/src/main/java/dev/engine_room/flywheel/impl/FlwLibLinkImpl.java b/common/src/main/java/dev/engine_room/flywheel/impl/FlwLibLinkImpl.java index 2cf5c8e98..cb8f3ddb3 100644 --- a/common/src/main/java/dev/engine_room/flywheel/impl/FlwLibLinkImpl.java +++ b/common/src/main/java/dev/engine_room/flywheel/impl/FlwLibLinkImpl.java @@ -48,6 +48,22 @@ public Deque getPoseStack(PoseStack stack) { return ((PoseStackAccessor) stack).flywheel$getPoseStack(); } + @Override + public boolean affectedByCulling(T entity) { + EntityRenderer renderer = Minecraft.getInstance() + .getEntityRenderDispatcher() + .getRenderer(entity); + return ((EntityRendererAccessor) renderer).flywheel$affectedByCulling(entity); + } + + @Override + public AABB getBoundingBoxForCulling(T entity) { + EntityRenderer renderer = Minecraft.getInstance() + .getEntityRenderDispatcher() + .getRenderer(entity); + return ((EntityRendererAccessor) renderer).flywheel$getBoundingBoxForCulling(entity); + } + @Override public boolean isIrisLoaded() { return IrisCompat.ACTIVE; @@ -79,20 +95,4 @@ public boolean isRenderingShadowPass() { return false; } } - - @Override - public boolean isAffectedByCulling(T entity) { - EntityRenderer renderer = Minecraft.getInstance() - .getEntityRenderDispatcher() - .getRenderer(entity); - return ((EntityRendererAccessor) renderer).flywheel$affectedByCulling(entity); - } - - @Override - public AABB getCullingBoundingBox(T entity) { - EntityRenderer renderer = Minecraft.getInstance() - .getEntityRenderDispatcher() - .getRenderer(entity); - return ((EntityRendererAccessor) renderer).flywheel$getBoundingBoxForCulling(entity); - } } diff --git a/common/src/main/java/dev/engine_room/flywheel/impl/mixin/LevelRendererMixin.java b/common/src/main/java/dev/engine_room/flywheel/impl/mixin/LevelRendererMixin.java index 73088ba69..db8186e9a 100644 --- a/common/src/main/java/dev/engine_room/flywheel/impl/mixin/LevelRendererMixin.java +++ b/common/src/main/java/dev/engine_room/flywheel/impl/mixin/LevelRendererMixin.java @@ -52,8 +52,8 @@ abstract class LevelRendererMixin { // @Inject(method = "renderLevel", at = @At("HEAD")) @Inject(method = "renderLevel", at = @At(value = "INVOKE_ASSIGN", target = "Lnet/minecraft/world/level/lighting/LevelLightEngine;runLightUpdates()I")) - private void flywheel$beginRender(GraphicsResourceAllocator graphicsResourceAllocator, DeltaTracker deltaTracker, boolean renderBlockOutline, Camera camera, Matrix4f frustumMatrix, Matrix4f projectionMatrix, Matrix4f cullingProjectionMatrix, GpuBufferSlice shaderFog, Vector4f fogColor, boolean renderSky, CallbackInfo ci) { - flywheel$renderContext = RenderContextImpl.create((LevelRenderer) (Object) this, level, renderBuffers, frustumMatrix, projectionMatrix, camera, deltaTracker.getGameTimeDeltaPartialTick(false)); + private void flywheel$beginRender(GraphicsResourceAllocator resourceAllocator, DeltaTracker deltaTracker, boolean renderOutline, Camera camera, Matrix4f modelViewMatrix, Matrix4f projectionMatrix, Matrix4f cullingProjectionMatrix, GpuBufferSlice shaderFog, Vector4f fogColor, boolean renderSky, CallbackInfo ci) { + flywheel$renderContext = RenderContextImpl.create((LevelRenderer) (Object) this, level, renderBuffers, modelViewMatrix, projectionMatrix, camera, deltaTracker.getGameTimeDeltaPartialTick(false)); VisualizationManager manager = VisualizationManager.get(level); if (manager != null) { @@ -73,7 +73,8 @@ abstract class LevelRendererMixin { } } - @Inject(method = "renderLevel", at = @At(value = "INVOKE_STRING", target = "Lnet/minecraft/util/profiling/ProfilerFiller;popPush(Ljava/lang/String;)V", args = "ldc=blockEntities")) + // TODO 1.21.11: update this injection point + @Inject(method = "lambda$addMainPass$1", at = @At(value = "INVOKE_STRING", target = "Lnet/minecraft/util/profiling/ProfilerFiller;popPush(Ljava/lang/String;)V", args = "ldc=submitBlockEntities")) private void flywheel$beforeBlockEntities(CallbackInfo ci) { if (flywheel$renderContext != null) { VisualizationManager manager = VisualizationManager.get(level); @@ -83,7 +84,7 @@ abstract class LevelRendererMixin { } } - @Inject(method = "renderBlockDestroyAnimation", at = @At("HEAD")) + @Inject(method = "lambda$addMainPass$1", at = @At(value = "INVOKE_STRING", target = "Lnet/minecraft/util/profiling/ProfilerFiller;push(Ljava/lang/String;)V", args = "ldc=destroyProgress")) private void flywheel$beforeRenderCrumbling(CallbackInfo ci) { if (flywheel$renderContext != null) { VisualizationManager manager = VisualizationManager.get(level); diff --git a/common/src/main/java/dev/engine_room/flywheel/impl/visualization/VisualizationManagerImpl.java b/common/src/main/java/dev/engine_room/flywheel/impl/visualization/VisualizationManagerImpl.java index 9c91edb0c..4c1002672 100644 --- a/common/src/main/java/dev/engine_room/flywheel/impl/visualization/VisualizationManagerImpl.java +++ b/common/src/main/java/dev/engine_room/flywheel/impl/visualization/VisualizationManagerImpl.java @@ -5,9 +5,9 @@ import java.util.SortedSet; import org.jetbrains.annotations.Contract; -import org.jspecify.annotations.Nullable; import org.joml.FrustumIntersection; import org.joml.Matrix4f; +import org.jspecify.annotations.Nullable; import dev.engine_room.flywheel.api.backend.BackendManager; import dev.engine_room.flywheel.api.backend.Engine; @@ -135,7 +135,7 @@ private LateInit(LevelAccessor level) { private DynamicVisual.Context createVisualFrameContext(RenderContext ctx) { Vec3i renderOrigin = engine.renderOrigin(); var cameraPos = ctx.camera() - .getPosition(); + .position(); Matrix4f viewProjection = new Matrix4f(ctx.viewProjection()); viewProjection.translate((float) (renderOrigin.getX() - cameraPos.x), (float) (renderOrigin.getY() - cameraPos.y), (float) (renderOrigin.getZ() - cameraPos.z)); diff --git a/common/src/vanillin/java/dev/engine_room/vanillin/VanillaVisuals.java b/common/src/vanillin/java/dev/engine_room/vanillin/VanillaVisuals.java index e321dc704..51961bb15 100644 --- a/common/src/vanillin/java/dev/engine_room/vanillin/VanillaVisuals.java +++ b/common/src/vanillin/java/dev/engine_room/vanillin/VanillaVisuals.java @@ -20,7 +20,6 @@ import dev.engine_room.vanillin.visuals.ChestVisual; import dev.engine_room.vanillin.visuals.ItemDisplayVisual; import dev.engine_room.vanillin.visuals.ItemFrameVisual; -import dev.engine_room.vanillin.visuals.ItemVisual; import dev.engine_room.vanillin.visuals.MinecartVisual; import dev.engine_room.vanillin.visuals.ShulkerBoxVisual; import net.minecraft.client.model.geom.ModelLayerLocation; @@ -93,15 +92,16 @@ public static void init() { itemFrame(EntityType.ITEM_FRAME).apply(EXPERIMENTAL); itemFrame(EntityType.GLOW_ITEM_FRAME).apply(EXPERIMENTAL); - composable(EntityType.ITEM).apply(VanillaVisuals::commonElements) - .with(element(VisualElements.FIRE).build()) - .with(element(VisualElements.SHADOW).configure(new ShadowElement.Config(0.15f, 0.75f)) - .build()) - .with(element(VisualElements.ITEM_ENTITY).build()) - .shouldVisualize(((ctx, entity) -> ItemVisual.isSupported(entity))) - .build() - .skipVanillaRender(ItemVisual::isSupported) - .apply(EXPERIMENTAL); + // FIXME 1.21.11: port +// composable(EntityType.ITEM).apply(VanillaVisuals::commonElements) +// .with(element(VisualElements.FIRE).build()) +// .with(element(VisualElements.SHADOW).configure(new ShadowElement.Config(0.15f, 0.75f)) +// .build()) +// .with(element(VisualElements.ITEM_ENTITY).build()) +// .shouldVisualize(((ctx, entity) -> ItemVisual.isSupported(entity))) +// .build() +// .skipVanillaRender(ItemVisual::isSupported) +// .apply(EXPERIMENTAL); } diff --git a/common/src/vanillin/java/dev/engine_room/vanillin/VanillinXplat.java b/common/src/vanillin/java/dev/engine_room/vanillin/VanillinXplat.java index ed5b88c0b..ff1305a3a 100644 --- a/common/src/vanillin/java/dev/engine_room/vanillin/VanillinXplat.java +++ b/common/src/vanillin/java/dev/engine_room/vanillin/VanillinXplat.java @@ -1,16 +1,11 @@ package dev.engine_room.vanillin; -import org.jspecify.annotations.Nullable; - import dev.engine_room.flywheel.api.internal.DependencyInjection; -import net.minecraft.world.item.Item; public interface VanillinXplat { VanillinXplat INSTANCE = DependencyInjection.load(VanillinXplat.class, "dev.engine_room.vanillin.VanillinXplatImpl"); boolean isDevelopmentEnvironment(); - @Nullable ItemColor itemColors(Item item); - boolean isModLoaded(String modId); } diff --git a/common/src/vanillin/java/dev/engine_room/vanillin/elements/HitboxElement.java b/common/src/vanillin/java/dev/engine_room/vanillin/elements/HitboxElement.java index b73523de3..6e024ad80 100644 --- a/common/src/vanillin/java/dev/engine_room/vanillin/elements/HitboxElement.java +++ b/common/src/vanillin/java/dev/engine_room/vanillin/elements/HitboxElement.java @@ -18,6 +18,7 @@ import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.LivingEntity; +// TODO 1.21.11: vanilla changed hitbox rendering and moved it to the debug renderer system (EntityHitboxDebugRenderer) public final class HitboxElement implements Visual, SimpleDynamicVisual { // 010------110 // /| /| diff --git a/common/src/vanillin/java/dev/engine_room/vanillin/mixin/item/ItemOverridesAccessor.java b/common/src/vanillin/java/dev/engine_room/vanillin/mixin/item/ItemOverridesAccessor.java deleted file mode 100644 index e0b1fc167..000000000 --- a/common/src/vanillin/java/dev/engine_room/vanillin/mixin/item/ItemOverridesAccessor.java +++ /dev/null @@ -1,13 +0,0 @@ -package dev.engine_room.vanillin.mixin.item; - -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.gen.Accessor; - -import net.minecraft.client.renderer.block.model.ItemOverrides; -import net.minecraft.resources.ResourceLocation; - -@Mixin(ItemOverrides.class) -public interface ItemOverridesAccessor { - @Accessor("properties") - ResourceLocation[] vanillin$properties(); -} diff --git a/common/src/vanillin/java/dev/engine_room/vanillin/visuals/ChestVisual.java b/common/src/vanillin/java/dev/engine_room/vanillin/visuals/ChestVisual.java index c9f5622a8..623377193 100644 --- a/common/src/vanillin/java/dev/engine_room/vanillin/visuals/ChestVisual.java +++ b/common/src/vanillin/java/dev/engine_room/vanillin/visuals/ChestVisual.java @@ -75,6 +75,7 @@ public ChestVisual(VisualizationContext ctx, T blockEntity, float partialTick) { Block block = blockState.getBlock(); if (block instanceof AbstractChestBlock chestBlock) { ChestType chestType = blockState.hasProperty(ChestBlock.TYPE) ? blockState.getValue(ChestBlock.TYPE) : ChestType.SINGLE; + // TODO 1.21.11: should we be using unchecked casts here? ChestRenderer renderer = (ChestRenderer) Minecraft.getInstance().getBlockEntityRenderDispatcher().getRenderer(blockEntity); net.minecraft.client.resources.model.Material texture = Sheets.chooseMaterial( ((ChestRendererAccessor) renderer).flywheel$getChestMaterial(blockEntity, ChestRenderer.xmasTextures()), diff --git a/common/src/vanillin/java/dev/engine_room/vanillin/visuals/ItemFrameVisual.java b/common/src/vanillin/java/dev/engine_room/vanillin/visuals/ItemFrameVisual.java index 58cd026ed..3db91e950 100644 --- a/common/src/vanillin/java/dev/engine_room/vanillin/visuals/ItemFrameVisual.java +++ b/common/src/vanillin/java/dev/engine_room/vanillin/visuals/ItemFrameVisual.java @@ -1,7 +1,5 @@ package dev.engine_room.vanillin.visuals; -import dev.engine_room.flywheel.lib.model.baked.BlockModelBuilder; - import org.joml.Matrix4f; import dev.engine_room.flywheel.api.model.Model; @@ -9,13 +7,14 @@ import dev.engine_room.flywheel.api.visualization.VisualizationContext; import dev.engine_room.flywheel.lib.instance.InstanceTypes; import dev.engine_room.flywheel.lib.instance.TransformedInstance; +import dev.engine_room.flywheel.lib.model.baked.BlockModelBuilder; import dev.engine_room.flywheel.lib.util.RendererReloadCache; import dev.engine_room.flywheel.lib.visual.AbstractVisual; import dev.engine_room.flywheel.lib.visual.SimpleDynamicVisual; import dev.engine_room.vanillin.item.ItemModels; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.LightTexture; -import net.minecraft.client.renderer.block.model.BlockStateModel; +import net.minecraft.client.renderer.block.BlockModelShaper; import net.minecraft.client.resources.model.BlockStateDefinitions; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; @@ -29,15 +28,21 @@ import net.minecraft.world.level.block.state.BlockState; public class ItemFrameVisual extends AbstractVisual implements EntityVisual, SimpleDynamicVisual { - public static final RendererReloadCache MODEL_RESOURCE_LOCATION = new RendererReloadCache<>(model -> - new BlockModelBuilder(model).build()); + public static final RendererReloadCache BLOCK_STATE = new RendererReloadCache<>(state -> { + BlockModelShaper blockModelShaper = Minecraft.getInstance() + .getModelManager() + .getBlockModelShaper(); + + return new BlockModelBuilder(blockModelShaper.getBlockModel(state)) + .build(); + }); private final Matrix4f baseTransform = new Matrix4f(); private final TransformedInstance frame; private final TransformedInstance item; private final ItemFrame entity; - private BlockStateModel lastFrameModel; + private BlockState lastFrameBlockState; private ItemStack lastItemStack; public ItemFrameVisual(VisualizationContext ctx, ItemFrame entity, float partialTick) { @@ -48,8 +53,8 @@ public ItemFrameVisual(VisualizationContext ctx, ItemFrame entity, float partial lastItemStack = entity.getItem() .copy(); - lastFrameModel = getFrameModel(); - var frameModel = MODEL_RESOURCE_LOCATION.get(lastFrameModel); + lastFrameBlockState = getFrameBlockState(entity, lastItemStack); + var frameModel = BLOCK_STATE.get(lastFrameBlockState); frame = ctx.instancerProvider() .instancer(InstanceTypes.TRANSFORMED, frameModel) @@ -93,13 +98,13 @@ public void animate(float partialTick) { baseTransform.rotateXYZ(Mth.DEG_TO_RAD * entity.getXRot(), Mth.DEG_TO_RAD * (180.0f - entity.getYRot()), 0.0f); var stack = entity.getItem(); - var frameModel = getFrameModel(); + var frameBlockState = getFrameBlockState(entity, stack); - if (frameModel != lastFrameModel) { + if (frameBlockState != lastFrameBlockState) { visualizationContext.instancerProvider() - .instancer(InstanceTypes.TRANSFORMED, MODEL_RESOURCE_LOCATION.get(frameModel)) + .instancer(InstanceTypes.TRANSFORMED, BLOCK_STATE.get(frameBlockState)) .stealInstance(frame); - lastFrameModel = frameModel; + lastFrameBlockState = frameBlockState; } frame.setVisible(!invisible); @@ -161,9 +166,9 @@ protected int getBlockLightLevel(BlockPos pos) { return entity.getType() == EntityType.GLOW_ITEM_FRAME ? Math.max(5, getBlockLightLevelBase(pos)) : getBlockLightLevelBase(pos); } - public BlockStateModel getFrameModel() { - boolean isGlowing = entity.getType() == EntityType.GLOW_ITEM_FRAME; - BlockState state = BlockStateDefinitions.getItemFrameFakeState(isGlowing, false); - return Minecraft.getInstance().getBlockRenderer().getBlockModel(state); + public static BlockState getFrameBlockState(ItemFrame entity, ItemStack item) { + boolean isGlowFrame = entity.getType() == EntityType.GLOW_ITEM_FRAME; + boolean map = !item.isEmpty() && entity.getFramedMapId(item) != null; + return BlockStateDefinitions.getItemFrameFakeState(isGlowFrame, map); } } diff --git a/common/src/vanillin/resources/vanillin.mixins.json b/common/src/vanillin/resources/vanillin.mixins.json index 6944cdfd1..3394c4bb6 100644 --- a/common/src/vanillin/resources/vanillin.mixins.json +++ b/common/src/vanillin/resources/vanillin.mixins.json @@ -5,8 +5,7 @@ "compatibilityLevel": "JAVA_21", "refmap": "vanillin.refmap.json", "client": [ - "ChestRendererAccessor", - "item.ItemOverridesAccessor" + "ChestRendererAccessor" ], "injectors": { "defaultRequire": 1 diff --git a/docs/flywheel/api/stage/fragment.glsl b/docs/flywheel/api/stage/fragment.glsl index e13ec6588..ffa82b5a1 100644 --- a/docs/flywheel/api/stage/fragment.glsl +++ b/docs/flywheel/api/stage/fragment.glsl @@ -12,7 +12,8 @@ /*const*/ vec4 flw_sampleColor; -/*const*/ float flw_distance; +/*const*/ float flw_sphericalDistance; +/*const*/ float flw_cylindricalDistance; vec4 flw_fragColor; ivec2 flw_fragOverlay; diff --git a/docs/flywheel/api/uniforms/fog.glsl b/docs/flywheel/api/uniforms/fog.glsl index 73ce76546..e8965975d 100644 --- a/docs/flywheel/api/uniforms/fog.glsl +++ b/docs/flywheel/api/uniforms/fog.glsl @@ -1,3 +1,5 @@ vec4 flw_fogColor; -vec2 flw_fogRange; -int flw_fogShape; +vec2 flw_fogEnvironmentalRange; +vec2 flw_fogRenderDistanceRange; +float flw_fogSkyEnd; +float flw_fogCloudEnd; diff --git a/docs/flywheel/api/uniforms/level.glsl b/docs/flywheel/api/uniforms/level.glsl index ec8f29f66..c901a877c 100644 --- a/docs/flywheel/api/uniforms/level.glsl +++ b/docs/flywheel/api/uniforms/level.glsl @@ -12,10 +12,13 @@ float flw_timeOfDay; uint flw_levelHasSkyLight; float flw_sunAngle; +float flw_moonAngle; +float flw_starAngle; float flw_moonBrightness; /** There are normally only 8 moon phases. */ uint flw_moonPhase; +float flw_starBrightness; uint flw_isRaining; float flw_rainLevel; @@ -24,7 +27,7 @@ float flw_thunderLevel; float flw_skyDarken; -uint flw_constantAmbientLight; +uint flw_cardinalLightType; /** Use FLW_DIMENSION_* ids to determine the dimension. May eventually be implemented for custom dimensions. */ uint flw_dimension; diff --git a/fabric/src/backend/java/dev/engine_room/flywheel/backend/compile/FlwProgramsReloader.java b/fabric/src/backend/java/dev/engine_room/flywheel/backend/compile/FlwProgramsReloader.java deleted file mode 100644 index 26fc002b0..000000000 --- a/fabric/src/backend/java/dev/engine_room/flywheel/backend/compile/FlwProgramsReloader.java +++ /dev/null @@ -1,27 +0,0 @@ -package dev.engine_room.flywheel.backend.compile; - -import dev.engine_room.flywheel.backend.NoiseTextures; -import dev.engine_room.flywheel.lib.util.IdentifierUtil; -import net.fabricmc.fabric.api.resource.SimpleSynchronousResourceReloadListener; -import net.minecraft.resources.Identifier; -import net.minecraft.server.packs.resources.ResourceManager; - -public final class FlwProgramsReloader implements SimpleSynchronousResourceReloadListener { - public static final FlwProgramsReloader INSTANCE = new FlwProgramsReloader(); - - public static final Identifier ID = IdentifierUtil.id("programs"); - - private FlwProgramsReloader() { - } - - @Override - public void onResourceManagerReload(ResourceManager manager) { - FlwPrograms.reload(manager); - NoiseTextures.reload(manager); - } - - @Override - public Identifier getFabricId() { - return ID; - } -} diff --git a/fabric/src/lib/java/dev/engine_room/flywheel/lib/model/baked/BlockStateModelBufferer.java b/fabric/src/lib/java/dev/engine_room/flywheel/lib/model/baked/BlockStateModelBufferer.java index 764546601..ca9b2c160 100644 --- a/fabric/src/lib/java/dev/engine_room/flywheel/lib/model/baked/BlockStateModelBufferer.java +++ b/fabric/src/lib/java/dev/engine_room/flywheel/lib/model/baked/BlockStateModelBufferer.java @@ -1,7 +1,6 @@ package dev.engine_room.flywheel.lib.model.baked; import java.util.Iterator; -import java.util.List; import org.jspecify.annotations.Nullable; @@ -13,12 +12,10 @@ import net.minecraft.client.renderer.ItemBlockRenderTypes; import net.minecraft.client.renderer.block.BlockRenderDispatcher; import net.minecraft.client.renderer.block.ModelBlockRenderer; -import net.minecraft.client.renderer.block.model.BlockModelPart; import net.minecraft.client.renderer.block.model.BlockStateModel; import net.minecraft.client.renderer.chunk.ChunkSectionLayer; import net.minecraft.client.renderer.texture.OverlayTexture; import net.minecraft.core.BlockPos; -import net.minecraft.util.RandomSource; import net.minecraft.world.level.BlockAndTintGetter; import net.minecraft.world.level.block.RenderShape; import net.minecraft.world.level.block.state.BlockState; @@ -35,24 +32,22 @@ public static SimpleModel bufferModel(BlockStateModel model, BlockPos pos, Block if (poseStack == null) { poseStack = objects.identityPoseStack; } - RandomSource random = objects.random; FabricMeshEmitterManager emitters = objects.emitters; emitters.prepare(blockMaterialFunction); - List parts = model.collectParts(random); + long seed = state.getSeed(pos); // See ModelBlockRenderer#tesselateBlock boolean useAo = Minecraft.useAmbientOcclusion(); - boolean defaultAo = useAo && state.getLightEmission() == 0 && parts.getFirst().useAmbientOcclusion(); + boolean defaultAo = useAo && state.getLightEmission() == 0; model = emitters.prepareForModel(model, useAo, defaultAo); - parts = model.collectParts(random); poseStack.pushPose(); Minecraft.getInstance() .getBlockRenderer() .getModelRenderer() - .tesselateBlock(level, parts, state, pos, poseStack, emitters, false, OverlayTexture.NO_OVERLAY); + .render(level, model, state, pos, poseStack, emitters, false, seed, OverlayTexture.NO_OVERLAY); poseStack.popPose(); return emitters.end(); @@ -63,7 +58,6 @@ public static SimpleModel bufferBlocks(Iterator posIterator, BlockAndT if (poseStack == null) { poseStack = objects.identityPoseStack; } - RandomSource random = objects.random; FabricMeshEmitterManager emitters = objects.emitters; TransformingVertexConsumer transformingWrapper = objects.transformingWrapper; @@ -88,7 +82,7 @@ public static SimpleModel bufferBlocks(Iterator posIterator, BlockAndT if (!fluidState.isEmpty()) { ChunkSectionLayer layer = ItemBlockRenderTypes.getRenderLayer(fluidState); - BufferBuilder bufferBuilder = emitters.getBuffer(layer, true, false); + BufferBuilder bufferBuilder = emitters.getEmitter(layer).getBuffer(true, false); if (bufferBuilder != null) { transformingWrapper.prepare(bufferBuilder, poseStack); @@ -102,17 +96,16 @@ public static SimpleModel bufferBlocks(Iterator posIterator, BlockAndT } if (state.getRenderShape() == RenderShape.MODEL) { + long seed = state.getSeed(pos); BlockStateModel model = renderDispatcher.getBlockModel(state); - List parts = model.collectParts(random); // See ModelBlockRenderer#tesselateBlock - boolean defaultAo = useAo && state.getLightEmission() == 0 && parts.getFirst().useAmbientOcclusion(); + boolean defaultAo = useAo && state.getLightEmission() == 0; model = emitters.prepareForModel(model, useAo, defaultAo); - parts = model.collectParts(random); poseStack.pushPose(); poseStack.translate(pos.getX(), pos.getY(), pos.getZ()); - blockRenderer.tesselateBlock(level, parts, state, pos, poseStack, emitters, true, OverlayTexture.NO_OVERLAY); + blockRenderer.render(level, model, state, pos, poseStack, emitters, true, seed, OverlayTexture.NO_OVERLAY); poseStack.popPose(); } } @@ -124,7 +117,6 @@ public static SimpleModel bufferBlocks(Iterator posIterator, BlockAndT private static class ThreadLocalObjects { public final PoseStack identityPoseStack = new PoseStack(); - public final RandomSource random = RandomSource.createNewThreadLocalInstance(); public final FabricMeshEmitterManager emitters = new FabricMeshEmitterManager(); public final TransformingVertexConsumer transformingWrapper = new TransformingVertexConsumer(); diff --git a/fabric/src/lib/java/dev/engine_room/flywheel/lib/model/baked/FabricMeshEmitter.java b/fabric/src/lib/java/dev/engine_room/flywheel/lib/model/baked/FabricMeshEmitter.java new file mode 100644 index 000000000..65cd066d2 --- /dev/null +++ b/fabric/src/lib/java/dev/engine_room/flywheel/lib/model/baked/FabricMeshEmitter.java @@ -0,0 +1,118 @@ +package dev.engine_room.flywheel.lib.model.baked; + +import com.mojang.blaze3d.vertex.BufferBuilder; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; + +import net.minecraft.client.renderer.block.model.BakedQuad; +import net.minecraft.client.renderer.chunk.ChunkSectionLayer; + +class FabricMeshEmitter extends MeshEmitter { + private boolean shade; + private boolean ao; + + FabricMeshEmitter(ByteBufferBuilderStack byteBufferBuilderStack, ChunkSectionLayer chunkSectionLayer) { + super(byteBufferBuilderStack, chunkSectionLayer); + } + + public void prepareForGeometry(boolean shade, boolean ao) { + this.shade = shade; + this.ao = ao; + } + + @Override + public VertexConsumer addVertex(float x, float y, float z) { + BufferBuilder bufferBuilder = getBuffer(shade, ao); + if (bufferBuilder != null) { + bufferBuilder.addVertex(x, y, z); + } + return this; + } + + @Override + public VertexConsumer setColor(int red, int green, int blue, int alpha) { + BufferBuilder bufferBuilder = getBuffer(shade, ao); + if (bufferBuilder != null) { + bufferBuilder.setColor(red, green, blue, alpha); + } + return this; + } + + @Override + public VertexConsumer setColor(int color) { + BufferBuilder bufferBuilder = getBuffer(shade, ao); + if (bufferBuilder != null) { + bufferBuilder.setColor(color); + } + return this; + } + + @Override + public VertexConsumer setUv(float u, float v) { + BufferBuilder bufferBuilder = getBuffer(shade, ao); + if (bufferBuilder != null) { + bufferBuilder.setUv(u, v); + } + return this; + } + + @Override + public VertexConsumer setUv1(int u, int v) { + BufferBuilder bufferBuilder = getBuffer(shade, ao); + if (bufferBuilder != null) { + bufferBuilder.setUv1(u, v); + } + return this; + } + + @Override + public VertexConsumer setUv2(int u, int v) { + BufferBuilder bufferBuilder = getBuffer(shade, ao); + if (bufferBuilder != null) { + bufferBuilder.setUv2(u, v); + } + return this; + } + + @Override + public VertexConsumer setNormal(float x, float y, float z) { + BufferBuilder bufferBuilder = getBuffer(shade, ao); + if (bufferBuilder != null) { + bufferBuilder.setNormal(x, y, z); + } + return this; + } + + @Override + public VertexConsumer setLineWidth(float width) { + BufferBuilder bufferBuilder = getBuffer(shade, ao); + if (bufferBuilder != null) { + bufferBuilder.setLineWidth(width); + } + return this; + } + + @Override + public void addVertex(float x, float y, float z, int color, float u, float v, int packedOverlay, int packedLight, float normalX, float normalY, float normalZ) { + BufferBuilder bufferBuilder = getBuffer(shade, ao); + if (bufferBuilder != null) { + bufferBuilder.addVertex(x, y, z, color, u, v, packedOverlay, packedLight, normalX, normalY, normalZ); + } + } + + @Override + public void putBulkData(PoseStack.Pose pose, BakedQuad quad, float red, float green, float blue, float alpha, int packedLight, int packedOverlay) { + BufferBuilder bufferBuilder = getBuffer(shade, ao); + if (bufferBuilder != null) { + bufferBuilder.putBulkData(pose, quad, red, green, blue, alpha, packedLight, packedOverlay); + } + } + + @Override + public void putBulkData(PoseStack.Pose pose, BakedQuad quad, float[] brightness, float red, float green, float blue, float alpha, int[] lightmap, int packedOverlay) { + BufferBuilder bufferBuilder = getBuffer(shade, ao); + if (bufferBuilder != null) { + bufferBuilder.putBulkData(pose, quad, brightness, red, green, blue, alpha, lightmap, packedOverlay); + } + } +} diff --git a/fabric/src/lib/java/dev/engine_room/flywheel/lib/model/baked/FabricMeshEmitterManager.java b/fabric/src/lib/java/dev/engine_room/flywheel/lib/model/baked/FabricMeshEmitterManager.java index e80e21a9f..450096445 100644 --- a/fabric/src/lib/java/dev/engine_room/flywheel/lib/model/baked/FabricMeshEmitterManager.java +++ b/fabric/src/lib/java/dev/engine_room/flywheel/lib/model/baked/FabricMeshEmitterManager.java @@ -2,20 +2,15 @@ import java.util.function.Predicate; -import org.jetbrains.annotations.UnknownNullability; import org.jspecify.annotations.Nullable; -import com.mojang.blaze3d.vertex.BufferBuilder; -import com.mojang.blaze3d.vertex.PoseStack; -import com.mojang.blaze3d.vertex.VertexConsumer; - import dev.engine_room.flywheel.lib.model.SimpleModel; import net.fabricmc.fabric.api.client.model.loading.v1.wrapper.WrapperBlockStateModel; import net.fabricmc.fabric.api.renderer.v1.mesh.QuadEmitter; import net.fabricmc.fabric.api.renderer.v1.mesh.QuadTransform; import net.fabricmc.fabric.api.renderer.v1.mesh.QuadView; +import net.fabricmc.fabric.api.renderer.v1.render.BlockVertexConsumerProvider; import net.fabricmc.fabric.api.util.TriState; -import net.minecraft.client.renderer.block.model.BakedQuad; import net.minecraft.client.renderer.block.model.BlockStateModel; import net.minecraft.client.renderer.chunk.ChunkSectionLayer; import net.minecraft.core.BlockPos; @@ -24,18 +19,14 @@ import net.minecraft.world.level.BlockAndTintGetter; import net.minecraft.world.level.block.state.BlockState; -class FabricMeshEmitterManager extends MeshEmitterManager implements VertexConsumer { +class FabricMeshEmitterManager extends MeshEmitterManager implements BlockVertexConsumerProvider { private final WrapperModel wrapperModel = new WrapperModel(); - @UnknownNullability - private ChunkSectionLayer defaultLayer; private boolean useAo; private boolean defaultAo; - @Nullable - private BufferBuilder currentDelegate; FabricMeshEmitterManager() { - super(MeshEmitter::new); + super(FabricMeshEmitter::new); } public BlockStateModel prepareForModel(BlockStateModel model, boolean useAo, boolean defaultAo) { @@ -52,96 +43,18 @@ public SimpleModel end() { } private void prepareForGeometry(QuadView quad) { - ChunkSectionLayer renderLayer = quad.renderLayer(); - boolean shade = !quad.diffuseShade(); + boolean shade = quad.diffuseShade(); TriState aoMode = quad.ambientOcclusion(); boolean ao = useAo && aoMode.orElse(defaultAo); - currentDelegate = getBuffer(renderLayer, shade, ao); - } - - @Override - public VertexConsumer addVertex(float x, float y, float z) { - if (currentDelegate != null) { - currentDelegate.addVertex(x, y, z); - } - return this; - } - - @Override - public VertexConsumer setColor(int red, int green, int blue, int alpha) { - if (currentDelegate != null) { - currentDelegate.setColor(red, green, blue, alpha); - } - return this; - } - - @Override - public VertexConsumer setColor(int color) { - if (currentDelegate != null) { - currentDelegate.setColor(color); - } - return this; - } - - @Override - public VertexConsumer setUv(float u, float v) { - if (currentDelegate != null) { - currentDelegate.setUv(u, v); - } - return this; - } - - @Override - public VertexConsumer setUv1(int u, int v) { - if (currentDelegate != null) { - currentDelegate.setUv1(u, v); - } - return this; - } - - @Override - public VertexConsumer setUv2(int u, int v) { - if (currentDelegate != null) { - currentDelegate.setUv2(u, v); - } - return this; - } - - @Override - public VertexConsumer setNormal(float x, float y, float z) { - if (currentDelegate != null) { - currentDelegate.setNormal(x, y, z); - } - return this; - } - @Override - public VertexConsumer setLineWidth(float f) { - if (currentDelegate != null) { - currentDelegate.setLineWidth(f); - } - return this; - } - - @Override - public void addVertex(float x, float y, float z, int color, float u, float v, int packedOverlay, int packedLight, float normalX, float normalY, float normalZ) { - if (currentDelegate != null) { - currentDelegate.addVertex(x, y, z, color, u, v, packedOverlay, packedLight, normalX, normalY, normalZ); + for (FabricMeshEmitter emitter : emitterMap.values()) { + emitter.prepareForGeometry(shade, ao); } } @Override - public void putBulkData(PoseStack.Pose pose, BakedQuad quad, float red, float green, float blue, float alpha, int packedLight, int packedOverlay) { - if (currentDelegate != null) { - currentDelegate.putBulkData(pose, quad, red, green, blue, alpha, packedLight, packedOverlay); - } - } - - @Override - public void putBulkData(PoseStack.Pose pose, BakedQuad quad, float[] brightness, float red, float green, float blue, float alpha, int[] lightmap, int packedOverlay) { - if (currentDelegate != null) { - currentDelegate.putBulkData(pose, quad, brightness, red, green, blue, alpha, lightmap, packedOverlay); - } + public FabricMeshEmitter getBuffer(ChunkSectionLayer layer) { + return getEmitter(layer); } private class WrapperModel extends WrapperBlockStateModel { diff --git a/fabric/src/lib/java/dev/engine_room/flywheel/lib/model/baked/FabricPartialModel.java b/fabric/src/lib/java/dev/engine_room/flywheel/lib/model/baked/FabricPartialModel.java new file mode 100644 index 000000000..292187d12 --- /dev/null +++ b/fabric/src/lib/java/dev/engine_room/flywheel/lib/model/baked/FabricPartialModel.java @@ -0,0 +1,74 @@ +package dev.engine_room.flywheel.lib.model.baked; + +import java.util.concurrent.ConcurrentMap; + +import org.jetbrains.annotations.ApiStatus; +import org.jetbrains.annotations.NotNull; + +import com.google.common.collect.MapMaker; + +import dev.engine_room.flywheel.lib.util.IdentifierUtil; +import net.fabricmc.fabric.api.client.model.loading.v1.ExtraModelKey; +import net.fabricmc.fabric.api.client.model.loading.v1.ModelLoadingPlugin; +import net.fabricmc.fabric.api.client.model.loading.v1.UnbakedExtraModel; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.block.model.BlockStateModel; +import net.minecraft.client.renderer.block.model.SimpleModelWrapper; +import net.minecraft.client.renderer.block.model.SingleVariant; +import net.minecraft.client.resources.model.BlockModelRotation; +import net.minecraft.client.resources.model.ModelBaker; +import net.minecraft.client.resources.model.ModelManager; +import net.minecraft.resources.Identifier; +import net.minecraft.server.packs.resources.ResourceManager; +import net.minecraft.server.packs.resources.ResourceManagerReloadListener; + +@ApiStatus.Internal +public class FabricPartialModel extends PartialModel { + private static final ConcurrentMap ALL = new MapMaker().weakValues().makeMap(); + + private final ExtraModelKey<@NotNull BlockStateModel> key; + + public FabricPartialModel(Identifier modelId) { + super(modelId); + key = ExtraModelKey.create(modelId::toString); + } + + public static FabricPartialModel of(Identifier modelId) { + return ALL.computeIfAbsent(modelId, FabricPartialModel::new); + } + + public static void registerAll(ModelLoadingPlugin.Context ctx) { + for (FabricPartialModel partial : ALL.values()) { + ctx.addModel(partial.key, partial.new Unbaked()); + } + } + + public static void refreshAll(ModelManager modelManager) { + for (FabricPartialModel partial : ALL.values()) { + partial.blockStateModel = modelManager.getModel(partial.key); + } + } + + private class Unbaked implements UnbakedExtraModel<@NotNull BlockStateModel> { + @Override + public BlockStateModel bake(ModelBaker baker) { + return new SingleVariant(SimpleModelWrapper.bake(baker, modelId, BlockModelRotation.IDENTITY)); + } + + @Override + public void resolveDependencies(Resolver resolver) { + resolver.markDependency(modelId); + } + } + + public static class ResourceReloadListener implements ResourceManagerReloadListener { + public static final Identifier ID = IdentifierUtil.id("partial_models"); + + public static final ResourceReloadListener INSTANCE = new ResourceReloadListener(); + + @Override + public void onResourceManagerReload(ResourceManager resourceManager) { + refreshAll(Minecraft.getInstance().getModelManager()); + } + } +} diff --git a/fabric/src/lib/java/dev/engine_room/flywheel/lib/model/baked/PartialModelEventHandler.java b/fabric/src/lib/java/dev/engine_room/flywheel/lib/model/baked/PartialModelEventHandler.java deleted file mode 100644 index 2e178ae05..000000000 --- a/fabric/src/lib/java/dev/engine_room/flywheel/lib/model/baked/PartialModelEventHandler.java +++ /dev/null @@ -1,56 +0,0 @@ -package dev.engine_room.flywheel.lib.model.baked; - -import java.util.List; - -import org.jetbrains.annotations.ApiStatus; - -import dev.engine_room.flywheel.lib.util.IdentifierUtil; -import net.fabricmc.fabric.api.resource.ResourceReloadListenerKeys; -import net.fabricmc.fabric.api.resource.SimpleSynchronousResourceReloadListener; -import net.minecraft.client.Minecraft; -import net.minecraft.client.resources.model.ModelManager; -import net.minecraft.resources.Identifier; -import net.minecraft.server.packs.resources.ResourceManager; - -@ApiStatus.Internal -public final class PartialModelEventHandler { - private PartialModelEventHandler() { - } - - public static Identifier[] onRegisterAdditional() { - return PartialModel.ALL.keySet().toArray(Identifier[]::new); - } - - public static void onBakingCompleted(ModelManager manager) { - PartialModel.populateOnInit = true; - - for (PartialModel partial : PartialModel.ALL.values()) { - partial.blockStateModel = manager.getModel(partial.modelId()); - } - } - - public static final class ReloadListener implements SimpleSynchronousResourceReloadListener { - public static final ReloadListener INSTANCE = new ReloadListener(); - - public static final Identifier ID = IdentifierUtil.id("partial_models"); - public static final List DEPENDENCIES = List.of(ResourceReloadListenerKeys.MODELS); - - private ReloadListener() { - } - - @Override - public void onResourceManagerReload(ResourceManager resourceManager) { - onBakingCompleted(Minecraft.getInstance().getModelManager()); - } - - @Override - public Identifier getFabricId() { - return ID; - } - - @Override - public List getFabricDependencies() { - return DEPENDENCIES; - } - } -} diff --git a/fabric/src/main/java/dev/engine_room/flywheel/impl/FlwCommands.java b/fabric/src/main/java/dev/engine_room/flywheel/impl/FlwCommands.java index f469ae03d..37e9e37ff 100644 --- a/fabric/src/main/java/dev/engine_room/flywheel/impl/FlwCommands.java +++ b/fabric/src/main/java/dev/engine_room/flywheel/impl/FlwCommands.java @@ -16,7 +16,9 @@ import net.fabricmc.fabric.api.client.command.v2.ClientCommandManager; import net.fabricmc.fabric.api.client.command.v2.FabricClientCommandSource; import net.minecraft.client.Minecraft; +import net.minecraft.client.player.LocalPlayer; import net.minecraft.commands.CommandBuildContext; +import net.minecraft.commands.CommandSource; import net.minecraft.commands.CommandSourceStack; import net.minecraft.commands.arguments.coordinates.BlockPosArgument; import net.minecraft.commands.arguments.coordinates.Coordinates; @@ -200,7 +202,10 @@ private static LiteralArgumentBuilder createDebugComm } // Client version of BlockPosArgument.getBlockPos - public static BlockPos getBlockPos(CommandContext context, String name) { - return context.getArgument(name, Coordinates.class).getBlockPos((CommandSourceStack) context.getSource()); + private static BlockPos getBlockPos(CommandContext context, String name) { + FabricClientCommandSource clientSource = context.getSource(); + LocalPlayer player = clientSource.getPlayer(); + CommandSourceStack commandSourceStack = new CommandSourceStack(CommandSource.NULL, clientSource.getPosition(), clientSource.getRotation(), null, clientSource.permissions(), player.getPlainTextName(), player.getDisplayName(), null, player); + return context.getArgument(name, Coordinates.class).getBlockPos(commandSourceStack); } } diff --git a/fabric/src/main/java/dev/engine_room/flywheel/impl/FlwLibXplatImpl.java b/fabric/src/main/java/dev/engine_room/flywheel/impl/FlwLibXplatImpl.java index 87135cca1..0c977a490 100644 --- a/fabric/src/main/java/dev/engine_room/flywheel/impl/FlwLibXplatImpl.java +++ b/fabric/src/main/java/dev/engine_room/flywheel/impl/FlwLibXplatImpl.java @@ -1,13 +1,20 @@ package dev.engine_room.flywheel.impl; -import dev.engine_room.flywheel.lib.model.baked.BlockModelBuilder; -import dev.engine_room.flywheel.lib.model.baked.LevelModelBuilder; - import dev.engine_room.flywheel.lib.internal.FlwLibXplat; import dev.engine_room.flywheel.lib.model.SimpleModel; +import dev.engine_room.flywheel.lib.model.baked.BlockModelBuilder; +import dev.engine_room.flywheel.lib.model.baked.FabricPartialModel; +import dev.engine_room.flywheel.lib.model.baked.LevelModelBuilder; import dev.engine_room.flywheel.lib.model.baked.ModelBuilderImpl; +import dev.engine_room.flywheel.lib.model.baked.PartialModel; +import net.minecraft.resources.Identifier; public class FlwLibXplatImpl implements FlwLibXplat { + @Override + public PartialModel createPartialModel(Identifier modelId) { + return FabricPartialModel.of(modelId); + } + @Override public SimpleModel buildBlockModelBuilder(BlockModelBuilder builder) { return ModelBuilderImpl.buildBlockModelBuilder(builder); diff --git a/fabric/src/main/java/dev/engine_room/flywheel/impl/FlywheelFabric.java b/fabric/src/main/java/dev/engine_room/flywheel/impl/FlywheelFabric.java index c85184b09..3fa638109 100644 --- a/fabric/src/main/java/dev/engine_room/flywheel/impl/FlywheelFabric.java +++ b/fabric/src/main/java/dev/engine_room/flywheel/impl/FlywheelFabric.java @@ -9,7 +9,8 @@ import dev.engine_room.flywheel.backend.engine.uniform.Uniforms; import dev.engine_room.flywheel.impl.mixin.fabric.ArgumentTypeInfosAccessor; import dev.engine_room.flywheel.impl.visualization.VisualizationEventHandler; -import dev.engine_room.flywheel.lib.model.baked.PartialModelEventHandler; +import dev.engine_room.flywheel.lib.model.baked.FabricPartialModel; +import dev.engine_room.flywheel.lib.util.IdentifierUtil; import dev.engine_room.flywheel.lib.util.RendererReloadCache; import dev.engine_room.flywheel.lib.util.ResourceReloadHolder; import net.fabricmc.api.ClientModInitializer; @@ -17,10 +18,12 @@ import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientEntityEvents; import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents; import net.fabricmc.fabric.api.client.model.loading.v1.ModelLoadingPlugin; -import net.fabricmc.fabric.api.resource.ResourceManagerHelper; +import net.fabricmc.fabric.api.resource.v1.ResourceLoader; +import net.fabricmc.fabric.api.resource.v1.reloader.ResourceReloaderKeys; import net.fabricmc.loader.api.FabricLoader; import net.fabricmc.loader.api.ModContainer; import net.fabricmc.loader.api.Version; +import net.minecraft.client.gui.components.debug.DebugScreenEntries; import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.server.packs.PackType; @@ -57,6 +60,8 @@ private static void setupImpl() { ClientCommandRegistrationCallback.EVENT.register(FlwCommands::registerClientCommands); + DebugScreenEntries.register(IdentifierUtil.id("flw_debug_info"), new FlwDebugInfo.FlwDebugEntry()); + EndClientResourceReloadCallback.EVENT.register((minecraft, resourceManager, initialReload, error) -> BackendManagerImpl.onEndClientResourceReload(error.isPresent())); @@ -72,14 +77,15 @@ private static void setupLib() { ReloadLevelRendererCallback.EVENT.register(level -> RendererReloadCache.onReloadLevelRenderer()); EndClientResourceReloadCallback.EVENT.register((minecraft, resourceManager, initialReload, error) -> ResourceReloadHolder.onEndClientResourceReload()); - ModelLoadingPlugin.register(ctx -> ctx.addModels(PartialModelEventHandler.onRegisterAdditional())); - ResourceManagerHelper.get(PackType.CLIENT_RESOURCES).registerReloadListener(PartialModelEventHandler.ReloadListener.INSTANCE); + ModelLoadingPlugin.register(FabricPartialModel::registerAll); + ResourceLoader.get(PackType.CLIENT_RESOURCES).registerReloader(FabricPartialModel.ResourceReloadListener.ID, FabricPartialModel.ResourceReloadListener.INSTANCE); + ResourceLoader.get(PackType.CLIENT_RESOURCES).addReloaderOrdering(ResourceReloaderKeys.Client.MODELS, FabricPartialModel.ResourceReloadListener.ID); } private static void setupBackend() { ReloadLevelRendererCallback.EVENT.register(level -> Uniforms.onReloadLevelRenderer()); - ResourceManagerHelper.get(PackType.CLIENT_RESOURCES).registerReloadListener(FlwProgramsReloader.INSTANCE); + ResourceLoader.get(PackType.CLIENT_RESOURCES).registerReloader(FlwProgramsReloader.ID, FlwProgramsReloader.INSTANCE); } public static Version version() { diff --git a/fabric/src/main/java/dev/engine_room/flywheel/impl/mixin/fabric/DebugScreenOverlayMixin.java b/fabric/src/main/java/dev/engine_room/flywheel/impl/mixin/fabric/DebugScreenOverlayMixin.java deleted file mode 100644 index c8201cfce..000000000 --- a/fabric/src/main/java/dev/engine_room/flywheel/impl/mixin/fabric/DebugScreenOverlayMixin.java +++ /dev/null @@ -1,26 +0,0 @@ -package dev.engine_room.flywheel.impl.mixin.fabric; - -import java.util.List; - -import org.spongepowered.asm.mixin.Final; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; - -import dev.engine_room.flywheel.impl.FlwDebugInfo; -import net.minecraft.client.Minecraft; -import net.minecraft.client.gui.components.DebugScreenOverlay; - -@Mixin(DebugScreenOverlay.class) -abstract class DebugScreenOverlayMixin { - @Shadow - @Final - private Minecraft minecraft; - - @Inject(method = "getSystemInformation", at = @At("RETURN")) - private void flywheel$onGetSystemInformation(CallbackInfoReturnable> cir) { - FlwDebugInfo.addDebugInfo(minecraft, cir.getReturnValue()); - } -} diff --git a/fabric/src/main/java/dev/engine_room/flywheel/impl/mixin/fabric/MinecraftMixin.java b/fabric/src/main/java/dev/engine_room/flywheel/impl/mixin/fabric/MinecraftMixin.java index dfdc9f9b1..13e854d34 100644 --- a/fabric/src/main/java/dev/engine_room/flywheel/impl/mixin/fabric/MinecraftMixin.java +++ b/fabric/src/main/java/dev/engine_room/flywheel/impl/mixin/fabric/MinecraftMixin.java @@ -10,12 +10,13 @@ import net.minecraft.client.Minecraft; import net.minecraft.client.multiplayer.ClientLevel; +// TODO 1.21.11: This mixin currently matches NeoForge's LevelEvent.Unload, but it may be a bug that it is not fired from Minecraft.clearClientLevel. @Mixin(Minecraft.class) abstract class MinecraftMixin { @Shadow public ClientLevel level; - @Inject(method = "setLevel", at = @At("HEAD")) + @Inject(method = "setLevel(Lnet/minecraft/client/multiplayer/ClientLevel;)V", at = @At("HEAD")) private void flywheel$onSetLevel(CallbackInfo ci) { if (level != null) { LevelAttached.invalidateLevel(level); diff --git a/neoforge/src/lib/java/dev/engine_room/flywheel/lib/model/baked/BlockStateModelBufferer.java b/neoforge/src/lib/java/dev/engine_room/flywheel/lib/model/baked/BlockStateModelBufferer.java index 7ff1b753a..b7d7ed33e 100644 --- a/neoforge/src/lib/java/dev/engine_room/flywheel/lib/model/baked/BlockStateModelBufferer.java +++ b/neoforge/src/lib/java/dev/engine_room/flywheel/lib/model/baked/BlockStateModelBufferer.java @@ -1,5 +1,6 @@ package dev.engine_room.flywheel.lib.model.baked; +import java.util.ArrayList; import java.util.Iterator; import java.util.List; @@ -19,7 +20,6 @@ import net.minecraft.client.renderer.texture.OverlayTexture; import net.minecraft.core.BlockPos; import net.minecraft.util.RandomSource; -import net.minecraft.util.TriState; import net.minecraft.world.level.BlockAndTintGetter; import net.minecraft.world.level.block.RenderShape; import net.minecraft.world.level.block.state.BlockState; @@ -37,34 +37,31 @@ public static SimpleModel bufferModel(BlockStateModel model, BlockPos pos, Block if (poseStack == null) { poseStack = objects.identityPoseStack; } + List parts = objects.parts; RandomSource random = objects.random; - MeshEmitterManager emitters = objects.emitters; + NeoForgeMeshEmitterManager emitters = objects.emitters; emitters.prepare(blockMaterialFunction); - ModelBlockRenderer blockRenderer = Minecraft.getInstance() - .getBlockRenderer() - .getModelRenderer(); - - List parts = model.collectParts(level, pos, state, random); - long seed = state.getSeed(pos); random.setSeed(seed); - ChunkSectionLayer layer = parts.getFirst().getRenderType(state); + model.collectParts(level, pos, state, random, parts); // See ModelBlockRenderer#tesselateBlock - boolean aoEnabled = Minecraft.useAmbientOcclusion(); - boolean perPartAO = NeoForgeClientConfig.INSTANCE.handleAmbientOcclusionPerPart.getAsBoolean(); - boolean defaultAo = state.getLightEmission(level, pos) == 0; - TriState useAo = parts.getFirst().ambientOcclusion(); - - boolean defaultAoLayer = aoEnabled && ((perPartAO && useAo.isTrue()) || (useAo.isDefault() && defaultAo)); - - NeoforgeMeshEmitter emitter = emitters.getEmitter(layer); - emitter.prepareForModelLayer(defaultAoLayer); + boolean useAo = Minecraft.useAmbientOcclusion(); + boolean perPartAo = NeoForgeClientConfig.INSTANCE.handleAmbientOcclusionPerPart.getAsBoolean(); + boolean ao = useAo && (perPartAo || parts.isEmpty() || switch(parts.getFirst().ambientOcclusion()) { + case TRUE -> true; + case DEFAULT -> state.getLightEmission(level, pos) == 0; + case FALSE -> false; + }); + emitters.prepareForModel(ao); poseStack.pushPose(); - blockRenderer.tesselateBlock(level, parts, state, pos, poseStack, emitter, false, OverlayTexture.NO_OVERLAY); + Minecraft.getInstance() + .getBlockRenderer() + .getModelRenderer() + .tesselateBlock(level, parts, state, pos, poseStack, emitters, false, OverlayTexture.NO_OVERLAY); poseStack.popPose(); return emitters.end(); @@ -75,8 +72,9 @@ public static SimpleModel bufferBlocks(Iterator posIterator, BlockAndT if (poseStack == null) { poseStack = objects.identityPoseStack; } + List parts = objects.parts; RandomSource random = objects.random; - MeshEmitterManager emitters = objects.emitters; + NeoForgeMeshEmitterManager emitters = objects.emitters; TransformingVertexConsumer transformingWrapper = objects.transformingWrapper; emitters.prepare(blockMaterialFunction); @@ -86,7 +84,8 @@ public static SimpleModel bufferBlocks(Iterator posIterator, BlockAndT ModelBlockRenderer blockRenderer = renderDispatcher.getModelRenderer(); ModelBlockRenderer.enableCaching(); - boolean aoEnabled = Minecraft.useAmbientOcclusion(); + boolean useAo = Minecraft.useAmbientOcclusion(); + boolean perPartAo = NeoForgeClientConfig.INSTANCE.handleAmbientOcclusionPerPart.getAsBoolean(); while (posIterator.hasNext()) { BlockPos pos = posIterator.next(); @@ -100,7 +99,7 @@ public static SimpleModel bufferBlocks(Iterator posIterator, BlockAndT if (!fluidState.isEmpty()) { ChunkSectionLayer layer = ItemBlockRenderTypes.getRenderLayer(fluidState); - BufferBuilder bufferBuilder = emitters.getBuffer(layer, true, false); + BufferBuilder bufferBuilder = emitters.getEmitter(layer).getBuffer(true, false); if (bufferBuilder != null) { transformingWrapper.prepare(bufferBuilder, poseStack); @@ -118,23 +117,19 @@ public static SimpleModel bufferBlocks(Iterator posIterator, BlockAndT random.setSeed(seed); BlockStateModel model = renderDispatcher.getBlockModel(state); - List parts = model.collectParts(level, pos, state, random); - - ChunkSectionLayer layer = ItemBlockRenderTypes.getChunkRenderType(state); + model.collectParts(level, pos, state, random, parts); // See ModelBlockRenderer#tesselateBlock - boolean perPartAO = NeoForgeClientConfig.INSTANCE.handleAmbientOcclusionPerPart.getAsBoolean(); - boolean defaultAo = state.getLightEmission(level, pos) == 0; - TriState useAo = parts.getFirst().ambientOcclusion(); - - boolean defaultAoLayer = aoEnabled && ((perPartAO && useAo.isTrue()) || (useAo.isDefault() && defaultAo)); - - NeoforgeMeshEmitter emitter = emitters.getEmitter(layer); - emitter.prepareForModelLayer(defaultAoLayer); + boolean ao = useAo && (perPartAo || parts.isEmpty() || switch(parts.getFirst().ambientOcclusion()) { + case TRUE -> true; + case DEFAULT -> state.getLightEmission(level, pos) == 0; + case FALSE -> false; + }); + emitters.prepareForModel(ao); poseStack.pushPose(); poseStack.translate(pos.getX(), pos.getY(), pos.getZ()); - blockRenderer.tesselateBlock(level, parts, state, pos, poseStack, emitter, true, OverlayTexture.NO_OVERLAY); + blockRenderer.tesselateBlock(level, parts, state, pos, poseStack, emitters, true, OverlayTexture.NO_OVERLAY); poseStack.popPose(); } } @@ -146,9 +141,10 @@ public static SimpleModel bufferBlocks(Iterator posIterator, BlockAndT private static class ThreadLocalObjects { public final PoseStack identityPoseStack = new PoseStack(); + public final List parts = new ArrayList<>(); public final RandomSource random = RandomSource.createNewThreadLocalInstance(); - public final MeshEmitterManager emitters = new MeshEmitterManager<>(NeoforgeMeshEmitter::new); + public final NeoForgeMeshEmitterManager emitters = new NeoForgeMeshEmitterManager(); public final TransformingVertexConsumer transformingWrapper = new TransformingVertexConsumer(); } } diff --git a/neoforge/src/lib/java/dev/engine_room/flywheel/lib/model/baked/NeoforgeMeshEmitter.java b/neoforge/src/lib/java/dev/engine_room/flywheel/lib/model/baked/NeoForgeMeshEmitter.java similarity index 66% rename from neoforge/src/lib/java/dev/engine_room/flywheel/lib/model/baked/NeoforgeMeshEmitter.java rename to neoforge/src/lib/java/dev/engine_room/flywheel/lib/model/baked/NeoForgeMeshEmitter.java index 46a56d58d..df0311298 100644 --- a/neoforge/src/lib/java/dev/engine_room/flywheel/lib/model/baked/NeoforgeMeshEmitter.java +++ b/neoforge/src/lib/java/dev/engine_room/flywheel/lib/model/baked/NeoForgeMeshEmitter.java @@ -7,47 +7,26 @@ import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.VertexConsumer; -import dev.engine_room.flywheel.api.material.Material; -import net.minecraft.client.renderer.block.ModelBlockRenderer; import net.minecraft.client.renderer.block.model.BakedQuad; import net.minecraft.client.renderer.chunk.ChunkSectionLayer; @ApiStatus.Internal -public class NeoforgeMeshEmitter extends MeshEmitter implements VertexConsumer { - private final ChunkSectionLayer chunkSectionLayer; +public class NeoForgeMeshEmitter extends MeshEmitter { + private boolean ao; - private boolean defaultAo; - - NeoforgeMeshEmitter(ByteBufferBuilderStack byteBufferBuilderStack, ChunkSectionLayer chunkSectionLayer) { + NeoForgeMeshEmitter(ByteBufferBuilderStack byteBufferBuilderStack, ChunkSectionLayer chunkSectionLayer) { super(byteBufferBuilderStack, chunkSectionLayer); - this.chunkSectionLayer = chunkSectionLayer; - } - - /** - * Some mods, like FramedBlocks, have custom hooks to determine the default AO. This method is invoked a second time - * from within a mixin to {@link ModelBlockRenderer} after the accurate value is computed, so we don't need to - * support those custom hooks manually. It is possible that the mixin injector will never run (primarily due to - * implementations of Fabric Renderer API on Forge, like Indigo in Forgified Fabric API), so we always compute the - * value manually beforehand too. - */ - public void prepareForModelLayer(boolean defaultAo) { - this.defaultAo = defaultAo; } - @Nullable - private BufferBuilder getBuffer(boolean shade, boolean ao) { - Material key = blockMaterialFunction.apply(chunkSectionLayer, shade, ao); - if (key != null) { - return getBuffer(key); - } else { - return null; - } + // Called from ModelBlockRendererMixin if AO is on for the model before each part is buffered + public void prepareForPart(boolean ao) { + this.ao = ao; } @Nullable private BufferBuilder getBuffer(BakedQuad quad) { boolean shade = quad.shade(); - boolean ao = quad.hasAmbientOcclusion() && defaultAo; + boolean ao = quad.hasAmbientOcclusion() && this.ao; return getBuffer(shade, ao); } @@ -103,7 +82,7 @@ public VertexConsumer setNormal(float normalX, float normalY, float normalZ) { } @Override - public VertexConsumer setLineWidth(float f) { + public VertexConsumer setLineWidth(float width) { throw new UnsupportedOperationException("NeoForgeMeshEmitter only supports putBulkData!"); } } diff --git a/neoforge/src/lib/java/dev/engine_room/flywheel/lib/model/baked/NeoForgeMeshEmitterManager.java b/neoforge/src/lib/java/dev/engine_room/flywheel/lib/model/baked/NeoForgeMeshEmitterManager.java new file mode 100644 index 000000000..37fff6759 --- /dev/null +++ b/neoforge/src/lib/java/dev/engine_room/flywheel/lib/model/baked/NeoForgeMeshEmitterManager.java @@ -0,0 +1,24 @@ +package dev.engine_room.flywheel.lib.model.baked; + +import java.util.function.Function; + +import com.mojang.blaze3d.vertex.VertexConsumer; + +import net.minecraft.client.renderer.chunk.ChunkSectionLayer; + +class NeoForgeMeshEmitterManager extends MeshEmitterManager implements Function { + NeoForgeMeshEmitterManager() { + super(NeoForgeMeshEmitter::new); + } + + public void prepareForModel(boolean ao) { + for (NeoForgeMeshEmitter meshEmitter : emitterMap.values()) { + meshEmitter.prepareForPart(ao); + } + } + + @Override + public VertexConsumer apply(ChunkSectionLayer chunkSectionLayer) { + return getEmitter(chunkSectionLayer); + } +} diff --git a/neoforge/src/lib/java/dev/engine_room/flywheel/lib/model/baked/NeoForgePartialModel.java b/neoforge/src/lib/java/dev/engine_room/flywheel/lib/model/baked/NeoForgePartialModel.java new file mode 100644 index 000000000..fd41ae250 --- /dev/null +++ b/neoforge/src/lib/java/dev/engine_room/flywheel/lib/model/baked/NeoForgePartialModel.java @@ -0,0 +1,62 @@ +package dev.engine_room.flywheel.lib.model.baked; + +import java.util.concurrent.ConcurrentMap; + +import org.jetbrains.annotations.ApiStatus; +import org.jetbrains.annotations.NotNull; + +import com.google.common.collect.MapMaker; + +import net.minecraft.client.renderer.block.model.BlockStateModel; +import net.minecraft.client.renderer.block.model.SimpleModelWrapper; +import net.minecraft.client.renderer.block.model.SingleVariant; +import net.minecraft.client.resources.model.BlockModelRotation; +import net.minecraft.client.resources.model.ModelBaker; +import net.minecraft.client.resources.model.ModelManager; +import net.minecraft.client.resources.model.ResolvableModel; +import net.minecraft.resources.Identifier; +import net.neoforged.neoforge.client.event.ModelEvent; +import net.neoforged.neoforge.client.model.standalone.StandaloneModelKey; +import net.neoforged.neoforge.client.model.standalone.UnbakedStandaloneModel; + +@ApiStatus.Internal +public class NeoForgePartialModel extends PartialModel { + private static final ConcurrentMap ALL = new MapMaker().weakValues().makeMap(); + + private final StandaloneModelKey<@NotNull BlockStateModel> key; + + public NeoForgePartialModel(Identifier modelId) { + super(modelId); + key = new StandaloneModelKey<>(modelId::toString); + } + + public static NeoForgePartialModel of(Identifier modelId) { + return ALL.computeIfAbsent(modelId, NeoForgePartialModel::new); + } + + public static void registerAll(ModelEvent.RegisterStandalone event) { + for (NeoForgePartialModel partial : ALL.values()) { + event.register(partial.key, partial.new Unbaked()); + } + } + + public static void refreshAll(ModelEvent.BakingCompleted event) { + ModelManager modelManager = event.getModelManager(); + + for (NeoForgePartialModel partial : ALL.values()) { + partial.blockStateModel = modelManager.getStandaloneModel(partial.key); + } + } + + private class Unbaked implements UnbakedStandaloneModel<@NotNull BlockStateModel> { + @Override + public BlockStateModel bake(ModelBaker baker) { + return new SingleVariant(SimpleModelWrapper.bake(baker, modelId, BlockModelRotation.IDENTITY)); + } + + @Override + public void resolveDependencies(ResolvableModel.Resolver resolver) { + resolver.markDependency(modelId); + } + } +} diff --git a/neoforge/src/lib/java/dev/engine_room/flywheel/lib/model/baked/PartialModelEventHandler.java b/neoforge/src/lib/java/dev/engine_room/flywheel/lib/model/baked/PartialModelEventHandler.java deleted file mode 100644 index ef99d740a..000000000 --- a/neoforge/src/lib/java/dev/engine_room/flywheel/lib/model/baked/PartialModelEventHandler.java +++ /dev/null @@ -1,30 +0,0 @@ -package dev.engine_room.flywheel.lib.model.baked; - -import java.util.Map; - -import net.minecraft.resources.Identifier; - -import org.jetbrains.annotations.ApiStatus; - -import net.neoforged.neoforge.client.event.ModelEvent; - -@ApiStatus.Internal -public final class PartialModelEventHandler { - private PartialModelEventHandler() { - } - - public static void onRegisterAdditional(ModelEvent.RegisterAdditional event) { - for (Identifier modelId : PartialModel.ALL.keySet()) { - event.register(ModelResourceLocation.standalone(modelId)); - } - } - - public static void onBakingCompleted(ModelEvent.BakingCompleted event) { - PartialModel.populateOnInit = true; - Map models = event.getModels(); - - for (PartialModel partial : PartialModel.ALL.values()) { - partial.blockStateModel = models.get(ModelResourceLocation.standalone(partial.modelId())); - } - } -} diff --git a/neoforge/src/main/java/dev/engine_room/flywheel/impl/FlwLibXplatImpl.java b/neoforge/src/main/java/dev/engine_room/flywheel/impl/FlwLibXplatImpl.java index 65d323aca..45d1ab393 100644 --- a/neoforge/src/main/java/dev/engine_room/flywheel/impl/FlwLibXplatImpl.java +++ b/neoforge/src/main/java/dev/engine_room/flywheel/impl/FlwLibXplatImpl.java @@ -1,13 +1,20 @@ package dev.engine_room.flywheel.impl; -import dev.engine_room.flywheel.lib.model.baked.BlockModelBuilder; - import dev.engine_room.flywheel.lib.internal.FlwLibXplat; import dev.engine_room.flywheel.lib.model.SimpleModel; +import dev.engine_room.flywheel.lib.model.baked.BlockModelBuilder; import dev.engine_room.flywheel.lib.model.baked.LevelModelBuilder; import dev.engine_room.flywheel.lib.model.baked.ModelBuilderImpl; +import dev.engine_room.flywheel.lib.model.baked.NeoForgePartialModel; +import dev.engine_room.flywheel.lib.model.baked.PartialModel; +import net.minecraft.resources.Identifier; public class FlwLibXplatImpl implements FlwLibXplat { + @Override + public PartialModel createPartialModel(Identifier modelId) { + return NeoForgePartialModel.of(modelId); + } + @Override public SimpleModel buildBlockModelBuilder(BlockModelBuilder builder) { return ModelBuilderImpl.buildBlockModelBuilder(builder); diff --git a/neoforge/src/main/java/dev/engine_room/flywheel/impl/FlywheelNeoForge.java b/neoforge/src/main/java/dev/engine_room/flywheel/impl/FlywheelNeoForge.java index bd21d07d0..2737c7f61 100644 --- a/neoforge/src/main/java/dev/engine_room/flywheel/impl/FlywheelNeoForge.java +++ b/neoforge/src/main/java/dev/engine_room/flywheel/impl/FlywheelNeoForge.java @@ -1,9 +1,5 @@ package dev.engine_room.flywheel.impl; -import dev.engine_room.flywheel.impl.FlwDebugInfo.FlwDebugEntry; -import dev.engine_room.flywheel.lib.util.IdentifierUtil; -import net.neoforged.neoforge.client.event.RegisterDebugEntriesEvent; - import org.apache.maven.artifact.versioning.ArtifactVersion; import org.jetbrains.annotations.UnknownNullability; @@ -13,7 +9,8 @@ import dev.engine_room.flywheel.backend.compile.FlwProgramsReloader; import dev.engine_room.flywheel.backend.engine.uniform.Uniforms; import dev.engine_room.flywheel.impl.visualization.VisualizationEventHandler; -import dev.engine_room.flywheel.lib.model.baked.PartialModelEventHandler; +import dev.engine_room.flywheel.lib.model.baked.NeoForgePartialModel; +import dev.engine_room.flywheel.lib.util.IdentifierUtil; import dev.engine_room.flywheel.lib.util.LevelAttached; import dev.engine_room.flywheel.lib.util.RendererReloadCache; import dev.engine_room.flywheel.lib.util.ResourceReloadHolder; @@ -25,7 +22,8 @@ import net.neoforged.fml.ModContainer; import net.neoforged.fml.common.Mod; import net.neoforged.fml.event.lifecycle.FMLCommonSetupEvent; -import net.neoforged.neoforge.client.event.CustomizeGuiOverlayEvent; +import net.neoforged.neoforge.client.event.AddClientReloadListenersEvent; +import net.neoforged.neoforge.client.event.RegisterDebugEntriesEvent; import net.neoforged.neoforge.common.NeoForge; import net.neoforged.neoforge.event.entity.EntityJoinLevelEvent; import net.neoforged.neoforge.event.entity.EntityLeaveLevelEvent; @@ -68,7 +66,7 @@ private static void registerImplEventListeners(IEventBus gameEventBus, IEventBus gameEventBus.addListener(FlwCommands::registerClientCommands); - gameEventBus.addListener((RegisterDebugEntriesEvent e) -> e.register(IdentifierUtil.id("flw_debug_info"), new FlwDebugEntry())); + gameEventBus.addListener((RegisterDebugEntriesEvent e) -> e.register(IdentifierUtil.id("flw_debug_info"), new FlwDebugInfo.FlwDebugEntry())); modEventBus.addListener((EndClientResourceReloadEvent e) -> BackendManagerImpl.onEndClientResourceReload(e.error().isPresent())); @@ -87,15 +85,15 @@ private static void registerLibEventListeners(IEventBus gameEventBus, IEventBus modEventBus.addListener((EndClientResourceReloadEvent e) -> RendererReloadCache.onReloadLevelRenderer()); modEventBus.addListener((EndClientResourceReloadEvent e) -> ResourceReloadHolder.onEndClientResourceReload()); - modEventBus.addListener(PartialModelEventHandler::onRegisterAdditional); - modEventBus.addListener(PartialModelEventHandler::onBakingCompleted); + modEventBus.addListener(NeoForgePartialModel::registerAll); + modEventBus.addListener(NeoForgePartialModel::refreshAll); } private static void registerBackendEventListeners(IEventBus gameEventBus, IEventBus modEventBus) { gameEventBus.addListener((ReloadLevelRendererEvent e) -> Uniforms.onReloadLevelRenderer()); - modEventBus.addListener((RegisterClientReloadListenersEvent e) -> { - e.registerReloadListener(FlwProgramsReloader.INSTANCE); + modEventBus.addListener((AddClientReloadListenersEvent e) -> { + e.addListener(FlwProgramsReloader.ID, FlwProgramsReloader.INSTANCE); }); } diff --git a/neoforge/src/main/java/dev/engine_room/flywheel/impl/mixin/neoforge/ModelBlockRendererMixin.java b/neoforge/src/main/java/dev/engine_room/flywheel/impl/mixin/neoforge/ModelBlockRendererMixin.java index dd5783e8a..38118a1ec 100644 --- a/neoforge/src/main/java/dev/engine_room/flywheel/impl/mixin/neoforge/ModelBlockRendererMixin.java +++ b/neoforge/src/main/java/dev/engine_room/flywheel/impl/mixin/neoforge/ModelBlockRendererMixin.java @@ -1,30 +1,24 @@ package dev.engine_room.flywheel.impl.mixin.neoforge; +import org.objectweb.asm.Opcodes; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.Slice; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import org.spongepowered.asm.mixin.injection.callback.LocalCapture; -import com.mojang.blaze3d.vertex.PoseStack; +import com.llamalad7.mixinextras.sugar.Local; import com.mojang.blaze3d.vertex.VertexConsumer; -import dev.engine_room.flywheel.lib.model.baked.NeoforgeMeshEmitter; -import net.minecraft.client.renderer.RenderType; +import dev.engine_room.flywheel.lib.model.baked.NeoForgeMeshEmitter; import net.minecraft.client.renderer.block.ModelBlockRenderer; -import net.minecraft.client.resources.model.BakedModel; -import net.minecraft.core.BlockPos; -import net.minecraft.util.RandomSource; -import net.minecraft.world.level.BlockAndTintGetter; -import net.minecraft.world.level.block.state.BlockState; -import net.neoforged.neoforge.client.model.data.ModelData; @Mixin(ModelBlockRenderer.class) abstract class ModelBlockRendererMixin { - @Inject(method = "tesselateBlock(Lnet/minecraft/world/level/BlockAndTintGetter;Lnet/minecraft/client/resources/model/BakedModel;Lnet/minecraft/world/level/block/state/BlockState;Lnet/minecraft/core/BlockPos;Lcom/mojang/blaze3d/vertex/PoseStack;Lcom/mojang/blaze3d/vertex/VertexConsumer;ZLnet/minecraft/util/RandomSource;JILnet/neoforged/neoforge/client/model/data/ModelData;Lnet/minecraft/client/renderer/RenderType;)V", at = @At(value = "INVOKE", target = "net/minecraft/world/level/block/state/BlockState.getOffset(Lnet/minecraft/world/level/BlockGetter;Lnet/minecraft/core/BlockPos;)Lnet/minecraft/world/phys/Vec3;"), locals = LocalCapture.CAPTURE_FAILSOFT, require = 0) - private void onTesselateBlock(BlockAndTintGetter level, BakedModel model, BlockState state, BlockPos pos, PoseStack poseStack, VertexConsumer consumer, boolean checkSides, RandomSource random, long seed, int packedOverlay, ModelData modelData, RenderType renderType, CallbackInfo ci, boolean ao) { - if (consumer instanceof NeoforgeMeshEmitter meshEmitter) { - meshEmitter.prepareForModelLayer(ao); + @Inject(method = "tesselateWithAO(Lnet/minecraft/world/level/BlockAndTintGetter;Ljava/util/List;Lnet/minecraft/world/level/block/state/BlockState;Lnet/minecraft/core/BlockPos;Lcom/mojang/blaze3d/vertex/PoseStack;Ljava/util/function/Function;ZI)V", at = @At(value = "FIELD", target = "net/minecraft/client/renderer/block/ModelBlockRenderer.DIRECTIONS : [Lnet/minecraft/core/Direction;", opcode = Opcodes.GETSTATIC), slice = @Slice(from = @At(value = "INVOKE", target = "Lnet/neoforged/neoforge/client/extensions/BlockModelPartExtension;getRenderType(Lnet/minecraft/world/level/block/state/BlockState;)Lnet/minecraft/client/renderer/chunk/ChunkSectionLayer;"))) + private void onTesselateWithAO(CallbackInfo ci, @Local VertexConsumer vertexConsumer, @Local(ordinal = 0) boolean ao) { + if (vertexConsumer instanceof NeoForgeMeshEmitter meshEmitter) { + meshEmitter.prepareForPart(ao); } } } diff --git a/neoforge/src/main/resources/flywheel.impl.neoforge.mixins.json b/neoforge/src/main/resources/flywheel.impl.neoforge.mixins.json deleted file mode 100644 index a9dfae6cf..000000000 --- a/neoforge/src/main/resources/flywheel.impl.neoforge.mixins.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "required": true, - "minVersion": "0.8", - "package" : "dev.engine_room.flywheel.impl.mixin.neoforge", - "compatibilityLevel": "JAVA_17", - "refmap": "flywheel.refmap.json", - "client": [ - "ModelBlockRendererMixin" - ], - "injectors": { - "defaultRequire": 1 - } -} diff --git a/neoforge/src/testMod/java/dev/engine_room/flywheel/FlywheelTestModClient.java b/neoforge/src/testMod/java/dev/engine_room/flywheel/FlywheelTestModClient.java index 0ecd54a87..67219c3f0 100644 --- a/neoforge/src/testMod/java/dev/engine_room/flywheel/FlywheelTestModClient.java +++ b/neoforge/src/testMod/java/dev/engine_room/flywheel/FlywheelTestModClient.java @@ -16,7 +16,7 @@ public class FlywheelTestModClient { private static final Logger LOGGER = LoggerFactory.getLogger(NAME); public FlywheelTestModClient() { - LOGGER.info("Starting {} on Dist: {}", NAME, FMLLoader.getDist()); + LOGGER.info("Starting {} on Dist: {}", NAME, FMLLoader.getCurrent().getDist()); NeoForge.EVENT_BUS.addListener((ClientTickEvent.Post e) -> { LOGGER.info("Running mixin audit"); From 4e9ac33feb9990b74f207829a522704ea7fce498 Mon Sep 17 00:00:00 2001 From: IThundxr Date: Thu, 8 Jan 2026 17:14:42 -0500 Subject: [PATCH 16/59] Fix accessor and sodium dependency --- common/build.gradle.kts | 10 ++++++---- .../engine_room/flywheel/lib/internal/FlwLibLink.java | 5 +++-- .../flywheel/lib/util/RecyclingPoseStack.java | 4 ++-- .../dev/engine_room/flywheel/impl/FlwLibLinkImpl.java | 7 ++++--- .../flywheel/impl/mixin/PoseStackAccessor.java | 7 ++++--- fabric/build.gradle.kts | 10 ++++++---- gradle.properties | 3 +-- neoforge/build.gradle.kts | 7 +++---- vanillinFabric/build.gradle.kts | 8 +++++--- vanillinNeoForge/build.gradle.kts | 5 ++--- 10 files changed, 36 insertions(+), 30 deletions(-) diff --git a/common/build.gradle.kts b/common/build.gradle.kts index b260c29af..bda8c2338 100644 --- a/common/build.gradle.kts +++ b/common/build.gradle.kts @@ -115,13 +115,15 @@ jarSets { } } +repositories { + maven("https://maven.caffeinemc.net/releases/") +} + dependencies { modCompileOnly("net.fabricmc:fabric-loader:${property("fabric_loader_version")}") - if (property("enable_sodium_and_iris").toString().toBoolean()) { - modCompileOnly("maven.modrinth:sodium:${property("sodium_version")}-fabric") - modCompileOnly("maven.modrinth:iris:${property("iris_version")}-fabric") - } + modCompileOnly("net.caffeinemc:sodium-fabric-api:${property("sodium_version")}") + modCompileOnly("maven.modrinth:iris:${property("iris_version")}-fabric") compileOnly(annotationProcessor("io.github.llamalad7:mixinextras-common:0.4.1")!!) diff --git a/common/src/lib/java/dev/engine_room/flywheel/lib/internal/FlwLibLink.java b/common/src/lib/java/dev/engine_room/flywheel/lib/internal/FlwLibLink.java index d8355e9f5..1d45106b9 100644 --- a/common/src/lib/java/dev/engine_room/flywheel/lib/internal/FlwLibLink.java +++ b/common/src/lib/java/dev/engine_room/flywheel/lib/internal/FlwLibLink.java @@ -1,11 +1,12 @@ package dev.engine_room.flywheel.lib.internal; -import java.util.Deque; +import java.util.List; import java.util.Map; import org.slf4j.Logger; import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.PoseStack.Pose; import com.mojang.blaze3d.vertex.VertexConsumer; import dev.engine_room.flywheel.api.internal.DependencyInjection; @@ -25,7 +26,7 @@ public interface FlwLibLink { void compileModelPart(ModelPart part, PoseStack.Pose pose, VertexConsumer consumer, int light, int overlay, int color); - Deque getPoseStack(PoseStack stack); + List getPoses(PoseStack stack); boolean affectedByCulling(T entity); diff --git a/common/src/lib/java/dev/engine_room/flywheel/lib/util/RecyclingPoseStack.java b/common/src/lib/java/dev/engine_room/flywheel/lib/util/RecyclingPoseStack.java index fb73e087a..1728ce671 100644 --- a/common/src/lib/java/dev/engine_room/flywheel/lib/util/RecyclingPoseStack.java +++ b/common/src/lib/java/dev/engine_room/flywheel/lib/util/RecyclingPoseStack.java @@ -29,14 +29,14 @@ public void pushPose() { .set(last.pose()); recycle.normal() .set(last.normal()); - FlwLibLink.INSTANCE.getPoseStack(this) + FlwLibLink.INSTANCE.getPoses(this) .addLast(recycle); } } @Override public void popPose() { - recycleBin.addLast(FlwLibLink.INSTANCE.getPoseStack(this) + recycleBin.addLast(FlwLibLink.INSTANCE.getPoses(this) .removeLast()); } } diff --git a/common/src/main/java/dev/engine_room/flywheel/impl/FlwLibLinkImpl.java b/common/src/main/java/dev/engine_room/flywheel/impl/FlwLibLinkImpl.java index cb8f3ddb3..a7c097a22 100644 --- a/common/src/main/java/dev/engine_room/flywheel/impl/FlwLibLinkImpl.java +++ b/common/src/main/java/dev/engine_room/flywheel/impl/FlwLibLinkImpl.java @@ -1,11 +1,12 @@ package dev.engine_room.flywheel.impl; -import java.util.Deque; +import java.util.List; import java.util.Map; import org.slf4j.Logger; import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.PoseStack.Pose; import com.mojang.blaze3d.vertex.VertexConsumer; import dev.engine_room.flywheel.impl.compat.IrisCompat; @@ -44,8 +45,8 @@ public void compileModelPart(ModelPart part, PoseStack.Pose pose, VertexConsumer } @Override - public Deque getPoseStack(PoseStack stack) { - return ((PoseStackAccessor) stack).flywheel$getPoseStack(); + public List getPoses(PoseStack stack) { + return ((PoseStackAccessor) stack).flywheel$getPoses(); } @Override diff --git a/common/src/main/java/dev/engine_room/flywheel/impl/mixin/PoseStackAccessor.java b/common/src/main/java/dev/engine_room/flywheel/impl/mixin/PoseStackAccessor.java index 22478d2a3..b2b1f88f3 100644 --- a/common/src/main/java/dev/engine_room/flywheel/impl/mixin/PoseStackAccessor.java +++ b/common/src/main/java/dev/engine_room/flywheel/impl/mixin/PoseStackAccessor.java @@ -1,14 +1,15 @@ package dev.engine_room.flywheel.impl.mixin; -import java.util.Deque; +import java.util.List; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.gen.Accessor; import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.PoseStack.Pose; @Mixin(PoseStack.class) public interface PoseStackAccessor { - @Accessor("poseStack") - Deque flywheel$getPoseStack(); + @Accessor("poses") + List flywheel$getPoses(); } diff --git a/fabric/build.gradle.kts b/fabric/build.gradle.kts index a67c82685..bd401a657 100644 --- a/fabric/build.gradle.kts +++ b/fabric/build.gradle.kts @@ -127,14 +127,16 @@ loom { } } +repositories { + maven("https://maven.caffeinemc.net/releases/") +} + dependencies { modImplementation("net.fabricmc:fabric-loader:${property("fabric_loader_version")}") modApi("net.fabricmc.fabric-api:fabric-api:${property("fabric_api_version")}") - if (property("enable_sodium_and_iris").toString().toBoolean()) { - modCompileOnly("maven.modrinth:sodium:${property("sodium_version")}-fabric") - modCompileOnly("maven.modrinth:iris:${property("iris_version")}-fabric") - } + modCompileOnly("net.caffeinemc:sodium-fabric-api:${property("sodium_version")}") + modCompileOnly("maven.modrinth:iris:${property("iris_version")}-fabric") "forApi"(project(path = common, configuration = "apiClasses")) "forLib"(project(path = common, configuration = "libClasses")) diff --git a/gradle.properties b/gradle.properties index d356c8f06..0e3e290aa 100644 --- a/gradle.properties +++ b/gradle.properties @@ -41,8 +41,7 @@ fabric_loader_version = 0.18.2 fabric_api_version = 0.140.2+1.21.11 # Build dependency mod versions -enable_sodium_and_iris = true -sodium_version = mc1.21.11-0.8.2 +sodium_version = 0.8.2+mc1.21.11 iris_version = 1.10.4+1.21.11 # Publication info diff --git a/neoforge/build.gradle.kts b/neoforge/build.gradle.kts index bc7ffb931..4dc0567e9 100644 --- a/neoforge/build.gradle.kts +++ b/neoforge/build.gradle.kts @@ -128,15 +128,14 @@ loom { repositories { maven("https://maven.neoforged.net/releases/") + maven("https://maven.caffeinemc.net/releases/") } dependencies { neoForge("net.neoforged:neoforge:${property("neoforge_version")}") - if (property("enable_sodium_and_iris").toString().toBoolean()) { - modCompileOnly("maven.modrinth:sodium:${property("sodium_version")}-neoforge") - modCompileOnly("maven.modrinth:iris:${property("iris_version")}-neoforge") - } + modCompileOnly("net.caffeinemc:sodium-neoforge-api:${property("sodium_version")}") + modCompileOnly("maven.modrinth:iris:${property("iris_version")}-neoforge") "forApi"(project(path = common, configuration = "apiClasses")) "forLib"(project(path = common, configuration = "libClasses")) diff --git a/vanillinFabric/build.gradle.kts b/vanillinFabric/build.gradle.kts index c8a0692a8..2a7b3da21 100644 --- a/vanillinFabric/build.gradle.kts +++ b/vanillinFabric/build.gradle.kts @@ -72,13 +72,15 @@ loom { } } +repositories { + maven("https://maven.caffeinemc.net/releases/") +} + dependencies { modImplementation("net.fabricmc:fabric-loader:${property("fabric_loader_version")}") modApi("net.fabricmc.fabric-api:fabric-api:${property("fabric_api_version")}") - if (property("enable_sodium_and_iris").toString().toBoolean()) { - modCompileOnly("maven.modrinth:sodium:${property("sodium_version")}-fabric") - } + modCompileOnly("net.caffeinemc:sodium-fabric-api:${property("sodium_version")}") compileOnly(project(path = common, configuration = "vanillinClasses")) compileOnly(project(path = common, configuration = "vanillinResources")) diff --git a/vanillinNeoForge/build.gradle.kts b/vanillinNeoForge/build.gradle.kts index 0de4f7de2..fe1d3b41a 100644 --- a/vanillinNeoForge/build.gradle.kts +++ b/vanillinNeoForge/build.gradle.kts @@ -75,14 +75,13 @@ loom { repositories { maven("https://maven.neoforged.net/releases/") + maven("https://maven.caffeinemc.net/releases/") } dependencies { neoForge("net.neoforged:neoforge:${property("neoforge_version")}") - if (property("enable_sodium_and_iris").toString().toBoolean()) { - modCompileOnly("maven.modrinth:sodium:${property("sodium_version")}-neoforge") - } + modCompileOnly("net.caffeinemc:sodium-neoforge-api:${property("sodium_version")}") compileOnly(project(path = common, configuration = "vanillinClasses")) compileOnly(project(path = common, configuration = "vanillinResources")) From 3f18374512f04dc1cfe33046a641dd695639e77b Mon Sep 17 00:00:00 2001 From: IThundxr Date: Thu, 8 Jan 2026 21:54:16 -0500 Subject: [PATCH 17/59] Remove RecyclingPoseStack --- .../flywheel/lib/internal/FlwLibLink.java | 4 -- .../flywheel/lib/util/RecyclingPoseStack.java | 42 ------------------- .../flywheel/impl/FlwLibLinkImpl.java | 8 ---- .../impl/mixin/PoseStackAccessor.java | 15 ------- 4 files changed, 69 deletions(-) delete mode 100644 common/src/lib/java/dev/engine_room/flywheel/lib/util/RecyclingPoseStack.java delete mode 100644 common/src/main/java/dev/engine_room/flywheel/impl/mixin/PoseStackAccessor.java diff --git a/common/src/lib/java/dev/engine_room/flywheel/lib/internal/FlwLibLink.java b/common/src/lib/java/dev/engine_room/flywheel/lib/internal/FlwLibLink.java index 1d45106b9..a6877dbb5 100644 --- a/common/src/lib/java/dev/engine_room/flywheel/lib/internal/FlwLibLink.java +++ b/common/src/lib/java/dev/engine_room/flywheel/lib/internal/FlwLibLink.java @@ -1,12 +1,10 @@ package dev.engine_room.flywheel.lib.internal; -import java.util.List; import java.util.Map; import org.slf4j.Logger; import com.mojang.blaze3d.vertex.PoseStack; -import com.mojang.blaze3d.vertex.PoseStack.Pose; import com.mojang.blaze3d.vertex.VertexConsumer; import dev.engine_room.flywheel.api.internal.DependencyInjection; @@ -26,8 +24,6 @@ public interface FlwLibLink { void compileModelPart(ModelPart part, PoseStack.Pose pose, VertexConsumer consumer, int light, int overlay, int color); - List getPoses(PoseStack stack); - boolean affectedByCulling(T entity); AABB getBoundingBoxForCulling(T entity); diff --git a/common/src/lib/java/dev/engine_room/flywheel/lib/util/RecyclingPoseStack.java b/common/src/lib/java/dev/engine_room/flywheel/lib/util/RecyclingPoseStack.java deleted file mode 100644 index 1728ce671..000000000 --- a/common/src/lib/java/dev/engine_room/flywheel/lib/util/RecyclingPoseStack.java +++ /dev/null @@ -1,42 +0,0 @@ -package dev.engine_room.flywheel.lib.util; - -import java.util.ArrayDeque; -import java.util.Deque; - -import com.mojang.blaze3d.vertex.PoseStack; - -import dev.engine_room.flywheel.lib.internal.FlwLibLink; - -/** - * A {@link PoseStack} that recycles {@link PoseStack.Pose} objects. - * - *

Vanilla's {@link PoseStack} can get quite expensive to use when each game object needs to - * maintain their own stack. This class helps alleviate memory pressure by making Pose objects - * long-lived. Note that this means that you CANNOT safely store a Pose object outside - * the RecyclingPoseStack that created it. - */ -public class RecyclingPoseStack extends PoseStack { - private final Deque recycleBin = new ArrayDeque<>(); - - @Override - public void pushPose() { - if (recycleBin.isEmpty()) { - super.pushPose(); - } else { - var last = last(); - var recycle = recycleBin.removeLast(); - recycle.pose() - .set(last.pose()); - recycle.normal() - .set(last.normal()); - FlwLibLink.INSTANCE.getPoses(this) - .addLast(recycle); - } - } - - @Override - public void popPose() { - recycleBin.addLast(FlwLibLink.INSTANCE.getPoses(this) - .removeLast()); - } -} diff --git a/common/src/main/java/dev/engine_room/flywheel/impl/FlwLibLinkImpl.java b/common/src/main/java/dev/engine_room/flywheel/impl/FlwLibLinkImpl.java index a7c097a22..f392720d5 100644 --- a/common/src/main/java/dev/engine_room/flywheel/impl/FlwLibLinkImpl.java +++ b/common/src/main/java/dev/engine_room/flywheel/impl/FlwLibLinkImpl.java @@ -1,12 +1,10 @@ package dev.engine_room.flywheel.impl; -import java.util.List; import java.util.Map; import org.slf4j.Logger; import com.mojang.blaze3d.vertex.PoseStack; -import com.mojang.blaze3d.vertex.PoseStack.Pose; import com.mojang.blaze3d.vertex.VertexConsumer; import dev.engine_room.flywheel.impl.compat.IrisCompat; @@ -14,7 +12,6 @@ import dev.engine_room.flywheel.impl.extension.PoseStackExtension; import dev.engine_room.flywheel.impl.mixin.EntityRendererAccessor; import dev.engine_room.flywheel.impl.mixin.ModelPartAccessor; -import dev.engine_room.flywheel.impl.mixin.PoseStackAccessor; import dev.engine_room.flywheel.lib.internal.FlwLibLink; import dev.engine_room.flywheel.lib.transform.PoseTransformStack; import net.minecraft.client.Minecraft; @@ -44,11 +41,6 @@ public void compileModelPart(ModelPart part, PoseStack.Pose pose, VertexConsumer ((ModelPartAccessor) (Object) part).flywheel$compile(pose, consumer, light, overlay, color); } - @Override - public List getPoses(PoseStack stack) { - return ((PoseStackAccessor) stack).flywheel$getPoses(); - } - @Override public boolean affectedByCulling(T entity) { EntityRenderer renderer = Minecraft.getInstance() diff --git a/common/src/main/java/dev/engine_room/flywheel/impl/mixin/PoseStackAccessor.java b/common/src/main/java/dev/engine_room/flywheel/impl/mixin/PoseStackAccessor.java deleted file mode 100644 index b2b1f88f3..000000000 --- a/common/src/main/java/dev/engine_room/flywheel/impl/mixin/PoseStackAccessor.java +++ /dev/null @@ -1,15 +0,0 @@ -package dev.engine_room.flywheel.impl.mixin; - -import java.util.List; - -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.gen.Accessor; - -import com.mojang.blaze3d.vertex.PoseStack; -import com.mojang.blaze3d.vertex.PoseStack.Pose; - -@Mixin(PoseStack.class) -public interface PoseStackAccessor { - @Accessor("poses") - List flywheel$getPoses(); -} From d133d443f2b702e6dd2b74f902d631ad9523a2d0 Mon Sep 17 00:00:00 2001 From: IThundxr Date: Fri, 9 Jan 2026 06:21:10 -0500 Subject: [PATCH 18/59] Update flywheel.impl.mixins.json --- common/src/main/resources/flywheel.impl.mixins.json | 1 - 1 file changed, 1 deletion(-) diff --git a/common/src/main/resources/flywheel.impl.mixins.json b/common/src/main/resources/flywheel.impl.mixins.json index 17127784d..08aa19656 100644 --- a/common/src/main/resources/flywheel.impl.mixins.json +++ b/common/src/main/resources/flywheel.impl.mixins.json @@ -13,7 +13,6 @@ "LevelRendererMixin", "MinecraftMixin", "ModelPartAccessor", - "PoseStackAccessor", "PoseStackMixin", "fix.FixFabulousDepthMixin", "visualmanage.BlockEntityMixin", From 4c5be619dc7914577408eea1358b8a478a07d90d Mon Sep 17 00:00:00 2001 From: IThundxr Date: Thu, 15 Jan 2026 20:53:00 -0500 Subject: [PATCH 19/59] Undo removal of flywheel.impl.neoforge.mixins.json --- .../mixin/neoforge/ModelBlockRendererMixin.java | 2 +- .../resources/flywheel.impl.neoforge.mixins.json | 13 +++++++++++++ 2 files changed, 14 insertions(+), 1 deletion(-) create mode 100644 neoforge/src/main/resources/flywheel.impl.neoforge.mixins.json diff --git a/neoforge/src/main/java/dev/engine_room/flywheel/impl/mixin/neoforge/ModelBlockRendererMixin.java b/neoforge/src/main/java/dev/engine_room/flywheel/impl/mixin/neoforge/ModelBlockRendererMixin.java index 38118a1ec..3dbd4c643 100644 --- a/neoforge/src/main/java/dev/engine_room/flywheel/impl/mixin/neoforge/ModelBlockRendererMixin.java +++ b/neoforge/src/main/java/dev/engine_room/flywheel/impl/mixin/neoforge/ModelBlockRendererMixin.java @@ -16,7 +16,7 @@ @Mixin(ModelBlockRenderer.class) abstract class ModelBlockRendererMixin { @Inject(method = "tesselateWithAO(Lnet/minecraft/world/level/BlockAndTintGetter;Ljava/util/List;Lnet/minecraft/world/level/block/state/BlockState;Lnet/minecraft/core/BlockPos;Lcom/mojang/blaze3d/vertex/PoseStack;Ljava/util/function/Function;ZI)V", at = @At(value = "FIELD", target = "net/minecraft/client/renderer/block/ModelBlockRenderer.DIRECTIONS : [Lnet/minecraft/core/Direction;", opcode = Opcodes.GETSTATIC), slice = @Slice(from = @At(value = "INVOKE", target = "Lnet/neoforged/neoforge/client/extensions/BlockModelPartExtension;getRenderType(Lnet/minecraft/world/level/block/state/BlockState;)Lnet/minecraft/client/renderer/chunk/ChunkSectionLayer;"))) - private void onTesselateWithAO(CallbackInfo ci, @Local VertexConsumer vertexConsumer, @Local(ordinal = 0) boolean ao) { + private void onTesselateWithAO(CallbackInfo ci, @Local VertexConsumer vertexConsumer, @Local(ordinal = 0, argsOnly = true) boolean ao) { if (vertexConsumer instanceof NeoForgeMeshEmitter meshEmitter) { meshEmitter.prepareForPart(ao); } diff --git a/neoforge/src/main/resources/flywheel.impl.neoforge.mixins.json b/neoforge/src/main/resources/flywheel.impl.neoforge.mixins.json new file mode 100644 index 000000000..a9dfae6cf --- /dev/null +++ b/neoforge/src/main/resources/flywheel.impl.neoforge.mixins.json @@ -0,0 +1,13 @@ +{ + "required": true, + "minVersion": "0.8", + "package" : "dev.engine_room.flywheel.impl.mixin.neoforge", + "compatibilityLevel": "JAVA_17", + "refmap": "flywheel.refmap.json", + "client": [ + "ModelBlockRendererMixin" + ], + "injectors": { + "defaultRequire": 1 + } +} From faf36232ec287a6193d84a67796ce327678dd954 Mon Sep 17 00:00:00 2001 From: AyOhEe <74308087+AyOhEe@users.noreply.github.com> Date: Fri, 16 Jan 2026 22:34:33 +0000 Subject: [PATCH 20/59] Modernise MinecartVisual Support for new and old rendering styles --- .../vanillin/visuals/MinecartVisual.java | 74 +++++++++++-------- 1 file changed, 42 insertions(+), 32 deletions(-) diff --git a/common/src/vanillin/java/dev/engine_room/vanillin/visuals/MinecartVisual.java b/common/src/vanillin/java/dev/engine_room/vanillin/visuals/MinecartVisual.java index dbe06008d..688828a11 100644 --- a/common/src/vanillin/java/dev/engine_room/vanillin/visuals/MinecartVisual.java +++ b/common/src/vanillin/java/dev/engine_room/vanillin/visuals/MinecartVisual.java @@ -1,5 +1,12 @@ package dev.engine_room.vanillin.visuals; +import com.mojang.math.Axis; + +import net.minecraft.world.entity.vehicle.minecart.MinecartBehavior; +import net.minecraft.world.entity.vehicle.minecart.NewMinecartBehavior; + +import net.minecraft.world.entity.vehicle.minecart.OldMinecartBehavior; + import org.joml.Matrix4f; import org.joml.Matrix4fStack; import org.jspecify.annotations.Nullable; @@ -56,12 +63,8 @@ public MinecartVisual(VisualizationContext ctx, T entity, float partialTick, Mod private TransformedInstance createContentsInstance() { RenderShape shape = blockState.getRenderShape(); - if (shape == RenderShape.ENTITYBLOCK_ANIMATED) { - instances.visible(false); - return null; - } - if (shape == RenderShape.INVISIBLE) { + instances.visible(false); return null; } @@ -104,7 +107,6 @@ private void updateInstances(float partialTick) { var renderOrigin = renderOrigin(); stack.translate((float) (posX - renderOrigin.getX()), (float) (posY - renderOrigin.getY()), (float) (posZ - renderOrigin.getZ())); - float yaw = Mth.lerp(partialTick, entity.yRotO, entity.getYRot()); long randomBits = entity.getId() * 493286711L; randomBits = randomBits * randomBits * 4392167121L + randomBits * 98761L; @@ -113,33 +115,13 @@ private void updateInstances(float partialTick) { float nudgeZ = (((float) (randomBits >> 24 & 7L) + 0.5f) / 8.0f - 0.5F) * 0.004f; stack.translate(nudgeX, nudgeY, nudgeZ); - Vec3 pos = entity.getPos(posX, posY, posZ); - float pitch = Mth.lerp(partialTick, entity.xRotO, entity.getXRot()); - if (pos != null) { - Vec3 offset1 = entity.getPosOffs(posX, posY, posZ, 0.3F); - Vec3 offset2 = entity.getPosOffs(posX, posY, posZ, -0.3F); - - if (offset1 == null) { - offset1 = pos; - } - - if (offset2 == null) { - offset2 = pos; - } - - stack.translate((float) (pos.x - posX), (float) ((offset1.y + offset2.y) / 2.0D - posY), (float) (pos.z - posZ)); - Vec3 vec = offset2.add(-offset1.x, -offset1.y, -offset1.z); - if (vec.length() != 0.0D) { - vec = vec.normalize(); - yaw = (float) (Math.atan2(vec.z, vec.x) * 180.0D / Math.PI); - pitch = (float) (Math.atan(vec.y) * 73.0D); - } + MinecartBehavior behaviour = entity.getBehavior(); + if (behaviour instanceof NewMinecartBehavior nmb) { + newRender(partialTick, nmb); + } else if (behaviour instanceof OldMinecartBehavior omb) { + oldRender(partialTick, omb, posX, posY, posZ); } - stack.translate(0.0F, 0.375F, 0.0F); - stack.rotateY((180 - yaw) * Mth.DEG_TO_RAD); - stack.rotateZ(-pitch * Mth.DEG_TO_RAD); - float hurtTime = entity.getHurtTime() - partialTick; float damage = entity.getDamage() - partialTick; @@ -168,6 +150,34 @@ private void updateInstances(float partialTick) { updateLight(partialTick); } + private void newRender(float partialTick, NewMinecartBehavior behavior) { + stack.rotateY(behavior.getCartLerpYRot(partialTick) * Mth.DEG_TO_RAD); + stack.rotateZ(-behavior.getCartLerpXRot(partialTick) * Mth.DEG_TO_RAD); + stack.translate(0.0F, 0.375F, 0.0F); + } + + private void oldRender(float partialTick, OldMinecartBehavior behavior, double posX, double posY, double posZ) { + Vec3 pos = behavior.getPos(posX, posY, posZ); + float pitch = Mth.lerp(partialTick, entity.xRotO, entity.getXRot()); + float yaw = Mth.lerp(partialTick, entity.yRotO, entity.getYRot()); + if (pos != null) { + Vec3 frontPos = behavior.getPosOffs(posX, posY, posZ, 0.3F); + Vec3 backPos = behavior.getPosOffs(posX, posY, posZ, -0.3F); + + stack.translate((float) (pos.x - posX), (float) ((frontPos.y + backPos.y) / 2.0D - posY), (float) (pos.z - posZ)); + Vec3 vec = backPos.add(-frontPos.x, -frontPos.y, -frontPos.z); + if (vec.length() != 0.0D) { + vec = vec.normalize(); + yaw = (float) (Math.atan2(vec.z, vec.x) * 180.0D / Math.PI); + pitch = (float) (Math.atan(vec.y) * 73.0D); + } + } + + stack.translate(0.0F, 0.375F, 0.0F); + stack.rotateY((180 - yaw) * Mth.DEG_TO_RAD); + stack.rotateZ(-pitch * Mth.DEG_TO_RAD); + } + protected void updateContents(TransformedInstance contents, Matrix4f pose, float partialTick) { contents.setTransform(pose) .setChanged(); @@ -191,6 +201,6 @@ protected void _delete() { } public static boolean shouldSkipRender(AbstractMinecart minecart) { - return minecart.getDisplayBlockState().getRenderShape() != RenderShape.ENTITYBLOCK_ANIMATED; + return minecart.getDisplayBlockState().getRenderShape() != RenderShape.MODEL; } } From 606e3021a5a360f65c864cc5253565d13004af21 Mon Sep 17 00:00:00 2001 From: AyOhEe <74308087+AyOhEe@users.noreply.github.com> Date: Fri, 23 Jan 2026 17:27:46 +0000 Subject: [PATCH 21/59] Update expected exception wording of testMalformedInclude --- .../flywheel/backend/glsl/TestShaderSourceLoading.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/src/test/java/dev/engine_room/flywheel/backend/glsl/TestShaderSourceLoading.java b/common/src/test/java/dev/engine_room/flywheel/backend/glsl/TestShaderSourceLoading.java index 521a57424..afbcb842a 100644 --- a/common/src/test/java/dev/engine_room/flywheel/backend/glsl/TestShaderSourceLoading.java +++ b/common/src/test/java/dev/engine_room/flywheel/backend/glsl/TestShaderSourceLoading.java @@ -63,7 +63,7 @@ void testMalformedInclude() { var malformedInclude = assertSimpleNestedErrorsToDepth(LoadError.MalformedInclude.class, aErr, 1); var message = malformedInclude.exception() .getMessage(); - assertEquals("Non [a-z0-9/._-] character in path of id: flywheel:evil - wow", message); + assertEquals("Non [a-z0-9/._-] character in path of location: flywheel:evil - wow", message); } @Test From 830ba531c6bf1e1a7bd56cc22c0c6ec462b0d2aa Mon Sep 17 00:00:00 2001 From: IThundxr Date: Mon, 2 Feb 2026 21:49:09 -0500 Subject: [PATCH 22/59] Disable vanillin, more porting --- .../gradle/subproject/SubprojectExtension.kt | 9 +- .../backend/mixin/FogRendererMixin.java | 6 +- .../impl/mixin/LevelRendererMixin.java | 5 +- .../impl/mixin/fix/FixFabulousDepthMixin.java | 14 +- .../engine_room/vanillin/VanillaVisuals.java | 34 +- .../engine_room/vanillin/VisualElements.java | 13 +- .../engine_room/vanillin/item/ItemModels.java | 601 +++++++++--------- .../vanillin/visuals/ItemDisplayVisual.java | 297 ++++----- .../vanillin/visuals/ItemFrameVisual.java | 349 +++++----- .../vanillin/visuals/ItemVisual.java | 305 ++++----- .../vanillin/visuals/MinecartVisual.java | 10 +- .../flywheel.impl.fabric.mixins.json | 1 - .../vanillin/VanillinXplatImpl.java | 15 - .../fabric/mixin/item/ItemColorsAccessor.java | 14 - .../fabric/mixin/item/MinecraftAccessor.java | 13 - .../resources/vanillin.fabric.mixins.json | 2 - .../vanillin/VanillinXplatImpl.java | 19 +- .../mixin/item/ItemColorsAccessor.java | 16 - .../resources/vanillin.neoforge.mixins.json | 1 - 19 files changed, 821 insertions(+), 903 deletions(-) delete mode 100644 vanillinFabric/src/main/java/dev/engine_room/vanillin/fabric/mixin/item/ItemColorsAccessor.java delete mode 100644 vanillinFabric/src/main/java/dev/engine_room/vanillin/fabric/mixin/item/MinecraftAccessor.java delete mode 100644 vanillinNeoForge/src/main/java/dev/engine_room/vanillin/neoforge/mixin/item/ItemColorsAccessor.java diff --git a/buildSrc/src/main/kotlin/dev/engine_room/gradle/subproject/SubprojectExtension.kt b/buildSrc/src/main/kotlin/dev/engine_room/gradle/subproject/SubprojectExtension.kt index 985f41ef0..c8d1775fb 100644 --- a/buildSrc/src/main/kotlin/dev/engine_room/gradle/subproject/SubprojectExtension.kt +++ b/buildSrc/src/main/kotlin/dev/engine_room/gradle/subproject/SubprojectExtension.kt @@ -106,7 +106,7 @@ open class SubprojectExtension(val project: Project) { add("minecraft", "com.mojang:minecraft:${minecraft_version}") add("mappings", loom.layered { - officialMojangMappings() + officialMojangMappings { nameSyntheticMembers = false } if (parchment_version != "none") parchment("org.parchmentmc.data:parchment-${parchment_minecraft_version}:${parchment_version}@zip") }) @@ -137,9 +137,10 @@ open class SubprojectExtension(val project: Project) { } withType().configureEach { - from("${project.rootDir}/LICENSE.md") { - into("META-INF") - } + // TODO +// from("${project.rootDir}/LICENSE.md") { +// into("META-INF") +// } } withType().configureEach { diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/mixin/FogRendererMixin.java b/common/src/backend/java/dev/engine_room/flywheel/backend/mixin/FogRendererMixin.java index af60a24d4..d0b9bb098 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/mixin/FogRendererMixin.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/mixin/FogRendererMixin.java @@ -4,7 +4,7 @@ import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import com.llamalad7.mixinextras.sugar.Local; @@ -14,8 +14,8 @@ @Mixin(FogRenderer.class) abstract class FogRendererMixin { - @Inject(method = "setupFog(Lnet/minecraft/client/Camera;ILnet/minecraft/client/DeltaTracker;FLnet/minecraft/client/multiplayer/ClientLevel;)Lorg/joml/Vector4f;", at = @At("RETURN")) - private static void flywheel$onReturnSetupFog(CallbackInfo ci, @Local Vector4f fogColor, @Local FogData fogData) { + @Inject(method = "setupFog(Lnet/minecraft/client/Camera;ILnet/minecraft/client/DeltaTracker;FLnet/minecraft/client/multiplayer/ClientLevel;)Lorg/joml/Vector4f;", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/fog/FogRenderer;updateBuffer(Ljava/nio/ByteBuffer;ILorg/joml/Vector4f;FFFFFF)V")) + private static void flywheel$onReturnSetupFog(CallbackInfoReturnable cir, @Local Vector4f fogColor, @Local FogData fogData) { FogUniforms.update(fogColor, fogData.environmentalStart, fogData.environmentalEnd, fogData.renderDistanceStart, fogData.renderDistanceEnd, fogData.skyEnd, fogData.cloudEnd); } } diff --git a/common/src/main/java/dev/engine_room/flywheel/impl/mixin/LevelRendererMixin.java b/common/src/main/java/dev/engine_room/flywheel/impl/mixin/LevelRendererMixin.java index db8186e9a..181f62777 100644 --- a/common/src/main/java/dev/engine_room/flywheel/impl/mixin/LevelRendererMixin.java +++ b/common/src/main/java/dev/engine_room/flywheel/impl/mixin/LevelRendererMixin.java @@ -73,8 +73,7 @@ abstract class LevelRendererMixin { } } - // TODO 1.21.11: update this injection point - @Inject(method = "lambda$addMainPass$1", at = @At(value = "INVOKE_STRING", target = "Lnet/minecraft/util/profiling/ProfilerFiller;popPush(Ljava/lang/String;)V", args = "ldc=submitBlockEntities")) + @Inject(method = "method_62214", at = @At(value = "INVOKE_STRING", target = "Lnet/minecraft/util/profiling/ProfilerFiller;popPush(Ljava/lang/String;)V", args = "ldc=submitBlockEntities")) private void flywheel$beforeBlockEntities(CallbackInfo ci) { if (flywheel$renderContext != null) { VisualizationManager manager = VisualizationManager.get(level); @@ -84,7 +83,7 @@ abstract class LevelRendererMixin { } } - @Inject(method = "lambda$addMainPass$1", at = @At(value = "INVOKE_STRING", target = "Lnet/minecraft/util/profiling/ProfilerFiller;push(Ljava/lang/String;)V", args = "ldc=destroyProgress")) + @Inject(method = "method_62214", at = @At(value = "INVOKE_STRING", target = "Lnet/minecraft/util/profiling/ProfilerFiller;push(Ljava/lang/String;)V", args = "ldc=destroyProgress")) private void flywheel$beforeRenderCrumbling(CallbackInfo ci) { if (flywheel$renderContext != null) { VisualizationManager manager = VisualizationManager.get(level); diff --git a/common/src/main/java/dev/engine_room/flywheel/impl/mixin/fix/FixFabulousDepthMixin.java b/common/src/main/java/dev/engine_room/flywheel/impl/mixin/fix/FixFabulousDepthMixin.java index b8298914b..69cc330de 100644 --- a/common/src/main/java/dev/engine_room/flywheel/impl/mixin/fix/FixFabulousDepthMixin.java +++ b/common/src/main/java/dev/engine_room/flywheel/impl/mixin/fix/FixFabulousDepthMixin.java @@ -1,18 +1,14 @@ package dev.engine_room.flywheel.impl.mixin.fix; import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -import com.mojang.blaze3d.opengl.GlStateManager; import net.minecraft.client.renderer.LevelRenderer; @Mixin(LevelRenderer.class) abstract class FixFabulousDepthMixin { - @Inject(method = "renderLevel", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/PostChain;process(F)V", ordinal = 1)) - private void flywheel$disableTransparencyShaderDepth(CallbackInfo ci) { - GlStateManager._depthMask(false); - } + // TODO 1.21.11: Is this still needed? +// @Inject(method = "renderLevel", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/PostChain;process(F)V", ordinal = 1)) +// private void flywheel$disableTransparencyShaderDepth(CallbackInfo ci) { +// GlStateManager._depthMask(false); +// } } diff --git a/common/src/vanillin/java/dev/engine_room/vanillin/VanillaVisuals.java b/common/src/vanillin/java/dev/engine_room/vanillin/VanillaVisuals.java index 51961bb15..c116f86ae 100644 --- a/common/src/vanillin/java/dev/engine_room/vanillin/VanillaVisuals.java +++ b/common/src/vanillin/java/dev/engine_room/vanillin/VanillaVisuals.java @@ -18,15 +18,12 @@ import dev.engine_room.vanillin.visuals.BellVisual; import dev.engine_room.vanillin.visuals.BlockDisplayVisual; import dev.engine_room.vanillin.visuals.ChestVisual; -import dev.engine_room.vanillin.visuals.ItemDisplayVisual; -import dev.engine_room.vanillin.visuals.ItemFrameVisual; import dev.engine_room.vanillin.visuals.MinecartVisual; import dev.engine_room.vanillin.visuals.ShulkerBoxVisual; import net.minecraft.client.model.geom.ModelLayerLocation; import net.minecraft.client.model.geom.ModelLayers; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.EntityType; -import net.minecraft.world.entity.decoration.ItemFrame; import net.minecraft.world.entity.vehicle.minecart.AbstractMinecart; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.entity.BlockEntityType; @@ -61,11 +58,12 @@ public static void init() { builder(EntityType.BLOCK_DISPLAY).factory(BlockDisplayVisual::new) .apply(STABLE); - composable(EntityType.ITEM_DISPLAY).with(element(VisualElements.ITEM_DISPLAY).build()) - .shouldVisualize((ctx, e) -> ItemDisplayVisual.shouldVisualize(e)) - .build() - .skipVanillaRender(ItemDisplayVisual::shouldVisualize) - .apply(EXPERIMENTAL); + // FIXME 1.21.11: port +// composable(EntityType.ITEM_DISPLAY).with(element(VisualElements.ITEM_DISPLAY).build()) +// .shouldVisualize((ctx, e) -> ItemDisplayVisual.shouldVisualize(e)) +// .build() +// .skipVanillaRender(ItemDisplayVisual::shouldVisualize) +// .apply(EXPERIMENTAL); minecart(EntityType.CHEST_MINECART, ModelLayers.CHEST_MINECART) .apply(STABLE); @@ -89,8 +87,9 @@ public static void init() { .skipVanillaRender(MinecartVisual::shouldSkipRender) .apply(STABLE); - itemFrame(EntityType.ITEM_FRAME).apply(EXPERIMENTAL); - itemFrame(EntityType.GLOW_ITEM_FRAME).apply(EXPERIMENTAL); + // FIXME 1.21.11: port +// itemFrame(EntityType.ITEM_FRAME).apply(EXPERIMENTAL); +// itemFrame(EntityType.GLOW_ITEM_FRAME).apply(EXPERIMENTAL); // FIXME 1.21.11: port // composable(EntityType.ITEM).apply(VanillaVisuals::commonElements) @@ -110,13 +109,14 @@ public static void commonElements(EntityBuilder builder) { .build()); } - public static EntityVisualizerBuilder itemFrame(EntityType type) { - return composable(type).apply(VanillaVisuals::commonElements) - .with(element(VisualElements.ITEM_FRAME).build()) - .shouldVisualize((ctx, entity) -> ItemFrameVisual.shouldVisualize(entity)) - .build() - .skipVanillaRender(ItemFrameVisual::shouldVisualize); - } + // FIXME 1.21.11: port +// public static EntityVisualizerBuilder itemFrame(EntityType type) { +// return composable(type).apply(VanillaVisuals::commonElements) +// .with(element(VisualElements.ITEM_FRAME).build()) +// .shouldVisualize((ctx, entity) -> ItemFrameVisual.shouldVisualize(entity)) +// .build() +// .skipVanillaRender(ItemFrameVisual::shouldVisualize); +// } public static EntityVisualizerBuilder minecart(EntityType type, ModelLayerLocation variant) { return composable(type).apply(VanillaVisuals::commonElements) diff --git a/common/src/vanillin/java/dev/engine_room/vanillin/VisualElements.java b/common/src/vanillin/java/dev/engine_room/vanillin/VisualElements.java index 9345e8f83..2982e213c 100644 --- a/common/src/vanillin/java/dev/engine_room/vanillin/VisualElements.java +++ b/common/src/vanillin/java/dev/engine_room/vanillin/VisualElements.java @@ -5,16 +5,11 @@ import dev.engine_room.vanillin.elements.HitboxElement; import dev.engine_room.vanillin.elements.ShadowElement; import dev.engine_room.vanillin.visuals.BlockDisplayVisual; -import dev.engine_room.vanillin.visuals.ItemDisplayVisual; -import dev.engine_room.vanillin.visuals.ItemFrameVisual; -import dev.engine_room.vanillin.visuals.ItemVisual; import dev.engine_room.vanillin.visuals.MinecartVisual; import dev.engine_room.vanillin.visuals.TntMinecartVisual; import net.minecraft.client.model.geom.ModelLayerLocation; import net.minecraft.world.entity.Display; import net.minecraft.world.entity.Entity; -import net.minecraft.world.entity.decoration.ItemFrame; -import net.minecraft.world.entity.item.ItemEntity; import net.minecraft.world.entity.vehicle.minecart.AbstractMinecart; import net.minecraft.world.entity.vehicle.minecart.MinecartTNT; @@ -24,10 +19,12 @@ public class VisualElements { public static final VisualElement SHADOW = ShadowElement::new; public static final VisualElement.Unit FIRE = FireElement::new; - public static final VisualElement.Unit ITEM_ENTITY = ItemVisual::new; - public static final VisualElement.Unit ITEM_DISPLAY = ItemDisplayVisual::new; + // FIXME 1.21.11: port +// public static final VisualElement.Unit ITEM_ENTITY = ItemVisual::new; +// public static final VisualElement.Unit ITEM_DISPLAY = ItemDisplayVisual::new; public static final VisualElement.Unit BLOCK_DISPLAY = BlockDisplayVisual::new; - public static final VisualElement.Unit ITEM_FRAME = ItemFrameVisual::new; + // FIXME 1.21.11: port +// public static final VisualElement.Unit ITEM_FRAME = ItemFrameVisual::new; public static final VisualElement MINECART = MinecartVisual::new; public static final VisualElement.Unit TNT_MINECART = TntMinecartVisual::new; diff --git a/common/src/vanillin/java/dev/engine_room/vanillin/item/ItemModels.java b/common/src/vanillin/java/dev/engine_room/vanillin/item/ItemModels.java index 1dff8a2c8..cf122ba00 100644 --- a/common/src/vanillin/java/dev/engine_room/vanillin/item/ItemModels.java +++ b/common/src/vanillin/java/dev/engine_room/vanillin/item/ItemModels.java @@ -1,300 +1,301 @@ -package dev.engine_room.vanillin.item; - -import java.nio.ByteBuffer; -import java.nio.IntBuffer; -import java.util.ArrayList; -import java.util.HashSet; -import java.util.List; -import java.util.Set; - -import org.joml.Matrix3f; -import org.joml.Matrix4f; -import org.joml.Vector3f; -import org.joml.Vector4f; -import org.jspecify.annotations.Nullable; -import org.lwjgl.system.MemoryStack; - -import com.mojang.blaze3d.vertex.DefaultVertexFormat; -import com.mojang.blaze3d.vertex.PoseStack; - -import dev.engine_room.flywheel.api.material.Material; -import dev.engine_room.flywheel.api.material.Transparency; -import dev.engine_room.flywheel.api.model.Mesh; -import dev.engine_room.flywheel.api.model.Model; -import dev.engine_room.flywheel.lib.material.Materials; -import dev.engine_room.flywheel.lib.material.SimpleMaterial; -import dev.engine_room.flywheel.lib.memory.MemoryBlock; -import dev.engine_room.flywheel.lib.model.ModelUtil; -import dev.engine_room.flywheel.lib.model.SimpleModel; -import dev.engine_room.flywheel.lib.model.SimpleQuadMesh; -import dev.engine_room.flywheel.lib.model.SingleMeshModel; -import dev.engine_room.flywheel.lib.util.RendererReloadCache; -import dev.engine_room.flywheel.lib.vertex.FullVertexView; -import dev.engine_room.vanillin.Vanillin; -import dev.engine_room.vanillin.VanillinXplat; -import dev.engine_room.vanillin.mixin.item.ItemOverridesAccessor; -import net.minecraft.client.Minecraft; -import net.minecraft.client.multiplayer.ClientLevel; -import net.minecraft.client.renderer.ItemBlockRenderTypes; -import net.minecraft.client.renderer.block.model.BakedQuad; -import net.minecraft.client.renderer.block.model.ItemOverrides; -import net.minecraft.client.renderer.item.ItemModel; -import net.minecraft.client.renderer.texture.OverlayTexture; -import net.minecraft.client.resources.model.BakedModel; -import net.minecraft.client.resources.model.ModelResourceLocation; -import net.minecraft.client.resources.model.MultiPartBakedModel; -import net.minecraft.client.resources.model.SimpleBakedModel; -import net.minecraft.client.resources.model.WeightedBakedModel; -import net.minecraft.core.Direction; -import net.minecraft.core.component.DataComponents; -import net.minecraft.core.registries.Registries; -import net.minecraft.data.models.ItemModelGenerators; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.tags.TagKey; -import net.minecraft.util.RandomSource; -import net.minecraft.world.item.BlockItem; -import net.minecraft.world.item.Item; -import net.minecraft.world.item.ItemDisplayContext; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.Items; -import net.minecraft.world.level.Level; -import net.minecraft.world.level.block.HalfTransparentBlock; -import net.minecraft.world.level.block.StainedGlassPaneBlock; - -public class ItemModels { - public static final TagKey NO_INSTANCING = TagKey.create(Registries.ITEM, Vanillin.id("no_instancing")); - - private static final Model EMPTY_MODEL = new SimpleModel(List.of()); - private static final RendererReloadCache MESH_CACHE = new RendererReloadCache<>(key -> bakeMesh(key.model(), key.displayContext())); - private static final RendererReloadCache MODEL_CACHE = new RendererReloadCache<>(key -> bakeModel(key.model(), key.displayContext(), key.material(), key.foil())); - - private static final ModelResourceLocation TRIDENT_MODEL = ModelResourceLocation.vanilla("trident", "inventory"); - private static final ModelResourceLocation SPYGLASS_MODEL = ModelResourceLocation.vanilla("spyglass", "inventory"); - - private static final @Nullable Direction[] DIRECTIONS = new Direction[]{Direction.DOWN, Direction.UP, Direction.NORTH, Direction.SOUTH, Direction.WEST, Direction.EAST, null}; - - private static final Set ALLOWED_OVERRIDES = new HashSet<>(); - - static { - ALLOWED_OVERRIDES.add(ResourceLocation.withDefaultNamespace("lefthanded")); - ALLOWED_OVERRIDES.add(ResourceLocation.withDefaultNamespace("cooldown")); - ALLOWED_OVERRIDES.add(ItemModelGenerators.TRIM_TYPE_PREDICATE_ID); - ALLOWED_OVERRIDES.add(ResourceLocation.withDefaultNamespace("custom_model_data")); - ALLOWED_OVERRIDES.add(ResourceLocation.withDefaultNamespace("pull")); - ALLOWED_OVERRIDES.add(ResourceLocation.withDefaultNamespace("brushing")); - ALLOWED_OVERRIDES.add(ResourceLocation.withDefaultNamespace("pulling")); - ALLOWED_OVERRIDES.add(ResourceLocation.withDefaultNamespace("filled")); - ALLOWED_OVERRIDES.add(ResourceLocation.withDefaultNamespace("charged")); - ALLOWED_OVERRIDES.add(ResourceLocation.withDefaultNamespace("firework")); - ALLOWED_OVERRIDES.add(ResourceLocation.withDefaultNamespace("broken")); - ALLOWED_OVERRIDES.add(ResourceLocation.withDefaultNamespace("cast")); - ALLOWED_OVERRIDES.add(ResourceLocation.withDefaultNamespace("blocking")); - ALLOWED_OVERRIDES.add(ResourceLocation.withDefaultNamespace("throwing")); - ALLOWED_OVERRIDES.add(ResourceLocation.withDefaultNamespace("level")); - ALLOWED_OVERRIDES.add(ResourceLocation.withDefaultNamespace("tooting")); - } - - public static boolean isSupported(ItemStack stack) { - return !stack.is(NO_INSTANCING) && doesNotHaveItemColors(stack.getItem()) && isSupported(getModel(stack)); - } - - private static boolean doesNotHaveItemColors(Item item) { - return VanillinXplat.INSTANCE.itemColors(item) == null; - } - - public static ItemModel getModel(ItemStack stack) { - return Minecraft.getInstance() - .getModelManager() - .getItemModel(stack.get(DataComponents.ITEM_MODEL)); - } - - @Nullable - public static BakedModel getActualBakedModel(@Nullable ClientLevel clientLevel, ItemStack itemStack, ItemDisplayContext displayContext) { - if (itemStack.isEmpty()) { - return null; - } - - var baseModel = getModel(itemStack); - var overrides = baseModel.getOverrides(); - var model = overrides.resolve(baseModel, itemStack, clientLevel, null, 0); - - if (model == null) { - model = baseModel; - } - - boolean notEquipped = displayContext == ItemDisplayContext.GUI || displayContext == ItemDisplayContext.GROUND || displayContext == ItemDisplayContext.FIXED; - if (model.isCustomRenderer() || itemStack.is(Items.TRIDENT) && !notEquipped) { - return null; - } - - if (notEquipped) { - if (itemStack.is(Items.TRIDENT)) { - model = Minecraft.getInstance() - .getItemRenderer() - .getItemModelShaper() - .getModelManager() - .getModel(TRIDENT_MODEL); - } else if (itemStack.is(Items.SPYGLASS)) { - model = Minecraft.getInstance() - .getItemRenderer() - .getItemModelShaper() - .getModelManager() - .getModel(SPYGLASS_MODEL); - } - } - - return model; - } - - public static boolean isSupported(BakedModel model) { - if (model.isCustomRenderer()) { - return false; - } - - var overrides = model.getOverrides(); - if (overrides != ItemOverrides.EMPTY) { - var properties = ((ItemOverridesAccessor) overrides).vanillin$properties(); - - for (var property : properties) { - if (!ALLOWED_OVERRIDES.contains(property)) { - return false; - } - } - } - - // Check for class equality rather than instanceof to ensure subclasses are *not* handled by vanillin. - Class c = model.getClass(); - if (!(c == SimpleBakedModel.class || c == MultiPartBakedModel.class || c == WeightedBakedModel.class)) { - return false; - } - - return true; - } - - public static Model get(Level level, ItemStack itemStack, ItemDisplayContext displayContext) { - boolean cull = displayContext == ItemDisplayContext.GUI || displayContext.firstPerson() || !(itemStack.getItem() instanceof BlockItem block) || !(block.getBlock() instanceof HalfTransparentBlock) && !(block.getBlock() instanceof StainedGlassPaneBlock); - var material = ModelUtil.getItemMaterial(ItemBlockRenderTypes.getRenderType(itemStack, cull)); - - if (material == null) { - material = Materials.TRANSLUCENT_ENTITY; - } - - if (itemStack.getItem() instanceof BlockItem && material.transparency() == Transparency.TRANSLUCENT) { - material = SimpleMaterial.builderOf(material) - .transparency(Transparency.ORDER_INDEPENDENT) - .build(); - } - - // Visuals all hold references to Level so use that as the parameter type for convenience and cast here. - ClientLevel clientLevel = (level instanceof ClientLevel) ? (ClientLevel) level : null; - - BakedModel model = getActualBakedModel(clientLevel, itemStack, displayContext); - - if (model == null) { - return EMPTY_MODEL; - } - - return MODEL_CACHE.get(new BakedModelKey(model, displayContext, material, itemStack.hasFoil())); - } - - public static Model bakeModel(BakedModel model, ItemDisplayContext displayContext, Material material, boolean foil) { - var mesh = MESH_CACHE.get(new BakedMeshKey(model, displayContext)); - - if (foil) { - return new SimpleModel(List.of(new Model.ConfiguredMesh(material, mesh), new Model.ConfiguredMesh(Materials.GLINT, mesh))); - } else { - return new SingleMeshModel(mesh, material); - } - } - - public static Mesh bakeMesh(BakedModel model, ItemDisplayContext displayContext) { - boolean leftHand = displayContext == ItemDisplayContext.FIRST_PERSON_LEFT_HAND || displayContext == ItemDisplayContext.THIRD_PERSON_LEFT_HAND; - - var poseStack = new PoseStack(); - - model.getTransforms() - .getTransform(displayContext) - .apply(leftHand, poseStack); - poseStack.translate(-0.5f, -0.5f, -0.5f); - - RandomSource randomSource = RandomSource.create(); - - // Write all BakedQuads into a list first to get a count so we can allocate memory ahead of time. - List allQuads = new ArrayList<>(); - for (Direction value : DIRECTIONS) { - randomSource.setSeed(42L); - allQuads.addAll(model.getQuads(null, value, randomSource)); - } - - int vertexCount = allQuads.size() * 4; - var memoryBlock = MemoryBlock.mallocTracked(vertexCount * FullVertexView.STRIDE); - var meshVertices = new FullVertexView(); - - meshVertices.nativeMemoryOwner(memoryBlock); - meshVertices.ptr(memoryBlock.ptr()); - meshVertices.vertexCount(vertexCount); - - Vector4f position = new Vector4f(); - Vector3f normal = new Vector3f(); - - Matrix4f poseMatrix = poseStack.last() - .pose(); - Matrix3f normalMatrix = poseStack.last() - .normal(); - - try (MemoryStack memoryStack = MemoryStack.stackPush();) { - ByteBuffer byteBuffer = memoryStack.malloc(DefaultVertexFormat.BLOCK.getVertexSize()); - IntBuffer intBuffer = byteBuffer.asIntBuffer(); - - int vertex = 0; - - for (BakedQuad quad : allQuads) { - SodiumAnimatedTextureCompat.add(quad.getSprite()); - - int[] js = quad.getVertices(); - var direction = quad.getDirection(); - - normal.set(direction.getStepX(), direction.getStepY(), direction.getStepZ()); - normal.mul(normalMatrix); - - int j = js.length / 8; - - for (int k = 0; k < j; ++k) { - intBuffer.clear(); - intBuffer.put(js, k * 8, 8); - - position.set(byteBuffer.getFloat(0), byteBuffer.getFloat(4), byteBuffer.getFloat(8), 1.0f); - position.mul(poseMatrix); - - // We could probably handle item colors here. - meshVertices.x(vertex, position.x()); - meshVertices.y(vertex, position.y()); - meshVertices.z(vertex, position.z()); - meshVertices.r(vertex, 1.0f); - meshVertices.g(vertex, 1.0f); - meshVertices.b(vertex, 1.0f); - meshVertices.a(vertex, 1.0f); - meshVertices.u(vertex, byteBuffer.getFloat(16)); - meshVertices.v(vertex, byteBuffer.getFloat(20)); - meshVertices.overlay(vertex, OverlayTexture.NO_OVERLAY); - meshVertices.light(vertex, 0); - meshVertices.normalX(vertex, normal.x()); - meshVertices.normalY(vertex, normal.y()); - meshVertices.normalZ(vertex, normal.z()); - - vertex++; - } - } - } - - return new SimpleQuadMesh(meshVertices); - } - - public record BakedModelKey(BakedModel model, ItemDisplayContext displayContext, Material material, boolean foil) { - - } - - public record BakedMeshKey(BakedModel model, ItemDisplayContext displayContext) { - - } -} +// FIXME 1.21.11: port +//package dev.engine_room.vanillin.item; +// +//import java.nio.ByteBuffer; +//import java.nio.IntBuffer; +//import java.util.ArrayList; +//import java.util.HashSet; +//import java.util.List; +//import java.util.Set; +// +//import org.joml.Matrix3f; +//import org.joml.Matrix4f; +//import org.joml.Vector3f; +//import org.joml.Vector4f; +//import org.jspecify.annotations.Nullable; +//import org.lwjgl.system.MemoryStack; +// +//import com.mojang.blaze3d.vertex.DefaultVertexFormat; +//import com.mojang.blaze3d.vertex.PoseStack; +// +//import dev.engine_room.flywheel.api.material.Material; +//import dev.engine_room.flywheel.api.material.Transparency; +//import dev.engine_room.flywheel.api.model.Mesh; +//import dev.engine_room.flywheel.api.model.Model; +//import dev.engine_room.flywheel.lib.material.Materials; +//import dev.engine_room.flywheel.lib.material.SimpleMaterial; +//import dev.engine_room.flywheel.lib.memory.MemoryBlock; +//import dev.engine_room.flywheel.lib.model.ModelUtil; +//import dev.engine_room.flywheel.lib.model.SimpleModel; +//import dev.engine_room.flywheel.lib.model.SimpleQuadMesh; +//import dev.engine_room.flywheel.lib.model.SingleMeshModel; +//import dev.engine_room.flywheel.lib.util.RendererReloadCache; +//import dev.engine_room.flywheel.lib.vertex.FullVertexView; +//import dev.engine_room.vanillin.Vanillin; +//import dev.engine_room.vanillin.VanillinXplat; +//import dev.engine_room.vanillin.mixin.item.ItemOverridesAccessor; +//import net.minecraft.client.Minecraft; +//import net.minecraft.client.multiplayer.ClientLevel; +//import net.minecraft.client.renderer.ItemBlockRenderTypes; +//import net.minecraft.client.renderer.block.model.BakedQuad; +//import net.minecraft.client.renderer.block.model.ItemOverrides; +//import net.minecraft.client.renderer.item.ItemModel; +//import net.minecraft.client.renderer.texture.OverlayTexture; +//import net.minecraft.client.resources.model.BakedModel; +//import net.minecraft.client.resources.model.ModelResourceLocation; +//import net.minecraft.client.resources.model.MultiPartBakedModel; +//import net.minecraft.client.resources.model.SimpleBakedModel; +//import net.minecraft.client.resources.model.WeightedBakedModel; +//import net.minecraft.core.Direction; +//import net.minecraft.core.component.DataComponents; +//import net.minecraft.core.registries.Registries; +//import net.minecraft.data.models.ItemModelGenerators; +//import net.minecraft.resources.ResourceLocation; +//import net.minecraft.tags.TagKey; +//import net.minecraft.util.RandomSource; +//import net.minecraft.world.item.BlockItem; +//import net.minecraft.world.item.Item; +//import net.minecraft.world.item.ItemDisplayContext; +//import net.minecraft.world.item.ItemStack; +//import net.minecraft.world.item.Items; +//import net.minecraft.world.level.Level; +//import net.minecraft.world.level.block.HalfTransparentBlock; +//import net.minecraft.world.level.block.StainedGlassPaneBlock; +// +//public class ItemModels { +// public static final TagKey NO_INSTANCING = TagKey.create(Registries.ITEM, Vanillin.id("no_instancing")); +// +// private static final Model EMPTY_MODEL = new SimpleModel(List.of()); +// private static final RendererReloadCache MESH_CACHE = new RendererReloadCache<>(key -> bakeMesh(key.model(), key.displayContext())); +// private static final RendererReloadCache MODEL_CACHE = new RendererReloadCache<>(key -> bakeModel(key.model(), key.displayContext(), key.material(), key.foil())); +// +// private static final ModelResourceLocation TRIDENT_MODEL = ModelResourceLocation.vanilla("trident", "inventory"); +// private static final ModelResourceLocation SPYGLASS_MODEL = ModelResourceLocation.vanilla("spyglass", "inventory"); +// +// private static final @Nullable Direction[] DIRECTIONS = new Direction[]{Direction.DOWN, Direction.UP, Direction.NORTH, Direction.SOUTH, Direction.WEST, Direction.EAST, null}; +// +// private static final Set ALLOWED_OVERRIDES = new HashSet<>(); +// +// static { +// ALLOWED_OVERRIDES.add(ResourceLocation.withDefaultNamespace("lefthanded")); +// ALLOWED_OVERRIDES.add(ResourceLocation.withDefaultNamespace("cooldown")); +// ALLOWED_OVERRIDES.add(ItemModelGenerators.TRIM_TYPE_PREDICATE_ID); +// ALLOWED_OVERRIDES.add(ResourceLocation.withDefaultNamespace("custom_model_data")); +// ALLOWED_OVERRIDES.add(ResourceLocation.withDefaultNamespace("pull")); +// ALLOWED_OVERRIDES.add(ResourceLocation.withDefaultNamespace("brushing")); +// ALLOWED_OVERRIDES.add(ResourceLocation.withDefaultNamespace("pulling")); +// ALLOWED_OVERRIDES.add(ResourceLocation.withDefaultNamespace("filled")); +// ALLOWED_OVERRIDES.add(ResourceLocation.withDefaultNamespace("charged")); +// ALLOWED_OVERRIDES.add(ResourceLocation.withDefaultNamespace("firework")); +// ALLOWED_OVERRIDES.add(ResourceLocation.withDefaultNamespace("broken")); +// ALLOWED_OVERRIDES.add(ResourceLocation.withDefaultNamespace("cast")); +// ALLOWED_OVERRIDES.add(ResourceLocation.withDefaultNamespace("blocking")); +// ALLOWED_OVERRIDES.add(ResourceLocation.withDefaultNamespace("throwing")); +// ALLOWED_OVERRIDES.add(ResourceLocation.withDefaultNamespace("level")); +// ALLOWED_OVERRIDES.add(ResourceLocation.withDefaultNamespace("tooting")); +// } +// +// public static boolean isSupported(ItemStack stack) { +// return !stack.is(NO_INSTANCING) && doesNotHaveItemColors(stack.getItem()) && isSupported(getModel(stack)); +// } +// +// private static boolean doesNotHaveItemColors(Item item) { +// return VanillinXplat.INSTANCE.itemColors(item) == null; +// } +// +// public static ItemModel getModel(ItemStack stack) { +// return Minecraft.getInstance() +// .getModelManager() +// .getItemModel(stack.get(DataComponents.ITEM_MODEL)); +// } +// +// @Nullable +// public static BakedModel getActualBakedModel(@Nullable ClientLevel clientLevel, ItemStack itemStack, ItemDisplayContext displayContext) { +// if (itemStack.isEmpty()) { +// return null; +// } +// +// var baseModel = getModel(itemStack); +// var overrides = baseModel.getOverrides(); +// var model = overrides.resolve(baseModel, itemStack, clientLevel, null, 0); +// +// if (model == null) { +// model = baseModel; +// } +// +// boolean notEquipped = displayContext == ItemDisplayContext.GUI || displayContext == ItemDisplayContext.GROUND || displayContext == ItemDisplayContext.FIXED; +// if (model.isCustomRenderer() || itemStack.is(Items.TRIDENT) && !notEquipped) { +// return null; +// } +// +// if (notEquipped) { +// if (itemStack.is(Items.TRIDENT)) { +// model = Minecraft.getInstance() +// .getItemRenderer() +// .getItemModelShaper() +// .getModelManager() +// .getModel(TRIDENT_MODEL); +// } else if (itemStack.is(Items.SPYGLASS)) { +// model = Minecraft.getInstance() +// .getItemRenderer() +// .getItemModelShaper() +// .getModelManager() +// .getModel(SPYGLASS_MODEL); +// } +// } +// +// return model; +// } +// +// public static boolean isSupported(BakedModel model) { +// if (model.isCustomRenderer()) { +// return false; +// } +// +// var overrides = model.getOverrides(); +// if (overrides != ItemOverrides.EMPTY) { +// var properties = ((ItemOverridesAccessor) overrides).vanillin$properties(); +// +// for (var property : properties) { +// if (!ALLOWED_OVERRIDES.contains(property)) { +// return false; +// } +// } +// } +// +// // Check for class equality rather than instanceof to ensure subclasses are *not* handled by vanillin. +// Class c = model.getClass(); +// if (!(c == SimpleBakedModel.class || c == MultiPartBakedModel.class || c == WeightedBakedModel.class)) { +// return false; +// } +// +// return true; +// } +// +// public static Model get(Level level, ItemStack itemStack, ItemDisplayContext displayContext) { +// boolean cull = displayContext == ItemDisplayContext.GUI || displayContext.firstPerson() || !(itemStack.getItem() instanceof BlockItem block) || !(block.getBlock() instanceof HalfTransparentBlock) && !(block.getBlock() instanceof StainedGlassPaneBlock); +// var material = ModelUtil.getItemMaterial(ItemBlockRenderTypes.getRenderType(itemStack, cull)); +// +// if (material == null) { +// material = Materials.TRANSLUCENT_ENTITY; +// } +// +// if (itemStack.getItem() instanceof BlockItem && material.transparency() == Transparency.TRANSLUCENT) { +// material = SimpleMaterial.builderOf(material) +// .transparency(Transparency.ORDER_INDEPENDENT) +// .build(); +// } +// +// // Visuals all hold references to Level so use that as the parameter type for convenience and cast here. +// ClientLevel clientLevel = (level instanceof ClientLevel) ? (ClientLevel) level : null; +// +// BakedModel model = getActualBakedModel(clientLevel, itemStack, displayContext); +// +// if (model == null) { +// return EMPTY_MODEL; +// } +// +// return MODEL_CACHE.get(new BakedModelKey(model, displayContext, material, itemStack.hasFoil())); +// } +// +// public static Model bakeModel(BakedModel model, ItemDisplayContext displayContext, Material material, boolean foil) { +// var mesh = MESH_CACHE.get(new BakedMeshKey(model, displayContext)); +// +// if (foil) { +// return new SimpleModel(List.of(new Model.ConfiguredMesh(material, mesh), new Model.ConfiguredMesh(Materials.GLINT, mesh))); +// } else { +// return new SingleMeshModel(mesh, material); +// } +// } +// +// public static Mesh bakeMesh(BakedModel model, ItemDisplayContext displayContext) { +// boolean leftHand = displayContext == ItemDisplayContext.FIRST_PERSON_LEFT_HAND || displayContext == ItemDisplayContext.THIRD_PERSON_LEFT_HAND; +// +// var poseStack = new PoseStack(); +// +// model.getTransforms() +// .getTransform(displayContext) +// .apply(leftHand, poseStack); +// poseStack.translate(-0.5f, -0.5f, -0.5f); +// +// RandomSource randomSource = RandomSource.create(); +// +// // Write all BakedQuads into a list first to get a count so we can allocate memory ahead of time. +// List allQuads = new ArrayList<>(); +// for (Direction value : DIRECTIONS) { +// randomSource.setSeed(42L); +// allQuads.addAll(model.getQuads(null, value, randomSource)); +// } +// +// int vertexCount = allQuads.size() * 4; +// var memoryBlock = MemoryBlock.mallocTracked(vertexCount * FullVertexView.STRIDE); +// var meshVertices = new FullVertexView(); +// +// meshVertices.nativeMemoryOwner(memoryBlock); +// meshVertices.ptr(memoryBlock.ptr()); +// meshVertices.vertexCount(vertexCount); +// +// Vector4f position = new Vector4f(); +// Vector3f normal = new Vector3f(); +// +// Matrix4f poseMatrix = poseStack.last() +// .pose(); +// Matrix3f normalMatrix = poseStack.last() +// .normal(); +// +// try (MemoryStack memoryStack = MemoryStack.stackPush();) { +// ByteBuffer byteBuffer = memoryStack.malloc(DefaultVertexFormat.BLOCK.getVertexSize()); +// IntBuffer intBuffer = byteBuffer.asIntBuffer(); +// +// int vertex = 0; +// +// for (BakedQuad quad : allQuads) { +// SodiumAnimatedTextureCompat.add(quad.getSprite()); +// +// int[] js = quad.getVertices(); +// var direction = quad.getDirection(); +// +// normal.set(direction.getStepX(), direction.getStepY(), direction.getStepZ()); +// normal.mul(normalMatrix); +// +// int j = js.length / 8; +// +// for (int k = 0; k < j; ++k) { +// intBuffer.clear(); +// intBuffer.put(js, k * 8, 8); +// +// position.set(byteBuffer.getFloat(0), byteBuffer.getFloat(4), byteBuffer.getFloat(8), 1.0f); +// position.mul(poseMatrix); +// +// // We could probably handle item colors here. +// meshVertices.x(vertex, position.x()); +// meshVertices.y(vertex, position.y()); +// meshVertices.z(vertex, position.z()); +// meshVertices.r(vertex, 1.0f); +// meshVertices.g(vertex, 1.0f); +// meshVertices.b(vertex, 1.0f); +// meshVertices.a(vertex, 1.0f); +// meshVertices.u(vertex, byteBuffer.getFloat(16)); +// meshVertices.v(vertex, byteBuffer.getFloat(20)); +// meshVertices.overlay(vertex, OverlayTexture.NO_OVERLAY); +// meshVertices.light(vertex, 0); +// meshVertices.normalX(vertex, normal.x()); +// meshVertices.normalY(vertex, normal.y()); +// meshVertices.normalZ(vertex, normal.z()); +// +// vertex++; +// } +// } +// } +// +// return new SimpleQuadMesh(meshVertices); +// } +// +// public record BakedModelKey(BakedModel model, ItemDisplayContext displayContext, Material material, boolean foil) { +// +// } +// +// public record BakedMeshKey(BakedModel model, ItemDisplayContext displayContext) { +// +// } +//} diff --git a/common/src/vanillin/java/dev/engine_room/vanillin/visuals/ItemDisplayVisual.java b/common/src/vanillin/java/dev/engine_room/vanillin/visuals/ItemDisplayVisual.java index d580bfc5e..e7094502f 100644 --- a/common/src/vanillin/java/dev/engine_room/vanillin/visuals/ItemDisplayVisual.java +++ b/common/src/vanillin/java/dev/engine_room/vanillin/visuals/ItemDisplayVisual.java @@ -1,148 +1,149 @@ -package dev.engine_room.vanillin.visuals; - -import java.util.Objects; - -import org.jspecify.annotations.Nullable; - -import com.mojang.math.Transformation; - -import dev.engine_room.flywheel.api.visualization.VisualizationContext; -import dev.engine_room.flywheel.lib.instance.InstanceTypes; -import dev.engine_room.flywheel.lib.instance.TransformedInstance; -import dev.engine_room.flywheel.lib.model.Models; -import dev.engine_room.flywheel.lib.visual.AbstractEntityVisual; -import dev.engine_room.flywheel.lib.visual.SimpleDynamicVisual; -import dev.engine_room.flywheel.lib.visual.component.ShadowComponent; -import dev.engine_room.vanillin.item.ItemModels; -import net.minecraft.client.Camera; -import net.minecraft.util.Mth; -import net.minecraft.world.entity.Display; -import net.minecraft.world.entity.Entity; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.level.block.Blocks; -import net.minecraft.world.phys.Vec3; - -public class ItemDisplayVisual extends AbstractEntityVisual implements SimpleDynamicVisual { - private final TransformedInstance instance; - - private ItemStack currentStack; - - private final ShadowComponent shadowComponent; - - public ItemDisplayVisual(VisualizationContext ctx, Display.ItemDisplay entity, float partialTick) { - super(ctx, entity, partialTick); - - var itemRenderState = entity.itemRenderState(); - - if (itemRenderState == null) { - currentStack = ItemStack.EMPTY; - instance = ctx.instancerProvider() - .instancer(InstanceTypes.TRANSFORMED, Models.block(Blocks.AIR.defaultBlockState())) - .createInstance(); - } else { - currentStack = itemRenderState.itemStack() - .copy(); - instance = ctx.instancerProvider() - .instancer(InstanceTypes.TRANSFORMED, ItemModels.get(level, currentStack, itemRenderState.itemTransform())) - .createInstance(); - } - - shadowComponent = new ShadowComponent(ctx, entity); - } - - @Override - public void beginFrame(Context ctx) { - Display.RenderState renderState = entity.renderState(); - if (renderState == null) { - instance.handle() - .setVisible(false); - return; - } - var object = entity.itemRenderState(); - if (object == null) { - instance.handle() - .setVisible(false); - return; - } - - instance.handle() - .setVisible(true); - - var itemStack = object.itemStack(); - - if (!ItemStack.matches(itemStack, currentStack)) { - currentStack = itemStack.copy(); - visualizationContext.instancerProvider() - .instancer(InstanceTypes.TRANSFORMED, ItemModels.get(level, currentStack, object.itemTransform())) - .stealInstance(instance); - } - - float f = entity.calculateInterpolationProgress(ctx.partialTick()); - - shadowComponent.radius(renderState.shadowRadius() - .get(f)); - shadowComponent.strength(renderState.shadowStrength() - .get(f)); - shadowComponent.beginFrame(ctx); - - int i = renderState.brightnessOverride(); - int j = i != -1 ? i : computePackedLight(ctx.partialTick()); - Transformation transformation = renderState.transformation() - .get(f); - - Vec3 pos = entity.position(); - var renderOrigin = renderOrigin(); - - instance.setIdentityTransform() - .translate((float) (pos.x - renderOrigin.getX()), (float) (pos.y - renderOrigin.getY()), (float) (pos.z - renderOrigin.getZ())); - - float partialTick = ctx.partialTick(); - Camera camera = ctx.camera(); - switch (renderState.billboardConstraints()) { - case FIXED: - instance.pose.rotateYXZ(-0.017453292F * entityYRot(entity, partialTick), ((float) Math.PI / 180F) * entityXRot(entity, partialTick), 0.0F); - break; - case HORIZONTAL: - instance.pose.rotateYXZ(-0.017453292F * entityYRot(entity, partialTick), ((float) Math.PI / 180F) * cameraXRot(camera), 0.0F); - break; - case VERTICAL: - instance.pose.rotateYXZ(-0.017453292F * cameraYrot(camera), ((float) Math.PI / 180F) * entityXRot(entity, partialTick), 0.0F); - break; - case CENTER: - instance.pose.rotateYXZ(-0.017453292F * cameraYrot(camera), ((float) Math.PI / 180F) * cameraXRot(camera), 0.0F); - break; - } - - // getMatrix does a copy which is not strictly necessary here but oh well. - instance.mul(transformation.getMatrix()) - .rotateY(Mth.PI) - .light(j) - .setChanged(); - } - - private static float cameraYrot(Camera camera) { - return camera.yRot() - 180.0F; - } - - private static float cameraXRot(Camera camera) { - return -camera.xRot(); - } - - private static float entityYRot(Entity entity, float partialTick) { - return Mth.rotLerp(partialTick, entity.yRotO, entity.getYRot()); - } - - private static float entityXRot(Entity entity, float partialTick) { - return Mth.lerp(partialTick, entity.xRotO, entity.getXRot()); - } - - @Override - protected void _delete() { - instance.delete(); - } - - public static boolean shouldVisualize(Display.ItemDisplay itemDisplay) { - var state = itemDisplay.itemRenderState(); - return state != null && ItemModels.isSupported(state.itemStack()); - } -} +// FIXME 1.21.11: port +//package dev.engine_room.vanillin.visuals; +// +//import java.util.Objects; +// +//import org.jspecify.annotations.Nullable; +// +//import com.mojang.math.Transformation; +// +//import dev.engine_room.flywheel.api.visualization.VisualizationContext; +//import dev.engine_room.flywheel.lib.instance.InstanceTypes; +//import dev.engine_room.flywheel.lib.instance.TransformedInstance; +//import dev.engine_room.flywheel.lib.model.Models; +//import dev.engine_room.flywheel.lib.visual.AbstractEntityVisual; +//import dev.engine_room.flywheel.lib.visual.SimpleDynamicVisual; +//import dev.engine_room.flywheel.lib.visual.component.ShadowComponent; +//import dev.engine_room.vanillin.item.ItemModels; +//import net.minecraft.client.Camera; +//import net.minecraft.util.Mth; +//import net.minecraft.world.entity.Display; +//import net.minecraft.world.entity.Entity; +//import net.minecraft.world.item.ItemStack; +//import net.minecraft.world.level.block.Blocks; +//import net.minecraft.world.phys.Vec3; +// +//public class ItemDisplayVisual extends AbstractEntityVisual implements SimpleDynamicVisual { +// private final TransformedInstance instance; +// +// private ItemStack currentStack; +// +// private final ShadowComponent shadowComponent; +// +// public ItemDisplayVisual(VisualizationContext ctx, Display.ItemDisplay entity, float partialTick) { +// super(ctx, entity, partialTick); +// +// var itemRenderState = entity.itemRenderState(); +// +// if (itemRenderState == null) { +// currentStack = ItemStack.EMPTY; +// instance = ctx.instancerProvider() +// .instancer(InstanceTypes.TRANSFORMED, Models.block(Blocks.AIR.defaultBlockState())) +// .createInstance(); +// } else { +// currentStack = itemRenderState.itemStack() +// .copy(); +// instance = ctx.instancerProvider() +// .instancer(InstanceTypes.TRANSFORMED, ItemModels.get(level, currentStack, itemRenderState.itemTransform())) +// .createInstance(); +// } +// +// shadowComponent = new ShadowComponent(ctx, entity); +// } +// +// @Override +// public void beginFrame(Context ctx) { +// Display.RenderState renderState = entity.renderState(); +// if (renderState == null) { +// instance.handle() +// .setVisible(false); +// return; +// } +// var object = entity.itemRenderState(); +// if (object == null) { +// instance.handle() +// .setVisible(false); +// return; +// } +// +// instance.handle() +// .setVisible(true); +// +// var itemStack = object.itemStack(); +// +// if (!ItemStack.matches(itemStack, currentStack)) { +// currentStack = itemStack.copy(); +// visualizationContext.instancerProvider() +// .instancer(InstanceTypes.TRANSFORMED, ItemModels.get(level, currentStack, object.itemTransform())) +// .stealInstance(instance); +// } +// +// float f = entity.calculateInterpolationProgress(ctx.partialTick()); +// +// shadowComponent.radius(renderState.shadowRadius() +// .get(f)); +// shadowComponent.strength(renderState.shadowStrength() +// .get(f)); +// shadowComponent.beginFrame(ctx); +// +// int i = renderState.brightnessOverride(); +// int j = i != -1 ? i : computePackedLight(ctx.partialTick()); +// Transformation transformation = renderState.transformation() +// .get(f); +// +// Vec3 pos = entity.position(); +// var renderOrigin = renderOrigin(); +// +// instance.setIdentityTransform() +// .translate((float) (pos.x - renderOrigin.getX()), (float) (pos.y - renderOrigin.getY()), (float) (pos.z - renderOrigin.getZ())); +// +// float partialTick = ctx.partialTick(); +// Camera camera = ctx.camera(); +// switch (renderState.billboardConstraints()) { +// case FIXED: +// instance.pose.rotateYXZ(-0.017453292F * entityYRot(entity, partialTick), ((float) Math.PI / 180F) * entityXRot(entity, partialTick), 0.0F); +// break; +// case HORIZONTAL: +// instance.pose.rotateYXZ(-0.017453292F * entityYRot(entity, partialTick), ((float) Math.PI / 180F) * cameraXRot(camera), 0.0F); +// break; +// case VERTICAL: +// instance.pose.rotateYXZ(-0.017453292F * cameraYrot(camera), ((float) Math.PI / 180F) * entityXRot(entity, partialTick), 0.0F); +// break; +// case CENTER: +// instance.pose.rotateYXZ(-0.017453292F * cameraYrot(camera), ((float) Math.PI / 180F) * cameraXRot(camera), 0.0F); +// break; +// } +// +// // getMatrix does a copy which is not strictly necessary here but oh well. +// instance.mul(transformation.getMatrix()) +// .rotateY(Mth.PI) +// .light(j) +// .setChanged(); +// } +// +// private static float cameraYrot(Camera camera) { +// return camera.yRot() - 180.0F; +// } +// +// private static float cameraXRot(Camera camera) { +// return -camera.xRot(); +// } +// +// private static float entityYRot(Entity entity, float partialTick) { +// return Mth.rotLerp(partialTick, entity.yRotO, entity.getYRot()); +// } +// +// private static float entityXRot(Entity entity, float partialTick) { +// return Mth.lerp(partialTick, entity.xRotO, entity.getXRot()); +// } +// +// @Override +// protected void _delete() { +// instance.delete(); +// } +// +// public static boolean shouldVisualize(Display.ItemDisplay itemDisplay) { +// var state = itemDisplay.itemRenderState(); +// return state != null && ItemModels.isSupported(state.itemStack()); +// } +//} diff --git a/common/src/vanillin/java/dev/engine_room/vanillin/visuals/ItemFrameVisual.java b/common/src/vanillin/java/dev/engine_room/vanillin/visuals/ItemFrameVisual.java index 3db91e950..a9420c085 100644 --- a/common/src/vanillin/java/dev/engine_room/vanillin/visuals/ItemFrameVisual.java +++ b/common/src/vanillin/java/dev/engine_room/vanillin/visuals/ItemFrameVisual.java @@ -1,174 +1,175 @@ -package dev.engine_room.vanillin.visuals; - -import org.joml.Matrix4f; - -import dev.engine_room.flywheel.api.model.Model; -import dev.engine_room.flywheel.api.visual.EntityVisual; -import dev.engine_room.flywheel.api.visualization.VisualizationContext; -import dev.engine_room.flywheel.lib.instance.InstanceTypes; -import dev.engine_room.flywheel.lib.instance.TransformedInstance; -import dev.engine_room.flywheel.lib.model.baked.BlockModelBuilder; -import dev.engine_room.flywheel.lib.util.RendererReloadCache; -import dev.engine_room.flywheel.lib.visual.AbstractVisual; -import dev.engine_room.flywheel.lib.visual.SimpleDynamicVisual; -import dev.engine_room.vanillin.item.ItemModels; -import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.LightTexture; -import net.minecraft.client.renderer.block.BlockModelShaper; -import net.minecraft.client.resources.model.BlockStateDefinitions; -import net.minecraft.core.BlockPos; -import net.minecraft.core.Direction; -import net.minecraft.util.Mth; -import net.minecraft.world.entity.EntityType; -import net.minecraft.world.entity.decoration.ItemFrame; -import net.minecraft.world.item.ItemDisplayContext; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.Items; -import net.minecraft.world.level.LightLayer; -import net.minecraft.world.level.block.state.BlockState; - -public class ItemFrameVisual extends AbstractVisual implements EntityVisual, SimpleDynamicVisual { - public static final RendererReloadCache BLOCK_STATE = new RendererReloadCache<>(state -> { - BlockModelShaper blockModelShaper = Minecraft.getInstance() - .getModelManager() - .getBlockModelShaper(); - - return new BlockModelBuilder(blockModelShaper.getBlockModel(state)) - .build(); - }); - - private final Matrix4f baseTransform = new Matrix4f(); - - private final TransformedInstance frame; - private final TransformedInstance item; - private final ItemFrame entity; - private BlockState lastFrameBlockState; - private ItemStack lastItemStack; - - public ItemFrameVisual(VisualizationContext ctx, ItemFrame entity, float partialTick) { - super(ctx, entity.level(), partialTick); - - this.entity = entity; - - lastItemStack = entity.getItem() - .copy(); - - lastFrameBlockState = getFrameBlockState(entity, lastItemStack); - var frameModel = BLOCK_STATE.get(lastFrameBlockState); - - frame = ctx.instancerProvider() - .instancer(InstanceTypes.TRANSFORMED, frameModel) - .createInstance(); - - frame.setTransform(baseTransform); - - item = ctx.instancerProvider() - .instancer(InstanceTypes.TRANSFORMED, ItemModels.get(level, lastItemStack, ItemDisplayContext.FIXED)) - .createInstance(); - - animate(partialTick); - } - - public static boolean shouldVisualize(ItemFrame entity) { - // We don't support map rendering, and we can't support exotic item models. - return !entity.getItem() - .is(Items.FILLED_MAP) && ItemModels.isSupported(entity.getItem()); - } - - @Override - public void beginFrame(Context ctx) { - animate(ctx.partialTick()); - } - - public void animate(float partialTick) { - var light = LightTexture.pack(getBlockLightLevel(entity.getPos()), getSkyLightLevel(entity.getPos())); - - boolean invisible = entity.isInvisible(); - - Direction direction = entity.getDirection(); - var origin = visualizationContext.renderOrigin(); - - float d = 0.46875f; - - float x = (float) (entity.getX() - origin.getX() + direction.getStepX() * d); - float y = (float) (entity.getY() - origin.getY() + direction.getStepY() * d); - float z = (float) (entity.getZ() - origin.getZ() + direction.getStepZ() * d); - - baseTransform.translation(x, y, z); - baseTransform.rotateXYZ(Mth.DEG_TO_RAD * entity.getXRot(), Mth.DEG_TO_RAD * (180.0f - entity.getYRot()), 0.0f); - - var stack = entity.getItem(); - var frameBlockState = getFrameBlockState(entity, stack); - - if (frameBlockState != lastFrameBlockState) { - visualizationContext.instancerProvider() - .instancer(InstanceTypes.TRANSFORMED, BLOCK_STATE.get(frameBlockState)) - .stealInstance(frame); - lastFrameBlockState = frameBlockState; - } - - frame.setVisible(!invisible); - - frame.setTransform(baseTransform) - .translate(-0.5f, -0.5f, -0.5f) - .light(light) - .setChanged(); - - if (!ItemStack.matches(lastItemStack, stack)) { - lastItemStack = stack.copy(); - visualizationContext.instancerProvider() - .instancer(InstanceTypes.TRANSFORMED, ItemModels.get(level, lastItemStack, ItemDisplayContext.FIXED)) - .stealInstance(item); - } - - item.setTransform(baseTransform); - - if (invisible) { - item.translate(0.0F, 0.0F, 0.5F); - } else { - item.translate(0.0F, 0.0F, 0.4375F); - } - - int i = entity.hasFramedMap() ? entity.getRotation() % 4 * 2 : entity.getRotation(); - - item.rotateZDegrees(i * 360.0F / 8.0F); - - item.scale(0.5F, 0.5F, 0.5F); - - item.light(getLightVal(15728880, light)) - .setChanged(); - } - - @Override - public void update(float partialTick) { - - } - - @Override - protected void _delete() { - frame.delete(); - item.delete(); - } - - private int getLightVal(int glowLightVal, int regularLightVal) { - return entity.getType() == EntityType.GLOW_ITEM_FRAME ? glowLightVal : regularLightVal; - } - - protected int getSkyLightLevel(BlockPos pos) { - return level.getBrightness(LightLayer.SKY, pos); - } - - protected int getBlockLightLevelBase(BlockPos pos) { - return entity.isOnFire() ? 15 : level.getBrightness(LightLayer.BLOCK, pos); - } - - protected int getBlockLightLevel(BlockPos pos) { - return entity.getType() == EntityType.GLOW_ITEM_FRAME ? Math.max(5, getBlockLightLevelBase(pos)) : getBlockLightLevelBase(pos); - } - - public static BlockState getFrameBlockState(ItemFrame entity, ItemStack item) { - boolean isGlowFrame = entity.getType() == EntityType.GLOW_ITEM_FRAME; - boolean map = !item.isEmpty() && entity.getFramedMapId(item) != null; - return BlockStateDefinitions.getItemFrameFakeState(isGlowFrame, map); - } -} +// FIXME 1.21.11: port +//package dev.engine_room.vanillin.visuals; +// +//import org.joml.Matrix4f; +// +//import dev.engine_room.flywheel.api.model.Model; +//import dev.engine_room.flywheel.api.visual.EntityVisual; +//import dev.engine_room.flywheel.api.visualization.VisualizationContext; +//import dev.engine_room.flywheel.lib.instance.InstanceTypes; +//import dev.engine_room.flywheel.lib.instance.TransformedInstance; +//import dev.engine_room.flywheel.lib.model.baked.BlockModelBuilder; +//import dev.engine_room.flywheel.lib.util.RendererReloadCache; +//import dev.engine_room.flywheel.lib.visual.AbstractVisual; +//import dev.engine_room.flywheel.lib.visual.SimpleDynamicVisual; +//import dev.engine_room.vanillin.item.ItemModels; +//import net.minecraft.client.Minecraft; +//import net.minecraft.client.renderer.LightTexture; +//import net.minecraft.client.renderer.block.BlockModelShaper; +//import net.minecraft.client.resources.model.BlockStateDefinitions; +//import net.minecraft.core.BlockPos; +//import net.minecraft.core.Direction; +//import net.minecraft.util.Mth; +//import net.minecraft.world.entity.EntityType; +//import net.minecraft.world.entity.decoration.ItemFrame; +//import net.minecraft.world.item.ItemDisplayContext; +//import net.minecraft.world.item.ItemStack; +//import net.minecraft.world.item.Items; +//import net.minecraft.world.level.LightLayer; +//import net.minecraft.world.level.block.state.BlockState; +// +//public class ItemFrameVisual extends AbstractVisual implements EntityVisual, SimpleDynamicVisual { +// public static final RendererReloadCache BLOCK_STATE = new RendererReloadCache<>(state -> { +// BlockModelShaper blockModelShaper = Minecraft.getInstance() +// .getModelManager() +// .getBlockModelShaper(); +// +// return new BlockModelBuilder(blockModelShaper.getBlockModel(state)) +// .build(); +// }); +// +// private final Matrix4f baseTransform = new Matrix4f(); +// +// private final TransformedInstance frame; +// private final TransformedInstance item; +// private final ItemFrame entity; +// private BlockState lastFrameBlockState; +// private ItemStack lastItemStack; +// +// public ItemFrameVisual(VisualizationContext ctx, ItemFrame entity, float partialTick) { +// super(ctx, entity.level(), partialTick); +// +// this.entity = entity; +// +// lastItemStack = entity.getItem() +// .copy(); +// +// lastFrameBlockState = getFrameBlockState(entity, lastItemStack); +// var frameModel = BLOCK_STATE.get(lastFrameBlockState); +// +// frame = ctx.instancerProvider() +// .instancer(InstanceTypes.TRANSFORMED, frameModel) +// .createInstance(); +// +// frame.setTransform(baseTransform); +// +// item = ctx.instancerProvider() +// .instancer(InstanceTypes.TRANSFORMED, ItemModels.get(level, lastItemStack, ItemDisplayContext.FIXED)) +// .createInstance(); +// +// animate(partialTick); +// } +// +// public static boolean shouldVisualize(ItemFrame entity) { +// // We don't support map rendering, and we can't support exotic item models. +// return !entity.getItem() +// .is(Items.FILLED_MAP) && ItemModels.isSupported(entity.getItem()); +// } +// +// @Override +// public void beginFrame(Context ctx) { +// animate(ctx.partialTick()); +// } +// +// public void animate(float partialTick) { +// var light = LightTexture.pack(getBlockLightLevel(entity.getPos()), getSkyLightLevel(entity.getPos())); +// +// boolean invisible = entity.isInvisible(); +// +// Direction direction = entity.getDirection(); +// var origin = visualizationContext.renderOrigin(); +// +// float d = 0.46875f; +// +// float x = (float) (entity.getX() - origin.getX() + direction.getStepX() * d); +// float y = (float) (entity.getY() - origin.getY() + direction.getStepY() * d); +// float z = (float) (entity.getZ() - origin.getZ() + direction.getStepZ() * d); +// +// baseTransform.translation(x, y, z); +// baseTransform.rotateXYZ(Mth.DEG_TO_RAD * entity.getXRot(), Mth.DEG_TO_RAD * (180.0f - entity.getYRot()), 0.0f); +// +// var stack = entity.getItem(); +// var frameBlockState = getFrameBlockState(entity, stack); +// +// if (frameBlockState != lastFrameBlockState) { +// visualizationContext.instancerProvider() +// .instancer(InstanceTypes.TRANSFORMED, BLOCK_STATE.get(frameBlockState)) +// .stealInstance(frame); +// lastFrameBlockState = frameBlockState; +// } +// +// frame.setVisible(!invisible); +// +// frame.setTransform(baseTransform) +// .translate(-0.5f, -0.5f, -0.5f) +// .light(light) +// .setChanged(); +// +// if (!ItemStack.matches(lastItemStack, stack)) { +// lastItemStack = stack.copy(); +// visualizationContext.instancerProvider() +// .instancer(InstanceTypes.TRANSFORMED, ItemModels.get(level, lastItemStack, ItemDisplayContext.FIXED)) +// .stealInstance(item); +// } +// +// item.setTransform(baseTransform); +// +// if (invisible) { +// item.translate(0.0F, 0.0F, 0.5F); +// } else { +// item.translate(0.0F, 0.0F, 0.4375F); +// } +// +// int i = entity.hasFramedMap() ? entity.getRotation() % 4 * 2 : entity.getRotation(); +// +// item.rotateZDegrees(i * 360.0F / 8.0F); +// +// item.scale(0.5F, 0.5F, 0.5F); +// +// item.light(getLightVal(15728880, light)) +// .setChanged(); +// } +// +// @Override +// public void update(float partialTick) { +// +// } +// +// @Override +// protected void _delete() { +// frame.delete(); +// item.delete(); +// } +// +// private int getLightVal(int glowLightVal, int regularLightVal) { +// return entity.getType() == EntityType.GLOW_ITEM_FRAME ? glowLightVal : regularLightVal; +// } +// +// protected int getSkyLightLevel(BlockPos pos) { +// return level.getBrightness(LightLayer.SKY, pos); +// } +// +// protected int getBlockLightLevelBase(BlockPos pos) { +// return entity.isOnFire() ? 15 : level.getBrightness(LightLayer.BLOCK, pos); +// } +// +// protected int getBlockLightLevel(BlockPos pos) { +// return entity.getType() == EntityType.GLOW_ITEM_FRAME ? Math.max(5, getBlockLightLevelBase(pos)) : getBlockLightLevelBase(pos); +// } +// +// public static BlockState getFrameBlockState(ItemFrame entity, ItemStack item) { +// boolean isGlowFrame = entity.getType() == EntityType.GLOW_ITEM_FRAME; +// boolean map = !item.isEmpty() && entity.getFramedMapId(item) != null; +// return BlockStateDefinitions.getItemFrameFakeState(isGlowFrame, map); +// } +//} diff --git a/common/src/vanillin/java/dev/engine_room/vanillin/visuals/ItemVisual.java b/common/src/vanillin/java/dev/engine_room/vanillin/visuals/ItemVisual.java index f7521151e..48b700cb3 100644 --- a/common/src/vanillin/java/dev/engine_room/vanillin/visuals/ItemVisual.java +++ b/common/src/vanillin/java/dev/engine_room/vanillin/visuals/ItemVisual.java @@ -1,152 +1,153 @@ -package dev.engine_room.vanillin.visuals; - -import com.mojang.blaze3d.vertex.PoseStack; -import com.mojang.math.Axis; - -import dev.engine_room.flywheel.api.visualization.VisualizationContext; -import dev.engine_room.flywheel.lib.instance.InstanceTypes; -import dev.engine_room.flywheel.lib.instance.TransformedInstance; -import dev.engine_room.flywheel.lib.transform.TransformStack; -import dev.engine_room.flywheel.lib.visual.AbstractEntityVisual; -import dev.engine_room.flywheel.lib.visual.SimpleDynamicVisual; -import dev.engine_room.flywheel.lib.visual.util.InstanceRecycler; -import dev.engine_room.vanillin.item.ItemModels; -import net.minecraft.client.renderer.LightTexture; -import net.minecraft.client.resources.model.BakedModel; -import net.minecraft.util.Mth; -import net.minecraft.util.RandomSource; -import net.minecraft.world.entity.item.ItemEntity; -import net.minecraft.world.item.Item; -import net.minecraft.world.item.ItemDisplayContext; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.level.LightLayer; - -public class ItemVisual extends AbstractEntityVisual implements SimpleDynamicVisual { - - private static final ThreadLocal RANDOM = ThreadLocal.withInitial(RandomSource::createNewThreadLocalInstance); - - private final PoseStack pPoseStack = new PoseStack(); - private final BakedModel bakedModel; - - private final InstanceRecycler instances; - - public ItemVisual(VisualizationContext ctx, ItemEntity entity, float partialTick) { - super(ctx, entity, partialTick); - - var item = entity.getItem(); - bakedModel = ItemModels.getModel(item); - - var model = ItemModels.get(level, item, ItemDisplayContext.GROUND); - - instances = new InstanceRecycler<>(() -> ctx.instancerProvider() - .instancer(InstanceTypes.TRANSFORMED, model) - .createInstance()); - - animate(partialTick); - } - - public static boolean isSupported(ItemEntity entity) { - return ItemModels.isSupported(entity.getItem()); - } - - @Override - public void beginFrame(Context ctx) { - if (!isVisible(ctx.frustum())) { - return; - } - - animate(ctx.partialTick()); - } - - private void animate(float partialTick) { - pPoseStack.setIdentity(); - TransformStack.of(pPoseStack) - .translate(getVisualPosition(partialTick)); - - instances.resetCount(); - ItemStack itemstack = entity.getItem(); - int i = itemstack.isEmpty() ? 187 : Item.getId(itemstack.getItem()) + itemstack.getDamageValue(); - var random = RANDOM.get(); - random.setSeed(i); - boolean flag = bakedModel.isGui3d(); - int j = this.getRenderAmount(itemstack); - float f = 0.25F; - float f1 = shouldBob() ? Mth.sin(((float) entity.getAge() + partialTick) / 10.0F + entity.bobOffs) * 0.1F + 0.1F : 0; - float groundScaleX = bakedModel.getTransforms().ground.scale.y(); - float groundScaleY = bakedModel.getTransforms().ground.scale.y(); - float groundScaleZ = bakedModel.getTransforms().ground.scale.y(); - pPoseStack.translate(0.0F, f1 + 0.25F * groundScaleZ, 0.0F); - float f3 = entity.getSpin(partialTick); - pPoseStack.mulPose(Axis.YP.rotation(f3)); - if (!flag) { - float f7 = -0.0F * (float) (j - 1) * 0.5F * groundScaleX; - float f8 = -0.0F * (float) (j - 1) * 0.5F * groundScaleY; - float f9 = -0.09375F * (float) (j - 1) * 0.5F * groundScaleZ; - pPoseStack.translate(f7, f8, f9); - } - - int light = LightTexture.pack(level.getBrightness(LightLayer.BLOCK, entity.blockPosition()), level.getBrightness(LightLayer.SKY, entity.blockPosition())); - - for (int k = 0; k < j; ++k) { - pPoseStack.pushPose(); - if (k > 0) { - if (flag) { - float f11 = (random.nextFloat() * 2.0F - 1.0F) * 0.15F; - float f13 = (random.nextFloat() * 2.0F - 1.0F) * 0.15F; - float f10 = (random.nextFloat() * 2.0F - 1.0F) * 0.15F; - pPoseStack.translate(shouldSpreadItems() ? f11 : 0, shouldSpreadItems() ? f13 : 0, shouldSpreadItems() ? f10 : 0); - } else { - float f12 = (random.nextFloat() * 2.0F - 1.0F) * 0.15F * 0.5F; - float f14 = (random.nextFloat() * 2.0F - 1.0F) * 0.15F * 0.5F; - pPoseStack.translate(shouldSpreadItems() ? f12 : 0, shouldSpreadItems() ? f14 : 0, 0.0D); - } - } - - instances.get() - .setTransform(pPoseStack.last()) - .light(light) - .setChanged(); - pPoseStack.popPose(); - if (!flag) { - pPoseStack.translate(0.0, 0.0, 0.09375F * groundScaleZ); - } - } - - instances.discardExtra(); - } - - protected int getRenderAmount(ItemStack pStack) { - int i = 1; - if (pStack.getCount() > 48) { - i = 5; - } else if (pStack.getCount() > 32) { - i = 4; - } else if (pStack.getCount() > 16) { - i = 3; - } else if (pStack.getCount() > 1) { - i = 2; - } - - return i; - } - - /** - * @return If items should spread out when rendered in 3D - */ - public boolean shouldSpreadItems() { - return true; - } - - /** - * @return If items should have a bob effect - */ - public boolean shouldBob() { - return true; - } - - @Override - protected void _delete() { - instances.delete(); - } - -} +// FIXME 1.21.11: port +//package dev.engine_room.vanillin.visuals; +// +//import com.mojang.blaze3d.vertex.PoseStack; +//import com.mojang.math.Axis; +// +//import dev.engine_room.flywheel.api.visualization.VisualizationContext; +//import dev.engine_room.flywheel.lib.instance.InstanceTypes; +//import dev.engine_room.flywheel.lib.instance.TransformedInstance; +//import dev.engine_room.flywheel.lib.transform.TransformStack; +//import dev.engine_room.flywheel.lib.visual.AbstractEntityVisual; +//import dev.engine_room.flywheel.lib.visual.SimpleDynamicVisual; +//import dev.engine_room.flywheel.lib.visual.util.InstanceRecycler; +//import dev.engine_room.vanillin.item.ItemModels; +//import net.minecraft.client.renderer.LightTexture; +//import net.minecraft.client.resources.model.BakedModel; +//import net.minecraft.util.Mth; +//import net.minecraft.util.RandomSource; +//import net.minecraft.world.entity.item.ItemEntity; +//import net.minecraft.world.item.Item; +//import net.minecraft.world.item.ItemDisplayContext; +//import net.minecraft.world.item.ItemStack; +//import net.minecraft.world.level.LightLayer; +// +//public class ItemVisual extends AbstractEntityVisual implements SimpleDynamicVisual { +// +// private static final ThreadLocal RANDOM = ThreadLocal.withInitial(RandomSource::createNewThreadLocalInstance); +// +// private final PoseStack pPoseStack = new PoseStack(); +// private final BakedModel bakedModel; +// +// private final InstanceRecycler instances; +// +// public ItemVisual(VisualizationContext ctx, ItemEntity entity, float partialTick) { +// super(ctx, entity, partialTick); +// +// var item = entity.getItem(); +// bakedModel = ItemModels.getModel(item); +// +// var model = ItemModels.get(level, item, ItemDisplayContext.GROUND); +// +// instances = new InstanceRecycler<>(() -> ctx.instancerProvider() +// .instancer(InstanceTypes.TRANSFORMED, model) +// .createInstance()); +// +// animate(partialTick); +// } +// +// public static boolean isSupported(ItemEntity entity) { +// return ItemModels.isSupported(entity.getItem()); +// } +// +// @Override +// public void beginFrame(Context ctx) { +// if (!isVisible(ctx.frustum())) { +// return; +// } +// +// animate(ctx.partialTick()); +// } +// +// private void animate(float partialTick) { +// pPoseStack.setIdentity(); +// TransformStack.of(pPoseStack) +// .translate(getVisualPosition(partialTick)); +// +// instances.resetCount(); +// ItemStack itemstack = entity.getItem(); +// int i = itemstack.isEmpty() ? 187 : Item.getId(itemstack.getItem()) + itemstack.getDamageValue(); +// var random = RANDOM.get(); +// random.setSeed(i); +// boolean flag = bakedModel.isGui3d(); +// int j = this.getRenderAmount(itemstack); +// float f = 0.25F; +// float f1 = shouldBob() ? Mth.sin(((float) entity.getAge() + partialTick) / 10.0F + entity.bobOffs) * 0.1F + 0.1F : 0; +// float groundScaleX = bakedModel.getTransforms().ground.scale.y(); +// float groundScaleY = bakedModel.getTransforms().ground.scale.y(); +// float groundScaleZ = bakedModel.getTransforms().ground.scale.y(); +// pPoseStack.translate(0.0F, f1 + 0.25F * groundScaleZ, 0.0F); +// float f3 = entity.getSpin(partialTick); +// pPoseStack.mulPose(Axis.YP.rotation(f3)); +// if (!flag) { +// float f7 = -0.0F * (float) (j - 1) * 0.5F * groundScaleX; +// float f8 = -0.0F * (float) (j - 1) * 0.5F * groundScaleY; +// float f9 = -0.09375F * (float) (j - 1) * 0.5F * groundScaleZ; +// pPoseStack.translate(f7, f8, f9); +// } +// +// int light = LightTexture.pack(level.getBrightness(LightLayer.BLOCK, entity.blockPosition()), level.getBrightness(LightLayer.SKY, entity.blockPosition())); +// +// for (int k = 0; k < j; ++k) { +// pPoseStack.pushPose(); +// if (k > 0) { +// if (flag) { +// float f11 = (random.nextFloat() * 2.0F - 1.0F) * 0.15F; +// float f13 = (random.nextFloat() * 2.0F - 1.0F) * 0.15F; +// float f10 = (random.nextFloat() * 2.0F - 1.0F) * 0.15F; +// pPoseStack.translate(shouldSpreadItems() ? f11 : 0, shouldSpreadItems() ? f13 : 0, shouldSpreadItems() ? f10 : 0); +// } else { +// float f12 = (random.nextFloat() * 2.0F - 1.0F) * 0.15F * 0.5F; +// float f14 = (random.nextFloat() * 2.0F - 1.0F) * 0.15F * 0.5F; +// pPoseStack.translate(shouldSpreadItems() ? f12 : 0, shouldSpreadItems() ? f14 : 0, 0.0D); +// } +// } +// +// instances.get() +// .setTransform(pPoseStack.last()) +// .light(light) +// .setChanged(); +// pPoseStack.popPose(); +// if (!flag) { +// pPoseStack.translate(0.0, 0.0, 0.09375F * groundScaleZ); +// } +// } +// +// instances.discardExtra(); +// } +// +// protected int getRenderAmount(ItemStack pStack) { +// int i = 1; +// if (pStack.getCount() > 48) { +// i = 5; +// } else if (pStack.getCount() > 32) { +// i = 4; +// } else if (pStack.getCount() > 16) { +// i = 3; +// } else if (pStack.getCount() > 1) { +// i = 2; +// } +// +// return i; +// } +// +// /** +// * @return If items should spread out when rendered in 3D +// */ +// public boolean shouldSpreadItems() { +// return true; +// } +// +// /** +// * @return If items should have a bob effect +// */ +// public boolean shouldBob() { +// return true; +// } +// +// @Override +// protected void _delete() { +// instances.delete(); +// } +// +//} diff --git a/common/src/vanillin/java/dev/engine_room/vanillin/visuals/MinecartVisual.java b/common/src/vanillin/java/dev/engine_room/vanillin/visuals/MinecartVisual.java index 688828a11..26c70852d 100644 --- a/common/src/vanillin/java/dev/engine_room/vanillin/visuals/MinecartVisual.java +++ b/common/src/vanillin/java/dev/engine_room/vanillin/visuals/MinecartVisual.java @@ -1,12 +1,5 @@ package dev.engine_room.vanillin.visuals; -import com.mojang.math.Axis; - -import net.minecraft.world.entity.vehicle.minecart.MinecartBehavior; -import net.minecraft.world.entity.vehicle.minecart.NewMinecartBehavior; - -import net.minecraft.world.entity.vehicle.minecart.OldMinecartBehavior; - import org.joml.Matrix4f; import org.joml.Matrix4fStack; import org.jspecify.annotations.Nullable; @@ -29,6 +22,9 @@ import net.minecraft.resources.Identifier; import net.minecraft.util.Mth; import net.minecraft.world.entity.vehicle.minecart.AbstractMinecart; +import net.minecraft.world.entity.vehicle.minecart.MinecartBehavior; +import net.minecraft.world.entity.vehicle.minecart.NewMinecartBehavior; +import net.minecraft.world.entity.vehicle.minecart.OldMinecartBehavior; import net.minecraft.world.level.block.RenderShape; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.Vec3; diff --git a/fabric/src/main/resources/flywheel.impl.fabric.mixins.json b/fabric/src/main/resources/flywheel.impl.fabric.mixins.json index de280fb0c..3e192003f 100644 --- a/fabric/src/main/resources/flywheel.impl.fabric.mixins.json +++ b/fabric/src/main/resources/flywheel.impl.fabric.mixins.json @@ -6,7 +6,6 @@ "refmap": "flywheel.refmap.json", "client": [ "ArgumentTypeInfosAccessor", - "DebugScreenOverlayMixin", "MinecraftMixin", "SystemReportMixin" ], diff --git a/vanillinFabric/src/main/java/dev/engine_room/vanillin/VanillinXplatImpl.java b/vanillinFabric/src/main/java/dev/engine_room/vanillin/VanillinXplatImpl.java index 8a853a672..c6608f247 100644 --- a/vanillinFabric/src/main/java/dev/engine_room/vanillin/VanillinXplatImpl.java +++ b/vanillinFabric/src/main/java/dev/engine_room/vanillin/VanillinXplatImpl.java @@ -1,14 +1,6 @@ package dev.engine_room.vanillin; -import org.jspecify.annotations.Nullable; - -import dev.engine_room.vanillin.fabric.mixin.item.ItemColorsAccessor; -import dev.engine_room.vanillin.fabric.mixin.item.MinecraftAccessor; import net.fabricmc.loader.api.FabricLoader; -import net.minecraft.client.Minecraft; -import net.minecraft.client.color.item.ItemColor; -import net.minecraft.core.registries.BuiltInRegistries; -import net.minecraft.world.item.Item; public class VanillinXplatImpl implements VanillinXplat { @Override @@ -17,13 +9,6 @@ public boolean isDevelopmentEnvironment() { .isDevelopmentEnvironment(); } - @Override - @Nullable - public ItemColor itemColors(Item item) { - var itemColors = ((ItemColorsAccessor) ((MinecraftAccessor) Minecraft.getInstance()).vanillin$itemColors()).vanillin$itemColors(); - return itemColors.byId(BuiltInRegistries.ITEM.getId(item)); - } - @Override public boolean isModLoaded(String modId) { return FabricLoader.getInstance() diff --git a/vanillinFabric/src/main/java/dev/engine_room/vanillin/fabric/mixin/item/ItemColorsAccessor.java b/vanillinFabric/src/main/java/dev/engine_room/vanillin/fabric/mixin/item/ItemColorsAccessor.java deleted file mode 100644 index 78b2e5559..000000000 --- a/vanillinFabric/src/main/java/dev/engine_room/vanillin/fabric/mixin/item/ItemColorsAccessor.java +++ /dev/null @@ -1,14 +0,0 @@ -package dev.engine_room.vanillin.fabric.mixin.item; - -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.gen.Accessor; - -import net.minecraft.client.color.item.ItemColor; -import net.minecraft.client.color.item.ItemColors; -import net.minecraft.core.IdMapper; - -@Mixin(ItemColors.class) -public interface ItemColorsAccessor { - @Accessor("itemColors") - IdMapper vanillin$itemColors(); -} diff --git a/vanillinFabric/src/main/java/dev/engine_room/vanillin/fabric/mixin/item/MinecraftAccessor.java b/vanillinFabric/src/main/java/dev/engine_room/vanillin/fabric/mixin/item/MinecraftAccessor.java deleted file mode 100644 index 3347ecb9e..000000000 --- a/vanillinFabric/src/main/java/dev/engine_room/vanillin/fabric/mixin/item/MinecraftAccessor.java +++ /dev/null @@ -1,13 +0,0 @@ -package dev.engine_room.vanillin.fabric.mixin.item; - -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.gen.Accessor; - -import net.minecraft.client.Minecraft; -import net.minecraft.client.color.item.ItemColors; - -@Mixin(Minecraft.class) -public interface MinecraftAccessor { - @Accessor("itemColors") - ItemColors vanillin$itemColors(); -} diff --git a/vanillinFabric/src/main/resources/vanillin.fabric.mixins.json b/vanillinFabric/src/main/resources/vanillin.fabric.mixins.json index 88c9e26b6..226f251cb 100644 --- a/vanillinFabric/src/main/resources/vanillin.fabric.mixins.json +++ b/vanillinFabric/src/main/resources/vanillin.fabric.mixins.json @@ -5,8 +5,6 @@ "compatibilityLevel" : "JAVA_17", "refmap" : "vanillin.refmap.json", "client" : [ - "item.ItemColorsAccessor", - "item.MinecraftAccessor" ], "injectors" : { "defaultRequire" : 1 diff --git a/vanillinNeoForge/src/main/java/dev/engine_room/vanillin/VanillinXplatImpl.java b/vanillinNeoForge/src/main/java/dev/engine_room/vanillin/VanillinXplatImpl.java index 3ad095ebb..415bc64d6 100644 --- a/vanillinNeoForge/src/main/java/dev/engine_room/vanillin/VanillinXplatImpl.java +++ b/vanillinNeoForge/src/main/java/dev/engine_room/vanillin/VanillinXplatImpl.java @@ -1,28 +1,15 @@ package dev.engine_room.vanillin; -import dev.engine_room.vanillin.neoforge.mixin.item.ItemColorsAccessor; -import net.minecraft.client.Minecraft; -import net.minecraft.client.color.item.ItemColor; -import net.minecraft.world.item.Item; -import net.neoforged.fml.loading.FMLEnvironment; -import net.neoforged.fml.loading.LoadingModList; +import net.neoforged.fml.loading.FMLLoader; public class VanillinXplatImpl implements VanillinXplat { @Override public boolean isDevelopmentEnvironment() { - return !FMLEnvironment.production; - } - - @Override - public ItemColor itemColors(Item item) { - return ((ItemColorsAccessor) Minecraft.getInstance() - .getItemColors()).vanillin$itemColors() - .get(item); + return !FMLLoader.getCurrent().isProduction(); } @Override public boolean isModLoaded(String modId) { - return LoadingModList.get() - .getModFileById(modId) != null; + return FMLLoader.getCurrent().getLoadingModList().getModFileById(modId) != null; } } diff --git a/vanillinNeoForge/src/main/java/dev/engine_room/vanillin/neoforge/mixin/item/ItemColorsAccessor.java b/vanillinNeoForge/src/main/java/dev/engine_room/vanillin/neoforge/mixin/item/ItemColorsAccessor.java deleted file mode 100644 index 3f161386e..000000000 --- a/vanillinNeoForge/src/main/java/dev/engine_room/vanillin/neoforge/mixin/item/ItemColorsAccessor.java +++ /dev/null @@ -1,16 +0,0 @@ -package dev.engine_room.vanillin.neoforge.mixin.item; - -import java.util.Map; - -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.gen.Accessor; - -import net.minecraft.client.color.item.ItemColor; -import net.minecraft.client.color.item.ItemColors; -import net.minecraft.world.item.Item; - -@Mixin(ItemColors.class) -public interface ItemColorsAccessor { - @Accessor("itemColors") - Map vanillin$itemColors(); -} diff --git a/vanillinNeoForge/src/main/resources/vanillin.neoforge.mixins.json b/vanillinNeoForge/src/main/resources/vanillin.neoforge.mixins.json index f4941242a..f64ecd1fd 100644 --- a/vanillinNeoForge/src/main/resources/vanillin.neoforge.mixins.json +++ b/vanillinNeoForge/src/main/resources/vanillin.neoforge.mixins.json @@ -5,7 +5,6 @@ "compatibilityLevel" : "JAVA_17", "refmap" : "vanillin.refmap.json", "client" : [ - "item.ItemColorsAccessor" ], "injectors" : { "defaultRequire" : 1 From 5618a0bb96016a11065e0cb5784c6b52fc3993f8 Mon Sep 17 00:00:00 2001 From: IThundxr Date: Sat, 14 Feb 2026 12:28:51 -0500 Subject: [PATCH 23/59] Fog fixes --- .../flywheel/internal/uniforms/fog.glsl | 6 ++++-- .../assets/flywheel/flywheel/fog/linear.glsl | 20 ++++++++++++++----- 2 files changed, 19 insertions(+), 7 deletions(-) diff --git a/common/src/backend/resources/assets/flywheel/flywheel/internal/uniforms/fog.glsl b/common/src/backend/resources/assets/flywheel/flywheel/internal/uniforms/fog.glsl index 349ae7c13..875b65ceb 100644 --- a/common/src/backend/resources/assets/flywheel/flywheel/internal/uniforms/fog.glsl +++ b/common/src/backend/resources/assets/flywheel/flywheel/internal/uniforms/fog.glsl @@ -1,7 +1,9 @@ layout(std140) uniform _FlwFogUniforms { vec4 flw_fogColor; - vec2 flw_fogEnvironmentalRange; - vec2 flw_fogRenderDistanceRange; + float flw_fogEnvironmentalStart; + float flw_fogEnvironmentalEnd; + float flw_fogRenderDistanceStart; + float flw_fogRenderDistanceEnd; float flw_fogSkyEnd; float flw_fogCloudEnd; }; diff --git a/common/src/lib/resources/assets/flywheel/flywheel/fog/linear.glsl b/common/src/lib/resources/assets/flywheel/flywheel/fog/linear.glsl index 9c03c6791..6411e5953 100644 --- a/common/src/lib/resources/assets/flywheel/flywheel/fog/linear.glsl +++ b/common/src/lib/resources/assets/flywheel/flywheel/fog/linear.glsl @@ -1,12 +1,22 @@ -vec4 linearFog(vec4 color, float distance, float fogStart, float fogEnd, vec4 fogColor) { - if (distance <= fogStart) { - return color; +float linearFogValue(float vertexDistance, float fogStart, float fogEnd) { + if (vertexDistance <= fogStart) { + return 0.0; + } else if (vertexDistance >= fogEnd) { + return 1.0; } - float fogValue = distance < fogEnd ? smoothstep(fogStart, fogEnd, distance) : 1.0; + return (vertexDistance - fogStart) / (fogEnd - fogStart); +} + +float totalFogValue(float sphericalVertexDistance, float cylindricalVertexDistance, float environmentalStart, float environmantalEnd, float renderDistanceStart, float renderDistanceEnd) { + return max(linearFogValue(sphericalVertexDistance, environmentalStart, environmantalEnd), linearFogValue(cylindricalVertexDistance, renderDistanceStart, renderDistanceEnd)); +} + +vec4 linearFog(vec4 color, float sphericalVertexDistance, float cylindricalVertexDistance, float environmentalStart, float environmantalEnd, float renderDistanceStart, float renderDistanceEnd, vec4 fogColor) { + float fogValue = totalFogValue(sphericalVertexDistance, cylindricalVertexDistance, environmentalStart, environmantalEnd, renderDistanceStart, renderDistanceEnd); return vec4(mix(color.rgb, fogColor.rgb, fogValue * fogColor.a), color.a); } vec4 flw_fogFilter(vec4 color) { - return linearFog(color, flw_distance, flw_fogRange.x, flw_fogRange.y, flw_fogColor); + return linearFog(color, flw_sphericalDistance, flw_cylindricalDistance, flw_fogEnvironmentalStart, flw_fogEnvironmentalEnd, flw_fogRenderDistanceStart, flw_fogRenderDistanceEnd, flw_fogColor); } From 08f24b6bc5e4e270081bbc70a3f1caac931d6568 Mon Sep 17 00:00:00 2001 From: Evoloxi <69534332+Evoloxi@users.noreply.github.com> Date: Sat, 14 Feb 2026 18:30:49 +0100 Subject: [PATCH 24/59] Merge pull request #3 * imitate fabric-loom/b13a00e * Fog * Fog II * Bind main render target before submits * What the Helly * Revert "imitate fabric-loom/b13a00e" * Small cleanup * Merge branch '1.21.11/dev' into fork/Evoloxi/1.21.11/dev --- .../flywheel/backend/engine/TextureBinder.java | 13 +++++++++++++ .../engine/indirect/IndirectDrawManager.java | 2 ++ .../engine/instancing/InstancedDrawManager.java | 5 +++++ .../flywheel/backend/mixin/RenderSystemMixin.java | 2 +- 4 files changed, 21 insertions(+), 1 deletion(-) diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/engine/TextureBinder.java b/common/src/backend/java/dev/engine_room/flywheel/backend/engine/TextureBinder.java index 5d9e6f5ae..94d27449e 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/engine/TextureBinder.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/engine/TextureBinder.java @@ -1,5 +1,9 @@ package dev.engine_room.flywheel.backend.engine; +import com.mojang.blaze3d.opengl.GlDevice; +import com.mojang.blaze3d.pipeline.RenderTarget; + +import org.lwjgl.opengl.GL32; import org.lwjgl.opengl.GL33C; import com.mojang.blaze3d.opengl.GlConst; @@ -46,6 +50,15 @@ public static void bindLightAndOverlay() { bind(Samplers.LIGHT.number, (GlTextureView) gameRenderer.lightTexture().getTextureView(), sampler); } + public static void bindRenderTarget(RenderTarget target) { + GlTexture colorTexture = (GlTexture) target.getColorTexture(); + int i = colorTexture.getFbo( + ((GlDevice) RenderSystem.getDevice()).directStateAccess(), + target.getDepthTexture() + ); + GL32.glBindFramebuffer(GL33C.GL_FRAMEBUFFER, i); + } + /** * Get a built-in texture by its resource id. * diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/engine/indirect/IndirectDrawManager.java b/common/src/backend/java/dev/engine_room/flywheel/backend/engine/indirect/IndirectDrawManager.java index 895fcb68a..a84fbb1ed 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/engine/indirect/IndirectDrawManager.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/engine/indirect/IndirectDrawManager.java @@ -146,6 +146,7 @@ public void render(LightStorage lightStorage, EnvironmentStorage environmentStor lightBuffers.bind(); matrixBuffer.bind(); Uniforms.bindAll(); + TextureBinder.bindRenderTarget(Minecraft.getInstance().getMainRenderTarget()); for (var group : cullingGroups.values()) { group.submitSolid(); @@ -235,6 +236,7 @@ public void renderCrumbling(List crumblingBlocks) { // Set up the crumbling program buffers. Nothing changes here between draws. GlBufferType.DRAW_INDIRECT_BUFFER.bind(crumblingDrawBuffer.handle()); glBindBufferRange(GL_SHADER_STORAGE_BUFFER, BufferBindings.DRAW, crumblingDrawBuffer.handle(), 0, IndirectBuffers.DRAW_COMMAND_STRIDE); + TextureBinder.bindRenderTarget(Minecraft.getInstance().getMainRenderTarget()); for (var groupEntry : byType.entrySet()) { var byProgress = groupEntry.getValue(); diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/engine/instancing/InstancedDrawManager.java b/common/src/backend/java/dev/engine_room/flywheel/backend/engine/instancing/InstancedDrawManager.java index 5d5a2b2f3..5d5a7605c 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/engine/instancing/InstancedDrawManager.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/engine/instancing/InstancedDrawManager.java @@ -118,6 +118,9 @@ public void render(LightStorage lightStorage, EnvironmentStorage environmentStor TextureBinder.bindLightAndOverlay(); light.bind(); + TextureBinder.bindRenderTarget(Minecraft.getInstance().getMainRenderTarget()); + + submitDraws(); if (!oitDraws.isEmpty()) { @@ -259,7 +262,9 @@ public void renderCrumbling(List crumblingBlocks) { Uniforms.bindAll(); vao.bindForDraw(); + TextureBinder.bindLightAndOverlay(); + TextureBinder.bindRenderTarget(Minecraft.getInstance().getMainRenderTarget()); for (var groupEntry : byType.entrySet()) { var byProgress = groupEntry.getValue(); diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/mixin/RenderSystemMixin.java b/common/src/backend/java/dev/engine_room/flywheel/backend/mixin/RenderSystemMixin.java index cd205ed75..75f5c20ac 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/mixin/RenderSystemMixin.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/mixin/RenderSystemMixin.java @@ -11,7 +11,7 @@ @Mixin(value = RenderSystem.class, remap = false) abstract class RenderSystemMixin { - @Inject(method = "initRenderer(JIZLcom/mojang/blaze3d/shaders/ShaderSource;Z)V", at = @At("RETURN")) + @Inject(method = "initRenderer", at = @At("RETURN")) private static void flywheel$onInitRenderer(CallbackInfo ci) { GlCompat.init(); } From 2ea52a9f927cef148ed882c47b7a68bf4ad6268e Mon Sep 17 00:00:00 2001 From: IThundxr Date: Sat, 14 Feb 2026 12:47:22 -0500 Subject: [PATCH 25/59] Mixin fixes --- .../java/dev/engine_room/flywheel/impl/FlywheelNeoForge.java | 2 +- .../dev/engine_room/flywheel/impl/mixin/MinecraftMixin.java | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/neoforge/src/main/java/dev/engine_room/flywheel/impl/FlywheelNeoForge.java b/neoforge/src/main/java/dev/engine_room/flywheel/impl/FlywheelNeoForge.java index 2737c7f61..dacc703a5 100644 --- a/neoforge/src/main/java/dev/engine_room/flywheel/impl/FlywheelNeoForge.java +++ b/neoforge/src/main/java/dev/engine_room/flywheel/impl/FlywheelNeoForge.java @@ -66,7 +66,7 @@ private static void registerImplEventListeners(IEventBus gameEventBus, IEventBus gameEventBus.addListener(FlwCommands::registerClientCommands); - gameEventBus.addListener((RegisterDebugEntriesEvent e) -> e.register(IdentifierUtil.id("flw_debug_info"), new FlwDebugInfo.FlwDebugEntry())); + modEventBus.addListener((RegisterDebugEntriesEvent e) -> e.register(IdentifierUtil.id("flw_debug_info"), new FlwDebugInfo.FlwDebugEntry())); modEventBus.addListener((EndClientResourceReloadEvent e) -> BackendManagerImpl.onEndClientResourceReload(e.error().isPresent())); diff --git a/neoforge/src/main/java/dev/engine_room/flywheel/impl/mixin/MinecraftMixin.java b/neoforge/src/main/java/dev/engine_room/flywheel/impl/mixin/MinecraftMixin.java index 50950fbab..fcf751a34 100644 --- a/neoforge/src/main/java/dev/engine_room/flywheel/impl/mixin/MinecraftMixin.java +++ b/neoforge/src/main/java/dev/engine_room/flywheel/impl/mixin/MinecraftMixin.java @@ -28,12 +28,12 @@ abstract class MinecraftMixin { FlwImpl.freezeRegistries(); } - @Inject(method = "lambda$new$8", at = @At("HEAD"), remap = false) + @Inject(method = "method_53522", at = @At("HEAD"), remap = false) private void flywheel$onEndInitialResourceReload(@Coerce Object gameLoadCookie, Optional error, CallbackInfo ci) { ModLoader.postEvent(new EndClientResourceReloadEvent((Minecraft) (Object) this, resourceManager, true, error)); } - @Inject(method = "lambda$reloadResourcePacks$21", at = @At("HEAD"), remap = false) + @Inject(method = "lambda$reloadResourcePacks$20", at = @At("HEAD"), remap = false) private void flywheel$onEndManualResourceReload(boolean recovery, @Coerce Object gameLoadCookie, CompletableFuture completablefuture, Optional error, CallbackInfo ci) { ModLoader.postEvent(new EndClientResourceReloadEvent((Minecraft) (Object) this, resourceManager, false, error)); } From 5a8ce51d6b55ae2d4c118ce2a005ac1cb697677e Mon Sep 17 00:00:00 2001 From: IThundxr Date: Wed, 18 Feb 2026 13:18:30 -0500 Subject: [PATCH 26/59] GLium --- .../backend/compile/core/Compilation.java | 15 +++--- .../backend/compile/core/ProgramLinker.java | 23 ++++----- .../backend/engine/MaterialRenderState.java | 12 ++--- .../flywheel/backend/engine/MeshPool.java | 6 ++- .../backend/engine/TextureBinder.java | 10 ++-- .../backend/engine/indirect/DepthPyramid.java | 17 ++++--- .../engine/indirect/IndirectBuffers.java | 7 ++- .../engine/indirect/IndirectCullingGroup.java | 19 ++++--- .../engine/indirect/IndirectDrawManager.java | 25 +++++---- .../indirect/ResizableStorageBuffer.java | 19 ++++--- .../backend/engine/uniform/UniformBuffer.java | 2 +- .../flywheel/backend/gl/GlCompat.java | 15 +++--- .../flywheel/backend/gl/GlFence.java | 19 +++---- .../flywheel/backend/gl/GlNumericType.java | 18 +++---- .../flywheel/backend/gl/GlPrimitive.java | 14 ++--- .../flywheel/backend/gl/GlStateTracker.java | 5 +- .../flywheel/backend/gl/GlTextureUnit.java | 7 ++- .../flywheel/backend/gl/TextureBuffer.java | 4 +- .../backend/gl/array/GlVertexArray.java | 4 +- .../backend/gl/array/GlVertexArrayGL3.java | 13 +++-- .../GlVertexArraySeparateAttributes.java | 6 ++- .../flywheel/backend/gl/buffer/Buffer.java | 4 +- .../backend/gl/buffer/GlBufferType.java | 30 ++++++----- .../backend/gl/buffer/GlBufferUsage.java | 20 ++++---- .../flywheel/backend/gl/error/GlError.java | 4 +- .../flywheel/backend/gl/shader/GlProgram.java | 51 +++++++------------ .../flywheel/backend/gl/shader/GlShader.java | 4 +- .../backend/gl/shader/ShaderType.java | 7 +-- 28 files changed, 187 insertions(+), 193 deletions(-) diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/compile/core/Compilation.java b/common/src/backend/java/dev/engine_room/flywheel/backend/compile/core/Compilation.java index 9891a151b..5907aabff 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/compile/core/Compilation.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/compile/core/Compilation.java @@ -5,7 +5,8 @@ import java.util.ArrayList; import java.util.List; -import org.lwjgl.opengl.GL20; +import com.mojang.blaze3d.opengl.GlConst; +import com.mojang.blaze3d.opengl.GlStateManager; import dev.engine_room.flywheel.backend.compile.FlwPrograms; import dev.engine_room.flywheel.backend.gl.GlCompat; @@ -16,6 +17,7 @@ import dev.engine_room.flywheel.backend.glsl.SourceFile; import dev.engine_room.flywheel.lib.util.StringUtil; import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.ShaderManager; /** * Builder style class for compiling shaders. @@ -32,22 +34,23 @@ public class Compilation { private int generatedLines = 0; public ShaderResult compile(ShaderType shaderType, String name) { - int handle = GL20.glCreateShader(shaderType.glEnum); + int handle = GlStateManager.glCreateShader(shaderType.glEnum); var source = fullSource.toString(); GlCompat.safeShaderSource(handle, source); - GL20.glCompileShader(handle); + GlStateManager.glCompileShader(handle); var shaderName = name + "." + shaderType.extension; dumpSource(source, shaderName); - var infoLog = GL20.glGetShaderInfoLog(handle); + var logLength = GlStateManager.glGetShaderi(handle, ShaderManager.MAX_LOG_LENGTH); + var infoLog = GlStateManager.glGetShaderInfoLog(handle, logLength); if (compiledSuccessfully(handle)) { return ShaderResult.success(new GlShader(handle, shaderType, shaderName), infoLog); } - GL20.glDeleteShader(handle); + GlStateManager.glDeleteShader(handle); return ShaderResult.failure(new FailedCompilation(shaderName, files, generatedSource.toString(), source, infoLog)); } @@ -134,6 +137,6 @@ private static void dumpSource(String source, String fileName) { } public static boolean compiledSuccessfully(int handle) { - return GL20.glGetShaderi(handle, GL20.GL_COMPILE_STATUS) == GL20.GL_TRUE; + return GlStateManager.glGetShaderi(handle, GlConst.GL_COMPILE_STATUS) == GlConst.GL_TRUE; } } diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/compile/core/ProgramLinker.java b/common/src/backend/java/dev/engine_room/flywheel/backend/compile/core/ProgramLinker.java index 94ad675a6..a6a244b86 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/compile/core/ProgramLinker.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/compile/core/ProgramLinker.java @@ -1,18 +1,14 @@ package dev.engine_room.flywheel.backend.compile.core; -import static org.lwjgl.opengl.GL11.GL_TRUE; -import static org.lwjgl.opengl.GL20.GL_LINK_STATUS; -import static org.lwjgl.opengl.GL20.glAttachShader; -import static org.lwjgl.opengl.GL20.glCreateProgram; -import static org.lwjgl.opengl.GL20.glGetProgramInfoLog; -import static org.lwjgl.opengl.GL20.glGetProgrami; -import static org.lwjgl.opengl.GL20.glLinkProgram; - import java.util.List; import java.util.function.Consumer; +import com.mojang.blaze3d.opengl.GlConst; +import com.mojang.blaze3d.opengl.GlStateManager; + import dev.engine_room.flywheel.backend.gl.shader.GlProgram; import dev.engine_room.flywheel.backend.gl.shader.GlShader; +import net.minecraft.client.renderer.ShaderManager; public class ProgramLinker { @@ -25,17 +21,18 @@ public GlProgram link(List shaders, Consumer preLink) { } private LinkResult linkInternal(List shaders, Consumer preLink) { - int handle = glCreateProgram(); + int handle = GlStateManager.glCreateProgram(); var out = new GlProgram(handle); for (GlShader shader : shaders) { - glAttachShader(handle, shader.handle()); + GlStateManager.glAttachShader(handle, shader.handle()); } preLink.accept(out); - glLinkProgram(handle); - String log = glGetProgramInfoLog(handle); + GlStateManager.glLinkProgram(handle); + int logLength = GlStateManager.glGetProgrami(handle, ShaderManager.MAX_LOG_LENGTH); + String log = GlStateManager.glGetProgramInfoLog(handle, logLength); if (linkSuccessful(handle)) { return LinkResult.success(out, log); @@ -46,7 +43,7 @@ private LinkResult linkInternal(List shaders, Consumer preL } private static boolean linkSuccessful(int handle) { - return glGetProgrami(handle, GL_LINK_STATUS) == GL_TRUE; + return GlStateManager.glGetProgrami(handle, GlConst.GL_LINK_STATUS) == GlConst.GL_TRUE; } } diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/engine/MaterialRenderState.java b/common/src/backend/java/dev/engine_room/flywheel/backend/engine/MaterialRenderState.java index 5ed0ce1a4..3f4e842c3 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/engine/MaterialRenderState.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/engine/MaterialRenderState.java @@ -91,19 +91,19 @@ private static void setupDepthTest(DepthTest depthTest) { } case LESS -> { GlStateManager._enableDepthTest(); - GlStateManager._depthFunc(GL11.GL_LESS); + GlStateManager._depthFunc(GlConst.GL_LESS); } case EQUAL -> { GlStateManager._enableDepthTest(); - GlStateManager._depthFunc(GL11.GL_EQUAL); + GlStateManager._depthFunc(GlConst.GL_EQUAL); } case LEQUAL -> { GlStateManager._enableDepthTest(); - GlStateManager._depthFunc(GL11.GL_LEQUAL); + GlStateManager._depthFunc(GlConst.GL_LEQUAL); } case GREATER -> { GlStateManager._enableDepthTest(); - GlStateManager._depthFunc(GL11.GL_GREATER); + GlStateManager._depthFunc(GlConst.GL_GREATER); } case NOTEQUAL -> { GlStateManager._enableDepthTest(); @@ -111,11 +111,11 @@ private static void setupDepthTest(DepthTest depthTest) { } case GEQUAL -> { GlStateManager._enableDepthTest(); - GlStateManager._depthFunc(GL11.GL_GEQUAL); + GlStateManager._depthFunc(GlConst.GL_GEQUAL); } case ALWAYS -> { GlStateManager._enableDepthTest(); - GlStateManager._depthFunc(GL11.GL_ALWAYS); + GlStateManager._depthFunc(GlConst.GL_ALWAYS); } } } diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/engine/MeshPool.java b/common/src/backend/java/dev/engine_room/flywheel/backend/engine/MeshPool.java index 006ed111d..bad435779 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/engine/MeshPool.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/engine/MeshPool.java @@ -8,6 +8,8 @@ import org.jspecify.annotations.Nullable; import org.lwjgl.opengl.GL32; +import com.mojang.blaze3d.opengl.GlConst; + import dev.engine_room.flywheel.api.model.Mesh; import dev.engine_room.flywheel.backend.InternalVertex; import dev.engine_room.flywheel.backend.gl.GlPrimitive; @@ -181,9 +183,9 @@ public boolean isInvalid() { public void draw(int instanceCount) { if (instanceCount > 1) { - GL32.glDrawElementsInstancedBaseVertex(GlPrimitive.TRIANGLES.glEnum, mesh.indexCount(), GL32.GL_UNSIGNED_INT, firstIndexByteOffset(), instanceCount, baseVertex); + GL32.glDrawElementsInstancedBaseVertex(GlPrimitive.TRIANGLES.glEnum, mesh.indexCount(), GlConst.GL_UNSIGNED_INT, firstIndexByteOffset(), instanceCount, baseVertex); } else { - GL32.glDrawElementsBaseVertex(GlPrimitive.TRIANGLES.glEnum, mesh.indexCount(), GL32.GL_UNSIGNED_INT, firstIndexByteOffset(), baseVertex); + GL32.glDrawElementsBaseVertex(GlPrimitive.TRIANGLES.glEnum, mesh.indexCount(), GlConst.GL_UNSIGNED_INT, firstIndexByteOffset(), baseVertex); } } diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/engine/TextureBinder.java b/common/src/backend/java/dev/engine_room/flywheel/backend/engine/TextureBinder.java index 94d27449e..a8ffb1e35 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/engine/TextureBinder.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/engine/TextureBinder.java @@ -1,16 +1,14 @@ package dev.engine_room.flywheel.backend.engine; -import com.mojang.blaze3d.opengl.GlDevice; -import com.mojang.blaze3d.pipeline.RenderTarget; - -import org.lwjgl.opengl.GL32; import org.lwjgl.opengl.GL33C; import com.mojang.blaze3d.opengl.GlConst; +import com.mojang.blaze3d.opengl.GlDevice; import com.mojang.blaze3d.opengl.GlSampler; import com.mojang.blaze3d.opengl.GlStateManager; import com.mojang.blaze3d.opengl.GlTexture; import com.mojang.blaze3d.opengl.GlTextureView; +import com.mojang.blaze3d.pipeline.RenderTarget; import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.textures.FilterMode; import com.mojang.blaze3d.textures.GpuTexture; @@ -34,7 +32,7 @@ public static void bind(int unit, GlTextureView textureView, GlSampler sampler) i = GL33C.GL_TEXTURE_CUBE_MAP; GL33C.glBindTexture(i, texture.glId()); } else { - i = GL33C.GL_TEXTURE_2D; + i = GlConst.GL_TEXTURE_2D; GlStateManager._bindTexture(texture.glId()); } @@ -56,7 +54,7 @@ public static void bindRenderTarget(RenderTarget target) { ((GlDevice) RenderSystem.getDevice()).directStateAccess(), target.getDepthTexture() ); - GL32.glBindFramebuffer(GL33C.GL_FRAMEBUFFER, i); + GlStateManager._glBindFramebuffer(GlConst.GL_FRAMEBUFFER, i); } /** diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/engine/indirect/DepthPyramid.java b/common/src/backend/java/dev/engine_room/flywheel/backend/engine/indirect/DepthPyramid.java index b6f9a83d9..80bd9ab9a 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/engine/indirect/DepthPyramid.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/engine/indirect/DepthPyramid.java @@ -3,6 +3,7 @@ import org.lwjgl.opengl.GL32; import org.lwjgl.opengl.GL46; +import com.mojang.blaze3d.opengl.GlConst; import com.mojang.blaze3d.opengl.GlStateManager; import com.mojang.blaze3d.opengl.GlTexture; import com.mojang.blaze3d.textures.GpuTexture; @@ -45,7 +46,7 @@ public void generate() { var downsampleFirstProgram = programs.getDownsampleFirstProgram(); downsampleFirstProgram.bind(); - GL46.glBindImageTexture(1, pyramidTextureId, 0, false, 0, GL32.GL_WRITE_ONLY, GL32.GL_R32F); + GL46.glBindImageTexture(1, pyramidTextureId, 0, false, 0, GlConst.GL_WRITE_ONLY, GL32.GL_R32F); GL46.glDispatchCompute(MoreMath.ceilingDiv(width << 1, 64), MoreMath.ceilingDiv(height << 1, 64), 1); var downsampleSecondProgram = programs.getDownsampleSecondProgram(); @@ -58,7 +59,7 @@ public void generate() { downsampleSecondProgram.setUInt("base_mip_level", baseMipLevel); for (int i = 0; i < Math.min(7, mipLevels - baseMipLevel); i++) { - GL46.glBindImageTexture(i, pyramidTextureId, baseMipLevel + i, false, 0, GL32.GL_WRITE_ONLY, GL32.GL_R32F); + GL46.glBindImageTexture(i, pyramidTextureId, baseMipLevel + i, false, 0, GlConst.GL_WRITE_ONLY, GL32.GL_R32F); } GL46.glDispatchCompute(MoreMath.ceilingDiv(width >> baseMipLevel, 64), MoreMath.ceilingDiv(height >> baseMipLevel, 64), 1); @@ -89,14 +90,14 @@ private void createPyramidMips(int mipLevels, int width, int height) { delete(); - pyramidTextureId = GL46.glCreateTextures(GL46.GL_TEXTURE_2D); + pyramidTextureId = GL46.glCreateTextures(GlConst.GL_TEXTURE_2D); GL46.glTextureStorage2D(pyramidTextureId, mipLevels, GL32.GL_R32F, width, height); - GL46.glTextureParameteri(pyramidTextureId, GL32.GL_TEXTURE_MIN_FILTER, GL32.GL_NEAREST); - GL46.glTextureParameteri(pyramidTextureId, GL32.GL_TEXTURE_MAG_FILTER, GL32.GL_NEAREST); - GL46.glTextureParameteri(pyramidTextureId, GL32.GL_TEXTURE_COMPARE_MODE, GL32.GL_NONE); - GL46.glTextureParameteri(pyramidTextureId, GL32.GL_TEXTURE_WRAP_S, GL32.GL_CLAMP_TO_EDGE); - GL46.glTextureParameteri(pyramidTextureId, GL32.GL_TEXTURE_WRAP_T, GL32.GL_CLAMP_TO_EDGE); + GL46.glTextureParameteri(pyramidTextureId, GlConst.GL_TEXTURE_MIN_FILTER, GlConst.GL_NEAREST); + GL46.glTextureParameteri(pyramidTextureId, GlConst.GL_TEXTURE_MAG_FILTER, GlConst.GL_NEAREST); + GL46.glTextureParameteri(pyramidTextureId, GlConst.GL_TEXTURE_COMPARE_MODE, GlConst.GL_NONE); + GL46.glTextureParameteri(pyramidTextureId, GlConst.GL_TEXTURE_WRAP_S, GlConst.GL_CLAMP_TO_EDGE); + GL46.glTextureParameteri(pyramidTextureId, GlConst.GL_TEXTURE_WRAP_T, GlConst.GL_CLAMP_TO_EDGE); } public static int mip0Size(int screenSize) { diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/engine/indirect/IndirectBuffers.java b/common/src/backend/java/dev/engine_room/flywheel/backend/engine/indirect/IndirectBuffers.java index 6280dfc6e..a7b56ff96 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/engine/indirect/IndirectBuffers.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/engine/indirect/IndirectBuffers.java @@ -1,8 +1,7 @@ package dev.engine_room.flywheel.backend.engine.indirect; -import static org.lwjgl.opengl.GL43.GL_SHADER_STORAGE_BUFFER; -import static org.lwjgl.opengl.GL44.nglBindBuffersRange; - +import org.lwjgl.opengl.GL43; +import org.lwjgl.opengl.GL44; import org.lwjgl.system.MemoryUtil; import org.lwjgl.system.Pointer; @@ -116,7 +115,7 @@ public void bindForCrumbling() { private void multiBind(int base, int count) { final long ptr = multiBindBlock.ptr(); - nglBindBuffersRange(GL_SHADER_STORAGE_BUFFER, base, count, ptr + base * INT_SIZE, ptr + OFFSET_OFFSET + base * PTR_SIZE, ptr + SIZE_OFFSET + base * PTR_SIZE); + GL44.nglBindBuffersRange(GL43.GL_SHADER_STORAGE_BUFFER, base, count, ptr + base * INT_SIZE, ptr + OFFSET_OFFSET + base * PTR_SIZE, ptr + SIZE_OFFSET + base * PTR_SIZE); } public void delete() { diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/engine/indirect/IndirectCullingGroup.java b/common/src/backend/java/dev/engine_room/flywheel/backend/engine/indirect/IndirectCullingGroup.java index 3bed52112..ee07ea95f 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/engine/indirect/IndirectCullingGroup.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/engine/indirect/IndirectCullingGroup.java @@ -1,15 +1,14 @@ package dev.engine_room.flywheel.backend.engine.indirect; -import static org.lwjgl.opengl.GL11.GL_TRIANGLES; -import static org.lwjgl.opengl.GL11.GL_UNSIGNED_INT; -import static org.lwjgl.opengl.GL42.GL_COMMAND_BARRIER_BIT; -import static org.lwjgl.opengl.GL42.glMemoryBarrier; -import static org.lwjgl.opengl.GL43.glDispatchCompute; - import java.util.ArrayList; import java.util.Comparator; import java.util.List; +import org.lwjgl.opengl.GL42; +import org.lwjgl.opengl.GL43; + +import com.mojang.blaze3d.opengl.GlConst; + import dev.engine_room.flywheel.api.instance.Instance; import dev.engine_room.flywheel.api.instance.InstanceType; import dev.engine_room.flywheel.api.material.Material; @@ -115,12 +114,12 @@ public void dispatchCull() { cullProgram.bind(); buffers.bindForCull(); - glDispatchCompute(buffers.objectStorage.capacity(), 1, 1); + GL43.glDispatchCompute(buffers.objectStorage.capacity(), 1, 1); } public void dispatchApply() { buffers.bindForApply(); - glDispatchCompute(GlCompat.getComputeGroupCount(indirectDraws.size()), 1, 1); + GL43.glDispatchCompute(GlCompat.getComputeGroupCount(indirectDraws.size()), 1, 1); } public boolean hasOitDraws() { @@ -243,7 +242,7 @@ private void drawBarrier() { if (needsDrawBarrier) { // In theory all command buffer writes will be protected by // the shader storage barrier bit, but better safe than sorry. - glMemoryBarrier(GL_COMMAND_BARRIER_BIT); + GL42.glMemoryBarrier(GL42.GL_COMMAND_BARRIER_BIT); needsDrawBarrier = false; } } @@ -288,7 +287,7 @@ public void delete() { private record MultiDraw(Material material, boolean embedded, int start, int end) { private void submit(GlProgram drawProgram) { - GlCompat.safeMultiDrawElementsIndirect(drawProgram, GL_TRIANGLES, GL_UNSIGNED_INT, this.start, this.end, IndirectBuffers.DRAW_COMMAND_STRIDE); + GlCompat.safeMultiDrawElementsIndirect(drawProgram, GlConst.GL_TRIANGLES, GlConst.GL_UNSIGNED_INT, this.start, this.end, IndirectBuffers.DRAW_COMMAND_STRIDE); } } } diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/engine/indirect/IndirectDrawManager.java b/common/src/backend/java/dev/engine_room/flywheel/backend/engine/indirect/IndirectDrawManager.java index a84fbb1ed..2638f29fc 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/engine/indirect/IndirectDrawManager.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/engine/indirect/IndirectDrawManager.java @@ -1,17 +1,16 @@ package dev.engine_room.flywheel.backend.engine.indirect; -import static org.lwjgl.opengl.GL11.GL_TRIANGLES; -import static org.lwjgl.opengl.GL11.GL_UNSIGNED_INT; -import static org.lwjgl.opengl.GL30.glBindBufferRange; -import static org.lwjgl.opengl.GL40.glDrawElementsIndirect; -import static org.lwjgl.opengl.GL42.glMemoryBarrier; -import static org.lwjgl.opengl.GL43.GL_SHADER_STORAGE_BARRIER_BIT; -import static org.lwjgl.opengl.GL43.GL_SHADER_STORAGE_BUFFER; - import java.util.HashMap; import java.util.List; import java.util.Map; +import org.lwjgl.opengl.GL30; +import org.lwjgl.opengl.GL40; +import org.lwjgl.opengl.GL42; +import org.lwjgl.opengl.GL43; + +import com.mojang.blaze3d.opengl.GlConst; + import dev.engine_room.flywheel.api.backend.Engine; import dev.engine_room.flywheel.api.instance.Instance; import dev.engine_room.flywheel.api.instance.InstanceType; @@ -119,7 +118,7 @@ public void render(LightStorage lightStorage, EnvironmentStorage environmentStor // We could probably save some driver calls here when there are // actually zero instances, but that feels like a very rare case - glMemoryBarrier(GL_SHADER_STORAGE_BARRIER_BIT); + GL42.glMemoryBarrier(GL43.GL_SHADER_STORAGE_BARRIER_BIT); matrixBuffer.bind(); @@ -129,7 +128,7 @@ public void render(LightStorage lightStorage, EnvironmentStorage environmentStor group.dispatchCull(); } - glMemoryBarrier(GL_SHADER_STORAGE_BARRIER_BIT); + GL42.glMemoryBarrier(GL43.GL_SHADER_STORAGE_BARRIER_BIT); programs.getApplyProgram() .bind(); @@ -138,7 +137,7 @@ public void render(LightStorage lightStorage, EnvironmentStorage environmentStor group.dispatchApply(); } - glMemoryBarrier(GL_SHADER_STORAGE_BARRIER_BIT); + GL42.glMemoryBarrier(GL43.GL_SHADER_STORAGE_BARRIER_BIT); TextureBinder.bindLightAndOverlay(); @@ -235,7 +234,7 @@ public void renderCrumbling(List crumblingBlocks) { // Set up the crumbling program buffers. Nothing changes here between draws. GlBufferType.DRAW_INDIRECT_BUFFER.bind(crumblingDrawBuffer.handle()); - glBindBufferRange(GL_SHADER_STORAGE_BUFFER, BufferBindings.DRAW, crumblingDrawBuffer.handle(), 0, IndirectBuffers.DRAW_COMMAND_STRIDE); + GL30.glBindBufferRange(GL43.GL_SHADER_STORAGE_BUFFER, BufferBindings.DRAW, crumblingDrawBuffer.handle(), 0, IndirectBuffers.DRAW_COMMAND_STRIDE); TextureBinder.bindRenderTarget(Minecraft.getInstance().getMainRenderTarget()); for (var groupEntry : byType.entrySet()) { @@ -269,7 +268,7 @@ public void renderCrumbling(List crumblingBlocks) { crumblingDrawBuffer.upload(block); // Submit! Everything is already bound by here. - glDrawElementsIndirect(GL_TRIANGLES, GL_UNSIGNED_INT, 0); + GL40.glDrawElementsIndirect(GlConst.GL_TRIANGLES, GlConst.GL_UNSIGNED_INT, 0); } } diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/engine/indirect/ResizableStorageBuffer.java b/common/src/backend/java/dev/engine_room/flywheel/backend/engine/indirect/ResizableStorageBuffer.java index 05aa0d722..c6f343555 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/engine/indirect/ResizableStorageBuffer.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/engine/indirect/ResizableStorageBuffer.java @@ -1,9 +1,8 @@ package dev.engine_room.flywheel.backend.engine.indirect; -import static org.lwjgl.opengl.GL15.glDeleteBuffers; -import static org.lwjgl.opengl.GL45.glCopyNamedBufferSubData; -import static org.lwjgl.opengl.GL45.glCreateBuffers; -import static org.lwjgl.opengl.GL45.glNamedBufferStorage; +import org.lwjgl.opengl.GL45; + +import com.mojang.blaze3d.opengl.GlStateManager; import dev.engine_room.flywheel.backend.gl.GlObject; import dev.engine_room.flywheel.lib.memory.FlwMemoryTracker; @@ -17,7 +16,7 @@ public class ResizableStorageBuffer extends GlObject { private long capacity = 0; public ResizableStorageBuffer() { - handle(glCreateBuffers()); + handle(GL45.glCreateBuffers()); } public long capacity() { @@ -29,17 +28,17 @@ public void ensureCapacity(long capacity) { if (this.capacity > 0) { int oldHandle = handle(); - int newHandle = glCreateBuffers(); + int newHandle = GL45.glCreateBuffers(); - glNamedBufferStorage(newHandle, capacity, 0); + GL45.glNamedBufferStorage(newHandle, capacity, 0); - glCopyNamedBufferSubData(oldHandle, newHandle, 0, 0, this.capacity); + GL45.glCopyNamedBufferSubData(oldHandle, newHandle, 0, 0, this.capacity); deleteInternal(oldHandle); handle(newHandle); } else { - glNamedBufferStorage(handle(), capacity, 0); + GL45.glNamedBufferStorage(handle(), capacity, 0); } this.capacity = capacity; FlwMemoryTracker._allocGpuMemory(this.capacity); @@ -47,7 +46,7 @@ public void ensureCapacity(long capacity) { @Override protected void deleteInternal(int handle) { - glDeleteBuffers(handle); + GlStateManager._glDeleteBuffers(handle); } @Override diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/engine/uniform/UniformBuffer.java b/common/src/backend/java/dev/engine_room/flywheel/backend/engine/uniform/UniformBuffer.java index c07c0ce29..ab4d89698 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/engine/uniform/UniformBuffer.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/engine/uniform/UniformBuffer.java @@ -8,7 +8,7 @@ import dev.engine_room.flywheel.lib.math.MoreMath; import dev.engine_room.flywheel.lib.memory.MemoryBlock; -public class UniformBuffer { + public class UniformBuffer { private final int index; private final MemoryBlock clientBuffer; @Nullable diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/gl/GlCompat.java b/common/src/backend/java/dev/engine_room/flywheel/backend/gl/GlCompat.java index 897af67fd..42a362ea4 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/gl/GlCompat.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/gl/GlCompat.java @@ -3,9 +3,7 @@ import org.jetbrains.annotations.UnknownNullability; import org.lwjgl.PointerBuffer; import org.lwjgl.opengl.GL; -import org.lwjgl.opengl.GL20; import org.lwjgl.opengl.GL20C; -import org.lwjgl.opengl.GL31C; import org.lwjgl.opengl.GL40; import org.lwjgl.opengl.GL43; import org.lwjgl.opengl.GLCapabilities; @@ -13,6 +11,9 @@ import org.lwjgl.system.MemoryStack; import org.lwjgl.system.MemoryUtil; +import com.mojang.blaze3d.opengl.GlConst; +import com.mojang.blaze3d.opengl.GlStateManager; + import dev.engine_room.flywheel.backend.FlwBackend; import dev.engine_room.flywheel.backend.compile.core.Compilation; import dev.engine_room.flywheel.backend.gl.shader.GlProgram; @@ -127,7 +128,7 @@ private static int subgroupSize() { return 32; } if (CAPABILITIES.GL_KHR_shader_subgroup) { - return GL31C.glGetInteger(KHRShaderSubgroup.GL_SUBGROUP_SIZE_KHR); + return GlStateManager._getInteger(KHRShaderSubgroup.GL_SUBGROUP_SIZE_KHR); } // Try to guess. @@ -197,7 +198,7 @@ private static GlslVersion maxGlslVersion() { } private static boolean canCompileVersion(GlslVersion version) { - int handle = GL20.glCreateShader(GL20.GL_VERTEX_SHADER); + int handle = GlStateManager.glCreateShader(GlConst.GL_VERTEX_SHADER); // Compile the simplest possible shader. var source = """ @@ -206,11 +207,11 @@ void main() {} """.formatted(version.version); safeShaderSource(handle, source); - GL20.glCompileShader(handle); + GlStateManager.glCompileShader(handle); boolean success = Compilation.compiledSuccessfully(handle); - GL20.glDeleteShader(handle); + GlStateManager.glDeleteShader(handle); return success; } @@ -222,7 +223,7 @@ private static String safeGetString(int name) { if (CAPABILITIES == null) { return "invalid"; } - String str = GL20C.glGetString(name); + String str = GlStateManager._getString(name); return str == null ? "null" : str; } } diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/gl/GlFence.java b/common/src/backend/java/dev/engine_room/flywheel/backend/gl/GlFence.java index 63da9617d..a146fc704 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/gl/GlFence.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/gl/GlFence.java @@ -1,34 +1,31 @@ package dev.engine_room.flywheel.backend.gl; -import static org.lwjgl.opengl.GL32.GL_SIGNALED; -import static org.lwjgl.opengl.GL32.GL_SYNC_GPU_COMMANDS_COMPLETE; -import static org.lwjgl.opengl.GL32.GL_SYNC_STATUS; -import static org.lwjgl.opengl.GL32.glDeleteSync; -import static org.lwjgl.opengl.GL32.glFenceSync; -import static org.lwjgl.opengl.GL32.nglGetSynciv; - +import org.lwjgl.opengl.GL32; import org.lwjgl.system.MemoryStack; import org.lwjgl.system.MemoryUtil; +import com.mojang.blaze3d.opengl.GlConst; +import com.mojang.blaze3d.opengl.GlStateManager; + public class GlFence { private final long fence; public GlFence() { - fence = glFenceSync(GL_SYNC_GPU_COMMANDS_COMPLETE, 0); + fence = GlStateManager._glFenceSync(GlConst.GL_SYNC_GPU_COMMANDS_COMPLETE, 0); } public boolean isSignaled() { int result; try (var memoryStack = MemoryStack.stackPush()) { long checkPtr = memoryStack.ncalloc(Integer.BYTES, 0, Integer.BYTES); - nglGetSynciv(fence, GL_SYNC_STATUS, 1, MemoryUtil.NULL, checkPtr); + GL32.nglGetSynciv(fence, GL32.GL_SYNC_STATUS, 1, MemoryUtil.NULL, checkPtr); result = MemoryUtil.memGetInt(checkPtr); } - return result == GL_SIGNALED; + return result == GL32.GL_SIGNALED; } public void delete() { - glDeleteSync(fence); + GlStateManager._glDeleteSync(fence); } } diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/gl/GlNumericType.java b/common/src/backend/java/dev/engine_room/flywheel/backend/gl/GlNumericType.java index 1a42b8485..917360413 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/gl/GlNumericType.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/gl/GlNumericType.java @@ -1,16 +1,16 @@ package dev.engine_room.flywheel.backend.gl; -import org.lwjgl.opengl.GL11; +import com.mojang.blaze3d.opengl.GlConst; public enum GlNumericType { - FLOAT(4, "float", GL11.GL_FLOAT), - UBYTE(1, "ubyte", GL11.GL_UNSIGNED_BYTE), - BYTE(1, "byte", GL11.GL_BYTE), - USHORT(2, "ushort", GL11.GL_UNSIGNED_SHORT), - SHORT(2, "short", GL11.GL_SHORT), - UINT(4, "uint", GL11.GL_UNSIGNED_INT), - INT(4, "int", GL11.GL_INT), - DOUBLE(8, "double", GL11.GL_DOUBLE), + FLOAT(4, "float", GlConst.GL_FLOAT), + UBYTE(1, "ubyte", GlConst.GL_UNSIGNED_BYTE), + BYTE(1, "byte", GlConst.GL_BYTE), + USHORT(2, "ushort", GlConst.GL_UNSIGNED_SHORT), + SHORT(2, "short", GlConst.GL_SHORT), + UINT(4, "uint", GlConst.GL_UNSIGNED_INT), + INT(4, "int", GlConst.GL_INT), + DOUBLE(8, "double", GlConst.GL_DOUBLE), ; public final int byteWidth; diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/gl/GlPrimitive.java b/common/src/backend/java/dev/engine_room/flywheel/backend/gl/GlPrimitive.java index 60cc5bccc..f2907bf34 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/gl/GlPrimitive.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/gl/GlPrimitive.java @@ -2,14 +2,16 @@ import org.lwjgl.opengl.GL11; +import com.mojang.blaze3d.opengl.GlConst; + public enum GlPrimitive { - POINTS(GL11.GL_POINTS), - LINES(GL11.GL_LINES), + POINTS(GlConst.GL_POINTS), + LINES(GlConst.GL_LINES), LINE_LOOP(GL11.GL_LINE_LOOP), - LINE_STRIP(GL11.GL_LINE_STRIP), - TRIANGLES(GL11.GL_TRIANGLES), - TRIANGLE_STRIP(GL11.GL_TRIANGLE_STRIP), - TRIANGLE_FAN(GL11.GL_TRIANGLE_FAN), + LINE_STRIP(GlConst.GL_LINE_STRIP), + TRIANGLES(GlConst.GL_TRIANGLES), + TRIANGLE_STRIP(GlConst.GL_TRIANGLE_STRIP), + TRIANGLE_FAN(GlConst.GL_TRIANGLE_FAN), QUADS(GL11.GL_QUADS), QUAD_STRIP(GL11.GL_QUAD_STRIP), POLYGON(GL11.GL_POLYGON), diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/gl/GlStateTracker.java b/common/src/backend/java/dev/engine_room/flywheel/backend/gl/GlStateTracker.java index f0d74e1f9..dfe5fd69b 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/gl/GlStateTracker.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/gl/GlStateTracker.java @@ -1,7 +1,6 @@ package dev.engine_room.flywheel.backend.gl; -import org.lwjgl.opengl.GL33C; - +import com.mojang.blaze3d.opengl.GlConst; import com.mojang.blaze3d.opengl.GlStateManager; import dev.engine_room.flywheel.backend.gl.buffer.GlBufferType; @@ -40,7 +39,7 @@ public static void _setProgram(int id) { } public static State getRestoreState() { - return new State(BUFFERS.clone(), vao, program, GlStateManagerAccessor.flywheel$getActiveTexture() + GL33C.GL_TEXTURE0); + return new State(BUFFERS.clone(), vao, program, GlStateManagerAccessor.flywheel$getActiveTexture() + GlConst.GL_TEXTURE0); } public static void bindVao(int vao) { diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/gl/GlTextureUnit.java b/common/src/backend/java/dev/engine_room/flywheel/backend/gl/GlTextureUnit.java index 41eb0aefa..67932362c 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/gl/GlTextureUnit.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/gl/GlTextureUnit.java @@ -1,7 +1,6 @@ package dev.engine_room.flywheel.backend.gl; -import static org.lwjgl.opengl.GL13.GL_TEXTURE0; - +import com.mojang.blaze3d.opengl.GlConst; import com.mojang.blaze3d.opengl.GlStateManager; import dev.engine_room.flywheel.backend.mixin.GlStateManagerAccessor; @@ -49,7 +48,7 @@ public enum GlTextureUnit { GlTextureUnit(int unit) { this.number = unit; - this.glEnum = GL_TEXTURE0 + unit; + this.glEnum = GlConst.GL_TEXTURE0 + unit; } public void makeActive() { @@ -61,7 +60,7 @@ public static GlTextureUnit getActive() { } public static GlTextureUnit fromGlEnum(int glEnum) { - return VALUES[glEnum - GL_TEXTURE0]; + return VALUES[glEnum - GlConst.GL_TEXTURE0]; } public static GlTextureUnit fromIndex(int index) { diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/gl/TextureBuffer.java b/common/src/backend/java/dev/engine_room/flywheel/backend/gl/TextureBuffer.java index d7bbc9cfc..b27157822 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/gl/TextureBuffer.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/gl/TextureBuffer.java @@ -2,8 +2,10 @@ import org.lwjgl.opengl.GL32; +import com.mojang.blaze3d.opengl.GlStateManager; + public class TextureBuffer extends GlObject { - public static final int MAX_TEXELS = GL32.glGetInteger(GL32.GL_MAX_TEXTURE_BUFFER_SIZE); + public static final int MAX_TEXELS = GlStateManager._getInteger(GL32.GL_MAX_TEXTURE_BUFFER_SIZE); public static final int MAX_BYTES = MAX_TEXELS * 16; // 4 channels * 4 bytes private final int format; diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/gl/array/GlVertexArray.java b/common/src/backend/java/dev/engine_room/flywheel/backend/gl/array/GlVertexArray.java index 444d7abb7..46b555b06 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/gl/array/GlVertexArray.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/gl/array/GlVertexArray.java @@ -5,11 +5,13 @@ import org.lwjgl.opengl.GL32; import org.lwjgl.opengl.GL33C; +import com.mojang.blaze3d.opengl.GlStateManager; + import dev.engine_room.flywheel.backend.gl.GlObject; import dev.engine_room.flywheel.backend.gl.GlStateTracker; public abstract class GlVertexArray extends GlObject { - protected static final int MAX_ATTRIBS = GL32.glGetInteger(GL32.GL_MAX_VERTEX_ATTRIBS); + protected static final int MAX_ATTRIBS = GlStateManager._getInteger(GL32.GL_MAX_VERTEX_ATTRIBS); protected static final int MAX_ATTRIB_BINDINGS = 16; public static GlVertexArray create() { diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/gl/array/GlVertexArrayGL3.java b/common/src/backend/java/dev/engine_room/flywheel/backend/gl/array/GlVertexArrayGL3.java index 8b5777668..87084b371 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/gl/array/GlVertexArrayGL3.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/gl/array/GlVertexArrayGL3.java @@ -5,12 +5,11 @@ import java.util.List; import org.lwjgl.opengl.ARBInstancedArrays; -import org.lwjgl.opengl.GL20C; -import org.lwjgl.opengl.GL30; -import org.lwjgl.opengl.GL32; import org.lwjgl.opengl.GL33C; import org.lwjgl.system.Checks; +import com.mojang.blaze3d.opengl.GlStateManager; + import dev.engine_room.flywheel.backend.gl.GlCompat; import dev.engine_room.flywheel.backend.gl.buffer.GlBufferType; import net.minecraft.util.Util; @@ -28,7 +27,7 @@ public abstract class GlVertexArrayGL3 extends GlVertexArray { private int boundElementBuffer = 0; public GlVertexArrayGL3() { - handle(GL30.glGenVertexArrays()); + handle(GlStateManager._glGenVertexArrays()); } @Override @@ -106,16 +105,16 @@ private void updateAttribute(int attribIndex) { } GlBufferType.ARRAY_BUFFER.bind(bindingBuffers[bindingIndex]); - GL20C.glEnableVertexAttribArray(attribIndex); + GlStateManager._enableVertexAttribArray(attribIndex); long offset = bindingOffsets[bindingIndex] + attributeOffsets[attribIndex]; int stride = bindingStrides[bindingIndex]; if (attribute instanceof VertexAttribute.Float f) { - GL32.glVertexAttribPointer(attribIndex, f.size(), f.type() + GlStateManager._vertexAttribPointer(attribIndex, f.size(), f.type() .glEnum(), f.normalized(), stride, offset); } else if (attribute instanceof VertexAttribute.Int vi) { - GL32.glVertexAttribIPointer(attribIndex, vi.size(), vi.type() + GlStateManager._vertexAttribIPointer(attribIndex, vi.size(), vi.type() .glEnum(), stride, offset); } diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/gl/array/GlVertexArraySeparateAttributes.java b/common/src/backend/java/dev/engine_room/flywheel/backend/gl/array/GlVertexArraySeparateAttributes.java index 9b6cf27ac..86e4e7553 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/gl/array/GlVertexArraySeparateAttributes.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/gl/array/GlVertexArraySeparateAttributes.java @@ -7,6 +7,8 @@ import org.lwjgl.opengl.GL43C; import org.lwjgl.system.Checks; +import com.mojang.blaze3d.opengl.GlStateManager; + import dev.engine_room.flywheel.backend.gl.GlCompat; import dev.engine_room.flywheel.backend.gl.GlStateTracker; import dev.engine_room.flywheel.backend.gl.buffer.GlBufferType; @@ -25,7 +27,7 @@ public class GlVertexArraySeparateAttributes extends GlVertexArray { private int elementBufferBinding = 0; public GlVertexArraySeparateAttributes() { - handle(GL43C.glGenVertexArrays()); + handle(GlStateManager._glGenVertexArrays()); } @Override @@ -55,7 +57,7 @@ public void bindAttributes(final int bindingIndex, final int startAttribIndex, L for (var attribute : vertexAttributes) { if (!attributeEnabled.get(attribIndex)) { - GL43C.glEnableVertexAttribArray(attribIndex); + GlStateManager._enableVertexAttribArray(attribIndex); attributeEnabled.set(attribIndex); } diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/gl/buffer/Buffer.java b/common/src/backend/java/dev/engine_room/flywheel/backend/gl/buffer/Buffer.java index 2e73a8fe6..43a0057e7 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/gl/buffer/Buffer.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/gl/buffer/Buffer.java @@ -4,6 +4,8 @@ import org.lwjgl.opengl.GL45C; import org.lwjgl.system.Checks; +import com.mojang.blaze3d.opengl.GlStateManager; + import dev.engine_room.flywheel.backend.gl.GlCompat; public interface Buffer { @@ -47,7 +49,7 @@ private static boolean dsaMethodsAvailable() { class Core implements Buffer { @Override public int create() { - return GL15.glGenBuffers(); + return GlStateManager._glGenBuffers(); } @Override diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/gl/buffer/GlBufferType.java b/common/src/backend/java/dev/engine_room/flywheel/backend/gl/buffer/GlBufferType.java index 933976157..d249abbc3 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/gl/buffer/GlBufferType.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/gl/buffer/GlBufferType.java @@ -8,18 +8,20 @@ import org.lwjgl.opengl.GL42; import org.lwjgl.opengl.GL43; +import com.mojang.blaze3d.opengl.GlConst; + import dev.engine_room.flywheel.backend.gl.GlStateTracker; public enum GlBufferType { - ARRAY_BUFFER(GL15C.GL_ARRAY_BUFFER, GL15C.GL_ARRAY_BUFFER_BINDING), - ELEMENT_ARRAY_BUFFER(GL15C.GL_ELEMENT_ARRAY_BUFFER, GL15C.GL_ELEMENT_ARRAY_BUFFER_BINDING), - PIXEL_PACK_BUFFER(GL21.GL_PIXEL_PACK_BUFFER, GL21.GL_PIXEL_PACK_BUFFER_BINDING), - PIXEL_UNPACK_BUFFER(GL21.GL_PIXEL_UNPACK_BUFFER, GL21.GL_PIXEL_UNPACK_BUFFER_BINDING), + ARRAY_BUFFER(GlConst.GL_ARRAY_BUFFER, GL15C.GL_ARRAY_BUFFER_BINDING), + ELEMENT_ARRAY_BUFFER(GlConst.GL_ELEMENT_ARRAY_BUFFER, GL15C.GL_ELEMENT_ARRAY_BUFFER_BINDING), + PIXEL_PACK_BUFFER(GlConst.GL_PIXEL_PACK_BUFFER, GL21.GL_PIXEL_PACK_BUFFER_BINDING), + PIXEL_UNPACK_BUFFER(GlConst.GL_PIXEL_UNPACK_BUFFER, GL21.GL_PIXEL_UNPACK_BUFFER_BINDING), TRANSFORM_FEEDBACK_BUFFER(GL30.GL_TRANSFORM_FEEDBACK_BUFFER, GL30.GL_TRANSFORM_FEEDBACK_BUFFER_BINDING), - UNIFORM_BUFFER(GL31.GL_UNIFORM_BUFFER, GL31.GL_UNIFORM_BUFFER_BINDING), + UNIFORM_BUFFER(GlConst.GL_UNIFORM_BUFFER, GL31.GL_UNIFORM_BUFFER_BINDING), TEXTURE_BUFFER(GL31.GL_TEXTURE_BUFFER, GL31.GL_TEXTURE_BUFFER), - COPY_READ_BUFFER(GL31.GL_COPY_READ_BUFFER, GL31.GL_COPY_READ_BUFFER), - COPY_WRITE_BUFFER(GL31.GL_COPY_WRITE_BUFFER, GL31.GL_COPY_WRITE_BUFFER), + COPY_READ_BUFFER(GlConst.GL_COPY_READ_BUFFER, GL31.GL_COPY_READ_BUFFER), + COPY_WRITE_BUFFER(GlConst.GL_COPY_WRITE_BUFFER, GL31.GL_COPY_WRITE_BUFFER), DRAW_INDIRECT_BUFFER(GL40.GL_DRAW_INDIRECT_BUFFER, GL40.GL_DRAW_INDIRECT_BUFFER_BINDING), ATOMIC_COUNTER_BUFFER(GL42.GL_ATOMIC_COUNTER_BUFFER, GL42.GL_ATOMIC_COUNTER_BUFFER_BINDING), DISPATCH_INDIRECT_BUFFER(GL43.GL_DISPATCH_INDIRECT_BUFFER, GL43.GL_DISPATCH_INDIRECT_BUFFER_BINDING), @@ -36,15 +38,15 @@ public enum GlBufferType { public static GlBufferType fromTarget(int pTarget) { return switch (pTarget) { - case GL15C.GL_ARRAY_BUFFER -> ARRAY_BUFFER; - case GL15C.GL_ELEMENT_ARRAY_BUFFER -> ELEMENT_ARRAY_BUFFER; - case GL21.GL_PIXEL_PACK_BUFFER -> PIXEL_PACK_BUFFER; - case GL21.GL_PIXEL_UNPACK_BUFFER -> PIXEL_UNPACK_BUFFER; + case GlConst.GL_ARRAY_BUFFER -> ARRAY_BUFFER; + case GlConst.GL_ELEMENT_ARRAY_BUFFER -> ELEMENT_ARRAY_BUFFER; + case GlConst.GL_PIXEL_PACK_BUFFER -> PIXEL_PACK_BUFFER; + case GlConst.GL_PIXEL_UNPACK_BUFFER -> PIXEL_UNPACK_BUFFER; case GL30.GL_TRANSFORM_FEEDBACK_BUFFER -> TRANSFORM_FEEDBACK_BUFFER; - case GL31.GL_UNIFORM_BUFFER -> UNIFORM_BUFFER; + case GlConst.GL_UNIFORM_BUFFER -> UNIFORM_BUFFER; case GL31.GL_TEXTURE_BUFFER -> TEXTURE_BUFFER; - case GL31.GL_COPY_READ_BUFFER -> COPY_READ_BUFFER; - case GL31.GL_COPY_WRITE_BUFFER -> COPY_WRITE_BUFFER; + case GlConst.GL_COPY_READ_BUFFER -> COPY_READ_BUFFER; + case GlConst.GL_COPY_WRITE_BUFFER -> COPY_WRITE_BUFFER; case GL40.GL_DRAW_INDIRECT_BUFFER -> DRAW_INDIRECT_BUFFER; case GL42.GL_ATOMIC_COUNTER_BUFFER -> ATOMIC_COUNTER_BUFFER; case GL43.GL_DISPATCH_INDIRECT_BUFFER -> DISPATCH_INDIRECT_BUFFER; diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/gl/buffer/GlBufferUsage.java b/common/src/backend/java/dev/engine_room/flywheel/backend/gl/buffer/GlBufferUsage.java index 905a979e1..ee9e8946f 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/gl/buffer/GlBufferUsage.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/gl/buffer/GlBufferUsage.java @@ -1,21 +1,21 @@ package dev.engine_room.flywheel.backend.gl.buffer; -import org.lwjgl.opengl.GL15; +import com.mojang.blaze3d.opengl.GlConst; /** * Gives a hint to the driver about how you intend to use a buffer. For a detailed explanation, see * this article. */ public enum GlBufferUsage { - STREAM_DRAW(GL15.GL_STREAM_DRAW), - STREAM_READ(GL15.GL_STREAM_READ), - STREAM_COPY(GL15.GL_STREAM_COPY), - STATIC_DRAW(GL15.GL_STATIC_DRAW), - STATIC_READ(GL15.GL_STATIC_READ), - STATIC_COPY(GL15.GL_STATIC_COPY), - DYNAMIC_DRAW(GL15.GL_DYNAMIC_DRAW), - DYNAMIC_READ(GL15.GL_DYNAMIC_READ), - DYNAMIC_COPY(GL15.GL_DYNAMIC_COPY), + STREAM_DRAW(GlConst.GL_STREAM_DRAW), + STREAM_READ(GlConst.GL_STREAM_READ), + STREAM_COPY(GlConst.GL_STREAM_COPY), + STATIC_DRAW(GlConst.GL_STATIC_DRAW), + STATIC_READ(GlConst.GL_STATIC_READ), + STATIC_COPY(GlConst.GL_STATIC_COPY), + DYNAMIC_DRAW(GlConst.GL_DYNAMIC_DRAW), + DYNAMIC_READ(GlConst.GL_DYNAMIC_READ), + DYNAMIC_COPY(GlConst.GL_DYNAMIC_COPY), ; public final int glEnum; diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/gl/error/GlError.java b/common/src/backend/java/dev/engine_room/flywheel/backend/gl/error/GlError.java index 4780a0922..49eb10313 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/gl/error/GlError.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/gl/error/GlError.java @@ -5,6 +5,8 @@ import org.lwjgl.opengl.GL20; import org.lwjgl.opengl.GL30; +import com.mojang.blaze3d.opengl.GlConst; + import it.unimi.dsi.fastutil.ints.Int2ObjectArrayMap; import it.unimi.dsi.fastutil.ints.Int2ObjectMap; @@ -13,7 +15,7 @@ public enum GlError { INVALID_VALUE(GL20.GL_INVALID_VALUE), INVALID_OPERATION(GL20.GL_INVALID_OPERATION), INVALID_FRAMEBUFFER_OPERATION(GL30.GL_INVALID_FRAMEBUFFER_OPERATION), - OUT_OF_MEMORY(GL20.GL_OUT_OF_MEMORY), + OUT_OF_MEMORY(GlConst.GL_OUT_OF_MEMORY), STACK_UNDERFLOW(GL20.GL_STACK_UNDERFLOW), STACK_OVERFLOW(GL20.GL_STACK_OVERFLOW), ; diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/gl/shader/GlProgram.java b/common/src/backend/java/dev/engine_room/flywheel/backend/gl/shader/GlProgram.java index d45e0bf2c..ba2dd4903 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/gl/shader/GlProgram.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/gl/shader/GlProgram.java @@ -1,23 +1,10 @@ package dev.engine_room.flywheel.backend.gl.shader; -import static org.lwjgl.opengl.GL20.glBindAttribLocation; -import static org.lwjgl.opengl.GL20.glDeleteProgram; -import static org.lwjgl.opengl.GL20.glGetUniformLocation; -import static org.lwjgl.opengl.GL20.glUniform1f; -import static org.lwjgl.opengl.GL20.glUniform1i; -import static org.lwjgl.opengl.GL20.glUniform2f; -import static org.lwjgl.opengl.GL20.glUniform3f; -import static org.lwjgl.opengl.GL20.glUniform4f; -import static org.lwjgl.opengl.GL20.glUniformMatrix3fv; -import static org.lwjgl.opengl.GL20.glUniformMatrix4fv; -import static org.lwjgl.opengl.GL30.glUniform1ui; -import static org.lwjgl.opengl.GL30.glUniform2ui; -import static org.lwjgl.opengl.GL31.GL_INVALID_INDEX; -import static org.lwjgl.opengl.GL31.glGetUniformBlockIndex; -import static org.lwjgl.opengl.GL31.glUniformBlockBinding; - import org.joml.Matrix3fc; import org.joml.Matrix4fc; +import org.lwjgl.opengl.GL20; +import org.lwjgl.opengl.GL30; +import org.lwjgl.opengl.GL31; import org.slf4j.Logger; import com.mojang.blaze3d.opengl.GlStateManager; @@ -52,7 +39,7 @@ public void setFloat(String glslName, float value) { return; } - glUniform1f(uniform, value); + GL20.glUniform1f(uniform, value); } public void setVec2(String glslName, float x, float y) { @@ -62,7 +49,7 @@ public void setVec2(String glslName, float x, float y) { return; } - glUniform2f(uniform, x, y); + GL20.glUniform2f(uniform, x, y); } public void setVec3(String glslName, float x, float y, float z) { @@ -72,7 +59,7 @@ public void setVec3(String glslName, float x, float y, float z) { return; } - glUniform3f(uniform, x, y, z); + GL20.glUniform3f(uniform, x, y, z); } public void setVec4(String glslName, float x, float y, float z, float w) { @@ -82,7 +69,7 @@ public void setVec4(String glslName, float x, float y, float z, float w) { return; } - glUniform4f(uniform, x, y, z, w); + GL20.glUniform4f(uniform, x, y, z, w); } public void setMat4(String glslName, Matrix4fc matrix) { @@ -92,7 +79,7 @@ public void setMat4(String glslName, Matrix4fc matrix) { return; } - glUniformMatrix4fv(uniform, false, matrix.get(new float[16])); + GL20.glUniformMatrix4fv(uniform, false, matrix.get(new float[16])); } public void setMat3(String glslName, Matrix3fc matrix) { @@ -102,7 +89,7 @@ public void setMat3(String glslName, Matrix3fc matrix) { return; } - glUniformMatrix3fv(uniform, false, matrix.get(new float[9])); + GL20.glUniformMatrix3fv(uniform, false, matrix.get(new float[9])); } public void setBool(String glslName, boolean bool) { @@ -116,7 +103,7 @@ public void setUInt(String glslName, int value) { return; } - glUniform1ui(uniform, value); + GL30.glUniform1ui(uniform, value); } public void setUVec2(String name, int x, int y) { @@ -126,7 +113,7 @@ public void setUVec2(String name, int x, int y) { return; } - glUniform2ui(uniform, x, y); + GL30.glUniform2ui(uniform, x, y); } public void setInt(String glslName, int value) { @@ -136,7 +123,7 @@ public void setInt(String glslName, int value) { return; } - glUniform1i(uniform, value); + GL20.glUniform1i(uniform, value); } /** @@ -147,7 +134,7 @@ public void setInt(String glslName, int value) { */ public int getUniformLocation(String uniform) { return uniformLocationCache.computeIfAbsent(uniform, s -> { - int index = glGetUniformLocation(this.handle(), uniform); + int index = GL20.glGetUniformLocation(this.handle(), uniform); if (index < 0) { LOGGER.debug("No active uniform '{}' exists. Could be unused.", uniform); @@ -170,27 +157,27 @@ public void setSamplerBinding(String name, int binding) { int samplerUniform = getUniformLocation(name); if (samplerUniform >= 0) { - glUniform1i(samplerUniform, binding); + GL20.glUniform1i(samplerUniform, binding); } } public void setUniformBlockBinding(String name, int binding) { - int index = glGetUniformBlockIndex(handle(), name); + int index = GL31.glGetUniformBlockIndex(handle(), name); - if (index == GL_INVALID_INDEX) { + if (index == GL31.GL_INVALID_INDEX) { LOGGER.debug("No active uniform block '{}' exists. Could be unused.", name); return; } - glUniformBlockBinding(handle(), index, binding); + GL31.glUniformBlockBinding(handle(), index, binding); } public void bindAttribLocation(String attribute, int binding) { - glBindAttribLocation(handle(), binding, attribute); + GlStateManager._glBindAttribLocation(handle(), binding, attribute); } @Override protected void deleteInternal(int handle) { - glDeleteProgram(handle); + GlStateManager.glDeleteProgram(handle); } } diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/gl/shader/GlShader.java b/common/src/backend/java/dev/engine_room/flywheel/backend/gl/shader/GlShader.java index 3481b33a3..cad265422 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/gl/shader/GlShader.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/gl/shader/GlShader.java @@ -1,6 +1,6 @@ package dev.engine_room.flywheel.backend.gl.shader; -import org.lwjgl.opengl.GL20; +import com.mojang.blaze3d.opengl.GlStateManager; import dev.engine_room.flywheel.backend.gl.GlObject; @@ -18,7 +18,7 @@ public GlShader(int handle, ShaderType type, String name) { @Override protected void deleteInternal(int handle) { - GL20.glDeleteShader(handle); + GlStateManager.glDeleteShader(handle); } @Override diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/gl/shader/ShaderType.java b/common/src/backend/java/dev/engine_room/flywheel/backend/gl/shader/ShaderType.java index da323ff10..92fd2e043 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/gl/shader/ShaderType.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/gl/shader/ShaderType.java @@ -1,11 +1,12 @@ package dev.engine_room.flywheel.backend.gl.shader; -import org.lwjgl.opengl.GL20; import org.lwjgl.opengl.GL43; +import com.mojang.blaze3d.opengl.GlConst; + public enum ShaderType { - VERTEX("vertex", "VERTEX_SHADER", "vert", GL20.GL_VERTEX_SHADER), - FRAGMENT("fragment", "FRAGMENT_SHADER", "frag", GL20.GL_FRAGMENT_SHADER), + VERTEX("vertex", "VERTEX_SHADER", "vert", GlConst.GL_VERTEX_SHADER), + FRAGMENT("fragment", "FRAGMENT_SHADER", "frag", GlConst.GL_FRAGMENT_SHADER), COMPUTE("compute", "COMPUTE_SHADER", "glsl", GL43.GL_COMPUTE_SHADER), ; From c22c25cb05525dceab3e75995ab5bf0bd4be3dfa Mon Sep 17 00:00:00 2001 From: IThundxr Date: Wed, 18 Feb 2026 14:54:16 -0500 Subject: [PATCH 27/59] GLium II --- .../flywheel/backend/LayoutAttributes.java | 38 +++++++++-------- .../flywheel/backend/engine/MeshPool.java | 7 ++-- .../flywheel/backend/gl/GlNumericType.java | 42 ------------------- .../flywheel/backend/gl/GlPrimitive.java | 25 ----------- .../flywheel/backend/gl/GlTexture.java | 26 ------------ .../backend/gl/array/GlVertexArrayDSA.java | 6 ++- .../backend/gl/array/VertexAttribute.java | 10 ++--- .../backend/gl/buffer/GlBufferType.java | 4 +- .../flywheel/backend/gl/error/GlError.java | 3 +- .../flywheel/backend/gl/shader/GlProgram.java | 2 +- 10 files changed, 39 insertions(+), 124 deletions(-) delete mode 100644 common/src/backend/java/dev/engine_room/flywheel/backend/gl/GlNumericType.java delete mode 100644 common/src/backend/java/dev/engine_room/flywheel/backend/gl/GlPrimitive.java delete mode 100644 common/src/backend/java/dev/engine_room/flywheel/backend/gl/GlTexture.java diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/LayoutAttributes.java b/common/src/backend/java/dev/engine_room/flywheel/backend/LayoutAttributes.java index 350d1acc6..8ff1eea66 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/LayoutAttributes.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/LayoutAttributes.java @@ -3,6 +3,8 @@ import java.util.ArrayList; import java.util.List; +import com.mojang.blaze3d.vertex.VertexFormatElement; + import dev.engine_room.flywheel.api.layout.ArrayElementType; import dev.engine_room.flywheel.api.layout.ElementType; import dev.engine_room.flywheel.api.layout.FloatRepr; @@ -13,7 +15,6 @@ import dev.engine_room.flywheel.api.layout.UnsignedIntegerRepr; import dev.engine_room.flywheel.api.layout.ValueRepr; import dev.engine_room.flywheel.api.layout.VectorElementType; -import dev.engine_room.flywheel.backend.gl.GlNumericType; import dev.engine_room.flywheel.backend.gl.array.VertexAttribute; public class LayoutAttributes { @@ -79,31 +80,34 @@ private static void array(List out, ArrayElementType array) { } } - private static GlNumericType toGlType(IntegerRepr repr) { + // TODO 1.21.11: Is there a better way to do this perhaps? + private static VertexFormatElement.Type toGlType(IntegerRepr repr) { return switch (repr) { - case BYTE -> GlNumericType.BYTE; - case SHORT -> GlNumericType.SHORT; - case INT -> GlNumericType.INT; + case BYTE -> VertexFormatElement.Type.BYTE; + case SHORT -> VertexFormatElement.Type.SHORT; + case INT -> VertexFormatElement.Type.INT; }; } - private static GlNumericType toGlType(UnsignedIntegerRepr repr) { + // TODO 1.21.11: Is there a better way to do this perhaps? + private static VertexFormatElement.Type toGlType(UnsignedIntegerRepr repr) { return switch (repr) { - case UNSIGNED_BYTE -> GlNumericType.UBYTE; - case UNSIGNED_SHORT -> GlNumericType.USHORT; - case UNSIGNED_INT -> GlNumericType.UINT; + case UNSIGNED_BYTE -> VertexFormatElement.Type.UBYTE; + case UNSIGNED_SHORT -> VertexFormatElement.Type.USHORT; + case UNSIGNED_INT -> VertexFormatElement.Type.UINT; }; } - private static GlNumericType toGlType(FloatRepr repr) { + // TODO 1.21.11: Is there a better way to do this perhaps? + private static VertexFormatElement.Type toGlType(FloatRepr repr) { return switch (repr) { - case BYTE, NORMALIZED_BYTE -> GlNumericType.BYTE; - case UNSIGNED_BYTE, NORMALIZED_UNSIGNED_BYTE -> GlNumericType.UBYTE; - case SHORT, NORMALIZED_SHORT -> GlNumericType.SHORT; - case UNSIGNED_SHORT, NORMALIZED_UNSIGNED_SHORT -> GlNumericType.USHORT; - case INT, NORMALIZED_INT -> GlNumericType.INT; - case UNSIGNED_INT, NORMALIZED_UNSIGNED_INT -> GlNumericType.UINT; - case FLOAT -> GlNumericType.FLOAT; + case BYTE, NORMALIZED_BYTE -> VertexFormatElement.Type.BYTE; + case UNSIGNED_BYTE, NORMALIZED_UNSIGNED_BYTE -> VertexFormatElement.Type.UBYTE; + case SHORT, NORMALIZED_SHORT -> VertexFormatElement.Type.SHORT; + case UNSIGNED_SHORT, NORMALIZED_UNSIGNED_SHORT -> VertexFormatElement.Type.USHORT; + case INT, NORMALIZED_INT -> VertexFormatElement.Type.INT; + case UNSIGNED_INT, NORMALIZED_UNSIGNED_INT -> VertexFormatElement.Type.UINT; + case FLOAT -> VertexFormatElement.Type.FLOAT; }; } diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/engine/MeshPool.java b/common/src/backend/java/dev/engine_room/flywheel/backend/engine/MeshPool.java index bad435779..15a9bb7c7 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/engine/MeshPool.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/engine/MeshPool.java @@ -9,10 +9,10 @@ import org.lwjgl.opengl.GL32; import com.mojang.blaze3d.opengl.GlConst; +import com.mojang.blaze3d.vertex.VertexFormat; import dev.engine_room.flywheel.api.model.Mesh; import dev.engine_room.flywheel.backend.InternalVertex; -import dev.engine_room.flywheel.backend.gl.GlPrimitive; import dev.engine_room.flywheel.backend.gl.array.GlVertexArray; import dev.engine_room.flywheel.backend.gl.buffer.GlBuffer; import dev.engine_room.flywheel.backend.gl.buffer.GlBufferUsage; @@ -183,9 +183,10 @@ public boolean isInvalid() { public void draw(int instanceCount) { if (instanceCount > 1) { - GL32.glDrawElementsInstancedBaseVertex(GlPrimitive.TRIANGLES.glEnum, mesh.indexCount(), GlConst.GL_UNSIGNED_INT, firstIndexByteOffset(), instanceCount, baseVertex); + + GL32.glDrawElementsInstancedBaseVertex(GlConst.toGl(VertexFormat.Mode.TRIANGLES), mesh.indexCount(), GlConst.GL_UNSIGNED_INT, firstIndexByteOffset(), instanceCount, baseVertex); } else { - GL32.glDrawElementsBaseVertex(GlPrimitive.TRIANGLES.glEnum, mesh.indexCount(), GlConst.GL_UNSIGNED_INT, firstIndexByteOffset(), baseVertex); + GL32.glDrawElementsBaseVertex(GlConst.toGl(VertexFormat.Mode.TRIANGLES), mesh.indexCount(), GlConst.GL_UNSIGNED_INT, firstIndexByteOffset(), baseVertex); } } diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/gl/GlNumericType.java b/common/src/backend/java/dev/engine_room/flywheel/backend/gl/GlNumericType.java deleted file mode 100644 index 917360413..000000000 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/gl/GlNumericType.java +++ /dev/null @@ -1,42 +0,0 @@ -package dev.engine_room.flywheel.backend.gl; - -import com.mojang.blaze3d.opengl.GlConst; - -public enum GlNumericType { - FLOAT(4, "float", GlConst.GL_FLOAT), - UBYTE(1, "ubyte", GlConst.GL_UNSIGNED_BYTE), - BYTE(1, "byte", GlConst.GL_BYTE), - USHORT(2, "ushort", GlConst.GL_UNSIGNED_SHORT), - SHORT(2, "short", GlConst.GL_SHORT), - UINT(4, "uint", GlConst.GL_UNSIGNED_INT), - INT(4, "int", GlConst.GL_INT), - DOUBLE(8, "double", GlConst.GL_DOUBLE), - ; - - public final int byteWidth; - public final String typeName; - public final int glEnum; - - GlNumericType(int bytes, String name, int glEnum) { - this.byteWidth = bytes; - this.typeName = name; - this.glEnum = glEnum; - } - - public int byteWidth() { - return byteWidth; - } - - public String typeName() { - return typeName; - } - - public int glEnum() { - return glEnum; - } - - @Override - public String toString() { - return typeName; - } -} diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/gl/GlPrimitive.java b/common/src/backend/java/dev/engine_room/flywheel/backend/gl/GlPrimitive.java deleted file mode 100644 index f2907bf34..000000000 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/gl/GlPrimitive.java +++ /dev/null @@ -1,25 +0,0 @@ -package dev.engine_room.flywheel.backend.gl; - -import org.lwjgl.opengl.GL11; - -import com.mojang.blaze3d.opengl.GlConst; - -public enum GlPrimitive { - POINTS(GlConst.GL_POINTS), - LINES(GlConst.GL_LINES), - LINE_LOOP(GL11.GL_LINE_LOOP), - LINE_STRIP(GlConst.GL_LINE_STRIP), - TRIANGLES(GlConst.GL_TRIANGLES), - TRIANGLE_STRIP(GlConst.GL_TRIANGLE_STRIP), - TRIANGLE_FAN(GlConst.GL_TRIANGLE_FAN), - QUADS(GL11.GL_QUADS), - QUAD_STRIP(GL11.GL_QUAD_STRIP), - POLYGON(GL11.GL_POLYGON), - ; - - public final int glEnum; - - GlPrimitive(int glEnum) { - this.glEnum = glEnum; - } -} diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/gl/GlTexture.java b/common/src/backend/java/dev/engine_room/flywheel/backend/gl/GlTexture.java deleted file mode 100644 index 958763d53..000000000 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/gl/GlTexture.java +++ /dev/null @@ -1,26 +0,0 @@ -package dev.engine_room.flywheel.backend.gl; - -import org.lwjgl.opengl.GL20; - -public class GlTexture extends GlObject { - private final int textureType; - - public GlTexture(int textureType) { - this.textureType = textureType; - handle(GL20.glGenTextures()); - } - - @Override - protected void deleteInternal(int handle) { - GL20.glDeleteTextures(handle); - } - - public void bind() { - GL20.glBindTexture(textureType, handle()); - } - - public void unbind() { - GL20.glBindTexture(textureType, 0); - } - -} diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/gl/array/GlVertexArrayDSA.java b/common/src/backend/java/dev/engine_room/flywheel/backend/gl/array/GlVertexArrayDSA.java index a815bd9be..196ecdb1d 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/gl/array/GlVertexArrayDSA.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/gl/array/GlVertexArrayDSA.java @@ -7,6 +7,8 @@ import org.lwjgl.opengl.GL45C; import org.lwjgl.system.Checks; +import com.mojang.blaze3d.opengl.GlConst; + import dev.engine_room.flywheel.backend.gl.GlCompat; import net.minecraft.util.Util; @@ -58,9 +60,9 @@ public void bindAttributes(final int bindingIndex, final int startAttribIndex, L if (!attribute.equals(attributes[attribIndex])) { if (attribute instanceof VertexAttribute.Float f) { - GL45C.glVertexArrayAttribFormat(handle, attribIndex, f.size(), f.type().glEnum, f.normalized(), offset); + GL45C.glVertexArrayAttribFormat(handle, attribIndex, f.size(), GlConst.toGl(f.type()), f.normalized(), offset); } else if (attribute instanceof VertexAttribute.Int vi) { - GL45C.glVertexArrayAttribIFormat(handle, attribIndex, vi.size(), vi.type().glEnum, offset); + GL45C.glVertexArrayAttribIFormat(handle, attribIndex, vi.size(), GlConst.toGl(vi.type()), offset); } attributes[attribIndex] = attribute; } diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/gl/array/VertexAttribute.java b/common/src/backend/java/dev/engine_room/flywheel/backend/gl/array/VertexAttribute.java index c01911dea..abb4b3172 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/gl/array/VertexAttribute.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/gl/array/VertexAttribute.java @@ -1,6 +1,6 @@ package dev.engine_room.flywheel.backend.gl.array; -import dev.engine_room.flywheel.backend.gl.GlNumericType; +import com.mojang.blaze3d.vertex.VertexFormatElement; public sealed interface VertexAttribute { int byteWidth(); @@ -12,10 +12,10 @@ public sealed interface VertexAttribute { * @param size The number of components in the attribute, e.g. 3 for a vec3. * @param normalized Whether the data is normalized. */ - record Float(GlNumericType type, int size, boolean normalized) implements VertexAttribute { + record Float(VertexFormatElement.Type type, int size, boolean normalized) implements VertexAttribute { @Override public int byteWidth() { - return size * type.byteWidth(); + return size * type.size(); } } @@ -25,10 +25,10 @@ public int byteWidth() { * @param type The type of the attribute, e.g. GL_INT. * @param size The number of components in the attribute, e.g. 3 for a vec3. */ - record Int(GlNumericType type, int size) implements VertexAttribute { + record Int(VertexFormatElement.Type type, int size) implements VertexAttribute { @Override public int byteWidth() { - return size * type.byteWidth(); + return size * type.size(); } } } diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/gl/buffer/GlBufferType.java b/common/src/backend/java/dev/engine_room/flywheel/backend/gl/buffer/GlBufferType.java index d249abbc3..56d02ce32 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/gl/buffer/GlBufferType.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/gl/buffer/GlBufferType.java @@ -20,8 +20,8 @@ public enum GlBufferType { TRANSFORM_FEEDBACK_BUFFER(GL30.GL_TRANSFORM_FEEDBACK_BUFFER, GL30.GL_TRANSFORM_FEEDBACK_BUFFER_BINDING), UNIFORM_BUFFER(GlConst.GL_UNIFORM_BUFFER, GL31.GL_UNIFORM_BUFFER_BINDING), TEXTURE_BUFFER(GL31.GL_TEXTURE_BUFFER, GL31.GL_TEXTURE_BUFFER), - COPY_READ_BUFFER(GlConst.GL_COPY_READ_BUFFER, GL31.GL_COPY_READ_BUFFER), - COPY_WRITE_BUFFER(GlConst.GL_COPY_WRITE_BUFFER, GL31.GL_COPY_WRITE_BUFFER), + COPY_READ_BUFFER(GlConst.GL_COPY_READ_BUFFER, GlConst.GL_COPY_READ_BUFFER), + COPY_WRITE_BUFFER(GlConst.GL_COPY_WRITE_BUFFER, GlConst.GL_COPY_WRITE_BUFFER), DRAW_INDIRECT_BUFFER(GL40.GL_DRAW_INDIRECT_BUFFER, GL40.GL_DRAW_INDIRECT_BUFFER_BINDING), ATOMIC_COUNTER_BUFFER(GL42.GL_ATOMIC_COUNTER_BUFFER, GL42.GL_ATOMIC_COUNTER_BUFFER_BINDING), DISPATCH_INDIRECT_BUFFER(GL43.GL_DISPATCH_INDIRECT_BUFFER, GL43.GL_DISPATCH_INDIRECT_BUFFER_BINDING), diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/gl/error/GlError.java b/common/src/backend/java/dev/engine_room/flywheel/backend/gl/error/GlError.java index 49eb10313..a7cce0249 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/gl/error/GlError.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/gl/error/GlError.java @@ -6,6 +6,7 @@ import org.lwjgl.opengl.GL30; import com.mojang.blaze3d.opengl.GlConst; +import com.mojang.blaze3d.opengl.GlStateManager; import it.unimi.dsi.fastutil.ints.Int2ObjectArrayMap; import it.unimi.dsi.fastutil.ints.Int2ObjectMap; @@ -37,7 +38,7 @@ public enum GlError { // Great for use in your debugger's expression evaluator public static GlError poll() { - return errorLookup.get(GL20.glGetError()); + return errorLookup.get(GlStateManager._getError()); } public static void pollAndThrow(Supplier context) { diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/gl/shader/GlProgram.java b/common/src/backend/java/dev/engine_room/flywheel/backend/gl/shader/GlProgram.java index ba2dd4903..4b78983fe 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/gl/shader/GlProgram.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/gl/shader/GlProgram.java @@ -134,7 +134,7 @@ public void setInt(String glslName, int value) { */ public int getUniformLocation(String uniform) { return uniformLocationCache.computeIfAbsent(uniform, s -> { - int index = GL20.glGetUniformLocation(this.handle(), uniform); + int index = GlStateManager._glGetUniformLocation(this.handle(), uniform); if (index < 0) { LOGGER.debug("No active uniform '{}' exists. Could be unused.", uniform); From 1d781da82bd5070430b2d0b09f1cb4e687ed4e72 Mon Sep 17 00:00:00 2001 From: IThundxr Date: Wed, 18 Feb 2026 15:01:28 -0500 Subject: [PATCH 28/59] Deprecate GlShader and ShaderType, awaiting replacement with B3D versions --- .../dev/engine_room/flywheel/backend/gl/shader/GlShader.java | 2 ++ .../dev/engine_room/flywheel/backend/gl/shader/ShaderType.java | 2 ++ 2 files changed, 4 insertions(+) diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/gl/shader/GlShader.java b/common/src/backend/java/dev/engine_room/flywheel/backend/gl/shader/GlShader.java index cad265422..ff85c8ca2 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/gl/shader/GlShader.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/gl/shader/GlShader.java @@ -4,6 +4,8 @@ import dev.engine_room.flywheel.backend.gl.GlObject; +// TODO: Waiting for mojang to impl compute shaders, once that is done this can be replaced with GlShaderModule +@Deprecated(forRemoval = true) public class GlShader extends GlObject { public final ShaderType type; diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/gl/shader/ShaderType.java b/common/src/backend/java/dev/engine_room/flywheel/backend/gl/shader/ShaderType.java index 92fd2e043..957752568 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/gl/shader/ShaderType.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/gl/shader/ShaderType.java @@ -4,6 +4,8 @@ import com.mojang.blaze3d.opengl.GlConst; +// TODO: Waiting for mojang to impl compute shaders +@Deprecated(forRemoval = true) public enum ShaderType { VERTEX("vertex", "VERTEX_SHADER", "vert", GlConst.GL_VERTEX_SHADER), FRAGMENT("fragment", "FRAGMENT_SHADER", "frag", GlConst.GL_FRAGMENT_SHADER), From 1ad376ab4be64cdca80c426141cd8c4c23603225 Mon Sep 17 00:00:00 2001 From: IThundxr Date: Wed, 18 Feb 2026 15:01:56 -0500 Subject: [PATCH 29/59] Remove GlError and GlException --- .../flywheel/backend/gl/error/GlError.java | 51 ------------------- .../backend/gl/error/GlException.java | 15 ------ 2 files changed, 66 deletions(-) delete mode 100644 common/src/backend/java/dev/engine_room/flywheel/backend/gl/error/GlError.java delete mode 100644 common/src/backend/java/dev/engine_room/flywheel/backend/gl/error/GlException.java diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/gl/error/GlError.java b/common/src/backend/java/dev/engine_room/flywheel/backend/gl/error/GlError.java deleted file mode 100644 index a7cce0249..000000000 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/gl/error/GlError.java +++ /dev/null @@ -1,51 +0,0 @@ -package dev.engine_room.flywheel.backend.gl.error; - -import java.util.function.Supplier; - -import org.lwjgl.opengl.GL20; -import org.lwjgl.opengl.GL30; - -import com.mojang.blaze3d.opengl.GlConst; -import com.mojang.blaze3d.opengl.GlStateManager; - -import it.unimi.dsi.fastutil.ints.Int2ObjectArrayMap; -import it.unimi.dsi.fastutil.ints.Int2ObjectMap; - -public enum GlError { - INVALID_ENUM(GL20.GL_INVALID_ENUM), - INVALID_VALUE(GL20.GL_INVALID_VALUE), - INVALID_OPERATION(GL20.GL_INVALID_OPERATION), - INVALID_FRAMEBUFFER_OPERATION(GL30.GL_INVALID_FRAMEBUFFER_OPERATION), - OUT_OF_MEMORY(GlConst.GL_OUT_OF_MEMORY), - STACK_UNDERFLOW(GL20.GL_STACK_UNDERFLOW), - STACK_OVERFLOW(GL20.GL_STACK_OVERFLOW), - ; - - private static final Int2ObjectMap errorLookup = new Int2ObjectArrayMap<>(); - - static { - errorLookup.defaultReturnValue(null); - for (GlError value : values()) { - errorLookup.put(value.glEnum, value); - } - } - - final int glEnum; - - GlError(int glEnum) { - this.glEnum = glEnum; - } - - // Great for use in your debugger's expression evaluator - public static GlError poll() { - return errorLookup.get(GlStateManager._getError()); - } - - public static void pollAndThrow(Supplier context) { -// This was a bad idea. -// GlError err = GlError.poll(); -// if (err != null) { -// Flywheel.LOGGER.error("{}: {}", err.name(), context.get()); -// } - } -} diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/gl/error/GlException.java b/common/src/backend/java/dev/engine_room/flywheel/backend/gl/error/GlException.java deleted file mode 100644 index 05b405258..000000000 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/gl/error/GlException.java +++ /dev/null @@ -1,15 +0,0 @@ -package dev.engine_room.flywheel.backend.gl.error; - -public class GlException extends RuntimeException { - - final GlError errorCode; - - public GlException(GlError errorCode, String message) { - super(updateMessage(errorCode, message)); - this.errorCode = errorCode; - } - - private static String updateMessage(GlError error, String message) { - return String.format("%s: %s", error, message); - } -} From 83f0e617d04a5db8872253a7cd1cddb4967dee10 Mon Sep 17 00:00:00 2001 From: IThundxr Date: Wed, 18 Feb 2026 15:14:56 -0500 Subject: [PATCH 30/59] Mark more things as deprecated, should be replaced with b3d versions --- .../dev/engine_room/flywheel/backend/gl/buffer/GlBuffer.java | 1 + .../engine_room/flywheel/backend/gl/buffer/GlBufferUsage.java | 1 + .../dev/engine_room/flywheel/backend/gl/shader/GlProgram.java | 1 + 3 files changed, 3 insertions(+) diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/gl/buffer/GlBuffer.java b/common/src/backend/java/dev/engine_room/flywheel/backend/gl/buffer/GlBuffer.java index 3c1aed330..11c932f49 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/gl/buffer/GlBuffer.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/gl/buffer/GlBuffer.java @@ -6,6 +6,7 @@ import dev.engine_room.flywheel.lib.memory.FlwMemoryTracker; import dev.engine_room.flywheel.lib.memory.MemoryBlock; +@Deprecated(forRemoval = true) public class GlBuffer extends GlObject { protected final GlBufferUsage usage; /** diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/gl/buffer/GlBufferUsage.java b/common/src/backend/java/dev/engine_room/flywheel/backend/gl/buffer/GlBufferUsage.java index ee9e8946f..dbeb51cfa 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/gl/buffer/GlBufferUsage.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/gl/buffer/GlBufferUsage.java @@ -6,6 +6,7 @@ * Gives a hint to the driver about how you intend to use a buffer. For a detailed explanation, see * this article. */ +@Deprecated(forRemoval = true) public enum GlBufferUsage { STREAM_DRAW(GlConst.GL_STREAM_DRAW), STREAM_READ(GlConst.GL_STREAM_READ), diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/gl/shader/GlProgram.java b/common/src/backend/java/dev/engine_room/flywheel/backend/gl/shader/GlProgram.java index 4b78983fe..c3f1518fa 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/gl/shader/GlProgram.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/gl/shader/GlProgram.java @@ -15,6 +15,7 @@ import it.unimi.dsi.fastutil.objects.Object2IntMap; import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap; +@Deprecated(forRemoval = true) public class GlProgram extends GlObject { private static final Logger LOGGER = LogUtils.getLogger(); From 6e1d21f614e48accec272de9b76fd1cdfa366fb2 Mon Sep 17 00:00:00 2001 From: IThundxr Date: Wed, 18 Feb 2026 16:04:02 -0500 Subject: [PATCH 31/59] Update OitFramebuffer to use GlStateManager and GlConst --- .../engine/indirect/OitFramebuffer.java | 93 +++++++++---------- 1 file changed, 46 insertions(+), 47 deletions(-) diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/engine/indirect/OitFramebuffer.java b/common/src/backend/java/dev/engine_room/flywheel/backend/engine/indirect/OitFramebuffer.java index bf23f4137..e2cbe1e58 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/engine/indirect/OitFramebuffer.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/engine/indirect/OitFramebuffer.java @@ -1,7 +1,6 @@ package dev.engine_room.flywheel.backend.engine.indirect; import org.lwjgl.opengl.GL32; -import org.lwjgl.opengl.GL33C; import org.lwjgl.opengl.GL46; import com.mojang.blaze3d.opengl.GlConst; @@ -20,7 +19,7 @@ public class OitFramebuffer { public static final float[] CLEAR_TO_ZERO = {0, 0, 0, 0}; - public static final int[] DEPTH_RANGE_DRAW_BUFFERS = {GL46.GL_COLOR_ATTACHMENT0}; + public static final int[] DEPTH_RANGE_DRAW_BUFFERS = {GlConst.GL_COLOR_ATTACHMENT0}; public static final int[] RENDER_TRANSMITTANCE_DRAW_BUFFERS = {GL46.GL_COLOR_ATTACHMENT1, GL46.GL_COLOR_ATTACHMENT2, GL46.GL_COLOR_ATTACHMENT3, GL46.GL_COLOR_ATTACHMENT4}; public static final int[] ACCUMULATE_DRAW_BUFFERS = {GL46.GL_COLOR_ATTACHMENT5}; public static final int[] DEPTH_ONLY_DRAW_BUFFERS = {}; @@ -41,7 +40,7 @@ public OitFramebuffer(OitPrograms programs) { if (GlCompat.SUPPORTS_DSA) { vao = GL46.glCreateVertexArrays(); } else { - vao = GL32.glGenVertexArrays(); + vao = GlStateManager._glGenVertexArrays(); } } @@ -74,9 +73,9 @@ public void prepare() { Samplers.NOISE.makeActive(); GlStateManager._bindTexture(((GlTexture) NoiseTextures.BLUE_NOISE.getTexture()).glId()); - GlStateManager._glBindFramebuffer(GL32.GL_FRAMEBUFFER, fbo); + GlStateManager._glBindFramebuffer(GlConst.GL_FRAMEBUFFER, fbo); GlTexture depthTexture = (GlTexture) renderTarget.getDepthTexture(); - GL32.glFramebufferTexture(GL32.GL_FRAMEBUFFER, GL32.GL_DEPTH_ATTACHMENT, depthTexture != null ? depthTexture.glId() : 0, 0); + GL32.glFramebufferTexture(GlConst.GL_FRAMEBUFFER, GlConst.GL_DEPTH_ATTACHMENT, depthTexture != null ? depthTexture.glId() : 0, 0); } /** @@ -88,7 +87,7 @@ public void depthRange() { GlStateManager._colorMask(true, true, true, true); GlStateManager._enableBlend(); GlStateManager._blendFuncSeparate(GlConst.GL_ONE, GlConst.GL_ONE, GlConst.GL_ONE, GlConst.GL_ONE); - GL32.glBlendEquation(GL32.GL_MAX); + GL32.glBlendEquation(GlConst.GL_MAX); var far = Minecraft.getInstance().gameRenderer.getDepthFar(); @@ -98,7 +97,7 @@ public void depthRange() { } else { GL32.glDrawBuffers(DEPTH_RANGE_DRAW_BUFFERS); GL32.glClearColor(-far, -far, 0, 0); - GlStateManager._clear(GL32.GL_COLOR_BUFFER_BIT); + GlStateManager._clear(GlConst.GL_COLOR_BUFFER_BIT); } } @@ -111,7 +110,7 @@ public void renderTransmittance() { GlStateManager._colorMask(true, true, true, true); GlStateManager._enableBlend(); GlStateManager._blendFuncSeparate(GlConst.GL_ONE, GlConst.GL_ONE, GlConst.GL_ONE, GlConst.GL_ONE); - GL32.glBlendEquation(GL32.GL_FUNC_ADD); + GL32.glBlendEquation(GlConst.GL_FUNC_ADD); if (GlCompat.SUPPORTS_DSA) { GL46.glNamedFramebufferDrawBuffers(fbo, RENDER_TRANSMITTANCE_DRAW_BUFFERS); @@ -123,7 +122,7 @@ public void renderTransmittance() { } else { GL32.glDrawBuffers(RENDER_TRANSMITTANCE_DRAW_BUFFERS); GL32.glClearColor(0, 0, 0, 0); - GlStateManager._clear(GL32.GL_COLOR_BUFFER_BIT); + GlStateManager._clear(GlConst.GL_COLOR_BUFFER_BIT); } } @@ -136,7 +135,7 @@ public void renderDepthFromTransmittance() { GlStateManager._depthMask(true); GlStateManager._colorMask(false, false, false, false); GlStateManager._disableBlend(); - GlStateManager._depthFunc(GL32.GL_ALWAYS); + GlStateManager._depthFunc(GlConst.GL_ALWAYS); if (GlCompat.SUPPORTS_DSA) { GL46.glNamedFramebufferDrawBuffers(fbo, DEPTH_ONLY_DRAW_BUFFERS); @@ -159,7 +158,7 @@ public void accumulate() { GlStateManager._colorMask(true, true, true, true); GlStateManager._enableBlend(); GlStateManager._blendFuncSeparate(GlConst.GL_ONE, GlConst.GL_ONE, GlConst.GL_ONE, GlConst.GL_ONE); - GL32.glBlendEquation(GL32.GL_FUNC_ADD); + GL32.glBlendEquation(GlConst.GL_FUNC_ADD); if (GlCompat.SUPPORTS_DSA) { GL46.glNamedFramebufferDrawBuffers(fbo, ACCUMULATE_DRAW_BUFFERS); @@ -168,7 +167,7 @@ public void accumulate() { } else { GL32.glDrawBuffers(ACCUMULATE_DRAW_BUFFERS); GL32.glClearColor(0, 0, 0, 0); - GlStateManager._clear(GL32.GL_COLOR_BUFFER_BIT); + GlStateManager._clear(GlConst.GL_COLOR_BUFFER_BIT); } } @@ -197,8 +196,8 @@ public void composite() { // Though note that the alpha value we emit in the fragment shader is actually (1. - transmittance_total). // The extra inversion step is so we can have a sane alpha value written out for the fabulous blit shader to consume. GlStateManager._blendFuncSeparate(GlConst.GL_SRC_ALPHA, GlConst.GL_ONE_MINUS_SRC_ALPHA, GlConst.GL_ONE, GlConst.GL_ONE_MINUS_SRC_ALPHA); - GL32.glBlendEquation(GL32.GL_FUNC_ADD); - GlStateManager._depthFunc(GL32.GL_ALWAYS); + GL32.glBlendEquation(GlConst.GL_FUNC_ADD); + GlStateManager._depthFunc(GlConst.GL_ALWAYS); GlTextureUnit.T0.makeActive(); GlStateManager._bindTexture(accumulate); @@ -217,7 +216,7 @@ private static void bindRenderTarget(RenderTarget target) { ((GlDevice) RenderSystem.getDevice()).directStateAccess(), target.getDepthTexture() ); - GL32.glBindFramebuffer(GL33C.GL_FRAMEBUFFER, i); + GlStateManager._glBindFramebuffer(GlConst.GL_FRAMEBUFFER, i); GlStateManager._viewport(0, 0, colorTexture.getWidth(0), colorTexture.getHeight(0)); } @@ -230,21 +229,21 @@ private void drawFullscreenQuad() { // Empty VAO, the actual full screen triangle is generated in the vertex shader GlStateManager._glBindVertexArray(vao); - GL32.glDrawArrays(GL32.GL_TRIANGLES, 0, 3); + GlStateManager._drawArrays(GlConst.GL_TRIANGLES, 0, 3); } private void deleteTextures() { if (depthBounds != -1) { - GL32.glDeleteTextures(depthBounds); + GlStateManager._deleteTexture(depthBounds); } if (coefficients != -1) { - GL32.glDeleteTextures(coefficients); + GlStateManager._deleteTexture(coefficients); } if (accumulate != -1) { - GL32.glDeleteTextures(accumulate); + GlStateManager._deleteTexture(accumulate); } if (fbo != -1) { - GL32.glDeleteFramebuffers(fbo); + GlStateManager._glDeleteFramebuffers(fbo); } // We sometimes get the same texture ID back when creating new textures, @@ -276,7 +275,7 @@ private void maybeResizeFBO(int width, int height) { GL46.glTextureStorage3D(coefficients, 1, GL32.GL_RGBA16F, width, height, 4); GL46.glTextureStorage2D(accumulate, 1, GL32.GL_RGBA16F, width, height); - GL46.glNamedFramebufferTexture(fbo, GL32.GL_COLOR_ATTACHMENT0, depthBounds, 0); + GL46.glNamedFramebufferTexture(fbo, GlConst.GL_COLOR_ATTACHMENT0, depthBounds, 0); GL46.glNamedFramebufferTextureLayer(fbo, GL32.GL_COLOR_ATTACHMENT1, coefficients, 0, 0); GL46.glNamedFramebufferTextureLayer(fbo, GL32.GL_COLOR_ATTACHMENT2, coefficients, 0, 1); GL46.glNamedFramebufferTextureLayer(fbo, GL32.GL_COLOR_ATTACHMENT3, coefficients, 0, 2); @@ -285,45 +284,45 @@ private void maybeResizeFBO(int width, int height) { } else { fbo = GL46.glGenFramebuffers(); - depthBounds = GL32.glGenTextures(); - coefficients = GL32.glGenTextures(); - accumulate = GL32.glGenTextures(); + depthBounds = GlStateManager._genTexture(); + coefficients = GlStateManager._genTexture(); + accumulate = GlStateManager._genTexture(); GlTextureUnit.T0.makeActive(); GlStateManager._bindTexture(0); - GL32.glBindTexture(GL32.GL_TEXTURE_2D, depthBounds); - GL32.glTexImage2D(GL32.GL_TEXTURE_2D, 0, GL32.GL_RG32F, width, height, 0, GL46.GL_RGBA, GL46.GL_BYTE, 0); + GlStateManager._bindTexture(depthBounds); + GL32.glTexImage2D(GlConst.GL_TEXTURE_2D, 0, GL32.GL_RG32F, width, height, 0, GL46.GL_RGBA, GL46.GL_BYTE, 0); - GL32.glTexParameteri(GL32.GL_TEXTURE_2D, GL32.GL_TEXTURE_MIN_FILTER, GL32.GL_NEAREST); - GL32.glTexParameteri(GL32.GL_TEXTURE_2D, GL32.GL_TEXTURE_MAG_FILTER, GL32.GL_NEAREST); - GL32.glTexParameteri(GL32.GL_TEXTURE_2D, GL32.GL_TEXTURE_WRAP_S, GL32.GL_CLAMP_TO_EDGE); - GL32.glTexParameteri(GL32.GL_TEXTURE_2D, GL32.GL_TEXTURE_WRAP_T, GL32.GL_CLAMP_TO_EDGE); + GlStateManager._texParameter(GlConst.GL_TEXTURE_2D, GlConst.GL_TEXTURE_MIN_FILTER, GlConst.GL_NEAREST); + GlStateManager._texParameter(GlConst.GL_TEXTURE_2D, GlConst.GL_TEXTURE_MAG_FILTER, GlConst.GL_NEAREST); + GlStateManager._texParameter(GlConst.GL_TEXTURE_2D, GlConst.GL_TEXTURE_WRAP_S, GlConst.GL_CLAMP_TO_EDGE); + GlStateManager._texParameter(GlConst.GL_TEXTURE_2D, GlConst.GL_TEXTURE_WRAP_T, GlConst.GL_CLAMP_TO_EDGE); GL32.glBindTexture(GL32.GL_TEXTURE_2D_ARRAY, coefficients); GL32.glTexImage3D(GL32.GL_TEXTURE_2D_ARRAY, 0, GL32.GL_RGBA16F, width, height, 4, 0, GL46.GL_RGBA, GL46.GL_BYTE, 0); - GL32.glTexParameteri(GL32.GL_TEXTURE_2D_ARRAY, GL32.GL_TEXTURE_MIN_FILTER, GL32.GL_NEAREST); - GL32.glTexParameteri(GL32.GL_TEXTURE_2D_ARRAY, GL32.GL_TEXTURE_MAG_FILTER, GL32.GL_NEAREST); - GL32.glTexParameteri(GL32.GL_TEXTURE_2D_ARRAY, GL32.GL_TEXTURE_WRAP_S, GL32.GL_CLAMP_TO_EDGE); - GL32.glTexParameteri(GL32.GL_TEXTURE_2D_ARRAY, GL32.GL_TEXTURE_WRAP_T, GL32.GL_CLAMP_TO_EDGE); + GlStateManager._texParameter(GL32.GL_TEXTURE_2D_ARRAY, GlConst.GL_TEXTURE_MIN_FILTER, GlConst.GL_NEAREST); + GlStateManager._texParameter(GL32.GL_TEXTURE_2D_ARRAY, GlConst.GL_TEXTURE_MAG_FILTER, GlConst.GL_NEAREST); + GlStateManager._texParameter(GL32.GL_TEXTURE_2D_ARRAY, GlConst.GL_TEXTURE_WRAP_S, GlConst.GL_CLAMP_TO_EDGE); + GlStateManager._texParameter(GL32.GL_TEXTURE_2D_ARRAY, GlConst.GL_TEXTURE_WRAP_T, GlConst.GL_CLAMP_TO_EDGE); - GL32.glBindTexture(GL32.GL_TEXTURE_2D, accumulate); - GL32.glTexImage2D(GL32.GL_TEXTURE_2D, 0, GL32.GL_RGBA16F, width, height, 0, GL46.GL_RGBA, GL46.GL_BYTE, 0); + GlStateManager._bindTexture(accumulate); + GL32.glTexImage2D(GlConst.GL_TEXTURE_2D, 0, GL32.GL_RGBA16F, width, height, 0, GL46.GL_RGBA, GL46.GL_BYTE, 0); - GL32.glTexParameteri(GL32.GL_TEXTURE_2D, GL32.GL_TEXTURE_MIN_FILTER, GL32.GL_NEAREST); - GL32.glTexParameteri(GL32.GL_TEXTURE_2D, GL32.GL_TEXTURE_MAG_FILTER, GL32.GL_NEAREST); - GL32.glTexParameteri(GL32.GL_TEXTURE_2D, GL32.GL_TEXTURE_WRAP_S, GL32.GL_CLAMP_TO_EDGE); - GL32.glTexParameteri(GL32.GL_TEXTURE_2D, GL32.GL_TEXTURE_WRAP_T, GL32.GL_CLAMP_TO_EDGE); + GlStateManager._texParameter(GlConst.GL_TEXTURE_2D, GlConst.GL_TEXTURE_MIN_FILTER, GlConst.GL_NEAREST); + GlStateManager._texParameter(GlConst.GL_TEXTURE_2D, GlConst.GL_TEXTURE_MAG_FILTER, GlConst.GL_NEAREST); + GlStateManager._texParameter(GlConst.GL_TEXTURE_2D, GlConst.GL_TEXTURE_WRAP_S, GlConst.GL_CLAMP_TO_EDGE); + GlStateManager._texParameter(GlConst.GL_TEXTURE_2D, GlConst.GL_TEXTURE_WRAP_T, GlConst.GL_CLAMP_TO_EDGE); - GlStateManager._glBindFramebuffer(GL32.GL_FRAMEBUFFER, fbo); + GlStateManager._glBindFramebuffer(GlConst.GL_FRAMEBUFFER, fbo); - GL46.glFramebufferTexture(GL32.GL_FRAMEBUFFER, GL32.GL_COLOR_ATTACHMENT0, depthBounds, 0); - GL46.glFramebufferTextureLayer(GL32.GL_FRAMEBUFFER, GL32.GL_COLOR_ATTACHMENT1, coefficients, 0, 0); - GL46.glFramebufferTextureLayer(GL32.GL_FRAMEBUFFER, GL32.GL_COLOR_ATTACHMENT2, coefficients, 0, 1); - GL46.glFramebufferTextureLayer(GL32.GL_FRAMEBUFFER, GL32.GL_COLOR_ATTACHMENT3, coefficients, 0, 2); - GL46.glFramebufferTextureLayer(GL32.GL_FRAMEBUFFER, GL32.GL_COLOR_ATTACHMENT4, coefficients, 0, 3); - GL46.glFramebufferTexture(GL32.GL_FRAMEBUFFER, GL32.GL_COLOR_ATTACHMENT5, accumulate, 0); + GL46.glFramebufferTexture(GlConst.GL_FRAMEBUFFER, GlConst.GL_COLOR_ATTACHMENT0, depthBounds, 0); + GL46.glFramebufferTextureLayer(GlConst.GL_FRAMEBUFFER, GL32.GL_COLOR_ATTACHMENT1, coefficients, 0, 0); + GL46.glFramebufferTextureLayer(GlConst.GL_FRAMEBUFFER, GL32.GL_COLOR_ATTACHMENT2, coefficients, 0, 1); + GL46.glFramebufferTextureLayer(GlConst.GL_FRAMEBUFFER, GL32.GL_COLOR_ATTACHMENT3, coefficients, 0, 2); + GL46.glFramebufferTextureLayer(GlConst.GL_FRAMEBUFFER, GL32.GL_COLOR_ATTACHMENT4, coefficients, 0, 3); + GL46.glFramebufferTexture(GlConst.GL_FRAMEBUFFER, GL32.GL_COLOR_ATTACHMENT5, accumulate, 0); } } } From f688891d4a21d04ec48bb3bb4354cebb90135951 Mon Sep 17 00:00:00 2001 From: IThundxr Date: Mon, 23 Feb 2026 13:26:43 -0500 Subject: [PATCH 32/59] Remove GlFence and use B3D's GlFence --- .../engine/indirect/StagingBuffer.java | 15 ++++----- .../flywheel/backend/gl/GlFence.java | 31 ------------------- 2 files changed, 8 insertions(+), 38 deletions(-) delete mode 100644 common/src/backend/java/dev/engine_room/flywheel/backend/gl/GlFence.java diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/engine/indirect/StagingBuffer.java b/common/src/backend/java/dev/engine_room/flywheel/backend/engine/indirect/StagingBuffer.java index a6c5d6771..b75e503e5 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/engine/indirect/StagingBuffer.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/engine/indirect/StagingBuffer.java @@ -7,8 +7,9 @@ import org.lwjgl.opengl.GL45C; import org.lwjgl.system.MemoryUtil; +import com.mojang.blaze3d.opengl.GlFence; + import dev.engine_room.flywheel.backend.compile.IndirectPrograms; -import dev.engine_room.flywheel.backend.gl.GlFence; import dev.engine_room.flywheel.backend.gl.buffer.GlBuffer; import dev.engine_room.flywheel.backend.gl.buffer.GlBufferUsage; import dev.engine_room.flywheel.lib.memory.FlwMemoryTracker; @@ -195,13 +196,13 @@ public void flush() { public void reclaim() { while (!fencedRegions.isEmpty()) { var region = fencedRegions.first(); - if (!region.fence.isSignaled()) { - // We can't reclaim this region yet, and we know that all the regions after it are also not ready. - break; + try (GlFence fence = region.fence) { + if (!fence.awaitCompletion(0L)) { + // We can't reclaim this region yet, and we know that all the regions after it are also not ready. + break; + } + fencedRegions.dequeue(); } - fencedRegions.dequeue(); - - region.fence.delete(); totalAvailable += region.capacity; } diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/gl/GlFence.java b/common/src/backend/java/dev/engine_room/flywheel/backend/gl/GlFence.java deleted file mode 100644 index a146fc704..000000000 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/gl/GlFence.java +++ /dev/null @@ -1,31 +0,0 @@ -package dev.engine_room.flywheel.backend.gl; - -import org.lwjgl.opengl.GL32; -import org.lwjgl.system.MemoryStack; -import org.lwjgl.system.MemoryUtil; - -import com.mojang.blaze3d.opengl.GlConst; -import com.mojang.blaze3d.opengl.GlStateManager; - -public class GlFence { - private final long fence; - - public GlFence() { - fence = GlStateManager._glFenceSync(GlConst.GL_SYNC_GPU_COMMANDS_COMPLETE, 0); - } - - public boolean isSignaled() { - int result; - try (var memoryStack = MemoryStack.stackPush()) { - long checkPtr = memoryStack.ncalloc(Integer.BYTES, 0, Integer.BYTES); - GL32.nglGetSynciv(fence, GL32.GL_SYNC_STATUS, 1, MemoryUtil.NULL, checkPtr); - - result = MemoryUtil.memGetInt(checkPtr); - } - return result == GL32.GL_SIGNALED; - } - - public void delete() { - GlStateManager._glDeleteSync(fence); - } -} From 090449279d2091a9e5ffc3d55ba7174555939044 Mon Sep 17 00:00:00 2001 From: IThundxr Date: Mon, 23 Feb 2026 17:05:22 -0500 Subject: [PATCH 33/59] Fix compile errors --- .../flywheel/backend/engine/indirect/StagingBuffer.java | 5 +++-- .../flywheel/backend/gl/array/GlVertexArrayGL3.java | 7 +++---- .../backend/gl/array/GlVertexArraySeparateAttributes.java | 5 +++-- 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/engine/indirect/StagingBuffer.java b/common/src/backend/java/dev/engine_room/flywheel/backend/engine/indirect/StagingBuffer.java index b75e503e5..a5e515432 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/engine/indirect/StagingBuffer.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/engine/indirect/StagingBuffer.java @@ -7,6 +7,7 @@ import org.lwjgl.opengl.GL45C; import org.lwjgl.system.MemoryUtil; +import com.mojang.blaze3d.buffers.GpuFence; import com.mojang.blaze3d.opengl.GlFence; import dev.engine_room.flywheel.backend.compile.IndirectPrograms; @@ -196,7 +197,7 @@ public void flush() { public void reclaim() { while (!fencedRegions.isEmpty()) { var region = fencedRegions.first(); - try (GlFence fence = region.fence) { + try (GpuFence fence = region.fence) { if (!fence.awaitCompletion(0L)) { // We can't reclaim this region yet, and we know that all the regions after it are also not ready. break; @@ -334,7 +335,7 @@ private void flushUsedRegion() { } } - private record FencedRegion(GlFence fence, long capacity) { + private record FencedRegion(GpuFence fence, long capacity) { } private static class OverflowStagingBuffer { diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/gl/array/GlVertexArrayGL3.java b/common/src/backend/java/dev/engine_room/flywheel/backend/gl/array/GlVertexArrayGL3.java index 87084b371..5c9d92215 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/gl/array/GlVertexArrayGL3.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/gl/array/GlVertexArrayGL3.java @@ -8,6 +8,7 @@ import org.lwjgl.opengl.GL33C; import org.lwjgl.system.Checks; +import com.mojang.blaze3d.opengl.GlConst; import com.mojang.blaze3d.opengl.GlStateManager; import dev.engine_room.flywheel.backend.gl.GlCompat; @@ -111,11 +112,9 @@ private void updateAttribute(int attribIndex) { int stride = bindingStrides[bindingIndex]; if (attribute instanceof VertexAttribute.Float f) { - GlStateManager._vertexAttribPointer(attribIndex, f.size(), f.type() - .glEnum(), f.normalized(), stride, offset); + GlStateManager._vertexAttribPointer(attribIndex, f.size(), GlConst.toGl(f.type()), f.normalized(), stride, offset); } else if (attribute instanceof VertexAttribute.Int vi) { - GlStateManager._vertexAttribIPointer(attribIndex, vi.size(), vi.type() - .glEnum(), stride, offset); + GlStateManager._vertexAttribIPointer(attribIndex, vi.size(), GlConst.toGl(vi.type()), stride, offset); } int divisor = bindingDivisors[bindingIndex]; diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/gl/array/GlVertexArraySeparateAttributes.java b/common/src/backend/java/dev/engine_room/flywheel/backend/gl/array/GlVertexArraySeparateAttributes.java index 86e4e7553..9813a7173 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/gl/array/GlVertexArraySeparateAttributes.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/gl/array/GlVertexArraySeparateAttributes.java @@ -7,6 +7,7 @@ import org.lwjgl.opengl.GL43C; import org.lwjgl.system.Checks; +import com.mojang.blaze3d.opengl.GlConst; import com.mojang.blaze3d.opengl.GlStateManager; import dev.engine_room.flywheel.backend.gl.GlCompat; @@ -63,9 +64,9 @@ public void bindAttributes(final int bindingIndex, final int startAttribIndex, L if (!attribute.equals(attributes[attribIndex])) { if (attribute instanceof VertexAttribute.Float f) { - GL43C.glVertexAttribFormat(attribIndex, f.size(), f.type().glEnum, f.normalized(), offset); + GL43C.glVertexAttribFormat(attribIndex, f.size(), GlConst.toGl(f.type()), f.normalized(), offset); } else if (attribute instanceof VertexAttribute.Int vi) { - GL43C.glVertexAttribIFormat(attribIndex, vi.size(), vi.type().glEnum, offset); + GL43C.glVertexAttribIFormat(attribIndex, vi.size(), GlConst.toGl(vi.type()), offset); } attributes[attribIndex] = attribute; } From 764768cb0d6c4f2c7e87fc7dc9ebd26329089309 Mon Sep 17 00:00:00 2001 From: IThundxr Date: Sat, 7 Mar 2026 12:26:51 -0500 Subject: [PATCH 34/59] Use GlConst in NoiseTextures --- .../engine_room/flywheel/backend/NoiseTextures.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/NoiseTextures.java b/common/src/backend/java/dev/engine_room/flywheel/backend/NoiseTextures.java index 9228289cd..0088c2a54 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/NoiseTextures.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/NoiseTextures.java @@ -3,8 +3,8 @@ import java.io.IOException; import org.jetbrains.annotations.UnknownNullability; -import org.lwjgl.opengl.GL32; +import com.mojang.blaze3d.opengl.GlConst; import com.mojang.blaze3d.opengl.GlStateManager; import com.mojang.blaze3d.opengl.GlTexture; import com.mojang.blaze3d.platform.NativeImage; @@ -42,10 +42,10 @@ public static void reload(ResourceManager manager) { GlTextureUnit.T0.makeActive(); GlStateManager._bindTexture(((GlTexture) BLUE_NOISE.getTexture()).glId()); - GlStateManager._texParameter(GL32.GL_TEXTURE_2D, GL32.GL_TEXTURE_MIN_FILTER, GL32.GL_LINEAR); - GlStateManager._texParameter(GL32.GL_TEXTURE_2D, GL32.GL_TEXTURE_MAG_FILTER, GL32.GL_LINEAR); - GlStateManager._texParameter(GL32.GL_TEXTURE_2D, GL32.GL_TEXTURE_WRAP_S, GL32.GL_REPEAT); - GlStateManager._texParameter(GL32.GL_TEXTURE_2D, GL32.GL_TEXTURE_WRAP_T, GL32.GL_REPEAT); + GlStateManager._texParameter(GlConst.GL_TEXTURE_2D, GlConst.GL_TEXTURE_MIN_FILTER, GlConst.GL_LINEAR); + GlStateManager._texParameter(GlConst.GL_TEXTURE_2D, GlConst.GL_TEXTURE_MAG_FILTER, GlConst.GL_LINEAR); + GlStateManager._texParameter(GlConst.GL_TEXTURE_2D, GlConst.GL_TEXTURE_WRAP_S, GlConst.GL_REPEAT); + GlStateManager._texParameter(GlConst.GL_TEXTURE_2D, GlConst.GL_TEXTURE_WRAP_T, GlConst.GL_REPEAT); GlStateManager._bindTexture(0); } catch (IOException e) { From 9f623ea6631696b61671fc4297009afd6db2fd94 Mon Sep 17 00:00:00 2001 From: BluSpring Date: Sat, 4 Apr 2026 06:08:24 +0800 Subject: [PATCH 35/59] Update to 26.1 --- build.gradle.kts | 3 +- buildSrc/build.gradle.kts | 17 +--- buildSrc/settings.gradle.kts | 8 ++ .../gradle/jarset/JarSetExtension.kt | 6 +- .../engine_room/gradle/jarset/JarTaskSet.kt | 79 ++----------------- .../nullability/PackageInfosExtension.kt | 2 +- .../gradle/platform/PlatformExtension.kt | 14 +--- .../gradle/subproject/SubprojectExtension.kt | 34 ++------ common/build.gradle.kts | 63 ++++----------- common/flywheel-common.accesswidener | 2 + .../flywheel/api/backend/Engine.java | 4 +- .../flywheel/api/backend/RenderContext.java | 4 +- .../flywheel/api/visual/DynamicVisual.java | 4 +- .../backend/CameraRenderStateExtension.java | 7 ++ .../flywheel/backend/engine/EngineImpl.java | 6 +- .../flywheel/backend/engine/LightStorage.java | 10 +-- .../backend/engine/MaterialRenderState.java | 11 ++- .../backend/engine/TextureBinder.java | 5 +- .../engine/indirect/OitFramebuffer.java | 15 ++-- .../backend/engine/uniform/FrameUniforms.java | 29 ++++--- .../backend/engine/uniform/LevelUniforms.java | 24 +++--- .../flywheel/backend/mixin/CameraMixin.java | 25 ++++++ .../backend/mixin/CameraRenderStateMixin.java | 18 +++++ .../backend/mixin/FogRendererMixin.java | 6 +- .../backend/mixin/GpuDeviceAccessor.java | 13 +++ .../backend/mixin/LevelRendererAccessor.java | 4 + .../LayerLightSectionStorageAccessor.java | 3 +- .../resources/flywheel.backend.mixins.json | 19 +++-- .../flywheel/lib/instance/FlatLit.java | 6 +- .../flywheel/lib/material/Materials.java | 4 +- .../flywheel/lib/model/LineModelBuilder.java | 4 +- .../flywheel/lib/model/ModelUtil.java | 4 +- .../lib/model/baked/BlockModelBuilder.java | 4 +- .../lib/model/baked/EmptyVertexConsumer.java | 49 ++++++++++++ .../model/baked/EmptyVirtualBlockGetter.java | 6 ++ .../lib/model/baked/LevelModelBuilder.java | 2 +- .../lib/model/baked/PartialModel.java | 4 +- .../baked/SinglePosVirtualBlockGetter.java | 6 ++ .../lib/model/baked/VirtualBlockGetter.java | 8 +- .../flywheel/lib/model/part/MeshTree.java | 4 +- .../flywheel/lib/model/part/ModelTrees.java | 9 ++- .../lib/visual/AbstractBlockEntityVisual.java | 12 +-- .../lib/visual/AbstractEntityVisual.java | 4 +- .../lib/visual/component/FireComponent.java | 13 +-- .../lib/visual/component/HitboxComponent.java | 4 +- .../lib/visual/component/ShadowComponent.java | 12 +-- .../impl/event/RenderContextImpl.java | 8 +- .../impl/mixin/LevelRendererMixin.java | 16 ++-- .../impl/visual/DynamicVisualContextImpl.java | 6 +- .../VisualizationManagerImpl.java | 8 +- .../main/resources/flywheel.impl.mixins.json | 16 ++-- .../vanillin/elements/FireElement.java | 13 +-- .../vanillin/elements/HitboxElement.java | 4 +- .../vanillin/elements/ShadowElement.java | 9 ++- .../vanillin/visuals/BlockDisplayVisual.java | 12 +-- .../vanillin/visuals/ChestVisual.java | 23 +++--- .../vanillin/visuals/ShulkerBoxVisual.java | 3 +- fabric/build.gradle.kts | 39 +++------ fabric/gradle.properties | 1 - .../model/baked/BlockStateModelBufferer.java | 76 +++++++++--------- .../lib/model/baked/FabricMeshEmitter.java | 11 +-- .../model/baked/FabricMeshEmitterManager.java | 19 ++--- .../lib/model/baked/FabricPartialModel.java | 8 +- .../flywheel/impl/FlwCommands.java | 52 ++++++------ .../flywheel/impl/FlywheelFabric.java | 6 +- .../flywheel/impl/mixin/MinecraftMixin.java | 4 +- fabric/src/main/resources/fabric.mod.json | 3 +- .../src/main/resources/flywheel.accesswidener | 2 + gradle.properties | 28 ++----- gradle/libs.versions.toml | 42 ++++++++++ gradle/wrapper/gradle-wrapper.properties | 2 +- neoforge/build.gradle.kts | 40 ++++------ neoforge/gradle.properties | 1 - .../flywheel/impl/mixin/MinecraftMixin.java | 4 +- .../resources/META-INF/accesstransformer.cfg | 1 + settings.gradle.kts | 8 +- vanillinFabric/build.gradle.kts | 28 ++----- vanillinFabric/gradle.properties | 1 - .../engine_room/vanillin/VanillinFabric.java | 4 +- vanillinNeoForge/build.gradle.kts | 35 +++----- vanillinNeoForge/gradle.properties | 1 - 81 files changed, 549 insertions(+), 575 deletions(-) create mode 100644 buildSrc/settings.gradle.kts create mode 100644 common/flywheel-common.accesswidener create mode 100644 common/src/backend/java/dev/engine_room/flywheel/backend/CameraRenderStateExtension.java create mode 100644 common/src/backend/java/dev/engine_room/flywheel/backend/mixin/CameraMixin.java create mode 100644 common/src/backend/java/dev/engine_room/flywheel/backend/mixin/CameraRenderStateMixin.java create mode 100644 common/src/backend/java/dev/engine_room/flywheel/backend/mixin/GpuDeviceAccessor.java create mode 100644 common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/EmptyVertexConsumer.java delete mode 100644 fabric/gradle.properties create mode 100644 fabric/src/main/resources/flywheel.accesswidener create mode 100644 gradle/libs.versions.toml delete mode 100644 neoforge/gradle.properties create mode 100644 neoforge/src/main/resources/META-INF/accesstransformer.cfg delete mode 100644 vanillinFabric/gradle.properties delete mode 100644 vanillinNeoForge/gradle.properties diff --git a/build.gradle.kts b/build.gradle.kts index 8704c07bc..3e2af5893 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,7 +1,8 @@ plugins { idea java - id("dev.architectury.loom") apply false + alias(libs.plugins.loom) apply false + alias(libs.plugins.mdg) apply false } println("Java: ${System.getProperty("java.version")}, JVM: ${System.getProperty("java.vm.version")} (${System.getProperty("java.vendor")}), Arch: ${System.getProperty("os.arch")}") diff --git a/buildSrc/build.gradle.kts b/buildSrc/build.gradle.kts index fc9aab75d..ab57371de 100644 --- a/buildSrc/build.gradle.kts +++ b/buildSrc/build.gradle.kts @@ -1,5 +1,3 @@ -import java.util.Properties - plugins { `kotlin-dsl` idea @@ -11,11 +9,9 @@ repositories { maven("https://maven.neoforged.net/releases/") { name = "NeoForged" } - maven("https://maven.architectury.dev/") { - name = "Architectury" + maven("https://maven.fabricmc.net/") { + name = "FabricMC" } - maven("https://repo.spongepowered.org/repository/maven-public") - maven("https://maven.parchmentmc.org") } idea.module { @@ -36,12 +32,7 @@ gradlePlugin { } } -val properties by lazy { - Properties().apply { - load(rootDir.parentFile.resolve("gradle.properties").inputStream()) - } -} - dependencies { - implementation("dev.architectury.loom:dev.architectury.loom.gradle.plugin:${properties["arch_loom_version"]}") + implementation(libs.fabric.loom) + implementation(libs.mdg) } diff --git a/buildSrc/settings.gradle.kts b/buildSrc/settings.gradle.kts new file mode 100644 index 000000000..57e9af307 --- /dev/null +++ b/buildSrc/settings.gradle.kts @@ -0,0 +1,8 @@ +// https://discuss.gradle.org/t/using-version-catalog-from-buildsrc-buildlogic-xyz-common-conventions-scripts/48534 +dependencyResolutionManagement { + versionCatalogs { + create("libs") { + from(files("../gradle/libs.versions.toml")) + } + } +} diff --git a/buildSrc/src/main/kotlin/dev/engine_room/gradle/jarset/JarSetExtension.kt b/buildSrc/src/main/kotlin/dev/engine_room/gradle/jarset/JarSetExtension.kt index 218984e20..e0b5e222c 100644 --- a/buildSrc/src/main/kotlin/dev/engine_room/gradle/jarset/JarSetExtension.kt +++ b/buildSrc/src/main/kotlin/dev/engine_room/gradle/jarset/JarSetExtension.kt @@ -1,7 +1,5 @@ package dev.engine_room.gradle.jarset -import net.fabricmc.loom.task.RemapJarTask -import net.fabricmc.loom.task.RemapSourcesJarTask import org.gradle.api.Project import org.gradle.api.tasks.SourceSet import org.gradle.jvm.tasks.Jar @@ -15,11 +13,9 @@ open class JarSetExtension(private val project: Project) { val mainSet: JarTaskSet by lazy { val jarTask = project.tasks.named("jar") - val remapJarTask = project.tasks.named("remapJar") val sourcesJarTask = project.tasks.named("sourcesJar") - val remapSourcesJarTask = project.tasks.named("remapSourcesJar") val javadocJarTask = project.tasks.named("javadocJar") - JarTaskSet(project, "main", jarTask, sourcesJarTask, javadocJarTask, remapJarTask, remapSourcesJarTask) + JarTaskSet(project, "main", jarTask, sourcesJarTask, javadocJarTask) } } diff --git a/buildSrc/src/main/kotlin/dev/engine_room/gradle/jarset/JarTaskSet.kt b/buildSrc/src/main/kotlin/dev/engine_room/gradle/jarset/JarTaskSet.kt index e4e1881f3..f8676a0bb 100644 --- a/buildSrc/src/main/kotlin/dev/engine_room/gradle/jarset/JarTaskSet.kt +++ b/buildSrc/src/main/kotlin/dev/engine_room/gradle/jarset/JarTaskSet.kt @@ -1,8 +1,5 @@ package dev.engine_room.gradle.jarset -import net.fabricmc.loom.task.AbstractRemapJarTask -import net.fabricmc.loom.task.RemapJarTask -import net.fabricmc.loom.task.RemapSourcesJarTask import org.gradle.api.Action import org.gradle.api.NamedDomainObjectProvider import org.gradle.api.Project @@ -27,24 +24,18 @@ class JarTaskSet( val jar: TaskProvider, val sources: TaskProvider, val javadocJar: TaskProvider, - val remapJar: TaskProvider, - val remapSources: TaskProvider ) { fun publishWithRawSources(action: Action): NamedDomainObjectProvider { return publish(sources, action) } - fun publishWithRemappedSources(action: Action): NamedDomainObjectProvider { - return publish(remapSources, action) - } - private fun publish( sourceJar: TaskProvider, action: Action ): NamedDomainObjectProvider { return project.the().publications.register("${name}RemapMaven") { - artifact(remapJar) + artifact(jar) artifact(sourceJar) artifact(javadocJar) action.execute(this) @@ -52,17 +43,7 @@ class JarTaskSet( } fun outgoing(name: String) { - outgoingRemapJar("${name}Remap") - outgoingJar("${name}Dev") - } - - fun outgoingRemapJar(name: String) { - val config = project.configurations.register(name) { - isCanBeConsumed = true - isCanBeResolved = false - } - - project.artifacts.add(config.name, remapJar) + outgoingJar(name) } fun outgoingJar(name: String) { @@ -75,22 +56,14 @@ class JarTaskSet( } /** - * Configure the assemble task to depend on the remap tasks and javadoc jar. + * Configure the assemble task to depend on the regular jar tasks and javadoc jar. */ fun addToAssemble() { project.tasks.named("assemble").configure { - dependsOn(remapJar, remapSources, javadocJar) + dependsOn(jar, sources, javadocJar) } } - /** - * Configure the remap tasks with the given action. - */ - fun configureRemap(action: Action) { - remapJar.configure(action) - remapSources.configure(action) - } - /** * Configure the jar tasks with the given action. */ @@ -99,16 +72,6 @@ class JarTaskSet( sources.configure(action) } - /** - * Create a new JarTaskSet with the same base jars but new tasks for remapping. - */ - fun forkRemap(newName: String): JarTaskSet { - val remapJarTask = createRemapJar(project, newName, jar) - val remapSourcesTask = createRemapSourcesJar(project, newName, sources) - - return JarTaskSet(project, newName, jar, sources, javadocJar, remapJarTask, remapSourcesTask) - } - companion object { private const val PACKAGE_INFOS_JAVA_PATTERN = "**/package-info.java" private const val BUILD_GROUP: String = "build" @@ -138,10 +101,7 @@ class JarTaskSet( val sourcesTask = createSourcesJar(project, name, sourceSetSet) val javadocJarTask = createJavadocJar(project, name, sourceSetSet) - val remapJarTask = createRemapJar(project, name, jarTask) - val remapSourcesTask = createRemapSourcesJar(project, name, sourcesTask) - - return JarTaskSet(project, name, jarTask, sourcesTask, javadocJarTask, remapJarTask, remapSourcesTask) + return JarTaskSet(project, name, jarTask, sourcesTask, javadocJarTask) } private fun createJar( @@ -206,34 +166,5 @@ class JarTaskSet( from(javadocTask.map { it.outputs }) } } - - private fun createRemapJar( - project: Project, - name: String, - jar: TaskProvider - ): TaskProvider { - return project.tasks.register("${name}RemapJar") { - dependsOn(jar) - group = LOOM_GROUP - destinationDirectory.set(project.layout.buildDirectory.dir("libs/${name}")) - - inputFile.set(jar.flatMap { it.archiveFile }) - } - } - - private fun createRemapSourcesJar( - project: Project, - name: String, - jar: TaskProvider - ): TaskProvider { - return project.tasks.register("${name}RemapSourcesJar") { - dependsOn(jar) - group = LOOM_GROUP - destinationDirectory.set(project.layout.buildDirectory.dir("libs/${name}")) - archiveClassifier.set(SOURCES_CLASSIFIER) - - inputFile.set(jar.flatMap { it.archiveFile }) - } - } } } diff --git a/buildSrc/src/main/kotlin/dev/engine_room/gradle/nullability/PackageInfosExtension.kt b/buildSrc/src/main/kotlin/dev/engine_room/gradle/nullability/PackageInfosExtension.kt index f604e477c..2934ae9fc 100644 --- a/buildSrc/src/main/kotlin/dev/engine_room/gradle/nullability/PackageInfosExtension.kt +++ b/buildSrc/src/main/kotlin/dev/engine_room/gradle/nullability/PackageInfosExtension.kt @@ -28,7 +28,7 @@ open class PackageInfosExtension(private val project: Project) { } sourceSet.java.srcDir(task) - project.tasks.named("ideaSyncTask").configure { + project.tasks.matching { it.name == "ideaSyncTask" || it.name == "neoForgeIdeSync" }.configureEach { finalizedBy(task) } diff --git a/buildSrc/src/main/kotlin/dev/engine_room/gradle/platform/PlatformExtension.kt b/buildSrc/src/main/kotlin/dev/engine_room/gradle/platform/PlatformExtension.kt index 95ed30384..34b6ed52a 100644 --- a/buildSrc/src/main/kotlin/dev/engine_room/gradle/platform/PlatformExtension.kt +++ b/buildSrc/src/main/kotlin/dev/engine_room/gradle/platform/PlatformExtension.kt @@ -1,7 +1,6 @@ package dev.engine_room.gradle.platform import net.fabricmc.loom.api.LoomGradleExtensionAPI -import net.fabricmc.loom.task.RemapJarTask import org.gradle.api.Project import org.gradle.api.Task import org.gradle.api.tasks.SourceSet @@ -10,7 +9,6 @@ import org.gradle.kotlin.dsl.assign import org.gradle.kotlin.dsl.named import org.gradle.kotlin.dsl.register import org.gradle.kotlin.dsl.the -import java.io.File open class PlatformExtension(val project: Project) { fun setupLoomMod(vararg sourceSets: SourceSet) { @@ -48,21 +46,11 @@ open class PlatformExtension(val project: Project) { project.tasks.apply { val testModJar = register("testModJar") { from(sourceSet.output) - val file = File(project.layout.buildDirectory.asFile.get(), "devlibs"); - destinationDirectory.set(file) archiveClassifier = "testmod" } - val remapTestModJar = register("remapTestModJar") { - dependsOn(testModJar) - inputFile.set(testModJar.get().archiveFile) - archiveClassifier = "testmod" - addNestedDependencies = false - classpath.from(sourceSet.compileClasspath) - } - named("build").configure { - dependsOn(remapTestModJar) + dependsOn(testModJar) } } } diff --git a/buildSrc/src/main/kotlin/dev/engine_room/gradle/subproject/SubprojectExtension.kt b/buildSrc/src/main/kotlin/dev/engine_room/gradle/subproject/SubprojectExtension.kt index c8d1775fb..544f16cdb 100644 --- a/buildSrc/src/main/kotlin/dev/engine_room/gradle/subproject/SubprojectExtension.kt +++ b/buildSrc/src/main/kotlin/dev/engine_room/gradle/subproject/SubprojectExtension.kt @@ -1,6 +1,5 @@ package dev.engine_room.gradle.subproject -import net.fabricmc.loom.api.LoomGradleExtensionAPI import org.gradle.api.JavaVersion import org.gradle.api.Project import org.gradle.api.plugins.BasePluginExtension @@ -24,8 +23,6 @@ open class SubprojectExtension(val project: Project) { setBaseProperties(archiveBase, group, version) setupJava() addRepositories() - setupLoom() - setupDependencies() configureTasks() setupPublishing() } @@ -51,11 +48,6 @@ open class SubprojectExtension(val project: Project) { } } - private fun setupLoom() { - val loom = project.the() - loom.silentMojangMappingsLicense() - } - private fun setupJava() { val java_version: String by project @@ -86,6 +78,12 @@ open class SubprojectExtension(val project: Project) { includeGroup("curse.maven") } } + maven("https://maven.caffeinemc.net/releases") { + name = "CaffeineMC" + content { + includeGroup("net.caffeinemc") + } + } maven("https://api.modrinth.com/maven") { name = "Modrinth" content { @@ -95,26 +93,6 @@ open class SubprojectExtension(val project: Project) { } } - @Suppress("UnstableApiUsage") - private fun setupDependencies() { - project.dependencies.apply { - val minecraft_version: String by project - val parchment_minecraft_version: String by project - val parchment_version: String by project - val loom = project.the() - - add("minecraft", "com.mojang:minecraft:${minecraft_version}") - - add("mappings", loom.layered { - officialMojangMappings { nameSyntheticMembers = false } - if (parchment_version != "none") - parchment("org.parchmentmc.data:parchment-${parchment_minecraft_version}:${parchment_version}@zip") - }) - - add("api", "com.google.code.findbugs:jsr305:3.0.2") - } - } - private fun configureTasks() { val java_version: String by project diff --git a/common/build.gradle.kts b/common/build.gradle.kts index bda8c2338..2e849a9d4 100644 --- a/common/build.gradle.kts +++ b/common/build.gradle.kts @@ -2,7 +2,7 @@ plugins { idea java `maven-publish` - id("dev.architectury.loom") + alias(libs.plugins.loom) id("flywheel.subproject") } @@ -15,6 +15,10 @@ val stubs = sourceSets.create("stubs") val main = sourceSets.getByName("main") val vanillin = sourceSets.create("vanillin") +loom { + accessWidenerPath = file("flywheel-common.accesswidener") +} + transitiveSourceSets { compileClasspath = main.compileClasspath @@ -58,60 +62,20 @@ jarSets { // For publishing. create("api", api, lib).apply { addToAssemble() - publishWithRemappedSources { - artifactId = "flywheel-common-intermediary-api-${property("artifact_minecraft_version")}" - } - - configureJar { - manifest { - attributes("Fabric-Loom-Remap" to "true") - } - } - // Don't publish the un-remapped jars because they don't have the correct manifest populated by Loom. - forkRemap("apiMojmap").apply { - addToAssemble() - configureRemap { - // "named" == mojmap - // We're probably remapping from named to named so Loom should noop this. - targetNamespace = "named" - } - - publishWithRawSources { - artifactId = "flywheel-common-mojmap-api-${property("artifact_minecraft_version")}" - } + publishWithRawSources { + artifactId = "flywheel-common-api-${property("artifact_minecraft_version")}" } } create("vanillin", vanillin).apply { addToAssemble() - publishWithRemappedSources { - artifactId = "vanillin-common-intermediary-${property("artifact_minecraft_version")}" + + publishWithRawSources { + artifactId = "vanillin-common-${property("artifact_minecraft_version")}" version = property("vanillin_version") as String groupId = property("vanillin_group") as String } - - configureJar { - manifest { - attributes("Fabric-Loom-Remap" to "true") - } - } - - // Don't publish the un-remapped jars because they don't have the correct manifest populated by Loom. - forkRemap("vanillinMojmap").apply { - addToAssemble() - configureRemap { - // "named" == mojmap - // We're probably remapping from named to named so Loom should noop this. - targetNamespace = "named" - } - - publishWithRawSources { - artifactId = "vanillin-common-mojmap-${property("artifact_minecraft_version")}" - version = property("vanillin_version") as String - groupId = property("vanillin_group") as String - } - } } } @@ -120,10 +84,11 @@ repositories { } dependencies { - modCompileOnly("net.fabricmc:fabric-loader:${property("fabric_loader_version")}") + minecraft(libs.minecraft) + compileOnly(libs.bundles.mixin) - modCompileOnly("net.caffeinemc:sodium-fabric-api:${property("sodium_version")}") - modCompileOnly("maven.modrinth:iris:${property("iris_version")}-fabric") + compileOnly(libs.sodium.fabric.api) + compileOnly("maven.modrinth:iris:${libs.versions.iris.get()}-fabric") compileOnly(annotationProcessor("io.github.llamalad7:mixinextras-common:0.4.1")!!) diff --git a/common/flywheel-common.accesswidener b/common/flywheel-common.accesswidener new file mode 100644 index 000000000..4e3281a69 --- /dev/null +++ b/common/flywheel-common.accesswidener @@ -0,0 +1,2 @@ +accessWidener v2 official +accessible class com/mojang/blaze3d/opengl/GlDevice diff --git a/common/src/api/java/dev/engine_room/flywheel/api/backend/Engine.java b/common/src/api/java/dev/engine_room/flywheel/api/backend/Engine.java index b44ee31ff..46fc2a986 100644 --- a/common/src/api/java/dev/engine_room/flywheel/api/backend/Engine.java +++ b/common/src/api/java/dev/engine_room/flywheel/api/backend/Engine.java @@ -9,7 +9,7 @@ import dev.engine_room.flywheel.api.task.Plan; import dev.engine_room.flywheel.api.visualization.VisualizationContext; import it.unimi.dsi.fastutil.longs.LongSet; -import net.minecraft.client.Camera; +import net.minecraft.client.renderer.state.level.CameraRenderState; import net.minecraft.core.BlockPos; import net.minecraft.core.SectionPos; import net.minecraft.core.Vec3i; @@ -43,7 +43,7 @@ public interface Engine { * * @return {@code true} if the render origin changed, {@code false} otherwise. */ - boolean updateRenderOrigin(Camera camera); + boolean updateRenderOrigin(CameraRenderState camera); /** * Assign the set of sections that visuals have requested GPU light for. diff --git a/common/src/api/java/dev/engine_room/flywheel/api/backend/RenderContext.java b/common/src/api/java/dev/engine_room/flywheel/api/backend/RenderContext.java index e78df1aad..5c4747bc1 100644 --- a/common/src/api/java/dev/engine_room/flywheel/api/backend/RenderContext.java +++ b/common/src/api/java/dev/engine_room/flywheel/api/backend/RenderContext.java @@ -2,10 +2,10 @@ import org.joml.Matrix4fc; -import net.minecraft.client.Camera; import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.client.renderer.LevelRenderer; import net.minecraft.client.renderer.RenderBuffers; +import net.minecraft.client.renderer.state.level.CameraRenderState; public interface RenderContext { LevelRenderer renderer(); @@ -20,7 +20,7 @@ public interface RenderContext { Matrix4fc viewProjection(); - Camera camera(); + CameraRenderState cameraRenderState(); float partialTick(); } diff --git a/common/src/api/java/dev/engine_room/flywheel/api/visual/DynamicVisual.java b/common/src/api/java/dev/engine_room/flywheel/api/visual/DynamicVisual.java index 6143f7836..769350066 100644 --- a/common/src/api/java/dev/engine_room/flywheel/api/visual/DynamicVisual.java +++ b/common/src/api/java/dev/engine_room/flywheel/api/visual/DynamicVisual.java @@ -6,7 +6,7 @@ import dev.engine_room.flywheel.api.instance.Instance; import dev.engine_room.flywheel.api.instance.Instancer; import dev.engine_room.flywheel.api.task.Plan; -import net.minecraft.client.Camera; +import net.minecraft.client.renderer.state.level.CameraRenderState; /** * An interface giving {@link Visual}s a hook to have a function called at @@ -32,7 +32,7 @@ public interface DynamicVisual extends Visual { */ @ApiStatus.NonExtendable interface Context { - Camera camera(); + CameraRenderState cameraRenderState(); FrustumIntersection frustum(); diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/CameraRenderStateExtension.java b/common/src/backend/java/dev/engine_room/flywheel/backend/CameraRenderStateExtension.java new file mode 100644 index 000000000..6a1859f07 --- /dev/null +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/CameraRenderStateExtension.java @@ -0,0 +1,7 @@ +package dev.engine_room.flywheel.backend; + +import org.joml.Vector3f; + +public interface CameraRenderStateExtension { + Vector3f flywheel$getForwardVector(); +} diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/engine/EngineImpl.java b/common/src/backend/java/dev/engine_room/flywheel/backend/engine/EngineImpl.java index 690e540b2..0f9c69c8b 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/engine/EngineImpl.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/engine/EngineImpl.java @@ -19,7 +19,7 @@ import dev.engine_room.flywheel.backend.engine.uniform.Uniforms; import dev.engine_room.flywheel.backend.gl.GlStateTracker; import it.unimi.dsi.fastutil.longs.LongSet; -import net.minecraft.client.Camera; +import net.minecraft.client.renderer.state.level.CameraRenderState; import net.minecraft.core.BlockPos; import net.minecraft.core.SectionPos; import net.minecraft.core.Vec3i; @@ -59,8 +59,8 @@ public Vec3i renderOrigin() { } @Override - public boolean updateRenderOrigin(Camera camera) { - Vec3 cameraPos = camera.position(); + public boolean updateRenderOrigin(CameraRenderState camera) { + Vec3 cameraPos = camera.pos; double dx = renderOrigin.getX() - cameraPos.x; double dy = renderOrigin.getY() - cameraPos.y; double dz = renderOrigin.getZ() - cameraPos.z; diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/engine/LightStorage.java b/common/src/backend/java/dev/engine_room/flywheel/backend/engine/LightStorage.java index 2d2244a51..efb853bad 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/engine/LightStorage.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/engine/LightStorage.java @@ -25,9 +25,9 @@ import it.unimi.dsi.fastutil.longs.Long2IntOpenHashMap; import it.unimi.dsi.fastutil.longs.LongOpenHashSet; import it.unimi.dsi.fastutil.longs.LongSet; -import net.minecraft.client.renderer.LightTexture; import net.minecraft.core.SectionPos; import net.minecraft.core.Vec3i; +import net.minecraft.util.LightCoordsUtil; import net.minecraft.world.level.LevelAccessor; /** @@ -292,7 +292,7 @@ private void setupSectionBoxes() { .translate(x + 1, y + 1, z + 1) .scale(14) .color(255, 255, 0) - .light(LightTexture.FULL_BRIGHT) + .light(LightCoordsUtil.FULL_BRIGHT) .setChanged(); }); } @@ -357,7 +357,7 @@ private void setupLutRangeBoxes() { .translate(x2, y2, debug3) .scale(1, 1, size3 * 16) .color(0, 0, 255) - .light(LightTexture.FULL_BRIGHT) + .light(LightCoordsUtil.FULL_BRIGHT) .setChanged(); } } @@ -367,7 +367,7 @@ private void setupLutRangeBoxes() { .translate(debug2, y2, minLocal3 * 16 - renderOrigin.getZ()) .scale(size2 * 16, 1, (maxLocal3 - minLocal3) * 16) .color(255, 0, 0) - .light(LightTexture.FULL_BRIGHT) + .light(LightCoordsUtil.FULL_BRIGHT) .setChanged(); } @@ -376,7 +376,7 @@ private void setupLutRangeBoxes() { .translate(min2 * 16 - renderOrigin.getX(), debug1, min3 * 16 - renderOrigin.getZ()) .scale((max2 - min2) * 16, size1 * 16, (max3 - min3) * 16) .color(0, 255, 0) - .light(LightTexture.FULL_BRIGHT) + .light(LightCoordsUtil.FULL_BRIGHT) .setChanged(); } diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/engine/MaterialRenderState.java b/common/src/backend/java/dev/engine_room/flywheel/backend/engine/MaterialRenderState.java index 3f4e842c3..b265b9c3a 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/engine/MaterialRenderState.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/engine/MaterialRenderState.java @@ -44,7 +44,11 @@ public static void setupOit(Material material) { WriteMask mask = material.writeMask(); boolean writeColor = mask.color(); - GlStateManager._colorMask(writeColor, writeColor, writeColor, writeColor); + + if (writeColor) + GlStateManager._colorMask(0b1111); + else + GlStateManager._colorMask(0b0000); } private static void setupTexture(Material material) { @@ -151,7 +155,10 @@ private static void setupTransparency(Transparency transparency) { private static void setupWriteMask(WriteMask mask) { GlStateManager._depthMask(mask.depth()); boolean writeColor = mask.color(); - GlStateManager._colorMask(writeColor, writeColor, writeColor, writeColor); + if (writeColor) + GlStateManager._colorMask(0b1111); + else + GlStateManager._colorMask(0b0000); } public static boolean materialEquals(Material lhs, Material rhs) { diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/engine/TextureBinder.java b/common/src/backend/java/dev/engine_room/flywheel/backend/engine/TextureBinder.java index a8ffb1e35..986a97002 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/engine/TextureBinder.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/engine/TextureBinder.java @@ -14,6 +14,7 @@ import com.mojang.blaze3d.textures.GpuTexture; import dev.engine_room.flywheel.backend.Samplers; +import dev.engine_room.flywheel.backend.mixin.GpuDeviceAccessor; import net.minecraft.client.Minecraft; import net.minecraft.resources.Identifier; @@ -45,13 +46,13 @@ public static void bindLightAndOverlay() { var gameRenderer = Minecraft.getInstance().gameRenderer; GlSampler sampler = (GlSampler) RenderSystem.getSamplerCache().getClampToEdge(FilterMode.LINEAR); bind(Samplers.OVERLAY.number, (GlTextureView) gameRenderer.overlayTexture().getTextureView(), sampler); - bind(Samplers.LIGHT.number, (GlTextureView) gameRenderer.lightTexture().getTextureView(), sampler); + bind(Samplers.LIGHT.number, (GlTextureView) gameRenderer.lightmap(), sampler); } public static void bindRenderTarget(RenderTarget target) { GlTexture colorTexture = (GlTexture) target.getColorTexture(); int i = colorTexture.getFbo( - ((GlDevice) RenderSystem.getDevice()).directStateAccess(), + ((GlDevice) ((GpuDeviceAccessor) RenderSystem.getDevice()).getBackend()).directStateAccess(), target.getDepthTexture() ); GlStateManager._glBindFramebuffer(GlConst.GL_FRAMEBUFFER, i); diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/engine/indirect/OitFramebuffer.java b/common/src/backend/java/dev/engine_room/flywheel/backend/engine/indirect/OitFramebuffer.java index e2cbe1e58..558b60536 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/engine/indirect/OitFramebuffer.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/engine/indirect/OitFramebuffer.java @@ -15,6 +15,7 @@ import dev.engine_room.flywheel.backend.compile.OitPrograms; import dev.engine_room.flywheel.backend.gl.GlCompat; import dev.engine_room.flywheel.backend.gl.GlTextureUnit; +import dev.engine_room.flywheel.backend.mixin.GpuDeviceAccessor; import net.minecraft.client.Minecraft; public class OitFramebuffer { @@ -84,12 +85,12 @@ public void prepare() { public void depthRange() { // No depth writes, but we'll still use the depth test. GlStateManager._depthMask(false); - GlStateManager._colorMask(true, true, true, true); + GlStateManager._colorMask(0b1111); GlStateManager._enableBlend(); GlStateManager._blendFuncSeparate(GlConst.GL_ONE, GlConst.GL_ONE, GlConst.GL_ONE, GlConst.GL_ONE); GL32.glBlendEquation(GlConst.GL_MAX); - var far = Minecraft.getInstance().gameRenderer.getDepthFar(); + var far = Minecraft.getInstance().gameRenderer.getGameRenderState().levelRenderState.cameraRenderState.depthFar; if (GlCompat.SUPPORTS_DSA) { GL46.glNamedFramebufferDrawBuffers(fbo, DEPTH_RANGE_DRAW_BUFFERS); @@ -107,7 +108,7 @@ public void depthRange() { public void renderTransmittance() { // No depth writes, but we'll still use the depth test GlStateManager._depthMask(false); - GlStateManager._colorMask(true, true, true, true); + GlStateManager._colorMask(0b1111); GlStateManager._enableBlend(); GlStateManager._blendFuncSeparate(GlConst.GL_ONE, GlConst.GL_ONE, GlConst.GL_ONE, GlConst.GL_ONE); GL32.glBlendEquation(GlConst.GL_FUNC_ADD); @@ -133,7 +134,7 @@ public void renderTransmittance() { public void renderDepthFromTransmittance() { // Only write to depth, not color. GlStateManager._depthMask(true); - GlStateManager._colorMask(false, false, false, false); + GlStateManager._colorMask(0b0000); GlStateManager._disableBlend(); GlStateManager._depthFunc(GlConst.GL_ALWAYS); @@ -155,7 +156,7 @@ public void renderDepthFromTransmittance() { public void accumulate() { // No depth writes, but we'll still use the depth test GlStateManager._depthMask(false); - GlStateManager._colorMask(true, true, true, true); + GlStateManager._colorMask(0b1111); GlStateManager._enableBlend(); GlStateManager._blendFuncSeparate(GlConst.GL_ONE, GlConst.GL_ONE, GlConst.GL_ONE, GlConst.GL_ONE); GL32.glBlendEquation(GlConst.GL_FUNC_ADD); @@ -186,7 +187,7 @@ public void composite() { // depthMask = false: other transparent stuff renders on top of OIT stuff. // If Neo gets wavelet OIT we can use their hooks to be correct with everything. GlStateManager._depthMask(true); - GlStateManager._colorMask(true, true, true, true); + GlStateManager._colorMask(0b1111); GlStateManager._enableBlend(); // We rely on the blend func to achieve: @@ -213,7 +214,7 @@ public void composite() { private static void bindRenderTarget(RenderTarget target) { GlTexture colorTexture = (GlTexture) target.getColorTexture(); int i = colorTexture.getFbo( - ((GlDevice) RenderSystem.getDevice()).directStateAccess(), + ((GlDevice) ((GpuDeviceAccessor) RenderSystem.getDevice()).getBackend()).directStateAccess(), target.getDepthTexture() ); GlStateManager._glBindFramebuffer(GlConst.GL_FRAMEBUFFER, i); diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/engine/uniform/FrameUniforms.java b/common/src/backend/java/dev/engine_room/flywheel/backend/engine/uniform/FrameUniforms.java index 591d8de36..812ad9602 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/engine/uniform/FrameUniforms.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/engine/uniform/FrameUniforms.java @@ -8,15 +8,15 @@ import dev.engine_room.flywheel.api.backend.RenderContext; import dev.engine_room.flywheel.api.visualization.VisualizationManager; +import dev.engine_room.flywheel.backend.CameraRenderStateExtension; import dev.engine_room.flywheel.backend.engine.indirect.DepthPyramid; import dev.engine_room.flywheel.backend.mixin.LevelRendererAccessor; import net.minecraft.client.Camera; import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.GameRenderer; +import net.minecraft.client.renderer.state.level.CameraRenderState; import net.minecraft.core.BlockPos; import net.minecraft.core.Vec3i; import net.minecraft.util.Util; -import net.minecraft.world.level.Level; import net.minecraft.world.phys.Vec3; public final class FrameUniforms extends UniformWriter { @@ -68,8 +68,8 @@ public static void update(RenderContext context) { Vec3i renderOrigin = VisualizationManager.getOrThrow(context.level()) .renderOrigin(); - var camera = context.camera(); - Vec3 cameraPos = camera.position(); + var camera = context.cameraRenderState(); + Vec3 cameraPos = camera.pos; var camX = (float) (cameraPos.x - renderOrigin.getX()); var camY = (float) (cameraPos.y - renderOrigin.getY()); var camZ = (float) (cameraPos.z - renderOrigin.getZ()); @@ -81,8 +81,8 @@ public static void update(RenderContext context) { VIEW_PROJECTION.translate(-camX, -camY, -camZ); CAMERA_POS.set(camX, camY, camZ); - CAMERA_LOOK.set(camera.forwardVector()); - CAMERA_ROT.set(camera.xRot(), camera.yRot()); + CAMERA_LOOK.set(((CameraRenderStateExtension) camera).flywheel$getForwardVector()); + CAMERA_ROT.set(camera.xRot, camera.yRot); if (firstWrite) { setPrev(); @@ -109,7 +109,7 @@ public static void update(RenderContext context) { ptr = writeFloat(ptr, (float) window.getWidth() / (float) window.getHeight()); // default line width: net.minecraft.client.renderer.RenderStateShard.LineStateShard ptr = writeFloat(ptr, Math.max(2.5F, (float) window.getWidth() / 1920.0F * 2.5F)); - ptr = writeFloat(ptr, Minecraft.getInstance().gameRenderer.getDepthFar()); + ptr = writeFloat(ptr, Minecraft.getInstance().gameRenderer.getGameRenderState().levelRenderState.cameraRenderState.depthFar); ptr = writeTime(ptr, context); @@ -178,17 +178,16 @@ private static long writeTime(long ptr, RenderContext context) { return ptr; } - private static long writeCameraIn(long ptr, Camera camera) { - if (!camera.isInitialized()) { + private static long writeCameraIn(long ptr, CameraRenderState camera) { + if (!camera.initialized) { ptr = writeInt(ptr, 0); ptr = writeInt(ptr, 0); return ptr; } - Level level = camera.entity().level(); - BlockPos blockPos = camera.blockPosition(); - Vec3 cameraPos = camera.position(); - return writeInFluidAndBlock(ptr, level, blockPos, cameraPos); + BlockPos blockPos = camera.blockPos; + Vec3 cameraPos = camera.pos; + return writeInFluidAndBlock(ptr, Minecraft.getInstance().level, blockPos, cameraPos); } private static long writeCullData(long ptr) { @@ -199,8 +198,8 @@ private static long writeCullData(long ptr) { int pyramidHeight = DepthPyramid.mip0Size(mainRenderTarget.height); int pyramidDepth = DepthPyramid.getImageMipLevels(pyramidWidth, pyramidHeight); - ptr = writeFloat(ptr, GameRenderer.PROJECTION_Z_NEAR); // zNear - ptr = writeFloat(ptr, mc.gameRenderer.getDepthFar()); // zFar + ptr = writeFloat(ptr, Camera.PROJECTION_Z_NEAR); // zNear + ptr = writeFloat(ptr, mc.gameRenderer.getGameRenderState().levelRenderState.cameraRenderState.depthFar); // zFar ptr = writeFloat(ptr, PROJECTION.m00()); // P00 ptr = writeFloat(ptr, PROJECTION.m11()); // P11 ptr = writeFloat(ptr, pyramidWidth); // pyramidWidth diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/engine/uniform/LevelUniforms.java b/common/src/backend/java/dev/engine_room/flywheel/backend/engine/uniform/LevelUniforms.java index 871cf58b4..25ce0f0a5 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/engine/uniform/LevelUniforms.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/engine/uniform/LevelUniforms.java @@ -3,12 +3,11 @@ import org.joml.Vector3f; import dev.engine_room.flywheel.api.backend.RenderContext; -import net.minecraft.client.Camera; +import dev.engine_room.flywheel.backend.mixin.LevelRendererAccessor; import net.minecraft.client.multiplayer.ClientLevel; +import net.minecraft.client.renderer.state.level.LevelRenderState; import net.minecraft.resources.ResourceKey; import net.minecraft.util.ARGB; -import net.minecraft.world.attribute.EnvironmentAttributeProbe; -import net.minecraft.world.attribute.EnvironmentAttributes; import net.minecraft.world.level.Level; import net.minecraft.world.level.dimension.DimensionType; @@ -27,18 +26,17 @@ public static void update(RenderContext context) { ClientLevel level = context.level(); float partialTick = context.partialTick(); - Camera camera = context.camera(); - EnvironmentAttributeProbe probe = camera.attributeProbe(); + LevelRenderState levelRenderState = ((LevelRendererAccessor) context.renderer()).flywheel$getLevelRenderState(); - int skyColor = probe.getValue(EnvironmentAttributes.SKY_COLOR, partialTick); - int cloudColor = probe.getValue(EnvironmentAttributes.CLOUD_COLOR, partialTick); + int skyColor = levelRenderState.skyRenderState.skyColor; + int cloudColor = levelRenderState.cloudColor; ptr = writeVec4(ptr, ARGB.redFloat(skyColor), ARGB.greenFloat(skyColor), ARGB.blueFloat(skyColor), 1f); ptr = writeVec4(ptr, ARGB.redFloat(cloudColor), ARGB.greenFloat(cloudColor), ARGB.blueFloat(cloudColor), 1f); ptr = writeVec3(ptr, LIGHT0_DIRECTION); ptr = writeVec3(ptr, LIGHT1_DIRECTION); - long dayTime = level.getDayTime(); + long dayTime = level.getDefaultClockTime(); long levelDay = dayTime / 24000L; float timeOfDay = (float) (dayTime - levelDay * 24000L) / 24000f; ptr = writeInt(ptr, (int) (levelDay % 0x7FFFFFFFL)); @@ -46,17 +44,17 @@ public static void update(RenderContext context) { ptr = writeInt(ptr, level.dimensionType().hasSkyLight() ? 1 : 0); - float sunAngle = probe.getValue(EnvironmentAttributes.SUN_ANGLE, partialTick); + float sunAngle = levelRenderState.skyRenderState.sunAngle; ptr = writeFloat(ptr, sunAngle); - float moonAngle = probe.getValue(EnvironmentAttributes.MOON_ANGLE, partialTick); + float moonAngle = levelRenderState.skyRenderState.moonAngle; ptr = writeFloat(ptr, moonAngle); - float starAngle = probe.getValue(EnvironmentAttributes.STAR_ANGLE, partialTick); + float starAngle = levelRenderState.skyRenderState.starAngle; ptr = writeFloat(ptr, starAngle); - int moonPhase = probe.getValue(EnvironmentAttributes.MOON_PHASE, partialTick).index(); + int moonPhase = levelRenderState.skyRenderState.moonPhase.index(); ptr = writeFloat(ptr, DimensionType.MOON_BRIGHTNESS_PER_PHASE[moonPhase]); ptr = writeInt(ptr, moonPhase); - float starBrightness = probe.getValue(EnvironmentAttributes.STAR_BRIGHTNESS, partialTick); + float starBrightness = levelRenderState.skyRenderState.starBrightness; ptr = writeFloat(ptr, starBrightness); ptr = writeInt(ptr, level.isRaining() ? 1 : 0); diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/mixin/CameraMixin.java b/common/src/backend/java/dev/engine_room/flywheel/backend/mixin/CameraMixin.java new file mode 100644 index 000000000..9f54b1b0b --- /dev/null +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/mixin/CameraMixin.java @@ -0,0 +1,25 @@ +package dev.engine_room.flywheel.backend.mixin; + +import org.joml.Vector3f; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import dev.engine_room.flywheel.backend.CameraRenderStateExtension; +import net.minecraft.client.Camera; +import net.minecraft.client.renderer.state.level.CameraRenderState; + +@Mixin(Camera.class) +abstract class CameraMixin { + @Shadow + @Final + private Vector3f forwards; + + @Inject(method = "extractRenderState", at = @At("TAIL")) + private void flywheel$extendRenderState(CameraRenderState cameraState, float cameraEntityPartialTicks, CallbackInfo ci) { + ((CameraRenderStateExtension) cameraState).flywheel$getForwardVector().set(this.forwards); + } +} diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/mixin/CameraRenderStateMixin.java b/common/src/backend/java/dev/engine_room/flywheel/backend/mixin/CameraRenderStateMixin.java new file mode 100644 index 000000000..b5e259a5e --- /dev/null +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/mixin/CameraRenderStateMixin.java @@ -0,0 +1,18 @@ +package dev.engine_room.flywheel.backend.mixin; + +import org.joml.Vector3f; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Unique; + +import dev.engine_room.flywheel.backend.CameraRenderStateExtension; +import net.minecraft.client.renderer.state.level.CameraRenderState; + +@Mixin(CameraRenderState.class) +abstract class CameraRenderStateMixin implements CameraRenderStateExtension { + @Unique private final Vector3f flywheel$forwardVector = new Vector3f(); + + @Override + public Vector3f flywheel$getForwardVector() { + return this.flywheel$forwardVector; + } +} diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/mixin/FogRendererMixin.java b/common/src/backend/java/dev/engine_room/flywheel/backend/mixin/FogRendererMixin.java index d0b9bb098..d57a0eb5c 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/mixin/FogRendererMixin.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/mixin/FogRendererMixin.java @@ -14,8 +14,8 @@ @Mixin(FogRenderer.class) abstract class FogRendererMixin { - @Inject(method = "setupFog(Lnet/minecraft/client/Camera;ILnet/minecraft/client/DeltaTracker;FLnet/minecraft/client/multiplayer/ClientLevel;)Lorg/joml/Vector4f;", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/fog/FogRenderer;updateBuffer(Ljava/nio/ByteBuffer;ILorg/joml/Vector4f;FFFFFF)V")) - private static void flywheel$onReturnSetupFog(CallbackInfoReturnable cir, @Local Vector4f fogColor, @Local FogData fogData) { - FogUniforms.update(fogColor, fogData.environmentalStart, fogData.environmentalEnd, fogData.renderDistanceStart, fogData.renderDistanceEnd, fogData.skyEnd, fogData.cloudEnd); + @Inject(method = "setupFog", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/fog/FogRenderer;computeFogColor(Lnet/minecraft/client/Camera;FLnet/minecraft/client/multiplayer/ClientLevel;IFLorg/joml/Vector4f;)V")) + private static void flywheel$onReturnSetupFog(CallbackInfoReturnable cir, @Local FogData fogData) { + FogUniforms.update(fogData.color, fogData.environmentalStart, fogData.environmentalEnd, fogData.renderDistanceStart, fogData.renderDistanceEnd, fogData.skyEnd, fogData.cloudEnd); } } diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/mixin/GpuDeviceAccessor.java b/common/src/backend/java/dev/engine_room/flywheel/backend/mixin/GpuDeviceAccessor.java new file mode 100644 index 000000000..f740a71db --- /dev/null +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/mixin/GpuDeviceAccessor.java @@ -0,0 +1,13 @@ +package dev.engine_room.flywheel.backend.mixin; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +import com.mojang.blaze3d.systems.GpuDevice; +import com.mojang.blaze3d.systems.GpuDeviceBackend; + +@Mixin(GpuDevice.class) +public interface GpuDeviceAccessor { + @Accessor + GpuDeviceBackend getBackend(); +} diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/mixin/LevelRendererAccessor.java b/common/src/backend/java/dev/engine_room/flywheel/backend/mixin/LevelRendererAccessor.java index b0a429f98..646e92c43 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/mixin/LevelRendererAccessor.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/mixin/LevelRendererAccessor.java @@ -4,9 +4,13 @@ import org.spongepowered.asm.mixin.gen.Accessor; import net.minecraft.client.renderer.LevelRenderer; +import net.minecraft.client.renderer.state.level.LevelRenderState; @Mixin(LevelRenderer.class) public interface LevelRendererAccessor { @Accessor("ticks") int flywheel$getTicks(); + + @Accessor("levelRenderState") + LevelRenderState flywheel$getLevelRenderState(); } diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/mixin/light/LayerLightSectionStorageAccessor.java b/common/src/backend/java/dev/engine_room/flywheel/backend/mixin/light/LayerLightSectionStorageAccessor.java index 562ac36db..f7cb652ce 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/mixin/light/LayerLightSectionStorageAccessor.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/mixin/light/LayerLightSectionStorageAccessor.java @@ -1,7 +1,6 @@ package dev.engine_room.flywheel.backend.mixin.light; -import javax.annotation.Nullable; - +import org.jspecify.annotations.Nullable; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.gen.Invoker; diff --git a/common/src/backend/resources/flywheel.backend.mixins.json b/common/src/backend/resources/flywheel.backend.mixins.json index d46f95b8f..8a55191de 100644 --- a/common/src/backend/resources/flywheel.backend.mixins.json +++ b/common/src/backend/resources/flywheel.backend.mixins.json @@ -1,14 +1,17 @@ { - "required": true, - "minVersion": "0.8", - "package": "dev.engine_room.flywheel.backend.mixin", - "compatibilityLevel": "JAVA_21", - "refmap": "backend-flywheel.refmap.json", - "client": [ + "required" : true, + "minVersion" : "0.8", + "package" : "dev.engine_room.flywheel.backend.mixin", + "compatibilityLevel" : "JAVA_21", + "refmap" : "backend-flywheel.refmap.json", + "client" : [ "AbstractClientPlayerAccessor", + "CameraMixin", + "CameraRenderStateMixin", "FogRendererMixin", "GlStateManagerAccessor", "GlStateManagerMixin", + "GpuDeviceAccessor", "LevelRendererAccessor", "LightingMixin", "OptionsMixin", @@ -18,7 +21,7 @@ "light.SkyDataLayerStorageMapAccessor", "light.SkyLightSectionStorageMixin" ], - "injectors": { - "defaultRequire": 1 + "injectors" : { + "defaultRequire" : 1 } } diff --git a/common/src/lib/java/dev/engine_room/flywheel/lib/instance/FlatLit.java b/common/src/lib/java/dev/engine_room/flywheel/lib/instance/FlatLit.java index 9fe9f4884..3109c90fa 100644 --- a/common/src/lib/java/dev/engine_room/flywheel/lib/instance/FlatLit.java +++ b/common/src/lib/java/dev/engine_room/flywheel/lib/instance/FlatLit.java @@ -8,7 +8,7 @@ import dev.engine_room.flywheel.api.instance.Instance; import dev.engine_room.flywheel.lib.visual.AbstractBlockEntityVisual; import dev.engine_room.flywheel.lib.visual.AbstractEntityVisual; -import net.minecraft.client.renderer.LightTexture; +import net.minecraft.util.LightCoordsUtil; /** * An interface that implementors of {@link Instance} should also implement if they wish to make use of @@ -17,7 +17,7 @@ public interface FlatLit extends Instance { /** * Set the packed light value for this instance. - * @param packedLight the packed light per {@link LightTexture#pack(int, int)} + * @param packedLight the packed light per {@link LightCoordsUtil#pack(int, int)} * @return {@code this} for chaining */ FlatLit light(int packedLight); @@ -29,7 +29,7 @@ public interface FlatLit extends Instance { * @return {@code this} for chaining */ default FlatLit light(int blockLight, int skyLight) { - return light(LightTexture.pack(blockLight, skyLight)); + return light(LightCoordsUtil.pack(blockLight, skyLight)); } static void relight(int packedLight, @Nullable FlatLit... instances) { diff --git a/common/src/lib/java/dev/engine_room/flywheel/lib/material/Materials.java b/common/src/lib/java/dev/engine_room/flywheel/lib/material/Materials.java index d8d768339..2c94ed015 100644 --- a/common/src/lib/java/dev/engine_room/flywheel/lib/material/Materials.java +++ b/common/src/lib/java/dev/engine_room/flywheel/lib/material/Materials.java @@ -5,7 +5,7 @@ import dev.engine_room.flywheel.api.material.Material; import dev.engine_room.flywheel.api.material.Transparency; import dev.engine_room.flywheel.api.material.WriteMask; -import net.minecraft.client.renderer.entity.ItemRenderer; +import net.minecraft.client.renderer.feature.ItemFeatureRenderer; import net.minecraft.client.renderer.texture.TextureAtlas; // FIXME 1.21.11: use default blur/mipmap from AbstractTexture for all materials here, and by default @@ -40,7 +40,7 @@ public final class Materials { .build(); public static final Material GLINT = SimpleMaterial.builder() - .texture(ItemRenderer.ENCHANTED_GLINT_ITEM) + .texture(ItemFeatureRenderer.ENCHANTED_GLINT_ITEM) .shaders(StandardMaterialShaders.GLINT) .transparency(Transparency.GLINT) .writeMask(WriteMask.COLOR) diff --git a/common/src/lib/java/dev/engine_room/flywheel/lib/model/LineModelBuilder.java b/common/src/lib/java/dev/engine_room/flywheel/lib/model/LineModelBuilder.java index 1012ae04f..17eac0047 100644 --- a/common/src/lib/java/dev/engine_room/flywheel/lib/model/LineModelBuilder.java +++ b/common/src/lib/java/dev/engine_room/flywheel/lib/model/LineModelBuilder.java @@ -16,8 +16,8 @@ import dev.engine_room.flywheel.lib.memory.MemoryBlock; import dev.engine_room.flywheel.lib.vertex.FullVertexView; import dev.engine_room.flywheel.lib.vertex.VertexView; -import net.minecraft.client.renderer.LightTexture; import net.minecraft.client.renderer.texture.OverlayTexture; +import net.minecraft.util.LightCoordsUtil; public final class LineModelBuilder { private static final Material MATERIAL = SimpleMaterial.builder() @@ -91,7 +91,7 @@ public LineModelBuilder line(float x1, float y1, float z1, float x2, float y2, f vertexView.u(vertexCount + i, 0); vertexView.v(vertexCount + i, 0); vertexView.overlay(vertexCount + i, OverlayTexture.NO_OVERLAY); - vertexView.light(vertexCount + i, LightTexture.FULL_BRIGHT); + vertexView.light(vertexCount + i, LightCoordsUtil.FULL_BRIGHT); vertexView.normalX(vertexCount + i, normalX); vertexView.normalY(vertexCount + i, normalY); vertexView.normalZ(vertexCount + i, normalZ); diff --git a/common/src/lib/java/dev/engine_room/flywheel/lib/model/ModelUtil.java b/common/src/lib/java/dev/engine_room/flywheel/lib/model/ModelUtil.java index 5cfdd0d76..597aa4654 100644 --- a/common/src/lib/java/dev/engine_room/flywheel/lib/model/ModelUtil.java +++ b/common/src/lib/java/dev/engine_room/flywheel/lib/model/ModelUtil.java @@ -82,9 +82,9 @@ public static Material getItemMaterial(RenderType renderType) { return Materials.CUTOUT_BLOCK; } - if (renderType == Sheets.solidBlockSheet()) { + /*if (renderType == Sheets.solidBlockSheet()) { return Materials.SOLID_BLOCK; - } + }*/ if (renderType == Sheets.translucentBlockItemSheet()) { return Materials.TRANSLUCENT_ITEM_ENTITY_BLOCK; diff --git a/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/BlockModelBuilder.java b/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/BlockModelBuilder.java index 0b0e77270..8532fa0fb 100644 --- a/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/BlockModelBuilder.java +++ b/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/BlockModelBuilder.java @@ -10,10 +10,10 @@ import dev.engine_room.flywheel.lib.internal.FlwLibXplat; import dev.engine_room.flywheel.lib.model.ModelUtil; import dev.engine_room.flywheel.lib.model.SimpleModel; -import net.minecraft.client.renderer.block.model.BlockStateModel; +import net.minecraft.client.renderer.block.BlockAndTintGetter; +import net.minecraft.client.renderer.block.dispatch.BlockStateModel; import net.minecraft.client.renderer.chunk.ChunkSectionLayer; import net.minecraft.core.BlockPos; -import net.minecraft.world.level.BlockAndTintGetter; public final class BlockModelBuilder { final BlockStateModel blockModel; diff --git a/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/EmptyVertexConsumer.java b/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/EmptyVertexConsumer.java new file mode 100644 index 000000000..1901069f8 --- /dev/null +++ b/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/EmptyVertexConsumer.java @@ -0,0 +1,49 @@ +package dev.engine_room.flywheel.lib.model.baked; + +import com.mojang.blaze3d.vertex.VertexConsumer; + +public class EmptyVertexConsumer implements VertexConsumer { + public static final EmptyVertexConsumer INSTANCE = new EmptyVertexConsumer(); + + private EmptyVertexConsumer() {} + + @Override + public VertexConsumer addVertex(float x, float y, float z) { + return this; + } + + @Override + public VertexConsumer setColor(int r, int g, int b, int a) { + return this; + } + + @Override + public VertexConsumer setColor(int color) { + return this; + } + + @Override + public VertexConsumer setUv(float u, float v) { + return this; + } + + @Override + public VertexConsumer setUv1(int u, int v) { + return this; + } + + @Override + public VertexConsumer setUv2(int u, int v) { + return this; + } + + @Override + public VertexConsumer setNormal(float x, float y, float z) { + return this; + } + + @Override + public VertexConsumer setLineWidth(float width) { + return this; + } +} diff --git a/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/EmptyVirtualBlockGetter.java b/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/EmptyVirtualBlockGetter.java index 1bd6829c4..6371ce1fd 100644 --- a/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/EmptyVirtualBlockGetter.java +++ b/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/EmptyVirtualBlockGetter.java @@ -5,6 +5,7 @@ import org.jspecify.annotations.Nullable; import net.minecraft.core.BlockPos; +import net.minecraft.world.level.CardinalLighting; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.state.BlockState; @@ -44,4 +45,9 @@ public final int getHeight() { public final int getMinY() { return 0; } + + @Override + public CardinalLighting cardinalLighting() { + return CardinalLighting.DEFAULT; + } } diff --git a/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/LevelModelBuilder.java b/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/LevelModelBuilder.java index 3748c3ba5..1aa716adc 100644 --- a/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/LevelModelBuilder.java +++ b/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/LevelModelBuilder.java @@ -10,9 +10,9 @@ import dev.engine_room.flywheel.lib.internal.FlwLibXplat; import dev.engine_room.flywheel.lib.model.ModelUtil; import dev.engine_room.flywheel.lib.model.SimpleModel; +import net.minecraft.client.renderer.block.BlockAndTintGetter; import net.minecraft.client.renderer.chunk.ChunkSectionLayer; import net.minecraft.core.BlockPos; -import net.minecraft.world.level.BlockAndTintGetter; public final class LevelModelBuilder { final BlockAndTintGetter level; diff --git a/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/PartialModel.java b/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/PartialModel.java index 3ab6be8cb..68c30a8d6 100644 --- a/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/PartialModel.java +++ b/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/PartialModel.java @@ -4,8 +4,8 @@ import org.jetbrains.annotations.UnknownNullability; import dev.engine_room.flywheel.lib.internal.FlwLibXplat; -import net.minecraft.client.renderer.block.model.BlockStateModel; -import net.minecraft.client.renderer.block.model.SimpleModelWrapper; +import net.minecraft.client.renderer.block.dispatch.BlockStateModel; +import net.minecraft.client.resources.model.SimpleModelWrapper; import net.minecraft.resources.Identifier; /** diff --git a/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/SinglePosVirtualBlockGetter.java b/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/SinglePosVirtualBlockGetter.java index 729ad5565..54c28751a 100644 --- a/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/SinglePosVirtualBlockGetter.java +++ b/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/SinglePosVirtualBlockGetter.java @@ -5,6 +5,7 @@ import org.jspecify.annotations.Nullable; import net.minecraft.core.BlockPos; +import net.minecraft.world.level.CardinalLighting; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.state.BlockState; @@ -70,4 +71,9 @@ public int getHeight() { public int getMinY() { return pos.getY(); } + + @Override + public CardinalLighting cardinalLighting() { + return CardinalLighting.DEFAULT; + } } diff --git a/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/VirtualBlockGetter.java b/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/VirtualBlockGetter.java index 808200da8..6a17569ab 100644 --- a/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/VirtualBlockGetter.java +++ b/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/VirtualBlockGetter.java @@ -3,10 +3,9 @@ import java.util.function.ToIntFunction; import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.block.BlockAndTintGetter; import net.minecraft.core.BlockPos; -import net.minecraft.core.Direction; import net.minecraft.core.registries.Registries; -import net.minecraft.world.level.BlockAndTintGetter; import net.minecraft.world.level.ColorResolver; import net.minecraft.world.level.biome.Biome; import net.minecraft.world.level.biome.Biomes; @@ -25,11 +24,6 @@ public FluidState getFluidState(BlockPos pos) { return getBlockState(pos).getFluidState(); } - @Override - public float getShade(Direction direction, boolean shaded) { - return 1f; - } - @Override public LevelLightEngine getLightEngine() { return lightEngine; diff --git a/common/src/lib/java/dev/engine_room/flywheel/lib/model/part/MeshTree.java b/common/src/lib/java/dev/engine_room/flywheel/lib/model/part/MeshTree.java index 406729011..e60cc942f 100644 --- a/common/src/lib/java/dev/engine_room/flywheel/lib/model/part/MeshTree.java +++ b/common/src/lib/java/dev/engine_room/flywheel/lib/model/part/MeshTree.java @@ -19,8 +19,8 @@ import net.minecraft.client.model.geom.ModelLayerLocation; import net.minecraft.client.model.geom.ModelPart; import net.minecraft.client.model.geom.PartPose; -import net.minecraft.client.renderer.LightTexture; import net.minecraft.client.renderer.texture.OverlayTexture; +import net.minecraft.util.LightCoordsUtil; public final class MeshTree { private static final ThreadLocal THREAD_LOCAL_OBJECTS = ThreadLocal.withInitial(ThreadLocalObjects::new); @@ -74,7 +74,7 @@ private static Mesh compile(ModelPart modelPart, ThreadLocalObjects objects) { } VertexWriter vertexWriter = objects.vertexWriter; - FlwLibLink.INSTANCE.compileModelPart(modelPart, IDENTITY_POSE, vertexWriter, LightTexture.FULL_BRIGHT, OverlayTexture.NO_OVERLAY, 0xFFFFFFFF); + FlwLibLink.INSTANCE.compileModelPart(modelPart, IDENTITY_POSE, vertexWriter, LightCoordsUtil.FULL_BRIGHT, OverlayTexture.NO_OVERLAY, 0xFFFFFFFF); MemoryBlock data = vertexWriter.copyDataAndReset(); VertexView vertexView = new PosTexNormalVertexView(); diff --git a/common/src/lib/java/dev/engine_room/flywheel/lib/model/part/ModelTrees.java b/common/src/lib/java/dev/engine_room/flywheel/lib/model/part/ModelTrees.java index c1bccb4da..6f9d126ef 100644 --- a/common/src/lib/java/dev/engine_room/flywheel/lib/model/part/ModelTrees.java +++ b/common/src/lib/java/dev/engine_room/flywheel/lib/model/part/ModelTrees.java @@ -16,7 +16,8 @@ import net.minecraft.client.Minecraft; import net.minecraft.client.model.geom.ModelLayerLocation; import net.minecraft.client.renderer.texture.TextureAtlasSprite; -import net.minecraft.client.resources.model.AtlasManager; +import net.minecraft.client.resources.model.sprite.AtlasManager; +import net.minecraft.client.resources.model.sprite.SpriteId; public final class ModelTrees { private static final RendererReloadCache CACHE = new RendererReloadCache<>(k -> { @@ -37,7 +38,7 @@ public static ModelTree of(ModelLayerLocation layer, Material material) { return CACHE.get(new ModelTreeKey(layer, Collections.emptySet(), null, material)); } - public static ModelTree of(ModelLayerLocation layer, net.minecraft.client.resources.model.Material texture, Material material) { + public static ModelTree of(ModelLayerLocation layer, SpriteId texture, Material material) { return CACHE.get(new ModelTreeKey(layer, Collections.emptySet(), texture, material)); } @@ -45,7 +46,7 @@ public static ModelTree of(ModelLayerLocation layer, Set pathsToPrune, M return CACHE.get(new ModelTreeKey(layer, Set.copyOf(pathsToPrune), null, material)); } - public static ModelTree of(ModelLayerLocation layer, Set pathsToPrune, net.minecraft.client.resources.model.Material texture, Material material) { + public static ModelTree of(ModelLayerLocation layer, Set pathsToPrune, SpriteId texture, Material material) { return CACHE.get(new ModelTreeKey(layer, Set.copyOf(pathsToPrune), texture, material)); } @@ -81,6 +82,6 @@ private static ModelTree convert(String path, MeshTree meshTree, Set pat return new ModelTree(model, meshTree.initialPose(), children); } - private record ModelTreeKey(ModelLayerLocation layer, Set pathsToPrune, net.minecraft.client.resources.model.@Nullable Material texture, Material material) { + private record ModelTreeKey(ModelLayerLocation layer, Set pathsToPrune, @Nullable SpriteId texture, Material material) { } } diff --git a/common/src/lib/java/dev/engine_room/flywheel/lib/visual/AbstractBlockEntityVisual.java b/common/src/lib/java/dev/engine_room/flywheel/lib/visual/AbstractBlockEntityVisual.java index 63bf3769f..1949440e6 100644 --- a/common/src/lib/java/dev/engine_room/flywheel/lib/visual/AbstractBlockEntityVisual.java +++ b/common/src/lib/java/dev/engine_room/flywheel/lib/visual/AbstractBlockEntityVisual.java @@ -2,9 +2,9 @@ import java.util.Iterator; -import org.jspecify.annotations.Nullable; import org.jetbrains.annotations.UnknownNullability; import org.joml.FrustumIntersection; +import org.jspecify.annotations.Nullable; import dev.engine_room.flywheel.api.visual.BlockEntityVisual; import dev.engine_room.flywheel.api.visual.DynamicVisual; @@ -96,15 +96,15 @@ public boolean isVisible(FrustumIntersection frustum) { */ public boolean doDistanceLimitThisFrame(DynamicVisual.Context context) { return !context.limiter() - .shouldUpdate(pos.distToCenterSqr(context.camera().position())); + .shouldUpdate(pos.distToCenterSqr(context.cameraRenderState().pos)); } protected int computePackedLight() { - return LevelRenderer.getLightColor(level, pos); + return LevelRenderer.getLightCoords(level, pos); } protected void relight(BlockPos pos, @Nullable FlatLit... instances) { - FlatLit.relight(LevelRenderer.getLightColor(level, pos), instances); + FlatLit.relight(LevelRenderer.getLightCoords(level, pos), instances); } protected void relight(@Nullable FlatLit... instances) { @@ -112,7 +112,7 @@ protected void relight(@Nullable FlatLit... instances) { } protected void relight(BlockPos pos, Iterator<@Nullable FlatLit> instances) { - FlatLit.relight(LevelRenderer.getLightColor(level, pos), instances); + FlatLit.relight(LevelRenderer.getLightCoords(level, pos), instances); } protected void relight(Iterator<@Nullable FlatLit> instances) { @@ -120,7 +120,7 @@ protected void relight(Iterator<@Nullable FlatLit> instances) { } protected void relight(BlockPos pos, Iterable<@Nullable FlatLit> instances) { - FlatLit.relight(LevelRenderer.getLightColor(level, pos), instances); + FlatLit.relight(LevelRenderer.getLightCoords(level, pos), instances); } protected void relight(Iterable<@Nullable FlatLit> instances) { diff --git a/common/src/lib/java/dev/engine_room/flywheel/lib/visual/AbstractEntityVisual.java b/common/src/lib/java/dev/engine_room/flywheel/lib/visual/AbstractEntityVisual.java index fcc235ab3..3061b2d14 100644 --- a/common/src/lib/java/dev/engine_room/flywheel/lib/visual/AbstractEntityVisual.java +++ b/common/src/lib/java/dev/engine_room/flywheel/lib/visual/AbstractEntityVisual.java @@ -13,8 +13,8 @@ import dev.engine_room.flywheel.api.visualization.VisualizationManager; import dev.engine_room.flywheel.lib.instance.FlatLit; import dev.engine_room.flywheel.lib.internal.FlwLibLink; -import net.minecraft.client.renderer.LightTexture; import net.minecraft.core.BlockPos; +import net.minecraft.util.LightCoordsUtil; import net.minecraft.util.Mth; import net.minecraft.world.entity.Entity; import net.minecraft.world.level.LightLayer; @@ -97,7 +97,7 @@ protected int computePackedLight(float partialTick) { BlockPos pos = BlockPos.containing(entity.getLightProbePosition(partialTick)); int blockLight = entity.isOnFire() ? 15 : level.getBrightness(LightLayer.BLOCK, pos); int skyLight = level.getBrightness(LightLayer.SKY, pos); - return LightTexture.pack(blockLight, skyLight); + return LightCoordsUtil.pack(blockLight, skyLight); } protected void relight(float partialTick, @Nullable FlatLit... instances) { diff --git a/common/src/lib/java/dev/engine_room/flywheel/lib/visual/component/FireComponent.java b/common/src/lib/java/dev/engine_room/flywheel/lib/visual/component/FireComponent.java index a6a24434e..64a4a7982 100644 --- a/common/src/lib/java/dev/engine_room/flywheel/lib/visual/component/FireComponent.java +++ b/common/src/lib/java/dev/engine_room/flywheel/lib/visual/component/FireComponent.java @@ -20,9 +20,10 @@ import dev.engine_room.flywheel.lib.util.RendererReloadCache; import dev.engine_room.flywheel.lib.visual.util.SmartRecycler; import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.LightTexture; import net.minecraft.client.renderer.texture.TextureAtlasSprite; import net.minecraft.client.resources.model.ModelBakery; +import net.minecraft.client.resources.model.sprite.SpriteId; +import net.minecraft.util.LightCoordsUtil; import net.minecraft.util.Mth; import net.minecraft.world.entity.Entity; @@ -37,7 +38,7 @@ public final class FireComponent implements EntityComponent { // Parameterize by the material instead of the sprite // because Material#sprite is a surprisingly heavy operation // and because sprites are invalidated after a resource reload. - private static final RendererReloadCache FIRE_MODELS = new RendererReloadCache<>(texture -> { + private static final RendererReloadCache FIRE_MODELS = new RendererReloadCache<>(texture -> { TextureAtlasSprite sprite = Minecraft.getInstance().getAtlasManager().get(texture); return new SingleMeshModel(new FireMesh(sprite), FIRE_MATERIAL); }); @@ -59,7 +60,7 @@ private TransformedInstance createInstance(Model model) { TransformedInstance instance = context.instancerProvider() .instancer(InstanceTypes.TRANSFORMED, model) .createInstance(); - instance.light(LightTexture.FULL_BLOCK); + instance.light(LightCoordsUtil.pack(15, 0)); instance.setChanged(); return instance; } @@ -96,8 +97,8 @@ private void setupInstances(DynamicVisual.Context context) { stack.setIdentity(); stack.translate(entityX - renderOrigin.getX(), entityY - renderOrigin.getY(), entityZ - renderOrigin.getZ()); stack.scale(scale, scale, scale); - stack.mulPose(Axis.YP.rotationDegrees(-context.camera() - .yRot())); + stack.mulPose(Axis.YP.rotationDegrees(-context.cameraRenderState() + .yRot)); stack.translate(0.0F, 0.0F, -0.3F + (float) ((int) maxHeight) * 0.02F); for (int i = 0; y < maxHeight; ++i) { @@ -157,7 +158,7 @@ private static void writeVertex(MutableVertexList vertexList, int i, float x, fl vertexList.b(i, 1); vertexList.u(i, u); vertexList.v(i, v); - vertexList.light(i, LightTexture.FULL_BLOCK); + vertexList.light(i, LightCoordsUtil.pack(15, 0)); vertexList.normalX(i, 0); vertexList.normalY(i, 1); vertexList.normalZ(i, 0); diff --git a/common/src/lib/java/dev/engine_room/flywheel/lib/visual/component/HitboxComponent.java b/common/src/lib/java/dev/engine_room/flywheel/lib/visual/component/HitboxComponent.java index 99887fefc..87e4ccb83 100644 --- a/common/src/lib/java/dev/engine_room/flywheel/lib/visual/component/HitboxComponent.java +++ b/common/src/lib/java/dev/engine_room/flywheel/lib/visual/component/HitboxComponent.java @@ -11,7 +11,7 @@ import dev.engine_room.flywheel.lib.visual.util.SmartRecycler; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.components.debug.DebugScreenEntries; -import net.minecraft.client.renderer.LightTexture; +import net.minecraft.util.LightCoordsUtil; import net.minecraft.util.Mth; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.LivingEntity; @@ -69,7 +69,7 @@ private TransformedInstance createInstance(Model model) { TransformedInstance instance = context.instancerProvider() .instancer(InstanceTypes.TRANSFORMED, model) .createInstance(); - instance.light(LightTexture.FULL_BLOCK); + instance.light(LightCoordsUtil.pack(15, 0)); instance.setChanged(); return instance; } diff --git a/common/src/lib/java/dev/engine_room/flywheel/lib/visual/component/ShadowComponent.java b/common/src/lib/java/dev/engine_room/flywheel/lib/visual/component/ShadowComponent.java index 174aab9b6..2a86de5ec 100644 --- a/common/src/lib/java/dev/engine_room/flywheel/lib/visual/component/ShadowComponent.java +++ b/common/src/lib/java/dev/engine_room/flywheel/lib/visual/component/ShadowComponent.java @@ -1,10 +1,8 @@ package dev.engine_room.flywheel.lib.visual.component; -import net.minecraft.resources.Identifier; - -import org.jspecify.annotations.Nullable; import org.joml.Vector4f; import org.joml.Vector4fc; +import org.jspecify.annotations.Nullable; import dev.engine_room.flywheel.api.material.Material; import dev.engine_room.flywheel.api.material.Transparency; @@ -20,11 +18,13 @@ import dev.engine_room.flywheel.lib.model.SingleMeshModel; import dev.engine_room.flywheel.lib.visual.util.InstanceRecycler; import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.LightTexture; +import net.minecraft.client.renderer.Lightmap; import net.minecraft.client.renderer.texture.OverlayTexture; import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.core.Direction.Axis; +import net.minecraft.resources.Identifier; +import net.minecraft.util.LightCoordsUtil; import net.minecraft.util.Mth; import net.minecraft.world.entity.Entity; import net.minecraft.world.level.Level; @@ -158,7 +158,7 @@ private void setupInstance(ChunkAccess chunk, MutableBlockPos pos, float entityX // Too dark to render. return; } - float blockBrightness = LightTexture.getBrightness(level.dimensionType(), maxLocalRawBrightness); + float blockBrightness = Lightmap.getBrightness(level.dimensionType(), maxLocalRawBrightness); float alpha = strength * 0.5F * blockBrightness; if (alpha < 0.0F) { // Too far away/too weak to render. @@ -257,7 +257,7 @@ private static void writeVertex(MutableVertexList vertexList, int i, float x, fl vertexList.b(i, 1); vertexList.u(i, 0); vertexList.v(i, 0); - vertexList.light(i, LightTexture.FULL_BRIGHT); + vertexList.light(i, LightCoordsUtil.FULL_BRIGHT); vertexList.overlay(i, OverlayTexture.NO_OVERLAY); vertexList.normalX(i, 0); vertexList.normalY(i, 1); diff --git a/common/src/main/java/dev/engine_room/flywheel/impl/event/RenderContextImpl.java b/common/src/main/java/dev/engine_room/flywheel/impl/event/RenderContextImpl.java index 5b52009d5..94a19d463 100644 --- a/common/src/main/java/dev/engine_room/flywheel/impl/event/RenderContextImpl.java +++ b/common/src/main/java/dev/engine_room/flywheel/impl/event/RenderContextImpl.java @@ -4,18 +4,18 @@ import org.joml.Matrix4fc; import dev.engine_room.flywheel.api.backend.RenderContext; -import net.minecraft.client.Camera; import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.client.renderer.LevelRenderer; import net.minecraft.client.renderer.RenderBuffers; +import net.minecraft.client.renderer.state.level.CameraRenderState; public record RenderContextImpl(LevelRenderer renderer, ClientLevel level, RenderBuffers buffers, Matrix4fc modelView, - Matrix4fc projection, Matrix4fc viewProjection, Camera camera, + Matrix4fc projection, Matrix4fc viewProjection, CameraRenderState cameraRenderState, float partialTick) implements RenderContext { - public static RenderContextImpl create(LevelRenderer renderer, ClientLevel level, RenderBuffers buffers, Matrix4fc modelView, Matrix4f projection, Camera camera, float partialTick) { + public static RenderContextImpl create(LevelRenderer renderer, ClientLevel level, RenderBuffers buffers, Matrix4fc modelView, Matrix4fc projection, CameraRenderState cameraRenderState, float partialTick) { Matrix4f viewProjection = new Matrix4f(projection); viewProjection.mul(modelView); - return new RenderContextImpl(renderer, level, buffers, modelView, projection, viewProjection, camera, partialTick); + return new RenderContextImpl(renderer, level, buffers, modelView, projection, viewProjection, cameraRenderState, partialTick); } } diff --git a/common/src/main/java/dev/engine_room/flywheel/impl/mixin/LevelRendererMixin.java b/common/src/main/java/dev/engine_room/flywheel/impl/mixin/LevelRendererMixin.java index 181f62777..e3e5b9741 100644 --- a/common/src/main/java/dev/engine_room/flywheel/impl/mixin/LevelRendererMixin.java +++ b/common/src/main/java/dev/engine_room/flywheel/impl/mixin/LevelRendererMixin.java @@ -3,7 +3,7 @@ import java.util.Iterator; import java.util.SortedSet; -import org.joml.Matrix4f; +import org.joml.Matrix4fc; import org.joml.Vector4f; import org.jspecify.annotations.Nullable; import org.spongepowered.asm.mixin.Final; @@ -24,11 +24,12 @@ import dev.engine_room.flywheel.impl.event.RenderContextImpl; import dev.engine_room.flywheel.lib.visualization.VisualizationHelper; import it.unimi.dsi.fastutil.longs.Long2ObjectMap; -import net.minecraft.client.Camera; import net.minecraft.client.DeltaTracker; import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.client.renderer.LevelRenderer; import net.minecraft.client.renderer.RenderBuffers; +import net.minecraft.client.renderer.chunk.ChunkSectionsToRender; +import net.minecraft.client.renderer.state.level.CameraRenderState; import net.minecraft.server.level.BlockDestructionProgress; import net.minecraft.world.entity.Entity; @@ -50,10 +51,9 @@ abstract class LevelRendererMixin { @Nullable private RenderContextImpl flywheel$renderContext; - // @Inject(method = "renderLevel", at = @At("HEAD")) - @Inject(method = "renderLevel", at = @At(value = "INVOKE_ASSIGN", target = "Lnet/minecraft/world/level/lighting/LevelLightEngine;runLightUpdates()I")) - private void flywheel$beginRender(GraphicsResourceAllocator resourceAllocator, DeltaTracker deltaTracker, boolean renderOutline, Camera camera, Matrix4f modelViewMatrix, Matrix4f projectionMatrix, Matrix4f cullingProjectionMatrix, GpuBufferSlice shaderFog, Vector4f fogColor, boolean renderSky, CallbackInfo ci) { - flywheel$renderContext = RenderContextImpl.create((LevelRenderer) (Object) this, level, renderBuffers, modelViewMatrix, projectionMatrix, camera, deltaTracker.getGameTimeDeltaPartialTick(false)); + @Inject(method = "renderLevel", at = @At("HEAD")) + private void flywheel$beginRender(GraphicsResourceAllocator resourceAllocator, DeltaTracker deltaTracker, boolean renderOutline, CameraRenderState cameraState, Matrix4fc modelViewMatrix, GpuBufferSlice terrainFog, Vector4f fogColor, boolean shouldRenderSky, ChunkSectionsToRender chunkSectionsToRender, CallbackInfo ci) { + flywheel$renderContext = RenderContextImpl.create((LevelRenderer) (Object) this, level, renderBuffers, modelViewMatrix, cameraState.projectionMatrix, cameraState, deltaTracker.getGameTimeDeltaPartialTick(false)); VisualizationManager manager = VisualizationManager.get(level); if (manager != null) { @@ -73,7 +73,7 @@ abstract class LevelRendererMixin { } } - @Inject(method = "method_62214", at = @At(value = "INVOKE_STRING", target = "Lnet/minecraft/util/profiling/ProfilerFiller;popPush(Ljava/lang/String;)V", args = "ldc=submitBlockEntities")) + @Inject(method = "lambda$addMainPass$0", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/LevelRenderer;submitBlockEntities(Lcom/mojang/blaze3d/vertex/PoseStack;Lnet/minecraft/client/renderer/state/level/LevelRenderState;Lnet/minecraft/client/renderer/SubmitNodeStorage;)V")) private void flywheel$beforeBlockEntities(CallbackInfo ci) { if (flywheel$renderContext != null) { VisualizationManager manager = VisualizationManager.get(level); @@ -83,7 +83,7 @@ abstract class LevelRendererMixin { } } - @Inject(method = "method_62214", at = @At(value = "INVOKE_STRING", target = "Lnet/minecraft/util/profiling/ProfilerFiller;push(Ljava/lang/String;)V", args = "ldc=destroyProgress")) + @Inject(method = "lambda$addMainPass$0", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/LevelRenderer;submitBlockDestroyAnimation(Lcom/mojang/blaze3d/vertex/PoseStack;Lnet/minecraft/client/renderer/SubmitNodeCollector;Lnet/minecraft/client/renderer/state/level/LevelRenderState;)V")) private void flywheel$beforeRenderCrumbling(CallbackInfo ci) { if (flywheel$renderContext != null) { VisualizationManager manager = VisualizationManager.get(level); diff --git a/common/src/main/java/dev/engine_room/flywheel/impl/visual/DynamicVisualContextImpl.java b/common/src/main/java/dev/engine_room/flywheel/impl/visual/DynamicVisualContextImpl.java index 09803bdae..fe9f13162 100644 --- a/common/src/main/java/dev/engine_room/flywheel/impl/visual/DynamicVisualContextImpl.java +++ b/common/src/main/java/dev/engine_room/flywheel/impl/visual/DynamicVisualContextImpl.java @@ -4,8 +4,8 @@ import dev.engine_room.flywheel.api.visual.DistanceUpdateLimiter; import dev.engine_room.flywheel.api.visual.DynamicVisual; -import net.minecraft.client.Camera; +import net.minecraft.client.renderer.state.level.CameraRenderState; -public record DynamicVisualContextImpl(Camera camera, FrustumIntersection frustum, float partialTick, - DistanceUpdateLimiter limiter) implements DynamicVisual.Context { +public record DynamicVisualContextImpl(CameraRenderState cameraRenderState, FrustumIntersection frustum, float partialTick, + DistanceUpdateLimiter limiter) implements DynamicVisual.Context { } diff --git a/common/src/main/java/dev/engine_room/flywheel/impl/visualization/VisualizationManagerImpl.java b/common/src/main/java/dev/engine_room/flywheel/impl/visualization/VisualizationManagerImpl.java index 4c1002672..6a9deff15 100644 --- a/common/src/main/java/dev/engine_room/flywheel/impl/visualization/VisualizationManagerImpl.java +++ b/common/src/main/java/dev/engine_room/flywheel/impl/visualization/VisualizationManagerImpl.java @@ -112,7 +112,7 @@ private LateInit(LevelAccessor level) { var update = MapContextPlan.map(this::createVisualFrameContext) .to(NestedPlan.of(blockEntities.framePlan(visualizationContext), entities.framePlan(visualizationContext), effects.framePlan(visualizationContext))); - framePlan = IfElsePlan.on((RenderContext ctx) -> engine.updateRenderOrigin(ctx.camera())) + framePlan = IfElsePlan.on((RenderContext ctx) -> engine.updateRenderOrigin(ctx.cameraRenderState())) .ifTrue(recreate) .ifFalse(update) .plan() @@ -134,14 +134,14 @@ private LateInit(LevelAccessor level) { private DynamicVisual.Context createVisualFrameContext(RenderContext ctx) { Vec3i renderOrigin = engine.renderOrigin(); - var cameraPos = ctx.camera() - .position(); + var cameraPos = ctx.cameraRenderState() + .pos; Matrix4f viewProjection = new Matrix4f(ctx.viewProjection()); viewProjection.translate((float) (renderOrigin.getX() - cameraPos.x), (float) (renderOrigin.getY() - cameraPos.y), (float) (renderOrigin.getZ() - cameraPos.z)); FrustumIntersection frustum = new FrustumIntersection(viewProjection); - return new DynamicVisualContextImpl(ctx.camera(), frustum, ctx.partialTick(), frameLimiter); + return new DynamicVisualContextImpl(ctx.cameraRenderState(), frustum, ctx.partialTick(), frameLimiter); } } diff --git a/common/src/main/resources/flywheel.impl.mixins.json b/common/src/main/resources/flywheel.impl.mixins.json index 08aa19656..439a42f3a 100644 --- a/common/src/main/resources/flywheel.impl.mixins.json +++ b/common/src/main/resources/flywheel.impl.mixins.json @@ -1,10 +1,10 @@ { - "required": true, - "minVersion": "0.8", - "package": "dev.engine_room.flywheel.impl.mixin", - "compatibilityLevel": "JAVA_21", - "refmap": "flywheel.refmap.json", - "client": [ + "required" : true, + "minVersion" : "0.8", + "package" : "dev.engine_room.flywheel.impl.mixin", + "compatibilityLevel" : "JAVA_21", + "refmap" : "flywheel.refmap.json", + "client" : [ "BlockEntityTypeMixin", "ClientChunkCacheMixin", "EntityRendererAccessor", @@ -20,7 +20,7 @@ "visualmanage.LevelRendererMixin", "visualmanage.SectionCompilerMixin" ], - "injectors": { - "defaultRequire": 1 + "injectors" : { + "defaultRequire" : 1 } } diff --git a/common/src/vanillin/java/dev/engine_room/vanillin/elements/FireElement.java b/common/src/vanillin/java/dev/engine_room/vanillin/elements/FireElement.java index 1c6f0a49c..5c6b29085 100644 --- a/common/src/vanillin/java/dev/engine_room/vanillin/elements/FireElement.java +++ b/common/src/vanillin/java/dev/engine_room/vanillin/elements/FireElement.java @@ -22,9 +22,10 @@ import dev.engine_room.flywheel.lib.visual.SimpleDynamicVisual; import dev.engine_room.flywheel.lib.visual.util.SmartRecycler; import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.LightTexture; import net.minecraft.client.renderer.texture.TextureAtlasSprite; import net.minecraft.client.resources.model.ModelBakery; +import net.minecraft.client.resources.model.sprite.SpriteId; +import net.minecraft.util.LightCoordsUtil; import net.minecraft.util.Mth; import net.minecraft.world.entity.Entity; @@ -39,7 +40,7 @@ public final class FireElement extends AbstractVisual implements SimpleDynamicVi // Parameterize by the material instead of the sprite // because Material#sprite is a surprisingly heavy operation // and because sprites are invalidated after a resource reload. - private static final RendererReloadCache FIRE_MODELS = new RendererReloadCache<>(texture -> { + private static final RendererReloadCache FIRE_MODELS = new RendererReloadCache<>(texture -> { TextureAtlasSprite sprite = Minecraft.getInstance().getAtlasManager().get(texture); return new SingleMeshModel(new FireMesh(sprite), FIRE_MATERIAL); }); @@ -61,7 +62,7 @@ private TransformedInstance createInstance(Model model) { TransformedInstance instance = visualizationContext.instancerProvider() .instancer(InstanceTypes.TRANSFORMED, model) .createInstance(); - instance.light(LightTexture.FULL_BLOCK); + instance.light(LightCoordsUtil.pack(15, 0)); instance.setChanged(); return instance; } @@ -98,8 +99,8 @@ private void setupInstances(DynamicVisual.Context context) { stack.setIdentity(); stack.translate(entityX - renderOrigin.getX(), entityY - renderOrigin.getY(), entityZ - renderOrigin.getZ()); stack.scale(scale, scale, scale); - stack.mulPose(Axis.YP.rotationDegrees(-context.camera() - .yRot())); + stack.mulPose(Axis.YP.rotationDegrees(-context.cameraRenderState() + .yRot)); stack.translate(0.0F, 0.0F, -0.3F + (float) ((int) maxHeight) * 0.02F); for (int i = 0; y < maxHeight; ++i) { @@ -159,7 +160,7 @@ private static void writeVertex(MutableVertexList vertexList, int i, float x, fl vertexList.b(i, 1); vertexList.u(i, u); vertexList.v(i, v); - vertexList.light(i, LightTexture.FULL_BLOCK); + vertexList.light(i, LightCoordsUtil.pack(15, 0)); vertexList.normalX(i, 0); vertexList.normalY(i, 1); vertexList.normalZ(i, 0); diff --git a/common/src/vanillin/java/dev/engine_room/vanillin/elements/HitboxElement.java b/common/src/vanillin/java/dev/engine_room/vanillin/elements/HitboxElement.java index 6e024ad80..c83addedd 100644 --- a/common/src/vanillin/java/dev/engine_room/vanillin/elements/HitboxElement.java +++ b/common/src/vanillin/java/dev/engine_room/vanillin/elements/HitboxElement.java @@ -13,7 +13,7 @@ import dev.engine_room.flywheel.lib.visual.util.SmartRecycler; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.components.debug.DebugScreenEntries; -import net.minecraft.client.renderer.LightTexture; +import net.minecraft.util.LightCoordsUtil; import net.minecraft.util.Mth; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.LivingEntity; @@ -77,7 +77,7 @@ private TransformedInstance createInstance(Model model) { TransformedInstance instance = context.instancerProvider() .instancer(InstanceTypes.TRANSFORMED, model) .createInstance(); - instance.light(LightTexture.FULL_BLOCK); + instance.light(LightCoordsUtil.pack(15, 0)); instance.setChanged(); return instance; } diff --git a/common/src/vanillin/java/dev/engine_room/vanillin/elements/ShadowElement.java b/common/src/vanillin/java/dev/engine_room/vanillin/elements/ShadowElement.java index 5c6c8aa1d..9bf9fafbb 100644 --- a/common/src/vanillin/java/dev/engine_room/vanillin/elements/ShadowElement.java +++ b/common/src/vanillin/java/dev/engine_room/vanillin/elements/ShadowElement.java @@ -1,8 +1,8 @@ package dev.engine_room.vanillin.elements; -import org.jspecify.annotations.Nullable; import org.joml.Vector4f; import org.joml.Vector4fc; +import org.jspecify.annotations.Nullable; import dev.engine_room.flywheel.api.material.Material; import dev.engine_room.flywheel.api.material.Transparency; @@ -20,12 +20,13 @@ import dev.engine_room.flywheel.lib.visual.SimpleDynamicVisual; import dev.engine_room.flywheel.lib.visual.util.InstanceRecycler; import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.LightTexture; +import net.minecraft.client.renderer.Lightmap; import net.minecraft.client.renderer.texture.OverlayTexture; import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.core.Direction.Axis; import net.minecraft.resources.Identifier; +import net.minecraft.util.LightCoordsUtil; import net.minecraft.util.Mth; import net.minecraft.world.entity.Entity; import net.minecraft.world.level.block.RenderShape; @@ -157,7 +158,7 @@ private void setupInstance(ChunkAccess chunk, MutableBlockPos pos, double entity // Too dark to render. return; } - float blockBrightness = LightTexture.getBrightness(level.dimensionType(), maxLocalRawBrightness); + float blockBrightness = Lightmap.getBrightness(level.dimensionType(), maxLocalRawBrightness); float alpha = strength * 0.5F * blockBrightness; if (alpha < 0.0F) { // Too far away/too weak to render. @@ -261,7 +262,7 @@ private static void writeVertex(MutableVertexList vertexList, int i, float x, fl vertexList.b(i, 1); vertexList.u(i, 0); vertexList.v(i, 0); - vertexList.light(i, LightTexture.FULL_BRIGHT); + vertexList.light(i, LightCoordsUtil.FULL_BRIGHT); vertexList.overlay(i, OverlayTexture.NO_OVERLAY); vertexList.normalX(i, 0); vertexList.normalY(i, 1); diff --git a/common/src/vanillin/java/dev/engine_room/vanillin/visuals/BlockDisplayVisual.java b/common/src/vanillin/java/dev/engine_room/vanillin/visuals/BlockDisplayVisual.java index 331291b00..a0d3ee995 100644 --- a/common/src/vanillin/java/dev/engine_room/vanillin/visuals/BlockDisplayVisual.java +++ b/common/src/vanillin/java/dev/engine_room/vanillin/visuals/BlockDisplayVisual.java @@ -9,7 +9,7 @@ import dev.engine_room.flywheel.lib.visual.AbstractEntityVisual; import dev.engine_room.flywheel.lib.visual.SimpleDynamicVisual; import dev.engine_room.flywheel.lib.visual.component.ShadowComponent; -import net.minecraft.client.Camera; +import net.minecraft.client.renderer.state.level.CameraRenderState; import net.minecraft.util.Mth; import net.minecraft.world.entity.Display; import net.minecraft.world.entity.Entity; @@ -84,7 +84,7 @@ public void beginFrame(Context ctx) { .translate((float) (pos.x - renderOrigin.getX()), (float) (pos.y - renderOrigin.getY()), (float) (pos.z - renderOrigin.getZ())); float partialTick = ctx.partialTick(); - Camera camera = ctx.camera(); + CameraRenderState camera = ctx.cameraRenderState(); switch (renderState.billboardConstraints()) { case FIXED: instance.pose.rotateYXZ(-0.017453292F * entityYRot(entity, partialTick), ((float) Math.PI / 180F) * entityXRot(entity, partialTick), 0.0F); @@ -106,12 +106,12 @@ public void beginFrame(Context ctx) { .setChanged(); } - private static float cameraYrot(Camera camera) { - return camera.yRot() - 180.0F; + private static float cameraYrot(CameraRenderState camera) { + return camera.yRot - 180.0F; } - private static float cameraXRot(Camera camera) { - return -camera.xRot(); + private static float cameraXRot(CameraRenderState camera) { + return -camera.xRot; } private static float entityYRot(Entity entity, float partialTick) { diff --git a/common/src/vanillin/java/dev/engine_room/vanillin/visuals/ChestVisual.java b/common/src/vanillin/java/dev/engine_room/vanillin/visuals/ChestVisual.java index 623377193..e07e69e06 100644 --- a/common/src/vanillin/java/dev/engine_room/vanillin/visuals/ChestVisual.java +++ b/common/src/vanillin/java/dev/engine_room/vanillin/visuals/ChestVisual.java @@ -24,11 +24,12 @@ import net.minecraft.client.model.geom.ModelLayerLocation; import net.minecraft.client.model.geom.ModelLayers; import net.minecraft.client.renderer.LevelRenderer; -import net.minecraft.client.renderer.LightTexture; import net.minecraft.client.renderer.Sheets; import net.minecraft.client.renderer.blockentity.ChestRenderer; +import net.minecraft.client.resources.model.sprite.SpriteId; import net.minecraft.core.BlockPos; import net.minecraft.core.SectionPos; +import net.minecraft.util.LightCoordsUtil; import net.minecraft.util.Mth; import net.minecraft.world.level.block.AbstractChestBlock; import net.minecraft.world.level.block.Block; @@ -77,7 +78,7 @@ public ChestVisual(VisualizationContext ctx, T blockEntity, float partialTick) { ChestType chestType = blockState.hasProperty(ChestBlock.TYPE) ? blockState.getValue(ChestBlock.TYPE) : ChestType.SINGLE; // TODO 1.21.11: should we be using unchecked casts here? ChestRenderer renderer = (ChestRenderer) Minecraft.getInstance().getBlockEntityRenderDispatcher().getRenderer(blockEntity); - net.minecraft.client.resources.model.Material texture = Sheets.chooseMaterial( + SpriteId texture = Sheets.chooseSprite( ((ChestRendererAccessor) renderer).flywheel$getChestMaterial(blockEntity, ChestRenderer.xmasTextures()), chestType ); @@ -201,23 +202,23 @@ public LongSet acceptNone() { private class BrightnessCombiner implements DoubleBlockCombiner.Combiner { @Override public Integer acceptDouble(BlockEntity first, BlockEntity second) { - int firstLight = LevelRenderer.getLightColor(first.getLevel(), first.getBlockPos()); - int secondLight = LevelRenderer.getLightColor(second.getLevel(), second.getBlockPos()); - int firstBlockLight = LightTexture.block(firstLight); - int secondBlockLight = LightTexture.block(secondLight); - int firstSkyLight = LightTexture.sky(firstLight); - int secondSkyLight = LightTexture.sky(secondLight); - return LightTexture.pack(Math.max(firstBlockLight, secondBlockLight), Math.max(firstSkyLight, secondSkyLight)); + int firstLight = LevelRenderer.getLightCoords(first.getLevel(), first.getBlockPos()); + int secondLight = LevelRenderer.getLightCoords(second.getLevel(), second.getBlockPos()); + int firstBlockLight = LightCoordsUtil.block(firstLight); + int secondBlockLight = LightCoordsUtil.block(secondLight); + int firstSkyLight = LightCoordsUtil.sky(firstLight); + int secondSkyLight = LightCoordsUtil.sky(secondLight); + return LightCoordsUtil.pack(Math.max(firstBlockLight, secondBlockLight), Math.max(firstSkyLight, secondSkyLight)); } @Override public Integer acceptSingle(BlockEntity single) { - return LevelRenderer.getLightColor(single.getLevel(), single.getBlockPos()); + return LevelRenderer.getLightCoords(single.getLevel(), single.getBlockPos()); } @Override public Integer acceptNone() { - return LevelRenderer.getLightColor(level, pos); + return LevelRenderer.getLightCoords(level, pos); } } } diff --git a/common/src/vanillin/java/dev/engine_room/vanillin/visuals/ShulkerBoxVisual.java b/common/src/vanillin/java/dev/engine_room/vanillin/visuals/ShulkerBoxVisual.java index 0080041a1..a957982a3 100644 --- a/common/src/vanillin/java/dev/engine_room/vanillin/visuals/ShulkerBoxVisual.java +++ b/common/src/vanillin/java/dev/engine_room/vanillin/visuals/ShulkerBoxVisual.java @@ -16,6 +16,7 @@ import dev.engine_room.flywheel.lib.visual.SimpleDynamicVisual; import net.minecraft.client.model.geom.ModelLayers; import net.minecraft.client.renderer.Sheets; +import net.minecraft.client.resources.model.sprite.SpriteId; import net.minecraft.core.Direction; import net.minecraft.util.Mth; import net.minecraft.world.item.DyeColor; @@ -42,7 +43,7 @@ public ShulkerBoxVisual(VisualizationContext ctx, ShulkerBoxBlockEntity blockEnt super(ctx, blockEntity, partialTick); DyeColor color = blockEntity.getColor(); - net.minecraft.client.resources.model.Material texture; + SpriteId texture; if (color == null) { texture = Sheets.DEFAULT_SHULKER_TEXTURE_LOCATION; } else { diff --git a/fabric/build.gradle.kts b/fabric/build.gradle.kts index bd401a657..01e37f12f 100644 --- a/fabric/build.gradle.kts +++ b/fabric/build.gradle.kts @@ -2,7 +2,7 @@ plugins { idea java `maven-publish` - id("dev.architectury.loom") + alias(libs.plugins.loom) id("flywheel.subproject") id("flywheel.platform") } @@ -68,7 +68,7 @@ platform { setupTestMod(testMod) } -var flywheelVersion = "${property("flywheel_version")}+${property("minecraft_version")}" +var flywheelVersion = "${property("flywheel_version")}+${libs.versions.minecraft.get()}" if (subproject.buildNumber != null) { flywheelVersion += ".build.${subproject.buildNumber}" @@ -95,23 +95,21 @@ tasks.withType().configureEach { } } +loom { + accessWidenerPath = file("src/main/resources/flywheel.accesswidener") +} + jarSets { - mainSet.publishWithRemappedSources { + mainSet.publishWithRawSources { artifactId = "flywheel-fabric-${property("artifact_minecraft_version")}" } mainSet.outgoing("flywheel") create("api", api, lib).apply { addToAssemble() - publishWithRemappedSources { + publishWithRawSources { artifactId = "flywheel-fabric-api-${property("artifact_minecraft_version")}" } - - configureJar { - manifest { - attributes("Fabric-Loom-Remap" to "true") - } - } } } @@ -119,24 +117,13 @@ defaultPackageInfos { sources(api, lib, backend, main) } -loom { - mixin { - useLegacyMixinAp = true - add(main, "flywheel.refmap.json") - add(backend, "backend-flywheel.refmap.json") - } -} - -repositories { - maven("https://maven.caffeinemc.net/releases/") -} - dependencies { - modImplementation("net.fabricmc:fabric-loader:${property("fabric_loader_version")}") - modApi("net.fabricmc.fabric-api:fabric-api:${property("fabric_api_version")}") + minecraft(libs.minecraft) + implementation(libs.fabric.loader) + api(libs.fabric.api) - modCompileOnly("net.caffeinemc:sodium-fabric-api:${property("sodium_version")}") - modCompileOnly("maven.modrinth:iris:${property("iris_version")}-fabric") + compileOnly(libs.sodium.fabric.api) + compileOnly("maven.modrinth:iris:${libs.versions.iris.get()}-fabric") "forApi"(project(path = common, configuration = "apiClasses")) "forLib"(project(path = common, configuration = "libClasses")) diff --git a/fabric/gradle.properties b/fabric/gradle.properties deleted file mode 100644 index 6c5947614..000000000 --- a/fabric/gradle.properties +++ /dev/null @@ -1 +0,0 @@ -loom.platform = fabric diff --git a/fabric/src/lib/java/dev/engine_room/flywheel/lib/model/baked/BlockStateModelBufferer.java b/fabric/src/lib/java/dev/engine_room/flywheel/lib/model/baked/BlockStateModelBufferer.java index ca9b2c160..715911977 100644 --- a/fabric/src/lib/java/dev/engine_room/flywheel/lib/model/baked/BlockStateModelBufferer.java +++ b/fabric/src/lib/java/dev/engine_room/flywheel/lib/model/baked/BlockStateModelBufferer.java @@ -9,14 +9,12 @@ import dev.engine_room.flywheel.lib.model.SimpleModel; import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.ItemBlockRenderTypes; -import net.minecraft.client.renderer.block.BlockRenderDispatcher; +import net.minecraft.client.renderer.block.BlockAndTintGetter; +import net.minecraft.client.renderer.block.BlockModelLighter; +import net.minecraft.client.renderer.block.FluidRenderer; import net.minecraft.client.renderer.block.ModelBlockRenderer; -import net.minecraft.client.renderer.block.model.BlockStateModel; -import net.minecraft.client.renderer.chunk.ChunkSectionLayer; -import net.minecraft.client.renderer.texture.OverlayTexture; +import net.minecraft.client.renderer.block.dispatch.BlockStateModel; import net.minecraft.core.BlockPos; -import net.minecraft.world.level.BlockAndTintGetter; import net.minecraft.world.level.block.RenderShape; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.material.FluidState; @@ -32,23 +30,25 @@ public static SimpleModel bufferModel(BlockStateModel model, BlockPos pos, Block if (poseStack == null) { poseStack = objects.identityPoseStack; } + PoseStack finalPoseStack = poseStack; FabricMeshEmitterManager emitters = objects.emitters; + ModelBlockRenderer blockRenderer = new ModelBlockRenderer(Minecraft.getInstance().gameRenderer.getGameRenderState().optionsRenderState.ambientOcclusion, true, Minecraft.getInstance().getBlockColors()); emitters.prepare(blockMaterialFunction); long seed = state.getSeed(pos); // See ModelBlockRenderer#tesselateBlock - boolean useAo = Minecraft.useAmbientOcclusion(); + boolean useAo = Minecraft.getInstance().gameRenderer.getGameRenderState().optionsRenderState.ambientOcclusion; boolean defaultAo = useAo && state.getLightEmission() == 0; model = emitters.prepareForModel(model, useAo, defaultAo); - poseStack.pushPose(); - Minecraft.getInstance() - .getBlockRenderer() - .getModelRenderer() - .render(level, model, state, pos, poseStack, emitters, false, seed, OverlayTexture.NO_OVERLAY); - poseStack.popPose(); + blockRenderer.tesselateBlock((x, y, z, quad, instance) -> { + finalPoseStack.pushPose(); + finalPoseStack.translate(x, y, z); + emitters.getEmitter(quad.materialInfo().layer()).putBakedQuad(finalPoseStack.last(), quad, instance); + finalPoseStack.popPose(); + }, 0, 0, 0, level, pos, state, model, seed); return emitters.end(); } @@ -58,17 +58,18 @@ public static SimpleModel bufferBlocks(Iterator posIterator, BlockAndT if (poseStack == null) { poseStack = objects.identityPoseStack; } + PoseStack finalPoseStack = poseStack; + FabricMeshEmitterManager emitters = objects.emitters; TransformingVertexConsumer transformingWrapper = objects.transformingWrapper; emitters.prepare(blockMaterialFunction); - BlockRenderDispatcher renderDispatcher = Minecraft.getInstance() - .getBlockRenderer(); - ModelBlockRenderer blockRenderer = renderDispatcher.getModelRenderer(); - ModelBlockRenderer.enableCaching(); + ModelBlockRenderer blockRenderer = new ModelBlockRenderer(Minecraft.getInstance().gameRenderer.getGameRenderState().optionsRenderState.ambientOcclusion, true, Minecraft.getInstance().getBlockColors()); + FluidRenderer fluidRenderer = new FluidRenderer(Minecraft.getInstance().getModelManager().getFluidStateModelSet()); + BlockModelLighter.enableCaching(); - boolean useAo = Minecraft.useAmbientOcclusion(); + boolean useAo = Minecraft.getInstance().gameRenderer.getGameRenderState().optionsRenderState.ambientOcclusion; while (posIterator.hasNext()) { BlockPos pos = posIterator.next(); @@ -80,37 +81,40 @@ public static SimpleModel bufferBlocks(Iterator posIterator, BlockAndT FluidState fluidState = state.getFluidState(); if (!fluidState.isEmpty()) { - ChunkSectionLayer layer = ItemBlockRenderTypes.getRenderLayer(fluidState); - - BufferBuilder bufferBuilder = emitters.getEmitter(layer).getBuffer(true, false); - - if (bufferBuilder != null) { - transformingWrapper.prepare(bufferBuilder, poseStack); - - poseStack.pushPose(); - poseStack.translate(pos.getX() - (pos.getX() & 0xF), pos.getY() - (pos.getY() & 0xF), pos.getZ() - (pos.getZ() & 0xF)); - renderDispatcher.renderLiquid(pos, level, transformingWrapper, state, fluidState); - poseStack.popPose(); - } + poseStack.pushPose(); + poseStack.translate(pos.getX() - (pos.getX() & 0xF), pos.getY() - (pos.getY() & 0xF), pos.getZ() - (pos.getZ() & 0xF)); + fluidRenderer.tesselate(level, pos, layer -> { + BufferBuilder builder = emitters.getEmitter(layer).getBuffer(true, false); + + if (builder != null) { + transformingWrapper.prepare(builder, finalPoseStack); + return transformingWrapper; + } + + return EmptyVertexConsumer.INSTANCE; + }, state, fluidState); + poseStack.popPose(); } } if (state.getRenderShape() == RenderShape.MODEL) { long seed = state.getSeed(pos); - BlockStateModel model = renderDispatcher.getBlockModel(state); + BlockStateModel model = Minecraft.getInstance().getModelManager().getBlockStateModelSet().get(state); // See ModelBlockRenderer#tesselateBlock boolean defaultAo = useAo && state.getLightEmission() == 0; model = emitters.prepareForModel(model, useAo, defaultAo); - poseStack.pushPose(); - poseStack.translate(pos.getX(), pos.getY(), pos.getZ()); - blockRenderer.render(level, model, state, pos, poseStack, emitters, true, seed, OverlayTexture.NO_OVERLAY); - poseStack.popPose(); + blockRenderer.tesselateBlock((x, y, z, quad, instance) -> { + finalPoseStack.pushPose(); + finalPoseStack.translate(x, y, z); + emitters.getEmitter(quad.materialInfo().layer()).putBakedQuad(finalPoseStack.last(), quad, instance); + finalPoseStack.popPose(); + }, pos.getX(), pos.getY(), pos.getZ(), level, pos, state, model, seed); } } - ModelBlockRenderer.clearCache(); + BlockModelLighter.clearCache(); transformingWrapper.clear(); return emitters.end(); } diff --git a/fabric/src/lib/java/dev/engine_room/flywheel/lib/model/baked/FabricMeshEmitter.java b/fabric/src/lib/java/dev/engine_room/flywheel/lib/model/baked/FabricMeshEmitter.java index 65cd066d2..1f536dcb0 100644 --- a/fabric/src/lib/java/dev/engine_room/flywheel/lib/model/baked/FabricMeshEmitter.java +++ b/fabric/src/lib/java/dev/engine_room/flywheel/lib/model/baked/FabricMeshEmitter.java @@ -2,10 +2,11 @@ import com.mojang.blaze3d.vertex.BufferBuilder; import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.QuadInstance; import com.mojang.blaze3d.vertex.VertexConsumer; -import net.minecraft.client.renderer.block.model.BakedQuad; import net.minecraft.client.renderer.chunk.ChunkSectionLayer; +import net.minecraft.client.resources.model.geometry.BakedQuad; class FabricMeshEmitter extends MeshEmitter { private boolean shade; @@ -101,18 +102,18 @@ public void addVertex(float x, float y, float z, int color, float u, float v, in } @Override - public void putBulkData(PoseStack.Pose pose, BakedQuad quad, float red, float green, float blue, float alpha, int packedLight, int packedOverlay) { + public void putBakedQuad(PoseStack.Pose pose, BakedQuad quad, QuadInstance instance) { BufferBuilder bufferBuilder = getBuffer(shade, ao); if (bufferBuilder != null) { - bufferBuilder.putBulkData(pose, quad, red, green, blue, alpha, packedLight, packedOverlay); + bufferBuilder.putBakedQuad(pose, quad, instance); } } @Override - public void putBulkData(PoseStack.Pose pose, BakedQuad quad, float[] brightness, float red, float green, float blue, float alpha, int[] lightmap, int packedOverlay) { + public void putBlockBakedQuad(float x, float y, float z, BakedQuad quad, QuadInstance instance) { BufferBuilder bufferBuilder = getBuffer(shade, ao); if (bufferBuilder != null) { - bufferBuilder.putBulkData(pose, quad, brightness, red, green, blue, alpha, lightmap, packedOverlay); + bufferBuilder.putBlockBakedQuad(x, y, z, quad, instance); } } } diff --git a/fabric/src/lib/java/dev/engine_room/flywheel/lib/model/baked/FabricMeshEmitterManager.java b/fabric/src/lib/java/dev/engine_room/flywheel/lib/model/baked/FabricMeshEmitterManager.java index 450096445..b73e65014 100644 --- a/fabric/src/lib/java/dev/engine_room/flywheel/lib/model/baked/FabricMeshEmitterManager.java +++ b/fabric/src/lib/java/dev/engine_room/flywheel/lib/model/baked/FabricMeshEmitterManager.java @@ -6,20 +6,18 @@ import dev.engine_room.flywheel.lib.model.SimpleModel; import net.fabricmc.fabric.api.client.model.loading.v1.wrapper.WrapperBlockStateModel; -import net.fabricmc.fabric.api.renderer.v1.mesh.QuadEmitter; -import net.fabricmc.fabric.api.renderer.v1.mesh.QuadTransform; -import net.fabricmc.fabric.api.renderer.v1.mesh.QuadView; -import net.fabricmc.fabric.api.renderer.v1.render.BlockVertexConsumerProvider; +import net.fabricmc.fabric.api.client.renderer.v1.mesh.QuadEmitter; +import net.fabricmc.fabric.api.client.renderer.v1.mesh.QuadTransform; +import net.fabricmc.fabric.api.client.renderer.v1.mesh.QuadView; import net.fabricmc.fabric.api.util.TriState; -import net.minecraft.client.renderer.block.model.BlockStateModel; -import net.minecraft.client.renderer.chunk.ChunkSectionLayer; +import net.minecraft.client.renderer.block.BlockAndTintGetter; +import net.minecraft.client.renderer.block.dispatch.BlockStateModel; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.util.RandomSource; -import net.minecraft.world.level.BlockAndTintGetter; import net.minecraft.world.level.block.state.BlockState; -class FabricMeshEmitterManager extends MeshEmitterManager implements BlockVertexConsumerProvider { +class FabricMeshEmitterManager extends MeshEmitterManager { private final WrapperModel wrapperModel = new WrapperModel(); private boolean useAo; @@ -52,11 +50,6 @@ private void prepareForGeometry(QuadView quad) { } } - @Override - public FabricMeshEmitter getBuffer(ChunkSectionLayer layer) { - return getEmitter(layer); - } - private class WrapperModel extends WrapperBlockStateModel { private final QuadTransform quadTransform = quad -> { FabricMeshEmitterManager.this.prepareForGeometry(quad); diff --git a/fabric/src/lib/java/dev/engine_room/flywheel/lib/model/baked/FabricPartialModel.java b/fabric/src/lib/java/dev/engine_room/flywheel/lib/model/baked/FabricPartialModel.java index 292187d12..c97c43a1d 100644 --- a/fabric/src/lib/java/dev/engine_room/flywheel/lib/model/baked/FabricPartialModel.java +++ b/fabric/src/lib/java/dev/engine_room/flywheel/lib/model/baked/FabricPartialModel.java @@ -12,12 +12,12 @@ import net.fabricmc.fabric.api.client.model.loading.v1.ModelLoadingPlugin; import net.fabricmc.fabric.api.client.model.loading.v1.UnbakedExtraModel; import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.block.model.BlockStateModel; -import net.minecraft.client.renderer.block.model.SimpleModelWrapper; -import net.minecraft.client.renderer.block.model.SingleVariant; -import net.minecraft.client.resources.model.BlockModelRotation; +import net.minecraft.client.renderer.block.dispatch.BlockModelRotation; +import net.minecraft.client.renderer.block.dispatch.BlockStateModel; +import net.minecraft.client.renderer.block.dispatch.SingleVariant; import net.minecraft.client.resources.model.ModelBaker; import net.minecraft.client.resources.model.ModelManager; +import net.minecraft.client.resources.model.SimpleModelWrapper; import net.minecraft.resources.Identifier; import net.minecraft.server.packs.resources.ResourceManager; import net.minecraft.server.packs.resources.ResourceManagerReloadListener; diff --git a/fabric/src/main/java/dev/engine_room/flywheel/impl/FlwCommands.java b/fabric/src/main/java/dev/engine_room/flywheel/impl/FlwCommands.java index 37e9e37ff..4c8587f51 100644 --- a/fabric/src/main/java/dev/engine_room/flywheel/impl/FlwCommands.java +++ b/fabric/src/main/java/dev/engine_room/flywheel/impl/FlwCommands.java @@ -13,7 +13,7 @@ import dev.engine_room.flywheel.backend.compile.PipelineCompiler; import dev.engine_room.flywheel.backend.engine.uniform.DebugMode; import dev.engine_room.flywheel.backend.engine.uniform.FrameUniforms; -import net.fabricmc.fabric.api.client.command.v2.ClientCommandManager; +import net.fabricmc.fabric.api.client.command.v2.ClientCommands; import net.fabricmc.fabric.api.client.command.v2.FabricClientCommandSource; import net.minecraft.client.Minecraft; import net.minecraft.client.player.LocalPlayer; @@ -31,9 +31,9 @@ private FlwCommands() { } public static void registerClientCommands(CommandDispatcher dispatcher, CommandBuildContext buildContext) { - LiteralArgumentBuilder command = ClientCommandManager.literal("flywheel"); + LiteralArgumentBuilder command = ClientCommands.literal("flywheel"); - command.then(ClientCommandManager.literal("backend") + command.then(ClientCommands.literal("backend") .executes(context -> { Backend backend = BackendManager.currentBackend(); String idStr = Backend.REGISTRY.getIdOrThrow(backend) @@ -41,7 +41,7 @@ public static void registerClientCommands(CommandDispatcher { FabricFlwConfig.INSTANCE.backend = BackendManager.offBackend(); FabricFlwConfig.INSTANCE.useDefaultBackend = true; @@ -56,7 +56,7 @@ public static void registerClientCommands(CommandDispatcher { Backend requestedBackend = context.getArgument("id", Backend.class); FabricFlwConfig.INSTANCE.backend = requestedBackend; @@ -79,7 +79,7 @@ public static void registerClientCommands(CommandDispatcher { if (FabricFlwConfig.INSTANCE.limitUpdates) { context.getSource().sendFeedback(Component.translatable("command.flywheel.limit_updates.get.on")); @@ -88,7 +88,7 @@ public static void registerClientCommands(CommandDispatcher { FabricFlwConfig.INSTANCE.limitUpdates = true; FabricFlwConfig.INSTANCE.save(); @@ -96,7 +96,7 @@ public static void registerClientCommands(CommandDispatcher { FabricFlwConfig.INSTANCE.limitUpdates = false; FabricFlwConfig.INSTANCE.save(); @@ -105,8 +105,8 @@ public static void registerClientCommands(CommandDispatcher { var oldValue = FabricFlwConfig.INSTANCE.backendConfig.lightSmoothness; var newValue = context.getArgument("mode", LightSmoothness.class); @@ -125,11 +125,11 @@ public static void registerClientCommands(CommandDispatcher createDebugCommand() { - var debug = ClientCommandManager.literal("debug"); + var debug = ClientCommands.literal("debug"); - debug.then(ClientCommandManager.literal("crumbling") - .then(ClientCommandManager.argument("pos", BlockPosArgument.blockPos()) - .then(ClientCommandManager.argument("stage", IntegerArgumentType.integer(0, 9)) + debug.then(ClientCommands.literal("crumbling") + .then(ClientCommands.argument("pos", BlockPosArgument.blockPos()) + .then(ClientCommands.argument("stage", IntegerArgumentType.integer(0, 9)) .executes(context -> { Entity executor = context.getSource() .getEntity(); @@ -147,51 +147,51 @@ private static LiteralArgumentBuilder createDebugComm return Command.SINGLE_SUCCESS; })))); - debug.then(ClientCommandManager.literal("shader") - .then(ClientCommandManager.argument("mode", DebugModeArgument.INSTANCE) + debug.then(ClientCommands.literal("shader") + .then(ClientCommands.argument("mode", DebugModeArgument.INSTANCE) .executes(context -> { DebugMode mode = context.getArgument("mode", DebugMode.class); FrameUniforms.debugMode(mode); return Command.SINGLE_SUCCESS; }))); - debug.then(ClientCommandManager.literal("frustum") - .then(ClientCommandManager.literal("capture") + debug.then(ClientCommands.literal("frustum") + .then(ClientCommands.literal("capture") .executes(context -> { FrameUniforms.captureFrustum(); return Command.SINGLE_SUCCESS; })) - .then(ClientCommandManager.literal("unpause") + .then(ClientCommands.literal("unpause") .executes(context -> { FrameUniforms.unpauseFrustum(); return Command.SINGLE_SUCCESS; }))); - debug.then(ClientCommandManager.literal("lightSections") - .then(ClientCommandManager.literal("on") + debug.then(ClientCommands.literal("lightSections") + .then(ClientCommands.literal("on") .executes(context -> { BackendDebugFlags.LIGHT_STORAGE_VIEW = true; return Command.SINGLE_SUCCESS; })) - .then(ClientCommandManager.literal("off") + .then(ClientCommands.literal("off") .executes(context -> { BackendDebugFlags.LIGHT_STORAGE_VIEW = false; return Command.SINGLE_SUCCESS; }))); - debug.then(ClientCommandManager.literal("pauseUpdates") - .then(ClientCommandManager.literal("on") + debug.then(ClientCommands.literal("pauseUpdates") + .then(ClientCommands.literal("on") .executes(context -> { ImplDebugFlags.PAUSE_UPDATES = true; return Command.SINGLE_SUCCESS; })) - .then(ClientCommandManager.literal("off") + .then(ClientCommands.literal("off") .executes(context -> { ImplDebugFlags.PAUSE_UPDATES = false; return Command.SINGLE_SUCCESS; }))); - debug.then(ClientCommandManager.literal("info") + debug.then(ClientCommands.literal("info") .executes(context -> { context.getSource() .sendFeedback(FlwDebugInfo.getDebugCommandInfo()); diff --git a/fabric/src/main/java/dev/engine_room/flywheel/impl/FlywheelFabric.java b/fabric/src/main/java/dev/engine_room/flywheel/impl/FlywheelFabric.java index 3fa638109..6378a1996 100644 --- a/fabric/src/main/java/dev/engine_room/flywheel/impl/FlywheelFabric.java +++ b/fabric/src/main/java/dev/engine_room/flywheel/impl/FlywheelFabric.java @@ -78,14 +78,14 @@ private static void setupLib() { EndClientResourceReloadCallback.EVENT.register((minecraft, resourceManager, initialReload, error) -> ResourceReloadHolder.onEndClientResourceReload()); ModelLoadingPlugin.register(FabricPartialModel::registerAll); - ResourceLoader.get(PackType.CLIENT_RESOURCES).registerReloader(FabricPartialModel.ResourceReloadListener.ID, FabricPartialModel.ResourceReloadListener.INSTANCE); - ResourceLoader.get(PackType.CLIENT_RESOURCES).addReloaderOrdering(ResourceReloaderKeys.Client.MODELS, FabricPartialModel.ResourceReloadListener.ID); + ResourceLoader.get(PackType.CLIENT_RESOURCES).registerReloadListener(FabricPartialModel.ResourceReloadListener.ID, FabricPartialModel.ResourceReloadListener.INSTANCE); + ResourceLoader.get(PackType.CLIENT_RESOURCES).addListenerOrdering(ResourceReloaderKeys.Client.MODELS, FabricPartialModel.ResourceReloadListener.ID); } private static void setupBackend() { ReloadLevelRendererCallback.EVENT.register(level -> Uniforms.onReloadLevelRenderer()); - ResourceLoader.get(PackType.CLIENT_RESOURCES).registerReloader(FlwProgramsReloader.ID, FlwProgramsReloader.INSTANCE); + ResourceLoader.get(PackType.CLIENT_RESOURCES).registerReloadListener(FlwProgramsReloader.ID, FlwProgramsReloader.INSTANCE); } public static Version version() { diff --git a/fabric/src/main/java/dev/engine_room/flywheel/impl/mixin/MinecraftMixin.java b/fabric/src/main/java/dev/engine_room/flywheel/impl/mixin/MinecraftMixin.java index dcab8eeec..ebef5304e 100644 --- a/fabric/src/main/java/dev/engine_room/flywheel/impl/mixin/MinecraftMixin.java +++ b/fabric/src/main/java/dev/engine_room/flywheel/impl/mixin/MinecraftMixin.java @@ -31,13 +31,13 @@ abstract class MinecraftMixin { FabricFlwConfig.INSTANCE.load(); } - @Inject(method = "method_53522", at = @At("HEAD")) + @Inject(method = "lambda$new$4", at = @At("HEAD")) private void flywheel$onEndInitialResourceReload(@Coerce Object gameLoadCookie, Optional error, CallbackInfo ci) { EndClientResourceReloadCallback.EVENT.invoker() .onEndClientResourceReload((Minecraft) (Object) this, resourceManager, true, error); } - @Inject(method = "method_24228", at = @At("HEAD")) + @Inject(method = "lambda$reloadResourcePacks$0", at = @At("HEAD")) private void flywheel$onEndManualResourceReload(boolean recovery, @Coerce Object gameLoadCookie, CompletableFuture future, Optional error, CallbackInfo ci) { EndClientResourceReloadCallback.EVENT.invoker() diff --git a/fabric/src/main/resources/fabric.mod.json b/fabric/src/main/resources/fabric.mod.json index 82729821e..b2c074806 100644 --- a/fabric/src/main/resources/fabric.mod.json +++ b/fabric/src/main/resources/fabric.mod.json @@ -33,5 +33,6 @@ }, "breaks": { "sodium": "<0.6.0-beta.2" - } + }, + "accessWidener": "flywheel.accesswidener" } diff --git a/fabric/src/main/resources/flywheel.accesswidener b/fabric/src/main/resources/flywheel.accesswidener new file mode 100644 index 000000000..4e3281a69 --- /dev/null +++ b/fabric/src/main/resources/flywheel.accesswidener @@ -0,0 +1,2 @@ +accessWidener v2 official +accessible class com/mojang/blaze3d/opengl/GlDevice diff --git a/gradle.properties b/gradle.properties index 0e3e290aa..eca4c7b54 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,8 +1,5 @@ org.gradle.jvmargs = -Xmx3G org.gradle.daemon = false - -loom.ignoreDependencyLoomVersionValidation = true - # Common metadata mod_license = MIT mod_sources = https://github.com/Engine-Room/Flywheel @@ -23,28 +20,15 @@ flywheel_maven_version_range=[1.0.0,2.0) flywheel_semver_version_range=>=1.0.0 <2.0.0 # Mod dependency declarations -minecraft_semver_version_range = 1.21.11 -minecraft_maven_version_range = [1.21.11] -fabric_api_version_range = >=0.139.4 -neoforge_version_range = [21.11.0-beta,) +minecraft_semver_version_range = >=26.1 <26.2 +minecraft_maven_version_range = [26.1,26.2) +fabric_api_version_range = >=0.144.4 +neoforge_version_range = [26.1.0.17-beta,) # General build dependency versions -java_version = 21 -arch_loom_version = 1.13.467 -parchment_minecraft_version = 1.21.10 -parchment_version = 2025.10.12 - -# Minecraft build dependency versions -minecraft_version = 1.21.11 -neoforge_version = 21.11.0-beta -fabric_loader_version = 0.18.2 -fabric_api_version = 0.140.2+1.21.11 - -# Build dependency mod versions -sodium_version = 0.8.2+mc1.21.11 -iris_version = 1.10.4+1.21.11 +java_version = 25 # Publication info flywheel_group=dev.engine-room.flywheel vanillin_group=dev.engine-room.vanillin -artifact_minecraft_version = 1.21.11 +artifact_minecraft_version = 26.1 diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml new file mode 100644 index 000000000..bc0bdc706 --- /dev/null +++ b/gradle/libs.versions.toml @@ -0,0 +1,42 @@ +[versions] +minecraft = "26.1.1" + +# https://neoforged.net/ +neoforge = "26.1.1.1-beta" +mdg = "2.0.+" + +# https://fabricmc.net/develop/ +loom = "1.15.+" +fabric-loader = "0.18.5" +fabric-api = "0.145.3+26.1.1" + +# we need to manually depend on mixin (+extras) in common +mixin = "0.16.5+mixin.0.8.7" +mixin-extras = "0.5.3" + +# https://maven.caffeinemc.net/#/releases/net/caffeinemc/sodium-fabric +sodium = "0.8.9+mc26.1.1" +# https://modrinth.com/mod/iris/versions +iris = "1.10.9+26.1" + +[libraries] +minecraft = { module = "com.mojang:minecraft", version.ref = "minecraft" } +fabric-loader = { module = "net.fabricmc:fabric-loader", version.ref = "fabric-loader" } +fabric-api = { module = "net.fabricmc.fabric-api:fabric-api", version.ref = "fabric-api" } +mixin = { module = "net.fabricmc:sponge-mixin", version.ref = "mixin" } +mixin-extras = { module = "io.github.llamalad7:mixinextras-common", version.ref = "mixin-extras" } + +mdg = { module = "net.neoforged:moddev-gradle", version.ref = "mdg" } +fabric-loom = { module = "net.fabricmc:fabric-loom", version.ref = "loom" } + +sodium-fabric = { module = "net.caffeinemc:sodium-fabric", version.ref = "sodium" } +sodium-fabric-api = { module = "net.caffeinemc:sodium-fabric-api", version.ref = "sodium" } +sodium-neoforge = { module = "net.caffeinemc:sodium-neoforge", version.ref = "sodium" } +sodium-neoforge-api = { module = "net.caffeinemc:sodium-neoforge-api", version.ref = "sodium" } + +[bundles] +mixin = [ "mixin", "mixin-extras" ] + +[plugins] +mdg = { id = "net.neoforged.moddev" } +loom = { id = "net.fabricmc.fabric-loom" } diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 37f853b1c..dbc3ce4a0 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.13-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-9.4.0-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/neoforge/build.gradle.kts b/neoforge/build.gradle.kts index 4dc0567e9..afa544483 100644 --- a/neoforge/build.gradle.kts +++ b/neoforge/build.gradle.kts @@ -2,7 +2,7 @@ plugins { idea java `maven-publish` - id("dev.architectury.loom") + alias(libs.plugins.mdg) id("flywheel.subproject") id("flywheel.platform") } @@ -61,8 +61,6 @@ transitiveSourceSets { } platform { - setupLoomMod(api, lib, backend, main) - setupLoomRuns() setupTestMod(testMod) } @@ -98,12 +96,6 @@ jarSets { publishWithRawSources { artifactId = "flywheel-neoforge-api-${property("artifact_minecraft_version")}" } - - configureJar { - manifest { - attributes("Fabric-Loom-Remap" to "true") - } - } } } @@ -111,31 +103,29 @@ defaultPackageInfos { sources(api, lib, backend, main) } -loom { - mixin { - useLegacyMixinAp = true - add(main, "flywheel.refmap.json") - add(backend, "backend-flywheel.refmap.json") - } +neoForge { + version = libs.versions.neoforge.get() runs { configureEach { - property("forge.logging.markers", "") - property("forge.logging.console.level", "debug") + systemProperty("forge.logging.markers", "") + systemProperty("forge.logging.console.level", "debug") } } -} -repositories { - maven("https://maven.neoforged.net/releases/") - maven("https://maven.caffeinemc.net/releases/") + mods { + create("flywheel") { + sourceSet(api) + sourceSet(lib) + sourceSet(backend) + sourceSet(main) + } + } } dependencies { - neoForge("net.neoforged:neoforge:${property("neoforge_version")}") - - modCompileOnly("net.caffeinemc:sodium-neoforge-api:${property("sodium_version")}") - modCompileOnly("maven.modrinth:iris:${property("iris_version")}-neoforge") + compileOnly(libs.sodium.neoforge.api) + compileOnly("maven.modrinth:iris:${libs.versions.iris.get()}-neoforge") "forApi"(project(path = common, configuration = "apiClasses")) "forLib"(project(path = common, configuration = "libClasses")) diff --git a/neoforge/gradle.properties b/neoforge/gradle.properties deleted file mode 100644 index 2e6ed7676..000000000 --- a/neoforge/gradle.properties +++ /dev/null @@ -1 +0,0 @@ -loom.platform = neoforge diff --git a/neoforge/src/main/java/dev/engine_room/flywheel/impl/mixin/MinecraftMixin.java b/neoforge/src/main/java/dev/engine_room/flywheel/impl/mixin/MinecraftMixin.java index fcf751a34..0bea1528d 100644 --- a/neoforge/src/main/java/dev/engine_room/flywheel/impl/mixin/MinecraftMixin.java +++ b/neoforge/src/main/java/dev/engine_room/flywheel/impl/mixin/MinecraftMixin.java @@ -28,12 +28,12 @@ abstract class MinecraftMixin { FlwImpl.freezeRegistries(); } - @Inject(method = "method_53522", at = @At("HEAD"), remap = false) + @Inject(method = "lambda$new$4", at = @At("HEAD"), remap = false) private void flywheel$onEndInitialResourceReload(@Coerce Object gameLoadCookie, Optional error, CallbackInfo ci) { ModLoader.postEvent(new EndClientResourceReloadEvent((Minecraft) (Object) this, resourceManager, true, error)); } - @Inject(method = "lambda$reloadResourcePacks$20", at = @At("HEAD"), remap = false) + @Inject(method = "lambda$reloadResourcePacks$0", at = @At("HEAD"), remap = false) private void flywheel$onEndManualResourceReload(boolean recovery, @Coerce Object gameLoadCookie, CompletableFuture completablefuture, Optional error, CallbackInfo ci) { ModLoader.postEvent(new EndClientResourceReloadEvent((Minecraft) (Object) this, resourceManager, false, error)); } diff --git a/neoforge/src/main/resources/META-INF/accesstransformer.cfg b/neoforge/src/main/resources/META-INF/accesstransformer.cfg new file mode 100644 index 000000000..0ca9f7400 --- /dev/null +++ b/neoforge/src/main/resources/META-INF/accesstransformer.cfg @@ -0,0 +1 @@ +public com.mojang.blaze3d.opengl.GlDevice diff --git a/settings.gradle.kts b/settings.gradle.kts index 7e3b2f05f..45b5d2e80 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -5,16 +5,14 @@ pluginManagement { maven("https://maven.neoforged.net/releases/") { name = "NeoForged" } - maven("https://maven.architectury.dev/") { - name = "Architectury" + maven("https://maven.fabricmc.net") { + name = "FabricMC" } - maven("https://repo.spongepowered.org/repository/maven-public") - maven("https://maven.parchmentmc.org") } } plugins { - id("org.gradle.toolchains.foojay-resolver-convention") version("0.9.0") + id("org.gradle.toolchains.foojay-resolver-convention") version("1.0.0") } rootProject.name = "Flywheel" diff --git a/vanillinFabric/build.gradle.kts b/vanillinFabric/build.gradle.kts index 2a7b3da21..4cc585a4d 100644 --- a/vanillinFabric/build.gradle.kts +++ b/vanillinFabric/build.gradle.kts @@ -2,7 +2,7 @@ plugins { idea java `maven-publish` - id("dev.architectury.loom") + alias(libs.plugins.loom) id("flywheel.subproject") id("flywheel.platform") } @@ -26,7 +26,7 @@ transitiveSourceSets { } } -var vanillinVersion = "${property("vanillin_version")}+${property("minecraft_version")}" +var vanillinVersion = "${property("vanillin_version")}+${libs.versions.minecraft.get()}" if (subproject.buildNumber != null) { vanillinVersion += ".build.${subproject.buildNumber}" @@ -56,7 +56,7 @@ tasks.withType().configureEach { } jarSets { - mainSet.publishWithRemappedSources { + mainSet.publishWithRawSources { artifactId = "vanillin-fabric-${property("artifact_minecraft_version")}" } } @@ -65,29 +65,17 @@ defaultPackageInfos { sources(main) } -loom { - mixin { - useLegacyMixinAp = true - add(main, "vanillin.refmap.json") - } -} - -repositories { - maven("https://maven.caffeinemc.net/releases/") -} - dependencies { - modImplementation("net.fabricmc:fabric-loader:${property("fabric_loader_version")}") - modApi("net.fabricmc.fabric-api:fabric-api:${property("fabric_api_version")}") + minecraft(libs.minecraft) + implementation(libs.fabric.loader) + api(libs.fabric.api) - modCompileOnly("net.caffeinemc:sodium-fabric-api:${property("sodium_version")}") + compileOnly(libs.sodium.fabric.api) compileOnly(project(path = common, configuration = "vanillinClasses")) compileOnly(project(path = common, configuration = "vanillinResources")) compileOnly(project(path = platform, configuration = "apiClasses")) - // JiJ flywheel proper - include(project(path = platform, configuration = "flywheelRemap")) - runtimeOnly(project(path = platform, configuration = "flywheelDev")) + include(runtimeOnly(project(path = platform, configuration = "flywheel"))!!) } diff --git a/vanillinFabric/gradle.properties b/vanillinFabric/gradle.properties deleted file mode 100644 index e846a8f57..000000000 --- a/vanillinFabric/gradle.properties +++ /dev/null @@ -1 +0,0 @@ -loom.platform=fabric diff --git a/vanillinFabric/src/main/java/dev/engine_room/vanillin/VanillinFabric.java b/vanillinFabric/src/main/java/dev/engine_room/vanillin/VanillinFabric.java index 77ac5acc2..339f04ced 100644 --- a/vanillinFabric/src/main/java/dev/engine_room/vanillin/VanillinFabric.java +++ b/vanillinFabric/src/main/java/dev/engine_room/vanillin/VanillinFabric.java @@ -3,7 +3,7 @@ import dev.engine_room.flywheel.api.event.ReloadLevelRendererCallback; import dev.engine_room.vanillin.item.SodiumAnimatedTextureCompat; import net.fabricmc.api.ClientModInitializer; -import net.fabricmc.fabric.api.client.rendering.v1.world.WorldRenderEvents; +import net.fabricmc.fabric.api.client.rendering.v1.level.LevelRenderEvents; public class VanillinFabric implements ClientModInitializer { @Override @@ -14,6 +14,6 @@ public void onInitializeClient() { FabricVanillinConfig.INSTANCE.save(); ReloadLevelRendererCallback.EVENT.register(level -> SodiumAnimatedTextureCompat.onReloadRenderer()); - WorldRenderEvents.START_MAIN.register(context -> SodiumAnimatedTextureCompat.beginFrame()); + LevelRenderEvents.START_MAIN.register(context -> SodiumAnimatedTextureCompat.beginFrame()); } } diff --git a/vanillinNeoForge/build.gradle.kts b/vanillinNeoForge/build.gradle.kts index fe1d3b41a..599849ef3 100644 --- a/vanillinNeoForge/build.gradle.kts +++ b/vanillinNeoForge/build.gradle.kts @@ -2,7 +2,7 @@ plugins { idea java `maven-publish` - id("dev.architectury.loom") + alias(libs.plugins.mdg) id("flywheel.subproject") id("flywheel.platform") } @@ -14,10 +14,6 @@ subproject.init("vanillin-neoforge", "vanillin_group", "vanillin_version") val main = sourceSets.getByName("main") -platform { - setupLoomRuns() -} - transitiveSourceSets { sourceSet(main) { compileClasspath(project(platform), "api", "lib", "main") @@ -59,29 +55,26 @@ defaultPackageInfos { sources(main) } -loom { - mixin { - useLegacyMixinAp = true - add(main, "vanillin.refmap.json") - } +neoForge { + version = libs.versions.neoforge.get() runs { configureEach { - property("forge.logging.markers", "") - property("forge.logging.console.level", "debug") + systemProperty("forge.logging.markers", "") + systemProperty("forge.logging.console.level", "debug") } } -} -repositories { - maven("https://maven.neoforged.net/releases/") - maven("https://maven.caffeinemc.net/releases/") + mods { + create("vanillin") { + sourceSet(main) + } + } } dependencies { - neoForge("net.neoforged:neoforge:${property("neoforge_version")}") - - modCompileOnly("net.caffeinemc:sodium-neoforge-api:${property("sodium_version")}") + compileOnly(libs.sodium.neoforge.api) + compileOnly("maven.modrinth:iris:${libs.versions.iris.get()}-neoforge") compileOnly(project(path = common, configuration = "vanillinClasses")) compileOnly(project(path = common, configuration = "vanillinResources")) @@ -90,7 +83,5 @@ dependencies { compileOnly(annotationProcessor("io.github.llamalad7:mixinextras-common:0.4.1")!!) - // JiJ flywheel proper - include(project(path = platform, configuration = "flywheelRemap")) - runtimeOnly(project(path = platform, configuration = "flywheelDev")) + jarJar(runtimeOnly(project(path = platform, configuration = "flywheel"))!!) } diff --git a/vanillinNeoForge/gradle.properties b/vanillinNeoForge/gradle.properties deleted file mode 100644 index 2e6ed7676..000000000 --- a/vanillinNeoForge/gradle.properties +++ /dev/null @@ -1 +0,0 @@ -loom.platform = neoforge From 1114d99fd8282491066a5d4fa267bde735d179fe Mon Sep 17 00:00:00 2001 From: IThundxr Date: Wed, 8 Apr 2026 18:19:06 -0400 Subject: [PATCH 36/59] Fix mixins.json files --- .../resources/flywheel.backend.mixins.json | 15 +++++++-------- .../src/main/resources/flywheel.impl.mixins.json | 15 +++++++-------- .../src/vanillin/resources/vanillin.mixins.json | 3 +-- .../resources/flywheel.impl.fabric.mixins.json | 3 +-- .../resources/flywheel.impl.neoforge.mixins.json | 3 +-- .../main/resources/vanillin.fabric.mixins.json | 15 +++++++-------- .../main/resources/vanillin.neoforge.mixins.json | 15 +++++++-------- 7 files changed, 31 insertions(+), 38 deletions(-) diff --git a/common/src/backend/resources/flywheel.backend.mixins.json b/common/src/backend/resources/flywheel.backend.mixins.json index 8a55191de..6ce9647b9 100644 --- a/common/src/backend/resources/flywheel.backend.mixins.json +++ b/common/src/backend/resources/flywheel.backend.mixins.json @@ -1,10 +1,9 @@ { - "required" : true, - "minVersion" : "0.8", - "package" : "dev.engine_room.flywheel.backend.mixin", - "compatibilityLevel" : "JAVA_21", - "refmap" : "backend-flywheel.refmap.json", - "client" : [ + "required": true, + "minVersion": "0.8", + "package": "dev.engine_room.flywheel.backend.mixin", + "compatibilityLevel": "JAVA_25", + "client": [ "AbstractClientPlayerAccessor", "CameraMixin", "CameraRenderStateMixin", @@ -21,7 +20,7 @@ "light.SkyDataLayerStorageMapAccessor", "light.SkyLightSectionStorageMixin" ], - "injectors" : { - "defaultRequire" : 1 + "injectors": { + "defaultRequire": 1 } } diff --git a/common/src/main/resources/flywheel.impl.mixins.json b/common/src/main/resources/flywheel.impl.mixins.json index 439a42f3a..5c0bd4117 100644 --- a/common/src/main/resources/flywheel.impl.mixins.json +++ b/common/src/main/resources/flywheel.impl.mixins.json @@ -1,10 +1,9 @@ { - "required" : true, - "minVersion" : "0.8", - "package" : "dev.engine_room.flywheel.impl.mixin", - "compatibilityLevel" : "JAVA_21", - "refmap" : "flywheel.refmap.json", - "client" : [ + "required": true, + "minVersion": "0.8", + "package": "dev.engine_room.flywheel.impl.mixin", + "compatibilityLevel": "JAVA_25", + "client": [ "BlockEntityTypeMixin", "ClientChunkCacheMixin", "EntityRendererAccessor", @@ -20,7 +19,7 @@ "visualmanage.LevelRendererMixin", "visualmanage.SectionCompilerMixin" ], - "injectors" : { - "defaultRequire" : 1 + "injectors": { + "defaultRequire": 1 } } diff --git a/common/src/vanillin/resources/vanillin.mixins.json b/common/src/vanillin/resources/vanillin.mixins.json index 3394c4bb6..df13e4b26 100644 --- a/common/src/vanillin/resources/vanillin.mixins.json +++ b/common/src/vanillin/resources/vanillin.mixins.json @@ -2,8 +2,7 @@ "required": true, "minVersion": "0.8", "package": "dev.engine_room.vanillin.mixin", - "compatibilityLevel": "JAVA_21", - "refmap": "vanillin.refmap.json", + "compatibilityLevel": "JAVA_25", "client": [ "ChestRendererAccessor" ], diff --git a/fabric/src/main/resources/flywheel.impl.fabric.mixins.json b/fabric/src/main/resources/flywheel.impl.fabric.mixins.json index 3e192003f..d3e0ee36a 100644 --- a/fabric/src/main/resources/flywheel.impl.fabric.mixins.json +++ b/fabric/src/main/resources/flywheel.impl.fabric.mixins.json @@ -2,8 +2,7 @@ "required": true, "minVersion": "0.8", "package": "dev.engine_room.flywheel.impl.mixin.fabric", - "compatibilityLevel": "JAVA_21", - "refmap": "flywheel.refmap.json", + "compatibilityLevel": "JAVA_25", "client": [ "ArgumentTypeInfosAccessor", "MinecraftMixin", diff --git a/neoforge/src/main/resources/flywheel.impl.neoforge.mixins.json b/neoforge/src/main/resources/flywheel.impl.neoforge.mixins.json index a9dfae6cf..78ee994ce 100644 --- a/neoforge/src/main/resources/flywheel.impl.neoforge.mixins.json +++ b/neoforge/src/main/resources/flywheel.impl.neoforge.mixins.json @@ -2,8 +2,7 @@ "required": true, "minVersion": "0.8", "package" : "dev.engine_room.flywheel.impl.mixin.neoforge", - "compatibilityLevel": "JAVA_17", - "refmap": "flywheel.refmap.json", + "compatibilityLevel": "JAVA_25", "client": [ "ModelBlockRendererMixin" ], diff --git a/vanillinFabric/src/main/resources/vanillin.fabric.mixins.json b/vanillinFabric/src/main/resources/vanillin.fabric.mixins.json index 226f251cb..2d485d46d 100644 --- a/vanillinFabric/src/main/resources/vanillin.fabric.mixins.json +++ b/vanillinFabric/src/main/resources/vanillin.fabric.mixins.json @@ -1,12 +1,11 @@ { - "required" : true, - "minVersion" : "0.8", - "package" : "dev.engine_room.vanillin.fabric.mixin", - "compatibilityLevel" : "JAVA_17", - "refmap" : "vanillin.refmap.json", - "client" : [ + "required": true, + "minVersion": "0.8", + "package": "dev.engine_room.vanillin.fabric.mixin", + "compatibilityLevel": "JAVA_25", + "client": [ ], - "injectors" : { - "defaultRequire" : 1 + "injectors": { + "defaultRequire": 1 } } diff --git a/vanillinNeoForge/src/main/resources/vanillin.neoforge.mixins.json b/vanillinNeoForge/src/main/resources/vanillin.neoforge.mixins.json index f64ecd1fd..25cc5ec7b 100644 --- a/vanillinNeoForge/src/main/resources/vanillin.neoforge.mixins.json +++ b/vanillinNeoForge/src/main/resources/vanillin.neoforge.mixins.json @@ -1,12 +1,11 @@ { - "required" : true, - "minVersion" : "0.8", - "package" : "dev.engine_room.vanillin.neoforge.mixin", - "compatibilityLevel" : "JAVA_17", - "refmap" : "vanillin.refmap.json", - "client" : [ + "required": true, + "minVersion": "0.8", + "package": "dev.engine_room.vanillin.neoforge.mixin", + "compatibilityLevel": "JAVA_25", + "client": [ ], - "injectors" : { - "defaultRequire" : 1 + "injectors": { + "defaultRequire": 1 } } From 9741a84936bae395860d451f154ed72d728aae02 Mon Sep 17 00:00:00 2001 From: IThundxr Date: Wed, 8 Apr 2026 18:23:56 -0400 Subject: [PATCH 37/59] Update java in workflow --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index a6760f73b..7adaf4492 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -3,7 +3,7 @@ name: Build on: [ workflow_dispatch, pull_request, push ] env: - JAVA_VERSION: 21 + JAVA_VERSION: 25 jobs: build: From b8235b34527b5d873d2b8257f68cbf4086992d4b Mon Sep 17 00:00:00 2001 From: IThundxr Date: Mon, 27 Apr 2026 13:36:33 -0400 Subject: [PATCH 38/59] fix renderdoc paths --- .../gradle/platform/PlatformExtension.kt | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/buildSrc/src/main/kotlin/dev/engine_room/gradle/platform/PlatformExtension.kt b/buildSrc/src/main/kotlin/dev/engine_room/gradle/platform/PlatformExtension.kt index 34b6ed52a..3c8ea50e8 100644 --- a/buildSrc/src/main/kotlin/dev/engine_room/gradle/platform/PlatformExtension.kt +++ b/buildSrc/src/main/kotlin/dev/engine_room/gradle/platform/PlatformExtension.kt @@ -1,6 +1,8 @@ package dev.engine_room.gradle.platform import net.fabricmc.loom.api.LoomGradleExtensionAPI +import net.fabricmc.loom.task.RenderDocRunTask +import net.fabricmc.loom.task.RenderDocRunUITask import org.gradle.api.Project import org.gradle.api.Task import org.gradle.api.tasks.SourceSet @@ -9,6 +11,8 @@ import org.gradle.kotlin.dsl.assign import org.gradle.kotlin.dsl.named import org.gradle.kotlin.dsl.register import org.gradle.kotlin.dsl.the +import org.gradle.kotlin.dsl.withType +import java.io.File open class PlatformExtension(val project: Project) { fun setupLoomMod(vararg sourceSets: SourceSet) { @@ -40,6 +44,17 @@ open class PlatformExtension(val project: Project) { programArgs("--nogui") } } + + + if (System.getProperty("os.name") == "Linux") { + project.tasks.withType { + renderDocExecutable.set(File("/usr/bin/renderdoccmd")) + } + + project.tasks.withType { + renderDocExecutable.set(File("/usr/bin/qrenderdoc")) + } + } } fun setupTestMod(sourceSet: SourceSet) { From d1400d3676efa42add80ceaca9fd13e7b689c203 Mon Sep 17 00:00:00 2001 From: IThundxr Date: Mon, 27 Apr 2026 13:39:18 -0400 Subject: [PATCH 39/59] Undo previous 26.1 port --- .../flywheel/api/backend/Engine.java | 4 +- .../flywheel/api/backend/RenderContext.java | 4 +- .../flywheel/api/visual/DynamicVisual.java | 4 +- .../backend/CameraRenderStateExtension.java | 7 -- .../flywheel/backend/engine/EngineImpl.java | 6 +- .../flywheel/backend/engine/LightStorage.java | 10 +-- .../backend/engine/MaterialRenderState.java | 11 +-- .../backend/engine/TextureBinder.java | 5 +- .../engine/indirect/OitFramebuffer.java | 15 ++-- .../backend/engine/uniform/FrameUniforms.java | 29 +++---- .../backend/engine/uniform/LevelUniforms.java | 24 +++--- .../flywheel/backend/mixin/CameraMixin.java | 25 ------ .../backend/mixin/CameraRenderStateMixin.java | 18 ----- .../backend/mixin/FogRendererMixin.java | 6 +- .../backend/mixin/GpuDeviceAccessor.java | 13 ---- .../backend/mixin/LevelRendererAccessor.java | 4 - .../LayerLightSectionStorageAccessor.java | 3 +- .../flywheel/lib/instance/FlatLit.java | 6 +- .../flywheel/lib/material/Materials.java | 4 +- .../flywheel/lib/model/LineModelBuilder.java | 4 +- .../flywheel/lib/model/ModelUtil.java | 4 +- .../lib/model/baked/BlockModelBuilder.java | 4 +- .../lib/model/baked/EmptyVertexConsumer.java | 49 ------------ .../model/baked/EmptyVirtualBlockGetter.java | 6 -- .../lib/model/baked/LevelModelBuilder.java | 2 +- .../lib/model/baked/PartialModel.java | 4 +- .../baked/SinglePosVirtualBlockGetter.java | 6 -- .../lib/model/baked/VirtualBlockGetter.java | 8 +- .../flywheel/lib/model/part/MeshTree.java | 4 +- .../flywheel/lib/model/part/ModelTrees.java | 9 +-- .../lib/visual/AbstractBlockEntityVisual.java | 12 +-- .../lib/visual/AbstractEntityVisual.java | 4 +- .../lib/visual/component/FireComponent.java | 13 ++-- .../lib/visual/component/HitboxComponent.java | 4 +- .../lib/visual/component/ShadowComponent.java | 12 +-- .../impl/event/RenderContextImpl.java | 8 +- .../impl/mixin/LevelRendererMixin.java | 16 ++-- .../impl/visual/DynamicVisualContextImpl.java | 6 +- .../VisualizationManagerImpl.java | 8 +- .../vanillin/elements/FireElement.java | 13 ++-- .../vanillin/elements/HitboxElement.java | 4 +- .../vanillin/elements/ShadowElement.java | 9 +-- .../vanillin/visuals/BlockDisplayVisual.java | 12 +-- .../vanillin/visuals/ChestVisual.java | 23 +++--- .../vanillin/visuals/ShulkerBoxVisual.java | 3 +- .../model/baked/BlockStateModelBufferer.java | 76 +++++++++---------- .../lib/model/baked/FabricMeshEmitter.java | 11 ++- .../model/baked/FabricMeshEmitterManager.java | 19 +++-- .../lib/model/baked/FabricPartialModel.java | 8 +- .../flywheel/impl/FlwCommands.java | 52 ++++++------- .../flywheel/impl/FlywheelFabric.java | 6 +- .../flywheel/impl/mixin/MinecraftMixin.java | 4 +- .../flywheel/impl/mixin/MinecraftMixin.java | 4 +- .../engine_room/vanillin/VanillinFabric.java | 4 +- 54 files changed, 249 insertions(+), 380 deletions(-) delete mode 100644 common/src/backend/java/dev/engine_room/flywheel/backend/CameraRenderStateExtension.java delete mode 100644 common/src/backend/java/dev/engine_room/flywheel/backend/mixin/CameraMixin.java delete mode 100644 common/src/backend/java/dev/engine_room/flywheel/backend/mixin/CameraRenderStateMixin.java delete mode 100644 common/src/backend/java/dev/engine_room/flywheel/backend/mixin/GpuDeviceAccessor.java delete mode 100644 common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/EmptyVertexConsumer.java diff --git a/common/src/api/java/dev/engine_room/flywheel/api/backend/Engine.java b/common/src/api/java/dev/engine_room/flywheel/api/backend/Engine.java index 46fc2a986..b44ee31ff 100644 --- a/common/src/api/java/dev/engine_room/flywheel/api/backend/Engine.java +++ b/common/src/api/java/dev/engine_room/flywheel/api/backend/Engine.java @@ -9,7 +9,7 @@ import dev.engine_room.flywheel.api.task.Plan; import dev.engine_room.flywheel.api.visualization.VisualizationContext; import it.unimi.dsi.fastutil.longs.LongSet; -import net.minecraft.client.renderer.state.level.CameraRenderState; +import net.minecraft.client.Camera; import net.minecraft.core.BlockPos; import net.minecraft.core.SectionPos; import net.minecraft.core.Vec3i; @@ -43,7 +43,7 @@ public interface Engine { * * @return {@code true} if the render origin changed, {@code false} otherwise. */ - boolean updateRenderOrigin(CameraRenderState camera); + boolean updateRenderOrigin(Camera camera); /** * Assign the set of sections that visuals have requested GPU light for. diff --git a/common/src/api/java/dev/engine_room/flywheel/api/backend/RenderContext.java b/common/src/api/java/dev/engine_room/flywheel/api/backend/RenderContext.java index 5c4747bc1..e78df1aad 100644 --- a/common/src/api/java/dev/engine_room/flywheel/api/backend/RenderContext.java +++ b/common/src/api/java/dev/engine_room/flywheel/api/backend/RenderContext.java @@ -2,10 +2,10 @@ import org.joml.Matrix4fc; +import net.minecraft.client.Camera; import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.client.renderer.LevelRenderer; import net.minecraft.client.renderer.RenderBuffers; -import net.minecraft.client.renderer.state.level.CameraRenderState; public interface RenderContext { LevelRenderer renderer(); @@ -20,7 +20,7 @@ public interface RenderContext { Matrix4fc viewProjection(); - CameraRenderState cameraRenderState(); + Camera camera(); float partialTick(); } diff --git a/common/src/api/java/dev/engine_room/flywheel/api/visual/DynamicVisual.java b/common/src/api/java/dev/engine_room/flywheel/api/visual/DynamicVisual.java index 769350066..6143f7836 100644 --- a/common/src/api/java/dev/engine_room/flywheel/api/visual/DynamicVisual.java +++ b/common/src/api/java/dev/engine_room/flywheel/api/visual/DynamicVisual.java @@ -6,7 +6,7 @@ import dev.engine_room.flywheel.api.instance.Instance; import dev.engine_room.flywheel.api.instance.Instancer; import dev.engine_room.flywheel.api.task.Plan; -import net.minecraft.client.renderer.state.level.CameraRenderState; +import net.minecraft.client.Camera; /** * An interface giving {@link Visual}s a hook to have a function called at @@ -32,7 +32,7 @@ public interface DynamicVisual extends Visual { */ @ApiStatus.NonExtendable interface Context { - CameraRenderState cameraRenderState(); + Camera camera(); FrustumIntersection frustum(); diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/CameraRenderStateExtension.java b/common/src/backend/java/dev/engine_room/flywheel/backend/CameraRenderStateExtension.java deleted file mode 100644 index 6a1859f07..000000000 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/CameraRenderStateExtension.java +++ /dev/null @@ -1,7 +0,0 @@ -package dev.engine_room.flywheel.backend; - -import org.joml.Vector3f; - -public interface CameraRenderStateExtension { - Vector3f flywheel$getForwardVector(); -} diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/engine/EngineImpl.java b/common/src/backend/java/dev/engine_room/flywheel/backend/engine/EngineImpl.java index 0f9c69c8b..690e540b2 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/engine/EngineImpl.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/engine/EngineImpl.java @@ -19,7 +19,7 @@ import dev.engine_room.flywheel.backend.engine.uniform.Uniforms; import dev.engine_room.flywheel.backend.gl.GlStateTracker; import it.unimi.dsi.fastutil.longs.LongSet; -import net.minecraft.client.renderer.state.level.CameraRenderState; +import net.minecraft.client.Camera; import net.minecraft.core.BlockPos; import net.minecraft.core.SectionPos; import net.minecraft.core.Vec3i; @@ -59,8 +59,8 @@ public Vec3i renderOrigin() { } @Override - public boolean updateRenderOrigin(CameraRenderState camera) { - Vec3 cameraPos = camera.pos; + public boolean updateRenderOrigin(Camera camera) { + Vec3 cameraPos = camera.position(); double dx = renderOrigin.getX() - cameraPos.x; double dy = renderOrigin.getY() - cameraPos.y; double dz = renderOrigin.getZ() - cameraPos.z; diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/engine/LightStorage.java b/common/src/backend/java/dev/engine_room/flywheel/backend/engine/LightStorage.java index efb853bad..2d2244a51 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/engine/LightStorage.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/engine/LightStorage.java @@ -25,9 +25,9 @@ import it.unimi.dsi.fastutil.longs.Long2IntOpenHashMap; import it.unimi.dsi.fastutil.longs.LongOpenHashSet; import it.unimi.dsi.fastutil.longs.LongSet; +import net.minecraft.client.renderer.LightTexture; import net.minecraft.core.SectionPos; import net.minecraft.core.Vec3i; -import net.minecraft.util.LightCoordsUtil; import net.minecraft.world.level.LevelAccessor; /** @@ -292,7 +292,7 @@ private void setupSectionBoxes() { .translate(x + 1, y + 1, z + 1) .scale(14) .color(255, 255, 0) - .light(LightCoordsUtil.FULL_BRIGHT) + .light(LightTexture.FULL_BRIGHT) .setChanged(); }); } @@ -357,7 +357,7 @@ private void setupLutRangeBoxes() { .translate(x2, y2, debug3) .scale(1, 1, size3 * 16) .color(0, 0, 255) - .light(LightCoordsUtil.FULL_BRIGHT) + .light(LightTexture.FULL_BRIGHT) .setChanged(); } } @@ -367,7 +367,7 @@ private void setupLutRangeBoxes() { .translate(debug2, y2, minLocal3 * 16 - renderOrigin.getZ()) .scale(size2 * 16, 1, (maxLocal3 - minLocal3) * 16) .color(255, 0, 0) - .light(LightCoordsUtil.FULL_BRIGHT) + .light(LightTexture.FULL_BRIGHT) .setChanged(); } @@ -376,7 +376,7 @@ private void setupLutRangeBoxes() { .translate(min2 * 16 - renderOrigin.getX(), debug1, min3 * 16 - renderOrigin.getZ()) .scale((max2 - min2) * 16, size1 * 16, (max3 - min3) * 16) .color(0, 255, 0) - .light(LightCoordsUtil.FULL_BRIGHT) + .light(LightTexture.FULL_BRIGHT) .setChanged(); } diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/engine/MaterialRenderState.java b/common/src/backend/java/dev/engine_room/flywheel/backend/engine/MaterialRenderState.java index b265b9c3a..3f4e842c3 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/engine/MaterialRenderState.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/engine/MaterialRenderState.java @@ -44,11 +44,7 @@ public static void setupOit(Material material) { WriteMask mask = material.writeMask(); boolean writeColor = mask.color(); - - if (writeColor) - GlStateManager._colorMask(0b1111); - else - GlStateManager._colorMask(0b0000); + GlStateManager._colorMask(writeColor, writeColor, writeColor, writeColor); } private static void setupTexture(Material material) { @@ -155,10 +151,7 @@ private static void setupTransparency(Transparency transparency) { private static void setupWriteMask(WriteMask mask) { GlStateManager._depthMask(mask.depth()); boolean writeColor = mask.color(); - if (writeColor) - GlStateManager._colorMask(0b1111); - else - GlStateManager._colorMask(0b0000); + GlStateManager._colorMask(writeColor, writeColor, writeColor, writeColor); } public static boolean materialEquals(Material lhs, Material rhs) { diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/engine/TextureBinder.java b/common/src/backend/java/dev/engine_room/flywheel/backend/engine/TextureBinder.java index 986a97002..a8ffb1e35 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/engine/TextureBinder.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/engine/TextureBinder.java @@ -14,7 +14,6 @@ import com.mojang.blaze3d.textures.GpuTexture; import dev.engine_room.flywheel.backend.Samplers; -import dev.engine_room.flywheel.backend.mixin.GpuDeviceAccessor; import net.minecraft.client.Minecraft; import net.minecraft.resources.Identifier; @@ -46,13 +45,13 @@ public static void bindLightAndOverlay() { var gameRenderer = Minecraft.getInstance().gameRenderer; GlSampler sampler = (GlSampler) RenderSystem.getSamplerCache().getClampToEdge(FilterMode.LINEAR); bind(Samplers.OVERLAY.number, (GlTextureView) gameRenderer.overlayTexture().getTextureView(), sampler); - bind(Samplers.LIGHT.number, (GlTextureView) gameRenderer.lightmap(), sampler); + bind(Samplers.LIGHT.number, (GlTextureView) gameRenderer.lightTexture().getTextureView(), sampler); } public static void bindRenderTarget(RenderTarget target) { GlTexture colorTexture = (GlTexture) target.getColorTexture(); int i = colorTexture.getFbo( - ((GlDevice) ((GpuDeviceAccessor) RenderSystem.getDevice()).getBackend()).directStateAccess(), + ((GlDevice) RenderSystem.getDevice()).directStateAccess(), target.getDepthTexture() ); GlStateManager._glBindFramebuffer(GlConst.GL_FRAMEBUFFER, i); diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/engine/indirect/OitFramebuffer.java b/common/src/backend/java/dev/engine_room/flywheel/backend/engine/indirect/OitFramebuffer.java index 558b60536..e2cbe1e58 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/engine/indirect/OitFramebuffer.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/engine/indirect/OitFramebuffer.java @@ -15,7 +15,6 @@ import dev.engine_room.flywheel.backend.compile.OitPrograms; import dev.engine_room.flywheel.backend.gl.GlCompat; import dev.engine_room.flywheel.backend.gl.GlTextureUnit; -import dev.engine_room.flywheel.backend.mixin.GpuDeviceAccessor; import net.minecraft.client.Minecraft; public class OitFramebuffer { @@ -85,12 +84,12 @@ public void prepare() { public void depthRange() { // No depth writes, but we'll still use the depth test. GlStateManager._depthMask(false); - GlStateManager._colorMask(0b1111); + GlStateManager._colorMask(true, true, true, true); GlStateManager._enableBlend(); GlStateManager._blendFuncSeparate(GlConst.GL_ONE, GlConst.GL_ONE, GlConst.GL_ONE, GlConst.GL_ONE); GL32.glBlendEquation(GlConst.GL_MAX); - var far = Minecraft.getInstance().gameRenderer.getGameRenderState().levelRenderState.cameraRenderState.depthFar; + var far = Minecraft.getInstance().gameRenderer.getDepthFar(); if (GlCompat.SUPPORTS_DSA) { GL46.glNamedFramebufferDrawBuffers(fbo, DEPTH_RANGE_DRAW_BUFFERS); @@ -108,7 +107,7 @@ public void depthRange() { public void renderTransmittance() { // No depth writes, but we'll still use the depth test GlStateManager._depthMask(false); - GlStateManager._colorMask(0b1111); + GlStateManager._colorMask(true, true, true, true); GlStateManager._enableBlend(); GlStateManager._blendFuncSeparate(GlConst.GL_ONE, GlConst.GL_ONE, GlConst.GL_ONE, GlConst.GL_ONE); GL32.glBlendEquation(GlConst.GL_FUNC_ADD); @@ -134,7 +133,7 @@ public void renderTransmittance() { public void renderDepthFromTransmittance() { // Only write to depth, not color. GlStateManager._depthMask(true); - GlStateManager._colorMask(0b0000); + GlStateManager._colorMask(false, false, false, false); GlStateManager._disableBlend(); GlStateManager._depthFunc(GlConst.GL_ALWAYS); @@ -156,7 +155,7 @@ public void renderDepthFromTransmittance() { public void accumulate() { // No depth writes, but we'll still use the depth test GlStateManager._depthMask(false); - GlStateManager._colorMask(0b1111); + GlStateManager._colorMask(true, true, true, true); GlStateManager._enableBlend(); GlStateManager._blendFuncSeparate(GlConst.GL_ONE, GlConst.GL_ONE, GlConst.GL_ONE, GlConst.GL_ONE); GL32.glBlendEquation(GlConst.GL_FUNC_ADD); @@ -187,7 +186,7 @@ public void composite() { // depthMask = false: other transparent stuff renders on top of OIT stuff. // If Neo gets wavelet OIT we can use their hooks to be correct with everything. GlStateManager._depthMask(true); - GlStateManager._colorMask(0b1111); + GlStateManager._colorMask(true, true, true, true); GlStateManager._enableBlend(); // We rely on the blend func to achieve: @@ -214,7 +213,7 @@ public void composite() { private static void bindRenderTarget(RenderTarget target) { GlTexture colorTexture = (GlTexture) target.getColorTexture(); int i = colorTexture.getFbo( - ((GlDevice) ((GpuDeviceAccessor) RenderSystem.getDevice()).getBackend()).directStateAccess(), + ((GlDevice) RenderSystem.getDevice()).directStateAccess(), target.getDepthTexture() ); GlStateManager._glBindFramebuffer(GlConst.GL_FRAMEBUFFER, i); diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/engine/uniform/FrameUniforms.java b/common/src/backend/java/dev/engine_room/flywheel/backend/engine/uniform/FrameUniforms.java index 812ad9602..591d8de36 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/engine/uniform/FrameUniforms.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/engine/uniform/FrameUniforms.java @@ -8,15 +8,15 @@ import dev.engine_room.flywheel.api.backend.RenderContext; import dev.engine_room.flywheel.api.visualization.VisualizationManager; -import dev.engine_room.flywheel.backend.CameraRenderStateExtension; import dev.engine_room.flywheel.backend.engine.indirect.DepthPyramid; import dev.engine_room.flywheel.backend.mixin.LevelRendererAccessor; import net.minecraft.client.Camera; import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.state.level.CameraRenderState; +import net.minecraft.client.renderer.GameRenderer; import net.minecraft.core.BlockPos; import net.minecraft.core.Vec3i; import net.minecraft.util.Util; +import net.minecraft.world.level.Level; import net.minecraft.world.phys.Vec3; public final class FrameUniforms extends UniformWriter { @@ -68,8 +68,8 @@ public static void update(RenderContext context) { Vec3i renderOrigin = VisualizationManager.getOrThrow(context.level()) .renderOrigin(); - var camera = context.cameraRenderState(); - Vec3 cameraPos = camera.pos; + var camera = context.camera(); + Vec3 cameraPos = camera.position(); var camX = (float) (cameraPos.x - renderOrigin.getX()); var camY = (float) (cameraPos.y - renderOrigin.getY()); var camZ = (float) (cameraPos.z - renderOrigin.getZ()); @@ -81,8 +81,8 @@ public static void update(RenderContext context) { VIEW_PROJECTION.translate(-camX, -camY, -camZ); CAMERA_POS.set(camX, camY, camZ); - CAMERA_LOOK.set(((CameraRenderStateExtension) camera).flywheel$getForwardVector()); - CAMERA_ROT.set(camera.xRot, camera.yRot); + CAMERA_LOOK.set(camera.forwardVector()); + CAMERA_ROT.set(camera.xRot(), camera.yRot()); if (firstWrite) { setPrev(); @@ -109,7 +109,7 @@ public static void update(RenderContext context) { ptr = writeFloat(ptr, (float) window.getWidth() / (float) window.getHeight()); // default line width: net.minecraft.client.renderer.RenderStateShard.LineStateShard ptr = writeFloat(ptr, Math.max(2.5F, (float) window.getWidth() / 1920.0F * 2.5F)); - ptr = writeFloat(ptr, Minecraft.getInstance().gameRenderer.getGameRenderState().levelRenderState.cameraRenderState.depthFar); + ptr = writeFloat(ptr, Minecraft.getInstance().gameRenderer.getDepthFar()); ptr = writeTime(ptr, context); @@ -178,16 +178,17 @@ private static long writeTime(long ptr, RenderContext context) { return ptr; } - private static long writeCameraIn(long ptr, CameraRenderState camera) { - if (!camera.initialized) { + private static long writeCameraIn(long ptr, Camera camera) { + if (!camera.isInitialized()) { ptr = writeInt(ptr, 0); ptr = writeInt(ptr, 0); return ptr; } - BlockPos blockPos = camera.blockPos; - Vec3 cameraPos = camera.pos; - return writeInFluidAndBlock(ptr, Minecraft.getInstance().level, blockPos, cameraPos); + Level level = camera.entity().level(); + BlockPos blockPos = camera.blockPosition(); + Vec3 cameraPos = camera.position(); + return writeInFluidAndBlock(ptr, level, blockPos, cameraPos); } private static long writeCullData(long ptr) { @@ -198,8 +199,8 @@ private static long writeCullData(long ptr) { int pyramidHeight = DepthPyramid.mip0Size(mainRenderTarget.height); int pyramidDepth = DepthPyramid.getImageMipLevels(pyramidWidth, pyramidHeight); - ptr = writeFloat(ptr, Camera.PROJECTION_Z_NEAR); // zNear - ptr = writeFloat(ptr, mc.gameRenderer.getGameRenderState().levelRenderState.cameraRenderState.depthFar); // zFar + ptr = writeFloat(ptr, GameRenderer.PROJECTION_Z_NEAR); // zNear + ptr = writeFloat(ptr, mc.gameRenderer.getDepthFar()); // zFar ptr = writeFloat(ptr, PROJECTION.m00()); // P00 ptr = writeFloat(ptr, PROJECTION.m11()); // P11 ptr = writeFloat(ptr, pyramidWidth); // pyramidWidth diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/engine/uniform/LevelUniforms.java b/common/src/backend/java/dev/engine_room/flywheel/backend/engine/uniform/LevelUniforms.java index 25ce0f0a5..871cf58b4 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/engine/uniform/LevelUniforms.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/engine/uniform/LevelUniforms.java @@ -3,11 +3,12 @@ import org.joml.Vector3f; import dev.engine_room.flywheel.api.backend.RenderContext; -import dev.engine_room.flywheel.backend.mixin.LevelRendererAccessor; +import net.minecraft.client.Camera; import net.minecraft.client.multiplayer.ClientLevel; -import net.minecraft.client.renderer.state.level.LevelRenderState; import net.minecraft.resources.ResourceKey; import net.minecraft.util.ARGB; +import net.minecraft.world.attribute.EnvironmentAttributeProbe; +import net.minecraft.world.attribute.EnvironmentAttributes; import net.minecraft.world.level.Level; import net.minecraft.world.level.dimension.DimensionType; @@ -26,17 +27,18 @@ public static void update(RenderContext context) { ClientLevel level = context.level(); float partialTick = context.partialTick(); - LevelRenderState levelRenderState = ((LevelRendererAccessor) context.renderer()).flywheel$getLevelRenderState(); + Camera camera = context.camera(); + EnvironmentAttributeProbe probe = camera.attributeProbe(); - int skyColor = levelRenderState.skyRenderState.skyColor; - int cloudColor = levelRenderState.cloudColor; + int skyColor = probe.getValue(EnvironmentAttributes.SKY_COLOR, partialTick); + int cloudColor = probe.getValue(EnvironmentAttributes.CLOUD_COLOR, partialTick); ptr = writeVec4(ptr, ARGB.redFloat(skyColor), ARGB.greenFloat(skyColor), ARGB.blueFloat(skyColor), 1f); ptr = writeVec4(ptr, ARGB.redFloat(cloudColor), ARGB.greenFloat(cloudColor), ARGB.blueFloat(cloudColor), 1f); ptr = writeVec3(ptr, LIGHT0_DIRECTION); ptr = writeVec3(ptr, LIGHT1_DIRECTION); - long dayTime = level.getDefaultClockTime(); + long dayTime = level.getDayTime(); long levelDay = dayTime / 24000L; float timeOfDay = (float) (dayTime - levelDay * 24000L) / 24000f; ptr = writeInt(ptr, (int) (levelDay % 0x7FFFFFFFL)); @@ -44,17 +46,17 @@ public static void update(RenderContext context) { ptr = writeInt(ptr, level.dimensionType().hasSkyLight() ? 1 : 0); - float sunAngle = levelRenderState.skyRenderState.sunAngle; + float sunAngle = probe.getValue(EnvironmentAttributes.SUN_ANGLE, partialTick); ptr = writeFloat(ptr, sunAngle); - float moonAngle = levelRenderState.skyRenderState.moonAngle; + float moonAngle = probe.getValue(EnvironmentAttributes.MOON_ANGLE, partialTick); ptr = writeFloat(ptr, moonAngle); - float starAngle = levelRenderState.skyRenderState.starAngle; + float starAngle = probe.getValue(EnvironmentAttributes.STAR_ANGLE, partialTick); ptr = writeFloat(ptr, starAngle); - int moonPhase = levelRenderState.skyRenderState.moonPhase.index(); + int moonPhase = probe.getValue(EnvironmentAttributes.MOON_PHASE, partialTick).index(); ptr = writeFloat(ptr, DimensionType.MOON_BRIGHTNESS_PER_PHASE[moonPhase]); ptr = writeInt(ptr, moonPhase); - float starBrightness = levelRenderState.skyRenderState.starBrightness; + float starBrightness = probe.getValue(EnvironmentAttributes.STAR_BRIGHTNESS, partialTick); ptr = writeFloat(ptr, starBrightness); ptr = writeInt(ptr, level.isRaining() ? 1 : 0); diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/mixin/CameraMixin.java b/common/src/backend/java/dev/engine_room/flywheel/backend/mixin/CameraMixin.java deleted file mode 100644 index 9f54b1b0b..000000000 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/mixin/CameraMixin.java +++ /dev/null @@ -1,25 +0,0 @@ -package dev.engine_room.flywheel.backend.mixin; - -import org.joml.Vector3f; -import org.spongepowered.asm.mixin.Final; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -import dev.engine_room.flywheel.backend.CameraRenderStateExtension; -import net.minecraft.client.Camera; -import net.minecraft.client.renderer.state.level.CameraRenderState; - -@Mixin(Camera.class) -abstract class CameraMixin { - @Shadow - @Final - private Vector3f forwards; - - @Inject(method = "extractRenderState", at = @At("TAIL")) - private void flywheel$extendRenderState(CameraRenderState cameraState, float cameraEntityPartialTicks, CallbackInfo ci) { - ((CameraRenderStateExtension) cameraState).flywheel$getForwardVector().set(this.forwards); - } -} diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/mixin/CameraRenderStateMixin.java b/common/src/backend/java/dev/engine_room/flywheel/backend/mixin/CameraRenderStateMixin.java deleted file mode 100644 index b5e259a5e..000000000 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/mixin/CameraRenderStateMixin.java +++ /dev/null @@ -1,18 +0,0 @@ -package dev.engine_room.flywheel.backend.mixin; - -import org.joml.Vector3f; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Unique; - -import dev.engine_room.flywheel.backend.CameraRenderStateExtension; -import net.minecraft.client.renderer.state.level.CameraRenderState; - -@Mixin(CameraRenderState.class) -abstract class CameraRenderStateMixin implements CameraRenderStateExtension { - @Unique private final Vector3f flywheel$forwardVector = new Vector3f(); - - @Override - public Vector3f flywheel$getForwardVector() { - return this.flywheel$forwardVector; - } -} diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/mixin/FogRendererMixin.java b/common/src/backend/java/dev/engine_room/flywheel/backend/mixin/FogRendererMixin.java index d57a0eb5c..d0b9bb098 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/mixin/FogRendererMixin.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/mixin/FogRendererMixin.java @@ -14,8 +14,8 @@ @Mixin(FogRenderer.class) abstract class FogRendererMixin { - @Inject(method = "setupFog", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/fog/FogRenderer;computeFogColor(Lnet/minecraft/client/Camera;FLnet/minecraft/client/multiplayer/ClientLevel;IFLorg/joml/Vector4f;)V")) - private static void flywheel$onReturnSetupFog(CallbackInfoReturnable cir, @Local FogData fogData) { - FogUniforms.update(fogData.color, fogData.environmentalStart, fogData.environmentalEnd, fogData.renderDistanceStart, fogData.renderDistanceEnd, fogData.skyEnd, fogData.cloudEnd); + @Inject(method = "setupFog(Lnet/minecraft/client/Camera;ILnet/minecraft/client/DeltaTracker;FLnet/minecraft/client/multiplayer/ClientLevel;)Lorg/joml/Vector4f;", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/fog/FogRenderer;updateBuffer(Ljava/nio/ByteBuffer;ILorg/joml/Vector4f;FFFFFF)V")) + private static void flywheel$onReturnSetupFog(CallbackInfoReturnable cir, @Local Vector4f fogColor, @Local FogData fogData) { + FogUniforms.update(fogColor, fogData.environmentalStart, fogData.environmentalEnd, fogData.renderDistanceStart, fogData.renderDistanceEnd, fogData.skyEnd, fogData.cloudEnd); } } diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/mixin/GpuDeviceAccessor.java b/common/src/backend/java/dev/engine_room/flywheel/backend/mixin/GpuDeviceAccessor.java deleted file mode 100644 index f740a71db..000000000 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/mixin/GpuDeviceAccessor.java +++ /dev/null @@ -1,13 +0,0 @@ -package dev.engine_room.flywheel.backend.mixin; - -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.gen.Accessor; - -import com.mojang.blaze3d.systems.GpuDevice; -import com.mojang.blaze3d.systems.GpuDeviceBackend; - -@Mixin(GpuDevice.class) -public interface GpuDeviceAccessor { - @Accessor - GpuDeviceBackend getBackend(); -} diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/mixin/LevelRendererAccessor.java b/common/src/backend/java/dev/engine_room/flywheel/backend/mixin/LevelRendererAccessor.java index 646e92c43..b0a429f98 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/mixin/LevelRendererAccessor.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/mixin/LevelRendererAccessor.java @@ -4,13 +4,9 @@ import org.spongepowered.asm.mixin.gen.Accessor; import net.minecraft.client.renderer.LevelRenderer; -import net.minecraft.client.renderer.state.level.LevelRenderState; @Mixin(LevelRenderer.class) public interface LevelRendererAccessor { @Accessor("ticks") int flywheel$getTicks(); - - @Accessor("levelRenderState") - LevelRenderState flywheel$getLevelRenderState(); } diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/mixin/light/LayerLightSectionStorageAccessor.java b/common/src/backend/java/dev/engine_room/flywheel/backend/mixin/light/LayerLightSectionStorageAccessor.java index f7cb652ce..562ac36db 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/mixin/light/LayerLightSectionStorageAccessor.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/mixin/light/LayerLightSectionStorageAccessor.java @@ -1,6 +1,7 @@ package dev.engine_room.flywheel.backend.mixin.light; -import org.jspecify.annotations.Nullable; +import javax.annotation.Nullable; + import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.gen.Invoker; diff --git a/common/src/lib/java/dev/engine_room/flywheel/lib/instance/FlatLit.java b/common/src/lib/java/dev/engine_room/flywheel/lib/instance/FlatLit.java index 3109c90fa..9fe9f4884 100644 --- a/common/src/lib/java/dev/engine_room/flywheel/lib/instance/FlatLit.java +++ b/common/src/lib/java/dev/engine_room/flywheel/lib/instance/FlatLit.java @@ -8,7 +8,7 @@ import dev.engine_room.flywheel.api.instance.Instance; import dev.engine_room.flywheel.lib.visual.AbstractBlockEntityVisual; import dev.engine_room.flywheel.lib.visual.AbstractEntityVisual; -import net.minecraft.util.LightCoordsUtil; +import net.minecraft.client.renderer.LightTexture; /** * An interface that implementors of {@link Instance} should also implement if they wish to make use of @@ -17,7 +17,7 @@ public interface FlatLit extends Instance { /** * Set the packed light value for this instance. - * @param packedLight the packed light per {@link LightCoordsUtil#pack(int, int)} + * @param packedLight the packed light per {@link LightTexture#pack(int, int)} * @return {@code this} for chaining */ FlatLit light(int packedLight); @@ -29,7 +29,7 @@ public interface FlatLit extends Instance { * @return {@code this} for chaining */ default FlatLit light(int blockLight, int skyLight) { - return light(LightCoordsUtil.pack(blockLight, skyLight)); + return light(LightTexture.pack(blockLight, skyLight)); } static void relight(int packedLight, @Nullable FlatLit... instances) { diff --git a/common/src/lib/java/dev/engine_room/flywheel/lib/material/Materials.java b/common/src/lib/java/dev/engine_room/flywheel/lib/material/Materials.java index 2c94ed015..d8d768339 100644 --- a/common/src/lib/java/dev/engine_room/flywheel/lib/material/Materials.java +++ b/common/src/lib/java/dev/engine_room/flywheel/lib/material/Materials.java @@ -5,7 +5,7 @@ import dev.engine_room.flywheel.api.material.Material; import dev.engine_room.flywheel.api.material.Transparency; import dev.engine_room.flywheel.api.material.WriteMask; -import net.minecraft.client.renderer.feature.ItemFeatureRenderer; +import net.minecraft.client.renderer.entity.ItemRenderer; import net.minecraft.client.renderer.texture.TextureAtlas; // FIXME 1.21.11: use default blur/mipmap from AbstractTexture for all materials here, and by default @@ -40,7 +40,7 @@ public final class Materials { .build(); public static final Material GLINT = SimpleMaterial.builder() - .texture(ItemFeatureRenderer.ENCHANTED_GLINT_ITEM) + .texture(ItemRenderer.ENCHANTED_GLINT_ITEM) .shaders(StandardMaterialShaders.GLINT) .transparency(Transparency.GLINT) .writeMask(WriteMask.COLOR) diff --git a/common/src/lib/java/dev/engine_room/flywheel/lib/model/LineModelBuilder.java b/common/src/lib/java/dev/engine_room/flywheel/lib/model/LineModelBuilder.java index 17eac0047..1012ae04f 100644 --- a/common/src/lib/java/dev/engine_room/flywheel/lib/model/LineModelBuilder.java +++ b/common/src/lib/java/dev/engine_room/flywheel/lib/model/LineModelBuilder.java @@ -16,8 +16,8 @@ import dev.engine_room.flywheel.lib.memory.MemoryBlock; import dev.engine_room.flywheel.lib.vertex.FullVertexView; import dev.engine_room.flywheel.lib.vertex.VertexView; +import net.minecraft.client.renderer.LightTexture; import net.minecraft.client.renderer.texture.OverlayTexture; -import net.minecraft.util.LightCoordsUtil; public final class LineModelBuilder { private static final Material MATERIAL = SimpleMaterial.builder() @@ -91,7 +91,7 @@ public LineModelBuilder line(float x1, float y1, float z1, float x2, float y2, f vertexView.u(vertexCount + i, 0); vertexView.v(vertexCount + i, 0); vertexView.overlay(vertexCount + i, OverlayTexture.NO_OVERLAY); - vertexView.light(vertexCount + i, LightCoordsUtil.FULL_BRIGHT); + vertexView.light(vertexCount + i, LightTexture.FULL_BRIGHT); vertexView.normalX(vertexCount + i, normalX); vertexView.normalY(vertexCount + i, normalY); vertexView.normalZ(vertexCount + i, normalZ); diff --git a/common/src/lib/java/dev/engine_room/flywheel/lib/model/ModelUtil.java b/common/src/lib/java/dev/engine_room/flywheel/lib/model/ModelUtil.java index 597aa4654..5cfdd0d76 100644 --- a/common/src/lib/java/dev/engine_room/flywheel/lib/model/ModelUtil.java +++ b/common/src/lib/java/dev/engine_room/flywheel/lib/model/ModelUtil.java @@ -82,9 +82,9 @@ public static Material getItemMaterial(RenderType renderType) { return Materials.CUTOUT_BLOCK; } - /*if (renderType == Sheets.solidBlockSheet()) { + if (renderType == Sheets.solidBlockSheet()) { return Materials.SOLID_BLOCK; - }*/ + } if (renderType == Sheets.translucentBlockItemSheet()) { return Materials.TRANSLUCENT_ITEM_ENTITY_BLOCK; diff --git a/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/BlockModelBuilder.java b/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/BlockModelBuilder.java index 8532fa0fb..0b0e77270 100644 --- a/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/BlockModelBuilder.java +++ b/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/BlockModelBuilder.java @@ -10,10 +10,10 @@ import dev.engine_room.flywheel.lib.internal.FlwLibXplat; import dev.engine_room.flywheel.lib.model.ModelUtil; import dev.engine_room.flywheel.lib.model.SimpleModel; -import net.minecraft.client.renderer.block.BlockAndTintGetter; -import net.minecraft.client.renderer.block.dispatch.BlockStateModel; +import net.minecraft.client.renderer.block.model.BlockStateModel; import net.minecraft.client.renderer.chunk.ChunkSectionLayer; import net.minecraft.core.BlockPos; +import net.minecraft.world.level.BlockAndTintGetter; public final class BlockModelBuilder { final BlockStateModel blockModel; diff --git a/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/EmptyVertexConsumer.java b/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/EmptyVertexConsumer.java deleted file mode 100644 index 1901069f8..000000000 --- a/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/EmptyVertexConsumer.java +++ /dev/null @@ -1,49 +0,0 @@ -package dev.engine_room.flywheel.lib.model.baked; - -import com.mojang.blaze3d.vertex.VertexConsumer; - -public class EmptyVertexConsumer implements VertexConsumer { - public static final EmptyVertexConsumer INSTANCE = new EmptyVertexConsumer(); - - private EmptyVertexConsumer() {} - - @Override - public VertexConsumer addVertex(float x, float y, float z) { - return this; - } - - @Override - public VertexConsumer setColor(int r, int g, int b, int a) { - return this; - } - - @Override - public VertexConsumer setColor(int color) { - return this; - } - - @Override - public VertexConsumer setUv(float u, float v) { - return this; - } - - @Override - public VertexConsumer setUv1(int u, int v) { - return this; - } - - @Override - public VertexConsumer setUv2(int u, int v) { - return this; - } - - @Override - public VertexConsumer setNormal(float x, float y, float z) { - return this; - } - - @Override - public VertexConsumer setLineWidth(float width) { - return this; - } -} diff --git a/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/EmptyVirtualBlockGetter.java b/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/EmptyVirtualBlockGetter.java index 6371ce1fd..1bd6829c4 100644 --- a/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/EmptyVirtualBlockGetter.java +++ b/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/EmptyVirtualBlockGetter.java @@ -5,7 +5,6 @@ import org.jspecify.annotations.Nullable; import net.minecraft.core.BlockPos; -import net.minecraft.world.level.CardinalLighting; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.state.BlockState; @@ -45,9 +44,4 @@ public final int getHeight() { public final int getMinY() { return 0; } - - @Override - public CardinalLighting cardinalLighting() { - return CardinalLighting.DEFAULT; - } } diff --git a/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/LevelModelBuilder.java b/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/LevelModelBuilder.java index 1aa716adc..3748c3ba5 100644 --- a/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/LevelModelBuilder.java +++ b/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/LevelModelBuilder.java @@ -10,9 +10,9 @@ import dev.engine_room.flywheel.lib.internal.FlwLibXplat; import dev.engine_room.flywheel.lib.model.ModelUtil; import dev.engine_room.flywheel.lib.model.SimpleModel; -import net.minecraft.client.renderer.block.BlockAndTintGetter; import net.minecraft.client.renderer.chunk.ChunkSectionLayer; import net.minecraft.core.BlockPos; +import net.minecraft.world.level.BlockAndTintGetter; public final class LevelModelBuilder { final BlockAndTintGetter level; diff --git a/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/PartialModel.java b/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/PartialModel.java index 68c30a8d6..3ab6be8cb 100644 --- a/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/PartialModel.java +++ b/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/PartialModel.java @@ -4,8 +4,8 @@ import org.jetbrains.annotations.UnknownNullability; import dev.engine_room.flywheel.lib.internal.FlwLibXplat; -import net.minecraft.client.renderer.block.dispatch.BlockStateModel; -import net.minecraft.client.resources.model.SimpleModelWrapper; +import net.minecraft.client.renderer.block.model.BlockStateModel; +import net.minecraft.client.renderer.block.model.SimpleModelWrapper; import net.minecraft.resources.Identifier; /** diff --git a/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/SinglePosVirtualBlockGetter.java b/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/SinglePosVirtualBlockGetter.java index 54c28751a..729ad5565 100644 --- a/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/SinglePosVirtualBlockGetter.java +++ b/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/SinglePosVirtualBlockGetter.java @@ -5,7 +5,6 @@ import org.jspecify.annotations.Nullable; import net.minecraft.core.BlockPos; -import net.minecraft.world.level.CardinalLighting; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.state.BlockState; @@ -71,9 +70,4 @@ public int getHeight() { public int getMinY() { return pos.getY(); } - - @Override - public CardinalLighting cardinalLighting() { - return CardinalLighting.DEFAULT; - } } diff --git a/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/VirtualBlockGetter.java b/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/VirtualBlockGetter.java index 6a17569ab..808200da8 100644 --- a/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/VirtualBlockGetter.java +++ b/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/VirtualBlockGetter.java @@ -3,9 +3,10 @@ import java.util.function.ToIntFunction; import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.block.BlockAndTintGetter; import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; import net.minecraft.core.registries.Registries; +import net.minecraft.world.level.BlockAndTintGetter; import net.minecraft.world.level.ColorResolver; import net.minecraft.world.level.biome.Biome; import net.minecraft.world.level.biome.Biomes; @@ -24,6 +25,11 @@ public FluidState getFluidState(BlockPos pos) { return getBlockState(pos).getFluidState(); } + @Override + public float getShade(Direction direction, boolean shaded) { + return 1f; + } + @Override public LevelLightEngine getLightEngine() { return lightEngine; diff --git a/common/src/lib/java/dev/engine_room/flywheel/lib/model/part/MeshTree.java b/common/src/lib/java/dev/engine_room/flywheel/lib/model/part/MeshTree.java index e60cc942f..406729011 100644 --- a/common/src/lib/java/dev/engine_room/flywheel/lib/model/part/MeshTree.java +++ b/common/src/lib/java/dev/engine_room/flywheel/lib/model/part/MeshTree.java @@ -19,8 +19,8 @@ import net.minecraft.client.model.geom.ModelLayerLocation; import net.minecraft.client.model.geom.ModelPart; import net.minecraft.client.model.geom.PartPose; +import net.minecraft.client.renderer.LightTexture; import net.minecraft.client.renderer.texture.OverlayTexture; -import net.minecraft.util.LightCoordsUtil; public final class MeshTree { private static final ThreadLocal THREAD_LOCAL_OBJECTS = ThreadLocal.withInitial(ThreadLocalObjects::new); @@ -74,7 +74,7 @@ private static Mesh compile(ModelPart modelPart, ThreadLocalObjects objects) { } VertexWriter vertexWriter = objects.vertexWriter; - FlwLibLink.INSTANCE.compileModelPart(modelPart, IDENTITY_POSE, vertexWriter, LightCoordsUtil.FULL_BRIGHT, OverlayTexture.NO_OVERLAY, 0xFFFFFFFF); + FlwLibLink.INSTANCE.compileModelPart(modelPart, IDENTITY_POSE, vertexWriter, LightTexture.FULL_BRIGHT, OverlayTexture.NO_OVERLAY, 0xFFFFFFFF); MemoryBlock data = vertexWriter.copyDataAndReset(); VertexView vertexView = new PosTexNormalVertexView(); diff --git a/common/src/lib/java/dev/engine_room/flywheel/lib/model/part/ModelTrees.java b/common/src/lib/java/dev/engine_room/flywheel/lib/model/part/ModelTrees.java index 6f9d126ef..c1bccb4da 100644 --- a/common/src/lib/java/dev/engine_room/flywheel/lib/model/part/ModelTrees.java +++ b/common/src/lib/java/dev/engine_room/flywheel/lib/model/part/ModelTrees.java @@ -16,8 +16,7 @@ import net.minecraft.client.Minecraft; import net.minecraft.client.model.geom.ModelLayerLocation; import net.minecraft.client.renderer.texture.TextureAtlasSprite; -import net.minecraft.client.resources.model.sprite.AtlasManager; -import net.minecraft.client.resources.model.sprite.SpriteId; +import net.minecraft.client.resources.model.AtlasManager; public final class ModelTrees { private static final RendererReloadCache CACHE = new RendererReloadCache<>(k -> { @@ -38,7 +37,7 @@ public static ModelTree of(ModelLayerLocation layer, Material material) { return CACHE.get(new ModelTreeKey(layer, Collections.emptySet(), null, material)); } - public static ModelTree of(ModelLayerLocation layer, SpriteId texture, Material material) { + public static ModelTree of(ModelLayerLocation layer, net.minecraft.client.resources.model.Material texture, Material material) { return CACHE.get(new ModelTreeKey(layer, Collections.emptySet(), texture, material)); } @@ -46,7 +45,7 @@ public static ModelTree of(ModelLayerLocation layer, Set pathsToPrune, M return CACHE.get(new ModelTreeKey(layer, Set.copyOf(pathsToPrune), null, material)); } - public static ModelTree of(ModelLayerLocation layer, Set pathsToPrune, SpriteId texture, Material material) { + public static ModelTree of(ModelLayerLocation layer, Set pathsToPrune, net.minecraft.client.resources.model.Material texture, Material material) { return CACHE.get(new ModelTreeKey(layer, Set.copyOf(pathsToPrune), texture, material)); } @@ -82,6 +81,6 @@ private static ModelTree convert(String path, MeshTree meshTree, Set pat return new ModelTree(model, meshTree.initialPose(), children); } - private record ModelTreeKey(ModelLayerLocation layer, Set pathsToPrune, @Nullable SpriteId texture, Material material) { + private record ModelTreeKey(ModelLayerLocation layer, Set pathsToPrune, net.minecraft.client.resources.model.@Nullable Material texture, Material material) { } } diff --git a/common/src/lib/java/dev/engine_room/flywheel/lib/visual/AbstractBlockEntityVisual.java b/common/src/lib/java/dev/engine_room/flywheel/lib/visual/AbstractBlockEntityVisual.java index 1949440e6..63bf3769f 100644 --- a/common/src/lib/java/dev/engine_room/flywheel/lib/visual/AbstractBlockEntityVisual.java +++ b/common/src/lib/java/dev/engine_room/flywheel/lib/visual/AbstractBlockEntityVisual.java @@ -2,9 +2,9 @@ import java.util.Iterator; +import org.jspecify.annotations.Nullable; import org.jetbrains.annotations.UnknownNullability; import org.joml.FrustumIntersection; -import org.jspecify.annotations.Nullable; import dev.engine_room.flywheel.api.visual.BlockEntityVisual; import dev.engine_room.flywheel.api.visual.DynamicVisual; @@ -96,15 +96,15 @@ public boolean isVisible(FrustumIntersection frustum) { */ public boolean doDistanceLimitThisFrame(DynamicVisual.Context context) { return !context.limiter() - .shouldUpdate(pos.distToCenterSqr(context.cameraRenderState().pos)); + .shouldUpdate(pos.distToCenterSqr(context.camera().position())); } protected int computePackedLight() { - return LevelRenderer.getLightCoords(level, pos); + return LevelRenderer.getLightColor(level, pos); } protected void relight(BlockPos pos, @Nullable FlatLit... instances) { - FlatLit.relight(LevelRenderer.getLightCoords(level, pos), instances); + FlatLit.relight(LevelRenderer.getLightColor(level, pos), instances); } protected void relight(@Nullable FlatLit... instances) { @@ -112,7 +112,7 @@ protected void relight(@Nullable FlatLit... instances) { } protected void relight(BlockPos pos, Iterator<@Nullable FlatLit> instances) { - FlatLit.relight(LevelRenderer.getLightCoords(level, pos), instances); + FlatLit.relight(LevelRenderer.getLightColor(level, pos), instances); } protected void relight(Iterator<@Nullable FlatLit> instances) { @@ -120,7 +120,7 @@ protected void relight(Iterator<@Nullable FlatLit> instances) { } protected void relight(BlockPos pos, Iterable<@Nullable FlatLit> instances) { - FlatLit.relight(LevelRenderer.getLightCoords(level, pos), instances); + FlatLit.relight(LevelRenderer.getLightColor(level, pos), instances); } protected void relight(Iterable<@Nullable FlatLit> instances) { diff --git a/common/src/lib/java/dev/engine_room/flywheel/lib/visual/AbstractEntityVisual.java b/common/src/lib/java/dev/engine_room/flywheel/lib/visual/AbstractEntityVisual.java index 3061b2d14..fcc235ab3 100644 --- a/common/src/lib/java/dev/engine_room/flywheel/lib/visual/AbstractEntityVisual.java +++ b/common/src/lib/java/dev/engine_room/flywheel/lib/visual/AbstractEntityVisual.java @@ -13,8 +13,8 @@ import dev.engine_room.flywheel.api.visualization.VisualizationManager; import dev.engine_room.flywheel.lib.instance.FlatLit; import dev.engine_room.flywheel.lib.internal.FlwLibLink; +import net.minecraft.client.renderer.LightTexture; import net.minecraft.core.BlockPos; -import net.minecraft.util.LightCoordsUtil; import net.minecraft.util.Mth; import net.minecraft.world.entity.Entity; import net.minecraft.world.level.LightLayer; @@ -97,7 +97,7 @@ protected int computePackedLight(float partialTick) { BlockPos pos = BlockPos.containing(entity.getLightProbePosition(partialTick)); int blockLight = entity.isOnFire() ? 15 : level.getBrightness(LightLayer.BLOCK, pos); int skyLight = level.getBrightness(LightLayer.SKY, pos); - return LightCoordsUtil.pack(blockLight, skyLight); + return LightTexture.pack(blockLight, skyLight); } protected void relight(float partialTick, @Nullable FlatLit... instances) { diff --git a/common/src/lib/java/dev/engine_room/flywheel/lib/visual/component/FireComponent.java b/common/src/lib/java/dev/engine_room/flywheel/lib/visual/component/FireComponent.java index 64a4a7982..a6a24434e 100644 --- a/common/src/lib/java/dev/engine_room/flywheel/lib/visual/component/FireComponent.java +++ b/common/src/lib/java/dev/engine_room/flywheel/lib/visual/component/FireComponent.java @@ -20,10 +20,9 @@ import dev.engine_room.flywheel.lib.util.RendererReloadCache; import dev.engine_room.flywheel.lib.visual.util.SmartRecycler; import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.LightTexture; import net.minecraft.client.renderer.texture.TextureAtlasSprite; import net.minecraft.client.resources.model.ModelBakery; -import net.minecraft.client.resources.model.sprite.SpriteId; -import net.minecraft.util.LightCoordsUtil; import net.minecraft.util.Mth; import net.minecraft.world.entity.Entity; @@ -38,7 +37,7 @@ public final class FireComponent implements EntityComponent { // Parameterize by the material instead of the sprite // because Material#sprite is a surprisingly heavy operation // and because sprites are invalidated after a resource reload. - private static final RendererReloadCache FIRE_MODELS = new RendererReloadCache<>(texture -> { + private static final RendererReloadCache FIRE_MODELS = new RendererReloadCache<>(texture -> { TextureAtlasSprite sprite = Minecraft.getInstance().getAtlasManager().get(texture); return new SingleMeshModel(new FireMesh(sprite), FIRE_MATERIAL); }); @@ -60,7 +59,7 @@ private TransformedInstance createInstance(Model model) { TransformedInstance instance = context.instancerProvider() .instancer(InstanceTypes.TRANSFORMED, model) .createInstance(); - instance.light(LightCoordsUtil.pack(15, 0)); + instance.light(LightTexture.FULL_BLOCK); instance.setChanged(); return instance; } @@ -97,8 +96,8 @@ private void setupInstances(DynamicVisual.Context context) { stack.setIdentity(); stack.translate(entityX - renderOrigin.getX(), entityY - renderOrigin.getY(), entityZ - renderOrigin.getZ()); stack.scale(scale, scale, scale); - stack.mulPose(Axis.YP.rotationDegrees(-context.cameraRenderState() - .yRot)); + stack.mulPose(Axis.YP.rotationDegrees(-context.camera() + .yRot())); stack.translate(0.0F, 0.0F, -0.3F + (float) ((int) maxHeight) * 0.02F); for (int i = 0; y < maxHeight; ++i) { @@ -158,7 +157,7 @@ private static void writeVertex(MutableVertexList vertexList, int i, float x, fl vertexList.b(i, 1); vertexList.u(i, u); vertexList.v(i, v); - vertexList.light(i, LightCoordsUtil.pack(15, 0)); + vertexList.light(i, LightTexture.FULL_BLOCK); vertexList.normalX(i, 0); vertexList.normalY(i, 1); vertexList.normalZ(i, 0); diff --git a/common/src/lib/java/dev/engine_room/flywheel/lib/visual/component/HitboxComponent.java b/common/src/lib/java/dev/engine_room/flywheel/lib/visual/component/HitboxComponent.java index 87e4ccb83..99887fefc 100644 --- a/common/src/lib/java/dev/engine_room/flywheel/lib/visual/component/HitboxComponent.java +++ b/common/src/lib/java/dev/engine_room/flywheel/lib/visual/component/HitboxComponent.java @@ -11,7 +11,7 @@ import dev.engine_room.flywheel.lib.visual.util.SmartRecycler; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.components.debug.DebugScreenEntries; -import net.minecraft.util.LightCoordsUtil; +import net.minecraft.client.renderer.LightTexture; import net.minecraft.util.Mth; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.LivingEntity; @@ -69,7 +69,7 @@ private TransformedInstance createInstance(Model model) { TransformedInstance instance = context.instancerProvider() .instancer(InstanceTypes.TRANSFORMED, model) .createInstance(); - instance.light(LightCoordsUtil.pack(15, 0)); + instance.light(LightTexture.FULL_BLOCK); instance.setChanged(); return instance; } diff --git a/common/src/lib/java/dev/engine_room/flywheel/lib/visual/component/ShadowComponent.java b/common/src/lib/java/dev/engine_room/flywheel/lib/visual/component/ShadowComponent.java index 2a86de5ec..174aab9b6 100644 --- a/common/src/lib/java/dev/engine_room/flywheel/lib/visual/component/ShadowComponent.java +++ b/common/src/lib/java/dev/engine_room/flywheel/lib/visual/component/ShadowComponent.java @@ -1,8 +1,10 @@ package dev.engine_room.flywheel.lib.visual.component; +import net.minecraft.resources.Identifier; + +import org.jspecify.annotations.Nullable; import org.joml.Vector4f; import org.joml.Vector4fc; -import org.jspecify.annotations.Nullable; import dev.engine_room.flywheel.api.material.Material; import dev.engine_room.flywheel.api.material.Transparency; @@ -18,13 +20,11 @@ import dev.engine_room.flywheel.lib.model.SingleMeshModel; import dev.engine_room.flywheel.lib.visual.util.InstanceRecycler; import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.Lightmap; +import net.minecraft.client.renderer.LightTexture; import net.minecraft.client.renderer.texture.OverlayTexture; import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.core.Direction.Axis; -import net.minecraft.resources.Identifier; -import net.minecraft.util.LightCoordsUtil; import net.minecraft.util.Mth; import net.minecraft.world.entity.Entity; import net.minecraft.world.level.Level; @@ -158,7 +158,7 @@ private void setupInstance(ChunkAccess chunk, MutableBlockPos pos, float entityX // Too dark to render. return; } - float blockBrightness = Lightmap.getBrightness(level.dimensionType(), maxLocalRawBrightness); + float blockBrightness = LightTexture.getBrightness(level.dimensionType(), maxLocalRawBrightness); float alpha = strength * 0.5F * blockBrightness; if (alpha < 0.0F) { // Too far away/too weak to render. @@ -257,7 +257,7 @@ private static void writeVertex(MutableVertexList vertexList, int i, float x, fl vertexList.b(i, 1); vertexList.u(i, 0); vertexList.v(i, 0); - vertexList.light(i, LightCoordsUtil.FULL_BRIGHT); + vertexList.light(i, LightTexture.FULL_BRIGHT); vertexList.overlay(i, OverlayTexture.NO_OVERLAY); vertexList.normalX(i, 0); vertexList.normalY(i, 1); diff --git a/common/src/main/java/dev/engine_room/flywheel/impl/event/RenderContextImpl.java b/common/src/main/java/dev/engine_room/flywheel/impl/event/RenderContextImpl.java index 94a19d463..5b52009d5 100644 --- a/common/src/main/java/dev/engine_room/flywheel/impl/event/RenderContextImpl.java +++ b/common/src/main/java/dev/engine_room/flywheel/impl/event/RenderContextImpl.java @@ -4,18 +4,18 @@ import org.joml.Matrix4fc; import dev.engine_room.flywheel.api.backend.RenderContext; +import net.minecraft.client.Camera; import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.client.renderer.LevelRenderer; import net.minecraft.client.renderer.RenderBuffers; -import net.minecraft.client.renderer.state.level.CameraRenderState; public record RenderContextImpl(LevelRenderer renderer, ClientLevel level, RenderBuffers buffers, Matrix4fc modelView, - Matrix4fc projection, Matrix4fc viewProjection, CameraRenderState cameraRenderState, + Matrix4fc projection, Matrix4fc viewProjection, Camera camera, float partialTick) implements RenderContext { - public static RenderContextImpl create(LevelRenderer renderer, ClientLevel level, RenderBuffers buffers, Matrix4fc modelView, Matrix4fc projection, CameraRenderState cameraRenderState, float partialTick) { + public static RenderContextImpl create(LevelRenderer renderer, ClientLevel level, RenderBuffers buffers, Matrix4fc modelView, Matrix4f projection, Camera camera, float partialTick) { Matrix4f viewProjection = new Matrix4f(projection); viewProjection.mul(modelView); - return new RenderContextImpl(renderer, level, buffers, modelView, projection, viewProjection, cameraRenderState, partialTick); + return new RenderContextImpl(renderer, level, buffers, modelView, projection, viewProjection, camera, partialTick); } } diff --git a/common/src/main/java/dev/engine_room/flywheel/impl/mixin/LevelRendererMixin.java b/common/src/main/java/dev/engine_room/flywheel/impl/mixin/LevelRendererMixin.java index e3e5b9741..181f62777 100644 --- a/common/src/main/java/dev/engine_room/flywheel/impl/mixin/LevelRendererMixin.java +++ b/common/src/main/java/dev/engine_room/flywheel/impl/mixin/LevelRendererMixin.java @@ -3,7 +3,7 @@ import java.util.Iterator; import java.util.SortedSet; -import org.joml.Matrix4fc; +import org.joml.Matrix4f; import org.joml.Vector4f; import org.jspecify.annotations.Nullable; import org.spongepowered.asm.mixin.Final; @@ -24,12 +24,11 @@ import dev.engine_room.flywheel.impl.event.RenderContextImpl; import dev.engine_room.flywheel.lib.visualization.VisualizationHelper; import it.unimi.dsi.fastutil.longs.Long2ObjectMap; +import net.minecraft.client.Camera; import net.minecraft.client.DeltaTracker; import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.client.renderer.LevelRenderer; import net.minecraft.client.renderer.RenderBuffers; -import net.minecraft.client.renderer.chunk.ChunkSectionsToRender; -import net.minecraft.client.renderer.state.level.CameraRenderState; import net.minecraft.server.level.BlockDestructionProgress; import net.minecraft.world.entity.Entity; @@ -51,9 +50,10 @@ abstract class LevelRendererMixin { @Nullable private RenderContextImpl flywheel$renderContext; - @Inject(method = "renderLevel", at = @At("HEAD")) - private void flywheel$beginRender(GraphicsResourceAllocator resourceAllocator, DeltaTracker deltaTracker, boolean renderOutline, CameraRenderState cameraState, Matrix4fc modelViewMatrix, GpuBufferSlice terrainFog, Vector4f fogColor, boolean shouldRenderSky, ChunkSectionsToRender chunkSectionsToRender, CallbackInfo ci) { - flywheel$renderContext = RenderContextImpl.create((LevelRenderer) (Object) this, level, renderBuffers, modelViewMatrix, cameraState.projectionMatrix, cameraState, deltaTracker.getGameTimeDeltaPartialTick(false)); + // @Inject(method = "renderLevel", at = @At("HEAD")) + @Inject(method = "renderLevel", at = @At(value = "INVOKE_ASSIGN", target = "Lnet/minecraft/world/level/lighting/LevelLightEngine;runLightUpdates()I")) + private void flywheel$beginRender(GraphicsResourceAllocator resourceAllocator, DeltaTracker deltaTracker, boolean renderOutline, Camera camera, Matrix4f modelViewMatrix, Matrix4f projectionMatrix, Matrix4f cullingProjectionMatrix, GpuBufferSlice shaderFog, Vector4f fogColor, boolean renderSky, CallbackInfo ci) { + flywheel$renderContext = RenderContextImpl.create((LevelRenderer) (Object) this, level, renderBuffers, modelViewMatrix, projectionMatrix, camera, deltaTracker.getGameTimeDeltaPartialTick(false)); VisualizationManager manager = VisualizationManager.get(level); if (manager != null) { @@ -73,7 +73,7 @@ abstract class LevelRendererMixin { } } - @Inject(method = "lambda$addMainPass$0", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/LevelRenderer;submitBlockEntities(Lcom/mojang/blaze3d/vertex/PoseStack;Lnet/minecraft/client/renderer/state/level/LevelRenderState;Lnet/minecraft/client/renderer/SubmitNodeStorage;)V")) + @Inject(method = "method_62214", at = @At(value = "INVOKE_STRING", target = "Lnet/minecraft/util/profiling/ProfilerFiller;popPush(Ljava/lang/String;)V", args = "ldc=submitBlockEntities")) private void flywheel$beforeBlockEntities(CallbackInfo ci) { if (flywheel$renderContext != null) { VisualizationManager manager = VisualizationManager.get(level); @@ -83,7 +83,7 @@ abstract class LevelRendererMixin { } } - @Inject(method = "lambda$addMainPass$0", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/LevelRenderer;submitBlockDestroyAnimation(Lcom/mojang/blaze3d/vertex/PoseStack;Lnet/minecraft/client/renderer/SubmitNodeCollector;Lnet/minecraft/client/renderer/state/level/LevelRenderState;)V")) + @Inject(method = "method_62214", at = @At(value = "INVOKE_STRING", target = "Lnet/minecraft/util/profiling/ProfilerFiller;push(Ljava/lang/String;)V", args = "ldc=destroyProgress")) private void flywheel$beforeRenderCrumbling(CallbackInfo ci) { if (flywheel$renderContext != null) { VisualizationManager manager = VisualizationManager.get(level); diff --git a/common/src/main/java/dev/engine_room/flywheel/impl/visual/DynamicVisualContextImpl.java b/common/src/main/java/dev/engine_room/flywheel/impl/visual/DynamicVisualContextImpl.java index fe9f13162..09803bdae 100644 --- a/common/src/main/java/dev/engine_room/flywheel/impl/visual/DynamicVisualContextImpl.java +++ b/common/src/main/java/dev/engine_room/flywheel/impl/visual/DynamicVisualContextImpl.java @@ -4,8 +4,8 @@ import dev.engine_room.flywheel.api.visual.DistanceUpdateLimiter; import dev.engine_room.flywheel.api.visual.DynamicVisual; -import net.minecraft.client.renderer.state.level.CameraRenderState; +import net.minecraft.client.Camera; -public record DynamicVisualContextImpl(CameraRenderState cameraRenderState, FrustumIntersection frustum, float partialTick, - DistanceUpdateLimiter limiter) implements DynamicVisual.Context { +public record DynamicVisualContextImpl(Camera camera, FrustumIntersection frustum, float partialTick, + DistanceUpdateLimiter limiter) implements DynamicVisual.Context { } diff --git a/common/src/main/java/dev/engine_room/flywheel/impl/visualization/VisualizationManagerImpl.java b/common/src/main/java/dev/engine_room/flywheel/impl/visualization/VisualizationManagerImpl.java index 6a9deff15..4c1002672 100644 --- a/common/src/main/java/dev/engine_room/flywheel/impl/visualization/VisualizationManagerImpl.java +++ b/common/src/main/java/dev/engine_room/flywheel/impl/visualization/VisualizationManagerImpl.java @@ -112,7 +112,7 @@ private LateInit(LevelAccessor level) { var update = MapContextPlan.map(this::createVisualFrameContext) .to(NestedPlan.of(blockEntities.framePlan(visualizationContext), entities.framePlan(visualizationContext), effects.framePlan(visualizationContext))); - framePlan = IfElsePlan.on((RenderContext ctx) -> engine.updateRenderOrigin(ctx.cameraRenderState())) + framePlan = IfElsePlan.on((RenderContext ctx) -> engine.updateRenderOrigin(ctx.camera())) .ifTrue(recreate) .ifFalse(update) .plan() @@ -134,14 +134,14 @@ private LateInit(LevelAccessor level) { private DynamicVisual.Context createVisualFrameContext(RenderContext ctx) { Vec3i renderOrigin = engine.renderOrigin(); - var cameraPos = ctx.cameraRenderState() - .pos; + var cameraPos = ctx.camera() + .position(); Matrix4f viewProjection = new Matrix4f(ctx.viewProjection()); viewProjection.translate((float) (renderOrigin.getX() - cameraPos.x), (float) (renderOrigin.getY() - cameraPos.y), (float) (renderOrigin.getZ() - cameraPos.z)); FrustumIntersection frustum = new FrustumIntersection(viewProjection); - return new DynamicVisualContextImpl(ctx.cameraRenderState(), frustum, ctx.partialTick(), frameLimiter); + return new DynamicVisualContextImpl(ctx.camera(), frustum, ctx.partialTick(), frameLimiter); } } diff --git a/common/src/vanillin/java/dev/engine_room/vanillin/elements/FireElement.java b/common/src/vanillin/java/dev/engine_room/vanillin/elements/FireElement.java index 5c6b29085..1c6f0a49c 100644 --- a/common/src/vanillin/java/dev/engine_room/vanillin/elements/FireElement.java +++ b/common/src/vanillin/java/dev/engine_room/vanillin/elements/FireElement.java @@ -22,10 +22,9 @@ import dev.engine_room.flywheel.lib.visual.SimpleDynamicVisual; import dev.engine_room.flywheel.lib.visual.util.SmartRecycler; import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.LightTexture; import net.minecraft.client.renderer.texture.TextureAtlasSprite; import net.minecraft.client.resources.model.ModelBakery; -import net.minecraft.client.resources.model.sprite.SpriteId; -import net.minecraft.util.LightCoordsUtil; import net.minecraft.util.Mth; import net.minecraft.world.entity.Entity; @@ -40,7 +39,7 @@ public final class FireElement extends AbstractVisual implements SimpleDynamicVi // Parameterize by the material instead of the sprite // because Material#sprite is a surprisingly heavy operation // and because sprites are invalidated after a resource reload. - private static final RendererReloadCache FIRE_MODELS = new RendererReloadCache<>(texture -> { + private static final RendererReloadCache FIRE_MODELS = new RendererReloadCache<>(texture -> { TextureAtlasSprite sprite = Minecraft.getInstance().getAtlasManager().get(texture); return new SingleMeshModel(new FireMesh(sprite), FIRE_MATERIAL); }); @@ -62,7 +61,7 @@ private TransformedInstance createInstance(Model model) { TransformedInstance instance = visualizationContext.instancerProvider() .instancer(InstanceTypes.TRANSFORMED, model) .createInstance(); - instance.light(LightCoordsUtil.pack(15, 0)); + instance.light(LightTexture.FULL_BLOCK); instance.setChanged(); return instance; } @@ -99,8 +98,8 @@ private void setupInstances(DynamicVisual.Context context) { stack.setIdentity(); stack.translate(entityX - renderOrigin.getX(), entityY - renderOrigin.getY(), entityZ - renderOrigin.getZ()); stack.scale(scale, scale, scale); - stack.mulPose(Axis.YP.rotationDegrees(-context.cameraRenderState() - .yRot)); + stack.mulPose(Axis.YP.rotationDegrees(-context.camera() + .yRot())); stack.translate(0.0F, 0.0F, -0.3F + (float) ((int) maxHeight) * 0.02F); for (int i = 0; y < maxHeight; ++i) { @@ -160,7 +159,7 @@ private static void writeVertex(MutableVertexList vertexList, int i, float x, fl vertexList.b(i, 1); vertexList.u(i, u); vertexList.v(i, v); - vertexList.light(i, LightCoordsUtil.pack(15, 0)); + vertexList.light(i, LightTexture.FULL_BLOCK); vertexList.normalX(i, 0); vertexList.normalY(i, 1); vertexList.normalZ(i, 0); diff --git a/common/src/vanillin/java/dev/engine_room/vanillin/elements/HitboxElement.java b/common/src/vanillin/java/dev/engine_room/vanillin/elements/HitboxElement.java index c83addedd..6e024ad80 100644 --- a/common/src/vanillin/java/dev/engine_room/vanillin/elements/HitboxElement.java +++ b/common/src/vanillin/java/dev/engine_room/vanillin/elements/HitboxElement.java @@ -13,7 +13,7 @@ import dev.engine_room.flywheel.lib.visual.util.SmartRecycler; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.components.debug.DebugScreenEntries; -import net.minecraft.util.LightCoordsUtil; +import net.minecraft.client.renderer.LightTexture; import net.minecraft.util.Mth; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.LivingEntity; @@ -77,7 +77,7 @@ private TransformedInstance createInstance(Model model) { TransformedInstance instance = context.instancerProvider() .instancer(InstanceTypes.TRANSFORMED, model) .createInstance(); - instance.light(LightCoordsUtil.pack(15, 0)); + instance.light(LightTexture.FULL_BLOCK); instance.setChanged(); return instance; } diff --git a/common/src/vanillin/java/dev/engine_room/vanillin/elements/ShadowElement.java b/common/src/vanillin/java/dev/engine_room/vanillin/elements/ShadowElement.java index 9bf9fafbb..5c6c8aa1d 100644 --- a/common/src/vanillin/java/dev/engine_room/vanillin/elements/ShadowElement.java +++ b/common/src/vanillin/java/dev/engine_room/vanillin/elements/ShadowElement.java @@ -1,8 +1,8 @@ package dev.engine_room.vanillin.elements; +import org.jspecify.annotations.Nullable; import org.joml.Vector4f; import org.joml.Vector4fc; -import org.jspecify.annotations.Nullable; import dev.engine_room.flywheel.api.material.Material; import dev.engine_room.flywheel.api.material.Transparency; @@ -20,13 +20,12 @@ import dev.engine_room.flywheel.lib.visual.SimpleDynamicVisual; import dev.engine_room.flywheel.lib.visual.util.InstanceRecycler; import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.Lightmap; +import net.minecraft.client.renderer.LightTexture; import net.minecraft.client.renderer.texture.OverlayTexture; import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.core.Direction.Axis; import net.minecraft.resources.Identifier; -import net.minecraft.util.LightCoordsUtil; import net.minecraft.util.Mth; import net.minecraft.world.entity.Entity; import net.minecraft.world.level.block.RenderShape; @@ -158,7 +157,7 @@ private void setupInstance(ChunkAccess chunk, MutableBlockPos pos, double entity // Too dark to render. return; } - float blockBrightness = Lightmap.getBrightness(level.dimensionType(), maxLocalRawBrightness); + float blockBrightness = LightTexture.getBrightness(level.dimensionType(), maxLocalRawBrightness); float alpha = strength * 0.5F * blockBrightness; if (alpha < 0.0F) { // Too far away/too weak to render. @@ -262,7 +261,7 @@ private static void writeVertex(MutableVertexList vertexList, int i, float x, fl vertexList.b(i, 1); vertexList.u(i, 0); vertexList.v(i, 0); - vertexList.light(i, LightCoordsUtil.FULL_BRIGHT); + vertexList.light(i, LightTexture.FULL_BRIGHT); vertexList.overlay(i, OverlayTexture.NO_OVERLAY); vertexList.normalX(i, 0); vertexList.normalY(i, 1); diff --git a/common/src/vanillin/java/dev/engine_room/vanillin/visuals/BlockDisplayVisual.java b/common/src/vanillin/java/dev/engine_room/vanillin/visuals/BlockDisplayVisual.java index a0d3ee995..331291b00 100644 --- a/common/src/vanillin/java/dev/engine_room/vanillin/visuals/BlockDisplayVisual.java +++ b/common/src/vanillin/java/dev/engine_room/vanillin/visuals/BlockDisplayVisual.java @@ -9,7 +9,7 @@ import dev.engine_room.flywheel.lib.visual.AbstractEntityVisual; import dev.engine_room.flywheel.lib.visual.SimpleDynamicVisual; import dev.engine_room.flywheel.lib.visual.component.ShadowComponent; -import net.minecraft.client.renderer.state.level.CameraRenderState; +import net.minecraft.client.Camera; import net.minecraft.util.Mth; import net.minecraft.world.entity.Display; import net.minecraft.world.entity.Entity; @@ -84,7 +84,7 @@ public void beginFrame(Context ctx) { .translate((float) (pos.x - renderOrigin.getX()), (float) (pos.y - renderOrigin.getY()), (float) (pos.z - renderOrigin.getZ())); float partialTick = ctx.partialTick(); - CameraRenderState camera = ctx.cameraRenderState(); + Camera camera = ctx.camera(); switch (renderState.billboardConstraints()) { case FIXED: instance.pose.rotateYXZ(-0.017453292F * entityYRot(entity, partialTick), ((float) Math.PI / 180F) * entityXRot(entity, partialTick), 0.0F); @@ -106,12 +106,12 @@ public void beginFrame(Context ctx) { .setChanged(); } - private static float cameraYrot(CameraRenderState camera) { - return camera.yRot - 180.0F; + private static float cameraYrot(Camera camera) { + return camera.yRot() - 180.0F; } - private static float cameraXRot(CameraRenderState camera) { - return -camera.xRot; + private static float cameraXRot(Camera camera) { + return -camera.xRot(); } private static float entityYRot(Entity entity, float partialTick) { diff --git a/common/src/vanillin/java/dev/engine_room/vanillin/visuals/ChestVisual.java b/common/src/vanillin/java/dev/engine_room/vanillin/visuals/ChestVisual.java index e07e69e06..623377193 100644 --- a/common/src/vanillin/java/dev/engine_room/vanillin/visuals/ChestVisual.java +++ b/common/src/vanillin/java/dev/engine_room/vanillin/visuals/ChestVisual.java @@ -24,12 +24,11 @@ import net.minecraft.client.model.geom.ModelLayerLocation; import net.minecraft.client.model.geom.ModelLayers; import net.minecraft.client.renderer.LevelRenderer; +import net.minecraft.client.renderer.LightTexture; import net.minecraft.client.renderer.Sheets; import net.minecraft.client.renderer.blockentity.ChestRenderer; -import net.minecraft.client.resources.model.sprite.SpriteId; import net.minecraft.core.BlockPos; import net.minecraft.core.SectionPos; -import net.minecraft.util.LightCoordsUtil; import net.minecraft.util.Mth; import net.minecraft.world.level.block.AbstractChestBlock; import net.minecraft.world.level.block.Block; @@ -78,7 +77,7 @@ public ChestVisual(VisualizationContext ctx, T blockEntity, float partialTick) { ChestType chestType = blockState.hasProperty(ChestBlock.TYPE) ? blockState.getValue(ChestBlock.TYPE) : ChestType.SINGLE; // TODO 1.21.11: should we be using unchecked casts here? ChestRenderer renderer = (ChestRenderer) Minecraft.getInstance().getBlockEntityRenderDispatcher().getRenderer(blockEntity); - SpriteId texture = Sheets.chooseSprite( + net.minecraft.client.resources.model.Material texture = Sheets.chooseMaterial( ((ChestRendererAccessor) renderer).flywheel$getChestMaterial(blockEntity, ChestRenderer.xmasTextures()), chestType ); @@ -202,23 +201,23 @@ public LongSet acceptNone() { private class BrightnessCombiner implements DoubleBlockCombiner.Combiner { @Override public Integer acceptDouble(BlockEntity first, BlockEntity second) { - int firstLight = LevelRenderer.getLightCoords(first.getLevel(), first.getBlockPos()); - int secondLight = LevelRenderer.getLightCoords(second.getLevel(), second.getBlockPos()); - int firstBlockLight = LightCoordsUtil.block(firstLight); - int secondBlockLight = LightCoordsUtil.block(secondLight); - int firstSkyLight = LightCoordsUtil.sky(firstLight); - int secondSkyLight = LightCoordsUtil.sky(secondLight); - return LightCoordsUtil.pack(Math.max(firstBlockLight, secondBlockLight), Math.max(firstSkyLight, secondSkyLight)); + int firstLight = LevelRenderer.getLightColor(first.getLevel(), first.getBlockPos()); + int secondLight = LevelRenderer.getLightColor(second.getLevel(), second.getBlockPos()); + int firstBlockLight = LightTexture.block(firstLight); + int secondBlockLight = LightTexture.block(secondLight); + int firstSkyLight = LightTexture.sky(firstLight); + int secondSkyLight = LightTexture.sky(secondLight); + return LightTexture.pack(Math.max(firstBlockLight, secondBlockLight), Math.max(firstSkyLight, secondSkyLight)); } @Override public Integer acceptSingle(BlockEntity single) { - return LevelRenderer.getLightCoords(single.getLevel(), single.getBlockPos()); + return LevelRenderer.getLightColor(single.getLevel(), single.getBlockPos()); } @Override public Integer acceptNone() { - return LevelRenderer.getLightCoords(level, pos); + return LevelRenderer.getLightColor(level, pos); } } } diff --git a/common/src/vanillin/java/dev/engine_room/vanillin/visuals/ShulkerBoxVisual.java b/common/src/vanillin/java/dev/engine_room/vanillin/visuals/ShulkerBoxVisual.java index a957982a3..0080041a1 100644 --- a/common/src/vanillin/java/dev/engine_room/vanillin/visuals/ShulkerBoxVisual.java +++ b/common/src/vanillin/java/dev/engine_room/vanillin/visuals/ShulkerBoxVisual.java @@ -16,7 +16,6 @@ import dev.engine_room.flywheel.lib.visual.SimpleDynamicVisual; import net.minecraft.client.model.geom.ModelLayers; import net.minecraft.client.renderer.Sheets; -import net.minecraft.client.resources.model.sprite.SpriteId; import net.minecraft.core.Direction; import net.minecraft.util.Mth; import net.minecraft.world.item.DyeColor; @@ -43,7 +42,7 @@ public ShulkerBoxVisual(VisualizationContext ctx, ShulkerBoxBlockEntity blockEnt super(ctx, blockEntity, partialTick); DyeColor color = blockEntity.getColor(); - SpriteId texture; + net.minecraft.client.resources.model.Material texture; if (color == null) { texture = Sheets.DEFAULT_SHULKER_TEXTURE_LOCATION; } else { diff --git a/fabric/src/lib/java/dev/engine_room/flywheel/lib/model/baked/BlockStateModelBufferer.java b/fabric/src/lib/java/dev/engine_room/flywheel/lib/model/baked/BlockStateModelBufferer.java index 715911977..ca9b2c160 100644 --- a/fabric/src/lib/java/dev/engine_room/flywheel/lib/model/baked/BlockStateModelBufferer.java +++ b/fabric/src/lib/java/dev/engine_room/flywheel/lib/model/baked/BlockStateModelBufferer.java @@ -9,12 +9,14 @@ import dev.engine_room.flywheel.lib.model.SimpleModel; import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.block.BlockAndTintGetter; -import net.minecraft.client.renderer.block.BlockModelLighter; -import net.minecraft.client.renderer.block.FluidRenderer; +import net.minecraft.client.renderer.ItemBlockRenderTypes; +import net.minecraft.client.renderer.block.BlockRenderDispatcher; import net.minecraft.client.renderer.block.ModelBlockRenderer; -import net.minecraft.client.renderer.block.dispatch.BlockStateModel; +import net.minecraft.client.renderer.block.model.BlockStateModel; +import net.minecraft.client.renderer.chunk.ChunkSectionLayer; +import net.minecraft.client.renderer.texture.OverlayTexture; import net.minecraft.core.BlockPos; +import net.minecraft.world.level.BlockAndTintGetter; import net.minecraft.world.level.block.RenderShape; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.material.FluidState; @@ -30,25 +32,23 @@ public static SimpleModel bufferModel(BlockStateModel model, BlockPos pos, Block if (poseStack == null) { poseStack = objects.identityPoseStack; } - PoseStack finalPoseStack = poseStack; FabricMeshEmitterManager emitters = objects.emitters; - ModelBlockRenderer blockRenderer = new ModelBlockRenderer(Minecraft.getInstance().gameRenderer.getGameRenderState().optionsRenderState.ambientOcclusion, true, Minecraft.getInstance().getBlockColors()); emitters.prepare(blockMaterialFunction); long seed = state.getSeed(pos); // See ModelBlockRenderer#tesselateBlock - boolean useAo = Minecraft.getInstance().gameRenderer.getGameRenderState().optionsRenderState.ambientOcclusion; + boolean useAo = Minecraft.useAmbientOcclusion(); boolean defaultAo = useAo && state.getLightEmission() == 0; model = emitters.prepareForModel(model, useAo, defaultAo); - blockRenderer.tesselateBlock((x, y, z, quad, instance) -> { - finalPoseStack.pushPose(); - finalPoseStack.translate(x, y, z); - emitters.getEmitter(quad.materialInfo().layer()).putBakedQuad(finalPoseStack.last(), quad, instance); - finalPoseStack.popPose(); - }, 0, 0, 0, level, pos, state, model, seed); + poseStack.pushPose(); + Minecraft.getInstance() + .getBlockRenderer() + .getModelRenderer() + .render(level, model, state, pos, poseStack, emitters, false, seed, OverlayTexture.NO_OVERLAY); + poseStack.popPose(); return emitters.end(); } @@ -58,18 +58,17 @@ public static SimpleModel bufferBlocks(Iterator posIterator, BlockAndT if (poseStack == null) { poseStack = objects.identityPoseStack; } - PoseStack finalPoseStack = poseStack; - FabricMeshEmitterManager emitters = objects.emitters; TransformingVertexConsumer transformingWrapper = objects.transformingWrapper; emitters.prepare(blockMaterialFunction); - ModelBlockRenderer blockRenderer = new ModelBlockRenderer(Minecraft.getInstance().gameRenderer.getGameRenderState().optionsRenderState.ambientOcclusion, true, Minecraft.getInstance().getBlockColors()); - FluidRenderer fluidRenderer = new FluidRenderer(Minecraft.getInstance().getModelManager().getFluidStateModelSet()); - BlockModelLighter.enableCaching(); + BlockRenderDispatcher renderDispatcher = Minecraft.getInstance() + .getBlockRenderer(); + ModelBlockRenderer blockRenderer = renderDispatcher.getModelRenderer(); + ModelBlockRenderer.enableCaching(); - boolean useAo = Minecraft.getInstance().gameRenderer.getGameRenderState().optionsRenderState.ambientOcclusion; + boolean useAo = Minecraft.useAmbientOcclusion(); while (posIterator.hasNext()) { BlockPos pos = posIterator.next(); @@ -81,40 +80,37 @@ public static SimpleModel bufferBlocks(Iterator posIterator, BlockAndT FluidState fluidState = state.getFluidState(); if (!fluidState.isEmpty()) { - poseStack.pushPose(); - poseStack.translate(pos.getX() - (pos.getX() & 0xF), pos.getY() - (pos.getY() & 0xF), pos.getZ() - (pos.getZ() & 0xF)); - fluidRenderer.tesselate(level, pos, layer -> { - BufferBuilder builder = emitters.getEmitter(layer).getBuffer(true, false); - - if (builder != null) { - transformingWrapper.prepare(builder, finalPoseStack); - return transformingWrapper; - } - - return EmptyVertexConsumer.INSTANCE; - }, state, fluidState); - poseStack.popPose(); + ChunkSectionLayer layer = ItemBlockRenderTypes.getRenderLayer(fluidState); + + BufferBuilder bufferBuilder = emitters.getEmitter(layer).getBuffer(true, false); + + if (bufferBuilder != null) { + transformingWrapper.prepare(bufferBuilder, poseStack); + + poseStack.pushPose(); + poseStack.translate(pos.getX() - (pos.getX() & 0xF), pos.getY() - (pos.getY() & 0xF), pos.getZ() - (pos.getZ() & 0xF)); + renderDispatcher.renderLiquid(pos, level, transformingWrapper, state, fluidState); + poseStack.popPose(); + } } } if (state.getRenderShape() == RenderShape.MODEL) { long seed = state.getSeed(pos); - BlockStateModel model = Minecraft.getInstance().getModelManager().getBlockStateModelSet().get(state); + BlockStateModel model = renderDispatcher.getBlockModel(state); // See ModelBlockRenderer#tesselateBlock boolean defaultAo = useAo && state.getLightEmission() == 0; model = emitters.prepareForModel(model, useAo, defaultAo); - blockRenderer.tesselateBlock((x, y, z, quad, instance) -> { - finalPoseStack.pushPose(); - finalPoseStack.translate(x, y, z); - emitters.getEmitter(quad.materialInfo().layer()).putBakedQuad(finalPoseStack.last(), quad, instance); - finalPoseStack.popPose(); - }, pos.getX(), pos.getY(), pos.getZ(), level, pos, state, model, seed); + poseStack.pushPose(); + poseStack.translate(pos.getX(), pos.getY(), pos.getZ()); + blockRenderer.render(level, model, state, pos, poseStack, emitters, true, seed, OverlayTexture.NO_OVERLAY); + poseStack.popPose(); } } - BlockModelLighter.clearCache(); + ModelBlockRenderer.clearCache(); transformingWrapper.clear(); return emitters.end(); } diff --git a/fabric/src/lib/java/dev/engine_room/flywheel/lib/model/baked/FabricMeshEmitter.java b/fabric/src/lib/java/dev/engine_room/flywheel/lib/model/baked/FabricMeshEmitter.java index 1f536dcb0..65cd066d2 100644 --- a/fabric/src/lib/java/dev/engine_room/flywheel/lib/model/baked/FabricMeshEmitter.java +++ b/fabric/src/lib/java/dev/engine_room/flywheel/lib/model/baked/FabricMeshEmitter.java @@ -2,11 +2,10 @@ import com.mojang.blaze3d.vertex.BufferBuilder; import com.mojang.blaze3d.vertex.PoseStack; -import com.mojang.blaze3d.vertex.QuadInstance; import com.mojang.blaze3d.vertex.VertexConsumer; +import net.minecraft.client.renderer.block.model.BakedQuad; import net.minecraft.client.renderer.chunk.ChunkSectionLayer; -import net.minecraft.client.resources.model.geometry.BakedQuad; class FabricMeshEmitter extends MeshEmitter { private boolean shade; @@ -102,18 +101,18 @@ public void addVertex(float x, float y, float z, int color, float u, float v, in } @Override - public void putBakedQuad(PoseStack.Pose pose, BakedQuad quad, QuadInstance instance) { + public void putBulkData(PoseStack.Pose pose, BakedQuad quad, float red, float green, float blue, float alpha, int packedLight, int packedOverlay) { BufferBuilder bufferBuilder = getBuffer(shade, ao); if (bufferBuilder != null) { - bufferBuilder.putBakedQuad(pose, quad, instance); + bufferBuilder.putBulkData(pose, quad, red, green, blue, alpha, packedLight, packedOverlay); } } @Override - public void putBlockBakedQuad(float x, float y, float z, BakedQuad quad, QuadInstance instance) { + public void putBulkData(PoseStack.Pose pose, BakedQuad quad, float[] brightness, float red, float green, float blue, float alpha, int[] lightmap, int packedOverlay) { BufferBuilder bufferBuilder = getBuffer(shade, ao); if (bufferBuilder != null) { - bufferBuilder.putBlockBakedQuad(x, y, z, quad, instance); + bufferBuilder.putBulkData(pose, quad, brightness, red, green, blue, alpha, lightmap, packedOverlay); } } } diff --git a/fabric/src/lib/java/dev/engine_room/flywheel/lib/model/baked/FabricMeshEmitterManager.java b/fabric/src/lib/java/dev/engine_room/flywheel/lib/model/baked/FabricMeshEmitterManager.java index b73e65014..450096445 100644 --- a/fabric/src/lib/java/dev/engine_room/flywheel/lib/model/baked/FabricMeshEmitterManager.java +++ b/fabric/src/lib/java/dev/engine_room/flywheel/lib/model/baked/FabricMeshEmitterManager.java @@ -6,18 +6,20 @@ import dev.engine_room.flywheel.lib.model.SimpleModel; import net.fabricmc.fabric.api.client.model.loading.v1.wrapper.WrapperBlockStateModel; -import net.fabricmc.fabric.api.client.renderer.v1.mesh.QuadEmitter; -import net.fabricmc.fabric.api.client.renderer.v1.mesh.QuadTransform; -import net.fabricmc.fabric.api.client.renderer.v1.mesh.QuadView; +import net.fabricmc.fabric.api.renderer.v1.mesh.QuadEmitter; +import net.fabricmc.fabric.api.renderer.v1.mesh.QuadTransform; +import net.fabricmc.fabric.api.renderer.v1.mesh.QuadView; +import net.fabricmc.fabric.api.renderer.v1.render.BlockVertexConsumerProvider; import net.fabricmc.fabric.api.util.TriState; -import net.minecraft.client.renderer.block.BlockAndTintGetter; -import net.minecraft.client.renderer.block.dispatch.BlockStateModel; +import net.minecraft.client.renderer.block.model.BlockStateModel; +import net.minecraft.client.renderer.chunk.ChunkSectionLayer; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.util.RandomSource; +import net.minecraft.world.level.BlockAndTintGetter; import net.minecraft.world.level.block.state.BlockState; -class FabricMeshEmitterManager extends MeshEmitterManager { +class FabricMeshEmitterManager extends MeshEmitterManager implements BlockVertexConsumerProvider { private final WrapperModel wrapperModel = new WrapperModel(); private boolean useAo; @@ -50,6 +52,11 @@ private void prepareForGeometry(QuadView quad) { } } + @Override + public FabricMeshEmitter getBuffer(ChunkSectionLayer layer) { + return getEmitter(layer); + } + private class WrapperModel extends WrapperBlockStateModel { private final QuadTransform quadTransform = quad -> { FabricMeshEmitterManager.this.prepareForGeometry(quad); diff --git a/fabric/src/lib/java/dev/engine_room/flywheel/lib/model/baked/FabricPartialModel.java b/fabric/src/lib/java/dev/engine_room/flywheel/lib/model/baked/FabricPartialModel.java index c97c43a1d..292187d12 100644 --- a/fabric/src/lib/java/dev/engine_room/flywheel/lib/model/baked/FabricPartialModel.java +++ b/fabric/src/lib/java/dev/engine_room/flywheel/lib/model/baked/FabricPartialModel.java @@ -12,12 +12,12 @@ import net.fabricmc.fabric.api.client.model.loading.v1.ModelLoadingPlugin; import net.fabricmc.fabric.api.client.model.loading.v1.UnbakedExtraModel; import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.block.dispatch.BlockModelRotation; -import net.minecraft.client.renderer.block.dispatch.BlockStateModel; -import net.minecraft.client.renderer.block.dispatch.SingleVariant; +import net.minecraft.client.renderer.block.model.BlockStateModel; +import net.minecraft.client.renderer.block.model.SimpleModelWrapper; +import net.minecraft.client.renderer.block.model.SingleVariant; +import net.minecraft.client.resources.model.BlockModelRotation; import net.minecraft.client.resources.model.ModelBaker; import net.minecraft.client.resources.model.ModelManager; -import net.minecraft.client.resources.model.SimpleModelWrapper; import net.minecraft.resources.Identifier; import net.minecraft.server.packs.resources.ResourceManager; import net.minecraft.server.packs.resources.ResourceManagerReloadListener; diff --git a/fabric/src/main/java/dev/engine_room/flywheel/impl/FlwCommands.java b/fabric/src/main/java/dev/engine_room/flywheel/impl/FlwCommands.java index 4c8587f51..37e9e37ff 100644 --- a/fabric/src/main/java/dev/engine_room/flywheel/impl/FlwCommands.java +++ b/fabric/src/main/java/dev/engine_room/flywheel/impl/FlwCommands.java @@ -13,7 +13,7 @@ import dev.engine_room.flywheel.backend.compile.PipelineCompiler; import dev.engine_room.flywheel.backend.engine.uniform.DebugMode; import dev.engine_room.flywheel.backend.engine.uniform.FrameUniforms; -import net.fabricmc.fabric.api.client.command.v2.ClientCommands; +import net.fabricmc.fabric.api.client.command.v2.ClientCommandManager; import net.fabricmc.fabric.api.client.command.v2.FabricClientCommandSource; import net.minecraft.client.Minecraft; import net.minecraft.client.player.LocalPlayer; @@ -31,9 +31,9 @@ private FlwCommands() { } public static void registerClientCommands(CommandDispatcher dispatcher, CommandBuildContext buildContext) { - LiteralArgumentBuilder command = ClientCommands.literal("flywheel"); + LiteralArgumentBuilder command = ClientCommandManager.literal("flywheel"); - command.then(ClientCommands.literal("backend") + command.then(ClientCommandManager.literal("backend") .executes(context -> { Backend backend = BackendManager.currentBackend(); String idStr = Backend.REGISTRY.getIdOrThrow(backend) @@ -41,7 +41,7 @@ public static void registerClientCommands(CommandDispatcher { FabricFlwConfig.INSTANCE.backend = BackendManager.offBackend(); FabricFlwConfig.INSTANCE.useDefaultBackend = true; @@ -56,7 +56,7 @@ public static void registerClientCommands(CommandDispatcher { Backend requestedBackend = context.getArgument("id", Backend.class); FabricFlwConfig.INSTANCE.backend = requestedBackend; @@ -79,7 +79,7 @@ public static void registerClientCommands(CommandDispatcher { if (FabricFlwConfig.INSTANCE.limitUpdates) { context.getSource().sendFeedback(Component.translatable("command.flywheel.limit_updates.get.on")); @@ -88,7 +88,7 @@ public static void registerClientCommands(CommandDispatcher { FabricFlwConfig.INSTANCE.limitUpdates = true; FabricFlwConfig.INSTANCE.save(); @@ -96,7 +96,7 @@ public static void registerClientCommands(CommandDispatcher { FabricFlwConfig.INSTANCE.limitUpdates = false; FabricFlwConfig.INSTANCE.save(); @@ -105,8 +105,8 @@ public static void registerClientCommands(CommandDispatcher { var oldValue = FabricFlwConfig.INSTANCE.backendConfig.lightSmoothness; var newValue = context.getArgument("mode", LightSmoothness.class); @@ -125,11 +125,11 @@ public static void registerClientCommands(CommandDispatcher createDebugCommand() { - var debug = ClientCommands.literal("debug"); + var debug = ClientCommandManager.literal("debug"); - debug.then(ClientCommands.literal("crumbling") - .then(ClientCommands.argument("pos", BlockPosArgument.blockPos()) - .then(ClientCommands.argument("stage", IntegerArgumentType.integer(0, 9)) + debug.then(ClientCommandManager.literal("crumbling") + .then(ClientCommandManager.argument("pos", BlockPosArgument.blockPos()) + .then(ClientCommandManager.argument("stage", IntegerArgumentType.integer(0, 9)) .executes(context -> { Entity executor = context.getSource() .getEntity(); @@ -147,51 +147,51 @@ private static LiteralArgumentBuilder createDebugComm return Command.SINGLE_SUCCESS; })))); - debug.then(ClientCommands.literal("shader") - .then(ClientCommands.argument("mode", DebugModeArgument.INSTANCE) + debug.then(ClientCommandManager.literal("shader") + .then(ClientCommandManager.argument("mode", DebugModeArgument.INSTANCE) .executes(context -> { DebugMode mode = context.getArgument("mode", DebugMode.class); FrameUniforms.debugMode(mode); return Command.SINGLE_SUCCESS; }))); - debug.then(ClientCommands.literal("frustum") - .then(ClientCommands.literal("capture") + debug.then(ClientCommandManager.literal("frustum") + .then(ClientCommandManager.literal("capture") .executes(context -> { FrameUniforms.captureFrustum(); return Command.SINGLE_SUCCESS; })) - .then(ClientCommands.literal("unpause") + .then(ClientCommandManager.literal("unpause") .executes(context -> { FrameUniforms.unpauseFrustum(); return Command.SINGLE_SUCCESS; }))); - debug.then(ClientCommands.literal("lightSections") - .then(ClientCommands.literal("on") + debug.then(ClientCommandManager.literal("lightSections") + .then(ClientCommandManager.literal("on") .executes(context -> { BackendDebugFlags.LIGHT_STORAGE_VIEW = true; return Command.SINGLE_SUCCESS; })) - .then(ClientCommands.literal("off") + .then(ClientCommandManager.literal("off") .executes(context -> { BackendDebugFlags.LIGHT_STORAGE_VIEW = false; return Command.SINGLE_SUCCESS; }))); - debug.then(ClientCommands.literal("pauseUpdates") - .then(ClientCommands.literal("on") + debug.then(ClientCommandManager.literal("pauseUpdates") + .then(ClientCommandManager.literal("on") .executes(context -> { ImplDebugFlags.PAUSE_UPDATES = true; return Command.SINGLE_SUCCESS; })) - .then(ClientCommands.literal("off") + .then(ClientCommandManager.literal("off") .executes(context -> { ImplDebugFlags.PAUSE_UPDATES = false; return Command.SINGLE_SUCCESS; }))); - debug.then(ClientCommands.literal("info") + debug.then(ClientCommandManager.literal("info") .executes(context -> { context.getSource() .sendFeedback(FlwDebugInfo.getDebugCommandInfo()); diff --git a/fabric/src/main/java/dev/engine_room/flywheel/impl/FlywheelFabric.java b/fabric/src/main/java/dev/engine_room/flywheel/impl/FlywheelFabric.java index 6378a1996..3fa638109 100644 --- a/fabric/src/main/java/dev/engine_room/flywheel/impl/FlywheelFabric.java +++ b/fabric/src/main/java/dev/engine_room/flywheel/impl/FlywheelFabric.java @@ -78,14 +78,14 @@ private static void setupLib() { EndClientResourceReloadCallback.EVENT.register((minecraft, resourceManager, initialReload, error) -> ResourceReloadHolder.onEndClientResourceReload()); ModelLoadingPlugin.register(FabricPartialModel::registerAll); - ResourceLoader.get(PackType.CLIENT_RESOURCES).registerReloadListener(FabricPartialModel.ResourceReloadListener.ID, FabricPartialModel.ResourceReloadListener.INSTANCE); - ResourceLoader.get(PackType.CLIENT_RESOURCES).addListenerOrdering(ResourceReloaderKeys.Client.MODELS, FabricPartialModel.ResourceReloadListener.ID); + ResourceLoader.get(PackType.CLIENT_RESOURCES).registerReloader(FabricPartialModel.ResourceReloadListener.ID, FabricPartialModel.ResourceReloadListener.INSTANCE); + ResourceLoader.get(PackType.CLIENT_RESOURCES).addReloaderOrdering(ResourceReloaderKeys.Client.MODELS, FabricPartialModel.ResourceReloadListener.ID); } private static void setupBackend() { ReloadLevelRendererCallback.EVENT.register(level -> Uniforms.onReloadLevelRenderer()); - ResourceLoader.get(PackType.CLIENT_RESOURCES).registerReloadListener(FlwProgramsReloader.ID, FlwProgramsReloader.INSTANCE); + ResourceLoader.get(PackType.CLIENT_RESOURCES).registerReloader(FlwProgramsReloader.ID, FlwProgramsReloader.INSTANCE); } public static Version version() { diff --git a/fabric/src/main/java/dev/engine_room/flywheel/impl/mixin/MinecraftMixin.java b/fabric/src/main/java/dev/engine_room/flywheel/impl/mixin/MinecraftMixin.java index ebef5304e..dcab8eeec 100644 --- a/fabric/src/main/java/dev/engine_room/flywheel/impl/mixin/MinecraftMixin.java +++ b/fabric/src/main/java/dev/engine_room/flywheel/impl/mixin/MinecraftMixin.java @@ -31,13 +31,13 @@ abstract class MinecraftMixin { FabricFlwConfig.INSTANCE.load(); } - @Inject(method = "lambda$new$4", at = @At("HEAD")) + @Inject(method = "method_53522", at = @At("HEAD")) private void flywheel$onEndInitialResourceReload(@Coerce Object gameLoadCookie, Optional error, CallbackInfo ci) { EndClientResourceReloadCallback.EVENT.invoker() .onEndClientResourceReload((Minecraft) (Object) this, resourceManager, true, error); } - @Inject(method = "lambda$reloadResourcePacks$0", at = @At("HEAD")) + @Inject(method = "method_24228", at = @At("HEAD")) private void flywheel$onEndManualResourceReload(boolean recovery, @Coerce Object gameLoadCookie, CompletableFuture future, Optional error, CallbackInfo ci) { EndClientResourceReloadCallback.EVENT.invoker() diff --git a/neoforge/src/main/java/dev/engine_room/flywheel/impl/mixin/MinecraftMixin.java b/neoforge/src/main/java/dev/engine_room/flywheel/impl/mixin/MinecraftMixin.java index 0bea1528d..fcf751a34 100644 --- a/neoforge/src/main/java/dev/engine_room/flywheel/impl/mixin/MinecraftMixin.java +++ b/neoforge/src/main/java/dev/engine_room/flywheel/impl/mixin/MinecraftMixin.java @@ -28,12 +28,12 @@ abstract class MinecraftMixin { FlwImpl.freezeRegistries(); } - @Inject(method = "lambda$new$4", at = @At("HEAD"), remap = false) + @Inject(method = "method_53522", at = @At("HEAD"), remap = false) private void flywheel$onEndInitialResourceReload(@Coerce Object gameLoadCookie, Optional error, CallbackInfo ci) { ModLoader.postEvent(new EndClientResourceReloadEvent((Minecraft) (Object) this, resourceManager, true, error)); } - @Inject(method = "lambda$reloadResourcePacks$0", at = @At("HEAD"), remap = false) + @Inject(method = "lambda$reloadResourcePacks$20", at = @At("HEAD"), remap = false) private void flywheel$onEndManualResourceReload(boolean recovery, @Coerce Object gameLoadCookie, CompletableFuture completablefuture, Optional error, CallbackInfo ci) { ModLoader.postEvent(new EndClientResourceReloadEvent((Minecraft) (Object) this, resourceManager, false, error)); } diff --git a/vanillinFabric/src/main/java/dev/engine_room/vanillin/VanillinFabric.java b/vanillinFabric/src/main/java/dev/engine_room/vanillin/VanillinFabric.java index 339f04ced..77ac5acc2 100644 --- a/vanillinFabric/src/main/java/dev/engine_room/vanillin/VanillinFabric.java +++ b/vanillinFabric/src/main/java/dev/engine_room/vanillin/VanillinFabric.java @@ -3,7 +3,7 @@ import dev.engine_room.flywheel.api.event.ReloadLevelRendererCallback; import dev.engine_room.vanillin.item.SodiumAnimatedTextureCompat; import net.fabricmc.api.ClientModInitializer; -import net.fabricmc.fabric.api.client.rendering.v1.level.LevelRenderEvents; +import net.fabricmc.fabric.api.client.rendering.v1.world.WorldRenderEvents; public class VanillinFabric implements ClientModInitializer { @Override @@ -14,6 +14,6 @@ public void onInitializeClient() { FabricVanillinConfig.INSTANCE.save(); ReloadLevelRendererCallback.EVENT.register(level -> SodiumAnimatedTextureCompat.onReloadRenderer()); - LevelRenderEvents.START_MAIN.register(context -> SodiumAnimatedTextureCompat.beginFrame()); + WorldRenderEvents.START_MAIN.register(context -> SodiumAnimatedTextureCompat.beginFrame()); } } From 47a50d6e629d7c7fa046f1af5e378b3d94b59082 Mon Sep 17 00:00:00 2001 From: IThundxr Date: Mon, 27 Apr 2026 17:57:15 -0400 Subject: [PATCH 40/59] Initial 26.1 port --- .../flywheel/api/backend/Engine.java | 4 +- .../flywheel/api/backend/RenderContext.java | 7 +- .../flywheel/api/visual/DynamicVisual.java | 4 +- .../flywheel/backend/engine/EngineImpl.java | 6 +- .../backend/engine/LightDataCollector.java | 2 +- .../flywheel/backend/engine/LightStorage.java | 10 +-- .../backend/engine/MaterialRenderState.java | 7 +- .../backend/engine/TextureBinder.java | 6 +- .../engine/indirect/OitFramebuffer.java | 18 ++-- .../backend/engine/uniform/FrameUniforms.java | 33 +++---- .../backend/engine/uniform/LevelUniforms.java | 23 +++-- .../extension/CameraRenderStateExtension.java | 7 ++ .../SkyLightSectionStorageExtension.java | 2 +- .../flywheel/backend/gl/GlUtil.java | 16 ++++ .../backend/mixin/CameraAccessor.java | 12 +++ .../flywheel/backend/mixin/CameraMixin.java | 23 +++++ .../backend/mixin/CameraRenderStateMixin.java | 19 ++++ .../backend/mixin/FogRendererMixin.java | 11 +-- .../backend/mixin/GpuDeviceAccessor.java | 13 +++ .../LayerLightSectionStorageAccessor.java | 3 +- .../light/SkyLightSectionStorageMixin.java | 2 +- .../resources/flywheel.backend.mixins.json | 15 ++-- .../flywheel/lib/instance/FlatLit.java | 6 +- .../flywheel/lib/material/Materials.java | 4 +- .../flywheel/lib/model/LineModelBuilder.java | 4 +- .../flywheel/lib/model/ModelUtil.java | 4 - .../lib/model/baked/BlockModelBuilder.java | 4 +- .../lib/model/baked/EmptyVertexConsumer.java | 49 +++++++++++ .../lib/model/baked/LevelModelBuilder.java | 2 +- .../lib/model/baked/PartialModel.java | 4 +- .../lib/model/baked/VirtualBlockGetter.java | 8 +- .../flywheel/lib/model/part/MeshTree.java | 4 +- .../flywheel/lib/model/part/ModelTrees.java | 9 +- .../lib/visual/AbstractBlockEntityVisual.java | 10 +-- .../lib/visual/AbstractEntityVisual.java | 4 +- .../lib/visual/component/FireComponent.java | 15 ++-- .../lib/visual/component/HitboxComponent.java | 4 +- .../lib/visual/component/ShadowComponent.java | 12 +-- .../impl/event/RenderContextImpl.java | 13 +-- .../impl/mixin/GameRendererMixin.java | 29 ++++++ .../impl/mixin/LevelRendererMixin.java | 21 +++-- .../impl/visual/DynamicVisualContextImpl.java | 6 +- .../VisualizationManagerImpl.java | 7 +- .../main/resources/flywheel.impl.mixins.json | 1 + .../vanillin/elements/FireElement.java | 15 ++-- .../vanillin/elements/HitboxElement.java | 4 +- .../vanillin/elements/ShadowElement.java | 9 +- .../vanillin/visuals/BlockDisplayVisual.java | 21 ++--- .../vanillin/visuals/ChestVisual.java | 23 ++--- .../vanillin/visuals/ItemDisplayVisual.java | 16 ++-- .../vanillin/visuals/ItemFrameVisual.java | 1 - .../vanillin/visuals/ItemVisual.java | 1 - .../vanillin/visuals/ShulkerBoxVisual.java | 3 +- .../model/baked/BlockStateModelBufferer.java | 88 ++++++++++++------- .../lib/model/baked/FabricMeshEmitter.java | 13 +-- .../model/baked/FabricMeshEmitterManager.java | 24 ++--- .../lib/model/baked/FabricPartialModel.java | 8 +- .../flywheel/impl/FlwCommands.java | 52 +++++------ .../flywheel/impl/FlywheelFabric.java | 6 +- .../flywheel/impl/mixin/MinecraftMixin.java | 4 +- .../flywheel/impl/mixin/MinecraftMixin.java | 4 +- .../engine_room/vanillin/VanillinFabric.java | 4 +- 62 files changed, 476 insertions(+), 283 deletions(-) create mode 100644 common/src/backend/java/dev/engine_room/flywheel/backend/extension/CameraRenderStateExtension.java rename common/src/backend/java/dev/engine_room/flywheel/backend/{ => extension}/SkyLightSectionStorageExtension.java (79%) create mode 100644 common/src/backend/java/dev/engine_room/flywheel/backend/gl/GlUtil.java create mode 100644 common/src/backend/java/dev/engine_room/flywheel/backend/mixin/CameraAccessor.java create mode 100644 common/src/backend/java/dev/engine_room/flywheel/backend/mixin/CameraMixin.java create mode 100644 common/src/backend/java/dev/engine_room/flywheel/backend/mixin/CameraRenderStateMixin.java create mode 100644 common/src/backend/java/dev/engine_room/flywheel/backend/mixin/GpuDeviceAccessor.java create mode 100644 common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/EmptyVertexConsumer.java create mode 100644 common/src/main/java/dev/engine_room/flywheel/impl/mixin/GameRendererMixin.java diff --git a/common/src/api/java/dev/engine_room/flywheel/api/backend/Engine.java b/common/src/api/java/dev/engine_room/flywheel/api/backend/Engine.java index b44ee31ff..8356ec08f 100644 --- a/common/src/api/java/dev/engine_room/flywheel/api/backend/Engine.java +++ b/common/src/api/java/dev/engine_room/flywheel/api/backend/Engine.java @@ -9,7 +9,7 @@ import dev.engine_room.flywheel.api.task.Plan; import dev.engine_room.flywheel.api.visualization.VisualizationContext; import it.unimi.dsi.fastutil.longs.LongSet; -import net.minecraft.client.Camera; +import net.minecraft.client.renderer.state.level.CameraRenderState; import net.minecraft.core.BlockPos; import net.minecraft.core.SectionPos; import net.minecraft.core.Vec3i; @@ -43,7 +43,7 @@ public interface Engine { * * @return {@code true} if the render origin changed, {@code false} otherwise. */ - boolean updateRenderOrigin(Camera camera); + boolean updateRenderOrigin(CameraRenderState cameraRenderState); /** * Assign the set of sections that visuals have requested GPU light for. diff --git a/common/src/api/java/dev/engine_room/flywheel/api/backend/RenderContext.java b/common/src/api/java/dev/engine_room/flywheel/api/backend/RenderContext.java index e78df1aad..b52e32963 100644 --- a/common/src/api/java/dev/engine_room/flywheel/api/backend/RenderContext.java +++ b/common/src/api/java/dev/engine_room/flywheel/api/backend/RenderContext.java @@ -2,10 +2,11 @@ import org.joml.Matrix4fc; -import net.minecraft.client.Camera; import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.client.renderer.LevelRenderer; import net.minecraft.client.renderer.RenderBuffers; +import net.minecraft.client.renderer.state.level.CameraRenderState; +import net.minecraft.client.renderer.state.level.LevelRenderState; public interface RenderContext { LevelRenderer renderer(); @@ -20,7 +21,9 @@ public interface RenderContext { Matrix4fc viewProjection(); - Camera camera(); + CameraRenderState cameraRenderState(); + + LevelRenderState levelRenderState(); float partialTick(); } diff --git a/common/src/api/java/dev/engine_room/flywheel/api/visual/DynamicVisual.java b/common/src/api/java/dev/engine_room/flywheel/api/visual/DynamicVisual.java index 6143f7836..769350066 100644 --- a/common/src/api/java/dev/engine_room/flywheel/api/visual/DynamicVisual.java +++ b/common/src/api/java/dev/engine_room/flywheel/api/visual/DynamicVisual.java @@ -6,7 +6,7 @@ import dev.engine_room.flywheel.api.instance.Instance; import dev.engine_room.flywheel.api.instance.Instancer; import dev.engine_room.flywheel.api.task.Plan; -import net.minecraft.client.Camera; +import net.minecraft.client.renderer.state.level.CameraRenderState; /** * An interface giving {@link Visual}s a hook to have a function called at @@ -32,7 +32,7 @@ public interface DynamicVisual extends Visual { */ @ApiStatus.NonExtendable interface Context { - Camera camera(); + CameraRenderState cameraRenderState(); FrustumIntersection frustum(); diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/engine/EngineImpl.java b/common/src/backend/java/dev/engine_room/flywheel/backend/engine/EngineImpl.java index 690e540b2..28c9c95c1 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/engine/EngineImpl.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/engine/EngineImpl.java @@ -19,7 +19,7 @@ import dev.engine_room.flywheel.backend.engine.uniform.Uniforms; import dev.engine_room.flywheel.backend.gl.GlStateTracker; import it.unimi.dsi.fastutil.longs.LongSet; -import net.minecraft.client.Camera; +import net.minecraft.client.renderer.state.level.CameraRenderState; import net.minecraft.core.BlockPos; import net.minecraft.core.SectionPos; import net.minecraft.core.Vec3i; @@ -59,8 +59,8 @@ public Vec3i renderOrigin() { } @Override - public boolean updateRenderOrigin(Camera camera) { - Vec3 cameraPos = camera.position(); + public boolean updateRenderOrigin(CameraRenderState cameraRenderState) { + Vec3 cameraPos = cameraRenderState.pos; double dx = renderOrigin.getX() - cameraPos.x; double dy = renderOrigin.getY() - cameraPos.y; double dz = renderOrigin.getZ() - cameraPos.z; diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/engine/LightDataCollector.java b/common/src/backend/java/dev/engine_room/flywheel/backend/engine/LightDataCollector.java index 8f8563343..d79c55a3e 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/engine/LightDataCollector.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/engine/LightDataCollector.java @@ -6,7 +6,7 @@ import org.jspecify.annotations.Nullable; import org.lwjgl.system.MemoryUtil; -import dev.engine_room.flywheel.backend.SkyLightSectionStorageExtension; +import dev.engine_room.flywheel.backend.extension.SkyLightSectionStorageExtension; import dev.engine_room.flywheel.backend.mixin.light.LayerLightSectionStorageAccessor; import dev.engine_room.flywheel.backend.mixin.light.LightEngineAccessor; import it.unimi.dsi.fastutil.longs.Long2ObjectFunction; diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/engine/LightStorage.java b/common/src/backend/java/dev/engine_room/flywheel/backend/engine/LightStorage.java index 2d2244a51..efb853bad 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/engine/LightStorage.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/engine/LightStorage.java @@ -25,9 +25,9 @@ import it.unimi.dsi.fastutil.longs.Long2IntOpenHashMap; import it.unimi.dsi.fastutil.longs.LongOpenHashSet; import it.unimi.dsi.fastutil.longs.LongSet; -import net.minecraft.client.renderer.LightTexture; import net.minecraft.core.SectionPos; import net.minecraft.core.Vec3i; +import net.minecraft.util.LightCoordsUtil; import net.minecraft.world.level.LevelAccessor; /** @@ -292,7 +292,7 @@ private void setupSectionBoxes() { .translate(x + 1, y + 1, z + 1) .scale(14) .color(255, 255, 0) - .light(LightTexture.FULL_BRIGHT) + .light(LightCoordsUtil.FULL_BRIGHT) .setChanged(); }); } @@ -357,7 +357,7 @@ private void setupLutRangeBoxes() { .translate(x2, y2, debug3) .scale(1, 1, size3 * 16) .color(0, 0, 255) - .light(LightTexture.FULL_BRIGHT) + .light(LightCoordsUtil.FULL_BRIGHT) .setChanged(); } } @@ -367,7 +367,7 @@ private void setupLutRangeBoxes() { .translate(debug2, y2, minLocal3 * 16 - renderOrigin.getZ()) .scale(size2 * 16, 1, (maxLocal3 - minLocal3) * 16) .color(255, 0, 0) - .light(LightTexture.FULL_BRIGHT) + .light(LightCoordsUtil.FULL_BRIGHT) .setChanged(); } @@ -376,7 +376,7 @@ private void setupLutRangeBoxes() { .translate(min2 * 16 - renderOrigin.getX(), debug1, min3 * 16 - renderOrigin.getZ()) .scale((max2 - min2) * 16, size1 * 16, (max3 - min3) * 16) .color(0, 255, 0) - .light(LightTexture.FULL_BRIGHT) + .light(LightCoordsUtil.FULL_BRIGHT) .setChanged(); } diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/engine/MaterialRenderState.java b/common/src/backend/java/dev/engine_room/flywheel/backend/engine/MaterialRenderState.java index 3f4e842c3..66ad9b1bc 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/engine/MaterialRenderState.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/engine/MaterialRenderState.java @@ -9,6 +9,7 @@ import com.mojang.blaze3d.opengl.GlSampler; import com.mojang.blaze3d.opengl.GlStateManager; import com.mojang.blaze3d.opengl.GlTextureView; +import com.mojang.blaze3d.pipeline.ColorTargetState; import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.textures.FilterMode; import com.mojang.blaze3d.textures.GpuSampler; @@ -44,7 +45,8 @@ public static void setupOit(Material material) { WriteMask mask = material.writeMask(); boolean writeColor = mask.color(); - GlStateManager._colorMask(writeColor, writeColor, writeColor, writeColor); + // TODO - IThundxr - Checkover + GlStateManager._colorMask(writeColor ? ColorTargetState.WRITE_ALL : ColorTargetState.WRITE_NONE); } private static void setupTexture(Material material) { @@ -151,7 +153,8 @@ private static void setupTransparency(Transparency transparency) { private static void setupWriteMask(WriteMask mask) { GlStateManager._depthMask(mask.depth()); boolean writeColor = mask.color(); - GlStateManager._colorMask(writeColor, writeColor, writeColor, writeColor); + // TODO - IThundxr - Checkover + GlStateManager._colorMask(writeColor ? ColorTargetState.WRITE_ALL : ColorTargetState.WRITE_NONE); } public static boolean materialEquals(Material lhs, Material rhs) { diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/engine/TextureBinder.java b/common/src/backend/java/dev/engine_room/flywheel/backend/engine/TextureBinder.java index a8ffb1e35..2847db585 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/engine/TextureBinder.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/engine/TextureBinder.java @@ -3,7 +3,6 @@ import org.lwjgl.opengl.GL33C; import com.mojang.blaze3d.opengl.GlConst; -import com.mojang.blaze3d.opengl.GlDevice; import com.mojang.blaze3d.opengl.GlSampler; import com.mojang.blaze3d.opengl.GlStateManager; import com.mojang.blaze3d.opengl.GlTexture; @@ -14,6 +13,7 @@ import com.mojang.blaze3d.textures.GpuTexture; import dev.engine_room.flywheel.backend.Samplers; +import dev.engine_room.flywheel.backend.gl.GlUtil; import net.minecraft.client.Minecraft; import net.minecraft.resources.Identifier; @@ -45,13 +45,13 @@ public static void bindLightAndOverlay() { var gameRenderer = Minecraft.getInstance().gameRenderer; GlSampler sampler = (GlSampler) RenderSystem.getSamplerCache().getClampToEdge(FilterMode.LINEAR); bind(Samplers.OVERLAY.number, (GlTextureView) gameRenderer.overlayTexture().getTextureView(), sampler); - bind(Samplers.LIGHT.number, (GlTextureView) gameRenderer.lightTexture().getTextureView(), sampler); + bind(Samplers.LIGHT.number, (GlTextureView) gameRenderer.lightmap(), sampler); } public static void bindRenderTarget(RenderTarget target) { GlTexture colorTexture = (GlTexture) target.getColorTexture(); int i = colorTexture.getFbo( - ((GlDevice) RenderSystem.getDevice()).directStateAccess(), + GlUtil.getGlDevice().directStateAccess(), target.getDepthTexture() ); GlStateManager._glBindFramebuffer(GlConst.GL_FRAMEBUFFER, i); diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/engine/indirect/OitFramebuffer.java b/common/src/backend/java/dev/engine_room/flywheel/backend/engine/indirect/OitFramebuffer.java index e2cbe1e58..1b95d9e99 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/engine/indirect/OitFramebuffer.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/engine/indirect/OitFramebuffer.java @@ -4,17 +4,17 @@ import org.lwjgl.opengl.GL46; import com.mojang.blaze3d.opengl.GlConst; -import com.mojang.blaze3d.opengl.GlDevice; import com.mojang.blaze3d.opengl.GlStateManager; import com.mojang.blaze3d.opengl.GlTexture; +import com.mojang.blaze3d.pipeline.ColorTargetState; import com.mojang.blaze3d.pipeline.RenderTarget; -import com.mojang.blaze3d.systems.RenderSystem; import dev.engine_room.flywheel.backend.NoiseTextures; import dev.engine_room.flywheel.backend.Samplers; import dev.engine_room.flywheel.backend.compile.OitPrograms; import dev.engine_room.flywheel.backend.gl.GlCompat; import dev.engine_room.flywheel.backend.gl.GlTextureUnit; +import dev.engine_room.flywheel.backend.gl.GlUtil; import net.minecraft.client.Minecraft; public class OitFramebuffer { @@ -84,12 +84,12 @@ public void prepare() { public void depthRange() { // No depth writes, but we'll still use the depth test. GlStateManager._depthMask(false); - GlStateManager._colorMask(true, true, true, true); + GlStateManager._colorMask(ColorTargetState.WRITE_ALL); GlStateManager._enableBlend(); GlStateManager._blendFuncSeparate(GlConst.GL_ONE, GlConst.GL_ONE, GlConst.GL_ONE, GlConst.GL_ONE); GL32.glBlendEquation(GlConst.GL_MAX); - var far = Minecraft.getInstance().gameRenderer.getDepthFar(); + float far = Minecraft.getInstance().gameRenderer.getGameRenderState().levelRenderState.cameraRenderState.depthFar; if (GlCompat.SUPPORTS_DSA) { GL46.glNamedFramebufferDrawBuffers(fbo, DEPTH_RANGE_DRAW_BUFFERS); @@ -107,7 +107,7 @@ public void depthRange() { public void renderTransmittance() { // No depth writes, but we'll still use the depth test GlStateManager._depthMask(false); - GlStateManager._colorMask(true, true, true, true); + GlStateManager._colorMask(ColorTargetState.WRITE_ALL); GlStateManager._enableBlend(); GlStateManager._blendFuncSeparate(GlConst.GL_ONE, GlConst.GL_ONE, GlConst.GL_ONE, GlConst.GL_ONE); GL32.glBlendEquation(GlConst.GL_FUNC_ADD); @@ -133,7 +133,7 @@ public void renderTransmittance() { public void renderDepthFromTransmittance() { // Only write to depth, not color. GlStateManager._depthMask(true); - GlStateManager._colorMask(false, false, false, false); + GlStateManager._colorMask(ColorTargetState.WRITE_NONE); GlStateManager._disableBlend(); GlStateManager._depthFunc(GlConst.GL_ALWAYS); @@ -155,7 +155,7 @@ public void renderDepthFromTransmittance() { public void accumulate() { // No depth writes, but we'll still use the depth test GlStateManager._depthMask(false); - GlStateManager._colorMask(true, true, true, true); + GlStateManager._colorMask(ColorTargetState.WRITE_ALL); GlStateManager._enableBlend(); GlStateManager._blendFuncSeparate(GlConst.GL_ONE, GlConst.GL_ONE, GlConst.GL_ONE, GlConst.GL_ONE); GL32.glBlendEquation(GlConst.GL_FUNC_ADD); @@ -186,7 +186,7 @@ public void composite() { // depthMask = false: other transparent stuff renders on top of OIT stuff. // If Neo gets wavelet OIT we can use their hooks to be correct with everything. GlStateManager._depthMask(true); - GlStateManager._colorMask(true, true, true, true); + GlStateManager._colorMask(ColorTargetState.WRITE_ALL); GlStateManager._enableBlend(); // We rely on the blend func to achieve: @@ -213,7 +213,7 @@ public void composite() { private static void bindRenderTarget(RenderTarget target) { GlTexture colorTexture = (GlTexture) target.getColorTexture(); int i = colorTexture.getFbo( - ((GlDevice) RenderSystem.getDevice()).directStateAccess(), + GlUtil.getGlDevice().directStateAccess(), target.getDepthTexture() ); GlStateManager._glBindFramebuffer(GlConst.GL_FRAMEBUFFER, i); diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/engine/uniform/FrameUniforms.java b/common/src/backend/java/dev/engine_room/flywheel/backend/engine/uniform/FrameUniforms.java index 591d8de36..4ae1146c6 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/engine/uniform/FrameUniforms.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/engine/uniform/FrameUniforms.java @@ -9,10 +9,11 @@ import dev.engine_room.flywheel.api.backend.RenderContext; import dev.engine_room.flywheel.api.visualization.VisualizationManager; import dev.engine_room.flywheel.backend.engine.indirect.DepthPyramid; +import dev.engine_room.flywheel.backend.extension.CameraRenderStateExtension; import dev.engine_room.flywheel.backend.mixin.LevelRendererAccessor; import net.minecraft.client.Camera; import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.GameRenderer; +import net.minecraft.client.renderer.state.level.CameraRenderState; import net.minecraft.core.BlockPos; import net.minecraft.core.Vec3i; import net.minecraft.util.Util; @@ -68,8 +69,8 @@ public static void update(RenderContext context) { Vec3i renderOrigin = VisualizationManager.getOrThrow(context.level()) .renderOrigin(); - var camera = context.camera(); - Vec3 cameraPos = camera.position(); + CameraRenderState cameraRenderState = context.cameraRenderState(); + Vec3 cameraPos = cameraRenderState.pos; var camX = (float) (cameraPos.x - renderOrigin.getX()); var camY = (float) (cameraPos.y - renderOrigin.getY()); var camZ = (float) (cameraPos.z - renderOrigin.getZ()); @@ -81,8 +82,8 @@ public static void update(RenderContext context) { VIEW_PROJECTION.translate(-camX, -camY, -camZ); CAMERA_POS.set(camX, camY, camZ); - CAMERA_LOOK.set(camera.forwardVector()); - CAMERA_ROT.set(camera.xRot(), camera.yRot()); + CAMERA_LOOK.set(((CameraRenderStateExtension) cameraRenderState).flywheel$getForwardVector()); + CAMERA_ROT.set(cameraRenderState.xRot, cameraRenderState.yRot); if (firstWrite) { setPrev(); @@ -95,7 +96,7 @@ public static void update(RenderContext context) { ptr += 96; - ptr = writeCullData(ptr); + ptr = writeCullData(ptr, cameraRenderState); ptr = writeMatrices(ptr); @@ -109,11 +110,11 @@ public static void update(RenderContext context) { ptr = writeFloat(ptr, (float) window.getWidth() / (float) window.getHeight()); // default line width: net.minecraft.client.renderer.RenderStateShard.LineStateShard ptr = writeFloat(ptr, Math.max(2.5F, (float) window.getWidth() / 1920.0F * 2.5F)); - ptr = writeFloat(ptr, Minecraft.getInstance().gameRenderer.getDepthFar()); + ptr = writeFloat(ptr, cameraRenderState.depthFar); ptr = writeTime(ptr, context); - ptr = writeCameraIn(ptr, camera); + ptr = writeCameraIn(ptr, cameraRenderState); ptr = writeInt(ptr, debugMode); @@ -178,20 +179,20 @@ private static long writeTime(long ptr, RenderContext context) { return ptr; } - private static long writeCameraIn(long ptr, Camera camera) { - if (!camera.isInitialized()) { + private static long writeCameraIn(long ptr, CameraRenderState cameraRenderState) { + if (!cameraRenderState.initialized) { ptr = writeInt(ptr, 0); ptr = writeInt(ptr, 0); return ptr; } - Level level = camera.entity().level(); - BlockPos blockPos = camera.blockPosition(); - Vec3 cameraPos = camera.position(); + Level level = Minecraft.getInstance().level; + BlockPos blockPos = cameraRenderState.blockPos; + Vec3 cameraPos = cameraRenderState.pos; return writeInFluidAndBlock(ptr, level, blockPos, cameraPos); } - private static long writeCullData(long ptr) { + private static long writeCullData(long ptr, CameraRenderState cameraRenderState) { var mc = Minecraft.getInstance(); var mainRenderTarget = mc.getMainRenderTarget(); @@ -199,8 +200,8 @@ private static long writeCullData(long ptr) { int pyramidHeight = DepthPyramid.mip0Size(mainRenderTarget.height); int pyramidDepth = DepthPyramid.getImageMipLevels(pyramidWidth, pyramidHeight); - ptr = writeFloat(ptr, GameRenderer.PROJECTION_Z_NEAR); // zNear - ptr = writeFloat(ptr, mc.gameRenderer.getDepthFar()); // zFar + ptr = writeFloat(ptr, Camera.PROJECTION_Z_NEAR); // zNear + ptr = writeFloat(ptr, cameraRenderState.depthFar); // zFar ptr = writeFloat(ptr, PROJECTION.m00()); // P00 ptr = writeFloat(ptr, PROJECTION.m11()); // P11 ptr = writeFloat(ptr, pyramidWidth); // pyramidWidth diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/engine/uniform/LevelUniforms.java b/common/src/backend/java/dev/engine_room/flywheel/backend/engine/uniform/LevelUniforms.java index 871cf58b4..d108fb79f 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/engine/uniform/LevelUniforms.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/engine/uniform/LevelUniforms.java @@ -3,12 +3,10 @@ import org.joml.Vector3f; import dev.engine_room.flywheel.api.backend.RenderContext; -import net.minecraft.client.Camera; import net.minecraft.client.multiplayer.ClientLevel; +import net.minecraft.client.renderer.state.level.LevelRenderState; import net.minecraft.resources.ResourceKey; import net.minecraft.util.ARGB; -import net.minecraft.world.attribute.EnvironmentAttributeProbe; -import net.minecraft.world.attribute.EnvironmentAttributes; import net.minecraft.world.level.Level; import net.minecraft.world.level.dimension.DimensionType; @@ -27,18 +25,17 @@ public static void update(RenderContext context) { ClientLevel level = context.level(); float partialTick = context.partialTick(); - Camera camera = context.camera(); - EnvironmentAttributeProbe probe = camera.attributeProbe(); + LevelRenderState levelRenderState = context.levelRenderState(); - int skyColor = probe.getValue(EnvironmentAttributes.SKY_COLOR, partialTick); - int cloudColor = probe.getValue(EnvironmentAttributes.CLOUD_COLOR, partialTick); + int skyColor = levelRenderState.skyRenderState.skyColor; + int cloudColor = levelRenderState.cloudColor; ptr = writeVec4(ptr, ARGB.redFloat(skyColor), ARGB.greenFloat(skyColor), ARGB.blueFloat(skyColor), 1f); ptr = writeVec4(ptr, ARGB.redFloat(cloudColor), ARGB.greenFloat(cloudColor), ARGB.blueFloat(cloudColor), 1f); ptr = writeVec3(ptr, LIGHT0_DIRECTION); ptr = writeVec3(ptr, LIGHT1_DIRECTION); - long dayTime = level.getDayTime(); + long dayTime = level.getOverworldClockTime(); // TODO - IThundxr - Checkover long levelDay = dayTime / 24000L; float timeOfDay = (float) (dayTime - levelDay * 24000L) / 24000f; ptr = writeInt(ptr, (int) (levelDay % 0x7FFFFFFFL)); @@ -46,17 +43,17 @@ public static void update(RenderContext context) { ptr = writeInt(ptr, level.dimensionType().hasSkyLight() ? 1 : 0); - float sunAngle = probe.getValue(EnvironmentAttributes.SUN_ANGLE, partialTick); + float sunAngle = levelRenderState.skyRenderState.sunAngle; ptr = writeFloat(ptr, sunAngle); - float moonAngle = probe.getValue(EnvironmentAttributes.MOON_ANGLE, partialTick); + float moonAngle = levelRenderState.skyRenderState.moonAngle; ptr = writeFloat(ptr, moonAngle); - float starAngle = probe.getValue(EnvironmentAttributes.STAR_ANGLE, partialTick); + float starAngle = levelRenderState.skyRenderState.starAngle; ptr = writeFloat(ptr, starAngle); - int moonPhase = probe.getValue(EnvironmentAttributes.MOON_PHASE, partialTick).index(); + int moonPhase = levelRenderState.skyRenderState.moonPhase.index(); ptr = writeFloat(ptr, DimensionType.MOON_BRIGHTNESS_PER_PHASE[moonPhase]); ptr = writeInt(ptr, moonPhase); - float starBrightness = probe.getValue(EnvironmentAttributes.STAR_BRIGHTNESS, partialTick); + float starBrightness = levelRenderState.skyRenderState.starBrightness; ptr = writeFloat(ptr, starBrightness); ptr = writeInt(ptr, level.isRaining() ? 1 : 0); diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/extension/CameraRenderStateExtension.java b/common/src/backend/java/dev/engine_room/flywheel/backend/extension/CameraRenderStateExtension.java new file mode 100644 index 000000000..791c471da --- /dev/null +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/extension/CameraRenderStateExtension.java @@ -0,0 +1,7 @@ +package dev.engine_room.flywheel.backend.extension; + +import org.joml.Vector3f; + +public interface CameraRenderStateExtension { + Vector3f flywheel$getForwardVector(); +} diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/SkyLightSectionStorageExtension.java b/common/src/backend/java/dev/engine_room/flywheel/backend/extension/SkyLightSectionStorageExtension.java similarity index 79% rename from common/src/backend/java/dev/engine_room/flywheel/backend/SkyLightSectionStorageExtension.java rename to common/src/backend/java/dev/engine_room/flywheel/backend/extension/SkyLightSectionStorageExtension.java index 977bfe979..055484ede 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/SkyLightSectionStorageExtension.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/extension/SkyLightSectionStorageExtension.java @@ -1,4 +1,4 @@ -package dev.engine_room.flywheel.backend; +package dev.engine_room.flywheel.backend.extension; import org.jspecify.annotations.Nullable; diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/gl/GlUtil.java b/common/src/backend/java/dev/engine_room/flywheel/backend/gl/GlUtil.java new file mode 100644 index 000000000..55cfc42a8 --- /dev/null +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/gl/GlUtil.java @@ -0,0 +1,16 @@ +package dev.engine_room.flywheel.backend.gl; + +import com.mojang.blaze3d.opengl.GlDevice; +import com.mojang.blaze3d.systems.GpuDeviceBackend; +import com.mojang.blaze3d.systems.RenderSystem; + +import dev.engine_room.flywheel.backend.mixin.GpuDeviceAccessor; + +public class GlUtil { + // TODO: This is bad, really bad for when vulkan comes around + @Deprecated(forRemoval = true) + public static GlDevice getGlDevice() { + GpuDeviceBackend backend = ((GpuDeviceAccessor) RenderSystem.getDevice()).flywheel$getBackend(); + return (GlDevice) backend; + } +} diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/mixin/CameraAccessor.java b/common/src/backend/java/dev/engine_room/flywheel/backend/mixin/CameraAccessor.java new file mode 100644 index 000000000..b62b50e71 --- /dev/null +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/mixin/CameraAccessor.java @@ -0,0 +1,12 @@ +package dev.engine_room.flywheel.backend.mixin; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +import net.minecraft.client.Camera; + +@Mixin(Camera.class) +public interface CameraAccessor { + @Accessor("depthFar") + float flywheel$getDepthFar(); +} diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/mixin/CameraMixin.java b/common/src/backend/java/dev/engine_room/flywheel/backend/mixin/CameraMixin.java new file mode 100644 index 000000000..b4a1ebcbe --- /dev/null +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/mixin/CameraMixin.java @@ -0,0 +1,23 @@ +package dev.engine_room.flywheel.backend.mixin; + +import org.joml.Vector3fc; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import dev.engine_room.flywheel.backend.extension.CameraRenderStateExtension; +import net.minecraft.client.Camera; +import net.minecraft.client.renderer.state.level.CameraRenderState; + +@Mixin(Camera.class) +public abstract class CameraMixin { + @Shadow + public abstract Vector3fc forwardVector(); + + @Inject(method = "extractRenderState", at = @At("TAIL")) + private void flywheel$extendRenderState(CameraRenderState cameraState, float cameraEntityPartialTicks, CallbackInfo ci) { + ((CameraRenderStateExtension) cameraState).flywheel$getForwardVector().set(forwardVector()); + } +} diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/mixin/CameraRenderStateMixin.java b/common/src/backend/java/dev/engine_room/flywheel/backend/mixin/CameraRenderStateMixin.java new file mode 100644 index 000000000..65f3391c3 --- /dev/null +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/mixin/CameraRenderStateMixin.java @@ -0,0 +1,19 @@ +package dev.engine_room.flywheel.backend.mixin; + +import org.joml.Vector3f; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Unique; + +import dev.engine_room.flywheel.backend.extension.CameraRenderStateExtension; +import net.minecraft.client.renderer.state.level.CameraRenderState; + +@Mixin(CameraRenderState.class) +public class CameraRenderStateMixin implements CameraRenderStateExtension { + @Unique + private final Vector3f flywheel$forwardVector = new Vector3f(); + + @Override + public Vector3f flywheel$getForwardVector() { + return flywheel$forwardVector; + } +} diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/mixin/FogRendererMixin.java b/common/src/backend/java/dev/engine_room/flywheel/backend/mixin/FogRendererMixin.java index d0b9bb098..b2b9b2440 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/mixin/FogRendererMixin.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/mixin/FogRendererMixin.java @@ -1,12 +1,9 @@ package dev.engine_room.flywheel.backend.mixin; -import org.joml.Vector4f; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; - -import com.llamalad7.mixinextras.sugar.Local; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import dev.engine_room.flywheel.backend.engine.uniform.FogUniforms; import net.minecraft.client.renderer.fog.FogData; @@ -14,8 +11,8 @@ @Mixin(FogRenderer.class) abstract class FogRendererMixin { - @Inject(method = "setupFog(Lnet/minecraft/client/Camera;ILnet/minecraft/client/DeltaTracker;FLnet/minecraft/client/multiplayer/ClientLevel;)Lorg/joml/Vector4f;", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/fog/FogRenderer;updateBuffer(Ljava/nio/ByteBuffer;ILorg/joml/Vector4f;FFFFFF)V")) - private static void flywheel$onReturnSetupFog(CallbackInfoReturnable cir, @Local Vector4f fogColor, @Local FogData fogData) { - FogUniforms.update(fogColor, fogData.environmentalStart, fogData.environmentalEnd, fogData.renderDistanceStart, fogData.renderDistanceEnd, fogData.skyEnd, fogData.cloudEnd); + @Inject(method = "updateBuffer(Lnet/minecraft/client/renderer/fog/FogData;)V", at = @At("HEAD")) + private static void flywheel$onReturnSetupFog(FogData fog, CallbackInfo ci) { + FogUniforms.update(fog.color, fog.environmentalStart, fog.environmentalEnd, fog.renderDistanceStart, fog.renderDistanceEnd, fog.skyEnd, fog.cloudEnd); } } diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/mixin/GpuDeviceAccessor.java b/common/src/backend/java/dev/engine_room/flywheel/backend/mixin/GpuDeviceAccessor.java new file mode 100644 index 000000000..a907105cd --- /dev/null +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/mixin/GpuDeviceAccessor.java @@ -0,0 +1,13 @@ +package dev.engine_room.flywheel.backend.mixin; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +import com.mojang.blaze3d.systems.GpuDevice; +import com.mojang.blaze3d.systems.GpuDeviceBackend; + +@Mixin(GpuDevice.class) +public interface GpuDeviceAccessor { + @Accessor("backend") + GpuDeviceBackend flywheel$getBackend(); +} diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/mixin/light/LayerLightSectionStorageAccessor.java b/common/src/backend/java/dev/engine_room/flywheel/backend/mixin/light/LayerLightSectionStorageAccessor.java index 562ac36db..f7cb652ce 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/mixin/light/LayerLightSectionStorageAccessor.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/mixin/light/LayerLightSectionStorageAccessor.java @@ -1,7 +1,6 @@ package dev.engine_room.flywheel.backend.mixin.light; -import javax.annotation.Nullable; - +import org.jspecify.annotations.Nullable; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.gen.Invoker; diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/mixin/light/SkyLightSectionStorageMixin.java b/common/src/backend/java/dev/engine_room/flywheel/backend/mixin/light/SkyLightSectionStorageMixin.java index 37f74f7fa..09e357efe 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/mixin/light/SkyLightSectionStorageMixin.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/mixin/light/SkyLightSectionStorageMixin.java @@ -3,7 +3,7 @@ import org.jspecify.annotations.Nullable; import org.spongepowered.asm.mixin.Mixin; -import dev.engine_room.flywheel.backend.SkyLightSectionStorageExtension; +import dev.engine_room.flywheel.backend.extension.SkyLightSectionStorageExtension; import net.minecraft.core.Direction; import net.minecraft.core.SectionPos; import net.minecraft.world.level.chunk.DataLayer; diff --git a/common/src/backend/resources/flywheel.backend.mixins.json b/common/src/backend/resources/flywheel.backend.mixins.json index 6ce9647b9..58a84bf35 100644 --- a/common/src/backend/resources/flywheel.backend.mixins.json +++ b/common/src/backend/resources/flywheel.backend.mixins.json @@ -1,10 +1,11 @@ { - "required": true, - "minVersion": "0.8", - "package": "dev.engine_room.flywheel.backend.mixin", - "compatibilityLevel": "JAVA_25", - "client": [ + "required" : true, + "minVersion" : "0.8", + "package" : "dev.engine_room.flywheel.backend.mixin", + "compatibilityLevel" : "JAVA_25", + "client" : [ "AbstractClientPlayerAccessor", + "CameraAccessor", "CameraMixin", "CameraRenderStateMixin", "FogRendererMixin", @@ -20,7 +21,7 @@ "light.SkyDataLayerStorageMapAccessor", "light.SkyLightSectionStorageMixin" ], - "injectors": { - "defaultRequire": 1 + "injectors" : { + "defaultRequire" : 1 } } diff --git a/common/src/lib/java/dev/engine_room/flywheel/lib/instance/FlatLit.java b/common/src/lib/java/dev/engine_room/flywheel/lib/instance/FlatLit.java index 9fe9f4884..3109c90fa 100644 --- a/common/src/lib/java/dev/engine_room/flywheel/lib/instance/FlatLit.java +++ b/common/src/lib/java/dev/engine_room/flywheel/lib/instance/FlatLit.java @@ -8,7 +8,7 @@ import dev.engine_room.flywheel.api.instance.Instance; import dev.engine_room.flywheel.lib.visual.AbstractBlockEntityVisual; import dev.engine_room.flywheel.lib.visual.AbstractEntityVisual; -import net.minecraft.client.renderer.LightTexture; +import net.minecraft.util.LightCoordsUtil; /** * An interface that implementors of {@link Instance} should also implement if they wish to make use of @@ -17,7 +17,7 @@ public interface FlatLit extends Instance { /** * Set the packed light value for this instance. - * @param packedLight the packed light per {@link LightTexture#pack(int, int)} + * @param packedLight the packed light per {@link LightCoordsUtil#pack(int, int)} * @return {@code this} for chaining */ FlatLit light(int packedLight); @@ -29,7 +29,7 @@ public interface FlatLit extends Instance { * @return {@code this} for chaining */ default FlatLit light(int blockLight, int skyLight) { - return light(LightTexture.pack(blockLight, skyLight)); + return light(LightCoordsUtil.pack(blockLight, skyLight)); } static void relight(int packedLight, @Nullable FlatLit... instances) { diff --git a/common/src/lib/java/dev/engine_room/flywheel/lib/material/Materials.java b/common/src/lib/java/dev/engine_room/flywheel/lib/material/Materials.java index d8d768339..2c94ed015 100644 --- a/common/src/lib/java/dev/engine_room/flywheel/lib/material/Materials.java +++ b/common/src/lib/java/dev/engine_room/flywheel/lib/material/Materials.java @@ -5,7 +5,7 @@ import dev.engine_room.flywheel.api.material.Material; import dev.engine_room.flywheel.api.material.Transparency; import dev.engine_room.flywheel.api.material.WriteMask; -import net.minecraft.client.renderer.entity.ItemRenderer; +import net.minecraft.client.renderer.feature.ItemFeatureRenderer; import net.minecraft.client.renderer.texture.TextureAtlas; // FIXME 1.21.11: use default blur/mipmap from AbstractTexture for all materials here, and by default @@ -40,7 +40,7 @@ public final class Materials { .build(); public static final Material GLINT = SimpleMaterial.builder() - .texture(ItemRenderer.ENCHANTED_GLINT_ITEM) + .texture(ItemFeatureRenderer.ENCHANTED_GLINT_ITEM) .shaders(StandardMaterialShaders.GLINT) .transparency(Transparency.GLINT) .writeMask(WriteMask.COLOR) diff --git a/common/src/lib/java/dev/engine_room/flywheel/lib/model/LineModelBuilder.java b/common/src/lib/java/dev/engine_room/flywheel/lib/model/LineModelBuilder.java index 1012ae04f..17eac0047 100644 --- a/common/src/lib/java/dev/engine_room/flywheel/lib/model/LineModelBuilder.java +++ b/common/src/lib/java/dev/engine_room/flywheel/lib/model/LineModelBuilder.java @@ -16,8 +16,8 @@ import dev.engine_room.flywheel.lib.memory.MemoryBlock; import dev.engine_room.flywheel.lib.vertex.FullVertexView; import dev.engine_room.flywheel.lib.vertex.VertexView; -import net.minecraft.client.renderer.LightTexture; import net.minecraft.client.renderer.texture.OverlayTexture; +import net.minecraft.util.LightCoordsUtil; public final class LineModelBuilder { private static final Material MATERIAL = SimpleMaterial.builder() @@ -91,7 +91,7 @@ public LineModelBuilder line(float x1, float y1, float z1, float x2, float y2, f vertexView.u(vertexCount + i, 0); vertexView.v(vertexCount + i, 0); vertexView.overlay(vertexCount + i, OverlayTexture.NO_OVERLAY); - vertexView.light(vertexCount + i, LightTexture.FULL_BRIGHT); + vertexView.light(vertexCount + i, LightCoordsUtil.FULL_BRIGHT); vertexView.normalX(vertexCount + i, normalX); vertexView.normalY(vertexCount + i, normalY); vertexView.normalZ(vertexCount + i, normalZ); diff --git a/common/src/lib/java/dev/engine_room/flywheel/lib/model/ModelUtil.java b/common/src/lib/java/dev/engine_room/flywheel/lib/model/ModelUtil.java index 5cfdd0d76..7260cad9f 100644 --- a/common/src/lib/java/dev/engine_room/flywheel/lib/model/ModelUtil.java +++ b/common/src/lib/java/dev/engine_room/flywheel/lib/model/ModelUtil.java @@ -82,10 +82,6 @@ public static Material getItemMaterial(RenderType renderType) { return Materials.CUTOUT_BLOCK; } - if (renderType == Sheets.solidBlockSheet()) { - return Materials.SOLID_BLOCK; - } - if (renderType == Sheets.translucentBlockItemSheet()) { return Materials.TRANSLUCENT_ITEM_ENTITY_BLOCK; } diff --git a/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/BlockModelBuilder.java b/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/BlockModelBuilder.java index 0b0e77270..8532fa0fb 100644 --- a/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/BlockModelBuilder.java +++ b/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/BlockModelBuilder.java @@ -10,10 +10,10 @@ import dev.engine_room.flywheel.lib.internal.FlwLibXplat; import dev.engine_room.flywheel.lib.model.ModelUtil; import dev.engine_room.flywheel.lib.model.SimpleModel; -import net.minecraft.client.renderer.block.model.BlockStateModel; +import net.minecraft.client.renderer.block.BlockAndTintGetter; +import net.minecraft.client.renderer.block.dispatch.BlockStateModel; import net.minecraft.client.renderer.chunk.ChunkSectionLayer; import net.minecraft.core.BlockPos; -import net.minecraft.world.level.BlockAndTintGetter; public final class BlockModelBuilder { final BlockStateModel blockModel; diff --git a/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/EmptyVertexConsumer.java b/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/EmptyVertexConsumer.java new file mode 100644 index 000000000..1901069f8 --- /dev/null +++ b/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/EmptyVertexConsumer.java @@ -0,0 +1,49 @@ +package dev.engine_room.flywheel.lib.model.baked; + +import com.mojang.blaze3d.vertex.VertexConsumer; + +public class EmptyVertexConsumer implements VertexConsumer { + public static final EmptyVertexConsumer INSTANCE = new EmptyVertexConsumer(); + + private EmptyVertexConsumer() {} + + @Override + public VertexConsumer addVertex(float x, float y, float z) { + return this; + } + + @Override + public VertexConsumer setColor(int r, int g, int b, int a) { + return this; + } + + @Override + public VertexConsumer setColor(int color) { + return this; + } + + @Override + public VertexConsumer setUv(float u, float v) { + return this; + } + + @Override + public VertexConsumer setUv1(int u, int v) { + return this; + } + + @Override + public VertexConsumer setUv2(int u, int v) { + return this; + } + + @Override + public VertexConsumer setNormal(float x, float y, float z) { + return this; + } + + @Override + public VertexConsumer setLineWidth(float width) { + return this; + } +} diff --git a/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/LevelModelBuilder.java b/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/LevelModelBuilder.java index 3748c3ba5..1aa716adc 100644 --- a/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/LevelModelBuilder.java +++ b/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/LevelModelBuilder.java @@ -10,9 +10,9 @@ import dev.engine_room.flywheel.lib.internal.FlwLibXplat; import dev.engine_room.flywheel.lib.model.ModelUtil; import dev.engine_room.flywheel.lib.model.SimpleModel; +import net.minecraft.client.renderer.block.BlockAndTintGetter; import net.minecraft.client.renderer.chunk.ChunkSectionLayer; import net.minecraft.core.BlockPos; -import net.minecraft.world.level.BlockAndTintGetter; public final class LevelModelBuilder { final BlockAndTintGetter level; diff --git a/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/PartialModel.java b/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/PartialModel.java index 3ab6be8cb..68c30a8d6 100644 --- a/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/PartialModel.java +++ b/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/PartialModel.java @@ -4,8 +4,8 @@ import org.jetbrains.annotations.UnknownNullability; import dev.engine_room.flywheel.lib.internal.FlwLibXplat; -import net.minecraft.client.renderer.block.model.BlockStateModel; -import net.minecraft.client.renderer.block.model.SimpleModelWrapper; +import net.minecraft.client.renderer.block.dispatch.BlockStateModel; +import net.minecraft.client.resources.model.SimpleModelWrapper; import net.minecraft.resources.Identifier; /** diff --git a/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/VirtualBlockGetter.java b/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/VirtualBlockGetter.java index 808200da8..42077bb04 100644 --- a/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/VirtualBlockGetter.java +++ b/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/VirtualBlockGetter.java @@ -3,10 +3,10 @@ import java.util.function.ToIntFunction; import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.block.BlockAndTintGetter; import net.minecraft.core.BlockPos; -import net.minecraft.core.Direction; import net.minecraft.core.registries.Registries; -import net.minecraft.world.level.BlockAndTintGetter; +import net.minecraft.world.level.CardinalLighting; import net.minecraft.world.level.ColorResolver; import net.minecraft.world.level.biome.Biome; import net.minecraft.world.level.biome.Biomes; @@ -26,8 +26,8 @@ public FluidState getFluidState(BlockPos pos) { } @Override - public float getShade(Direction direction, boolean shaded) { - return 1f; + public CardinalLighting cardinalLighting() { + return CardinalLighting.DEFAULT; } @Override diff --git a/common/src/lib/java/dev/engine_room/flywheel/lib/model/part/MeshTree.java b/common/src/lib/java/dev/engine_room/flywheel/lib/model/part/MeshTree.java index 406729011..e60cc942f 100644 --- a/common/src/lib/java/dev/engine_room/flywheel/lib/model/part/MeshTree.java +++ b/common/src/lib/java/dev/engine_room/flywheel/lib/model/part/MeshTree.java @@ -19,8 +19,8 @@ import net.minecraft.client.model.geom.ModelLayerLocation; import net.minecraft.client.model.geom.ModelPart; import net.minecraft.client.model.geom.PartPose; -import net.minecraft.client.renderer.LightTexture; import net.minecraft.client.renderer.texture.OverlayTexture; +import net.minecraft.util.LightCoordsUtil; public final class MeshTree { private static final ThreadLocal THREAD_LOCAL_OBJECTS = ThreadLocal.withInitial(ThreadLocalObjects::new); @@ -74,7 +74,7 @@ private static Mesh compile(ModelPart modelPart, ThreadLocalObjects objects) { } VertexWriter vertexWriter = objects.vertexWriter; - FlwLibLink.INSTANCE.compileModelPart(modelPart, IDENTITY_POSE, vertexWriter, LightTexture.FULL_BRIGHT, OverlayTexture.NO_OVERLAY, 0xFFFFFFFF); + FlwLibLink.INSTANCE.compileModelPart(modelPart, IDENTITY_POSE, vertexWriter, LightCoordsUtil.FULL_BRIGHT, OverlayTexture.NO_OVERLAY, 0xFFFFFFFF); MemoryBlock data = vertexWriter.copyDataAndReset(); VertexView vertexView = new PosTexNormalVertexView(); diff --git a/common/src/lib/java/dev/engine_room/flywheel/lib/model/part/ModelTrees.java b/common/src/lib/java/dev/engine_room/flywheel/lib/model/part/ModelTrees.java index c1bccb4da..6f9d126ef 100644 --- a/common/src/lib/java/dev/engine_room/flywheel/lib/model/part/ModelTrees.java +++ b/common/src/lib/java/dev/engine_room/flywheel/lib/model/part/ModelTrees.java @@ -16,7 +16,8 @@ import net.minecraft.client.Minecraft; import net.minecraft.client.model.geom.ModelLayerLocation; import net.minecraft.client.renderer.texture.TextureAtlasSprite; -import net.minecraft.client.resources.model.AtlasManager; +import net.minecraft.client.resources.model.sprite.AtlasManager; +import net.minecraft.client.resources.model.sprite.SpriteId; public final class ModelTrees { private static final RendererReloadCache CACHE = new RendererReloadCache<>(k -> { @@ -37,7 +38,7 @@ public static ModelTree of(ModelLayerLocation layer, Material material) { return CACHE.get(new ModelTreeKey(layer, Collections.emptySet(), null, material)); } - public static ModelTree of(ModelLayerLocation layer, net.minecraft.client.resources.model.Material texture, Material material) { + public static ModelTree of(ModelLayerLocation layer, SpriteId texture, Material material) { return CACHE.get(new ModelTreeKey(layer, Collections.emptySet(), texture, material)); } @@ -45,7 +46,7 @@ public static ModelTree of(ModelLayerLocation layer, Set pathsToPrune, M return CACHE.get(new ModelTreeKey(layer, Set.copyOf(pathsToPrune), null, material)); } - public static ModelTree of(ModelLayerLocation layer, Set pathsToPrune, net.minecraft.client.resources.model.Material texture, Material material) { + public static ModelTree of(ModelLayerLocation layer, Set pathsToPrune, SpriteId texture, Material material) { return CACHE.get(new ModelTreeKey(layer, Set.copyOf(pathsToPrune), texture, material)); } @@ -81,6 +82,6 @@ private static ModelTree convert(String path, MeshTree meshTree, Set pat return new ModelTree(model, meshTree.initialPose(), children); } - private record ModelTreeKey(ModelLayerLocation layer, Set pathsToPrune, net.minecraft.client.resources.model.@Nullable Material texture, Material material) { + private record ModelTreeKey(ModelLayerLocation layer, Set pathsToPrune, @Nullable SpriteId texture, Material material) { } } diff --git a/common/src/lib/java/dev/engine_room/flywheel/lib/visual/AbstractBlockEntityVisual.java b/common/src/lib/java/dev/engine_room/flywheel/lib/visual/AbstractBlockEntityVisual.java index 63bf3769f..1bd92114a 100644 --- a/common/src/lib/java/dev/engine_room/flywheel/lib/visual/AbstractBlockEntityVisual.java +++ b/common/src/lib/java/dev/engine_room/flywheel/lib/visual/AbstractBlockEntityVisual.java @@ -96,15 +96,15 @@ public boolean isVisible(FrustumIntersection frustum) { */ public boolean doDistanceLimitThisFrame(DynamicVisual.Context context) { return !context.limiter() - .shouldUpdate(pos.distToCenterSqr(context.camera().position())); + .shouldUpdate(pos.distToCenterSqr(context.cameraRenderState().pos)); } protected int computePackedLight() { - return LevelRenderer.getLightColor(level, pos); + return LevelRenderer.getLightCoords(level, pos); } protected void relight(BlockPos pos, @Nullable FlatLit... instances) { - FlatLit.relight(LevelRenderer.getLightColor(level, pos), instances); + FlatLit.relight(LevelRenderer.getLightCoords(level, pos), instances); } protected void relight(@Nullable FlatLit... instances) { @@ -112,7 +112,7 @@ protected void relight(@Nullable FlatLit... instances) { } protected void relight(BlockPos pos, Iterator<@Nullable FlatLit> instances) { - FlatLit.relight(LevelRenderer.getLightColor(level, pos), instances); + FlatLit.relight(LevelRenderer.getLightCoords(level, pos), instances); } protected void relight(Iterator<@Nullable FlatLit> instances) { @@ -120,7 +120,7 @@ protected void relight(Iterator<@Nullable FlatLit> instances) { } protected void relight(BlockPos pos, Iterable<@Nullable FlatLit> instances) { - FlatLit.relight(LevelRenderer.getLightColor(level, pos), instances); + FlatLit.relight(LevelRenderer.getLightCoords(level, pos), instances); } protected void relight(Iterable<@Nullable FlatLit> instances) { diff --git a/common/src/lib/java/dev/engine_room/flywheel/lib/visual/AbstractEntityVisual.java b/common/src/lib/java/dev/engine_room/flywheel/lib/visual/AbstractEntityVisual.java index fcc235ab3..3061b2d14 100644 --- a/common/src/lib/java/dev/engine_room/flywheel/lib/visual/AbstractEntityVisual.java +++ b/common/src/lib/java/dev/engine_room/flywheel/lib/visual/AbstractEntityVisual.java @@ -13,8 +13,8 @@ import dev.engine_room.flywheel.api.visualization.VisualizationManager; import dev.engine_room.flywheel.lib.instance.FlatLit; import dev.engine_room.flywheel.lib.internal.FlwLibLink; -import net.minecraft.client.renderer.LightTexture; import net.minecraft.core.BlockPos; +import net.minecraft.util.LightCoordsUtil; import net.minecraft.util.Mth; import net.minecraft.world.entity.Entity; import net.minecraft.world.level.LightLayer; @@ -97,7 +97,7 @@ protected int computePackedLight(float partialTick) { BlockPos pos = BlockPos.containing(entity.getLightProbePosition(partialTick)); int blockLight = entity.isOnFire() ? 15 : level.getBrightness(LightLayer.BLOCK, pos); int skyLight = level.getBrightness(LightLayer.SKY, pos); - return LightTexture.pack(blockLight, skyLight); + return LightCoordsUtil.pack(blockLight, skyLight); } protected void relight(float partialTick, @Nullable FlatLit... instances) { diff --git a/common/src/lib/java/dev/engine_room/flywheel/lib/visual/component/FireComponent.java b/common/src/lib/java/dev/engine_room/flywheel/lib/visual/component/FireComponent.java index a6a24434e..9be814e00 100644 --- a/common/src/lib/java/dev/engine_room/flywheel/lib/visual/component/FireComponent.java +++ b/common/src/lib/java/dev/engine_room/flywheel/lib/visual/component/FireComponent.java @@ -20,9 +20,10 @@ import dev.engine_room.flywheel.lib.util.RendererReloadCache; import dev.engine_room.flywheel.lib.visual.util.SmartRecycler; import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.LightTexture; import net.minecraft.client.renderer.texture.TextureAtlasSprite; import net.minecraft.client.resources.model.ModelBakery; +import net.minecraft.client.resources.model.sprite.SpriteId; +import net.minecraft.util.LightCoordsUtil; import net.minecraft.util.Mth; import net.minecraft.world.entity.Entity; @@ -34,10 +35,7 @@ public final class FireComponent implements EntityComponent { .backfaceCulling(false) // Disable backface because we want to be able to flip the model. .build(); - // Parameterize by the material instead of the sprite - // because Material#sprite is a surprisingly heavy operation - // and because sprites are invalidated after a resource reload. - private static final RendererReloadCache FIRE_MODELS = new RendererReloadCache<>(texture -> { + private static final RendererReloadCache FIRE_MODELS = new RendererReloadCache<>(texture -> { TextureAtlasSprite sprite = Minecraft.getInstance().getAtlasManager().get(texture); return new SingleMeshModel(new FireMesh(sprite), FIRE_MATERIAL); }); @@ -59,7 +57,7 @@ private TransformedInstance createInstance(Model model) { TransformedInstance instance = context.instancerProvider() .instancer(InstanceTypes.TRANSFORMED, model) .createInstance(); - instance.light(LightTexture.FULL_BLOCK); + instance.light(LightCoordsUtil.pack(15, 0)); instance.setChanged(); return instance; } @@ -96,8 +94,7 @@ private void setupInstances(DynamicVisual.Context context) { stack.setIdentity(); stack.translate(entityX - renderOrigin.getX(), entityY - renderOrigin.getY(), entityZ - renderOrigin.getZ()); stack.scale(scale, scale, scale); - stack.mulPose(Axis.YP.rotationDegrees(-context.camera() - .yRot())); + stack.mulPose(Axis.YP.rotationDegrees(-context.cameraRenderState().yRot)); stack.translate(0.0F, 0.0F, -0.3F + (float) ((int) maxHeight) * 0.02F); for (int i = 0; y < maxHeight; ++i) { @@ -157,7 +154,7 @@ private static void writeVertex(MutableVertexList vertexList, int i, float x, fl vertexList.b(i, 1); vertexList.u(i, u); vertexList.v(i, v); - vertexList.light(i, LightTexture.FULL_BLOCK); + vertexList.light(i, LightCoordsUtil.pack(15, 0)); vertexList.normalX(i, 0); vertexList.normalY(i, 1); vertexList.normalZ(i, 0); diff --git a/common/src/lib/java/dev/engine_room/flywheel/lib/visual/component/HitboxComponent.java b/common/src/lib/java/dev/engine_room/flywheel/lib/visual/component/HitboxComponent.java index 99887fefc..87e4ccb83 100644 --- a/common/src/lib/java/dev/engine_room/flywheel/lib/visual/component/HitboxComponent.java +++ b/common/src/lib/java/dev/engine_room/flywheel/lib/visual/component/HitboxComponent.java @@ -11,7 +11,7 @@ import dev.engine_room.flywheel.lib.visual.util.SmartRecycler; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.components.debug.DebugScreenEntries; -import net.minecraft.client.renderer.LightTexture; +import net.minecraft.util.LightCoordsUtil; import net.minecraft.util.Mth; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.LivingEntity; @@ -69,7 +69,7 @@ private TransformedInstance createInstance(Model model) { TransformedInstance instance = context.instancerProvider() .instancer(InstanceTypes.TRANSFORMED, model) .createInstance(); - instance.light(LightTexture.FULL_BLOCK); + instance.light(LightCoordsUtil.pack(15, 0)); instance.setChanged(); return instance; } diff --git a/common/src/lib/java/dev/engine_room/flywheel/lib/visual/component/ShadowComponent.java b/common/src/lib/java/dev/engine_room/flywheel/lib/visual/component/ShadowComponent.java index 174aab9b6..2a86de5ec 100644 --- a/common/src/lib/java/dev/engine_room/flywheel/lib/visual/component/ShadowComponent.java +++ b/common/src/lib/java/dev/engine_room/flywheel/lib/visual/component/ShadowComponent.java @@ -1,10 +1,8 @@ package dev.engine_room.flywheel.lib.visual.component; -import net.minecraft.resources.Identifier; - -import org.jspecify.annotations.Nullable; import org.joml.Vector4f; import org.joml.Vector4fc; +import org.jspecify.annotations.Nullable; import dev.engine_room.flywheel.api.material.Material; import dev.engine_room.flywheel.api.material.Transparency; @@ -20,11 +18,13 @@ import dev.engine_room.flywheel.lib.model.SingleMeshModel; import dev.engine_room.flywheel.lib.visual.util.InstanceRecycler; import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.LightTexture; +import net.minecraft.client.renderer.Lightmap; import net.minecraft.client.renderer.texture.OverlayTexture; import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.core.Direction.Axis; +import net.minecraft.resources.Identifier; +import net.minecraft.util.LightCoordsUtil; import net.minecraft.util.Mth; import net.minecraft.world.entity.Entity; import net.minecraft.world.level.Level; @@ -158,7 +158,7 @@ private void setupInstance(ChunkAccess chunk, MutableBlockPos pos, float entityX // Too dark to render. return; } - float blockBrightness = LightTexture.getBrightness(level.dimensionType(), maxLocalRawBrightness); + float blockBrightness = Lightmap.getBrightness(level.dimensionType(), maxLocalRawBrightness); float alpha = strength * 0.5F * blockBrightness; if (alpha < 0.0F) { // Too far away/too weak to render. @@ -257,7 +257,7 @@ private static void writeVertex(MutableVertexList vertexList, int i, float x, fl vertexList.b(i, 1); vertexList.u(i, 0); vertexList.v(i, 0); - vertexList.light(i, LightTexture.FULL_BRIGHT); + vertexList.light(i, LightCoordsUtil.FULL_BRIGHT); vertexList.overlay(i, OverlayTexture.NO_OVERLAY); vertexList.normalX(i, 0); vertexList.normalY(i, 1); diff --git a/common/src/main/java/dev/engine_room/flywheel/impl/event/RenderContextImpl.java b/common/src/main/java/dev/engine_room/flywheel/impl/event/RenderContextImpl.java index 5b52009d5..c2748a363 100644 --- a/common/src/main/java/dev/engine_room/flywheel/impl/event/RenderContextImpl.java +++ b/common/src/main/java/dev/engine_room/flywheel/impl/event/RenderContextImpl.java @@ -4,18 +4,21 @@ import org.joml.Matrix4fc; import dev.engine_room.flywheel.api.backend.RenderContext; -import net.minecraft.client.Camera; import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.client.renderer.LevelRenderer; import net.minecraft.client.renderer.RenderBuffers; +import net.minecraft.client.renderer.state.level.CameraRenderState; +import net.minecraft.client.renderer.state.level.LevelRenderState; public record RenderContextImpl(LevelRenderer renderer, ClientLevel level, RenderBuffers buffers, Matrix4fc modelView, - Matrix4fc projection, Matrix4fc viewProjection, Camera camera, - float partialTick) implements RenderContext { - public static RenderContextImpl create(LevelRenderer renderer, ClientLevel level, RenderBuffers buffers, Matrix4fc modelView, Matrix4f projection, Camera camera, float partialTick) { + Matrix4fc projection, Matrix4fc viewProjection, CameraRenderState cameraRenderState, + LevelRenderState levelRenderState, float partialTick) implements RenderContext { + public static ScopedValue PROJECTION_MATRIX_NO_BOB = ScopedValue.newInstance(); + + public static RenderContextImpl create(LevelRenderer renderer, ClientLevel level, RenderBuffers buffers, Matrix4fc modelView, Matrix4f projection, CameraRenderState cameraRenderState, LevelRenderState levelRenderState, float partialTick) { Matrix4f viewProjection = new Matrix4f(projection); viewProjection.mul(modelView); - return new RenderContextImpl(renderer, level, buffers, modelView, projection, viewProjection, camera, partialTick); + return new RenderContextImpl(renderer, level, buffers, modelView, projection, viewProjection, cameraRenderState, levelRenderState, partialTick); } } diff --git a/common/src/main/java/dev/engine_room/flywheel/impl/mixin/GameRendererMixin.java b/common/src/main/java/dev/engine_room/flywheel/impl/mixin/GameRendererMixin.java new file mode 100644 index 000000000..675a5aedd --- /dev/null +++ b/common/src/main/java/dev/engine_room/flywheel/impl/mixin/GameRendererMixin.java @@ -0,0 +1,29 @@ +package dev.engine_room.flywheel.impl.mixin; + +import org.joml.Matrix4f; +import org.joml.Matrix4fc; +import org.joml.Vector4f; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; + +import com.llamalad7.mixinextras.injector.wrapoperation.Operation; +import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; +import com.llamalad7.mixinextras.sugar.Local; +import com.mojang.blaze3d.buffers.GpuBufferSlice; +import com.mojang.blaze3d.resource.GraphicsResourceAllocator; + +import dev.engine_room.flywheel.impl.event.RenderContextImpl; +import net.minecraft.client.DeltaTracker; +import net.minecraft.client.renderer.GameRenderer; +import net.minecraft.client.renderer.LevelRenderer; +import net.minecraft.client.renderer.chunk.ChunkSectionsToRender; +import net.minecraft.client.renderer.state.level.CameraRenderState; + +@Mixin(GameRenderer.class) +public class GameRendererMixin { + @WrapOperation(method = "renderLevel", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/LevelRenderer;renderLevel(Lcom/mojang/blaze3d/resource/GraphicsResourceAllocator;Lnet/minecraft/client/DeltaTracker;ZLnet/minecraft/client/renderer/state/level/CameraRenderState;Lorg/joml/Matrix4fc;Lcom/mojang/blaze3d/buffers/GpuBufferSlice;Lorg/joml/Vector4f;ZLnet/minecraft/client/renderer/chunk/ChunkSectionsToRender;)V")) + private void extractProjectionMatrixNoBob(LevelRenderer instance, GraphicsResourceAllocator resourceAllocator, DeltaTracker deltaTracker, boolean renderOutline, CameraRenderState cameraState, Matrix4fc modelViewMatrix, GpuBufferSlice terrainFog, Vector4f fogColor, boolean shouldRenderSky, ChunkSectionsToRender chunkSectionsToRender, Operation original, @Local(name = "projectionMatrix") Matrix4f projectionMatrix) { + ScopedValue.where(RenderContextImpl.PROJECTION_MATRIX_NO_BOB, projectionMatrix) + .run(() -> original.call(instance, resourceAllocator, deltaTracker, renderOutline, cameraState, modelViewMatrix, terrainFog, fogColor, shouldRenderSky, chunkSectionsToRender)); + } +} diff --git a/common/src/main/java/dev/engine_room/flywheel/impl/mixin/LevelRendererMixin.java b/common/src/main/java/dev/engine_room/flywheel/impl/mixin/LevelRendererMixin.java index 181f62777..c9440d6b4 100644 --- a/common/src/main/java/dev/engine_room/flywheel/impl/mixin/LevelRendererMixin.java +++ b/common/src/main/java/dev/engine_room/flywheel/impl/mixin/LevelRendererMixin.java @@ -4,6 +4,7 @@ import java.util.SortedSet; import org.joml.Matrix4f; +import org.joml.Matrix4fc; import org.joml.Vector4f; import org.jspecify.annotations.Nullable; import org.spongepowered.asm.mixin.Final; @@ -24,11 +25,13 @@ import dev.engine_room.flywheel.impl.event.RenderContextImpl; import dev.engine_room.flywheel.lib.visualization.VisualizationHelper; import it.unimi.dsi.fastutil.longs.Long2ObjectMap; -import net.minecraft.client.Camera; import net.minecraft.client.DeltaTracker; import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.client.renderer.LevelRenderer; import net.minecraft.client.renderer.RenderBuffers; +import net.minecraft.client.renderer.chunk.ChunkSectionsToRender; +import net.minecraft.client.renderer.state.level.CameraRenderState; +import net.minecraft.client.renderer.state.level.LevelRenderState; import net.minecraft.server.level.BlockDestructionProgress; import net.minecraft.world.entity.Entity; @@ -46,14 +49,18 @@ abstract class LevelRendererMixin { @Final private Long2ObjectMap> destructionProgress; + @Shadow + @Final + private LevelRenderState levelRenderState; + @Unique @Nullable private RenderContextImpl flywheel$renderContext; - // @Inject(method = "renderLevel", at = @At("HEAD")) - @Inject(method = "renderLevel", at = @At(value = "INVOKE_ASSIGN", target = "Lnet/minecraft/world/level/lighting/LevelLightEngine;runLightUpdates()I")) - private void flywheel$beginRender(GraphicsResourceAllocator resourceAllocator, DeltaTracker deltaTracker, boolean renderOutline, Camera camera, Matrix4f modelViewMatrix, Matrix4f projectionMatrix, Matrix4f cullingProjectionMatrix, GpuBufferSlice shaderFog, Vector4f fogColor, boolean renderSky, CallbackInfo ci) { - flywheel$renderContext = RenderContextImpl.create((LevelRenderer) (Object) this, level, renderBuffers, modelViewMatrix, projectionMatrix, camera, deltaTracker.getGameTimeDeltaPartialTick(false)); + @Inject(method = "renderLevel", at = @At("HEAD")) + private void flywheel$beginRender(GraphicsResourceAllocator resourceAllocator, DeltaTracker deltaTracker, boolean renderOutline, CameraRenderState cameraState, Matrix4fc modelViewMatrix, GpuBufferSlice terrainFog, Vector4f fogColor, boolean shouldRenderSky, ChunkSectionsToRender chunkSectionsToRender, CallbackInfo ci) { + Matrix4f projectionMatrix = RenderContextImpl.PROJECTION_MATRIX_NO_BOB.get(); + flywheel$renderContext = RenderContextImpl.create((LevelRenderer) (Object) this, level, renderBuffers, modelViewMatrix, projectionMatrix, cameraState, levelRenderState, deltaTracker.getGameTimeDeltaPartialTick(false)); VisualizationManager manager = VisualizationManager.get(level); if (manager != null) { @@ -73,7 +80,7 @@ abstract class LevelRendererMixin { } } - @Inject(method = "method_62214", at = @At(value = "INVOKE_STRING", target = "Lnet/minecraft/util/profiling/ProfilerFiller;popPush(Ljava/lang/String;)V", args = "ldc=submitBlockEntities")) + @Inject(method = "lambda$addMainPass$0", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/LevelRenderer;submitBlockEntities(Lcom/mojang/blaze3d/vertex/PoseStack;Lnet/minecraft/client/renderer/state/level/LevelRenderState;Lnet/minecraft/client/renderer/SubmitNodeStorage;)V")) private void flywheel$beforeBlockEntities(CallbackInfo ci) { if (flywheel$renderContext != null) { VisualizationManager manager = VisualizationManager.get(level); @@ -83,7 +90,7 @@ abstract class LevelRendererMixin { } } - @Inject(method = "method_62214", at = @At(value = "INVOKE_STRING", target = "Lnet/minecraft/util/profiling/ProfilerFiller;push(Ljava/lang/String;)V", args = "ldc=destroyProgress")) + @Inject(method = "lambda$addMainPass$0", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/LevelRenderer;submitBlockDestroyAnimation(Lcom/mojang/blaze3d/vertex/PoseStack;Lnet/minecraft/client/renderer/SubmitNodeCollector;Lnet/minecraft/client/renderer/state/level/LevelRenderState;)V")) private void flywheel$beforeRenderCrumbling(CallbackInfo ci) { if (flywheel$renderContext != null) { VisualizationManager manager = VisualizationManager.get(level); diff --git a/common/src/main/java/dev/engine_room/flywheel/impl/visual/DynamicVisualContextImpl.java b/common/src/main/java/dev/engine_room/flywheel/impl/visual/DynamicVisualContextImpl.java index 09803bdae..fe9f13162 100644 --- a/common/src/main/java/dev/engine_room/flywheel/impl/visual/DynamicVisualContextImpl.java +++ b/common/src/main/java/dev/engine_room/flywheel/impl/visual/DynamicVisualContextImpl.java @@ -4,8 +4,8 @@ import dev.engine_room.flywheel.api.visual.DistanceUpdateLimiter; import dev.engine_room.flywheel.api.visual.DynamicVisual; -import net.minecraft.client.Camera; +import net.minecraft.client.renderer.state.level.CameraRenderState; -public record DynamicVisualContextImpl(Camera camera, FrustumIntersection frustum, float partialTick, - DistanceUpdateLimiter limiter) implements DynamicVisual.Context { +public record DynamicVisualContextImpl(CameraRenderState cameraRenderState, FrustumIntersection frustum, float partialTick, + DistanceUpdateLimiter limiter) implements DynamicVisual.Context { } diff --git a/common/src/main/java/dev/engine_room/flywheel/impl/visualization/VisualizationManagerImpl.java b/common/src/main/java/dev/engine_room/flywheel/impl/visualization/VisualizationManagerImpl.java index 4c1002672..f89230fd5 100644 --- a/common/src/main/java/dev/engine_room/flywheel/impl/visualization/VisualizationManagerImpl.java +++ b/common/src/main/java/dev/engine_room/flywheel/impl/visualization/VisualizationManagerImpl.java @@ -112,7 +112,7 @@ private LateInit(LevelAccessor level) { var update = MapContextPlan.map(this::createVisualFrameContext) .to(NestedPlan.of(blockEntities.framePlan(visualizationContext), entities.framePlan(visualizationContext), effects.framePlan(visualizationContext))); - framePlan = IfElsePlan.on((RenderContext ctx) -> engine.updateRenderOrigin(ctx.camera())) + framePlan = IfElsePlan.on((RenderContext ctx) -> engine.updateRenderOrigin(ctx.cameraRenderState())) .ifTrue(recreate) .ifFalse(update) .plan() @@ -134,14 +134,13 @@ private LateInit(LevelAccessor level) { private DynamicVisual.Context createVisualFrameContext(RenderContext ctx) { Vec3i renderOrigin = engine.renderOrigin(); - var cameraPos = ctx.camera() - .position(); + var cameraPos = ctx.cameraRenderState().pos; Matrix4f viewProjection = new Matrix4f(ctx.viewProjection()); viewProjection.translate((float) (renderOrigin.getX() - cameraPos.x), (float) (renderOrigin.getY() - cameraPos.y), (float) (renderOrigin.getZ() - cameraPos.z)); FrustumIntersection frustum = new FrustumIntersection(viewProjection); - return new DynamicVisualContextImpl(ctx.camera(), frustum, ctx.partialTick(), frameLimiter); + return new DynamicVisualContextImpl(ctx.cameraRenderState(), frustum, ctx.partialTick(), frameLimiter); } } diff --git a/common/src/main/resources/flywheel.impl.mixins.json b/common/src/main/resources/flywheel.impl.mixins.json index 5c0bd4117..ed625203b 100644 --- a/common/src/main/resources/flywheel.impl.mixins.json +++ b/common/src/main/resources/flywheel.impl.mixins.json @@ -8,6 +8,7 @@ "ClientChunkCacheMixin", "EntityRendererAccessor", "EntityTypeMixin", + "GameRendererMixin", "LevelMixin", "LevelRendererMixin", "MinecraftMixin", diff --git a/common/src/vanillin/java/dev/engine_room/vanillin/elements/FireElement.java b/common/src/vanillin/java/dev/engine_room/vanillin/elements/FireElement.java index 1c6f0a49c..cff79913a 100644 --- a/common/src/vanillin/java/dev/engine_room/vanillin/elements/FireElement.java +++ b/common/src/vanillin/java/dev/engine_room/vanillin/elements/FireElement.java @@ -22,9 +22,10 @@ import dev.engine_room.flywheel.lib.visual.SimpleDynamicVisual; import dev.engine_room.flywheel.lib.visual.util.SmartRecycler; import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.LightTexture; import net.minecraft.client.renderer.texture.TextureAtlasSprite; import net.minecraft.client.resources.model.ModelBakery; +import net.minecraft.client.resources.model.sprite.SpriteId; +import net.minecraft.util.LightCoordsUtil; import net.minecraft.util.Mth; import net.minecraft.world.entity.Entity; @@ -36,10 +37,7 @@ public final class FireElement extends AbstractVisual implements SimpleDynamicVi .backfaceCulling(false) // Disable backface because we want to be able to flip the model. .build(); - // Parameterize by the material instead of the sprite - // because Material#sprite is a surprisingly heavy operation - // and because sprites are invalidated after a resource reload. - private static final RendererReloadCache FIRE_MODELS = new RendererReloadCache<>(texture -> { + private static final RendererReloadCache FIRE_MODELS = new RendererReloadCache<>(texture -> { TextureAtlasSprite sprite = Minecraft.getInstance().getAtlasManager().get(texture); return new SingleMeshModel(new FireMesh(sprite), FIRE_MATERIAL); }); @@ -61,7 +59,7 @@ private TransformedInstance createInstance(Model model) { TransformedInstance instance = visualizationContext.instancerProvider() .instancer(InstanceTypes.TRANSFORMED, model) .createInstance(); - instance.light(LightTexture.FULL_BLOCK); + instance.light(LightCoordsUtil.pack(15, 0)); instance.setChanged(); return instance; } @@ -98,8 +96,7 @@ private void setupInstances(DynamicVisual.Context context) { stack.setIdentity(); stack.translate(entityX - renderOrigin.getX(), entityY - renderOrigin.getY(), entityZ - renderOrigin.getZ()); stack.scale(scale, scale, scale); - stack.mulPose(Axis.YP.rotationDegrees(-context.camera() - .yRot())); + stack.mulPose(Axis.YP.rotationDegrees(-context.cameraRenderState().yRot)); stack.translate(0.0F, 0.0F, -0.3F + (float) ((int) maxHeight) * 0.02F); for (int i = 0; y < maxHeight; ++i) { @@ -159,7 +156,7 @@ private static void writeVertex(MutableVertexList vertexList, int i, float x, fl vertexList.b(i, 1); vertexList.u(i, u); vertexList.v(i, v); - vertexList.light(i, LightTexture.FULL_BLOCK); + vertexList.light(i, LightCoordsUtil.pack(15, 0)); vertexList.normalX(i, 0); vertexList.normalY(i, 1); vertexList.normalZ(i, 0); diff --git a/common/src/vanillin/java/dev/engine_room/vanillin/elements/HitboxElement.java b/common/src/vanillin/java/dev/engine_room/vanillin/elements/HitboxElement.java index 6e024ad80..c83addedd 100644 --- a/common/src/vanillin/java/dev/engine_room/vanillin/elements/HitboxElement.java +++ b/common/src/vanillin/java/dev/engine_room/vanillin/elements/HitboxElement.java @@ -13,7 +13,7 @@ import dev.engine_room.flywheel.lib.visual.util.SmartRecycler; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.components.debug.DebugScreenEntries; -import net.minecraft.client.renderer.LightTexture; +import net.minecraft.util.LightCoordsUtil; import net.minecraft.util.Mth; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.LivingEntity; @@ -77,7 +77,7 @@ private TransformedInstance createInstance(Model model) { TransformedInstance instance = context.instancerProvider() .instancer(InstanceTypes.TRANSFORMED, model) .createInstance(); - instance.light(LightTexture.FULL_BLOCK); + instance.light(LightCoordsUtil.pack(15, 0)); instance.setChanged(); return instance; } diff --git a/common/src/vanillin/java/dev/engine_room/vanillin/elements/ShadowElement.java b/common/src/vanillin/java/dev/engine_room/vanillin/elements/ShadowElement.java index 5c6c8aa1d..9bf9fafbb 100644 --- a/common/src/vanillin/java/dev/engine_room/vanillin/elements/ShadowElement.java +++ b/common/src/vanillin/java/dev/engine_room/vanillin/elements/ShadowElement.java @@ -1,8 +1,8 @@ package dev.engine_room.vanillin.elements; -import org.jspecify.annotations.Nullable; import org.joml.Vector4f; import org.joml.Vector4fc; +import org.jspecify.annotations.Nullable; import dev.engine_room.flywheel.api.material.Material; import dev.engine_room.flywheel.api.material.Transparency; @@ -20,12 +20,13 @@ import dev.engine_room.flywheel.lib.visual.SimpleDynamicVisual; import dev.engine_room.flywheel.lib.visual.util.InstanceRecycler; import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.LightTexture; +import net.minecraft.client.renderer.Lightmap; import net.minecraft.client.renderer.texture.OverlayTexture; import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.core.Direction.Axis; import net.minecraft.resources.Identifier; +import net.minecraft.util.LightCoordsUtil; import net.minecraft.util.Mth; import net.minecraft.world.entity.Entity; import net.minecraft.world.level.block.RenderShape; @@ -157,7 +158,7 @@ private void setupInstance(ChunkAccess chunk, MutableBlockPos pos, double entity // Too dark to render. return; } - float blockBrightness = LightTexture.getBrightness(level.dimensionType(), maxLocalRawBrightness); + float blockBrightness = Lightmap.getBrightness(level.dimensionType(), maxLocalRawBrightness); float alpha = strength * 0.5F * blockBrightness; if (alpha < 0.0F) { // Too far away/too weak to render. @@ -261,7 +262,7 @@ private static void writeVertex(MutableVertexList vertexList, int i, float x, fl vertexList.b(i, 1); vertexList.u(i, 0); vertexList.v(i, 0); - vertexList.light(i, LightTexture.FULL_BRIGHT); + vertexList.light(i, LightCoordsUtil.FULL_BRIGHT); vertexList.overlay(i, OverlayTexture.NO_OVERLAY); vertexList.normalX(i, 0); vertexList.normalY(i, 1); diff --git a/common/src/vanillin/java/dev/engine_room/vanillin/visuals/BlockDisplayVisual.java b/common/src/vanillin/java/dev/engine_room/vanillin/visuals/BlockDisplayVisual.java index 331291b00..12d7b53bc 100644 --- a/common/src/vanillin/java/dev/engine_room/vanillin/visuals/BlockDisplayVisual.java +++ b/common/src/vanillin/java/dev/engine_room/vanillin/visuals/BlockDisplayVisual.java @@ -9,9 +9,10 @@ import dev.engine_room.flywheel.lib.visual.AbstractEntityVisual; import dev.engine_room.flywheel.lib.visual.SimpleDynamicVisual; import dev.engine_room.flywheel.lib.visual.component.ShadowComponent; -import net.minecraft.client.Camera; +import net.minecraft.client.renderer.state.level.CameraRenderState; import net.minecraft.util.Mth; import net.minecraft.world.entity.Display; +import net.minecraft.world.entity.Display.RenderState; import net.minecraft.world.entity.Entity; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.state.BlockState; @@ -41,7 +42,7 @@ public BlockDisplayVisual(VisualizationContext ctx, Display.BlockDisplay entity, @Override public void beginFrame(Context ctx) { - Display.RenderState renderState = entity.renderState(); + RenderState renderState = entity.renderState(); if (renderState == null) { instance.handle() .setVisible(false); @@ -84,19 +85,19 @@ public void beginFrame(Context ctx) { .translate((float) (pos.x - renderOrigin.getX()), (float) (pos.y - renderOrigin.getY()), (float) (pos.z - renderOrigin.getZ())); float partialTick = ctx.partialTick(); - Camera camera = ctx.camera(); + CameraRenderState cameraRenderState = ctx.cameraRenderState(); switch (renderState.billboardConstraints()) { case FIXED: instance.pose.rotateYXZ(-0.017453292F * entityYRot(entity, partialTick), ((float) Math.PI / 180F) * entityXRot(entity, partialTick), 0.0F); break; case HORIZONTAL: - instance.pose.rotateYXZ(-0.017453292F * entityYRot(entity, partialTick), ((float) Math.PI / 180F) * cameraXRot(camera), 0.0F); + instance.pose.rotateYXZ(-0.017453292F * entityYRot(entity, partialTick), ((float) Math.PI / 180F) * cameraXRot(cameraRenderState), 0.0F); break; case VERTICAL: - instance.pose.rotateYXZ(-0.017453292F * cameraYrot(camera), ((float) Math.PI / 180F) * entityXRot(entity, partialTick), 0.0F); + instance.pose.rotateYXZ(-0.017453292F * cameraYrot(cameraRenderState), ((float) Math.PI / 180F) * entityXRot(entity, partialTick), 0.0F); break; case CENTER: - instance.pose.rotateYXZ(-0.017453292F * cameraYrot(camera), ((float) Math.PI / 180F) * cameraXRot(camera), 0.0F); + instance.pose.rotateYXZ(-0.017453292F * cameraYrot(cameraRenderState), ((float) Math.PI / 180F) * cameraXRot(cameraRenderState), 0.0F); break; } @@ -106,12 +107,12 @@ public void beginFrame(Context ctx) { .setChanged(); } - private static float cameraYrot(Camera camera) { - return camera.yRot() - 180.0F; + private static float cameraYrot(CameraRenderState cameraRenderState) { + return cameraRenderState.yRot - 180.0F; } - private static float cameraXRot(Camera camera) { - return -camera.xRot(); + private static float cameraXRot(CameraRenderState cameraRenderState) { + return -cameraRenderState.xRot; } private static float entityYRot(Entity entity, float partialTick) { diff --git a/common/src/vanillin/java/dev/engine_room/vanillin/visuals/ChestVisual.java b/common/src/vanillin/java/dev/engine_room/vanillin/visuals/ChestVisual.java index 623377193..e07e69e06 100644 --- a/common/src/vanillin/java/dev/engine_room/vanillin/visuals/ChestVisual.java +++ b/common/src/vanillin/java/dev/engine_room/vanillin/visuals/ChestVisual.java @@ -24,11 +24,12 @@ import net.minecraft.client.model.geom.ModelLayerLocation; import net.minecraft.client.model.geom.ModelLayers; import net.minecraft.client.renderer.LevelRenderer; -import net.minecraft.client.renderer.LightTexture; import net.minecraft.client.renderer.Sheets; import net.minecraft.client.renderer.blockentity.ChestRenderer; +import net.minecraft.client.resources.model.sprite.SpriteId; import net.minecraft.core.BlockPos; import net.minecraft.core.SectionPos; +import net.minecraft.util.LightCoordsUtil; import net.minecraft.util.Mth; import net.minecraft.world.level.block.AbstractChestBlock; import net.minecraft.world.level.block.Block; @@ -77,7 +78,7 @@ public ChestVisual(VisualizationContext ctx, T blockEntity, float partialTick) { ChestType chestType = blockState.hasProperty(ChestBlock.TYPE) ? blockState.getValue(ChestBlock.TYPE) : ChestType.SINGLE; // TODO 1.21.11: should we be using unchecked casts here? ChestRenderer renderer = (ChestRenderer) Minecraft.getInstance().getBlockEntityRenderDispatcher().getRenderer(blockEntity); - net.minecraft.client.resources.model.Material texture = Sheets.chooseMaterial( + SpriteId texture = Sheets.chooseSprite( ((ChestRendererAccessor) renderer).flywheel$getChestMaterial(blockEntity, ChestRenderer.xmasTextures()), chestType ); @@ -201,23 +202,23 @@ public LongSet acceptNone() { private class BrightnessCombiner implements DoubleBlockCombiner.Combiner { @Override public Integer acceptDouble(BlockEntity first, BlockEntity second) { - int firstLight = LevelRenderer.getLightColor(first.getLevel(), first.getBlockPos()); - int secondLight = LevelRenderer.getLightColor(second.getLevel(), second.getBlockPos()); - int firstBlockLight = LightTexture.block(firstLight); - int secondBlockLight = LightTexture.block(secondLight); - int firstSkyLight = LightTexture.sky(firstLight); - int secondSkyLight = LightTexture.sky(secondLight); - return LightTexture.pack(Math.max(firstBlockLight, secondBlockLight), Math.max(firstSkyLight, secondSkyLight)); + int firstLight = LevelRenderer.getLightCoords(first.getLevel(), first.getBlockPos()); + int secondLight = LevelRenderer.getLightCoords(second.getLevel(), second.getBlockPos()); + int firstBlockLight = LightCoordsUtil.block(firstLight); + int secondBlockLight = LightCoordsUtil.block(secondLight); + int firstSkyLight = LightCoordsUtil.sky(firstLight); + int secondSkyLight = LightCoordsUtil.sky(secondLight); + return LightCoordsUtil.pack(Math.max(firstBlockLight, secondBlockLight), Math.max(firstSkyLight, secondSkyLight)); } @Override public Integer acceptSingle(BlockEntity single) { - return LevelRenderer.getLightColor(single.getLevel(), single.getBlockPos()); + return LevelRenderer.getLightCoords(single.getLevel(), single.getBlockPos()); } @Override public Integer acceptNone() { - return LevelRenderer.getLightColor(level, pos); + return LevelRenderer.getLightCoords(level, pos); } } } diff --git a/common/src/vanillin/java/dev/engine_room/vanillin/visuals/ItemDisplayVisual.java b/common/src/vanillin/java/dev/engine_room/vanillin/visuals/ItemDisplayVisual.java index e7094502f..20ddda5ab 100644 --- a/common/src/vanillin/java/dev/engine_room/vanillin/visuals/ItemDisplayVisual.java +++ b/common/src/vanillin/java/dev/engine_room/vanillin/visuals/ItemDisplayVisual.java @@ -98,19 +98,19 @@ // .translate((float) (pos.x - renderOrigin.getX()), (float) (pos.y - renderOrigin.getY()), (float) (pos.z - renderOrigin.getZ())); // // float partialTick = ctx.partialTick(); -// Camera camera = ctx.camera(); +// Camera cameraRenderState = ctx.cameraRenderState(); // switch (renderState.billboardConstraints()) { // case FIXED: // instance.pose.rotateYXZ(-0.017453292F * entityYRot(entity, partialTick), ((float) Math.PI / 180F) * entityXRot(entity, partialTick), 0.0F); // break; // case HORIZONTAL: -// instance.pose.rotateYXZ(-0.017453292F * entityYRot(entity, partialTick), ((float) Math.PI / 180F) * cameraXRot(camera), 0.0F); +// instance.pose.rotateYXZ(-0.017453292F * entityYRot(entity, partialTick), ((float) Math.PI / 180F) * cameraXRot(cameraRenderState), 0.0F); // break; // case VERTICAL: -// instance.pose.rotateYXZ(-0.017453292F * cameraYrot(camera), ((float) Math.PI / 180F) * entityXRot(entity, partialTick), 0.0F); +// instance.pose.rotateYXZ(-0.017453292F * cameraYrot(cameraRenderState), ((float) Math.PI / 180F) * entityXRot(entity, partialTick), 0.0F); // break; // case CENTER: -// instance.pose.rotateYXZ(-0.017453292F * cameraYrot(camera), ((float) Math.PI / 180F) * cameraXRot(camera), 0.0F); +// instance.pose.rotateYXZ(-0.017453292F * cameraYrot(cameraRenderState), ((float) Math.PI / 180F) * cameraXRot(cameraRenderState), 0.0F); // break; // } // @@ -121,12 +121,12 @@ // .setChanged(); // } // -// private static float cameraYrot(Camera camera) { -// return camera.yRot() - 180.0F; +// private static float cameraYrot(Camera cameraRenderState) { +// return cameraRenderState.yRot() - 180.0F; // } // -// private static float cameraXRot(Camera camera) { -// return -camera.xRot(); +// private static float cameraXRot(Camera cameraRenderState) { +// return -cameraRenderState.xRot(); // } // // private static float entityYRot(Entity entity, float partialTick) { diff --git a/common/src/vanillin/java/dev/engine_room/vanillin/visuals/ItemFrameVisual.java b/common/src/vanillin/java/dev/engine_room/vanillin/visuals/ItemFrameVisual.java index a9420c085..2bee5d1ce 100644 --- a/common/src/vanillin/java/dev/engine_room/vanillin/visuals/ItemFrameVisual.java +++ b/common/src/vanillin/java/dev/engine_room/vanillin/visuals/ItemFrameVisual.java @@ -14,7 +14,6 @@ //import dev.engine_room.flywheel.lib.visual.SimpleDynamicVisual; //import dev.engine_room.vanillin.item.ItemModels; //import net.minecraft.client.Minecraft; -//import net.minecraft.client.renderer.LightTexture; //import net.minecraft.client.renderer.block.BlockModelShaper; //import net.minecraft.client.resources.model.BlockStateDefinitions; //import net.minecraft.core.BlockPos; diff --git a/common/src/vanillin/java/dev/engine_room/vanillin/visuals/ItemVisual.java b/common/src/vanillin/java/dev/engine_room/vanillin/visuals/ItemVisual.java index 48b700cb3..0a8096410 100644 --- a/common/src/vanillin/java/dev/engine_room/vanillin/visuals/ItemVisual.java +++ b/common/src/vanillin/java/dev/engine_room/vanillin/visuals/ItemVisual.java @@ -12,7 +12,6 @@ //import dev.engine_room.flywheel.lib.visual.SimpleDynamicVisual; //import dev.engine_room.flywheel.lib.visual.util.InstanceRecycler; //import dev.engine_room.vanillin.item.ItemModels; -//import net.minecraft.client.renderer.LightTexture; //import net.minecraft.client.resources.model.BakedModel; //import net.minecraft.util.Mth; //import net.minecraft.util.RandomSource; diff --git a/common/src/vanillin/java/dev/engine_room/vanillin/visuals/ShulkerBoxVisual.java b/common/src/vanillin/java/dev/engine_room/vanillin/visuals/ShulkerBoxVisual.java index 0080041a1..a957982a3 100644 --- a/common/src/vanillin/java/dev/engine_room/vanillin/visuals/ShulkerBoxVisual.java +++ b/common/src/vanillin/java/dev/engine_room/vanillin/visuals/ShulkerBoxVisual.java @@ -16,6 +16,7 @@ import dev.engine_room.flywheel.lib.visual.SimpleDynamicVisual; import net.minecraft.client.model.geom.ModelLayers; import net.minecraft.client.renderer.Sheets; +import net.minecraft.client.resources.model.sprite.SpriteId; import net.minecraft.core.Direction; import net.minecraft.util.Mth; import net.minecraft.world.item.DyeColor; @@ -42,7 +43,7 @@ public ShulkerBoxVisual(VisualizationContext ctx, ShulkerBoxBlockEntity blockEnt super(ctx, blockEntity, partialTick); DyeColor color = blockEntity.getColor(); - net.minecraft.client.resources.model.Material texture; + SpriteId texture; if (color == null) { texture = Sheets.DEFAULT_SHULKER_TEXTURE_LOCATION; } else { diff --git a/fabric/src/lib/java/dev/engine_room/flywheel/lib/model/baked/BlockStateModelBufferer.java b/fabric/src/lib/java/dev/engine_room/flywheel/lib/model/baked/BlockStateModelBufferer.java index ca9b2c160..d64232268 100644 --- a/fabric/src/lib/java/dev/engine_room/flywheel/lib/model/baked/BlockStateModelBufferer.java +++ b/fabric/src/lib/java/dev/engine_room/flywheel/lib/model/baked/BlockStateModelBufferer.java @@ -9,14 +9,16 @@ import dev.engine_room.flywheel.lib.model.SimpleModel; import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.ItemBlockRenderTypes; -import net.minecraft.client.renderer.block.BlockRenderDispatcher; +import net.minecraft.client.color.block.BlockColors; +import net.minecraft.client.renderer.block.BlockAndTintGetter; +import net.minecraft.client.renderer.block.BlockModelLighter; +import net.minecraft.client.renderer.block.FluidRenderer; import net.minecraft.client.renderer.block.ModelBlockRenderer; -import net.minecraft.client.renderer.block.model.BlockStateModel; +import net.minecraft.client.renderer.block.dispatch.BlockStateModel; import net.minecraft.client.renderer.chunk.ChunkSectionLayer; -import net.minecraft.client.renderer.texture.OverlayTexture; +import net.minecraft.client.renderer.state.GameRenderState; +import net.minecraft.client.resources.model.ModelManager; import net.minecraft.core.BlockPos; -import net.minecraft.world.level.BlockAndTintGetter; import net.minecraft.world.level.block.RenderShape; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.material.FluidState; @@ -38,16 +40,24 @@ public static SimpleModel bufferModel(BlockStateModel model, BlockPos pos, Block long seed = state.getSeed(pos); + Minecraft minecraft = Minecraft.getInstance(); + GameRenderState gameRenderState = minecraft.gameRenderer.getGameRenderState(); + BlockColors blockColors = minecraft.getBlockColors(); + // See ModelBlockRenderer#tesselateBlock - boolean useAo = Minecraft.useAmbientOcclusion(); + boolean useAo = gameRenderState.optionsRenderState.ambientOcclusion; boolean defaultAo = useAo && state.getLightEmission() == 0; model = emitters.prepareForModel(model, useAo, defaultAo); - poseStack.pushPose(); - Minecraft.getInstance() - .getBlockRenderer() - .getModelRenderer() - .render(level, model, state, pos, poseStack, emitters, false, seed, OverlayTexture.NO_OVERLAY); + ModelBlockRenderer blockRenderer = new ModelBlockRenderer(useAo, true, blockColors); + + PoseStack finalPoseStack = poseStack; + blockRenderer.tesselateBlock((x, y, z, quad, instance) -> { + finalPoseStack.pushPose(); + ChunkSectionLayer layer = quad.materialInfo().layer(); + emitters.getEmitter(layer).putBakedQuad(finalPoseStack.last(), quad, instance); + finalPoseStack.popPose(); + }, 0, 0, 0, level, pos, state, model, seed); poseStack.popPose(); return emitters.end(); @@ -63,12 +73,16 @@ public static SimpleModel bufferBlocks(Iterator posIterator, BlockAndT emitters.prepare(blockMaterialFunction); - BlockRenderDispatcher renderDispatcher = Minecraft.getInstance() - .getBlockRenderer(); - ModelBlockRenderer blockRenderer = renderDispatcher.getModelRenderer(); - ModelBlockRenderer.enableCaching(); + BlockModelLighter.enableCaching(); + + Minecraft minecraft = Minecraft.getInstance(); + ModelManager modelManager = minecraft.getModelManager(); + GameRenderState gameRenderState = minecraft.gameRenderer.getGameRenderState(); + boolean useAo = gameRenderState.optionsRenderState.ambientOcclusion; + BlockColors blockColors = minecraft.getBlockColors(); - boolean useAo = Minecraft.useAmbientOcclusion(); + ModelBlockRenderer blockRenderer = new ModelBlockRenderer(useAo, true, blockColors); + FluidRenderer fluidRenderer = new FluidRenderer(modelManager.getFluidStateModelSet()); while (posIterator.hasNext()) { BlockPos pos = posIterator.next(); @@ -80,37 +94,43 @@ public static SimpleModel bufferBlocks(Iterator posIterator, BlockAndT FluidState fluidState = state.getFluidState(); if (!fluidState.isEmpty()) { - ChunkSectionLayer layer = ItemBlockRenderTypes.getRenderLayer(fluidState); - - BufferBuilder bufferBuilder = emitters.getEmitter(layer).getBuffer(true, false); - - if (bufferBuilder != null) { - transformingWrapper.prepare(bufferBuilder, poseStack); - - poseStack.pushPose(); - poseStack.translate(pos.getX() - (pos.getX() & 0xF), pos.getY() - (pos.getY() & 0xF), pos.getZ() - (pos.getZ() & 0xF)); - renderDispatcher.renderLiquid(pos, level, transformingWrapper, state, fluidState); - poseStack.popPose(); - } + poseStack.pushPose(); + poseStack.translate(pos.getX() - (pos.getX() & 0xF), pos.getY() - (pos.getY() & 0xF), pos.getZ() - (pos.getZ() & 0xF)); + PoseStack finalPoseStack = poseStack; + fluidRenderer.tesselate(level, pos, layer -> { + BufferBuilder bufferBuilder = emitters.getEmitter(layer).getBuffer(true, false); + + if (bufferBuilder != null) { + transformingWrapper.prepare(bufferBuilder, finalPoseStack); + return transformingWrapper; + } + + return EmptyVertexConsumer.INSTANCE; + }, state, fluidState); + poseStack.popPose(); } } if (state.getRenderShape() == RenderShape.MODEL) { long seed = state.getSeed(pos); - BlockStateModel model = renderDispatcher.getBlockModel(state); + BlockStateModel model = modelManager.getBlockStateModelSet().get(state); // See ModelBlockRenderer#tesselateBlock boolean defaultAo = useAo && state.getLightEmission() == 0; model = emitters.prepareForModel(model, useAo, defaultAo); - poseStack.pushPose(); - poseStack.translate(pos.getX(), pos.getY(), pos.getZ()); - blockRenderer.render(level, model, state, pos, poseStack, emitters, true, seed, OverlayTexture.NO_OVERLAY); - poseStack.popPose(); + PoseStack finalPoseStack = poseStack; + blockRenderer.tesselateBlock((x, y, z, quad, instance) -> { + finalPoseStack.pushPose(); + finalPoseStack.translate(x, y, z); + ChunkSectionLayer layer = quad.materialInfo().layer(); + emitters.getEmitter(layer).putBakedQuad(finalPoseStack.last(), quad, instance); + finalPoseStack.popPose(); + }, pos.getX(), pos.getY(), pos.getZ(), level, pos, state, model, seed); } } - ModelBlockRenderer.clearCache(); + BlockModelLighter.clearCache(); transformingWrapper.clear(); return emitters.end(); } diff --git a/fabric/src/lib/java/dev/engine_room/flywheel/lib/model/baked/FabricMeshEmitter.java b/fabric/src/lib/java/dev/engine_room/flywheel/lib/model/baked/FabricMeshEmitter.java index 65cd066d2..cb1a84365 100644 --- a/fabric/src/lib/java/dev/engine_room/flywheel/lib/model/baked/FabricMeshEmitter.java +++ b/fabric/src/lib/java/dev/engine_room/flywheel/lib/model/baked/FabricMeshEmitter.java @@ -1,11 +1,12 @@ package dev.engine_room.flywheel.lib.model.baked; import com.mojang.blaze3d.vertex.BufferBuilder; -import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.PoseStack.Pose; +import com.mojang.blaze3d.vertex.QuadInstance; import com.mojang.blaze3d.vertex.VertexConsumer; -import net.minecraft.client.renderer.block.model.BakedQuad; import net.minecraft.client.renderer.chunk.ChunkSectionLayer; +import net.minecraft.client.resources.model.geometry.BakedQuad; class FabricMeshEmitter extends MeshEmitter { private boolean shade; @@ -101,18 +102,18 @@ public void addVertex(float x, float y, float z, int color, float u, float v, in } @Override - public void putBulkData(PoseStack.Pose pose, BakedQuad quad, float red, float green, float blue, float alpha, int packedLight, int packedOverlay) { + public void putBakedQuad(Pose pose, BakedQuad quad, QuadInstance instance) { BufferBuilder bufferBuilder = getBuffer(shade, ao); if (bufferBuilder != null) { - bufferBuilder.putBulkData(pose, quad, red, green, blue, alpha, packedLight, packedOverlay); + bufferBuilder.putBakedQuad(pose, quad, instance); } } @Override - public void putBulkData(PoseStack.Pose pose, BakedQuad quad, float[] brightness, float red, float green, float blue, float alpha, int[] lightmap, int packedOverlay) { + public void putBlockBakedQuad(float x, float y, float z, BakedQuad quad, QuadInstance instance) { BufferBuilder bufferBuilder = getBuffer(shade, ao); if (bufferBuilder != null) { - bufferBuilder.putBulkData(pose, quad, brightness, red, green, blue, alpha, lightmap, packedOverlay); + bufferBuilder.putBlockBakedQuad(x, y, z, quad, instance); } } } diff --git a/fabric/src/lib/java/dev/engine_room/flywheel/lib/model/baked/FabricMeshEmitterManager.java b/fabric/src/lib/java/dev/engine_room/flywheel/lib/model/baked/FabricMeshEmitterManager.java index 450096445..cfb6e6a04 100644 --- a/fabric/src/lib/java/dev/engine_room/flywheel/lib/model/baked/FabricMeshEmitterManager.java +++ b/fabric/src/lib/java/dev/engine_room/flywheel/lib/model/baked/FabricMeshEmitterManager.java @@ -6,20 +6,19 @@ import dev.engine_room.flywheel.lib.model.SimpleModel; import net.fabricmc.fabric.api.client.model.loading.v1.wrapper.WrapperBlockStateModel; -import net.fabricmc.fabric.api.renderer.v1.mesh.QuadEmitter; -import net.fabricmc.fabric.api.renderer.v1.mesh.QuadTransform; -import net.fabricmc.fabric.api.renderer.v1.mesh.QuadView; -import net.fabricmc.fabric.api.renderer.v1.render.BlockVertexConsumerProvider; +import net.fabricmc.fabric.api.client.renderer.v1.mesh.QuadEmitter; +import net.fabricmc.fabric.api.client.renderer.v1.mesh.QuadTransform; +import net.fabricmc.fabric.api.client.renderer.v1.mesh.QuadView; import net.fabricmc.fabric.api.util.TriState; -import net.minecraft.client.renderer.block.model.BlockStateModel; -import net.minecraft.client.renderer.chunk.ChunkSectionLayer; +import net.minecraft.client.renderer.block.BlockAndTintGetter; +import net.minecraft.client.renderer.block.dispatch.BlockStateModel; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.util.RandomSource; -import net.minecraft.world.level.BlockAndTintGetter; import net.minecraft.world.level.block.state.BlockState; -class FabricMeshEmitterManager extends MeshEmitterManager implements BlockVertexConsumerProvider { +// TODO - IThundxr - Checkover +class FabricMeshEmitterManager extends MeshEmitterManager /*implements BlockVertexConsumerProvider*/ { private final WrapperModel wrapperModel = new WrapperModel(); private boolean useAo; @@ -52,10 +51,11 @@ private void prepareForGeometry(QuadView quad) { } } - @Override - public FabricMeshEmitter getBuffer(ChunkSectionLayer layer) { - return getEmitter(layer); - } + // TODO - IThundxr - Checkover +// @Override +// public FabricMeshEmitter getBuffer(ChunkSectionLayer layer) { +// return getEmitter(layer); +// } private class WrapperModel extends WrapperBlockStateModel { private final QuadTransform quadTransform = quad -> { diff --git a/fabric/src/lib/java/dev/engine_room/flywheel/lib/model/baked/FabricPartialModel.java b/fabric/src/lib/java/dev/engine_room/flywheel/lib/model/baked/FabricPartialModel.java index 292187d12..c97c43a1d 100644 --- a/fabric/src/lib/java/dev/engine_room/flywheel/lib/model/baked/FabricPartialModel.java +++ b/fabric/src/lib/java/dev/engine_room/flywheel/lib/model/baked/FabricPartialModel.java @@ -12,12 +12,12 @@ import net.fabricmc.fabric.api.client.model.loading.v1.ModelLoadingPlugin; import net.fabricmc.fabric.api.client.model.loading.v1.UnbakedExtraModel; import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.block.model.BlockStateModel; -import net.minecraft.client.renderer.block.model.SimpleModelWrapper; -import net.minecraft.client.renderer.block.model.SingleVariant; -import net.minecraft.client.resources.model.BlockModelRotation; +import net.minecraft.client.renderer.block.dispatch.BlockModelRotation; +import net.minecraft.client.renderer.block.dispatch.BlockStateModel; +import net.minecraft.client.renderer.block.dispatch.SingleVariant; import net.minecraft.client.resources.model.ModelBaker; import net.minecraft.client.resources.model.ModelManager; +import net.minecraft.client.resources.model.SimpleModelWrapper; import net.minecraft.resources.Identifier; import net.minecraft.server.packs.resources.ResourceManager; import net.minecraft.server.packs.resources.ResourceManagerReloadListener; diff --git a/fabric/src/main/java/dev/engine_room/flywheel/impl/FlwCommands.java b/fabric/src/main/java/dev/engine_room/flywheel/impl/FlwCommands.java index 37e9e37ff..4c8587f51 100644 --- a/fabric/src/main/java/dev/engine_room/flywheel/impl/FlwCommands.java +++ b/fabric/src/main/java/dev/engine_room/flywheel/impl/FlwCommands.java @@ -13,7 +13,7 @@ import dev.engine_room.flywheel.backend.compile.PipelineCompiler; import dev.engine_room.flywheel.backend.engine.uniform.DebugMode; import dev.engine_room.flywheel.backend.engine.uniform.FrameUniforms; -import net.fabricmc.fabric.api.client.command.v2.ClientCommandManager; +import net.fabricmc.fabric.api.client.command.v2.ClientCommands; import net.fabricmc.fabric.api.client.command.v2.FabricClientCommandSource; import net.minecraft.client.Minecraft; import net.minecraft.client.player.LocalPlayer; @@ -31,9 +31,9 @@ private FlwCommands() { } public static void registerClientCommands(CommandDispatcher dispatcher, CommandBuildContext buildContext) { - LiteralArgumentBuilder command = ClientCommandManager.literal("flywheel"); + LiteralArgumentBuilder command = ClientCommands.literal("flywheel"); - command.then(ClientCommandManager.literal("backend") + command.then(ClientCommands.literal("backend") .executes(context -> { Backend backend = BackendManager.currentBackend(); String idStr = Backend.REGISTRY.getIdOrThrow(backend) @@ -41,7 +41,7 @@ public static void registerClientCommands(CommandDispatcher { FabricFlwConfig.INSTANCE.backend = BackendManager.offBackend(); FabricFlwConfig.INSTANCE.useDefaultBackend = true; @@ -56,7 +56,7 @@ public static void registerClientCommands(CommandDispatcher { Backend requestedBackend = context.getArgument("id", Backend.class); FabricFlwConfig.INSTANCE.backend = requestedBackend; @@ -79,7 +79,7 @@ public static void registerClientCommands(CommandDispatcher { if (FabricFlwConfig.INSTANCE.limitUpdates) { context.getSource().sendFeedback(Component.translatable("command.flywheel.limit_updates.get.on")); @@ -88,7 +88,7 @@ public static void registerClientCommands(CommandDispatcher { FabricFlwConfig.INSTANCE.limitUpdates = true; FabricFlwConfig.INSTANCE.save(); @@ -96,7 +96,7 @@ public static void registerClientCommands(CommandDispatcher { FabricFlwConfig.INSTANCE.limitUpdates = false; FabricFlwConfig.INSTANCE.save(); @@ -105,8 +105,8 @@ public static void registerClientCommands(CommandDispatcher { var oldValue = FabricFlwConfig.INSTANCE.backendConfig.lightSmoothness; var newValue = context.getArgument("mode", LightSmoothness.class); @@ -125,11 +125,11 @@ public static void registerClientCommands(CommandDispatcher createDebugCommand() { - var debug = ClientCommandManager.literal("debug"); + var debug = ClientCommands.literal("debug"); - debug.then(ClientCommandManager.literal("crumbling") - .then(ClientCommandManager.argument("pos", BlockPosArgument.blockPos()) - .then(ClientCommandManager.argument("stage", IntegerArgumentType.integer(0, 9)) + debug.then(ClientCommands.literal("crumbling") + .then(ClientCommands.argument("pos", BlockPosArgument.blockPos()) + .then(ClientCommands.argument("stage", IntegerArgumentType.integer(0, 9)) .executes(context -> { Entity executor = context.getSource() .getEntity(); @@ -147,51 +147,51 @@ private static LiteralArgumentBuilder createDebugComm return Command.SINGLE_SUCCESS; })))); - debug.then(ClientCommandManager.literal("shader") - .then(ClientCommandManager.argument("mode", DebugModeArgument.INSTANCE) + debug.then(ClientCommands.literal("shader") + .then(ClientCommands.argument("mode", DebugModeArgument.INSTANCE) .executes(context -> { DebugMode mode = context.getArgument("mode", DebugMode.class); FrameUniforms.debugMode(mode); return Command.SINGLE_SUCCESS; }))); - debug.then(ClientCommandManager.literal("frustum") - .then(ClientCommandManager.literal("capture") + debug.then(ClientCommands.literal("frustum") + .then(ClientCommands.literal("capture") .executes(context -> { FrameUniforms.captureFrustum(); return Command.SINGLE_SUCCESS; })) - .then(ClientCommandManager.literal("unpause") + .then(ClientCommands.literal("unpause") .executes(context -> { FrameUniforms.unpauseFrustum(); return Command.SINGLE_SUCCESS; }))); - debug.then(ClientCommandManager.literal("lightSections") - .then(ClientCommandManager.literal("on") + debug.then(ClientCommands.literal("lightSections") + .then(ClientCommands.literal("on") .executes(context -> { BackendDebugFlags.LIGHT_STORAGE_VIEW = true; return Command.SINGLE_SUCCESS; })) - .then(ClientCommandManager.literal("off") + .then(ClientCommands.literal("off") .executes(context -> { BackendDebugFlags.LIGHT_STORAGE_VIEW = false; return Command.SINGLE_SUCCESS; }))); - debug.then(ClientCommandManager.literal("pauseUpdates") - .then(ClientCommandManager.literal("on") + debug.then(ClientCommands.literal("pauseUpdates") + .then(ClientCommands.literal("on") .executes(context -> { ImplDebugFlags.PAUSE_UPDATES = true; return Command.SINGLE_SUCCESS; })) - .then(ClientCommandManager.literal("off") + .then(ClientCommands.literal("off") .executes(context -> { ImplDebugFlags.PAUSE_UPDATES = false; return Command.SINGLE_SUCCESS; }))); - debug.then(ClientCommandManager.literal("info") + debug.then(ClientCommands.literal("info") .executes(context -> { context.getSource() .sendFeedback(FlwDebugInfo.getDebugCommandInfo()); diff --git a/fabric/src/main/java/dev/engine_room/flywheel/impl/FlywheelFabric.java b/fabric/src/main/java/dev/engine_room/flywheel/impl/FlywheelFabric.java index 3fa638109..6378a1996 100644 --- a/fabric/src/main/java/dev/engine_room/flywheel/impl/FlywheelFabric.java +++ b/fabric/src/main/java/dev/engine_room/flywheel/impl/FlywheelFabric.java @@ -78,14 +78,14 @@ private static void setupLib() { EndClientResourceReloadCallback.EVENT.register((minecraft, resourceManager, initialReload, error) -> ResourceReloadHolder.onEndClientResourceReload()); ModelLoadingPlugin.register(FabricPartialModel::registerAll); - ResourceLoader.get(PackType.CLIENT_RESOURCES).registerReloader(FabricPartialModel.ResourceReloadListener.ID, FabricPartialModel.ResourceReloadListener.INSTANCE); - ResourceLoader.get(PackType.CLIENT_RESOURCES).addReloaderOrdering(ResourceReloaderKeys.Client.MODELS, FabricPartialModel.ResourceReloadListener.ID); + ResourceLoader.get(PackType.CLIENT_RESOURCES).registerReloadListener(FabricPartialModel.ResourceReloadListener.ID, FabricPartialModel.ResourceReloadListener.INSTANCE); + ResourceLoader.get(PackType.CLIENT_RESOURCES).addListenerOrdering(ResourceReloaderKeys.Client.MODELS, FabricPartialModel.ResourceReloadListener.ID); } private static void setupBackend() { ReloadLevelRendererCallback.EVENT.register(level -> Uniforms.onReloadLevelRenderer()); - ResourceLoader.get(PackType.CLIENT_RESOURCES).registerReloader(FlwProgramsReloader.ID, FlwProgramsReloader.INSTANCE); + ResourceLoader.get(PackType.CLIENT_RESOURCES).registerReloadListener(FlwProgramsReloader.ID, FlwProgramsReloader.INSTANCE); } public static Version version() { diff --git a/fabric/src/main/java/dev/engine_room/flywheel/impl/mixin/MinecraftMixin.java b/fabric/src/main/java/dev/engine_room/flywheel/impl/mixin/MinecraftMixin.java index dcab8eeec..ebef5304e 100644 --- a/fabric/src/main/java/dev/engine_room/flywheel/impl/mixin/MinecraftMixin.java +++ b/fabric/src/main/java/dev/engine_room/flywheel/impl/mixin/MinecraftMixin.java @@ -31,13 +31,13 @@ abstract class MinecraftMixin { FabricFlwConfig.INSTANCE.load(); } - @Inject(method = "method_53522", at = @At("HEAD")) + @Inject(method = "lambda$new$4", at = @At("HEAD")) private void flywheel$onEndInitialResourceReload(@Coerce Object gameLoadCookie, Optional error, CallbackInfo ci) { EndClientResourceReloadCallback.EVENT.invoker() .onEndClientResourceReload((Minecraft) (Object) this, resourceManager, true, error); } - @Inject(method = "method_24228", at = @At("HEAD")) + @Inject(method = "lambda$reloadResourcePacks$0", at = @At("HEAD")) private void flywheel$onEndManualResourceReload(boolean recovery, @Coerce Object gameLoadCookie, CompletableFuture future, Optional error, CallbackInfo ci) { EndClientResourceReloadCallback.EVENT.invoker() diff --git a/neoforge/src/main/java/dev/engine_room/flywheel/impl/mixin/MinecraftMixin.java b/neoforge/src/main/java/dev/engine_room/flywheel/impl/mixin/MinecraftMixin.java index fcf751a34..0bea1528d 100644 --- a/neoforge/src/main/java/dev/engine_room/flywheel/impl/mixin/MinecraftMixin.java +++ b/neoforge/src/main/java/dev/engine_room/flywheel/impl/mixin/MinecraftMixin.java @@ -28,12 +28,12 @@ abstract class MinecraftMixin { FlwImpl.freezeRegistries(); } - @Inject(method = "method_53522", at = @At("HEAD"), remap = false) + @Inject(method = "lambda$new$4", at = @At("HEAD"), remap = false) private void flywheel$onEndInitialResourceReload(@Coerce Object gameLoadCookie, Optional error, CallbackInfo ci) { ModLoader.postEvent(new EndClientResourceReloadEvent((Minecraft) (Object) this, resourceManager, true, error)); } - @Inject(method = "lambda$reloadResourcePacks$20", at = @At("HEAD"), remap = false) + @Inject(method = "lambda$reloadResourcePacks$0", at = @At("HEAD"), remap = false) private void flywheel$onEndManualResourceReload(boolean recovery, @Coerce Object gameLoadCookie, CompletableFuture completablefuture, Optional error, CallbackInfo ci) { ModLoader.postEvent(new EndClientResourceReloadEvent((Minecraft) (Object) this, resourceManager, false, error)); } diff --git a/vanillinFabric/src/main/java/dev/engine_room/vanillin/VanillinFabric.java b/vanillinFabric/src/main/java/dev/engine_room/vanillin/VanillinFabric.java index 77ac5acc2..339f04ced 100644 --- a/vanillinFabric/src/main/java/dev/engine_room/vanillin/VanillinFabric.java +++ b/vanillinFabric/src/main/java/dev/engine_room/vanillin/VanillinFabric.java @@ -3,7 +3,7 @@ import dev.engine_room.flywheel.api.event.ReloadLevelRendererCallback; import dev.engine_room.vanillin.item.SodiumAnimatedTextureCompat; import net.fabricmc.api.ClientModInitializer; -import net.fabricmc.fabric.api.client.rendering.v1.world.WorldRenderEvents; +import net.fabricmc.fabric.api.client.rendering.v1.level.LevelRenderEvents; public class VanillinFabric implements ClientModInitializer { @Override @@ -14,6 +14,6 @@ public void onInitializeClient() { FabricVanillinConfig.INSTANCE.save(); ReloadLevelRendererCallback.EVENT.register(level -> SodiumAnimatedTextureCompat.onReloadRenderer()); - WorldRenderEvents.START_MAIN.register(context -> SodiumAnimatedTextureCompat.beginFrame()); + LevelRenderEvents.START_MAIN.register(context -> SodiumAnimatedTextureCompat.beginFrame()); } } From df1ad8e10250139e70f542c9a1e9bb2095937ca2 Mon Sep 17 00:00:00 2001 From: IThundxr Date: Mon, 27 Apr 2026 22:02:51 -0400 Subject: [PATCH 41/59] More fixes --- .../gradle/platform/PlatformExtension.kt | 31 ++++++ .../backend/engine/MaterialRenderState.java | 2 - .../backend/engine/uniform/LevelUniforms.java | 2 +- .../model/baked/BlockStateModelBufferer.java | 3 +- .../model/baked/FabricMeshEmitterManager.java | 9 +- neoforge/build.gradle.kts | 2 + .../model/baked/BlockStateModelBufferer.java | 100 +++++++++++------- .../lib/model/baked/NeoForgeMeshEmitter.java | 39 ++++--- .../lib/model/baked/NeoForgePartialModel.java | 11 +- .../neoforge/ModelBlockRendererMixin.java | 2 +- vanillinNeoForge/build.gradle.kts | 4 + 11 files changed, 130 insertions(+), 75 deletions(-) diff --git a/buildSrc/src/main/kotlin/dev/engine_room/gradle/platform/PlatformExtension.kt b/buildSrc/src/main/kotlin/dev/engine_room/gradle/platform/PlatformExtension.kt index 3c8ea50e8..199926332 100644 --- a/buildSrc/src/main/kotlin/dev/engine_room/gradle/platform/PlatformExtension.kt +++ b/buildSrc/src/main/kotlin/dev/engine_room/gradle/platform/PlatformExtension.kt @@ -3,6 +3,8 @@ package dev.engine_room.gradle.platform import net.fabricmc.loom.api.LoomGradleExtensionAPI import net.fabricmc.loom.task.RenderDocRunTask import net.fabricmc.loom.task.RenderDocRunUITask +import net.neoforged.moddevgradle.dsl.ModDevExtension +import net.neoforged.moddevgradle.dsl.RunModel import org.gradle.api.Project import org.gradle.api.Task import org.gradle.api.tasks.SourceSet @@ -21,6 +23,12 @@ open class PlatformExtension(val project: Project) { } } + fun setupMdgMod(vararg sourceSets: SourceSet) { + project.the().mods.maybeCreate("main").apply { + sourceSets.forEach(::sourceSet) + } + } + fun setupLoomRuns() { project.the().runs.apply { named("client") { @@ -57,6 +65,29 @@ open class PlatformExtension(val project: Project) { } } + fun setupMdgRuns() { + project.the().runs.apply { + create("client") { + client() + + systemProperty("flw.dumpShaderSource", "true") + systemProperty("flw.debugMemorySafety", "true") + + systemProperty("mixin.debug.export", "true") + systemProperty("mixin.debug.verbose", "true") + + programArguments.addAll("--width", "1280", "--height", "720") + } + + // We're a client mod, but we need to make sure we correctly render when playing on a server. + create("server") { + server() + + programArgument("--nogui") + } + } + } + fun setupTestMod(sourceSet: SourceSet) { project.tasks.apply { val testModJar = register("testModJar") { diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/engine/MaterialRenderState.java b/common/src/backend/java/dev/engine_room/flywheel/backend/engine/MaterialRenderState.java index 66ad9b1bc..3eb09f2e5 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/engine/MaterialRenderState.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/engine/MaterialRenderState.java @@ -45,7 +45,6 @@ public static void setupOit(Material material) { WriteMask mask = material.writeMask(); boolean writeColor = mask.color(); - // TODO - IThundxr - Checkover GlStateManager._colorMask(writeColor ? ColorTargetState.WRITE_ALL : ColorTargetState.WRITE_NONE); } @@ -153,7 +152,6 @@ private static void setupTransparency(Transparency transparency) { private static void setupWriteMask(WriteMask mask) { GlStateManager._depthMask(mask.depth()); boolean writeColor = mask.color(); - // TODO - IThundxr - Checkover GlStateManager._colorMask(writeColor ? ColorTargetState.WRITE_ALL : ColorTargetState.WRITE_NONE); } diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/engine/uniform/LevelUniforms.java b/common/src/backend/java/dev/engine_room/flywheel/backend/engine/uniform/LevelUniforms.java index d108fb79f..523b11d57 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/engine/uniform/LevelUniforms.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/engine/uniform/LevelUniforms.java @@ -35,7 +35,7 @@ public static void update(RenderContext context) { ptr = writeVec3(ptr, LIGHT0_DIRECTION); ptr = writeVec3(ptr, LIGHT1_DIRECTION); - long dayTime = level.getOverworldClockTime(); // TODO - IThundxr - Checkover + long dayTime = level.getOverworldClockTime(); long levelDay = dayTime / 24000L; float timeOfDay = (float) (dayTime - levelDay * 24000L) / 24000f; ptr = writeInt(ptr, (int) (levelDay % 0x7FFFFFFFL)); diff --git a/fabric/src/lib/java/dev/engine_room/flywheel/lib/model/baked/BlockStateModelBufferer.java b/fabric/src/lib/java/dev/engine_room/flywheel/lib/model/baked/BlockStateModelBufferer.java index d64232268..370e0d36d 100644 --- a/fabric/src/lib/java/dev/engine_room/flywheel/lib/model/baked/BlockStateModelBufferer.java +++ b/fabric/src/lib/java/dev/engine_room/flywheel/lib/model/baked/BlockStateModelBufferer.java @@ -52,13 +52,12 @@ public static SimpleModel bufferModel(BlockStateModel model, BlockPos pos, Block ModelBlockRenderer blockRenderer = new ModelBlockRenderer(useAo, true, blockColors); PoseStack finalPoseStack = poseStack; - blockRenderer.tesselateBlock((x, y, z, quad, instance) -> { + blockRenderer.tesselateBlock((_, _, _, quad, instance) -> { finalPoseStack.pushPose(); ChunkSectionLayer layer = quad.materialInfo().layer(); emitters.getEmitter(layer).putBakedQuad(finalPoseStack.last(), quad, instance); finalPoseStack.popPose(); }, 0, 0, 0, level, pos, state, model, seed); - poseStack.popPose(); return emitters.end(); } diff --git a/fabric/src/lib/java/dev/engine_room/flywheel/lib/model/baked/FabricMeshEmitterManager.java b/fabric/src/lib/java/dev/engine_room/flywheel/lib/model/baked/FabricMeshEmitterManager.java index cfb6e6a04..b73e65014 100644 --- a/fabric/src/lib/java/dev/engine_room/flywheel/lib/model/baked/FabricMeshEmitterManager.java +++ b/fabric/src/lib/java/dev/engine_room/flywheel/lib/model/baked/FabricMeshEmitterManager.java @@ -17,8 +17,7 @@ import net.minecraft.util.RandomSource; import net.minecraft.world.level.block.state.BlockState; -// TODO - IThundxr - Checkover -class FabricMeshEmitterManager extends MeshEmitterManager /*implements BlockVertexConsumerProvider*/ { +class FabricMeshEmitterManager extends MeshEmitterManager { private final WrapperModel wrapperModel = new WrapperModel(); private boolean useAo; @@ -51,12 +50,6 @@ private void prepareForGeometry(QuadView quad) { } } - // TODO - IThundxr - Checkover -// @Override -// public FabricMeshEmitter getBuffer(ChunkSectionLayer layer) { -// return getEmitter(layer); -// } - private class WrapperModel extends WrapperBlockStateModel { private final QuadTransform quadTransform = quad -> { FabricMeshEmitterManager.this.prepareForGeometry(quad); diff --git a/neoforge/build.gradle.kts b/neoforge/build.gradle.kts index afa544483..8565ecd7b 100644 --- a/neoforge/build.gradle.kts +++ b/neoforge/build.gradle.kts @@ -61,6 +61,8 @@ transitiveSourceSets { } platform { + setupMdgMod(api, lib, backend, main) + setupMdgRuns() setupTestMod(testMod) } diff --git a/neoforge/src/lib/java/dev/engine_room/flywheel/lib/model/baked/BlockStateModelBufferer.java b/neoforge/src/lib/java/dev/engine_room/flywheel/lib/model/baked/BlockStateModelBufferer.java index b7d7ed33e..8aaa7bd18 100644 --- a/neoforge/src/lib/java/dev/engine_room/flywheel/lib/model/baked/BlockStateModelBufferer.java +++ b/neoforge/src/lib/java/dev/engine_room/flywheel/lib/model/baked/BlockStateModelBufferer.java @@ -11,16 +11,18 @@ import dev.engine_room.flywheel.lib.model.SimpleModel; import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.ItemBlockRenderTypes; -import net.minecraft.client.renderer.block.BlockRenderDispatcher; +import net.minecraft.client.color.block.BlockColors; +import net.minecraft.client.renderer.block.BlockAndTintGetter; +import net.minecraft.client.renderer.block.BlockModelLighter; +import net.minecraft.client.renderer.block.FluidRenderer; import net.minecraft.client.renderer.block.ModelBlockRenderer; -import net.minecraft.client.renderer.block.model.BlockModelPart; -import net.minecraft.client.renderer.block.model.BlockStateModel; +import net.minecraft.client.renderer.block.dispatch.BlockStateModel; +import net.minecraft.client.renderer.block.dispatch.BlockStateModelPart; import net.minecraft.client.renderer.chunk.ChunkSectionLayer; -import net.minecraft.client.renderer.texture.OverlayTexture; +import net.minecraft.client.renderer.state.GameRenderState; +import net.minecraft.client.resources.model.ModelManager; import net.minecraft.core.BlockPos; import net.minecraft.util.RandomSource; -import net.minecraft.world.level.BlockAndTintGetter; import net.minecraft.world.level.block.RenderShape; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.material.FluidState; @@ -37,7 +39,7 @@ public static SimpleModel bufferModel(BlockStateModel model, BlockPos pos, Block if (poseStack == null) { poseStack = objects.identityPoseStack; } - List parts = objects.parts; + List parts = objects.parts; RandomSource random = objects.random; NeoForgeMeshEmitterManager emitters = objects.emitters; @@ -47,8 +49,12 @@ public static SimpleModel bufferModel(BlockStateModel model, BlockPos pos, Block random.setSeed(seed); model.collectParts(level, pos, state, random, parts); + Minecraft minecraft = Minecraft.getInstance(); + GameRenderState gameRenderState = minecraft.gameRenderer.getGameRenderState(); + BlockColors blockColors = minecraft.getBlockColors(); + // See ModelBlockRenderer#tesselateBlock - boolean useAo = Minecraft.useAmbientOcclusion(); + boolean useAo = gameRenderState.optionsRenderState.ambientOcclusion; boolean perPartAo = NeoForgeClientConfig.INSTANCE.handleAmbientOcclusionPerPart.getAsBoolean(); boolean ao = useAo && (perPartAo || parts.isEmpty() || switch(parts.getFirst().ambientOcclusion()) { case TRUE -> true; @@ -57,12 +63,15 @@ public static SimpleModel bufferModel(BlockStateModel model, BlockPos pos, Block }); emitters.prepareForModel(ao); - poseStack.pushPose(); - Minecraft.getInstance() - .getBlockRenderer() - .getModelRenderer() - .tesselateBlock(level, parts, state, pos, poseStack, emitters, false, OverlayTexture.NO_OVERLAY); - poseStack.popPose(); + ModelBlockRenderer blockRenderer = new ModelBlockRenderer(useAo, true, blockColors); + + PoseStack finalPoseStack = poseStack; + blockRenderer.tesselateBlock((_, _, _, quad, instance) -> { + finalPoseStack.pushPose(); + ChunkSectionLayer layer = quad.materialInfo().layer(); + emitters.getEmitter(layer).putBakedQuad(finalPoseStack.last(), quad, instance); + finalPoseStack.popPose(); + }, 0, 0, 0, level, pos, state, model, seed); return emitters.end(); } @@ -72,19 +81,24 @@ public static SimpleModel bufferBlocks(Iterator posIterator, BlockAndT if (poseStack == null) { poseStack = objects.identityPoseStack; } - List parts = objects.parts; + List parts = objects.parts; RandomSource random = objects.random; NeoForgeMeshEmitterManager emitters = objects.emitters; TransformingVertexConsumer transformingWrapper = objects.transformingWrapper; emitters.prepare(blockMaterialFunction); - BlockRenderDispatcher renderDispatcher = Minecraft.getInstance() - .getBlockRenderer(); - ModelBlockRenderer blockRenderer = renderDispatcher.getModelRenderer(); - ModelBlockRenderer.enableCaching(); + BlockModelLighter.enableCaching(); + + Minecraft minecraft = Minecraft.getInstance(); + ModelManager modelManager = minecraft.getModelManager(); + GameRenderState gameRenderState = minecraft.gameRenderer.getGameRenderState(); + boolean useAo = gameRenderState.optionsRenderState.ambientOcclusion; + BlockColors blockColors = minecraft.getBlockColors(); + + ModelBlockRenderer blockRenderer = new ModelBlockRenderer(useAo, true, blockColors); + FluidRenderer fluidRenderer = new FluidRenderer(modelManager.getFluidStateModelSet()); - boolean useAo = Minecraft.useAmbientOcclusion(); boolean perPartAo = NeoForgeClientConfig.INSTANCE.handleAmbientOcclusionPerPart.getAsBoolean(); while (posIterator.hasNext()) { @@ -97,18 +111,20 @@ public static SimpleModel bufferBlocks(Iterator posIterator, BlockAndT FluidState fluidState = state.getFluidState(); if (!fluidState.isEmpty()) { - ChunkSectionLayer layer = ItemBlockRenderTypes.getRenderLayer(fluidState); - - BufferBuilder bufferBuilder = emitters.getEmitter(layer).getBuffer(true, false); - - if (bufferBuilder != null) { - transformingWrapper.prepare(bufferBuilder, poseStack); - - poseStack.pushPose(); - poseStack.translate(pos.getX() - (pos.getX() & 0xF), pos.getY() - (pos.getY() & 0xF), pos.getZ() - (pos.getZ() & 0xF)); - renderDispatcher.renderLiquid(pos, level, transformingWrapper, state, fluidState); - poseStack.popPose(); - } + poseStack.pushPose(); + poseStack.translate(pos.getX() - (pos.getX() & 0xF), pos.getY() - (pos.getY() & 0xF), pos.getZ() - (pos.getZ() & 0xF)); + PoseStack finalPoseStack = poseStack; + fluidRenderer.tesselate(level, pos, layer -> { + BufferBuilder bufferBuilder = emitters.getEmitter(layer).getBuffer(true, false); + + if (bufferBuilder != null) { + transformingWrapper.prepare(bufferBuilder, finalPoseStack); + return transformingWrapper; + } + + return EmptyVertexConsumer.INSTANCE; + }, state, fluidState); + poseStack.popPose(); } } @@ -116,7 +132,7 @@ public static SimpleModel bufferBlocks(Iterator posIterator, BlockAndT long seed = state.getSeed(pos); random.setSeed(seed); - BlockStateModel model = renderDispatcher.getBlockModel(state); + BlockStateModel model = modelManager.getBlockStateModelSet().get(state); model.collectParts(level, pos, state, random, parts); // See ModelBlockRenderer#tesselateBlock @@ -127,22 +143,26 @@ public static SimpleModel bufferBlocks(Iterator posIterator, BlockAndT }); emitters.prepareForModel(ao); - poseStack.pushPose(); - poseStack.translate(pos.getX(), pos.getY(), pos.getZ()); - blockRenderer.tesselateBlock(level, parts, state, pos, poseStack, emitters, true, OverlayTexture.NO_OVERLAY); - poseStack.popPose(); + PoseStack finalPoseStack = poseStack; + blockRenderer.tesselateBlock((x, y, z, quad, instance) -> { + finalPoseStack.pushPose(); + finalPoseStack.translate(x, y, z); + ChunkSectionLayer layer = quad.materialInfo().layer(); + emitters.getEmitter(layer).putBakedQuad(finalPoseStack.last(), quad, instance); + finalPoseStack.popPose(); + }, pos.getX(), pos.getY(), pos.getZ(), level, pos, state, model, seed); } } - ModelBlockRenderer.clearCache(); + BlockModelLighter.clearCache(); transformingWrapper.clear(); return emitters.end(); } private static class ThreadLocalObjects { public final PoseStack identityPoseStack = new PoseStack(); - public final List parts = new ArrayList<>(); - public final RandomSource random = RandomSource.createNewThreadLocalInstance(); + public final List parts = new ArrayList<>(); + public final RandomSource random = RandomSource.createThreadLocalInstance(); public final NeoForgeMeshEmitterManager emitters = new NeoForgeMeshEmitterManager(); public final TransformingVertexConsumer transformingWrapper = new TransformingVertexConsumer(); diff --git a/neoforge/src/lib/java/dev/engine_room/flywheel/lib/model/baked/NeoForgeMeshEmitter.java b/neoforge/src/lib/java/dev/engine_room/flywheel/lib/model/baked/NeoForgeMeshEmitter.java index df0311298..b9683edd5 100644 --- a/neoforge/src/lib/java/dev/engine_room/flywheel/lib/model/baked/NeoForgeMeshEmitter.java +++ b/neoforge/src/lib/java/dev/engine_room/flywheel/lib/model/baked/NeoForgeMeshEmitter.java @@ -4,11 +4,13 @@ import org.jspecify.annotations.Nullable; import com.mojang.blaze3d.vertex.BufferBuilder; -import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.PoseStack.Pose; +import com.mojang.blaze3d.vertex.QuadInstance; import com.mojang.blaze3d.vertex.VertexConsumer; -import net.minecraft.client.renderer.block.model.BakedQuad; import net.minecraft.client.renderer.chunk.ChunkSectionLayer; +import net.minecraft.client.resources.model.geometry.BakedQuad; +import net.neoforged.neoforge.client.model.quad.MutableQuad; @ApiStatus.Internal public class NeoForgeMeshEmitter extends MeshEmitter { @@ -25,64 +27,69 @@ public void prepareForPart(boolean ao) { @Nullable private BufferBuilder getBuffer(BakedQuad quad) { - boolean shade = quad.shade(); - boolean ao = quad.hasAmbientOcclusion() && this.ao; + boolean shade = quad.materialInfo().shade(); + boolean ao = quad.materialInfo().ambientOcclusion() && this.ao; return getBuffer(shade, ao); } @Override - public void putBulkData(PoseStack.Pose pose, BakedQuad quad, float red, float green, float blue, float alpha, int packedLight, int packedOverlay) { + public void putBakedQuad(Pose pose, BakedQuad quad, QuadInstance instance) { BufferBuilder bufferBuilder = getBuffer(quad); if (bufferBuilder != null) { - bufferBuilder.putBulkData(pose, quad, red, green, blue, alpha, packedLight, packedOverlay); + bufferBuilder.putBakedQuad(pose, quad, instance); } } @Override - public void putBulkData(PoseStack.Pose pose, BakedQuad quad, float[] brightness, float red, float green, float blue, float alpha, int[] lightmap, int packedOverlay) { + public void putBlockBakedQuad(float x, float y, float z, BakedQuad quad, QuadInstance instance) { BufferBuilder bufferBuilder = getBuffer(quad); if (bufferBuilder != null) { - bufferBuilder.putBulkData(pose, quad, brightness, red, green, blue, alpha, lightmap, packedOverlay); + bufferBuilder.putBlockBakedQuad(x, y, z, quad, instance); } } + @Override + public void putMutableQuad(Pose pose, MutableQuad quad, QuadInstance instance) { + throw new UnsupportedOperationException("NeoForgeMeshEmitter only supports putBakedQuad/putBlockBakedQuad!"); + } + @Override public VertexConsumer addVertex(float x, float y, float z) { - throw new UnsupportedOperationException("NeoForgeMeshEmitter only supports putBulkData!"); + throw new UnsupportedOperationException("NeoForgeMeshEmitter only supports putBakedQuad/putBlockBakedQuad!"); } @Override public VertexConsumer setColor(int red, int green, int blue, int alpha) { - throw new UnsupportedOperationException("NeoForgeMeshEmitter only supports putBulkData!"); + throw new UnsupportedOperationException("NeoForgeMeshEmitter only supports putBakedQuad/putBlockBakedQuad!"); } @Override public VertexConsumer setColor(int color) { - throw new UnsupportedOperationException("NeoForgeMeshEmitter only supports putBulkData!"); + throw new UnsupportedOperationException("NeoForgeMeshEmitter only supports putBakedQuad/putBlockBakedQuad!"); } @Override public VertexConsumer setUv(float u, float v) { - throw new UnsupportedOperationException("NeoForgeMeshEmitter only supports putBulkData!"); + throw new UnsupportedOperationException("NeoForgeMeshEmitter only supports putBakedQuad/putBlockBakedQuad!"); } @Override public VertexConsumer setUv1(int u, int v) { - throw new UnsupportedOperationException("NeoForgeMeshEmitter only supports putBulkData!"); + throw new UnsupportedOperationException("NeoForgeMeshEmitter only supports putBakedQuad/putBlockBakedQuad!"); } @Override public VertexConsumer setUv2(int u, int v) { - throw new UnsupportedOperationException("NeoForgeMeshEmitter only supports putBulkData!"); + throw new UnsupportedOperationException("NeoForgeMeshEmitter only supports putBakedQuad/putBlockBakedQuad!"); } @Override public VertexConsumer setNormal(float normalX, float normalY, float normalZ) { - throw new UnsupportedOperationException("NeoForgeMeshEmitter only supports putBulkData!"); + throw new UnsupportedOperationException("NeoForgeMeshEmitter only supports putBakedQuad/putBlockBakedQuad!"); } @Override public VertexConsumer setLineWidth(float width) { - throw new UnsupportedOperationException("NeoForgeMeshEmitter only supports putBulkData!"); + throw new UnsupportedOperationException("NeoForgeMeshEmitter only supports putBakedQuad/putBlockBakedQuad!"); } } diff --git a/neoforge/src/lib/java/dev/engine_room/flywheel/lib/model/baked/NeoForgePartialModel.java b/neoforge/src/lib/java/dev/engine_room/flywheel/lib/model/baked/NeoForgePartialModel.java index fd41ae250..6e512b27f 100644 --- a/neoforge/src/lib/java/dev/engine_room/flywheel/lib/model/baked/NeoForgePartialModel.java +++ b/neoforge/src/lib/java/dev/engine_room/flywheel/lib/model/baked/NeoForgePartialModel.java @@ -7,13 +7,14 @@ import com.google.common.collect.MapMaker; -import net.minecraft.client.renderer.block.model.BlockStateModel; -import net.minecraft.client.renderer.block.model.SimpleModelWrapper; -import net.minecraft.client.renderer.block.model.SingleVariant; -import net.minecraft.client.resources.model.BlockModelRotation; +import net.minecraft.client.renderer.block.dispatch.BlockModelRotation; +import net.minecraft.client.renderer.block.dispatch.BlockStateModel; +import net.minecraft.client.renderer.block.dispatch.SingleVariant; import net.minecraft.client.resources.model.ModelBaker; +import net.minecraft.client.resources.model.ModelDebugName; import net.minecraft.client.resources.model.ModelManager; import net.minecraft.client.resources.model.ResolvableModel; +import net.minecraft.client.resources.model.SimpleModelWrapper; import net.minecraft.resources.Identifier; import net.neoforged.neoforge.client.event.ModelEvent; import net.neoforged.neoforge.client.model.standalone.StandaloneModelKey; @@ -50,7 +51,7 @@ public static void refreshAll(ModelEvent.BakingCompleted event) { private class Unbaked implements UnbakedStandaloneModel<@NotNull BlockStateModel> { @Override - public BlockStateModel bake(ModelBaker baker) { + public @NotNull BlockStateModel bake(ModelBaker baker, ModelDebugName name) { return new SingleVariant(SimpleModelWrapper.bake(baker, modelId, BlockModelRotation.IDENTITY)); } diff --git a/neoforge/src/main/java/dev/engine_room/flywheel/impl/mixin/neoforge/ModelBlockRendererMixin.java b/neoforge/src/main/java/dev/engine_room/flywheel/impl/mixin/neoforge/ModelBlockRendererMixin.java index 3dbd4c643..c85bce93b 100644 --- a/neoforge/src/main/java/dev/engine_room/flywheel/impl/mixin/neoforge/ModelBlockRendererMixin.java +++ b/neoforge/src/main/java/dev/engine_room/flywheel/impl/mixin/neoforge/ModelBlockRendererMixin.java @@ -15,7 +15,7 @@ @Mixin(ModelBlockRenderer.class) abstract class ModelBlockRendererMixin { - @Inject(method = "tesselateWithAO(Lnet/minecraft/world/level/BlockAndTintGetter;Ljava/util/List;Lnet/minecraft/world/level/block/state/BlockState;Lnet/minecraft/core/BlockPos;Lcom/mojang/blaze3d/vertex/PoseStack;Ljava/util/function/Function;ZI)V", at = @At(value = "FIELD", target = "net/minecraft/client/renderer/block/ModelBlockRenderer.DIRECTIONS : [Lnet/minecraft/core/Direction;", opcode = Opcodes.GETSTATIC), slice = @Slice(from = @At(value = "INVOKE", target = "Lnet/neoforged/neoforge/client/extensions/BlockModelPartExtension;getRenderType(Lnet/minecraft/world/level/block/state/BlockState;)Lnet/minecraft/client/renderer/chunk/ChunkSectionLayer;"))) + @Inject(method = "tesselateAmbientOcclusion", at = @At(value = "FIELD", target = "net/minecraft/client/renderer/block/ModelBlockRenderer.DIRECTIONS : [Lnet/minecraft/core/Direction;", opcode = Opcodes.GETSTATIC), slice = @Slice(from = @At(value = "INVOKE", target = "Lnet/neoforged/neoforge/client/extensions/BlockModelPartExtension;getRenderType(Lnet/minecraft/world/level/block/state/BlockState;)Lnet/minecraft/client/renderer/chunk/ChunkSectionLayer;"))) private void onTesselateWithAO(CallbackInfo ci, @Local VertexConsumer vertexConsumer, @Local(ordinal = 0, argsOnly = true) boolean ao) { if (vertexConsumer instanceof NeoForgeMeshEmitter meshEmitter) { meshEmitter.prepareForPart(ao); diff --git a/vanillinNeoForge/build.gradle.kts b/vanillinNeoForge/build.gradle.kts index 599849ef3..b966ca348 100644 --- a/vanillinNeoForge/build.gradle.kts +++ b/vanillinNeoForge/build.gradle.kts @@ -14,6 +14,10 @@ subproject.init("vanillin-neoforge", "vanillin_group", "vanillin_version") val main = sourceSets.getByName("main") +platform { + setupMdgRuns() +} + transitiveSourceSets { sourceSet(main) { compileClasspath(project(platform), "api", "lib", "main") From f02d16eb6e4ffc3532aaa749cf6b39965cac454d Mon Sep 17 00:00:00 2001 From: IThundxr Date: Tue, 28 Apr 2026 12:21:00 -0400 Subject: [PATCH 42/59] Fix gl errors and temporally comment out ModelBlockRendererMixin --- .../flywheel/backend/compile/core/Compilation.java | 3 +-- .../backend/compile/core/ProgramLinker.java | 3 +-- .../mixin/neoforge/ModelBlockRendererMixin.java | 14 ++++++-------- 3 files changed, 8 insertions(+), 12 deletions(-) diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/compile/core/Compilation.java b/common/src/backend/java/dev/engine_room/flywheel/backend/compile/core/Compilation.java index 5907aabff..0ff730fd3 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/compile/core/Compilation.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/compile/core/Compilation.java @@ -43,8 +43,7 @@ public ShaderResult compile(ShaderType shaderType, String name) { var shaderName = name + "." + shaderType.extension; dumpSource(source, shaderName); - var logLength = GlStateManager.glGetShaderi(handle, ShaderManager.MAX_LOG_LENGTH); - var infoLog = GlStateManager.glGetShaderInfoLog(handle, logLength); + var infoLog = GlStateManager.glGetShaderInfoLog(handle, ShaderManager.MAX_LOG_LENGTH); if (compiledSuccessfully(handle)) { return ShaderResult.success(new GlShader(handle, shaderType, shaderName), infoLog); diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/compile/core/ProgramLinker.java b/common/src/backend/java/dev/engine_room/flywheel/backend/compile/core/ProgramLinker.java index a6a244b86..6c334de9e 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/compile/core/ProgramLinker.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/compile/core/ProgramLinker.java @@ -31,8 +31,7 @@ private LinkResult linkInternal(List shaders, Consumer preL preLink.accept(out); GlStateManager.glLinkProgram(handle); - int logLength = GlStateManager.glGetProgrami(handle, ShaderManager.MAX_LOG_LENGTH); - String log = GlStateManager.glGetProgramInfoLog(handle, logLength); + String log = GlStateManager.glGetProgramInfoLog(handle, ShaderManager.MAX_LOG_LENGTH); if (linkSuccessful(handle)) { return LinkResult.success(out, log); diff --git a/neoforge/src/main/java/dev/engine_room/flywheel/impl/mixin/neoforge/ModelBlockRendererMixin.java b/neoforge/src/main/java/dev/engine_room/flywheel/impl/mixin/neoforge/ModelBlockRendererMixin.java index c85bce93b..997398858 100644 --- a/neoforge/src/main/java/dev/engine_room/flywheel/impl/mixin/neoforge/ModelBlockRendererMixin.java +++ b/neoforge/src/main/java/dev/engine_room/flywheel/impl/mixin/neoforge/ModelBlockRendererMixin.java @@ -4,21 +4,19 @@ import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.Slice; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import com.llamalad7.mixinextras.sugar.Local; -import com.mojang.blaze3d.vertex.VertexConsumer; -import dev.engine_room.flywheel.lib.model.baked.NeoForgeMeshEmitter; import net.minecraft.client.renderer.block.ModelBlockRenderer; @Mixin(ModelBlockRenderer.class) abstract class ModelBlockRendererMixin { - @Inject(method = "tesselateAmbientOcclusion", at = @At(value = "FIELD", target = "net/minecraft/client/renderer/block/ModelBlockRenderer.DIRECTIONS : [Lnet/minecraft/core/Direction;", opcode = Opcodes.GETSTATIC), slice = @Slice(from = @At(value = "INVOKE", target = "Lnet/neoforged/neoforge/client/extensions/BlockModelPartExtension;getRenderType(Lnet/minecraft/world/level/block/state/BlockState;)Lnet/minecraft/client/renderer/chunk/ChunkSectionLayer;"))) - private void onTesselateWithAO(CallbackInfo ci, @Local VertexConsumer vertexConsumer, @Local(ordinal = 0, argsOnly = true) boolean ao) { - if (vertexConsumer instanceof NeoForgeMeshEmitter meshEmitter) { - meshEmitter.prepareForPart(ao); - } + @Inject(method = "tesselateAmbientOcclusion", at = @At(value = "FIELD", target = "net/minecraft/client/renderer/block/ModelBlockRenderer.DIRECTIONS : [Lnet/minecraft/core/Direction;", opcode = Opcodes.GETSTATIC)) + private void onTesselateWithAO(CallbackInfo ci, @Local(name = "ao") boolean ao) { + // TODO - IThundxr - This needs some thinking, reimplementing this isn't exactly easy at the moment +// if (vertexConsumer instanceof NeoForgeMeshEmitter meshEmitter) { +// meshEmitter.prepareForPart(ao); +// } } } From 0cba299983613606a95ef061be5135340b6b1712 Mon Sep 17 00:00:00 2001 From: IThundxr Date: Tue, 28 Apr 2026 22:40:01 -0400 Subject: [PATCH 43/59] Fix MinecartVisual --- .../vanillin/mixin/BlockModelSetAccessor.java | 16 ++++++++++++++ .../vanillin/visuals/MinecartVisual.java | 21 +++++++++++++++++-- .../vanillin/resources/vanillin.mixins.json | 1 + 3 files changed, 36 insertions(+), 2 deletions(-) create mode 100644 common/src/vanillin/java/dev/engine_room/vanillin/mixin/BlockModelSetAccessor.java diff --git a/common/src/vanillin/java/dev/engine_room/vanillin/mixin/BlockModelSetAccessor.java b/common/src/vanillin/java/dev/engine_room/vanillin/mixin/BlockModelSetAccessor.java new file mode 100644 index 000000000..fc531a9de --- /dev/null +++ b/common/src/vanillin/java/dev/engine_room/vanillin/mixin/BlockModelSetAccessor.java @@ -0,0 +1,16 @@ +package dev.engine_room.vanillin.mixin; + +import java.util.Map; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +import net.minecraft.client.renderer.block.BlockModelSet; +import net.minecraft.client.renderer.block.model.BlockModel; +import net.minecraft.world.level.block.state.BlockState; + +@Mixin(BlockModelSet.class) +public interface BlockModelSetAccessor { + @Accessor("blockModelByStateCache") + Map flywheel$getBlockModelByStateCache(); +} diff --git a/common/src/vanillin/java/dev/engine_room/vanillin/visuals/MinecartVisual.java b/common/src/vanillin/java/dev/engine_room/vanillin/visuals/MinecartVisual.java index 26c70852d..f79f5ba79 100644 --- a/common/src/vanillin/java/dev/engine_room/vanillin/visuals/MinecartVisual.java +++ b/common/src/vanillin/java/dev/engine_room/vanillin/visuals/MinecartVisual.java @@ -18,7 +18,10 @@ import dev.engine_room.flywheel.lib.visual.AbstractEntityVisual; import dev.engine_room.flywheel.lib.visual.SimpleDynamicVisual; import dev.engine_room.flywheel.lib.visual.SimpleTickableVisual; +import dev.engine_room.vanillin.mixin.BlockModelSetAccessor; +import net.minecraft.client.Minecraft; import net.minecraft.client.model.geom.ModelLayerLocation; +import net.minecraft.client.renderer.block.BlockModelSet; import net.minecraft.resources.Identifier; import net.minecraft.util.Mth; import net.minecraft.world.entity.vehicle.minecart.AbstractMinecart; @@ -30,7 +33,7 @@ import net.minecraft.world.phys.Vec3; public class MinecartVisual extends AbstractEntityVisual implements SimpleTickableVisual, SimpleDynamicVisual { - private static final Identifier TEXTURE = Identifier.withDefaultNamespace("textures/entity/minecart.png"); + private static final Identifier TEXTURE = Identifier.withDefaultNamespace("textures/entity/minecart/minecart.png"); private static final Material MATERIAL = SimpleMaterial.builder() .texture(TEXTURE) .mipmap(false) @@ -60,6 +63,10 @@ private TransformedInstance createContentsInstance() { RenderShape shape = blockState.getRenderShape(); if (shape == RenderShape.INVISIBLE) { + return null; + } + + if (hasSpecialRenderer(blockState)) { instances.visible(false); return null; } @@ -197,6 +204,16 @@ protected void _delete() { } public static boolean shouldSkipRender(AbstractMinecart minecart) { - return minecart.getDisplayBlockState().getRenderShape() != RenderShape.MODEL; + BlockState state = minecart.getDisplayBlockState(); + if (state.getRenderShape() == RenderShape.INVISIBLE) { + return true; + } else { + return !hasSpecialRenderer(state); + } + } + + private static boolean hasSpecialRenderer(BlockState state) { + BlockModelSet blockModelSet = Minecraft.getInstance().getModelManager().getBlockModelSet(); + return ((BlockModelSetAccessor) blockModelSet).flywheel$getBlockModelByStateCache().containsKey(state); } } diff --git a/common/src/vanillin/resources/vanillin.mixins.json b/common/src/vanillin/resources/vanillin.mixins.json index df13e4b26..f98a953ba 100644 --- a/common/src/vanillin/resources/vanillin.mixins.json +++ b/common/src/vanillin/resources/vanillin.mixins.json @@ -4,6 +4,7 @@ "package": "dev.engine_room.vanillin.mixin", "compatibilityLevel": "JAVA_25", "client": [ + "BlockModelSetAccessor", "ChestRendererAccessor" ], "injectors": { From 1ddc77eba78d208749c71b36fd53faa73e121ac4 Mon Sep 17 00:00:00 2001 From: IThundxr Date: Sun, 3 May 2026 22:22:29 -0400 Subject: [PATCH 44/59] Experimental AO changes --- .../backend/mixin/GlStateManagerMixin.java | 2 +- .../backend/mixin/RenderSystemMixin.java | 2 +- .../model/baked/BlockStateModelBufferer.java | 36 +++++++++++-------- .../baked/NeoForgeMeshEmitterManager.java | 5 ++- .../flywheel/impl/mixin/MinecraftMixin.java | 4 +-- .../neoforge/ModelBlockRendererMixin.java | 25 ++++++++++--- 6 files changed, 50 insertions(+), 24 deletions(-) diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/mixin/GlStateManagerMixin.java b/common/src/backend/java/dev/engine_room/flywheel/backend/mixin/GlStateManagerMixin.java index fda021bca..4fee1ac28 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/mixin/GlStateManagerMixin.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/mixin/GlStateManagerMixin.java @@ -10,7 +10,7 @@ import dev.engine_room.flywheel.backend.gl.GlStateTracker; import dev.engine_room.flywheel.backend.gl.buffer.GlBufferType; -@Mixin(value = GlStateManager.class, remap = false) +@Mixin(GlStateManager.class) abstract class GlStateManagerMixin { @Inject(method = "_glBindBuffer(II)V", at = @At("RETURN")) private static void flywheel$onBindBuffer(int target, int buffer, CallbackInfo ci) { diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/mixin/RenderSystemMixin.java b/common/src/backend/java/dev/engine_room/flywheel/backend/mixin/RenderSystemMixin.java index 75f5c20ac..9df88f3b2 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/mixin/RenderSystemMixin.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/mixin/RenderSystemMixin.java @@ -9,7 +9,7 @@ import dev.engine_room.flywheel.backend.gl.GlCompat; -@Mixin(value = RenderSystem.class, remap = false) +@Mixin(RenderSystem.class) abstract class RenderSystemMixin { @Inject(method = "initRenderer", at = @At("RETURN")) private static void flywheel$onInitRenderer(CallbackInfo ci) { diff --git a/neoforge/src/lib/java/dev/engine_room/flywheel/lib/model/baked/BlockStateModelBufferer.java b/neoforge/src/lib/java/dev/engine_room/flywheel/lib/model/baked/BlockStateModelBufferer.java index 8aaa7bd18..bbce84765 100644 --- a/neoforge/src/lib/java/dev/engine_room/flywheel/lib/model/baked/BlockStateModelBufferer.java +++ b/neoforge/src/lib/java/dev/engine_room/flywheel/lib/model/baked/BlockStateModelBufferer.java @@ -4,6 +4,7 @@ import java.util.Iterator; import java.util.List; +import org.jetbrains.annotations.ApiStatus.Internal; import org.jspecify.annotations.Nullable; import com.mojang.blaze3d.vertex.BufferBuilder; @@ -28,9 +29,12 @@ import net.minecraft.world.level.material.FluidState; import net.neoforged.neoforge.client.config.NeoForgeClientConfig; -final class BlockStateModelBufferer { +@Internal +public final class BlockStateModelBufferer { private static final ThreadLocal THREAD_LOCAL_OBJECTS = ThreadLocal.withInitial(ThreadLocalObjects::new); + public static final ScopedValue EMITTER_MANAGER = ScopedValue.newInstance(); + private BlockStateModelBufferer() { } @@ -66,12 +70,14 @@ public static SimpleModel bufferModel(BlockStateModel model, BlockPos pos, Block ModelBlockRenderer blockRenderer = new ModelBlockRenderer(useAo, true, blockColors); PoseStack finalPoseStack = poseStack; - blockRenderer.tesselateBlock((_, _, _, quad, instance) -> { - finalPoseStack.pushPose(); - ChunkSectionLayer layer = quad.materialInfo().layer(); - emitters.getEmitter(layer).putBakedQuad(finalPoseStack.last(), quad, instance); - finalPoseStack.popPose(); - }, 0, 0, 0, level, pos, state, model, seed); + ScopedValue.where(EMITTER_MANAGER, emitters).run(() -> + blockRenderer.tesselateBlock((_, _, _, quad, instance) -> { + finalPoseStack.pushPose(); + ChunkSectionLayer layer = quad.materialInfo().layer(); + emitters.getEmitter(layer).putBakedQuad(finalPoseStack.last(), quad, instance); + finalPoseStack.popPose(); + }, 0, 0, 0, level, pos, state, model, seed) + ); return emitters.end(); } @@ -144,13 +150,15 @@ public static SimpleModel bufferBlocks(Iterator posIterator, BlockAndT emitters.prepareForModel(ao); PoseStack finalPoseStack = poseStack; - blockRenderer.tesselateBlock((x, y, z, quad, instance) -> { - finalPoseStack.pushPose(); - finalPoseStack.translate(x, y, z); - ChunkSectionLayer layer = quad.materialInfo().layer(); - emitters.getEmitter(layer).putBakedQuad(finalPoseStack.last(), quad, instance); - finalPoseStack.popPose(); - }, pos.getX(), pos.getY(), pos.getZ(), level, pos, state, model, seed); + ScopedValue.where(EMITTER_MANAGER, emitters).run(() -> + blockRenderer.tesselateBlock((x, y, z, quad, instance) -> { + finalPoseStack.pushPose(); + finalPoseStack.translate(x, y, z); + ChunkSectionLayer layer = quad.materialInfo().layer(); + emitters.getEmitter(layer).putBakedQuad(finalPoseStack.last(), quad, instance); + finalPoseStack.popPose(); + }, pos.getX(), pos.getY(), pos.getZ(), level, pos, state, model, seed) + ); } } diff --git a/neoforge/src/lib/java/dev/engine_room/flywheel/lib/model/baked/NeoForgeMeshEmitterManager.java b/neoforge/src/lib/java/dev/engine_room/flywheel/lib/model/baked/NeoForgeMeshEmitterManager.java index 37fff6759..3b9f07001 100644 --- a/neoforge/src/lib/java/dev/engine_room/flywheel/lib/model/baked/NeoForgeMeshEmitterManager.java +++ b/neoforge/src/lib/java/dev/engine_room/flywheel/lib/model/baked/NeoForgeMeshEmitterManager.java @@ -2,11 +2,14 @@ import java.util.function.Function; +import org.jetbrains.annotations.ApiStatus.Internal; + import com.mojang.blaze3d.vertex.VertexConsumer; import net.minecraft.client.renderer.chunk.ChunkSectionLayer; -class NeoForgeMeshEmitterManager extends MeshEmitterManager implements Function { +@Internal +public class NeoForgeMeshEmitterManager extends MeshEmitterManager implements Function { NeoForgeMeshEmitterManager() { super(NeoForgeMeshEmitter::new); } diff --git a/neoforge/src/main/java/dev/engine_room/flywheel/impl/mixin/MinecraftMixin.java b/neoforge/src/main/java/dev/engine_room/flywheel/impl/mixin/MinecraftMixin.java index 0bea1528d..2c6f42597 100644 --- a/neoforge/src/main/java/dev/engine_room/flywheel/impl/mixin/MinecraftMixin.java +++ b/neoforge/src/main/java/dev/engine_room/flywheel/impl/mixin/MinecraftMixin.java @@ -28,12 +28,12 @@ abstract class MinecraftMixin { FlwImpl.freezeRegistries(); } - @Inject(method = "lambda$new$4", at = @At("HEAD"), remap = false) + @Inject(method = "lambda$new$4", at = @At("HEAD")) private void flywheel$onEndInitialResourceReload(@Coerce Object gameLoadCookie, Optional error, CallbackInfo ci) { ModLoader.postEvent(new EndClientResourceReloadEvent((Minecraft) (Object) this, resourceManager, true, error)); } - @Inject(method = "lambda$reloadResourcePacks$0", at = @At("HEAD"), remap = false) + @Inject(method = "lambda$reloadResourcePacks$0", at = @At("HEAD")) private void flywheel$onEndManualResourceReload(boolean recovery, @Coerce Object gameLoadCookie, CompletableFuture completablefuture, Optional error, CallbackInfo ci) { ModLoader.postEvent(new EndClientResourceReloadEvent((Minecraft) (Object) this, resourceManager, false, error)); } diff --git a/neoforge/src/main/java/dev/engine_room/flywheel/impl/mixin/neoforge/ModelBlockRendererMixin.java b/neoforge/src/main/java/dev/engine_room/flywheel/impl/mixin/neoforge/ModelBlockRendererMixin.java index 997398858..eb7c3f52a 100644 --- a/neoforge/src/main/java/dev/engine_room/flywheel/impl/mixin/neoforge/ModelBlockRendererMixin.java +++ b/neoforge/src/main/java/dev/engine_room/flywheel/impl/mixin/neoforge/ModelBlockRendererMixin.java @@ -1,5 +1,7 @@ package dev.engine_room.flywheel.impl.mixin.neoforge; +import java.util.List; + import org.objectweb.asm.Opcodes; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; @@ -8,15 +10,28 @@ import com.llamalad7.mixinextras.sugar.Local; +import dev.engine_room.flywheel.lib.model.baked.BlockStateModelBufferer; +import dev.engine_room.flywheel.lib.model.baked.NeoForgeMeshEmitter; +import dev.engine_room.flywheel.lib.model.baked.NeoForgeMeshEmitterManager; import net.minecraft.client.renderer.block.ModelBlockRenderer; +import net.minecraft.client.renderer.block.dispatch.BlockStateModelPart; +import net.minecraft.client.renderer.chunk.ChunkSectionLayer; +import net.minecraft.client.resources.model.geometry.BakedQuad; @Mixin(ModelBlockRenderer.class) abstract class ModelBlockRendererMixin { @Inject(method = "tesselateAmbientOcclusion", at = @At(value = "FIELD", target = "net/minecraft/client/renderer/block/ModelBlockRenderer.DIRECTIONS : [Lnet/minecraft/core/Direction;", opcode = Opcodes.GETSTATIC)) - private void onTesselateWithAO(CallbackInfo ci, @Local(name = "ao") boolean ao) { - // TODO - IThundxr - This needs some thinking, reimplementing this isn't exactly easy at the moment -// if (vertexConsumer instanceof NeoForgeMeshEmitter meshEmitter) { -// meshEmitter.prepareForPart(ao); -// } + private void onTesselateWithAO(CallbackInfo ci, @Local(name = "part") BlockStateModelPart part, @Local(name = "ao") boolean ao) { + ScopedValue value = BlockStateModelBufferer.EMITTER_MANAGER; + if (value.isBound()) { + List quads = part.getQuads(null); + + if (!quads.isEmpty()) { + ChunkSectionLayer layer = quads.getFirst().materialInfo().layer(); + NeoForgeMeshEmitter meshEmitter = value.get().getEmitter(layer); + + meshEmitter.prepareForPart(ao); + } + } } } From 226f2455ab81fa6d04a847e13a7070943e8f9d35 Mon Sep 17 00:00:00 2001 From: IThundxr Date: Tue, 5 May 2026 16:05:31 -0400 Subject: [PATCH 45/59] Fix MinecartVisual not null-checking frontPos and backPos --- .../vanillin/visuals/MinecartVisual.java | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/common/src/vanillin/java/dev/engine_room/vanillin/visuals/MinecartVisual.java b/common/src/vanillin/java/dev/engine_room/vanillin/visuals/MinecartVisual.java index f79f5ba79..a1b833fd4 100644 --- a/common/src/vanillin/java/dev/engine_room/vanillin/visuals/MinecartVisual.java +++ b/common/src/vanillin/java/dev/engine_room/vanillin/visuals/MinecartVisual.java @@ -167,12 +167,14 @@ private void oldRender(float partialTick, OldMinecartBehavior behavior, double p Vec3 frontPos = behavior.getPosOffs(posX, posY, posZ, 0.3F); Vec3 backPos = behavior.getPosOffs(posX, posY, posZ, -0.3F); - stack.translate((float) (pos.x - posX), (float) ((frontPos.y + backPos.y) / 2.0D - posY), (float) (pos.z - posZ)); - Vec3 vec = backPos.add(-frontPos.x, -frontPos.y, -frontPos.z); - if (vec.length() != 0.0D) { - vec = vec.normalize(); - yaw = (float) (Math.atan2(vec.z, vec.x) * 180.0D / Math.PI); - pitch = (float) (Math.atan(vec.y) * 73.0D); + if (frontPos != null && backPos != null) { + stack.translate((float) (pos.x - posX), (float) ((frontPos.y + backPos.y) / 2.0D - posY), (float) (pos.z - posZ)); + Vec3 vec = backPos.add(-frontPos.x, -frontPos.y, -frontPos.z); + if (vec.length() != 0.0D) { + vec = vec.normalize(); + yaw = (float) (Math.atan2(vec.z, vec.x) * 180.0D / Math.PI); + pitch = (float) (Math.atan(vec.y) * 73.0D); + } } } From c267d86eaf11a2a1fd31194a16838f804f6b3493 Mon Sep 17 00:00:00 2001 From: IThundxr Date: Tue, 5 May 2026 16:07:12 -0400 Subject: [PATCH 46/59] Switch to AltModelBlockRenderer and Fix normals not being included in MeshEmitter output --- .../flywheel/lib/model/baked/MeshEmitter.java | 8 ++-- .../lib/vertex/FlywheelVertexFormats.java | 17 +++++++ .../model/baked/BlockStateModelBufferer.java | 37 +++++++++------ .../model/baked/FabricMeshEmitterManager.java | 46 +------------------ 4 files changed, 45 insertions(+), 63 deletions(-) create mode 100644 common/src/lib/java/dev/engine_room/flywheel/lib/vertex/FlywheelVertexFormats.java diff --git a/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/MeshEmitter.java b/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/MeshEmitter.java index 094af2030..a21379c64 100644 --- a/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/MeshEmitter.java +++ b/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/MeshEmitter.java @@ -6,14 +6,15 @@ import org.jspecify.annotations.Nullable; import com.google.common.collect.ImmutableList; -import com.mojang.blaze3d.pipeline.RenderPipeline; import com.mojang.blaze3d.vertex.BufferBuilder; import com.mojang.blaze3d.vertex.ByteBufferBuilder; import com.mojang.blaze3d.vertex.VertexConsumer; +import com.mojang.blaze3d.vertex.VertexFormat.Mode; import dev.engine_room.flywheel.api.material.Material; import dev.engine_room.flywheel.api.model.Mesh; import dev.engine_room.flywheel.api.model.Model; +import dev.engine_room.flywheel.lib.vertex.FlywheelVertexFormats; import net.minecraft.client.renderer.chunk.ChunkSectionLayer; abstract class MeshEmitter implements VertexConsumer { @@ -91,10 +92,7 @@ public BufferBuilder getBuffer(Material material) { } ByteBufferBuilder byteBufferBuilder = byteBufferBuilderStack.nextOrCreate(); - - // Trust that the RenderType mode/format don't change out from underneath us. - RenderPipeline pipeline = chunkSectionLayer.pipeline(); - BufferBuilder bufferBuilder = new BufferBuilder(byteBufferBuilder, pipeline.getVertexFormatMode(), pipeline.getVertexFormat()); + BufferBuilder bufferBuilder = new BufferBuilder(byteBufferBuilder, Mode.QUADS, FlywheelVertexFormats.BLOCK_VERTEX_FORMAT); // currentIndex == numBufferBuildersPopulated here. materials[currentIndex] = material; diff --git a/common/src/lib/java/dev/engine_room/flywheel/lib/vertex/FlywheelVertexFormats.java b/common/src/lib/java/dev/engine_room/flywheel/lib/vertex/FlywheelVertexFormats.java new file mode 100644 index 000000000..6459664e4 --- /dev/null +++ b/common/src/lib/java/dev/engine_room/flywheel/lib/vertex/FlywheelVertexFormats.java @@ -0,0 +1,17 @@ +package dev.engine_room.flywheel.lib.vertex; + +import com.mojang.blaze3d.vertex.DefaultVertexFormat; +import com.mojang.blaze3d.vertex.VertexFormat; +import com.mojang.blaze3d.vertex.VertexFormatElement; + +public class FlywheelVertexFormats { + /// Basically the same as {@link DefaultVertexFormat#BLOCK} but with the normals included + public static final VertexFormat BLOCK_VERTEX_FORMAT = VertexFormat.builder() + .add("Position", VertexFormatElement.POSITION) + .add("Color",VertexFormatElement.COLOR) + .add("UV0",VertexFormatElement.UV0) + .add("UV2",VertexFormatElement.UV2) + .add("Normal", VertexFormatElement.NORMAL) + .padding(1) + .build(); +} diff --git a/fabric/src/lib/java/dev/engine_room/flywheel/lib/model/baked/BlockStateModelBufferer.java b/fabric/src/lib/java/dev/engine_room/flywheel/lib/model/baked/BlockStateModelBufferer.java index 370e0d36d..eac0001af 100644 --- a/fabric/src/lib/java/dev/engine_room/flywheel/lib/model/baked/BlockStateModelBufferer.java +++ b/fabric/src/lib/java/dev/engine_room/flywheel/lib/model/baked/BlockStateModelBufferer.java @@ -8,15 +8,18 @@ import com.mojang.blaze3d.vertex.PoseStack; import dev.engine_room.flywheel.lib.model.SimpleModel; +import net.fabricmc.fabric.api.client.renderer.v1.Renderer; +import net.fabricmc.fabric.api.client.renderer.v1.mesh.QuadEmitter; +import net.fabricmc.fabric.api.client.renderer.v1.render.AltModelBlockRenderer; import net.minecraft.client.Minecraft; import net.minecraft.client.color.block.BlockColors; import net.minecraft.client.renderer.block.BlockAndTintGetter; import net.minecraft.client.renderer.block.BlockModelLighter; import net.minecraft.client.renderer.block.FluidRenderer; -import net.minecraft.client.renderer.block.ModelBlockRenderer; import net.minecraft.client.renderer.block.dispatch.BlockStateModel; import net.minecraft.client.renderer.chunk.ChunkSectionLayer; import net.minecraft.client.renderer.state.GameRenderState; +import net.minecraft.client.renderer.texture.OverlayTexture; import net.minecraft.client.resources.model.ModelManager; import net.minecraft.core.BlockPos; import net.minecraft.world.level.block.RenderShape; @@ -47,17 +50,21 @@ public static SimpleModel bufferModel(BlockStateModel model, BlockPos pos, Block // See ModelBlockRenderer#tesselateBlock boolean useAo = gameRenderState.optionsRenderState.ambientOcclusion; boolean defaultAo = useAo && state.getLightEmission() == 0; - model = emitters.prepareForModel(model, useAo, defaultAo); + emitters.prepareForModel(useAo, defaultAo); - ModelBlockRenderer blockRenderer = new ModelBlockRenderer(useAo, true, blockColors); + AltModelBlockRenderer altModelBlockRenderer = Renderer.get().altModelBlockRenderer(useAo, true, blockColors); PoseStack finalPoseStack = poseStack; - blockRenderer.tesselateBlock((_, _, _, quad, instance) -> { + QuadEmitter quadEmitter = Renderer.get().quadEmitter((quad) -> { finalPoseStack.pushPose(); - ChunkSectionLayer layer = quad.materialInfo().layer(); - emitters.getEmitter(layer).putBakedQuad(finalPoseStack.last(), quad, instance); + ChunkSectionLayer layer = quad.chunkLayer(); + FabricMeshEmitter emitter = emitters.getEmitter(layer); + emitters.prepareForGeometry(quad); + quad.buffer(OverlayTexture.NO_OVERLAY, finalPoseStack.last(), emitter); finalPoseStack.popPose(); - }, 0, 0, 0, level, pos, state, model, seed); + }); + + altModelBlockRenderer.tesselateBlock(quadEmitter, 0, 0, 0, level, pos, state, model, seed); return emitters.end(); } @@ -80,7 +87,7 @@ public static SimpleModel bufferBlocks(Iterator posIterator, BlockAndT boolean useAo = gameRenderState.optionsRenderState.ambientOcclusion; BlockColors blockColors = minecraft.getBlockColors(); - ModelBlockRenderer blockRenderer = new ModelBlockRenderer(useAo, true, blockColors); + AltModelBlockRenderer altModelBlockRenderer = Renderer.get().altModelBlockRenderer(useAo, true, blockColors); FluidRenderer fluidRenderer = new FluidRenderer(modelManager.getFluidStateModelSet()); while (posIterator.hasNext()) { @@ -116,16 +123,18 @@ public static SimpleModel bufferBlocks(Iterator posIterator, BlockAndT // See ModelBlockRenderer#tesselateBlock boolean defaultAo = useAo && state.getLightEmission() == 0; - model = emitters.prepareForModel(model, useAo, defaultAo); + emitters.prepareForModel(useAo, defaultAo); PoseStack finalPoseStack = poseStack; - blockRenderer.tesselateBlock((x, y, z, quad, instance) -> { + QuadEmitter quadEmitter = Renderer.get().quadEmitter((quad) -> { finalPoseStack.pushPose(); - finalPoseStack.translate(x, y, z); - ChunkSectionLayer layer = quad.materialInfo().layer(); - emitters.getEmitter(layer).putBakedQuad(finalPoseStack.last(), quad, instance); + ChunkSectionLayer layer = quad.chunkLayer(); + FabricMeshEmitter emitter = emitters.getEmitter(layer); + emitters.prepareForGeometry(quad); + quad.buffer(OverlayTexture.NO_OVERLAY, finalPoseStack.last(), emitter); finalPoseStack.popPose(); - }, pos.getX(), pos.getY(), pos.getZ(), level, pos, state, model, seed); + }); + altModelBlockRenderer.tesselateBlock(quadEmitter, pos.getX(), pos.getY(), pos.getZ(), level, pos, state, model, seed); } } diff --git a/fabric/src/lib/java/dev/engine_room/flywheel/lib/model/baked/FabricMeshEmitterManager.java b/fabric/src/lib/java/dev/engine_room/flywheel/lib/model/baked/FabricMeshEmitterManager.java index b73e65014..5f4ba5832 100644 --- a/fabric/src/lib/java/dev/engine_room/flywheel/lib/model/baked/FabricMeshEmitterManager.java +++ b/fabric/src/lib/java/dev/engine_room/flywheel/lib/model/baked/FabricMeshEmitterManager.java @@ -1,25 +1,9 @@ package dev.engine_room.flywheel.lib.model.baked; -import java.util.function.Predicate; - -import org.jspecify.annotations.Nullable; - -import dev.engine_room.flywheel.lib.model.SimpleModel; -import net.fabricmc.fabric.api.client.model.loading.v1.wrapper.WrapperBlockStateModel; -import net.fabricmc.fabric.api.client.renderer.v1.mesh.QuadEmitter; -import net.fabricmc.fabric.api.client.renderer.v1.mesh.QuadTransform; import net.fabricmc.fabric.api.client.renderer.v1.mesh.QuadView; import net.fabricmc.fabric.api.util.TriState; -import net.minecraft.client.renderer.block.BlockAndTintGetter; -import net.minecraft.client.renderer.block.dispatch.BlockStateModel; -import net.minecraft.core.BlockPos; -import net.minecraft.core.Direction; -import net.minecraft.util.RandomSource; -import net.minecraft.world.level.block.state.BlockState; class FabricMeshEmitterManager extends MeshEmitterManager { - private final WrapperModel wrapperModel = new WrapperModel(); - private boolean useAo; private boolean defaultAo; @@ -27,20 +11,12 @@ class FabricMeshEmitterManager extends MeshEmitterManager { super(FabricMeshEmitter::new); } - public BlockStateModel prepareForModel(BlockStateModel model, boolean useAo, boolean defaultAo) { + public void prepareForModel(boolean useAo, boolean defaultAo) { this.useAo = useAo; this.defaultAo = defaultAo; - wrapperModel.setWrapped(model); - return wrapperModel; } - @Override - public SimpleModel end() { - wrapperModel.setWrapped(null); - return super.end(); - } - - private void prepareForGeometry(QuadView quad) { + public void prepareForGeometry(QuadView quad) { boolean shade = quad.diffuseShade(); TriState aoMode = quad.ambientOcclusion(); boolean ao = useAo && aoMode.orElse(defaultAo); @@ -49,22 +25,4 @@ private void prepareForGeometry(QuadView quad) { emitter.prepareForGeometry(shade, ao); } } - - private class WrapperModel extends WrapperBlockStateModel { - private final QuadTransform quadTransform = quad -> { - FabricMeshEmitterManager.this.prepareForGeometry(quad); - return true; - }; - - public void setWrapped(@Nullable BlockStateModel wrapped) { - this.wrapped = wrapped; - } - - @Override - public void emitQuads(QuadEmitter emitter, BlockAndTintGetter blockView, BlockPos pos, BlockState state, RandomSource random, Predicate<@Nullable Direction> cullTest) { - emitter.pushTransform(quadTransform); - super.emitQuads(emitter, blockView, pos, state, random, cullTest); - emitter.popTransform(); - } - } } From 05d5868c65ef5e06bab38b0edea42ff1fdc0be47 Mon Sep 17 00:00:00 2001 From: IThundxr Date: Tue, 5 May 2026 16:12:16 -0400 Subject: [PATCH 47/59] Fix build workflow --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 7adaf4492..77dc18dec 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -31,7 +31,7 @@ jobs: - name: Build # Doesn't actually publish, as no secrets are passed in, just makes sure that publishing works # Also generate the mod jars for the test job - run: ./gradlew remapTestModJar publish --no-daemon + run: ./gradlew testModJar publish --no-daemon - name: Capture Build Artifacts uses: actions/upload-artifact@v4 From 64889d560e0221b5a8f8384cab10cd0fbaa0a60f Mon Sep 17 00:00:00 2001 From: IThundxr Date: Tue, 5 May 2026 17:07:28 -0400 Subject: [PATCH 48/59] Improve per part AO mixin --- .../neoforge/ModelBlockRendererMixin.java | 28 +++++++++---------- 1 file changed, 13 insertions(+), 15 deletions(-) diff --git a/neoforge/src/main/java/dev/engine_room/flywheel/impl/mixin/neoforge/ModelBlockRendererMixin.java b/neoforge/src/main/java/dev/engine_room/flywheel/impl/mixin/neoforge/ModelBlockRendererMixin.java index eb7c3f52a..e9c123f4d 100644 --- a/neoforge/src/main/java/dev/engine_room/flywheel/impl/mixin/neoforge/ModelBlockRendererMixin.java +++ b/neoforge/src/main/java/dev/engine_room/flywheel/impl/mixin/neoforge/ModelBlockRendererMixin.java @@ -1,37 +1,35 @@ package dev.engine_room.flywheel.impl.mixin.neoforge; -import java.util.List; - -import org.objectweb.asm.Opcodes; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import com.llamalad7.mixinextras.injector.wrapoperation.Operation; +import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; import com.llamalad7.mixinextras.sugar.Local; import dev.engine_room.flywheel.lib.model.baked.BlockStateModelBufferer; import dev.engine_room.flywheel.lib.model.baked.NeoForgeMeshEmitter; import dev.engine_room.flywheel.lib.model.baked.NeoForgeMeshEmitterManager; +import net.minecraft.client.renderer.block.BlockAndTintGetter; +import net.minecraft.client.renderer.block.BlockQuadOutput; import net.minecraft.client.renderer.block.ModelBlockRenderer; -import net.minecraft.client.renderer.block.dispatch.BlockStateModelPart; import net.minecraft.client.renderer.chunk.ChunkSectionLayer; import net.minecraft.client.resources.model.geometry.BakedQuad; +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.block.state.BlockState; @Mixin(ModelBlockRenderer.class) abstract class ModelBlockRendererMixin { - @Inject(method = "tesselateAmbientOcclusion", at = @At(value = "FIELD", target = "net/minecraft/client/renderer/block/ModelBlockRenderer.DIRECTIONS : [Lnet/minecraft/core/Direction;", opcode = Opcodes.GETSTATIC)) - private void onTesselateWithAO(CallbackInfo ci, @Local(name = "part") BlockStateModelPart part, @Local(name = "ao") boolean ao) { + @WrapOperation(method = "tesselateAmbientOcclusion", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/renderer/block/ModelBlockRenderer;putQuadWithTint(Lnet/minecraft/client/renderer/block/BlockQuadOutput;FFFLnet/minecraft/client/renderer/block/BlockAndTintGetter;Lnet/minecraft/world/level/block/state/BlockState;Lnet/minecraft/core/BlockPos;Lnet/minecraft/client/resources/model/geometry/BakedQuad;)V")) + private void onTesselateWithAO(ModelBlockRenderer instance, BlockQuadOutput output, float x, float y, float z, BlockAndTintGetter level, BlockState state, BlockPos pos, BakedQuad quad, Operation original, @Local(name = "ao") boolean ao) { ScopedValue value = BlockStateModelBufferer.EMITTER_MANAGER; if (value.isBound()) { - List quads = part.getQuads(null); - - if (!quads.isEmpty()) { - ChunkSectionLayer layer = quads.getFirst().materialInfo().layer(); - NeoForgeMeshEmitter meshEmitter = value.get().getEmitter(layer); + ChunkSectionLayer layer = quad.materialInfo().layer(); + NeoForgeMeshEmitter meshEmitter = value.get().getEmitter(layer); - meshEmitter.prepareForPart(ao); - } + meshEmitter.prepareForPart(ao); } + + original.call(instance, output, x, y, z, level, state, pos, quad); } } From 5fc94bcd352e66b4341566c75f0d8cc2ba247225 Mon Sep 17 00:00:00 2001 From: IThundxr Date: Tue, 5 May 2026 17:15:11 -0400 Subject: [PATCH 49/59] Fix build workflow, remove old TODOs --- .github/workflows/build.yml | 2 +- .../dev/engine_room/flywheel/backend/LayoutAttributes.java | 3 --- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 77dc18dec..f9807850a 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -74,7 +74,7 @@ jobs: # Lock to a specific commit, it would be bad if the tag is re-pushed with unwanted changes - name: Run the MC client - uses: 3arthqu4ke/mc-runtime-test@e72f8fe1134aabf6fc749a2a8c09bb56dd7d283e + uses: headlesshq/mc-runtime-test@9d9ea4af8ef6d82648051f750c49905f75d0c3bb with: mc: ${{ env.MINECRAFT_VERSION }} modloader: ${{ matrix.loader }} diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/LayoutAttributes.java b/common/src/backend/java/dev/engine_room/flywheel/backend/LayoutAttributes.java index 8ff1eea66..ca0a71fc4 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/LayoutAttributes.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/LayoutAttributes.java @@ -80,7 +80,6 @@ private static void array(List out, ArrayElementType array) { } } - // TODO 1.21.11: Is there a better way to do this perhaps? private static VertexFormatElement.Type toGlType(IntegerRepr repr) { return switch (repr) { case BYTE -> VertexFormatElement.Type.BYTE; @@ -89,7 +88,6 @@ private static VertexFormatElement.Type toGlType(IntegerRepr repr) { }; } - // TODO 1.21.11: Is there a better way to do this perhaps? private static VertexFormatElement.Type toGlType(UnsignedIntegerRepr repr) { return switch (repr) { case UNSIGNED_BYTE -> VertexFormatElement.Type.UBYTE; @@ -98,7 +96,6 @@ private static VertexFormatElement.Type toGlType(UnsignedIntegerRepr repr) { }; } - // TODO 1.21.11: Is there a better way to do this perhaps? private static VertexFormatElement.Type toGlType(FloatRepr repr) { return switch (repr) { case BYTE, NORMALIZED_BYTE -> VertexFormatElement.Type.BYTE; From 6eff4e3835cd6db478fa082124ffcfb3f2eb4a62 Mon Sep 17 00:00:00 2001 From: IThundxr Date: Tue, 5 May 2026 17:46:32 -0400 Subject: [PATCH 50/59] Fix some more TODOs --- .../engine_room/vanillin/mixin/ChestRendererAccessor.java | 4 +++- .../dev/engine_room/vanillin/visuals/ChestVisual.java | 5 +---- .../flywheel/impl/mixin/fabric/MinecraftMixin.java | 8 +++++++- 3 files changed, 11 insertions(+), 6 deletions(-) diff --git a/common/src/vanillin/java/dev/engine_room/vanillin/mixin/ChestRendererAccessor.java b/common/src/vanillin/java/dev/engine_room/vanillin/mixin/ChestRendererAccessor.java index fc01a7875..754e65302 100644 --- a/common/src/vanillin/java/dev/engine_room/vanillin/mixin/ChestRendererAccessor.java +++ b/common/src/vanillin/java/dev/engine_room/vanillin/mixin/ChestRendererAccessor.java @@ -10,5 +10,7 @@ @Mixin(ChestRenderer.class) public interface ChestRendererAccessor { @Invoker("getChestMaterial") - ChestRenderState.ChestMaterialType flywheel$getChestMaterial(BlockEntity blockEntity, boolean xmasTextures); + static ChestRenderState.ChestMaterialType flywheel$getChestMaterial(BlockEntity blockEntity, boolean xmasTextures) { + throw new AssertionError(); + } } diff --git a/common/src/vanillin/java/dev/engine_room/vanillin/visuals/ChestVisual.java b/common/src/vanillin/java/dev/engine_room/vanillin/visuals/ChestVisual.java index e07e69e06..0ac569f78 100644 --- a/common/src/vanillin/java/dev/engine_room/vanillin/visuals/ChestVisual.java +++ b/common/src/vanillin/java/dev/engine_room/vanillin/visuals/ChestVisual.java @@ -20,7 +20,6 @@ import dev.engine_room.vanillin.mixin.ChestRendererAccessor; import it.unimi.dsi.fastutil.floats.Float2FloatFunction; import it.unimi.dsi.fastutil.longs.LongSet; -import net.minecraft.client.Minecraft; import net.minecraft.client.model.geom.ModelLayerLocation; import net.minecraft.client.model.geom.ModelLayers; import net.minecraft.client.renderer.LevelRenderer; @@ -76,10 +75,8 @@ public ChestVisual(VisualizationContext ctx, T blockEntity, float partialTick) { Block block = blockState.getBlock(); if (block instanceof AbstractChestBlock chestBlock) { ChestType chestType = blockState.hasProperty(ChestBlock.TYPE) ? blockState.getValue(ChestBlock.TYPE) : ChestType.SINGLE; - // TODO 1.21.11: should we be using unchecked casts here? - ChestRenderer renderer = (ChestRenderer) Minecraft.getInstance().getBlockEntityRenderDispatcher().getRenderer(blockEntity); SpriteId texture = Sheets.chooseSprite( - ((ChestRendererAccessor) renderer).flywheel$getChestMaterial(blockEntity, ChestRenderer.xmasTextures()), + ChestRendererAccessor.flywheel$getChestMaterial(blockEntity, ChestRenderer.xmasTextures()), chestType ); instances = InstanceTree.create(instancerProvider(), ModelTrees.of(LAYER_LOCATIONS.get(chestType), texture, MATERIAL)); diff --git a/fabric/src/main/java/dev/engine_room/flywheel/impl/mixin/fabric/MinecraftMixin.java b/fabric/src/main/java/dev/engine_room/flywheel/impl/mixin/fabric/MinecraftMixin.java index 13e854d34..9a4ecf2ad 100644 --- a/fabric/src/main/java/dev/engine_room/flywheel/impl/mixin/fabric/MinecraftMixin.java +++ b/fabric/src/main/java/dev/engine_room/flywheel/impl/mixin/fabric/MinecraftMixin.java @@ -10,7 +10,6 @@ import net.minecraft.client.Minecraft; import net.minecraft.client.multiplayer.ClientLevel; -// TODO 1.21.11: This mixin currently matches NeoForge's LevelEvent.Unload, but it may be a bug that it is not fired from Minecraft.clearClientLevel. @Mixin(Minecraft.class) abstract class MinecraftMixin { @Shadow @@ -29,4 +28,11 @@ abstract class MinecraftMixin { LevelAttached.invalidateLevel(level); } } + + @Inject(method = "clearClientLevel", at = @At("HEAD")) + private void flywheel$onClearClientLevel(CallbackInfo ci) { + if (level != null) { + LevelAttached.invalidateLevel(level); + } + } } From bbbe05fa7d8d35df9443a374346f8cdb7f7550f7 Mon Sep 17 00:00:00 2001 From: IThundxr Date: Tue, 5 May 2026 17:56:44 -0400 Subject: [PATCH 51/59] Update to 26.1.2 --- common/build.gradle.kts | 4 +++- gradle/libs.versions.toml | 12 ++++++------ 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/common/build.gradle.kts b/common/build.gradle.kts index 2e849a9d4..01fea2101 100644 --- a/common/build.gradle.kts +++ b/common/build.gradle.kts @@ -92,7 +92,9 @@ dependencies { compileOnly(annotationProcessor("io.github.llamalad7:mixinextras-common:0.4.1")!!) - testImplementation("org.junit.jupiter:junit-jupiter:5.8.1") + testImplementation(platform("org.junit:junit-bom:6.0.3")) + testImplementation("org.junit.jupiter:junit-jupiter") + testRuntimeOnly("org.junit.platform:junit-platform-launcher") } tasks.test { diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index bc0bdc706..12f8af74e 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,21 +1,21 @@ [versions] -minecraft = "26.1.1" +minecraft = "26.1.2" # https://neoforged.net/ -neoforge = "26.1.1.1-beta" +neoforge = "26.1.2.41-beta" mdg = "2.0.+" # https://fabricmc.net/develop/ -loom = "1.15.+" -fabric-loader = "0.18.5" -fabric-api = "0.145.3+26.1.1" +loom = "1.16.+" +fabric-loader = "0.19.2" +fabric-api = "0.148.0+26.1.2" # we need to manually depend on mixin (+extras) in common mixin = "0.16.5+mixin.0.8.7" mixin-extras = "0.5.3" # https://maven.caffeinemc.net/#/releases/net/caffeinemc/sodium-fabric -sodium = "0.8.9+mc26.1.1" +sodium = "0.8.10+mc26.1.2" # https://modrinth.com/mod/iris/versions iris = "1.10.9+26.1" From 837cbbce43dee33ff9c0f8eb144ce7f1761cd10b Mon Sep 17 00:00:00 2001 From: IThundxr Date: Thu, 7 May 2026 19:46:35 -0400 Subject: [PATCH 52/59] Fix crumbling overlay being blurry --- .../backend/engine/CommonCrumbling.java | 2 +- .../backend/engine/MaterialRenderState.java | 4 +- .../backend/engine/TextureBinder.java | 49 +++++++++---------- .../engine/indirect/IndirectDrawManager.java | 11 ++++- .../instancing/InstancedDrawManager.java | 10 +++- 5 files changed, 43 insertions(+), 33 deletions(-) diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/engine/CommonCrumbling.java b/common/src/backend/java/dev/engine_room/flywheel/backend/engine/CommonCrumbling.java index b636c8aa1..e64a7dddf 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/engine/CommonCrumbling.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/engine/CommonCrumbling.java @@ -16,7 +16,7 @@ public static void applyCrumblingProperties(SimpleMaterial.Builder crumblingMate .cutout(CutoutShaders.ONE_TENTH) .light(LightShaders.SMOOTH_WHEN_EMBEDDED) .polygonOffset(true) - .transparency(Transparency.CRUMBLING) + .transparency(Transparency.OPAQUE) .writeMask(WriteMask.COLOR) .useOverlay(false) .useLight(false) diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/engine/MaterialRenderState.java b/common/src/backend/java/dev/engine_room/flywheel/backend/engine/MaterialRenderState.java index 3eb09f2e5..c6556e7b9 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/engine/MaterialRenderState.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/engine/MaterialRenderState.java @@ -56,11 +56,11 @@ private static void setupTexture(Material material) { // TODO 1.21.11: give the Material more control, such as using default filter mode, address modes, AF, max LOD? FilterMode filterMode = material.blur() ? FilterMode.LINEAR : FilterMode.NEAREST; GpuSampler defaultSampler = texture.getSampler(); - GlSampler sampler = (GlSampler) RenderSystem.getSamplerCache() + GpuSampler sampler = RenderSystem.getSamplerCache() .getSampler(defaultSampler.getAddressModeU(), defaultSampler.getAddressModeV(), filterMode, filterMode, material.mipmap()); /// TODO 1.21.11: should cubemap textures be allowed? - TextureBinder.bind(Samplers.DIFFUSE.number, (GlTextureView) texture.getTextureView(), sampler); + TextureBinder.bind(Samplers.DIFFUSE.number, texture.getTextureView(), sampler); } private static void setupBackfaceCulling(boolean backfaceCulling) { diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/engine/TextureBinder.java b/common/src/backend/java/dev/engine_room/flywheel/backend/engine/TextureBinder.java index 2847db585..f42cbf0dd 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/engine/TextureBinder.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/engine/TextureBinder.java @@ -1,16 +1,21 @@ package dev.engine_room.flywheel.backend.engine; +import java.util.Collections; + +import org.jspecify.annotations.Nullable; import org.lwjgl.opengl.GL33C; import com.mojang.blaze3d.opengl.GlConst; +import com.mojang.blaze3d.opengl.GlDevice; import com.mojang.blaze3d.opengl.GlSampler; import com.mojang.blaze3d.opengl.GlStateManager; import com.mojang.blaze3d.opengl.GlTexture; -import com.mojang.blaze3d.opengl.GlTextureView; import com.mojang.blaze3d.pipeline.RenderTarget; import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.textures.FilterMode; +import com.mojang.blaze3d.textures.GpuSampler; import com.mojang.blaze3d.textures.GpuTexture; +import com.mojang.blaze3d.textures.GpuTextureView; import dev.engine_room.flywheel.backend.Samplers; import dev.engine_room.flywheel.backend.gl.GlUtil; @@ -18,15 +23,19 @@ import net.minecraft.resources.Identifier; public class TextureBinder { - // TODO 1.21.11 - public static void bind(Identifier id) { - GlStateManager._bindTexture(byName(id)); + public static void bind(int unit, Identifier textureId, @Nullable GpuSampler sampler) { + GpuTextureView texture = Minecraft.getInstance() + .getTextureManager() + .getTexture(textureId) + .getTextureView(); + + bind(unit, texture, sampler); } // Taken from GlCommandEncoder.trySetup - public static void bind(int unit, GlTextureView textureView, GlSampler sampler) { + public static void bind(int unit, GpuTextureView textureView, @Nullable GpuSampler sampler) { GlStateManager._activeTexture(GlConst.GL_TEXTURE0 + unit); - GlTexture texture = textureView.texture(); + GlTexture texture = (GlTexture) textureView.texture(); int i; if ((texture.usage() & GpuTexture.USAGE_CUBEMAP_COMPATIBLE) != 0) { i = GL33C.GL_TEXTURE_CUBE_MAP; @@ -36,16 +45,18 @@ public static void bind(int unit, GlTextureView textureView, GlSampler sampler) GlStateManager._bindTexture(texture.glId()); } - GL33C.glBindSampler(unit, sampler.getId()); - GlStateManager._texParameter(i, GL33C.GL_TEXTURE_BASE_LEVEL, textureView.baseMipLevel()); - GlStateManager._texParameter(i, GL33C.GL_TEXTURE_MAX_LEVEL, textureView.baseMipLevel() + textureView.mipLevels() - 1); + if (sampler != null) { + GL33C.glBindSampler(unit, ((GlSampler) sampler).getId()); + GlStateManager._texParameter(i, GL33C.GL_TEXTURE_BASE_LEVEL, textureView.baseMipLevel()); + GlStateManager._texParameter(i, GL33C.GL_TEXTURE_MAX_LEVEL, textureView.baseMipLevel() + textureView.mipLevels() - 1); + } } public static void bindLightAndOverlay() { var gameRenderer = Minecraft.getInstance().gameRenderer; - GlSampler sampler = (GlSampler) RenderSystem.getSamplerCache().getClampToEdge(FilterMode.LINEAR); - bind(Samplers.OVERLAY.number, (GlTextureView) gameRenderer.overlayTexture().getTextureView(), sampler); - bind(Samplers.LIGHT.number, (GlTextureView) gameRenderer.lightmap(), sampler); + GpuSampler sampler = RenderSystem.getSamplerCache().getClampToEdge(FilterMode.LINEAR); + bind(Samplers.OVERLAY.number, gameRenderer.overlayTexture().getTextureView(), sampler); + bind(Samplers.LIGHT.number, gameRenderer.lightmap(), sampler); } public static void bindRenderTarget(RenderTarget target) { @@ -56,18 +67,4 @@ public static void bindRenderTarget(RenderTarget target) { ); GlStateManager._glBindFramebuffer(GlConst.GL_FRAMEBUFFER, i); } - - /** - * Get a built-in texture by its resource id. - * - * @param texture The texture's resource id. - * @return The texture. - */ - public static int byName(Identifier texture) { - return ((GlTexture) Minecraft.getInstance() - .getTextureManager() - .getTexture(texture) - .getTexture()) - .glId(); - } } diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/engine/indirect/IndirectDrawManager.java b/common/src/backend/java/dev/engine_room/flywheel/backend/engine/indirect/IndirectDrawManager.java index 2638f29fc..766e864fc 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/engine/indirect/IndirectDrawManager.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/engine/indirect/IndirectDrawManager.java @@ -4,6 +4,12 @@ import java.util.List; import java.util.Map; +import com.mojang.blaze3d.systems.RenderSystem; +import com.mojang.blaze3d.textures.FilterMode; +import com.mojang.blaze3d.textures.GpuSampler; + +import net.minecraft.resources.Identifier; + import org.lwjgl.opengl.GL30; import org.lwjgl.opengl.GL40; import org.lwjgl.opengl.GL42; @@ -248,8 +254,9 @@ public void renderCrumbling(List crumblingBlocks) { } for (var progressEntry : byProgress.int2ObjectEntrySet()) { - Samplers.CRUMBLING.makeActive(); - TextureBinder.bind(ModelBakery.BREAKING_LOCATIONS.get(progressEntry.getIntKey())); + Identifier crumblingTextureId = ModelBakery.BREAKING_LOCATIONS.get(progressEntry.getIntKey()); + GpuSampler crumblingTextureSampler = RenderSystem.getSamplerCache().getRepeat(FilterMode.NEAREST); + TextureBinder.bind(Samplers.CRUMBLING.number, crumblingTextureId, crumblingTextureSampler); for (var instanceHandlePair : progressEntry.getValue()) { IndirectInstancer instancer = instanceHandlePair.getFirst(); diff --git a/common/src/backend/java/dev/engine_room/flywheel/backend/engine/instancing/InstancedDrawManager.java b/common/src/backend/java/dev/engine_room/flywheel/backend/engine/instancing/InstancedDrawManager.java index 5d5a7605c..8450b2de1 100644 --- a/common/src/backend/java/dev/engine_room/flywheel/backend/engine/instancing/InstancedDrawManager.java +++ b/common/src/backend/java/dev/engine_room/flywheel/backend/engine/instancing/InstancedDrawManager.java @@ -4,6 +4,10 @@ import java.util.Comparator; import java.util.List; +import com.mojang.blaze3d.systems.RenderSystem; +import com.mojang.blaze3d.textures.FilterMode; +import com.mojang.blaze3d.textures.GpuSampler; + import dev.engine_room.flywheel.api.backend.Engine; import dev.engine_room.flywheel.api.instance.Instance; import dev.engine_room.flywheel.api.material.Material; @@ -31,6 +35,7 @@ import dev.engine_room.flywheel.lib.material.SimpleMaterial; import net.minecraft.client.Minecraft; import net.minecraft.client.resources.model.ModelBakery; +import net.minecraft.resources.Identifier; public class InstancedDrawManager extends DrawManager> { private static final Comparator DRAW_COMPARATOR = Comparator.comparingInt(InstancedDraw::bias) @@ -272,8 +277,9 @@ public void renderCrumbling(List crumblingBlocks) { GroupKey shader = groupEntry.getKey(); for (var progressEntry : byProgress.int2ObjectEntrySet()) { - Samplers.CRUMBLING.makeActive(); - TextureBinder.bind(ModelBakery.BREAKING_LOCATIONS.get(progressEntry.getIntKey())); + Identifier crumblingTextureId = ModelBakery.BREAKING_LOCATIONS.get(progressEntry.getIntKey()); + GpuSampler crumblingTextureSampler = RenderSystem.getSamplerCache().getRepeat(FilterMode.NEAREST); + TextureBinder.bind(Samplers.CRUMBLING.number, crumblingTextureId, crumblingTextureSampler); for (var instanceHandlePair : progressEntry.getValue()) { InstancedInstancer instancer = instanceHandlePair.getFirst(); From 0ae1a8ac7c8c2f082c57d32e76985b68fcbf207e Mon Sep 17 00:00:00 2001 From: IThundxr Date: Tue, 5 May 2026 17:56:44 -0400 Subject: [PATCH 53/59] Update to 26.1.2 --- common/build.gradle.kts | 4 +++- gradle/libs.versions.toml | 12 ++++++------ 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/common/build.gradle.kts b/common/build.gradle.kts index 2e849a9d4..01fea2101 100644 --- a/common/build.gradle.kts +++ b/common/build.gradle.kts @@ -92,7 +92,9 @@ dependencies { compileOnly(annotationProcessor("io.github.llamalad7:mixinextras-common:0.4.1")!!) - testImplementation("org.junit.jupiter:junit-jupiter:5.8.1") + testImplementation(platform("org.junit:junit-bom:6.0.3")) + testImplementation("org.junit.jupiter:junit-jupiter") + testRuntimeOnly("org.junit.platform:junit-platform-launcher") } tasks.test { diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index bc0bdc706..12f8af74e 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,21 +1,21 @@ [versions] -minecraft = "26.1.1" +minecraft = "26.1.2" # https://neoforged.net/ -neoforge = "26.1.1.1-beta" +neoforge = "26.1.2.41-beta" mdg = "2.0.+" # https://fabricmc.net/develop/ -loom = "1.15.+" -fabric-loader = "0.18.5" -fabric-api = "0.145.3+26.1.1" +loom = "1.16.+" +fabric-loader = "0.19.2" +fabric-api = "0.148.0+26.1.2" # we need to manually depend on mixin (+extras) in common mixin = "0.16.5+mixin.0.8.7" mixin-extras = "0.5.3" # https://maven.caffeinemc.net/#/releases/net/caffeinemc/sodium-fabric -sodium = "0.8.9+mc26.1.1" +sodium = "0.8.10+mc26.1.2" # https://modrinth.com/mod/iris/versions iris = "1.10.9+26.1" From 82f43b4c568bd5af437d29d96c54ab18b4b51269 Mon Sep 17 00:00:00 2001 From: IThundxr Date: Mon, 18 May 2026 19:44:28 -0400 Subject: [PATCH 54/59] Enable --renderDebugLabels --- .../dev/engine_room/gradle/platform/PlatformExtension.kt | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/buildSrc/src/main/kotlin/dev/engine_room/gradle/platform/PlatformExtension.kt b/buildSrc/src/main/kotlin/dev/engine_room/gradle/platform/PlatformExtension.kt index 199926332..379c60554 100644 --- a/buildSrc/src/main/kotlin/dev/engine_room/gradle/platform/PlatformExtension.kt +++ b/buildSrc/src/main/kotlin/dev/engine_room/gradle/platform/PlatformExtension.kt @@ -42,6 +42,8 @@ open class PlatformExtension(val project: Project) { property("mixin.debug.export", "true") property("mixin.debug.verbose", "true") + programArgs("--renderDebugLabels") + // 720p baby! programArgs("--width", "1280", "--height", "720") } @@ -76,6 +78,8 @@ open class PlatformExtension(val project: Project) { systemProperty("mixin.debug.export", "true") systemProperty("mixin.debug.verbose", "true") + programArguments.add("--renderDebugLabels") + programArguments.addAll("--width", "1280", "--height", "720") } From 74bc696bbaacdf1c96bc52f03d3635d31f6b56f6 Mon Sep 17 00:00:00 2001 From: IThundxr Date: Thu, 28 May 2026 17:42:25 -0400 Subject: [PATCH 55/59] Shutdown task executors on client stop --- .../flywheel/impl/task/ParallelTaskExecutor.java | 8 ++++++-- .../flywheel/impl/task/SerialTaskExecutor.java | 4 ++++ .../engine_room/flywheel/impl/task/TaskExecutorImpl.java | 8 ++++++++ .../dev/engine_room/flywheel/impl/FlywheelFabric.java | 4 ++++ .../dev/engine_room/flywheel/impl/FlywheelNeoForge.java | 4 ++++ 5 files changed, 26 insertions(+), 2 deletions(-) diff --git a/common/src/main/java/dev/engine_room/flywheel/impl/task/ParallelTaskExecutor.java b/common/src/main/java/dev/engine_room/flywheel/impl/task/ParallelTaskExecutor.java index 066d2ba82..e52b710b1 100644 --- a/common/src/main/java/dev/engine_room/flywheel/impl/task/ParallelTaskExecutor.java +++ b/common/src/main/java/dev/engine_room/flywheel/impl/task/ParallelTaskExecutor.java @@ -84,8 +84,7 @@ public void stopWorkers() { for (Thread thread : threads) { try { thread.join(); - } catch (InterruptedException e) { - // + } catch (InterruptedException _) { } } @@ -188,6 +187,11 @@ private void processTask(Runnable task) { } } + @Override + public void shutdown() { + stopWorkers(); + } + private class WorkerThread extends Thread { private int errorLogLatch = MAX_ERRORS_LOGGED_PER_THREAD; diff --git a/common/src/main/java/dev/engine_room/flywheel/impl/task/SerialTaskExecutor.java b/common/src/main/java/dev/engine_room/flywheel/impl/task/SerialTaskExecutor.java index 1eaffdff3..6470ba985 100644 --- a/common/src/main/java/dev/engine_room/flywheel/impl/task/SerialTaskExecutor.java +++ b/common/src/main/java/dev/engine_room/flywheel/impl/task/SerialTaskExecutor.java @@ -31,4 +31,8 @@ public boolean syncWhile(BooleanSupplier cond) { @Override public void syncPoint() { } + + @Override + public void shutdown() { + } } diff --git a/common/src/main/java/dev/engine_room/flywheel/impl/task/TaskExecutorImpl.java b/common/src/main/java/dev/engine_room/flywheel/impl/task/TaskExecutorImpl.java index 99eda8aa4..fcf07ec42 100644 --- a/common/src/main/java/dev/engine_room/flywheel/impl/task/TaskExecutorImpl.java +++ b/common/src/main/java/dev/engine_room/flywheel/impl/task/TaskExecutorImpl.java @@ -38,4 +38,12 @@ public interface TaskExecutorImpl extends TaskExecutor { * try to use {@link #syncUntil(BooleanSupplier) syncUntil}. */ void syncPoint(); + + /** + * Start shutting down this task executor. + *
+ * Any attempts to use the current executor after calling this will result in + * an exception being thrown unless the executor has been started again. + */ + void shutdown(); } diff --git a/fabric/src/main/java/dev/engine_room/flywheel/impl/FlywheelFabric.java b/fabric/src/main/java/dev/engine_room/flywheel/impl/FlywheelFabric.java index 6378a1996..6f73371ef 100644 --- a/fabric/src/main/java/dev/engine_room/flywheel/impl/FlywheelFabric.java +++ b/fabric/src/main/java/dev/engine_room/flywheel/impl/FlywheelFabric.java @@ -8,6 +8,7 @@ import dev.engine_room.flywheel.backend.compile.FlwProgramsReloader; import dev.engine_room.flywheel.backend.engine.uniform.Uniforms; import dev.engine_room.flywheel.impl.mixin.fabric.ArgumentTypeInfosAccessor; +import dev.engine_room.flywheel.impl.task.FlwTaskExecutor; import dev.engine_room.flywheel.impl.visualization.VisualizationEventHandler; import dev.engine_room.flywheel.lib.model.baked.FabricPartialModel; import dev.engine_room.flywheel.lib.util.IdentifierUtil; @@ -16,6 +17,7 @@ import net.fabricmc.api.ClientModInitializer; import net.fabricmc.fabric.api.client.command.v2.ClientCommandRegistrationCallback; import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientEntityEvents; +import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientLifecycleEvents; import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents; import net.fabricmc.fabric.api.client.model.loading.v1.ModelLoadingPlugin; import net.fabricmc.fabric.api.resource.v1.ResourceLoader; @@ -44,6 +46,8 @@ public void onInitializeClient() { } private static void setupImpl() { + ClientLifecycleEvents.CLIENT_STOPPING.register(_ -> FlwTaskExecutor.get().shutdown()); + ReloadLevelRendererCallback.EVENT.register(BackendManagerImpl::onReloadLevelRenderer); // This Fabric event runs slightly later than the Forge event Flywheel uses, but it shouldn't make a difference. diff --git a/neoforge/src/main/java/dev/engine_room/flywheel/impl/FlywheelNeoForge.java b/neoforge/src/main/java/dev/engine_room/flywheel/impl/FlywheelNeoForge.java index dacc703a5..65371c905 100644 --- a/neoforge/src/main/java/dev/engine_room/flywheel/impl/FlywheelNeoForge.java +++ b/neoforge/src/main/java/dev/engine_room/flywheel/impl/FlywheelNeoForge.java @@ -8,6 +8,7 @@ import dev.engine_room.flywheel.api.event.ReloadLevelRendererEvent; import dev.engine_room.flywheel.backend.compile.FlwProgramsReloader; import dev.engine_room.flywheel.backend.engine.uniform.Uniforms; +import dev.engine_room.flywheel.impl.task.FlwTaskExecutor; import dev.engine_room.flywheel.impl.visualization.VisualizationEventHandler; import dev.engine_room.flywheel.lib.model.baked.NeoForgePartialModel; import dev.engine_room.flywheel.lib.util.IdentifierUtil; @@ -24,6 +25,7 @@ import net.neoforged.fml.event.lifecycle.FMLCommonSetupEvent; import net.neoforged.neoforge.client.event.AddClientReloadListenersEvent; import net.neoforged.neoforge.client.event.RegisterDebugEntriesEvent; +import net.neoforged.neoforge.client.event.lifecycle.ClientStoppingEvent; import net.neoforged.neoforge.common.NeoForge; import net.neoforged.neoforge.event.entity.EntityJoinLevelEvent; import net.neoforged.neoforge.event.entity.EntityLeaveLevelEvent; @@ -53,6 +55,8 @@ public FlywheelNeoForge(IEventBus modEventBus, ModContainer modContainer) { } private static void registerImplEventListeners(IEventBus gameEventBus, IEventBus modEventBus) { + gameEventBus.addListener((ClientStoppingEvent e) -> FlwTaskExecutor.get().shutdown()); + gameEventBus.addListener((ReloadLevelRendererEvent e) -> BackendManagerImpl.onReloadLevelRenderer(e.level())); gameEventBus.addListener((LevelTickEvent.Post e) -> { From 7c4024513f23bb6f12e82fbea17290b5afce72f5 Mon Sep 17 00:00:00 2001 From: djefrey <34744225+djefrey@users.noreply.github.com> Date: Tue, 16 Jun 2026 02:18:02 +0200 Subject: [PATCH 56/59] Make MeshEmitter, MeshEmitterManager, BlockStateModelBufferer public (#5) --- .../engine_room/flywheel/lib/model/baked/MeshEmitter.java | 4 +++- .../flywheel/lib/model/baked/MeshEmitterManager.java | 5 ++++- .../flywheel/lib/model/baked/BlockStateModelBufferer.java | 4 +++- .../flywheel/lib/model/baked/FabricMeshEmitter.java | 5 ++++- .../flywheel/lib/model/baked/FabricMeshEmitterManager.java | 5 ++++- 5 files changed, 18 insertions(+), 5 deletions(-) diff --git a/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/MeshEmitter.java b/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/MeshEmitter.java index a21379c64..00334e84e 100644 --- a/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/MeshEmitter.java +++ b/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/MeshEmitter.java @@ -2,6 +2,7 @@ import java.util.Arrays; +import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.UnknownNullability; import org.jspecify.annotations.Nullable; @@ -17,7 +18,8 @@ import dev.engine_room.flywheel.lib.vertex.FlywheelVertexFormats; import net.minecraft.client.renderer.chunk.ChunkSectionLayer; -abstract class MeshEmitter implements VertexConsumer { +@ApiStatus.Internal +public abstract class MeshEmitter implements VertexConsumer { private static final int INITIAL_CAPACITY = 1; private final ByteBufferBuilderStack byteBufferBuilderStack; diff --git a/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/MeshEmitterManager.java b/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/MeshEmitterManager.java index 9a8103f99..3dcb8d95e 100644 --- a/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/MeshEmitterManager.java +++ b/common/src/lib/java/dev/engine_room/flywheel/lib/model/baked/MeshEmitterManager.java @@ -10,7 +10,10 @@ import it.unimi.dsi.fastutil.objects.Reference2ReferenceMap; import net.minecraft.client.renderer.chunk.ChunkSectionLayer; -class MeshEmitterManager { +import org.jetbrains.annotations.ApiStatus; + +@ApiStatus.Internal +public class MeshEmitterManager { private static final ChunkSectionLayer[] CHUNK_LAYERS = ChunkSectionLayer.values(); final Reference2ReferenceMap emitterMap = new Reference2ReferenceArrayMap<>(); diff --git a/fabric/src/lib/java/dev/engine_room/flywheel/lib/model/baked/BlockStateModelBufferer.java b/fabric/src/lib/java/dev/engine_room/flywheel/lib/model/baked/BlockStateModelBufferer.java index eac0001af..d05c9b551 100644 --- a/fabric/src/lib/java/dev/engine_room/flywheel/lib/model/baked/BlockStateModelBufferer.java +++ b/fabric/src/lib/java/dev/engine_room/flywheel/lib/model/baked/BlockStateModelBufferer.java @@ -2,6 +2,7 @@ import java.util.Iterator; +import org.jetbrains.annotations.ApiStatus; import org.jspecify.annotations.Nullable; import com.mojang.blaze3d.vertex.BufferBuilder; @@ -26,7 +27,8 @@ import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.material.FluidState; -final class BlockStateModelBufferer { +@ApiStatus.Internal +public final class BlockStateModelBufferer { private static final ThreadLocal THREAD_LOCAL_OBJECTS = ThreadLocal.withInitial(ThreadLocalObjects::new); private BlockStateModelBufferer() { diff --git a/fabric/src/lib/java/dev/engine_room/flywheel/lib/model/baked/FabricMeshEmitter.java b/fabric/src/lib/java/dev/engine_room/flywheel/lib/model/baked/FabricMeshEmitter.java index cb1a84365..57a0473f6 100644 --- a/fabric/src/lib/java/dev/engine_room/flywheel/lib/model/baked/FabricMeshEmitter.java +++ b/fabric/src/lib/java/dev/engine_room/flywheel/lib/model/baked/FabricMeshEmitter.java @@ -8,7 +8,10 @@ import net.minecraft.client.renderer.chunk.ChunkSectionLayer; import net.minecraft.client.resources.model.geometry.BakedQuad; -class FabricMeshEmitter extends MeshEmitter { +import org.jetbrains.annotations.ApiStatus; + +@ApiStatus.Internal +public class FabricMeshEmitter extends MeshEmitter { private boolean shade; private boolean ao; diff --git a/fabric/src/lib/java/dev/engine_room/flywheel/lib/model/baked/FabricMeshEmitterManager.java b/fabric/src/lib/java/dev/engine_room/flywheel/lib/model/baked/FabricMeshEmitterManager.java index 5f4ba5832..cfbaee447 100644 --- a/fabric/src/lib/java/dev/engine_room/flywheel/lib/model/baked/FabricMeshEmitterManager.java +++ b/fabric/src/lib/java/dev/engine_room/flywheel/lib/model/baked/FabricMeshEmitterManager.java @@ -3,7 +3,10 @@ import net.fabricmc.fabric.api.client.renderer.v1.mesh.QuadView; import net.fabricmc.fabric.api.util.TriState; -class FabricMeshEmitterManager extends MeshEmitterManager { +import org.jetbrains.annotations.ApiStatus; + +@ApiStatus.Internal +public class FabricMeshEmitterManager extends MeshEmitterManager { private boolean useAo; private boolean defaultAo; From d94131ee6333dcbfd281329d4a4916a29830d5e2 Mon Sep 17 00:00:00 2001 From: IThundxr Date: Fri, 22 May 2026 13:40:45 -0400 Subject: [PATCH 57/59] Enable enhanced hotswap --- .../gradle/platform/PlatformExtension.kt | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/buildSrc/src/main/kotlin/dev/engine_room/gradle/platform/PlatformExtension.kt b/buildSrc/src/main/kotlin/dev/engine_room/gradle/platform/PlatformExtension.kt index 379c60554..ab5ae4354 100644 --- a/buildSrc/src/main/kotlin/dev/engine_room/gradle/platform/PlatformExtension.kt +++ b/buildSrc/src/main/kotlin/dev/engine_room/gradle/platform/PlatformExtension.kt @@ -34,6 +34,10 @@ open class PlatformExtension(val project: Project) { named("client") { isIdeConfigGenerated = true + // Better hotswap, only available with the JetBrains Runtime so we have to ignore invalid options aswell + jvmArguments.add("-XX:+IgnoreUnrecognizedVMOptions") + jvmArguments.add("-XX:+AllowEnhancedClassRedefinition") + // Turn on our own debug flags property("flw.dumpShaderSource", "true") property("flw.debugMemorySafety", "true") @@ -72,15 +76,23 @@ open class PlatformExtension(val project: Project) { create("client") { client() + // Better hotswap, only available with the JetBrains Runtime so we have to ignore invalid options aswell + jvmArgument("-XX:+IgnoreUnrecognizedVMOptions") + jvmArgument("-XX:+AllowEnhancedClassRedefinition") + + // Turn on our own debug flags systemProperty("flw.dumpShaderSource", "true") systemProperty("flw.debugMemorySafety", "true") + // Turn on mixin debug flags systemProperty("mixin.debug.export", "true") systemProperty("mixin.debug.verbose", "true") - programArguments.add("--renderDebugLabels") - + // 720p baby! programArguments.addAll("--width", "1280", "--height", "720") + + // Helpful when debugging issues + programArguments.addAll("--renderDebugLabels", "--vulkanValidation") } // We're a client mod, but we need to make sure we correctly render when playing on a server. From 8ac397e50b0d742e3c4cb25b6d03b51499284a92 Mon Sep 17 00:00:00 2001 From: IThundxr Date: Fri, 22 May 2026 13:43:24 -0400 Subject: [PATCH 58/59] Fix FlwDebugEntry --- .../flywheel/impl/FlwDebugInfo.java | 48 ++++++++++++++----- .../flywheel/impl/FlywheelFabric.java | 2 +- .../flywheel/impl/FlywheelNeoForge.java | 2 +- 3 files changed, 39 insertions(+), 13 deletions(-) diff --git a/common/src/main/java/dev/engine_room/flywheel/impl/FlwDebugInfo.java b/common/src/main/java/dev/engine_room/flywheel/impl/FlwDebugInfo.java index 5733af886..ba19e0ac9 100644 --- a/common/src/main/java/dev/engine_room/flywheel/impl/FlwDebugInfo.java +++ b/common/src/main/java/dev/engine_room/flywheel/impl/FlwDebugInfo.java @@ -1,6 +1,7 @@ package dev.engine_room.flywheel.impl; import java.net.URI; +import java.util.Locale; import org.jspecify.annotations.Nullable; @@ -10,6 +11,7 @@ import dev.engine_room.flywheel.backend.gl.GlCompat; import dev.engine_room.flywheel.impl.visualization.VisualizationManagerImpl; import dev.engine_room.flywheel.lib.memory.FlwMemoryTracker; +import dev.engine_room.flywheel.lib.util.IdentifierUtil; import dev.engine_room.flywheel.lib.util.StringUtil; import it.unimi.dsi.fastutil.ints.IntArrayList; import it.unimi.dsi.fastutil.ints.IntComparators; @@ -24,6 +26,7 @@ import net.minecraft.network.chat.Component; import net.minecraft.network.chat.HoverEvent.ShowText; import net.minecraft.network.chat.Style; +import net.minecraft.resources.Identifier; import net.minecraft.world.level.Level; import net.minecraft.world.level.chunk.LevelChunk; @@ -253,23 +256,46 @@ private static void addOpenGLDebugInfo(StringBuilder out) { } public static class FlwDebugEntry implements DebugScreenEntry { - // TODO 1.21.11: Check if this should use a group instead, and if this information should be split across multiple entries + public static final Identifier ID = IdentifierUtil.id("flw_debug_info"); + private static final Identifier GROUP = IdentifierUtil.id("flywheel"); + @Override - public void display(DebugScreenDisplayer displayer, @Nullable Level level, @Nullable LevelChunk clientChunk, @Nullable LevelChunk serverChunk) { - displayer.addLine("Flywheel: " + FlwImplXplat.INSTANCE.getVersionStr()); - displayer.addLine("Backend: " + BackendManagerImpl.getBackendString()); - displayer.addLine("Update limiting: " + (FlwConfig.INSTANCE.limitUpdates() ? "on" : "off")); + public void display(DebugScreenDisplayer displayer, @Nullable Level serverOrClientLevel, @Nullable LevelChunk clientChunk, @Nullable LevelChunk serverChunk) { + add(displayer, "Flywheel: %s", FlwImplXplat.INSTANCE.getVersionStr()); + add(displayer, "Backend: %s", BackendManagerImpl.getBackendString()); + add(displayer, "Update limiting: %s", FlwConfig.INSTANCE.limitUpdates() ? "on" : "off"); - VisualizationManager manager = VisualizationManager.get(level); + Level clientLevel = clientChunk != null ? clientChunk.getLevel() : null; + VisualizationManager manager = VisualizationManager.get(clientLevel); if (manager != null) { - displayer.addLine("B: " + manager.blockEntities().visualCount() - + ", E: " + manager.entities().visualCount() - + ", F: " + manager.effects().visualCount()); + add(displayer, "B: %s, E: %s, F: %s", + manager.blockEntities().visualCount(), + manager.entities().visualCount(), + manager.effects().visualCount() + ); + Vec3i renderOrigin = manager.renderOrigin(); - displayer.addLine("Origin: " + renderOrigin.getX() + ", " + renderOrigin.getY() + ", " + renderOrigin.getZ()); + add(displayer, "Origin: %s, %s, %s", + renderOrigin.getX(), + renderOrigin.getY(), + renderOrigin.getZ() + ); } - displayer.addLine("Memory Usage: CPU: " + StringUtil.formatBytes(FlwMemoryTracker.getCpuMemory()) + ", GPU: " + StringUtil.formatBytes(FlwMemoryTracker.getGpuMemory())); + // TODO b3d-ification: This is not really correct anymore, it no longer tracks the buffers flw creates, it should probably be removed + add(displayer, "Memory Usage: CPU: %s, GPU: %s", + StringUtil.formatBytes(FlwMemoryTracker.getCpuMemory()), + StringUtil.formatBytes(FlwMemoryTracker.getGpuMemory()) + ); + } + + @Override + public boolean isAllowed(boolean reducedDebugInfo) { + return true; + } + + private static void add(DebugScreenDisplayer displayer, String input, Object... args) { + displayer.addToGroup(GROUP, String.format(Locale.ROOT, input, args)); } } } diff --git a/fabric/src/main/java/dev/engine_room/flywheel/impl/FlywheelFabric.java b/fabric/src/main/java/dev/engine_room/flywheel/impl/FlywheelFabric.java index 6f73371ef..e4f0ad394 100644 --- a/fabric/src/main/java/dev/engine_room/flywheel/impl/FlywheelFabric.java +++ b/fabric/src/main/java/dev/engine_room/flywheel/impl/FlywheelFabric.java @@ -64,7 +64,7 @@ private static void setupImpl() { ClientCommandRegistrationCallback.EVENT.register(FlwCommands::registerClientCommands); - DebugScreenEntries.register(IdentifierUtil.id("flw_debug_info"), new FlwDebugInfo.FlwDebugEntry()); + DebugScreenEntries.register(FlwDebugInfo.FlwDebugEntry.ID, new FlwDebugInfo.FlwDebugEntry()); EndClientResourceReloadCallback.EVENT.register((minecraft, resourceManager, initialReload, error) -> BackendManagerImpl.onEndClientResourceReload(error.isPresent())); diff --git a/neoforge/src/main/java/dev/engine_room/flywheel/impl/FlywheelNeoForge.java b/neoforge/src/main/java/dev/engine_room/flywheel/impl/FlywheelNeoForge.java index 65371c905..71b714ef9 100644 --- a/neoforge/src/main/java/dev/engine_room/flywheel/impl/FlywheelNeoForge.java +++ b/neoforge/src/main/java/dev/engine_room/flywheel/impl/FlywheelNeoForge.java @@ -70,7 +70,7 @@ private static void registerImplEventListeners(IEventBus gameEventBus, IEventBus gameEventBus.addListener(FlwCommands::registerClientCommands); - modEventBus.addListener((RegisterDebugEntriesEvent e) -> e.register(IdentifierUtil.id("flw_debug_info"), new FlwDebugInfo.FlwDebugEntry())); + modEventBus.addListener((RegisterDebugEntriesEvent e) -> e.register(FlwDebugInfo.FlwDebugEntry.ID, new FlwDebugInfo.FlwDebugEntry())); modEventBus.addListener((EndClientResourceReloadEvent e) -> BackendManagerImpl.onEndClientResourceReload(e.error().isPresent())); From 5892742c1f82d0c5c2ff238caeb45cc7a0c8fe5d Mon Sep 17 00:00:00 2001 From: IThundxr Date: Sun, 28 Jun 2026 16:56:33 -0400 Subject: [PATCH 59/59] Fix jarjar artifactId (#322) --- .../main/kotlin/dev/engine_room/gradle/jarset/JarTaskSet.kt | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/buildSrc/src/main/kotlin/dev/engine_room/gradle/jarset/JarTaskSet.kt b/buildSrc/src/main/kotlin/dev/engine_room/gradle/jarset/JarTaskSet.kt index e4e1881f3..3b97b9c16 100644 --- a/buildSrc/src/main/kotlin/dev/engine_room/gradle/jarset/JarTaskSet.kt +++ b/buildSrc/src/main/kotlin/dev/engine_room/gradle/jarset/JarTaskSet.kt @@ -60,6 +60,11 @@ class JarTaskSet( val config = project.configurations.register(name) { isCanBeConsumed = true isCanBeResolved = false + + outgoing { + capabilities.clear() + capability("${project.group}:flywheel-${project.name}-${project.rootProject.property("minecraft_version")}:${project.version}") + } } project.artifacts.add(config.name, remapJar)