void RenderSector::Push(const Model &model, const glm::vec3 &pos) { // Если сектор надо перестроить и модель статическая - перестраиваем сектор. if (mIsNeedBuild && model.GetType() == Model::Static) { auto &dst = mModel.GetMesh(); const auto &src = model.GetMesh(); if (dst->Empty()) { mModel.SetTexture(model.GetTexture()); } if (mModel.GetTexture() == model.GetTexture()) { size_t size = dst->SizeVertex(); dst->Push(*src); for (size_t i = size; i < dst->SizeVertex(); ++i) { dst->Vertex(i).vertex += pos; } } else { LOG(warning) << "Батчинг меша в секторе пропущен. Текстуры не совпадают."; } } }
void Graphic::Renderer::ActivateAppropriteToModelSubroutines(const Model& model) const { constexpr unsigned numOfUsedSubroutines = 4; GLuint subroutinesArray[numOfUsedSubroutines]; const ShaderProgram* const shaderProg = GetShaderProgramWithType(ShaderProgram::Type::Main); assert(shaderProg); const GLint shadeSubUniformLoc = glGetSubroutineUniformLocation(shaderProg->id, GL_FRAGMENT_SHADER, "shadeModel"); const GLint toObjectLocalCoordSubUniformLoc = glGetSubroutineUniformLocation(shaderProg->id, GL_FRAGMENT_SHADER, "toObjectLocalCoord"); const GLint getNormalVecSubUniformLoc = glGetSubroutineUniformLocation(shaderProg->id, GL_FRAGMENT_SHADER, "getNormalVec"); const GLint drawObjectSubUniformLoc = glGetSubroutineUniformLocation(shaderProg->id, GL_VERTEX_SHADER, "drawObject"); assert(shadeSubUniformLoc < numOfUsedSubroutines && toObjectLocalCoordSubUniformLoc < numOfUsedSubroutines && getNormalVecSubUniformLoc < numOfUsedSubroutines); #ifdef _DEBUG if ( -1 == shadeSubUniformLoc || -1 == toObjectLocalCoordSubUniformLoc || -1 == getNormalVecSubUniformLoc || -1 == drawObjectSubUniformLoc) { std::cout << "Failed to get subroutines uniform location. \n"; return; } #endif // _DEBUG if (model.material.HasTextureWithType(Texture::Type::Cube)) subroutinesArray[drawObjectSubUniformLoc] = drawObjectSubroutines[1]; else subroutinesArray[drawObjectSubUniformLoc] = drawObjectSubroutines[0]; switch (model.GetType()) { case Model::Type::commonModel: subroutinesArray[shadeSubUniformLoc] = shadeModelSubroutine[0]; //subroutinesArray[shadeSubUniformLoc] = modelSubroutine; break; case Model::Type::lightModel: subroutinesArray[shadeSubUniformLoc] = shadeModelSubroutine[0]; break; case Model::Type::skyBoxModel: //subroutinesArray[shadeSubUniformLoc] = shadeModelSubroutine[2]; break; default: break; } if (model.material.HasTextureWithType(Texture::Type::Normal)) { subroutinesArray[toObjectLocalCoordSubUniformLoc] = normalTextureSubroutines[0]; subroutinesArray[getNormalVecSubUniformLoc] = normalTextureSubroutines[1]; } else { subroutinesArray[toObjectLocalCoordSubUniformLoc] = noNormalTextureSubroutines[0]; subroutinesArray[getNormalVecSubUniformLoc] = noNormalTextureSubroutines[1]; } glUniformSubroutinesuiv(GL_FRAGMENT_SHADER, 4, subroutinesArray); }