SimpleJavaEngine/src/main/java/speiger/src/coreengine/rendering/shader/Shader.java

50 lines
1.2 KiB
Java

package speiger.src.coreengine.rendering.shader;
import java.util.function.Function;
import java.util.function.Supplier;
import speiger.src.coreengine.assets.base.IAssetProvider;
import speiger.src.coreengine.rendering.utils.GLStateTracker;
public class Shader<T extends ShaderProgram> implements Supplier<T> {
T program;
Function<IAssetProvider, T> provider;
private Shader(Function<IAssetProvider, T> provider) {
this.provider = provider;
}
public static <T extends ShaderProgram> Shader<T> create(Function<IAssetProvider, T> provider) {
return new Shader<>(provider);
}
public static <T extends ShaderProgram> Shader<T> createAndRegister(Function<IAssetProvider, T> provider) {
Shader<T> shader = new Shader<>(provider);
GLStateTracker.SHADERS.register(shader);
return shader;
}
public void load(IAssetProvider provider) {
if(program != null) program.remove();
program = this.provider.apply(provider);
}
public void validate() {
if(program == null) return;
program.validateProgram();
}
public void remove() {
if(program == null) return;
program.remove();
program = null;
}
public void removeProgram() {
remove();
GLStateTracker.SHADERS.remove(this);
}
@Override
public T get() { return program; }
}