Index: shaders/asteroid.frag
===================================================================
--- shaders/asteroid.frag	(revision 8d92284183baeec77ad25d7c8b704ee0757a49a0)
+++ shaders/asteroid.frag	(revision b8efa561bb310d6d43bc6666ee16750afbcac2f8)
@@ -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;
@@ -52,5 +53,5 @@
    // specular intensity
    vec3 Is = Ls * Ks * specular_factor;
-   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, 1.0);
Index: shaders/asteroid.vert
===================================================================
--- shaders/asteroid.vert	(revision 8d92284183baeec77ad25d7c8b704ee0757a49a0)
+++ shaders/asteroid.vert	(revision b8efa561bb310d6d43bc6666ee16750afbcac2f8)
@@ -19,12 +19,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 position
@@ -40,4 +42,6 @@
    color = (vertex_color * hp_percent) + (damage_color * (1.0 - hp_percent));
 
+   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 8d92284183baeec77ad25d7c8b704ee0757a49a0)
+++ vulkan-game.cpp	(revision b8efa561bb310d6d43bc6666ee16750afbcac2f8)
@@ -11,5 +11,4 @@
 
 #include "logger.hpp"
-#include "utils.hpp"
 
 #include "gui/imgui/button-imgui.hpp"
@@ -433,8 +432,9 @@
    shipPipeline.createDescriptorSets(swapChainImages);
 
-   asteroidPipeline.addAttribute(VK_FORMAT_R32G32B32_SFLOAT, offset_of(&AsteroidVertex::pos));
-   asteroidPipeline.addAttribute(VK_FORMAT_R32G32B32_SFLOAT, offset_of(&AsteroidVertex::color));
-   asteroidPipeline.addAttribute(VK_FORMAT_R32G32B32_SFLOAT, offset_of(&AsteroidVertex::normal));
-   asteroidPipeline.addAttribute(VK_FORMAT_R32_UINT, offset_of(&AsteroidVertex::objIndex));
+   asteroidPipeline.addAttribute(VK_FORMAT_R32G32B32_SFLOAT, offset_of(&ModelVertex::pos));
+   asteroidPipeline.addAttribute(VK_FORMAT_R32G32B32_SFLOAT, offset_of(&ModelVertex::color));
+   asteroidPipeline.addAttribute(VK_FORMAT_R32G32_SFLOAT, offset_of(&ModelVertex::texCoord));
+   asteroidPipeline.addAttribute(VK_FORMAT_R32G32B32_SFLOAT, offset_of(&ModelVertex::normal));
+   asteroidPipeline.addAttribute(VK_FORMAT_R32_UINT, offset_of(&ModelVertex::objIndex));
 
    createBufferSet(sizeof(UBO_VP_mats), VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT,
@@ -590,5 +590,5 @@
       { 0, 0, (int)swapChainExtent.width, (int)swapChainExtent.height }, swapChainImages, 138, 138, 10);
 
-   asteroidPipeline = GraphicsPipeline_Vulkan<AsteroidVertex, SSBO_Asteroid>(
+   asteroidPipeline = GraphicsPipeline_Vulkan<ModelVertex, SSBO_Asteroid>(
       VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST, physicalDevice, device, renderPass,
       { 0, 0, (int)swapChainExtent.width, (int)swapChainExtent.height }, swapChainImages, 24, 36, 10);
@@ -898,5 +898,5 @@
    }
 
-   for (SceneObject<AsteroidVertex, SSBO_Asteroid>& asteroid : this->asteroidObjects) {
+   for (SceneObject<ModelVertex, SSBO_Asteroid>& asteroid : this->asteroidObjects) {
       if (!asteroid.ssbo.deleted) {
          vec3 objCenter = vec3(viewMat * vec4(asteroid.center, 1.0f));
@@ -929,68 +929,68 @@
       this->lastSpawn_asteroid = curTime;
 
-      SceneObject<AsteroidVertex, SSBO_Asteroid>& asteroid = addObject(
-         asteroidObjects, asteroidPipeline,
-         addObjectIndex<AsteroidVertex>(asteroidObjects.size(),
-         addVertexNormals<AsteroidVertex>({
-
-            // front
-            {{ 1.0f,  1.0f,  1.0f}, {0.4f, 0.4f, 0.4f}},
-            {{-1.0f,  1.0f,  1.0f}, {0.4f, 0.4f, 0.4f}},
-            {{-1.0f, -1.0f,  1.0f}, {0.4f, 0.4f, 0.4f}},
-            {{ 1.0f,  1.0f,  1.0f}, {0.4f, 0.4f, 0.4f}},
-            {{-1.0f, -1.0f,  1.0f}, {0.4f, 0.4f, 0.4f}},
-            {{ 1.0f, -1.0f,  1.0f}, {0.4f, 0.4f, 0.4f}},
-
-            // top
-            {{ 1.0f,  1.0f, -1.0f}, {0.4f, 0.4f, 0.4f}},
-            {{-1.0f,  1.0f, -1.0f}, {0.4f, 0.4f, 0.4f}},
-            {{-1.0f,  1.0f,  1.0f}, {0.4f, 0.4f, 0.4f}},
-            {{ 1.0f,  1.0f, -1.0f}, {0.4f, 0.4f, 0.4f}},
-            {{-1.0f,  1.0f,  1.0f}, {0.4f, 0.4f, 0.4f}},
-            {{ 1.0f,  1.0f,  1.0f}, {0.4f, 0.4f, 0.4f}},
-
-            // bottom
-            {{ 1.0f, -1.0f,  1.0f}, {0.4f, 0.4f, 0.4f}},
-            {{-1.0f, -1.0f,  1.0f}, {0.4f, 0.4f, 0.4f}},
-            {{-1.0f, -1.0f, -1.0f}, {0.4f, 0.4f, 0.4f}},
-            {{ 1.0f, -1.0f,  1.0f}, {0.4f, 0.4f, 0.4f}},
-            {{-1.0f, -1.0f, -1.0f}, {0.4f, 0.4f, 0.4f}},
-            {{ 1.0f, -1.0f, -1.0}, {0.4f, 0.4f, 0.4f}},
-
-            // back
-            {{ 1.0f,  1.0f, -1.0f}, {0.4f, 0.4f, 0.4f}},
-            {{-1.0f, -1.0f, -1.0f}, {0.4f, 0.4f, 0.4f}},
-            {{-1.0f,  1.0f, -1.0f}, {0.4f, 0.4f, 0.4f}},
-            {{ 1.0f,  1.0f, -1.0f}, {0.4f, 0.4f, 0.4f}},
-            {{ 1.0f, -1.0f, -1.0f}, {0.4f, 0.4f, 0.4f}},
-            {{-1.0f, -1.0f, -1.0f}, {0.4f, 0.4f, 0.4f}},
-
-            // right
-            {{ 1.0f,  1.0f, -1.0f}, {0.4f, 0.4f, 0.4f}},
-            {{ 1.0f,  1.0f,  1.0f}, {0.4f, 0.4f, 0.4f}},
-            {{ 1.0f, -1.0f,  1.0f}, {0.4f, 0.4f, 0.4f}},
-            {{ 1.0f,  1.0f, -1.0f}, {0.4f, 0.4f, 0.4f}},
-            {{ 1.0f, -1.0f,  1.0f}, {0.4f, 0.4f, 0.4f}},
-            {{ 1.0f, -1.0f, -1.0f}, {0.4f, 0.4f, 0.4f}},
-
-            // left
-            {{-1.0f,  1.0f,  1.0f}, {0.4f, 0.4f, 0.4f}},
-            {{-1.0f,  1.0f, -1.0f}, {0.4f, 0.4f, 0.4f}},
-            {{-1.0f, -1.0f, -1.0f}, {0.4f, 0.4f, 0.4f}},
-            {{-1.0f,  1.0f,  1.0f}, {0.4f, 0.4f, 0.4f}},
-            {{-1.0f, -1.0f, -1.0f}, {0.4f, 0.4f, 0.4f}},
-            {{-1.0f, -1.0f,  1.0f}, {0.4f, 0.4f, 0.4f}},
-         })), {
-             0,  1,  2,  3,  4,  5,
-             6,  7,  8,  9, 10, 11,
-            12, 13, 14, 15, 16, 17,
-            18, 19, 20, 21, 22, 23,
-            24, 25, 26, 27, 28, 29,
-            30, 31, 32, 33, 34, 35,
-         }, {
-            mat4(1.0f),
-            10.0f,
-            false
-         }, true);
+      SceneObject<ModelVertex, SSBO_Asteroid>& asteroid =
+         addObject(asteroidObjects, asteroidPipeline,
+            addObjectIndex<ModelVertex>(asteroidObjects.size(),
+               addVertexNormals<ModelVertex>({
+
+                  // front
+                  {{ 1.0f,  1.0f,  1.0f}, {0.4f, 0.4f, 0.4f}},
+                  {{-1.0f,  1.0f,  1.0f}, {0.4f, 0.4f, 0.4f}},
+                  {{-1.0f, -1.0f,  1.0f}, {0.4f, 0.4f, 0.4f}},
+                  {{ 1.0f,  1.0f,  1.0f}, {0.4f, 0.4f, 0.4f}},
+                  {{-1.0f, -1.0f,  1.0f}, {0.4f, 0.4f, 0.4f}},
+                  {{ 1.0f, -1.0f,  1.0f}, {0.4f, 0.4f, 0.4f}},
+
+                  // top
+                  {{ 1.0f,  1.0f, -1.0f}, {0.4f, 0.4f, 0.4f}},
+                  {{-1.0f,  1.0f, -1.0f}, {0.4f, 0.4f, 0.4f}},
+                  {{-1.0f,  1.0f,  1.0f}, {0.4f, 0.4f, 0.4f}},
+                  {{ 1.0f,  1.0f, -1.0f}, {0.4f, 0.4f, 0.4f}},
+                  {{-1.0f,  1.0f,  1.0f}, {0.4f, 0.4f, 0.4f}},
+                  {{ 1.0f,  1.0f,  1.0f}, {0.4f, 0.4f, 0.4f}},
+
+                  // bottom
+                  {{ 1.0f, -1.0f,  1.0f}, {0.4f, 0.4f, 0.4f}},
+                  {{-1.0f, -1.0f,  1.0f}, {0.4f, 0.4f, 0.4f}},
+                  {{-1.0f, -1.0f, -1.0f}, {0.4f, 0.4f, 0.4f}},
+                  {{ 1.0f, -1.0f,  1.0f}, {0.4f, 0.4f, 0.4f}},
+                  {{-1.0f, -1.0f, -1.0f}, {0.4f, 0.4f, 0.4f}},
+                  {{ 1.0f, -1.0f, -1.0}, {0.4f, 0.4f, 0.4f}},
+
+                  // back
+                  {{ 1.0f,  1.0f, -1.0f}, {0.4f, 0.4f, 0.4f}},
+                  {{-1.0f, -1.0f, -1.0f}, {0.4f, 0.4f, 0.4f}},
+                  {{-1.0f,  1.0f, -1.0f}, {0.4f, 0.4f, 0.4f}},
+                  {{ 1.0f,  1.0f, -1.0f}, {0.4f, 0.4f, 0.4f}},
+                  {{ 1.0f, -1.0f, -1.0f}, {0.4f, 0.4f, 0.4f}},
+                  {{-1.0f, -1.0f, -1.0f}, {0.4f, 0.4f, 0.4f}},
+
+                  // right
+                  {{ 1.0f,  1.0f, -1.0f}, {0.4f, 0.4f, 0.4f}},
+                  {{ 1.0f,  1.0f,  1.0f}, {0.4f, 0.4f, 0.4f}},
+                  {{ 1.0f, -1.0f,  1.0f}, {0.4f, 0.4f, 0.4f}},
+                  {{ 1.0f,  1.0f, -1.0f}, {0.4f, 0.4f, 0.4f}},
+                  {{ 1.0f, -1.0f,  1.0f}, {0.4f, 0.4f, 0.4f}},
+                  {{ 1.0f, -1.0f, -1.0f}, {0.4f, 0.4f, 0.4f}},
+
+                  // left
+                  {{-1.0f,  1.0f,  1.0f}, {0.4f, 0.4f, 0.4f}},
+                  {{-1.0f,  1.0f, -1.0f}, {0.4f, 0.4f, 0.4f}},
+                  {{-1.0f, -1.0f, -1.0f}, {0.4f, 0.4f, 0.4f}},
+                  {{-1.0f,  1.0f,  1.0f}, {0.4f, 0.4f, 0.4f}},
+                  {{-1.0f, -1.0f, -1.0f}, {0.4f, 0.4f, 0.4f}},
+                  {{-1.0f, -1.0f,  1.0f}, {0.4f, 0.4f, 0.4f}},
+               })), {
+                   0,  1,  2,  3,  4,  5,
+                   6,  7,  8,  9, 10, 11,
+                  12, 13, 14, 15, 16, 17,
+                  18, 19, 20, 21, 22, 23,
+                  24, 25, 26, 27, 28, 29,
+                  30, 31, 32, 33, 34, 35,
+               }, {
+                  mat4(1.0f),
+                  10.0f,
+                  false
+               }, true);
 
       // This accounts for the scaling in model_base.
@@ -1070,4 +1070,5 @@
 
    VulkanUtils::destroyVulkanImage(device, floorTextureImage);
+   // START UNREVIEWED SECTION
    VulkanUtils::destroyVulkanImage(device, laserTextureImage);
 
@@ -1079,4 +1080,6 @@
    laserPipeline.cleanupBuffers();
    explosionPipeline.cleanupBuffers();
+
+   // END UNREVIEWED SECTION
 
    vkDestroyCommandPool(device, resourceCommandPool, nullptr);
@@ -1908,5 +1911,5 @@
 
    vec3 intersection(0.0f), closestIntersection(0.0f);
-   SceneObject<AsteroidVertex, SSBO_Asteroid>* closestAsteroid = nullptr;
+   SceneObject<ModelVertex, SSBO_Asteroid>* closestAsteroid = nullptr;
    unsigned int closestAsteroidIndex = -1;
 
@@ -1937,9 +1940,9 @@
       }
 
-      EffectOverTime<AsteroidVertex, SSBO_Asteroid>* eot = nullptr;
+      EffectOverTime<ModelVertex, SSBO_Asteroid>* eot = nullptr;
 
       if (closestAsteroid != nullptr) {
          // TODO: Use some sort of smart pointer instead
-         eot = new EffectOverTime<AsteroidVertex, SSBO_Asteroid>(asteroidPipeline, asteroidObjects, closestAsteroidIndex,
+         eot = new EffectOverTime<ModelVertex, SSBO_Asteroid>(asteroidPipeline, asteroidObjects, closestAsteroidIndex,
             offset_of(&SSBO_Asteroid::hp), curTime, -20.0f);
          effects.push_back(eot);
@@ -1969,5 +1972,5 @@
 // TODO: Determine if I should pass start and end by reference or value since they don't get changed
 // Probably use const reference
-bool VulkanGame::getLaserAndAsteroidIntersection(SceneObject<AsteroidVertex, SSBO_Asteroid>& asteroid,
+bool VulkanGame::getLaserAndAsteroidIntersection(SceneObject<ModelVertex, SSBO_Asteroid>& asteroid,
       vec3& start, vec3& end, vec3& intersection) {
    /*
Index: vulkan-game.hpp
===================================================================
--- vulkan-game.hpp	(revision 8d92284183baeec77ad25d7c8b704ee0757a49a0)
+++ vulkan-game.hpp	(revision b8efa561bb310d6d43bc6666ee16750afbcac2f8)
@@ -22,7 +22,8 @@
 
 #include "consts.hpp"
-#include "vulkan-utils.hpp"
 #include "graphics-pipeline_vulkan.hpp"
 #include "game-gui-sdl.hpp"
+#include "utils.hpp"
+#include "vulkan-utils.hpp"
 
 using namespace glm;
@@ -47,11 +48,4 @@
    vec3 color;
    vec2 texCoord;
-   vec3 normal;
-   unsigned int objIndex;
-};
-
-struct AsteroidVertex {
-   vec3 pos;
-   vec3 color;
    vec3 normal;
    unsigned int objIndex;
@@ -122,5 +116,5 @@
    vec3 center; // currently only matters for asteroids
    float radius; // currently only matters for asteroids
-   SceneObject<AsteroidVertex, SSBO_Asteroid>* targetAsteroid; // currently only used for lasers
+   SceneObject<ModelVertex, SSBO_Asteroid>* targetAsteroid; // currently only used for lasers
 };
 
@@ -303,5 +297,5 @@
       GraphicsPipeline_Vulkan<ModelVertex, SSBO_ModelObject> modelPipeline;
       GraphicsPipeline_Vulkan<ModelVertex, SSBO_ModelObject> shipPipeline;
-      GraphicsPipeline_Vulkan<AsteroidVertex, SSBO_Asteroid> asteroidPipeline;
+      GraphicsPipeline_Vulkan<ModelVertex, SSBO_Asteroid> asteroidPipeline;
       GraphicsPipeline_Vulkan<LaserVertex, SSBO_Laser> laserPipeline;
       GraphicsPipeline_Vulkan<ExplosionVertex, SSBO_Explosion> explosionPipeline;
@@ -331,5 +325,5 @@
       UBO_VP_mats ship_VP_mats;
 
-      vector<SceneObject<AsteroidVertex, SSBO_Asteroid>> asteroidObjects;
+      vector<SceneObject<ModelVertex, SSBO_Asteroid>> asteroidObjects;
 
       vector<VkBuffer> uniformBuffers_asteroidPipeline;
@@ -364,8 +358,8 @@
 
       unsigned int leftLaserIdx = -1;
-      EffectOverTime<AsteroidVertex, SSBO_Asteroid>* leftLaserEffect = nullptr;
+      EffectOverTime<ModelVertex, SSBO_Asteroid>* leftLaserEffect = nullptr;
 
       unsigned int rightLaserIdx = -1;
-      EffectOverTime<AsteroidVertex, SSBO_Asteroid>* rightLaserEffect = nullptr;
+      EffectOverTime<ModelVertex, SSBO_Asteroid>* rightLaserEffect = nullptr;
 
       /*** High-level vars ***/
@@ -453,5 +447,5 @@
       void translateLaser(size_t index, const vec3& translation);
       void updateLaserTarget(size_t index);
-      bool getLaserAndAsteroidIntersection(SceneObject<AsteroidVertex, SSBO_Asteroid>& asteroid,
+      bool getLaserAndAsteroidIntersection(SceneObject<ModelVertex, SSBO_Asteroid>& asteroid,
             vec3& start, vec3& end, vec3& intersection);
 
