--- /dev/null
+#version 450
+
+uniform sampler2D tex;
+
+uniform vec4 diffuse;
+uniform vec4 specular;
+uniform float shininess;
+
+varying vec3 pos;
+varying vec3 normal;
+varying vec3 ldir;
+varying vec2 tex_coord;
+
+out vec4 color;
+
+void main()
+{
+ vec3 p = normalize(pos);
+ vec3 n = normalize(normal);
+ vec3 l = normalize(ldir);
+
+ vec3 r = normalize(-reflect(l, n));
+ vec3 vdir = normalize(-p);
+
+ float cdiff = max(dot(l, n), 0.0);
+ float cspec = pow(max(dot(r, vdir), 0.0), shininess);
+
+ vec4 texel = texture2D(tex, tex_coord);
+ color.xyz = diffuse.xyz * cdiff * texel.xyz + specular.xyz * cspec;
+ color.w = 1.0;
+}
--- /dev/null
+#version 450
+
+uniform mat4 mview;
+uniform mat4 mmviewproj;
+
+varying vec3 pos;
+varying vec3 normal;
+varying vec3 ldir;
+varying vec2 tex_coord;
+
+const vec3 lpos = vec3(-10.0, 100.0, 10.0);
+
+/* attributes */
+layout(location = 1) in vec3 attr_pos;
+layout(location = 2) in vec3 attr_normal;
+layout(location = 3) in vec2 attr_tex;
+
+void main()
+{
+ gl_Position = mmviewproj * vec4(attr_pos, 1.0);
+
+ pos = (mview * vec4(attr_pos, 1.0)).xyz;
+ ldir = (mview * vec4(lpos, 1.0)).xyz;
+
+ mat3 normal_matrix = mat3(mview);
+ normal = normal_matrix * attr_normal;
+ tex_coord = attr_tex;
+}
\ No newline at end of file
--- /dev/null
+#include "global.h"
+#include "morph_renderer.h"
+#include "scene.h"
+#include "shader.h"
+#include "shader_manager.h"
+
+MorphRenderer::MorphRenderer()
+{
+ scene = 0;
+ camera = 0;
+ sprog = 0;
+
+ /* we won't use them */
+ skytex = 0;
+ dskytex = 0;
+}
+
+MorphRenderer::~MorphRenderer()
+{
+}
+
+bool MorphRenderer::create()
+{
+ if(!(sprog = sdr_man->create_shader_program("morphing.v.glsl", "morphing.f.glsl"))) {
+ return false;
+ }
+
+ /* getting material uniform locations: diffuse, specular, specular exponent (strength) */
+
+ diff_loc = sprog->get_uniform_location("diffuse");
+ spec_loc = sprog->get_uniform_location("specular");
+ shin_loc = sprog->get_uniform_location("shininess");
+
+ /* uniform locations for matrices */
+
+ mmviewproj_loc = sprog->get_uniform_location("mmviewproj");
+ mview_loc = sprog->get_uniform_location("mview");
+
+ return true;
+}
+
+void MorphRenderer::draw() const
+{
+ if(!camera || !scene)
+ return;
+
+ if(!sprog->link())
+ return;
+
+ sprog->use();
+
+ for(size_t i=0; i<scene->objects.size(); i++) {
+ draw_object(scene->objects[i]);
+ }
+}
\ No newline at end of file
--- /dev/null
+#ifndef MORPH_RENDERER_H_
+#define MORPH_RENDERER_H_
+
+#include "renderer.h"
+
+class MorphRenderer : public Renderer {
+public:
+ MorphRenderer();
+ virtual ~MorphRenderer();
+
+ virtual bool create();
+ virtual void draw() const;
+};
+
+#endif // MORPH_RENDERER_H_
\ No newline at end of file