Skip to content

Commit

Permalink
Add fix for missing uniforms
Browse files Browse the repository at this point in the history
  • Loading branch information
Aeltumn committed Jul 25, 2024
1 parent 8d54e4b commit 81a49f9
Show file tree
Hide file tree
Showing 3 changed files with 56 additions and 1 deletion.
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
package com.noxcrew.noxesium.mixin.sodium;

import com.llamalad7.mixinextras.injector.wrapmethod.WrapMethod;
import com.llamalad7.mixinextras.injector.wrapoperation.Operation;
import com.noxcrew.noxesium.NoxesiumMod;
import me.jellysquid.mods.sodium.client.gl.GlObject;
import me.jellysquid.mods.sodium.client.gl.shader.GlProgram;
import me.jellysquid.mods.sodium.client.gl.shader.uniform.GlUniform;
import me.jellysquid.mods.sodium.client.gl.shader.uniform.GlUniformBlock;
import org.lwjgl.opengl.GL20C;
import org.lwjgl.opengl.GL32C;
import org.spongepowered.asm.mixin.Mixin;

import java.util.function.IntFunction;

/**
* Directly based on <a href="https://github.com/lni-dev/SodiumCoreShaderSupport/blob/1.20.6/src/main/java/de/linusdev/mixin/MixinGLProgram.java">Sodium Core Shader Support</a>.
*/
@Mixin(value = GlProgram.class, remap = false)
public class SodiumGlProgramMixin extends GlObject {

@WrapMethod(method = "bindUniform")
private <U extends GlUniform<?>> U noxesium$bindUniform(String name, IntFunction<U> factory, Operation<U> original) {
var index = GL20C.glGetUniformLocation(this.handle(), name);
if (index < 0) {
var error = GL20C.glGetError();
if (error == GL20C.GL_INVALID_OPERATION) {
NoxesiumMod.getInstance().getLogger().warn("Error while binding uniform: GL_INVALID_OPERATION");
} else if (error == GL20C.GL_INVALID_VALUE) {
NoxesiumMod.getInstance().getLogger().warn("Error while binding uniform: GL_INVALID_VALUE");
} else {
NoxesiumMod.getInstance().getLogger().warn("Unknown error while binding uniform, code: {}", error);
}
}
return (U) factory.apply(index);
}

@WrapMethod(method = "bindUniformBlock")
private GlUniformBlock noxesium$bindUniformBlock(String name, int bindingPoint, Operation<GlUniformBlock> original) {
var index = GL32C.glGetUniformBlockIndex(this.handle(), name);
if (index < 0) {
var error = GL20C.glGetError();
if (error == GL20C.GL_INVALID_OPERATION) {
NoxesiumMod.getInstance().getLogger().warn("Error while binding uniform block: GL_INVALID_OPERATION");
} else if (error == GL20C.GL_INVALID_VALUE) {
NoxesiumMod.getInstance().getLogger().warn("Error while binding uniform block: GL_INVALID_VALUE");
} else {
NoxesiumMod.getInstance().getLogger().warn("Unknown error while binding uniform block, code: {}", error);
}
}
GL32C.glUniformBlockBinding(this.handle(), index, bindingPoint);
return new GlUniformBlock(bindingPoint);
}
}
1 change: 1 addition & 0 deletions fabric/src/main/resources/noxesium-sodium.mixins.json
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
"package": "com.noxcrew.noxesium.mixin.sodium",
"compatibilityLevel": "JAVA_17",
"client": [
"SodiumGlProgramMixin",
"SodiumOptionImplMixin",
"SodiumRenderSectionManagerMixin",
"SodiumShaderLoaderMixin",
Expand Down
2 changes: 1 addition & 1 deletion gradle.properties
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ loader_version=0.15.11
# Fabric API
fabric_version=0.100.1+1.21
# Mod Properties
mod_version=2.1.3
mod_version=2.1.4

# Mod dependencies
sodium = mc1.21-0.5.9
Expand Down

0 comments on commit 81a49f9

Please sign in to comment.