File size: 3,182 Bytes
d46f4a3
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
58
59
60
package net.minecraft.client.renderer;

import com.mojang.serialization.Codec;
import com.mojang.serialization.DataResult;
import com.mojang.serialization.codecs.RecordCodecBuilder;
import com.mojang.serialization.codecs.RecordCodecBuilder.Instance;
import java.util.List;
import net.minecraft.resources.ResourceLocation;
import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn;

@OnlyIn(Dist.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(
        p_363443_ -> p_363443_.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(p_363443_, ShaderProgramConfig::new)
    );

    @OnlyIn(Dist.CLIENT)
    public static record Sampler(String name) {
        public static final Codec<ShaderProgramConfig.Sampler> CODEC = RecordCodecBuilder.create(
            p_369078_ -> p_369078_.group(Codec.STRING.fieldOf("name").forGetter(ShaderProgramConfig.Sampler::name))
                    .apply(p_369078_, ShaderProgramConfig.Sampler::new)
        );
    }

    @OnlyIn(Dist.CLIENT)
    public static record Uniform(String name, String type, int count, List<Float> values) {
        public static final Codec<ShaderProgramConfig.Uniform> CODEC = RecordCodecBuilder.<ShaderProgramConfig.Uniform>create(
                p_362962_ -> p_362962_.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(p_362962_, ShaderProgramConfig.Uniform::new)
            )
            .validate(ShaderProgramConfig.Uniform::validate);

        private static DataResult<ShaderProgramConfig.Uniform> validate(ShaderProgramConfig.Uniform p_368433_) {
            int i = p_368433_.count;
            int j = p_368433_.values.size();
            return j != i && j > 1
                ? DataResult.error(() -> "Invalid amount of uniform values specified (expected " + i + ", found " + j + ")")
                : DataResult.success(p_368433_);
        }
    }
}