]> OCCT Git - occt.git/commitdiff
0032117: Visualization, TKOpenGl - assert in OpenGl_AspectsSprite due to implicit...
authorkgv <kgv@opencascade.com>
Fri, 5 Feb 2021 17:38:15 +0000 (20:38 +0300)
committerbugmaster <bugmaster@opencascade.com>
Wed, 10 Feb 2021 17:42:57 +0000 (20:42 +0300)
RGBA and Alpha markers are now handled independently within OpenGl_AspectsSprite::build().

src/OpenGl/OpenGl_AspectsSprite.cxx

index b2399176c56158f20ac4ac955790ed797901f947..f991381a8980a761477093331eedee88fb9ea6fb 100644 (file)
@@ -206,9 +206,16 @@ void OpenGl_AspectsSprite::build (const Handle(OpenGl_Context)& theCtx,
 
   Handle(OpenGl_PointSprite)& aSprite  = mySprite;
   Handle(OpenGl_PointSprite)& aSpriteA = mySpriteA;
-  if (!aNewKey.IsEmpty()
-   && theCtx->GetResource<Handle(OpenGl_PointSprite)> (aNewKeyA, aSpriteA) // alpha sprite could be shared
-   && theCtx->GetResource<Handle(OpenGl_PointSprite)> (aNewKey,  aSprite))
+  if (!aNewKey.IsEmpty())
+  {
+    theCtx->GetResource<Handle(OpenGl_PointSprite)> (aNewKeyA, aSpriteA); // alpha sprite could be shared
+    theCtx->GetResource<Handle(OpenGl_PointSprite)> (aNewKey,  aSprite);
+  }
+
+  const bool hadAlreadyRGBA  = !aSprite.IsNull();
+  const bool hadAlreadyAlpha = !aSpriteA.IsNull();
+  if (hadAlreadyRGBA
+   && hadAlreadyAlpha)
   {
     // reuse shared resource
     if (!aSprite->IsDisplayList())
@@ -218,15 +225,20 @@ void OpenGl_AspectsSprite::build (const Handle(OpenGl_Context)& theCtx,
     return;
   }
 
-  const bool hadAlreadyAlpha = !aSpriteA.IsNull();
   if (!hadAlreadyAlpha)
   {
     aSpriteA = new OpenGl_PointSprite (aNewKeyA);
   }
-  aSprite = new OpenGl_PointSprite (aNewKey);
+  if (!hadAlreadyRGBA)
+  {
+    aSprite = new OpenGl_PointSprite (aNewKey);
+  }
   if (!aNewKey.IsEmpty())
   {
-    theCtx->ShareResource (aNewKey, aSprite);
+    if (!hadAlreadyRGBA)
+    {
+      theCtx->ShareResource (aNewKey, aSprite);
+    }
     if (!hadAlreadyAlpha)
     {
       theCtx->ShareResource (aNewKeyA, aSpriteA);
@@ -249,7 +261,10 @@ void OpenGl_AspectsSprite::build (const Handle(OpenGl_Context)& theCtx,
     Handle(Image_PixMap) anImage = aNewMarkerImage->GetImage();
     theMarkerSize = Max ((Standard_ShortReal )anImage->Width(),(Standard_ShortReal )anImage->Height());
 
-    aSprite->Init (theCtx, *anImage, Graphic3d_TOT_2D, true);
+    if (!hadAlreadyRGBA)
+    {
+      aSprite->Init (theCtx, *anImage, Graphic3d_TOT_2D, true);
+    }
     if (!hadAlreadyAlpha)
     {
       if (Handle(Image_PixMap) anImageA = aSprite->GetFormat() != GL_ALPHA ? aNewMarkerImage->GetImageAlpha() : Handle(Image_PixMap)())