ShaderDefines.java

net.minecraft.client.renderer.ShaderDefines

信息

  • 全限定名:net.minecraft.client.renderer.ShaderDefines
  • 类型:public record
  • 包:net.minecraft.client.renderer
  • 源码路径:src/main/java/net/minecraft/client/renderer/ShaderDefines.java
  • 起始行号:L15
  • 职责:

    TODO

字段/常量

  • EMPTY

    • 类型: ShaderDefines
    • 修饰符: public static final
    • 源码定位: L16
    • 说明:

      TODO

  • CODEC

    • 类型: Codec<ShaderDefines>
    • 修饰符: public static final
    • 源码定位: L17
    • 说明:

      TODO

内部类/嵌套类型

  • net.minecraft.client.renderer.ShaderDefines.Builder
    • 类型: class
    • 修饰符: public static
    • 源码定位: L66
    • 说明:

      TODO

构造器

方法

下面的方法块按源码顺序生成。

public static ShaderDefines.Builder builder() @ L25

  • 方法名:builder
  • 源码定位:L25
  • 返回类型:ShaderDefines.Builder
  • 修饰符:public static

参数:

说明:

TODO

public ShaderDefines withOverrides(ShaderDefines defines) @ L29

  • 方法名:withOverrides
  • 源码定位:L29
  • 返回类型:ShaderDefines
  • 修饰符:public

参数:

  • defines: ShaderDefines

说明:

TODO

public String asSourceDirectives() @ L45

  • 方法名:asSourceDirectives
  • 源码定位:L45
  • 返回类型:String
  • 修饰符:public

参数:

说明:

TODO

public boolean isEmpty() @ L61

  • 方法名:isEmpty
  • 源码定位:L61
  • 返回类型:boolean
  • 修饰符:public

参数:

说明:

TODO

代码

@OnlyIn(Dist.CLIENT)
public record ShaderDefines(Map<String, String> values, Set<String> flags) {
    public static final ShaderDefines EMPTY = new ShaderDefines(Map.of(), Set.of());
    public static final Codec<ShaderDefines> CODEC = RecordCodecBuilder.create(
        i -> i.group(
                Codec.unboundedMap(Codec.STRING, Codec.STRING).optionalFieldOf("values", Map.of()).forGetter(ShaderDefines::values),
                Codec.STRING.listOf().xmap(Set::copyOf, List::copyOf).optionalFieldOf("flags", Set.of()).forGetter(ShaderDefines::flags)
            )
            .apply(i, ShaderDefines::new)
    );
 
    public static ShaderDefines.Builder builder() {
        return new ShaderDefines.Builder();
    }
 
    public ShaderDefines withOverrides(ShaderDefines defines) {
        if (this.isEmpty()) {
            return defines;
        } else if (defines.isEmpty()) {
            return this;
        } else {
            ImmutableMap.Builder<String, String> newValues = ImmutableMap.builderWithExpectedSize(this.values.size() + defines.values.size());
            newValues.putAll(this.values);
            newValues.putAll(defines.values);
            ImmutableSet.Builder<String> newFlags = ImmutableSet.builderWithExpectedSize(this.flags.size() + defines.flags.size());
            newFlags.addAll(this.flags);
            newFlags.addAll(defines.flags);
            return new ShaderDefines(newValues.buildKeepingLast(), newFlags.build());
        }
    }
 
    public String asSourceDirectives() {
        StringBuilder directives = new StringBuilder();
 
        for (Entry<String, String> entry : this.values.entrySet()) {
            String key = entry.getKey();
            String value = entry.getValue();
            directives.append("#define ").append(key).append(" ").append(value).append('\n');
        }
 
        for (String flag : this.flags) {
            directives.append("#define ").append(flag).append('\n');
        }
 
        return directives.toString();
    }
 
    public boolean isEmpty() {
        return this.values.isEmpty() && this.flags.isEmpty();
    }
 
    @OnlyIn(Dist.CLIENT)
    public static class Builder {
        private final ImmutableMap.Builder<String, String> values = ImmutableMap.builder();
        private final ImmutableSet.Builder<String> flags = ImmutableSet.builder();
 
        private Builder() {
        }
 
        public ShaderDefines.Builder define(String key, String value) {
            if (value.isBlank()) {
                throw new IllegalArgumentException("Cannot define empty string");
            } else {
                this.values.put(key, escapeNewLines(value));
                return this;
            }
        }
 
        private static String escapeNewLines(String value) {
            return value.replaceAll("\n", "\\\\\n");
        }
 
        public ShaderDefines.Builder define(String key, float value) {
            this.values.put(key, String.valueOf(value));
            return this;
        }
 
        public ShaderDefines.Builder define(String key, int value) {
            this.values.put(key, String.valueOf(value));
            return this;
        }
 
        public ShaderDefines.Builder define(String key) {
            this.flags.add(key);
            return this;
        }
 
        public ShaderDefines build() {
            return new ShaderDefines(this.values.build(), this.flags.build());
        }
    }
}

引用的其他类