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

68 lines
1.8 KiB
Java

package speiger.src.coreengine.rendering.shader;
import org.lwjgl.opengl.GL20;
import speiger.src.collections.objects.lists.ObjectArrayList;
import speiger.src.collections.objects.lists.ObjectList;
import speiger.src.coreengine.assets.base.IAssetProvider;
import speiger.src.coreengine.assets.base.IManagedAsset;
import speiger.src.coreengine.assets.base.IReloadableAsset.ISimpleRealodableAsset;
public class ShaderTracker implements ISimpleRealodableAsset, IManagedAsset {
ObjectList<Shader<?>> shaders = new ObjectArrayList<>();
int activeShaderId;
IAssetProvider provider;
public void register(Shader<?> shader) {
shaders.add(shader);
load(provider, shader);
}
public void remove(Shader<?> shader) {
shaders.remove(shader);
}
public void bind(ShaderProgram program) {
bind(shaderId(program));
}
public void bind(int shaderId) {
if(activeShaderId == shaderId) return;
activeShaderId = shaderId;
GL20.glUseProgram(shaderId);
}
public void unbind() { bind(0); }
public boolean isActive() { return activeShaderId != 0; }
public boolean isShaderActive(ShaderProgram program) { return activeShaderId == shaderId(program); }
public int getActiveShader() { return activeShaderId; }
private int shaderId(ShaderProgram program) {
return program == null ? 0 : program.id();
}
@Override
public void destroy() {
shaders.forEach(Shader::remove);
shaders.clear();
activeShaderId = 0;
}
@Override
public String getName() { return "shader_tracker"; }
@Override
public void setProvider(IAssetProvider provider) { this.provider = provider; }
@Override
public void onAssetsReloaded(IAssetProvider provider) {
ShaderProgram.IMPORTS.clear();
shaders.forEach(provider, this::load);
activeShaderId = 0;
}
private void load(IAssetProvider provider, Shader<?> shader) {
shader.load(provider);
shader.validate();
}
}