0030982: Visualization, OpenGl_View::MinMaxValues() - do not add background quad...
authormzernova <mzernova@opencascade.com>
Wed, 27 Nov 2019 07:14:30 +0000 (10:14 +0300)
committerbugmaster <bugmaster@opencascade.com>
Fri, 29 Nov 2019 17:19:42 +0000 (20:19 +0300)
Deleted adding background quad into depth range. Background is drawn in 2D coordinates. Fixed problem with using gradient background in tiles.

src/OpenGl/OpenGl_BackgroundArray.cxx
src/OpenGl/OpenGl_View.cxx
src/OpenGl/OpenGl_View_Raytrace.cxx

index 6796992..9d9700a 100644 (file)
@@ -433,10 +433,15 @@ void OpenGl_BackgroundArray::Render (const Handle(OpenGl_Workspace)& theWorkspac
   const Handle(OpenGl_Context)& aCtx = theWorkspace->GetGlContext();
   Standard_Integer aViewSizeX = aCtx->Viewport()[2];
   Standard_Integer aViewSizeY = aCtx->Viewport()[3];
+  Graphic3d_Vec2i aTileOffset, aTileSize;
+
   if (theWorkspace->View()->Camera()->Tile().IsValid())
   {
     aViewSizeX = theWorkspace->View()->Camera()->Tile().TotalSize.x();
     aViewSizeY = theWorkspace->View()->Camera()->Tile().TotalSize.y();
+
+    aTileOffset = theWorkspace->View()->Camera()->Tile().OffsetLowerLeft();
+    aTileSize   = theWorkspace->View()->Camera()->Tile().TileSize;
   }
   if (myToUpdate
    || myViewWidth  != aViewSizeX
@@ -454,8 +459,30 @@ void OpenGl_BackgroundArray::Render (const Handle(OpenGl_Workspace)& theWorkspac
 
   if (myType != Graphic3d_TOB_CUBEMAP)
   {
-    myTrsfPers.Apply(theWorkspace->View()->Camera(), aProjection, aWorldView,
-      aCtx->Viewport()[2], aCtx->Viewport()[3]);
+    aProjection.InitIdentity();
+    aWorldView.InitIdentity();
+    if (theWorkspace->View()->Camera()->Tile().IsValid())
+    {
+      aWorldView.SetDiagonal (OpenGl_Vec4 (2.0f / aTileSize.x(), 2.0f / aTileSize.y(), 1.0f, 1.0f));
+      if (myType == Graphic3d_TOB_GRADIENT)
+      {
+        aWorldView.SetColumn (3, OpenGl_Vec4 (-1.0f - 2.0f * aTileOffset.x() / aTileSize.x(),
+                                              -1.0f - 2.0f * aTileOffset.y() / aTileSize.y(), 0.0f, 1.0f));
+      }
+      else
+      {
+        aWorldView.SetColumn (3, OpenGl_Vec4 (-1.0f + (float) aViewSizeX / aTileSize.x() - 2.0f * aTileOffset.x() / aTileSize.x(),
+                                              -1.0f + (float) aViewSizeY / aTileSize.y() - 2.0f * aTileOffset.y() / aTileSize.y(), 0.0f, 1.0f));
+      }
+    }
+    else
+    {
+      aWorldView.SetDiagonal (OpenGl_Vec4 (2.0f / myViewWidth, 2.0f / myViewHeight, 1.0f, 1.0f));
+      if (myType == Graphic3d_TOB_GRADIENT)
+      {
+        aWorldView.SetColumn (3, OpenGl_Vec4 (-1.0f, -1.0f, 0.0f, 1.0f));
+      }
+    }
   }
 
   aCtx->ProjectionState.Push();
index b5d5c23..2ee86d6 100644 (file)
@@ -686,36 +686,6 @@ Bnd_Box OpenGl_View::MinMaxValues (const Standard_Boolean theToIncludeAuxiliary)
 
   Bnd_Box aBox = base_type::MinMaxValues (theToIncludeAuxiliary);
 
-  // add bounding box of gradient/texture background for proper Z-fit
-  if (theToIncludeAuxiliary
-    && (myBackgrounds[Graphic3d_TOB_TEXTURE]->IsDefined()
-     || myBackgrounds[Graphic3d_TOB_GRADIENT]->IsDefined()))
-  {
-    const Handle(Graphic3d_Camera)& aCamera = Camera();
-    Graphic3d_Vec2i aWinSize;
-    Window()->Size (aWinSize.x(), aWinSize.y());
-
-    // Background is drawn using 2D transformation persistence
-    // (e.g. it is actually placed in 3D coordinates within active camera position).
-    // We add here full-screen plane with 2D transformation persistence
-    // for simplicity (myBgTextureArray might define a little bit different options
-    // but it is updated within ::Render())
-    const Graphic3d_Mat4d& aProjectionMat = aCamera->ProjectionMatrix();
-    const Graphic3d_Mat4d& aWorldViewMat  = aCamera->OrientationMatrix();
-    Graphic3d_BndBox3d aBox2d (Graphic3d_Vec3d (0.0, 0.0, 0.0),
-                               Graphic3d_Vec3d (double(aWinSize.x()), double(aWinSize.y()), 0.0));
-
-    Graphic3d_TransformPers aTrsfPers (Graphic3d_TMF_2d, Aspect_TOTP_LEFT_LOWER);
-    aTrsfPers.Apply (aCamera,
-                     aProjectionMat,
-                     aWorldViewMat,
-                     aWinSize.x(),
-                     aWinSize.y(),
-                     aBox2d);
-    aBox.Add (gp_Pnt (aBox2d.CornerMin().x(), aBox2d.CornerMin().y(), aBox2d.CornerMin().z()));
-    aBox.Add (gp_Pnt (aBox2d.CornerMax().x(), aBox2d.CornerMax().y(), aBox2d.CornerMax().z()));
-  }
-
   return aBox;
 }
 
index 5530426..b667440 100644 (file)
@@ -2584,6 +2584,16 @@ Standard_Boolean OpenGl_View::setUniformState (const Standard_Integer        the
   {
     aBackColorTop = myBackgrounds[Graphic3d_TOB_GRADIENT]->GradientColor (0);
     aBackColorBot = myBackgrounds[Graphic3d_TOB_GRADIENT]->GradientColor (1);
+
+    if (myCamera->Tile().IsValid())
+    {
+      Standard_Integer aTileOffset = myCamera->Tile().OffsetLowerLeft().y();
+      Standard_Integer aTileSize = myCamera->Tile().TileSize.y();
+      Standard_Integer aViewSize = myCamera->Tile().TotalSize.y();
+      OpenGl_Vec4 aColorRange = aBackColorTop - aBackColorBot;
+      aBackColorBot = aBackColorBot + aColorRange * ((float) aTileOffset / aViewSize);
+      aBackColorTop = aBackColorBot + aColorRange * ((float) aTileSize / aViewSize);
+    }
   }
   aBackColorTop = theGlContext->Vec4FromQuantityColor (aBackColorTop);
   aBackColorBot = theGlContext->Vec4FromQuantityColor (aBackColorBot);