X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FVTKViewer%2FVTKViewer_OpenGLRenderer.cxx;h=042458467679f82826a73a6aa9994052c7f41bc2;hb=25b89f5f64a47503b6d21a8cdd334fb64d0c16cf;hp=f99d102e143dcf0fe23b4c0cd4600d13f43d9886;hpb=1c6902702083f5f05f7cad582c59445c089b9086;p=modules%2Fgui.git diff --git a/src/VTKViewer/VTKViewer_OpenGLRenderer.cxx b/src/VTKViewer/VTKViewer_OpenGLRenderer.cxx index f99d102e1..042458467 100644 --- a/src/VTKViewer/VTKViewer_OpenGLRenderer.cxx +++ b/src/VTKViewer/VTKViewer_OpenGLRenderer.cxx @@ -1,4 +1,4 @@ -// Copyright (C) 2007-2016 CEA/DEN, EDF R&D, OPEN CASCADE +// Copyright (C) 2007-2021 CEA/DEN, EDF R&D, OPEN CASCADE // // Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS @@ -20,6 +20,10 @@ // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com // +// to compile, otherwise we get: +// #error gl.h included before glew.h +#include + #include "VTKViewer_OpenGLRenderer.h" #include "VTKViewer_Texture.h" @@ -41,7 +45,9 @@ #include #include -vtkStandardNewMacro(VTKViewer_OpenGLRenderer); +#include + +vtkStandardNewMacro(VTKViewer_OpenGLRenderer) VTKViewer_OpenGLRenderer::VTKViewer_OpenGLRenderer() { @@ -66,6 +72,93 @@ void VTKViewer_OpenGLRenderer::SetGradientType( const int theGradientType ) this->GradientType = theGradientType; } +void VTKViewer_OpenGLRenderer::GetCornersColor(Vec2D& cornersColor) +{ + if( this->GradientBackground ) + { + double* corner1 = 0; + double* corner2 = 0; + double* corner3 = 0; + double* corner4 = 0; + double dcorner1[3]; + double dcorner2[3]; + + switch( this->GradientType ) + { + case HorizontalGradient: + corner1 = this->Background; + corner2 = this->Background; + corner3 = this->Background2; + corner4 = this->Background2; + break; + case VerticalGradient: + corner1 = this->Background; + corner2 = this->Background2; + corner3 = this->Background2; + corner4 = this->Background; + break; + case FirstDiagonalGradient: + corner1 = this->Background; + corner3 = this->Background2; + dcorner1[0] = dcorner2[0] = 0.5F * ( corner1[0] + corner3[0] ); + dcorner1[1] = dcorner2[1] = 0.5F * ( corner1[1] + corner3[1] ); + dcorner1[2] = dcorner2[2] = 0.5F * ( corner1[2] + corner3[2] ); + corner2 = dcorner1; + corner4 = dcorner2; + break; + case SecondDiagonalGradient: + corner2 = this->Background2; + corner4 = this->Background; + dcorner1[0] = dcorner2[0] = 0.5F * ( corner2[0] + corner4[0] ); + dcorner1[1] = dcorner2[1] = 0.5F * ( corner2[1] + corner4[1] ); + dcorner1[2] = dcorner2[2] = 0.5F * ( corner2[2] + corner4[2] ); + corner1 = dcorner1; + corner3 = dcorner2; + break; + case FirstCornerGradient: + corner1 = this->Background2; + corner2 = this->Background2; + corner3 = this->Background; + corner4 = this->Background2; + break; + case SecondCornerGradient: + corner1 = this->Background2; + corner2 = this->Background2; + corner3 = this->Background2; + corner4 = this->Background; + break; + case ThirdCornerGradient: + corner1 = this->Background; + corner2 = this->Background2; + corner3 = this->Background2; + corner4 = this->Background2; + break; + case FourthCornerGradient: + corner1 = this->Background2; + corner2 = this->Background; + corner3 = this->Background2; + corner4 = this->Background2; + break; + default: // just in case + corner1 = this->Background; + corner2 = this->Background; + corner3 = this->Background; + corner4 = this->Background; + break; + } + cornersColor[0][0] = corner1[0]; cornersColor[0][1] = corner1[1]; cornersColor[0][2] = corner1[2]; + cornersColor[1][0] = corner2[0]; cornersColor[1][1] = corner2[1]; cornersColor[1][2] = corner2[2]; + cornersColor[2][0] = corner3[0]; cornersColor[2][1] = corner3[1]; cornersColor[2][2] = corner3[2]; + cornersColor[3][0] = corner4[0]; cornersColor[3][1] = corner4[1]; cornersColor[3][2] = corner4[2]; + } + else + { + for (int i = 0; i < 4; i++) + for(int j = 0; j < 3; j++) + cornersColor[i][j] = this->Background[j]; + } +} + void VTKViewer_OpenGLRenderer::Clear(void) { vtkOpenGLRenderer::Clear(); @@ -74,7 +167,13 @@ void VTKViewer_OpenGLRenderer::Clear(void) { if (this->BackgroundProgram == 0) { - std::string filePath = std::string( getenv( "GUI_ROOT_DIR") ) + "/share/salome/resources/gui/Background"; +#if defined(WIN32) && defined(UNICODE) + std::wstring wFilePath = std::wstring( _wgetenv(L"GUI_ROOT_DIR") ) + L"/share/salome/resources/gui/Background"; + std::string filePath = Kernel_Utils::utf8_encode_s( wFilePath ); +#else + std::string filePath = std::string(getenv("GUI_ROOT_DIR")) + "/share/salome/resources/gui/Background"; +#endif + if (!this->OpenGLHelper.CreateShaderProgram (filePath, this->BackgroundProgram, this->BackgroundVertexShader, @@ -100,7 +199,7 @@ void VTKViewer_OpenGLRenderer::Clear(void) glClearColor( static_cast(this->Background[0]), static_cast(this->Background[1]), static_cast(this->Background[2]), - static_cast(0.0)); + static_cast(this->BackgroundAlpha)); clear_mask |= GL_COLOR_BUFFER_BIT; } @@ -142,147 +241,86 @@ void VTKViewer_OpenGLRenderer::Clear(void) if( this->GradientBackground ) { - double* corner1 = 0; - double* corner2 = 0; - double* corner3 = 0; - double* corner4 = 0; - double dcorner1[3]; - double dcorner2[3]; - - switch( this->GradientType ) - { - case HorizontalGradient: - corner1 = this->Background; - corner2 = this->Background2; - corner3 = this->Background2; - corner4 = this->Background; - break; - case VerticalGradient: - corner1 = this->Background2; - corner2 = this->Background2; - corner3 = this->Background; - corner4 = this->Background; - break; - case FirstDiagonalGradient: - corner2 = this->Background2; - corner4 = this->Background; - dcorner1[0] = dcorner2[0] = 0.5F * ( corner2[0] + corner4[0] ); - dcorner1[1] = dcorner2[1] = 0.5F * ( corner2[1] + corner4[1] ); - dcorner1[2] = dcorner2[2] = 0.5F * ( corner2[2] + corner4[2] ); - corner1 = dcorner1; - corner3 = dcorner2; - break; - case SecondDiagonalGradient: - corner1 = this->Background2; - corner3 = this->Background; - dcorner1[0] = dcorner2[0] = 0.5F * ( corner1[0] + corner3[0] ); - dcorner1[1] = dcorner2[1] = 0.5F * ( corner1[1] + corner3[1] ); - dcorner1[2] = dcorner2[2] = 0.5F * ( corner1[2] + corner3[2] ); - corner2 = dcorner1; - corner4 = dcorner2; - break; - case FirstCornerGradient: - corner1 = this->Background2; - corner2 = this->Background2; - corner3 = this->Background2; - corner4 = this->Background; - break; - case SecondCornerGradient: - corner1 = this->Background2; - corner2 = this->Background2; - corner3 = this->Background; - corner4 = this->Background2; - break; - case ThirdCornerGradient: - corner1 = this->Background2; - corner2 = this->Background; - corner3 = this->Background2; - corner4 = this->Background2; - break; - case FourthCornerGradient: - corner1 = this->Background; - corner2 = this->Background2; - corner3 = this->Background2; - corner4 = this->Background2; - break; - default: // just in case - corner1 = this->Background; - corner2 = this->Background; - corner3 = this->Background; - corner4 = this->Background; - break; - } + Vec2D corners = {{0.0f,0.0f,0.0f}, + {0.0f,0.0f,0.0f}, + {0.0f,0.0f,0.0f}, + {0.0f,0.0f,0.0f}}; + GetCornersColor(corners); #ifdef VTK_OPENGL2 - if (this->OpenGLHelper.IsInitialized()) - { - if (this->VertexArrayObject == 0) - { - this->OpenGLHelper.vglGenVertexArraysARB (1, &this->VertexArrayObject); - } + if (this->OpenGLHelper.IsInitialized()) + { + if (this->VertexArrayObject == 0) + { + this->OpenGLHelper.vglGenVertexArraysARB (1, &this->VertexArrayObject); + } - this->OpenGLHelper.vglUseProgramObjectARB (this->BackgroundProgram); - this->OpenGLHelper.vglBindVertexArrayARB (this->VertexArrayObject); + this->OpenGLHelper.vglUseProgramObjectARB (this->BackgroundProgram); + this->OpenGLHelper.vglBindVertexArrayARB (this->VertexArrayObject); - GLfloat data[7 * 4]; - if( this->GradientType != FirstCornerGradient && this->GradientType != ThirdCornerGradient ) - { - const float tmpData[] = { (float)corner1[0], (float)corner1[1], (float)corner1[2], 1.0f, -1.0f, 1.0f, 0.0f, - (float)corner2[0], (float)corner2[1], (float)corner2[2], 1.0f, -1.0f, -1.0f, 0.0f, - (float)corner3[0], (float)corner3[1], (float)corner3[2], 1.0f, 1.0f, -1.0f, 0.0f, - (float)corner4[0], (float)corner4[1], (float)corner4[2], 1.0f, 1.0f, 1.0f, 0.0f }; - memcpy (data, tmpData, sizeof(float) * 7 * 4); - } - else //if( this->GradientType == FirstCornerGradient || this->GradientType == ThirdCornerGradient ) - { - const float tmpData[] = { (float)corner2[0], (float)corner2[1], (float)corner2[2], 1.0f, -1.0f, -1.0f, 0.0f, - (float)corner3[0], (float)corner3[1], (float)corner3[2], 1.0f, -1.0f, 1.0f, 0.0f, - (float)corner4[0], (float)corner4[1], (float)corner4[2], 1.0f, 1.0f, 1.0f, 0.0f, - (float)corner1[0], (float)corner1[1], (float)corner1[2], 1.0f, 1.0f, -1.0f, 0.0f }; - memcpy (data, tmpData, sizeof(float) * 7 * 4); - } + GLfloat data[10 * 4]; + if( this->GradientType != FirstCornerGradient && this->GradientType != ThirdCornerGradient ) + { + const float tmpData[] = { (float)corners[0][0], (float)corners[0][1], (float)corners[0][2], 1.0f, -1.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, + (float)corners[1][0], (float)corners[1][1], (float)corners[1][2], 1.0f, -1.0f, -1.0f, 0.0f, 0.0f, 0.0f, 0.0f, + (float)corners[2][0], (float)corners[2][1], (float)corners[2][2], 1.0f, 1.0f, -1.0f, 0.0f, 0.0f, 0.0f, 0.0f, + (float)corners[3][0], (float)corners[3][1], (float)corners[3][2], 1.0f, 1.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f}; + memcpy (data, tmpData, sizeof(float) * 10 * 4); + } + else //if( this->GradientType == FirstCornerGradient || this->GradientType == ThirdCornerGradient ) + { + const float tmpData[] = { (float)corners[1][0], (float)corners[1][1], (float)corners[1][2], 1.0f, -1.0f, -1.0f, 0.0f, 0.0f, 0.0f, 0.0f, + (float)corners[2][0], (float)corners[2][1], (float)corners[2][2], 1.0f, -1.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, + (float)corners[3][0], (float)corners[3][1], (float)corners[3][2], 1.0f, 1.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, + (float)corners[0][0], (float)corners[0][1], (float)corners[0][2], 1.0f, 1.0f, -1.0f, 0.0f, 0.0f, 0.0f, 0.0f}; + memcpy (data, tmpData, sizeof(float) * 10 * 4); + } - GLuint vertexBuffer; - this->OpenGLHelper.vglGenBuffersARB (1, &vertexBuffer); - this->OpenGLHelper.vglBindBufferARB (GL_ARRAY_BUFFER_ARB, vertexBuffer); - this->OpenGLHelper.vglBufferDataARB (GL_ARRAY_BUFFER_ARB, sizeof(data), data, GL_STATIC_DRAW_ARB); + GLuint vertexBuffer; + this->OpenGLHelper.vglGenBuffersARB (1, &vertexBuffer); + this->OpenGLHelper.vglBindBufferARB (GL_ARRAY_BUFFER_ARB, vertexBuffer); + this->OpenGLHelper.vglBufferDataARB (GL_ARRAY_BUFFER_ARB, sizeof(data), data, GL_STATIC_DRAW_ARB); - GLint colorAttrib = this->OpenGLHelper.vglGetAttribLocationARB (this->BackgroundProgram, "Color"); - GLint vertexAttrib = this->OpenGLHelper.vglGetAttribLocationARB (this->BackgroundProgram, "Vertex"); - GLsizei vertexSize = sizeof(GLfloat) * 7; + GLint colorAttrib = this->OpenGLHelper.vglGetAttribLocationARB (this->BackgroundProgram, "Color"); + GLint vertexAttrib = this->OpenGLHelper.vglGetAttribLocationARB (this->BackgroundProgram, "Vertex"); + GLint bgColorAttrib = this->OpenGLHelper.vglGetAttribLocationARB (this->BackgroundProgram, "ColorBG"); + GLsizei vertexSize = sizeof(GLfloat) * 10; - this->OpenGLHelper.vglVertexAttribPointerARB (colorAttrib, 4, GL_FLOAT, GL_FALSE, vertexSize, (const GLvoid*)0); - this->OpenGLHelper.vglEnableVertexAttribArrayARB (colorAttrib); + this->OpenGLHelper.vglVertexAttribPointerARB (colorAttrib, 4, GL_FLOAT, GL_FALSE, vertexSize, (const GLvoid*)0); + this->OpenGLHelper.vglEnableVertexAttribArrayARB (colorAttrib); - this->OpenGLHelper.vglVertexAttribPointerARB (vertexAttrib, 3, GL_FLOAT, GL_FALSE, vertexSize, (const GLvoid*)(sizeof(GLfloat) * 4)); - this->OpenGLHelper.vglEnableVertexAttribArrayARB (vertexAttrib); + this->OpenGLHelper.vglVertexAttribPointerARB (vertexAttrib, 3, GL_FLOAT, GL_FALSE, vertexSize, (const GLvoid*)(sizeof(GLfloat) * 4)); + this->OpenGLHelper.vglEnableVertexAttribArrayARB (vertexAttrib); - this->OpenGLHelper.vglUniform1iARB (this->myLocations.UseTexture, 0); + this->OpenGLHelper.vglVertexAttribPointerARB (bgColorAttrib, 3, GL_FLOAT, GL_FALSE, vertexSize, (const GLvoid*)(sizeof(GLfloat) * 7)); + this->OpenGLHelper.vglEnableVertexAttribArrayARB (bgColorAttrib); - glDrawArrays(GL_TRIANGLE_FAN, 0, 4); + this->OpenGLHelper.vglUniform1iARB (this->myLocations.UseTexture, 0); - this->OpenGLHelper.vglDisableVertexAttribArrayARB (0); - this->OpenGLHelper.vglBindBufferARB (GL_ARRAY_BUFFER_ARB, 0); - this->OpenGLHelper.vglDeleteBuffersARB (1, &vertexBuffer); - this->OpenGLHelper.vglBindVertexArrayARB (0); - this->OpenGLHelper.vglUseProgramObjectARB (0); - } + glDrawArrays(GL_TRIANGLE_FAN, 0, 4); + + this->OpenGLHelper.vglDisableVertexAttribArrayARB (0); + this->OpenGLHelper.vglBindBufferARB (GL_ARRAY_BUFFER_ARB, 0); + this->OpenGLHelper.vglDeleteBuffersARB (1, &vertexBuffer); + this->OpenGLHelper.vglBindVertexArrayARB (0); + this->OpenGLHelper.vglUseProgramObjectARB (0); + } #else glBegin( GL_TRIANGLE_FAN ); if( this->GradientType != FirstCornerGradient && this->GradientType != ThirdCornerGradient ) { - glColor3f( corner1[0], corner1[1], corner1[2] ); glVertex2f( 0.F, 0.F ); - glColor3f( corner2[0], corner2[1], corner2[2] ); glVertex2f( 1.F, 0.F ); - glColor3f( corner3[0], corner3[1], corner3[2] ); glVertex2f( 1.F, 1.F ); - glColor3f( corner4[0], corner4[1], corner4[2] ); glVertex2f( 0.F, 1.F ); + glColor3f( corners[0][0], corners[0][1], corners[0][2] ); glVertex2f( 0.F, 0.F ); + glColor3f( corners[1][0], corners[1][1], corners[1][2] ); glVertex2f( 1.F, 0.F ); + glColor3f( corners[2][0], corners[2][1], corners[2][2] ); glVertex2f( 1.F, 1.F ); + glColor3f( corners[3][0], corners[3][1], corners[3][2] ); glVertex2f( 0.F, 1.F ); } else //if( this->GradientType == FirstCornerGradient || this->GradientType == ThirdCornerGradient ) { - glColor3f( corner2[0], corner2[1], corner2[2] ); glVertex2f( 1.F, 0.F ); - glColor3f( corner3[0], corner3[1], corner3[2] ); glVertex2f( 1.F, 1.F ); - glColor3f( corner4[0], corner4[1], corner4[2] ); glVertex2f( 0.F, 1.F ); - glColor3f( corner1[0], corner1[1], corner1[2] ); glVertex2f( 0.F, 0.F ); + glColor3f( corners[1][0], corners[1][1], corners[1][2] ); glVertex2f( 1.F, 0.F ); + glColor3f( corners[2][0], corners[2][1], corners[2][2] ); glVertex2f( 1.F, 1.F ); + glColor3f( corners[3][0], corners[3][1], corners[3][2] ); glVertex2f( 0.F, 1.F ); + glColor3f( corners[0][0], corners[0][1], corners[0][2] ); glVertex2f( 0.F, 0.F ); } glEnd(); #endif @@ -320,7 +358,7 @@ void VTKViewer_OpenGLRenderer::Clear(void) if( aPosition == VTKViewer_Texture::Tiled ) { texX = (GLfloat)aViewWidth / (GLfloat)aWidth; - texY = (GLfloat)aViewHeight / (GLfloat)aHeight; + texY = (GLfloat)aViewHeight / (GLfloat)aHeight; texY *= -1; } #ifdef VTK_OPENGL2 if (this->OpenGLHelper.IsInitialized()) @@ -334,14 +372,32 @@ void VTKViewer_OpenGLRenderer::Clear(void) this->OpenGLHelper.vglBindVertexArrayARB (this->VertexArrayObject); GLfloat dx = (aPosition == VTKViewer_Texture::Centered) ? (( (GLfloat)aWidth / (GLfloat)aViewWidth )) : 1.0f; - GLfloat dy = (aPosition == VTKViewer_Texture::Centered) ? (( (GLfloat)aHeight / (GLfloat)aViewHeight )) : 1.0f; - - + GLfloat dy = (aPosition == VTKViewer_Texture::Centered) ? (( (GLfloat)aHeight / (GLfloat)aViewHeight )) : (aPosition == VTKViewer_Texture::Stretched) ? 1.0f : -1.0f; + + // call to get backcolor + Vec2D bgColor = {{0.0f,0.0f,0.0f}, + {0.0f,0.0f,0.0f}, + {0.0f,0.0f,0.0f}, + {0.0f,0.0f,0.0f}}; + GetCornersColor(bgColor); // First 4 components of Vertex is TexCoords now. - GLfloat data[7 * 4] = { 0.0f, texY, 0.0f, 1.0f, -dx, dy, 0.0f, - 0.0f, 0.0f, 0.0f, 1.0f, -dx, -dy, 0.0f, - texX, 0.0f, 0.0f, 1.0f, dx, -dy, 0.0f, - texX, texY, 0.0f, 1.0f, dx, dy, 0.0f }; + GLfloat data[10 * 4]; + if( this->GradientType != FirstCornerGradient && this->GradientType != ThirdCornerGradient ) + { + const float tmpData[] = { 0.0f, texY, 0.0f, 1.0f, -dx, dy, 0.0f, (float)bgColor[0][0], (float)bgColor[0][1], (float)bgColor[0][2], + 0.0f, 0.0f, 0.0f, 1.0f, -dx, -dy, 0.0f, (float)bgColor[1][0], (float)bgColor[1][1], (float)bgColor[1][2], + texX, 0.0f, 0.0f, 1.0f, dx, -dy, 0.0f, (float)bgColor[2][0], (float)bgColor[2][1], (float)bgColor[2][2], + texX, texY, 0.0f, 1.0f, dx, dy, 0.0f, (float)bgColor[3][0], (float)bgColor[3][1], (float)bgColor[3][2] }; + memcpy (data, tmpData, sizeof(float) * 10 * 4); + } + else //if( this->GradientType == FirstCornerGradient || this->GradientType == ThirdCornerGradient ) + { + const float tmpData[] = { 0.0f, texY, 0.0f, 1.0f, -dx, dy, 0.0f, (float)bgColor[2][0], (float)bgColor[2][1], (float)bgColor[2][2], + 0.0f, 0.0f, 0.0f, 1.0f, -dx, -dy, 0.0f, (float)bgColor[1][0], (float)bgColor[1][1], (float)bgColor[1][2], + texX, 0.0f, 0.0f, 1.0f, dx, -dy, 0.0f, (float)bgColor[0][0], (float)bgColor[0][1], (float)bgColor[0][2], + texX, texY, 0.0f, 1.0f, dx, dy, 0.0f, (float)bgColor[3][0], (float)bgColor[3][1], (float)bgColor[3][2] }; + memcpy (data, tmpData, sizeof(float) * 10 * 4); + } GLuint vertexBuffer; this->OpenGLHelper.vglGenBuffersARB (1, &vertexBuffer); @@ -350,7 +406,8 @@ void VTKViewer_OpenGLRenderer::Clear(void) GLint colorAttrib = this->OpenGLHelper.vglGetAttribLocationARB (this->BackgroundProgram, "Color"); GLint vertexAttrib = this->OpenGLHelper.vglGetAttribLocationARB (this->BackgroundProgram, "Vertex"); - GLsizei vertexSize = sizeof(GLfloat) * 7; + GLint bgColorAttrib = this->OpenGLHelper.vglGetAttribLocationARB (this->BackgroundProgram, "ColorBG"); + GLsizei vertexSize = sizeof(GLfloat) * 10; this->OpenGLHelper.vglVertexAttribPointerARB (colorAttrib, 4, GL_FLOAT, GL_FALSE, vertexSize, (const GLvoid*)0); this->OpenGLHelper.vglEnableVertexAttribArrayARB (colorAttrib); @@ -358,6 +415,9 @@ void VTKViewer_OpenGLRenderer::Clear(void) this->OpenGLHelper.vglVertexAttribPointerARB (vertexAttrib, 3, GL_FLOAT, GL_FALSE, vertexSize, (const GLvoid*)(sizeof(GLfloat) * 4)); this->OpenGLHelper.vglEnableVertexAttribArrayARB (vertexAttrib); + this->OpenGLHelper.vglVertexAttribPointerARB (bgColorAttrib, 3, GL_FLOAT, GL_FALSE, vertexSize, (const GLvoid*)(sizeof(GLfloat) * 7)); + this->OpenGLHelper.vglEnableVertexAttribArrayARB (bgColorAttrib); + this->OpenGLHelper.vglUniform1iARB (this->myLocations.UseTexture, 1); this->OpenGLHelper.vglUniform1iARB (this->myLocations.BackgroundTexture, GL_TEXTURE0);