/// LSU EE 7700-2 (Sp 08), Graphics Processors
//
/// Homework 5 -- SOLUTION
void
vs_ff_vertex(vec4 vtx)
{
// Transform VTX in the same way fixed functionality would.
//
gl_Position = gl_ModelViewProjectionMatrix * vtx;
}
void
vs_lighting(vec4 vtx, vec4 color, vec3 normal)
{
// Perform lighting calculations VTX, using COLOR and NORMAL.
//
// Supposedly a tweak, but this routine doesn't do anything special.
vec4 vertex_e = gl_ModelViewMatrix * vtx;
vec3 norm_e = gl_NormalMatrix * normal;
vec4 light_pos = gl_LightSource[0].position;
vec4 v_vtx_light = light_pos - vertex_e;
float phase_light = dot(norm_e, normalize(v_vtx_light).xyz);
const vec3 ambient = gl_LightSource[0].ambient.rgb;
const vec3 diffuse = gl_LightSource[0].diffuse.rgb;
const float dist = length(v_vtx_light);
const float distsq = dot(v_vtx_light,v_vtx_light);
const float atten_inv =
gl_LightSource[0].constantAttenuation +
gl_LightSource[0].linearAttenuation * dist +
gl_LightSource[0].quadraticAttenuation * distsq;
vec4 new_color;
new_color.rgb = color.rgb * ( phase_light * diffuse / atten_inv + ambient );
new_color.a = color.a;
gl_FrontColor = new_color;
}
void
vs_main_lighting()
{
// Use custom lighting model.
//
vs_ff_vertex(gl_Vertex);
vs_lighting(gl_Vertex,gl_Color,gl_Normal);
}
// SOLUTION
uniform vec2 uni_tube_geometry;
uniform vec3 uni_wave;
void
vs_main_tube()
{
// Vertex Attributes
//
const float theta = gl_Vertex.x;
const float z = gl_Vertex.y;
// Uniforms
//
const float u_x_shift = uni_tube_geometry.x;
const float u_r0 = uni_tube_geometry.y;
const float u_phase = uni_wave.x;
const float u_ampl = uni_wave.y;
const float u_radians_per_z = uni_wave.z;
const float angle_z = u_phase + u_radians_per_z * z;
const float r = u_r0 * ( 1 + u_ampl * sin( angle_z ) );
const vec4 coor = vec4(u_x_shift + r * cos(theta), r * sin(theta), z, 1);
const vec4 norm = vec4( -cos(theta), -sin(theta), cos(angle_z), 0);
vs_ff_vertex(coor);
vs_lighting(coor,gl_Color,norm);
}