From 428c401f9c1053f7e13ffe641758dfb72791d8dc Mon Sep 17 00:00:00 2001 From: Kelly Rauchenberger Date: Fri, 26 Jun 2015 19:59:28 -0400 Subject: Player now moves --- src/system_manager.h | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 src/system_manager.h (limited to 'src/system_manager.h') diff --git a/src/system_manager.h b/src/system_manager.h new file mode 100644 index 0000000..8f76db2 --- /dev/null +++ b/src/system_manager.h @@ -0,0 +1,37 @@ +#ifndef SYSTEM_MANAGER_H_544E6056 +#define SYSTEM_MANAGER_H_544E6056 + +#include +#include +#include +#include +#include "system.h" + +class SystemManager { + private: + std::list> loop; + std::map systems; + + public: + template + void emplaceSystem(Game& game, Args&&... args) + { + std::unique_ptr ptr = std::unique_ptr(new T(game, std::forward(args)...)); + std::type_index systemType = typeid(T); + + systems[systemType] = ptr.get(); + loop.push_back(std::move(ptr)); + } + + template + T& getSystem() + { + std::type_index systemType = typeid(T); + + assert(systems.count(systemType) == 1); + + return *((T*)systems[systemType]); + } +}; + +#endif /* end of include guard: SYSTEM_MANAGER_H_544E6056 */ -- cgit 1.4.1 From da3df061699203eccc9a0c98becaee3ce8050a4f Mon Sep 17 00:00:00 2001 From: Kelly Rauchenberger Date: Mon, 5 Feb 2018 11:51:24 -0500 Subject: Whitespace changes --- src/components/controllable.h | 6 +- src/components/droppable.h | 2 +- src/components/ponderable.h | 2 +- src/components/transformable.cpp | 2 +- src/components/transformable.h | 6 +- src/entity_manager.cpp | 8 +- src/entity_manager.h | 64 +++++------ src/game.cpp | 10 +- src/game.h | 6 +- src/main.cpp | 10 +- src/renderer.cpp | 228 +++++++++++++++++++-------------------- src/renderer.h | 2 +- src/system.h | 4 +- src/system_manager.h | 8 +- src/systems/controlling.cpp | 12 +-- src/systems/controlling.h | 6 +- src/systems/pondering.cpp | 6 +- src/systems/pondering.h | 2 +- src/systems/rendering.h | 4 +- 19 files changed, 194 insertions(+), 194 deletions(-) (limited to 'src/system_manager.h') diff --git a/src/components/controllable.h b/src/components/controllable.h index 317d68d..baccf13 100644 --- a/src/components/controllable.h +++ b/src/components/controllable.h @@ -14,20 +14,20 @@ class ControllableComponent : public Component { void setJumpKey(int k); int getDropKey() const; void setDropKey(int k); - + bool isFrozen() const; void setFrozen(bool f); bool isHoldingLeft() const; void setHoldingLeft(bool f); bool isHoldingRight() const; void setHoldingRight(bool f); - + private: int leftKey = GLFW_KEY_LEFT; int rightKey = GLFW_KEY_RIGHT; int jumpKey = GLFW_KEY_UP; int dropKey = GLFW_KEY_DOWN; - + bool frozen = false; bool holdingLeft = false; bool holdingRight = false; diff --git a/src/components/droppable.h b/src/components/droppable.h index 1f5608b..83fcb9d 100644 --- a/src/components/droppable.h +++ b/src/components/droppable.h @@ -7,7 +7,7 @@ class DroppableComponent : public Component { public: void setDroppable(bool can); bool isDroppable() const; - + private: bool droppable = false; }; diff --git a/src/components/ponderable.h b/src/components/ponderable.h index 5aab4b3..c836d2a 100644 --- a/src/components/ponderable.h +++ b/src/components/ponderable.h @@ -13,7 +13,7 @@ class PonderableComponent : public Component { void setAccelX(double v); double getAccelY() const; void setAccelY(double v); - + private: double velocityX = 0.0; double velocityY = 0.0; diff --git a/src/components/transformable.cpp b/src/components/transformable.cpp index 0d6b67e..89b1e5d 100644 --- a/src/components/transformable.cpp +++ b/src/components/transformable.cpp @@ -3,7 +3,7 @@ TransformableComponent::TransformableComponent(double x, double y, int w, int h) : x(x), y(y), w(w), h(h) { - + } double TransformableComponent::getX() const diff --git a/src/components/transformable.h b/src/components/transformable.h index 87ba84d..69f4f0e 100644 --- a/src/components/transformable.h +++ b/src/components/transformable.h @@ -6,17 +6,17 @@ class TransformableComponent : public Component { public: TransformableComponent(double x, double y, int w, int h); - + double getX() const; double getY() const; int getW() const; int getH() const; - + void setX(double v); void setY(double v); void setW(int v); void setH(int v); - + private: double x; double y; diff --git a/src/entity_manager.cpp b/src/entity_manager.cpp index 4bdfe8a..9ad758b 100644 --- a/src/entity_manager.cpp +++ b/src/entity_manager.cpp @@ -10,13 +10,13 @@ std::set EntityManager::getEntitiesWithComponents<>(std::set& cache = cachedComponents[componentTypes]; for (auto& entity : entities) { EntityData& data = entity.second; bool cacheEntity = true; - + for (auto& componentType : componentTypes) { if (data.components.count(componentType) == 0) @@ -25,13 +25,13 @@ std::set EntityManager::getEntitiesWithComponents<>(std::set> components; }; - + std::map entities; std::map, std::set> cachedComponents; - + int nextEntityID = 0; - + template std::set getEntitiesWithComponentsHelper(std::set& componentTypes) { componentTypes.insert(typeid(T)); - + return getEntitiesWithComponents(componentTypes); } - + template std::set getEntitiesWithComponents(std::set& componentTypes) { return getEntitiesWithComponentsHelper(componentTypes); } - + public: EntityManager() = default; EntityManager(const EntityManager& copy) = delete; - + int emplaceEntity() { // Find a suitable entity ID @@ -44,76 +44,76 @@ class EntityManager { { nextEntityID++; } - + if (nextEntityID < 0) { nextEntityID = 0; - + while ((entities.count(nextEntityID) == 1) && (nextEntityID >= 0)) { nextEntityID++; } - + assert(nextEntityID >= 0); } - + // Initialize the data int id = nextEntityID++; entities[id]; - + return id; } - + void deleteEntity(int entity) { assert(entities.count(entity) == 1); - + // Uncache components for (auto& cache : cachedComponents) { cache.second.erase(entity); } - + // Destroy the data entities.erase(entity); } - + template T& emplaceComponent(int entity, Args&&... args) { assert(entities.count(entity) == 1); - + EntityData& data = entities[entity]; std::type_index componentType = typeid(T); - + assert(data.components.count(componentType) == 0); - + // Initialize the component std::unique_ptr ptr = std::unique_ptr(new T(std::forward(args)...)); T& component = *ptr; data.components[componentType] = std::move(ptr); - + // Invalidate related caches erase_if(cachedComponents, [&componentType] (std::pair, std::set>& cache) { return cache.first.count(componentType) == 1; }); - + return component; } - + template void removeComponent(int entity) { assert(entities.count(entity) == 1); - + EntityData& data = entities[entity]; std::type_index componentType = typeid(T); - + assert(data.components.count(componentType) == 1); - + // Destroy the component data.components.erase(componentType); - + // Uncache the component for (auto& cache : cachedComponents) { @@ -123,25 +123,25 @@ class EntityManager { } } } - + template T& getComponent(int entity) { assert(entities.count(entity) == 1); - + EntityData& data = entities[entity]; std::type_index componentType = typeid(T); - + assert(data.components.count(componentType) == 1); - + return *((T*)data.components[componentType].get()); } - + template std::set getEntitiesWithComponents() { std::set componentTypes; - + return getEntitiesWithComponentsHelper(componentTypes); } }; diff --git a/src/game.cpp b/src/game.cpp index b3fa9a8..5d1ec18 100644 --- a/src/game.cpp +++ b/src/game.cpp @@ -45,24 +45,24 @@ void Game::execute() double lastTime = glfwGetTime(); const double dt = 0.01; double accumulator = 0.0; - + while (!(shouldQuit || glfwWindowShouldClose(window))) { double currentTime = glfwGetTime(); double frameTime = currentTime - lastTime; lastTime = currentTime; - + glfwPollEvents(); - + accumulator += frameTime; while (accumulator >= dt) { systemManager.getSystem().tick(dt); systemManager.getSystem().tick(dt); - + accumulator -= dt; } - + systemManager.getSystem().tick(frameTime); } } diff --git a/src/game.h b/src/game.h index 3822700..ec667c8 100644 --- a/src/game.h +++ b/src/game.h @@ -8,12 +8,12 @@ class Game { public: Game(GLFWwindow* window); - + void execute(); EntityManager& getEntityManager(); - + friend void key_callback(GLFWwindow* window, int key, int scancode, int action, int mods); - + private: EntityManager entityManager; SystemManager systemManager; diff --git a/src/main.cpp b/src/main.cpp index 35749f5..d51da7d 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -8,20 +8,20 @@ int main() { srand(time(NULL)); - + GLFWwindow* window = initRenderer(); glfwSwapInterval(1); - + initMuxer(); - + // Put this in a block so game goes out of scope before we destroy the renderer { Game game {window}; game.execute(); } - + destroyMuxer(); destroyRenderer(); - + return 0; } diff --git a/src/renderer.cpp b/src/renderer.cpp index 99d5389..d0d2b75 100644 --- a/src/renderer.cpp +++ b/src/renderer.cpp @@ -56,11 +56,11 @@ static GLuint mesh_normalbuffer; static int mesh_numvertices; GLuint LoadShaders(const char* vertex_file_path, const char* fragment_file_path) -{ +{ // Create the shaders GLuint VertexShaderID = glCreateShader(GL_VERTEX_SHADER); GLuint FragmentShaderID = glCreateShader(GL_FRAGMENT_SHADER); - + // Read the Vertex Shader code from the file std::string VertexShaderCode; std::ifstream VertexShaderStream(vertex_file_path, std::ios::in); @@ -71,7 +71,7 @@ GLuint LoadShaders(const char* vertex_file_path, const char* fragment_file_path) VertexShaderCode += "\n" + Line; VertexShaderStream.close(); } - + // Read the Fragment Shader code from the file std::string FragmentShaderCode; std::ifstream FragmentShaderStream(fragment_file_path, std::ios::in); @@ -81,53 +81,53 @@ GLuint LoadShaders(const char* vertex_file_path, const char* fragment_file_path) FragmentShaderCode += "\n" + Line; FragmentShaderStream.close(); } - + GLint Result = GL_FALSE; int InfoLogLength; - + // Compile Vertex Shader printf("Compiling shader : %s\n", vertex_file_path); char const * VertexSourcePointer = VertexShaderCode.c_str(); glShaderSource(VertexShaderID, 1, &VertexSourcePointer , nullptr); glCompileShader(VertexShaderID); - + // Check Vertex Shader glGetShaderiv(VertexShaderID, GL_COMPILE_STATUS, &Result); glGetShaderiv(VertexShaderID, GL_INFO_LOG_LENGTH, &InfoLogLength); std::vector VertexShaderErrorMessage(InfoLogLength); glGetShaderInfoLog(VertexShaderID, InfoLogLength, nullptr, &VertexShaderErrorMessage[0]); fprintf(stdout, "%s\n", &VertexShaderErrorMessage[0]); - + // Compile Fragment Shader printf("Compiling shader : %s\n", fragment_file_path); char const * FragmentSourcePointer = FragmentShaderCode.c_str(); glShaderSource(FragmentShaderID, 1, &FragmentSourcePointer , nullptr); glCompileShader(FragmentShaderID); - + // Check Fragment Shader glGetShaderiv(FragmentShaderID, GL_COMPILE_STATUS, &Result); glGetShaderiv(FragmentShaderID, GL_INFO_LOG_LENGTH, &InfoLogLength); std::vector FragmentShaderErrorMessage(InfoLogLength); glGetShaderInfoLog(FragmentShaderID, InfoLogLength, nullptr, &FragmentShaderErrorMessage[0]); fprintf(stdout, "%s\n", &FragmentShaderErrorMessage[0]); - + // Link the program fprintf(stdout, "Linking program\n"); GLuint ProgramID = glCreateProgram(); glAttachShader(ProgramID, VertexShaderID); glAttachShader(ProgramID, FragmentShaderID); glLinkProgram(ProgramID); - + // Check the program glGetProgramiv(ProgramID, GL_LINK_STATUS, &Result); glGetProgramiv(ProgramID, GL_INFO_LOG_LENGTH, &InfoLogLength); std::vector ProgramErrorMessage( glm::max(InfoLogLength, int(1)) ); glGetProgramInfoLog(ProgramID, InfoLogLength, nullptr, &ProgramErrorMessage[0]); fprintf(stdout, "%s\n", &ProgramErrorMessage[0]); - + glDeleteShader(VertexShaderID); glDeleteShader(FragmentShaderID); - + return ProgramID; } @@ -135,14 +135,14 @@ void flipImageData(unsigned char* data, int width, int height, int comps) { unsigned char* data_copy = (unsigned char*) malloc(width*height*comps*sizeof(unsigned char)); memcpy(data_copy, data, width*height*comps); - + int row_size = width * comps; - + for (int i=0;i& out_vertices, std::v fprintf(stderr, "Could not open mesh file %s\n", filename); exit(1); } - + std::vector temp_vertices; std::vector temp_uvs; std::vector temp_normals; - + for (;;) { char lineHeader[256]; @@ -167,7 +167,7 @@ void loadMesh(const char* filename, std::vector& out_vertices, std::v { break; } - + if (!strncmp(lineHeader, "v", 2)) { glm::vec3 vertex; @@ -187,7 +187,7 @@ void loadMesh(const char* filename, std::vector& out_vertices, std::v { int vertexIDs[3], uvIDs[3], normalIDs[3]; fscanf(file, "%d/%d/%d %d/%d/%d %d/%d/%d\n", &vertexIDs[0], &uvIDs[0], &normalIDs[0], &vertexIDs[1], &uvIDs[1], &normalIDs[1], &vertexIDs[2], &uvIDs[2], &normalIDs[2]); - + for (int i=0; i<3; i++) { out_vertices.push_back(temp_vertices[vertexIDs[i] - 1]); @@ -202,24 +202,24 @@ void setFramebufferSize(GLFWwindow* w, int width, int height) { buffer_width = width; buffer_height = height; - + glDeleteFramebuffers(1, &bloom_framebuffer); glDeleteRenderbuffers(1, &bloom_depthbuffer); - + glGenFramebuffers(1, &bloom_framebuffer); glBindFramebuffer(GL_FRAMEBUFFER, bloom_framebuffer); GLenum DrawBuffers[1] = {GL_COLOR_ATTACHMENT1}; glDrawBuffers(1, DrawBuffers); - + glGenRenderbuffers(1, &bloom_depthbuffer); glBindRenderbuffer(GL_RENDERBUFFER, bloom_depthbuffer); glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT, width, height); glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, bloom_depthbuffer); - + glDeleteTextures(1, &preBloomTex); glDeleteTextures(1, &bloomPassTex1); glDeleteTextures(1, &bloomPassTex2); - + glGenTextures(1, &preBloomTex); glBindTexture(GL_TEXTURE_2D, preBloomTex); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, 0); @@ -227,7 +227,7 @@ void setFramebufferSize(GLFWwindow* w, int width, int height) glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); - + glGenTextures(1, &bloomPassTex1); glBindTexture(GL_TEXTURE_2D, bloomPassTex1); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width/4, height/4, 0, GL_RGB, GL_UNSIGNED_BYTE, 0); @@ -235,7 +235,7 @@ void setFramebufferSize(GLFWwindow* w, int width, int height) glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); - + glGenTextures(1, &bloomPassTex2); glBindTexture(GL_TEXTURE_2D, bloomPassTex2); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width/4, height/4, 0, GL_RGB, GL_UNSIGNED_BYTE, 0); @@ -252,20 +252,20 @@ GLFWwindow* initRenderer() fprintf(stderr, "Renderer already initialized\n"); exit(-1); } - + // Initialize GLFW if (!glfwInit()) { fprintf(stderr, "Failed to initialize GLFW\n"); exit(-1); } - + glfwWindowHint(GLFW_SAMPLES, 4); // 4x antialiasing glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); // We want version 3.3 glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3); glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE); // Mac requires this glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); - + // Create a window window = glfwCreateWindow(1024, 768, "Aromatherapy", nullptr, nullptr); if (window == nullptr) @@ -274,7 +274,7 @@ GLFWwindow* initRenderer() glfwTerminate(); exit(-1); } - + glfwMakeContextCurrent(window); glewExperimental = true; // Needed in core profile if (glewInit() != GLEW_OK) @@ -282,37 +282,37 @@ GLFWwindow* initRenderer() fprintf(stderr, "Failed to initialize GLEW\n"); exit(-1); } - + glfwSetFramebufferSizeCallback(window, &setFramebufferSize); - + // Set up vertex array object glGenVertexArrays(1, &VertexArrayID); glBindVertexArray(VertexArrayID); - + // Enable depth testing glEnable(GL_DEPTH_TEST); glDepthFunc(GL_LESS); - + // Enable blending glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - + // Set up the framebuffer glGenFramebuffers(1, &generic_framebuffer); glBindFramebuffer(GL_FRAMEBUFFER, generic_framebuffer); GLenum DrawBuffers[1] = {GL_COLOR_ATTACHMENT0}; glDrawBuffers(1, DrawBuffers); - + glGenFramebuffers(1, &bloom_framebuffer); glBindFramebuffer(GL_FRAMEBUFFER, bloom_framebuffer); GLenum DrawBuffers2[1] = {GL_COLOR_ATTACHMENT1}; glDrawBuffers(1, DrawBuffers2); - + glGenRenderbuffers(1, &bloom_depthbuffer); glBindRenderbuffer(GL_RENDERBUFFER, bloom_depthbuffer); glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT, 1024, 768); glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, bloom_depthbuffer); - + // Set up the NTSC rendering buffers glGenTextures(1, &renderedTex1); glBindTexture(GL_TEXTURE_2D, renderedTex1); @@ -322,7 +322,7 @@ GLFWwindow* initRenderer() glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); renderedTexBufs[0] = renderedTex1; - + glGenTextures(1, &renderedTex2); glBindTexture(GL_TEXTURE_2D, renderedTex2); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, GAME_WIDTH, GAME_HEIGHT, 0, GL_RGB, GL_UNSIGNED_BYTE, 0); @@ -331,7 +331,7 @@ GLFWwindow* initRenderer() glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); renderedTexBufs[1] = renderedTex2; - + // Set up bloom rendering buffers glGenTextures(1, &preBloomTex); glBindTexture(GL_TEXTURE_2D, preBloomTex); @@ -340,7 +340,7 @@ GLFWwindow* initRenderer() glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); - + glGenTextures(1, &bloomPassTex1); glBindTexture(GL_TEXTURE_2D, bloomPassTex1); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 1024/4, 768/4, 0, GL_RGB, GL_UNSIGNED_BYTE, 0); @@ -348,7 +348,7 @@ GLFWwindow* initRenderer() glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); - + glGenTextures(1, &bloomPassTex2); glBindTexture(GL_TEXTURE_2D, bloomPassTex2); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 1024/4, 768/4, 0, GL_RGB, GL_UNSIGNED_BYTE, 0); @@ -356,31 +356,31 @@ GLFWwindow* initRenderer() glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); - + curBuf = 0; - + // Load the mesh! std::vector mesh_vertices; std::vector mesh_uvs; std::vector mesh_normals; loadMesh("res/monitor-fef.obj", mesh_vertices, mesh_uvs, mesh_normals); - + mesh_numvertices = mesh_vertices.size(); - + glGenBuffers(1, &mesh_vertexbuffer); glBindBuffer(GL_ARRAY_BUFFER, mesh_vertexbuffer); glBufferData(GL_ARRAY_BUFFER, mesh_vertices.size() * sizeof(glm::vec3), &mesh_vertices[0], GL_STATIC_DRAW); - + glGenBuffers(1, &mesh_uvbuffer); glBindBuffer(GL_ARRAY_BUFFER, mesh_uvbuffer); glBufferData(GL_ARRAY_BUFFER, mesh_uvs.size() * sizeof(glm::vec3), &mesh_uvs[0], GL_STATIC_DRAW); - + glGenBuffers(1, &mesh_normalbuffer); glBindBuffer(GL_ARRAY_BUFFER, mesh_normalbuffer); glBufferData(GL_ARRAY_BUFFER, mesh_normals.size() * sizeof(glm::vec3), &mesh_normals[0], GL_STATIC_DRAW); - + // Load the vertices of a flat surface - GLfloat g_quad_vertex_buffer_data[] = { + GLfloat g_quad_vertex_buffer_data[] = { -1.0f, -1.0f, 0.0f, 1.0f, -1.0f, 0.0f, -1.0f, 1.0f, 0.0f, @@ -392,7 +392,7 @@ GLFWwindow* initRenderer() glGenBuffers(1, &quad_vertexbuffer); glBindBuffer(GL_ARRAY_BUFFER, quad_vertexbuffer); glBufferData(GL_ARRAY_BUFFER, sizeof(g_quad_vertex_buffer_data), g_quad_vertex_buffer_data, GL_STATIC_DRAW); - + glGenTextures(1, &artifactsTex); glBindTexture(GL_TEXTURE_2D, artifactsTex); int atdw, atdh; @@ -403,7 +403,7 @@ GLFWwindow* initRenderer() glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST); glGenerateMipmap(GL_TEXTURE_2D); - + glGenTextures(1, &scanlinesTex); glBindTexture(GL_TEXTURE_2D, scanlinesTex); int stdw, stdh; @@ -414,7 +414,7 @@ GLFWwindow* initRenderer() glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST); glGenerateMipmap(GL_TEXTURE_2D); - + // Load the shaders ntscShader = LoadShaders("shaders/ntsc.vertex", "shaders/ntsc.fragment"); finalShader = LoadShaders("shaders/final.vertex", "shaders/final.fragment"); @@ -422,9 +422,9 @@ GLFWwindow* initRenderer() fillShader = LoadShaders("shaders/fill.vertex", "shaders/fill.fragment"); bloom1Shader = LoadShaders("shaders/bloom1.vertex", "shaders/bloom1.fragment"); bloom2Shader = LoadShaders("shaders/bloom2.vertex", "shaders/bloom2.fragment"); - + rendererInitialized = true; - + return window; } @@ -435,13 +435,13 @@ void destroyRenderer() fprintf(stderr, "Renderer not initialized\n"); exit(-1); } - + // Delete the plane buffer glDeleteBuffers(1, &quad_vertexbuffer); glDeleteBuffers(1, &mesh_vertexbuffer); glDeleteBuffers(1, &mesh_uvbuffer); glDeleteBuffers(1, &mesh_normalbuffer); - + // Delete the shaders glDeleteProgram(ntscShader); glDeleteProgram(finalShader); @@ -449,7 +449,7 @@ void destroyRenderer() glDeleteProgram(fillShader); glDeleteProgram(bloom1Shader); glDeleteProgram(bloom2Shader); - + // Delete the NTSC rendering buffers glDeleteTextures(1, &renderedTex1); glDeleteTextures(1, &renderedTex2); @@ -458,18 +458,18 @@ void destroyRenderer() glDeleteTextures(1, &preBloomTex); glDeleteTextures(1, &bloomPassTex1); glDeleteTextures(1, &bloomPassTex2); - + // Delete the framebuffer glDeleteRenderbuffers(1, &bloom_depthbuffer); glDeleteFramebuffers(1, &bloom_framebuffer); glDeleteFramebuffers(1, &generic_framebuffer); - + // Delete the VAO glDeleteVertexArrays(1, &VertexArrayID); - + // Kill the window glfwTerminate(); - + rendererInitialized = false; } @@ -480,10 +480,10 @@ Texture::Texture(int width, int height) fprintf(stderr, "Renderer not initialized\n"); exit(-1); } - + this->width = width; this->height = height; - + glGenTextures(1, &texID); glBindTexture(GL_TEXTURE_2D, texID); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); @@ -500,7 +500,7 @@ Texture::Texture(const char* filename) fprintf(stderr, "Renderer not initialized\n"); exit(-1); } - + glGenTextures(1, &texID); glBindTexture(GL_TEXTURE_2D, texID); unsigned char* data = stbi_load(filename, &width, &height, 0, 4); @@ -520,14 +520,14 @@ Texture::Texture(const Texture& tex) fprintf(stderr, "Renderer not initialized\n"); exit(-1); } - + width = tex.width; height = tex.height; - + unsigned char* data = (unsigned char*) malloc(4 * width * height); glBindTexture(GL_TEXTURE_2D, tex.texID); glGetTexImage(GL_TEXTURE_2D, 0, GL_RGBA, GL_UNSIGNED_BYTE, data); - + glGenTextures(1, &texID); glBindTexture(GL_TEXTURE_2D, texID); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, data); @@ -535,7 +535,7 @@ Texture::Texture(const Texture& tex) glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); - + free(data); } @@ -551,14 +551,14 @@ Texture::~Texture() fprintf(stderr, "Renderer not initialized\n"); exit(-1); } - + glDeleteTextures(1, &texID); } Texture& Texture::operator= (Texture tex) { swap(*this, tex); - + return *this; } @@ -576,17 +576,17 @@ void Texture::fill(Rectangle dstrect, int r, int g, int b) fprintf(stderr, "Renderer not initialized\n"); exit(-1); } - + // Target the framebuffer glBindFramebuffer(GL_FRAMEBUFFER, generic_framebuffer); glFramebufferTexture(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, texID, 0); - + // Set up the vertex attributes GLfloat minx = (GLfloat) dstrect.x / width * 2.0 - 1.0; GLfloat miny = -((GLfloat) dstrect.y / height * 2.0 - 1.0); GLfloat maxx = (GLfloat) (dstrect.x + dstrect.w) / width * 2.0 - 1.0; GLfloat maxy = -((GLfloat) (dstrect.y + dstrect.h) / height * 2.0 - 1.0); - + GLfloat vertexbuffer_data[] = { minx, miny, maxx, miny, @@ -601,14 +601,14 @@ void Texture::fill(Rectangle dstrect, int r, int g, int b) glBufferData(GL_ARRAY_BUFFER, sizeof(vertexbuffer_data), vertexbuffer_data, GL_STATIC_DRAW); glEnableVertexAttribArray(0); glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, (void*)0); - + glViewport(0, 0, width, height); glClear(GL_DEPTH_BUFFER_BIT); glUseProgram(fillShader); glUniform3f(glGetUniformLocation(fillShader, "vecColor"), r / 255.0, g / 255.0, b / 255.0); - + glDrawArrays(GL_TRIANGLES, 0, 6); - + glDisableVertexAttribArray(0); glDeleteBuffers(1, &vertexbuffer); } @@ -620,19 +620,19 @@ void Texture::blit(const Texture& srctex, Rectangle srcrect, Rectangle dstrect, fprintf(stderr, "Renderer not initialized\n"); exit(-1); } - + alpha = glm::clamp(alpha, 0.0, 1.0); - + // Target the framebuffer glBindFramebuffer(GL_FRAMEBUFFER, generic_framebuffer); glFramebufferTexture(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, texID, 0); - + // Set up the vertex attributes GLfloat minx = (GLfloat) dstrect.x / width * 2.0 - 1.0; GLfloat miny = -((GLfloat) dstrect.y / height * 2.0 - 1.0); GLfloat maxx = (GLfloat) (dstrect.x + dstrect.w) / width * 2.0 - 1.0; GLfloat maxy = -((GLfloat) (dstrect.y + dstrect.h) / height * 2.0 - 1.0); - + GLfloat vertexbuffer_data[] = { minx, miny, maxx, miny, @@ -645,12 +645,12 @@ void Texture::blit(const Texture& srctex, Rectangle srcrect, Rectangle dstrect, glBufferData(GL_ARRAY_BUFFER, sizeof(vertexbuffer_data), vertexbuffer_data, GL_STATIC_DRAW); glEnableVertexAttribArray(0); glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, (void*)0); - + GLfloat minu = (GLfloat) srcrect.x / srctex.width; GLfloat minv = 1 - ((GLfloat) srcrect.y / srctex.height); GLfloat maxu = (GLfloat) (srcrect.x + srcrect.w) / srctex.width; GLfloat maxv = 1 - ((GLfloat) (srcrect.y + srcrect.h) / srctex.height); - + GLfloat texcoordbuffer_data[] = { minu, minv, maxu, minv, @@ -663,20 +663,20 @@ void Texture::blit(const Texture& srctex, Rectangle srcrect, Rectangle dstrect, glBufferData(GL_ARRAY_BUFFER, sizeof(texcoordbuffer_data), texcoordbuffer_data, GL_STATIC_DRAW); glEnableVertexAttribArray(1); glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 0, (void*)0); - + // Set up the shader glUseProgram(blitShader); glClear(GL_DEPTH_BUFFER_BIT); glViewport(0, 0, width, height); - + glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, srctex.texID); glUniform1i(glGetUniformLocation(blitShader, "srctex"), 0); glUniform1f(glGetUniformLocation(blitShader, "alpha"), alpha); - + // Blit! glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); - + // Unload everything glDisableVertexAttribArray(1); glDisableVertexAttribArray(0); @@ -691,11 +691,11 @@ void bloomPass1(GLuint srcTex, GLuint dstTex, bool horizontal, glm::vec2 srcRes, glViewport(0,0,dstRes.x,dstRes.y); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glUseProgram(bloom1Shader); - + glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, srcTex); glUniform1i(glGetUniformLocation(bloom1Shader, "inTex"), 0); - + glm::vec2 offset = glm::vec2(0.0); if (horizontal) { @@ -703,9 +703,9 @@ void bloomPass1(GLuint srcTex, GLuint dstTex, bool horizontal, glm::vec2 srcRes, } else { offset.y = 1.2/srcRes.y; } - + glUniform2f(glGetUniformLocation(bloom1Shader, "offset"), offset.x, offset.y); - + glEnableVertexAttribArray(0); glBindBuffer(GL_ARRAY_BUFFER, quad_vertexbuffer); glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, (void*)0); @@ -720,17 +720,17 @@ void Texture::renderScreen() const fprintf(stderr, "Renderer not initialized\n"); exit(-1); } - + // First we're going to composite our frame with the previous frame // We start by setting up the framebuffer glBindFramebuffer(GL_FRAMEBUFFER, generic_framebuffer); glFramebufferTexture(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, renderedTexBufs[curBuf], 0); - + // Set up the shader glViewport(0,0,GAME_WIDTH,GAME_HEIGHT); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glUseProgram(ntscShader); - + // Use the current frame texture, nearest neighbor and clamped to edge glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, texID); @@ -739,7 +739,7 @@ void Texture::renderScreen() const glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glUniform1i(glGetUniformLocation(ntscShader, "curFrameSampler"), 0); - + // Use the previous frame composite texture, nearest neighbor and clamped to edge glActiveTexture(GL_TEXTURE1); glBindTexture(GL_TEXTURE_2D, renderedTexBufs[(curBuf + 1) % 2]); @@ -748,13 +748,13 @@ void Texture::renderScreen() const glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glUniform1i(glGetUniformLocation(ntscShader, "prevFrameSampler"), 1); - + // Load the NTSC artifact texture glActiveTexture(GL_TEXTURE2); glBindTexture(GL_TEXTURE_2D, artifactsTex); glUniform1i(glGetUniformLocation(ntscShader, "NTSCArtifactSampler"), 2); glUniform1f(glGetUniformLocation(ntscShader, "NTSCLerp"), curBuf * 1.0); - + if ((rand() % 60) == 0) { // Change the 0.0 to a 1.0 or a 10.0 for a glitchy effect! @@ -762,7 +762,7 @@ void Texture::renderScreen() const } else { glUniform1f(glGetUniformLocation(ntscShader, "Tuning_NTSC"), 0.0); } - + // Render our composition glEnableVertexAttribArray(0); glBindBuffer(GL_ARRAY_BUFFER, quad_vertexbuffer); @@ -776,7 +776,7 @@ void Texture::renderScreen() const glViewport(0,0,buffer_width,buffer_height); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glUseProgram(finalShader); - + // Use the composited frame texture, linearly filtered and filling in black for the border glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, renderedTexBufs[curBuf]); @@ -788,69 +788,69 @@ void Texture::renderScreen() const glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, border_color); glGenerateMipmap(GL_TEXTURE_2D); glUniform1i(glGetUniformLocation(finalShader, "rendertex"), 0); - + // Use the scanlines texture glActiveTexture(GL_TEXTURE1); glBindTexture(GL_TEXTURE_2D, scanlinesTex); glUniform1i(glGetUniformLocation(finalShader, "scanlinestex"), 1); - + // Initialize the MVP matrices glm::mat4 p_matrix = glm::perspective(42.5f, (float) buffer_width / (float) buffer_height, 0.1f, 100.0f); glm::mat4 v_matrix = glm::lookAt(glm::vec3(2,0,0), glm::vec3(0,0,0), glm::vec3(0,1,0)); glm::mat4 m_matrix = glm::mat4(1.0); glm::mat4 mvp_matrix = p_matrix * v_matrix * m_matrix; - + glUniformMatrix4fv(glGetUniformLocation(finalShader, "MVP"), 1, GL_FALSE, &mvp_matrix[0][0]); glUniformMatrix4fv(glGetUniformLocation(finalShader, "worldMat"), 1, GL_FALSE, &m_matrix[0][0]); glUniform2f(glGetUniformLocation(finalShader, "resolution"), buffer_width, buffer_height); glUniform1f(glGetUniformLocation(finalShader, "iGlobalTime"), glfwGetTime()); - + glEnableVertexAttribArray(0); glBindBuffer(GL_ARRAY_BUFFER, mesh_vertexbuffer); glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, (void*)0); - + glEnableVertexAttribArray(1); glBindBuffer(GL_ARRAY_BUFFER, mesh_normalbuffer); glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 0, (void*)0); - + glEnableVertexAttribArray(2); glBindBuffer(GL_ARRAY_BUFFER, mesh_uvbuffer); glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, 0, (void*)0); - + glDrawArrays(GL_TRIANGLES, 0, mesh_numvertices); glDisableVertexAttribArray(2); glDisableVertexAttribArray(1); glDisableVertexAttribArray(0); - + // First pass of bloom! glm::vec2 buffer_size = glm::vec2(buffer_width, buffer_height); bloomPass1(preBloomTex, bloomPassTex1, true, buffer_size, buffer_size / 4.0f); bloomPass1(bloomPassTex1, bloomPassTex2, false, buffer_size / 4.0f, buffer_size / 4.0f); - + // Do the second pass of bloom and render to screen glBindFramebuffer(GL_FRAMEBUFFER, 0); glViewport(0, 0, buffer_width, buffer_height); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glUseProgram(bloom2Shader); - + glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, preBloomTex); glUniform1i(glGetUniformLocation(bloom2Shader, "clearTex"), 0); - + glActiveTexture(GL_TEXTURE1); glBindTexture(GL_TEXTURE_2D, bloomPassTex2); glUniform1i(glGetUniformLocation(bloom2Shader, "blurTex"), 1); - + glUniform1f(glGetUniformLocation(bloom2Shader, "iGlobalTime"), glfwGetTime()); - + glEnableVertexAttribArray(0); glBindBuffer(GL_ARRAY_BUFFER, quad_vertexbuffer); glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, (void*)0); glDrawArrays(GL_TRIANGLES, 0, 6); glDisableVertexAttribArray(0); - + glfwSwapBuffers(window); - + curBuf = (curBuf + 1) % 2; } diff --git a/src/renderer.h b/src/renderer.h index 84ad688..6dccf7a 100644 --- a/src/renderer.h +++ b/src/renderer.h @@ -24,7 +24,7 @@ class Texture { void blit(const Texture& src, Rectangle srcrect, Rectangle dstrect, double alpha = 1.0); void renderScreen() const; Rectangle entirety() const; - + private: GLuint texID; int width; diff --git a/src/system.h b/src/system.h index e08db0a..af3fb77 100644 --- a/src/system.h +++ b/src/system.h @@ -7,9 +7,9 @@ class System { public: System(Game& game) : game(game) {} - + virtual void tick(double dt) = 0; - + protected: Game& game; }; diff --git a/src/system_manager.h b/src/system_manager.h index 8f76db2..087b71c 100644 --- a/src/system_manager.h +++ b/src/system_manager.h @@ -18,18 +18,18 @@ class SystemManager { { std::unique_ptr ptr = std::unique_ptr(new T(game, std::forward(args)...)); std::type_index systemType = typeid(T); - + systems[systemType] = ptr.get(); loop.push_back(std::move(ptr)); } - + template T& getSystem() { std::type_index systemType = typeid(T); - + assert(systems.count(systemType) == 1); - + return *((T*)systems[systemType]); } }; diff --git a/src/systems/controlling.cpp b/src/systems/controlling.cpp index b1e73ad..456da3b 100644 --- a/src/systems/controlling.cpp +++ b/src/systems/controlling.cpp @@ -14,12 +14,12 @@ void ControllingSystem::tick(double dt) { int key = actions.front().first; int action = actions.front().second; - + auto entities = game.getEntityManager().getEntitiesWithComponents(); for (auto entity : entities) { auto& controllable = game.getEntityManager().getComponent(entity); - + if (action == GLFW_PRESS) { if (key == controllable.getLeftKey()) @@ -33,7 +33,7 @@ void ControllingSystem::tick(double dt) } else if (key == controllable.getRightKey()) { controllable.setHoldingRight(true); - + if (!controllable.isFrozen()) { walkRight(entity); @@ -56,7 +56,7 @@ void ControllingSystem::tick(double dt) if (key == controllable.getLeftKey()) { controllable.setHoldingLeft(false); - + if (!controllable.isFrozen()) { if (controllable.isHoldingRight()) @@ -69,7 +69,7 @@ void ControllingSystem::tick(double dt) } else if (key == controllable.getRightKey()) { controllable.setHoldingRight(false); - + if (!controllable.isFrozen()) { if (controllable.isHoldingRight()) @@ -94,7 +94,7 @@ void ControllingSystem::tick(double dt) } } } - + actions.pop(); } } diff --git a/src/systems/controlling.h b/src/systems/controlling.h index 61f86eb..30210b3 100644 --- a/src/systems/controlling.h +++ b/src/systems/controlling.h @@ -8,10 +8,10 @@ class ControllingSystem : public System { public: ControllingSystem(Game& game) : System(game) {} - + void tick(double dt); void input(int key, int action); - + private: void walkLeft(int entity); void walkRight(int entity); @@ -19,7 +19,7 @@ class ControllingSystem : public System { void jump(int entity); void stopJumping(int entity); void drop(int entity, bool start); - + std::queue> actions; }; diff --git a/src/systems/pondering.cpp b/src/systems/pondering.cpp index 96775d0..50a8bc8 100644 --- a/src/systems/pondering.cpp +++ b/src/systems/pondering.cpp @@ -6,16 +6,16 @@ void PonderingSystem::tick(double dt) { auto entities = game.getEntityManager().getEntitiesWithComponents(); - + for (auto entity : entities) { auto& transformable = game.getEntityManager().getComponent(entity); auto& ponderable = game.getEntityManager().getComponent(entity); - + // Accelerate ponderable.setVelocityX(ponderable.getVelocityX() + ponderable.getAccelX() * dt); ponderable.setVelocityY(ponderable.getVelocityY() + ponderable.getAccelY() * dt); - + // Move transformable.setX(transformable.getX() + ponderable.getVelocityX() * dt); transformable.setY(transformable.getY() + ponderable.getVelocityY() * dt); diff --git a/src/systems/pondering.h b/src/systems/pondering.h index ad01a22..3fe5473 100644 --- a/src/systems/pondering.h +++ b/src/systems/pondering.h @@ -7,7 +7,7 @@ class PonderingSystem : public System { public: PonderingSystem(Game& game) : System(game) {} - + void tick(double dt); }; diff --git a/src/systems/rendering.h b/src/systems/rendering.h index 9b6e27e..cec72e2 100644 --- a/src/systems/rendering.h +++ b/src/systems/rendering.h @@ -9,9 +9,9 @@ class RenderingSystem : public System { public: RenderingSystem(Game& game) : System(game) {} - + void tick(double dt); - + private: Texture texture {GAME_WIDTH, GAME_HEIGHT}; }; -- cgit 1.4.1 From 97d7fb425da906947cc45e11fadb35f708da50d6 Mon Sep 17 00:00:00 2001 From: Kelly Rauchenberger Date: Wed, 7 Feb 2018 14:13:32 -0500 Subject: Changed EntityManager to dense vector This should improve speed, because entity lookup will be O(1) instead of O(log n). Deletion is also O(1). Insert stays at potentially O(n), but still should be overall faster than the previous method. Also replaced some asserts with exceptions. Also made Component polymorphic so that deletion actually works properly. --- src/component.h | 4 + src/entity_manager.cpp | 11 +-- src/entity_manager.h | 235 +++++++++++++++++++++++++++++-------------------- src/system.h | 15 ++-- src/system_manager.h | 43 +++++---- 5 files changed, 184 insertions(+), 124 deletions(-) (limited to 'src/system_manager.h') diff --git a/src/component.h b/src/component.h index 2cbdc9d..b81dbee 100644 --- a/src/component.h +++ b/src/component.h @@ -2,6 +2,10 @@ #define COMPONENT_H_F0CE4573 class Component { +public: + + virtual ~Component() = default; + }; #endif /* end of include guard: COMPONENT_H_F0CE4573 */ diff --git a/src/entity_manager.cpp b/src/entity_manager.cpp index 9ad758b..f792e17 100644 --- a/src/entity_manager.cpp +++ b/src/entity_manager.cpp @@ -4,17 +4,18 @@ #include "entity_manager.h" template <> -std::set EntityManager::getEntitiesWithComponents<>(std::set& componentTypes) +std::set EntityManager::getEntitiesWithComponents<>( + std::set& componentTypes) { if (cachedComponents.count(componentTypes) == 1) { return cachedComponents[componentTypes]; } - std::set& cache = cachedComponents[componentTypes]; - for (auto& entity : entities) + std::set& cache = cachedComponents[componentTypes]; + for (id_type entity = 0; entity < entities.size(); entity++) { - EntityData& data = entity.second; + EntityData& data = entities[entity]; bool cacheEntity = true; for (auto& componentType : componentTypes) @@ -28,7 +29,7 @@ std::set EntityManager::getEntitiesWithComponents<>(std::set +#include #include #include -#include +#include #include "component.h" #include "algorithms.h" class EntityManager { - private: - struct EntityData { - std::map> components; - }; +private: - std::map entities; - std::map, std::set> cachedComponents; + struct EntityData { + std::map> components; + }; - int nextEntityID = 0; + using database_type = std::vector; - template - std::set getEntitiesWithComponentsHelper(std::set& componentTypes) - { - componentTypes.insert(typeid(T)); +public: - return getEntitiesWithComponents(componentTypes); - } + using id_type = database_type::size_type; - template - std::set getEntitiesWithComponents(std::set& componentTypes) - { - return getEntitiesWithComponentsHelper(componentTypes); - } +private: - public: - EntityManager() = default; - EntityManager(const EntityManager& copy) = delete; + database_type entities; + std::vector slotAvailable; + std::map, std::set> cachedComponents; - int emplaceEntity() - { - // Find a suitable entity ID - while ((entities.count(nextEntityID) == 1) && (nextEntityID >= 0)) - { - nextEntityID++; - } + id_type nextEntityID = 0; - if (nextEntityID < 0) - { - nextEntityID = 0; + template + std::set getEntitiesWithComponentsHelper( + std::set& componentTypes) + { + componentTypes.insert(typeid(T)); - while ((entities.count(nextEntityID) == 1) && (nextEntityID >= 0)) - { - nextEntityID++; - } + return getEntitiesWithComponents(componentTypes); + } - assert(nextEntityID >= 0); - } + template + std::set getEntitiesWithComponents( + std::set& componentTypes) + { + return getEntitiesWithComponentsHelper(componentTypes); + } - // Initialize the data - int id = nextEntityID++; - entities[id]; +public: - return id; - } + EntityManager() = default; - void deleteEntity(int entity) - { - assert(entities.count(entity) == 1); + EntityManager(const EntityManager& copy) = delete; - // Uncache components - for (auto& cache : cachedComponents) + id_type emplaceEntity() + { + if (nextEntityID >= entities.size()) + { + // If the database is saturated, add a new element for the new entity. + entities.emplace_back(); + slotAvailable.push_back(false); + + return nextEntityID++; + } else { + // If there is an available slot in the database, use it. + id_type id = nextEntityID++; + slotAvailable[id] = false; + + // Fast forward the next available slot pointer to an available slot. + while ((nextEntityID < entities.size()) && !slotAvailable[nextEntityID]) { - cache.second.erase(entity); + nextEntityID++; } - // Destroy the data - entities.erase(entity); + return id; + } + } + + void deleteEntity(id_type entity) + { + if ((entity >= entities.size()) || slotAvailable[entity]) + { + throw std::invalid_argument("Cannot delete non-existent entity"); } - template - T& emplaceComponent(int entity, Args&&... args) + // Uncache components + for (auto& cache : cachedComponents) { - assert(entities.count(entity) == 1); + cache.second.erase(entity); + } + + // Destroy the data + entities[entity].components.clear(); - EntityData& data = entities[entity]; - std::type_index componentType = typeid(T); + // Mark the slot as available + slotAvailable[entity] = true; - assert(data.components.count(componentType) == 0); + if (entity < nextEntityID) + { + nextEntityID = entity; + } + } - // Initialize the component - std::unique_ptr ptr = std::unique_ptr(new T(std::forward(args)...)); - T& component = *ptr; - data.components[componentType] = std::move(ptr); + template + T& emplaceComponent(id_type entity, Args&&... args) + { + if ((entity >= entities.size()) || slotAvailable[entity]) + { + throw std::invalid_argument("Cannot delete non-existent entity"); + } - // Invalidate related caches - erase_if(cachedComponents, [&componentType] (std::pair, std::set>& cache) { - return cache.first.count(componentType) == 1; - }); + EntityData& data = entities[entity]; + std::type_index componentType = typeid(T); - return component; + if (data.components.count(componentType)) + { + throw std::invalid_argument("Cannot emplace already-existent component"); } - template - void removeComponent(int entity) + // Initialize the component + std::unique_ptr ptr(new T(std::forward(args)...)); + T& component = *ptr; + data.components[componentType] = std::move(ptr); + + // Invalidate related caches + erase_if( + cachedComponents, + [&componentType] ( + std::pair, std::set>& cache) { + return cache.first.count(componentType) == 1; + }); + + return component; + } + + template + void removeComponent(id_type entity) + { + if ((entity >= entities.size()) || slotAvailable[entity]) { - assert(entities.count(entity) == 1); + throw std::invalid_argument("Cannot delete non-existent entity"); + } - EntityData& data = entities[entity]; - std::type_index componentType = typeid(T); + EntityData& data = entities[entity]; + std::type_index componentType = typeid(T); - assert(data.components.count(componentType) == 1); + if (!data.components.count(componentType)) + { + throw std::invalid_argument("Cannot delete non-existent component"); + } - // Destroy the component - data.components.erase(componentType); + // Destroy the component + data.components.erase(componentType); - // Uncache the component - for (auto& cache : cachedComponents) + // Uncache the component + for (auto& cache : cachedComponents) + { + if (cache.first.count(componentType) == 1) { - if (cache.first.count(componentType) == 1) - { - cache.second.erase(entity); - } + cache.second.erase(entity); } } + } - template - T& getComponent(int entity) + template + T& getComponent(id_type entity) + { + if ((entity >= entities.size()) || slotAvailable[entity]) { - assert(entities.count(entity) == 1); - - EntityData& data = entities[entity]; - std::type_index componentType = typeid(T); + throw std::invalid_argument("Cannot delete non-existent entity"); + } - assert(data.components.count(componentType) == 1); + EntityData& data = entities[entity]; + std::type_index componentType = typeid(T); - return *((T*)data.components[componentType].get()); + if (!data.components.count(componentType)) + { + throw std::invalid_argument("Cannot get non-existent component"); } - template - std::set getEntitiesWithComponents() - { - std::set componentTypes; + return *dynamic_cast(data.components[componentType].get()); + } - return getEntitiesWithComponentsHelper(componentTypes); - } + template + std::set getEntitiesWithComponents() + { + std::set componentTypes; + + return getEntitiesWithComponentsHelper(componentTypes); + } }; template <> -std::set EntityManager::getEntitiesWithComponents<>(std::set& componentTypes); +std::set EntityManager::getEntitiesWithComponents<>( + std::set& componentTypes); #endif /* end of include guard: ENTITY_MANAGER_H_C5832F11 */ diff --git a/src/system.h b/src/system.h index af3fb77..489afd0 100644 --- a/src/system.h +++ b/src/system.h @@ -4,14 +4,17 @@ class Game; class System { - public: - System(Game& game) - : game(game) {} +public: + System(Game& game) + : game(game) {} - virtual void tick(double dt) = 0; + virtual ~System() = default; - protected: - Game& game; + virtual void tick(double dt) = 0; + +protected: + + Game& game; }; #endif /* end of include guard: SYSTEM_H_B61A8CEA */ diff --git a/src/system_manager.h b/src/system_manager.h index 087b71c..e2c98cb 100644 --- a/src/system_manager.h +++ b/src/system_manager.h @@ -5,33 +5,40 @@ #include #include #include +#include #include "system.h" class SystemManager { - private: - std::list> loop; - std::map systems; +private: - public: - template - void emplaceSystem(Game& game, Args&&... args) - { - std::unique_ptr ptr = std::unique_ptr(new T(game, std::forward(args)...)); - std::type_index systemType = typeid(T); + std::list> loop; + std::map systems; - systems[systemType] = ptr.get(); - loop.push_back(std::move(ptr)); - } +public: - template - T& getSystem() - { - std::type_index systemType = typeid(T); + template + void emplaceSystem(Game& game, Args&&... args) + { + std::unique_ptr ptr(new T(game, std::forward(args)...)); + std::type_index systemType = typeid(T); + + systems[systemType] = ptr.get(); + loop.push_back(std::move(ptr)); + } - assert(systems.count(systemType) == 1); + template + T& getSystem() + { + std::type_index systemType = typeid(T); - return *((T*)systems[systemType]); + if (!systems.count(systemType)) + { + throw std::invalid_argument("Cannot get non-existent system"); } + + return *dynamic_cast(systems[systemType]); + } + }; #endif /* end of include guard: SYSTEM_MANAGER_H_544E6056 */ -- cgit 1.4.1 From 1400ade977e13e3b535d3c2fddb6e15de3c9b5a5 Mon Sep 17 00:00:00 2001 From: Kelly Rauchenberger Date: Thu, 8 Feb 2018 13:43:10 -0500 Subject: Moved sprite rendering into AnimatingSystem Refactored how systems work slightly. Now, rendering can be done by a number of systems working together. Since the AnimatingSystem handles the animation of sprites, it should also handle the rendering of them. Because of this, the RenderingSystem has been removed. --- CMakeLists.txt | 1 - src/game.cpp | 16 +++++++++------- src/system.h | 31 ++++++++++++++++++++++++++++++- src/system_manager.h | 24 ++++++++++++++++++++++++ src/systems/animating.cpp | 30 ++++++++++++++++++++++++++++++ src/systems/animating.h | 3 +++ src/systems/rendering.cpp | 37 ------------------------------------- src/systems/rendering.h | 22 ---------------------- 8 files changed, 96 insertions(+), 68 deletions(-) delete mode 100644 src/systems/rendering.cpp delete mode 100644 src/systems/rendering.h (limited to 'src/system_manager.h') diff --git a/CMakeLists.txt b/CMakeLists.txt index 0ac3a38..1da4432 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -61,7 +61,6 @@ add_executable(Aromatherapy src/entity_manager.cpp src/game.cpp src/animation.cpp - src/systems/rendering.cpp src/systems/controlling.cpp src/systems/pondering.cpp src/systems/animating.cpp diff --git a/src/game.cpp b/src/game.cpp index 492e4d0..dfe700e 100644 --- a/src/game.cpp +++ b/src/game.cpp @@ -5,11 +5,12 @@ #include "components/droppable.h" #include "components/ponderable.h" #include "components/orientable.h" -#include "systems/rendering.h" #include "systems/controlling.h" #include "systems/pondering.h" #include "systems/animating.h" #include "animation.h" +#include "renderer.h" +#include "consts.h" void key_callback(GLFWwindow* window, int key, int, int action, int) { @@ -22,14 +23,13 @@ void key_callback(GLFWwindow* window, int key, int, int action, int) return; } - game.systemManager_.getSystem().input(key, action); + game.systemManager_.input(key, action); } Game::Game(GLFWwindow* window) : window_(window) { systemManager_.emplaceSystem(*this); systemManager_.emplaceSystem(*this); - systemManager_.emplaceSystem(*this); systemManager_.emplaceSystem(*this); int player = entityManager_.emplaceEntity(); @@ -64,6 +64,7 @@ void Game::execute() double lastTime = glfwGetTime(); const double dt = 0.01; double accumulator = 0.0; + Texture texture(GAME_WIDTH, GAME_HEIGHT); while (!(shouldQuit_ || glfwWindowShouldClose(window_))) { @@ -76,13 +77,14 @@ void Game::execute() accumulator += frameTime; while (accumulator >= dt) { - systemManager_.getSystem().tick(dt); - systemManager_.getSystem().tick(dt); - systemManager_.getSystem().tick(dt); + systemManager_.tick(dt); accumulator -= dt; } - systemManager_.getSystem().tick(frameTime); + // Render + texture.fill(texture.entirety(), 0, 0, 0); + systemManager_.render(texture); + texture.renderScreen(); } } diff --git a/src/system.h b/src/system.h index 6a3cd14..e630c48 100644 --- a/src/system.h +++ b/src/system.h @@ -4,6 +4,7 @@ #include "entity_manager.h" class Game; +class Texture; class System { public: @@ -16,7 +17,35 @@ public: virtual ~System() = default; - virtual void tick(double dt) = 0; + /** + * Updates the state of a system. + * + * @param dt - The amount of time in seconds that have passed since the last + * update. + */ + virtual void tick(double) + { + } + + /** + * Renders to a texture. + * + * @param texture - The surface to render to. + */ + virtual void render(Texture&) + { + } + + /** + * Processes keyboard input. + * + * @param key - The relevant key. + * + * @param action - The action performed (press, released, etc). + */ + virtual void input(int, int) + { + } protected: diff --git a/src/system_manager.h b/src/system_manager.h index e2c98cb..b03c3f2 100644 --- a/src/system_manager.h +++ b/src/system_manager.h @@ -39,6 +39,30 @@ public: return *dynamic_cast(systems[systemType]); } + void tick(double dt) + { + for (std::unique_ptr& sys : loop) + { + sys->tick(dt); + } + } + + virtual void render(Texture& texture) + { + for (std::unique_ptr& sys : loop) + { + sys->render(texture); + } + } + + virtual void input(int key, int action) + { + for (std::unique_ptr& sys : loop) + { + sys->input(key, action); + } + } + }; #endif /* end of include guard: SYSTEM_MANAGER_H_544E6056 */ diff --git a/src/systems/animating.cpp b/src/systems/animating.cpp index fcbfca5..91fe925 100644 --- a/src/systems/animating.cpp +++ b/src/systems/animating.cpp @@ -1,6 +1,7 @@ #include "animating.h" #include "game.h" #include "components/animatable.h" +#include "components/transformable.h" void AnimatingSystem::tick(double) { @@ -28,6 +29,35 @@ void AnimatingSystem::tick(double) } } +void AnimatingSystem::render(Texture& texture) +{ + std::set spriteEntities = + game_.getEntityManager().getEntitiesWithComponents< + AnimatableComponent, + TransformableComponent>(); + + for (id_type entity : spriteEntities) + { + auto& sprite = game_.getEntityManager(). + getComponent(entity); + + auto& transform = game_.getEntityManager(). + getComponent(entity); + + Rectangle dstrect { + static_cast(transform.getX()), + static_cast(transform.getY()), + transform.getW(), + transform.getH()}; + + const AnimationSet& aset = sprite.getAnimationSet(); + texture.blit( + aset.getTexture(), + aset.getFrameRect(sprite.getFrame()), + dstrect); + } +} + void AnimatingSystem::startAnimation(id_type entity, std::string animation) { auto& sprite = game_.getEntityManager(). diff --git a/src/systems/animating.h b/src/systems/animating.h index 150a74a..d6a89a5 100644 --- a/src/systems/animating.h +++ b/src/systems/animating.h @@ -3,6 +3,7 @@ #include "system.h" #include +#include "renderer.h" class AnimatingSystem : public System { public: @@ -13,6 +14,8 @@ public: void tick(double dt); + void render(Texture& texture); + void startAnimation(id_type entity, std::string animation); }; diff --git a/src/systems/rendering.cpp b/src/systems/rendering.cpp deleted file mode 100644 index 8219732..0000000 --- a/src/systems/rendering.cpp +++ /dev/null @@ -1,37 +0,0 @@ -#include "rendering.h" -#include "game.h" -#include "components/animatable.h" -#include "components/transformable.h" - -void RenderingSystem::tick(double) -{ - texture_.fill(texture_.entirety(), 0, 0, 0); - - std::set spriteEntities = - game_.getEntityManager().getEntitiesWithComponents< - AnimatableComponent, - TransformableComponent>(); - - for (id_type entity : spriteEntities) - { - auto& sprite = game_.getEntityManager(). - getComponent(entity); - - auto& transform = game_.getEntityManager(). - getComponent(entity); - - Rectangle dstrect { - static_cast(transform.getX()), - static_cast(transform.getY()), - transform.getW(), - transform.getH()}; - - const AnimationSet& aset = sprite.getAnimationSet(); - texture_.blit( - aset.getTexture(), - aset.getFrameRect(sprite.getFrame()), - dstrect); - } - - texture_.renderScreen(); -} diff --git a/src/systems/rendering.h b/src/systems/rendering.h deleted file mode 100644 index a53ee64..0000000 --- a/src/systems/rendering.h +++ /dev/null @@ -1,22 +0,0 @@ -#ifndef RENDERING_H_76ABC02A -#define RENDERING_H_76ABC02A - -#include "system.h" -#include "renderer.h" -#include "consts.h" - -class RenderingSystem : public System { -public: - - RenderingSystem(Game& game) : System(game) - { - } - - void tick(double dt); - -private: - - Texture texture_ {GAME_WIDTH, GAME_HEIGHT}; -}; - -#endif /* end of include guard: RENDERING_H_76ABC02A */ -- cgit 1.4.1