added morph_renderer
authorEleni Maria Stea <estea@igalia.com>
Mon, 21 Aug 2017 09:13:42 +0000 (12:13 +0300)
committerEleni Maria Stea <estea@igalia.com>
Mon, 21 Aug 2017 09:13:42 +0000 (12:13 +0300)
gl_shaders/morphing.f.glsl [new file with mode: 0644]
gl_shaders/morphing.v.glsl [new file with mode: 0644]
src/morph_renderer.cc [new file with mode: 0644]
src/morph_renderer.h [new file with mode: 0644]

diff --git a/gl_shaders/morphing.f.glsl b/gl_shaders/morphing.f.glsl
new file mode 100644 (file)
index 0000000..490efab
--- /dev/null
@@ -0,0 +1,31 @@
+#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;
+}
diff --git a/gl_shaders/morphing.v.glsl b/gl_shaders/morphing.v.glsl
new file mode 100644 (file)
index 0000000..cbb3d9e
--- /dev/null
@@ -0,0 +1,28 @@
+#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
diff --git a/src/morph_renderer.cc b/src/morph_renderer.cc
new file mode 100644 (file)
index 0000000..f31b8fe
--- /dev/null
@@ -0,0 +1,55 @@
+#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
diff --git a/src/morph_renderer.h b/src/morph_renderer.h
new file mode 100644 (file)
index 0000000..3b5e567
--- /dev/null
@@ -0,0 +1,15 @@
+#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