minecraft-src/net/minecraft/client/renderer/ShaderProgramConfig.java
2025-07-04 02:00:41 +03:00

58 lines
2.6 KiB
Java

package net.minecraft.client.renderer;
import com.mojang.serialization.Codec;
import com.mojang.serialization.DataResult;
import com.mojang.serialization.codecs.RecordCodecBuilder;
import java.util.List;
import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment;
import net.minecraft.resources.ResourceLocation;
@Environment(EnvType.CLIENT)
public record ShaderProgramConfig(
ResourceLocation vertex,
ResourceLocation fragment,
List<ShaderProgramConfig.Sampler> samplers,
List<ShaderProgramConfig.Uniform> uniforms,
ShaderDefines defines
) {
public static final Codec<ShaderProgramConfig> CODEC = RecordCodecBuilder.create(
instance -> instance.group(
ResourceLocation.CODEC.fieldOf("vertex").forGetter(ShaderProgramConfig::vertex),
ResourceLocation.CODEC.fieldOf("fragment").forGetter(ShaderProgramConfig::fragment),
ShaderProgramConfig.Sampler.CODEC.listOf().optionalFieldOf("samplers", List.of()).forGetter(ShaderProgramConfig::samplers),
ShaderProgramConfig.Uniform.CODEC.listOf().optionalFieldOf("uniforms", List.of()).forGetter(ShaderProgramConfig::uniforms),
ShaderDefines.CODEC.optionalFieldOf("defines", ShaderDefines.EMPTY).forGetter(ShaderProgramConfig::defines)
)
.apply(instance, ShaderProgramConfig::new)
);
@Environment(EnvType.CLIENT)
public record Sampler(String name) {
public static final Codec<ShaderProgramConfig.Sampler> CODEC = RecordCodecBuilder.create(
instance -> instance.group(Codec.STRING.fieldOf("name").forGetter(ShaderProgramConfig.Sampler::name)).apply(instance, ShaderProgramConfig.Sampler::new)
);
}
@Environment(EnvType.CLIENT)
public record Uniform(String name, String type, int count, List<Float> values) {
public static final Codec<ShaderProgramConfig.Uniform> CODEC = RecordCodecBuilder.<ShaderProgramConfig.Uniform>create(
instance -> instance.group(
Codec.STRING.fieldOf("name").forGetter(ShaderProgramConfig.Uniform::name),
Codec.STRING.fieldOf("type").forGetter(ShaderProgramConfig.Uniform::type),
Codec.INT.fieldOf("count").forGetter(ShaderProgramConfig.Uniform::count),
Codec.FLOAT.listOf().fieldOf("values").forGetter(ShaderProgramConfig.Uniform::values)
)
.apply(instance, ShaderProgramConfig.Uniform::new)
)
.validate(ShaderProgramConfig.Uniform::validate);
private static DataResult<ShaderProgramConfig.Uniform> validate(ShaderProgramConfig.Uniform uniform) {
int i = uniform.count;
int j = uniform.values.size();
return j != i && j > 1
? DataResult.error(() -> "Invalid amount of uniform values specified (expected " + i + ", found " + j + ")")
: DataResult.success(uniform);
}
}
}