#include "vtkOpenGLState.h" #include "vtkOpenGLRenderWindow.h" #include "vtkIndent.h" #include "vtkOpenGLExtensionManager.h" const char *ValueToString(GLint value, int valueTable[], const char *stringTable[], int tableSize); vtkOpenGLState::vtkOpenGLState(vtkOpenGLRenderWindow *context) { this->Context=context; vtkOpenGLExtensionManager* m=this->Context->GetExtensionManager(); m->LoadExtension("GL_VERSION_1_2"); m->LoadExtension("GL_VERSION_1_3"); m->LoadExtension("GL_VERSION_1_4"); m->LoadExtension("GL_VERSION_1_5"); m->LoadExtension("GL_VERSION_2_0"); m->LoadExtension("GL_VERSION_2_1"); m->LoadExtension("GL_EXT_framebuffer_object"); this->TCPU = 0; this->TIU = 0; this->FixedPipeline.TextureImageUnitEnabled = 0; this->FixedPipeline.LightEnabled = 0; this->ClipPlanes = 0; this->Lights = 0; this->DrawBuffers = 0; this->CurrentProgram = 0; this->CurrentProgramState = 0; } vtkOpenGLState::~vtkOpenGLState() { delete this->TCPU; delete this->TIU; delete this->FixedPipeline.TextureImageUnitEnabled; delete this->ClipPlanes; delete this->FixedPipeline.LightEnabled; delete this->Lights; delete this->DrawBuffers; delete this->CurrentProgramState; } void vtkOpenGLState::Update() { // Unfortunately the binding points in OpenGL are used both for use and editing // For example, if the active texture unit is 4 and you want to query the state for // texture unit 3, you first have to switch the active texture unit to be 3. In other // words, you have to change the some part of the state of OpenGL to query some other // part of the state! So you have to make sure you restore the original state after // the query!!! GLint ivalues[4]; this->ErrorCode = glGetError(); // this change the state.. // Texture environment // Has to be restored to this value. glGetIntegerv(vtkgl::ACTIVE_TEXTURE, ivalues); this->ActiveTexture=static_cast(ivalues[0]); glGetIntegerv(vtkgl::FRAMEBUFFER_BINDING_EXT, &this->FrameBufferBinding); this->UpdateCurrentProgram(); // max number of TCPU glGetIntegerv(vtkgl::MAX_TEXTURE_COORDS, &this->MaxTextureCoords); // 8 // Max number of TIU available to the fixed-pipeline (enable/disable state) glGetIntegerv(vtkgl::MAX_TEXTURE_UNITS, &this->MaxTextureUnits); // 4 // Max number of TIU. glGetIntegerv(vtkgl::MAX_COMBINED_TEXTURE_IMAGE_UNITS, &this->MaxCombinedTextureImageUnits); // 16 // max number of TIU available from a vertex shader. glGetIntegerv(vtkgl::MAX_VERTEX_TEXTURE_IMAGE_UNITS, &this->MaxVertexTextureImageUnits); // max number of TIU available from a fragment shader. glGetIntegerv(vtkgl::MAX_TEXTURE_IMAGE_UNITS, &this->MaxTextureImageUnits); if (this->TCPU != 0 && this->TCPU->size() != static_cast(this->MaxTextureCoords)) { delete this->TCPU; this->TIU = 0; } if (this->TCPU == 0) { this->TCPU = new std::vector( static_cast(this->MaxTextureCoords)); } unsigned int i = 0; while (i(this->MaxTextureCoords)) { vtkgl::ActiveTexture(vtkgl::TEXTURE0+i); glGetFloatv(GL_TEXTURE_MATRIX, (*this->TCPU)[i].CurrentMatrix); glGetIntegerv(GL_TEXTURE_STACK_DEPTH, &(*this->TCPU)[i].MatrixStackDepth); ++i; } if (this->TIU!=0 && this->TIU->size()!=static_cast( this->MaxCombinedTextureImageUnits)) { delete this->TIU; this->TIU = 0; } if (this->TIU == 0) { this->TIU = new std::vector( static_cast(this->MaxCombinedTextureImageUnits)); } i = 0; while (i(this->MaxCombinedTextureImageUnits)) { vtkgl::ActiveTexture(vtkgl::TEXTURE0+i); glGetIntegerv(GL_TEXTURE_BINDING_1D, &(*this->TIU)[i].TextureBinding1D); glGetIntegerv(GL_TEXTURE_BINDING_2D, &(*this->TIU)[i].TextureBinding2D); glGetIntegerv(vtkgl::TEXTURE_BINDING_3D, &(*this->TIU)[i].TextureBinding3D); glGetIntegerv(vtkgl::TEXTURE_BINDING_CUBE_MAP, &(*this->TIU)[i].TextureBindingCubeMap); ++i; } glGetIntegerv(GL_MAX_CLIP_PLANES, &this->MaxClipPlanes); if (this->ClipPlanes!=0 && this->ClipPlanes->size()!=static_cast(this->MaxClipPlanes)) { delete this->ClipPlanes; this->ClipPlanes = 0; } if (this->ClipPlanes == 0) { this->ClipPlanes = new std::vector( static_cast(this->MaxClipPlanes)); } glGetIntegerv(GL_MAX_LIGHTS, &this->MaxLights); if (this->FixedPipeline.LightEnabled !=0 && this->FixedPipeline.LightEnabled->size() != static_cast(this->MaxLights)) { delete this->FixedPipeline.LightEnabled; this->FixedPipeline.LightEnabled = 0; delete Lights; this->Lights = 0; } if (this->FixedPipeline.LightEnabled == 0) { this->FixedPipeline.LightEnabled = new std::vector(static_cast(this->MaxLights)); this->Lights= new std::vector( static_cast(this->MaxLights)); } if (this->FixedPipeline.TextureImageUnitEnabled != 0 && this->FixedPipeline.TextureImageUnitEnabled->size() != static_cast(this->MaxTextureUnits)) { delete this->FixedPipeline.TextureImageUnitEnabled; this->FixedPipeline.TextureImageUnitEnabled = 0; } if (this->FixedPipeline.TextureImageUnitEnabled == 0) { this->FixedPipeline.TextureImageUnitEnabled = new std::vector( static_cast(this->MaxTextureUnits)); } i = 0; while (i < static_cast(this->MaxTextureUnits)) { vtkgl::ActiveTexture(vtkgl::TEXTURE0 + i); (*this->FixedPipeline.TextureImageUnitEnabled)[i].Texture1DEnabled = glIsEnabled(GL_TEXTURE_1D); (*this->FixedPipeline.TextureImageUnitEnabled)[i].Texture2DEnabled = glIsEnabled(GL_TEXTURE_2D); (*this->FixedPipeline.TextureImageUnitEnabled)[i].Texture3DEnabled = glIsEnabled(vtkgl::TEXTURE_3D); (*this->FixedPipeline.TextureImageUnitEnabled)[i].TextureCubeMapEnabled = glIsEnabled(vtkgl::TEXTURE_CUBE_MAP); ++i; } // Restore real active texture vtkgl::ActiveTexture(this->ActiveTexture); glGetFloatv(GL_MODELVIEW_MATRIX, this->ModelViewMatrix); glGetIntegerv(GL_MODELVIEW_STACK_DEPTH, &this->ModelViewStackDepth); glGetFloatv(GL_PROJECTION_MATRIX, this->ProjectionMatrix); glGetIntegerv(GL_PROJECTION_STACK_DEPTH, &this->ProjectionStackDepth); glGetIntegerv(GL_VIEWPORT, this->Viewport); glGetFloatv(GL_DEPTH_RANGE, this->DepthRange); glGetIntegerv(GL_MATRIX_MODE, &this->MatrixMode); // fragment fixed-pipeline this->FixedPipeline.ColorSumEnabled = glIsEnabled(vtkgl::COLOR_SUM); glGetIntegerv(GL_SHADE_MODEL, &this->ShadeModel); // vertex fixed-pipeline this->FixedPipeline.LightingEnabled = glIsEnabled(GL_LIGHTING); // rasterization this->CullFaceEnabled = glIsEnabled(GL_CULL_FACE); glGetIntegerv(GL_CULL_FACE_MODE, &this->CullFaceMode); glGetIntegerv(GL_FRONT_FACE, &this->FrontFace); this->PolygonSmoothEnabled = glIsEnabled(GL_POLYGON_SMOOTH); glGetIntegerv(GL_POLYGON_MODE, this->PolygonMode); glGetFloatv(GL_POLYGON_OFFSET_FACTOR, &this->PolygonOffsetFactor); glGetFloatv(GL_POLYGON_OFFSET_UNITS, &this->PolygonOffsetUnits); this->PolygonOffsetPointEnabled = glIsEnabled(GL_POLYGON_OFFSET_POINT); this->PolygonOffsetLineEnabled = glIsEnabled(GL_POLYGON_OFFSET_LINE); this->PolygonOffsetFillEnabled = glIsEnabled(GL_POLYGON_OFFSET_FILL); this->PolygonStippleEnabled = glIsEnabled(GL_POLYGON_STIPPLE); // multisampling this->MultiSampleEnabled = glIsEnabled(vtkgl::MULTISAMPLE); this->SampleAlphaToCoverageEnabled = glIsEnabled(vtkgl::SAMPLE_ALPHA_TO_COVERAGE); this->SampleAlphaToOneEnabled = glIsEnabled(vtkgl::SAMPLE_ALPHA_TO_ONE); this->SampleCoverageEnabled = glIsEnabled(vtkgl::SAMPLE_COVERAGE); glGetFloatv(vtkgl::SAMPLE_COVERAGE_VALUE, &this->SampleCoverageValue); glGetBooleanv(vtkgl::SAMPLE_COVERAGE_INVERT, &this->SampleCoverageInvert); // pixel operations this->ScissorTestEnabled = glIsEnabled(GL_SCISSOR_TEST); glGetIntegerv(GL_SCISSOR_BOX, this->ScissorBox); this->AlphaTestEnabled = glIsEnabled(GL_ALPHA_TEST); glGetIntegerv(GL_ALPHA_TEST_FUNC, &this->AlphaTestFunc); glGetFloatv(GL_ALPHA_TEST_REF, &this->AlphaTestRef); this->StencilTestEnabled = glIsEnabled(GL_STENCIL_TEST); this->DepthTestEnabled = glIsEnabled(GL_DEPTH_TEST); glGetIntegerv(GL_DEPTH_FUNC, &this->DepthFunc); this->BlendEnabled=glIsEnabled(GL_BLEND); glGetIntegerv(vtkgl::BLEND_SRC_RGB, &this->BlendSrcRGB); glGetIntegerv(vtkgl::BLEND_SRC_ALPHA, &this->BlendSrcAlpha); glGetIntegerv(vtkgl::BLEND_DST_RGB, &this->BlendDstRGB); glGetIntegerv(vtkgl::BLEND_DST_ALPHA, &this->BlendDstAlpha); glGetIntegerv(vtkgl::BLEND_EQUATION_RGB, &this->BlendEquationRGB); glGetIntegerv(vtkgl::BLEND_EQUATION_ALPHA, &this->BlendEquationAlpha); glGetFloatv(vtkgl::BLEND_COLOR, this->BlendColor); this->DitherEnabled = glIsEnabled(GL_DITHER); this->IndexLogicOpEnabled = glIsEnabled(GL_INDEX_LOGIC_OP); this->ColorLogicOpEnabled = glIsEnabled(GL_COLOR_LOGIC_OP); glGetIntegerv(GL_LOGIC_OP_MODE, &this->LogicOpMode); // framebuffer control glGetIntegerv(vtkgl::MAX_DRAW_BUFFERS, &this->MaxDrawBuffers); delete this->DrawBuffers; this->DrawBuffers = new std::vector( static_cast(this->MaxDrawBuffers)); i = 0; while (i < static_cast(this->MaxDrawBuffers)) { glGetIntegerv(vtkgl::DRAW_BUFFER0+i, &(*this->DrawBuffers)[i]); ++i; } glGetIntegerv(GL_INDEX_WRITEMASK, &this->IndexWriteMask); glGetBooleanv(GL_COLOR_WRITEMASK, this->ColorWriteMask); glGetBooleanv(GL_DEPTH_WRITEMASK, &this->DepthWriteMask); glGetIntegerv(GL_STENCIL_WRITEMASK, ivalues); this->StencilWriteMask=static_cast(ivalues[0]); glGetIntegerv(vtkgl::STENCIL_BACK_WRITEMASK, ivalues); this->StencilBackWriteMask=static_cast(ivalues[0]); glGetFloatv(GL_COLOR_CLEAR_VALUE, this->ColorClearValue); glGetFloatv(GL_INDEX_CLEAR_VALUE, &this->IndexClearValue); glGetFloatv(GL_DEPTH_CLEAR_VALUE, &this->DepthClearValue); glGetIntegerv(GL_STENCIL_CLEAR_VALUE, &this->StencilClearValue); glGetFloatv(GL_ACCUM_CLEAR_VALUE, this->AccumClearValue); // pixels glGetBooleanv(GL_UNPACK_SWAP_BYTES, &this->Unpack.SwapBytes); glGetBooleanv(GL_UNPACK_LSB_FIRST, &this->Unpack.LsbFirst); glGetIntegerv(vtkgl::UNPACK_IMAGE_HEIGHT, &this->Unpack.ImageHeight); glGetIntegerv(vtkgl::UNPACK_SKIP_IMAGES, &this->Unpack.SkipImages); glGetIntegerv(GL_UNPACK_ROW_LENGTH, &this->Unpack.RowLength); glGetIntegerv(GL_UNPACK_SKIP_ROWS, &this->Unpack.SkipRows); glGetIntegerv(GL_UNPACK_SKIP_PIXELS, &this->Unpack.SkipPixels); glGetIntegerv(GL_UNPACK_ALIGNMENT, &this->Unpack.Alignment); glGetBooleanv(GL_PACK_SWAP_BYTES, &this->Pack.SwapBytes); glGetBooleanv(GL_PACK_LSB_FIRST, &this->Pack.LsbFirst); glGetIntegerv(vtkgl::PACK_IMAGE_HEIGHT, &this->Pack.ImageHeight); glGetIntegerv(vtkgl::PACK_SKIP_IMAGES, &this->Pack.SkipImages); glGetIntegerv(GL_PACK_ROW_LENGTH, &this->Pack.RowLength); glGetIntegerv(GL_PACK_SKIP_ROWS, &this->Pack.SkipRows); glGetIntegerv(GL_PACK_SKIP_PIXELS, &this->Pack.SkipPixels); glGetIntegerv(GL_PACK_ALIGNMENT, &this->Pack.Alignment); glGetIntegerv(vtkgl::PIXEL_PACK_BUFFER_BINDING, ivalues); this->PixelPackBufferBinding=static_cast(ivalues[0]); glGetIntegerv(vtkgl::PIXEL_UNPACK_BUFFER_BINDING, ivalues); this->PixelUnpackBufferBinding=static_cast(ivalues[0]); if (this->PixelPackBufferBinding>0) { this->PixelPackBufferObject.Id=this->PixelPackBufferBinding; vtkgl::GetBufferParameteriv(vtkgl::PIXEL_PACK_BUFFER, vtkgl::BUFFER_SIZE, &this->PixelPackBufferObject.Size); vtkgl::GetBufferParameteriv(vtkgl::PIXEL_PACK_BUFFER, vtkgl::BUFFER_USAGE, ivalues); this->PixelPackBufferObject.Usage=static_cast(ivalues[0]); vtkgl::GetBufferParameteriv(vtkgl::PIXEL_PACK_BUFFER, vtkgl::BUFFER_ACCESS, ivalues); this->PixelPackBufferObject.Access=static_cast(ivalues[0]); #if 0 // buggy header files (2009/05/05) vtkgl::GetBufferParameteriv(vtkgl::PIXEL_PACK_BUFFER, vtkgl::BUFFER_ACCESS_FLAGS, &this->PixelPackBufferObject.AccessFlags); #endif vtkgl::GetBufferParameteriv(vtkgl::PIXEL_PACK_BUFFER, vtkgl::BUFFER_MAPPED, ivalues); this->PixelPackBufferObject.Mapped=static_cast(ivalues[0]); vtkgl::GetBufferPointerv(vtkgl::PIXEL_PACK_BUFFER, vtkgl::BUFFER_MAP_POINTER, &(this->PixelPackBufferObject.MapPointer)); #if 0 // buggy header files (2009/05/05) vtkgl::GetBufferParameteriv(vtkgl::PIXEL_PACK_BUFFER, vtkgl::BUFFER_MAP_OFFSET, &this->PixelPackBufferObject.MapOffset); vtkgl::GetBufferParameteriv(vtkgl::PIXEL_PACK_BUFFER, vtkgl::BUFFER_MAP_LENGTH, &this->PixelPackBufferObject.MapLength); #endif } if (this->PixelUnpackBufferBinding>0) { this->PixelUnpackBufferObject.Id=PixelUnpackBufferBinding; this->PixelUnpackBufferObject.Id=this->PixelUnpackBufferBinding; vtkgl::GetBufferParameteriv(vtkgl::PIXEL_UNPACK_BUFFER, vtkgl::BUFFER_SIZE, &this->PixelUnpackBufferObject.Size); vtkgl::GetBufferParameteriv(vtkgl::PIXEL_UNPACK_BUFFER, vtkgl::BUFFER_USAGE, ivalues); this->PixelUnpackBufferObject.Usage=static_cast(ivalues[0]); vtkgl::GetBufferParameteriv(vtkgl::PIXEL_UNPACK_BUFFER, vtkgl::BUFFER_ACCESS, ivalues); this->PixelUnpackBufferObject.Access=static_cast(ivalues[0]); #if 0 // buggy header files (2009/05/05) vtkgl::GetBufferParameteriv(vtkgl::PIXEL_UNPACK_BUFFER, vtkgl::BUFFER_ACCESS_FLAGS, &this->PixelUnpackBufferObject.AccessFlags); #endif vtkgl::GetBufferParameteriv(vtkgl::PIXEL_UNPACK_BUFFER, vtkgl::BUFFER_MAPPED, ivalues); this->PixelUnpackBufferObject.Mapped=static_cast(ivalues[0]); vtkgl::GetBufferPointerv(vtkgl::PIXEL_UNPACK_BUFFER, vtkgl::BUFFER_MAP_POINTER, &(this->PixelPackBufferObject.MapPointer)); #if 0 // buggy header files (2009/05/05) vtkgl::GetBufferParameteriv(vtkgl::PIXEL_UNPACK_BUFFER, vtkgl::BUFFER_MAP_OFFSET, &this->PixelUnpackBufferObject.MapOffset); vtkgl::GetBufferParameteriv(vtkgl::PIXEL_UNPACK_BUFFER, vtkgl::BUFFER_MAP_LENGTH, &this->PixelUnpackBufferObject.MapLength); #endif } glGetFloatv(GL_RED_SCALE, &this->RedTransform.Scale); glGetFloatv(GL_RED_BIAS, &this->RedTransform.Bias); glGetFloatv(GL_GREEN_SCALE, &this->GreenTransform.Scale); glGetFloatv(GL_GREEN_BIAS, &this->GreenTransform.Bias); glGetFloatv(GL_BLUE_SCALE, &this->BlueTransform.Scale); glGetFloatv(GL_BLUE_BIAS, &this->BlueTransform.Bias); glGetFloatv(GL_ALPHA_SCALE, &this->AlphaTransform.Scale); glGetFloatv(GL_ALPHA_BIAS, &this->AlphaTransform.Bias); glGetFloatv(GL_DEPTH_SCALE, &this->DepthTransform.Scale); glGetFloatv(GL_DEPTH_BIAS, &this->DepthTransform.Bias); glGetFloatv(GL_ZOOM_X, &this->ZoomX); glGetFloatv(GL_ZOOM_Y, &this->ZoomY); glGetIntegerv(GL_READ_BUFFER, &this->ReadBuffer); glGetIntegerv(GL_AUX_BUFFERS, &this->AuxBuffers); glGetBooleanv(GL_RGBA_MODE, &this->RGBAMode); glGetBooleanv(GL_INDEX_MODE, &this->IndexMode); glGetBooleanv(GL_DOUBLEBUFFER, &this->DoubleBuffer); glGetBooleanv(GL_STEREO, &this->Stereo); glGetIntegerv(vtkgl::MAX_COLOR_ATTACHMENTS, &this->MaxColorAttachments); glGetIntegerv(GL_LIST_BASE, &this->ListBase); glGetIntegerv(GL_LIST_INDEX, &this->ListIndex); if (this->ListIndex!=0) { glGetIntegerv(GL_LIST_MODE, &this->ListMode); } else { this->ListMode=0; // not relevant } glGetIntegerv(GL_RENDER_MODE, &this->RenderMode); } void vtkOpenGLState::UpdateCurrentProgram() { GLint ivalues[4]; delete this->CurrentProgramState; this->CurrentProgramState=0; glGetIntegerv(vtkgl::CURRENT_PROGRAM, ivalues); this->CurrentProgram=static_cast(ivalues[0]); if (this->CurrentProgram!=0) { this->CurrentProgramState=new vtkOpenGLProgramState; this->CurrentProgramState->Id=this->CurrentProgram; GLuint progId=this->CurrentProgramState->Id; vtkgl::GetProgramiv(progId, vtkgl::DELETE_STATUS, ivalues); this->CurrentProgramState->DeleteStatus=static_cast(ivalues[0]); vtkgl::GetProgramiv(progId, vtkgl::LINK_STATUS, ivalues); this->CurrentProgramState->LinkStatus=static_cast(ivalues[0]); vtkgl::GetProgramiv(progId, vtkgl::VALIDATE_STATUS, ivalues); this->CurrentProgramState->ValidateStatus=static_cast(ivalues[0]); vtkgl::GetProgramiv(progId, vtkgl::INFO_LOG_LENGTH, &this->CurrentProgramState->InfoLogLength); vtkgl::GetProgramiv(progId, vtkgl::ATTACHED_SHADERS, &this->CurrentProgramState->NumberOfAttachedShaders); vtkgl::GetProgramiv(progId, vtkgl::ACTIVE_ATTRIBUTES, &this->CurrentProgramState->ActiveAttributes); vtkgl::GetProgramiv(progId, vtkgl::ACTIVE_ATTRIBUTE_MAX_LENGTH, &this->CurrentProgramState->ActiveAttributeMaxLength); vtkgl::GetProgramiv(progId, vtkgl::ACTIVE_UNIFORMS, &this->CurrentProgramState->ActiveUniforms); vtkgl::GetProgramiv(progId, vtkgl::ACTIVE_UNIFORM_MAX_LENGTH, &this->CurrentProgramState->ActiveUniformMaxLength); GLsizei numberOfShaders=this->CurrentProgramState->NumberOfAttachedShaders; this->CurrentProgramState->AttachedShaders= new std::vector( static_cast(numberOfShaders)); GLuint *shaders=new GLuint[numberOfShaders]; vtkgl::GetAttachedShaders(progId, numberOfShaders, 0, shaders); size_t i=0; this->CurrentProgramState->HasVertexShader=false; this->CurrentProgramState->HasFragmentShader=false; while (i(numberOfShaders)) { (*this->CurrentProgramState->AttachedShaders)[i].Id=shaders[i]; this->UpdateShader(i); this->CurrentProgramState->HasVertexShader= this->CurrentProgramState->HasVertexShader|| (*this->CurrentProgramState->AttachedShaders)[i].Type ==vtkgl::VERTEX_SHADER; this->CurrentProgramState->HasFragmentShader= this->CurrentProgramState->HasFragmentShader|| (*this->CurrentProgramState->AttachedShaders)[i].Type ==vtkgl::FRAGMENT_SHADER; ++i; } delete[] shaders; this->CurrentProgramState->InfoLog= new vtkgl::GLchar[this->CurrentProgramState->InfoLogLength]; vtkgl::GetProgramInfoLog(progId, this->CurrentProgramState->InfoLogLength, 0, this->CurrentProgramState->InfoLog); // Active vertex attributes // TODO // Active uniforms } } void vtkOpenGLState::UpdateShader(size_t i) { // Id is already initialized by UpdateCurrentProgram(). vtkOpenGLShaderState *s=&((*this->CurrentProgramState->AttachedShaders)[i]); GLint ivalues[4]; vtkgl::GetShaderiv(s->Id, vtkgl::SHADER_TYPE, ivalues); s->Type=static_cast(ivalues[0]); vtkgl::GetShaderiv(s->Id, vtkgl::DELETE_STATUS, ivalues); s->DeleteStatus=static_cast(ivalues[0]); vtkgl::GetShaderiv(s->Id, vtkgl::COMPILE_STATUS, ivalues); s->CompileStatus=static_cast(ivalues[0]); vtkgl::GetShaderiv(s->Id, vtkgl::INFO_LOG_LENGTH, &(s->InfoLogLength)); vtkgl::GetShaderiv(s->Id, vtkgl::SHADER_SOURCE_LENGTH, &(s->SourceLength)); s->InfoLog=new vtkgl::GLchar[s->InfoLogLength]; vtkgl::GetShaderInfoLog(s->Id, s->InfoLogLength, 0, s->InfoLog); s->Source=new vtkgl::GLchar[s->SourceLength]; vtkgl::GetShaderSource(s->Id, s->SourceLength, 0, s->Source); } void vtkOpenGLState::PrintSelf(ostream &os, vtkIndent indent) { os << indent << "**** OpenGLState ****"<< endl; os << indent << "ErrorCode: " << this->ErrorCodeToString() << endl; os << indent << "FrameBufferBinding (drawFB and readFB)="; if (this->FrameBufferBinding==0) { os << "0 (default framebuffer)" << endl; } else { os << this->FrameBufferBinding << endl; } os << indent << "CurrentProgram="; if (this->CurrentProgram==0) { os << "0 (fixed-pipeline)" << endl; } else { os << this->CurrentProgram << endl; this->CurrentProgramState->PrintSelf(os, indent); } os << indent << "ModelViewMatrix=" << endl; this->PrintMatrix(os, indent, this->ModelViewMatrix); os << indent << "ModelViewStackDepth="<< this->ModelViewStackDepth << endl; os << indent << "ProjectionMatrix=" << endl; this->PrintMatrix(os, indent, this->ProjectionMatrix); os << indent << "ProjectionStackDepth=" << this->ProjectionStackDepth << endl; size_t i; if (this->CurrentProgram==0 || !this->CurrentProgramState->HasVertexShader) { i=0; while (i(this->MaxTextureCoords)) { os << indent << "TextureCoordinateProcessingUnit " << i << ":" <PrintMatrix(os, indent, (*this->TCPU)[i].CurrentMatrix); os << indent << "TextureStackDepth=" << (*this->TCPU)[i].MatrixStackDepth << endl; ++i; } } i=0; while (i(this->MaxCombinedTextureImageUnits)) { // only display texture unit with at least one binding, otherwise it is // too verbose. if ((*this->TIU)[i].TextureBinding1D!=0 || (*this->TIU)[i].TextureBinding2D!=0 || (*this->TIU)[i].TextureBinding3D!=0 || (*this->TIU)[i].TextureBindingCubeMap!=0) { os << indent << "TextureImageUnit " << i << ":" <(this->MaxTextureUnits)) { // only display texture unit with at least one enabled flag, // otherwise it is too verbose. if ((*this->FixedPipeline.TextureImageUnitEnabled)[i].Texture1DEnabled==GL_TRUE|| (*this->FixedPipeline.TextureImageUnitEnabled)[i].Texture2DEnabled==GL_TRUE|| (*this->FixedPipeline.TextureImageUnitEnabled)[i].Texture3DEnabled==GL_TRUE|| (*this->FixedPipeline.TextureImageUnitEnabled)[i].TextureCubeMapEnabled==GL_TRUE) { os << indent << " TextureImageUnitFixedFlag" << i<< ":" << endl; os << indent << " Texture1DEnabled=" << static_cast((*this->FixedPipeline.TextureImageUnitEnabled)[i].Texture1DEnabled==GL_TRUE) << endl; os << indent << " Texture2DEnabled=" << static_cast((*this->FixedPipeline.TextureImageUnitEnabled)[i].Texture2DEnabled==GL_TRUE) << endl; os << indent << " Texture3DEnabled=" << static_cast((*this->FixedPipeline.TextureImageUnitEnabled)[i].Texture3DEnabled==GL_TRUE) << endl; os << indent << " TextureCubeMapEnabled=" << static_cast((*this->FixedPipeline.TextureImageUnitEnabled)[i].TextureCubeMapEnabled==GL_TRUE) << endl; } ++i; } } os << indent << "Viewport=" << this->Viewport[0] << ", " << this->Viewport[1] << ", " << this->Viewport[2] << ", " << this->Viewport[3] << endl; os << indent << "DepthRange=" << this->DepthRange[0] << ", " << this->DepthRange[1] << endl; os << indent << "MatrixMode=" << this->MatrixModeToString() << endl; os << indent << "ShadeModel=" << this->ShadeModelToString() << endl; os << indent << "CullFaceEnabled=" << static_cast(this->CullFaceEnabled==GL_TRUE) << endl; os << indent << "CullFaceMode=" << this->CullFaceModeToString() << endl; os << indent << "FrontFace=" << this->FrontFaceToString() << endl; os << indent << "PolygonSmoothEnabled=" << static_cast(this->PolygonSmoothEnabled==GL_TRUE) << endl; os << indent << "PolygonMode Front=" << this->PolygonModeToString(this->PolygonMode[0]); os << " Back=" << this->PolygonModeToString(this->PolygonMode[1]) << endl; os << indent << "PolygonOffsetFactor=" << this->PolygonOffsetFactor << endl; os << indent << "PolygonOffsetUnits=" << this->PolygonOffsetUnits << endl; os << indent << "PolygonOffsetPointEnabled=" << static_cast(this->PolygonOffsetPointEnabled==GL_TRUE) << endl; os << indent << "PolygonOffsetLineEnabled=" << static_cast(this->PolygonOffsetLineEnabled==GL_TRUE) << endl; os << indent << "PolygonOffsetFillEnabled=" << static_cast(this->PolygonOffsetFillEnabled==GL_TRUE) << endl; os << indent << "PolygonStippleEnabled=" << static_cast(this->PolygonStippleEnabled==GL_TRUE) << endl; // multisampling os << indent << "-- Multisampling" << endl; os << indent << "MultiSampleEnabled=" << static_cast(this->MultiSampleEnabled==GL_TRUE) << endl; os << indent << "SampleAlphaToCoverageEnabled=" << static_cast(this->SampleAlphaToCoverageEnabled==GL_TRUE) << endl; os << indent << "SampleAlphaToOneEnabled=" << static_cast(this->SampleAlphaToOneEnabled==GL_TRUE) << endl; os << indent << "SampleCoverageEnabled=" << static_cast(this->SampleCoverageEnabled==GL_TRUE) << endl; os << indent << "SampleCoverageValue=" << this->SampleCoverageValue << endl; os << indent << "SampleCoverageInvert=" << this->BooleanToString(this->SampleCoverageInvert) << endl; // texture env os << indent << "-- Texture environment" << endl; os << indent << "ActiveTexture=GL_TEXTURE" << (this->ActiveTexture-vtkgl::TEXTURE0) << endl; // pixel operations os << indent << "-- Pixel operations" << endl; os << endl; os << indent << "ScissorTestEnabled=" << static_cast(this->ScissorTestEnabled==GL_TRUE) << endl; os << indent << "ScissorBox=" << this->ScissorBox[0] << ", " << this->ScissorBox[1] << ", " << this->ScissorBox[2] << ", " << this->ScissorBox[3] << endl; os << endl; os << indent << "AlphaTestEnabled=" << static_cast(this->AlphaTestEnabled==GL_TRUE) << endl; os << indent << "AlphaTestFunc=" << this->AlphaTestFuncToString() << endl; os << indent << "AlphaTestRef=" << this->AlphaTestRef << endl; os << endl; os << indent << "StencilTestEnabled=" << static_cast(this->StencilTestEnabled==GL_TRUE) << endl; os << endl; os << indent << "DepthTestEnabled=" << static_cast(this->DepthTestEnabled==GL_TRUE) << endl; os << indent << "DepthFunc=" << this->DepthFuncToString() << endl; os << endl; os << indent << "BlendEnabled=" << static_cast(this->BlendEnabled==GL_TRUE) << endl; os << indent << "BlendSrcRGB=" << this->BlendFuncToString(this->BlendSrcRGB) << endl; os << indent << "BlendSrcAlpha=" << this->BlendFuncToString(this->BlendSrcAlpha) << endl; os << indent << "BlendDstRGB=" << this->BlendFuncToString(this->BlendDstRGB) << endl; os << indent << "BlendDstAlpha=" << this->BlendFuncToString(this->BlendDstAlpha) << endl; os << indent << "BlendEquationRGB=" << this->BlendEquationToString(this->BlendEquationRGB) << endl; os << indent << "BlendEquationAlpha=" << this->BlendEquationToString(this->BlendEquationAlpha) << endl; os << endl; os << indent << "DitherEnabled=" << static_cast(this->DitherEnabled==GL_TRUE) << endl; os << endl; os << indent << "IndexLogicOpEnabled=" << static_cast(this->IndexLogicOpEnabled==GL_TRUE) << endl; os << indent << "ColorLogicOpEnabled=" << static_cast(this->ColorLogicOpEnabled==GL_TRUE) << endl; os << indent << "LogicOpMode=" << this->LogicOpModeToString() << endl; os << endl; os << indent << "-- Framebuffer control" << endl; os << indent << "MaxDrawBuffers=" << this->MaxDrawBuffers << endl; i=0; while (i(this->MaxDrawBuffers)) { os << indent << "DrawBuffer[" << i <<"]="; this->ColorBufferToStream(os, (*this->DrawBuffers)[static_cast(i)]); os << endl; ++i; } os << indent << "IndexWriteMask=" << this->IndexWriteMask << endl; os << indent << "ColorWriteMask=" << static_cast(this->ColorWriteMask[0]==GL_TRUE) << ", " << static_cast(this->ColorWriteMask[1]==GL_TRUE)<< ", " << static_cast(this->ColorWriteMask[2]==GL_TRUE) << ", " << static_cast(this->ColorWriteMask[3]==GL_TRUE) << endl; os << indent << "DepthWriteMask=" << static_cast(this->DepthWriteMask==GL_TRUE) << endl; os << indent << "StencilWriteMask=0x" << hex << this->StencilWriteMask << dec << endl; os << indent << "StencilBackWriteMask=0x" << hex << this->StencilBackWriteMask << dec << endl; os << indent << "this->ColorClearValue=" << this->ColorClearValue[0] << ", " << this->ColorClearValue[1] << ", " << this->ColorClearValue[2] << ", " << this->ColorClearValue[3] << endl; os << indent << "this->IndexClearValue=" << this->IndexClearValue << endl; os << indent << "this->DepthClearValue=" << this->DepthClearValue << endl; os << indent << "this->StencilClearValue=0x" << hex << this->StencilClearValue << dec << endl; os << indent << "this->AccumClearValue=" << this->AccumClearValue[0] << ", " << this->AccumClearValue[1] << ", " << this->AccumClearValue[2] << ", " << this->AccumClearValue[3] << endl; os << indent << "-- Pixels" << endl; os << indent << "Unpack:"<Unpack.PrintSelf(os, indent.GetNextIndent()); os << indent << "Pack:"<Pack.PrintSelf(os, indent.GetNextIndent()); os << indent << "PixelPackBufferBinding=" << this->PixelPackBufferBinding << endl; if (this->PixelPackBufferBinding>0) { this->PixelPackBufferObject.PrintSelf(os, indent); } os << indent << "PixelUnpackBufferBinding=" << this->PixelUnpackBufferBinding << endl; if (this->PixelUnpackBufferBinding>0) { this->PixelUnpackBufferObject.PrintSelf(os, indent); } os << indent << "RedTransform:"; this->RedTransform.PrintSelf(os, indent.GetNextIndent()); os << indent << "GreenTransform:"; this->GreenTransform.PrintSelf(os, indent.GetNextIndent()); os << indent << "BlueTransform:"; this->BlueTransform.PrintSelf(os, indent.GetNextIndent()); os << indent << "AlphaTransform:"; this->AlphaTransform.PrintSelf(os, indent.GetNextIndent()); os << indent << "DepthTransform:"; this->DepthTransform.PrintSelf(os, indent.GetNextIndent()); os << indent << "ZoomX=" << this->ZoomX << endl; os << indent << "ZoomY=" << this->ZoomY << endl; os << indent << "ReadBuffer="; this->ColorBufferToStream(os, this->ReadBuffer); os << endl; os << indent << "AuxBuffers=" << this->AuxBuffers << endl; os << indent << "RGBAMode="<< static_cast(this->RGBAMode==GL_TRUE)<< endl; os << indent << "IndexMode="<< static_cast(this->IndexMode==GL_TRUE)<< endl; os << indent << "DoubleBuffer="<< static_cast(this->DoubleBuffer==GL_TRUE)<< endl; os << indent << "Stereo="<< static_cast(this->Stereo==GL_TRUE)<< endl; os << indent << "MaxColorAttachments=" << this->MaxColorAttachments << endl; os << indent << "MaxDrawBuffers=" << this->MaxDrawBuffers << endl; os << indent << "ListBase=" << this->ListBase << endl; os << indent << "ListIndex=" << this->ListIndex << endl; os << indent << "ListMode=" << this->ListModeToString() << endl; os << indent << "RenderMode=" << this->RenderModeToString() << endl; } void vtkOpenGLProgramState::PrintSelf(ostream &os, vtkIndent indent) { if (this->HasVertexShader) { os << indent << "customized verter shader" << endl; } else { os << indent << "fixed-pipeline verter shader" << endl; } if (this->HasFragmentShader) { os << indent << "customized fragment shader" << endl; } else { os << indent << "fixed-pipeline fragment shader" << endl; } os << indent << "DeleteStatus=" << static_cast(this->DeleteStatus==GL_TRUE) << endl; os << indent << "LinkStatus=" << static_cast(this->LinkStatus==GL_TRUE) << endl; os << indent << "ValidateStatus=" << static_cast(this->ValidateStatus==GL_TRUE) << endl; os << indent << "NumberOfAttachedShaders=" << this->NumberOfAttachedShaders << endl; os << indent << "InfoLogLength=" << this->InfoLogLength << endl; os << indent << "InfoLog=|" << endl << this->InfoLog << "|" << endl; os << indent << "ActiveUniforms=" << this->ActiveUniforms << endl; os << indent << "ActiveUniformMaxLength=" << this->ActiveUniformMaxLength << endl; os << indent << "ActiveAttributes=" << this->ActiveAttributes << endl; os << indent << "ActiveAttributeMaxLength=" << this->ActiveAttributeMaxLength << endl; os << indent << "Shaders: " << endl; size_t i=0; while (i(this->NumberOfAttachedShaders)) { (*this->AttachedShaders)[i].PrintSelf(os, indent.GetNextIndent()); ++i; } } void vtkOpenGLShaderState::PrintSelf(ostream &os, vtkIndent indent) { os << indent << "Id=" << this->Id << endl; os << indent << "Type=" << this->ShaderTypeToString() << endl; os << indent << "DeleteStatus=" << static_cast(this->DeleteStatus==GL_TRUE) << endl; os << indent << "CompileStatus=" << static_cast(this->CompileStatus==GL_TRUE) << endl; os << indent << "InfoLogLength=" << this->InfoLogLength << endl; os << indent << "InfoLog=|" << endl << this->InfoLog << "|" << endl; os << indent << "SourceLength=" << this->SourceLength << endl; os << indent << "Source=|" << endl << this->Source << "|" << endl; } static int ShaderTypeValueTable[2]={ vtkgl::VERTEX_SHADER, vtkgl::FRAGMENT_SHADER }; static const char *ShaderTypeStringTable[2]={ "GL_VERTEX_SHADER", "GL_FRAGMENT_SHADER" }; const char *vtkOpenGLShaderState::ShaderTypeToString() { return ::ValueToString(static_cast(this->Type), ShaderTypeValueTable, ShaderTypeStringTable, 2); } void vtkOpenGLPixelControl::PrintSelf(ostream &os, vtkIndent indent) { os << indent << "SwapBytes=" << static_cast(this->SwapBytes==GL_TRUE) << endl; os << indent << "LSBFirst=" << static_cast(this->LsbFirst==GL_TRUE) << endl; os << indent << "ImageHeight=" << this->ImageHeight << endl; os << indent << "SkipImages=" << this->SkipImages << endl; os << indent << "RowLength=" << this->RowLength << endl; os << indent << "SkipRows=" << this->SkipRows << endl; os << indent << "SkipPixels=" << this->SkipPixels << endl; os << indent << "Alignment=" << this->Alignment << endl; } void vtkOpenGLBufferObjectState::BufferAccessFlagsToStream(ostream &os) { bool firstFlag=true; if ((this->AccessFlags&vtkgl::MAP_READ_BIT)!=0) { os << "GL_MAP_READ_BIT"; firstFlag=false; } if ((this->AccessFlags&vtkgl::MAP_WRITE_BIT)!=0) { if (!firstFlag) { os << "|"; } os << "GL_MAP_WRITE_BIT"; firstFlag=false; } if ((this->AccessFlags&vtkgl::MAP_INVALIDATE_RANGE_BIT)!=0) { if (!firstFlag) { os << "|"; } os << "GL_MAP_INVALIDATE_RANGE_BIT"; firstFlag=false; } if ((this->AccessFlags&vtkgl::MAP_INVALIDATE_BUFFER_BIT)!=0) { if (!firstFlag) { os << "|"; } os << "GL_MAP_INVALIDATE_BUFFER_BIT"; firstFlag=false; } if ((this->AccessFlags&vtkgl::MAP_FLUSH_EXPLICIT_BIT)!=0) { if (!firstFlag) { os << "|"; } os << "GL_MAP_FLUSH_EXPLICIT_BIT"; firstFlag=false; } if ((this->AccessFlags&vtkgl::MAP_UNSYNCHRONIZED_BIT)!=0) { if (!firstFlag) { os << "|"; } os << "GL_MAP_UNSYNCHRONIZED_BIT"; } } static int BufferUsageValueTable[9]={ vtkgl::STREAM_DRAW, vtkgl::STREAM_READ, vtkgl::STREAM_COPY, vtkgl::STATIC_DRAW, vtkgl::STATIC_READ, vtkgl::STATIC_COPY, vtkgl::DYNAMIC_DRAW, vtkgl::DYNAMIC_READ, vtkgl::DYNAMIC_COPY }; static const char *BufferUsageStringTable[9]={ "GL_STREAM_DRAW", "GL_STREAM_READ", "GL_STREAM_COPY", "GL_STATIC_DRAW", "GL_STATIC_READ", "GL_STATIC_COPY", "GL_DYNAMIC_DRAW", "GL_DYNAMIC_READ", "GL_DYNAMIC_COPY" }; const char *vtkOpenGLBufferObjectState::BufferUsageToString() { return ::ValueToString(static_cast(this->Usage), BufferUsageValueTable, BufferUsageStringTable, 9); } static int BufferAccessValueTable[3]={ vtkgl::READ_ONLY, vtkgl::WRITE_ONLY, vtkgl::READ_WRITE }; static const char *BufferAccessStringTable[3]={ "GL_READ_ONLY", "GL_WRITE_ONLY", "GL_READ_WRITE" }; const char *vtkOpenGLBufferObjectState::BufferAccessToString() { return ::ValueToString(static_cast(this->Access), BufferAccessValueTable, BufferAccessStringTable, 3); } void vtkOpenGLBufferObjectState::PrintSelf(ostream &os, vtkIndent indent) { os << indent << " Size=" << this->Size << endl; os << indent << " Usage=" << this->BufferUsageToString() << endl; os << indent << " Access=" << this->BufferAccessToString() << endl; // os << indent << " AccessFlags="; // this->BufferAccessFlagsToStream(os); os << endl; os << indent << " Mapped=" << static_cast(this->Mapped==GL_TRUE) << endl; os << indent << " MapPointer=" << this->MapPointer << endl; // os << indent << " MapOffset=" << this->MapOffset << endl; // os << indent << " MapLength=" << this->MapLength << endl; } void vtkOpenGLComponentTransform::PrintSelf(ostream &os, vtkIndent indent) { os << indent << "Scale=" << this->Scale << endl; os << indent << "Bias=" << this->Bias << endl; } static const char *UnknownValue="Unknown value"; static const char *NA="N/A"; static int BooleanValueTable[2]= { GL_FALSE, GL_TRUE }; static const char *BooleanStringTable[2]= { "GL_FALSE", "GL_TRUE" }; static int MatrixModeValueTable[4]= { GL_MODELVIEW, GL_PROJECTION, GL_TEXTURE, GL_COLOR }; static const char *MatrixModeStringTable[4]= { "GL_MODELVIEW", "GL_PROJECTION", "GL_TEXTURE", "GL_COLOR" }; static int ShadeModelValueTable[2]= { GL_SMOOTH, GL_FLAT }; static const char *ShadeModelStringTable[2]= { "GL_SMOOTH", "GL_FLAT" }; static int CullFaceModeValueTable[3]= { GL_FRONT, GL_BACK, GL_FRONT_AND_BACK }; static const char *CullFaceModeStringTable[3]= { "GL_FRONT", "GL_BACK", "GL_FRONT_AND_BACK" }; static int FrontFaceValueTable[2]= { GL_CW, GL_CCW }; static const char *FrontFaceStringTable[2]= { "GL_CW", "GL_CCW", }; static int PolygonModeValueTable[3]= { GL_POINT, GL_LINE, GL_FILL }; static const char *PolygonModeStringTable[3]= { "GL_POINT", "GL_LINE", "GL_FILL" }; static int AlphaTestFuncValueTable[8]= { GL_NEVER, GL_ALWAYS, GL_LESS, GL_LEQUAL, GL_EQUAL, GL_GEQUAL, GL_GREATER, GL_NOTEQUAL }; static const char *AlphaTestFuncStringTable[8]= { "GL_NEVER", "GL_ALWAYS", "GL_LESS", "GL_LEQUAL", "GL_EQUAL", "GL_GEQUAL", "GL_GREATER", "GL_NOTEQUAL" }; static int RenderModeValueTable[3]= { GL_RENDER, GL_SELECT, GL_FEEDBACK }; static const char *RenderModeStringTable[3]= { "GL_RENDER", "GL_SELECT", "GL_FEEDBACK" }; static int ListModeValueTable[2]= { GL_COMPILE, GL_COMPILE_AND_EXECUTE }; static const char *ListModeStringTable[2]= { "GL_COMPILE", "GL_COMPILE_AND_EXECUTE" }; static int BlendFuncValueTable[15]= { GL_ZERO, GL_ONE, GL_SRC_COLOR, GL_ONE_MINUS_SRC_COLOR, GL_DST_COLOR, GL_ONE_MINUS_DST_COLOR, GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_DST_ALPHA, GL_ONE_MINUS_DST_ALPHA, vtkgl::CONSTANT_COLOR, vtkgl::ONE_MINUS_CONSTANT_COLOR, vtkgl::CONSTANT_ALPHA, vtkgl::ONE_MINUS_CONSTANT_ALPHA, GL_SRC_ALPHA_SATURATE }; static const char *BlendFuncStringTable[15]= { "GL_ZERO", "GL_ONE", "GL_SRC_COLOR", "GL_ONE_MINUS_SRC_COLOR", "GL_DST_COLOR", "GL_ONE_MINUS_DST_COLOR", "GL_SRC_ALPHA", "GL_ONE_MINUS_SRC_ALPHA", "GL_DST_ALPHA", "GL_ONE_MINUS_DST_ALPHA", "GL_CONSTANT_COLOR", "GL_ONE_MINUS_CONSTANT_COLOR", "GL_CONSTANT_ALPHA", "GL_ONE_MINUS_CONSTANT_ALPHA", "GL_SRC_ALPHA_SATURATE" }; static int BlendEquationValueTable[5]= { vtkgl::FUNC_ADD, vtkgl::FUNC_SUBTRACT, vtkgl::FUNC_REVERSE_SUBTRACT, vtkgl::MIN, vtkgl::MAX }; static const char *BlendEquationStringTable[5]= { "GL_FUNC_ADD", "GL_FUNC_SUBTRACT", "GL_FUNC_REVERSE_SUBTRACT", "GL_MIN", "GL_MAX" }; static int LogicOpModeValueTable[16]={ GL_CLEAR, GL_AND, GL_AND_REVERSE, GL_COPY, GL_AND_INVERTED, GL_NOOP, GL_XOR, GL_OR, GL_NOR, GL_EQUIV, GL_INVERT, GL_OR_REVERSE, GL_COPY_INVERTED, GL_OR_INVERTED, GL_NAND, GL_SET }; static const char *LogicOpModeStringTable[16]={ "GL_CLEAR", "GL_AND", "GL_AND_REVERSE", "GL_COPY", "GL_AND_INVERTED", "GL_NOOP", "GL_XOR", "GL_OR", "GL_NOR", "GL_EQUIV", "GL_INVERT", "GL_OR_REVERSE", "GL_COPY_INVERTED", "GL_OR_INTERTED", "GL_NAND", "GL_SET" }; static int ColorBufferValueTable[10]={ GL_NONE, GL_FRONT_LEFT, GL_FRONT_RIGHT, GL_BACK_LEFT, GL_BACK_RIGHT, GL_FRONT, GL_BACK, GL_LEFT, GL_RIGHT, GL_FRONT_AND_BACK }; static const char *ColorBufferStringTable[10]={ "GL_NONE", "GL_FRONT_LEFT", "GL_FRONT_RIGHT", "GL_BACK_LEFT", "GL_BACK_RIGHT", "GL_FRONT", "GL_BACK", "GL_LEFT", "GL_RIGHT", "GL_FRONT_AND_BACK" }; static int ErrorCodeValueTable[9]={ GL_NO_ERROR, GL_INVALID_ENUM, GL_INVALID_VALUE, GL_INVALID_OPERATION, GL_STACK_OVERFLOW, GL_STACK_UNDERFLOW, GL_OUT_OF_MEMORY, vtkgl::TABLE_TOO_LARGE, vtkgl::INVALID_FRAMEBUFFER_OPERATION_EXT }; static const char *ErrorCodeStringTable[9]={ "GL_NO_ERROR", "GL_INVALID_ENUM", "GL_INVALID_VALUE", "GL_INVALID_OPERATION", "GL_STACK_OVERFLOW", "GL_STACK_UNDERFLOW", "GL_OUT_OF_MEMORY", "GL_TABLE_TOO_LARGE", "GL_INVALID_FRAMEBUFFER_OPERATION_EXT" }; void vtkOpenGLState::ColorBufferToStream(ostream &os, GLint colorBuffer) { GLint auxBuffer=colorBuffer-GL_AUX0; if (auxBuffer>=0 && auxBufferAuxBuffers) { os << "GL_AUX" << auxBuffer; } else { GLint colorAttachment=static_cast(static_cast(colorBuffer) -vtkgl::COLOR_ATTACHMENT0); if (colorAttachment>=0 && colorAttachmentMaxColorAttachments) { os << "GL_COLOR_ATTACHMENT" << colorAttachment; } else { os << this->ValueToString(colorBuffer, ColorBufferValueTable, ColorBufferStringTable, 10); } } } const char *vtkOpenGLState::ErrorCodeToString() { return this->ValueToString(static_cast(this->ErrorCode), ErrorCodeValueTable, ErrorCodeStringTable, 9); } const char *vtkOpenGLState::BlendFuncToString(GLint blendFunc) { return this->ValueToString(blendFunc, BlendFuncValueTable, BlendFuncStringTable, 15); } const char *vtkOpenGLState::BlendEquationToString(GLint blendEquation) { return this->ValueToString(blendEquation, BlendEquationValueTable, BlendEquationStringTable, 5); } const char *vtkOpenGLState::LogicOpModeToString() { return this->ValueToString(this->LogicOpMode, LogicOpModeValueTable, LogicOpModeStringTable, 16); } const char *vtkOpenGLState::ListModeToString() { const char*result; if (this->ListMode==0) { result=NA; } else { result=this->ValueToString(this->ListMode, ListModeValueTable, ListModeStringTable, 2); } return result; } const char *vtkOpenGLState::BooleanToString(GLint booleanValue) { return this->ValueToString(booleanValue, BooleanValueTable, BooleanStringTable, 2); } const char *vtkOpenGLState::ShadeModelToString() { return this->ValueToString(this->ShadeModel, ShadeModelValueTable, ShadeModelStringTable, 2); } const char *vtkOpenGLState::CullFaceModeToString() { return this->ValueToString(this->CullFaceMode, CullFaceModeValueTable, CullFaceModeStringTable, 3); } const char *vtkOpenGLState::FrontFaceToString() { return this->ValueToString(this->FrontFace, FrontFaceValueTable, FrontFaceStringTable, 2); } const char *vtkOpenGLState::PolygonModeToString(GLint polygonMode) { return this->ValueToString(polygonMode, PolygonModeValueTable, PolygonModeStringTable, 3); } const char *vtkOpenGLState::AlphaTestFuncToString() { return this->ValueToString(this->AlphaTestFunc, AlphaTestFuncValueTable, AlphaTestFuncStringTable, 8); } const char *vtkOpenGLState::DepthFuncToString() { // yes, same functions values for alpha test and depth test. return this->ValueToString(this->DepthFunc, AlphaTestFuncValueTable, AlphaTestFuncStringTable, 8); } const char *vtkOpenGLState::RenderModeToString() { return this->ValueToString(this->RenderMode, RenderModeValueTable, RenderModeStringTable, 3); } const char *vtkOpenGLState::MatrixModeToString() { return this->ValueToString(this->MatrixMode, MatrixModeValueTable, MatrixModeStringTable, 4); } const char *ValueToString(GLint value, int valueTable[], const char *stringTable[], int tableSize) { const char *result; bool found=false; int i=0; while (!found && i