VTK
|
00001 /*========================================================================= 00002 00003 Program: Visualization Toolkit 00004 Module: $RCSfile: vtkShaderProgram2.h,v $ 00005 00006 Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen 00007 All rights reserved. 00008 See Copyright.txt or http://www.kitware.com/Copyright.htm for details. 00009 00010 This software is distributed WITHOUT ANY WARRANTY; without even 00011 the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 00012 PURPOSE. See the above copyright notice for more information. 00013 00014 =========================================================================*/ 00024 #ifndef __vtkShaderProgram2_h 00025 #define __vtkShaderProgram2_h 00026 00027 #include "vtkObject.h" 00028 #include "vtkWeakPointer.h" // needed for vtkWeakPointer. 00029 00030 class vtkWindow; 00031 class vtkOpenGLRenderWindow; 00032 class vtkOpenGLExtensionManager; 00033 class vtkShaderProgram2Uniforms; // internal 00034 class vtkShader2Collection; 00035 class vtkUniformVariables; 00036 00037 // Values for GetLastBuildStatus() 00038 enum vtkShaderProgram2BuildStatus 00039 { 00040 // one of the shaders failed to compile 00041 VTK_SHADER_PROGRAM2_COMPILE_FAILED=0, 00042 // all the shaders compiled successfully but the link failed 00043 VTK_SHADER_PROGRAM2_LINK_FAILED=1, 00044 // all the shaders compiled successfully and the link succeeded 00045 VTK_SHADER_PROGRAM2_LINK_SUCCEEDED=2 00046 }; 00047 00048 class VTK_RENDERING_EXPORT vtkShaderProgram2 : public vtkObject 00049 { 00050 public: 00051 static vtkShaderProgram2* New(); 00052 vtkTypeRevisionMacro(vtkShaderProgram2, vtkObject); 00053 void PrintSelf(ostream& os, vtkIndent indent); 00054 00056 00057 static bool IsSupported(vtkOpenGLRenderWindow *context); 00058 static bool LoadExtensions(vtkOpenGLRenderWindow *context); 00060 00062 00067 vtkGetMacro(PrintErrors,bool); 00068 vtkSetMacro(PrintErrors,bool); 00070 00072 00076 void SetContext(vtkOpenGLRenderWindow *context); 00077 vtkGetObjectMacro(Context,vtkOpenGLRenderWindow); 00079 00081 00083 vtkGetObjectMacro(Shaders,vtkShader2Collection); 00085 00089 bool HasVertexShaders(); 00090 00094 bool HasFragmentShaders(); 00095 00097 bool HasGeometryShaders(); 00098 00100 bool IsValid(); 00101 00105 void Build(); 00106 00108 void SendUniforms(); 00109 00111 00113 void PrintActiveUniformVariables(ostream &os, 00114 vtkIndent indent); 00116 00119 void PrintActiveUniformVariablesOnCout(); 00120 00122 bool IsUsed(); 00123 00128 void Use(); 00129 00131 void Restore(); 00132 00135 void RestoreFixedPipeline(); 00136 00143 int GetLastBuildStatus(); 00144 00147 const char *GetLastLinkLog(); 00148 00151 const char *GetLastValidateLog(); 00152 00154 virtual void ReleaseGraphicsResources(); 00155 00159 int GetAttributeLocation(const char *name); 00160 00162 00164 vtkGetObjectMacro(UniformVariables,vtkUniformVariables); 00165 virtual void SetUniformVariables(vtkUniformVariables *variables); 00167 00172 bool DisplayListUnderCreationInCompileMode(); 00173 00174 protected: 00175 vtkShaderProgram2(); 00176 virtual ~vtkShaderProgram2(); 00177 00178 unsigned int Id; // actually GLuint. Initial value is 0. 00179 unsigned int SavedId; 00180 00181 vtkTimeStamp LastLinkTime; 00182 vtkTimeStamp LastSendUniformsTime; 00183 00184 vtkShaderProgram2Uniforms *Uniforms; 00185 vtkShader2Collection *Shaders; 00186 00187 int LastBuildStatus; // Initial value is VTK_SHADER_PROGRAM2_COMPILE_FAILED 00188 00189 char *LastLinkLog; // Initial value is the empty string ""='\0' 00190 size_t LastLinkLogCapacity; // Initial value is 8. 00191 00192 char *LastValidateLog; // Initial value is the empty string ""='\0' 00193 size_t LastValidateLogCapacity; // Initial value is 8. 00194 00195 vtkUniformVariables *UniformVariables; // Initial values is an empty list 00196 00197 bool PrintErrors; // use vtkErrorMacro ? 00198 00199 vtkOpenGLRenderWindow *Context; 00200 bool ExtensionsLoaded; 00201 00202 private: 00203 vtkShaderProgram2(const vtkShaderProgram2&); // Not implemented. 00204 void operator=(const vtkShaderProgram2&); // Not implemented. 00205 }; 00206 00207 #endif