From: Eleni Maria Stea Date: Mon, 21 Aug 2017 09:13:42 +0000 (+0300) Subject: added morph_renderer X-Git-Url: https://eleni.mutantstargoat.com/git/?p=demo;a=commitdiff_plain;h=f4ba93a902613f2b2c4a397d5a526fb4a4161e86 added morph_renderer --- diff --git a/gl_shaders/morphing.f.glsl b/gl_shaders/morphing.f.glsl new file mode 100644 index 0000000..490efab --- /dev/null +++ b/gl_shaders/morphing.f.glsl @@ -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 index 0000000..cbb3d9e --- /dev/null +++ b/gl_shaders/morphing.v.glsl @@ -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 index 0000000..f31b8fe --- /dev/null +++ b/src/morph_renderer.cc @@ -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; iobjects.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 index 0000000..3b5e567 --- /dev/null +++ b/src/morph_renderer.h @@ -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