Index: shaders/ship.frag
===================================================================
--- shaders/ship.frag	(revision a00eb0672f52310ddbe89f59abd3191cb3c993ed)
+++ shaders/ship.frag	(revision 8d92284183baeec77ad25d7c8b704ee0757a49a0)
@@ -4,7 +4,8 @@
 layout(location = 0) in vec3 position_eye;
 layout(location = 1) in vec3 color;
-layout(location = 2) in vec3 normal_eye;
-layout(location = 3) in vec3 light_position_eye;
-layout(location = 4) in vec3 light2_position_eye;
+layout(location = 2) in vec2 fragTexCoord;
+layout(location = 3) in vec3 normal_eye;
+layout(location = 4) in vec3 light_position_eye;
+layout(location = 5) in vec3 light2_position_eye;
 
 layout(location = 0) out vec4 frag_color;
@@ -55,5 +56,5 @@
 
    // specular intensity
-   vec3 Is2 = Ls * Ks * specular_factor2;
+   vec3 Is2 = Ls * Ks * specular_factor2 + vec3(fragTexCoord, 0.0) - vec3(fragTexCoord, 0.0);
 
    frag_color = vec4((Is + Id + Ia + Is2 + Id2 + Ia2) / 2.0, 1.0);
Index: shaders/ship.vert
===================================================================
--- shaders/ship.vert	(revision a00eb0672f52310ddbe89f59abd3191cb3c993ed)
+++ shaders/ship.vert	(revision 8d92284183baeec77ad25d7c8b704ee0757a49a0)
@@ -17,12 +17,14 @@
 layout(location = 0) in vec3 vertex_position;
 layout(location = 1) in vec3 vertex_color;
-layout(location = 2) in vec3 vertex_normal;
-layout(location = 3) in uint obj_index;
+layout(location = 2) in vec2 inTexCoord;
+layout(location = 3) in vec3 vertex_normal;
+layout(location = 4) in uint obj_index;
 
 layout(location = 0) out vec3 position_eye;
 layout(location = 1) out vec3 color;
-layout(location = 2) out vec3 normal_eye;
-layout(location = 3) out vec3 light_position_eye;
-layout(location = 4) out vec3 light2_position_eye;
+layout(location = 2) out vec2 fragTexCoord;
+layout(location = 3) out vec3 normal_eye;
+layout(location = 4) out vec3 light_position_eye;
+layout(location = 5) out vec3 light2_position_eye;
 
 // fixed point light positions
@@ -40,4 +42,6 @@
    color = vertex_color;
 
+   fragTexCoord = inTexCoord;
+
    light_position_eye = vec3(ubo.view * vec4(light_position_world, 1.0));
    light2_position_eye = vec3(ubo.view * vec4(light2_position_world, 1.0));
Index: vulkan-game.cpp
===================================================================
--- vulkan-game.cpp	(revision a00eb0672f52310ddbe89f59abd3191cb3c993ed)
+++ vulkan-game.cpp	(revision 8d92284183baeec77ad25d7c8b704ee0757a49a0)
@@ -174,8 +174,10 @@
    modelPipeline.createDescriptorSets(swapChainImages);
 
-   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));
-   shipPipeline.addAttribute(VK_FORMAT_R32_UINT, offset_of(&ShipVertex::objIndex));
+   // START UNREVIEWED SECTION
+   shipPipeline.addAttribute(VK_FORMAT_R32G32B32_SFLOAT, offset_of(&ModelVertex::pos));
+   shipPipeline.addAttribute(VK_FORMAT_R32G32B32_SFLOAT, offset_of(&ModelVertex::color));
+   shipPipeline.addAttribute(VK_FORMAT_R32G32_SFLOAT, offset_of(&ModelVertex::texCoord));
+   shipPipeline.addAttribute(VK_FORMAT_R32G32B32_SFLOAT, offset_of(&ModelVertex::normal));
+   shipPipeline.addAttribute(VK_FORMAT_R32_UINT, offset_of(&ModelVertex::objIndex));
 
    createBufferSet(sizeof(UBO_VP_mats), VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT,
@@ -188,7 +190,7 @@
    // 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
-   SceneObject<ShipVertex, SSBO_ModelObject>& ship = addObject(shipObjects, shipPipeline,
-      addObjectIndex<ShipVertex>(shipObjects.size(),
-         addVertexNormals<ShipVertex>({
+   SceneObject<ModelVertex, SSBO_ModelObject>& ship = addObject(shipObjects, shipPipeline,
+      addObjectIndex<ModelVertex>(shipObjects.size(),
+         addVertexNormals<ModelVertex>({
 
             //back
@@ -482,4 +484,6 @@
    explosionPipeline.createDescriptorSets(swapChainImages);
 
+   // END UNREVIEWED SECTION
+
    currentRenderScreenFn = &VulkanGame::renderMainScreen;
 
@@ -582,5 +586,5 @@
       { 0, 0, (int)swapChainExtent.width, (int)swapChainExtent.height }, swapChainImages, 24, 24, 10);
 
-   shipPipeline = GraphicsPipeline_Vulkan<ShipVertex, SSBO_ModelObject>(
+   shipPipeline = GraphicsPipeline_Vulkan<ModelVertex, SSBO_ModelObject>(
       VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST, physicalDevice, device, renderPass,
       { 0, 0, (int)swapChainExtent.width, (int)swapChainExtent.height }, swapChainImages, 138, 138, 10);
@@ -723,4 +727,5 @@
                      translate(mat4(1.0f), vec3(0.0f, 0.0f, zOffset));
                   texturedSquare.modified = true;
+               // START UNREVIEWED SECTION
                } else if (e.key.keycode == SDL_SCANCODE_Z && leftLaserIdx == -1) {
                   // TODO: When I start actually removing objects from the object vectors,
@@ -745,4 +750,5 @@
 
                   rightLaserIdx = laserObjects.size() - 1;
+               // END UNREVIEWED SECTION
                } else {
                   cout << "Key event detected" << endl;
@@ -750,4 +756,5 @@
                break;
             case UI_EVENT_KEYUP:
+               // START UNREVIEWED SECTION
                if (e.key.keycode == SDL_SCANCODE_Z && leftLaserIdx != -1) {
                   laserObjects[leftLaserIdx].ssbo.deleted = true;
@@ -769,4 +776,5 @@
                   }
                }
+               // END UNREVIEWED SECTION
                break;
             case UI_EVENT_WINDOW:
@@ -792,5 +800,5 @@
       // Check which keys are held down
 
-      SceneObject<ShipVertex, SSBO_ModelObject>& ship = shipObjects[0];
+      SceneObject<ModelVertex, SSBO_ModelObject>& ship = shipObjects[0];
 
       if (gui->keyPressed(SDL_SCANCODE_LEFT)) {
@@ -836,5 +844,5 @@
             shouldRecreateSwapChain = false;
          }
-      }
+      }// REVIEWED TO THIS POINT
 
       updateScene();
Index: vulkan-game.hpp
===================================================================
--- vulkan-game.hpp	(revision a00eb0672f52310ddbe89f59abd3191cb3c993ed)
+++ vulkan-game.hpp	(revision 8d92284183baeec77ad25d7c8b704ee0757a49a0)
@@ -47,11 +47,4 @@
    vec3 color;
    vec2 texCoord;
-   vec3 normal;
-   unsigned int objIndex;
-};
-
-struct ShipVertex {
-   vec3 pos;
-   vec3 color;
    vec3 normal;
    unsigned int objIndex;
@@ -309,5 +302,5 @@
       // wouldn't work since the whole pipeline couldn't have a common set of descriptors for the textures
       GraphicsPipeline_Vulkan<ModelVertex, SSBO_ModelObject> modelPipeline;
-      GraphicsPipeline_Vulkan<ShipVertex, SSBO_ModelObject> shipPipeline;
+      GraphicsPipeline_Vulkan<ModelVertex, SSBO_ModelObject> shipPipeline;
       GraphicsPipeline_Vulkan<AsteroidVertex, SSBO_Asteroid> asteroidPipeline;
       GraphicsPipeline_Vulkan<LaserVertex, SSBO_Laser> laserPipeline;
@@ -330,5 +323,5 @@
       UBO_VP_mats object_VP_mats;
 
-      vector<SceneObject<ShipVertex, SSBO_ModelObject>> shipObjects;
+      vector<SceneObject<ModelVertex, SSBO_ModelObject>> shipObjects;
 
       vector<VkBuffer> uniformBuffers_shipPipeline;
