| 399 | } |
| 400 | |
| 401 | vtkShaderProgram* vtkOpenGLShaderCache::GetShaderProgram( |
| 402 | std::map<vtkShader::Type, vtkShader*> shaders) |
| 403 | { |
| 404 | // compute the MD5 and the check the map |
| 405 | std::string result; |
| 406 | this->Internal->ComputeMD5({ shaders[vtkShader::Vertex]->GetSource().c_str(), |
| 407 | shaders[vtkShader::Fragment]->GetSource().c_str(), |
| 408 | shaders[vtkShader::Geometry]->GetSource().c_str(), |
| 409 | shaders[vtkShader::TessControl]->GetSource().c_str(), |
| 410 | shaders[vtkShader::TessEvaluation]->GetSource().c_str() }, |
| 411 | result); |
| 412 | |
| 413 | // does it already exist? |
| 414 | typedef std::map<std::string, vtkShaderProgram*>::const_iterator SMapIter; |
| 415 | SMapIter found = this->Internal->ShaderPrograms.find(result); |
| 416 | if (found == this->Internal->ShaderPrograms.end()) |
| 417 | { |
| 418 | // create one |
| 419 | vtkShaderProgram* sps = vtkShaderProgram::New(); |
| 420 | sps->SetVertexShader(shaders[vtkShader::Vertex]); |
| 421 | sps->SetFragmentShader(shaders[vtkShader::Fragment]); |
| 422 | sps->SetGeometryShader(shaders[vtkShader::Geometry]); |
| 423 | sps->SetTessControlShader(shaders[vtkShader::TessControl]); |
| 424 | sps->SetTessEvaluationShader(shaders[vtkShader::TessEvaluation]); |
| 425 | sps->SetMD5Hash(result); // needed? |
| 426 | this->Internal->ShaderPrograms.insert(std::make_pair(result, sps)); |
| 427 | return sps; |
| 428 | } |
| 429 | else |
| 430 | { |
| 431 | return found->second; |
| 432 | } |
| 433 | } |
| 434 | |
| 435 | vtkShaderProgram* vtkOpenGLShaderCache::GetShaderProgram(const char* vertexCode, |
| 436 | const char* fragmentCode, const char* geometryCode, const char* tessControlCode, |