added morphing to the cow
authorEleni Maria Stea <estea@igalia.com>
Mon, 21 Aug 2017 15:20:33 +0000 (18:20 +0300)
committerEleni Maria Stea <estea@igalia.com>
Mon, 21 Aug 2017 15:20:33 +0000 (18:20 +0300)
gl_shaders/default.v.glsl
gl_shaders/morphing.v.glsl
src/global.h
src/main.cc
src/morph_renderer.cc
src/morph_renderer.h
src/renderer.h

index 38a19a4..455759d 100644 (file)
@@ -26,4 +26,4 @@ void main()
        mat3 normal_matrix = mat3(mview);
        normal = normal_matrix * attr_normal;
        tex_coord = attr_tex;
-}
+}
\ No newline at end of file
index cbb3d9e..6f72aa7 100644 (file)
@@ -3,12 +3,15 @@
 uniform mat4 mview;
 uniform mat4 mmviewproj;
 
+uniform float t;
+const float half_height = 0.855;
+
 varying vec3 pos;
 varying vec3 normal;
 varying vec3 ldir;
 varying vec2 tex_coord;
 
-const vec3 lpos = vec3(-10.0, 100.0, 10.0);
+const vec3 lpos = vec3(0.0, 100.0, -10.0);
 
 /* attributes */
 layout(location = 1) in vec3 attr_pos;
@@ -17,12 +20,21 @@ layout(location = 3) in vec2 attr_tex;
 
 void main()
 {
-       gl_Position = mmviewproj * vec4(attr_pos, 1.0);
+       vec3 sph_pos = normalize(vec3(attr_pos.x, attr_pos.y - half_height, attr_pos.z));
+
+       vec3 sph_normal = sph_pos;
+       sph_pos.y += half_height;
+
+       vec3 p = mix(attr_pos, sph_pos, t);
+       vec3 n = mix(attr_normal, sph_normal, t);
 
-       pos = (mview * vec4(attr_pos, 1.0)).xyz;
+       gl_Position = mmviewproj * vec4(p, 1.0);
+
+       pos = (mview * vec4(p, 1.0)).xyz;
        ldir = (mview * vec4(lpos, 1.0)).xyz;
 
        mat3 normal_matrix = mat3(mview);
-       normal = normal_matrix * attr_normal;
+       normal = normal_matrix * n;
+
        tex_coord = attr_tex;
 }
\ No newline at end of file
index 12aca5c..cbcbed6 100644 (file)
@@ -7,5 +7,6 @@
 
 extern ShaderManager *sdr_man;
 extern Mat4 mprojection;
+extern double time_sec;
 
 #endif // GLOBAL_H_
\ No newline at end of file
index d4d4226..1246d2f 100644 (file)
@@ -13,8 +13,8 @@
 /* TODO: fix those */
 #include "camera.h"
 #include "mesh.h"
+#include "morph_renderer.h"
 #include "object.h"
-#include "renderer.h"
 #include "scene.h"
 #include "terrain.h"
 #include "texture.h"
@@ -43,9 +43,10 @@ GLFWwindow *win;
 int win_w = 800;
 int win_h = 600;
 
-
 ShaderManager *sdr_man;
 
+double time_sec;
+
 /* variables */
 static bool move_camera;
 
@@ -59,7 +60,7 @@ static OrbitCamera *camera;
 
 static Scene *cow_scene;
 static Object *cow_object;
-static Renderer *cow_rend;
+static MorphRenderer *cow_rend;
 
 static Terrain terrain;
 static Texture *skybox_tex;
@@ -128,7 +129,7 @@ static bool init(Gfx_API api)
                return false;
        }
 
-       cow_rend = new Renderer;
+       cow_rend = new MorphRenderer;
        cow_rend->camera = camera;
        cow_rend->scene = cow_scene;
 
@@ -299,9 +300,9 @@ static void update(float dt)
 static void display()
 {
        static float prev_tsec;
-       float tsec = glfwGetTime();
-       float dt = tsec - prev_tsec;
-       prev_tsec = tsec;
+       time_sec = glfwGetTime();
+       float dt = time_sec - prev_tsec;
+       prev_tsec = time_sec;
 
        update(dt);
 
index f31b8fe..ae91625 100644 (file)
@@ -30,6 +30,7 @@ bool MorphRenderer::create()
        diff_loc = sprog->get_uniform_location("diffuse");
        spec_loc = sprog->get_uniform_location("specular");
        shin_loc = sprog->get_uniform_location("shininess");
+       t_loc = sprog->get_uniform_location("t");
 
        /* uniform locations for matrices */
 
@@ -52,4 +53,14 @@ void MorphRenderer::draw() const
        for(size_t i=0; i<scene->objects.size(); i++) {
                draw_object(scene->objects[i]);
        }
+}
+
+void MorphRenderer::draw_object(Object *object) const
+{
+       float t =  (sin(time_sec) + 1) * 0.5;
+
+       if(t_loc != -1)
+               sprog->set_uniformf(t_loc, t);
+
+       Renderer::draw_object(object);
 }
\ No newline at end of file
index 3b5e567..aebb922 100644 (file)
@@ -4,12 +4,17 @@
 #include "renderer.h"
 
 class MorphRenderer : public Renderer {
+protected:
+       int t_loc;
+
+       virtual void draw_object(Object *object) const override;
+
 public:
        MorphRenderer();
        virtual ~MorphRenderer();
 
-       virtual bool create();
-       virtual void draw() const;
+       virtual bool create() override;
+       virtual void draw() const override;
 };
 
 #endif // MORPH_RENDERER_H_
\ No newline at end of file
index c3fb0bf..a14d69c 100644 (file)
@@ -5,6 +5,7 @@ class OrbitCamera;
 class Object;
 class Scene;
 class ShaderProgram;
+class Texture;
 
 class Renderer {
 protected: