#include <OpenGl_Workspace.hxx>
#include <Graphic3d_TextureParams.hxx>
+#include <Graphic3d_GraphicDriver.hxx>
#if defined(_WIN32) && defined(HAVE_VIDEOCAPTURE)
#include <OpenGl_AVIWriter.hxx>
#endif
-IMPLEMENT_STANDARD_HANDLE(OpenGl_Workspace,OpenGl_Window)
-IMPLEMENT_STANDARD_RTTIEXT(OpenGl_Workspace,OpenGl_Window)
namespace
{
myTransientDrawToFront (Standard_True),
myBackBufferRestored (Standard_False),
myIsImmediateDrawn (Standard_False),
- myUseZBuffer (Standard_False),
- myUseDepthTest (Standard_True),
+ myUseZBuffer (Standard_True),
+ myUseDepthWrite (Standard_True),
myUseGLLight (Standard_True),
myIsCullingEnabled (Standard_False),
myFrameCounter (0),
int v;
if (sscanf (anAaEnv, "%d", &v) > 0) myAntiAliasingMode = v;
}
+
+ myDefaultCappingAlgoFilter = new OpenGl_CappingAlgoFilter();
+ myNoneCulling.ChangeCullingMode() = TelCullNone;
+ myNoneCulling.ChangeEdge() = 0;
+ myFrontCulling.ChangeCullingMode() = TelCullBack;
+ myFrontCulling.ChangeEdge() = 0;
}
// =======================================================================
AspectFace(Standard_True);
AspectMarker(Standard_True);
AspectText(Standard_True);
+
+ myGlContext->SetTypeOfLine (myDefaultAspectLine.Type());
+ myGlContext->SetLineWidth (myDefaultAspectLine.Width());
}
// =======================================================================
{
return false;
}
+ else if (theReadFbo == theDrawFbo)
+ {
+ return true;
+ }
// clear destination before blitting
if (theDrawFbo != NULL
// function : drawStereoPair
// purpose :
// =======================================================================
-void OpenGl_Workspace::drawStereoPair()
+void OpenGl_Workspace::drawStereoPair (const Graphic3d_CView& theCView)
{
OpenGl_FrameBuffer* aPair[2] =
{
myImmediateSceneFbos[1]->IsValid() ? myImmediateSceneFbos[1].operator->() : NULL
};
if (aPair[0] == NULL
- || aPair[1] == NULL)
+ || aPair[1] == NULL
+ || !myTransientDrawToFront)
{
aPair[0] = myMainSceneFbos[0]->IsValid() ? myMainSceneFbos[0].operator->() : NULL;
aPair[1] = myMainSceneFbos[1]->IsValid() ? myMainSceneFbos[1].operator->() : NULL;
return;
}
+ Standard_Boolean toReverse = theCView.RenderParams.ToReverseStereo;
+ const Standard_Boolean isOddY = (theCView.DefWindow.top + theCView.DefWindow.dy) % 2 == 1;
+ const Standard_Boolean isOddX = theCView.DefWindow.left % 2 == 1;
+ if (isOddY
+ && (theCView.RenderParams.StereoMode == Graphic3d_StereoMode_RowInterlaced
+ || theCView.RenderParams.StereoMode == Graphic3d_StereoMode_ChessBoard))
+ {
+ toReverse = !toReverse;
+ }
+ if (isOddX
+ && (theCView.RenderParams.StereoMode == Graphic3d_StereoMode_ColumnInterlaced
+ || theCView.RenderParams.StereoMode == Graphic3d_StereoMode_ChessBoard))
+ {
+ toReverse = !toReverse;
+ }
+
+ if (toReverse)
+ {
+ std::swap (aPair[0], aPair[1]);
+ }
+
myGlContext->core20fwd->glDepthFunc (GL_ALWAYS);
myGlContext->core20fwd->glDepthMask (GL_TRUE);
myGlContext->core20fwd->glEnable (GL_DEPTH_TEST);
const Handle(OpenGl_ShaderManager)& aManager = myGlContext->ShaderManager();
if (myFullScreenQuad.IsValid()
- && aManager->BindAnaglyphProgram())
+ && aManager->BindStereoProgram (theCView.RenderParams.StereoMode))
{
+ if (theCView.RenderParams.StereoMode == Graphic3d_StereoMode_Anaglyph)
+ {
+ OpenGl_Mat4 aFilterL, aFilterR;
+ aFilterL.SetDiagonal (Graphic3d_Vec4 (0.0f, 0.0f, 0.0f, 0.0f));
+ aFilterR.SetDiagonal (Graphic3d_Vec4 (0.0f, 0.0f, 0.0f, 0.0f));
+ switch (theCView.RenderParams.AnaglyphFilter)
+ {
+ case Graphic3d_RenderingParams::Anaglyph_RedCyan_Simple:
+ {
+ aFilterL.SetRow (0, Graphic3d_Vec4 (1.0f, 0.0f, 0.0f, 0.0f));
+ aFilterR.SetRow (1, Graphic3d_Vec4 (0.0f, 1.0f, 0.0f, 0.0f));
+ aFilterR.SetRow (2, Graphic3d_Vec4 (0.0f, 0.0f, 1.0f, 0.0f));
+ break;
+ }
+ case Graphic3d_RenderingParams::Anaglyph_RedCyan_Optimized:
+ {
+ aFilterL.SetRow (0, Graphic3d_Vec4 ( 0.4154f, 0.4710f, 0.16666667f, 0.0f));
+ aFilterL.SetRow (1, Graphic3d_Vec4 (-0.0458f, -0.0484f, -0.0257f, 0.0f));
+ aFilterL.SetRow (2, Graphic3d_Vec4 (-0.0547f, -0.0615f, 0.0128f, 0.0f));
+ aFilterL.SetRow (3, Graphic3d_Vec4 ( 0.0f, 0.0f, 0.0f, 0.0f));
+ aFilterR.SetRow (0, Graphic3d_Vec4 (-0.01090909f, -0.03636364f, -0.00606061f, 0.0f));
+ aFilterR.SetRow (1, Graphic3d_Vec4 ( 0.37560000f, 0.73333333f, 0.01111111f, 0.0f));
+ aFilterR.SetRow (2, Graphic3d_Vec4 (-0.06510000f, -0.12870000f, 1.29710000f, 0.0f));
+ aFilterR.SetRow (3, Graphic3d_Vec4 ( 0.0f, 0.0f, 0.0f, 0.0f));
+ break;
+ }
+ case Graphic3d_RenderingParams::Anaglyph_YellowBlue_Simple:
+ {
+ aFilterL.SetRow (0, Graphic3d_Vec4 (1.0f, 0.0f, 0.0f, 0.0f));
+ aFilterL.SetRow (1, Graphic3d_Vec4 (0.0f, 1.0f, 0.0f, 0.0f));
+ aFilterR.SetRow (2, Graphic3d_Vec4 (0.0f, 0.0f, 1.0f, 0.0f));
+ break;
+ }
+ case Graphic3d_RenderingParams::Anaglyph_YellowBlue_Optimized:
+ {
+ aFilterL.SetRow (0, Graphic3d_Vec4 ( 1.062f, -0.205f, 0.299f, 0.0f));
+ aFilterL.SetRow (1, Graphic3d_Vec4 (-0.026f, 0.908f, 0.068f, 0.0f));
+ aFilterL.SetRow (2, Graphic3d_Vec4 (-0.038f, -0.173f, 0.022f, 0.0f));
+ aFilterL.SetRow (3, Graphic3d_Vec4 ( 0.0f, 0.0f, 0.0f, 0.0f));
+ aFilterR.SetRow (0, Graphic3d_Vec4 (-0.016f, -0.123f, -0.017f, 0.0f));
+ aFilterR.SetRow (1, Graphic3d_Vec4 ( 0.006f, 0.062f, -0.017f, 0.0f));
+ aFilterR.SetRow (2, Graphic3d_Vec4 ( 0.094f, 0.185f, 0.911f, 0.0f));
+ aFilterR.SetRow (3, Graphic3d_Vec4 ( 0.0f, 0.0f, 0.0f, 0.0f));
+ break;
+ }
+ case Graphic3d_RenderingParams::Anaglyph_GreenMagenta_Simple:
+ {
+ aFilterR.SetRow (0, Graphic3d_Vec4 (1.0f, 0.0f, 0.0f, 0.0f));
+ aFilterL.SetRow (1, Graphic3d_Vec4 (0.0f, 1.0f, 0.0f, 0.0f));
+ aFilterR.SetRow (2, Graphic3d_Vec4 (0.0f, 0.0f, 1.0f, 0.0f));
+ break;
+ }
+ case Graphic3d_RenderingParams::Anaglyph_UserDefined:
+ {
+ aFilterL = theCView.RenderParams.AnaglyphLeft;
+ aFilterR = theCView.RenderParams.AnaglyphRight;
+ break;
+ }
+ }
+ myGlContext->ActiveProgram()->SetUniform (myGlContext, "uMultL", aFilterL);
+ myGlContext->ActiveProgram()->SetUniform (myGlContext, "uMultR", aFilterR);
+ }
+
aPair[0]->ColorTexture()->Bind (myGlContext, GL_TEXTURE0 + 0);
aPair[1]->ColorTexture()->Bind (myGlContext, GL_TEXTURE0 + 1);
myFullScreenQuad.BindVertexAttrib (myGlContext, 0);
return;
}
+ if (mySwapInterval != myGlContext->caps->swapInterval)
+ {
+ mySwapInterval = myGlContext->caps->swapInterval;
+ myGlContext->SetSwapInterval (mySwapInterval);
+ }
+
++myFrameCounter;
myIsCullingEnabled = theCView.IsCullingEnabled;
+ const Graphic3d_StereoMode aStereoMode = theCView.RenderParams.StereoMode;
+ const Handle(Graphic3d_Camera)& aCamera = myView->Camera();
+ Graphic3d_Camera::Projection aProjectType = aCamera->ProjectionType();
// release pending GL resources
myGlContext->ReleaseDelayed();
}
if (myHasFboBlit
- && myTransientDrawToFront)
+ && (myTransientDrawToFront || aProjectType == Graphic3d_Camera::Projection_Stereo))
{
if (myMainSceneFbos[0]->GetVPSizeX() != aSizeX
|| myMainSceneFbos[0]->GetVPSizeY() != aSizeY)
myImmediateSceneFbos[1]->ChangeViewport (0, 0);
}
- // draw entire frame using normal OpenGL pipeline
- const Handle(Graphic3d_Camera)& aCamera = myView->Camera();
- Graphic3d_Camera::Projection aProjectType = aCamera->ProjectionType();
- if (aProjectType == Graphic3d_Camera::Projection_Stereo)
+ if (aProjectType == Graphic3d_Camera::Projection_Stereo
+ && myMainSceneFbos[0]->IsValid())
{
- if (aFrameBuffer != NULL
- || !myGlContext->IsRender())
+ myMainSceneFbos[1]->InitLazy (myGlContext, aSizeX, aSizeY);
+ if (!myMainSceneFbos[1]->IsValid())
{
- // implicitly switch to mono camera for image dump
+ // no enough memory?
aProjectType = Graphic3d_Camera::Projection_Perspective;
}
- else if (myMainSceneFbos[0]->IsValid())
+ else if (!myTransientDrawToFront)
+ {
+ //
+ }
+ else if (!myGlContext->HasStereoBuffers()
+ || aStereoMode != Graphic3d_StereoMode_QuadBuffer)
{
- myMainSceneFbos[1]->InitLazy (myGlContext, aSizeX, aSizeY);
- if (!myMainSceneFbos[1]->IsValid())
+ myImmediateSceneFbos[0]->InitLazy (myGlContext, aSizeX, aSizeY);
+ myImmediateSceneFbos[1]->InitLazy (myGlContext, aSizeX, aSizeY);
+ if (!myImmediateSceneFbos[0]->IsValid()
+ || !myImmediateSceneFbos[1]->IsValid())
{
- // no enough memory?
aProjectType = Graphic3d_Camera::Projection_Perspective;
}
- else if (!myGlContext->HasStereoBuffers())
- {
- myImmediateSceneFbos[0]->InitLazy (myGlContext, aSizeX, aSizeY);
- myImmediateSceneFbos[1]->InitLazy (myGlContext, aSizeX, aSizeY);
- if (!myImmediateSceneFbos[0]->IsValid()
- || !myImmediateSceneFbos[1]->IsValid())
- {
- aProjectType = Graphic3d_Camera::Projection_Perspective;
- }
- }
}
}
myImmediateSceneFbos[1]->IsValid() ? myImmediateSceneFbos[1].operator->() : NULL
};
+ if (!myTransientDrawToFront)
+ {
+ anImmFbos[0] = aMainFbos[0];
+ anImmFbos[1] = aMainFbos[1];
+ }
+ else if (aStereoMode == Graphic3d_StereoMode_SoftPageFlip
+ || aStereoMode == Graphic3d_StereoMode_QuadBuffer)
+ {
+ anImmFbos[0] = NULL;
+ anImmFbos[1] = NULL;
+ }
+
#if !defined(GL_ES_VERSION_2_0)
- myGlContext->SetReadDrawBuffer (GL_BACK_LEFT);
+ myGlContext->SetReadDrawBuffer (aStereoMode == Graphic3d_StereoMode_QuadBuffer ? GL_BACK_LEFT : GL_BACK);
#endif
redraw1 (theCView, theCUnderLayer, theCOverLayer,
aMainFbos[0], Graphic3d_Camera::Projection_MonoLeftEye);
myBackBufferRestored = Standard_True;
myIsImmediateDrawn = Standard_False;
#if !defined(GL_ES_VERSION_2_0)
- myGlContext->SetReadDrawBuffer (GL_BACK_LEFT);
+ myGlContext->SetReadDrawBuffer (aStereoMode == Graphic3d_StereoMode_QuadBuffer ? GL_BACK_LEFT : GL_BACK);
#endif
if (!redrawImmediate (theCView, theCOverLayer, theCUnderLayer, aMainFbos[0], aProjectType, anImmFbos[0]))
{
toSwap = false;
}
+ else if (aStereoMode == Graphic3d_StereoMode_SoftPageFlip
+ && toSwap)
+ {
+ myGlContext->SwapBuffers();
+ }
#if !defined(GL_ES_VERSION_2_0)
- myGlContext->SetReadDrawBuffer (GL_BACK_RIGHT);
+ myGlContext->SetReadDrawBuffer (aStereoMode == Graphic3d_StereoMode_QuadBuffer ? GL_BACK_RIGHT : GL_BACK);
#endif
redraw1 (theCView, theCUnderLayer, theCOverLayer,
aMainFbos[1], Graphic3d_Camera::Projection_MonoRightEye);
if (anImmFbos[0] != NULL)
{
bindDefaultFbo (aFrameBuffer);
- drawStereoPair();
+ drawStereoPair (theCView);
}
}
else
// request reset of material
NamedStatus |= OPENGL_NS_RESMAT;
- GLbitfield toClear = GL_COLOR_BUFFER_BIT;
- if (myUseZBuffer)
- {
- glDepthFunc (GL_LEQUAL);
- glDepthMask (GL_TRUE);
- if (myUseDepthTest)
- {
- glEnable (GL_DEPTH_TEST);
- }
- else
- {
- glDisable (GL_DEPTH_TEST);
- }
+ myUseZBuffer = Standard_True;
+ myUseDepthWrite = Standard_True;
+ GLbitfield toClear = GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT;
+ glDepthFunc (GL_LEQUAL);
+ glDepthMask (GL_TRUE);
+ glEnable (GL_DEPTH_TEST);
- #if !defined(GL_ES_VERSION_2_0)
- glClearDepth (1.0);
- #else
- glClearDepthf (1.0f);
- #endif
- toClear |= GL_DEPTH_BUFFER_BIT;
- }
- else
- {
- glDisable (GL_DEPTH_TEST);
- }
+#if !defined(GL_ES_VERSION_2_0)
+ glClearDepth (1.0);
+#else
+ glClearDepthf (1.0f);
+#endif
if (NamedStatus & OPENGL_NS_WHITEBACK)
{
// set background to white
glClearColor (1.0f, 1.0f, 1.0f, 1.0f);
- toClear |= GL_DEPTH_BUFFER_BIT;
}
else
{
aFrameBuffer = myGlContext->DefaultFrameBuffer().operator->();
}
+ const Graphic3d_StereoMode aStereoMode = theCView.RenderParams.StereoMode;
if (aProjectType == Graphic3d_Camera::Projection_Stereo)
{
if (aFrameBuffer != NULL)
myImmediateSceneFbos[0]->IsValid() ? myImmediateSceneFbos[0].operator->() : NULL,
myImmediateSceneFbos[1]->IsValid() ? myImmediateSceneFbos[1].operator->() : NULL
};
+ if (aStereoMode == Graphic3d_StereoMode_SoftPageFlip
+ || aStereoMode == Graphic3d_StereoMode_QuadBuffer)
+ {
+ anImmFbos[0] = NULL;
+ anImmFbos[1] = NULL;
+ }
if (myGlContext->arbFBO != NULL)
{
#if !defined(GL_ES_VERSION_2_0)
if (anImmFbos[0] == NULL)
{
- myGlContext->SetReadDrawBuffer (GL_BACK_LEFT);
+ myGlContext->SetReadDrawBuffer (aStereoMode == Graphic3d_StereoMode_QuadBuffer ? GL_BACK_LEFT : GL_BACK);
}
#endif
toSwap = redrawImmediate (theCView, theCUnderLayer, theCOverLayer,
Graphic3d_Camera::Projection_MonoLeftEye,
anImmFbos[0],
Standard_True) || toSwap;
+ if (aStereoMode == Graphic3d_StereoMode_SoftPageFlip
+ && toSwap
+ && !myGlContext->caps->buffersNoSwap)
+ {
+ myGlContext->SwapBuffers();
+ }
if (myGlContext->arbFBO != NULL)
{
#if !defined(GL_ES_VERSION_2_0)
if (anImmFbos[1] == NULL)
{
- myGlContext->SetReadDrawBuffer (GL_BACK_RIGHT);
+ myGlContext->SetReadDrawBuffer (aStereoMode == Graphic3d_StereoMode_QuadBuffer ? GL_BACK_RIGHT : GL_BACK);
}
#endif
toSwap = redrawImmediate (theCView, theCUnderLayer, theCOverLayer,
if (anImmFbos[0] != NULL)
{
bindDefaultFbo (aFrameBuffer);
- drawStereoPair();
+ drawStereoPair (theCView);
}
}
else
Handle(OpenGl_Workspace) aWS (this);
- if (myUseZBuffer)
- {
- glDepthFunc (GL_LEQUAL);
- glDepthMask (GL_TRUE);
- if (myUseDepthTest)
- {
- glEnable (GL_DEPTH_TEST);
- }
- else
- {
- glDisable (GL_DEPTH_TEST);
- }
-
- #if !defined(GL_ES_VERSION_2_0)
- glClearDepth (1.0);
- #else
- glClearDepthf (1.0f);
- #endif
- }
- else
- {
- glDisable (GL_DEPTH_TEST);
- }
+ myUseZBuffer = Standard_True;
+ myUseDepthWrite = Standard_True;
+ glDepthFunc (GL_LEQUAL);
+ glDepthMask (GL_TRUE);
+ glEnable (GL_DEPTH_TEST);
+#if !defined(GL_ES_VERSION_2_0)
+ glClearDepth (1.0);
+#else
+ glClearDepthf (1.0f);
+#endif
myView->Render (myPrintContext, aWS, theDrawFbo, theProjection,
theCView, theCUnderLayer, theCOverLayer, Standard_True);
if (!myView->ImmediateStructures().IsEmpty())
{
+ myUseZBuffer = Standard_False;
glDisable (GL_DEPTH_TEST);
}
- for (OpenGl_SequenceOfStructure::Iterator anIter (myView->ImmediateStructures());
- anIter.More(); anIter.Next())
+ for (OpenGl_IndexedMapOfStructure::Iterator anIter (myView->ImmediateStructures()); anIter.More(); anIter.Next())
{
const OpenGl_Structure* aStructure = anIter.Value();
if (!aStructure->IsVisible())
return !toCopyBackToFront;
}
-IMPLEMENT_STANDARD_HANDLE (OpenGl_RaytraceFilter, OpenGl_RenderFilter)
-IMPLEMENT_STANDARD_RTTIEXT(OpenGl_RaytraceFilter, OpenGl_RenderFilter)
// =======================================================================
// function : CanRender