 uniform vec3 vikr_CamPosition;
 
 
-vec3 CalculatePointLight(PointLight light, vec3 Normal, vec3 frag_coord, vec3 view_dir, vec4 Diffuse, vec4 Specular, vec4 Ambient) {
+vec3 CalculateDirectionalLight(DirectionalLight light, vec3 Normal, 
+  vec3 frag_coord, vec3 view_dir, vec4 Diffuse, vec4 Specular, vec4 Ambient) 
+{
+  vec3 light_dir = normalize(-light.direction);
+  float diff = max(dot(light_dir, Normal), 0.0f);
+  // Specular work.
+  vec3 halfway_dir = normalize(light_dir + view_dir);
+  float spec = pow(max(dot(Normal, halfway_dir), 0.0f), 32.0f);
+  vec3 ambient = light.ambient * vec3(Ambient);
+  vec3 diffuse = light.diffuse * diff * vec3(Diffuse);
+  vec3 specular = light.specular * spec * vec3(Specular);
+  return (ambient + diffuse + specular);
+}
+
+
+vec3 CalculatePointLight(PointLight light, vec3 Normal, vec3 frag_coord, 
+  vec3 view_dir, vec4 Diffuse, vec4 Specular, vec4 Ambient) 
+{
   /* Blinn-Phong Implementation! */ 
   // diffuse
   vec3 light_dir = normalize(light.position - frag_coord);

  vec4 Ambient = texture(gAmbient, TexCoords);
  vec3 view_dir = normalize(vikr_CamPosition - FragPos);
  
  vec4 result = vec4(0.0f);
  
  for (int i = 0; i < MAX_LIGHTS; ++i) {
    result += CalculatePointLight(vikr_pointLights[i], Normal, FragPos, view_dir, Diffuse, Specular, Ambient);

uniform sampler2D gAmbient;


/**
  Point light test.
*/
struct PointLight {
  vec3 position;
  float constant;
  float linear;
  float quadratic;
  vec3 ambient;
  vec3 diffuse;
  vec3 specular;
};


/**
  Directional Light test.
*/
struct DirectionalLight {
  vec3 direction;
  vec3 ambient;
  vec3 diffuse;
  vec3 specular;
