diff --git a/Controller.h b/Controller.h index 26b20d0..0de45f5 100644 --- a/Controller.h +++ b/Controller.h @@ -1,4 +1,6 @@ #pragma once +#include "Header.h" + class Controller { public: diff --git a/CrystalPoint.vcxproj b/CrystalPoint.vcxproj index 6422438..87360d9 100644 --- a/CrystalPoint.vcxproj +++ b/CrystalPoint.vcxproj @@ -151,6 +151,7 @@ + @@ -158,13 +159,17 @@ + + + + @@ -172,8 +177,11 @@ + + + diff --git a/CrystalPoint.vcxproj.filters b/CrystalPoint.vcxproj.filters index aa3e135..675688c 100644 --- a/CrystalPoint.vcxproj.filters +++ b/CrystalPoint.vcxproj.filters @@ -22,6 +22,9 @@ {842778c9-ff0f-4a6d-9c86-0a178ad40fcc} + + {1be14b84-6fa7-4cfb-94b9-666f3ee14198} + @@ -60,6 +63,18 @@ Header Files + + Header Files + + + Header Files + + + Header Files + + + Header Files + @@ -98,5 +113,17 @@ Source Files\State + + Source Files\Model\Enemy + + + Source Files + + + Source Files\Model + + + Source Files + \ No newline at end of file diff --git a/Enemy.cpp b/Enemy.cpp new file mode 100644 index 0000000..59b8bc9 --- /dev/null +++ b/Enemy.cpp @@ -0,0 +1,12 @@ +#include "Enemy.h" + + + +Enemy::Enemy() +{ +} + + +Enemy::~Enemy() +{ +} diff --git a/Enemy.h b/Enemy.h new file mode 100644 index 0000000..97075b6 --- /dev/null +++ b/Enemy.h @@ -0,0 +1,10 @@ +#pragma once +#include "Header.h" + +class Enemy +{ +public: + Enemy(); + ~Enemy(); +}; + diff --git a/Header.h b/Header.h index 30fe1c8..8048421 100644 --- a/Header.h +++ b/Header.h @@ -12,10 +12,9 @@ #include #include #include +#include #include #include -//Own files -#include "Model.h" -#include "ModelLoader.h" \ No newline at end of file +using namespace std; \ No newline at end of file diff --git a/Keyboard.h b/Keyboard.h index f75be2c..fcfdc55 100644 --- a/Keyboard.h +++ b/Keyboard.h @@ -1,4 +1,6 @@ #pragma once +#include "Header.h" + class Keyboard { public: diff --git a/LoadingState.h b/LoadingState.h index 7de986a..c4ad570 100644 --- a/LoadingState.h +++ b/LoadingState.h @@ -1,4 +1,6 @@ #pragma once +#include "Header.h" + class LoadingState { public: diff --git a/Main.cpp b/Main.cpp index 1ad112d..cf53916 100644 --- a/Main.cpp +++ b/Main.cpp @@ -1,4 +1,5 @@ #include "Header.h" +#include "Model.h" //Prototypes void bindFuncOpenGL(void); @@ -11,7 +12,7 @@ static int Height; float lastFrameTime = 0; bool keys[255]; -vector models; +vector models; int currentModel = 0; struct Camera @@ -169,5 +170,5 @@ void configureOpenGL() void loadModels() { - models.push_back(new ObjModel("models/ship/shipA_OBJ.obj")); + models.push_back(new Model("models/ship/shipA_OBJ.obj")); } \ No newline at end of file diff --git a/MenuState.h b/MenuState.h index 9ebbf4a..e3a7426 100644 --- a/MenuState.h +++ b/MenuState.h @@ -1,4 +1,6 @@ #pragma once +#include "Header.h" + class MenuState { public: diff --git a/Model.cpp b/Model.cpp index 10173d5..0adaa02 100644 --- a/Model.cpp +++ b/Model.cpp @@ -1,10 +1,236 @@ #include "Model.h" -Model::Model() +#define STB_IMAGE_IMPLEMENTATION +#include "stb_image.h" + +Model::Model(string fileName) +{ + std::string dirName = fileName; + if (dirName.rfind("/") != std::string::npos) + dirName = dirName.substr(0, dirName.rfind("/")); + if (dirName.rfind("\\") != std::string::npos) + dirName = dirName.substr(0, dirName.rfind("\\")); + if (fileName == dirName) + dirName = ""; + + + std::ifstream pFile(fileName.c_str()); + + if (!pFile.is_open()) + { + std::cout << "Could not open file " << fileName << std::endl; + return; + } + + + ObjGroup* currentGroup = new ObjGroup(); + currentGroup->materialIndex = -1; + + + while (!pFile.eof()) + { + std::string line; + std::getline(pFile, line); + + line = replace(line, "\t", " "); + while (line.find(" ") != std::string::npos) + line = replace(line, " ", " "); + if (line == "") + continue; + if (line[0] == ' ') + line = line.substr(1); + if (line == "") + continue; + if (line[line.length() - 1] == ' ') + line = line.substr(0, line.length() - 1); + if (line == "") + continue; + if (line[0] == '#') + continue; + + std::vector params = split(line, " "); + params[0] = toLower(params[0]); + + if (params[0] == "v") + vertices.push_back(Vec3f((float)atof(params[1].c_str()), (float)atof(params[2].c_str()), (float)atof(params[3].c_str()))); + else if (params[0] == "vn") + normals.push_back(Vec3f((float)atof(params[1].c_str()), (float)atof(params[2].c_str()), (float)atof(params[3].c_str()))); + else if (params[0] == "vt") + texcoords.push_back(Vec2f((float)atof(params[1].c_str()), (float)atof(params[2].c_str()))); + else if (params[0] == "f") + { + for (size_t ii = 4; ii <= params.size(); ii++) + { + Face face; + + for (size_t i = ii - 3; i < ii; i++) //magische forlus om van quads triangles te maken ;) + { + Vertex vertex; + std::vector indices = split(params[i == (ii - 3) ? 1 : i], "/"); + if (indices.size() >= 1) //er is een positie + vertex.position = atoi(indices[0].c_str()) - 1; + if (indices.size() == 2) //alleen texture + vertex.texcoord = atoi(indices[1].c_str()) - 1; + if (indices.size() == 3) //v/t/n of v//n + { + if (indices[1] != "") + vertex.texcoord = atoi(indices[1].c_str()) - 1; + vertex.normal = atoi(indices[2].c_str()) - 1; + } + face.vertices.push_back(vertex); + } + currentGroup->faces.push_back(face); + } + } + else if (params[0] == "s") + {//smoothing + } + else if (params[0] == "mtllib") + { + loadMaterialFile(dirName + "/" + params[1], dirName); + } + else if (params[0] == "usemtl") + { + if (currentGroup->faces.size() != 0) + groups.push_back(currentGroup); + currentGroup = new ObjGroup(); + currentGroup->materialIndex = -1; + + for (size_t i = 0; i < materials.size(); i++) + { + MaterialInfo* info = materials[i]; + if (info->name == params[1]) + { + currentGroup->materialIndex = i; + break; + } + } + if (currentGroup->materialIndex == -1) + std::cout << "Could not find material name " << params[1] << std::endl; + } + } + groups.push_back(currentGroup); +} + + +Model::~Model(void) { } -Model::~Model() + + +void Model::draw() { + for (auto &g : groups) + { + if (materials[g->materialIndex]->hasTexture) + { + glEnable(GL_TEXTURE_2D); + materials[g->materialIndex]->texture->bind(); + } + + glBegin(GL_TRIANGLES); + for (auto &f : g->faces) + { + for (auto &v : f.vertices) + { + glNormal3f(normals[v.normal].x, normals[v.normal].y, normals[v.normal].z); + glTexCoord2f(texcoords[v.texcoord].x, texcoords[v.texcoord].y); + glVertex3f(vertices[v.position].x, vertices[v.position].y, vertices[v.position].z); + } + } + glEnd(); + } } + +void Model::loadMaterialFile(std::string fileName, std::string dirName) +{ + std::ifstream pFile(fileName.c_str()); + if (!pFile.is_open()) + { + std::cout << "Could not open file " << fileName << std::endl; + return; + } + + MaterialInfo* currentMaterial = NULL; + + while (!pFile.eof()) + { + std::string line; + std::getline(pFile, line); + + line = replace(line, "\t", " "); + while (line.find(" ") != std::string::npos) + line = replace(line, " ", " "); + if (line == "") + continue; + if (line[0] == ' ') + line = line.substr(1); + if (line == "") + continue; + if (line[line.length() - 1] == ' ') + line = line.substr(0, line.length() - 1); + if (line == "") + continue; + if (line[0] == '#') + continue; + + std::vector params = split(line, " "); + params[0] = toLower(params[0]); + + if (params[0] == "newmtl") + { + if (currentMaterial != NULL) + { + materials.push_back(currentMaterial); + } + currentMaterial = new MaterialInfo(); + currentMaterial->name = params[1]; + } + else if (params[0] == "map_kd") + { + currentMaterial->hasTexture = true; + currentMaterial->texture = new Texture(dirName + "/" + params[1]); + } + else + std::cout << "Didn't parse " << params[0] << " in material file" << std::endl; + } + if (currentMaterial != NULL) + materials.push_back(currentMaterial); + +} + +Model::MaterialInfo::MaterialInfo() +{ + Texture *texture; + hasTexture = false; +} + +Model::Texture::Texture(const std::string & fileName) +{ + int width, height, bpp; + stbi_set_flip_vertically_on_load(true); + unsigned char* imgData = stbi_load(fileName.c_str(), &width, &height, &bpp, 4); + + glGenTextures(1, &index); + glBindTexture(GL_TEXTURE_2D, index); + + glTexImage2D(GL_TEXTURE_2D, + 0, //level + GL_RGBA, //internal format + width, //width + height, //height + 0, //border + GL_RGBA, //data format + GL_UNSIGNED_BYTE, //data type + imgData); //data + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + stbi_image_free(imgData); +} + +void Model::Texture::bind() +{ + glBindTexture(GL_TEXTURE_2D, index); +} \ No newline at end of file diff --git a/Model.h b/Model.h index b74c958..703e059 100644 --- a/Model.h +++ b/Model.h @@ -1,8 +1,60 @@ #pragma once +#include "Header.h" +#include "ModelLoader.h" +#include "Vector.h" + class Model { -public: - Model(); - ~Model(); -}; +private: + class Vertex + { + public: + int position; + int normal; + int texcoord; + }; + class Face + { + public: + list vertices; + }; + + class Texture + { + GLuint index; + public: + Texture(const std::string &fileName); + void bind(); + }; + + class MaterialInfo + { + public: + MaterialInfo(); + std::string name; + Texture* texture; + bool hasTexture; + }; + + class ObjGroup + { + public: + std::string name; + int materialIndex; + list faces; + }; + + std::vector vertices; + std::vector normals; + std::vector texcoords; + std::vector groups; + std::vector materials; + + void loadMaterialFile(std::string fileName, std::string dirName); +public: + Model(std::string filename); + ~Model(void); + + void draw(); +}; diff --git a/ModelLoader.cpp b/ModelLoader.cpp index 99b1452..2afdb71 100644 --- a/ModelLoader.cpp +++ b/ModelLoader.cpp @@ -1,19 +1,7 @@ #include "Header.h" #include "ModelLoader.h" -#define STB_IMAGE_IMPLEMENTATION -#include "stb_image.h" - -ModelLoader::ModelLoader() -{ -} - - -ModelLoader::~ModelLoader() -{ -} - -std::string replace(std::string str, std::string toReplace, std::string replacement) +string replace(string str, string toReplace, string replacement) { size_t index = 0; while (true) @@ -27,7 +15,7 @@ std::string replace(std::string str, std::string toReplace, std::string replacem return str; } -std::vector split(std::string str, std::string sep) +vector split(string str, string sep) { std::vector ret; size_t index; @@ -41,293 +29,4 @@ std::vector split(std::string str, std::string sep) } ret.push_back(str); return ret; -} - -inline std::string toLower(std::string data) -{ - std::transform(data.begin(), data.end(), data.begin(), ::tolower); - return data; -} - - - - -ObjModel::ObjModel(std::string fileName) -{ - std::string dirName = fileName; - if (dirName.rfind("/") != std::string::npos) - dirName = dirName.substr(0, dirName.rfind("/")); - if (dirName.rfind("\\") != std::string::npos) - dirName = dirName.substr(0, dirName.rfind("\\")); - if (fileName == dirName) - dirName = ""; - - - std::ifstream pFile(fileName.c_str()); - - if (!pFile.is_open()) - { - std::cout << "Could not open file " << fileName << std::endl; - return; - } - - - ObjGroup* currentGroup = new ObjGroup(); - currentGroup->materialIndex = -1; - - - while (!pFile.eof()) - { - std::string line; - std::getline(pFile, line); - - line = replace(line, "\t", " "); - while (line.find(" ") != std::string::npos) - line = replace(line, " ", " "); - if (line == "") - continue; - if (line[0] == ' ') - line = line.substr(1); - if (line == "") - continue; - if (line[line.length() - 1] == ' ') - line = line.substr(0, line.length() - 1); - if (line == "") - continue; - if (line[0] == '#') - continue; - - std::vector params = split(line, " "); - params[0] = toLower(params[0]); - - if (params[0] == "v") - vertices.push_back(Vec3f((float)atof(params[1].c_str()), (float)atof(params[2].c_str()), (float)atof(params[3].c_str()))); - else if (params[0] == "vn") - normals.push_back(Vec3f((float)atof(params[1].c_str()), (float)atof(params[2].c_str()), (float)atof(params[3].c_str()))); - else if (params[0] == "vt") - texcoords.push_back(Vec2f((float)atof(params[1].c_str()), (float)atof(params[2].c_str()))); - else if (params[0] == "f") - { - for (size_t ii = 4; ii <= params.size(); ii++) - { - Face face; - - for (size_t i = ii - 3; i < ii; i++) //magische forlus om van quads triangles te maken ;) - { - Vertex vertex; - std::vector indices = split(params[i == (ii - 3) ? 1 : i], "/"); - if (indices.size() >= 1) //er is een positie - vertex.position = atoi(indices[0].c_str()) - 1; - if (indices.size() == 2) //alleen texture - vertex.texcoord = atoi(indices[1].c_str()) - 1; - if (indices.size() == 3) //v/t/n of v//n - { - if (indices[1] != "") - vertex.texcoord = atoi(indices[1].c_str()) - 1; - vertex.normal = atoi(indices[2].c_str()) - 1; - } - face.vertices.push_back(vertex); - } - currentGroup->faces.push_back(face); - } - } - else if (params[0] == "s") - {//smoothing - } - else if (params[0] == "mtllib") - { - loadMaterialFile(dirName + "/" + params[1], dirName); - } - else if (params[0] == "usemtl") - { - if (currentGroup->faces.size() != 0) - groups.push_back(currentGroup); - currentGroup = new ObjGroup(); - currentGroup->materialIndex = -1; - - for (size_t i = 0; i < materials.size(); i++) - { - MaterialInfo* info = materials[i]; - if (info->name == params[1]) - { - currentGroup->materialIndex = i; - break; - } - } - if (currentGroup->materialIndex == -1) - std::cout << "Could not find material name " << params[1] << std::endl; - } - } - groups.push_back(currentGroup); -} - - -ObjModel::~ObjModel(void) -{ -} - - - - -void ObjModel::draw() -{ - for (auto &g : groups) - { - if (materials[g->materialIndex]->hasTexture) - { - glEnable(GL_TEXTURE_2D); - materials[g->materialIndex]->texture->bind(); - } - - glBegin(GL_TRIANGLES); - for (auto &f : g->faces) - { - for (auto &v : f.vertices) - { - glNormal3f(normals[v.normal].x, normals[v.normal].y, normals[v.normal].z); - glTexCoord2f(texcoords[v.texcoord].x, texcoords[v.texcoord].y); - glVertex3f(vertices[v.position].x, vertices[v.position].y, vertices[v.position].z); - } - } - glEnd(); - } -} - -void ObjModel::loadMaterialFile(std::string fileName, std::string dirName) -{ - std::ifstream pFile(fileName.c_str()); - if (!pFile.is_open()) - { - std::cout << "Could not open file " << fileName << std::endl; - return; - } - - MaterialInfo* currentMaterial = NULL; - - while (!pFile.eof()) - { - std::string line; - std::getline(pFile, line); - - line = replace(line, "\t", " "); - while (line.find(" ") != std::string::npos) - line = replace(line, " ", " "); - if (line == "") - continue; - if (line[0] == ' ') - line = line.substr(1); - if (line == "") - continue; - if (line[line.length() - 1] == ' ') - line = line.substr(0, line.length() - 1); - if (line == "") - continue; - if (line[0] == '#') - continue; - - std::vector params = split(line, " "); - params[0] = toLower(params[0]); - - if (params[0] == "newmtl") - { - if (currentMaterial != NULL) - { - materials.push_back(currentMaterial); - } - currentMaterial = new MaterialInfo(); - currentMaterial->name = params[1]; - } - else if (params[0] == "map_kd") - { - currentMaterial->hasTexture = true; - currentMaterial->texture = new Texture(dirName + "/" + params[1]); - } - else - std::cout << "Didn't parse " << params[0] << " in material file" << std::endl; - } - if (currentMaterial != NULL) - materials.push_back(currentMaterial); - -} - -ObjModel::MaterialInfo::MaterialInfo() -{ - Texture *texture; - hasTexture = false; -} - - -Vec3f::Vec3f(float x, float y, float z) -{ - this->x = x; - this->y = y; - this->z = z; -} -Vec3f::Vec3f() -{ - this->x = 0; - this->y = 0; - this->z = 0; -} -Vec3f::Vec3f(Vec3f &other) -{ - this->x = other.x; - this->y = other.y; - this->z = other.z; -} - -float& Vec3f::operator [](int index) -{ - return v[index]; -} - - - -Vec2f::Vec2f(float x, float y) -{ - this->x = x; - this->y = y; -} -Vec2f::Vec2f() -{ - this->x = 0; - this->y = 0; -} -Vec2f::Vec2f(Vec2f &other) -{ - this->x = other.x; - this->y = other.y; -} - -float& Vec2f::operator [](int index) -{ - return v[index]; -} - -ObjModel::Texture::Texture(const std::string & fileName) -{ - int width, height, bpp; - stbi_set_flip_vertically_on_load(true); - unsigned char* imgData = stbi_load(fileName.c_str(), &width, &height, &bpp, 4); - - glGenTextures(1, &index); - glBindTexture(GL_TEXTURE_2D, index); - - glTexImage2D(GL_TEXTURE_2D, - 0, //level - GL_RGBA, //internal format - width, //width - height, //height - 0, //border - GL_RGBA, //data format - GL_UNSIGNED_BYTE, //data type - imgData); //data - glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); - glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); - stbi_image_free(imgData); -} - -void ObjModel::Texture::bind() -{ - glBindTexture(GL_TEXTURE_2D, index); } \ No newline at end of file diff --git a/ModelLoader.h b/ModelLoader.h index 296d5aa..89ebe71 100644 --- a/ModelLoader.h +++ b/ModelLoader.h @@ -1,101 +1,10 @@ -#include "Header.h" -using namespace std; - #pragma once -class ModelLoader +#include "Header.h" + +string replace(string str, string toReplace, string replacement); +vector split(string str, string sep); +inline string toLower(string data) { -public: - ModelLoader(); - ~ModelLoader(); -}; - -class Vec3f -{ -public: - union - { - struct - { - float x, y, z; - }; - float v[3]; - }; - Vec3f(); - Vec3f(Vec3f &other); - Vec3f(float x, float y, float z); - float& operator [](int); -}; - -class Vec2f -{ -public: - union - { - struct - { - float x, y; - }; - float v[2]; - }; - Vec2f(); - Vec2f(float x, float y); - Vec2f(Vec2f &other); - float& operator [](int); -}; - - -class ObjModel -{ -private: - class Vertex - { - public: - int position; - int normal; - int texcoord; - }; - - class Face - { - public: - list vertices; - }; - - class Texture - { - GLuint index; - public: - Texture(const std::string &fileName); - void bind(); - }; - - class MaterialInfo - { - public: - MaterialInfo(); - std::string name; - Texture* texture; - bool hasTexture; - }; - - class ObjGroup - { - public: - std::string name; - int materialIndex; - list faces; - }; - - std::vector vertices; - std::vector normals; - std::vector texcoords; - std::vector groups; - std::vector materials; - - void loadMaterialFile(std::string fileName, std::string dirName); -public: - ObjModel(std::string filename); - ~ObjModel(void); - - void draw(); -}; + std::transform(data.begin(), data.end(), data.begin(), ::tolower); + return data; +} diff --git a/Mouse.h b/Mouse.h index b609a08..9504022 100644 --- a/Mouse.h +++ b/Mouse.h @@ -1,4 +1,6 @@ #pragma once +#include "Header.h" + class Mouse { public: diff --git a/Player.cpp b/Player.cpp new file mode 100644 index 0000000..1484e6f --- /dev/null +++ b/Player.cpp @@ -0,0 +1,12 @@ +#include "Player.h" + + + +Player::Player() +{ +} + + +Player::~Player() +{ +} diff --git a/Player.h b/Player.h new file mode 100644 index 0000000..80e1cc2 --- /dev/null +++ b/Player.h @@ -0,0 +1,17 @@ +#pragma once +#include "Header.h" +#include "Weapon.h" + +class Player +{ +public: + Player(); + ~Player(); +private: + int level; + int xp; + Weapon rigth; + Weapon left; + vector weapons; +}; + diff --git a/State.h b/State.h index dc1a93a..b6e8c3c 100644 --- a/State.h +++ b/State.h @@ -1,4 +1,6 @@ #pragma once +#include "Header.h" + class State { public: diff --git a/StateHandler.h b/StateHandler.h index 99c5bbe..24673c9 100644 --- a/StateHandler.h +++ b/StateHandler.h @@ -1,4 +1,6 @@ #pragma once +#include "Header.h" + class StateHandler { public: diff --git a/Vector.cpp b/Vector.cpp new file mode 100644 index 0000000..1fa5114 --- /dev/null +++ b/Vector.cpp @@ -0,0 +1,48 @@ +#include "Vector.h" + +Vec3f::Vec3f(float x, float y, float z) +{ + this->x = x; + this->y = y; + this->z = z; +} +Vec3f::Vec3f() +{ + this->x = 0; + this->y = 0; + this->z = 0; +} +Vec3f::Vec3f(Vec3f &other) +{ + this->x = other.x; + this->y = other.y; + this->z = other.z; +} + +float& Vec3f::operator [](int index) +{ + return v[index]; +} + + + +Vec2f::Vec2f(float x, float y) +{ + this->x = x; + this->y = y; +} +Vec2f::Vec2f() +{ + this->x = 0; + this->y = 0; +} +Vec2f::Vec2f(Vec2f &other) +{ + this->x = other.x; + this->y = other.y; +} + +float& Vec2f::operator [](int index) +{ + return v[index]; +} diff --git a/Vector.h b/Vector.h new file mode 100644 index 0000000..c578d84 --- /dev/null +++ b/Vector.h @@ -0,0 +1,37 @@ +#pragma once +#include "Header.h" + +class Vec3f +{ +public: + union + { + struct + { + float x, y, z; + }; + float v[3]; + }; + Vec3f(); + Vec3f(Vec3f &other); + Vec3f(float x, float y, float z); + float& operator [](int); +}; + +class Vec2f +{ +public: + union + { + struct + { + float x, y; + }; + float v[2]; + }; + Vec2f(); + Vec2f(float x, float y); + Vec2f(Vec2f &other); + float& operator [](int); +}; + diff --git a/Weapon.cpp b/Weapon.cpp new file mode 100644 index 0000000..45f627f --- /dev/null +++ b/Weapon.cpp @@ -0,0 +1,10 @@ +#include "Weapon.h" + +Weapon::Weapon() +{ +} + + +Weapon::~Weapon() +{ +} diff --git a/Weapon.h b/Weapon.h new file mode 100644 index 0000000..74c1daf --- /dev/null +++ b/Weapon.h @@ -0,0 +1,10 @@ +#pragma once +#include "Header.h" + +class Weapon +{ +public: + Weapon(); + ~Weapon(); +}; + diff --git a/WorldModel.h b/WorldModel.h index eefe546..0f7044b 100644 --- a/WorldModel.h +++ b/WorldModel.h @@ -1,4 +1,6 @@ #pragma once +#include "Header.h" + class WorldModel { public: diff --git a/WorldState.h b/WorldState.h index e4f0eea..d110f22 100644 --- a/WorldState.h +++ b/WorldState.h @@ -1,4 +1,6 @@ #pragma once +#include "Header.h" + class WorldState { public: