]> git.localhorst.tv Git - blobs.git/blobdiff - src/graphics/shader.cpp
creature skin overhaul
[blobs.git] / src / graphics / shader.cpp
index 1b641b07107d8f2954dca055c7e249e3c3b410fa..0890dfdc8d308bf84f1de0c47db381bc35fca1e5 100644 (file)
@@ -282,6 +282,14 @@ void PlanetSurface::SetM(const glm::mat4 &mm) noexcept {
        prog.Uniform(mvp_handle, mvp);
 }
 
+void PlanetSurface::SetV(const glm::mat4 &vv) noexcept {
+       v = vv;
+       mv = v * m;
+       mvp = p * mv;
+       prog.Uniform(mv_handle, mv);
+       prog.Uniform(mvp_handle, mvp);
+}
+
 void PlanetSurface::SetVP(const glm::mat4 &vv, const glm::mat4 &pp) noexcept {
        v = vv;
        p = pp;
@@ -458,6 +466,14 @@ void SunSurface::SetM(const glm::mat4 &mm) noexcept {
        prog.Uniform(mvp_handle, mvp);
 }
 
+void SunSurface::SetV(const glm::mat4 &vv) noexcept {
+       v = vv;
+       mv = v * m;
+       mvp = p * mv;
+       prog.Uniform(mv_handle, mv);
+       prog.Uniform(mvp_handle, mvp);
+}
+
 void SunSurface::SetVP(const glm::mat4 &vv, const glm::mat4 &pp) noexcept {
        v = vv;
        p = pp;
@@ -530,6 +546,8 @@ CreatureSkin::CreatureSkin()
                "in vec3 frag_tex_uv;\n"
                "in vec3 normal;\n"
 
+               "uniform vec3 base_color;\n"
+               "uniform vec4 highlight_color;\n"
                "uniform sampler2DArray tex_sampler;\n"
                "uniform int num_lights;\n"
                "uniform LightSource light[8];\n"
@@ -537,14 +555,15 @@ CreatureSkin::CreatureSkin()
                "out vec3 color;\n"
 
                "void main() {\n"
-                       "vec3 tex_color = texture(tex_sampler, frag_tex_uv).rgb;\n"
-                       "vec3 total_light = tex_color * vec3(0.01, 0.01, 0.01);\n"
+                       "vec4 tex_color = texture(tex_sampler, frag_tex_uv);\n"
+                       "vec3 mat_color = mix(base_color, highlight_color.rgb, tex_color.r * tex_color.a * highlight_color.a);\n"
+                       "vec3 total_light = mat_color * vec3(0.1, 0.1, 0.1);\n"
                        "for (int i = 0; i < num_lights; ++i) {\n"
                                "vec3 to_light = light[i].position - vtx_viewspace;\n"
                                "float distance = length(to_light) + length(vtx_viewspace);\n"
                                "vec3 light_dir = normalize(to_light);\n"
                                "float attenuation = light[i].strength / (distance * distance);\n"
-                               "vec3 diffuse = attenuation * max(0.0, dot(normal, light_dir)) * light[i].color * tex_color;\n"
+                               "vec3 diffuse = attenuation * max(0.0, dot(normal, light_dir)) * light[i].color * mat_color;\n"
                                "vec3 view_dir = vec3(0.0, 0.0, 1.0);\n"
                                "vec3 specular = vec3(0.0, 0.0, 0.0);\n"
                                "if (dot(normal, light_dir) >= 0.0) {\n"
@@ -563,6 +582,8 @@ CreatureSkin::CreatureSkin()
        m_handle = prog.UniformLocation("M");
        mv_handle = prog.UniformLocation("MV");
        mvp_handle = prog.UniformLocation("MVP");
+       base_color_handle = prog.UniformLocation("base_color");
+       highlight_color_handle = prog.UniformLocation("highlight_color");
        sampler_handle = prog.UniformLocation("tex_sampler");
        num_lights_handle = prog.UniformLocation("num_lights");
        for (int i = 0; i < MAX_LIGHTS; ++i) {
@@ -592,6 +613,14 @@ void CreatureSkin::SetM(const glm::mat4 &mm) noexcept {
        prog.Uniform(mvp_handle, mvp);
 }
 
+void CreatureSkin::SetV(const glm::mat4 &vv) noexcept {
+       v = vv;
+       mv = v * m;
+       mvp = p * mv;
+       prog.Uniform(mv_handle, mv);
+       prog.Uniform(mvp_handle, mvp);
+}
+
 void CreatureSkin::SetVP(const glm::mat4 &vv, const glm::mat4 &pp) noexcept {
        v = vv;
        p = pp;
@@ -612,6 +641,14 @@ void CreatureSkin::SetMVP(const glm::mat4 &mm, const glm::mat4 &vv, const glm::m
        prog.Uniform(mvp_handle, mvp);
 }
 
+void CreatureSkin::SetBaseColor(const glm::vec3 &c) noexcept {
+       prog.Uniform(base_color_handle, c);
+}
+
+void CreatureSkin::SetHighlightColor(const glm::vec4 &c) noexcept {
+       prog.Uniform(highlight_color_handle, c);
+}
+
 void CreatureSkin::SetTexture(ArrayTexture &tex) noexcept {
        glActiveTexture(GL_TEXTURE0);
        tex.Bind();