module allegro5.shader;

import allegro5.bitmap;
import allegro5.transformations;
import allegro5.internal.da5;

nothrow @nogc extern(C)
{
	struct ALLEGRO_SHADER {};

	enum ALLEGRO_SHADER_TYPE
	{
		ALLEGRO_VERTEX_SHADER = 1,
		ALLEGRO_PIXEL_SHADER = 2
	}

	enum ALLEGRO_SHADER_PLATFORM {
		ALLEGRO_SHADER_AUTO = 0,
		ALLEGRO_SHADER_GLSL = 1,
		ALLEGRO_SHADER_HLSL = 2
	}

	const ALLEGRO_SHADER_VAR_COLOR           = "al_color";
	const ALLEGRO_SHADER_VAR_POS             = "al_pos";
	const ALLEGRO_SHADER_VAR_PROJVIEW_MATRIX = "al_projview_matrix";
	const ALLEGRO_SHADER_VAR_TEX             = "al_tex";
	const ALLEGRO_SHADER_VAR_TEXCOORD        = "al_texcoord";
	const ALLEGRO_SHADER_VAR_TEX_MATRIX      = "al_tex_matrix";
	const ALLEGRO_SHADER_VAR_USER_ATTR       = "al_user_attr_";
	const ALLEGRO_SHADER_VAR_USE_TEX         = "al_use_tex";
	const ALLEGRO_SHADER_VAR_USE_TEX_MATRIX  = "al_use_tex_matrix";

	ALLEGRO_SHADER* al_create_shader(ALLEGRO_SHADER_PLATFORM platform);
	bool al_attach_shader_source(ALLEGRO_SHADER* shader, ALLEGRO_SHADER_TYPE type, const_char* source);
	bool al_attach_shader_source_file(ALLEGRO_SHADER* shader, ALLEGRO_SHADER_TYPE type, const_char* filename);
	bool al_build_shader(ALLEGRO_SHADER* shader);
	const_char* al_get_shader_log(ALLEGRO_SHADER* shader);
	ALLEGRO_SHADER_PLATFORM al_get_shader_platform(ALLEGRO_SHADER* shader);
	bool al_use_shader(ALLEGRO_SHADER* shader);
	void al_destroy_shader(ALLEGRO_SHADER* shader);

	bool al_set_shader_sampler(const_char* name, ALLEGRO_BITMAP* bitmap, int unit);
	bool al_set_shader_matrix(const_char* name, ALLEGRO_TRANSFORM* matrix);
	bool al_set_shader_int(const_char* name, int i);
	bool al_set_shader_float(const_char* name, float f);
	bool al_set_shader_int_vector(const_char* name, int num_components, int* i, int num_elems);
	bool al_set_shader_float_vector(const_char* name, int num_components, float* f, int num_elems);
	bool al_set_shader_bool(const_char* name, bool b);

	const_char* al_get_default_shader_source(ALLEGRO_SHADER_PLATFORM platform, ALLEGRO_SHADER_TYPE type);
}