From 38d3a8c99080da487fda62b6cb8a43717a78f0e6 Mon Sep 17 00:00:00 2001 From: tleety Date: Tue, 29 Sep 2015 10:27:57 +0200 Subject: [PATCH] Fixed a bug where you could not have more than one particle group --- include/Core/Engine.h | 11 +++ include/Core/Renderer.h | 43 ++++++------ include/Physics/PhysicsSystem.h | 4 +- src/game/Core/Renderer.cpp | 104 ++++++++++------------------- src/game/Physics/PhysicsSystem.cpp | 7 +- 5 files changed, 69 insertions(+), 100 deletions(-) mode change 100644 => 100755 include/Core/Engine.h mode change 100644 => 100755 include/Physics/PhysicsSystem.h mode change 100644 => 100755 src/game/Physics/PhysicsSystem.cpp diff --git a/include/Core/Engine.h b/include/Core/Engine.h old mode 100644 new mode 100755 index 6820d0b..45a9dcc --- a/include/Core/Engine.h +++ b/include/Core/Engine.h @@ -203,6 +203,16 @@ public: m_World->CommitEntity(background); } + //Water test + { + auto t_waterBody = m_World->CreateEntity(); + auto transform = m_World->AddComponent(t_waterBody); + transform->Position = glm::vec3(0.f, -0.5f, -10.f); + transform->Scale = glm::vec3(1.f, 1.f, 1.f); + auto water = m_World->AddComponent(t_waterBody); + auto body = m_World->AddComponent(t_waterBody); + m_World->CommitEntity(t_waterBody); + } //Water test { auto t_waterBody = m_World->CreateEntity(); @@ -213,6 +223,7 @@ public: auto body = m_World->AddComponent(t_waterBody); m_World->CommitEntity(t_waterBody); } + //TODO: Why does the ball not collide with these bricks? //BottomBox { diff --git a/include/Core/Renderer.h b/include/Core/Renderer.h index 5a2b03f..9b03627 100755 --- a/include/Core/Renderer.h +++ b/include/Core/Renderer.h @@ -72,37 +72,32 @@ private: ShaderProgram* m_spDeferred3; ShaderProgram* m_spForward; ShaderProgram* m_spScreen; - ShaderProgram* t_m_spWater; - ShaderProgram* t_m_spWater2; + ShaderProgram*m_spWater; + ShaderProgram*m_spWater2; GLuint m_ScreenQuad = 0; Model* m_UnitSphere = nullptr; Model* m_UnitQuad = nullptr; Texture* m_StandardNormal; Texture* m_StandardSpecular; - Texture* t_m_WhiteSphereTexture; - - GLuint m_rbDepthBuffer = 0; - GLuint m_fbDeferred1 = 0; - GLuint m_GDiffuse = 0; - GLuint m_GPosition = 0; - GLuint m_GNormal = 0; - GLuint m_GSpecular = 0; - GLuint m_fbDeferred2 = 0; - GLuint m_tLighting = 0; - GLuint m_fbDeferred3 = 0; - GLuint m_tFinal = 0; - //Water GTexture - GLuint t_m_Gwater = 0; - //Water blur texture - GLuint t_m_BWater; - GLuint t_m_BWater2; - //WAterpass Framebuffer - GLuint t_m_fbWater; - //Waterpass Framebuffer - GLuint t_m_fbWaterBlur; - GLuint t_m_fbWaterBlur2; + Texture* m_WhiteSphereTexture; + GLuint m_rbDepthBuffer = 0; //DepthBuffer Texture + GLuint m_fbDeferred1 = 0; //Framebuffer for first pass + GLuint m_GDiffuse = 0; //Texture for diffuseColors + GLuint m_GPosition = 0; //Texture for positions + GLuint m_GNormal = 0; //Texture for normals + GLuint m_GSpecular = 0; //Texture for specular + GLuint m_fbDeferred2 = 0; //Framebuffer that handles the lighting pass + GLuint m_tLighting = 0; //Texture for the lighting pass + GLuint m_fbDeferred3 = 0; //Frambuffer for handling the last pass. + GLuint m_tFinal = 0; //Final Texture to be printed to screen + GLuint m_Gwater = 0; //Water Color Texture + GLuint m_BWater; //Water blur texture + GLuint m_BWater2; //Water blur texture + GLuint m_fbWater; //Waterpass Framebuffer + GLuint m_fbWaterBlur; //Waterpass Framebuffer + GLuint m_fbWaterBlur2; //Waterpass Framebuffer GLuint m_CurrentScreenBuffer = 0; void LoadShaders(); diff --git a/include/Physics/PhysicsSystem.h b/include/Physics/PhysicsSystem.h old mode 100644 new mode 100755 index eaaf49e..412069d --- a/include/Physics/PhysicsSystem.h +++ b/include/Physics/PhysicsSystem.h @@ -67,8 +67,8 @@ private: void CreateBody(EntityID entity); - b2ParticleSystem *m_ParticleSystem; - b2ParticleGroup* t_watergroup; + b2ParticleSystem* m_ParticleSystem; + std::vector t_ParticleGroup; std::unordered_map m_EntitiesToParticleHandle; std::unordered_map m_ParticleHandleToEntities; diff --git a/src/game/Core/Renderer.cpp b/src/game/Core/Renderer.cpp index 2226ba2..cb997ce 100755 --- a/src/game/Core/Renderer.cpp +++ b/src/game/Core/Renderer.cpp @@ -92,10 +92,10 @@ void dd::Renderer::LoadShaders() m_spDeferred2->Link(); //Water Pass - t_m_spWater = ResourceManager::Load("Shaders/Deferred/water/"); - t_m_spWater->Link(); - t_m_spWater2 = ResourceManager::Load("Shaders/Deferred/water2/"); - t_m_spWater2->Link(); + m_spWater = ResourceManager::Load("Shaders/Deferred/water/"); + m_spWater->Link(); + m_spWater2 = ResourceManager::Load("Shaders/Deferred/water2/"); + m_spWater2->Link(); // Pass #3: Combining into final image m_spDeferred3 = ResourceManager::Load("Shaders/Deferred/3/"); @@ -122,7 +122,7 @@ void dd::Renderer::CreateBuffers() m_UnitSphere = ResourceManager::Load("Models/Core/UnitSphere.obj"); m_StandardNormal = ResourceManager::Load("Textures/Core/NeutralNormalMap.png"); m_StandardSpecular = ResourceManager::Load("Textures/Core/NeutralSpecularMap.png"); - t_m_WhiteSphereTexture = ResourceManager::Load("Textures/Test/Water.png"); + m_WhiteSphereTexture = ResourceManager::Load("Textures/Test/Water.png"); glGenRenderbuffers(1, &m_rbDepthBuffer); glBindRenderbuffer(GL_RENDERBUFFER, m_rbDepthBuffer); @@ -157,8 +157,8 @@ void dd::Renderer::CreateBuffers() glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); - glGenTextures(1, &t_m_Gwater); - glBindTexture(GL_TEXTURE_2D, t_m_Gwater); + glGenTextures(1, &m_Gwater); + glBindTexture(GL_TEXTURE_2D, m_Gwater); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA32F, m_Resolution.Width, m_Resolution.Height, 0, GL_RGBA, GL_FLOAT, NULL); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); @@ -201,8 +201,8 @@ void dd::Renderer::CreateBuffers() } //Fill Water Texture - glGenTextures(1, &t_m_Gwater); - glBindTexture(GL_TEXTURE_2D, t_m_Gwater); + glGenTextures(1, &m_Gwater); + glBindTexture(GL_TEXTURE_2D, m_Gwater); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, m_Resolution.Width, m_Resolution.Height, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); @@ -210,9 +210,9 @@ void dd::Renderer::CreateBuffers() glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); //Fill water pass - glGenFramebuffers(1, &t_m_fbWater); - glBindFramebuffer(GL_FRAMEBUFFER, t_m_fbWater); - glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, t_m_Gwater, 0); + glGenFramebuffers(1, &m_fbWater); + glBindFramebuffer(GL_FRAMEBUFFER, m_fbWater); + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, m_Gwater, 0); GLenum waterPassDrawBuffers[] = { GL_COLOR_ATTACHMENT0 }; glDrawBuffers(1, waterPassDrawBuffers); if (GLenum fbStatus = glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) { @@ -221,8 +221,8 @@ void dd::Renderer::CreateBuffers() } //water Blur texture - glGenTextures(1, &t_m_BWater); - glBindTexture(GL_TEXTURE_2D, t_m_BWater); + glGenTextures(1, &m_BWater); + glBindTexture(GL_TEXTURE_2D, m_BWater); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, m_Resolution.Width, m_Resolution.Height, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); @@ -230,9 +230,9 @@ void dd::Renderer::CreateBuffers() glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); //Fill waterBlur pass - glGenFramebuffers(1, &t_m_fbWaterBlur); - glBindFramebuffer(GL_FRAMEBUFFER, t_m_fbWaterBlur); - glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, t_m_BWater, 0); + glGenFramebuffers(1, &m_fbWaterBlur); + glBindFramebuffer(GL_FRAMEBUFFER, m_fbWaterBlur); + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, m_BWater, 0); GLenum waterBlurDrawBuffers[] = { GL_COLOR_ATTACHMENT0 }; glDrawBuffers(1, waterBlurDrawBuffers); if (GLenum fbStatus = glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) { @@ -241,8 +241,8 @@ void dd::Renderer::CreateBuffers() } //water Blur texture2 - glGenTextures(1, &t_m_BWater2); - glBindTexture(GL_TEXTURE_2D, t_m_BWater2); + glGenTextures(1, &m_BWater2); + glBindTexture(GL_TEXTURE_2D, m_BWater2); glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, m_rbDepthBuffer); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, m_Resolution.Width, m_Resolution.Height, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); @@ -251,9 +251,9 @@ void dd::Renderer::CreateBuffers() glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); //Fill waterBlur pass2 - glGenFramebuffers(1, &t_m_fbWaterBlur2); - glBindFramebuffer(GL_FRAMEBUFFER, t_m_fbWaterBlur2); - glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, t_m_BWater2, 0); + glGenFramebuffers(1, &m_fbWaterBlur2); + glBindFramebuffer(GL_FRAMEBUFFER, m_fbWaterBlur2); + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, m_BWater2, 0); GLenum waterBlur2DrawBuffers[] = { GL_COLOR_ATTACHMENT0 }; glDrawBuffers(1, waterBlur2DrawBuffers); if (GLenum fbStatus = glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) { @@ -379,10 +379,10 @@ void dd::Renderer::DrawForward(RenderQueue &objects, RenderQueue &lights) glEnable(GL_DEPTH_TEST); glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - glBindFramebuffer(GL_FRAMEBUFFER, t_m_fbWater); + glBindFramebuffer(GL_FRAMEBUFFER, m_fbWater); glClearColor(0, 0, 0, 0); glClear(GL_COLOR_BUFFER_BIT); - t_m_spWater->Bind(); + m_spWater->Bind(); DrawWater(objects); } @@ -499,7 +499,7 @@ void dd::Renderer::DrawLightSpheres(RenderQueue &lights) void dd::Renderer::DrawWater(RenderQueue &rq) { - GLuint shaderProgramHandle = *t_m_spWater; + GLuint shaderProgramHandle = *m_spWater; glm::mat4 projectionMatrix = m_Camera->ProjectionMatrix(); glm::mat4 viewMatrix = m_Camera->ViewMatrix(); @@ -517,7 +517,7 @@ void dd::Renderer::DrawWater(RenderQueue &rq) glm::value_ptr(viewMatrix)); glActiveTexture(GL_TEXTURE0); - glBindTexture(GL_TEXTURE_2D, *t_m_WhiteSphereTexture); + glBindTexture(GL_TEXTURE_2D, *m_WhiteSphereTexture); glBindVertexArray(m_UnitQuad->VAO); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_UnitQuad->ElementBuffer); @@ -528,16 +528,17 @@ void dd::Renderer::DrawWater(RenderQueue &rq) //blur1 - shaderProgramHandle = *t_m_spWater2; + shaderProgramHandle = *m_spWater2; glDisable(GL_CULL_FACE); glDepthMask(GL_FALSE); glEnable(GL_DEPTH_TEST); glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - glBindFramebuffer(GL_FRAMEBUFFER, t_m_fbWaterBlur); + glBindFramebuffer(GL_FRAMEBUFFER, m_fbWaterBlur); glClearColor(0, 0, 0, 0); glClear(GL_COLOR_BUFFER_BIT); - t_m_spWater2->Bind(); + m_spWater2->Bind(); + //TODO: Add this in water particle component. Blurradius float radius = 3.f; glUniform2fv(glGetUniformLocation(shaderProgramHandle, "dir"), 1, glm::value_ptr(glm::vec2(1.0f, 0.0f))); @@ -545,64 +546,31 @@ void dd::Renderer::DrawWater(RenderQueue &rq) glUniform1f(glGetUniformLocation(shaderProgramHandle, "radius"), radius); glActiveTexture(GL_TEXTURE0); - glBindTexture(GL_TEXTURE_2D, t_m_Gwater); + glBindTexture(GL_TEXTURE_2D, m_Gwater); glBindVertexArray(m_ScreenQuad); glDrawArrays(GL_TRIANGLES, 0, 6); //blur2 - shaderProgramHandle = *t_m_spWater2; + shaderProgramHandle = *m_spWater2; glDisable(GL_CULL_FACE); glDisable(GL_DEPTH_TEST); glDepthMask(GL_FALSE); glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE); glBindFramebuffer(GL_FRAMEBUFFER, m_fbDeferred3); - t_m_spWater2->Bind(); + m_spWater2->Bind(); glUniform2fv(glGetUniformLocation(shaderProgramHandle, "dir"), 1, glm::value_ptr(glm::vec2(0.0f, 1.0f))); glUniform1f(glGetUniformLocation(shaderProgramHandle, "res"), m_Resolution.Height); glUniform1f(glGetUniformLocation(shaderProgramHandle, "radius"), radius); glActiveTexture(GL_TEXTURE0); - glBindTexture(GL_TEXTURE_2D, t_m_BWater); + glBindTexture(GL_TEXTURE_2D, m_BWater); glBindVertexArray(m_ScreenQuad); glDrawArrays(GL_TRIANGLES, 0, 6); } - - -GLuint dd::Renderer::CreateWaterParticleVAO(RenderQueue &particles) -{ - float waterVerts[particles.Size()]; - int i = 0; - - for ( auto &job : particles ) { - auto waterJob = std::dynamic_pointer_cast(job); - if (!waterJob) - continue; - waterVerts[i ] = waterJob->Position.x; - waterVerts[i+1] = waterJob->Position.y; - waterVerts[i+2] = waterJob->Position.z; - i+3; - } - - GLuint vbo[1], vao; - glGenBuffers(1, vbo); - glBindBuffer(GL_ARRAY_BUFFER, vbo[0]); - glBufferData(GL_ARRAY_BUFFER, 3 * particles.Size() * sizeof(float), waterVerts, GL_STATIC_DRAW); - glGenVertexArrays(1, &vao); - glBindVertexArray(vao); - glBindBuffer(GL_ARRAY_BUFFER, vbo[0]); - glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0); - glEnableVertexAttribArray(0); - - glBindVertexArray(0); - glBindBuffer(GL_ARRAY_BUFFER, 0); - - return vao; -} - GLuint dd::Renderer::CreateQuad() { float quadVertices[] = @@ -667,10 +635,10 @@ void dd::Renderer::DebugKeys() m_CurrentScreenBuffer = m_tLighting; } if (glfwGetKey(m_Window, GLFW_KEY_F7)) { - m_CurrentScreenBuffer = t_m_Gwater; + m_CurrentScreenBuffer = m_Gwater; } if (glfwGetKey(m_Window, GLFW_KEY_F8)) { - m_CurrentScreenBuffer = t_m_BWater; + m_CurrentScreenBuffer = m_BWater; } } diff --git a/src/game/Physics/PhysicsSystem.cpp b/src/game/Physics/PhysicsSystem.cpp old mode 100644 new mode 100755 index 7d23110..2206079 --- a/src/game/Physics/PhysicsSystem.cpp +++ b/src/game/Physics/PhysicsSystem.cpp @@ -289,7 +289,6 @@ void dd::Systems::PhysicsSystem::CreateBody(EntityID entity) void dd::Systems::PhysicsSystem::CreateParticleGroup(EntityID e) { - //TODO: Lägg alla pd i en lista auto transform = m_World->GetComponent(e); if (!transform) { LOG_ERROR("No Transform component in CreateParticleGroup"); @@ -303,18 +302,15 @@ void dd::Systems::PhysicsSystem::CreateParticleGroup(EntityID e) pd.shape = &shape; pd.flags = b2_tensileParticle; pd.position.Set(transform->Position.x, transform->Position.y); - //TODO: PUT IN LIST - t_watergroup = m_ParticleSystem->CreateParticleGroup(pd); + t_ParticleGroup.push_back(m_ParticleSystem->CreateParticleGroup(pd)); b2Vec2* t_ParticlePositions = m_ParticleSystem->GetPositionBuffer(); for(int i = 0; i < m_ParticleSystem->GetParticleCount(); i++){ { auto t_waterparticle = m_World->CreateEntity(e); auto transformChild = m_World->AddComponent(t_waterparticle); - //auto sprite = m_World->AddComponent(t_waterparticle); transformChild->Position = glm::vec3(t_ParticlePositions[i].x - transform->Position.x, t_ParticlePositions[i].y - transform->Position.y, -9.5f); transformChild->Scale = glm::vec3(m_ParticleSystem->GetRadius())/transform->Scale; - //sprite->SpriteFile = "Textures/Ball.png"; m_World->CommitEntity(t_waterparticle); m_EntitiesToParticleHandle.insert(std::make_pair(t_waterparticle, m_ParticleSystem->GetParticleHandleFromIndex(i))); @@ -322,7 +318,6 @@ void dd::Systems::PhysicsSystem::CreateParticleGroup(EntityID e) } } - LOG_INFO("ParticleCount: %i", m_ParticleSystem->GetParticleCount()); } dd::Systems::PhysicsSystem::~PhysicsSystem()