minecraft-src/com/mojang/blaze3d/shaders/CompiledShader.java
2025-07-04 02:49:36 +03:00

94 lines
2.6 KiB
Java

package com.mojang.blaze3d.shaders;
import com.mojang.blaze3d.platform.GlStateManager;
import com.mojang.blaze3d.systems.RenderSystem;
import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment;
import net.minecraft.client.renderer.ShaderManager;
import net.minecraft.resources.FileToIdConverter;
import net.minecraft.resources.ResourceLocation;
import org.apache.commons.lang3.StringUtils;
import org.jetbrains.annotations.Nullable;
@Environment(EnvType.CLIENT)
public class CompiledShader implements AutoCloseable {
private static final int NOT_ALLOCATED = -1;
private final ResourceLocation id;
private int shaderId;
private CompiledShader(int shaderId, ResourceLocation id) {
this.id = id;
this.shaderId = shaderId;
}
public static CompiledShader compile(ResourceLocation shaderId, CompiledShader.Type type, String source) throws ShaderManager.CompilationException {
RenderSystem.assertOnRenderThread();
int i = GlStateManager.glCreateShader(type.glType());
GlStateManager.glShaderSource(i, source);
GlStateManager.glCompileShader(i);
if (GlStateManager.glGetShaderi(i, 35713) == 0) {
String string = StringUtils.trim(GlStateManager.glGetShaderInfoLog(i, 32768));
throw new ShaderManager.CompilationException("Couldn't compile " + type.getName() + " shader (" + shaderId + ") : " + string);
} else {
return new CompiledShader(i, shaderId);
}
}
public void close() {
if (this.shaderId == -1) {
throw new IllegalStateException("Already closed");
} else {
RenderSystem.assertOnRenderThread();
GlStateManager.glDeleteShader(this.shaderId);
this.shaderId = -1;
}
}
public ResourceLocation getId() {
return this.id;
}
public int getShaderId() {
return this.shaderId;
}
@Environment(EnvType.CLIENT)
public static enum Type {
VERTEX("vertex", ".vsh", 35633),
FRAGMENT("fragment", ".fsh", 35632);
private static final CompiledShader.Type[] TYPES = values();
private final String name;
private final String extension;
private final int glType;
private Type(final String name, final String extension, final int glType) {
this.name = name;
this.extension = extension;
this.glType = glType;
}
@Nullable
public static CompiledShader.Type byLocation(ResourceLocation location) {
for (CompiledShader.Type type : TYPES) {
if (location.getPath().endsWith(type.extension)) {
return type;
}
}
return null;
}
public String getName() {
return this.name;
}
public int glType() {
return this.glType;
}
public FileToIdConverter idConverter() {
return new FileToIdConverter("shaders", this.extension);
}
}
}