module re.gfx.effect;

import re.gfx.raytypes;
static import raylib;

/// represents an effect
struct Effect {
    /// the shader program for the effect
    Shader shader;
    /// the tint color
    Color color = Colors.WHITE;

    public void set_shader_var_imm(T)(string name, T value) {
        T var = value;
        set_shader_var(name, var);
    }

    public void set_shader_var(T)(string name, ref T value) {
        import std.string : toStringz;

        auto loc = raylib.GetShaderLocation(shader, name.toStringz);
        raylib.ShaderUniformDataType val_type;
        alias vartype = raylib.ShaderUniformDataType;
        static if (is(T == float)) {
            val_type = vartype.SHADER_UNIFORM_FLOAT;
        } else static if (is(T == int)) {
            val_type = vartype.SHADER_UNIFORM_INT;
        } else static if (is(T == float[2])) {
            val_type = vartype.SHADER_UNIFORM_VEC2;
        } else static if (is(T == float[3])) {
            val_type = vartype.SHADER_UNIFORM_VEC3;
        } else static if (is(T == float[4])) {
            val_type = vartype.SHADER_UNIFORM_VEC4;
        } else static if (is(T == int[2])) {
            val_type = vartype.SHADER_UNIFORM_IVEC2;
        } else static if (is(T == int[3])) {
            val_type = vartype.SHADER_UNIFORM_IVEC3;
        } else static if (is(T == int[4])) {
            val_type = vartype.SHADER_UNIFORM_IVEC4;
        } else {
            static assert(0, "unrecognized shader value data type");
        }
        raylib.SetShaderValue(shader, loc, &value, val_type);
    }
}