From c9200dfbece69507e7a9a22af5a73d3f010bc14f Mon Sep 17 00:00:00 2001 From: LaG1924 <12997935+LaG1924@users.noreply.github.com> Date: Sat, 17 Mar 2018 20:53:05 +0500 Subject: Optimized update of RendererSection --- src/RendererSection.cpp | 45 ++++++++++++++++++++++++--------------------- src/RendererSection.hpp | 2 ++ src/RendererWorld.cpp | 20 +++++++++----------- 3 files changed, 35 insertions(+), 32 deletions(-) diff --git a/src/RendererSection.cpp b/src/RendererSection.cpp index 0311171..21c2714 100644 --- a/src/RendererSection.cpp +++ b/src/RendererSection.cpp @@ -108,26 +108,8 @@ RendererSection::RendererSection(const RendererSectionData &data) { } glBindVertexArray(0); glCheckError(); - - - //Upload data to VRAM - glBindBuffer(GL_ARRAY_BUFFER, Vbo[TEXTURES]); - glBufferData(GL_ARRAY_BUFFER, data.textures.size() * sizeof(glm::vec4), data.textures.data(), GL_DYNAMIC_DRAW); - - glBindBuffer(GL_ARRAY_BUFFER, Vbo[MODELS]); - glBufferData(GL_ARRAY_BUFFER, data.models.size() * sizeof(glm::mat4), data.models.data(), GL_DYNAMIC_DRAW); - - glBindBuffer(GL_ARRAY_BUFFER, Vbo[COLORS]); - glBufferData(GL_ARRAY_BUFFER, data.colors.size() * sizeof(glm::vec3), data.colors.data(), GL_DYNAMIC_DRAW); - - glBindBuffer(GL_ARRAY_BUFFER, Vbo[LIGHTS]); - glBufferData(GL_ARRAY_BUFFER, data.lights.size() * sizeof(glm::vec2), data.lights.data(), GL_DYNAMIC_DRAW); - - glBindBuffer(GL_ARRAY_BUFFER, 0); - - numOfFaces = data.textures.size(); - sectionPos = data.sectionPos; - hash = data.hash; + + UpdateData(data); } RendererSection::RendererSection(RendererSection && other) { @@ -168,4 +150,25 @@ Vector RendererSection::GetPosition() { size_t RendererSection::GetHash() { return hash; -} \ No newline at end of file +} + +void RendererSection::UpdateData(const RendererSectionData & data) { + glBindBuffer(GL_ARRAY_BUFFER, Vbo[TEXTURES]); + glBufferData(GL_ARRAY_BUFFER, data.textures.size() * sizeof(glm::vec4), data.textures.data(), GL_DYNAMIC_DRAW); + + glBindBuffer(GL_ARRAY_BUFFER, Vbo[MODELS]); + glBufferData(GL_ARRAY_BUFFER, data.models.size() * sizeof(glm::mat4), data.models.data(), GL_DYNAMIC_DRAW); + + glBindBuffer(GL_ARRAY_BUFFER, Vbo[COLORS]); + glBufferData(GL_ARRAY_BUFFER, data.colors.size() * sizeof(glm::vec3), data.colors.data(), GL_DYNAMIC_DRAW); + + glBindBuffer(GL_ARRAY_BUFFER, Vbo[LIGHTS]); + glBufferData(GL_ARRAY_BUFFER, data.lights.size() * sizeof(glm::vec2), data.lights.data(), GL_DYNAMIC_DRAW); + + glBindBuffer(GL_ARRAY_BUFFER, 0); + glCheckError(); + + numOfFaces = data.textures.size(); + sectionPos = data.sectionPos; + hash = data.hash; +} diff --git a/src/RendererSection.hpp b/src/RendererSection.hpp index c9137ce..f172a12 100644 --- a/src/RendererSection.hpp +++ b/src/RendererSection.hpp @@ -41,4 +41,6 @@ public: size_t numOfFaces; friend void swap(RendererSection &lhs, RendererSection &rhs); + + void UpdateData(const RendererSectionData &data); }; \ No newline at end of file diff --git a/src/RendererWorld.cpp b/src/RendererWorld.cpp index 6349573..628680c 100644 --- a/src/RendererWorld.cpp +++ b/src/RendererWorld.cpp @@ -170,17 +170,15 @@ RendererWorld::RendererWorld(GameState* ptr) { auto it = sections.find(parsing[id].renderer.sectionPos); - if (it != sections.end() && parsing[id].renderer.hash == it->second.GetHash() && !parsing[id].renderer.forced) { - LOG(WARNING) << "Generated not necessary RendererSectionData: " << parsing[id].renderer.sectionPos; - return; - } - - if (it != sections.end()) - sections.erase(it); - - const RendererSectionData &data = parsing[id].renderer; - - sections.emplace(std::make_pair(parsing[id].renderer.sectionPos, RendererSection(data))); + if (it != sections.end()) { + if (parsing[id].renderer.hash == it->second.GetHash() && !parsing[id].renderer.forced) { + LOG(WARNING) << "Generated not necessary RendererSectionData: " << parsing[id].renderer.sectionPos; + parsing[id] = RendererWorld::SectionParsing(); + return; + } + it->second.UpdateData(parsing[id].renderer); + } else + sections.emplace(std::make_pair(parsing[id].renderer.sectionPos, RendererSection(parsing[id].renderer))); parsing[id] = RendererWorld::SectionParsing(); }); -- cgit v1.2.3