diff options
Diffstat (limited to 'src/RendererSection.cpp')
-rw-r--r-- | src/RendererSection.cpp | 322 |
1 files changed, 125 insertions, 197 deletions
diff --git a/src/RendererSection.cpp b/src/RendererSection.cpp index 1f0a0a3..59e3558 100644 --- a/src/RendererSection.cpp +++ b/src/RendererSection.cpp @@ -2,106 +2,136 @@ #include <thread> -std::vector<glm::vec3> vertArray; -GLuint vertVbo = -1; -std::mutex vertMutex; - -GLuint GetVertex(glm::vec3 vertex) { - vertMutex.lock(); - int i = 0; - for (; i < vertArray.size(); i++) { - if (vertArray[i] == vertex) { - vertMutex.unlock(); - return i; - } - } - vertArray.push_back(vertex); - vertMutex.unlock(); - return i + 1; -} - -void SyncVertices() { - vertMutex.lock(); - if (vertVbo == -1) { - glGenBuffers(1, &vertVbo); - } - glBindBuffer(GL_ARRAY_BUFFER, vertVbo); - glBufferData(GL_ARRAY_BUFFER, sizeof(glm::vec3) * vertArray.size(), vertArray.data(), GL_DYNAMIC_DRAW); - glBindBuffer(GL_ARRAY_BUFFER, 0); - glCheckError(); - vertMutex.unlock(); -} - +const GLfloat vertices[] = { + 0, 0, 0, + 1, 0, 1, + 1, 0, 0, + + 0, 0, 0, + 0, 0, 1, + 1, 0, 1, +}; + +const GLfloat uv_coords[] = { + 0.0f, 0.0f, + 1.0f, 1.0f, + 0.0f, 1.0f, + + 0.0f, 0.0f, + 1.0f, 0.0f, + 1.0f, 1.0f, +}; + +const GLuint magicUniqueConstant = 88375; +GLuint RendererSection::VboVertices = magicUniqueConstant; +GLuint RendererSection::VboUvs; +GLuint RendererSection::Vao; +GLuint RendererSection::Vbo[VBOCOUNT]; + +std::vector<glm::mat4> contentModels; +std::vector<glm::vec4> contentTextures; +std::vector<glm::vec3> contentColors; +std::vector<glm::vec2> contentLights; RendererSection::RendererSection(RendererSectionData data) { - SyncVertices(); - - glGenVertexArrays(1, &Vao); - glCheckError(); - - glGenBuffers(VBOCOUNT, Vbo); - glCheckError(); - - glBindVertexArray(Vao); - { - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, Vbo[IBO]); - glCheckError(); + if (VboVertices == magicUniqueConstant) { + glGenBuffers(1, &VboVertices); + glGenBuffers(1, &VboUvs); //Cube vertices - GLuint VertAttribPos = 0; - glBindBuffer(GL_ARRAY_BUFFER, vertVbo); - glVertexAttribPointer(VertAttribPos, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(GLfloat), nullptr); - glEnableVertexAttribArray(VertAttribPos); - - /*//Cube UVs - GLuint UvAttribPos = 2; - glBindBuffer(GL_ARRAY_BUFFER, Vbo[UV]); - glVertexAttribPointer(UvAttribPos, 2, GL_FLOAT, GL_FALSE, 2 * sizeof(GLfloat), nullptr); - glEnableVertexAttribArray(UvAttribPos); - - //Textures - GLuint textureAttribPos = 7; - glBindBuffer(GL_ARRAY_BUFFER, Vbo[TEXTURES]); - glVertexAttribPointer(textureAttribPos, 4, GL_FLOAT, GL_FALSE, 4 * sizeof(GLfloat), nullptr); - glEnableVertexAttribArray(textureAttribPos); - - //Color - GLuint colorAttribPos = 12; - glBindBuffer(GL_ARRAY_BUFFER, Vbo[COLORS]); - glVertexAttribPointer(colorAttribPos, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(GLfloat), nullptr); - glEnableVertexAttribArray(colorAttribPos); - - //Light - GLuint lightAttribPos = 13; - glBindBuffer(GL_ARRAY_BUFFER, Vbo[LIGHTS]); - glVertexAttribPointer(lightAttribPos, 2, GL_FLOAT, GL_FALSE, 2 * sizeof(GLfloat), nullptr); - glEnableVertexAttribArray(lightAttribPos);*/ + glBindBuffer(GL_ARRAY_BUFFER, VboVertices); + glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW); + + //Cube UVs + glBindBuffer(GL_ARRAY_BUFFER, VboUvs); + glBufferData(GL_ARRAY_BUFFER, sizeof(uv_coords), uv_coords, GL_STATIC_DRAW); + + LOG(INFO) << "Created VBOs with vertices (" << VboVertices << ") and UVs (" << VboUvs + << ") for faces"; + + glGenVertexArrays(1, &Vao); + glGenBuffers(VBOCOUNT, Vbo); + + glBindVertexArray(Vao); + { + //Cube vertices + GLuint VertAttribPos = 0; + glBindBuffer(GL_ARRAY_BUFFER, VboVertices); + glVertexAttribPointer(VertAttribPos, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(GLfloat), nullptr); + glEnableVertexAttribArray(VertAttribPos); + + //Cube UVs + GLuint UvAttribPos = 2; + glBindBuffer(GL_ARRAY_BUFFER, VboUvs); + glVertexAttribPointer(UvAttribPos, 2, GL_FLOAT, GL_FALSE, 2 * sizeof(GLfloat), nullptr); + glEnableVertexAttribArray(UvAttribPos); + + //Textures + GLuint textureAttribPos = 7; + glBindBuffer(GL_ARRAY_BUFFER, Vbo[TEXTURES]); + glVertexAttribPointer(textureAttribPos, 4, GL_FLOAT, GL_FALSE, 4 * sizeof(GLfloat), nullptr); + glEnableVertexAttribArray(textureAttribPos); + glVertexAttribDivisor(textureAttribPos, 1); + glCheckError(); + + //Blocks models + GLuint matAttribPos = 8; + size_t sizeOfMat4 = 4 * 4 * sizeof(GLfloat); + glBindBuffer(GL_ARRAY_BUFFER, Vbo[MODELS]); + glVertexAttribPointer(matAttribPos + 0, 4, GL_FLOAT, GL_FALSE, sizeOfMat4, nullptr); + glVertexAttribPointer(matAttribPos + 1, 4, GL_FLOAT, GL_FALSE, sizeOfMat4, (void *)(1 * 4 * sizeof(GLfloat))); + glVertexAttribPointer(matAttribPos + 2, 4, GL_FLOAT, GL_FALSE, sizeOfMat4, (void *)(2 * 4 * sizeof(GLfloat))); + glVertexAttribPointer(matAttribPos + 3, 4, GL_FLOAT, GL_FALSE, sizeOfMat4, (void *)(3 * 4 * sizeof(GLfloat))); + glEnableVertexAttribArray(matAttribPos + 0); + glEnableVertexAttribArray(matAttribPos + 1); + glEnableVertexAttribArray(matAttribPos + 2); + glEnableVertexAttribArray(matAttribPos + 3); + glVertexAttribDivisor(matAttribPos + 0, 1); + glVertexAttribDivisor(matAttribPos + 1, 1); + glVertexAttribDivisor(matAttribPos + 2, 1); + glVertexAttribDivisor(matAttribPos + 3, 1); + + //Color + GLuint colorAttribPos = 12; + glBindBuffer(GL_ARRAY_BUFFER, Vbo[COLORS]); + glVertexAttribPointer(colorAttribPos, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(GLfloat), nullptr); + glEnableVertexAttribArray(colorAttribPos); + glVertexAttribDivisor(colorAttribPos, 1); + + //Light + GLuint lightAttribPos = 13; + glBindBuffer(GL_ARRAY_BUFFER, Vbo[LIGHTS]); + glVertexAttribPointer(lightAttribPos, 2, GL_FLOAT, GL_FALSE, 2 * sizeof(GLfloat), nullptr); + glEnableVertexAttribArray(lightAttribPos); + glVertexAttribDivisor(lightAttribPos, 1); + + glBindBuffer(GL_ARRAY_BUFFER, 0); + } + glBindVertexArray(0); + glCheckError(); } - glBindVertexArray(0); - glBindBuffer(GL_ARRAY_BUFFER, 0); - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); - glCheckError(); - //Upload data to VRAM - glBindBuffer(GL_ARRAY_BUFFER, Vbo[IBO]); - glBufferData(GL_ARRAY_BUFFER, data.indices.size() * sizeof(GLuint), data.indices.data(), GL_DYNAMIC_DRAW); - - glBindBuffer(GL_ARRAY_BUFFER, Vbo[UV]); - glBufferData(GL_ARRAY_BUFFER, data.uv.size() * sizeof(glm::vec2), data.uv.data(), GL_DYNAMIC_DRAW); - - /*glBindBuffer(GL_ARRAY_BUFFER, Vbo[TEXTURES]); - glBufferData(GL_ARRAY_BUFFER, data.textures.size() * sizeof(glm::vec4), data.textures.data(), GL_DYNAMIC_DRAW); + contentModels.insert(contentModels.end(), data.models.begin(), data.models.end()); + glBindBuffer(GL_ARRAY_BUFFER, Vbo[MODELS]); + glBufferData(GL_ARRAY_BUFFER, contentModels.size() * sizeof(glm::mat4), contentModels.data(), GL_DYNAMIC_DRAW); + + contentTextures.insert(contentTextures.end(), data.textures.begin(), data.textures.end()); + glBindBuffer(GL_ARRAY_BUFFER, Vbo[TEXTURES]); + glBufferData(GL_ARRAY_BUFFER, contentTextures.size() * sizeof(glm::vec4), contentTextures.data(), GL_DYNAMIC_DRAW); + contentColors.insert(contentColors.end(), data.colors.begin(), data.colors.end()); glBindBuffer(GL_ARRAY_BUFFER, Vbo[COLORS]); - glBufferData(GL_ARRAY_BUFFER, data.colors.size() * sizeof(glm::vec3), data.colors.data(), GL_DYNAMIC_DRAW); + glBufferData(GL_ARRAY_BUFFER, contentColors.size() * sizeof(glm::vec3), contentColors.data(), GL_DYNAMIC_DRAW); + contentLights.insert(contentLights.end(), data.lights.begin(), data.lights.end()); glBindBuffer(GL_ARRAY_BUFFER, Vbo[LIGHTS]); - glBufferData(GL_ARRAY_BUFFER, data.lights.size() * sizeof(glm::vec2), data.lights.data(), GL_DYNAMIC_DRAW);*/ + glBufferData(GL_ARRAY_BUFFER, contentLights.size() * sizeof(glm::vec2), contentLights.data(), GL_DYNAMIC_DRAW); glBindBuffer(GL_ARRAY_BUFFER, 0); numOfFaces = data.textures.size(); + offset = contentModels.size() - numOfFaces; sectionPos = data.sectionPos; hash = data.hash; } @@ -112,30 +142,13 @@ RendererSection::RendererSection(RendererSection && other) { } RendererSection::~RendererSection() { - if (Vao != 0) - glDeleteVertexArrays(1, &Vao); - - for (int i = 0; i < VBOCOUNT; i++) - if (Vbo[i] != 0) { - glBindBuffer(GL_ARRAY_BUFFER, Vbo[i]); - glBufferData(GL_ARRAY_BUFFER, 0, 0, GL_STATIC_DRAW); - } - - glDeleteBuffers(VBOCOUNT, Vbo); } void swap(RendererSection & lhs, RendererSection & rhs) { - std::swap(lhs.Vbo, rhs.Vbo); - std::swap(lhs.Vao, rhs.Vao); std::swap(lhs.hash, rhs.hash); std::swap(lhs.numOfFaces, rhs.numOfFaces); std::swap(lhs.sectionPos, rhs.sectionPos); -} - -void RendererSection::Render(RenderState &renderState) { - renderState.SetActiveVao(Vao); - glDrawElements(GL_TRIANGLES, 6 * numOfFaces, GL_UNSIGNED_INT, nullptr); - glCheckError(); + std::swap(lhs.offset, rhs.offset); } Vector RendererSection::GetPosition() @@ -148,14 +161,17 @@ size_t RendererSection::GetHash() return hash; } -RendererSectionData::RendererSectionData(World * world, Vector sectionPosition) { +GLuint RendererSection::GetVao() { + return Vao; +} + +RendererSectionData::RendererSectionData(World * world, Vector sectionPosition) { const std::map<BlockTextureId, glm::vec4> &textureAtlas = AssetManager::Instance().GetTextureAtlasIndexes(); const Section §ion = world->GetSection(sectionPosition); hash = section.GetHash(); sectionPos = sectionPosition; - //glm::mat4 baseOffset = glm::translate(glm::mat4(), (section.GetPosition() * 16).glm()), transform; - glm::mat4 transform; + glm::mat4 baseOffset = glm::translate(glm::mat4(), (section.GetPosition() * 16).glm()),transform; auto sectionsList = world->GetSectionsList(); @@ -169,7 +185,7 @@ RendererSectionData::RendererSectionData(World * world, Vector sectionPosition) const bool useNewMethod = true; - transform = glm::translate(glm::mat4(), Vector(x, y, z).glm()); + transform = glm::translate(baseOffset, Vector(x, y, z).glm()); const BlockModel* model = AssetManager::Instance().GetBlockModelByBlockId(block); if (model) { @@ -177,13 +193,12 @@ RendererSectionData::RendererSectionData(World * world, Vector sectionPosition) } else { transform = glm::translate(transform, glm::vec3(0, 1, 0)); - + if (block.id == 8 || block.id == 9) { textures.push_back(AssetManager::Instance().GetTextureByAssetName("minecraft/textures/blocks/water_still")); textures.back().w /= 32.0f; transform = glm::translate(transform, glm::vec3(0, -0.2, 0)); - } - else + } else textures.push_back(AssetManager::Instance().GetTextureByAssetName("minecraft/textures/blocks/tnt_side")); models.push_back(transform); @@ -194,50 +209,9 @@ RendererSectionData::RendererSectionData(World * world, Vector sectionPosition) } } } - - CreateVertices(); - - ReplaceVertices(); - - models.clear(); - - /* const int mul = 6; - - textures.resize(textures.size() * mul); - for (int i = textures.size()/mul - 1; i > 0; i--) { - textures[i * mul] = textures[i]; - } - for (int i = 0; i < textures.size(); i += mul) { - for (int j = 1; j < mul; j++) { - textures[i + j] = textures[i]; - } - } - - colors.resize(colors.size() * mul); - for (int i = colors.size() / mul - 1; i > 0; i--) { - colors[i * mul] = colors[i]; - } - for (int i = 0; i < colors.size(); i += mul) { - for (int j = 1; j < mul; j++) { - colors[i + j] = colors[i]; - } - } - - lights.resize(lights.size() * mul); - for (int i = lights.size() / mul - 1; i > 0; i--) { - lights[i * mul] = lights[i]; - } - for (int i = 0; i < lights.size(); i += mul) { - for (int j = 1; j < mul; j++) { - lights[i + j] = lights[i]; - } - }*/ - textures.shrink_to_fit(); models.shrink_to_fit(); colors.shrink_to_fit(); - lights.shrink_to_fit(); - vertices.shrink_to_fit(); } void RendererSectionData::AddFacesByBlockModel(const std::vector<Vector> §ionsList, World *world, Vector blockPos, const BlockModel &model, glm::mat4 transform, unsigned char light, unsigned char skyLight) { @@ -363,50 +337,4 @@ bool RendererSectionData::TestBlockExists(const std::vector<Vector> §ionsLis auto blockModel = AssetManager::Instance().GetBlockModelByBlockId(world->GetSection(section).GetBlockId(blockPos)); return blockId.id != 0 && blockModel && blockModel->IsBlock; -} - -void RendererSectionData::CreateVertices() { - const GLfloat verts[] = { - 0, 0, 0, - 1, 0, 1, - 1, 0, 0, - - 0, 0, 0, - 0, 0, 1, - 1, 0, 1, - }; - - const GLfloat uvs[] = { - 0.0f, 0.0f, - 1.0f, 1.0f, - 0.0f, 1.0f, - - 0.0f, 0.0f, - 1.0f, 0.0f, - 1.0f, 1.0f, - }; - - for (const auto &model : models) { - vertices.push_back(model * glm::vec4(verts[0], verts[1], verts[2], 1.0f)); - vertices.push_back(model * glm::vec4(verts[3], verts[4], verts[5], 1.0f)); - vertices.push_back(model * glm::vec4(verts[6], verts[7], verts[8], 1.0f)); - - vertices.push_back(model * glm::vec4(verts[9], verts[10], verts[11], 1.0f)); - vertices.push_back(model * glm::vec4(verts[12], verts[13], verts[14], 1.0f)); - vertices.push_back(model * glm::vec4(verts[15], verts[16], verts[17], 1.0f)); - - uv.push_back(glm::vec2(uvs[0], uvs[1])); - uv.push_back(glm::vec2(uvs[2], uvs[3])); - uv.push_back(glm::vec2(uvs[4], uvs[5])); - - uv.push_back(glm::vec2(uvs[6], uvs[7])); - uv.push_back(glm::vec2(uvs[8], uvs[9])); - uv.push_back(glm::vec2(uvs[10], uvs[11])); - } -} - -void RendererSectionData::ReplaceVertices() { - for (auto& it : vertices) { - indices.push_back(GetVertex(it)); - } }
\ No newline at end of file |