1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
|
package at.hannibal2.skyhanni.utils.shader
import java.util.Objects
/**
* Class to handle shader uniform types
*
* Modified from SkyblockAddons
*
* Credit: [Uniform.java](https://github.com/BiscuitDevelopment/SkyblockAddons/blob/main/src/main/java/codes/biscuit/skyblockaddons/shader/Uniform.java)
*/
class Uniform<T>(
shader: Shader,
private val uniformType: UniformType<T>,
val name: String,
private val uniformValuesSupplier: () -> T,
) {
class UniformType<T> {
companion object {
val FLOAT: UniformType<Float> = UniformType()
val VEC2: UniformType<FloatArray> = UniformType()
val VEC3: UniformType<FloatArray> = UniformType()
val BOOL: UniformType<Boolean> = UniformType()
val INT: UniformType<Int> = UniformType()
}
}
private val uniformID: Int = ShaderHelper.glGetUniformLocation(shader.shaderProgram, name)
private var previousUniformValue: T? = null
fun update() {
val newUniformValue: T = uniformValuesSupplier()
if (!Objects.deepEquals(previousUniformValue, newUniformValue)) {
when (uniformType) {
UniformType.FLOAT -> {
ShaderHelper.glUniform1f(uniformID, (newUniformValue as Float))
}
UniformType.VEC2 -> {
val values = newUniformValue as FloatArray
ShaderHelper.glUniform2f(uniformID, values[0], values[1])
}
UniformType.VEC3 -> {
val values = newUniformValue as FloatArray
ShaderHelper.glUniform3f(uniformID, values[0], values[1], values[2])
}
UniformType.BOOL -> ShaderHelper.glUniform1f(uniformID, if (newUniformValue as Boolean) 1f else 0f)
UniformType.INT -> ShaderHelper.glUniform1i(uniformID, (newUniformValue as Int))
}
previousUniformValue = newUniformValue
}
}
}
|