0029528: Visualization, TKOpenGl - allow defining sRGB textures
[occt.git] / src / OpenGl / OpenGl_BackgroundArray.cxx
index cf49fe1..6796992 100644 (file)
@@ -34,9 +34,6 @@ OpenGl_BackgroundArray::OpenGl_BackgroundArray (const Graphic3d_TypeOfBackground
   myViewHeight (0),
   myToUpdate (Standard_False)
 {
-  Handle(NCollection_AlignedAllocator) anAlloc = new NCollection_AlignedAllocator (16);
-  myAttribs = new Graphic3d_Buffer (anAlloc);
-
   myDrawMode = GL_TRIANGLE_STRIP;
   myIsFillType = true;
 
@@ -140,11 +137,12 @@ void OpenGl_BackgroundArray::invalidateData()
 // =======================================================================
 Standard_Boolean OpenGl_BackgroundArray::init (const Handle(OpenGl_Workspace)& theWorkspace) const
 {
+  const Handle(OpenGl_Context)& aCtx = theWorkspace->GetGlContext();
   switch (myType)
   {
     case Graphic3d_TOB_GRADIENT:
     {
-      if (!createGradientArray())
+      if (!createGradientArray (aCtx))
       {
         return Standard_False;
       }
@@ -174,7 +172,6 @@ Standard_Boolean OpenGl_BackgroundArray::init (const Handle(OpenGl_Workspace)& t
   }
 
   // Init VBO
-  const Handle(OpenGl_Context)& aCtx = theWorkspace->GetGlContext();
   if (myIsVboInit)
   {
     clearMemoryGL (aCtx);
@@ -191,7 +188,7 @@ Standard_Boolean OpenGl_BackgroundArray::init (const Handle(OpenGl_Workspace)& t
 // method  : createGradientArray
 // purpose :
 // =======================================================================
-Standard_Boolean OpenGl_BackgroundArray::createGradientArray() const
+Standard_Boolean OpenGl_BackgroundArray::createGradientArray (const Handle(OpenGl_Context)& theCtx) const
 {
   // Initialize data for primitive array
   Graphic3d_Attribute aGragientAttribInfo[] =
@@ -200,6 +197,11 @@ Standard_Boolean OpenGl_BackgroundArray::createGradientArray() const
     { Graphic3d_TOA_COLOR, Graphic3d_TOD_VEC3 }
   };
 
+  if (myAttribs.IsNull())
+  {
+    Handle(NCollection_AlignedAllocator) anAlloc = new NCollection_AlignedAllocator (16);
+    myAttribs = new Graphic3d_Buffer (anAlloc);
+  }
   if (!myAttribs->Init (4, aGragientAttribInfo, 2))
   {
     return Standard_False;
@@ -311,7 +313,7 @@ Standard_Boolean OpenGl_BackgroundArray::createGradientArray() const
     *aVertData = aVertices[anIt];
 
     OpenGl_Vec3* aColorData = reinterpret_cast<OpenGl_Vec3* >(myAttribs->changeValue (anIt) + myAttribs->AttributeOffset (1));
-    *aColorData = OpenGl_Vec3(aCorners[anIt][0], aCorners[anIt][1], aCorners[anIt][2]);
+    *aColorData = theCtx->Vec4FromQuantityColor (OpenGl_Vec4(aCorners[anIt][0], aCorners[anIt][1], aCorners[anIt][2], 1.0f)).rgb();
   }
 
   return Standard_True;
@@ -329,6 +331,11 @@ Standard_Boolean OpenGl_BackgroundArray::createTextureArray (const Handle(OpenGl
     { Graphic3d_TOA_UV,  Graphic3d_TOD_VEC2 }
   };
 
+  if (myAttribs.IsNull())
+  {
+    Handle(NCollection_AlignedAllocator) anAlloc = new NCollection_AlignedAllocator (16);
+    myAttribs = new Graphic3d_Buffer (anAlloc);
+  }
   if (!myAttribs->Init (4, aTextureAttribInfo, 2))
   {
     return Standard_False;
@@ -397,6 +404,11 @@ Standard_Boolean OpenGl_BackgroundArray::createCubeMapArray() const
     { Graphic3d_TOA_POS, Graphic3d_TOD_VEC2}
   };
 
+  if (myAttribs.IsNull())
+  {
+    Handle(NCollection_AlignedAllocator) anAlloc = new NCollection_AlignedAllocator (16);
+    myAttribs = new Graphic3d_Buffer (anAlloc);
+  }
   if (!myAttribs->Init(4, aCubeMapAttribInfo, 1))
   {
     return Standard_False;
@@ -428,7 +440,9 @@ void OpenGl_BackgroundArray::Render (const Handle(OpenGl_Workspace)& theWorkspac
   }
   if (myToUpdate
    || myViewWidth  != aViewSizeX
-   || myViewHeight != aViewSizeY)
+   || myViewHeight != aViewSizeY
+   || myAttribs.IsNull()
+   || myVboAttribs.IsNull())
   {
     myViewWidth  = aViewSizeX;
     myViewHeight = aViewSizeY;