#pragma once #include "util.h" bool check_uniform_uniqueness(); enum class kShaderUniform : uint16_t { MVP = const_hash("mvp"), Tex = const_hash("tex"), TexA = const_hash("tex_alpha"), TexFG = const_hash("tex_fg"), TexBG = const_hash("tex_bg"), TexMix = const_hash("tex_mix"), TexMixA = const_hash("tex_mix_alpha"), TexMask = const_hash("tex_mask"), TexDual = const_hash("tex_dual"), TexStroke = const_hash("tex_stroke"), TexPattern = const_hash("tex_pattern"), PatternOffset = const_hash("pattern_offset"), PatternAlpha = const_hash("pattern_alpha"), MixAlpha = const_hash("mix_alpha"), Opacity = const_hash("opacity"), Wet = const_hash("wet"), Lock = const_hash("lock"), Col = const_hash("col"), Tof = const_hash("tof"), Tsz = const_hash("tsz"), Alpha = const_hash("alpha"), Mask = const_hash("mask"), Resolution = const_hash("resolution"), Highlight = const_hash("highlight"), BlendMode = const_hash("blend_mode"), DualBlendMode = const_hash("dual_blend_mode"), Noise = const_hash("noise"), Direction = const_hash("dir"), UseDual = const_hash("use_dual"), UsePattern = const_hash("use_pattern"), LightDir = const_hash("light_dir"), Mode = const_hash("mode"), Ambient = const_hash("ambient"), PatternInvert = const_hash("pattern_invert"), PatternScale = const_hash("pattern_scale"), PatternBright = const_hash("pattern_bright"), PatternContrast = const_hash("pattern_contr"), PatternDepth = const_hash("pattern_depth"), PatternBlendMode = const_hash("patt_blend_mode"), Colorize = const_hash("colorize"), DualAlpha = const_hash("dual_alpha"), DrawOnScreen = const_hash("draw_on_screen"), }; enum class kShader : uint16_t { Color = const_hash("color"), ColorQuad = const_hash("color-quad"), ColorTri = const_hash("color-tri"), ColorHue = const_hash("color-hue"), Texture = const_hash("texture"), TextureAlpha= const_hash("texture-alpha"), TextureAlphaSep= const_hash("texture-alpha-sep"), TextureBlend= const_hash("texture-blend"), CompErase = const_hash("comp-erase"), CompDraw = const_hash("comp-draw"), UVs = const_hash("uvs"), UVs_2 = const_hash("uvs2"), Font = const_hash("font"), Atlas = const_hash("atlas"), Stroke = const_hash("stroke"), StrokePreview = const_hash("stroke-preview"), Checkerboard= const_hash("checkerboard"), Equirect = const_hash("equirect"), BrushStroke = const_hash("brush-stroke"), VertexColor = const_hash("vertex-color"), Lambert = const_hash("lambert"), LambertLightmap = const_hash("lambert-lightmap"), BakeUV = const_hash("bakeuv"), }; class Shader { std::map m_deps; std::string m_path; std::map m_umap; GLuint prog; std::string read(const std::string& path); public: kShader name; void parse_error(const char* msg, const char* code); bool load(const std::string& path); bool reload(); bool create(const char* vertex, const char* fragment); void destroy(); void use(); void u_vec4(kShaderUniform id, const glm::vec4& v); void u_vec3(kShaderUniform id, const glm::vec3& v); void u_vec2(kShaderUniform id, const glm::vec2& v); void u_mat4(kShaderUniform id, const glm::mat4& m); void u_int(kShaderUniform id, int i); void u_float(kShaderUniform id, float f); GLint GetAttribLocation(const char* name); }; class ShaderManager { static std::map m_shaders; static Shader* m_current; public: static bool ext_framebuffer_fetch; static bool load(kShader id, const std::string& path); static bool reload(); static bool create(kShader id, const char* vertex, const char* fragment); static void use(kShader id); static void use(const char* name); static Shader* get(kShader id); static void u_vec4(kShaderUniform id, const glm::vec4& v); static void u_vec3(kShaderUniform id, const glm::vec3& v); static void u_vec2(kShaderUniform id, const glm::vec2& v); static void u_mat4(kShaderUniform id, const glm::mat4& m); static void u_int(kShaderUniform id, int i); static void u_float(kShaderUniform id, float f); static void invalidate(); };