Exemple #1
0
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);
}