Index: shaders/ship.frag
===================================================================
--- shaders/ship.frag	(revision 06d959f593b7fdb74510302df65f69c7241c37a9)
+++ shaders/ship.frag	(revision e1308e874d193cdc00723f7df1f19245df234d38)
@@ -2,9 +2,8 @@
 #extension GL_ARB_separate_shader_objects : enable
 
-//in vec3 position_eye, normal_eye, color, light_position_eye, light2_position_eye;
 layout(location = 0) in vec3 position_eye;
 layout(location = 1) in vec3 color;
-layout(location = 2) in vec3 light_position_eye;
-layout(location = 3) in vec3 light2_position_eye;
+layout(location = 2) in vec3 normal_eye;
+layout(location = 3) in vec3 light_position_eye;
 
 layout(location = 0) out vec4 outColor;
@@ -12,10 +11,10 @@
 // fixed point light properties
 vec3 Ls = vec3(1.0, 1.0, 1.0);
-vec3 Ld = vec3(1.0, 1.0, 1.0);
+vec3 Ld = vec3(0.7, 0.7, 0.7);
 vec3 La = vec3(0.2, 0.2, 0.2);
 
-// surface reflectance
+// reflectance of the object surface
 vec3 Ks = vec3(1.0, 1.0, 1.0);
-vec3 Kd = vec3(1.0, 1.5, 1.0);
+vec3 Kd = vec3(1.0, 0.5, 0.0);
 vec3 Ka = vec3(0.2, 0.2, 0.2);
 float specular_exponent = 100.0; // specular 'power'
@@ -29,30 +28,19 @@
 
    vec3 direction_to_light_eye = normalize(light_position_eye - position_eye);
-   //float dot_prod = max(dot(direction_to_light_eye, normal_eye), 0.0);
+   float dot_prod = max(dot(direction_to_light_eye, normal_eye), 0.0);
 
    // diffuse intensity
-   //vec3 Id = Ld * color * dot_prod;
+   vec3 Id = Ld * color * dot_prod;
+   //vec3 Id = Ld * Kd * dot_prod;
 
-   vec3 direction_to_light2_eye = normalize(light2_position_eye - position_eye);
-   //float dot_prod2 = max(dot(direction_to_light2_eye, normal_eye), 0.0);
+   vec3 surface_to_viewer_eye = normalize(-position_eye);
 
-   // diffuse intensity
-   //vec3 Id2 = Ld * color * dot_prod2;
-
-   //vec3 surface_to_viewer_eye = normalize(-position_eye);
-
-   //vec3 reflection_eye = reflect(-direction_to_light_eye, normal_eye);
-   //float dot_prod_specular = max(dot(reflection_eye, surface_to_viewer_eye), 0.0);
-   //float specular_factor = pow(dot_prod_specular, specular_exponent);
-
-   //vec3 reflection_eye2 = reflect(-direction_to_light2_eye, normal_eye);
-   //float dot_prod_specular2 = max(dot(reflection_eye2, surface_to_viewer_eye), 0.0);
-   //float specular_factor2 = pow(dot_prod_specular2, specular_exponent);
+   vec3 reflection_eye = reflect(-direction_to_light_eye, normal_eye);
+   float dot_prod_specular = max(dot(reflection_eye, surface_to_viewer_eye), 0.0);
+   float specular_factor = pow(dot_prod_specular, specular_exponent);
 
    // specular intensity
-   //vec3 Is = Ls * Ks * specular_factor;
-   //vec3 Is2 = Ls * Ks * specular_factor2;
+   vec3 Is = Ls * Ks * specular_factor;
 
-   //outColor = vec4((Is + Id + Ia + Is2 + Id2 + Ia2)/2, 1.0);
-   outColor = vec4(color, 1.0);
+   outColor = vec4(Is + Id + Ia, 1.0);
 }
Index: shaders/ship.vert
===================================================================
--- shaders/ship.vert	(revision 06d959f593b7fdb74510302df65f69c7241c37a9)
+++ shaders/ship.vert	(revision e1308e874d193cdc00723f7df1f19245df234d38)
@@ -2,5 +2,4 @@
 #extension GL_ARB_separate_shader_objects : enable
 
-// TODO: Figure out if the UniformBufferObject label is necessary and, if not, remove it
 layout (binding = 0) uniform UniformBufferObject {
    mat4 model;
@@ -11,24 +10,28 @@
 layout(location = 0) in vec3 vertex_position;
 layout(location = 1) in vec3 vertex_color;
-//layout(location = 2) in vec3 vertex_normal;
+layout(location = 2) in vec3 vertex_normal;
 //layout(location = 3) in uint ubo_index;
 
-//out vec3 position_eye, normal_eye, color, light_position_eye, light2_position_eye;
 layout(location = 0) out vec3 position_eye;
 layout(location = 1) out vec3 color;
-layout(location = 2) out vec3 light_position_eye;
-layout(location = 3) out vec3 light2_position_eye;
+layout(location = 2) out vec3 normal_eye;
+layout(location = 3) out vec3 light_position_eye;
 
 // fixed point light position
-vec3 light_position_world = vec3(0.0, 0.0, 2.0);
-vec3 light2_position_world = vec3(0.0, 1.5, -0.1);
+//vec3 light_position_world = vec3(0.0, 0.0, 2.0);
+vec3 light_position_world = vec3(0.4, 1.5, 0.8);
+//vec3 light_position_world = vec3(0.0, 1.0, -1.0);
 
+// TODO: This does not account for scaling in the model matrix
+// Check Anton's book to see how to fix this
 void main() {
+   position_eye = vec3(ubo.view * ubo.model * vec4(vertex_position, 1.0));
    //position_eye = vec3(view * model_mats[ubo_index] * vec4(vertex_position, 1.0));
-   position_eye = vec3(ubo.view * ubo.model * vec4(vertex_position, 1.0));
+
+   // Using 0.0 instead of 1.0 means translations won't effect the normal
+   normal_eye = normalize(vec3(ubo.view * ubo.model * vec4(vertex_normal, 0.0)));
    //normal_eye = normalize(vec3(view * model_mats[ubo_index] * vec4(vertex_normal, 0.0)));
    color = vertex_color;
    light_position_eye = vec3(ubo.view * vec4(light_position_world, 1.0));
-   light2_position_eye = vec3(ubo.view * vec4(light2_position_world, 1.0));
 
    gl_Position = ubo.proj * vec4(position_eye, 1.0);
Index: vulkan-game.cpp
===================================================================
--- vulkan-game.cpp	(revision 06d959f593b7fdb74510302df65f69c7241c37a9)
+++ vulkan-game.cpp	(revision e1308e874d193cdc00723f7df1f19245df234d38)
@@ -248,4 +248,5 @@
    shipPipeline.addAttribute(VK_FORMAT_R32G32B32_SFLOAT, offset_of(&ShipVertex::pos));
    shipPipeline.addAttribute(VK_FORMAT_R32G32B32_SFLOAT, offset_of(&ShipVertex::color));
+   shipPipeline.addAttribute(VK_FORMAT_R32G32B32_SFLOAT, offset_of(&ShipVertex::normal));
 
    createUniformBuffers<UBO_MvpMat>(uniformBuffers_shipPipeline, uniformBuffersMemory_shipPipeline, uniformBufferInfoList_shipPipeline);
@@ -254,5 +255,7 @@
       VK_SHADER_STAGE_VERTEX_BIT, &uniformBufferInfoList_shipPipeline);
 
-   shipPipeline.addObject({
+   // TODO: With the normals, indexing basically becomes pointless since no vertices will have exactly
+   // the same data. Add an option to make some pipelines not use indexing
+   shipPipeline.addObject(addVertexNormals<ShipVertex>({
          //back
          {{ -0.5f,   0.3f,   0.0f}, {0.0f, 0.0f, 0.3f}},
@@ -450,5 +453,5 @@
          {{  1.5f,   0.0f,   0.0f}, {0.0f, 0.0f, 0.3f}},
          {{  1.3f,   0.0f,  -0.3f}, {0.0f, 0.0f, 0.3f}},
-      }, {
+      }), {
            0,   1,   2,   3,   4,   5,
            6,   7,   8,   9,  10,  11,
