#ifndef SHADER_H #define SHADER_H #include "aliases.h" #include "img.h" #include "obj.h" #include "vec.h" typedef struct shader_id ShaderID; struct shader_id { u64 id; }; typedef struct fragment_result FragmentResult; struct fragment_result { Colour colour; bool discard; }; typedef struct fragment_data FragmentData; struct fragment_data { V3f position; V3f normal; V2f tex_coords; }; #define INVALID_SHADER ((ShaderID){0}) #define IS_INVALID_SHADER(ID) (ID.id == 0) #define DISCARDED_FRAGMENT ((FragmentResult){.discard = true}) #define DISCARD_FRAGMENT(RESULT) (RESULT.discard) typedef V3f(VertexShader)(void *shader, const V3f *vertex); typedef FragmentResult(FragmentShader)(void *shader, const FragmentData *data, const Colour *colour, const Model *model); ShaderID register_shader(void *shader, VertexShader *vertex, FragmentShader *fragment); V3f run_vertex_shader(ShaderID shader, const V3f *vertex); FragmentResult run_fragment_shader(ShaderID shader, const FragmentData *data, const Colour *colour, const Model *model); #endif // SHADER_H