------------------------------------------------------------------------------
| 2659 | |
| 2660 | //------------------------------------------------------------------------------ |
| 2661 | void vtkOpenGLPolyDataMapper::UpdateShaders( |
| 2662 | vtkOpenGLHelper& cellBO, vtkRenderer* ren, vtkActor* actor) |
| 2663 | { |
| 2664 | vtkOpenGLRenderWindow* renWin = vtkOpenGLRenderWindow::SafeDownCast(ren->GetRenderWindow()); |
| 2665 | |
| 2666 | cellBO.VAO->Bind(); |
| 2667 | this->LastBoundBO = &cellBO; |
| 2668 | |
| 2669 | // has something changed that would require us to recreate the shader? |
| 2670 | if (this->GetNeedToRebuildShaders(cellBO, ren, actor)) |
| 2671 | { |
| 2672 | // build the shader source code |
| 2673 | std::map<vtkShader::Type, vtkShader*> shaders; |
| 2674 | vtkShader* vss = vtkShader::New(); |
| 2675 | vss->SetType(vtkShader::Vertex); |
| 2676 | shaders[vtkShader::Vertex] = vss; |
| 2677 | vtkShader* gss = vtkShader::New(); |
| 2678 | gss->SetType(vtkShader::Geometry); |
| 2679 | shaders[vtkShader::Geometry] = gss; |
| 2680 | vtkShader* fss = vtkShader::New(); |
| 2681 | fss->SetType(vtkShader::Fragment); |
| 2682 | shaders[vtkShader::Fragment] = fss; |
| 2683 | |
| 2684 | this->BuildShaders(shaders, ren, actor); |
| 2685 | |
| 2686 | // compile and bind the program if needed |
| 2687 | vtkShaderProgram* newShader = renWin->GetShaderCache()->ReadyShaderProgram(shaders); |
| 2688 | if (newShader) |
| 2689 | { |
| 2690 | vss->Delete(); |
| 2691 | fss->Delete(); |
| 2692 | gss->Delete(); |
| 2693 | |
| 2694 | // if the shader changed reinitialize the VAO |
| 2695 | if (newShader != cellBO.Program || cellBO.Program->GetMTime() > cellBO.AttributeUpdateTime) |
| 2696 | { |
| 2697 | cellBO.Program = newShader; |
| 2698 | // reset the VAO as the shader has changed |
| 2699 | cellBO.VAO->ReleaseGraphicsResources(); |
| 2700 | } |
| 2701 | |
| 2702 | cellBO.ShaderSourceTime.Modified(); |
| 2703 | } |
| 2704 | else |
| 2705 | { |
| 2706 | vtkErrorMacro("Could not set shader program"); |
| 2707 | } |
| 2708 | } |
| 2709 | else |
| 2710 | { |
| 2711 | renWin->GetShaderCache()->ReadyShaderProgram(cellBO.Program); |
| 2712 | if (cellBO.Program->GetMTime() > cellBO.AttributeUpdateTime) |
| 2713 | { |
| 2714 | // reset the VAO as the shader has changed |
| 2715 | cellBO.VAO->ReleaseGraphicsResources(); |
| 2716 | } |
| 2717 | } |
| 2718 | vtkOpenGLCheckErrorMacro("failed after UpdateShader"); |
no test coverage detected