mat3 normal_matrix = mat3(mview);
normal = normal_matrix * attr_normal;
tex_coord = attr_tex;
-}
+}
\ No newline at end of file
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;
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
extern ShaderManager *sdr_man;
extern Mat4 mprojection;
+extern double time_sec;
#endif // GLOBAL_H_
\ No newline at end of file
/* 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"
int win_w = 800;
int win_h = 600;
-
ShaderManager *sdr_man;
+double time_sec;
+
/* variables */
static bool move_camera;
static Scene *cow_scene;
static Object *cow_object;
-static Renderer *cow_rend;
+static MorphRenderer *cow_rend;
static Terrain terrain;
static Texture *skybox_tex;
return false;
}
- cow_rend = new Renderer;
+ cow_rend = new MorphRenderer;
cow_rend->camera = camera;
cow_rend->scene = cow_scene;
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);
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 */
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
#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
class Object;
class Scene;
class ShaderProgram;
+class Texture;
class Renderer {
protected: