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());
}
}
}引用的其他类
- 无