From 1ad087dc753a6ff21bbd4beeb6b725131db672d6 Mon Sep 17 00:00:00 2001 From: Teejoon Date: Fri, 11 Mar 2016 19:05:34 +0100 Subject: [PATCH 1/9] MSAA mostly working. Only merging the MS render buffer to a single texture so that others could use the AA texture easly --- include/Engine/Rendering/DrawFinalPass.h | 86 +++++++++-- include/Engine/Rendering/FrameBuffer.h | 29 +++- src/Engine/Rendering/DrawFinalPass.cpp | 134 +++++++++++++----- src/Engine/Rendering/FrameBuffer.cpp | 40 +++++- src/Engine/Rendering/Util/CommonFunctions.cpp | 5 +- 5 files changed, 237 insertions(+), 57 deletions(-) diff --git a/include/Engine/Rendering/DrawFinalPass.h b/include/Engine/Rendering/DrawFinalPass.h index 26712088..7e2b7853 100644 --- a/include/Engine/Rendering/DrawFinalPass.h +++ b/include/Engine/Rendering/DrawFinalPass.h @@ -27,15 +27,80 @@ public: void OnWindowResize(); //Return the texture that is used in later stages to apply the bloom effect - GLuint BloomTexture() const { return m_BloomTexture; } + GLuint BloomTexture() const { + if (m_MSAA){ + m_AntiAliasedFrameBuffer->Bind(); + glClearColor(0.f, 0.f, 0.f, 0.f); + glClear(GL_COLOR_BUFFER_BIT); + m_AntiAliasedFrameBuffer->Unbind(); + m_FinalPassFrameBuffer->Read(); + glReadBuffer(GL_COLOR_ATTACHMENT1); + m_AntiAliasedFrameBuffer->Draw(); + glBlitFramebuffer( + 0, 0, m_Renderer->GetViewportSize().Width, m_Renderer->GetViewportSize().Height, + 0, 0, m_Renderer->GetViewportSize().Width, m_Renderer->GetViewportSize().Height, + GL_COLOR_BUFFER_BIT, GL_NEAREST); + glReadBuffer(GL_BACK); + return m_AntiAliasedTexture; + } + return m_BloomTexture; } //Return the texture with diffuse and lighting of the scene. - GLuint SceneTexture() const { return m_SceneTexture; } + GLuint SceneTexture() const { + if (m_MSAA) { + m_AntiAliasedFrameBuffer->Bind(); + glClearColor(0.f, 0.f, 0.f, 0.f); + glClear(GL_COLOR_BUFFER_BIT); + m_AntiAliasedFrameBuffer->Unbind(); + GLERROR("SceneTexture() 11"); + m_FinalPassFrameBuffer->Read(); + GLERROR("SceneTexture() 12"); + glReadBuffer(GL_COLOR_ATTACHMENT0); + GLERROR("SceneTexture() 13"); + m_AntiAliasedFrameBuffer->Draw(); + GLERROR("SceneTexture() 14"); + glBlitFramebuffer( + 0, 0, m_Renderer->GetViewportSize().Width, m_Renderer->GetViewportSize().Height, + 0, 0, m_Renderer->GetViewportSize().Width, m_Renderer->GetViewportSize().Height, + GL_COLOR_BUFFER_BIT, GL_NEAREST); + GLERROR("SceneTexture() 15"); + glReadBuffer(GL_BACK); + return m_AntiAliasedTexture; + } + return m_SceneTexture; } //Return the SceneTexture with the blurred HUD bits. - GLuint CombinedSceneTexture() const { return m_CombinedTexture; } + GLuint CombinedSceneTexture() const { + if (m_MSAA) { + m_AntiAliasedFrameBuffer->Bind(); + glClearColor(0.f, 0.f, 0.f, 0.f); + glClear(GL_COLOR_BUFFER_BIT); + m_AntiAliasedFrameBuffer->Unbind(); + m_FinalPassFrameBuffer->Read(); + m_AntiAliasedFrameBuffer->Draw(); + glBlitFramebuffer( + 0, 0, m_Renderer->GetViewportSize().Width, m_Renderer->GetViewportSize().Height, + 0, 0, m_Renderer->GetViewportSize().Width, m_Renderer->GetViewportSize().Height, + GL_COLOR_BUFFER_BIT, GL_NEAREST); + return m_AntiAliasedTexture; + } + return m_CombinedTexture; } //Return the blurred scene texture. - GLuint FullBlurredTexture() const { return m_FullBlurredTexture; } + GLuint FullBlurredTexture() const { + if (m_MSAA) { + m_AntiAliasedFrameBuffer->Bind(); + glClearColor(0.f, 0.f, 0.f, 0.f); + glClear(GL_COLOR_BUFFER_BIT); + m_AntiAliasedFrameBuffer->Unbind(); + m_FinalPassFrameBuffer->Read(); + m_AntiAliasedFrameBuffer->Draw(); + glBlitFramebuffer( + 0, 0, m_Renderer->GetViewportSize().Width, m_Renderer->GetViewportSize().Height, + 0, 0, m_Renderer->GetViewportSize().Width, m_Renderer->GetViewportSize().Height, + GL_COLOR_BUFFER_BIT, GL_NEAREST); + return m_AntiAliasedTexture; + } + return m_FullBlurredTexture; } //Return the framebuffer used in the scene rendering stage. - FrameBuffer* FinalPassFrameBuffer() { return &m_FinalPassFrameBuffer; } + FrameBuffer* FinalPassFrameBuffer() { return m_FinalPassFrameBuffer; } private: void DrawSprites(std::list>&jobs, RenderScene& scene); @@ -56,18 +121,21 @@ private: Texture* m_GreyTexture; Texture* m_ErrorTexture; - FrameBuffer m_FinalPassFrameBuffer; - FrameBuffer m_ShieldDepthFrameBuffer; + FrameBuffer* m_FinalPassFrameBuffer = nullptr; + FrameBuffer* m_ShieldDepthFrameBuffer = nullptr; + FrameBuffer* m_AntiAliasedFrameBuffer = nullptr; GLuint m_BloomTexture = 0; GLuint m_SceneTexture = 0; GLuint m_DepthBuffer = 0; GLuint m_ShieldBuffer = 0; GLuint m_CubeMapTexture = 0; - GLuint m_FullBlurredTexture; - GLuint m_CombinedTexture; //This can be removed for less memory usage, just set m_sceneTexture to the return from m_BlurHUDPass.CombineTextures + GLuint m_FullBlurredTexture = 0; + GLuint m_CombinedTexture = 0; //This can be removed for less memory usage, just set m_sceneTexture to the return from m_BlurHUDPass.CombineTextures + GLuint m_AntiAliasedTexture = 0; //Is only used when MSAA is active; //maqke this component based i guess? GLuint m_ShieldPixelRate = 16; + unsigned int m_MSAA = 4; const IRenderer* m_Renderer; const LightCullingPass* m_LightCullingPass; diff --git a/include/Engine/Rendering/FrameBuffer.h b/include/Engine/Rendering/FrameBuffer.h index 1b4f6012..a4f5fed5 100644 --- a/include/Engine/Rendering/FrameBuffer.h +++ b/include/Engine/Rendering/FrameBuffer.h @@ -7,12 +7,13 @@ class BufferResource { public: - BufferResource(GLuint* resourceHandle, GLenum resourceType, GLenum attachment, GLuint mipMapLod); + BufferResource(GLuint* resourceHandle, GLenum resourceType, GLenum attachment, GLuint mipMapLod, bool multiSampling); GLuint* m_ResourceHandle; GLenum m_ResourceType; GLenum m_Attachment; GLuint m_MipMapLod = 0; + bool m_MultiSampling = false; private: }; @@ -21,24 +22,33 @@ template class ResourceType : public BufferResource { public: - ResourceType(GLuint* resourceHandle, GLenum attachment, GLuint mipMapLod) - : BufferResource(resourceHandle, RESOURCETYPE, attachment, mipMapLod) { } + ResourceType(GLuint* resourceHandle, GLenum attachment, GLuint mipMapLod, bool multiSampling) + : BufferResource(resourceHandle, RESOURCETYPE, attachment, mipMapLod, multiSampling) { } }; class Texture2D : public ResourceType { public: Texture2D(GLuint* resourceHandle, GLenum attachment, GLuint mipMapLod = 0) - : ResourceType(resourceHandle, attachment, mipMapLod) { }; + : ResourceType(resourceHandle, attachment, mipMapLod, false) { }; ~Texture2D(); }; +class Texture2DMultiSample : public ResourceType +{ +public: + Texture2DMultiSample(GLuint* resourceHandle, GLenum attachment, GLuint mipMapLod = 0) + : ResourceType(resourceHandle, attachment, mipMapLod, true) { }; + + ~Texture2DMultiSample(); +}; + class RenderBuffer : public ResourceType { public: - RenderBuffer(GLuint* resourceHandle, GLenum attachment) - : ResourceType(resourceHandle, attachment, 0) + RenderBuffer(GLuint* resourceHandle, GLenum attachment, bool multiSampling = false) + : ResourceType(resourceHandle, attachment, 0, multiSampling) { }; ~RenderBuffer(); @@ -48,12 +58,13 @@ class Texture2DArray : public ResourceType { public: Texture2DArray(GLuint* resourceHandle, GLenum attachment) - : ResourceType(resourceHandle, attachment, 0) + : ResourceType(resourceHandle, attachment, 0, false) { }; ~Texture2DArray(); }; + class FrameBuffer { public: @@ -65,9 +76,13 @@ public: void Generate(); void Bind(); void Unbind(); + void Read(); + void Draw(); GLuint GetHandle(); + bool MultiSampling() { return m_MultiSampling; }; private: + bool m_MultiSampling = true; GLuint m_BufferHandle; std::vector> m_Resources; }; diff --git a/src/Engine/Rendering/DrawFinalPass.cpp b/src/Engine/Rendering/DrawFinalPass.cpp index d03b0c2b..4765300b 100644 --- a/src/Engine/Rendering/DrawFinalPass.cpp +++ b/src/Engine/Rendering/DrawFinalPass.cpp @@ -8,6 +8,9 @@ DrawFinalPass::DrawFinalPass(IRenderer* renderer, LightCullingPass* lightCulling { //TODO: Make sure that uniforms are not sent into shader if not needed. m_ShieldPixelRate = 8; + m_FinalPassFrameBuffer = new FrameBuffer(); + m_ShieldDepthFrameBuffer = new FrameBuffer(); + InitializeTextures(); InitializeShaderPrograms(); InitializeFrameBuffers(); @@ -19,6 +22,9 @@ DrawFinalPass::~DrawFinalPass(){ CommonFunctions::DeleteTexture(&m_DepthBuffer); CommonFunctions::DeleteTexture(&m_ShieldBuffer); CommonFunctions::DeleteTexture(&m_CubeMapTexture); + + delete m_FinalPassFrameBuffer; + delete m_ShieldDepthFrameBuffer; } void DrawFinalPass::InitializeTextures() @@ -32,26 +38,78 @@ void DrawFinalPass::InitializeTextures() void DrawFinalPass::InitializeFrameBuffers() { - CommonFunctions::GenerateTexture(&m_SceneTexture, GL_CLAMP_TO_BORDER, GL_LINEAR, glm::vec2(m_Renderer->GetViewportSize().Width, m_Renderer->GetViewportSize().Height), GL_RGB16F, GL_RGB, GL_FLOAT); - //GenerateTexture(&m_BloomTexture, GL_CLAMP_TO_EDGE, GL_LINEAR, glm::vec2(m_Renderer->GetViewPortSize().Width, m_Renderer->GetViewPortSize().Height), GL_RGB16F, GL_RGB, GL_FLOAT); - CommonFunctions::GenerateTexture(&m_BloomTexture, GL_CLAMP_TO_BORDER, GL_LINEAR, glm::vec2(m_Renderer->GetViewportSize().Width, m_Renderer->GetViewportSize().Height), GL_RGB16F, GL_RGB, GL_FLOAT); - //GenerateMipMapTexture(&m_BloomTexture, GL_CLAMP_TO_EDGE, glm::vec2(m_Renderer->GetViewPortSize().Width, m_Renderer->GetViewPortSize().Height), GL_RGB16F, GL_FLOAT, 4); - //GenerateTexture(&m_StencilTexture, GL_CLAMP_TO_EDGE, GL_LINEAR, glm::vec2(m_Renderer->GetViewportSize().Width, m_Renderer->GetViewportSize().Height), GL_STENCIL, GL_STENCIL_INDEX8, GL_INT); + if (m_MSAA) { + CommonFunctions::GenerateTexture(&m_AntiAliasedTexture, GL_CLAMP_TO_BORDER, GL_NEAREST, + glm::vec2(m_Renderer->GetViewportSize().Width, m_Renderer->GetViewportSize().Height), GL_RGB16F, GL_RGB, GL_FLOAT); - CommonFunctions::GenerateTexture(&m_DepthBuffer, GL_CLAMP_TO_BORDER, GL_NEAREST, - glm::vec2(m_Renderer->GetViewportSize().Width, m_Renderer->GetViewportSize().Height), GL_DEPTH24_STENCIL8, GL_DEPTH_STENCIL, GL_UNSIGNED_INT_24_8); + if (m_AntiAliasedFrameBuffer == nullptr) { + m_AntiAliasedFrameBuffer = new FrameBuffer(); + m_AntiAliasedFrameBuffer->AddResource(std::shared_ptr(new Texture2D(&m_AntiAliasedTexture, GL_COLOR_ATTACHMENT0))); + } + m_AntiAliasedFrameBuffer->Generate(); - m_FinalPassFrameBuffer.AddResource(std::shared_ptr(new Texture2D(&m_DepthBuffer, GL_DEPTH_STENCIL_ATTACHMENT))); - //m_FinalPassFrameBuffer.AddResource(std::shared_ptr(new Texture2D(&m_StencilTexture, GL_STENCIL_ATTACHMENT))); - m_FinalPassFrameBuffer.AddResource(std::shared_ptr(new Texture2D(&m_SceneTexture, GL_COLOR_ATTACHMENT0))); - m_FinalPassFrameBuffer.AddResource(std::shared_ptr(new Texture2D(&m_BloomTexture, GL_COLOR_ATTACHMENT1))); - m_FinalPassFrameBuffer.Generate(); + glGenRenderbuffers(1, &m_SceneTexture); + glBindRenderbuffer(GL_RENDERBUFFER, m_SceneTexture); + glRenderbufferStorageMultisample(GL_RENDERBUFFER, m_MSAA, GL_RGB16F, m_Renderer->GetViewportSize().Width, m_Renderer->GetViewportSize().Height); + + glGenRenderbuffers(1, &m_BloomTexture); + glBindRenderbuffer(GL_RENDERBUFFER, m_BloomTexture); + glRenderbufferStorageMultisample(GL_RENDERBUFFER, m_MSAA, GL_RGB16F, m_Renderer->GetViewportSize().Width, m_Renderer->GetViewportSize().Height); + + glGenRenderbuffers(1, &m_DepthBuffer); + glBindRenderbuffer(GL_RENDERBUFFER, m_DepthBuffer); + glRenderbufferStorageMultisample(GL_RENDERBUFFER, m_MSAA, GL_DEPTH24_STENCIL8, m_Renderer->GetViewportSize().Width, m_Renderer->GetViewportSize().Height); + + glGenRenderbuffers(1, &m_ShieldBuffer); + glBindRenderbuffer(GL_RENDERBUFFER, m_ShieldBuffer); + glRenderbufferStorageMultisample(GL_RENDERBUFFER, m_MSAA, GL_DEPTH_COMPONENT32F, m_Renderer->GetViewportSize().Width, m_Renderer->GetViewportSize().Height); + + //CommonFunctions::GenerateMultiSampleTexture(&m_SceneTexture, m_MSAA, glm::vec2(m_Renderer->GetViewportSize().Width, m_Renderer->GetViewportSize().Height), GL_RGB16F); + //CommonFunctions::GenerateMultiSampleTexture(&m_BloomTexture, m_MSAA, glm::vec2(m_Renderer->GetViewportSize().Width, m_Renderer->GetViewportSize().Height), GL_RGB16F); + + //CommonFunctions::GenerateMultiSampleTexture(&m_DepthBuffer, m_MSAA, + //glm::vec2(m_Renderer->GetViewportSize().Width, m_Renderer->GetViewportSize().Height), GL_DEPTH24_STENCIL8); + + //CommonFunctions::GenerateMultiSampleTexture(&m_ShieldBuffer, m_MSAA, + //glm::vec2(m_Renderer->GetViewportSize().Width, m_Renderer->GetViewportSize().Height), GL_DEPTH_COMPONENT32F); + } else { + CommonFunctions::GenerateTexture(&m_SceneTexture, GL_CLAMP_TO_BORDER, GL_LINEAR, glm::vec2(m_Renderer->GetViewportSize().Width, m_Renderer->GetViewportSize().Height), GL_RGB16F, GL_RGB, GL_FLOAT); + //GenerateTexture(&m_BloomTexture, GL_CLAMP_TO_EDGE, GL_LINEAR, glm::vec2(m_Renderer->GetViewPortSize().Width, m_Renderer->GetViewPortSize().Height), GL_RGB16F, GL_RGB, GL_FLOAT); + CommonFunctions::GenerateTexture(&m_BloomTexture, GL_CLAMP_TO_BORDER, GL_LINEAR, glm::vec2(m_Renderer->GetViewportSize().Width, m_Renderer->GetViewportSize().Height), GL_RGB16F, GL_RGB, GL_FLOAT); + //GenerateMipMapTexture(&m_BloomTexture, GL_CLAMP_TO_EDGE, glm::vec2(m_Renderer->GetViewPortSize().Width, m_Renderer->GetViewPortSize().Height), GL_RGB16F, GL_FLOAT, 4); + //GenerateTexture(&m_StencilTexture, GL_CLAMP_TO_EDGE, GL_LINEAR, glm::vec2(m_Renderer->GetViewportSize().Width, m_Renderer->GetViewportSize().Height), GL_STENCIL, GL_STENCIL_INDEX8, GL_INT); + + CommonFunctions::GenerateTexture(&m_DepthBuffer, GL_CLAMP_TO_BORDER, GL_NEAREST, + glm::vec2(m_Renderer->GetViewportSize().Width, m_Renderer->GetViewportSize().Height), GL_DEPTH24_STENCIL8, GL_DEPTH_STENCIL, GL_UNSIGNED_INT_24_8); + + CommonFunctions::GenerateTexture(&m_ShieldBuffer, GL_CLAMP_TO_BORDER, GL_NEAREST, + glm::vec2(m_Renderer->GetViewportSize().Width, m_Renderer->GetViewportSize().Height), GL_DEPTH_COMPONENT32F, GL_DEPTH_COMPONENT, GL_UNSIGNED_INT); + } + + if (m_FinalPassFrameBuffer->GetHandle() == 0) { + if (m_MSAA) { + m_FinalPassFrameBuffer->AddResource(std::shared_ptr(new RenderBuffer(&m_DepthBuffer, GL_DEPTH_STENCIL_ATTACHMENT))); + //m_FinalPassFrameBuffer->AddResource(std::shared_ptr(new Texture2D(&m_StencilTexture, GL_STENCIL_ATTACHMENT))); + m_FinalPassFrameBuffer->AddResource(std::shared_ptr(new RenderBuffer(&m_SceneTexture, GL_COLOR_ATTACHMENT0))); + m_FinalPassFrameBuffer->AddResource(std::shared_ptr(new RenderBuffer(&m_BloomTexture, GL_COLOR_ATTACHMENT1))); + } else { + m_FinalPassFrameBuffer->AddResource(std::shared_ptr(new Texture2D(&m_DepthBuffer, GL_DEPTH_STENCIL_ATTACHMENT))); + //m_FinalPassFrameBuffer->AddResource(std::shared_ptr(new Texture2D(&m_StencilTexture, GL_STENCIL_ATTACHMENT))); + m_FinalPassFrameBuffer->AddResource(std::shared_ptr(new Texture2D(&m_SceneTexture, GL_COLOR_ATTACHMENT0))); + m_FinalPassFrameBuffer->AddResource(std::shared_ptr(new Texture2D(&m_BloomTexture, GL_COLOR_ATTACHMENT1))); + } + } + m_FinalPassFrameBuffer->Generate(); GLERROR("FBO generation"); - CommonFunctions::GenerateTexture(&m_ShieldBuffer, GL_CLAMP_TO_BORDER, GL_NEAREST, - glm::vec2(m_Renderer->GetViewportSize().Width, m_Renderer->GetViewportSize().Height), GL_DEPTH_COMPONENT32, GL_DEPTH_COMPONENT, GL_UNSIGNED_INT); - m_ShieldDepthFrameBuffer.AddResource(std::shared_ptr(new Texture2D(&m_ShieldBuffer, GL_DEPTH_ATTACHMENT))); - m_ShieldDepthFrameBuffer.Generate(); + if (m_ShieldDepthFrameBuffer->GetHandle() == 0) { + if (m_MSAA) { + m_ShieldDepthFrameBuffer->AddResource(std::shared_ptr(new RenderBuffer(&m_ShieldBuffer, GL_DEPTH_ATTACHMENT))); + } else { + m_ShieldDepthFrameBuffer->AddResource(std::shared_ptr(new Texture2D(&m_ShieldBuffer, GL_DEPTH_ATTACHMENT))); + } + } + m_ShieldDepthFrameBuffer->Generate(); } void DrawFinalPass::InitializeShaderPrograms() @@ -245,14 +303,14 @@ void DrawFinalPass::InitializeShaderPrograms() void DrawFinalPass::Draw(RenderScene& scene, BlurHUD* blurHUDPass) { GLERROR("Pre"); - DrawFinalPassState* stateDethp = new DrawFinalPassState(m_ShieldDepthFrameBuffer.GetHandle()); + DrawFinalPassState* stateDethp = new DrawFinalPassState(m_ShieldDepthFrameBuffer->GetHandle()); //Draw shields to stencil DrawToDepthStencilBuffer(scene.Jobs.ShieldObjects, scene); GLERROR("StencilPass"); delete stateDethp; - DrawFinalPassState* state = new DrawFinalPassState(m_FinalPassFrameBuffer.GetHandle()); + DrawFinalPassState* state = new DrawFinalPassState(m_FinalPassFrameBuffer->GetHandle()); if (scene.ClearDepth) { //glClear(GL_DEPTH_BUFFER_BIT); state->Disable(GL_DEPTH_TEST); @@ -293,16 +351,21 @@ void DrawFinalPass::Draw(RenderScene& scene, BlurHUD* blurHUDPass) delete state; if (scene.ShouldBlur) { //This needs to be drawn only when the full scene is being renderd, and then let be, otherwise sprite and other shit will show on it. - m_FullBlurredTexture = blurHUDPass->Draw(m_SceneTexture, scene); + GLuint sceneTexture = SceneTexture(); + GLERROR("SceneTexture() 1"); + m_FullBlurredTexture = blurHUDPass->Draw(sceneTexture, scene); } - DrawFinalPassState* stateSprite = new DrawFinalPassState(m_FinalPassFrameBuffer.GetHandle()); + DrawFinalPassState* stateSprite = new DrawFinalPassState(m_FinalPassFrameBuffer->GetHandle()); if(scene.ShouldBlur) { //Combine nonblur and blur texture stateSprite->Disable(GL_DEPTH_TEST); stateSprite->Disable(GL_STENCIL_TEST); - m_CombinedTexture = blurHUDPass->CombineTextures(m_SceneTexture, m_FullBlurredTexture); - + GLuint sceneTexture = SceneTexture(); + GLERROR("SceneTexture() 2"); + delete stateSprite; + stateSprite = new DrawFinalPassState(m_FinalPassFrameBuffer->GetHandle()); + m_CombinedTexture = blurHUDPass->CombineTextures(sceneTexture, m_FullBlurredTexture); } //Draw Transparen objects //state->BlendFunc(GL_ONE, GL_ONE); @@ -325,30 +388,37 @@ void DrawFinalPass::Draw(RenderScene& scene, BlurHUD* blurHUDPass) void DrawFinalPass::ClearBuffer() { GLERROR("PRE"); - m_ShieldDepthFrameBuffer.Bind(); + m_ShieldDepthFrameBuffer->Bind(); glClear(GL_DEPTH_BUFFER_BIT); - m_ShieldDepthFrameBuffer.Unbind(); - m_FinalPassFrameBuffer.Bind(); + m_ShieldDepthFrameBuffer->Unbind(); + m_FinalPassFrameBuffer->Bind(); GLERROR("Bind HighRes"); glViewport(0, 0, m_Renderer->GetViewportSize().Width, m_Renderer->GetViewportSize().Height); glScissor(0, 0, m_Renderer->GetViewportSize().Width, m_Renderer->GetViewportSize().Height); GLERROR("ViewPort,Scissor LowRes"); glClearColor(0.f, 0.f, 0.f, 0.f); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - m_FinalPassFrameBuffer.Unbind(); + m_FinalPassFrameBuffer->Unbind(); GLERROR("END"); } void DrawFinalPass::OnWindowResize() { - //InitializeFrameBuffers(); - CommonFunctions::GenerateTexture(&m_DepthBuffer, GL_CLAMP_TO_BORDER, GL_NEAREST, - glm::vec2(m_Renderer->GetViewportSize().Width, m_Renderer->GetViewportSize().Height), GL_DEPTH24_STENCIL8, GL_DEPTH_STENCIL, GL_UNSIGNED_INT_24_8); - CommonFunctions::GenerateTexture(&m_SceneTexture, GL_CLAMP_TO_BORDER, GL_LINEAR, glm::vec2(m_Renderer->GetViewportSize().Width, m_Renderer->GetViewportSize().Height), GL_RGB16F, GL_RGB, GL_FLOAT); - CommonFunctions::GenerateTexture(&m_BloomTexture, GL_CLAMP_TO_BORDER, GL_LINEAR, glm::vec2(m_Renderer->GetViewportSize().Width, m_Renderer->GetViewportSize().Height), GL_RGB16F, GL_RGB, GL_FLOAT); - m_FinalPassFrameBuffer.Generate(); + if (m_FinalPassFrameBuffer->MultiSampling() != (bool)m_MSAA) { + delete m_FinalPassFrameBuffer; + delete m_ShieldDepthFrameBuffer; + m_FinalPassFrameBuffer = new FrameBuffer(); + m_ShieldDepthFrameBuffer = new FrameBuffer(); + } + if (!m_MSAA) { + if (m_AntiAliasedFrameBuffer != nullptr) { + delete m_AntiAliasedFrameBuffer; + } + } + + InitializeFrameBuffers(); GLERROR("Error changing texture resolutions"); } diff --git a/src/Engine/Rendering/FrameBuffer.cpp b/src/Engine/Rendering/FrameBuffer.cpp index dfabb8a3..d7843b2c 100644 --- a/src/Engine/Rendering/FrameBuffer.cpp +++ b/src/Engine/Rendering/FrameBuffer.cpp @@ -2,12 +2,13 @@ #include "Rendering/FrameBuffer.h" -BufferResource::BufferResource(GLuint* resourceHandle, GLenum resourceType, GLenum attachment, GLuint mipMapLod) +BufferResource::BufferResource(GLuint* resourceHandle, GLenum resourceType, GLenum attachment, GLuint mipMapLod, bool multiSampling) { m_ResourceHandle = resourceHandle; m_ResourceType = resourceType; m_Attachment = attachment; m_MipMapLod = mipMapLod; + m_MultiSampling = multiSampling; } Texture2D::~Texture2D() @@ -17,6 +18,12 @@ Texture2D::~Texture2D() } } +Texture2DMultiSample::~Texture2DMultiSample() +{ + if (m_ResourceHandle != 0) { + glDeleteTextures(1, m_ResourceHandle); + } +} RenderBuffer::~RenderBuffer() { @@ -42,6 +49,14 @@ FrameBuffer::~FrameBuffer() void FrameBuffer::AddResource(std::shared_ptr resource) { + //m_MultiSampling is true when initialized + if (m_MultiSampling != resource->m_MultiSampling) { + if (m_MultiSampling == false) { + GLERROR("All renderbuffers is/is not using multisampling"); + } else { + m_MultiSampling = false; + } + } m_Resources.push_back(resource); } @@ -55,20 +70,23 @@ void FrameBuffer::Generate() } glBindFramebuffer(GL_FRAMEBUFFER, m_BufferHandle); GLERROR("1"); - for (auto it = m_Resources.begin(); it != m_Resources.end(); it++) { switch ((*it)->m_ResourceType) { + case GL_TEXTURE_2D_MULTISAMPLE: + glFramebufferTexture2D(GL_FRAMEBUFFER, (*it)->m_Attachment, GL_TEXTURE_2D_MULTISAMPLE, 0, 0); + GLERROR("FrameBuffer generate: GL_TEXTURE_2D_MULTISAMPLE"); + break; case GL_TEXTURE_2D: glFramebufferTexture(GL_FRAMEBUFFER, (*it)->m_Attachment, *(*it)->m_ResourceHandle, (*it)->m_MipMapLod); - GLERROR("FrameBuffer generate: glFramebufferTexture2D"); + GLERROR("FrameBuffer generate: GL_TEXTURE_2D"); break; case GL_RENDERBUFFER: glFramebufferRenderbuffer(GL_FRAMEBUFFER, (*it)->m_Attachment, (*it)->m_ResourceType, *(*it)->m_ResourceHandle); - GLERROR("FrameBuffer generate: glFramebufferRenderbuffer"); + GLERROR("FrameBuffer generate: GL_RENDERBUFFER"); break; case GL_TEXTURE_2D_ARRAY: glFramebufferTexture(GL_FRAMEBUFFER, (*it)->m_Attachment, *(*it)->m_ResourceHandle, 0); - GLERROR("FrameBuffer generate: glFramebufferTexture2DArray"); + GLERROR("FrameBuffer generate: GL_TEXTURE_2D_ARRAY"); break; } GLERROR("2"); @@ -77,8 +95,8 @@ void FrameBuffer::Generate() attachments.push_back((*it)->m_Attachment); } GLERROR("Attachment"); - } + GLERROR("3"); GLenum* bufferTextures = attachments.data(); @@ -89,7 +107,7 @@ void FrameBuffer::Generate() if (GLenum frameBufferStatus = glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) { GLERROR("Framebuffer incomplete"); - //LOG_ERROR("FrameBuffer incomplete: 0x%x\n", frameBufferStatus); + LOG_ERROR("FrameBuffer incomplete: 0x%x\n", glCheckFramebufferStatus(GL_FRAMEBUFFER)); exit(EXIT_FAILURE); } GLERROR("END"); @@ -110,3 +128,11 @@ GLuint FrameBuffer::GetHandle() { return m_BufferHandle; } + +void FrameBuffer::Read() { + glBindFramebuffer(GL_READ_FRAMEBUFFER, m_BufferHandle); +} + +void FrameBuffer::Draw() { + glBindFramebuffer(GL_DRAW_FRAMEBUFFER, m_BufferHandle); +} diff --git a/src/Engine/Rendering/Util/CommonFunctions.cpp b/src/Engine/Rendering/Util/CommonFunctions.cpp index c185cd5c..7788c955 100644 --- a/src/Engine/Rendering/Util/CommonFunctions.cpp +++ b/src/Engine/Rendering/Util/CommonFunctions.cpp @@ -17,8 +17,9 @@ void CommonFunctions::GenerateMultiSampleTexture(GLuint* texture, int numSamples { glDeleteTextures(1, texture); glGenTextures(1, texture); - glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, *texture); - glTexImage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, numSamples, internalFormat, dimensions.x, dimensions.y, false); + glBindTexture(GL_TEXTURE_2D, *texture); + GLERROR("Texture initialization failed 1"); + glTexImage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, numSamples, internalFormat, dimensions.x, dimensions.y, GL_FALSE); GLERROR("Texture initialization failed"); } From 90d848e8d91951d7548a1a5d5f71ae7447e15e04 Mon Sep 17 00:00:00 2001 From: Teejoon Date: Sat, 12 Mar 2016 18:04:10 +0100 Subject: [PATCH 2/9] Made texture getters from draw finalpass from const --- include/Engine/Rendering/DrawFinalPass.h | 18 ++++++------------ src/Engine/Rendering/DrawFinalPass.cpp | 2 -- src/Engine/Rendering/Renderer.cpp | 3 ++- 3 files changed, 8 insertions(+), 15 deletions(-) diff --git a/include/Engine/Rendering/DrawFinalPass.h b/include/Engine/Rendering/DrawFinalPass.h index 7e2b7853..31dabac2 100644 --- a/include/Engine/Rendering/DrawFinalPass.h +++ b/include/Engine/Rendering/DrawFinalPass.h @@ -27,7 +27,7 @@ public: void OnWindowResize(); //Return the texture that is used in later stages to apply the bloom effect - GLuint BloomTexture() const { + GLuint BloomTexture() { if (m_MSAA){ m_AntiAliasedFrameBuffer->Bind(); glClearColor(0.f, 0.f, 0.f, 0.f); @@ -40,35 +40,29 @@ public: 0, 0, m_Renderer->GetViewportSize().Width, m_Renderer->GetViewportSize().Height, 0, 0, m_Renderer->GetViewportSize().Width, m_Renderer->GetViewportSize().Height, GL_COLOR_BUFFER_BIT, GL_NEAREST); - glReadBuffer(GL_BACK); return m_AntiAliasedTexture; } return m_BloomTexture; } //Return the texture with diffuse and lighting of the scene. - GLuint SceneTexture() const { + GLuint DrawFinalPass::SceneTexture() { if (m_MSAA) { m_AntiAliasedFrameBuffer->Bind(); glClearColor(0.f, 0.f, 0.f, 0.f); glClear(GL_COLOR_BUFFER_BIT); m_AntiAliasedFrameBuffer->Unbind(); - GLERROR("SceneTexture() 11"); m_FinalPassFrameBuffer->Read(); - GLERROR("SceneTexture() 12"); glReadBuffer(GL_COLOR_ATTACHMENT0); - GLERROR("SceneTexture() 13"); m_AntiAliasedFrameBuffer->Draw(); - GLERROR("SceneTexture() 14"); glBlitFramebuffer( 0, 0, m_Renderer->GetViewportSize().Width, m_Renderer->GetViewportSize().Height, 0, 0, m_Renderer->GetViewportSize().Width, m_Renderer->GetViewportSize().Height, GL_COLOR_BUFFER_BIT, GL_NEAREST); - GLERROR("SceneTexture() 15"); - glReadBuffer(GL_BACK); return m_AntiAliasedTexture; } - return m_SceneTexture; } + return m_SceneTexture; + } //Return the SceneTexture with the blurred HUD bits. - GLuint CombinedSceneTexture() const { + GLuint CombinedSceneTexture() { if (m_MSAA) { m_AntiAliasedFrameBuffer->Bind(); glClearColor(0.f, 0.f, 0.f, 0.f); @@ -84,7 +78,7 @@ public: } return m_CombinedTexture; } //Return the blurred scene texture. - GLuint FullBlurredTexture() const { + GLuint FullBlurredTexture() { if (m_MSAA) { m_AntiAliasedFrameBuffer->Bind(); glClearColor(0.f, 0.f, 0.f, 0.f); diff --git a/src/Engine/Rendering/DrawFinalPass.cpp b/src/Engine/Rendering/DrawFinalPass.cpp index 4765300b..bf378495 100644 --- a/src/Engine/Rendering/DrawFinalPass.cpp +++ b/src/Engine/Rendering/DrawFinalPass.cpp @@ -352,7 +352,6 @@ void DrawFinalPass::Draw(RenderScene& scene, BlurHUD* blurHUDPass) if (scene.ShouldBlur) { //This needs to be drawn only when the full scene is being renderd, and then let be, otherwise sprite and other shit will show on it. GLuint sceneTexture = SceneTexture(); - GLERROR("SceneTexture() 1"); m_FullBlurredTexture = blurHUDPass->Draw(sceneTexture, scene); } @@ -362,7 +361,6 @@ void DrawFinalPass::Draw(RenderScene& scene, BlurHUD* blurHUDPass) stateSprite->Disable(GL_DEPTH_TEST); stateSprite->Disable(GL_STENCIL_TEST); GLuint sceneTexture = SceneTexture(); - GLERROR("SceneTexture() 2"); delete stateSprite; stateSprite = new DrawFinalPassState(m_FinalPassFrameBuffer->GetHandle()); m_CombinedTexture = blurHUDPass->CombineTextures(sceneTexture, m_FullBlurredTexture); diff --git a/src/Engine/Rendering/Renderer.cpp b/src/Engine/Rendering/Renderer.cpp index eecb5a7a..91abe20b 100644 --- a/src/Engine/Rendering/Renderer.cpp +++ b/src/Engine/Rendering/Renderer.cpp @@ -227,7 +227,8 @@ void Renderer::Draw(RenderFrame& frame) if (m_DebugTextureToDraw == 0) { PerformanceTimer::StartTimer("Renderer-Color Correction Pass"); - m_DrawColorCorrectionPass->Draw(m_DrawFinalPass->SceneTexture(), m_DrawBloomPass->GaussianTexture(), frame.Gamma, frame.Exposure); + GLuint test = m_DrawFinalPass->SceneTexture(); + m_DrawColorCorrectionPass->Draw(test, m_DrawBloomPass->GaussianTexture(), frame.Gamma, frame.Exposure); PerformanceTimer::StopTimer("Renderer-Color Correction Pass"); } From 5146d211730240435f117b423f9cf190f62bc6b2 Mon Sep 17 00:00:00 2001 From: Teejoon Date: Sat, 12 Mar 2016 22:22:53 +0100 Subject: [PATCH 3/9] MSAA is now working --- include/Engine/Rendering/DrawFinalPass.h | 5 +- include/Engine/Rendering/Renderer.h | 1 + include/Engine/Rendering/SpriteJob.h | 2 + resources/DefaultConfig.ini | 5 +- resources/Schema/Components/Sprite.xml | 1 + resources/Schema/Components/Sprite.xsd | 3 + resources/Shaders/Shadow.vert.glsl | 6 +- resources/Shaders/ShadowSkinned.vert.glsl | 6 +- src/Engine/Rendering/BlurHUD.cpp | 36 +++++----- src/Engine/Rendering/DrawFinalPass.cpp | 88 +++++++++++++++++------ src/Engine/Rendering/FrameBuffer.cpp | 4 ++ src/Engine/Rendering/Renderer.cpp | 4 +- src/Engine/Rendering/ShadowPass.cpp | 58 ++++++++------- 13 files changed, 139 insertions(+), 80 deletions(-) diff --git a/include/Engine/Rendering/DrawFinalPass.h b/include/Engine/Rendering/DrawFinalPass.h index 31dabac2..2d333059 100644 --- a/include/Engine/Rendering/DrawFinalPass.h +++ b/include/Engine/Rendering/DrawFinalPass.h @@ -17,7 +17,7 @@ class DrawFinalPass { public: - DrawFinalPass(IRenderer* renderer, LightCullingPass* lightCullingPass, CubeMapPass* cubeMapPass, SSAOPass* ssaoPass, ShadowPass* shadowPass); + DrawFinalPass(IRenderer* renderer, LightCullingPass* lightCullingPass, CubeMapPass* cubeMapPass, SSAOPass* ssaoPass, ShadowPass* shadowPass, ConfigFile* config); ~DrawFinalPass(); void InitializeTextures(); void InitializeFrameBuffers(); @@ -25,6 +25,7 @@ public: void Draw(RenderScene& scene, BlurHUD* blurHUDPass); void ClearBuffer(); void OnWindowResize(); + void setMSAA(unsigned int numberOfSamples); //Return the texture that is used in later stages to apply the bloom effect GLuint BloomTexture() { @@ -129,7 +130,7 @@ private: //maqke this component based i guess? GLuint m_ShieldPixelRate = 16; - unsigned int m_MSAA = 4; + unsigned int m_MSAA = 0; const IRenderer* m_Renderer; const LightCullingPass* m_LightCullingPass; diff --git a/include/Engine/Rendering/Renderer.h b/include/Engine/Rendering/Renderer.h index c36ba59a..e2a6e9b7 100644 --- a/include/Engine/Rendering/Renderer.h +++ b/include/Engine/Rendering/Renderer.h @@ -71,6 +71,7 @@ private: bool m_ResizeWindow = false; int m_SSAO_Quality = 0; int m_GLOW_Quality = 2; + unsigned int m_MSAA_Level = 0; PickingPass* m_PickingPass; LightCullingPass* m_LightCullingPass; diff --git a/include/Engine/Rendering/SpriteJob.h b/include/Engine/Rendering/SpriteJob.h index 3d55e721..36bd14c2 100644 --- a/include/Engine/Rendering/SpriteJob.h +++ b/include/Engine/Rendering/SpriteJob.h @@ -29,6 +29,7 @@ struct SpriteJob : RenderJob IncandescenceTexture = CommonFunctions::TryLoadResource(cSprite["GlowMap"]); Linear = (bool)cSprite["Linear"]; + ClampToBorder = (bool)cSprite["ClampToBorder"]; StartIndex = matProp.material->StartIndex; EndIndex = matProp.material->EndIndex; @@ -93,6 +94,7 @@ struct SpriteJob : RenderJob float ScaleX = 1; float ScaleY = 1; bool Linear = false; + bool ClampToBorder = false; glm::vec4 FillColor = glm::vec4(0); float FillPercentage = 0.0; diff --git a/resources/DefaultConfig.ini b/resources/DefaultConfig.ini index 92e7bad3..7c34e267 100644 --- a/resources/DefaultConfig.ini +++ b/resources/DefaultConfig.ini @@ -84,4 +84,7 @@ NumIterations=5 NumIterations=9 [GLOW3] -NumIterations=13 \ No newline at end of file +NumIterations=13 + +[MSAA] +Level = 0; \ No newline at end of file diff --git a/resources/Schema/Components/Sprite.xml b/resources/Schema/Components/Sprite.xml index 9ba27381..a67f5dde 100644 --- a/resources/Schema/Components/Sprite.xml +++ b/resources/Schema/Components/Sprite.xml @@ -10,5 +10,6 @@ false false true + false false diff --git a/resources/Schema/Components/Sprite.xsd b/resources/Schema/Components/Sprite.xsd index af4860c8..44456ec7 100644 --- a/resources/Schema/Components/Sprite.xsd +++ b/resources/Schema/Components/Sprite.xsd @@ -39,6 +39,9 @@ If it should use Linear or Nearest sampling method. + + If it should clamp to border or repeat the texture. + Wether the background should be blurred begind this sprite. diff --git a/resources/Shaders/Shadow.vert.glsl b/resources/Shaders/Shadow.vert.glsl index 7b1b26fb..667b0401 100644 --- a/resources/Shaders/Shadow.vert.glsl +++ b/resources/Shaders/Shadow.vert.glsl @@ -1,8 +1,6 @@ #version 430 -uniform mat4 M; -uniform mat4 V; -uniform mat4 P; +uniform mat4 PVM; layout (location = 0) in vec3 Position; layout (location = 4) in vec2 TextureCoords; @@ -13,6 +11,6 @@ out VertexData{ void main() { - gl_Position = P * V * M * vec4(Position, 1.0); + gl_Position = PVM * vec4(Position, 1.0); Output.TextureCoordinate = TextureCoords; } \ No newline at end of file diff --git a/resources/Shaders/ShadowSkinned.vert.glsl b/resources/Shaders/ShadowSkinned.vert.glsl index 5d2459e4..d627e2e6 100644 --- a/resources/Shaders/ShadowSkinned.vert.glsl +++ b/resources/Shaders/ShadowSkinned.vert.glsl @@ -1,8 +1,6 @@ #version 430 -uniform mat4 M; -uniform mat4 V; -uniform mat4 P; +uniform mat4 PVM; uniform mat4 Bones[100]; layout (location = 0) in vec3 Position; @@ -24,6 +22,6 @@ void main() + BoneWeights[3] * Bones[int(BoneIndices[3])]; } - gl_Position = P * V * M * boneTransform * vec4(Position, 1.0); + gl_Position = PVM * boneTransform * vec4(Position, 1.0); Output.TextureCoordinate = TextureCoords; } \ No newline at end of file diff --git a/src/Engine/Rendering/BlurHUD.cpp b/src/Engine/Rendering/BlurHUD.cpp index 58a61fd4..e16a7b78 100644 --- a/src/Engine/Rendering/BlurHUD.cpp +++ b/src/Engine/Rendering/BlurHUD.cpp @@ -68,13 +68,13 @@ void BlurHUD::InitializeBuffers() } m_GaussianFrameBuffer_horiz.Generate(); - CommonFunctions::GenerateTexture(&m_DepthStencil_vert, GL_CLAMP_TO_BORDER, GL_NEAREST, - res2, GL_DEPTH24_STENCIL8, GL_DEPTH_STENCIL, GL_UNSIGNED_INT_24_8); + //CommonFunctions::GenerateTexture(&m_DepthStencil_vert, GL_CLAMP_TO_BORDER, GL_NEAREST, + // res2, GL_DEPTH24_STENCIL8, GL_DEPTH_STENCIL, GL_UNSIGNED_INT_24_8); CommonFunctions::GenerateTexture(&m_GaussianTexture_vert, GL_CLAMP_TO_EDGE, GL_NEAREST, res2, GL_RGBA16F, GL_RGBA, GL_FLOAT); if (m_GaussianFrameBuffer_vert.GetHandle() == 0) { - m_GaussianFrameBuffer_vert.AddResource(std::shared_ptr(new Texture2D(&m_DepthStencil_vert, GL_DEPTH_STENCIL_ATTACHMENT))); + m_GaussianFrameBuffer_vert.AddResource(std::shared_ptr(new Texture2D(&m_DepthStencil_horiz, GL_DEPTH_STENCIL_ATTACHMENT))); m_GaussianFrameBuffer_vert.AddResource(std::shared_ptr(new Texture2D(&m_GaussianTexture_vert, GL_COLOR_ATTACHMENT0))); } m_GaussianFrameBuffer_vert.Generate(); @@ -260,22 +260,22 @@ void BlurHUD::FillStencil(RenderScene& scene) glDrawElements(GL_TRIANGLES, spriteJob->EndIndex - spriteJob->StartIndex + 1, GL_UNSIGNED_INT, (void*)(spriteJob->StartIndex*sizeof(unsigned int))); } - state.BindFramebuffer(m_GaussianFrameBuffer_vert.GetHandle()); - for (auto& job : scene.Jobs.SpriteJob) { - auto spriteJob = std::dynamic_pointer_cast(job); - if (!spriteJob) { - continue; - } - if(!spriteJob->BlurBackground) { - continue; - } - glm::mat4 MVP = VP * spriteJob->Matrix; - glUniformMatrix4fv(glGetUniformLocation(shaderHandle, "PVM"), 1, GL_FALSE, glm::value_ptr(MVP)); + //state.BindFramebuffer(m_GaussianFrameBuffer_vert.GetHandle()); + //for (auto& job : scene.Jobs.SpriteJob) { + // auto spriteJob = std::dynamic_pointer_cast(job); + // if (!spriteJob) { + // continue; + // } + // if(!spriteJob->BlurBackground) { + // continue; + // } + // glm::mat4 MVP = VP * spriteJob->Matrix; + // glUniformMatrix4fv(glGetUniformLocation(shaderHandle, "PVM"), 1, GL_FALSE, glm::value_ptr(MVP)); - glBindVertexArray(spriteJob->Model->VAO); - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, spriteJob->Model->ElementBuffer); - glDrawElements(GL_TRIANGLES, spriteJob->EndIndex - spriteJob->StartIndex + 1, GL_UNSIGNED_INT, (void*)(spriteJob->StartIndex*sizeof(unsigned int))); - } + // glBindVertexArray(spriteJob->Model->VAO); + // glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, spriteJob->Model->ElementBuffer); + // glDrawElements(GL_TRIANGLES, spriteJob->EndIndex - spriteJob->StartIndex + 1, GL_UNSIGNED_INT, (void*)(spriteJob->StartIndex*sizeof(unsigned int))); + //} glViewport(0, 0, m_Renderer->GetViewportSize().Width, m_Renderer->GetViewportSize().Height); } diff --git a/src/Engine/Rendering/DrawFinalPass.cpp b/src/Engine/Rendering/DrawFinalPass.cpp index d2cc4a78..970f40a1 100644 --- a/src/Engine/Rendering/DrawFinalPass.cpp +++ b/src/Engine/Rendering/DrawFinalPass.cpp @@ -1,5 +1,5 @@ #include "Rendering/DrawFinalPass.h" -DrawFinalPass::DrawFinalPass(IRenderer* renderer, LightCullingPass* lightCullingPass, CubeMapPass* cubeMapPass, SSAOPass* ssaoPass, ShadowPass* shadowPass) +DrawFinalPass::DrawFinalPass(IRenderer* renderer, LightCullingPass* lightCullingPass, CubeMapPass* cubeMapPass, SSAOPass* ssaoPass, ShadowPass* shadowPass, ConfigFile* config) : m_Renderer(renderer) , m_LightCullingPass(lightCullingPass) , m_CubeMapPass(cubeMapPass) @@ -11,6 +11,8 @@ DrawFinalPass::DrawFinalPass(IRenderer* renderer, LightCullingPass* lightCulling m_FinalPassFrameBuffer = new FrameBuffer(); m_ShieldDepthFrameBuffer = new FrameBuffer(); + setMSAA(config->Get("MSAA.Level", 0)); + InitializeTextures(); InitializeShaderPrograms(); InitializeFrameBuffers(); @@ -48,21 +50,35 @@ void DrawFinalPass::InitializeFrameBuffers() } m_AntiAliasedFrameBuffer->Generate(); + if (m_SceneTexture != 0) { + glDeleteRenderbuffers(1, &m_SceneTexture); + } glGenRenderbuffers(1, &m_SceneTexture); + GLERROR("FBO 1"); glBindRenderbuffer(GL_RENDERBUFFER, m_SceneTexture); + GLERROR("FBO 11"); glRenderbufferStorageMultisample(GL_RENDERBUFFER, m_MSAA, GL_RGB16F, m_Renderer->GetViewportSize().Width, m_Renderer->GetViewportSize().Height); + GLERROR("FBO 111"); + if (m_BloomTexture != 0) { + glDeleteRenderbuffers(1, &m_BloomTexture); + } glGenRenderbuffers(1, &m_BloomTexture); + GLERROR("FBO 2"); glBindRenderbuffer(GL_RENDERBUFFER, m_BloomTexture); + GLERROR("FBO 22"); glRenderbufferStorageMultisample(GL_RENDERBUFFER, m_MSAA, GL_RGB16F, m_Renderer->GetViewportSize().Width, m_Renderer->GetViewportSize().Height); + GLERROR("FBO 222"); + if (m_DepthBuffer != 0) { + glDeleteRenderbuffers(1, &m_DepthBuffer); + } glGenRenderbuffers(1, &m_DepthBuffer); + GLERROR("FBO 3"); glBindRenderbuffer(GL_RENDERBUFFER, m_DepthBuffer); + GLERROR("FBO 33"); glRenderbufferStorageMultisample(GL_RENDERBUFFER, m_MSAA, GL_DEPTH24_STENCIL8, m_Renderer->GetViewportSize().Width, m_Renderer->GetViewportSize().Height); - - glGenRenderbuffers(1, &m_ShieldBuffer); - glBindRenderbuffer(GL_RENDERBUFFER, m_ShieldBuffer); - glRenderbufferStorageMultisample(GL_RENDERBUFFER, m_MSAA, GL_DEPTH_COMPONENT32F, m_Renderer->GetViewportSize().Width, m_Renderer->GetViewportSize().Height); + GLERROR("FBO 333"); //CommonFunctions::GenerateMultiSampleTexture(&m_SceneTexture, m_MSAA, glm::vec2(m_Renderer->GetViewportSize().Width, m_Renderer->GetViewportSize().Height), GL_RGB16F); //CommonFunctions::GenerateMultiSampleTexture(&m_BloomTexture, m_MSAA, glm::vec2(m_Renderer->GetViewportSize().Width, m_Renderer->GetViewportSize().Height), GL_RGB16F); @@ -81,11 +97,11 @@ void DrawFinalPass::InitializeFrameBuffers() CommonFunctions::GenerateTexture(&m_DepthBuffer, GL_CLAMP_TO_BORDER, GL_NEAREST, glm::vec2(m_Renderer->GetViewportSize().Width, m_Renderer->GetViewportSize().Height), GL_DEPTH24_STENCIL8, GL_DEPTH_STENCIL, GL_UNSIGNED_INT_24_8); - - CommonFunctions::GenerateTexture(&m_ShieldBuffer, GL_CLAMP_TO_BORDER, GL_NEAREST, - glm::vec2(m_Renderer->GetViewportSize().Width, m_Renderer->GetViewportSize().Height), GL_DEPTH_COMPONENT32F, GL_DEPTH_COMPONENT, GL_UNSIGNED_INT); } + CommonFunctions::GenerateTexture(&m_ShieldBuffer, GL_CLAMP_TO_BORDER, GL_NEAREST, + glm::vec2(m_Renderer->GetViewportSize().Width, m_Renderer->GetViewportSize().Height), GL_DEPTH_COMPONENT32F, GL_DEPTH_COMPONENT, GL_UNSIGNED_INT); + if (m_FinalPassFrameBuffer->GetHandle() == 0) { if (m_MSAA) { m_FinalPassFrameBuffer->AddResource(std::shared_ptr(new RenderBuffer(&m_DepthBuffer, GL_DEPTH_STENCIL_ATTACHMENT))); @@ -103,11 +119,7 @@ void DrawFinalPass::InitializeFrameBuffers() GLERROR("FBO generation"); if (m_ShieldDepthFrameBuffer->GetHandle() == 0) { - if (m_MSAA) { - m_ShieldDepthFrameBuffer->AddResource(std::shared_ptr(new RenderBuffer(&m_ShieldBuffer, GL_DEPTH_ATTACHMENT))); - } else { - m_ShieldDepthFrameBuffer->AddResource(std::shared_ptr(new Texture2D(&m_ShieldBuffer, GL_DEPTH_ATTACHMENT))); - } + m_ShieldDepthFrameBuffer->AddResource(std::shared_ptr(new Texture2D(&m_ShieldBuffer, GL_DEPTH_ATTACHMENT))); } m_ShieldDepthFrameBuffer->Generate(); } @@ -355,16 +367,18 @@ void DrawFinalPass::Draw(RenderScene& scene, BlurHUD* blurHUDPass) m_FullBlurredTexture = blurHUDPass->Draw(sceneTexture, scene); } - DrawFinalPassState* stateSprite = new DrawFinalPassState(m_FinalPassFrameBuffer->GetHandle()); + DrawFinalPassState* stateSprite; if(scene.ShouldBlur) { //Combine nonblur and blur texture - stateSprite->Disable(GL_DEPTH_TEST); - stateSprite->Disable(GL_STENCIL_TEST); GLuint sceneTexture = SceneTexture(); - delete stateSprite; stateSprite = new DrawFinalPassState(m_FinalPassFrameBuffer->GetHandle()); + stateSprite->Disable(GL_DEPTH_TEST); + stateSprite->Disable(GL_STENCIL_TEST); m_CombinedTexture = blurHUDPass->CombineTextures(sceneTexture, m_FullBlurredTexture); - } + + } else { + stateSprite = new DrawFinalPassState(m_FinalPassFrameBuffer->GetHandle()); + } //Draw Transparen objects //state->BlendFunc(GL_ONE, GL_ONE); //state->StencilFunc(GL_EQUAL, 1, 0xFF); @@ -410,9 +424,10 @@ void DrawFinalPass::OnWindowResize() m_ShieldDepthFrameBuffer = new FrameBuffer(); } - if (!m_MSAA) { + if (m_MSAA) { if (m_AntiAliasedFrameBuffer != nullptr) { delete m_AntiAliasedFrameBuffer; + m_AntiAliasedFrameBuffer = nullptr; } } @@ -420,6 +435,32 @@ void DrawFinalPass::OnWindowResize() GLERROR("Error changing texture resolutions"); } +void DrawFinalPass::setMSAA(unsigned int numberOfSamples) { + if (m_MSAA == numberOfSamples) { + return; + } + + if (!(bool)numberOfSamples) { + if (m_AntiAliasedFrameBuffer != nullptr) { + delete m_AntiAliasedFrameBuffer; + m_AntiAliasedFrameBuffer = nullptr; + } + delete m_FinalPassFrameBuffer; + m_FinalPassFrameBuffer = new FrameBuffer(); + } + + if ((bool)numberOfSamples && !(bool)m_MSAA) { + delete m_FinalPassFrameBuffer; + m_FinalPassFrameBuffer = new FrameBuffer(); + } + + m_MSAA = numberOfSamples; + + InitializeFrameBuffers(); + + +} + void DrawFinalPass::DrawModelRenderQueues(std::list>& jobs, RenderScene& scene) { GLuint forwardHandle = m_ForwardPlusProgram->GetHandle(); @@ -1366,7 +1407,14 @@ void DrawFinalPass::DrawSprites(std::list>&jobs, Rend glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); } - + if (spriteJob->ClampToBorder) { + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER); + } + else { + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); + } } else { glBindTexture(GL_TEXTURE_2D, m_ErrorTexture->m_Texture); } diff --git a/src/Engine/Rendering/FrameBuffer.cpp b/src/Engine/Rendering/FrameBuffer.cpp index d7843b2c..f436b25a 100644 --- a/src/Engine/Rendering/FrameBuffer.cpp +++ b/src/Engine/Rendering/FrameBuffer.cpp @@ -16,6 +16,7 @@ Texture2D::~Texture2D() if (m_ResourceHandle != 0) { glDeleteTextures(1, m_ResourceHandle); } + *m_ResourceHandle = 0; } Texture2DMultiSample::~Texture2DMultiSample() @@ -23,6 +24,7 @@ Texture2DMultiSample::~Texture2DMultiSample() if (m_ResourceHandle != 0) { glDeleteTextures(1, m_ResourceHandle); } + *m_ResourceHandle = 0; } RenderBuffer::~RenderBuffer() @@ -30,6 +32,7 @@ RenderBuffer::~RenderBuffer() if (m_ResourceHandle != 0) { glDeleteRenderbuffers(1, m_ResourceHandle); } + *m_ResourceHandle = 0; } Texture2DArray::~Texture2DArray() @@ -37,6 +40,7 @@ Texture2DArray::~Texture2DArray() if (m_ResourceHandle != 0) { glDeleteTextures(1, m_ResourceHandle); } + *m_ResourceHandle = 0; } diff --git a/src/Engine/Rendering/Renderer.cpp b/src/Engine/Rendering/Renderer.cpp index 387985c3..74e8671f 100644 --- a/src/Engine/Rendering/Renderer.cpp +++ b/src/Engine/Rendering/Renderer.cpp @@ -168,8 +168,10 @@ void Renderer::Draw(RenderFrame& frame) ImGui::SliderInt("SSAO Quality", &m_SSAO_Quality, 0, 3); ImGui::SliderInt("Glow Quality", &m_GLOW_Quality, 0, 3); + ImGui::SliderInt("MSAA Level", (int*)&m_MSAA_Level, 0, 16); m_SSAOPass->ChangeQuality(m_SSAO_Quality); m_DrawBloomPass->ChangeQuality(m_GLOW_Quality); + m_DrawFinalPass->setMSAA(m_MSAA_Level); GLERROR("SSAO Settings"); //clear buffer 0 glClearColor(0.f, 0.f, 0.f, 0.f); @@ -308,7 +310,7 @@ void Renderer::InitializeRenderPasses() m_SSAOPass = new SSAOPass(this, m_Config); m_ShadowPass = new ShadowPass(this); m_BlurHUDPass = new BlurHUD(this); - m_DrawFinalPass = new DrawFinalPass(this, m_LightCullingPass, m_CubeMapPass, m_SSAOPass, m_ShadowPass); + m_DrawFinalPass = new DrawFinalPass(this, m_LightCullingPass, m_CubeMapPass, m_SSAOPass, m_ShadowPass, m_Config); m_DrawScreenQuadPass = new DrawScreenQuadPass(this); m_DrawBloomPass = new DrawBloomPass(this, m_Config); m_DrawColorCorrectionPass = new DrawColorCorrectionPass(this); diff --git a/src/Engine/Rendering/ShadowPass.cpp b/src/Engine/Rendering/ShadowPass.cpp index ed9ccb7b..bfd2a863 100644 --- a/src/Engine/Rendering/ShadowPass.cpp +++ b/src/Engine/Rendering/ShadowPass.cpp @@ -226,8 +226,8 @@ void ShadowPass::Draw(RenderScene & scene) glFramebufferTextureLayer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, m_DepthMap, 0, i); - GLuint shaderHandle; - + GLuint shaderHandle = 0; + GLuint lastModel = 0; for (auto &job : scene.Jobs.DirectionalLight) { auto directionalLightJob = std::dynamic_pointer_cast(job); @@ -240,19 +240,6 @@ void ShadowPass::Draw(RenderScene & scene) //RadiusToLightspace(m_shadowFrusta[i]); m_LightProjection[i] = glm::ortho(m_shadowFrusta[i].LRBT[LEFT], m_shadowFrusta[i].LRBT[RIGHT], m_shadowFrusta[i].LRBT[BOTTOM], m_shadowFrusta[i].LRBT[TOP], m_NearFarPlane[NEAR], m_NearFarPlane[FAR]); - - m_ShadowProgram->Bind(); - shaderHandle = m_ShadowProgram->GetHandle(); - glUniformMatrix4fv(glGetUniformLocation(shaderHandle, "P"), 1, GL_FALSE, glm::value_ptr(m_LightProjection[i])); - glUniformMatrix4fv(glGetUniformLocation(shaderHandle, "V"), 1, GL_FALSE, glm::value_ptr(m_LightView[i])); - - m_ShadowProgramSkinned->Bind(); - shaderHandle = m_ShadowProgramSkinned->GetHandle(); - glUniformMatrix4fv(glGetUniformLocation(shaderHandle, "P"), 1, GL_FALSE, glm::value_ptr(m_LightProjection[i])); - glUniformMatrix4fv(glGetUniformLocation(shaderHandle, "V"), 1, GL_FALSE, glm::value_ptr(m_LightView[i])); - - - GLERROR("ShadowLight ERROR"); for (auto &objectJob : scene.Jobs.OpaqueObjects) { @@ -264,8 +251,10 @@ void ShadowPass::Draw(RenderScene & scene) } if(modelJob->Model->IsSkinned()) { - m_ShadowProgramSkinned->Bind(); - shaderHandle = m_ShadowProgramSkinned->GetHandle(); + if (shaderHandle != m_ShadowProgramSkinned->GetHandle()) { + m_ShadowProgramSkinned->Bind(); + shaderHandle = m_ShadowProgramSkinned->GetHandle(); + } std::vector frameBones; if (modelJob->BlendTree != nullptr) { @@ -276,15 +265,19 @@ void ShadowPass::Draw(RenderScene & scene) glUniformMatrix4fv(glGetUniformLocation(shaderHandle, "Bones"), frameBones.size(), GL_FALSE, glm::value_ptr(frameBones[0])); } else { - m_ShadowProgram->Bind(); - shaderHandle = m_ShadowProgram->GetHandle(); + if (shaderHandle != m_ShadowProgram->GetHandle()) { + m_ShadowProgram->Bind(); + shaderHandle = m_ShadowProgram->GetHandle(); + } } - glUniformMatrix4fv(glGetUniformLocation(shaderHandle, "M"), 1, GL_FALSE, glm::value_ptr(modelJob->Matrix)); + glUniformMatrix4fv(glGetUniformLocation(shaderHandle, "PVM"), 1, GL_FALSE, glm::value_ptr(m_LightProjection[i] * m_LightView[i] * modelJob->Matrix)); glUniform1f(glGetUniformLocation(shaderHandle, "Alpha"), 1.f); - glBindVertexArray(modelJob->Model->VAO); - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, modelJob->Model->ElementBuffer); + if (lastModel != modelJob->ModelID) { + glBindVertexArray(modelJob->Model->VAO); + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, modelJob->Model->ElementBuffer); + } glDrawElements(GL_TRIANGLES, modelJob->EndIndex - modelJob->StartIndex + 1, GL_UNSIGNED_INT, (void*)(modelJob->StartIndex * sizeof(unsigned int))); GLERROR("Shadow Draw ERROR"); @@ -301,8 +294,10 @@ void ShadowPass::Draw(RenderScene & scene) } if (modelJob->Model->IsSkinned()) { - m_ShadowProgramSkinned->Bind(); - shaderHandle = m_ShadowProgramSkinned->GetHandle(); + if (shaderHandle != m_ShadowProgramSkinned->GetHandle()) { + m_ShadowProgramSkinned->Bind(); + shaderHandle = m_ShadowProgramSkinned->GetHandle(); + } std::vector frameBones; if (modelJob->BlendTree != nullptr) { @@ -313,11 +308,13 @@ void ShadowPass::Draw(RenderScene & scene) glUniformMatrix4fv(glGetUniformLocation(shaderHandle, "Bones"), frameBones.size(), GL_FALSE, glm::value_ptr(frameBones[0])); } else { - m_ShadowProgram->Bind(); - shaderHandle = m_ShadowProgram->GetHandle(); + if (shaderHandle != m_ShadowProgram->GetHandle()) { + m_ShadowProgram->Bind(); + shaderHandle = m_ShadowProgram->GetHandle(); + } } - glUniformMatrix4fv(glGetUniformLocation(shaderHandle, "M"), 1, GL_FALSE, glm::value_ptr(modelJob->Matrix)); + glUniformMatrix4fv(glGetUniformLocation(shaderHandle, "PVM"), 1, GL_FALSE, glm::value_ptr(m_LightProjection[i] * m_LightView[i] * modelJob->Matrix)); glUniform1f(glGetUniformLocation(shaderHandle, "Alpha"), modelJob->Color.a); if (m_TexturedShadows) { @@ -345,9 +342,10 @@ void ShadowPass::Draw(RenderScene & scene) } } } - - glBindVertexArray(modelJob->Model->VAO); - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, modelJob->Model->ElementBuffer); + if (lastModel != modelJob->ModelID) { + glBindVertexArray(modelJob->Model->VAO); + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, modelJob->Model->ElementBuffer); + } glDrawElements(GL_TRIANGLES, modelJob->EndIndex - modelJob->StartIndex + 1, GL_UNSIGNED_INT, (void*)(modelJob->StartIndex * sizeof(unsigned int))); GLERROR("Shadow Draw ERROR"); From 958850903a6d78cd721014072fc4945c7df990da Mon Sep 17 00:00:00 2001 From: Teejoon Date: Sun, 13 Mar 2016 00:08:49 +0100 Subject: [PATCH 4/9] Moved ViewSpacePosition calculation from fragmenst shader to vertexshader --- resources/Shaders/ExplosionEffect.frag.glsl | 5 +---- resources/Shaders/ExplosionEffect.geom.glsl | 6 +++++- resources/Shaders/ForwardPlus.frag.glsl | 8 +++----- resources/Shaders/ForwardPlus.vert.glsl | 3 +++ resources/Shaders/ForwardPlusShieldCheck.frag.glsl | 6 +++--- resources/Shaders/ForwardPlusSkinned.vert.glsl | 3 +++ resources/Shaders/ForwardPlusSplatMapRGB.frag.glsl | 8 +++----- .../ForwardPlusSplatMapRGBShieldCheck.frag.glsl | 8 +++----- src/Engine/Rendering/DrawFinalPass.cpp | 10 ---------- 9 files changed, 24 insertions(+), 33 deletions(-) diff --git a/resources/Shaders/ExplosionEffect.frag.glsl b/resources/Shaders/ExplosionEffect.frag.glsl index 32ababe5..d506e70f 100644 --- a/resources/Shaders/ExplosionEffect.frag.glsl +++ b/resources/Shaders/ExplosionEffect.frag.glsl @@ -1,14 +1,11 @@ #version 430 -uniform mat4 M; -uniform mat4 V; -uniform mat4 P; uniform vec4 Color; - uniform sampler2D texture0; in VertexData{ vec3 Position; + vec4 ViewSpacePosition; vec3 Normal; vec2 TextureCoordinate; vec4 DiffuseColor; diff --git a/resources/Shaders/ExplosionEffect.geom.glsl b/resources/Shaders/ExplosionEffect.geom.glsl index 420bbaae..5a355fac 100644 --- a/resources/Shaders/ExplosionEffect.geom.glsl +++ b/resources/Shaders/ExplosionEffect.geom.glsl @@ -2,6 +2,7 @@ #define MAX_SPLITS 4 +uniform mat4 PVM; uniform mat4 M; uniform mat4 V; uniform mat4 P; @@ -23,6 +24,7 @@ uniform float ColorDistanceScalar; in VertexData{ vec3 Position; + vec4 ViewSpacePosition; vec3 Normal; vec3 Tangent; vec3 BiTangent; @@ -34,6 +36,7 @@ in VertexData{ out VertexData{ vec3 Position; + vec4 ViewSpacePosition; vec3 Normal; vec3 Tangent; vec3 BiTangent; @@ -101,6 +104,7 @@ void PassThingsThrough(int index) // pass through vertex data Output.Normal = Input[index].Normal; Output.Position = Input[index].Position; + Output.ViewSpacePosition = Input[index].ViewSpacePosition; Output.TextureCoordinate = Input[index].TextureCoordinate; Output.Tangent = Input[index].Tangent; Output.BiTangent = Input[index].BiTangent; @@ -175,7 +179,7 @@ void main() } // convert to window space - gl_Position = P * V * M * vec4(ExplodedPosition, 1.0); + gl_Position = PVM * vec4(ExplodedPosition, 1.0); EmitVertex(); } } \ No newline at end of file diff --git a/resources/Shaders/ForwardPlus.frag.glsl b/resources/Shaders/ForwardPlus.frag.glsl index 112d8de5..272d7c64 100644 --- a/resources/Shaders/ForwardPlus.frag.glsl +++ b/resources/Shaders/ForwardPlus.frag.glsl @@ -2,8 +2,6 @@ #define MIN_AMBIENT_LIGHT 0.3 #define MAX_SPLITS 4 - -uniform mat4 VM; uniform mat4 M; uniform mat4 V; uniform mat4 P; @@ -65,6 +63,7 @@ layout (std430, binding = 4) buffer LightIndexBuffer in VertexData{ vec3 Position; + vec4 ViewSpacePosition; vec3 Normal; vec3 Tangent; vec3 BiTangent; @@ -302,11 +301,10 @@ void main() vec4 diffuseTexel = texture2D(DiffuseTexture, Input.TextureCoordinate * DiffuseUVRepeat); vec4 glowTexel = texture2D(GlowMapTexture, Input.TextureCoordinate * GlowUVRepeat); vec4 specularTexel = texture2D(SpecularMapTexture, Input.TextureCoordinate * SpecularUVRepeat); - vec4 position = VM * vec4(Input.Position, 1.0); vec4 normal = V * CalcNormalMappedValue(Input.Normal, Input.Tangent, Input.BiTangent, Input.TextureCoordinate * NormalUVRepeat, NormalMapTexture); normal = normalize(normal); //vec4 normal = normalize(V * vec4(Input.Normal, 0.0)); - vec4 viewVec = normalize(-position); + vec4 viewVec = normalize(-Input.ViewSpacePosition); vec3 I = normalize(vec3(M * vec4(Input.Position, 1.0)) - CameraPosition); vec3 R = reflect(-I, Input.Normal); //R = vec3(P * vec4(R, 1.0)); @@ -333,7 +331,7 @@ void main() LightResult light_result; //These if statements should be removed. if(light.Type == 1) { // point - light_result = CalcPointLightSource(V * light.Position, light.Radius, light.Color, light.Intensity, viewVec, position, normal, light.Falloff); + light_result = CalcPointLightSource(V * light.Position, light.Radius, light.Color, light.Intensity, viewVec, Input.ViewSpacePosition, normal, light.Falloff); } else if (light.Type == 2) { //Directional int DepthMapIndex = getShadowIndex(FarDistance); light_result = CalcDirectionalLightSource(V * light.Direction, light.Color, light.Intensity, viewVec, normal); diff --git a/resources/Shaders/ForwardPlus.vert.glsl b/resources/Shaders/ForwardPlus.vert.glsl index 70cb6ab6..783e2f92 100644 --- a/resources/Shaders/ForwardPlus.vert.glsl +++ b/resources/Shaders/ForwardPlus.vert.glsl @@ -1,5 +1,6 @@ #version 430 uniform mat4 PVM; +uniform mat4 VM; #define MAX_SPLITS 4 uniform mat4 TIM; @@ -17,6 +18,7 @@ layout(location = 4) in vec2 TextureCoords; out VertexData{ vec3 Position; + vec4 ViewSpacePosition; vec3 Normal; vec3 Tangent; vec3 BiTangent; @@ -31,6 +33,7 @@ void main() gl_Position = PVM * vec4(Position, 1.0); //mat4 TIM = transpose(inverse(M)); Output.Position = Position; + Output.ViewSpacePosition = VM * vec4(Position, 1.0); Output.TextureCoordinate = TextureCoords; Output.Normal = vec3(TIM * vec4(Normal, 0.0)); Output.Tangent = vec3(TIM * vec4(Tangent, 0.0)); diff --git a/resources/Shaders/ForwardPlusShieldCheck.frag.glsl b/resources/Shaders/ForwardPlusShieldCheck.frag.glsl index dd407078..e2075c33 100644 --- a/resources/Shaders/ForwardPlusShieldCheck.frag.glsl +++ b/resources/Shaders/ForwardPlusShieldCheck.frag.glsl @@ -65,6 +65,7 @@ layout (std430, binding = 4) buffer LightIndexBuffer in VertexData{ vec3 Position; + vec4 ViewSpacePosition; vec3 Normal; vec3 Tangent; vec3 BiTangent; @@ -141,11 +142,10 @@ void main() vec4 diffuseTexel = texture2D(DiffuseTexture, Input.TextureCoordinate * DiffuseUVRepeat); vec4 glowTexel = texture2D(GlowMapTexture, Input.TextureCoordinate * GlowUVRepeat); vec4 specularTexel = texture2D(SpecularMapTexture, Input.TextureCoordinate * SpecularUVRepeat); - vec4 position = VM * vec4(Input.Position, 1.0); vec4 normal = V * CalcNormalMappedValue(Input.Normal, Input.Tangent, Input.BiTangent, Input.TextureCoordinate * NormalUVRepeat, NormalMapTexture); normal = normalize(normal); //vec4 normal = normalize(V * vec4(Input.Normal, 0.0)); - vec4 viewVec = normalize(-position); + vec4 viewVec = normalize(-Input.ViewSpacePosition); vec3 I = normalize(vec3(M * vec4(Input.Position, 1.0)) - CameraPosition); vec3 R = reflect(-I, Input.Normal); //R = vec3(P * vec4(R, 1.0)); @@ -170,7 +170,7 @@ void main() LightResult light_result; //These if statements should be removed. if(light.Type == 1) { // point - light_result = CalcPointLightSource(V * light.Position, light.Radius, light.Color, light.Intensity, viewVec, position, normal, light.Falloff); + light_result = CalcPointLightSource(V * light.Position, light.Radius, light.Color, light.Intensity, viewVec, Input.ViewSpacePosition, normal, light.Falloff); } else if (light.Type == 2) { //Directional light_result = CalcDirectionalLightSource(V * light.Direction, light.Color, light.Intensity, viewVec, normal); } diff --git a/resources/Shaders/ForwardPlusSkinned.vert.glsl b/resources/Shaders/ForwardPlusSkinned.vert.glsl index c40a1145..0a64c124 100644 --- a/resources/Shaders/ForwardPlusSkinned.vert.glsl +++ b/resources/Shaders/ForwardPlusSkinned.vert.glsl @@ -3,6 +3,7 @@ #define MAX_SPLITS 4 uniform mat4 PVM; +uniform mat4 VM; uniform mat4 TIM; uniform mat4 M; uniform mat4 V; @@ -21,6 +22,7 @@ layout(location = 6) in vec4 BoneWeights; out VertexData{ vec3 Position; + vec4 ViewSpacePosition; vec3 Normal; vec3 Tangent; vec3 BiTangent; @@ -44,6 +46,7 @@ void main() gl_Position = PVM*boneTransform * vec4(Position, 1.0); Output.Position = (boneTransform * vec4(Position, 1.0)).xyz; + Output.ViewSpacePosition = VM * vec4(Position, 1.0); Output.TextureCoordinate = TextureCoords; Output.Normal = vec3(M * boneTransform * vec4(Normal, 0.0)); Output.Tangent = vec3(M * vec4(Tangent, 0.0)); diff --git a/resources/Shaders/ForwardPlusSplatMapRGB.frag.glsl b/resources/Shaders/ForwardPlusSplatMapRGB.frag.glsl index d20a0c1c..20187554 100644 --- a/resources/Shaders/ForwardPlusSplatMapRGB.frag.glsl +++ b/resources/Shaders/ForwardPlusSplatMapRGB.frag.glsl @@ -2,8 +2,6 @@ #define MIN_AMBIENT_LIGHT 0.3 #define MAX_SPLITS 4 - -uniform mat4 VM; uniform mat4 M; uniform mat4 V; uniform mat4 P; @@ -82,6 +80,7 @@ layout (std430, binding = 4) buffer LightIndexBuffer in VertexData{ vec3 Position; + vec4 ViewSpacePosition; vec3 Normal; vec3 Tangent; vec3 BiTangent; @@ -362,13 +361,12 @@ void main() GlowUVRepeat1, GlowUVRepeat2, GlowUVRepeat3); vec4 specularTexel = CalcBlendedTexel(splatTexel, SpecularMapTexture1, SpecularMapTexture2, SpecularMapTexture3, SpecularUVRepeat1, SpecularUVRepeat2, SpecularUVRepeat3); - vec4 position = VM * vec4(Input.Position, 1.0); //vec4 normal = V * CalcNormalMappedValue(Input.Normal, Input.Tangent, Input.BiTangent, Input.TextureCoordinate, SplatMapTexture); vec4 normal = V * CalcBlendedNormal(splatTexel, NormalMapTexture1, NormalMapTexture2, NormalMapTexture3, NormalUVRepeat1, NormalUVRepeat2, NormalUVRepeat3); normal = normalize(normal); //vec4 normal = normalize(V * vec4(Input.Normal, 0.0)); - vec4 viewVec = normalize(-position); + vec4 viewVec = normalize(-Input.ViewSpacePosition); vec2 tilePos; tilePos.x = int(gl_FragCoord.x/TILE_SIZE); @@ -391,7 +389,7 @@ void main() LightResult light_result; //These if statements should be removed. if(light.Type == 1) { // point - light_result = CalcPointLightSource(V * light.Position, light.Radius, light.Color, light.Intensity, viewVec, position, normal, light.Falloff); + light_result = CalcPointLightSource(V * light.Position, light.Radius, light.Color, light.Intensity, viewVec, Input.ViewSpacePosition, normal, light.Falloff); } else if (light.Type == 2) { //Directional int DepthMapIndex = getShadowIndex(FarDistance); light_result = CalcDirectionalLightSource(V * light.Direction, light.Color, light.Intensity, viewVec, normal); diff --git a/resources/Shaders/ForwardPlusSplatMapRGBShieldCheck.frag.glsl b/resources/Shaders/ForwardPlusSplatMapRGBShieldCheck.frag.glsl index d1e75403..17b88467 100644 --- a/resources/Shaders/ForwardPlusSplatMapRGBShieldCheck.frag.glsl +++ b/resources/Shaders/ForwardPlusSplatMapRGBShieldCheck.frag.glsl @@ -2,8 +2,6 @@ #define MIN_AMBIENT_LIGHT 0.3 #define MAX_SPLITS 4 - -uniform mat4 VM; uniform mat4 M; uniform mat4 V; uniform mat4 P; @@ -80,6 +78,7 @@ layout (std430, binding = 4) buffer LightIndexBuffer in VertexData{ vec3 Position; + vec4 ViewSpacePosition; vec3 Normal; vec3 Tangent; vec3 BiTangent; @@ -193,13 +192,12 @@ void main() GlowUVRepeat1, GlowUVRepeat2, GlowUVRepeat3); vec4 specularTexel = CalcBlendedTexel(splatTexel, SpecularMapTexture1, SpecularMapTexture2, SpecularMapTexture3, SpecularUVRepeat1, SpecularUVRepeat2, SpecularUVRepeat3); - vec4 position = VM * vec4(Input.Position, 1.0); //vec4 normal = V * CalcNormalMappedValue(Input.Normal, Input.Tangent, Input.BiTangent, Input.TextureCoordinate, SplatMapTexture); vec4 normal = V * CalcBlendedNormal(splatTexel, NormalMapTexture1, NormalMapTexture2, NormalMapTexture3, NormalUVRepeat1, NormalUVRepeat2, NormalUVRepeat3); normal = normalize(normal); //vec4 normal = normalize(V * vec4(Input.Normal, 0.0)); - vec4 viewVec = normalize(-position); + vec4 viewVec = normalize(-Input.ViewSpacePosition); vec2 tilePos; tilePos.x = int(gl_FragCoord.x/TILE_SIZE); @@ -220,7 +218,7 @@ void main() LightResult light_result; //These if statements should be removed. if(light.Type == 1) { // point - light_result = CalcPointLightSource(V * light.Position, light.Radius, light.Color, light.Intensity, viewVec, position, normal, light.Falloff); + light_result = CalcPointLightSource(V * light.Position, light.Radius, light.Color, light.Intensity, viewVec, Input.ViewSpacePosition, normal, light.Falloff); } else if (light.Type == 2) { //Directional light_result = CalcDirectionalLightSource(V * light.Direction, light.Color, light.Intensity, viewVec, normal); } diff --git a/src/Engine/Rendering/DrawFinalPass.cpp b/src/Engine/Rendering/DrawFinalPass.cpp index 970f40a1..3b355078 100644 --- a/src/Engine/Rendering/DrawFinalPass.cpp +++ b/src/Engine/Rendering/DrawFinalPass.cpp @@ -1324,11 +1324,6 @@ void DrawFinalPass::DrawToDepthStencilBuffer(std::listGetHandle()) { m_FillDepthStencilBufferSkinnedProgram->Bind(); lastShader = m_FillDepthStencilBufferSkinnedProgram->GetHandle(); - glUniform1i(glGetUniformLocation(shaderSkinnedHandle, "SSAOQuality"), m_SSAOPass->TextureQuality()); - glUniformMatrix4fv(glGetUniformLocation(shaderSkinnedHandle, "V"), 1, GL_FALSE, glm::value_ptr(scene.Camera->ViewMatrix())); - glUniformMatrix4fv(glGetUniformLocation(shaderSkinnedHandle, "P"), 1, GL_FALSE, glm::value_ptr(scene.Camera->ProjectionMatrix())); - glUniform2f(glGetUniformLocation(shaderSkinnedHandle, "ScreenDimensions"), m_Renderer->GetViewportSize().Width, m_Renderer->GetViewportSize().Height); - glUniform4fv(glGetUniformLocation(shaderSkinnedHandle, "AmbientColor"), 1, glm::value_ptr(scene.AmbientColor)); GLERROR("Bind Uniforms 1"); } @@ -1347,11 +1342,6 @@ void DrawFinalPass::DrawToDepthStencilBuffer(std::listGetHandle()) { m_FillDepthStencilBufferProgram->Bind(); lastShader = m_FillDepthStencilBufferProgram->GetHandle(); - glUniform1i(glGetUniformLocation(shaderHandle, "SSAOQuality"), m_SSAOPass->TextureQuality()); - glUniformMatrix4fv(glGetUniformLocation(shaderHandle, "V"), 1, GL_FALSE, glm::value_ptr(scene.Camera->ViewMatrix())); - glUniformMatrix4fv(glGetUniformLocation(shaderHandle, "P"), 1, GL_FALSE, glm::value_ptr(scene.Camera->ProjectionMatrix())); - glUniform2f(glGetUniformLocation(shaderHandle, "ScreenDimensions"), m_Renderer->GetViewportSize().Width, m_Renderer->GetViewportSize().Height); - glUniform4fv(glGetUniformLocation(shaderHandle, "AmbientColor"), 1, glm::value_ptr(scene.AmbientColor)); GLERROR("Bind Uniforms 2"); } From ec7ab417e6ba9ef1bb4f81f57491efcdb1cd701b Mon Sep 17 00:00:00 2001 From: Teejoon Date: Sun, 13 Mar 2016 01:47:37 +0100 Subject: [PATCH 5/9] Added so that mipmaps can have diferant formats. Bloom also uses RGB8 on all texture now --- include/Engine/Rendering/Util/CommonFunctions.h | 2 +- src/Engine/Rendering/DrawBloomPass.cpp | 10 +++++----- src/Engine/Rendering/Util/CommonFunctions.cpp | 4 ++-- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/include/Engine/Rendering/Util/CommonFunctions.h b/include/Engine/Rendering/Util/CommonFunctions.h index 94cf8683..3ef1627a 100644 --- a/include/Engine/Rendering/Util/CommonFunctions.h +++ b/include/Engine/Rendering/Util/CommonFunctions.h @@ -27,7 +27,7 @@ Texture* TryLoadResource(std::string path) void GenerateTexture(GLuint* texture, GLenum wrapping, GLenum filtering, glm::vec2 dimensions, GLint internalFormat, GLint format, GLenum type); void GenerateMultiSampleTexture(GLuint* texture, int numSamples, glm::vec2 dimensions, GLint internalFormat); -void GenerateMipMapTexture(GLuint* texture, GLenum wrapping, glm::vec2 dimensions, GLint format, GLenum type, GLint numMipMaps); +void GenerateMipMapTexture(GLuint* texture, GLenum wrapping, glm::vec2 dimensions, GLint internalFormat, GLint format, GLenum type, GLint numMipMaps); void DeleteTexture(GLuint* texture); }; diff --git a/src/Engine/Rendering/DrawBloomPass.cpp b/src/Engine/Rendering/DrawBloomPass.cpp index e0c6af66..f8b50899 100644 --- a/src/Engine/Rendering/DrawBloomPass.cpp +++ b/src/Engine/Rendering/DrawBloomPass.cpp @@ -76,12 +76,12 @@ void DrawBloomPass::InitializeShaderPrograms() void DrawBloomPass::InitializeBuffers() { CommonFunctions::GenerateMipMapTexture( - &m_GaussianTexture_horiz, GL_CLAMP_TO_BORDER, glm::vec2(m_Renderer->GetViewportSize().Width, m_Renderer->GetViewportSize().Height) - , GL_RGB, GL_FLOAT, m_BloomLod); + &m_GaussianTexture_horiz, GL_CLAMP_TO_BORDER, glm::vec2(m_Renderer->GetViewportSize().Width, m_Renderer->GetViewportSize().Height), + GL_RGB8, GL_RGB, GL_FLOAT, m_BloomLod); CommonFunctions::GenerateMipMapTexture( - &m_GaussianTexture_vert, GL_CLAMP_TO_BORDER, glm::vec2(m_Renderer->GetViewportSize().Width, m_Renderer->GetViewportSize().Height) - , GL_RGB, GL_FLOAT, m_BloomLod); - CommonFunctions::GenerateTexture(&m_FinalGaussianTexture, GL_CLAMP_TO_BORDER, GL_LINEAR, glm::vec2(m_Renderer->GetViewportSize().Width, m_Renderer->GetViewportSize().Height), GL_RGB16F, GL_RGB, GL_FLOAT); + &m_GaussianTexture_vert, GL_CLAMP_TO_BORDER, glm::vec2(m_Renderer->GetViewportSize().Width, m_Renderer->GetViewportSize().Height), + GL_RGB8, GL_RGB, GL_FLOAT, m_BloomLod); + CommonFunctions::GenerateTexture(&m_FinalGaussianTexture, GL_CLAMP_TO_BORDER, GL_LINEAR, glm::vec2(m_Renderer->GetViewportSize().Width, m_Renderer->GetViewportSize().Height), GL_RGB8, GL_RGB, GL_FLOAT); if (m_GaussianCombineBuffer.GetHandle() == 0) { m_GaussianCombineBuffer.AddResource(std::shared_ptr(new Texture2D(&m_FinalGaussianTexture, GL_COLOR_ATTACHMENT0))); diff --git a/src/Engine/Rendering/Util/CommonFunctions.cpp b/src/Engine/Rendering/Util/CommonFunctions.cpp index 7788c955..973f9f9e 100644 --- a/src/Engine/Rendering/Util/CommonFunctions.cpp +++ b/src/Engine/Rendering/Util/CommonFunctions.cpp @@ -24,12 +24,12 @@ void CommonFunctions::GenerateMultiSampleTexture(GLuint* texture, int numSamples } -void CommonFunctions::GenerateMipMapTexture(GLuint* texture, GLenum wrapping, glm::vec2 dimensions, GLint format, GLenum type, GLint numMipMaps) +void CommonFunctions::GenerateMipMapTexture(GLuint* texture, GLenum wrapping, glm::vec2 dimensions, GLint internalFormat, GLint format, GLenum type, GLint numMipMaps) { glDeleteTextures(1, texture); glGenTextures(1, texture); glBindTexture(GL_TEXTURE_2D, *texture); - glTexStorage2D(GL_TEXTURE_2D, numMipMaps, GL_RGBA8, dimensions.x, dimensions.y); + glTexStorage2D(GL_TEXTURE_2D, numMipMaps, internalFormat, dimensions.x, dimensions.y); //glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, dimensions.x, dimensions.y, format, type, NULL); GLERROR("MipMap Texture glTexSubImage2D failed"); glGenerateMipmap(GL_TEXTURE_2D); From 5f11d1e066382e7837a0c8e683e26c660ec635f5 Mon Sep 17 00:00:00 2001 From: Teejoon Date: Sun, 13 Mar 2016 16:38:50 +0100 Subject: [PATCH 6/9] fix --- resources/Schema/Entities/CP_Rocky2.xml | 15851 +++++++++++----------- src/Engine/Rendering/DrawBloomPass.cpp | 2 +- 2 files changed, 7991 insertions(+), 7862 deletions(-) diff --git a/resources/Schema/Entities/CP_Rocky2.xml b/resources/Schema/Entities/CP_Rocky2.xml index 8cc356e5..fb429f47 100644 --- a/resources/Schema/Entities/CP_Rocky2.xml +++ b/resources/Schema/Entities/CP_Rocky2.xml @@ -3,7 +3,7 @@ - 2.0628981578865933 + 2.8900737869089426 @@ -33,6 +33,18 @@ + + + + + 2 + Models/Props/Walls/SciFiWallMedium.mesh + false + + + + + @@ -81,18 +93,6 @@ - - - - - 2 - Models/Props/Walls/SciFiWallMedium.mesh - false - - - - - @@ -690,6 +690,19 @@ + + + + + Models/Highgrounds/Hg6.mesh + + + + + + + + @@ -790,19 +803,6 @@ - - - - - Models/Highgrounds/Hg6.mesh - - - - - - - - @@ -1621,11 +1621,11 @@ 12 - + - + @@ -1677,11 +1677,11 @@ 12 - + - + @@ -1749,11 +1749,11 @@ 12 - + - + @@ -1926,7 +1926,7 @@ - + @@ -2239,7 +2239,7 @@ Models/Props/Walls/BigWallBlue.mesh - + @@ -2267,7 +2267,7 @@ Models/Props/Walls/BigWallBlue.mesh - + @@ -2436,7 +2436,7 @@ Models/Props/Walls/BigWallBlue.mesh - + @@ -2482,7 +2482,7 @@ true - + @@ -2826,6 +2826,152 @@ + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/MediumStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + Models/Props/Stones/BigStone.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/MediumStone2.mesh + + + + + + + + @@ -3013,6 +3159,20 @@ + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + @@ -3349,19 +3509,6 @@ - - - - - Models/Props/Stones/MediumStone2.mesh - - - - - - - - @@ -3376,20 +3523,6 @@ - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - - @@ -3403,20 +3536,6 @@ - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - - @@ -3431,19 +3550,6 @@ - - - - - Models/Props/Stones/SmallStone2.mesh - - - - - - - - @@ -3457,19 +3563,6 @@ - - - - - Models/Props/Stones/SmallStone2.mesh - - - - - - - - @@ -3484,20 +3577,6 @@ - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - - @@ -3539,19 +3618,6 @@ - - - - - Models/Props/Stones/BigStone.mesh - - - - - - - - @@ -3566,19 +3632,6 @@ - - - - - Models/Props/Stones/MediumStone2.mesh - - - - - - - - @@ -3592,19 +3645,6 @@ - - - - - Models/Props/Stones/SmallStone2.mesh - - - - - - - - @@ -3618,19 +3658,6 @@ - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - @@ -3645,19 +3672,6 @@ - - - - - Models/Props/Stones/SmallStone2.mesh - - - - - - - - @@ -3672,20 +3686,6 @@ - - - - - Models/Props/Stones/SmallStone2.mesh - - - - - - - - - @@ -3700,8 +3700,21 @@ Models/Props/Stones/AssaultHolder.mesh - - + + + + + + + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + @@ -3719,19 +3732,6 @@ - - - - - Models/Props/Stones/AssaultHolder.mesh - - - - - - - - @@ -3762,10 +3762,11 @@ Models/Props/PickUps/PickUpHolder.mesh + false - - + + @@ -3774,11 +3775,11 @@ 2 - + - + @@ -3800,61 +3801,7 @@ - - - - - - - - - - - - - - - Models/Props/PickUps/PickUpHolder.mesh - false - - - - - - - - - - - - 2 - - - - - - - - - - - - - 8 - - - - Models/Props/PickUps/AmmoPickUp.mesh - - - - - 1.5 - 3 - - - - + @@ -3882,11 +3829,11 @@ 2 - + - + @@ -3908,7 +3855,114 @@ - + + + + + + + + + + + + + + + Models/Props/PickUps/PickUpHolder.mesh + + + + + + + + + + + + 2 + + + + + + + + + + + + + 8 + + + + Models/Props/PickUps/HealthPickUp.mesh + + + + + 1.5 + 3 + + + + + + + + + + + + + + + + + + Models/Props/PickUps/PickUpHolder.mesh + false + + + + + + + + + + + + 2 + + + + + + + + + + + + + 8 + + + + Models/Props/PickUps/AmmoPickUp.mesh + + + + + 1.5 + 3 + + + + @@ -3935,11 +3989,11 @@ 2 - + - + @@ -3961,61 +4015,7 @@ - - - - - - - - - - - - - - - Models/Props/PickUps/PickUpHolder.mesh - false - - - - - - - - - - - - 2 - - - - - - - - - - - - - 8 - - - - Models/Props/PickUps/HealthPickUp.mesh - - - - - 1.5 - 3 - - - - + @@ -4043,11 +4043,11 @@ 2 - + - + @@ -4069,7 +4069,7 @@ - + @@ -4092,64 +4092,6 @@ - - - - - Models/Props/Pillars/SciFiPillar2Red.mesh - - - - - - - - - - - - - - 2 - Models/Props/Pillars/SciFiPillar2Red.mesh - - - - - - - - - - - - - 2 - Models/Props/Pillars/SciFiPillar2Red.mesh - - - - - - - - - - - - - - 2 - Models/Props/Pillars/SciFiPillar2Red.mesh - - - - - - - - - @@ -4158,9 +4100,23 @@ Models/Props/Pillars/SciFiPillar1Red.mesh - - - + + + + + + + + + + + 2 + Models/Props/Pillars/SciFiPillar3Red.mesh + + + + + @@ -4188,36 +4144,8 @@ Models/Props/Pillars/SciFiPillar2Red.mesh - - - - - - - - - - - 2 - Models/Props/Pillars/SciFiPillar1Red.mesh - - - - - - - - - - - - - 2 - Models/Props/Pillars/SciFiPillar2Red.mesh - - - - + + @@ -4245,8 +4173,23 @@ Models/Props/Pillars/SciFiPillar2Red.mesh - - + + + + + + + + + + + + Models/Props/Pillars/SciFiPillar2Red.mesh + + + + + @@ -4256,12 +4199,69 @@ 2 - Models/Props/Pillars/SciFiPillar3Red.mesh + Models/Props/Pillars/SciFiPillar2Red.mesh - - - + + + + + + + + + + + + 2 + Models/Props/Pillars/SciFiPillar1Red.mesh + + + + + + + + + + + + + + 2 + Models/Props/Pillars/SciFiPillar2Red.mesh + + + + + + + + + + + + + 2 + Models/Props/Pillars/SciFiPillar2Red.mesh + + + + + + + + + + + + + 2 + Models/Props/Pillars/SciFiPillar2Red.mesh + + + + @@ -4292,12 +4292,13 @@ - Models/Props/Stones/AssaultHolder.mesh + 3 + Models/Props/Stones/ShinyStoneCrystalBlue.mesh - - - + + + @@ -4320,11 +4321,25 @@ - Models/Props/Stones/AssaultHolder.mesh + 3 + Models/Props/Stones/ShinyStoneCrystalBlue.mesh - - + + + + + + + + + + + Models/Props/Pillars/Bridge_Pillar1_SciFi_Blue.mesh + + + + @@ -4337,9 +4352,138 @@ Models/Props/Stones/ShinyStoneCrystalBlue.mesh - - - + + + + + + + + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + + + + + + + + + + Models/Props/Flora/HangingBush2.mesh + true + + + + + + + + + + + + + Models/Props/Flora/HangingBush4.mesh + true + + + + + + + + + + + + Models/Props/Flora/HangingBush4.mesh + true + + + + + + + + + + + + Models/Props/Flora/HangingBush4.mesh + true + false + + + + + + + + + + + + + + + + 3 + Models/Props/Stones/ShinyStoneCrystalBlue.mesh + + + + + + + + + + + + + Models/Props/Pillars/Bridge_Pillar1_SciFi_Blue.mesh + + + + + + + + + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + + + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + @@ -4358,19 +4502,6 @@ - - - - - Models/Props/Pillars/Bridge_Pillar1_SciFi_Blue.mesh - - - - - - - - @@ -4386,20 +4517,6 @@ - - - - - 3 - Models/Props/Stones/ShinyStoneCrystalBlue.mesh - - - - - - - - @@ -4415,21 +4532,6 @@ - - - - - 3 - Models/Props/Stones/ShinyStoneCrystalBlue.mesh - - - - - - - - - @@ -4443,20 +4545,6 @@ - - - - - 3 - Models/Props/Stones/ShinyStoneCrystalBlue.mesh - - - - - - - - @@ -4472,68 +4560,6 @@ - - - - - - - - - Models/Props/Flora/HangingBush4.mesh - true - - - - - - - - - - - - Models/Props/Flora/HangingBush4.mesh - true - - - - - - - - - - - - Models/Props/Flora/HangingBush4.mesh - true - false - - - - - - - - - - - - - Models/Props/Flora/HangingBush2.mesh - true - - - - - - - - - - - @@ -4547,19 +4573,6 @@ - - - - - Models/Props/Stones/AssaultHolder.mesh - - - - - - - - @@ -4573,19 +4586,6 @@ - - - - - Models/Props/Pillars/Bridge_Pillar1_SciFi_Blue.mesh - - - - - - - - @@ -4632,150 +4632,7 @@ - - - - - - - - - - Models/Props/Pillars/StonePillar.mesh - - - - - - - - - - - - - Models/Core/UnitPlane.mesh - - true - - - - - - - - - - - - - - - - - - - Models/Props/Walls/SpecialWall1.mesh - - - - - - - - - - - - - - Models/Props/Walls/SpecialWall1.mesh - - - - - - - - - - - - - - Models/Props/Walls/SpecialWall1.mesh - - - - - - - - - - - - - - Models/Props/Walls/SpecialWall1.mesh - - - - - - - - - - - - - - - - - - - - - Models/Props/Stones/AssaultHolder.mesh - - - - - - - - - - - - - Models/Props/Stones/AssaultHolder.mesh - - - - - - - - - - - - - Models/Props/Stones/AssaultHolder.mesh - - - - - - - - - - - + @@ -4785,12 +4642,12 @@ 2 - Models/Props/Pillars/SciFiPillar1Red.mesh + Models/Props/Stones/ShinyStoneCrystalRed.mesh - - - + + + @@ -4799,11 +4656,13 @@ - Models/Props/Pillars/SciFiPillar2Red.mesh + 2 + Models/Props/Stones/ShinyStoneCrystalRed.mesh - - + + + @@ -4812,12 +4671,12 @@ - Models/Props/Pillars/SciFiPillar2Red.mesh + 2 + Models/Props/Stones/ShinyStoneCrystalRed.mesh - - - + + @@ -4826,12 +4685,13 @@ - Models/Props/Pillars/StonePillar.mesh + 3 + Models/Props/Stones/ShinyStoneCrystalRed.mesh - - - + + + @@ -4840,12 +4700,12 @@ - Models/Props/Pillars/StonePillar.mesh + 2 + Models/Props/Stones/ShinyStoneCrystalRed.mesh - - - + + @@ -4854,10 +4714,133 @@ - Models/Props/Pillars/StonePillar.mesh + 2 + Models/Props/Stones/ShinyStoneCrystalRed.mesh - + + + + + + + + + + + + 3 + Models/Props/Stones/ShinyStoneCrystalRed.mesh + + + + + + + + + + + + + + 3 + Models/Props/Stones/ShinyStoneCrystalRed.mesh + + + + + + + + + + + + + + 3 + Models/Props/Stones/ShinyStoneCrystalRed.mesh + + + + + + + + + + + + + + 3 + Models/Props/Stones/ShinyStoneCrystalRed.mesh + + + + + + + + + + + + + + 2 + Models/Props/Stones/ShinyStoneCrystalRed.mesh + + + + + + + + + + + + + + 2 + Models/Props/Stones/ShinyStoneCrystalRed.mesh + + + + + + + + + + + + + + 2 + Models/Props/Stones/ShinyStoneCrystalRed.mesh + + + + + + + + + + + + + + 3 + Models/Props/Stones/ShinyStoneCrystalRed.mesh + + + + + @@ -4869,21 +4852,6 @@ - - - - - 1.5 - Models/Props/Bridges/Bridge1_SciFi_Red.mesh - - - - - - - - - @@ -4904,8 +4872,8 @@ Models/Props/Pillars/Bridge_Pillar1_SciFi_Red.mesh - - + + @@ -4917,21 +4885,8 @@ Models/Props/Pillars/Bridge_Pillar1_SciFi_Red.mesh - - - - - - - - - - - Models/Props/Pillars/Bridge_Pillar1_SciFi_Red.mesh - - - - + + @@ -4952,11 +4907,11 @@ 12 - + - + @@ -4996,8 +4951,34 @@ Models/Props/Pillars/Bridge_Pillar1_SciFi_Red.mesh - - + + + + + + + + + + + Models/Props/Pillars/Bridge_Pillar1_SciFi_Red.mesh + + + + + + + + + + + + + Models/Props/Pillars/Bridge_Pillar1_SciFi_Red.mesh + + + + @@ -5015,19 +4996,6 @@ - - - - - Models/Props/Pillars/Bridge_Pillar1_SciFi_Red.mesh - - - - - - - - @@ -5057,11 +5025,11 @@ 12 - + - + @@ -5098,6 +5066,21 @@ + + + + + 1.5 + Models/Props/Bridges/Bridge1_SciFi_Red.mesh + + + + + + + + + @@ -5111,15 +5094,27 @@ + + + + + Models/Props/Bridges/SciFi_Bridge_Support_Bot_Red.mesh + + + + + + + 12 - + - + @@ -5137,18 +5132,6 @@ - - - - - Models/Props/Bridges/SciFi_Bridge_Support_Bot_Red.mesh - - - - - - - @@ -5164,58 +5147,6 @@ - - - - - Models/Props/Pillars/Bridge_Pillar1_SciFi_Red.mesh - - - - - - - - - - - - Models/Props/Pillars/Bridge_Pillar1_SciFi_Red.mesh - - - - - - - - - - - Models/Props/Pillars/Bridge_Pillar1_SciFi_Red.mesh - - - - - - - - - - - Models/Props/Pillars/Bridge_Pillar1_SciFi_Red.mesh - - - - - - - - - - - - - @@ -5268,11 +5199,63 @@ + + + + + Models/Props/Pillars/Bridge_Pillar1_SciFi_Red.mesh + + + + + + + + + + + + Models/Props/Pillars/Bridge_Pillar1_SciFi_Red.mesh + + + + + + + + + + + Models/Props/Pillars/Bridge_Pillar1_SciFi_Red.mesh + + + + + + + + + + + Models/Props/Pillars/Bridge_Pillar1_SciFi_Red.mesh + + + + + + + + + + + + + - + @@ -5281,12 +5264,45 @@ - 3 - Models/Props/Stones/ShinyStoneCrystalRed.mesh + Models/Props/Pillars/StonePillar.mesh - - + + + + + + + + + + + Models/Core/UnitPlane.mesh + + true + + + + + + + + + + + + + + + + + + + Models/Props/Walls/SpecialWall1.mesh + + + + @@ -5296,13 +5312,12 @@ - 2 - Models/Props/Stones/ShinyStoneCrystalRed.mesh + Models/Props/Walls/SpecialWall1.mesh - - - + + + @@ -5311,13 +5326,107 @@ - 3 - Models/Props/Stones/ShinyStoneCrystalRed.mesh + Models/Props/Walls/SpecialWall1.mesh - - - + + + + + + + + + + + + Models/Props/Walls/SpecialWall1.mesh + + + + + + + + + + + + + + + + + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + + + + + + + + + + + + + Models/Props/Pillars/StonePillar.mesh + + + + + + + + + + + + + + Models/Props/Pillars/SciFiPillar2Red.mesh + + + + + @@ -5327,11 +5436,12 @@ 2 - Models/Props/Stones/ShinyStoneCrystalRed.mesh + Models/Props/Pillars/SciFiPillar1Red.mesh - - + + + @@ -5340,13 +5450,11 @@ - 3 - Models/Props/Stones/ShinyStoneCrystalRed.mesh + Models/Props/Pillars/SciFiPillar2Red.mesh - - - + + @@ -5355,13 +5463,12 @@ - 2 - Models/Props/Stones/ShinyStoneCrystalRed.mesh + Models/Props/Pillars/StonePillar.mesh - - - + + + @@ -5370,117 +5477,10 @@ - 2 - Models/Props/Stones/ShinyStoneCrystalRed.mesh + Models/Props/Pillars/StonePillar.mesh - - - - - - - - - - - - 3 - Models/Props/Stones/ShinyStoneCrystalRed.mesh - - - - - - - - - - - - - - 2 - Models/Props/Stones/ShinyStoneCrystalRed.mesh - - - - - - - - - - - - - - 2 - Models/Props/Stones/ShinyStoneCrystalRed.mesh - - - - - - - - - - - - - - 2 - Models/Props/Stones/ShinyStoneCrystalRed.mesh - - - - - - - - - - - - - - 2 - Models/Props/Stones/ShinyStoneCrystalRed.mesh - - - - - - - - - - - - - 3 - Models/Props/Stones/ShinyStoneCrystalRed.mesh - - - - - - - - - - - - - - 3 - Models/Props/Stones/ShinyStoneCrystalRed.mesh - - - - - + @@ -5492,6 +5492,19 @@ + + + + + Models/Props/Bridge_Holder_Red.mesh + + + + + + + + @@ -5525,8 +5538,8 @@ Models/Props/Bridge_Holder_Red.mesh - - + + @@ -5538,20 +5551,7 @@ Models/Props/Bridge_Holder_Red.mesh - - - - - - - - - - - Models/Props/SciFiHolder1.mesh - - - + @@ -5564,6 +5564,72 @@ + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/BigStone.mesh + + + + + + + + + + + + + Models/Props/Stones/mediumStone2.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/MediumStone2.mesh + + + + + + + + @@ -5578,6 +5644,387 @@ + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + + Models/Props/Stones/mediumStone2.mesh + + + + + + + + + + + + + + Models/Props/Stones/MediumStone2.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/BigStone.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + + Models/Props/Stones/MediumStone2.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + + Models/Props/Stones/mediumStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + + Models/Props/Stones/mediumStone2.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + + Models/Props/Stones/mediumStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/BigStone.mesh + + + + + + + + + + + + + Models/Props/Stones/MediumStone2.mesh + + + + + + + + + + + + + + Models/Props/Stones/BigStone.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + + Models/Props/Stones/BigStone.mesh + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + @@ -5645,19 +6092,6 @@ - - - - - Models/Props/Stones/MediumStone2.mesh - - - - - - - - @@ -5672,19 +6106,6 @@ - - - - - Models/Props/Stones/SmallStone2.mesh - - - - - - - - @@ -5698,20 +6119,6 @@ - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - - @@ -5754,20 +6161,6 @@ - - - - - Models/Props/Stones/MediumStone2.mesh - - - - - - - - - @@ -5781,20 +6174,6 @@ - - - - - Models/Props/Stones/SmallStone2.mesh - - - - - - - - - @@ -5809,20 +6188,6 @@ - - - - - Models/Props/Stones/BigStone.mesh - - - - - - - - - @@ -5835,20 +6200,6 @@ - - - - - Models/Props/Stones/mediumStone2.mesh - - - - - - - - - @@ -5862,20 +6213,6 @@ - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - - @@ -5889,20 +6226,6 @@ - - - - - Models/Props/Stones/SmallStone2.mesh - - - - - - - - - @@ -5917,20 +6240,6 @@ - - - - - Models/Props/Stones/MediumStone2.mesh - - - - - - - - - @@ -5944,20 +6253,6 @@ - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - - @@ -5972,20 +6267,6 @@ - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - - @@ -6000,19 +6281,6 @@ - - - - - Models/Props/Stones/mediumStone2.mesh - - - - - - - - @@ -6027,19 +6295,6 @@ - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - @@ -6053,20 +6308,6 @@ - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - - @@ -6080,20 +6321,6 @@ - - - - - Models/Props/Stones/SmallStone2.mesh - - - - - - - - - @@ -6108,20 +6335,6 @@ - - - - - Models/Props/Stones/SmallStone2.mesh - - - - - - - - - @@ -6136,19 +6349,6 @@ - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - @@ -6162,19 +6362,6 @@ - - - - - Models/Props/Stones/SmallStone2.mesh - - - - - - - - @@ -6216,20 +6403,6 @@ - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - - @@ -6244,20 +6417,6 @@ - - - - - Models/Props/Stones/mediumStone2.mesh - - - - - - - - - @@ -6272,19 +6431,6 @@ - - - - - Models/Props/Stones/SmallStone2.mesh - - - - - - - - @@ -6298,19 +6444,6 @@ - - - - - Models/Props/Stones/mediumStone2.mesh - - - - - - - - @@ -6324,19 +6457,6 @@ - - - - - Models/Props/Stones/BigStone.mesh - - - - - - - - @@ -6350,19 +6470,6 @@ - - - - - Models/Props/Stones/SmallStone2.mesh - - - - - - - - @@ -6376,20 +6483,6 @@ - - - - - Models/Props/Stones/SmallStone2.mesh - - - - - - - - - @@ -6403,20 +6496,6 @@ - - - - - Models/Props/Stones/mediumStone2.mesh - - - - - - - - - @@ -6430,19 +6509,6 @@ - - - - - Models/Props/Stones/BigStone.mesh - - - - - - - - @@ -6456,19 +6522,6 @@ - - - - - Models/Props/Stones/SmallStone2.mesh - - - - - - - - @@ -6482,19 +6535,6 @@ - - - - - Models/Props/Stones/BigStone.mesh - - - - - - - - @@ -6508,20 +6548,6 @@ - - - - - Models/Props/Stones/MediumStone2.mesh - - - - - - - - - @@ -6536,18 +6562,6 @@ - - - - - Models/Props/Stones/BigStone.mesh - - - - - - - @@ -6561,20 +6575,6 @@ - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - - @@ -6599,11 +6599,11 @@ 2 - + - + @@ -6625,61 +6625,7 @@ - - - - - - - - - - - - - - - Models/Props/PickUps/PickUpHolder.mesh - false - - - - - - - - - - - - 2 - - - - - - - - - - - - - 8 - - - - Models/Props/PickUps/AmmoPickUp.mesh - - - - - 1.5 - 3 - - - - + @@ -6707,11 +6653,11 @@ 2 - + - + @@ -6733,61 +6679,7 @@ - - - - - - - - - - - - - - - Models/Props/PickUps/PickUpHolder.mesh - false - - - - - - - - - - - - 2 - - - - - - - - - - - - - 8 - - - - Models/Props/PickUps/HealthPickUp.mesh - - - - - 1.5 - 3 - - - - + @@ -6815,11 +6707,11 @@ 2 - + - + @@ -6841,61 +6733,7 @@ - - - - - - - - - - - - - - - Models/Props/PickUps/PickUpHolder.mesh - false - - - - - - - - - - - - 2 - - - - - - - - - - - - - 8 - - - - Models/Props/PickUps/HealthPickUp.mesh - - - - - 1.5 - 3 - - - - + @@ -6923,11 +6761,11 @@ 2 - + - + @@ -6949,7 +6787,169 @@ - + + + + + + + + + + + + + + + Models/Props/PickUps/PickUpHolder.mesh + false + + + + + + + + + + + + 2 + + + + + + + + + + + + + 8 + + + + Models/Props/PickUps/AmmoPickUp.mesh + + + + + 1.5 + 3 + + + + + + + + + + + + + + + + + + Models/Props/PickUps/PickUpHolder.mesh + false + + + + + + + + + + + + 2 + + + + + + + + + + + + + 8 + + + + Models/Props/PickUps/HealthPickUp.mesh + + + + + 1.5 + 3 + + + + + + + + + + + + + + + + + + Models/Props/PickUps/PickUpHolder.mesh + false + + + + + + + + + + + + 2 + + + + + + + + + + + + + 8 + + + + Models/Props/PickUps/HealthPickUp.mesh + + + + + 1.5 + 3 + + + + @@ -6977,11 +6977,11 @@ 2 - + - + @@ -7003,7 +7003,7 @@ - + @@ -7021,19 +7021,6 @@ - - - - - Models/Props/Stones/AssaultHolder.mesh - - - - - - - - @@ -7061,6 +7048,32 @@ + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + @@ -7089,19 +7102,6 @@ - - - - - Models/Props/Stones/AssaultHolder.mesh - - - - - - - - @@ -7122,6 +7122,34 @@ + + + + + 2 + Models/Props/Walls/Medium_Wall_SciFi_Red.mesh + + + + + + + + + + + + + 2 + Models/Props/Walls/Medium_Wall_SciFi_Red.mesh + + + + + + + + @@ -7130,7 +7158,23 @@ Models/Props/Walls/Small_Wall_SciFi_Red.mesh - + + + + + + + + + + + + 2 + Models/Props/Walls/Small_Wall_SciFi_Red.mesh + + + + @@ -7150,6 +7194,62 @@ + + + + + 2 + Models/Props/Walls/Small_Wall_SciFi_Red.mesh + + + + + + + + + + + + + 2 + Models/Props/Walls/BigWallRed.mesh + + + + + + + + + + + + + 2 + Models/Props/Walls/BigWallRed.mesh + + + + + + + + + + + + + 2 + Models/Props/Walls/Small_Wall_SciFi_Red.mesh + + + + + + + + @@ -7194,20 +7294,6 @@ - - - - - 2 - Models/Props/Walls/Small_Wall_SciFi_Red.mesh - - - - - - - - @@ -7251,20 +7337,6 @@ - - - - - 2 - Models/Props/Walls/BigWallRed.mesh - - - - - - - - @@ -7308,20 +7380,6 @@ - - - - - 2 - Models/Props/Walls/BigWallRed.mesh - - - - - - - - @@ -7364,21 +7422,6 @@ - - - - - 2 - Models/Props/Walls/Small_Wall_SciFi_Red.mesh - - - - - - - - - @@ -7423,20 +7466,6 @@ - - - - - 2 - Models/Props/Walls/Medium_Wall_SciFi_Red.mesh - - - - - - - - @@ -7445,7 +7474,7 @@ Models/Props/Walls/BigWallRed.mesh - + @@ -7481,21 +7510,6 @@ - - - - - 2 - Models/Props/Walls/Small_Wall_SciFi_Red.mesh - - - - - - - - - @@ -7539,20 +7553,6 @@ - - - - - 2 - Models/Props/Walls/Medium_Wall_SciFi_Red.mesh - - - - - - - - @@ -7581,8 +7581,8 @@ Models/Props/Flora/Root.mesh - - + + @@ -7595,8 +7595,8 @@ Models/Props/Flora/Root.mesh - - + + @@ -7632,192 +7632,69 @@ - - - - - - - - - - - - - + - - - 1.5 - Models/Props/Pillars/SciFiPillar2Blue.mesh - - - + - - - - - - - 1.5 - Models/Props/Pillars/SciFiPillar3Blue.mesh - - - - - - - - - - - - - - 2.5 - Models/Props/Pillars/SciFiPillar2Blue.mesh - - - - - - - - - - - - - - 2 - Models/Props/Pillars/SciFiPillar1Blue.mesh - - - - - - - - - - - - - 2.5 - Models/Props/Pillars/SciFiPillar2Blue.mesh - - - - - - - - - - - - - - 1.5 - Models/Props/Pillars/SciFiPillar3Blue.mesh - - - - - - - - - - - - - - 2.5 - Models/Props/Pillars/SciFiPillar2Blue.mesh - - - - - - - - - - - - - - 1.5 - Models/Props/Pillars/SciFiPillar2Blue.mesh - - - - - - - - - - - - - 2.5 - Models/Props/Pillars/SciFiPillar2Blue.mesh - - - - - - - - - - - - - - 2.5 - Models/Props/Pillars/SciFiPillar2Blue.mesh - - - - - - - - - - - - - 2.5 - Models/Props/Pillars/SciFiPillar2Blue.mesh - - - - - - - - - - - - - 2.5 - Models/Props/Pillars/SciFiPillar2Blue.mesh - - - - - - - - + + + + + Models/Props/Flora/HangingBush2.mesh + true + + + + + + + + + + + + + Models/Props/Flora/HangingBush4.mesh + true + + + + + + + + + + + + Models/Props/Flora/HangingBush4.mesh + true + + + + + + + + + + + + Models/Props/Flora/HangingBush4.mesh + true + false + + + + + + + + + + @@ -7831,6 +7708,49 @@ + + + + + 2 + Models/Props/Walls/BigWallRed.mesh + + + + + + + + + + + + + 2 + Models/Props/Walls/Small_Wall_SciFi_Red.mesh + + + + + + + + + + + + + + 2 + Models/Props/Walls/BigWallBlue.mesh + + + + + + + + @@ -7860,20 +7780,6 @@ - - - - - 2 - Models/Props/Walls/BigWallRed.mesh - - - - - - - - @@ -7918,21 +7824,6 @@ - - - - - 2 - Models/Props/Walls/Small_Wall_SciFi_Red.mesh - - - - - - - - - @@ -7977,20 +7868,6 @@ - - - - - 2 - Models/Props/Walls/BigWallBlue.mesh - - - - - - - - @@ -7998,20 +7875,6 @@ - - - - - Models/Props/Stones/AssaultHolder.mesh - - - - - - - - - @@ -8025,6 +7888,45 @@ + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + @@ -8038,6 +7940,60 @@ + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + + + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + + @@ -8065,32 +8021,6 @@ - - - - - Models/Props/Stones/AssaultHolder.mesh - - - - - - - - - - - - - Models/Props/Stones/AssaultHolder.mesh - - - - - - - - @@ -8117,32 +8047,6 @@ - - - - - Models/Props/Stones/AssaultHolder.mesh - - - - - - - - - - - - - Models/Props/Stones/AssaultHolder.mesh - - - - - - - - @@ -8171,33 +8075,6 @@ - - - - - Models/Props/Stones/AssaultHolder.mesh - - - - - - - - - - - - - Models/Props/Stones/AssaultHolder.mesh - - - - - - - - - @@ -8246,6 +8123,72 @@ + + + + + Models/Props/Stones/MediumStone2.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + Models/Props/Stones/MediumStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + @@ -8286,20 +8229,6 @@ - - - - - Models/Props/Stones/MediumStone2.mesh - - - - - - - - - @@ -8341,19 +8270,6 @@ - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - @@ -8447,19 +8363,6 @@ - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - @@ -8500,19 +8403,6 @@ - - - - - Models/Props/Stones/MediumStone2.mesh - - - - - - - - @@ -8554,19 +8444,6 @@ - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - @@ -8602,60 +8479,6 @@ - - - - Models/Props/PickUps/PickUpHolder.mesh - false - - - - - - - - - - - - 2 - - - - - - - - - - - - - 8 - - - - Models/Props/PickUps/AmmoPickUp.mesh - - - - - 1.5 - 3 - - - - - - - - - - - - - - @@ -8673,11 +8496,11 @@ 2 - + - + @@ -8699,7 +8522,61 @@ - + + + + + + + + + + + + + + + Models/Props/PickUps/PickUpHolder.mesh + false + + + + + + + + + + + + 2 + + + + + + + + + + + + + 8 + + + + Models/Props/PickUps/AmmoPickUp.mesh + + + + + 1.5 + 3 + + + + @@ -8749,6 +8626,5029 @@ + + + + + + + + + + + Models/Props/Flora/HangingBush2.mesh + true + + + + + + + + + + + + + Models/Props/Flora/HangingBush2.mesh + true + + + + + + + + + + + + + Models/Props/Flora/HangingBush3.mesh + true + + + + + + + + + + + + + Models/Props/Flora/HangingBush2.mesh + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1.5 + Models/Props/Pillars/SciFiPillar2Blue.mesh + + + + + + + + + + + + + 2.5 + Models/Props/Pillars/SciFiPillar2Blue.mesh + + + + + + + + + + + + + + 2.5 + Models/Props/Pillars/SciFiPillar2Blue.mesh + + + + + + + + + + + + + + 1.5 + Models/Props/Pillars/SciFiPillar3Blue.mesh + + + + + + + + + + + + + + 2.5 + Models/Props/Pillars/SciFiPillar2Blue.mesh + + + + + + + + + + + + + + 2 + Models/Props/Pillars/SciFiPillar1Blue.mesh + + + + + + + + + + + + + 1.5 + Models/Props/Pillars/SciFiPillar3Blue.mesh + + + + + + + + + + + + + + 2.5 + Models/Props/Pillars/SciFiPillar2Blue.mesh + + + + + + + + + + + + + + 1.5 + Models/Props/Pillars/SciFiPillar2Blue.mesh + + + + + + + + + + + + + 2.5 + Models/Props/Pillars/SciFiPillar2Blue.mesh + + + + + + + + + + + + + 2.5 + Models/Props/Pillars/SciFiPillar2Blue.mesh + + + + + + + + + + + + + 2.5 + Models/Props/Pillars/SciFiPillar2Blue.mesh + + + + + + + + + + + + + + + + + + + + + + 2 + + + + Models/Props/CapturePoint/CapturePointCylinder.mesh + + false + true + + + + + + + + + + + + + Models/Props/CapturePoint/CapturePointNeutral.mesh + + + + + + + + + + + + + + + 0.5 + + + + 20 + + + 3 + + + + + + + + + + + Models/Props/CapturePoint/CrystalsLayer2.mesh + false + + + + + + + + + + + 0.10000000149011612 + + + + 10 + + + 0.5 + + + + + + + + + + + 1 + + + + + + + + + + + 4.5 + 0.5 + + + + + + + + + + + 4.5 + 0.5 + + + + + + + + + + + 4.5 + 0.5 + + + + + + + + + + + 4.5 + 0.5 + + + + + + + + + + + + + Models/Props/CapturePoint/CenterCrystal.mesh + false + + + + + + + + + + + + + 0.30000001192092896 + + + + 30 + + + 3.5 + + + + + + + + + + + Models/Props/CapturePoint/CrystalsLayer1.mesh + false + + + + + + + + + + + + + + + + + + + + 6 + + + 0.10000000149011612 + + + + + + + + + + Models/Props/CapturePoint/DoubleSidedCylinder.mesh + + true + + + + + + + + + + + + + + 6 + + + 0.10000000149011612 + + + + + + + + + + Models/Props/CapturePoint/DoubleSidedCylinder.mesh + + true + + + + + + + + + + + + + + 6 + + + 0.10000000149011612 + + + + + + + + + + Models/Props/CapturePoint/DoubleSidedCylinder.mesh + + true + + + + + + + + + + + + + + 6 + + + 0.10000000149011612 + + + + + + + + + + Models/Props/CapturePoint/DoubleSidedCylinder.mesh + + true + + + + + + + + + + + + + + + + + + + Models/Props/CapturePoint/CapturePointRed.mesh + false + + + + + + + + + + + + + + + 6 + + + 0.10000000149011612 + + + + + + + + + + Models/Props/CapturePoint/DoubleSidedCylinder.mesh + + false + true + + + + + + + + + + + + + + 6 + + + 0.10000000149011612 + + + + + + + + + + Models/Props/CapturePoint/DoubleSidedCylinder.mesh + + false + true + + + + + + + + + + + + + + 6 + + + 0.10000000149011612 + + + + + + + + + + Models/Props/CapturePoint/DoubleSidedCylinder.mesh + + false + true + + + + + + + + + + + + + + 6 + + + 0.10000000149011612 + + + + + + + + + + Models/Props/CapturePoint/DoubleSidedCylinder.mesh + + false + true + + + + + + + + + + + + + + + + + + + + + + + 0.5 + + + + 20 + + + 3 + + + + + + + + + + + Models/Props/CapturePoint/CrystalsLayer2.mesh + + false + false + + + + + + + + + + + 0.30000001192092896 + + + + 30 + + + 3.5 + + + + + + + + + + + Models/Props/CapturePoint/CrystalsLayer1.mesh + + false + false + + + + + + + + + + + 0.10000000149011612 + + + + 10 + + + 0.5 + + + + + + + + + + + Models/Props/CapturePoint/CenterCrystal.mesh + + false + false + + + + + + + + + + + 1 + + + + + + + + + + + + 4.5 + 0.5 + false + + + + + + + + + + + + 4.5 + 0.5 + false + + + + + + + + + + + + 4.5 + 0.5 + false + + + + + + + + + + + + 4.5 + 0.5 + false + + + + + + + + + + + + + + + + + + + + Models/Props/CapturePoint/CapturePointBlue.mesh + false + + + + + + + + + + + + + + + 0.10000000149011612 + + + + 10 + + + 0.5 + + + + + + + + + + + 1 + + + + + + + + + + + + 4.5 + 0.5 + false + + + + + + + + + + + + 4.5 + 0.5 + false + + + + + + + + + + + + 4.5 + 0.5 + false + + + + + + + + + + + + 4.5 + 0.5 + false + + + + + + + + + + + + + Models/Props/CapturePoint/CenterCrystal.mesh + + false + false + + + + + + + + + + + 0.5 + + + + 20 + + + 3 + + + + + + + + + + + Models/Props/CapturePoint/CrystalsLayer2.mesh + + false + false + + + + + + + + + + + 0.30000001192092896 + + + + 30 + + + 3.5 + + + + + + + + + + + Models/Props/CapturePoint/CrystalsLayer1.mesh + + false + false + + + + + + + + + + + + + + + + + + + + 6 + + + 0.10000000149011612 + + + + + + + + + + Models/Props/CapturePoint/DoubleSidedCylinder.mesh + + false + true + + + + + + + + + + + + + + 6 + + + 0.10000000149011612 + + + + + + + + + + Models/Props/CapturePoint/DoubleSidedCylinder.mesh + + false + true + + + + + + + + + + + + + + 6 + + + 0.10000000149011612 + + + + + + + + + + Models/Props/CapturePoint/DoubleSidedCylinder.mesh + + false + true + + + + + + + + + + + + + + 6 + + + 0.10000000149011612 + + + + + + + + + + Models/Props/CapturePoint/DoubleSidedCylinder.mesh + + false + true + + + + + + + + + + + + + + + + + + + + 15 + + + + + + + + + + + Models/Props/CapturePoint/CapturePointCylinder.mesh + + false + true + + + + + + + + + + + + + Models/Props/CapturePoint/CapturePointRed.mesh + + + + + + + + + + + + + + + 0.30000001192092896 + + + + 30 + + + 3.5 + + + + + + + + + + + Models/Props/CapturePoint/CrystalsLayer1.mesh + + false + + + + + + + + + + + 0.5 + + + + 20 + + + 3 + + + + + + + + + + + Models/Props/CapturePoint/CrystalsLayer2.mesh + + false + + + + + + + + + + + 0.10000000149011612 + + + + 10 + + + 0.5 + + + + + + + + + + + 1 + + + + + + + + + + + + 4.5 + 0.5 + + + + + + + + + + + + 4.5 + 0.5 + + + + + + + + + + + + 4.5 + 0.5 + + + + + + + + + + + + 4.5 + 0.5 + + + + + + + + + + + + + Models/Props/CapturePoint/CenterCrystal.mesh + + false + + + + + + + + + + + + + + + + + + + + + + 6 + + + 0.10000000149011612 + + + + + + + + + + Models/Props/CapturePoint/DoubleSidedCylinder.mesh + + true + + + + + + + + + + + + + + 6 + + + 0.10000000149011612 + + + + + + + + + + Models/Props/CapturePoint/DoubleSidedCylinder.mesh + + true + + + + + + + + + + + + + + 6 + + + 0.10000000149011612 + + + + + + + + + + Models/Props/CapturePoint/DoubleSidedCylinder.mesh + + true + + + + + + + + + + + + + + 6 + + + 0.10000000149011612 + + + + + + + + + + Models/Props/CapturePoint/DoubleSidedCylinder.mesh + + true + + + + + + + + + + + + + + + + + + + Models/Props/CapturePoint/CapturePointNeutral.mesh + false + + + + + + + + + + + + + + + 6 + + + 0.10000000149011612 + + + + + + + + + + Models/Props/CapturePoint/DoubleSidedCylinder.mesh + + false + true + + + + + + + + + + + + + + 6 + + + 0.10000000149011612 + + + + + + + + + + Models/Props/CapturePoint/DoubleSidedCylinder.mesh + + false + true + + + + + + + + + + + + + + 6 + + + 0.10000000149011612 + + + + + + + + + + Models/Props/CapturePoint/DoubleSidedCylinder.mesh + + false + true + + + + + + + + + + + + + + 6 + + + 0.10000000149011612 + + + + + + + + + + Models/Props/CapturePoint/DoubleSidedCylinder.mesh + + false + true + + + + + + + + + + + + + + + + + + + + + + + 0.30000001192092896 + + + + 30 + + + 3.5 + + + + + + + + + + + Models/Props/CapturePoint/CrystalsLayer1.mesh + false + false + + + + + + + + + + + 0.10000000149011612 + + + + 10 + + + 0.5 + + + + + + + + + + + Models/Props/CapturePoint/CenterCrystal.mesh + false + false + + + + + + + + + + + 1 + + + + + + + + + + + 4.5 + 0.5 + false + + + + + + + + + + + 4.5 + 0.5 + false + + + + + + + + + + + 4.5 + 0.5 + false + + + + + + + + + + + 4.5 + 0.5 + false + + + + + + + + + + + + + + + 0.5 + + + + 20 + + + 3 + + + + + + + + + + + Models/Props/CapturePoint/CrystalsLayer2.mesh + false + false + + + + + + + + + + + + + + + + Models/Props/CapturePoint/CapturePointBlue.mesh + false + + + + + + + + + + + + + + + 0.5 + + + + 20 + + + 3 + + + + + + + + + + + Models/Props/CapturePoint/CrystalsLayer2.mesh + + false + false + true + + + + + + + + + + + 0.30000001192092896 + + + + 30 + + + 3.5 + + + + + + + + + + + Models/Props/CapturePoint/CrystalsLayer1.mesh + + false + false + + + + + + + + + + + 0.10000000149011612 + + + + 10 + + + 0.5 + + + + + + + + + + + Models/Props/CapturePoint/CenterCrystal.mesh + + false + false + + + + + + + + + 1 + + + + + + + + + + + + 4.5 + 0.5 + false + + + + + + + + + + + + 4.5 + 0.5 + false + + + + + + + + + + + + 4.5 + 0.5 + false + + + + + + + + + + + + 4.5 + 0.5 + false + + + + + + + + + + + + + + + + + + + + + + + + 6 + + + 0.10000000149011612 + + + + + + + + + + Models/Props/CapturePoint/DoubleSidedCylinder.mesh + + false + true + + + + + + + + + + + + + + 6 + + + 0.10000000149011612 + + + + + + + + + + Models/Props/CapturePoint/DoubleSidedCylinder.mesh + + false + true + + + + + + + + + + + + + + 6 + + + 0.10000000149011612 + + + + + + + + + + Models/Props/CapturePoint/DoubleSidedCylinder.mesh + + false + true + + + + + + + + + + + + + + 6 + + + 0.10000000149011612 + + + + + + + + + + Models/Props/CapturePoint/DoubleSidedCylinder.mesh + + false + true + + + + + + + + + + + + + + + + + + + + 1 + + + + Models/Props/CapturePoint/CapturePointCylinder.mesh + + false + true + + + + + + + + + + + + + Models/Props/CapturePoint/CapturePointNeutral.mesh + + + + + + + + + + + + + + + 0.10000000149011612 + + + + 10 + + + 0.5 + + + + + + + + + + + 1 + + + + + + + + + + + 4.5 + 0.5 + + + + + + + + + + + 4.5 + 0.5 + + + + + + + + + + + 4.5 + 0.5 + + + + + + + + + + + 4.5 + 0.5 + + + + + + + + + + + + + Models/Props/CapturePoint/CenterCrystal.mesh + false + true + + + + + + + + + + + + + 0.5 + + + + 20 + + + 3 + + + + + + + + + + + Models/Props/CapturePoint/CrystalsLayer2.mesh + false + + + + + + + + + + + 0.30000001192092896 + + + + 30 + + + 3.5 + + + + + + + + + + + Models/Props/CapturePoint/CrystalsLayer1.mesh + false + + + + + + + + + + + + + + + + + + + + 6 + + + 0.10000000149011612 + + + + + + + + + + Models/Props/CapturePoint/DoubleSidedCylinder.mesh + + true + + + + + + + + + + + + + + 6 + + + 0.10000000149011612 + + + + + + + + + + Models/Props/CapturePoint/DoubleSidedCylinder.mesh + + true + + + + + + + + + + + + + + 6 + + + 0.10000000149011612 + + + + + + + + + + Models/Props/CapturePoint/DoubleSidedCylinder.mesh + + true + + + + + + + + + + + + + + 6 + + + 0.10000000149011612 + + + + + + + + + + Models/Props/CapturePoint/DoubleSidedCylinder.mesh + + true + + + + + + + + + + + + + + + + + + + Models/Props/CapturePoint/CapturePointRed.mesh + false + + + + + + + + + + + + + + + 0.5 + + + + 20 + + + 3 + + + + + + + + + + + Models/Props/CapturePoint/CrystalsLayer2.mesh + + false + false + + + + + + + + + + + 0.10000000149011612 + + + + 10 + + + 0.5 + + + + + + + + + + + 1 + + + + + + + + + + + + 4.5 + 0.5 + false + + + + + + + + + + + + 4.5 + 0.5 + false + + + + + + + + + + + + 4.5 + 0.5 + false + + + + + + + + + + + + 4.5 + 0.5 + false + + + + + + + + + + + + + Models/Props/CapturePoint/CenterCrystal.mesh + + false + false + + + + + + + + + + + + + 0.30000001192092896 + + + + 30 + + + 3.5 + + + + + + + + + + + Models/Props/CapturePoint/CrystalsLayer1.mesh + + false + false + + + + + + + + + + + + + + + + + + + + 6 + + + 0.10000000149011612 + + + + + + + + + + Models/Props/CapturePoint/DoubleSidedCylinder.mesh + + false + true + + + + + + + + + + + + + + 6 + + + 0.10000000149011612 + + + + + + + + + + Models/Props/CapturePoint/DoubleSidedCylinder.mesh + + false + true + + + + + + + + + + + + + + 6 + + + 0.10000000149011612 + + + + + + + + + + Models/Props/CapturePoint/DoubleSidedCylinder.mesh + + false + true + + + + + + + + + + + + + + 6 + + + 0.10000000149011612 + + + + + + + + + + Models/Props/CapturePoint/DoubleSidedCylinder.mesh + + false + true + + + + + + + + + + + + + + + + + + + Models/Props/CapturePoint/CapturePointBlue.mesh + false + + + + + + + + + + + + + + + 0.5 + + + + 20 + + + 3 + + + + + + + + + + + Models/Props/CapturePoint/CrystalsLayer2.mesh + + false + false + + + + + + + + + + + 0.10000000149011612 + + + + 10 + + + 0.5 + + + + + + + + + + + 1 + + + + + + + + + + + + 4.5 + 0.5 + false + + + + + + + + + + + + 4.5 + 0.5 + false + + + + + + + + + + + + 4.5 + 0.5 + false + + + + + + + + + + + + 4.5 + 0.5 + false + + + + + + + + + + + + + Models/Props/CapturePoint/CenterCrystal.mesh + + false + false + + + + + + + + + + + 0.30000001192092896 + + + + 30 + + + 3.5 + + + + + + + + + + + Models/Props/CapturePoint/CrystalsLayer1.mesh + + false + false + + + + + + + + + + + + + + + + + + + + 6 + + + 0.10000000149011612 + + + + + + + + + + Models/Props/CapturePoint/DoubleSidedCylinder.mesh + + false + true + + + + + + + + + + + + + + 6 + + + 0.10000000149011612 + + + + + + + + + + Models/Props/CapturePoint/DoubleSidedCylinder.mesh + + false + true + + + + + + + + + + + + + + 6 + + + 0.10000000149011612 + + + + + + + + + + Models/Props/CapturePoint/DoubleSidedCylinder.mesh + + false + true + + + + + + + + + + + + + + 6 + + + 0.10000000149011612 + + + + + + + + + + Models/Props/CapturePoint/DoubleSidedCylinder.mesh + + false + true + + + + + + + + + + + + + + + + + + + + 3 + + + + Models/Props/CapturePoint/CapturePointCylinder.mesh + + false + true + + + + + + + + + + + + + Models/Props/CapturePoint/CapturePointNeutral.mesh + + + + + + + + + + + + + + + 0.5 + + + + 20 + + + 3 + + + + + + + + + + + Models/Props/CapturePoint/CrystalsLayer2.mesh + false + + + + + + + + + + + 0.10000000149011612 + + + + 10 + + + 0.5 + + + + + + + + + + + Models/Props/CapturePoint/CenterCrystal.mesh + false + + + + + + + + + + + 1 + + + + + + + + + + + 4.5 + 0.5 + + + + + + + + + + + 4.5 + 0.5 + + + + + + + + + + + 4.5 + 0.5 + + + + + + + + + + + 4.5 + 0.5 + + + + + + + + + + + + + + + 0.30000001192092896 + + + + 30 + + + 3.5 + + + + + + + + + + + Models/Props/CapturePoint/CrystalsLayer1.mesh + false + + + + + + + + + + + + + + + + + + + + 6 + + + 0.10000000149011612 + + + + + + + + + + Models/Props/CapturePoint/DoubleSidedCylinder.mesh + + true + + + + + + + + + + + + + + 6 + + + 0.10000000149011612 + + + + + + + + + + Models/Props/CapturePoint/DoubleSidedCylinder.mesh + + true + + + + + + + + + + + + + + 6 + + + 0.10000000149011612 + + + + + + + + + + Models/Props/CapturePoint/DoubleSidedCylinder.mesh + + true + + + + + + + + + + + + + + 6 + + + 0.10000000149011612 + + + + + + + + + + Models/Props/CapturePoint/DoubleSidedCylinder.mesh + + true + + + + + + + + + + + + + + + + + + + Models/Props/CapturePoint/CapturePointBlue.mesh + false + + + + + + + + + + + + + + + 6 + + + 0.10000000149011612 + + + + + + + + + + Models/Props/CapturePoint/DoubleSidedCylinder.mesh + + false + true + + + + + + + + + + + + + + 6 + + + 0.10000000149011612 + + + + + + + + + + Models/Props/CapturePoint/DoubleSidedCylinder.mesh + + false + true + + + + + + + + + + + + + + 6 + + + 0.10000000149011612 + + + + + + + + + + Models/Props/CapturePoint/DoubleSidedCylinder.mesh + + false + true + + + + + + + + + + + + + + 6 + + + 0.10000000149011612 + + + + + + + + + + Models/Props/CapturePoint/DoubleSidedCylinder.mesh + + false + true + + + + + + + + + + + + + + + + + + + + + + + 0.10000000149011612 + + + + 10 + + + 0.5 + + + + + + + + + + + Models/Props/CapturePoint/CenterCrystal.mesh + + false + false + + + + + + + + + 1 + + + + + + + + + + + + 4.5 + 0.5 + false + + + + + + + + + + + + 4.5 + 0.5 + false + + + + + + + + + + + + 4.5 + 0.5 + false + + + + + + + + + + + + 4.5 + 0.5 + false + + + + + + + + + + + + + + + 0.5 + + + + 20 + + + 3 + + + + + + + + + + + Models/Props/CapturePoint/CrystalsLayer2.mesh + + false + false + + + + + + + + + + + 0.30000001192092896 + + + + 30 + + + 3.5 + + + + + + + + + + + Models/Props/CapturePoint/CrystalsLayer1.mesh + + false + false + + + + + + + + + + + + + + + + Models/Props/CapturePoint/CapturePointRed.mesh + false + + + + + + + + + + + + + + + 0.10000000149011612 + + + + 10 + + + 0.5 + + + + + + + + + + + 1 + + + + + + + + + + + + 4.5 + 0.5 + false + + + + + + + + + + + + 4.5 + 0.5 + false + + + + + + + + + + + + 4.5 + 0.5 + false + + + + + + + + + + + + 4.5 + 0.5 + false + + + + + + + + + + + + + Models/Props/CapturePoint/CenterCrystal.mesh + + false + false + + + + + + + + + + + + + 0.5 + + + + 20 + + + 3 + + + + + + + + + + + Models/Props/CapturePoint/CrystalsLayer2.mesh + + false + false + + + + + + + + + + + 0.30000001192092896 + + + + 30 + + + 3.5 + + + + + + + + + + + Models/Props/CapturePoint/CrystalsLayer1.mesh + + false + false + + + + + + + + + + + + + + + + + + + + 6 + + + 0.10000000149011612 + + + + + + + + + + Models/Props/CapturePoint/DoubleSidedCylinder.mesh + + false + true + + + + + + + + + + + + + + 6 + + + 0.10000000149011612 + + + + + + + + + + Models/Props/CapturePoint/DoubleSidedCylinder.mesh + + false + true + + + + + + + + + + + + + + 6 + + + 0.10000000149011612 + + + + + + + + + + Models/Props/CapturePoint/DoubleSidedCylinder.mesh + + false + true + + + + + + + + + + + + + + 6 + + + 0.10000000149011612 + + + + + + + + + + Models/Props/CapturePoint/DoubleSidedCylinder.mesh + + false + true + + + + + + + + + + + + + + + + + + + + -15 + + + + 4 + + + + + + + + Models/Props/CapturePoint/CapturePointCylinder.mesh + + false + true + + + + + + + + + + + + + Models/Props/CapturePoint/CapturePointRed.mesh + false + + + + + + + + + + + + + + + 6 + + + 0.10000000149011612 + + + + + + + + + + Models/Props/CapturePoint/DoubleSidedCylinder.mesh + + false + true + + + + + + + + + + + + + + 6 + + + 0.10000000149011612 + + + + + + + + + + Models/Props/CapturePoint/DoubleSidedCylinder.mesh + + false + true + + + + + + + + + + + + + + 6 + + + 0.10000000149011612 + + + + + + + + + + Models/Props/CapturePoint/DoubleSidedCylinder.mesh + + false + true + + + + + + + + + + + + + + 6 + + + 0.10000000149011612 + + + + + + + + + + Models/Props/CapturePoint/DoubleSidedCylinder.mesh + + false + true + + + + + + + + + + + + + + + + + + + + + + + 0.10000000149011612 + + + + 10 + + + 0.5 + + + + + + + + + + + Models/Props/CapturePoint/CenterCrystal.mesh + + false + false + + + + + + + + + + + 1 + + + + + + + + + + + + 4.5 + 0.5 + + + + + + + + + + + + 4.5 + 0.5 + + + + + + + + + + + + 4.5 + 0.5 + + + + + + + + + + + + 4.5 + 0.5 + + + + + + + + + + + + + + + 0.30000001192092896 + + + + 30 + + + 3.5 + + + + + + + + + + + Models/Props/CapturePoint/CrystalsLayer1.mesh + + false + false + + + + + + + + + + + 0.5 + + + + 20 + + + 3 + + + + + + + + + + + Models/Props/CapturePoint/CrystalsLayer2.mesh + + false + false + + + + + + + + + + + + + + + + Models/Props/CapturePoint/CapturePointBlue.mesh + + + + + + + + + + + + + + + 6 + + + 0.10000000149011612 + + + + + + + + + + Models/Props/CapturePoint/DoubleSidedCylinder.mesh + + true + + + + + + + + + + + + + + 6 + + + 0.10000000149011612 + + + + + + + + + + Models/Props/CapturePoint/DoubleSidedCylinder.mesh + + true + + + + + + + + + + + + + + 6 + + + 0.10000000149011612 + + + + + + + + + + Models/Props/CapturePoint/DoubleSidedCylinder.mesh + + true + + + + + + + + + + + + + + 6 + + + 0.10000000149011612 + + + + + + + + + + Models/Props/CapturePoint/DoubleSidedCylinder.mesh + + true + + + + + + + + + + + + + + + + + + + + + + + 0.10000000149011612 + + + + 10 + + + 0.5 + + + + + + + + + + + Models/Props/CapturePoint/CenterCrystal.mesh + + false + + + + + + + + + 1 + + + + + + + + + + + + 4.5 + 0.5 + + + + + + + + + + + + 4.5 + 0.5 + + + + + + + + + + + + 4.5 + 0.5 + + + + + + + + + + + + 4.5 + 0.5 + + + + + + + + + + + + + + + 0.5 + + + + 20 + + + 3 + + + + + + + + + + + Models/Props/CapturePoint/CrystalsLayer2.mesh + + false + + + + + + + + + + + 0.30000001192092896 + + + + 30 + + + 3.5 + + + + + + + + + + + Models/Props/CapturePoint/CrystalsLayer1.mesh + + false + + + + + + + + + + + + + + + + Models/Props/CapturePoint/CapturePointNeutral.mesh + false + + + + + + + + + + + + + + + 0.5 + + + + 20 + + + 3 + + + + + + + + + + + Models/Props/CapturePoint/CrystalsLayer2.mesh + false + false + + + + + + + + + + + 0.30000001192092896 + + + + 30 + + + 3.5 + + + + + + + + + + + Models/Props/CapturePoint/CrystalsLayer1.mesh + false + false + + + + + + + + + + + 0.10000000149011612 + + + + 10 + + + 0.5 + + + + + + + + + + + 1 + + + + + + + + + + + 4.5 + 0.5 + + + + + + + + + + + 4.5 + 0.5 + + + + + + + + + + + 4.5 + 0.5 + + + + + + + + + + + 4.5 + 0.5 + + + + + + + + + + + + + Models/Props/CapturePoint/CenterCrystal.mesh + false + false + + + + + + + + + + + + + + + + + + + + + + 6 + + + 0.10000000149011612 + + + + + + + + + + Models/Props/CapturePoint/DoubleSidedCylinder.mesh + + false + true + + + + + + + + + + + + + + 6 + + + 0.10000000149011612 + + + + + + + + + + Models/Props/CapturePoint/DoubleSidedCylinder.mesh + + false + true + + + + + + + + + + + + + + 6 + + + 0.10000000149011612 + + + + + + + + + + Models/Props/CapturePoint/DoubleSidedCylinder.mesh + + false + true + + + + + + + + + + + + + + 6 + + + 0.10000000149011612 + + + + + + + + + + Models/Props/CapturePoint/DoubleSidedCylinder.mesh + + false + true + + + + + + + + + + + + + + @@ -8779,161 +13679,6 @@ - - - - Models/Core/UnitCube.mesh - false - - - - - - - - - - - - - - - - - - - - - - - - Schema/Entities/ScoreBoard_Red.xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Name - Fonts/DroidSans.ttf,64 - - - - - - - - - - - - - - - ID - Fonts/DroidSans.ttf,64 - - - - - - - - - - - - - - - Kills - Fonts/DroidSans.ttf,64 - - - - - - - - - - - - - - - Deaths - Fonts/DroidSans.ttf,64 - - - - - - - - - - - - - - - KD - Fonts/DroidSans.ttf,64 - - - - - - - - - - - - - - - - - Models/Core/UnitCube.mesh - - false - - - - - - - - - - - - @@ -8994,6 +13739,22 @@ + + + + Name + Fonts/DroidSans.ttf,64 + + + + + + + + + + + @@ -9042,6 +13803,83 @@ + + + + + + + + + + Models/Core/UnitCube.mesh + false + + + + + + + + + + + + + + + + + + + + + + + + Schema/Entities/ScoreBoard_Red.xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Kills + Fonts/DroidSans.ttf,64 + + + + + + + + + + + @@ -9058,8 +13896,70 @@ + + + + ID + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + + + + Deaths + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + + + + KD + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + + + + Models/Core/UnitCube.mesh + + false + + + + + + + + @@ -9084,32 +13984,6 @@ - - - - - Models/Characters/Assault/AssaultTPose.mesh - false - - - - - - - - - - - - Models/Characters/Assault/AssaultTPose.mesh - false - - - - - - - @@ -9136,6 +14010,32 @@ + + + + + Models/Characters/Assault/AssaultTPose.mesh + false + + + + + + + + + + + + Models/Characters/Assault/AssaultTPose.mesh + false + + + + + + + @@ -9154,19 +14054,6 @@ - - - - - Models/Characters/Assault/AssaultTPose.mesh - false - - - - - - - @@ -9193,6 +14080,19 @@ + + + + + Models/Characters/Assault/AssaultTPose.mesh + false + + + + + + + @@ -9216,7 +14116,7 @@ - + @@ -9361,7 +14261,7 @@ - + @@ -9371,7 +14271,7 @@ - 2 + 3 false @@ -9399,7 +14299,7 @@ - + @@ -9409,7 +14309,45 @@ - 3 + 1 + + + false + Models/Core/UnitQuad.mesh + + Textures/Core/UnitHexagon_Rotated.png + + + + + + + + + + + + + + + false + Models/Core/UnitQuad.mesh + + Textures/Core/UnitHexagon.png + + + + + + + + + + + + + + 2 false @@ -9466,44 +14404,6 @@ - - - - false - Models/Core/UnitQuad.mesh - - Textures/Core/UnitHexagon.png - - - - - - - - - - - - - - 1 - - - false - Models/Core/UnitQuad.mesh - - Textures/Core/UnitHexagon_Rotated.png - - - - - - - - - - - @@ -9526,19 +14426,6 @@ - - - - Class - Fonts/DroidSans.ttf,64 - - - - - - - - @@ -9552,6 +14439,19 @@ + + + + Class + Fonts/DroidSans.ttf,64 + + + + + + + + @@ -9574,20 +14474,6 @@ - - - - Pick Class - Fonts/DroidSans.ttf,64 - - - - - - - - - @@ -9623,41 +14509,6 @@ - - - - - false - Models/Core/UnitQuad.mesh - - Textures/Icons/Classes/Sniper-01.png - - - PickClass - 3 - - - - - - - - - - - Sniper - Fonts/DroidSans.ttf,64 - - - - - - - - - - - @@ -9706,6 +14557,55 @@ + + + + Pick Class + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + + + false + Models/Core/UnitQuad.mesh + + Textures/Icons/Classes/Sniper-01.png + + + PickClass + 3 + + + + + + + + + + + Sniper + Fonts/DroidSans.ttf,64 + + + + + + + + + + + @@ -9944,34 +14844,78 @@ - + - - - 10 - - - - + + + 1 + 1.2000000476837158 + + - - - - - - 10 - - - - - - + + + + + 3 + + + + + + + + + + + + 4 + + + + + + + + + + + 4 + + + + + + + + + + + 4 + + + + + + + + + + + 4 + + + + + + + @@ -10006,17 +14950,6 @@ - - - - 4 - - - - - - - @@ -10050,17 +14983,6 @@ - - - - 4 - - - - - - - @@ -10094,17 +15016,6 @@ - - - - 4 - - - - - - - @@ -10139,19 +15050,31 @@ - - - - 4 - - - - - - - + + + + + 10 + + + + + + + + + + + 10 + + + + + + + @@ -10175,6 +15098,154 @@ + + + + + + + + + + + + 5 + 1 + 0.5 + + + + + + + + + + + + 5 + 1 + 0.5 + + + + + + + + + + + + + + + + + + + + + 2 + 1 + 0.5 + + + + + + + + + + + + 3 + 1 + 0.5 + + + + + + + + + + + + + + + + + + + + + 5 + 1 + 0.5 + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + + + + + + + + + + 5 + 1 + 0.5 + + + + + + + + + + + + 5 + 1 + 0.5 + + + + + + + + + @@ -10265,7 +15336,7 @@ 0.5 - + @@ -10279,7 +15350,7 @@ 0.5 - + @@ -10323,43 +15394,6 @@ - - - - - - - - - - - - 5 - 1 - 0.5 - - - - - - - - - - - - 5 - 1 - 0.5 - - - - - - - - - @@ -10434,43 +15468,6 @@ - - - - - - - - - - - - 2 - 1 - 0.5 - - - - - - - - - - - - 3 - 1 - 0.5 - - - - - - - - - @@ -10524,7 +15521,7 @@ 0.5 - + @@ -10538,7 +15535,7 @@ 0.5 - + @@ -10582,43 +15579,6 @@ - - - - - - - - - - - - 5 - 1 - 0.5 - - - - - - - - - - - - 5 - 2 - 0.5 - - - - - - - - - @@ -10672,7 +15632,7 @@ 0.5 - + @@ -10686,7 +15646,7 @@ 0.5 - + @@ -10730,43 +15690,6 @@ - - - - - - - - - - - - 5 - 1 - 0.5 - - - - - - - - - - - - 5 - 1 - 0.5 - - - - - - - - - @@ -10825,6 +15748,34 @@ + + + + + 5 + 1 + 0.5 + + + + + + + + + + + + 5 + 1 + 0.5 + + + + + + + @@ -10867,20 +15818,6 @@ - - - - - 5 - 1 - 0.5 - - - - - - - @@ -10923,20 +15860,6 @@ - - - - - 5 - 1 - 0.5 - - - - - - - @@ -11053,20 +15976,6 @@ - - - - - 6 - 1 - 0.5 - - - - - - - @@ -11081,6 +15990,20 @@ + + + + + 6 + 1 + 0.5 + + + + + + + @@ -11171,7 +16094,7 @@ - + @@ -11184,7 +16107,7 @@ 0.5 - + @@ -11198,7 +16121,155 @@ 0.5 - + + + + + + + + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + 5 + 2 + 0.5 + + + @@ -11242,6 +16313,80 @@ + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + @@ -11286,20 +16431,6 @@ - - - - - 5 - 2 - 0.5 - - - - - - - @@ -11314,6 +16445,20 @@ + + + + + 5 + 2 + 0.5 + + + + + + + @@ -11353,80 +16498,6 @@ - - - - - - - - - - - - 5 - 2 - 0.5 - - - - - - - - - - - - 5 - 2 - 0.5 - - - - - - - - - - - - - - - - - - - - - 5 - 2 - 0.5 - - - - - - - - - - - - 5 - 2 - 0.5 - - - - - - - - - @@ -11471,20 +16542,6 @@ - - - - - 5 - 2 - 0.5 - - - - - - - @@ -11499,29 +16556,6 @@ - - - - - - - - - - - - - - 5 - 2 - 0.5 - - - - - - - @@ -11531,44 +16565,7 @@ 0.5 - - - - - - - - - - - - - - - - - - - 5 - 2 - 0.5 - - - - - - - - - - - - 5 - 2 - 0.5 - - - + @@ -11582,20 +16579,6 @@ - - - - - 5 - 2 - 0.5 - - - - - - - @@ -11610,6 +16593,20 @@ + + + + + 5 + 2 + 0.5 + + + + + + + @@ -11649,43 +16646,6 @@ - - - - - - - - - - - - 5 - 2 - 0.5 - - - - - - - - - - - - 5 - 2 - 0.5 - - - - - - - - - @@ -11739,7 +16699,7 @@ 0.5 - + @@ -11753,7 +16713,7 @@ 0.5 - + @@ -11797,80 +16757,28 @@ - - - - - - - - - - - - 5 - 2 - 0.5 - - - - - - - - - - - - 5 - 2 - 0.5 - - - - - - - - - - - - - - 15 - 1 - - - - - - - - + - - - + - + 5 2 0.5 - + @@ -11879,23 +16787,16 @@ - 6 + 5 2 0.5 - + - - - - - - - @@ -11938,20 +16839,6 @@ - - - - - 5 - 2 - 0.5 - - - - - - - @@ -11980,16 +16867,39 @@ + + + + + + + + + - + 5 2 0.5 - + + + + + + + + + + 6 + 2 + 0.5 + + + @@ -12035,25 +16945,15 @@ - - - - - - - 1 - 1.2000000476837158 - - - - - 3 + + 15 + 1 - + @@ -12084,4777 +16984,6 @@ - - - - - - - - - 1 - - - - Models/Props/CapturePoint/CapturePointCylinder.mesh - - false - true - - - - - - - - - - - - - Models/Props/CapturePoint/CapturePointRed.mesh - false - - - - - - - - - - - - - - - 0.5 - - - - 20 - - - 3 - - - - - - - - - - - Models/Props/CapturePoint/CrystalsLayer2.mesh - - false - false - - - - - - - - - - - 0.30000001192092896 - - - - 30 - - - 3.5 - - - - - - - - - - - Models/Props/CapturePoint/CrystalsLayer1.mesh - - false - false - - - - - - - - - - - 0.10000000149011612 - - - - 10 - - - 0.5 - - - - - - - - - - - 1 - - - - - - - - - - - - 4.5 - 0.5 - false - - - - - - - - - - - - 4.5 - 0.5 - false - - - - - - - - - - - - 4.5 - 0.5 - false - - - - - - - - - - - - 4.5 - 0.5 - false - - - - - - - - - - - - - Models/Props/CapturePoint/CenterCrystal.mesh - - false - false - - - - - - - - - - - - - - - - - - - - - - 6 - - - 0.10000000149011612 - - - - - - - - - - Models/Props/CapturePoint/DoubleSidedCylinder.mesh - - false - true - - - - - - - - - - - - - - 6 - - - 0.10000000149011612 - - - - - - - - - - Models/Props/CapturePoint/DoubleSidedCylinder.mesh - - false - true - - - - - - - - - - - - - - 6 - - - 0.10000000149011612 - - - - - - - - - - Models/Props/CapturePoint/DoubleSidedCylinder.mesh - - false - true - - - - - - - - - - - - - - 6 - - - 0.10000000149011612 - - - - - - - - - - Models/Props/CapturePoint/DoubleSidedCylinder.mesh - - false - true - - - - - - - - - - - - - - - - - - - Models/Props/CapturePoint/CapturePointNeutral.mesh - - - - - - - - - - - - - - - 0.5 - - - - 20 - - - 3 - - - - - - - - - - - Models/Props/CapturePoint/CrystalsLayer2.mesh - false - - - - - - - - - - - 0.10000000149011612 - - - - 10 - - - 0.5 - - - - - - - - - - - 1 - - - - - - - - - - - 4.5 - 0.5 - - - - - - - - - - - 4.5 - 0.5 - - - - - - - - - - - 4.5 - 0.5 - - - - - - - - - - - 4.5 - 0.5 - - - - - - - - - - - - - Models/Props/CapturePoint/CenterCrystal.mesh - false - true - - - - - - - - - - - - - 0.30000001192092896 - - - - 30 - - - 3.5 - - - - - - - - - - - Models/Props/CapturePoint/CrystalsLayer1.mesh - false - - - - - - - - - - - - - - - - - - - - 6 - - - 0.10000000149011612 - - - - - - - - - - Models/Props/CapturePoint/DoubleSidedCylinder.mesh - - true - - - - - - - - - - - - - - 6 - - - 0.10000000149011612 - - - - - - - - - - Models/Props/CapturePoint/DoubleSidedCylinder.mesh - - true - - - - - - - - - - - - - - 6 - - - 0.10000000149011612 - - - - - - - - - - Models/Props/CapturePoint/DoubleSidedCylinder.mesh - - true - - - - - - - - - - - - - - 6 - - - 0.10000000149011612 - - - - - - - - - - Models/Props/CapturePoint/DoubleSidedCylinder.mesh - - true - - - - - - - - - - - - - - - - - - - Models/Props/CapturePoint/CapturePointBlue.mesh - false - - - - - - - - - - - - - - - 0.5 - - - - 20 - - - 3 - - - - - - - - - - - Models/Props/CapturePoint/CrystalsLayer2.mesh - - false - false - - - - - - - - - - - 0.30000001192092896 - - - - 30 - - - 3.5 - - - - - - - - - - - Models/Props/CapturePoint/CrystalsLayer1.mesh - - false - false - - - - - - - - - - - 0.10000000149011612 - - - - 10 - - - 0.5 - - - - - - - - - - - 1 - - - - - - - - - - - - 4.5 - 0.5 - false - - - - - - - - - - - - 4.5 - 0.5 - false - - - - - - - - - - - - 4.5 - 0.5 - false - - - - - - - - - - - - 4.5 - 0.5 - false - - - - - - - - - - - - - Models/Props/CapturePoint/CenterCrystal.mesh - - false - false - - - - - - - - - - - - - - - - - - - - 6 - - - 0.10000000149011612 - - - - - - - - - - Models/Props/CapturePoint/DoubleSidedCylinder.mesh - - false - true - - - - - - - - - - - - - - 6 - - - 0.10000000149011612 - - - - - - - - - - Models/Props/CapturePoint/DoubleSidedCylinder.mesh - - false - true - - - - - - - - - - - - - - 6 - - - 0.10000000149011612 - - - - - - - - - - Models/Props/CapturePoint/DoubleSidedCylinder.mesh - - false - true - - - - - - - - - - - - - - 6 - - - 0.10000000149011612 - - - - - - - - - - Models/Props/CapturePoint/DoubleSidedCylinder.mesh - - false - true - - - - - - - - - - - - - - - - - - - - 2 - - - - Models/Props/CapturePoint/CapturePointCylinder.mesh - - false - true - - - - - - - - - - - - - Models/Props/CapturePoint/CapturePointNeutral.mesh - - - - - - - - - - - - - - - 0.10000000149011612 - - - - 10 - - - 0.5 - - - - - - - - - - - 1 - - - - - - - - - - - 4.5 - 0.5 - - - - - - - - - - - 4.5 - 0.5 - - - - - - - - - - - 4.5 - 0.5 - - - - - - - - - - - 4.5 - 0.5 - - - - - - - - - - - - - Models/Props/CapturePoint/CenterCrystal.mesh - false - - - - - - - - - - - - - 0.30000001192092896 - - - - 30 - - - 3.5 - - - - - - - - - - - Models/Props/CapturePoint/CrystalsLayer1.mesh - false - - - - - - - - - - - 0.5 - - - - 20 - - - 3 - - - - - - - - - - - Models/Props/CapturePoint/CrystalsLayer2.mesh - false - - - - - - - - - - - - - - - - - - - - 6 - - - 0.10000000149011612 - - - - - - - - - - Models/Props/CapturePoint/DoubleSidedCylinder.mesh - - true - - - - - - - - - - - - - - 6 - - - 0.10000000149011612 - - - - - - - - - - Models/Props/CapturePoint/DoubleSidedCylinder.mesh - - true - - - - - - - - - - - - - - 6 - - - 0.10000000149011612 - - - - - - - - - - Models/Props/CapturePoint/DoubleSidedCylinder.mesh - - true - - - - - - - - - - - - - - 6 - - - 0.10000000149011612 - - - - - - - - - - Models/Props/CapturePoint/DoubleSidedCylinder.mesh - - true - - - - - - - - - - - - - - - - - - - Models/Props/CapturePoint/CapturePointRed.mesh - false - - - - - - - - - - - - - - - 0.5 - - - - 20 - - - 3 - - - - - - - - - - - Models/Props/CapturePoint/CrystalsLayer2.mesh - - false - false - - - - - - - - - - - 0.30000001192092896 - - - - 30 - - - 3.5 - - - - - - - - - - - Models/Props/CapturePoint/CrystalsLayer1.mesh - - false - false - - - - - - - - - - - 0.10000000149011612 - - - - 10 - - - 0.5 - - - - - - - - - - - Models/Props/CapturePoint/CenterCrystal.mesh - - false - false - - - - - - - - - - - 1 - - - - - - - - - - - - 4.5 - 0.5 - false - - - - - - - - - - - - 4.5 - 0.5 - false - - - - - - - - - - - - 4.5 - 0.5 - false - - - - - - - - - - - - 4.5 - 0.5 - false - - - - - - - - - - - - - - - - - - - - - - - - 6 - - - 0.10000000149011612 - - - - - - - - - - Models/Props/CapturePoint/DoubleSidedCylinder.mesh - - false - true - - - - - - - - - - - - - - 6 - - - 0.10000000149011612 - - - - - - - - - - Models/Props/CapturePoint/DoubleSidedCylinder.mesh - - false - true - - - - - - - - - - - - - - 6 - - - 0.10000000149011612 - - - - - - - - - - Models/Props/CapturePoint/DoubleSidedCylinder.mesh - - false - true - - - - - - - - - - - - - - 6 - - - 0.10000000149011612 - - - - - - - - - - Models/Props/CapturePoint/DoubleSidedCylinder.mesh - - false - true - - - - - - - - - - - - - - - - - - - Models/Props/CapturePoint/CapturePointBlue.mesh - false - - - - - - - - - - - - - - - 6 - - - 0.10000000149011612 - - - - - - - - - - Models/Props/CapturePoint/DoubleSidedCylinder.mesh - - false - true - - - - - - - - - - - - - - 6 - - - 0.10000000149011612 - - - - - - - - - - Models/Props/CapturePoint/DoubleSidedCylinder.mesh - - false - true - - - - - - - - - - - - - - 6 - - - 0.10000000149011612 - - - - - - - - - - Models/Props/CapturePoint/DoubleSidedCylinder.mesh - - false - true - - - - - - - - - - - - - - 6 - - - 0.10000000149011612 - - - - - - - - - - Models/Props/CapturePoint/DoubleSidedCylinder.mesh - - false - true - - - - - - - - - - - - - - - - - - - - - - - 0.10000000149011612 - - - - 10 - - - 0.5 - - - - - - - - - - - 1 - - - - - - - - - - - - 4.5 - 0.5 - false - - - - - - - - - - - - 4.5 - 0.5 - false - - - - - - - - - - - - 4.5 - 0.5 - false - - - - - - - - - - - - 4.5 - 0.5 - false - - - - - - - - - - - - - Models/Props/CapturePoint/CenterCrystal.mesh - - false - false - - - - - - - - - - - 0.5 - - - - 20 - - - 3 - - - - - - - - - - - Models/Props/CapturePoint/CrystalsLayer2.mesh - - false - false - - - - - - - - - - - 0.30000001192092896 - - - - 30 - - - 3.5 - - - - - - - - - - - Models/Props/CapturePoint/CrystalsLayer1.mesh - - false - false - - - - - - - - - - - - - - - - - 3 - - - - Models/Props/CapturePoint/CapturePointCylinder.mesh - - false - true - - - - - - - - - - - - - Models/Props/CapturePoint/CapturePointRed.mesh - false - - - - - - - - - - - - - - - 0.30000001192092896 - - - - 30 - - - 3.5 - - - - - - - - - - - Models/Props/CapturePoint/CrystalsLayer1.mesh - - false - false - - - - - - - - - - - 0.10000000149011612 - - - - 10 - - - 0.5 - - - - - - - - - - - 1 - - - - - - - - - - - - 4.5 - 0.5 - false - - - - - - - - - - - - 4.5 - 0.5 - false - - - - - - - - - - - - 4.5 - 0.5 - false - - - - - - - - - - - - 4.5 - 0.5 - false - - - - - - - - - - - - - Models/Props/CapturePoint/CenterCrystal.mesh - - false - false - - - - - - - - - - - - - 0.5 - - - - 20 - - - 3 - - - - - - - - - - - Models/Props/CapturePoint/CrystalsLayer2.mesh - - false - false - - - - - - - - - - - - - - - - - - - - 6 - - - 0.10000000149011612 - - - - - - - - - - Models/Props/CapturePoint/DoubleSidedCylinder.mesh - - false - true - - - - - - - - - - - - - - 6 - - - 0.10000000149011612 - - - - - - - - - - Models/Props/CapturePoint/DoubleSidedCylinder.mesh - - false - true - - - - - - - - - - - - - - 6 - - - 0.10000000149011612 - - - - - - - - - - Models/Props/CapturePoint/DoubleSidedCylinder.mesh - - false - true - - - - - - - - - - - - - - 6 - - - 0.10000000149011612 - - - - - - - - - - Models/Props/CapturePoint/DoubleSidedCylinder.mesh - - false - true - - - - - - - - - - - - - - - - - - - Models/Props/CapturePoint/CapturePointBlue.mesh - false - - - - - - - - - - - - - - - 6 - - - 0.10000000149011612 - - - - - - - - - - Models/Props/CapturePoint/DoubleSidedCylinder.mesh - - false - true - - - - - - - - - - - - - - 6 - - - 0.10000000149011612 - - - - - - - - - - Models/Props/CapturePoint/DoubleSidedCylinder.mesh - - false - true - - - - - - - - - - - - - - 6 - - - 0.10000000149011612 - - - - - - - - - - Models/Props/CapturePoint/DoubleSidedCylinder.mesh - - false - true - - - - - - - - - - - - - - 6 - - - 0.10000000149011612 - - - - - - - - - - Models/Props/CapturePoint/DoubleSidedCylinder.mesh - - false - true - - - - - - - - - - - - - - - - - - - - - - - 0.30000001192092896 - - - - 30 - - - 3.5 - - - - - - - - - - - Models/Props/CapturePoint/CrystalsLayer1.mesh - - false - false - - - - - - - - - - - 0.5 - - - - 20 - - - 3 - - - - - - - - - - - Models/Props/CapturePoint/CrystalsLayer2.mesh - - false - false - - - - - - - - - - - 0.10000000149011612 - - - - 10 - - - 0.5 - - - - - - - - - - - Models/Props/CapturePoint/CenterCrystal.mesh - - false - false - - - - - - - - - 1 - - - - - - - - - - - - 4.5 - 0.5 - false - - - - - - - - - - - - 4.5 - 0.5 - false - - - - - - - - - - - - 4.5 - 0.5 - false - - - - - - - - - - - - 4.5 - 0.5 - false - - - - - - - - - - - - - - - - - - - - Models/Props/CapturePoint/CapturePointNeutral.mesh - - - - - - - - - - - - - - - 0.5 - - - - 20 - - - 3 - - - - - - - - - - - Models/Props/CapturePoint/CrystalsLayer2.mesh - false - - - - - - - - - - - 0.10000000149011612 - - - - 10 - - - 0.5 - - - - - - - - - - - 1 - - - - - - - - - - - 4.5 - 0.5 - - - - - - - - - - - 4.5 - 0.5 - - - - - - - - - - - 4.5 - 0.5 - - - - - - - - - - - 4.5 - 0.5 - - - - - - - - - - - - - Models/Props/CapturePoint/CenterCrystal.mesh - false - - - - - - - - - - - - - 0.30000001192092896 - - - - 30 - - - 3.5 - - - - - - - - - - - Models/Props/CapturePoint/CrystalsLayer1.mesh - false - - - - - - - - - - - - - - - - - - - - 6 - - - 0.10000000149011612 - - - - - - - - - - Models/Props/CapturePoint/DoubleSidedCylinder.mesh - - true - - - - - - - - - - - - - - 6 - - - 0.10000000149011612 - - - - - - - - - - Models/Props/CapturePoint/DoubleSidedCylinder.mesh - - true - - - - - - - - - - - - - - 6 - - - 0.10000000149011612 - - - - - - - - - - Models/Props/CapturePoint/DoubleSidedCylinder.mesh - - true - - - - - - - - - - - - - - 6 - - - 0.10000000149011612 - - - - - - - - - - Models/Props/CapturePoint/DoubleSidedCylinder.mesh - - true - - - - - - - - - - - - - - - - - - - - 15 - - - - - - - - - - - Models/Props/CapturePoint/CapturePointCylinder.mesh - - false - true - - - - - - - - - - - - - Models/Props/CapturePoint/CapturePointRed.mesh - - - - - - - - - - - - - - - 0.10000000149011612 - - - - 10 - - - 0.5 - - - - - - - - - - - 1 - - - - - - - - - - - - 4.5 - 0.5 - - - - - - - - - - - - 4.5 - 0.5 - - - - - - - - - - - - 4.5 - 0.5 - - - - - - - - - - - - 4.5 - 0.5 - - - - - - - - - - - - - Models/Props/CapturePoint/CenterCrystal.mesh - - false - - - - - - - - - - - - - 0.30000001192092896 - - - - 30 - - - 3.5 - - - - - - - - - - - Models/Props/CapturePoint/CrystalsLayer1.mesh - - false - - - - - - - - - - - 0.5 - - - - 20 - - - 3 - - - - - - - - - - - Models/Props/CapturePoint/CrystalsLayer2.mesh - - false - - - - - - - - - - - - - - - - - - - - 6 - - - 0.10000000149011612 - - - - - - - - - - Models/Props/CapturePoint/DoubleSidedCylinder.mesh - - true - - - - - - - - - - - - - - 6 - - - 0.10000000149011612 - - - - - - - - - - Models/Props/CapturePoint/DoubleSidedCylinder.mesh - - true - - - - - - - - - - - - - - 6 - - - 0.10000000149011612 - - - - - - - - - - Models/Props/CapturePoint/DoubleSidedCylinder.mesh - - true - - - - - - - - - - - - - - 6 - - - 0.10000000149011612 - - - - - - - - - - Models/Props/CapturePoint/DoubleSidedCylinder.mesh - - true - - - - - - - - - - - - - - - - - - - Models/Props/CapturePoint/CapturePointNeutral.mesh - false - - - - - - - - - - - - - - - 0.10000000149011612 - - - - 10 - - - 0.5 - - - - - - - - - - - Models/Props/CapturePoint/CenterCrystal.mesh - false - false - - - - - - - - - - - 1 - - - - - - - - - - - 4.5 - 0.5 - false - - - - - - - - - - - 4.5 - 0.5 - false - - - - - - - - - - - 4.5 - 0.5 - false - - - - - - - - - - - 4.5 - 0.5 - false - - - - - - - - - - - - - - - 0.5 - - - - 20 - - - 3 - - - - - - - - - - - Models/Props/CapturePoint/CrystalsLayer2.mesh - false - false - - - - - - - - - - - 0.30000001192092896 - - - - 30 - - - 3.5 - - - - - - - - - - - Models/Props/CapturePoint/CrystalsLayer1.mesh - false - false - - - - - - - - - - - - - - - - - - - - 6 - - - 0.10000000149011612 - - - - - - - - - - Models/Props/CapturePoint/DoubleSidedCylinder.mesh - - false - true - - - - - - - - - - - - - - 6 - - - 0.10000000149011612 - - - - - - - - - - Models/Props/CapturePoint/DoubleSidedCylinder.mesh - - false - true - - - - - - - - - - - - - - 6 - - - 0.10000000149011612 - - - - - - - - - - Models/Props/CapturePoint/DoubleSidedCylinder.mesh - - false - true - - - - - - - - - - - - - - 6 - - - 0.10000000149011612 - - - - - - - - - - Models/Props/CapturePoint/DoubleSidedCylinder.mesh - - false - true - - - - - - - - - - - - - - - - - - - Models/Props/CapturePoint/CapturePointBlue.mesh - false - - - - - - - - - - - - - - - 0.5 - - - - 20 - - - 3 - - - - - - - - - - - Models/Props/CapturePoint/CrystalsLayer2.mesh - - false - false - true - - - - - - - - - - - 0.10000000149011612 - - - - 10 - - - 0.5 - - - - - - - - - - - Models/Props/CapturePoint/CenterCrystal.mesh - - false - false - - - - - - - - - 1 - - - - - - - - - - - - 4.5 - 0.5 - false - - - - - - - - - - - - 4.5 - 0.5 - false - - - - - - - - - - - - 4.5 - 0.5 - false - - - - - - - - - - - - 4.5 - 0.5 - false - - - - - - - - - - - - - - - 0.30000001192092896 - - - - 30 - - - 3.5 - - - - - - - - - - - Models/Props/CapturePoint/CrystalsLayer1.mesh - - false - false - - - - - - - - - - - - - - - - - - - - 6 - - - 0.10000000149011612 - - - - - - - - - - Models/Props/CapturePoint/DoubleSidedCylinder.mesh - - false - true - - - - - - - - - - - - - - 6 - - - 0.10000000149011612 - - - - - - - - - - Models/Props/CapturePoint/DoubleSidedCylinder.mesh - - false - true - - - - - - - - - - - - - - 6 - - - 0.10000000149011612 - - - - - - - - - - Models/Props/CapturePoint/DoubleSidedCylinder.mesh - - false - true - - - - - - - - - - - - - - 6 - - - 0.10000000149011612 - - - - - - - - - - Models/Props/CapturePoint/DoubleSidedCylinder.mesh - - false - true - - - - - - - - - - - - - - - - - - - - -15 - - - - 4 - - - - - - - - Models/Props/CapturePoint/CapturePointCylinder.mesh - - false - true - - - - - - - - - - - - - Models/Props/CapturePoint/CapturePointNeutral.mesh - false - - - - - - - - - - - - - - - 0.10000000149011612 - - - - 10 - - - 0.5 - - - - - - - - - - - 1 - - - - - - - - - - - 4.5 - 0.5 - - - - - - - - - - - 4.5 - 0.5 - - - - - - - - - - - 4.5 - 0.5 - - - - - - - - - - - 4.5 - 0.5 - - - - - - - - - - - - - Models/Props/CapturePoint/CenterCrystal.mesh - false - false - - - - - - - - - - - - - 0.30000001192092896 - - - - 30 - - - 3.5 - - - - - - - - - - - Models/Props/CapturePoint/CrystalsLayer1.mesh - false - false - - - - - - - - - - - 0.5 - - - - 20 - - - 3 - - - - - - - - - - - Models/Props/CapturePoint/CrystalsLayer2.mesh - false - false - - - - - - - - - - - - - - - - - - - - 6 - - - 0.10000000149011612 - - - - - - - - - - Models/Props/CapturePoint/DoubleSidedCylinder.mesh - - false - true - - - - - - - - - - - - - - 6 - - - 0.10000000149011612 - - - - - - - - - - Models/Props/CapturePoint/DoubleSidedCylinder.mesh - - false - true - - - - - - - - - - - - - - 6 - - - 0.10000000149011612 - - - - - - - - - - Models/Props/CapturePoint/DoubleSidedCylinder.mesh - - false - true - - - - - - - - - - - - - - 6 - - - 0.10000000149011612 - - - - - - - - - - Models/Props/CapturePoint/DoubleSidedCylinder.mesh - - false - true - - - - - - - - - - - - - - - - - - - Models/Props/CapturePoint/CapturePointRed.mesh - false - - - - - - - - - - - - - - - 0.10000000149011612 - - - - 10 - - - 0.5 - - - - - - - - - - - Models/Props/CapturePoint/CenterCrystal.mesh - - false - false - - - - - - - - - - - 1 - - - - - - - - - - - - 4.5 - 0.5 - - - - - - - - - - - - 4.5 - 0.5 - - - - - - - - - - - - 4.5 - 0.5 - - - - - - - - - - - - 4.5 - 0.5 - - - - - - - - - - - - - - - 0.5 - - - - 20 - - - 3 - - - - - - - - - - - Models/Props/CapturePoint/CrystalsLayer2.mesh - - false - false - - - - - - - - - - - 0.30000001192092896 - - - - 30 - - - 3.5 - - - - - - - - - - - Models/Props/CapturePoint/CrystalsLayer1.mesh - - false - false - - - - - - - - - - - - - - - - - - - - 6 - - - 0.10000000149011612 - - - - - - - - - - Models/Props/CapturePoint/DoubleSidedCylinder.mesh - - false - true - - - - - - - - - - - - - - 6 - - - 0.10000000149011612 - - - - - - - - - - Models/Props/CapturePoint/DoubleSidedCylinder.mesh - - false - true - - - - - - - - - - - - - - 6 - - - 0.10000000149011612 - - - - - - - - - - Models/Props/CapturePoint/DoubleSidedCylinder.mesh - - false - true - - - - - - - - - - - - - - 6 - - - 0.10000000149011612 - - - - - - - - - - Models/Props/CapturePoint/DoubleSidedCylinder.mesh - - false - true - - - - - - - - - - - - - - - - - - - Models/Props/CapturePoint/CapturePointBlue.mesh - - - - - - - - - - - - - - - 0.5 - - - - 20 - - - 3 - - - - - - - - - - - Models/Props/CapturePoint/CrystalsLayer2.mesh - - false - - - - - - - - - - - 0.30000001192092896 - - - - 30 - - - 3.5 - - - - - - - - - - - Models/Props/CapturePoint/CrystalsLayer1.mesh - - false - - - - - - - - - - - 0.10000000149011612 - - - - 10 - - - 0.5 - - - - - - - - - - - Models/Props/CapturePoint/CenterCrystal.mesh - - false - - - - - - - - - 1 - - - - - - - - - - - - 4.5 - 0.5 - - - - - - - - - - - - 4.5 - 0.5 - - - - - - - - - - - - 4.5 - 0.5 - - - - - - - - - - - - 4.5 - 0.5 - - - - - - - - - - - - - - - - - - - - - - - - 6 - - - 0.10000000149011612 - - - - - - - - - - Models/Props/CapturePoint/DoubleSidedCylinder.mesh - - true - - - - - - - - - - - - - - 6 - - - 0.10000000149011612 - - - - - - - - - - Models/Props/CapturePoint/DoubleSidedCylinder.mesh - - true - - - - - - - - - - - - - - 6 - - - 0.10000000149011612 - - - - - - - - - - Models/Props/CapturePoint/DoubleSidedCylinder.mesh - - true - - - - - - - - - - - - - - 6 - - - 0.10000000149011612 - - - - - - - - - - Models/Props/CapturePoint/DoubleSidedCylinder.mesh - - true - - - - - - - - - - - - - - - - - - diff --git a/src/Engine/Rendering/DrawBloomPass.cpp b/src/Engine/Rendering/DrawBloomPass.cpp index f8b50899..adc18062 100644 --- a/src/Engine/Rendering/DrawBloomPass.cpp +++ b/src/Engine/Rendering/DrawBloomPass.cpp @@ -81,7 +81,7 @@ void DrawBloomPass::InitializeBuffers() CommonFunctions::GenerateMipMapTexture( &m_GaussianTexture_vert, GL_CLAMP_TO_BORDER, glm::vec2(m_Renderer->GetViewportSize().Width, m_Renderer->GetViewportSize().Height), GL_RGB8, GL_RGB, GL_FLOAT, m_BloomLod); - CommonFunctions::GenerateTexture(&m_FinalGaussianTexture, GL_CLAMP_TO_BORDER, GL_LINEAR, glm::vec2(m_Renderer->GetViewportSize().Width, m_Renderer->GetViewportSize().Height), GL_RGB8, GL_RGB, GL_FLOAT); + CommonFunctions::GenerateTexture(&m_FinalGaussianTexture, GL_CLAMP_TO_BORDER, GL_LINEAR, glm::vec2(m_Renderer->GetViewportSize().Width, m_Renderer->GetViewportSize().Height), GL_RGB16F, GL_RGB, GL_FLOAT); if (m_GaussianCombineBuffer.GetHandle() == 0) { m_GaussianCombineBuffer.AddResource(std::shared_ptr(new Texture2D(&m_FinalGaussianTexture, GL_COLOR_ATTACHMENT0))); From a9d5c5d9d2e16aeabe97b957bf3cf2dde7b5c861 Mon Sep 17 00:00:00 2001 From: Teejoon Date: Sun, 13 Mar 2016 17:15:36 +0100 Subject: [PATCH 7/9] Glow is looking good :) --- include/Engine/Rendering/Util/CommonFunctions.h | 2 +- src/Engine/Rendering/DrawBloomPass.cpp | 6 +++--- src/Engine/Rendering/Util/CommonFunctions.cpp | 6 +++--- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/include/Engine/Rendering/Util/CommonFunctions.h b/include/Engine/Rendering/Util/CommonFunctions.h index 3ef1627a..5a60c5c9 100644 --- a/include/Engine/Rendering/Util/CommonFunctions.h +++ b/include/Engine/Rendering/Util/CommonFunctions.h @@ -27,7 +27,7 @@ Texture* TryLoadResource(std::string path) void GenerateTexture(GLuint* texture, GLenum wrapping, GLenum filtering, glm::vec2 dimensions, GLint internalFormat, GLint format, GLenum type); void GenerateMultiSampleTexture(GLuint* texture, int numSamples, glm::vec2 dimensions, GLint internalFormat); -void GenerateMipMapTexture(GLuint* texture, GLenum wrapping, glm::vec2 dimensions, GLint internalFormat, GLint format, GLenum type, GLint numMipMaps); +void GenerateMipMapTexture(GLuint* texture, GLenum wrapping, glm::vec2 dimensions, GLint internalFormat, GLint format, GLenum type, GLint numMipMaps, GLint MAGFilter, GLint MINFilter); void DeleteTexture(GLuint* texture); }; diff --git a/src/Engine/Rendering/DrawBloomPass.cpp b/src/Engine/Rendering/DrawBloomPass.cpp index adc18062..13d1a934 100644 --- a/src/Engine/Rendering/DrawBloomPass.cpp +++ b/src/Engine/Rendering/DrawBloomPass.cpp @@ -77,11 +77,11 @@ void DrawBloomPass::InitializeBuffers() { CommonFunctions::GenerateMipMapTexture( &m_GaussianTexture_horiz, GL_CLAMP_TO_BORDER, glm::vec2(m_Renderer->GetViewportSize().Width, m_Renderer->GetViewportSize().Height), - GL_RGB8, GL_RGB, GL_FLOAT, m_BloomLod); + GL_RGB16F, GL_RGB, GL_FLOAT, m_BloomLod, GL_LINEAR, GL_LINEAR_MIPMAP_NEAREST); CommonFunctions::GenerateMipMapTexture( &m_GaussianTexture_vert, GL_CLAMP_TO_BORDER, glm::vec2(m_Renderer->GetViewportSize().Width, m_Renderer->GetViewportSize().Height), - GL_RGB8, GL_RGB, GL_FLOAT, m_BloomLod); - CommonFunctions::GenerateTexture(&m_FinalGaussianTexture, GL_CLAMP_TO_BORDER, GL_LINEAR, glm::vec2(m_Renderer->GetViewportSize().Width, m_Renderer->GetViewportSize().Height), GL_RGB16F, GL_RGB, GL_FLOAT); + GL_RGB16F, GL_RGB, GL_FLOAT, m_BloomLod, GL_LINEAR, GL_LINEAR_MIPMAP_NEAREST); + CommonFunctions::GenerateTexture(&m_FinalGaussianTexture, GL_CLAMP_TO_BORDER, GL_NEAREST, glm::vec2(m_Renderer->GetViewportSize().Width, m_Renderer->GetViewportSize().Height), GL_RGB16F, GL_RGB, GL_FLOAT); if (m_GaussianCombineBuffer.GetHandle() == 0) { m_GaussianCombineBuffer.AddResource(std::shared_ptr(new Texture2D(&m_FinalGaussianTexture, GL_COLOR_ATTACHMENT0))); diff --git a/src/Engine/Rendering/Util/CommonFunctions.cpp b/src/Engine/Rendering/Util/CommonFunctions.cpp index 973f9f9e..b24a3a9e 100644 --- a/src/Engine/Rendering/Util/CommonFunctions.cpp +++ b/src/Engine/Rendering/Util/CommonFunctions.cpp @@ -24,7 +24,7 @@ void CommonFunctions::GenerateMultiSampleTexture(GLuint* texture, int numSamples } -void CommonFunctions::GenerateMipMapTexture(GLuint* texture, GLenum wrapping, glm::vec2 dimensions, GLint internalFormat, GLint format, GLenum type, GLint numMipMaps) +void CommonFunctions::GenerateMipMapTexture(GLuint* texture, GLenum wrapping, glm::vec2 dimensions, GLint internalFormat, GLint format, GLenum type, GLint numMipMaps, GLint MAGFilter, GLint MINFilter) { glDeleteTextures(1, texture); glGenTextures(1, texture); @@ -35,8 +35,8 @@ void CommonFunctions::GenerateMipMapTexture(GLuint* texture, GLenum wrapping, gl glGenerateMipmap(GL_TEXTURE_2D); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, wrapping); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, wrapping); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, MAGFilter); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, MINFilter); GLERROR("MipMap Texture initialization failed"); } From 5aaefc6e53e8fe1597d581ac0bc1549b6b95a247 Mon Sep 17 00:00:00 2001 From: Teejoon Date: Sun, 13 Mar 2016 19:01:30 +0100 Subject: [PATCH 8/9] Animation optimization --- include/Engine/Rendering/Skeleton.h | 5 +- .../Shaders/ForwardPlusSkinned.vert.glsl | 2 - resources/Shaders/PickingSkinned.vert.glsl | 2 - resources/Shaders/ShadowSkinned.vert.glsl | 2 - src/Engine/Rendering/Skeleton.cpp | 60 +++++++++---------- 5 files changed, 34 insertions(+), 37 deletions(-) diff --git a/include/Engine/Rendering/Skeleton.h b/include/Engine/Rendering/Skeleton.h index 3711c8b2..d14ab4ae 100644 --- a/include/Engine/Rendering/Skeleton.h +++ b/include/Engine/Rendering/Skeleton.h @@ -20,11 +20,14 @@ public: , Parent(parent) , Name(name) , OffsetMatrix(offsetMatrix) - { } + { + BindTransformMatrix = glm::inverse(offsetMatrix); + } std::string Name; glm::mat4 OffsetMatrix; int ID; + glm::mat4 BindTransformMatrix; Bone* Parent; std::vector Children; diff --git a/resources/Shaders/ForwardPlusSkinned.vert.glsl b/resources/Shaders/ForwardPlusSkinned.vert.glsl index 0a64c124..427e33ba 100644 --- a/resources/Shaders/ForwardPlusSkinned.vert.glsl +++ b/resources/Shaders/ForwardPlusSkinned.vert.glsl @@ -36,12 +36,10 @@ void main() { mat4 boneTransform = mat4(1); - if(BoneWeights[0] > 0.0f){ boneTransform = BoneWeights[0] * Bones[int(BoneIndices[0])] + BoneWeights[1] * Bones[int(BoneIndices[1])] + BoneWeights[2] * Bones[int(BoneIndices[2])] + BoneWeights[3] * Bones[int(BoneIndices[3])]; - } gl_Position = PVM*boneTransform * vec4(Position, 1.0); diff --git a/resources/Shaders/PickingSkinned.vert.glsl b/resources/Shaders/PickingSkinned.vert.glsl index 4d72fa49..44061e64 100644 --- a/resources/Shaders/PickingSkinned.vert.glsl +++ b/resources/Shaders/PickingSkinned.vert.glsl @@ -17,12 +17,10 @@ out VertexData{ void main() { mat4 boneTransform = mat4(1); - if(BoneWeights[0] > 0.0f){ boneTransform = BoneWeights[0] * Bones[int(BoneIndices[0])] + BoneWeights[1] * Bones[int(BoneIndices[1])] + BoneWeights[2] * Bones[int(BoneIndices[2])] + BoneWeights[3] * Bones[int(BoneIndices[3])]; - } gl_Position = PVM*boneTransform * vec4(Position, 1.0); Output.Position = (boneTransform * vec4(Position, 1.0)).xyz; diff --git a/resources/Shaders/ShadowSkinned.vert.glsl b/resources/Shaders/ShadowSkinned.vert.glsl index d627e2e6..ce20aec2 100644 --- a/resources/Shaders/ShadowSkinned.vert.glsl +++ b/resources/Shaders/ShadowSkinned.vert.glsl @@ -15,12 +15,10 @@ out VertexData{ void main() { mat4 boneTransform = mat4(1); - if(BoneWeights[0] > 0.0f){ boneTransform = BoneWeights[0] * Bones[int(BoneIndices[0])] + BoneWeights[1] * Bones[int(BoneIndices[1])] + BoneWeights[2] * Bones[int(BoneIndices[2])] + BoneWeights[3] * Bones[int(BoneIndices[3])]; - } gl_Position = PVM * boneTransform * vec4(Position, 1.0); Output.TextureCoordinate = TextureCoords; diff --git a/src/Engine/Rendering/Skeleton.cpp b/src/Engine/Rendering/Skeleton.cpp index 2883c53d..eb6a130d 100644 --- a/src/Engine/Rendering/Skeleton.cpp +++ b/src/Engine/Rendering/Skeleton.cpp @@ -33,33 +33,33 @@ void Skeleton::AccumulateBoneTransforms(bool noRootMotion, const Animation* anim PoseData poseData; if (animation->JointAnimations.find(bone->ID) != animation->JointAnimations.end()) { - std::vector boneKeyFrames = animation->JointAnimations.at(bone->ID); + const std::vector& boneKeyFrames = animation->JointAnimations.at(bone->ID); - Animation::Keyframe currentFrame; - Animation::Keyframe nextFrame; + const Animation::Keyframe* currentFrame; + const Animation::Keyframe* nextFrame; if (boneKeyFrames.size() > 1) { // 2+ keyframes for the current bone for (int index = boneKeyFrames.size()-1; index >= 0; index--) { // find the bone keyframes that surrounds the current frame if (time >= boneKeyFrames.at(index).Time) { - currentFrame = boneKeyFrames.at(index); - nextFrame = boneKeyFrames.at((index + 1) % boneKeyFrames.size()); + currentFrame = &boneKeyFrames.at(index); + nextFrame = &boneKeyFrames.at((index + 1) % boneKeyFrames.size()); break; } } float progress; - if (nextFrame.Index == 0) { + if (nextFrame->Index == 0) { nextFrame = currentFrame; - progress = (time - currentFrame.Time) / (animation->Duration - currentFrame.Time); + progress = (time - currentFrame->Time) / (animation->Duration - currentFrame->Time); } else { - progress = (time - currentFrame.Time) / (nextFrame.Time - currentFrame.Time); + progress = (time - currentFrame->Time) / (nextFrame->Time - currentFrame->Time); } progress = glm::clamp(progress, 0.0f, 1.0f); - Animation::Keyframe::BoneProperty currentBoneProperty = currentFrame.BoneProperties; - Animation::Keyframe::BoneProperty nextBoneProperty = nextFrame.BoneProperties; + const Animation::Keyframe::BoneProperty& currentBoneProperty = currentFrame->BoneProperties; + const Animation::Keyframe::BoneProperty& nextBoneProperty = nextFrame->BoneProperties; glm::vec3 position = currentBoneProperty.Position * (1.f - progress) + nextBoneProperty.Position * progress; glm::quat rotation = glm::normalize(glm::slerp(currentBoneProperty.Rotation, nextBoneProperty.Rotation, progress)); @@ -77,10 +77,10 @@ void Skeleton::AccumulateBoneTransforms(bool noRootMotion, const Animation* anim boneMatrices[bone->ID] = poseData; } else { // 1 keyframes for the current bone - currentFrame = boneKeyFrames.at(0); - poseData.Translation = currentFrame.BoneProperties.Position; - poseData.Orientation = currentFrame.BoneProperties.Rotation; - poseData.Scale = currentFrame.BoneProperties.Scale; + currentFrame = &boneKeyFrames.at(0); + poseData.Translation = currentFrame->BoneProperties.Position; + poseData.Orientation = currentFrame->BoneProperties.Rotation; + poseData.Scale = currentFrame->BoneProperties.Scale; boneMatrices[bone->ID] = poseData; } } @@ -117,33 +117,33 @@ Skeleton::PoseData Skeleton::GetAdditiveBonePose(const Bone* bone, const Animati glm::vec3 scale = glm::vec3(1); if (animation->JointAnimations.find(bone->ID) != animation->JointAnimations.end()) { - std::vector boneKeyFrames = animation->JointAnimations.at(bone->ID); + const std::vector& boneKeyFrames = animation->JointAnimations.at(bone->ID); - Animation::Keyframe currentFrame; - Animation::Keyframe nextFrame; + const Animation::Keyframe* currentFrame; + const Animation::Keyframe* nextFrame; if (boneKeyFrames.size() > 1) { // 2+ keyframes for the current bone for (int index = boneKeyFrames.size()-1; index >= 0; index--) { // find the bone keyframes that surrounds the current frame if (time >= boneKeyFrames.at(index).Time) { - currentFrame = boneKeyFrames.at(index); - nextFrame = boneKeyFrames.at((index + 1) % boneKeyFrames.size()); + currentFrame = &boneKeyFrames.at(index); + nextFrame = &boneKeyFrames.at((index + 1) % boneKeyFrames.size()); break; } } float progress; - if (nextFrame.Index == 0) { + if (nextFrame->Index == 0) { nextFrame = currentFrame; - progress = (time - currentFrame.Time) / (animation->Duration - currentFrame.Time); + progress = (time - currentFrame->Time) / (animation->Duration - currentFrame->Time); } else { - progress = (time - currentFrame.Time) / (nextFrame.Time - currentFrame.Time); + progress = (time - currentFrame->Time) / (nextFrame->Time - currentFrame->Time); } progress = glm::clamp(progress, 0.0f, 1.0f); - Animation::Keyframe::BoneProperty currentBoneProperty = currentFrame.BoneProperties; - Animation::Keyframe::BoneProperty nextBoneProperty = nextFrame.BoneProperties; + const Animation::Keyframe::BoneProperty& currentBoneProperty = currentFrame->BoneProperties; + const Animation::Keyframe::BoneProperty& nextBoneProperty = nextFrame->BoneProperties; position = currentBoneProperty.Position * (1.f - progress) + nextBoneProperty.Position * progress; rotation = glm::slerp(currentBoneProperty.Rotation, nextBoneProperty.Rotation, progress); @@ -151,10 +151,10 @@ Skeleton::PoseData Skeleton::GetAdditiveBonePose(const Bone* bone, const Animati } else { // 1 keyframes for the current bone - currentFrame = boneKeyFrames.at(0); - position = currentFrame.BoneProperties.Position; - rotation = currentFrame.BoneProperties.Rotation; - scale = currentFrame.BoneProperties.Scale; + currentFrame = &boneKeyFrames.at(0); + position = currentFrame->BoneProperties.Position; + rotation = currentFrame->BoneProperties.Rotation; + scale = currentFrame->BoneProperties.Scale; } } @@ -270,10 +270,10 @@ void Skeleton::AccumulateFinalPose(std::map& boneMatrices, std:: boneMatrices[bone->ID] = boneMatrix * bone->OffsetMatrix; } else { if (bone->Parent) { - boneMatrix = parentMatrix * (glm::inverse(bone->OffsetMatrix) * bone->Parent->OffsetMatrix); + boneMatrix = parentMatrix * bone->BindTransformMatrix * bone->Parent->OffsetMatrix; boneMatrices[bone->ID] = boneMatrix * bone->OffsetMatrix; } else { - boneMatrix = glm::inverse(bone->OffsetMatrix); + boneMatrix = bone->BindTransformMatrix; boneMatrices[bone->ID] = parentMatrix; } } From 5796d07b56c32a68dff9370a5997e5bc6c69354d Mon Sep 17 00:00:00 2001 From: Teejoon Date: Sun, 13 Mar 2016 21:25:32 +0100 Subject: [PATCH 9/9] PerformanceTimer will no longer run while in release --- include/Engine/Core/PerformanceTimer.h | 5 +++++ src/Engine/Core/PerformanceTimer.cpp | 15 +++++++++++++++ 2 files changed, 20 insertions(+) diff --git a/include/Engine/Core/PerformanceTimer.h b/include/Engine/Core/PerformanceTimer.h index a3cdfa92..b7e0c60a 100644 --- a/include/Engine/Core/PerformanceTimer.h +++ b/include/Engine/Core/PerformanceTimer.h @@ -2,8 +2,11 @@ #define PerformanceTimer_h__ #include "../Common.h" + +#ifdef DEBUG #include using boost::timer::cpu_timer; +#endif //DEBUG class PerformanceTimer { @@ -17,9 +20,11 @@ public: static void CreateExcelData(); private: +#ifdef DEBUG static std::map timers; static cpu_timer m_Timer; static std::string currentTimerRunning; +#endif //DEBUG }; #endif diff --git a/src/Engine/Core/PerformanceTimer.cpp b/src/Engine/Core/PerformanceTimer.cpp index 50983e79..b2e425aa 100644 --- a/src/Engine/Core/PerformanceTimer.cpp +++ b/src/Engine/Core/PerformanceTimer.cpp @@ -1,7 +1,10 @@ #include "Core/PerformanceTimer.h" + +#ifdef DEBUG #include #include + cpu_timer PerformanceTimer::m_Timer; std::map PerformanceTimer::timers; std::string PerformanceTimer::currentTimerRunning = ""; @@ -74,3 +77,15 @@ void PerformanceTimer::CreateExcelData() } someFileStream.close(); } + +#else + +void PerformanceTimer::StartTimer(std::string nameOfTimer) {}; +void PerformanceTimer::StartTimerAndStopPrevious(std::string nameOfTimer) {}; +void PerformanceTimer::StopTimer(std::string nameOfTimer) {}; +void PerformanceTimer::SetFrameNumber(int frameNumber) {}; + +void PerformanceTimer::ResetAllTimers() {}; +void PerformanceTimer::CreateExcelData() {}; + +#endif //DEBUG