From 1ad087dc753a6ff21bbd4beeb6b725131db672d6 Mon Sep 17 00:00:00 2001 From: Teejoon Date: Fri, 11 Mar 2016 19:05:34 +0100 Subject: [PATCH 01/13] 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 02/13] 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 03/13] 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 04/13] 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 05/13] 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 9b5e4c10fdce35f9175c25c00a35ff9f001cb138 Mon Sep 17 00:00:00 2001 From: FakeShemp Date: Sun, 13 Mar 2016 16:19:17 +0100 Subject: [PATCH 06/13] Shadow will actually shut itself off and delete itself now --- include/Engine/Rendering/DrawFinalPass.h | 1 + include/Engine/Rendering/Renderer.h | 1 + include/Engine/Rendering/ShadowPass.h | 9 +- .../Shaders/ForwardPlusNoShadows.frag.glsl | 204 +++++++++++++ src/Engine/Rendering/DrawFinalPass.cpp | 57 +++- src/Engine/Rendering/Renderer.cpp | 2 + src/Engine/Rendering/ShadowPass.cpp | 275 ++++++++++-------- 7 files changed, 409 insertions(+), 140 deletions(-) create mode 100644 resources/Shaders/ForwardPlusNoShadows.frag.glsl diff --git a/include/Engine/Rendering/DrawFinalPass.h b/include/Engine/Rendering/DrawFinalPass.h index 26712088..f37e3cc8 100644 --- a/include/Engine/Rendering/DrawFinalPass.h +++ b/include/Engine/Rendering/DrawFinalPass.h @@ -76,6 +76,7 @@ private: const ShadowPass* m_ShadowPass; ShaderProgram* m_ForwardPlusProgram; + ShaderProgram* m_ForwardPlusNoShadowsProgram; ShaderProgram* m_ExplosionEffectProgram; ShaderProgram* m_ExplosionEffectSplatMapProgram; ShaderProgram* m_SpriteProgram; diff --git a/include/Engine/Rendering/Renderer.h b/include/Engine/Rendering/Renderer.h index 51cf62e7..41653739 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; + bool m_Shadow_Enabled = true; PickingPass* m_PickingPass; LightCullingPass* m_LightCullingPass; diff --git a/include/Engine/Rendering/ShadowPass.h b/include/Engine/Rendering/ShadowPass.h index 122fbddd..1ec62be0 100644 --- a/include/Engine/Rendering/ShadowPass.h +++ b/include/Engine/Rendering/ShadowPass.h @@ -38,6 +38,8 @@ public: void ClearBuffer(); void Draw(RenderScene& scene); + void CheckStatus(bool status); + void DebugGUI(); GLuint DepthMap() const { return m_DepthMap; } @@ -45,6 +47,7 @@ public: std::array LightV() const { return m_LightView; } std::array FarDistance() const { std::array f; for (int i = 0; i < MAX_SPLITS; i++) f[i] = m_shadowFrusta[i].FarClip; return f; } int CurrentNrOfSplits() const { return m_CurrentNrOfSplits; } + bool EnableShadows() const { return m_EnableShadows; } void SetSplitWeight(float split_weight) { m_SplitWeight = split_weight; }; private: @@ -63,8 +66,8 @@ private: GLuint m_DepthMap; FrameBuffer m_DepthBuffer; - ShaderProgram* m_ShadowProgram; - ShaderProgram* m_ShadowProgramSkinned; + ShaderProgram* m_ShadowProgram; + ShaderProgram* m_ShadowProgramSkinned; std::array m_LightProjection; std::array m_LightView; @@ -75,7 +78,7 @@ private: bool m_TransparentObjects = false; bool m_TexturedShadows = false; - bool m_EnableShadows = true; + bool m_EnableShadows = false; int m_CurrentNrOfSplits = 4; float m_SplitWeight = 0.962f; diff --git a/resources/Shaders/ForwardPlusNoShadows.frag.glsl b/resources/Shaders/ForwardPlusNoShadows.frag.glsl new file mode 100644 index 00000000..a0618edf --- /dev/null +++ b/resources/Shaders/ForwardPlusNoShadows.frag.glsl @@ -0,0 +1,204 @@ +#version 430 + +#define MIN_AMBIENT_LIGHT 0.3 +#define MAX_SPLITS 4 + +uniform mat4 VM; +uniform mat4 M; +uniform mat4 V; +uniform mat4 P; +uniform vec4 Color; +uniform vec4 DiffuseColor; +uniform vec2 ScreenDimensions; +uniform vec4 FillColor; +uniform vec4 AmbientColor; +uniform float FillPercentage; +uniform float GlowIntensity; +uniform vec3 CameraPosition; +uniform int SSAOQuality; +uniform float FarDistance[MAX_SPLITS]; + +uniform vec2 DiffuseUVRepeat; +uniform vec2 NormalUVRepeat; +uniform vec2 SpecularUVRepeat; +uniform vec2 GlowUVRepeat; +layout (binding = 0) uniform sampler2D AOTexture; +layout (binding = 1) uniform sampler2D DiffuseTexture; +layout (binding = 2) uniform sampler2D NormalMapTexture; +layout (binding = 3) uniform sampler2D SpecularMapTexture; +layout (binding = 4) uniform sampler2D GlowMapTexture; +layout (binding = 5) uniform samplerCube CubeMap; + +#define TILE_SIZE 16 + +struct LightSource { + vec4 Position; + vec4 Direction; + vec4 Color; + float Radius; + float Intensity; + float Falloff; + int Type; +}; + +layout (std430, binding = 1) buffer LightBuffer +{ + LightSource List[]; +} LightSources; + +struct LightGrid { + float Start; + float Amount; + vec2 Padding; +}; + +layout (std430, binding = 2) buffer LightGridBuffer +{ + LightGrid Data[]; +} LightGrids; + +layout (std430, binding = 4) buffer LightIndexBuffer +{ + float LightIndex[]; +}; + +in VertexData{ + vec3 Position; + vec3 Normal; + vec3 Tangent; + vec3 BiTangent; + vec2 TextureCoordinate; + vec4 ExplosionColor; + float ExplosionPercentageElapsed; + vec4 PositionLightSpace[MAX_SPLITS]; +}Input; + +out vec4 sceneColor; +out vec4 bloomColor; + +struct LightResult { + vec4 Diffuse; + vec4 Specular; +}; + +float CalcAttenuation(float radius, float dist, float falloff) { + return 1.0 - smoothstep(radius * falloff, radius, dist); +} + +vec4 CalcSpecular(vec4 lightColor, vec4 viewVec, vec4 lightVec, vec4 normal) { + vec4 R = normalize( reflect(-lightVec, normal)); + float RdotV = max( dot(R, viewVec), 0.0); + return lightColor * pow(RdotV, 90.0); +} + +vec4 CalcDiffuse(vec4 lightColor, vec4 lightVec, vec4 normal) { + float power = max( dot(normal, lightVec), 0.0); + return lightColor * power; +} + +LightResult CalcPointLightSource(vec4 lightPos, float lightRadius, vec4 lightColor, float intensity, vec4 viewVec, vec4 position, vec4 normal, float falloff) +{ + vec4 L = lightPos - position; + float dist = length(L); + L = normalize(L); + + float attenuation = CalcAttenuation(lightRadius, dist, falloff); + + LightResult result; + result.Diffuse = CalcDiffuse(lightColor, L, normal) * attenuation * intensity; + result.Specular = CalcSpecular(lightColor, viewVec, L, normal) * attenuation * intensity; + return result; +} + +LightResult CalcDirectionalLightSource(vec4 direction, vec4 color, float intensity, vec4 viewVec, vec4 vertNormal) +{ + vec4 L = normalize( -vec4(direction.xyz, 0) ); + + LightResult result; + result.Diffuse = CalcDiffuse(color, L, vertNormal) * intensity; + result.Specular = CalcSpecular(color, viewVec, L, vertNormal) * intensity; + return result; +} + +vec4 CalcNormalMappedValue(vec3 normal, vec3 tangent, vec3 bitangent, vec2 textureCoordinate, sampler2D normalMap) +{ + mat3 TBN = mat3(tangent, bitangent, normal); + vec3 NormalMap = texture(normalMap, textureCoordinate).xyz * 2.0 - vec3(1.0); + return vec4(TBN * normalize(NormalMap), 0.0); +} + +void main() +{ + float ao = texelFetch(AOTexture, ivec2(gl_FragCoord.xy) >> int(SSAOQuality), 0).r; + ao = (clamp(1.0 - (1.0 - ao), 0.0, 1.0) + MIN_AMBIENT_LIGHT) / (1.0 + MIN_AMBIENT_LIGHT); + 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); + vec3 I = normalize(vec3(M * vec4(Input.Position, 1.0)) - CameraPosition); + vec3 R = reflect(-I, Input.Normal); + //R = vec3(P * vec4(R, 1.0)); + vec4 reflectionColor = texture(CubeMap, R); + + vec2 tilePos; + tilePos.x = int(gl_FragCoord.x/TILE_SIZE); + tilePos.y = int(gl_FragCoord.y/TILE_SIZE); + + LightResult totalLighting; + totalLighting.Diffuse = vec4(AmbientColor.rgb * ao, 1.0); + int currentTile = int(floor(gl_FragCoord.x/TILE_SIZE) + (floor(gl_FragCoord.y/TILE_SIZE) * int(ScreenDimensions.x/TILE_SIZE))); + + int start = int(LightGrids.Data[currentTile].Start); + int amount = int(LightGrids.Data[currentTile].Amount); + + for(int i = start; i < start + amount; i++) { + + int l = int(LightIndex[i]); + LightSource light = LightSources.List[l]; + + 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); + } else if (light.Type == 2) { //Directional + light_result = CalcDirectionalLightSource(V * light.Direction, light.Color, light.Intensity, viewVec, normal); + } + totalLighting.Diffuse += vec4(light_result.Diffuse.rgb * ao, light_result.Diffuse.a); + totalLighting.Specular += vec4(light_result.Specular.rgb * ao, light_result.Specular.a); + } + + vec4 color_result = mix((Color * diffuseTexel * DiffuseColor), Input.ExplosionColor, Input.ExplosionPercentageElapsed); + color_result = color_result * (totalLighting.Diffuse + (totalLighting.Specular * specularTexel)); + float specularResult = (specularTexel.r + specularTexel.g + specularTexel.b)/3.0; + vec4 reflectionTotal = reflectionColor * (1-specularTexel.a) * color_result.a * (totalLighting.Diffuse + (totalLighting.Specular * specularTexel)); + color_result = color_result * clamp(1/specularTexel.a, 0, 1) + reflectionTotal; + //vec4 color_result = (DiffuseColor + Input.ExplosionColor) * (totalLighting.Diffuse + (totalLighting.Specular * specularTexel)) * diffuseTexel * Color; + + + float pos = ((P * vec4(Input.Position, 1)).y + 1.0)/2.0; + + if(pos <= FillPercentage) { + color_result += FillColor; + } + sceneColor = vec4(color_result.xyz, clamp(color_result.a, 0, 1)); + //sceneColor = CommonUniforms.testColour; + //sceneColor = vec4(reflectionColor.xyz, 1); + color_result.xyz += glowTexel.xyz*GlowIntensity; + + bloomColor = vec4(max(color_result.xyz - 1.0, 0.0), clamp(color_result.a, 0, 1)); + + //Tiled Debug Code + /* + if(int(gl_FragCoord.x)%16 == 0 || int(gl_FragCoord.y)%16 == 0 ) { + sceneColor += vec4(0.5, 0, 0, 0); + } else { + sceneColor += vec4(LightGrids.Data[int(tilePos.x + tilePos.y*80)].Amount/LightSources.List.length(), 0, 0, 1); + } + */ +} + + diff --git a/src/Engine/Rendering/DrawFinalPass.cpp b/src/Engine/Rendering/DrawFinalPass.cpp index 6ab4bb3c..d358c92a 100644 --- a/src/Engine/Rendering/DrawFinalPass.cpp +++ b/src/Engine/Rendering/DrawFinalPass.cpp @@ -65,6 +65,15 @@ void DrawFinalPass::InitializeShaderPrograms() m_ForwardPlusProgram->Link(); GLERROR("Creating forward+ program"); + m_ForwardPlusNoShadowsProgram = ResourceManager::Load("#ForwardPlusNoShadowProgram"); + m_ForwardPlusNoShadowsProgram->AddShader(std::shared_ptr(new VertexShader("Shaders/ForwardPlus.vert.glsl"))); + m_ForwardPlusNoShadowsProgram->AddShader(std::shared_ptr(new FragmentShader("Shaders/ForwardPlusNoShadows.frag.glsl"))); + m_ForwardPlusNoShadowsProgram->Compile(); + m_ForwardPlusNoShadowsProgram->BindFragDataLocation(0, "sceneColor"); + m_ForwardPlusNoShadowsProgram->BindFragDataLocation(1, "bloomColor"); + m_ForwardPlusNoShadowsProgram->Link(); + GLERROR("Creating forward+ program without shadows"); + m_ExplosionEffectProgram = ResourceManager::Load("#ExplosionEffectProgram"); m_ExplosionEffectProgram->AddShader(std::shared_ptr(new VertexShader("Shaders/ForwardPlus.vert.glsl"))); m_ExplosionEffectProgram->AddShader(std::shared_ptr(new GeometryShader("Shaders/ExplosionEffect.geom.glsl"))); @@ -354,7 +363,12 @@ void DrawFinalPass::OnWindowResize() void DrawFinalPass::DrawModelRenderQueues(std::list>& jobs, RenderScene& scene) { - GLuint forwardHandle = m_ForwardPlusProgram->GetHandle(); + GLuint forwardHandle; + if (m_ShadowPass->EnableShadows()) { + forwardHandle = m_ForwardPlusProgram->GetHandle(); + } else { + forwardHandle = m_ForwardPlusNoShadowsProgram->GetHandle(); + } GLuint explosionHandle = m_ExplosionEffectProgram->GetHandle(); GLuint explosionSplatMapHandle = m_ExplosionEffectSplatMapProgram->GetHandle(); GLuint forwardSplatMapHandle = m_ForwardPlusSplatMapProgram->GetHandle(); @@ -536,9 +550,13 @@ void DrawFinalPass::DrawModelRenderQueues(std::list>& glUniformMatrix4fv(glGetUniformLocation(forwardSkinnedHandle, "Bones"), frameBones.size(), GL_FALSE, glm::value_ptr(frameBones[0])); } else { - if (lastShader != m_ForwardPlusProgram->GetHandle()) { - m_ForwardPlusProgram->Bind(); - lastShader = m_ForwardPlusProgram->GetHandle(); + if (lastShader != forwardHandle) { + if (forwardHandle == m_ForwardPlusProgram->GetHandle()) { + m_ForwardPlusProgram->Bind(); + } else { + m_ForwardPlusNoShadowsProgram->Bind(); + } + lastShader = forwardHandle; GLERROR("Bind ForwardPlusProgram program"); glUniform1i(glGetUniformLocation(forwardHandle, "SSAOQuality"), m_SSAOPass->TextureQuality()); glUniformMatrix4fv(glGetUniformLocation(forwardHandle, "V"), 1, GL_FALSE, glm::value_ptr(scene.Camera->ViewMatrix())); @@ -623,7 +641,12 @@ void DrawFinalPass::DrawModelRenderQueues(std::list>& void DrawFinalPass::DrawModelRenderQueuesWithShieldCheck(std::list>& jobs, RenderScene& scene) { - GLuint forwardHandle = m_ForwardPlusProgram->GetHandle(); + GLuint forwardHandle; + if (m_ShadowPass->EnableShadows()) { + forwardHandle = m_ForwardPlusProgram->GetHandle(); + } else { + forwardHandle = m_ForwardPlusNoShadowsProgram->GetHandle(); + } GLuint explosionHandle = m_ExplosionEffectProgram->GetHandle(); GLuint explosionSplatMapHandle = m_ExplosionEffectSplatMapProgram->GetHandle(); GLuint forwardSplatMapHandle = m_ForwardPlusSplatMapProgram->GetHandle(); @@ -1024,9 +1047,14 @@ void DrawFinalPass::DrawModelRenderQueuesWithShieldCheck(std::listGetHandle()) { - m_ForwardPlusProgram->Bind(); - lastShader = m_ForwardPlusProgram->GetHandle(); + if (lastShader != forwardHandle) { + if (forwardHandle == m_ForwardPlusProgram->GetHandle()) { + m_ForwardPlusProgram->Bind(); + } + else { + m_ForwardPlusNoShadowsProgram->Bind(); + } + lastShader = forwardHandle; GLERROR("Bind ForwardPlusProgram program"); glUniform1i(glGetUniformLocation(forwardHandle, "SSAOQuality"), m_SSAOPass->TextureQuality()); glUniformMatrix4fv(glGetUniformLocation(forwardHandle, "V"), 1, GL_FALSE, glm::value_ptr(scene.Camera->ViewMatrix())); @@ -1112,7 +1140,12 @@ void DrawFinalPass::DrawModelRenderQueuesWithShieldCheck(std::list>& jobs, RenderScene& scene) { - GLuint forwardHandle = m_ForwardPlusProgram->GetHandle(); + GLuint forwardHandle; + if (m_ShadowPass->EnableShadows()) { + forwardHandle = m_ForwardPlusProgram->GetHandle(); + } else { + forwardHandle = m_ForwardPlusNoShadowsProgram->GetHandle(); + } GLERROR("forwardHandle"); GLuint explosionHandle = m_ExplosionEffectProgram->GetHandle(); GLERROR("explosionHandle"); @@ -1171,7 +1204,11 @@ void DrawFinalPass::DrawShieldedModelRenderQueue(std::list(job); if (modelJob) { //bind forward program - m_ForwardPlusProgram->Bind(); + if (m_ShadowPass->EnableShadows()) { + m_ForwardPlusProgram->Bind(); + } else { + m_ForwardPlusNoShadowsProgram->Bind(); + } glUniform2f(glGetUniformLocation(forwardHandle, "ScreenDimensions"), m_Renderer->GetViewportSize().Width, m_Renderer->GetViewportSize().Height); //bind uniforms diff --git a/src/Engine/Rendering/Renderer.cpp b/src/Engine/Rendering/Renderer.cpp index 63d7dfaf..6fd6d160 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::Checkbox("EnableShadows", &m_Shadow_Enabled); m_SSAOPass->ChangeQuality(m_SSAO_Quality); m_DrawBloomPass->ChangeQuality(m_GLOW_Quality); + m_ShadowPass->CheckStatus(m_Shadow_Enabled); GLERROR("SSAO Settings"); //clear buffer 0 glClearColor(0.f, 0.f, 0.f, 0.f); diff --git a/src/Engine/Rendering/ShadowPass.cpp b/src/Engine/Rendering/ShadowPass.cpp index ed9ccb7b..48e47157 100644 --- a/src/Engine/Rendering/ShadowPass.cpp +++ b/src/Engine/Rendering/ShadowPass.cpp @@ -6,7 +6,7 @@ ShadowPass::ShadowPass(IRenderer * renderer, int shadow_res_x, int shadow_res_y) m_ResolutionSizeWidth = shadow_res_x; m_ResolutionSizeHeight = shadow_res_y; - InitializeFrameBuffers(); + CheckStatus(true); InitializeShaderPrograms(); } @@ -14,18 +14,17 @@ ShadowPass::ShadowPass(IRenderer * renderer) { m_Renderer = renderer; - InitializeFrameBuffers(); + CheckStatus(true); InitializeShaderPrograms(); } ShadowPass::~ShadowPass() { - + glDeleteTextures(1, &m_DepthMap); } void ShadowPass::DebugGUI() { - ImGui::Checkbox("EnableShadows", &m_EnableShadows); ImGui::DragFloat2("ShadowMapNearFar", m_NearFarPlane, 1.f, -1000.f, 1000.f); ImGui::DragFloat("ShadowClippingWeight", &m_SplitWeight, 0.001f, 0.f, 1.f); ImGui::Checkbox("ShadowTransparentObjects", &m_TransparentObjects); @@ -126,6 +125,7 @@ float ShadowPass::FindRadius(ShadowFrustum& frustum) void ShadowPass::InitializeFrameBuffers() { // Depth texture + glDeleteTextures(1, &m_DepthMap); glGenTextures(1, &m_DepthMap); glBindTexture(GL_TEXTURE_2D_ARRAY, m_DepthMap); @@ -156,12 +156,12 @@ void ShadowPass::InitializeShaderPrograms() m_ShadowProgram->BindFragDataLocation(0, "ShadowMap"); m_ShadowProgram->Link(); - m_ShadowProgramSkinned = ResourceManager::Load("#ShadowProgramSkinned"); - m_ShadowProgramSkinned->AddShader(std::shared_ptr(new VertexShader("Shaders/ShadowSkinned.vert.glsl"))); - m_ShadowProgramSkinned->AddShader(std::shared_ptr(new FragmentShader("Shaders/Shadow.frag.glsl"))); - m_ShadowProgramSkinned->Compile(); - m_ShadowProgramSkinned->BindFragDataLocation(0, "ShadowMap"); - m_ShadowProgramSkinned->Link(); + m_ShadowProgramSkinned = ResourceManager::Load("#ShadowProgramSkinned"); + m_ShadowProgramSkinned->AddShader(std::shared_ptr(new VertexShader("Shaders/ShadowSkinned.vert.glsl"))); + m_ShadowProgramSkinned->AddShader(std::shared_ptr(new FragmentShader("Shaders/Shadow.frag.glsl"))); + m_ShadowProgramSkinned->Compile(); + m_ShadowProgramSkinned->BindFragDataLocation(0, "ShadowMap"); + m_ShadowProgramSkinned->Link(); } void ShadowPass::ClearBuffer() @@ -209,53 +209,109 @@ void ShadowPass::RadiusToLightspace(ShadowFrustum& frustum) frustum.LRBT = { left, right, bottom, top }; } +void ShadowPass::CheckStatus(bool shadowStatus) +{ + if (m_EnableShadows == shadowStatus) { + return; + } + + m_EnableShadows = shadowStatus; + + if (m_EnableShadows == false) { + glDeleteTextures(1, &m_DepthMap); + return; + } + + InitializeFrameBuffers(); +} + void ShadowPass::Draw(RenderScene & scene) { - if (m_EnableShadows) { - InitializeCameras(scene); - UpdateSplitDist(m_shadowFrusta, scene.Camera->NearClip(), scene.Camera->FarClip()); + if (!m_EnableShadows) { + return; + } - ShadowPassState* state = new ShadowPassState(m_DepthBuffer.GetHandle()); + InitializeCameras(scene); + UpdateSplitDist(m_shadowFrusta, scene.Camera->NearClip(), scene.Camera->FarClip()); - - glViewport(0, 0, m_ResolutionSizeWidth, m_ResolutionSizeHeight); + ShadowPassState* state = new ShadowPassState(m_DepthBuffer.GetHandle()); - for (int i = 0; i < m_CurrentNrOfSplits; i++) { - UpdateFrustumPoints(m_shadowFrusta[i], scene.Camera->Position(), scene.Camera->Forward()); + glViewport(0, 0, m_ResolutionSizeWidth, m_ResolutionSizeHeight); - glFramebufferTextureLayer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, m_DepthMap, 0, i); + for (int i = 0; i < m_CurrentNrOfSplits; i++) { + UpdateFrustumPoints(m_shadowFrusta[i], scene.Camera->Position(), scene.Camera->Forward()); + + glFramebufferTextureLayer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, m_DepthMap, 0, i); + + GLuint shaderHandle; + + for (auto &job : scene.Jobs.DirectionalLight) { + + auto directionalLightJob = std::dynamic_pointer_cast(job); + + if (directionalLightJob) { + m_LightView[i] = glm::lookAt(glm::vec3(-directionalLightJob->Direction) + m_shadowFrusta[i].MiddlePoint, m_shadowFrusta[i].MiddlePoint, glm::vec3(0.f, 1.f, 0.f)); + + PointsToLightspace(m_shadowFrusta[i], m_LightView[i]); + //FindRadius(m_shadowFrusta[i]); + //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]); - GLuint shaderHandle; + 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])); - for (auto &job : scene.Jobs.DirectionalLight) { - - auto directionalLightJob = std::dynamic_pointer_cast(job); - - if (directionalLightJob) { - m_LightView[i] = glm::lookAt(glm::vec3(-directionalLightJob->Direction) + m_shadowFrusta[i].MiddlePoint, m_shadowFrusta[i].MiddlePoint, glm::vec3(0.f, 1.f, 0.f)); - - PointsToLightspace(m_shadowFrusta[i], m_LightView[i]); - //FindRadius(m_shadowFrusta[i]); - //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])); + 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"); + GLERROR("ShadowLight ERROR"); - for (auto &objectJob : scene.Jobs.OpaqueObjects) { + for (auto &objectJob : scene.Jobs.OpaqueObjects) { + if (!std::dynamic_pointer_cast(objectJob)) { + auto modelJob = std::dynamic_pointer_cast(objectJob); + + if (!modelJob->Shadow) { + continue; + } + + if (modelJob->Model->IsSkinned()) { + m_ShadowProgramSkinned->Bind(); + shaderHandle = m_ShadowProgramSkinned->GetHandle(); + + std::vector frameBones; + if (modelJob->BlendTree != nullptr) { + frameBones = modelJob->BlendTree->GetFinalPose(); + } + else { + frameBones = modelJob->Skeleton->GetTPose(); + } + glUniformMatrix4fv(glGetUniformLocation(shaderHandle, "Bones"), frameBones.size(), GL_FALSE, glm::value_ptr(frameBones[0])); + + } + else { + m_ShadowProgram->Bind(); + shaderHandle = m_ShadowProgram->GetHandle(); + } + + glUniformMatrix4fv(glGetUniformLocation(shaderHandle, "M"), 1, GL_FALSE, glm::value_ptr(modelJob->Matrix)); + glUniform1f(glGetUniformLocation(shaderHandle, "Alpha"), 1.f); + + 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"); + } + } + if (m_TransparentObjects) { + state->CullFace(GL_BACK); + for (auto &objectJob : scene.Jobs.TransparentObjects) { if (!std::dynamic_pointer_cast(objectJob)) { auto modelJob = std::dynamic_pointer_cast(objectJob); @@ -263,25 +319,53 @@ void ShadowPass::Draw(RenderScene & scene) continue; } - if(modelJob->Model->IsSkinned()) { - m_ShadowProgramSkinned->Bind(); - shaderHandle = m_ShadowProgramSkinned->GetHandle(); + if (modelJob->Model->IsSkinned()) { + m_ShadowProgramSkinned->Bind(); + shaderHandle = m_ShadowProgramSkinned->GetHandle(); - std::vector frameBones; - if (modelJob->BlendTree != nullptr) { - frameBones = modelJob->BlendTree->GetFinalPose(); - } else { - frameBones = modelJob->Skeleton->GetTPose(); - } - glUniformMatrix4fv(glGetUniformLocation(shaderHandle, "Bones"), frameBones.size(), GL_FALSE, glm::value_ptr(frameBones[0])); + std::vector frameBones; + if (modelJob->BlendTree != nullptr) { + frameBones = modelJob->BlendTree->GetFinalPose(); + } + else { + frameBones = modelJob->Skeleton->GetTPose(); + } + glUniformMatrix4fv(glGetUniformLocation(shaderHandle, "Bones"), frameBones.size(), GL_FALSE, glm::value_ptr(frameBones[0])); - } else { - m_ShadowProgram->Bind(); - shaderHandle = m_ShadowProgram->GetHandle(); - } + } + else { + m_ShadowProgram->Bind(); + shaderHandle = m_ShadowProgram->GetHandle(); + } glUniformMatrix4fv(glGetUniformLocation(shaderHandle, "M"), 1, GL_FALSE, glm::value_ptr(modelJob->Matrix)); - glUniform1f(glGetUniformLocation(shaderHandle, "Alpha"), 1.f); + glUniform1f(glGetUniformLocation(shaderHandle, "Alpha"), modelJob->Color.a); + + if (m_TexturedShadows) { + switch (modelJob->Type) { + case RawModel::MaterialType::SingleTextures: + case RawModel::MaterialType::Basic: + { + glActiveTexture(GL_TEXTURE24); + if (modelJob->DiffuseTexture.size() > 0 && modelJob->DiffuseTexture[0]->Texture != nullptr) { + glBindTexture(GL_TEXTURE_2D, modelJob->DiffuseTexture[0]->Texture->m_Texture); + glUniform2fv(glGetUniformLocation(shaderHandle, "DiffuseUVRepeat"), 1, glm::value_ptr(modelJob->DiffuseTexture[0]->UVRepeat)); + } + else { + glBindTexture(GL_TEXTURE_2D, m_WhiteTexture->m_Texture); + glUniform2fv(glGetUniformLocation(shaderHandle, "DiffuseUVRepeat"), 1, glm::value_ptr(glm::vec2(1.0f, 1.0f))); + } + break; + } + case RawModel::MaterialType::SplatMapping: + { + glActiveTexture(GL_TEXTURE24); + glBindTexture(GL_TEXTURE_2D, m_WhiteTexture->m_Texture); + glUniform2fv(glGetUniformLocation(shaderHandle, "DiffuseUVRepeat"), 1, glm::value_ptr(glm::vec2(1.0f, 1.0f))); + break; + } + } + } glBindVertexArray(modelJob->Model->VAO); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, modelJob->Model->ElementBuffer); @@ -290,76 +374,13 @@ void ShadowPass::Draw(RenderScene & scene) GLERROR("Shadow Draw ERROR"); } } - if (m_TransparentObjects) { - state->CullFace(GL_BACK); - for (auto &objectJob : scene.Jobs.TransparentObjects) { - if (!std::dynamic_pointer_cast(objectJob)) { - auto modelJob = std::dynamic_pointer_cast(objectJob); - - if (!modelJob->Shadow) { - continue; - } - - if (modelJob->Model->IsSkinned()) { - m_ShadowProgramSkinned->Bind(); - shaderHandle = m_ShadowProgramSkinned->GetHandle(); - - std::vector frameBones; - if (modelJob->BlendTree != nullptr) { - frameBones = modelJob->BlendTree->GetFinalPose(); - } else { - frameBones = modelJob->Skeleton->GetTPose(); - } - glUniformMatrix4fv(glGetUniformLocation(shaderHandle, "Bones"), frameBones.size(), GL_FALSE, glm::value_ptr(frameBones[0])); - - } else { - m_ShadowProgram->Bind(); - shaderHandle = m_ShadowProgram->GetHandle(); - } - - glUniformMatrix4fv(glGetUniformLocation(shaderHandle, "M"), 1, GL_FALSE, glm::value_ptr(modelJob->Matrix)); - glUniform1f(glGetUniformLocation(shaderHandle, "Alpha"), modelJob->Color.a); - - if (m_TexturedShadows) { - switch (modelJob->Type) { - case RawModel::MaterialType::SingleTextures: - case RawModel::MaterialType::Basic: - { - glActiveTexture(GL_TEXTURE24); - if (modelJob->DiffuseTexture.size() > 0 && modelJob->DiffuseTexture[0]->Texture != nullptr) { - glBindTexture(GL_TEXTURE_2D, modelJob->DiffuseTexture[0]->Texture->m_Texture); - glUniform2fv(glGetUniformLocation(shaderHandle, "DiffuseUVRepeat"), 1, glm::value_ptr(modelJob->DiffuseTexture[0]->UVRepeat)); - } - else { - glBindTexture(GL_TEXTURE_2D, m_WhiteTexture->m_Texture); - glUniform2fv(glGetUniformLocation(shaderHandle, "DiffuseUVRepeat"), 1, glm::value_ptr(glm::vec2(1.0f, 1.0f))); - } - break; - } - case RawModel::MaterialType::SplatMapping: - { - glActiveTexture(GL_TEXTURE24); - glBindTexture(GL_TEXTURE_2D, m_WhiteTexture->m_Texture); - glUniform2fv(glGetUniformLocation(shaderHandle, "DiffuseUVRepeat"), 1, glm::value_ptr(glm::vec2(1.0f, 1.0f))); - break; - } - } - } - - 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"); - } - } - state->CullFace(GL_FRONT); - } + state->CullFace(GL_FRONT); } } } - glViewport(0, 0, m_Renderer->GetViewportSize().Width, m_Renderer->GetViewportSize().Height); - m_DepthBuffer.Unbind(); - delete state; } + + glViewport(0, 0, m_Renderer->GetViewportSize().Width, m_Renderer->GetViewportSize().Height); + m_DepthBuffer.Unbind(); + delete state; } \ No newline at end of file From 5f11d1e066382e7837a0c8e683e26c660ec635f5 Mon Sep 17 00:00:00 2001 From: Teejoon Date: Sun, 13 Mar 2016 16:38:50 +0100 Subject: [PATCH 07/13] 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 08/13] 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 09/13] 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 8e150da7fffa80d2179c6cf758844fcd38a721f8 Mon Sep 17 00:00:00 2001 From: FakeShemp Date: Sun, 13 Mar 2016 21:25:04 +0100 Subject: [PATCH 10/13] Use CommonFunctions::DeleteTexture() instead --- src/Engine/Rendering/ShadowPass.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Engine/Rendering/ShadowPass.cpp b/src/Engine/Rendering/ShadowPass.cpp index 48e47157..225e1219 100644 --- a/src/Engine/Rendering/ShadowPass.cpp +++ b/src/Engine/Rendering/ShadowPass.cpp @@ -20,7 +20,7 @@ ShadowPass::ShadowPass(IRenderer * renderer) ShadowPass::~ShadowPass() { - glDeleteTextures(1, &m_DepthMap); + CommonFunctions::DeleteTexture(&m_DepthMap); } void ShadowPass::DebugGUI() @@ -218,7 +218,7 @@ void ShadowPass::CheckStatus(bool shadowStatus) m_EnableShadows = shadowStatus; if (m_EnableShadows == false) { - glDeleteTextures(1, &m_DepthMap); + CommonFunctions::DeleteTexture(&m_DepthMap); return; } From 5796d07b56c32a68dff9370a5997e5bc6c69354d Mon Sep 17 00:00:00 2001 From: Teejoon Date: Sun, 13 Mar 2016 21:25:32 +0100 Subject: [PATCH 11/13] 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 From 7fa634ef7ccae7740243525d774c6ef40ae1a4f8 Mon Sep 17 00:00:00 2001 From: Tobias Dahl Date: Sun, 13 Mar 2016 21:35:57 +0100 Subject: [PATCH 12/13] Revert "Shadow will actually shut itself off and delete itself now" --- include/Engine/Rendering/DrawFinalPass.h | 1 - include/Engine/Rendering/Renderer.h | 1 - include/Engine/Rendering/ShadowPass.h | 9 +- .../Shaders/ForwardPlusNoShadows.frag.glsl | 204 ------------- src/Engine/Rendering/DrawFinalPass.cpp | 57 +--- src/Engine/Rendering/Renderer.cpp | 2 - src/Engine/Rendering/ShadowPass.cpp | 275 ++++++++---------- 7 files changed, 140 insertions(+), 409 deletions(-) delete mode 100644 resources/Shaders/ForwardPlusNoShadows.frag.glsl diff --git a/include/Engine/Rendering/DrawFinalPass.h b/include/Engine/Rendering/DrawFinalPass.h index f37e3cc8..26712088 100644 --- a/include/Engine/Rendering/DrawFinalPass.h +++ b/include/Engine/Rendering/DrawFinalPass.h @@ -76,7 +76,6 @@ private: const ShadowPass* m_ShadowPass; ShaderProgram* m_ForwardPlusProgram; - ShaderProgram* m_ForwardPlusNoShadowsProgram; ShaderProgram* m_ExplosionEffectProgram; ShaderProgram* m_ExplosionEffectSplatMapProgram; ShaderProgram* m_SpriteProgram; diff --git a/include/Engine/Rendering/Renderer.h b/include/Engine/Rendering/Renderer.h index 41653739..51cf62e7 100644 --- a/include/Engine/Rendering/Renderer.h +++ b/include/Engine/Rendering/Renderer.h @@ -71,7 +71,6 @@ private: bool m_ResizeWindow = false; int m_SSAO_Quality = 0; int m_GLOW_Quality = 2; - bool m_Shadow_Enabled = true; PickingPass* m_PickingPass; LightCullingPass* m_LightCullingPass; diff --git a/include/Engine/Rendering/ShadowPass.h b/include/Engine/Rendering/ShadowPass.h index 1ec62be0..122fbddd 100644 --- a/include/Engine/Rendering/ShadowPass.h +++ b/include/Engine/Rendering/ShadowPass.h @@ -38,8 +38,6 @@ public: void ClearBuffer(); void Draw(RenderScene& scene); - void CheckStatus(bool status); - void DebugGUI(); GLuint DepthMap() const { return m_DepthMap; } @@ -47,7 +45,6 @@ public: std::array LightV() const { return m_LightView; } std::array FarDistance() const { std::array f; for (int i = 0; i < MAX_SPLITS; i++) f[i] = m_shadowFrusta[i].FarClip; return f; } int CurrentNrOfSplits() const { return m_CurrentNrOfSplits; } - bool EnableShadows() const { return m_EnableShadows; } void SetSplitWeight(float split_weight) { m_SplitWeight = split_weight; }; private: @@ -66,8 +63,8 @@ private: GLuint m_DepthMap; FrameBuffer m_DepthBuffer; - ShaderProgram* m_ShadowProgram; - ShaderProgram* m_ShadowProgramSkinned; + ShaderProgram* m_ShadowProgram; + ShaderProgram* m_ShadowProgramSkinned; std::array m_LightProjection; std::array m_LightView; @@ -78,7 +75,7 @@ private: bool m_TransparentObjects = false; bool m_TexturedShadows = false; - bool m_EnableShadows = false; + bool m_EnableShadows = true; int m_CurrentNrOfSplits = 4; float m_SplitWeight = 0.962f; diff --git a/resources/Shaders/ForwardPlusNoShadows.frag.glsl b/resources/Shaders/ForwardPlusNoShadows.frag.glsl deleted file mode 100644 index a0618edf..00000000 --- a/resources/Shaders/ForwardPlusNoShadows.frag.glsl +++ /dev/null @@ -1,204 +0,0 @@ -#version 430 - -#define MIN_AMBIENT_LIGHT 0.3 -#define MAX_SPLITS 4 - -uniform mat4 VM; -uniform mat4 M; -uniform mat4 V; -uniform mat4 P; -uniform vec4 Color; -uniform vec4 DiffuseColor; -uniform vec2 ScreenDimensions; -uniform vec4 FillColor; -uniform vec4 AmbientColor; -uniform float FillPercentage; -uniform float GlowIntensity; -uniform vec3 CameraPosition; -uniform int SSAOQuality; -uniform float FarDistance[MAX_SPLITS]; - -uniform vec2 DiffuseUVRepeat; -uniform vec2 NormalUVRepeat; -uniform vec2 SpecularUVRepeat; -uniform vec2 GlowUVRepeat; -layout (binding = 0) uniform sampler2D AOTexture; -layout (binding = 1) uniform sampler2D DiffuseTexture; -layout (binding = 2) uniform sampler2D NormalMapTexture; -layout (binding = 3) uniform sampler2D SpecularMapTexture; -layout (binding = 4) uniform sampler2D GlowMapTexture; -layout (binding = 5) uniform samplerCube CubeMap; - -#define TILE_SIZE 16 - -struct LightSource { - vec4 Position; - vec4 Direction; - vec4 Color; - float Radius; - float Intensity; - float Falloff; - int Type; -}; - -layout (std430, binding = 1) buffer LightBuffer -{ - LightSource List[]; -} LightSources; - -struct LightGrid { - float Start; - float Amount; - vec2 Padding; -}; - -layout (std430, binding = 2) buffer LightGridBuffer -{ - LightGrid Data[]; -} LightGrids; - -layout (std430, binding = 4) buffer LightIndexBuffer -{ - float LightIndex[]; -}; - -in VertexData{ - vec3 Position; - vec3 Normal; - vec3 Tangent; - vec3 BiTangent; - vec2 TextureCoordinate; - vec4 ExplosionColor; - float ExplosionPercentageElapsed; - vec4 PositionLightSpace[MAX_SPLITS]; -}Input; - -out vec4 sceneColor; -out vec4 bloomColor; - -struct LightResult { - vec4 Diffuse; - vec4 Specular; -}; - -float CalcAttenuation(float radius, float dist, float falloff) { - return 1.0 - smoothstep(radius * falloff, radius, dist); -} - -vec4 CalcSpecular(vec4 lightColor, vec4 viewVec, vec4 lightVec, vec4 normal) { - vec4 R = normalize( reflect(-lightVec, normal)); - float RdotV = max( dot(R, viewVec), 0.0); - return lightColor * pow(RdotV, 90.0); -} - -vec4 CalcDiffuse(vec4 lightColor, vec4 lightVec, vec4 normal) { - float power = max( dot(normal, lightVec), 0.0); - return lightColor * power; -} - -LightResult CalcPointLightSource(vec4 lightPos, float lightRadius, vec4 lightColor, float intensity, vec4 viewVec, vec4 position, vec4 normal, float falloff) -{ - vec4 L = lightPos - position; - float dist = length(L); - L = normalize(L); - - float attenuation = CalcAttenuation(lightRadius, dist, falloff); - - LightResult result; - result.Diffuse = CalcDiffuse(lightColor, L, normal) * attenuation * intensity; - result.Specular = CalcSpecular(lightColor, viewVec, L, normal) * attenuation * intensity; - return result; -} - -LightResult CalcDirectionalLightSource(vec4 direction, vec4 color, float intensity, vec4 viewVec, vec4 vertNormal) -{ - vec4 L = normalize( -vec4(direction.xyz, 0) ); - - LightResult result; - result.Diffuse = CalcDiffuse(color, L, vertNormal) * intensity; - result.Specular = CalcSpecular(color, viewVec, L, vertNormal) * intensity; - return result; -} - -vec4 CalcNormalMappedValue(vec3 normal, vec3 tangent, vec3 bitangent, vec2 textureCoordinate, sampler2D normalMap) -{ - mat3 TBN = mat3(tangent, bitangent, normal); - vec3 NormalMap = texture(normalMap, textureCoordinate).xyz * 2.0 - vec3(1.0); - return vec4(TBN * normalize(NormalMap), 0.0); -} - -void main() -{ - float ao = texelFetch(AOTexture, ivec2(gl_FragCoord.xy) >> int(SSAOQuality), 0).r; - ao = (clamp(1.0 - (1.0 - ao), 0.0, 1.0) + MIN_AMBIENT_LIGHT) / (1.0 + MIN_AMBIENT_LIGHT); - 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); - vec3 I = normalize(vec3(M * vec4(Input.Position, 1.0)) - CameraPosition); - vec3 R = reflect(-I, Input.Normal); - //R = vec3(P * vec4(R, 1.0)); - vec4 reflectionColor = texture(CubeMap, R); - - vec2 tilePos; - tilePos.x = int(gl_FragCoord.x/TILE_SIZE); - tilePos.y = int(gl_FragCoord.y/TILE_SIZE); - - LightResult totalLighting; - totalLighting.Diffuse = vec4(AmbientColor.rgb * ao, 1.0); - int currentTile = int(floor(gl_FragCoord.x/TILE_SIZE) + (floor(gl_FragCoord.y/TILE_SIZE) * int(ScreenDimensions.x/TILE_SIZE))); - - int start = int(LightGrids.Data[currentTile].Start); - int amount = int(LightGrids.Data[currentTile].Amount); - - for(int i = start; i < start + amount; i++) { - - int l = int(LightIndex[i]); - LightSource light = LightSources.List[l]; - - 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); - } else if (light.Type == 2) { //Directional - light_result = CalcDirectionalLightSource(V * light.Direction, light.Color, light.Intensity, viewVec, normal); - } - totalLighting.Diffuse += vec4(light_result.Diffuse.rgb * ao, light_result.Diffuse.a); - totalLighting.Specular += vec4(light_result.Specular.rgb * ao, light_result.Specular.a); - } - - vec4 color_result = mix((Color * diffuseTexel * DiffuseColor), Input.ExplosionColor, Input.ExplosionPercentageElapsed); - color_result = color_result * (totalLighting.Diffuse + (totalLighting.Specular * specularTexel)); - float specularResult = (specularTexel.r + specularTexel.g + specularTexel.b)/3.0; - vec4 reflectionTotal = reflectionColor * (1-specularTexel.a) * color_result.a * (totalLighting.Diffuse + (totalLighting.Specular * specularTexel)); - color_result = color_result * clamp(1/specularTexel.a, 0, 1) + reflectionTotal; - //vec4 color_result = (DiffuseColor + Input.ExplosionColor) * (totalLighting.Diffuse + (totalLighting.Specular * specularTexel)) * diffuseTexel * Color; - - - float pos = ((P * vec4(Input.Position, 1)).y + 1.0)/2.0; - - if(pos <= FillPercentage) { - color_result += FillColor; - } - sceneColor = vec4(color_result.xyz, clamp(color_result.a, 0, 1)); - //sceneColor = CommonUniforms.testColour; - //sceneColor = vec4(reflectionColor.xyz, 1); - color_result.xyz += glowTexel.xyz*GlowIntensity; - - bloomColor = vec4(max(color_result.xyz - 1.0, 0.0), clamp(color_result.a, 0, 1)); - - //Tiled Debug Code - /* - if(int(gl_FragCoord.x)%16 == 0 || int(gl_FragCoord.y)%16 == 0 ) { - sceneColor += vec4(0.5, 0, 0, 0); - } else { - sceneColor += vec4(LightGrids.Data[int(tilePos.x + tilePos.y*80)].Amount/LightSources.List.length(), 0, 0, 1); - } - */ -} - - diff --git a/src/Engine/Rendering/DrawFinalPass.cpp b/src/Engine/Rendering/DrawFinalPass.cpp index d358c92a..6ab4bb3c 100644 --- a/src/Engine/Rendering/DrawFinalPass.cpp +++ b/src/Engine/Rendering/DrawFinalPass.cpp @@ -65,15 +65,6 @@ void DrawFinalPass::InitializeShaderPrograms() m_ForwardPlusProgram->Link(); GLERROR("Creating forward+ program"); - m_ForwardPlusNoShadowsProgram = ResourceManager::Load("#ForwardPlusNoShadowProgram"); - m_ForwardPlusNoShadowsProgram->AddShader(std::shared_ptr(new VertexShader("Shaders/ForwardPlus.vert.glsl"))); - m_ForwardPlusNoShadowsProgram->AddShader(std::shared_ptr(new FragmentShader("Shaders/ForwardPlusNoShadows.frag.glsl"))); - m_ForwardPlusNoShadowsProgram->Compile(); - m_ForwardPlusNoShadowsProgram->BindFragDataLocation(0, "sceneColor"); - m_ForwardPlusNoShadowsProgram->BindFragDataLocation(1, "bloomColor"); - m_ForwardPlusNoShadowsProgram->Link(); - GLERROR("Creating forward+ program without shadows"); - m_ExplosionEffectProgram = ResourceManager::Load("#ExplosionEffectProgram"); m_ExplosionEffectProgram->AddShader(std::shared_ptr(new VertexShader("Shaders/ForwardPlus.vert.glsl"))); m_ExplosionEffectProgram->AddShader(std::shared_ptr(new GeometryShader("Shaders/ExplosionEffect.geom.glsl"))); @@ -363,12 +354,7 @@ void DrawFinalPass::OnWindowResize() void DrawFinalPass::DrawModelRenderQueues(std::list>& jobs, RenderScene& scene) { - GLuint forwardHandle; - if (m_ShadowPass->EnableShadows()) { - forwardHandle = m_ForwardPlusProgram->GetHandle(); - } else { - forwardHandle = m_ForwardPlusNoShadowsProgram->GetHandle(); - } + GLuint forwardHandle = m_ForwardPlusProgram->GetHandle(); GLuint explosionHandle = m_ExplosionEffectProgram->GetHandle(); GLuint explosionSplatMapHandle = m_ExplosionEffectSplatMapProgram->GetHandle(); GLuint forwardSplatMapHandle = m_ForwardPlusSplatMapProgram->GetHandle(); @@ -550,13 +536,9 @@ void DrawFinalPass::DrawModelRenderQueues(std::list>& glUniformMatrix4fv(glGetUniformLocation(forwardSkinnedHandle, "Bones"), frameBones.size(), GL_FALSE, glm::value_ptr(frameBones[0])); } else { - if (lastShader != forwardHandle) { - if (forwardHandle == m_ForwardPlusProgram->GetHandle()) { - m_ForwardPlusProgram->Bind(); - } else { - m_ForwardPlusNoShadowsProgram->Bind(); - } - lastShader = forwardHandle; + if (lastShader != m_ForwardPlusProgram->GetHandle()) { + m_ForwardPlusProgram->Bind(); + lastShader = m_ForwardPlusProgram->GetHandle(); GLERROR("Bind ForwardPlusProgram program"); glUniform1i(glGetUniformLocation(forwardHandle, "SSAOQuality"), m_SSAOPass->TextureQuality()); glUniformMatrix4fv(glGetUniformLocation(forwardHandle, "V"), 1, GL_FALSE, glm::value_ptr(scene.Camera->ViewMatrix())); @@ -641,12 +623,7 @@ void DrawFinalPass::DrawModelRenderQueues(std::list>& void DrawFinalPass::DrawModelRenderQueuesWithShieldCheck(std::list>& jobs, RenderScene& scene) { - GLuint forwardHandle; - if (m_ShadowPass->EnableShadows()) { - forwardHandle = m_ForwardPlusProgram->GetHandle(); - } else { - forwardHandle = m_ForwardPlusNoShadowsProgram->GetHandle(); - } + GLuint forwardHandle = m_ForwardPlusProgram->GetHandle(); GLuint explosionHandle = m_ExplosionEffectProgram->GetHandle(); GLuint explosionSplatMapHandle = m_ExplosionEffectSplatMapProgram->GetHandle(); GLuint forwardSplatMapHandle = m_ForwardPlusSplatMapProgram->GetHandle(); @@ -1047,14 +1024,9 @@ void DrawFinalPass::DrawModelRenderQueuesWithShieldCheck(std::listGetHandle()) { - m_ForwardPlusProgram->Bind(); - } - else { - m_ForwardPlusNoShadowsProgram->Bind(); - } - lastShader = forwardHandle; + if (lastShader != m_ForwardPlusProgram->GetHandle()) { + m_ForwardPlusProgram->Bind(); + lastShader = m_ForwardPlusProgram->GetHandle(); GLERROR("Bind ForwardPlusProgram program"); glUniform1i(glGetUniformLocation(forwardHandle, "SSAOQuality"), m_SSAOPass->TextureQuality()); glUniformMatrix4fv(glGetUniformLocation(forwardHandle, "V"), 1, GL_FALSE, glm::value_ptr(scene.Camera->ViewMatrix())); @@ -1140,12 +1112,7 @@ void DrawFinalPass::DrawModelRenderQueuesWithShieldCheck(std::list>& jobs, RenderScene& scene) { - GLuint forwardHandle; - if (m_ShadowPass->EnableShadows()) { - forwardHandle = m_ForwardPlusProgram->GetHandle(); - } else { - forwardHandle = m_ForwardPlusNoShadowsProgram->GetHandle(); - } + GLuint forwardHandle = m_ForwardPlusProgram->GetHandle(); GLERROR("forwardHandle"); GLuint explosionHandle = m_ExplosionEffectProgram->GetHandle(); GLERROR("explosionHandle"); @@ -1204,11 +1171,7 @@ void DrawFinalPass::DrawShieldedModelRenderQueue(std::list(job); if (modelJob) { //bind forward program - if (m_ShadowPass->EnableShadows()) { - m_ForwardPlusProgram->Bind(); - } else { - m_ForwardPlusNoShadowsProgram->Bind(); - } + m_ForwardPlusProgram->Bind(); glUniform2f(glGetUniformLocation(forwardHandle, "ScreenDimensions"), m_Renderer->GetViewportSize().Width, m_Renderer->GetViewportSize().Height); //bind uniforms diff --git a/src/Engine/Rendering/Renderer.cpp b/src/Engine/Rendering/Renderer.cpp index 7c081138..d662a33d 100644 --- a/src/Engine/Rendering/Renderer.cpp +++ b/src/Engine/Rendering/Renderer.cpp @@ -177,10 +177,8 @@ void Renderer::Draw(RenderFrame& frame) ImGui::SliderInt("SSAO Quality", &m_SSAO_Quality, 0, 3); ImGui::SliderInt("Glow Quality", &m_GLOW_Quality, 0, 3); - ImGui::Checkbox("EnableShadows", &m_Shadow_Enabled); m_SSAOPass->ChangeQuality(m_SSAO_Quality); m_DrawBloomPass->ChangeQuality(m_GLOW_Quality); - m_ShadowPass->CheckStatus(m_Shadow_Enabled); GLERROR("SSAO Settings"); //clear buffer 0 glClearColor(0.f, 0.f, 0.f, 0.f); diff --git a/src/Engine/Rendering/ShadowPass.cpp b/src/Engine/Rendering/ShadowPass.cpp index 225e1219..ed9ccb7b 100644 --- a/src/Engine/Rendering/ShadowPass.cpp +++ b/src/Engine/Rendering/ShadowPass.cpp @@ -6,7 +6,7 @@ ShadowPass::ShadowPass(IRenderer * renderer, int shadow_res_x, int shadow_res_y) m_ResolutionSizeWidth = shadow_res_x; m_ResolutionSizeHeight = shadow_res_y; - CheckStatus(true); + InitializeFrameBuffers(); InitializeShaderPrograms(); } @@ -14,17 +14,18 @@ ShadowPass::ShadowPass(IRenderer * renderer) { m_Renderer = renderer; - CheckStatus(true); + InitializeFrameBuffers(); InitializeShaderPrograms(); } ShadowPass::~ShadowPass() { - CommonFunctions::DeleteTexture(&m_DepthMap); + } void ShadowPass::DebugGUI() { + ImGui::Checkbox("EnableShadows", &m_EnableShadows); ImGui::DragFloat2("ShadowMapNearFar", m_NearFarPlane, 1.f, -1000.f, 1000.f); ImGui::DragFloat("ShadowClippingWeight", &m_SplitWeight, 0.001f, 0.f, 1.f); ImGui::Checkbox("ShadowTransparentObjects", &m_TransparentObjects); @@ -125,7 +126,6 @@ float ShadowPass::FindRadius(ShadowFrustum& frustum) void ShadowPass::InitializeFrameBuffers() { // Depth texture - glDeleteTextures(1, &m_DepthMap); glGenTextures(1, &m_DepthMap); glBindTexture(GL_TEXTURE_2D_ARRAY, m_DepthMap); @@ -156,12 +156,12 @@ void ShadowPass::InitializeShaderPrograms() m_ShadowProgram->BindFragDataLocation(0, "ShadowMap"); m_ShadowProgram->Link(); - m_ShadowProgramSkinned = ResourceManager::Load("#ShadowProgramSkinned"); - m_ShadowProgramSkinned->AddShader(std::shared_ptr(new VertexShader("Shaders/ShadowSkinned.vert.glsl"))); - m_ShadowProgramSkinned->AddShader(std::shared_ptr(new FragmentShader("Shaders/Shadow.frag.glsl"))); - m_ShadowProgramSkinned->Compile(); - m_ShadowProgramSkinned->BindFragDataLocation(0, "ShadowMap"); - m_ShadowProgramSkinned->Link(); + m_ShadowProgramSkinned = ResourceManager::Load("#ShadowProgramSkinned"); + m_ShadowProgramSkinned->AddShader(std::shared_ptr(new VertexShader("Shaders/ShadowSkinned.vert.glsl"))); + m_ShadowProgramSkinned->AddShader(std::shared_ptr(new FragmentShader("Shaders/Shadow.frag.glsl"))); + m_ShadowProgramSkinned->Compile(); + m_ShadowProgramSkinned->BindFragDataLocation(0, "ShadowMap"); + m_ShadowProgramSkinned->Link(); } void ShadowPass::ClearBuffer() @@ -209,109 +209,53 @@ void ShadowPass::RadiusToLightspace(ShadowFrustum& frustum) frustum.LRBT = { left, right, bottom, top }; } -void ShadowPass::CheckStatus(bool shadowStatus) -{ - if (m_EnableShadows == shadowStatus) { - return; - } - - m_EnableShadows = shadowStatus; - - if (m_EnableShadows == false) { - CommonFunctions::DeleteTexture(&m_DepthMap); - return; - } - - InitializeFrameBuffers(); -} - void ShadowPass::Draw(RenderScene & scene) { - if (!m_EnableShadows) { - return; - } + if (m_EnableShadows) { + InitializeCameras(scene); + UpdateSplitDist(m_shadowFrusta, scene.Camera->NearClip(), scene.Camera->FarClip()); - InitializeCameras(scene); - UpdateSplitDist(m_shadowFrusta, scene.Camera->NearClip(), scene.Camera->FarClip()); + ShadowPassState* state = new ShadowPassState(m_DepthBuffer.GetHandle()); - ShadowPassState* state = new ShadowPassState(m_DepthBuffer.GetHandle()); + + glViewport(0, 0, m_ResolutionSizeWidth, m_ResolutionSizeHeight); - glViewport(0, 0, m_ResolutionSizeWidth, m_ResolutionSizeHeight); + for (int i = 0; i < m_CurrentNrOfSplits; i++) { + UpdateFrustumPoints(m_shadowFrusta[i], scene.Camera->Position(), scene.Camera->Forward()); - for (int i = 0; i < m_CurrentNrOfSplits; i++) { - UpdateFrustumPoints(m_shadowFrusta[i], scene.Camera->Position(), scene.Camera->Forward()); - - glFramebufferTextureLayer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, m_DepthMap, 0, i); - - GLuint shaderHandle; - - for (auto &job : scene.Jobs.DirectionalLight) { - - auto directionalLightJob = std::dynamic_pointer_cast(job); - - if (directionalLightJob) { - m_LightView[i] = glm::lookAt(glm::vec3(-directionalLightJob->Direction) + m_shadowFrusta[i].MiddlePoint, m_shadowFrusta[i].MiddlePoint, glm::vec3(0.f, 1.f, 0.f)); - - PointsToLightspace(m_shadowFrusta[i], m_LightView[i]); - //FindRadius(m_shadowFrusta[i]); - //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]); + glFramebufferTextureLayer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, m_DepthMap, 0, i); - 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])); + GLuint shaderHandle; - 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])); + for (auto &job : scene.Jobs.DirectionalLight) { + + auto directionalLightJob = std::dynamic_pointer_cast(job); + + if (directionalLightJob) { + m_LightView[i] = glm::lookAt(glm::vec3(-directionalLightJob->Direction) + m_shadowFrusta[i].MiddlePoint, m_shadowFrusta[i].MiddlePoint, glm::vec3(0.f, 1.f, 0.f)); + + PointsToLightspace(m_shadowFrusta[i], m_LightView[i]); + //FindRadius(m_shadowFrusta[i]); + //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"); + GLERROR("ShadowLight ERROR"); - for (auto &objectJob : scene.Jobs.OpaqueObjects) { - if (!std::dynamic_pointer_cast(objectJob)) { - auto modelJob = std::dynamic_pointer_cast(objectJob); - - if (!modelJob->Shadow) { - continue; - } - - if (modelJob->Model->IsSkinned()) { - m_ShadowProgramSkinned->Bind(); - shaderHandle = m_ShadowProgramSkinned->GetHandle(); - - std::vector frameBones; - if (modelJob->BlendTree != nullptr) { - frameBones = modelJob->BlendTree->GetFinalPose(); - } - else { - frameBones = modelJob->Skeleton->GetTPose(); - } - glUniformMatrix4fv(glGetUniformLocation(shaderHandle, "Bones"), frameBones.size(), GL_FALSE, glm::value_ptr(frameBones[0])); - - } - else { - m_ShadowProgram->Bind(); - shaderHandle = m_ShadowProgram->GetHandle(); - } - - glUniformMatrix4fv(glGetUniformLocation(shaderHandle, "M"), 1, GL_FALSE, glm::value_ptr(modelJob->Matrix)); - glUniform1f(glGetUniformLocation(shaderHandle, "Alpha"), 1.f); - - 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"); - } - } - if (m_TransparentObjects) { - state->CullFace(GL_BACK); - for (auto &objectJob : scene.Jobs.TransparentObjects) { + for (auto &objectJob : scene.Jobs.OpaqueObjects) { if (!std::dynamic_pointer_cast(objectJob)) { auto modelJob = std::dynamic_pointer_cast(objectJob); @@ -319,53 +263,25 @@ void ShadowPass::Draw(RenderScene & scene) continue; } - if (modelJob->Model->IsSkinned()) { - m_ShadowProgramSkinned->Bind(); - shaderHandle = m_ShadowProgramSkinned->GetHandle(); + if(modelJob->Model->IsSkinned()) { + m_ShadowProgramSkinned->Bind(); + shaderHandle = m_ShadowProgramSkinned->GetHandle(); - std::vector frameBones; - if (modelJob->BlendTree != nullptr) { - frameBones = modelJob->BlendTree->GetFinalPose(); - } - else { - frameBones = modelJob->Skeleton->GetTPose(); - } - glUniformMatrix4fv(glGetUniformLocation(shaderHandle, "Bones"), frameBones.size(), GL_FALSE, glm::value_ptr(frameBones[0])); + std::vector frameBones; + if (modelJob->BlendTree != nullptr) { + frameBones = modelJob->BlendTree->GetFinalPose(); + } else { + frameBones = modelJob->Skeleton->GetTPose(); + } + glUniformMatrix4fv(glGetUniformLocation(shaderHandle, "Bones"), frameBones.size(), GL_FALSE, glm::value_ptr(frameBones[0])); - } - else { - m_ShadowProgram->Bind(); - shaderHandle = m_ShadowProgram->GetHandle(); - } + } else { + m_ShadowProgram->Bind(); + shaderHandle = m_ShadowProgram->GetHandle(); + } glUniformMatrix4fv(glGetUniformLocation(shaderHandle, "M"), 1, GL_FALSE, glm::value_ptr(modelJob->Matrix)); - glUniform1f(glGetUniformLocation(shaderHandle, "Alpha"), modelJob->Color.a); - - if (m_TexturedShadows) { - switch (modelJob->Type) { - case RawModel::MaterialType::SingleTextures: - case RawModel::MaterialType::Basic: - { - glActiveTexture(GL_TEXTURE24); - if (modelJob->DiffuseTexture.size() > 0 && modelJob->DiffuseTexture[0]->Texture != nullptr) { - glBindTexture(GL_TEXTURE_2D, modelJob->DiffuseTexture[0]->Texture->m_Texture); - glUniform2fv(glGetUniformLocation(shaderHandle, "DiffuseUVRepeat"), 1, glm::value_ptr(modelJob->DiffuseTexture[0]->UVRepeat)); - } - else { - glBindTexture(GL_TEXTURE_2D, m_WhiteTexture->m_Texture); - glUniform2fv(glGetUniformLocation(shaderHandle, "DiffuseUVRepeat"), 1, glm::value_ptr(glm::vec2(1.0f, 1.0f))); - } - break; - } - case RawModel::MaterialType::SplatMapping: - { - glActiveTexture(GL_TEXTURE24); - glBindTexture(GL_TEXTURE_2D, m_WhiteTexture->m_Texture); - glUniform2fv(glGetUniformLocation(shaderHandle, "DiffuseUVRepeat"), 1, glm::value_ptr(glm::vec2(1.0f, 1.0f))); - break; - } - } - } + glUniform1f(glGetUniformLocation(shaderHandle, "Alpha"), 1.f); glBindVertexArray(modelJob->Model->VAO); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, modelJob->Model->ElementBuffer); @@ -374,13 +290,76 @@ void ShadowPass::Draw(RenderScene & scene) GLERROR("Shadow Draw ERROR"); } } - state->CullFace(GL_FRONT); + if (m_TransparentObjects) { + state->CullFace(GL_BACK); + for (auto &objectJob : scene.Jobs.TransparentObjects) { + if (!std::dynamic_pointer_cast(objectJob)) { + auto modelJob = std::dynamic_pointer_cast(objectJob); + + if (!modelJob->Shadow) { + continue; + } + + if (modelJob->Model->IsSkinned()) { + m_ShadowProgramSkinned->Bind(); + shaderHandle = m_ShadowProgramSkinned->GetHandle(); + + std::vector frameBones; + if (modelJob->BlendTree != nullptr) { + frameBones = modelJob->BlendTree->GetFinalPose(); + } else { + frameBones = modelJob->Skeleton->GetTPose(); + } + glUniformMatrix4fv(glGetUniformLocation(shaderHandle, "Bones"), frameBones.size(), GL_FALSE, glm::value_ptr(frameBones[0])); + + } else { + m_ShadowProgram->Bind(); + shaderHandle = m_ShadowProgram->GetHandle(); + } + + glUniformMatrix4fv(glGetUniformLocation(shaderHandle, "M"), 1, GL_FALSE, glm::value_ptr(modelJob->Matrix)); + glUniform1f(glGetUniformLocation(shaderHandle, "Alpha"), modelJob->Color.a); + + if (m_TexturedShadows) { + switch (modelJob->Type) { + case RawModel::MaterialType::SingleTextures: + case RawModel::MaterialType::Basic: + { + glActiveTexture(GL_TEXTURE24); + if (modelJob->DiffuseTexture.size() > 0 && modelJob->DiffuseTexture[0]->Texture != nullptr) { + glBindTexture(GL_TEXTURE_2D, modelJob->DiffuseTexture[0]->Texture->m_Texture); + glUniform2fv(glGetUniformLocation(shaderHandle, "DiffuseUVRepeat"), 1, glm::value_ptr(modelJob->DiffuseTexture[0]->UVRepeat)); + } + else { + glBindTexture(GL_TEXTURE_2D, m_WhiteTexture->m_Texture); + glUniform2fv(glGetUniformLocation(shaderHandle, "DiffuseUVRepeat"), 1, glm::value_ptr(glm::vec2(1.0f, 1.0f))); + } + break; + } + case RawModel::MaterialType::SplatMapping: + { + glActiveTexture(GL_TEXTURE24); + glBindTexture(GL_TEXTURE_2D, m_WhiteTexture->m_Texture); + glUniform2fv(glGetUniformLocation(shaderHandle, "DiffuseUVRepeat"), 1, glm::value_ptr(glm::vec2(1.0f, 1.0f))); + break; + } + } + } + + 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"); + } + } + state->CullFace(GL_FRONT); + } } } } + glViewport(0, 0, m_Renderer->GetViewportSize().Width, m_Renderer->GetViewportSize().Height); + m_DepthBuffer.Unbind(); + delete state; } - - glViewport(0, 0, m_Renderer->GetViewportSize().Width, m_Renderer->GetViewportSize().Height); - m_DepthBuffer.Unbind(); - delete state; } \ No newline at end of file From b76bc74c4bd801c057d95dcacb9c2eec85818465 Mon Sep 17 00:00:00 2001 From: antc13 Date: Sun, 13 Mar 2016 21:51:24 +0100 Subject: [PATCH 13/13] Changed glow intensity on some grid walls. --- resources/Schema/Entities/CP_Rocky2.xml | 12484 +++++++++++----------- 1 file changed, 6242 insertions(+), 6242 deletions(-) diff --git a/resources/Schema/Entities/CP_Rocky2.xml b/resources/Schema/Entities/CP_Rocky2.xml index 5f33f047..6eb85547 100644 --- a/resources/Schema/Entities/CP_Rocky2.xml +++ b/resources/Schema/Entities/CP_Rocky2.xml @@ -3,7 +3,7 @@ - 5.7165847250728348 + 7.4313138789702364 @@ -33,6 +33,20 @@ + + + + + 2 + Models/Props/Walls/SciFiWallBig.mesh + false + + + + + + + @@ -61,7 +75,7 @@ - 2 + 2.2999999523162842 Models/Props/Walls/SciFiWallSmall1.mesh @@ -79,20 +93,6 @@ - - - - - 2 - Models/Props/Walls/SciFiWallBig.mesh - false - - - - - - - @@ -123,7 +123,7 @@ - 2 + 2.3599998950958252 Models/Props/Walls/SciFiWallSmall4.mesh @@ -689,6 +689,19 @@ + + + + + Models/Highgrounds/Hg18.mesh + + + + + + + + @@ -789,19 +802,6 @@ - - - - - Models/Highgrounds/Hg18.mesh - - - - - - - - @@ -1620,11 +1620,11 @@ 12 - + - + @@ -1676,11 +1676,11 @@ 12 - + - + @@ -1748,11 +1748,11 @@ 12 - + - + @@ -2825,6 +2825,179 @@ + + + + + Models/Props/Stones/BigStone.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/BigStone.mesh + + + + + + + + + + + + + + Models/Props/Stones/MediumStone2.mesh + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + + Models/Props/Stones/MediumStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + @@ -3016,6 +3189,20 @@ + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + @@ -3350,19 +3537,6 @@ - - - - - Models/Props/Stones/SmallStone2.mesh - - - - - - - - @@ -3377,18 +3551,6 @@ - - - - - Models/Props/Stones/SmallStone2.mesh - - - - - - - @@ -3402,19 +3564,6 @@ - - - - - Models/Props/Stones/BigStone.mesh - - - - - - - - @@ -3428,19 +3577,6 @@ - - - - - Models/Props/Stones/SmallStone2.mesh - - - - - - - - @@ -3455,19 +3591,6 @@ - - - - - Models/Props/Stones/MediumStone2.mesh - - - - - - - - @@ -3481,20 +3604,6 @@ - - - - - Models/Props/Stones/BigStone.mesh - - - - - - - - - @@ -3509,20 +3618,6 @@ - - - - - Models/Props/Stones/SmallStone2.mesh - - - - - - - - - @@ -3537,20 +3632,6 @@ - - - - - Models/Props/Stones/SmallStone2.mesh - - - - - - - - - @@ -3565,19 +3646,6 @@ - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - @@ -3592,19 +3660,6 @@ - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - @@ -3618,47 +3673,6 @@ - - - - - Models/Props/Stones/MediumStone2.mesh - - - - - - - - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - - - - - - - - Models/Props/Stones/SmallStone2.mesh - - - - - - - - - @@ -3672,20 +3686,6 @@ - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - - @@ -3693,6 +3693,19 @@ + + + + + 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,86 +3775,33 @@ 2 - + - + - + 8 - Models/Props/PickUps/HealthPickUp.mesh + Models/Props/PickUps/AmmoPickUp.mesh - + 1.5 3 - - - - - - - - - - - - - - - - Models/Props/PickUps/PickUpHolder.mesh - - - - - - - - - - - - 2 - - - - - - - - - - - - - 8 - - - - Models/Props/PickUps/HealthPickUp.mesh - - - - - 1.5 - 3 - - - - + + @@ -3881,11 +3829,11 @@ 2 - + - + @@ -3907,7 +3855,113 @@ - + + + + + + + + + + + + + + + Models/Props/PickUps/PickUpHolder.mesh + + + + + + + + + + + + 2 + + + + + + + + + + + + + 8 + + + + Models/Props/PickUps/HealthPickUp.mesh + + + + + 1.5 + 3 + + + + + + + + + + + + + + + + + + Models/Props/PickUps/PickUpHolder.mesh + + + + + + + + + + + + 2 + + + + + + + + + + + + + 8 + + + + Models/Props/PickUps/HealthPickUp.mesh + + + + + 1.5 + 3 + + + + @@ -3935,11 +3989,11 @@ 2 - + - + @@ -3961,61 +4015,7 @@ - - - - - - - - - - - - - - - Models/Props/PickUps/PickUpHolder.mesh - false - - - - - - - - - - - - 2 - - - - - - - - - - - - - 8 - - - - Models/Props/PickUps/AmmoPickUp.mesh - - - - - 1.5 - 3 - - - - + @@ -4043,11 +4043,11 @@ 2 - + - + @@ -4069,7 +4069,7 @@ - + @@ -4100,8 +4100,36 @@ Models/Props/Pillars/SciFiPillar2Red.mesh - - + + + + + + + + + + + + 2 + Models/Props/Pillars/SciFiPillar2Red.mesh + + + + + + + + + + + + + 2 + Models/Props/Pillars/SciFiPillar2Red.mesh + + + @@ -4125,13 +4153,12 @@ - 2 Models/Props/Pillars/SciFiPillar2Red.mesh - - - + + + @@ -4159,8 +4186,9 @@ Models/Props/Pillars/SciFiPillar2Red.mesh - - + + + @@ -4173,8 +4201,23 @@ Models/Props/Pillars/SciFiPillar2Red.mesh - - + + + + + + + + + + + + 2 + Models/Props/Pillars/SciFiPillar2Red.mesh + + + + @@ -4193,21 +4236,6 @@ - - - - - 2 - Models/Props/Pillars/SciFiPillar2Red.mesh - - - - - - - - - @@ -4223,20 +4251,6 @@ - - - - - Models/Props/Pillars/SciFiPillar2Red.mesh - - - - - - - - - @@ -4252,20 +4266,6 @@ - - - - - 2 - Models/Props/Pillars/SciFiPillar2Red.mesh - - - - - - - - @@ -4292,11 +4292,11 @@ - Models/Props/Pillars/Bridge_Pillar1_SciFi_Blue.mesh + Models/Props/Stones/AssaultHolder.mesh - - + + @@ -4323,35 +4323,8 @@ Models/Props/Stones/ShinyStoneCrystalBlue.mesh - - - - - - - - - - - Models/Props/Stones/AssaultHolder.mesh - - - - - - - - - - - - - 3 - Models/Props/Stones/ShinyStoneCrystalBlue.mesh - - - - + + @@ -4371,48 +4344,6 @@ - - - - - 3 - Models/Props/Stones/ShinyStoneCrystalBlue.mesh - - - - - - - - - - - - - - Models/Props/Pillars/Bridge_Pillar1_SciFi_Blue.mesh - - - - - - - - - - - - - 9 - Models/Props/Stones/ShinyStoneCrystalBlue.mesh - - - - - - - - @@ -4428,123 +4359,6 @@ - - - - - 3 - Models/Props/Stones/ShinyStoneCrystalBlue.mesh - - - - - - - - - - - - - 3 - Models/Props/Stones/ShinyStoneCrystalBlue.mesh - - - - - - - - - - - - - - - - - - Models/Props/Flora/HangingBush4.mesh - true - - - - - - - - - - - - Models/Props/Flora/HangingBush2.mesh - true - - - - - - - - - - - - - Models/Props/Flora/HangingBush4.mesh - true - - - - - - - - - - - - Models/Props/Flora/HangingBush4.mesh - true - false - - - - - - - - - - - - - - - - Models/Props/Pillars/Bridge_Pillar1_SciFi_Blue.mesh - - - - - - - - - - - - - Models/Props/Stones/AssaultHolder.mesh - - - - - - - - @@ -4567,7 +4381,20 @@ Models/Props/Pillars/Bridge_Pillar1_SciFi_Blue.mesh - + + + + + + + + + + + Models/Props/Pillars/Bridge_Pillar1_SciFi_Blue.mesh + + + @@ -4586,6 +4413,179 @@ + + + + + Models/Props/Pillars/Bridge_Pillar1_SciFi_Blue.mesh + + + + + + + + + + + + + 3 + Models/Props/Stones/ShinyStoneCrystalBlue.mesh + + + + + + + + + + + + + 3 + Models/Props/Stones/ShinyStoneCrystalBlue.mesh + + + + + + + + + + + + + + 3 + Models/Props/Stones/ShinyStoneCrystalBlue.mesh + + + + + + + + + + + + + + 9 + Models/Props/Stones/ShinyStoneCrystalBlue.mesh + + + + + + + + + + + + + 3 + Models/Props/Stones/ShinyStoneCrystalBlue.mesh + + + + + + + + + + + + + + + + + Models/Props/Flora/HangingBush4.mesh + true + + + + + + + + + + + + Models/Props/Flora/HangingBush4.mesh + true + + + + + + + + + + + + Models/Props/Flora/HangingBush2.mesh + true + + + + + + + + + + + + + Models/Props/Flora/HangingBush4.mesh + true + false + + + + + + + + + + + + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + + + + + + Models/Props/Pillars/Bridge_Pillar1_SciFi_Blue.mesh + + + + + + + + @@ -4632,6 +4632,158 @@ + + + + + + + + + + Models/Props/Walls/SpecialWall1.mesh + + + + + + + + + + + + + + Models/Props/Walls/SpecialWall1.mesh + + + + + + + + + + + + + + Models/Props/Walls/SpecialWall1.mesh + + + + + + + + + + + + + + Models/Props/Walls/SpecialWall1.mesh + + + + + + + + + + + + + + + + + + + + + Models/Props/Pillars/SciFiPillar2Red.mesh + + + + + + + + + + + + + Models/Props/Pillars/StonePillar.mesh + + + + + + + + + + + + + + Models/Props/Pillars/StonePillar.mesh + + + + + + + + + + + + + + Models/Props/Pillars/SciFiPillar2Red.mesh + + + + + + + + + + + + + + Models/Props/Pillars/StonePillar.mesh + + + + + + + + + + + + 2 + Models/Props/Pillars/SciFiPillar1Red.mesh + + + + + + + + + + + @@ -4656,6 +4808,19 @@ + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + @@ -4682,19 +4847,6 @@ - - - - - Models/Props/Stones/AssaultHolder.mesh - - - - - - - - @@ -4712,100 +4864,26 @@ - - - - - - - - - - Models/Props/Pillars/SciFiPillar2Red.mesh - - - - - - - - - - - - - - Models/Props/Pillars/SciFiPillar2Red.mesh - - - - - - - - - - - - - Models/Props/Pillars/StonePillar.mesh - - - - - - - - - - - - Models/Props/Pillars/StonePillar.mesh - - - - - - - - - - - - - - 2 - Models/Props/Pillars/SciFiPillar1Red.mesh - - - - - - - - - - - - - - Models/Props/Pillars/StonePillar.mesh - - - - - - - - - - - + + + + + 1.5 + Models/Props/Bridges/Bridge1_SciFi_Red.mesh + + + + + + + + + @@ -4823,11 +4901,11 @@ 12 - + - + @@ -4879,87 +4957,8 @@ Models/Props/Pillars/Bridge_Pillar1_SciFi_Red.mesh - - - - - - - - - - - Models/Props/Pillars/Bridge_Pillar1_SciFi_Red.mesh - - - - - - - - - - - - - Models/Props/Bridges/SciFi_Bridge_Support_Top_Red.mesh - - - - - - - - - - - 12 - - - - - - - - - - - - - 1.5 - Models/Props/Bridges/SciFi_Bridge_Support_Middle_Red.mesh - - - - - - - - - - - - - - Models/Props/Bridges/SciFi_Bridge_Support_Bot_Red.mesh - - - - - - - - - - - - - - Models/Props/Pillars/Bridge_Pillar1_SciFi_Red.mesh - - - - + + @@ -5005,11 +5004,11 @@ 12 - + - + @@ -5039,8 +5038,8 @@ Models/Props/Pillars/Bridge_Pillar1_SciFi_Red.mesh - - + + @@ -5052,8 +5051,87 @@ Models/Props/Pillars/Bridge_Pillar1_SciFi_Red.mesh - - + + + + + + + + + + + Models/Props/Bridges/SciFi_Bridge_Support_Top_Red.mesh + + + + + + + + + + + + Models/Props/Bridges/SciFi_Bridge_Support_Bot_Red.mesh + + + + + + + + + + + 12 + + + + + + + + + + + + + 1.5 + Models/Props/Bridges/SciFi_Bridge_Support_Middle_Red.mesh + + + + + + + + + + + + + + + + Models/Props/Pillars/Bridge_Pillar1_SciFi_Red.mesh + + + + + + + + + + + + + Models/Props/Pillars/Bridge_Pillar1_SciFi_Red.mesh + + + + @@ -5073,21 +5151,6 @@ - - - - - 1.5 - Models/Props/Bridges/Bridge1_SciFi_Red.mesh - - - - - - - - - @@ -5214,95 +5277,6 @@ - - - - - 2 - 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 - - - - - - - - - @@ -5326,8 +5300,23 @@ Models/Props/Stones/ShinyStoneCrystalRed.mesh - - + + + + + + + + + + + + 2 + Models/Props/Stones/ShinyStoneCrystalRed.mesh + + + + @@ -5347,21 +5336,6 @@ - - - - - 2 - Models/Props/Stones/ShinyStoneCrystalRed.mesh - - - - - - - - - @@ -5370,23 +5344,8 @@ Models/Props/Stones/ShinyStoneCrystalRed.mesh - - - - - - - - - - - - 3 - Models/Props/Stones/ShinyStoneCrystalRed.mesh - - - - + + @@ -5407,6 +5366,110 @@ + + + + + 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 + + + + + + + + + + + + + 2 + Models/Props/Stones/ShinyStoneCrystalRed.mesh + + + + + + + + + + + + + + 3 + Models/Props/Stones/ShinyStoneCrystalRed.mesh + + + + + + + + + @@ -5424,74 +5487,24 @@ - - - - - - - - - - Models/Props/Walls/SpecialWall1.mesh - - - - - - - - - - - - - - Models/Props/Walls/SpecialWall1.mesh - - - - - - - - - - - - - - Models/Props/Walls/SpecialWall1.mesh - - - - - - - - - - - - - - Models/Props/Walls/SpecialWall1.mesh - - - - - - - - - - - + + + + + Models/Props/Bridge_Holder_Red.mesh + + + + + + + + @@ -5518,19 +5531,6 @@ - - - - - Models/Props/Bridge_Holder_Red.mesh - - - - - - - - @@ -5564,6 +5564,100 @@ + + + + + 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 + + + + + + + + + + + + + + + Models/Props/Stones/BigStone.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + @@ -5577,6 +5671,408 @@ + + + + + Models/Props/Stones/MediumStone2.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + + Models/Props/Stones/MediumStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + + Models/Props/Stones/BigStone.mesh + + + + + + + + + + + + + Models/Props/Stones/BigStone.mesh + + + + + + + + + + + + + + Models/Props/Stones/BigStone.mesh + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + Models/Props/Stones/mediumStone2.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.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/SmallStone1.mesh + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + Models/Props/Stones/MediumStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + Models/Props/Stones/BigStone.mesh + + + + + + + + @@ -5645,19 +6141,6 @@ - - - - - Models/Props/Stones/SmallStone2.mesh - - - - - - - - @@ -5672,20 +6155,6 @@ - - - - - Models/Props/Stones/SmallStone2.mesh - - - - - - - - - @@ -5700,20 +6169,6 @@ - - - - - Models/Props/Stones/MediumStone2.mesh - - - - - - - - - @@ -5727,19 +6182,6 @@ - - - - - Models/Props/Stones/BigStone.mesh - - - - - - - - @@ -5754,20 +6196,6 @@ - - - - - Models/Props/Stones/SmallStone2.mesh - - - - - - - - - @@ -5781,20 +6209,6 @@ - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - - @@ -5809,20 +6223,6 @@ - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - - @@ -5837,18 +6237,6 @@ - - - - - Models/Props/Stones/SmallStone2.mesh - - - - - - - @@ -5862,19 +6250,6 @@ - - - - - Models/Props/Stones/SmallStone2.mesh - - - - - - - - @@ -5888,19 +6263,6 @@ - - - - - Models/Props/Stones/BigStone.mesh - - - - - - - - @@ -5914,20 +6276,6 @@ - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - - @@ -5941,19 +6289,6 @@ - - - - - Models/Props/Stones/MediumStone2.mesh - - - - - - - - @@ -5967,19 +6302,6 @@ - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - @@ -5994,18 +6316,6 @@ - - - - - Models/Props/Stones/BigStone.mesh - - - - - - - @@ -6019,19 +6329,6 @@ - - - - - Models/Props/Stones/BigStone.mesh - - - - - - - - @@ -6046,19 +6343,6 @@ - - - - - Models/Props/Stones/SmallStone2.mesh - - - - - - - - @@ -6072,20 +6356,6 @@ - - - - - Models/Props/Stones/BigStone.mesh - - - - - - - - - @@ -6100,19 +6370,6 @@ - - - - - Models/Props/Stones/SmallStone2.mesh - - - - - - - - @@ -6127,20 +6384,6 @@ - - - - - Models/Props/Stones/SmallStone2.mesh - - - - - - - - - @@ -6155,19 +6398,6 @@ - - - - - Models/Props/Stones/mediumStone2.mesh - - - - - - - - @@ -6181,20 +6411,6 @@ - - - - - Models/Props/Stones/mediumStone2.mesh - - - - - - - - - @@ -6208,19 +6424,6 @@ - - - - - Models/Props/Stones/SmallStone2.mesh - - - - - - - - @@ -6235,20 +6438,6 @@ - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - - @@ -6263,19 +6452,6 @@ - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - @@ -6289,19 +6465,6 @@ - - - - - Models/Props/Stones/BigStone.mesh - - - - - - - - @@ -6316,48 +6479,6 @@ - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - - - - - Models/Props/Stones/SmallStone2.mesh - - - - - - - - - - - - - - - - Models/Props/Stones/SmallStone2.mesh - - - - - - - - - @@ -6372,19 +6493,6 @@ - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - @@ -6399,20 +6507,6 @@ - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - - @@ -6427,19 +6521,6 @@ - - - - - Models/Props/Stones/MediumStone2.mesh - - - - - - - - @@ -6454,47 +6535,6 @@ - - - - - Models/Props/Stones/MediumStone2.mesh - - - - - - - - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - - - - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - - @@ -6509,19 +6549,6 @@ - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - @@ -6535,19 +6562,6 @@ - - - - - Models/Props/Stones/SmallStone2.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/HealthPickUp.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/HealthPickUp.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,20 +7021,6 @@ - - - - - Models/Props/Stones/AssaultHolder.mesh - - - - - - - - - @@ -7062,6 +7048,34 @@ + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + + + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + + @@ -7088,20 +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,13 +7158,27 @@ Models/Props/Walls/Small_Wall_SciFi_Red.mesh - - + + + + + + + 2 + Models/Props/Walls/BigWallBlue.mesh + + + + + + + + @@ -7151,6 +7193,63 @@ + + + + + 2 + Models/Props/Walls/Small_Wall_SciFi_Red.mesh + + + + + + + + + + + + + 2 + Models/Props/Walls/Medium_Wall_SciFi_Red.mesh + + + + + + + + + + + + + 2 + Models/Props/Walls/BigWallRed.mesh + + + + + + + + + + + + + 2 + Models/Props/Walls/Small_Wall_SciFi_Red.mesh + + + + + + + + + @@ -7194,20 +7293,6 @@ - - - - - 2 - Models/Props/Walls/Small_Wall_SciFi_Red.mesh - - - - - - - - @@ -7251,20 +7336,6 @@ - - - - - 2 - Models/Props/Walls/Medium_Wall_SciFi_Red.mesh - - - - - - - - @@ -7309,20 +7380,6 @@ - - - - - 2 - Models/Props/Walls/BigWallRed.mesh - - - - - - - - @@ -7365,21 +7422,6 @@ - - - - - 2 - Models/Props/Walls/Small_Wall_SciFi_Red.mesh - - - - - - - - - @@ -7424,20 +7466,6 @@ - - - - - 2 - Models/Props/Walls/Medium_Wall_SciFi_Red.mesh - - - - - - - - @@ -7481,20 +7509,6 @@ - - - - - 2 - Models/Props/Walls/BigWallBlue.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 - - + + @@ -7708,6 +7708,115 @@ + + + + + Models/Props/Stones/mediumStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/MediumStone2.mesh + + + + + + + + + + + + + + Models/Props/Stones/MediumStone2.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone2.mesh + + + + + + + + + + + + + + Models/Props/Stones/SmallStone1.mesh + + + + + + + + + @@ -7734,19 +7843,6 @@ - - - - - Models/Props/Stones/MediumStone2.mesh - - - - - - - - @@ -7788,20 +7884,6 @@ - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - - @@ -7842,20 +7924,6 @@ - - - - - Models/Props/Stones/SmallStone2.mesh - - - - - - - - - @@ -7896,20 +7964,6 @@ - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - - @@ -7990,32 +8044,6 @@ - - - - - Models/Props/Stones/mediumStone2.mesh - - - - - - - - - - - - - Models/Props/Stones/SmallStone1.mesh - - - - - - - - @@ -8043,34 +8071,6 @@ - - - - - Models/Props/Stones/MediumStone2.mesh - - - - - - - - - - - - - - Models/Props/Stones/SmallStone2.mesh - - - - - - - - - @@ -8078,20 +8078,6 @@ - - - - - 2 - Models/Props/Walls/BigWallBlue.mesh - - - - - - - - @@ -8107,6 +8093,34 @@ + + + + + 2 + Models/Props/Walls/BigWallRed.mesh + + + + + + + + + + + + + 2 + Models/Props/Walls/Medium_Wall_SciFi_Blue.mesh + + + + + + + + @@ -8122,6 +8136,35 @@ + + + + + 2 + Models/Props/Walls/Small_Wall_SciFi_Blue.mesh + + + + + + + + + + + + + + 2 + Models/Props/Walls/BigWallBlue.mesh + + + + + + + + @@ -8151,35 +8194,6 @@ - - - - - 2 - Models/Props/Walls/BigWallRed.mesh - - - - - - - - - - - - - 2 - Models/Props/Walls/Small_Wall_SciFi_Blue.mesh - - - - - - - - - @@ -8224,20 +8238,6 @@ - - - - - 2 - Models/Props/Walls/Medium_Wall_SciFi_Blue.mesh - - - - - - - - @@ -8245,6 +8245,58 @@ + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + + + + + + Models/Props/Stones/AssaultHolder.mesh + + + + + + + + @@ -8273,19 +8325,6 @@ - - - - - Models/Props/Stones/AssaultHolder.mesh - - - - - - - - @@ -8326,19 +8365,6 @@ - - - - - Models/Props/Stones/AssaultHolder.mesh - - - - - - - - @@ -8378,19 +8404,6 @@ - - - - - Models/Props/Stones/AssaultHolder.mesh - - - - - - - - @@ -8432,19 +8445,6 @@ - - - - - Models/Props/Stones/AssaultHolder.mesh - - - - - - - - @@ -8496,11 +8496,11 @@ 2 - + - + @@ -8522,7 +8522,7 @@ - + @@ -8550,11 +8550,11 @@ 2 - + - + @@ -8576,7 +8576,7 @@ - + @@ -8598,13 +8598,13 @@ - 3 + 2 Models/Props/Stones/ShinyStoneCrystalRed.mesh - - - + + + @@ -8613,13 +8613,13 @@ - 2 + 3 Models/Props/Stones/ShinyStoneCrystalRed.mesh - - - + + + @@ -8640,9 +8640,9 @@ true - - - + + + @@ -8654,9 +8654,9 @@ true - - - + + + @@ -8717,6 +8717,36 @@ + + + + + 2.5 + Models/Props/Pillars/SciFiPillar2Blue.mesh + + + + + + + + + + + + + + 2.5 + Models/Props/Pillars/SciFiPillar2Blue.mesh + + + + + + + + + @@ -8761,21 +8791,6 @@ - - - - - 2.5 - Models/Props/Pillars/SciFiPillar2Blue.mesh - - - - - - - - - @@ -8820,21 +8835,6 @@ - - - - - 2.5 - Models/Props/Pillars/SciFiPillar2Blue.mesh - - - - - - - - - @@ -8882,19 +8882,19 @@ - + - + - Schema/Entities/PlayerRed.xml + Schema/Entities/PlayerAssaultBlue.xml - + @@ -8906,7 +8906,7 @@ false - + @@ -8919,7 +8919,7 @@ false - + @@ -8932,7 +8932,7 @@ false - + @@ -8945,333 +8945,969 @@ false - + - - - - - - - - - - - - - - - - - - Models/Core/UnitCube.mesh - false - - - - - - - - - - - - Models/Core/UnitCube.mesh - false - - - - - - - - - - - Schema/Entities/ScoreBoard_Blue.xml - - - - - - - - - - - - - - - Models/Core/UnitCube.mesh - - false - - - - - - - - - - - - - - - - - - - - - - - - - - - Name - Fonts/DroidSans.ttf,64 - - - - - - - - - - - - - - - Deaths - Fonts/DroidSans.ttf,64 - - - - - - - - - - - - - - - ID - Fonts/DroidSans.ttf,64 - - - - - - - - - - - - - - - Kills - Fonts/DroidSans.ttf,64 - - - - - - - - - - - - - - - KD - Fonts/DroidSans.ttf,64 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Schema/Entities/ScoreBoard_Red.xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Deaths - Fonts/DroidSans.ttf,64 - - - - - - - - - - - - - - - Kills - Fonts/DroidSans.ttf,64 - - - - - - - - - - - - - - - Name - Fonts/DroidSans.ttf,64 - - - - - - - - - - - - - - - ID - Fonts/DroidSans.ttf,64 - - - - - - - - - - - - - - - KD - Fonts/DroidSans.ttf,64 - - - - - - - - - - - - - - - - - Models/Core/UnitCube.mesh - - false - - - - - - - - - - - - - - - - + + + + 2 + + + + Models/Props/CapturePoint/CapturePointCylinder.mesh + + false + true + + + + + + + + + + + + + Models/Props/CapturePoint/CapturePointBlue.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/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/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 + + + + + + + + + + + + + + + + @@ -9298,322 +9934,6 @@ - - - - - Models/Props/CapturePoint/CapturePointBlue.mesh - false - - - - - - - - - - - - - - - 0.30000001192092896 - - - - 30 - - - 3.5 - - - - - - - - - - - Models/Props/CapturePoint/CrystalsLayer1.mesh - - false - false - - - - - - - - - - - 0.5 - - - - 20 - - - 3 - - - - - - - - - - - Models/Props/CapturePoint/CrystalsLayer2.mesh - - false - 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 - - - - - - - - - - - - - - - - - - - - 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 - - - - - - - - - - - - - - @@ -9630,28 +9950,28 @@ - + - 0.30000001192092896 + 0.5 - 30 - + 20 + - 3.5 + 3 - - + + - Models/Props/CapturePoint/CrystalsLayer1.mesh + Models/Props/CapturePoint/CrystalsLayer2.mesh false @@ -9661,28 +9981,28 @@ - + - 0.5 + 0.30000001192092896 - 20 - + 30 + - 3 + 3.5 - - + + - Models/Props/CapturePoint/CrystalsLayer2.mesh + Models/Props/CapturePoint/CrystalsLayer1.mesh false @@ -9700,16 +10020,29 @@ 10 - + 0.5 - - + + + + + + Models/Props/CapturePoint/CenterCrystal.mesh + + false + + + + + + + @@ -9717,7 +10050,7 @@ - + @@ -9775,19 +10108,6 @@ - - - - Models/Props/CapturePoint/CenterCrystal.mesh - - false - - - - - - - @@ -9799,103 +10119,16 @@ - - - - 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 - + @@ -9915,398 +10148,16 @@ - - - - - - - - - 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.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 - - - - - - - - - - - 0.5 - - - - 20 - - - 3 - - - - - - - - - - - Models/Props/CapturePoint/CrystalsLayer2.mesh - false - false - - - - - - - - - - - - - - - - - 2 - - - - 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 - - - + @@ -10315,7 +10166,6 @@ Models/Props/CapturePoint/DoubleSidedCylinder.mesh - false true @@ -10327,463 +10177,16 @@ - - - - 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/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 - + @@ -10791,7 +10194,7 @@ Models/Props/CapturePoint/DoubleSidedCylinder.mesh - + true @@ -10803,45 +10206,16 @@ - - - - 6 - - - 0.10000000149011612 - - - - - - - - - - Models/Props/CapturePoint/DoubleSidedCylinder.mesh - - true - - - - - - - - - - 6 - + 0.10000000149011612 - + @@ -10849,7 +10223,7 @@ Models/Props/CapturePoint/DoubleSidedCylinder.mesh - + true @@ -10882,6 +10256,38 @@ + + + + 0.30000001192092896 + + + + 30 + + + 3.5 + + + + + + + + + + + Models/Props/CapturePoint/CrystalsLayer1.mesh + + false + false + + + + + + + @@ -10890,13 +10296,13 @@ 10 - + 0.5 - - + + @@ -10907,7 +10313,7 @@ - + @@ -10991,13 +10397,13 @@ 20 - + 3 - - + + @@ -11008,38 +10414,7 @@ false false - - - - - - - - - - - 0.30000001192092896 - - - - 30 - - - 3.5 - - - - - - - - - - - Models/Props/CapturePoint/CrystalsLayer1.mesh - - false - false + true @@ -11056,46 +10431,16 @@ - - - - 6 - - - 0.10000000149011612 - - - - - - - - - - Models/Props/CapturePoint/DoubleSidedCylinder.mesh - - false - true - - - - - - - - - - 6 - + 0.10000000149011612 - + @@ -11116,16 +10461,76 @@ - + 6 - + 0.10000000149011612 - + + + + + + + + Models/Props/CapturePoint/DoubleSidedCylinder.mesh + + false + true + + + + + + + + + + + + + + 6 + + + 0.10000000149011612 + + + + + + + + + + Models/Props/CapturePoint/DoubleSidedCylinder.mesh + + false + true + + + + + + + + + + + + + + 6 + + + 0.10000000149011612 + + + @@ -11146,16 +10551,206 @@ + + + + + + + + + Models/Props/CapturePoint/CapturePointNeutral.mesh + 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 + + + + + + + + + + + + + + + 0.5 + + + + 20 + + + 3 + + + + + + + + + + + Models/Props/CapturePoint/CrystalsLayer2.mesh + false + false + + + + + + + + + + + + + + + + 6 - + 0.10000000149011612 - + @@ -11163,7 +10758,7 @@ Models/Props/CapturePoint/DoubleSidedCylinder.mesh - + false true @@ -11176,6 +10771,96 @@ + + + + 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 + + + + + + + + + + @@ -11221,12 +10906,12 @@ 6 - + 0.10000000149011612 - + @@ -11250,12 +10935,12 @@ 6 - + 0.10000000149011612 - + @@ -11279,12 +10964,12 @@ 6 - + 0.10000000149011612 - + @@ -11308,12 +10993,12 @@ 6 - + 0.10000000149011612 - + @@ -11342,36 +11027,6 @@ - - - - 0.5 - - - - 20 - - - 3 - - - - - - - - - - - Models/Props/CapturePoint/CrystalsLayer2.mesh - false - - - - - - - @@ -11380,13 +11035,13 @@ 10 - + 0.5 - - + + @@ -11397,10 +11052,22 @@ - + + + + + 4.5 + 0.5 + + + + + + + @@ -11425,18 +11092,6 @@ - - - - 4.5 - 0.5 - - - - - - - @@ -11466,6 +11121,36 @@ + + + + 0.5 + + + + 20 + + + 3 + + + + + + + + + + + Models/Props/CapturePoint/CrystalsLayer2.mesh + false + + + + + + + @@ -11474,13 +11159,13 @@ 30 - + 3.5 - - + + @@ -11517,70 +11202,6 @@ - - - - 0.30000001192092896 - - - - 30 - - - 3.5 - - - - - - - - - - - Models/Props/CapturePoint/CrystalsLayer1.mesh - - false - false - - - - - - - - - - - 0.5 - - - - 20 - - - 3 - - - - - - - - - - - Models/Props/CapturePoint/CrystalsLayer2.mesh - - false - false - - - - - - - @@ -11589,13 +11210,13 @@ 10 - + 0.5 - - + + @@ -11606,38 +11227,10 @@ - + - - - - - 4.5 - 0.5 - false - - - - - - - - - - - - 4.5 - 0.5 - false - - - - - - - @@ -11666,6 +11259,34 @@ + + + + + 4.5 + 0.5 + false + + + + + + + + + + + + 4.5 + 0.5 + false + + + + + + + @@ -11684,6 +11305,70 @@ + + + + 0.30000001192092896 + + + + 30 + + + 3.5 + + + + + + + + + + + Models/Props/CapturePoint/CrystalsLayer1.mesh + + false + false + + + + + + + + + + + 0.5 + + + + 20 + + + 3 + + + + + + + + + + + Models/Props/CapturePoint/CrystalsLayer2.mesh + + false + false + + + + + + + @@ -11697,12 +11382,12 @@ 6 - + 0.10000000149011612 - + @@ -11723,46 +11408,16 @@ - - - - 6 - - - 0.10000000149011612 - - - - - - - - - - Models/Props/CapturePoint/DoubleSidedCylinder.mesh - - false - true - - - - - - - - - - 6 - + 0.10000000149011612 - + @@ -11783,16 +11438,46 @@ - + 6 - + 0.10000000149011612 - + + + + + + + + Models/Props/CapturePoint/DoubleSidedCylinder.mesh + + false + true + + + + + + + + + + + + + + 6 + + + 0.10000000149011612 + + + @@ -11838,12 +11523,12 @@ 6 - + 0.10000000149011612 - + @@ -11868,12 +11553,12 @@ 6 - + 0.10000000149011612 - + @@ -11898,12 +11583,12 @@ 6 - + 0.10000000149011612 - + @@ -11928,12 +11613,12 @@ 6 - + 0.10000000149011612 - + @@ -11963,38 +11648,6 @@ - - - - 0.5 - - - - 20 - - - 3 - - - - - - - - - - - Models/Props/CapturePoint/CrystalsLayer2.mesh - - false - false - - - - - - - @@ -12003,13 +11656,13 @@ 10 - + 0.5 - - + + @@ -12020,10 +11673,24 @@ - + + + + + + 4.5 + 0.5 + false + + + + + + + @@ -12052,20 +11719,6 @@ - - - - - 4.5 - 0.5 - false - - - - - - - @@ -12096,6 +11749,38 @@ + + + + 0.5 + + + + 20 + + + 3 + + + + + + + + + + + Models/Props/CapturePoint/CrystalsLayer2.mesh + + false + false + + + + + + + @@ -12104,13 +11789,13 @@ 30 - + 3.5 - - + + @@ -12174,12 +11859,12 @@ 6 - + 0.10000000149011612 - + @@ -12200,46 +11885,16 @@ - - - - 6 - - - 0.10000000149011612 - - - - - - - - - - Models/Props/CapturePoint/DoubleSidedCylinder.mesh - - false - true - - - - - - - - - - 6 - + 0.10000000149011612 - + @@ -12260,16 +11915,46 @@ - + 6 - + 0.10000000149011612 - + + + + + + + + Models/Props/CapturePoint/DoubleSidedCylinder.mesh + + false + true + + + + + + + + + + + + + + 6 + + + 0.10000000149011612 + + + @@ -12307,28 +11992,16 @@ 10 - + 0.5 - - + + - - - - Models/Props/CapturePoint/CenterCrystal.mesh - - false - false - - - - - @@ -12336,10 +12009,24 @@ - + + + + + + 4.5 + 0.5 + false + + + + + + + @@ -12382,22 +12069,20 @@ - - - - - 4.5 - 0.5 - false - - - - - - - + + + + Models/Props/CapturePoint/CenterCrystal.mesh + + false + false + + + + + @@ -12408,13 +12093,13 @@ 20 - + 3 - - + + @@ -12440,13 +12125,13 @@ 30 - + 3.5 - - + + @@ -12484,6 +12169,36 @@ + + + + 0.30000001192092896 + + + + 30 + + + 3.5 + + + + + + + + + + + Models/Props/CapturePoint/CrystalsLayer1.mesh + false + + + + + + + @@ -12492,13 +12207,13 @@ 20 - + 3 - - + + @@ -12522,13 +12237,13 @@ 10 - + 0.5 - - + + @@ -12539,7 +12254,7 @@ - + @@ -12550,7 +12265,7 @@ 0.5 - + @@ -12562,7 +12277,7 @@ 0.5 - + @@ -12607,36 +12322,6 @@ - - - - 0.30000001192092896 - - - - 30 - - - 3.5 - - - - - - - - - - - Models/Props/CapturePoint/CrystalsLayer1.mesh - false - - - - - - - @@ -12646,16 +12331,45 @@ - + 6 - + 0.10000000149011612 - + + + + + + + + Models/Props/CapturePoint/DoubleSidedCylinder.mesh + + true + + + + + + + + + + + + + + 6 + + + 0.10000000149011612 + + + @@ -12679,12 +12393,12 @@ 6 - + 0.10000000149011612 - + @@ -12708,12 +12422,12 @@ 6 - + 0.10000000149011612 - + @@ -12733,35 +12447,6 @@ - - - - 6 - - - 0.10000000149011612 - - - - - - - - - - Models/Props/CapturePoint/DoubleSidedCylinder.mesh - - true - - - - - - - - - - @@ -12776,182 +12461,6 @@ - - - - - - - - - - - 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 - - - - - - - - - @@ -12963,12 +12472,12 @@ 6 - + 0.10000000149011612 - + @@ -12993,12 +12502,12 @@ 6 - + 0.10000000149011612 - + @@ -13023,12 +12532,12 @@ 6 - + 0.10000000149011612 - + @@ -13053,12 +12562,12 @@ 6 - + 0.10000000149011612 - + @@ -13081,6 +12590,182 @@ + + + + + + + + + + + 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 + + + + + + + + + @@ -13112,309 +12797,6 @@ - - - - - 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.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 - - - - - - - - - - - - - - - 0.5 - - - - 20 - - - 3 - - - - - - - - - - - Models/Props/CapturePoint/CrystalsLayer2.mesh - - false - - - - - - - - - - - @@ -13432,38 +12814,6 @@ - - - - 0.30000001192092896 - - - - 30 - - - 3.5 - - - - - - - - - - - Models/Props/CapturePoint/CrystalsLayer1.mesh - - false - false - - - - - - - @@ -13472,13 +12822,13 @@ 10 - + 0.5 - - + + @@ -13503,7 +12853,7 @@ - + @@ -13515,7 +12865,7 @@ 0.5 - + @@ -13528,7 +12878,7 @@ 0.5 - + @@ -13563,6 +12913,38 @@ + + + + 0.30000001192092896 + + + + 30 + + + 3.5 + + + + + + + + + + + Models/Props/CapturePoint/CrystalsLayer1.mesh + + false + false + + + + + + + @@ -13571,13 +12953,13 @@ 20 - + 3 - - + + @@ -13604,46 +12986,16 @@ - - - - 6 - - - 0.10000000149011612 - - - - - - - - - - Models/Props/CapturePoint/DoubleSidedCylinder.mesh - - false - true - - - - - - - - - - 6 - + 0.10000000149011612 - + @@ -13664,16 +13016,76 @@ - + 6 - + 0.10000000149011612 - + + + + + + + + Models/Props/CapturePoint/DoubleSidedCylinder.mesh + + false + true + + + + + + + + + + + + + + 6 + + + 0.10000000149011612 + + + + + + + + + + Models/Props/CapturePoint/DoubleSidedCylinder.mesh + + false + true + + + + + + + + + + + + + + 6 + + + 0.10000000149011612 + + + @@ -13694,16 +13106,203 @@ - + + + + + + + + + Models/Props/CapturePoint/CapturePointBlue.mesh + + + + + + + + + + + + + + + 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 + + + + + + + + + + + + + + + 0.5 + + + + 20 + + + 3 + + + + + + + + + + + Models/Props/CapturePoint/CrystalsLayer2.mesh + + false + + + + + + + + + + + + + + + + + 6 - + 0.10000000149011612 - + @@ -13711,8 +13310,94 @@ Models/Props/CapturePoint/DoubleSidedCylinder.mesh - - false + + 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 @@ -13753,13 +13438,13 @@ 20 - + 3 - - + + @@ -13784,16 +13469,29 @@ 10 - + 0.5 - - + + + + + + Models/Props/CapturePoint/CenterCrystal.mesh + false + false + + + + + + + @@ -13801,7 +13499,7 @@ - + @@ -13855,19 +13553,6 @@ - - - - Models/Props/CapturePoint/CenterCrystal.mesh - false - false - - - - - - - @@ -13878,13 +13563,13 @@ 30 - + 3.5 - - + + @@ -13914,12 +13599,12 @@ 6 - + 0.10000000149011612 - + @@ -13940,46 +13625,16 @@ - - - - 6 - - - 0.10000000149011612 - - - - - - - - - - Models/Props/CapturePoint/DoubleSidedCylinder.mesh - - false - true - - - - - - - - - - 6 - + 0.10000000149011612 - + @@ -14000,16 +13655,46 @@ - + 6 - + 0.10000000149011612 - + + + + + + + + Models/Props/CapturePoint/DoubleSidedCylinder.mesh + + false + true + + + + + + + + + + + + + + 6 + + + 0.10000000149011612 + + + @@ -14038,19 +13723,19 @@ - + - + - Schema/Entities/PlayerAssaultBlue.xml + Schema/Entities/PlayerRed.xml - + @@ -14062,7 +13747,7 @@ false - + @@ -14075,7 +13760,7 @@ false - + @@ -14088,7 +13773,7 @@ false - + @@ -14101,13 +13786,328 @@ false - + + + + + + + + + + + + + + + + + + + Models/Core/UnitCube.mesh + false + + + + + + + + + + + Models/Core/UnitCube.mesh + false + + + + + + + + + + + + Schema/Entities/ScoreBoard_Blue.xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Kills + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + + + + KD + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + + + + Name + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + + + + Deaths + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + + + + ID + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + + + + + + Models/Core/UnitCube.mesh + + false + + + + + + + + + + + + + + + + + + + + + + + + + + + + Schema/Entities/ScoreBoard_Red.xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Name + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + + + + ID + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + + + + Deaths + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + + + + Kills + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + + + + KD + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + + + + + + Models/Core/UnitCube.mesh + + false + + + + + + + + + + + + + + + + @@ -14116,7 +14116,7 @@ - + @@ -14128,6 +14128,193 @@ + + + + 0.20000000298023224 + 300 + + + + + + + + + + + + + + + + false + Models/Core/UnitQuad.mesh + + Textures/Core/UnitHexagon.png + + + + SwapToTeamPick + 1 + + + + + + + + + + + Team + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + Change + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + + + Pick Class + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + + + false + Models/Core/UnitQuad.mesh + + Textures/Icons/Classes/Defender-01.png + + + PickClass + 2 + + + + + + + + + + + Defender + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + + + + + false + Models/Core/UnitQuad.mesh + + Textures/Icons/Classes/Sniper-01.png + + + PickClass + 3 + + + + + + + + + + + Sniper + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + + + + + false + Models/Core/UnitQuad.mesh + + Textures/Icons/Classes/Assault-01.png + + + PickClass + 1 + + + + + + + + + + + Assault + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + + + + @@ -14144,20 +14331,6 @@ - - - - Pick Team - Fonts/DroidSans.ttf,64 - - - - - - - - - @@ -14193,6 +14366,71 @@ + + + + + false + Models/Core/UnitQuad.mesh + + Textures/Core/UnitHexagon.png + + false + + + SwapToClassPick + 1 + + + + + + + + + + + Class + Fonts/DroidSans.ttf,64 + false + + + + + + + + + + + + Change + Fonts/DroidSans.ttf,64 + false + + + + + + + + + + + + + + Pick Team + Fonts/DroidSans.ttf,64 + + + + + + + + + @@ -14263,57 +14501,6 @@ - - - - - false - Models/Core/UnitQuad.mesh - - Textures/Core/UnitHexagon.png - - false - - - SwapToClassPick - 1 - - - - - - - - - - - Change - Fonts/DroidSans.ttf,64 - false - - - - - - - - - - - - Class - Fonts/DroidSans.ttf,64 - false - - - - - - - - - - @@ -14334,54 +14521,6 @@ - - - - - false - Models/Core/UnitQuad.mesh - - Textures/Core/UnitHexagon.png - - - - SwapToClassPick - 1 - - - - - - - - - - - Class - Fonts/DroidSans.ttf,64 - - - - - - - - - - - - Change - Fonts/DroidSans.ttf,64 - - - - - - - - - - @@ -14402,19 +14541,6 @@ - - - - Team - Fonts/DroidSans.ttf,64 - - - - - - - - @@ -14428,12 +14554,73 @@ + + + + Team + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + + + + false + Models/Core/UnitQuad.mesh + + Textures/Core/UnitHexagon.png + + + + SwapToClassPick + 1 + + + + + + + + + + + Change + Fonts/DroidSans.ttf,64 + + + + + + + + + + + + Class + Fonts/DroidSans.ttf,64 + + + + + + + + - 3 + 1 Fonts/DroidSans.ttf,64 @@ -14462,7 +14649,7 @@ - + @@ -14472,7 +14659,7 @@ - 3 + 1 false @@ -14500,7 +14687,7 @@ - + @@ -14510,7 +14697,7 @@ - 1 + 3 false @@ -14648,193 +14835,6 @@ - - - - 0.20000000298023224 - 300 - - - - - - - - - - - - - - - Pick Class - Fonts/DroidSans.ttf,64 - - - - - - - - - - - - - - false - Models/Core/UnitQuad.mesh - - Textures/Core/UnitHexagon.png - - - - SwapToTeamPick - 1 - - - - - - - - - - - Team - Fonts/DroidSans.ttf,64 - - - - - - - - - - - - Change - Fonts/DroidSans.ttf,64 - - - - - - - - - - - - - - - false - Models/Core/UnitQuad.mesh - - Textures/Icons/Classes/Assault-01.png - - - PickClass - 1 - - - - - - - - - - - Assault - Fonts/DroidSans.ttf,64 - - - - - - - - - - - - - - - - false - Models/Core/UnitQuad.mesh - - Textures/Icons/Classes/Sniper-01.png - - - PickClass - 3 - - - - - - - - - - - Sniper - Fonts/DroidSans.ttf,64 - - - - - - - - - - - - - - - - false - Models/Core/UnitQuad.mesh - - Textures/Icons/Classes/Defender-01.png - - - PickClass - 2 - - - - - - - - - - - Defender - Fonts/DroidSans.ttf,64 - - - - - - - - - - - - - - - @@ -14850,74 +14850,94 @@ 10 - + - - - - 8 - - - - - - - - - - - - 10 - - - - - - - - - - - - 10 - - - - - - - - - - - - 1 - 1.2000000476837158 - - - - - - - - 3 - - - - - - - - - + + + + 4 + + + + + + + + + + + 4 + + + + + + + + + + + 4 + 2 + + + + + + + + + + + 4 + + + + + + + + + + + 4 + + + + + + + + + + + 4 + + + + + + + + + + + 4 + + + + + + + @@ -14962,50 +14982,6 @@ - - - - 4 - - - - - - - - - - - 4 - - - - - - - - - - - 4 - - - - - - - - - - - 4 - - - - - - - @@ -15051,29 +15027,6 @@ - - - - 4 - - - - - - - - - - - 4 - 2 - - - - - - - @@ -15085,32 +15038,105 @@ - - - - 4 - - - - - - - + + + + + 1 + 1.2000000476837158 + + + + + + + + 3 + + + + + + + + + + + + + + 10 + + + + + + + + + + + 10 + + + + + + + + + + + 8 + + + + + + + + + + + + 10 + + + + + + + - + + + + + 15 + 1 + + + + + + + + - + - + + + @@ -15122,7 +15148,7 @@ 0.5 - + @@ -15132,129 +15158,579 @@ 5 - 1 + 2 0.5 - - - - - - - - - - 5 - 1 - 0.5 - - - - - - - - - - - - 5 - 1 - 0.5 - - - - - - - - - - - - 5 - 1 - 0.5 - - - - - - - - - - - - 5 - 1 - 0.5 - - - - - - - - - - - - 5 - 1 - 0.5 - - - - - - - - - - - - 5 - 1 - 0.5 - - - - - - - - - - - - 5 - 1 - 0.5 - - - - - - - - - - - - 5 - 1 - 0.5 - - - + + + + + + + + + + + + + 5 + 1 + 0.5 + + + + + + + + + + + + 5 + 1 + 0.5 + + + + + + + + + + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + 5 + 1 + 0.5 + + + + + + + + + + + + + + + + + + + + + 5 + 1 + 0.5 + + + + + + + + + + + + 5 + 1 + 0.5 + + + + + + + + + + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + + + + + + + + + + 5 + 1 + 0.5 + + + + + + + + + + + + 5 + 1 + 0.5 + + + + + + + + + + + + + + + + + + + + + 5 + 1 + 0.5 + + + + + + + + + + + + 5 + 1 + 0.5 + + + + + + + + + + + + + + + + + + + + + 5 + 1 + 0.5 + + + + + + + + + + + + 5 + 1 + 0.5 + + + + + + + + + + + + + + + + + + + + + 3 + 1 + 0.5 + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + + + + + + + + + + 5 + 1 + 0.5 + + + + + + + + + + + + 5 + 1 + 0.5 + + + + + + + + + + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + + + + + + + + + + 2 + 1 + 0.5 + + + + + + + + + + + + 3 + 1 + 0.5 + + + + + + + + + + + + + + + + + + + + + 5 + 1 + 0.5 + + + + + + + + + + + + 5 + 1 + 0.5 + + + + + + + + + + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + 5 + 1 + 0.5 + + + + + + + + + + + + + + + + @@ -15373,31 +15849,9 @@ - - - - - - - 15 - 1 - - - - - - - - - - - - - + - - - + @@ -15409,7 +15863,7 @@ 0.5 - + @@ -15423,30 +15877,7 @@ 0.5 - - - - - - - - - - - - - - - - - - - 5 - 1 - 0.5 - - - + @@ -15460,104 +15891,7 @@ 0.5 - - - - - - - - - - - - - - - - - - - 5 - 1 - 0.5 - - - - - - - - - - - - 5 - 2 - 0.5 - - - - - - - - - - - - - - - - - - - - - 5 - 2 - 0.5 - - - - - - - - - - - - 3 - 1 - 0.5 - - - - - - - - - - - - - - - - - - - - - 5 - 1 - 0.5 - - - + @@ -15571,30 +15905,21 @@ 0.5 - + - - - - - - - - - - + 5 1 0.5 - + @@ -15608,141 +15933,7 @@ 0.5 - - - - - - - - - - - - - - - - - - - 5 - 2 - 0.5 - - - - - - - - - - - - 5 - 2 - 0.5 - - - - - - - - - - - - - - - - - - - - - 5 - 2 - 0.5 - - - - - - - - - - - - 5 - 2 - 0.5 - - - - - - - - - - - - - - - - - - - - - 2 - 1 - 0.5 - - - - - - - - - - - - 3 - 1 - 0.5 - - - - - - - - - - - - - - - - - - - - - 5 - 1 - 0.5 - - - + @@ -15756,67 +15947,7 @@ 0.5 - - - - - - - - - - - - - - - - - - - 5 - 2 - 0.5 - - - - - - - - - - - - 5 - 2 - 0.5 - - - - - - - - - - - - - - - - - - - - - 5 - 1 - 0.5 - - - + @@ -15830,30 +15961,7 @@ 0.5 - - - - - - - - - - - - - - - - - - - 5 - 1 - 0.5 - - - + @@ -15867,20 +15975,11 @@ 0.5 - + - - - - - - - - - @@ -15890,95 +15989,7 @@ 0.5 - - - - - - - - - - 5 - 2 - 0.5 - - - - - - - - - - - - - - - - - - - - - 5 - 2 - 0.5 - - - - - - - - - - - - 5 - 2 - 0.5 - - - - - - - - - - - - - - - - - - - - - 5 - 1 - 0.5 - - - - - - - - - - - - 5 - 2 - 0.5 - - - + @@ -16056,191 +16067,6 @@ - - - - - - - - - - - - 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 - - - - - - - - - - - - - - - - - - - - - 5 - 2 - 0.5 - - - - - - - - - - - - 5 - 2 - 0.5 - - - - - - - - - @@ -16278,6 +16104,43 @@ + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + @@ -16315,43 +16178,6 @@ - - - - - - - - - - - - 5 - 2 - 0.5 - - - - - - - - - - - - 5 - 2 - 0.5 - - - - - - - - - @@ -16359,6 +16185,20 @@ + + + + + 5 + 2 + 0.5 + + + + + + + @@ -16373,6 +16213,15 @@ + + + + + + + + + @@ -16382,7 +16231,95 @@ 0.5 - + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + 5 + 2 + 0.5 + + + @@ -16429,7 +16366,44 @@ - + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + 5 + 2 + 0.5 + + + + + + + + + + + + + @@ -16442,11 +16416,145 @@ 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 + + + + + + + + + + + + + + + + @@ -16461,6 +16569,20 @@ + + + + + 5 + 2 + 0.5 + + + + + + + @@ -16574,43 +16696,6 @@ - - - - - - - - - - - - 5 - 2 - 0.5 - - - - - - - - - - - - 5 - 2 - 0.5 - - - - - - - - - @@ -16648,80 +16733,6 @@ - - - - - - - - - - - - 5 - 2 - 0.5 - - - - - - - - - - - - 5 - 2 - 0.5 - - - - - - - - - - - - - - - - - - - - - 5 - 2 - 0.5 - - - - - - - - - - - - 5 - 2 - 0.5 - - - - - - - - - @@ -16756,7 +16767,7 @@ 0.5 - + @@ -16770,7 +16781,7 @@ 0.5 - + @@ -16854,20 +16865,6 @@ - - - - - 5 - 2 - 0.5 - - - - - - - @@ -16882,6 +16879,20 @@ + + + + + 5 + 2 + 0.5 + + + + + + + @@ -16936,7 +16947,7 @@ 1 - + @@ -16949,7 +16960,7 @@ 1 - + @@ -16971,17 +16982,6 @@ - - - - 10 - - - - - - -