minecraft-src/net/minecraft/client/renderer/UniformValue.java
2025-09-18 12:27:44 +00:00

192 lines
5.3 KiB
Java

package net.minecraft.client.renderer;
import com.mojang.blaze3d.buffers.Std140Builder;
import com.mojang.blaze3d.buffers.Std140SizeCalculator;
import com.mojang.serialization.Codec;
import com.mojang.serialization.MapCodec;
import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment;
import net.minecraft.util.ExtraCodecs;
import net.minecraft.util.StringRepresentable;
import org.joml.Matrix4fc;
import org.joml.Vector2f;
import org.joml.Vector3f;
import org.joml.Vector3i;
import org.joml.Vector4f;
@Environment(EnvType.CLIENT)
public interface UniformValue {
Codec<UniformValue> CODEC = UniformValue.Type.CODEC.dispatch(UniformValue::type, type -> type.valueCodec);
void writeTo(Std140Builder builder);
void addSize(Std140SizeCalculator builder);
UniformValue.Type type();
@Environment(EnvType.CLIENT)
public record FloatUniform(float value) implements UniformValue {
public static final Codec<UniformValue.FloatUniform> CODEC = Codec.FLOAT.xmap(UniformValue.FloatUniform::new, UniformValue.FloatUniform::value);
@Override
public void writeTo(Std140Builder builder) {
builder.putFloat(this.value);
}
@Override
public void addSize(Std140SizeCalculator builder) {
builder.putFloat();
}
@Override
public UniformValue.Type type() {
return UniformValue.Type.FLOAT;
}
}
@Environment(EnvType.CLIENT)
public record IVec3Uniform(Vector3i value) implements UniformValue {
public static final Codec<UniformValue.IVec3Uniform> CODEC = ExtraCodecs.VECTOR3I.xmap(UniformValue.IVec3Uniform::new, UniformValue.IVec3Uniform::value);
@Override
public void writeTo(Std140Builder builder) {
builder.putIVec3(this.value);
}
@Override
public void addSize(Std140SizeCalculator builder) {
builder.putIVec3();
}
@Override
public UniformValue.Type type() {
return UniformValue.Type.IVEC3;
}
}
@Environment(EnvType.CLIENT)
public record IntUniform(int value) implements UniformValue {
public static final Codec<UniformValue.IntUniform> CODEC = Codec.INT.xmap(UniformValue.IntUniform::new, UniformValue.IntUniform::value);
@Override
public void writeTo(Std140Builder builder) {
builder.putInt(this.value);
}
@Override
public void addSize(Std140SizeCalculator builder) {
builder.putInt();
}
@Override
public UniformValue.Type type() {
return UniformValue.Type.INT;
}
}
@Environment(EnvType.CLIENT)
public record Matrix4x4Uniform(Matrix4fc value) implements UniformValue {
public static final Codec<UniformValue.Matrix4x4Uniform> CODEC = ExtraCodecs.MATRIX4F
.xmap(UniformValue.Matrix4x4Uniform::new, UniformValue.Matrix4x4Uniform::value);
@Override
public void writeTo(Std140Builder builder) {
builder.putMat4f(this.value);
}
@Override
public void addSize(Std140SizeCalculator builder) {
builder.putMat4f();
}
@Override
public UniformValue.Type type() {
return UniformValue.Type.MATRIX4X4;
}
}
@Environment(EnvType.CLIENT)
public static enum Type implements StringRepresentable {
INT("int", UniformValue.IntUniform.CODEC),
IVEC3("ivec3", UniformValue.IVec3Uniform.CODEC),
FLOAT("float", UniformValue.FloatUniform.CODEC),
VEC2("vec2", UniformValue.Vec2Uniform.CODEC),
VEC3("vec3", UniformValue.Vec3Uniform.CODEC),
VEC4("vec4", UniformValue.Vec4Uniform.CODEC),
MATRIX4X4("matrix4x4", UniformValue.Matrix4x4Uniform.CODEC);
public static final StringRepresentable.EnumCodec<UniformValue.Type> CODEC = StringRepresentable.fromEnum(UniformValue.Type::values);
private final String name;
final MapCodec<? extends UniformValue> valueCodec;
private Type(final String name, final Codec<? extends UniformValue> codec) {
this.name = name;
this.valueCodec = codec.fieldOf("value");
}
@Override
public String getSerializedName() {
return this.name;
}
}
@Environment(EnvType.CLIENT)
public record Vec2Uniform(Vector2f value) implements UniformValue {
public static final Codec<UniformValue.Vec2Uniform> CODEC = ExtraCodecs.VECTOR2F.xmap(UniformValue.Vec2Uniform::new, UniformValue.Vec2Uniform::value);
@Override
public void writeTo(Std140Builder builder) {
builder.putVec2(this.value);
}
@Override
public void addSize(Std140SizeCalculator builder) {
builder.putVec2();
}
@Override
public UniformValue.Type type() {
return UniformValue.Type.VEC2;
}
}
@Environment(EnvType.CLIENT)
public record Vec3Uniform(Vector3f value) implements UniformValue {
public static final Codec<UniformValue.Vec3Uniform> CODEC = ExtraCodecs.VECTOR3F.xmap(UniformValue.Vec3Uniform::new, UniformValue.Vec3Uniform::value);
@Override
public void writeTo(Std140Builder builder) {
builder.putVec3(this.value);
}
@Override
public void addSize(Std140SizeCalculator builder) {
builder.putVec3();
}
@Override
public UniformValue.Type type() {
return UniformValue.Type.VEC3;
}
}
@Environment(EnvType.CLIENT)
public record Vec4Uniform(Vector4f value) implements UniformValue {
public static final Codec<UniformValue.Vec4Uniform> CODEC = ExtraCodecs.VECTOR4F.xmap(UniformValue.Vec4Uniform::new, UniformValue.Vec4Uniform::value);
@Override
public void writeTo(Std140Builder builder) {
builder.putVec4(this.value);
}
@Override
public void addSize(Std140SizeCalculator builder) {
builder.putVec4();
}
@Override
public UniformValue.Type type() {
return UniformValue.Type.VEC4;
}
}
}