Changeset 1f3d32b in opengl-game


Ignore:
Timestamp:
Oct 5, 2018, 12:35:21 AM (6 years ago)
Author:
Dmitry Portnoy <dmp1488@…>
Branches:
feature/imgui-sdl, master, points-test
Children:
2b0214c
Parents:
e9347b4
Message:

-Dynamically allocate SceneObjectsto make it easier to support subclassing
them
-Create Asteroid and Laser subclasses
-Implement a system to allow arbitrary changes to values over time
-Use this system to deal damage to asteroids whenever a laser is focused
on them

File:
1 edited

Legend:

Unmodified
Added
Removed
  • new-game.cpp

    re9347b4 r1f3d32b  
    2424#include <iostream>
    2525#include <fstream>
     26#include <sstream>
    2627#include <cmath>
    2728#include <string>
     
    7475};
    7576
     77struct Asteroid : SceneObject {
     78   double hp;
     79};
     80
     81struct Laser : SceneObject {
     82   Asteroid* targetAsteroid;
     83};
     84
     85struct EffectOverTime {
     86   double& effectedValue;
     87   double startValue;
     88   double startTime;
     89   double changePerSecond;
     90   bool deleted;
     91   SceneObject* effectedObject;
     92
     93   EffectOverTime(double& effectedValue, double changePerSecond, SceneObject* object)
     94      : effectedValue(effectedValue), effectedObject(object) {
     95      startValue = effectedValue;
     96      startTime = glfwGetTime();
     97      this->changePerSecond = changePerSecond;
     98      deleted = false;
     99   }
     100};
     101
    76102struct BufferInfo {
    77103   unsigned int vbo_base;
     
    98124void print4DVector(string label, vec4& v);
    99125
    100 void initObject(SceneObject& obj);
    101 void addObjectToScene(SceneObject& obj,
     126void initObject(SceneObject* obj);
     127void addObjectToScene(SceneObject* obj,
    102128                  map<GLuint, BufferInfo>& shaderBufferInfo,
    103129                  GLuint points_vbo,
     
    110136void removeObjectFromScene(SceneObject& obj, GLuint ubo);
    111137
    112 void calculateObjectBoundingBox(SceneObject& obj);
    113 
    114 SceneObject createLaser(vec3 start, vec3 end, vec3 color, GLfloat width, GLuint laser_sp);
     138void calculateObjectBoundingBox(SceneObject* obj);
    115139
    116140void initializeBuffers(
     
    123147                  GLuint* model_mat_idx_vbo);
    124148
    125 void populateBuffers(vector<SceneObject>& objects,
     149void populateBuffers(vector<SceneObject*>& objects,
    126150                  map<GLuint, BufferInfo>& shaderBufferInfo,
    127151                  GLuint points_vbo,
     
    145169void transformObject(SceneObject& obj, const mat4& transform, GLuint ubo);
    146170
    147 void translateLaser(SceneObject& laser, const vec3& translation, GLuint ubo);
    148 void updateLaserTarget(SceneObject& laser, vector<SceneObject>& objects, GLuint points_vbo);
     171SceneObject* createShip(GLuint shader);
     172Asteroid* createAsteroid(vec3 pos, GLuint shader);
     173Laser* createLaser(vec3 start, vec3 end, vec3 color, GLfloat width, GLuint laser_sp);
     174
     175void translateLaser(Laser* laser, const vec3& translation, GLuint ubo);
     176void updateLaserTarget(Laser* laser, vector<SceneObject*>& objects, GLuint points_vbo);
    149177bool getLaserAndAsteroidIntersection(vec3& start, vec3& end, SceneObject& asteroid, vec3& intersection);
    150178
     
    159187void renderSceneGui();
    160188
    161 void spawnAsteroid(vec3 pos, GLuint shader,
    162                   map<GLuint, BufferInfo>& shaderBufferInfo,
    163                   GLuint points_vbo,
    164                   GLuint colors_vbo,
    165                   GLuint selected_colors_vbo,
    166                   GLuint texcoords_vbo,
    167                   GLuint normals_vbo,
    168                   GLuint ubo,
    169                   GLuint model_mat_idx_vbo);
    170 
    171189float getRandomNum(float low, float high);
    172190
     
    176194const int KEY_STATE_UNCHANGED = -1;
    177195const bool FULLSCREEN = false;
    178 const bool SHOW_FPS = false;
    179 const bool DISABLE_VSYNC = false; // disable vsync to see real framerate
    180196unsigned int MAX_UNIFORMS = 0; // Requires OpenGL constants only available at runtime, so it can't be const
    181197
     
    193209mat4 proj_mat;
    194210
    195 // TODO: Consider using a list instead since it will make element deletion more efficient
    196 vector<SceneObject> objects;
     211vector<SceneObject*> objects;
    197212queue<Event> events;
     213vector<EffectOverTime*> effects;
    198214
    199215SceneObject* clickedObject = NULL;
     
    208224ImVec4 clear_color = ImVec4(0.45f, 0.55f, 0.60f, 1.00f);
    209225
    210 // TODO: Come up with a better way to keep references to specific objects,
    211 // which remain valid (or are recreated) when the object vector or VBOs are resized.
    212 // I could store SceneObject*, but I have to keep track of when the vector is about to
    213 // resize and re-init the pointers when that happens since they'll be invalidated
    214 // I would prefer the above apporach, but I should write some helper functions to make it less error-prone
    215 int leftLaserIdx = -1;
    216 int rightLaserIdx = -1;
     226Laser* leftLaser = NULL;
     227EffectOverTime* leftLaserEffect = NULL;
     228
     229Laser* rightLaser = NULL;
     230EffectOverTime* rightLaserEffect = NULL;
    217231
    218232/*
     
    404418   float cam_pitch = -50.0f * 2.0f * 3.14159f / 360.0f;
    405419
    406    SceneObject obj;
    407    mat4 T_model, R_model;
    408 
    409420   // player ship
    410    obj = SceneObject();
    411    obj.type = TYPE_SHIP;
    412    obj.shader_program = color_sp;
    413    obj.points = {
    414       //back
    415       -0.5f,    0.3f,    0.0f,
    416       -0.5f,    0.0f,    0.0f,
    417        0.5f,    0.0f,    0.0f,
    418       -0.5f,    0.3f,    0.0f,
    419        0.5f,    0.0f,    0.0f,
    420        0.5f,    0.3f,    0.0f,
    421 
    422       // left back
    423       -0.5f,    0.3f,   -2.0f,
    424       -0.5f,    0.0f,   -2.0f,
    425       -0.5f,    0.0f,    0.0f,
    426       -0.5f,    0.3f,   -2.0f,
    427       -0.5f,    0.0f,    0.0f,
    428       -0.5f,    0.3f,    0.0f,
    429 
    430       // right back
    431        0.5f,    0.3f,    0.0f,
    432        0.5f,    0.0f,    0.0f,
    433        0.5f,    0.0f,   -2.0f,
    434        0.5f,    0.3f,    0.0f,
    435        0.5f,    0.0f,   -2.0f,
    436        0.5f,    0.3f,   -2.0f,
    437 
    438       // left mid
    439       -0.25f,   0.3f,   -3.0f,
    440       -0.25f,   0.0f,   -3.0f,
    441       -0.5f,    0.0f,   -2.0f,
    442       -0.25f,   0.3f,   -3.0f,
    443       -0.5f,    0.0f,   -2.0f,
    444       -0.5f,    0.3f,   -2.0f,
    445 
    446       // right mid
    447        0.5f,    0.3f,   -2.0f,
    448        0.5f,    0.0f,   -2.0f,
    449        0.25f,   0.0f,   -3.0f,
    450        0.5f,    0.3f,   -2.0f,
    451        0.25f,   0.0f,   -3.0f,
    452        0.25f,   0.3f,   -3.0f,
    453 
    454       // left front
    455        0.0f,    0.0f,   -3.5f,
    456       -0.25f,   0.0f,   -3.0f,
    457       -0.25f,   0.3f,   -3.0f,
    458 
    459       // right front
    460        0.25f,   0.3f,   -3.0f,
    461        0.25f,   0.0f,   -3.0f,
    462        0.0f,    0.0f,   -3.5f,
    463 
    464       // top back
    465       -0.5f,    0.3f,   -2.0f,
    466       -0.5f,    0.3f,    0.0f,
    467        0.5f,    0.3f,    0.0f,
    468       -0.5f,    0.3f,   -2.0f,
    469        0.5f,    0.3f,    0.0f,
    470        0.5f,    0.3f,   -2.0f,
    471 
    472       // bottom back
    473       -0.5f,    0.0f,    0.0f,
    474       -0.5f,    0.0f,   -2.0f,
    475        0.5f,    0.0f,    0.0f,
    476        0.5f,    0.0f,    0.0f,
    477       -0.5f,    0.0f,   -2.0f,
    478        0.5f,    0.0f,   -2.0f,
    479 
    480       // top mid
    481       -0.25f,   0.3f,   -3.0f,
    482       -0.5f,    0.3f,   -2.0f,
    483        0.5f,    0.3f,   -2.0f,
    484       -0.25f,   0.3f,   -3.0f,
    485        0.5f,    0.3f,   -2.0f,
    486        0.25f,   0.3f,   -3.0f,
    487 
    488       // bottom mid
    489       -0.5f,    0.0f,   -2.0f,
    490       -0.25f,   0.0f,   -3.0f,
    491        0.5f,    0.0f,   -2.0f,
    492        0.5f,    0.0f,   -2.0f,
    493       -0.25f,   0.0f,   -3.0f,
    494        0.25f,   0.0f,   -3.0f,
    495 
    496       // top front
    497       -0.25f,   0.3f,   -3.0f,
    498        0.25f,   0.3f,   -3.0f,
    499        0.0f,    0.0f,   -3.5f,
    500 
    501       // bottom front
    502        0.25f,   0.0f,   -3.0f,
    503       -0.25f,   0.0f,   -3.0f,
    504        0.0f,    0.0f,   -3.5f,
    505 
    506       // left wing start back
    507       -1.5f,    0.3f,    0.0f,
    508       -1.5f,    0.0f,    0.0f,
    509       -0.5f,    0.0f,    0.0f,
    510       -1.5f,    0.3f,    0.0f,
    511       -0.5f,    0.0f,    0.0f,
    512       -0.5f,    0.3f,    0.0f,
    513 
    514       // left wing start top
    515       -0.5f,    0.3f,   -0.3f,
    516       -1.3f,    0.3f,   -0.3f,
    517       -1.5f,    0.3f,    0.0f,
    518       -0.5f,    0.3f,   -0.3f,
    519       -1.5f,    0.3f,    0.0f,
    520       -0.5f,    0.3f,    0.0f,
    521 
    522       // left wing start front
    523       -0.5f,    0.3f,   -0.3f,
    524       -0.5f,    0.0f,   -0.3f,
    525       -1.3f,    0.0f,   -0.3f,
    526       -0.5f,    0.3f,   -0.3f,
    527       -1.3f,    0.0f,   -0.3f,
    528       -1.3f,    0.3f,   -0.3f,
    529 
    530       // left wing start bottom
    531       -0.5f,    0.0f,    0.0f,
    532       -1.5f,    0.0f,    0.0f,
    533       -1.3f,    0.0f,   -0.3f,
    534       -0.5f,    0.0f,    0.0f,
    535       -1.3f,    0.0f,   -0.3f,
    536       -0.5f,    0.0f,   -0.3f,
    537 
    538       // left wing end outside
    539       -1.5f,    0.3f,    0.0f,
    540       -2.2f,    0.15f,  -0.8f,
    541       -1.5f,    0.0f,    0.0f,
    542 
    543       // left wing end top
    544       -1.3f,    0.3f,   -0.3f,
    545       -2.2f,    0.15f,  -0.8f,
    546       -1.5f,    0.3f,    0.0f,
    547 
    548       // left wing end front
    549       -1.3f,    0.0f,   -0.3f,
    550       -2.2f,    0.15f,  -0.8f,
    551       -1.3f,    0.3f,   -0.3f,
    552 
    553       // left wing end bottom
    554       -1.5f,    0.0f,    0.0f,
    555       -2.2f,    0.15f,  -0.8f,
    556       -1.3f,    0.0f,   -0.3f,
    557 
    558       // right wing start back
    559        1.5f,    0.0f,    0.0f,
    560        1.5f,    0.3f,    0.0f,
    561        0.5f,    0.0f,    0.0f,
    562        0.5f,    0.0f,    0.0f,
    563        1.5f,    0.3f,    0.0f,
    564        0.5f,    0.3f,    0.0f,
    565 
    566       // right wing start top
    567        1.3f,    0.3f,   -0.3f,
    568        0.5f,    0.3f,   -0.3f,
    569        1.5f,    0.3f,    0.0f,
    570        1.5f,    0.3f,    0.0f,
    571        0.5f,    0.3f,   -0.3f,
    572        0.5f,    0.3f,    0.0f,
    573 
    574       // right wing start front
    575        0.5f,    0.0f,   -0.3f,
    576        0.5f,    0.3f,   -0.3f,
    577        1.3f,    0.0f,   -0.3f,
    578        1.3f,    0.0f,   -0.3f,
    579        0.5f,    0.3f,   -0.3f,
    580        1.3f,    0.3f,   -0.3f,
    581 
    582       // right wing start bottom
    583        1.5f,    0.0f,    0.0f,
    584        0.5f,    0.0f,    0.0f,
    585        1.3f,    0.0f,   -0.3f,
    586        1.3f,    0.0f,   -0.3f,
    587        0.5f,    0.0f,    0.0f,
    588        0.5f,    0.0f,   -0.3f,
    589 
    590       // right wing end outside
    591        2.2f,    0.15f,  -0.8f,
    592        1.5f,    0.3f,    0.0f,
    593        1.5f,    0.0f,    0.0f,
    594 
    595       // right wing end top
    596        2.2f,    0.15f,  -0.8f,
    597        1.3f,    0.3f,   -0.3f,
    598        1.5f,    0.3f,    0.0f,
    599 
    600       // right wing end front
    601        2.2f,    0.15f,  -0.8f,
    602        1.3f,    0.0f,   -0.3f,
    603        1.3f,    0.3f,   -0.3f,
    604 
    605       // right wing end bottom
    606        2.2f,    0.15f,  -0.8f,
    607        1.5f,    0.0f,    0.0f,
    608        1.3f,    0.0f,   -0.3f,
    609    };
    610    obj.colors = {
    611       0.0f, 0.0f, 0.3f,
    612       0.0f, 0.0f, 0.3f,
    613       0.0f, 0.0f, 0.3f,
    614       0.0f, 0.0f, 0.3f,
    615       0.0f, 0.0f, 0.3f,
    616       0.0f, 0.0f, 0.3f,
    617 
    618       0.0f, 0.0f, 0.3f,
    619       0.0f, 0.0f, 0.3f,
    620       0.0f, 0.0f, 0.3f,
    621       0.0f, 0.0f, 0.3f,
    622       0.0f, 0.0f, 0.3f,
    623       0.0f, 0.0f, 0.3f,
    624 
    625       0.0f, 0.0f, 0.3f,
    626       0.0f, 0.0f, 0.3f,
    627       0.0f, 0.0f, 0.3f,
    628       0.0f, 0.0f, 0.3f,
    629       0.0f, 0.0f, 0.3f,
    630       0.0f, 0.0f, 0.3f,
    631 
    632       0.0f, 0.0f, 0.3f,
    633       0.0f, 0.0f, 0.3f,
    634       0.0f, 0.0f, 0.3f,
    635       0.0f, 0.0f, 0.3f,
    636       0.0f, 0.0f, 0.3f,
    637       0.0f, 0.0f, 0.3f,
    638 
    639       0.0f, 0.0f, 0.3f,
    640       0.0f, 0.0f, 0.3f,
    641       0.0f, 0.0f, 0.3f,
    642       0.0f, 0.0f, 0.3f,
    643       0.0f, 0.0f, 0.3f,
    644       0.0f, 0.0f, 0.3f,
    645 
    646       0.0f, 0.0f, 1.0f,
    647       0.0f, 0.0f, 1.0f,
    648       0.0f, 0.0f, 1.0f,
    649 
    650       0.0f, 0.0f, 1.0f,
    651       0.0f, 0.0f, 1.0f,
    652       0.0f, 0.0f, 1.0f,
    653 
    654       0.0f, 0.0f, 1.0f,
    655       0.0f, 0.0f, 1.0f,
    656       0.0f, 0.0f, 1.0f,
    657       0.0f, 0.0f, 1.0f,
    658       0.0f, 0.0f, 1.0f,
    659       0.0f, 0.0f, 1.0f,
    660 
    661       0.0f, 0.0f, 1.0f,
    662       0.0f, 0.0f, 1.0f,
    663       0.0f, 0.0f, 1.0f,
    664       0.0f, 0.0f, 1.0f,
    665       0.0f, 0.0f, 1.0f,
    666       0.0f, 0.0f, 1.0f,
    667 
    668       0.0f, 0.0f, 1.0f,
    669       0.0f, 0.0f, 1.0f,
    670       0.0f, 0.0f, 1.0f,
    671       0.0f, 0.0f, 1.0f,
    672       0.0f, 0.0f, 1.0f,
    673       0.0f, 0.0f, 1.0f,
    674 
    675       0.0f, 0.0f, 1.0f,
    676       0.0f, 0.0f, 1.0f,
    677       0.0f, 0.0f, 1.0f,
    678       0.0f, 0.0f, 1.0f,
    679       0.0f, 0.0f, 1.0f,
    680       0.0f, 0.0f, 1.0f,
    681 
    682       0.0f, 0.0f, 0.3f,
    683       0.0f, 0.0f, 0.3f,
    684       0.0f, 0.0f, 0.3f,
    685 
    686       0.0f, 0.0f, 0.3f,
    687       0.0f, 0.0f, 0.3f,
    688       0.0f, 0.0f, 0.3f,
    689 
    690       0.0f, 0.0f, 0.3f,
    691       0.0f, 0.0f, 0.3f,
    692       0.0f, 0.0f, 0.3f,
    693       0.0f, 0.0f, 0.3f,
    694       0.0f, 0.0f, 0.3f,
    695       0.0f, 0.0f, 0.3f,
    696 
    697       0.0f, 0.0f, 0.3f,
    698       0.0f, 0.0f, 0.3f,
    699       0.0f, 0.0f, 0.3f,
    700       0.0f, 0.0f, 0.3f,
    701       0.0f, 0.0f, 0.3f,
    702       0.0f, 0.0f, 0.3f,
    703 
    704       0.0f, 0.0f, 0.3f,
    705       0.0f, 0.0f, 0.3f,
    706       0.0f, 0.0f, 0.3f,
    707       0.0f, 0.0f, 0.3f,
    708       0.0f, 0.0f, 0.3f,
    709       0.0f, 0.0f, 0.3f,
    710 
    711       0.0f, 0.0f, 0.3f,
    712       0.0f, 0.0f, 0.3f,
    713       0.0f, 0.0f, 0.3f,
    714       0.0f, 0.0f, 0.3f,
    715       0.0f, 0.0f, 0.3f,
    716       0.0f, 0.0f, 0.3f,
    717 
    718       0.0f, 0.0f, 0.3f,
    719       0.0f, 0.0f, 0.3f,
    720       0.0f, 0.0f, 0.3f,
    721 
    722       0.0f, 0.0f, 0.3f,
    723       0.0f, 0.0f, 0.3f,
    724       0.0f, 0.0f, 0.3f,
    725 
    726       0.0f, 0.0f, 0.3f,
    727       0.0f, 0.0f, 0.3f,
    728       0.0f, 0.0f, 0.3f,
    729 
    730       0.0f, 0.0f, 0.3f,
    731       0.0f, 0.0f, 0.3f,
    732       0.0f, 0.0f, 0.3f,
    733 
    734       0.0f, 0.0f, 0.3f,
    735       0.0f, 0.0f, 0.3f,
    736       0.0f, 0.0f, 0.3f,
    737       0.0f, 0.0f, 0.3f,
    738       0.0f, 0.0f, 0.3f,
    739       0.0f, 0.0f, 0.3f,
    740 
    741       0.0f, 0.0f, 0.3f,
    742       0.0f, 0.0f, 0.3f,
    743       0.0f, 0.0f, 0.3f,
    744       0.0f, 0.0f, 0.3f,
    745       0.0f, 0.0f, 0.3f,
    746       0.0f, 0.0f, 0.3f,
    747 
    748       0.0f, 0.0f, 0.3f,
    749       0.0f, 0.0f, 0.3f,
    750       0.0f, 0.0f, 0.3f,
    751       0.0f, 0.0f, 0.3f,
    752       0.0f, 0.0f, 0.3f,
    753       0.0f, 0.0f, 0.3f,
    754 
    755       0.0f, 0.0f, 0.3f,
    756       0.0f, 0.0f, 0.3f,
    757       0.0f, 0.0f, 0.3f,
    758       0.0f, 0.0f, 0.3f,
    759       0.0f, 0.0f, 0.3f,
    760       0.0f, 0.0f, 0.3f,
    761 
    762       0.0f, 0.0f, 0.3f,
    763       0.0f, 0.0f, 0.3f,
    764       0.0f, 0.0f, 0.3f,
    765 
    766       0.0f, 0.0f, 0.3f,
    767       0.0f, 0.0f, 0.3f,
    768       0.0f, 0.0f, 0.3f,
    769 
    770       0.0f, 0.0f, 0.3f,
    771       0.0f, 0.0f, 0.3f,
    772       0.0f, 0.0f, 0.3f,
    773 
    774       0.0f, 0.0f, 0.3f,
    775       0.0f, 0.0f, 0.3f,
    776       0.0f, 0.0f, 0.3f,
    777    };
    778    obj.texcoords = { 0.0f };
    779    obj.selected_colors = { 0.0f };
    780 
    781    T_model = translate(mat4(1.0f), vec3(0.0f, -1.2f, 1.65f));
    782    //R_model = rotate(mat4(1.0f), 20.0f * (float)ONE_DEG_IN_RAD, vec3(1.0f, 0.0f, 0.0f));
    783    R_model = mat4(1.0f);
    784    obj.model_base = T_model * R_model * scale(mat4(1.0f), vec3(0.1f, 0.1f, 0.1f));
    785 
    786    obj.translate_mat = T_model;
    787 
    788    initObject(obj);
    789    objects.push_back(obj);
     421   SceneObject* ship = createShip(color_sp);
     422   objects.push_back(ship);
    790423
    791424   vector<SceneObject>::iterator obj_it;
     
    953586   //glPolygonMode(GL_FRONT, GL_LINE);
    954587
    955    if (DISABLE_VSYNC && SHOW_FPS) {
    956       glfwSwapInterval(0);
    957    }
     588   // disable vsync to see real framerate
     589   //glfwSwapInterval(0);
    958590
    959591   State curState = STATE_MAIN_MENU;
     
    964596      previous_seconds = current_seconds;
    965597
    966       if (SHOW_FPS) {
    967          elapsed_seconds_fps += elapsed_seconds;
    968          if (elapsed_seconds_fps > 0.25f) {
    969             fps = (double)frame_count / elapsed_seconds_fps;
    970             cout << "FPS: " << fps << endl;
    971 
    972             frame_count = 0;
    973             elapsed_seconds_fps = 0.0f;
    974          }
    975 
    976          frame_count++;
    977       }
     598      elapsed_seconds_fps += elapsed_seconds;
     599      if (elapsed_seconds_fps > 0.25f) {
     600         fps = (double)frame_count / elapsed_seconds_fps;
     601
     602         frame_count = 0;
     603         elapsed_seconds_fps = 0.0f;
     604      }
     605
     606      frame_count++;
    978607
    979608      // Handle events
     
    1008637         elapsed_seconds_spawn += elapsed_seconds;
    1009638         if (elapsed_seconds_spawn > 0.5f) {
    1010             //spawnAsteroid(vec3(getRandomNum(-1.3f, 1.3f), getRandomNum(-3.0f, -1.0f), getRandomNum(-5.5f, -4.5f)), color_sp,
    1011             spawnAsteroid(vec3(getRandomNum(-1.3f, 1.3f), -1.2f, getRandomNum(-5.5f, -4.5f)), color_sp,
    1012                shaderBufferInfo,
     639            SceneObject* obj = createAsteroid(vec3(getRandomNum(-1.3f, 1.3f), -1.2f, getRandomNum(-5.5f, -4.5f)), color_sp);
     640            addObjectToScene(obj, shaderBufferInfo,
    1013641               points_vbo,
    1014642               colors_vbo,
     
    1044672
    1045673         if (key_down[GLFW_KEY_RIGHT]) {
    1046             transformObject(objects[0], translate(mat4(1.0f), vec3(0.01f, 0.0f, 0.0f)), ubo);
    1047 
    1048             if (leftLaserIdx != -1 && !objects[leftLaserIdx].deleted) {
    1049                translateLaser(objects[leftLaserIdx], vec3(0.01f, 0.0f, 0.0f), ubo);
     674            transformObject(*objects[0], translate(mat4(1.0f), vec3(0.01f, 0.0f, 0.0f)), ubo);
     675
     676            if (leftLaser != NULL && !leftLaser->deleted) {
     677               translateLaser(leftLaser, vec3(0.01f, 0.0f, 0.0f), ubo);
    1050678            }
    1051             if (rightLaserIdx != -1 && !objects[rightLaserIdx].deleted) {
    1052                translateLaser(objects[rightLaserIdx], vec3(0.01f, 0.0f, 0.0f), ubo);
     679            if (rightLaser != NULL && !rightLaser->deleted) {
     680               translateLaser(rightLaser, vec3(0.01f, 0.0f, 0.0f), ubo);
    1053681            }
    1054682         }
    1055683         if (key_down[GLFW_KEY_LEFT]) {
    1056             transformObject(objects[0], translate(mat4(1.0f), vec3(-0.01f, 0.0f, 0.0f)), ubo);
    1057 
    1058             if (leftLaserIdx != -1 && !objects[leftLaserIdx].deleted) {
    1059                translateLaser(objects[leftLaserIdx], vec3(-0.01f, 0.0f, 0.0f), ubo);
     684            transformObject(*objects[0], translate(mat4(1.0f), vec3(-0.01f, 0.0f, 0.0f)), ubo);
     685
     686            if (leftLaser != NULL && !leftLaser->deleted) {
     687               translateLaser(leftLaser, vec3(-0.01f, 0.0f, 0.0f), ubo);
    1060688            }
    1061             if (rightLaserIdx != -1 && !objects[rightLaserIdx].deleted) {
    1062                translateLaser(objects[rightLaserIdx], vec3(-0.01f, 0.0f, 0.0f), ubo);
     689            if (rightLaser != NULL && !rightLaser->deleted) {
     690               translateLaser(rightLaser, vec3(-0.01f, 0.0f, 0.0f), ubo);
    1063691            }
    1064692         }
    1065693
    1066694         if (key_state[GLFW_KEY_Z] == GLFW_PRESS) {
    1067             vec3 offset(objects[0].model_transform * vec4(0.0f, 0.0f, 0.0f, 1.0f));
    1068             leftLaserIdx = objects.size();
    1069 
    1070             SceneObject obj = createLaser(vec3(-0.21f, -1.19f, 1.76f)+offset, vec3(-0.21f, -1.19f, -3.0f)+offset,
     695            vec3 offset(objects[0]->model_transform * vec4(0.0f, 0.0f, 0.0f, 1.0f));
     696
     697            leftLaser = createLaser(vec3(-0.21f, -1.19f, 1.76f)+offset, vec3(-0.21f, -1.19f, -3.0f)+offset,
    1071698               vec3(0.0f, 1.0f, 0.0f), 0.03f, laser_sp);
    1072             addObjectToScene(obj, shaderBufferInfo,
     699            addObjectToScene(leftLaser, shaderBufferInfo,
    1073700               points_vbo,
    1074701               colors_vbo,
     
    1079706               model_mat_idx_vbo);
    1080707         } else if (key_state[GLFW_KEY_Z] == GLFW_RELEASE) {
    1081             removeObjectFromScene(objects[leftLaserIdx], ubo);
     708            removeObjectFromScene(*leftLaser, ubo);
    1082709         }
    1083710
    1084711         if (key_state[GLFW_KEY_X] == GLFW_PRESS) {
    1085             vec3 offset(objects[0].model_transform * vec4(0.0f, 0.0f, 0.0f, 1.0f));
    1086             rightLaserIdx = objects.size();
    1087 
    1088             SceneObject obj = createLaser(vec3(0.21f, -1.19f, 1.76f) + offset, vec3(0.21f, -1.19f, -3.0f) + offset,
     712            vec3 offset(objects[0]->model_transform * vec4(0.0f, 0.0f, 0.0f, 1.0f));
     713
     714            rightLaser = createLaser(vec3(0.21f, -1.19f, 1.76f) + offset, vec3(0.21f, -1.19f, -3.0f) + offset,
    1089715               vec3(0.0f, 1.0f, 0.0f), 0.03f, laser_sp);
    1090             addObjectToScene(obj, shaderBufferInfo,
     716            addObjectToScene(rightLaser, shaderBufferInfo,
    1091717               points_vbo,
    1092718               colors_vbo,
     
    1097723               model_mat_idx_vbo);
    1098724         } else if (key_state[GLFW_KEY_X] == GLFW_RELEASE) {
    1099             removeObjectFromScene(objects[rightLaserIdx], ubo);
     725            removeObjectFromScene(*rightLaser, ubo);
    1100726         }
    1101727
    1102728         // this code moves the asteroids
    1103729         for (int i = 0; i < objects.size(); i++) {
    1104             if (objects[i].type == TYPE_ASTEROID && !objects[i].deleted) {
    1105                transformObject(objects[i], translate(mat4(1.0f), vec3(0.0f, 0.0f, 0.04f)), ubo);
    1106 
    1107                vec3 obj_center = vec3(view_mat * vec4(objects[i].bounding_center, 1.0f));
    1108 
    1109                if ((obj_center.z - objects[i].bounding_radius) > -NEAR_CLIP) {
    1110                   removeObjectFromScene(objects[i], ubo);
     730            if (objects[i]->type == TYPE_ASTEROID && !objects[i]->deleted) {
     731               transformObject(*objects[i], translate(mat4(1.0f), vec3(0.0f, 0.0f, 0.04f)), ubo);
     732
     733               vec3 obj_center = vec3(view_mat * vec4(objects[i]->bounding_center, 1.0f));
     734
     735               if ((obj_center.z - objects[i]->bounding_radius) > -NEAR_CLIP) {
     736                  removeObjectFromScene(*objects[i], ubo);
    1111737               }
    1112738            }
    1113739         }
    1114740
    1115          if (leftLaserIdx != -1 && !objects[leftLaserIdx].deleted) {
    1116             updateLaserTarget(objects[leftLaserIdx], objects, points_vbo);
     741         if (leftLaser != NULL && !leftLaser->deleted) {
     742            updateLaserTarget(leftLaser, objects, points_vbo);
    1117743         }
    1118          if (rightLaserIdx != -1 && !objects[rightLaserIdx].deleted) {
    1119             updateLaserTarget(objects[rightLaserIdx], objects, points_vbo);
     744         if (rightLaser != NULL && !rightLaser->deleted) {
     745            updateLaserTarget(rightLaser, objects, points_vbo);
     746         }
     747      }
     748
     749      for (vector<EffectOverTime*>::iterator it = effects.begin(); it != effects.end(); ) {
     750         if ((*it)->deleted || (*it)->effectedObject->deleted) {
     751            delete *it;
     752            it = effects.erase(it);
     753         } else {
     754            EffectOverTime* eot = *it;
     755            eot->effectedValue = eot->startValue + (current_seconds - eot->startTime) * eot->changePerSecond;
     756
     757            it++;
    1120758         }
    1121759      }
     
    1168806      }
    1169807      */
    1170       if (cam_moved) {
     808      if (cam_moved && false) { // disable camera movement
    1171809         T = translate(mat4(1.0f), vec3(-cam_pos.x, -cam_pos.y, -cam_pos.z));
    1172810
     
    1219857   glfwTerminate();
    1220858
     859   // free memory
     860
     861   for (vector<SceneObject*>::iterator it = objects.begin(); it != objects.end(); it++) {
     862      delete *it;
     863   }
     864
    1221865   return 0;
    1222866}
     
    1248892      SceneObject* closest_object = NULL;
    1249893
    1250       for (vector<SceneObject>::iterator it = objects.begin(); it != objects.end(); it++) {
    1251          if (it->type == TYPE_LASER) continue;
    1252          for (unsigned int p_idx = 0; p_idx < it->points.size(); p_idx += 9) {
     894      for (vector<SceneObject*>::iterator it = objects.begin(); it != objects.end(); it++) {
     895         if ((*it)->type == TYPE_LASER) continue;
     896         for (unsigned int p_idx = 0; p_idx < (*it)->points.size(); p_idx += 9) {
    1253897            if (faceClicked(
    1254898               {
    1255                   vec3(it->points[p_idx], it->points[p_idx + 1], it->points[p_idx + 2]),
    1256                   vec3(it->points[p_idx + 3], it->points[p_idx + 4], it->points[p_idx + 5]),
    1257                   vec3(it->points[p_idx + 6], it->points[p_idx + 7], it->points[p_idx + 8]),
     899                  vec3((*it)->points[p_idx], (*it)->points[p_idx + 1], (*it)->points[p_idx + 2]),
     900                  vec3((*it)->points[p_idx + 3], (*it)->points[p_idx + 4], (*it)->points[p_idx + 5]),
     901                  vec3((*it)->points[p_idx + 6], (*it)->points[p_idx + 7], (*it)->points[p_idx + 8]),
    1258902               },
    1259                &*it, ray_world, vec4(cam_pos, 1.0f), click_point
     903               *it, ray_world, vec4(cam_pos, 1.0f), click_point
    1260904            )) {
    1261905               click_point = view_mat * click_point;
     
    1263907               if (-NEAR_CLIP >= click_point.z && click_point.z > -FAR_CLIP && click_point.z > closest_point.z) {
    1264908                  closest_point = vec3(click_point);
    1265                   closest_object = &*it;
     909                  closest_object = *it;
    1266910               }
    1267911            }
     
    14141058}
    14151059
    1416 void initObject(SceneObject& obj) {
     1060void initObject(SceneObject* obj) {
    14171061   // Each objects must have at least 3 points, so the size of
    14181062   // the points array must be a positive multiple of 9
    1419    if (obj.points.size() == 0 || (obj.points.size() % 9) != 0) {
     1063   if (obj->points.size() == 0 || (obj->points.size() % 9) != 0) {
     1064      // TODO: Maybe throw some kind of error here instead
    14201065      return;
    14211066   }
    14221067
    1423    obj.id = objects.size(); // currently unused
    1424    obj.num_points = obj.points.size() / 3;
    1425    obj.model_transform = mat4(1.0f);
    1426    obj.deleted = false;
    1427 
    1428    obj.normals.reserve(obj.points.size());
    1429    for (int i = 0; i < obj.points.size(); i += 9) {
    1430       vec3 point1 = vec3(obj.points[i], obj.points[i + 1], obj.points[i + 2]);
    1431       vec3 point2 = vec3(obj.points[i + 3], obj.points[i + 4], obj.points[i + 5]);
    1432       vec3 point3 = vec3(obj.points[i + 6], obj.points[i + 7], obj.points[i + 8]);
     1068   obj->id = objects.size(); // currently unused
     1069   obj->num_points = obj->points.size() / 3;
     1070   obj->model_transform = mat4(1.0f);
     1071   obj->deleted = false;
     1072
     1073   obj->normals.reserve(obj->points.size());
     1074   for (int i = 0; i < obj->points.size(); i += 9) {
     1075      vec3 point1 = vec3(obj->points[i], obj->points[i + 1], obj->points[i + 2]);
     1076      vec3 point2 = vec3(obj->points[i + 3], obj->points[i + 4], obj->points[i + 5]);
     1077      vec3 point3 = vec3(obj->points[i + 6], obj->points[i + 7], obj->points[i + 8]);
    14331078
    14341079      vec3 normal = normalize(cross(point2 - point1, point3 - point1));
     
    14361081      // Add the same normal for all 3 points
    14371082      for (int j = 0; j < 3; j++) {
    1438          obj.normals.push_back(normal.x);
    1439          obj.normals.push_back(normal.y);
    1440          obj.normals.push_back(normal.z);
    1441       }
    1442    }
    1443 
    1444    if (obj.type != TYPE_LASER) {
     1083         obj->normals.push_back(normal.x);
     1084         obj->normals.push_back(normal.y);
     1085         obj->normals.push_back(normal.z);
     1086      }
     1087   }
     1088
     1089   if (obj->type != TYPE_LASER) {
    14451090      calculateObjectBoundingBox(obj);
    14461091
    1447       obj.bounding_center = vec3(obj.translate_mat * vec4(obj.bounding_center, 1.0f));
    1448    }
    1449 }
    1450 
    1451 void addObjectToScene(SceneObject& obj,
     1092      obj->bounding_center = vec3(obj->translate_mat * vec4(obj->bounding_center, 1.0f));
     1093   }
     1094}
     1095
     1096void addObjectToScene(SceneObject* obj,
    14521097   map<GLuint, BufferInfo>& shaderBufferInfo,
    14531098   GLuint points_vbo,
     
    14601105   objects.push_back(obj);
    14611106
    1462    BufferInfo* bufferInfo = &shaderBufferInfo[obj.shader_program];
     1107   BufferInfo* bufferInfo = &shaderBufferInfo[obj->shader_program];
    14631108
    14641109   // Check if the buffers aren't large enough to fit the new object and, if so, call
    14651110   // populateBuffers() to resize and repopupulate them
    1466    if (bufferInfo->vbo_capacity < (bufferInfo->ubo_offset + obj.num_points) ||
     1111   if (bufferInfo->vbo_capacity < (bufferInfo->ubo_offset + obj->num_points) ||
    14671112      bufferInfo->ubo_capacity < (bufferInfo->ubo_offset + 1)) {
    14681113
    1469       if (leftLaserIdx != -1 && objects[leftLaserIdx].deleted) {
    1470          leftLaserIdx = -1;
    1471       }
    1472       if (rightLaserIdx != -1 && objects[rightLaserIdx].deleted) {
    1473          rightLaserIdx = -1;
     1114      if (leftLaser != NULL && leftLaser->deleted) {
     1115         leftLaser = NULL;
     1116      }
     1117      if (rightLaser != NULL && rightLaser->deleted) {
     1118         rightLaser = NULL;
    14741119      }
    14751120
     
    14831128         model_mat_idx_vbo);
    14841129   } else {
    1485       copyObjectDataToBuffers(objects.back(), shaderBufferInfo,
     1130      copyObjectDataToBuffers(*objects.back(), shaderBufferInfo,
    14861131         points_vbo,
    14871132         colors_vbo,
     
    15031148}
    15041149
    1505 void calculateObjectBoundingBox(SceneObject& obj) {
    1506    GLfloat min_x = obj.points[0];
    1507    GLfloat max_x = obj.points[0];
    1508    GLfloat min_y = obj.points[1];
    1509    GLfloat max_y = obj.points[1];
    1510    GLfloat min_z = obj.points[2];
    1511    GLfloat max_z = obj.points[2];
     1150void calculateObjectBoundingBox(SceneObject* obj) {
     1151   GLfloat min_x = obj->points[0];
     1152   GLfloat max_x = obj->points[0];
     1153   GLfloat min_y = obj->points[1];
     1154   GLfloat max_y = obj->points[1];
     1155   GLfloat min_z = obj->points[2];
     1156   GLfloat max_z = obj->points[2];
    15121157
    15131158   // start from the second point
    1514    for (int i = 3; i < obj.points.size(); i += 3) {
    1515       if (min_x > obj.points[i]) {
    1516          min_x = obj.points[i];
    1517       }
    1518       else if (max_x < obj.points[i]) {
    1519          max_x = obj.points[i];
    1520       }
    1521 
    1522       if (min_y > obj.points[i + 1]) {
    1523          min_y = obj.points[i + 1];
    1524       }
    1525       else if (max_y < obj.points[i + 1]) {
    1526          max_y = obj.points[i + 1];
    1527       }
    1528 
    1529       if (min_z > obj.points[i + 2]) {
    1530          min_z = obj.points[i + 2];
    1531       }
    1532       else if (max_z < obj.points[i + 2]) {
    1533          max_z = obj.points[i + 2];
    1534       }
    1535    }
    1536 
    1537    obj.bounding_center = vec3((min_x + max_x) / 2.0f, (min_y + max_y) / 2.0f, (min_z + max_z) / 2.0f);
    1538 
    1539    GLfloat radius_x = max_x - obj.bounding_center.x;
    1540    GLfloat radius_y = max_y - obj.bounding_center.y;
    1541    GLfloat radius_z = max_z - obj.bounding_center.z;
     1159   for (int i = 3; i < obj->points.size(); i += 3) {
     1160      if (min_x > obj->points[i]) {
     1161         min_x = obj->points[i];
     1162      }
     1163      else if (max_x < obj->points[i]) {
     1164         max_x = obj->points[i];
     1165      }
     1166
     1167      if (min_y > obj->points[i + 1]) {
     1168         min_y = obj->points[i + 1];
     1169      }
     1170      else if (max_y < obj->points[i + 1]) {
     1171         max_y = obj->points[i + 1];
     1172      }
     1173
     1174      if (min_z > obj->points[i + 2]) {
     1175         min_z = obj->points[i + 2];
     1176      }
     1177      else if (max_z < obj->points[i + 2]) {
     1178         max_z = obj->points[i + 2];
     1179      }
     1180   }
     1181
     1182   obj->bounding_center = vec3((min_x + max_x) / 2.0f, (min_y + max_y) / 2.0f, (min_z + max_z) / 2.0f);
     1183
     1184   GLfloat radius_x = max_x - obj->bounding_center.x;
     1185   GLfloat radius_y = max_y - obj->bounding_center.y;
     1186   GLfloat radius_z = max_z - obj->bounding_center.z;
    15421187
    15431188   // TODO: This actually underestimates the radius. Might need to be fixed at some point.
    15441189   // TODO: Does not take into account any scaling in the model matrix
    1545    obj.bounding_radius = radius_x;
    1546    if (obj.bounding_radius < radius_y)
    1547       obj.bounding_radius = radius_y;
    1548    if (obj.bounding_radius < radius_z)
    1549       obj.bounding_radius = radius_z;
    1550 
    1551    for (int i = 0; i < obj.points.size(); i += 3) {
    1552       obj.points[i] -= obj.bounding_center.x;
    1553       obj.points[i + 1] -= obj.bounding_center.y;
    1554       obj.points[i + 2] -= obj.bounding_center.z;
    1555    }
    1556 
    1557    obj.bounding_center = vec3(0.0f, 0.0f, 0.0f);
     1190   obj->bounding_radius = radius_x;
     1191   if (obj->bounding_radius < radius_y)
     1192      obj->bounding_radius = radius_y;
     1193   if (obj->bounding_radius < radius_z)
     1194      obj->bounding_radius = radius_z;
     1195
     1196   for (int i = 0; i < obj->points.size(); i += 3) {
     1197      obj->points[i] -= obj->bounding_center.x;
     1198      obj->points[i + 1] -= obj->bounding_center.y;
     1199      obj->points[i + 2] -= obj->bounding_center.z;
     1200   }
     1201
     1202   obj->bounding_center = vec3(0.0f, 0.0f, 0.0f);
     1203}
     1204
     1205SceneObject* createShip(GLuint shader) {
     1206   SceneObject* ship = new SceneObject();
     1207
     1208   ship->type = TYPE_SHIP;
     1209   ship->shader_program = shader;
     1210
     1211   ship->points = {
     1212      //back
     1213      -0.5f,    0.3f,    0.0f,
     1214      -0.5f,    0.0f,    0.0f,
     1215      0.5f,    0.0f,    0.0f,
     1216      -0.5f,    0.3f,    0.0f,
     1217      0.5f,    0.0f,    0.0f,
     1218      0.5f,    0.3f,    0.0f,
     1219
     1220      // left back
     1221      -0.5f,    0.3f,   -2.0f,
     1222      -0.5f,    0.0f,   -2.0f,
     1223      -0.5f,    0.0f,    0.0f,
     1224      -0.5f,    0.3f,   -2.0f,
     1225      -0.5f,    0.0f,    0.0f,
     1226      -0.5f,    0.3f,    0.0f,
     1227
     1228      // right back
     1229      0.5f,    0.3f,    0.0f,
     1230      0.5f,    0.0f,    0.0f,
     1231      0.5f,    0.0f,   -2.0f,
     1232      0.5f,    0.3f,    0.0f,
     1233      0.5f,    0.0f,   -2.0f,
     1234      0.5f,    0.3f,   -2.0f,
     1235
     1236      // left mid
     1237      -0.25f,   0.3f,   -3.0f,
     1238      -0.25f,   0.0f,   -3.0f,
     1239      -0.5f,    0.0f,   -2.0f,
     1240      -0.25f,   0.3f,   -3.0f,
     1241      -0.5f,    0.0f,   -2.0f,
     1242      -0.5f,    0.3f,   -2.0f,
     1243
     1244      // right mid
     1245      0.5f,    0.3f,   -2.0f,
     1246      0.5f,    0.0f,   -2.0f,
     1247      0.25f,   0.0f,   -3.0f,
     1248      0.5f,    0.3f,   -2.0f,
     1249      0.25f,   0.0f,   -3.0f,
     1250      0.25f,   0.3f,   -3.0f,
     1251
     1252      // left front
     1253      0.0f,    0.0f,   -3.5f,
     1254      -0.25f,   0.0f,   -3.0f,
     1255      -0.25f,   0.3f,   -3.0f,
     1256
     1257      // right front
     1258      0.25f,   0.3f,   -3.0f,
     1259      0.25f,   0.0f,   -3.0f,
     1260      0.0f,    0.0f,   -3.5f,
     1261
     1262      // top back
     1263      -0.5f,    0.3f,   -2.0f,
     1264      -0.5f,    0.3f,    0.0f,
     1265      0.5f,    0.3f,    0.0f,
     1266      -0.5f,    0.3f,   -2.0f,
     1267      0.5f,    0.3f,    0.0f,
     1268      0.5f,    0.3f,   -2.0f,
     1269
     1270      // bottom back
     1271      -0.5f,    0.0f,    0.0f,
     1272      -0.5f,    0.0f,   -2.0f,
     1273      0.5f,    0.0f,    0.0f,
     1274      0.5f,    0.0f,    0.0f,
     1275      -0.5f,    0.0f,   -2.0f,
     1276      0.5f,    0.0f,   -2.0f,
     1277
     1278      // top mid
     1279      -0.25f,   0.3f,   -3.0f,
     1280      -0.5f,    0.3f,   -2.0f,
     1281      0.5f,    0.3f,   -2.0f,
     1282      -0.25f,   0.3f,   -3.0f,
     1283      0.5f,    0.3f,   -2.0f,
     1284      0.25f,   0.3f,   -3.0f,
     1285
     1286      // bottom mid
     1287      -0.5f,    0.0f,   -2.0f,
     1288      -0.25f,   0.0f,   -3.0f,
     1289      0.5f,    0.0f,   -2.0f,
     1290      0.5f,    0.0f,   -2.0f,
     1291      -0.25f,   0.0f,   -3.0f,
     1292      0.25f,   0.0f,   -3.0f,
     1293
     1294      // top front
     1295      -0.25f,   0.3f,   -3.0f,
     1296      0.25f,   0.3f,   -3.0f,
     1297      0.0f,    0.0f,   -3.5f,
     1298
     1299      // bottom front
     1300      0.25f,   0.0f,   -3.0f,
     1301      -0.25f,   0.0f,   -3.0f,
     1302      0.0f,    0.0f,   -3.5f,
     1303
     1304      // left wing start back
     1305      -1.5f,    0.3f,    0.0f,
     1306      -1.5f,    0.0f,    0.0f,
     1307      -0.5f,    0.0f,    0.0f,
     1308      -1.5f,    0.3f,    0.0f,
     1309      -0.5f,    0.0f,    0.0f,
     1310      -0.5f,    0.3f,    0.0f,
     1311
     1312      // left wing start top
     1313      -0.5f,    0.3f,   -0.3f,
     1314      -1.3f,    0.3f,   -0.3f,
     1315      -1.5f,    0.3f,    0.0f,
     1316      -0.5f,    0.3f,   -0.3f,
     1317      -1.5f,    0.3f,    0.0f,
     1318      -0.5f,    0.3f,    0.0f,
     1319
     1320      // left wing start front
     1321      -0.5f,    0.3f,   -0.3f,
     1322      -0.5f,    0.0f,   -0.3f,
     1323      -1.3f,    0.0f,   -0.3f,
     1324      -0.5f,    0.3f,   -0.3f,
     1325      -1.3f,    0.0f,   -0.3f,
     1326      -1.3f,    0.3f,   -0.3f,
     1327
     1328      // left wing start bottom
     1329      -0.5f,    0.0f,    0.0f,
     1330      -1.5f,    0.0f,    0.0f,
     1331      -1.3f,    0.0f,   -0.3f,
     1332      -0.5f,    0.0f,    0.0f,
     1333      -1.3f,    0.0f,   -0.3f,
     1334      -0.5f,    0.0f,   -0.3f,
     1335
     1336      // left wing end outside
     1337      -1.5f,    0.3f,    0.0f,
     1338      -2.2f,    0.15f,  -0.8f,
     1339      -1.5f,    0.0f,    0.0f,
     1340
     1341      // left wing end top
     1342      -1.3f,    0.3f,   -0.3f,
     1343      -2.2f,    0.15f,  -0.8f,
     1344      -1.5f,    0.3f,    0.0f,
     1345
     1346      // left wing end front
     1347      -1.3f,    0.0f,   -0.3f,
     1348      -2.2f,    0.15f,  -0.8f,
     1349      -1.3f,    0.3f,   -0.3f,
     1350
     1351      // left wing end bottom
     1352      -1.5f,    0.0f,    0.0f,
     1353      -2.2f,    0.15f,  -0.8f,
     1354      -1.3f,    0.0f,   -0.3f,
     1355
     1356      // right wing start back
     1357      1.5f,    0.0f,    0.0f,
     1358      1.5f,    0.3f,    0.0f,
     1359      0.5f,    0.0f,    0.0f,
     1360      0.5f,    0.0f,    0.0f,
     1361      1.5f,    0.3f,    0.0f,
     1362      0.5f,    0.3f,    0.0f,
     1363
     1364      // right wing start top
     1365      1.3f,    0.3f,   -0.3f,
     1366      0.5f,    0.3f,   -0.3f,
     1367      1.5f,    0.3f,    0.0f,
     1368      1.5f,    0.3f,    0.0f,
     1369      0.5f,    0.3f,   -0.3f,
     1370      0.5f,    0.3f,    0.0f,
     1371
     1372      // right wing start front
     1373      0.5f,    0.0f,   -0.3f,
     1374      0.5f,    0.3f,   -0.3f,
     1375      1.3f,    0.0f,   -0.3f,
     1376      1.3f,    0.0f,   -0.3f,
     1377      0.5f,    0.3f,   -0.3f,
     1378      1.3f,    0.3f,   -0.3f,
     1379
     1380      // right wing start bottom
     1381      1.5f,    0.0f,    0.0f,
     1382      0.5f,    0.0f,    0.0f,
     1383      1.3f,    0.0f,   -0.3f,
     1384      1.3f,    0.0f,   -0.3f,
     1385      0.5f,    0.0f,    0.0f,
     1386      0.5f,    0.0f,   -0.3f,
     1387
     1388      // right wing end outside
     1389      2.2f,    0.15f,  -0.8f,
     1390      1.5f,    0.3f,    0.0f,
     1391      1.5f,    0.0f,    0.0f,
     1392
     1393      // right wing end top
     1394      2.2f,    0.15f,  -0.8f,
     1395      1.3f,    0.3f,   -0.3f,
     1396      1.5f,    0.3f,    0.0f,
     1397
     1398      // right wing end front
     1399      2.2f,    0.15f,  -0.8f,
     1400      1.3f,    0.0f,   -0.3f,
     1401      1.3f,    0.3f,   -0.3f,
     1402
     1403      // right wing end bottom
     1404      2.2f,    0.15f,  -0.8f,
     1405      1.5f,    0.0f,    0.0f,
     1406      1.3f,    0.0f,   -0.3f,
     1407   };
     1408   ship->colors = {
     1409      0.0f, 0.0f, 0.3f,
     1410      0.0f, 0.0f, 0.3f,
     1411      0.0f, 0.0f, 0.3f,
     1412      0.0f, 0.0f, 0.3f,
     1413      0.0f, 0.0f, 0.3f,
     1414      0.0f, 0.0f, 0.3f,
     1415
     1416      0.0f, 0.0f, 0.3f,
     1417      0.0f, 0.0f, 0.3f,
     1418      0.0f, 0.0f, 0.3f,
     1419      0.0f, 0.0f, 0.3f,
     1420      0.0f, 0.0f, 0.3f,
     1421      0.0f, 0.0f, 0.3f,
     1422
     1423      0.0f, 0.0f, 0.3f,
     1424      0.0f, 0.0f, 0.3f,
     1425      0.0f, 0.0f, 0.3f,
     1426      0.0f, 0.0f, 0.3f,
     1427      0.0f, 0.0f, 0.3f,
     1428      0.0f, 0.0f, 0.3f,
     1429
     1430      0.0f, 0.0f, 0.3f,
     1431      0.0f, 0.0f, 0.3f,
     1432      0.0f, 0.0f, 0.3f,
     1433      0.0f, 0.0f, 0.3f,
     1434      0.0f, 0.0f, 0.3f,
     1435      0.0f, 0.0f, 0.3f,
     1436
     1437      0.0f, 0.0f, 0.3f,
     1438      0.0f, 0.0f, 0.3f,
     1439      0.0f, 0.0f, 0.3f,
     1440      0.0f, 0.0f, 0.3f,
     1441      0.0f, 0.0f, 0.3f,
     1442      0.0f, 0.0f, 0.3f,
     1443
     1444      0.0f, 0.0f, 1.0f,
     1445      0.0f, 0.0f, 1.0f,
     1446      0.0f, 0.0f, 1.0f,
     1447
     1448      0.0f, 0.0f, 1.0f,
     1449      0.0f, 0.0f, 1.0f,
     1450      0.0f, 0.0f, 1.0f,
     1451
     1452      0.0f, 0.0f, 1.0f,
     1453      0.0f, 0.0f, 1.0f,
     1454      0.0f, 0.0f, 1.0f,
     1455      0.0f, 0.0f, 1.0f,
     1456      0.0f, 0.0f, 1.0f,
     1457      0.0f, 0.0f, 1.0f,
     1458
     1459      0.0f, 0.0f, 1.0f,
     1460      0.0f, 0.0f, 1.0f,
     1461      0.0f, 0.0f, 1.0f,
     1462      0.0f, 0.0f, 1.0f,
     1463      0.0f, 0.0f, 1.0f,
     1464      0.0f, 0.0f, 1.0f,
     1465
     1466      0.0f, 0.0f, 1.0f,
     1467      0.0f, 0.0f, 1.0f,
     1468      0.0f, 0.0f, 1.0f,
     1469      0.0f, 0.0f, 1.0f,
     1470      0.0f, 0.0f, 1.0f,
     1471      0.0f, 0.0f, 1.0f,
     1472
     1473      0.0f, 0.0f, 1.0f,
     1474      0.0f, 0.0f, 1.0f,
     1475      0.0f, 0.0f, 1.0f,
     1476      0.0f, 0.0f, 1.0f,
     1477      0.0f, 0.0f, 1.0f,
     1478      0.0f, 0.0f, 1.0f,
     1479
     1480      0.0f, 0.0f, 0.3f,
     1481      0.0f, 0.0f, 0.3f,
     1482      0.0f, 0.0f, 0.3f,
     1483
     1484      0.0f, 0.0f, 0.3f,
     1485      0.0f, 0.0f, 0.3f,
     1486      0.0f, 0.0f, 0.3f,
     1487
     1488      0.0f, 0.0f, 0.3f,
     1489      0.0f, 0.0f, 0.3f,
     1490      0.0f, 0.0f, 0.3f,
     1491      0.0f, 0.0f, 0.3f,
     1492      0.0f, 0.0f, 0.3f,
     1493      0.0f, 0.0f, 0.3f,
     1494
     1495      0.0f, 0.0f, 0.3f,
     1496      0.0f, 0.0f, 0.3f,
     1497      0.0f, 0.0f, 0.3f,
     1498      0.0f, 0.0f, 0.3f,
     1499      0.0f, 0.0f, 0.3f,
     1500      0.0f, 0.0f, 0.3f,
     1501
     1502      0.0f, 0.0f, 0.3f,
     1503      0.0f, 0.0f, 0.3f,
     1504      0.0f, 0.0f, 0.3f,
     1505      0.0f, 0.0f, 0.3f,
     1506      0.0f, 0.0f, 0.3f,
     1507      0.0f, 0.0f, 0.3f,
     1508
     1509      0.0f, 0.0f, 0.3f,
     1510      0.0f, 0.0f, 0.3f,
     1511      0.0f, 0.0f, 0.3f,
     1512      0.0f, 0.0f, 0.3f,
     1513      0.0f, 0.0f, 0.3f,
     1514      0.0f, 0.0f, 0.3f,
     1515
     1516      0.0f, 0.0f, 0.3f,
     1517      0.0f, 0.0f, 0.3f,
     1518      0.0f, 0.0f, 0.3f,
     1519
     1520      0.0f, 0.0f, 0.3f,
     1521      0.0f, 0.0f, 0.3f,
     1522      0.0f, 0.0f, 0.3f,
     1523
     1524      0.0f, 0.0f, 0.3f,
     1525      0.0f, 0.0f, 0.3f,
     1526      0.0f, 0.0f, 0.3f,
     1527
     1528      0.0f, 0.0f, 0.3f,
     1529      0.0f, 0.0f, 0.3f,
     1530      0.0f, 0.0f, 0.3f,
     1531
     1532      0.0f, 0.0f, 0.3f,
     1533      0.0f, 0.0f, 0.3f,
     1534      0.0f, 0.0f, 0.3f,
     1535      0.0f, 0.0f, 0.3f,
     1536      0.0f, 0.0f, 0.3f,
     1537      0.0f, 0.0f, 0.3f,
     1538
     1539      0.0f, 0.0f, 0.3f,
     1540      0.0f, 0.0f, 0.3f,
     1541      0.0f, 0.0f, 0.3f,
     1542      0.0f, 0.0f, 0.3f,
     1543      0.0f, 0.0f, 0.3f,
     1544      0.0f, 0.0f, 0.3f,
     1545
     1546      0.0f, 0.0f, 0.3f,
     1547      0.0f, 0.0f, 0.3f,
     1548      0.0f, 0.0f, 0.3f,
     1549      0.0f, 0.0f, 0.3f,
     1550      0.0f, 0.0f, 0.3f,
     1551      0.0f, 0.0f, 0.3f,
     1552
     1553      0.0f, 0.0f, 0.3f,
     1554      0.0f, 0.0f, 0.3f,
     1555      0.0f, 0.0f, 0.3f,
     1556      0.0f, 0.0f, 0.3f,
     1557      0.0f, 0.0f, 0.3f,
     1558      0.0f, 0.0f, 0.3f,
     1559
     1560      0.0f, 0.0f, 0.3f,
     1561      0.0f, 0.0f, 0.3f,
     1562      0.0f, 0.0f, 0.3f,
     1563
     1564      0.0f, 0.0f, 0.3f,
     1565      0.0f, 0.0f, 0.3f,
     1566      0.0f, 0.0f, 0.3f,
     1567
     1568      0.0f, 0.0f, 0.3f,
     1569      0.0f, 0.0f, 0.3f,
     1570      0.0f, 0.0f, 0.3f,
     1571
     1572      0.0f, 0.0f, 0.3f,
     1573      0.0f, 0.0f, 0.3f,
     1574      0.0f, 0.0f, 0.3f,
     1575   };
     1576   ship->texcoords = { 0.0f };
     1577   ship->selected_colors = { 0.0f };
     1578
     1579   mat4 T_model = translate(mat4(1.0f), vec3(0.0f, -1.2f, 1.65f));
     1580   mat4 R_model(1.0f);
     1581   ship->model_base = T_model * R_model * scale(mat4(1.0f), vec3(0.1f, 0.1f, 0.1f));
     1582
     1583   ship->translate_mat = T_model;
     1584
     1585   initObject(ship);
     1586
     1587   return ship;
    15581588}
    15591589
     
    15721602// TODO: Make the color parameter have an effect
    15731603// TODO: Come up with a better way of passing the object back than copying it
    1574 SceneObject createLaser(vec3 start, vec3 end, vec3 color, GLfloat width, GLuint laser_sp) {
    1575    SceneObject obj = SceneObject();
    1576    obj.type = TYPE_LASER;
    1577    obj.shader_program = laser_sp;
     1604Laser* createLaser(vec3 start, vec3 end, vec3 color, GLfloat width, GLuint laser_sp) {
     1605   Laser* obj = new Laser();
     1606   obj->type = TYPE_LASER;
     1607   obj->targetAsteroid = NULL;
     1608   obj->shader_program = laser_sp;
    15781609
    15791610   vec3 ray = end - start;
    15801611   float length = glm::length(ray);
    15811612
    1582    obj.points = {
     1613   obj->points = {
    15831614       width / 2, 0.0f, -width / 2,
    15841615      -width / 2, 0.0f, -width / 2,
     
    16011632   };
    16021633
    1603    obj.texcoords = {
     1634   obj->texcoords = {
    16041635      1.0f, 0.5f,
    16051636      0.0f, 0.5f,
     
    16361667   float zAxisRotation = -atan2(glm::dot(glm::cross(normal, laserToCam), glm::normalize(ray)), glm::dot(normal, laserToCam));
    16371668
    1638    obj.model_base = rotate(mat4(1.0f), zAxisRotation, vec3(0.0f, 0.0f, 1.0f));
     1669   obj->model_base = rotate(mat4(1.0f), zAxisRotation, vec3(0.0f, 0.0f, 1.0f));
    16391670
    16401671   initObject(obj);
    16411672
    1642    obj.model_transform = rotate(mat4(1.0f), xAxisRotation, vec3(1.0f, 0.0f, 0.0f)) * obj.model_transform;
    1643    obj.model_transform = rotate(mat4(1.0f), yAxisRotation, vec3(0.0f, 1.0f, 0.0f)) * obj.model_transform;
    1644    obj.model_transform = translate(mat4(1.0f), start) * obj.model_transform;
     1673   obj->model_transform = rotate(mat4(1.0f), xAxisRotation, vec3(1.0f, 0.0f, 0.0f)) * obj->model_transform;
     1674   obj->model_transform = rotate(mat4(1.0f), yAxisRotation, vec3(0.0f, 1.0f, 0.0f)) * obj->model_transform;
     1675   obj->model_transform = translate(mat4(1.0f), start) * obj->model_transform;
    16451676
    16461677   return obj;
     
    16771708}
    16781709
    1679 void populateBuffers(vector<SceneObject>& objects,
     1710void populateBuffers(vector<SceneObject*>& objects,
    16801711                  map<GLuint, BufferInfo>& shaderBufferInfo,
    16811712                  GLuint points_vbo,
     
    16941725   map<GLuint, unsigned int> shaderUboCounts;
    16951726
    1696    vector<SceneObject>::iterator it;
     1727   vector<SceneObject*>::iterator it;
    16971728
    16981729   /* Find all shaders that need to be used and the number of objects and
     
    17021733   * vertex buffer for each shader.
    17031734   */
    1704    for (it = objects.begin(); it != objects.end();) {
    1705       if (it->deleted) {
    1706          // terrible way of keeping track of the laser scene objects
    1707          // TODO: Find a more robust way of doing this, one that would work well
    1708          // for any objects in the scene
    1709          if (leftLaserIdx > it - objects.begin()) {
    1710             leftLaserIdx--;
    1711          }
    1712          if (rightLaserIdx > it - objects.begin()) {
    1713             rightLaserIdx--;
    1714          }
    1715 
     1735   for (it = objects.begin(); it != objects.end(); ) {
     1736      if ((*it)->deleted) {
     1737         delete *it;
    17161738         it = objects.erase(it);
    17171739      } else {
    1718          points_buffer_size += it->num_points * sizeof(GLfloat) * 3;
    1719          textures_buffer_size += it->num_points * sizeof(GLfloat) * 2;
     1740         points_buffer_size += (*it)->num_points * sizeof(GLfloat) * 3;
     1741         textures_buffer_size += (*it)->num_points * sizeof(GLfloat) * 2;
    17201742         ubo_buffer_size += 16 * sizeof(GLfloat);
    1721          model_mat_idx_buffer_size += it->num_points * sizeof(GLuint);
    1722 
    1723          if (shaderCounts.count(it->shader_program) == 0) {
    1724             shaderCounts[it->shader_program] = it->num_points;
    1725             shaderUboCounts[it->shader_program] = 1;
     1743         model_mat_idx_buffer_size += (*it)->num_points * sizeof(GLuint);
     1744
     1745         if (shaderCounts.count((*it)->shader_program) == 0) {
     1746            shaderCounts[(*it)->shader_program] = (*it)->num_points;
     1747            shaderUboCounts[(*it)->shader_program] = 1;
    17261748         } else {
    1727             shaderCounts[it->shader_program] += it->num_points;
    1728             shaderUboCounts[it->shader_program]++;
     1749            shaderCounts[(*it)->shader_program] += (*it)->num_points;
     1750            shaderUboCounts[(*it)->shader_program]++;
    17291751         }
    17301752
     
    17961818
    17971819   for (it = objects.begin(); it != objects.end(); it++) {
    1798       copyObjectDataToBuffers(*it, shaderBufferInfo,
     1820      copyObjectDataToBuffers(**it, shaderBufferInfo,
    17991821         points_vbo,
    18001822         colors_vbo,
     
    18631885}
    18641886
    1865 void translateLaser(SceneObject& laser, const vec3& translation, GLuint ubo) {
     1887void translateLaser(Laser* laser, const vec3& translation, GLuint ubo) {
    18661888   // TODO: A lot of the values calculated here can be calculated once and saved when the laser is created,
    18671889   // and then re-used here
    18681890
    1869    mat4 new_model_transform = translate(mat4(1.0f), translation) * laser.model_transform;
    1870 
    1871    vec3 start = vec3(laser.model_transform * vec4(0.0f, 0.0f, 0.0f, 1.0f));
    1872    vec3 end = vec3(laser.model_transform * vec4(0.0f, 0.0f, laser.points[38], 1.0f));
     1891   mat4 new_model_transform = translate(mat4(1.0f), translation) * laser->model_transform;
     1892
     1893   vec3 start = vec3(laser->model_transform * vec4(0.0f, 0.0f, 0.0f, 1.0f));
     1894   vec3 end = vec3(laser->model_transform * vec4(0.0f, 0.0f, laser->points[38], 1.0f));
    18731895
    18741896   vec3 ray = end - start;
     
    18891911   float zAxisRotation = -atan2(glm::dot(glm::cross(normal, laserToCam), glm::normalize(ray)), glm::dot(normal, laserToCam));
    18901912
    1891    laser.model_base = rotate(mat4(1.0f), zAxisRotation, vec3(0.0f, 0.0f, 1.0f));
    1892 
    1893    transformObject(laser, translate(mat4(1.0f), translation), ubo);
    1894 }
    1895 
    1896 void updateLaserTarget(SceneObject& laser, vector<SceneObject>& objects, GLuint points_vbo) {
     1913   laser->model_base = rotate(mat4(1.0f), zAxisRotation, vec3(0.0f, 0.0f, 1.0f));
     1914
     1915   transformObject(*laser, translate(mat4(1.0f), translation), ubo);
     1916}
     1917
     1918void updateLaserTarget(Laser* laser, vector<SceneObject*>& objects, GLuint points_vbo) {
    18971919   // TODO: A lot of the values calculated here can be calculated once and saved when the laser is created,
    18981920   // and then re-used here
    18991921
    1900    vec3 start = vec3(laser.model_transform * vec4(0.0f, 0.0f, 0.0f, 1.0f));
    1901    vec3 end = vec3(laser.model_transform * vec4(0.0f, 0.0f, laser.points[2] + laser.points[20], 1.0f));
     1922   vec3 start = vec3(laser->model_transform * vec4(0.0f, 0.0f, 0.0f, 1.0f));
     1923   vec3 end = vec3(laser->model_transform * vec4(0.0f, 0.0f, laser->points[2] + laser->points[20], 1.0f));
    19021924
    19031925   vec3 intersection(0.0f), closestIntersection(0.0f);
    1904    SceneObject* closestAsteroid = NULL;
    1905 
    1906    for (vector<SceneObject>::iterator it = objects.begin(); it != objects.end(); it++) {
    1907       if (it->type == TYPE_ASTEROID && !it->deleted && getLaserAndAsteroidIntersection(start, end, *it, intersection)) {
     1926   Asteroid* closestAsteroid = NULL;
     1927
     1928   for (vector<SceneObject*>::iterator it = objects.begin(); it != objects.end(); it++) {
     1929      if ((*it)->type == TYPE_ASTEROID && !(*it)->deleted && getLaserAndAsteroidIntersection(start, end, **it, intersection)) {
    19081930         // TODO: Implement a more generic algorithm for testing the closest object by getting the distance between the points
    19091931         if (closestAsteroid == NULL || intersection.z > closestIntersection.z) {
    19101932            // TODO: At this point, find the real intersection of the laser with one of the asteroid's sides
    1911             closestAsteroid = &*it;
     1933            closestAsteroid = (Asteroid*)*it;
    19121934            closestIntersection = intersection;
    19131935         }
     
    19151937   }
    19161938
    1917    float width = laser.points[0] - laser.points[2];
    1918 
    1919    float length = 5.24f;
     1939   float width = laser->points[0] - laser->points[2];
     1940
     1941   if (laser->targetAsteroid != closestAsteroid) {
     1942      if (laser->targetAsteroid != NULL) {
     1943         if (laser == leftLaser) {
     1944            leftLaserEffect->deleted = true;
     1945         } else if (laser == rightLaser) {
     1946            rightLaserEffect->deleted = true;
     1947         }
     1948      }
     1949
     1950      EffectOverTime* eot = NULL;
     1951
     1952      if (closestAsteroid != NULL) {
     1953         eot = new EffectOverTime(closestAsteroid->hp, -5, closestAsteroid);
     1954         effects.push_back(eot);
     1955      }
     1956
     1957      if (laser == leftLaser) {
     1958         leftLaserEffect = eot;
     1959      } else if (laser == rightLaser) {
     1960         rightLaserEffect = eot;
     1961      }
     1962   }
     1963   laser->targetAsteroid = closestAsteroid;
     1964
     1965   float length = 5.24f; // I think this was to make sure the laser went past the end of the screen
    19201966   if (closestAsteroid != NULL) {
    19211967      length = glm::length(closestIntersection - start);
    19221968   }
    19231969
    1924    laser.points[20] = -length + width / 2;
    1925    laser.points[23] = -length + width / 2;
    1926    laser.points[29] = -length + width / 2;
    1927    laser.points[38] = -length;
    1928    laser.points[41] = -length;
    1929    laser.points[44] = -length + width / 2;
    1930    laser.points[47] = -length;
    1931    laser.points[50] = -length + width / 2;
    1932    laser.points[53] = -length + width / 2;
     1970   laser->points[20] = -length + width / 2;
     1971   laser->points[23] = -length + width / 2;
     1972   laser->points[29] = -length + width / 2;
     1973   laser->points[38] = -length;
     1974   laser->points[41] = -length;
     1975   laser->points[44] = -length + width / 2;
     1976   laser->points[47] = -length;
     1977   laser->points[50] = -length + width / 2;
     1978   laser->points[53] = -length + width / 2;
    19331979
    19341980   glBindBuffer(GL_ARRAY_BUFFER, points_vbo);
    1935    glBufferSubData(GL_ARRAY_BUFFER, laser.vertex_vbo_offset * sizeof(GLfloat) * 3, laser.points.size() * sizeof(GLfloat), &laser.points[0]);
     1981   glBufferSubData(GL_ARRAY_BUFFER, laser->vertex_vbo_offset * sizeof(GLfloat) * 3, laser->points.size() * sizeof(GLfloat), &laser->points[0]);
    19361982}
    19371983
     
    20422088   */
    20432089
     2090   stringstream ss;
     2091   ss << "FPS:   " << fps;
     2092
    20442093   {
    2045       ImGui::SetNextWindowSize(ImVec2(85, 22), ImGuiCond_Once);
     2094      ImGui::SetNextWindowSize(ImVec2(95, 46), ImGuiCond_Once);
    20462095      ImGui::SetNextWindowPos(ImVec2(10, 50), ImGuiCond_Once);
    20472096      ImGui::Begin("WndStats", NULL,
     
    20502099         ImGuiWindowFlags_NoMove);
    20512100      ImGui::Text("Score: ???");
     2101      ImGui::Text(ss.str().c_str());
    20522102      ImGui::End();
    20532103   }
     
    21082158}
    21092159
    2110 void spawnAsteroid(vec3 pos, GLuint shader,
    2111                   map<GLuint, BufferInfo>& shaderBufferInfo,
    2112                   GLuint points_vbo,
    2113                   GLuint colors_vbo,
    2114                   GLuint selected_colors_vbo,
    2115                   GLuint texcoords_vbo,
    2116                   GLuint normals_vbo,
    2117                   GLuint ubo,
    2118                   GLuint model_mat_idx_vbo) {
    2119    SceneObject obj = SceneObject();
    2120    obj.type = TYPE_ASTEROID;
    2121    obj.shader_program = shader;
    2122 
    2123    obj.points = {
     2160Asteroid* createAsteroid(vec3 pos, GLuint shader) {
     2161   Asteroid* obj = new Asteroid();
     2162   obj->type = TYPE_ASTEROID;
     2163   obj->hp = 10.0f;
     2164   obj->shader_program = shader;
     2165
     2166   obj->points = {
    21242167      // front
    21252168      1.0f,  1.0f,  1.0f,
     
    21702213      -1.0f, -1.0f,  1.0f,
    21712214   };
    2172    obj.colors = {
     2215   obj->colors = {
    21732216      // front
    21742217      0.8f, 0.0f, 0.0f,
     
    22192262      0.8f, 0.0f, 0.0f,
    22202263   };
    2221    obj.texcoords = { 0.0f };
    2222    obj.selected_colors = { 0.0f };
     2264   obj->texcoords = { 0.0f };
     2265   obj->selected_colors = { 0.0f };
    22232266
    22242267   mat4 T = translate(mat4(1.0f), pos);
    22252268   mat4 R = rotate(mat4(1.0f), 60.0f * (float)ONE_DEG_IN_RAD, vec3(1.0f, 1.0f, -1.0f));
    2226    obj.model_base = T * R * scale(mat4(1.0f), vec3(0.1f, 0.1f, 0.1f));
    2227 
    2228    obj.translate_mat = T;
     2269   obj->model_base = T * R * scale(mat4(1.0f), vec3(0.1f, 0.1f, 0.1f));
     2270
     2271   obj->translate_mat = T;
    22292272
    22302273   initObject(obj);
     
    22342277   // TODO: Once the intersection check with the sides of the asteroid is done,
    22352278   // this can be removed.
    2236    obj.bounding_radius /= 8.0f;
    2237 
    2238    addObjectToScene(obj, shaderBufferInfo,
    2239                   points_vbo,
    2240                   colors_vbo,
    2241                   selected_colors_vbo,
    2242                   texcoords_vbo,
    2243                   normals_vbo,
    2244                   ubo,
    2245                   model_mat_idx_vbo);
     2279   obj->bounding_radius /= 8.0f;
     2280
     2281   return obj;
    22462282}
    22472283
Note: See TracChangeset for help on using the changeset viewer.