mirror of
https://git.dev.opencascade.org/repos/occt.git
synced 2025-04-07 18:30:55 +03:00
0032780: Visualization, TKOpenGl - add smoothing to row interlaced stereoscopic output
Added new option Graphic3d_RenderingParams::ToSmoothInterlacing enabled by default. Added -smooth option to vstereo command. Added -dpiAware option to vinit command (Windows).
This commit is contained in:
parent
ddb9ed4810
commit
2275caec09
@ -146,6 +146,7 @@ public:
|
|||||||
HmdFov2d (30.0f),
|
HmdFov2d (30.0f),
|
||||||
AnaglyphFilter (Anaglyph_RedCyan_Optimized),
|
AnaglyphFilter (Anaglyph_RedCyan_Optimized),
|
||||||
ToReverseStereo (Standard_False),
|
ToReverseStereo (Standard_False),
|
||||||
|
ToSmoothInterlacing (Standard_True),
|
||||||
ToMirrorComposer (Standard_True),
|
ToMirrorComposer (Standard_True),
|
||||||
//
|
//
|
||||||
StatsPosition (new Graphic3d_TransformPers (Graphic3d_TMF_2d, Aspect_TOTP_LEFT_UPPER, Graphic3d_Vec2i (20, 20))),
|
StatsPosition (new Graphic3d_TransformPers (Graphic3d_TMF_2d, Aspect_TOTP_LEFT_UPPER, Graphic3d_Vec2i (20, 20))),
|
||||||
@ -260,6 +261,7 @@ public: //! @name VR / stereoscopic parameters
|
|||||||
Graphic3d_Mat4 AnaglyphLeft; //!< left anaglyph filter (in normalized colorspace), Color = AnaglyphRight * theColorRight + AnaglyphLeft * theColorLeft;
|
Graphic3d_Mat4 AnaglyphLeft; //!< left anaglyph filter (in normalized colorspace), Color = AnaglyphRight * theColorRight + AnaglyphLeft * theColorLeft;
|
||||||
Graphic3d_Mat4 AnaglyphRight; //!< right anaglyph filter (in normalized colorspace), Color = AnaglyphRight * theColorRight + AnaglyphLeft * theColorLeft;
|
Graphic3d_Mat4 AnaglyphRight; //!< right anaglyph filter (in normalized colorspace), Color = AnaglyphRight * theColorRight + AnaglyphLeft * theColorLeft;
|
||||||
Standard_Boolean ToReverseStereo; //!< flag to reverse stereo pair, FALSE by default
|
Standard_Boolean ToReverseStereo; //!< flag to reverse stereo pair, FALSE by default
|
||||||
|
Standard_Boolean ToSmoothInterlacing; //!< flag to smooth output on interlaced displays (improves text readability / reduces line aliasing), TRUE by default
|
||||||
Standard_Boolean ToMirrorComposer; //!< if output device is an external composer - mirror rendering results in window in addition to sending frame to composer, TRUE by default
|
Standard_Boolean ToMirrorComposer; //!< if output device is an external composer - mirror rendering results in window in addition to sending frame to composer, TRUE by default
|
||||||
|
|
||||||
public: //! @name on-screen display parameters
|
public: //! @name on-screen display parameters
|
||||||
|
@ -1800,11 +1800,14 @@ Handle(Graphic3d_ShaderProgram) Graphic3d_ShaderManager::getStdProgramStereo (Gr
|
|||||||
case Graphic3d_StereoMode_RowInterlaced:
|
case Graphic3d_StereoMode_RowInterlaced:
|
||||||
{
|
{
|
||||||
aName = "row-interlaced";
|
aName = "row-interlaced";
|
||||||
|
aUniforms.Append (Graphic3d_ShaderObject::ShaderVariable ("vec2 uTexOffset", Graphic3d_TOS_FRAGMENT));
|
||||||
aSrcFrag =
|
aSrcFrag =
|
||||||
EOL"void main()"
|
EOL"void main()"
|
||||||
EOL"{"
|
EOL"{"
|
||||||
EOL" vec4 aColorL = occTexture2D (uLeftSampler, TexCoord);"
|
EOL" vec2 aTexCoordL = TexCoord - uTexOffset;"
|
||||||
EOL" vec4 aColorR = occTexture2D (uRightSampler, TexCoord);"
|
EOL" vec2 aTexCoordR = TexCoord + uTexOffset;"
|
||||||
|
EOL" vec4 aColorL = occTexture2D (uLeftSampler, aTexCoordL);"
|
||||||
|
EOL" vec4 aColorR = occTexture2D (uRightSampler, aTexCoordR);"
|
||||||
EOL" if (int (mod (gl_FragCoord.y - 1023.5, 2.0)) != 1)"
|
EOL" if (int (mod (gl_FragCoord.y - 1023.5, 2.0)) != 1)"
|
||||||
EOL" {"
|
EOL" {"
|
||||||
EOL" occSetFragColor (aColorL);"
|
EOL" occSetFragColor (aColorL);"
|
||||||
@ -1819,11 +1822,14 @@ Handle(Graphic3d_ShaderProgram) Graphic3d_ShaderManager::getStdProgramStereo (Gr
|
|||||||
case Graphic3d_StereoMode_ColumnInterlaced:
|
case Graphic3d_StereoMode_ColumnInterlaced:
|
||||||
{
|
{
|
||||||
aName = "column-interlaced";
|
aName = "column-interlaced";
|
||||||
|
aUniforms.Append (Graphic3d_ShaderObject::ShaderVariable ("vec2 uTexOffset", Graphic3d_TOS_FRAGMENT));
|
||||||
aSrcFrag =
|
aSrcFrag =
|
||||||
EOL"void main()"
|
EOL"void main()"
|
||||||
EOL"{"
|
EOL"{"
|
||||||
EOL" vec4 aColorL = occTexture2D (uLeftSampler, TexCoord);"
|
EOL" vec2 aTexCoordL = TexCoord - uTexOffset;"
|
||||||
EOL" vec4 aColorR = occTexture2D (uRightSampler, TexCoord);"
|
EOL" vec2 aTexCoordR = TexCoord + uTexOffset;"
|
||||||
|
EOL" vec4 aColorL = occTexture2D (uLeftSampler, aTexCoordL);"
|
||||||
|
EOL" vec4 aColorR = occTexture2D (uRightSampler, aTexCoordR);"
|
||||||
EOL" if (int (mod (gl_FragCoord.x - 1023.5, 2.0)) == 1)"
|
EOL" if (int (mod (gl_FragCoord.x - 1023.5, 2.0)) == 1)"
|
||||||
EOL" {"
|
EOL" {"
|
||||||
EOL" occSetFragColor (aColorL);"
|
EOL" occSetFragColor (aColorL);"
|
||||||
@ -1838,11 +1844,14 @@ Handle(Graphic3d_ShaderProgram) Graphic3d_ShaderManager::getStdProgramStereo (Gr
|
|||||||
case Graphic3d_StereoMode_ChessBoard:
|
case Graphic3d_StereoMode_ChessBoard:
|
||||||
{
|
{
|
||||||
aName = "chessboard";
|
aName = "chessboard";
|
||||||
|
aUniforms.Append (Graphic3d_ShaderObject::ShaderVariable ("vec2 uTexOffset", Graphic3d_TOS_FRAGMENT));
|
||||||
aSrcFrag =
|
aSrcFrag =
|
||||||
EOL"void main()"
|
EOL"void main()"
|
||||||
EOL"{"
|
EOL"{"
|
||||||
EOL" vec4 aColorL = occTexture2D (uLeftSampler, TexCoord);"
|
EOL" vec2 aTexCoordL = TexCoord - uTexOffset;"
|
||||||
EOL" vec4 aColorR = occTexture2D (uRightSampler, TexCoord);"
|
EOL" vec2 aTexCoordR = TexCoord + uTexOffset;"
|
||||||
|
EOL" vec4 aColorL = occTexture2D (uLeftSampler, aTexCoordL);"
|
||||||
|
EOL" vec4 aColorR = occTexture2D (uRightSampler, aTexCoordR);"
|
||||||
EOL" bool isEvenX = int(mod(floor(gl_FragCoord.x - 1023.5), 2.0)) != 1;"
|
EOL" bool isEvenX = int(mod(floor(gl_FragCoord.x - 1023.5), 2.0)) != 1;"
|
||||||
EOL" bool isEvenY = int(mod(floor(gl_FragCoord.y - 1023.5), 2.0)) == 1;"
|
EOL" bool isEvenY = int(mod(floor(gl_FragCoord.y - 1023.5), 2.0)) == 1;"
|
||||||
EOL" if ((isEvenX && isEvenY) || (!isEvenX && !isEvenY))"
|
EOL" if ((isEvenX && isEvenY) || (!isEvenX && !isEvenY))"
|
||||||
|
@ -28,7 +28,7 @@ enum Graphic3d_StereoMode
|
|||||||
Graphic3d_StereoMode_OverUnder, //!< vertical pair
|
Graphic3d_StereoMode_OverUnder, //!< vertical pair
|
||||||
Graphic3d_StereoMode_SoftPageFlip, //!< software PageFlip for shutter glasses, should NOT be used!
|
Graphic3d_StereoMode_SoftPageFlip, //!< software PageFlip for shutter glasses, should NOT be used!
|
||||||
Graphic3d_StereoMode_OpenVR, //!< OpenVR (HMD)
|
Graphic3d_StereoMode_OpenVR, //!< OpenVR (HMD)
|
||||||
Graphic3d_StereoMode_NB //!< the number of modes
|
|
||||||
};
|
};
|
||||||
|
enum { Graphic3d_StereoMode_NB = Graphic3d_StereoMode_OpenVR + 1 };
|
||||||
|
|
||||||
#endif // _Graphic3d_StereoMode_HeaderFile
|
#endif // _Graphic3d_StereoMode_HeaderFile
|
||||||
|
@ -1249,7 +1249,7 @@ Standard_Boolean OpenGl_ShaderManager::prepareStdProgramPhong (Handle(OpenGl_Sha
|
|||||||
// =======================================================================
|
// =======================================================================
|
||||||
Standard_Boolean OpenGl_ShaderManager::BindStereoProgram (Graphic3d_StereoMode theStereoMode)
|
Standard_Boolean OpenGl_ShaderManager::BindStereoProgram (Graphic3d_StereoMode theStereoMode)
|
||||||
{
|
{
|
||||||
if (theStereoMode < 0 || theStereoMode >= Graphic3d_StereoMode_NB)
|
if (theStereoMode < 0 || (int )theStereoMode >= Graphic3d_StereoMode_NB)
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -1271,6 +1271,7 @@ Standard_Boolean OpenGl_ShaderManager::BindStereoProgram (Graphic3d_StereoMode t
|
|||||||
myContext->BindProgram (aProgram);
|
myContext->BindProgram (aProgram);
|
||||||
aProgram->SetSampler (myContext, "uLeftSampler", Graphic3d_TextureUnit_0);
|
aProgram->SetSampler (myContext, "uLeftSampler", Graphic3d_TextureUnit_0);
|
||||||
aProgram->SetSampler (myContext, "uRightSampler", Graphic3d_TextureUnit_1);
|
aProgram->SetSampler (myContext, "uRightSampler", Graphic3d_TextureUnit_1);
|
||||||
|
aProgram->SetUniform (myContext, "uTexOffset", Graphic3d_Vec2(0.0f));
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -175,6 +175,8 @@ OpenGl_View::OpenGl_View (const Handle(Graphic3d_StructureManager)& theMgr,
|
|||||||
myRaytraceFBO2[1] = new OpenGl_FrameBuffer ("fbo1_raytrace2");
|
myRaytraceFBO2[1] = new OpenGl_FrameBuffer ("fbo1_raytrace2");
|
||||||
myDepthPeelingFbos = new OpenGl_DepthPeeling();
|
myDepthPeelingFbos = new OpenGl_DepthPeeling();
|
||||||
myShadowMaps = new OpenGl_ShadowMapArray();
|
myShadowMaps = new OpenGl_ShadowMapArray();
|
||||||
|
|
||||||
|
myXrSceneFbo->ColorTexture()->Sampler()->Parameters()->SetFilter (Graphic3d_TOTF_BILINEAR);
|
||||||
}
|
}
|
||||||
|
|
||||||
// =======================================================================
|
// =======================================================================
|
||||||
@ -2862,10 +2864,7 @@ void OpenGl_View::drawStereoPair (OpenGl_FrameBuffer* theDrawFbo)
|
|||||||
if (!myOpenGlFBO ->InitLazy (aCtx, aPair[0]->GetVPSize(), myFboColorFormat, myFboDepthFormat, 0)
|
if (!myOpenGlFBO ->InitLazy (aCtx, aPair[0]->GetVPSize(), myFboColorFormat, myFboDepthFormat, 0)
|
||||||
|| !myOpenGlFBO2->InitLazy (aCtx, aPair[0]->GetVPSize(), myFboColorFormat, 0, 0))
|
|| !myOpenGlFBO2->InitLazy (aCtx, aPair[0]->GetVPSize(), myFboColorFormat, 0, 0))
|
||||||
{
|
{
|
||||||
aCtx->PushMessage (GL_DEBUG_SOURCE_APPLICATION,
|
aCtx->PushMessage (GL_DEBUG_SOURCE_APPLICATION, GL_DEBUG_TYPE_ERROR, 0, GL_DEBUG_SEVERITY_HIGH,
|
||||||
GL_DEBUG_TYPE_ERROR,
|
|
||||||
0,
|
|
||||||
GL_DEBUG_SEVERITY_HIGH,
|
|
||||||
"Error! Unable to allocate FBO for blitting stereo pair");
|
"Error! Unable to allocate FBO for blitting stereo pair");
|
||||||
bindDefaultFbo (theDrawFbo);
|
bindDefaultFbo (theDrawFbo);
|
||||||
return;
|
return;
|
||||||
@ -2924,10 +2923,16 @@ void OpenGl_View::drawStereoPair (OpenGl_FrameBuffer* theDrawFbo)
|
|||||||
OpenGl_VertexBuffer* aVerts = initBlitQuad (myToFlipOutput);
|
OpenGl_VertexBuffer* aVerts = initBlitQuad (myToFlipOutput);
|
||||||
|
|
||||||
const Handle(OpenGl_ShaderManager)& aManager = aCtx->ShaderManager();
|
const Handle(OpenGl_ShaderManager)& aManager = aCtx->ShaderManager();
|
||||||
if (aVerts->IsValid()
|
if (!aVerts->IsValid()
|
||||||
&& aManager->BindStereoProgram (myRenderParams.StereoMode))
|
|| !aManager->BindStereoProgram (myRenderParams.StereoMode))
|
||||||
{
|
{
|
||||||
if (myRenderParams.StereoMode == Graphic3d_StereoMode_Anaglyph)
|
aCtx->PushMessage (GL_DEBUG_SOURCE_APPLICATION, GL_DEBUG_TYPE_ERROR, 0, GL_DEBUG_SEVERITY_HIGH, "Error! Anaglyph has failed");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (myRenderParams.StereoMode)
|
||||||
|
{
|
||||||
|
case Graphic3d_StereoMode_Anaglyph:
|
||||||
{
|
{
|
||||||
OpenGl_Mat4 aFilterL, aFilterR;
|
OpenGl_Mat4 aFilterL, aFilterR;
|
||||||
aFilterL.SetDiagonal (Graphic3d_Vec4 (0.0f, 0.0f, 0.0f, 0.0f));
|
aFilterL.SetDiagonal (Graphic3d_Vec4 (0.0f, 0.0f, 0.0f, 0.0f));
|
||||||
@ -2988,10 +2993,48 @@ void OpenGl_View::drawStereoPair (OpenGl_FrameBuffer* theDrawFbo)
|
|||||||
}
|
}
|
||||||
aCtx->ActiveProgram()->SetUniform (aCtx, "uMultL", aFilterL);
|
aCtx->ActiveProgram()->SetUniform (aCtx, "uMultL", aFilterL);
|
||||||
aCtx->ActiveProgram()->SetUniform (aCtx, "uMultR", aFilterR);
|
aCtx->ActiveProgram()->SetUniform (aCtx, "uMultR", aFilterR);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case Graphic3d_StereoMode_RowInterlaced:
|
||||||
|
{
|
||||||
|
Graphic3d_Vec2 aTexOffset = myRenderParams.ToSmoothInterlacing
|
||||||
|
? Graphic3d_Vec2 (0.0f, -0.5f / float(aPair[0]->GetSizeY()))
|
||||||
|
: Graphic3d_Vec2();
|
||||||
|
aCtx->ActiveProgram()->SetUniform (aCtx, "uTexOffset", aTexOffset);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case Graphic3d_StereoMode_ColumnInterlaced:
|
||||||
|
{
|
||||||
|
Graphic3d_Vec2 aTexOffset = myRenderParams.ToSmoothInterlacing
|
||||||
|
? Graphic3d_Vec2 (0.5f / float(aPair[0]->GetSizeX()), 0.0f)
|
||||||
|
: Graphic3d_Vec2();
|
||||||
|
aCtx->ActiveProgram()->SetUniform (aCtx, "uTexOffset", aTexOffset);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case Graphic3d_StereoMode_ChessBoard:
|
||||||
|
{
|
||||||
|
Graphic3d_Vec2 aTexOffset = myRenderParams.ToSmoothInterlacing
|
||||||
|
? Graphic3d_Vec2 (0.5f / float(aPair[0]->GetSizeX()),
|
||||||
|
-0.5f / float(aPair[0]->GetSizeY()))
|
||||||
|
: Graphic3d_Vec2();
|
||||||
|
aCtx->ActiveProgram()->SetUniform (aCtx, "uTexOffset", aTexOffset);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default: break;
|
||||||
}
|
}
|
||||||
|
|
||||||
aPair[0]->ColorTexture()->Bind (aCtx, Graphic3d_TextureUnit_0);
|
for (int anEyeIter = 0; anEyeIter < 2; ++anEyeIter)
|
||||||
aPair[1]->ColorTexture()->Bind (aCtx, Graphic3d_TextureUnit_1);
|
{
|
||||||
|
OpenGl_FrameBuffer* anEyeFbo = aPair[anEyeIter];
|
||||||
|
anEyeFbo->ColorTexture()->Bind (aCtx, (Graphic3d_TextureUnit )(Graphic3d_TextureUnit_0 + anEyeIter));
|
||||||
|
if (anEyeFbo->ColorTexture()->Sampler()->Parameters()->Filter() != Graphic3d_TOTF_BILINEAR)
|
||||||
|
{
|
||||||
|
// force filtering
|
||||||
|
anEyeFbo->ColorTexture()->Sampler()->Parameters()->SetFilter (Graphic3d_TOTF_BILINEAR);
|
||||||
|
aCtx->core20fwd->glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
|
||||||
|
aCtx->core20fwd->glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
|
||||||
|
}
|
||||||
|
}
|
||||||
aVerts->BindVertexAttrib (aCtx, 0);
|
aVerts->BindVertexAttrib (aCtx, 0);
|
||||||
|
|
||||||
aCtx->core20fwd->glDrawArrays (GL_TRIANGLE_STRIP, 0, 4);
|
aCtx->core20fwd->glDrawArrays (GL_TRIANGLE_STRIP, 0, 4);
|
||||||
@ -2999,17 +3042,6 @@ void OpenGl_View::drawStereoPair (OpenGl_FrameBuffer* theDrawFbo)
|
|||||||
aVerts->UnbindVertexAttrib (aCtx, 0);
|
aVerts->UnbindVertexAttrib (aCtx, 0);
|
||||||
aPair[1]->ColorTexture()->Unbind (aCtx, Graphic3d_TextureUnit_1);
|
aPair[1]->ColorTexture()->Unbind (aCtx, Graphic3d_TextureUnit_1);
|
||||||
aPair[0]->ColorTexture()->Unbind (aCtx, Graphic3d_TextureUnit_0);
|
aPair[0]->ColorTexture()->Unbind (aCtx, Graphic3d_TextureUnit_0);
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
TCollection_ExtendedString aMsg = TCollection_ExtendedString()
|
|
||||||
+ "Error! Anaglyph has failed";
|
|
||||||
aCtx->PushMessage (GL_DEBUG_SOURCE_APPLICATION,
|
|
||||||
GL_DEBUG_TYPE_ERROR,
|
|
||||||
0,
|
|
||||||
GL_DEBUG_SEVERITY_HIGH,
|
|
||||||
aMsg);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// =======================================================================
|
// =======================================================================
|
||||||
|
@ -957,7 +957,7 @@ static int VInit (Draw_Interpretor& theDi, Standard_Integer theArgsNb, const cha
|
|||||||
Standard_Boolean isVirtual = false;
|
Standard_Boolean isVirtual = false;
|
||||||
Handle(V3d_View) aCopyFrom;
|
Handle(V3d_View) aCopyFrom;
|
||||||
TCollection_AsciiString aName, aValue;
|
TCollection_AsciiString aName, aValue;
|
||||||
int is2dMode = -1;
|
int is2dMode = -1, aDpiAware = -1;
|
||||||
for (Standard_Integer anArgIt = 1; anArgIt < theArgsNb; ++anArgIt)
|
for (Standard_Integer anArgIt = 1; anArgIt < theArgsNb; ++anArgIt)
|
||||||
{
|
{
|
||||||
const TCollection_AsciiString anArg = theArgVec[anArgIt];
|
const TCollection_AsciiString anArg = theArgVec[anArgIt];
|
||||||
@ -1039,6 +1039,10 @@ static int VInit (Draw_Interpretor& theDi, Standard_Integer theArgsNb, const cha
|
|||||||
{
|
{
|
||||||
aDisplayName = theArgVec[++anArgIt];
|
aDisplayName = theArgVec[++anArgIt];
|
||||||
}
|
}
|
||||||
|
else if (anArgCase == "-dpiaware")
|
||||||
|
{
|
||||||
|
aDpiAware = Draw::ParseOnOffIterator (theArgsNb, theArgVec, anArgIt) ? 1 : 0;
|
||||||
|
}
|
||||||
else if (!ViewerTest::CurrentView().IsNull()
|
else if (!ViewerTest::CurrentView().IsNull()
|
||||||
&& aCopyFrom.IsNull()
|
&& aCopyFrom.IsNull()
|
||||||
&& (anArgCase == "-copy"
|
&& (anArgCase == "-copy"
|
||||||
@ -1098,12 +1102,44 @@ static int VInit (Draw_Interpretor& theDi, Standard_Integer theArgsNb, const cha
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if defined(_WIN32)
|
||||||
|
if (aDpiAware != -1)
|
||||||
|
{
|
||||||
|
typedef void* (WINAPI *SetThreadDpiAwarenessContext_t)(void*);
|
||||||
|
if (HMODULE aUser32Module = GetModuleHandleW (L"User32"))
|
||||||
|
{
|
||||||
|
SetThreadDpiAwarenessContext_t aSetDpiAware = (SetThreadDpiAwarenessContext_t )GetProcAddress (aUser32Module, "SetThreadDpiAwarenessContext");
|
||||||
|
if (aDpiAware == 1)
|
||||||
|
{
|
||||||
|
// DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2
|
||||||
|
if (aSetDpiAware ((void* )-4) == NULL)
|
||||||
|
{
|
||||||
|
// DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE for older systems
|
||||||
|
if (aSetDpiAware ((void* )-3) == NULL)
|
||||||
|
{
|
||||||
|
Message::SendFail() << "Error: unable to enable DPI awareness";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// DPI_AWARENESS_CONTEXT_UNAWARE
|
||||||
|
if (aSetDpiAware ((void* )-1) == NULL)
|
||||||
|
{
|
||||||
|
Message::SendFail() << "Error: unable to disable DPI awareness";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
(void )aDpiAware;
|
||||||
#if !defined(HAVE_XLIB)
|
#if !defined(HAVE_XLIB)
|
||||||
if (!aDisplayName.IsEmpty())
|
if (!aDisplayName.IsEmpty())
|
||||||
{
|
{
|
||||||
aDisplayName.Clear();
|
aDisplayName.Clear();
|
||||||
Message::SendWarning() << "Warning: display parameter will be ignored.\n";
|
Message::SendWarning() << "Warning: display parameter will be ignored.\n";
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
ViewerTest_Names aViewNames (aViewName);
|
ViewerTest_Names aViewNames (aViewName);
|
||||||
@ -9373,15 +9409,60 @@ static int VStereo (Draw_Interpretor& theDI,
|
|||||||
TCollection_AsciiString aMode;
|
TCollection_AsciiString aMode;
|
||||||
switch (aView->RenderingParams().StereoMode)
|
switch (aView->RenderingParams().StereoMode)
|
||||||
{
|
{
|
||||||
case Graphic3d_StereoMode_QuadBuffer : aMode = "quadBuffer"; break;
|
case Graphic3d_StereoMode_QuadBuffer:
|
||||||
case Graphic3d_StereoMode_RowInterlaced : aMode = "rowInterlaced"; break;
|
{
|
||||||
case Graphic3d_StereoMode_ColumnInterlaced : aMode = "columnInterlaced"; break;
|
aMode = "quadBuffer";
|
||||||
case Graphic3d_StereoMode_ChessBoard : aMode = "chessBoard"; break;
|
break;
|
||||||
case Graphic3d_StereoMode_SideBySide : aMode = "sideBySide"; break;
|
}
|
||||||
case Graphic3d_StereoMode_OverUnder : aMode = "overUnder"; break;
|
case Graphic3d_StereoMode_RowInterlaced:
|
||||||
case Graphic3d_StereoMode_SoftPageFlip : aMode = "softpageflip"; break;
|
{
|
||||||
case Graphic3d_StereoMode_OpenVR : aMode = "openVR"; break;
|
aMode = "rowInterlaced";
|
||||||
case Graphic3d_StereoMode_Anaglyph :
|
if (aView->RenderingParams().ToSmoothInterlacing)
|
||||||
|
{
|
||||||
|
aMode.AssignCat (" (smoothed)");
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case Graphic3d_StereoMode_ColumnInterlaced:
|
||||||
|
{
|
||||||
|
aMode = "columnInterlaced";
|
||||||
|
if (aView->RenderingParams().ToSmoothInterlacing)
|
||||||
|
{
|
||||||
|
aMode.AssignCat (" (smoothed)");
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case Graphic3d_StereoMode_ChessBoard:
|
||||||
|
{
|
||||||
|
aMode = "chessBoard";
|
||||||
|
if (aView->RenderingParams().ToSmoothInterlacing)
|
||||||
|
{
|
||||||
|
aMode.AssignCat (" (smoothed)");
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case Graphic3d_StereoMode_SideBySide:
|
||||||
|
{
|
||||||
|
aMode = "sideBySide";
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case Graphic3d_StereoMode_OverUnder:
|
||||||
|
{
|
||||||
|
aMode = "overUnder";
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case Graphic3d_StereoMode_SoftPageFlip:
|
||||||
|
{
|
||||||
|
aMode = "softPageFlip";
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case Graphic3d_StereoMode_OpenVR:
|
||||||
|
{
|
||||||
|
aMode = "openVR";
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case Graphic3d_StereoMode_Anaglyph:
|
||||||
|
{
|
||||||
aMode = "anaglyph";
|
aMode = "anaglyph";
|
||||||
switch (aView->RenderingParams().AnaglyphFilter)
|
switch (aView->RenderingParams().AnaglyphFilter)
|
||||||
{
|
{
|
||||||
@ -9390,9 +9471,9 @@ static int VStereo (Draw_Interpretor& theDI,
|
|||||||
case Graphic3d_RenderingParams::Anaglyph_YellowBlue_Simple : aMode.AssignCat (" (yellowBlueSimple)"); break;
|
case Graphic3d_RenderingParams::Anaglyph_YellowBlue_Simple : aMode.AssignCat (" (yellowBlueSimple)"); break;
|
||||||
case Graphic3d_RenderingParams::Anaglyph_YellowBlue_Optimized: aMode.AssignCat (" (yellowBlue)"); break;
|
case Graphic3d_RenderingParams::Anaglyph_YellowBlue_Optimized: aMode.AssignCat (" (yellowBlue)"); break;
|
||||||
case Graphic3d_RenderingParams::Anaglyph_GreenMagenta_Simple : aMode.AssignCat (" (greenMagentaSimple)"); break;
|
case Graphic3d_RenderingParams::Anaglyph_GreenMagenta_Simple : aMode.AssignCat (" (greenMagentaSimple)"); break;
|
||||||
default: break;
|
case Graphic3d_RenderingParams::Anaglyph_UserDefined : aMode.AssignCat (" (userDefined)"); break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
default: break;
|
|
||||||
}
|
}
|
||||||
theDI << "Mode " << aMode << "\n";
|
theDI << "Mode " << aMode << "\n";
|
||||||
}
|
}
|
||||||
@ -9441,27 +9522,12 @@ static int VStereo (Draw_Interpretor& theDI,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (aFlag == "-reverse"
|
else if (aFlag == "-reverse"
|
||||||
|
|| aFlag == "-noreverse"
|
||||||
|| aFlag == "-reversed"
|
|| aFlag == "-reversed"
|
||||||
|| aFlag == "-swap")
|
|| aFlag == "-swap"
|
||||||
{
|
|
||||||
Standard_Boolean toEnable = Standard_True;
|
|
||||||
if (++anArgIter < theArgNb
|
|
||||||
&& !Draw::ParseOnOff (theArgVec[anArgIter], toEnable))
|
|
||||||
{
|
|
||||||
--anArgIter;
|
|
||||||
}
|
|
||||||
aParams->ToReverseStereo = toEnable;
|
|
||||||
}
|
|
||||||
else if (aFlag == "-noreverse"
|
|
||||||
|| aFlag == "-noswap")
|
|| aFlag == "-noswap")
|
||||||
{
|
{
|
||||||
Standard_Boolean toDisable = Standard_True;
|
aParams->ToReverseStereo = Draw::ParseOnOffNoIterator (theArgNb, theArgVec, anArgIter);
|
||||||
if (++anArgIter < theArgNb
|
|
||||||
&& !Draw::ParseOnOff (theArgVec[anArgIter], toDisable))
|
|
||||||
{
|
|
||||||
--anArgIter;
|
|
||||||
}
|
|
||||||
aParams->ToReverseStereo = !toDisable;
|
|
||||||
}
|
}
|
||||||
else if (aFlag == "-mode"
|
else if (aFlag == "-mode"
|
||||||
|| aFlag == "-stereomode")
|
|| aFlag == "-stereomode")
|
||||||
@ -9513,13 +9579,14 @@ static int VStereo (Draw_Interpretor& theDI,
|
|||||||
else if (aFlag == "-mirror"
|
else if (aFlag == "-mirror"
|
||||||
|| aFlag == "-mirrorcomposer")
|
|| aFlag == "-mirrorcomposer")
|
||||||
{
|
{
|
||||||
Standard_Boolean toEnable = Standard_True;
|
aParams->ToMirrorComposer = Draw::ParseOnOffNoIterator (theArgNb, theArgVec, anArgIter);;
|
||||||
if (++anArgIter < theArgNb
|
|
||||||
&& !Draw::ParseOnOff (theArgVec[anArgIter], toEnable))
|
|
||||||
{
|
|
||||||
--anArgIter;
|
|
||||||
}
|
}
|
||||||
aParams->ToMirrorComposer = toEnable;
|
else if (aFlag == "-smooth"
|
||||||
|
|| aFlag == "-nosmooth"
|
||||||
|
|| aFlag == "-smoothinterlacing"
|
||||||
|
|| aFlag == "-nosmoothinterlacing")
|
||||||
|
{
|
||||||
|
aParams->ToSmoothInterlacing = Draw::ParseOnOffNoIterator (theArgNb, theArgVec, anArgIter);
|
||||||
}
|
}
|
||||||
else if (anArgIter + 1 < theArgNb
|
else if (anArgIter + 1 < theArgNb
|
||||||
&& (aFlag == "-unitfactor"
|
&& (aFlag == "-unitfactor"
|
||||||
@ -13735,7 +13802,7 @@ Makes specified driver active when ActiveName argument is specified.
|
|||||||
addCmd ("vinit", VInit, /* [vinit] */ R"(
|
addCmd ("vinit", VInit, /* [vinit] */ R"(
|
||||||
vinit [-name viewName] [-left leftPx] [-top topPx] [-width widthPx] [-height heightPx]
|
vinit [-name viewName] [-left leftPx] [-top topPx] [-width widthPx] [-height heightPx]
|
||||||
[-exitOnClose] [-closeOnEscape] [-cloneActive] [-virtual {on|off}=off] [-2d_mode {on|off}=off]
|
[-exitOnClose] [-closeOnEscape] [-cloneActive] [-virtual {on|off}=off] [-2d_mode {on|off}=off]
|
||||||
[-display displayName]
|
[-display displayName] [-dpiAware {on|off}]
|
||||||
Creates new View window with specified name viewName.
|
Creates new View window with specified name viewName.
|
||||||
By default the new view is created in the viewer and in graphic driver shared with active view.
|
By default the new view is created in the viewer and in graphic driver shared with active view.
|
||||||
-name {driverName/viewerName/viewName | viewerName/viewName | viewName}
|
-name {driverName/viewerName/viewName | viewerName/viewName | viewName}
|
||||||
@ -13751,6 +13818,7 @@ Display name will be used within creation of graphic driver, when specified.
|
|||||||
-closeOnEscape when specified, view will be closed on pressing Escape.
|
-closeOnEscape when specified, view will be closed on pressing Escape.
|
||||||
-virtual create an offscreen window within interactive session
|
-virtual create an offscreen window within interactive session
|
||||||
-2d_mode when on, view will not react on rotate scene events
|
-2d_mode when on, view will not react on rotate scene events
|
||||||
|
-dpiAware override dpi aware hint (Windows platform)
|
||||||
Additional commands for operations with views: vclose, vactivate, vviewlist.
|
Additional commands for operations with views: vclose, vactivate, vviewlist.
|
||||||
)" /* [vinit] */);
|
)" /* [vinit] */);
|
||||||
|
|
||||||
@ -14061,7 +14129,7 @@ vfps [framesNb=100] [-duration seconds] : estimate average frame rate for active
|
|||||||
addCmd ("vstereo", VStereo, /* [vstereo] */ R"(
|
addCmd ("vstereo", VStereo, /* [vstereo] */ R"(
|
||||||
vstereo [0|1] [-mode Mode] [-reverse {0|1}]
|
vstereo [0|1] [-mode Mode] [-reverse {0|1}]
|
||||||
[-mirrorComposer] [-hmdfov2d AngleDegrees] [-unitFactor MetersFactor]
|
[-mirrorComposer] [-hmdfov2d AngleDegrees] [-unitFactor MetersFactor]
|
||||||
[-anaglyph Filter]
|
[-anaglyph Filter] [-smoothInterlacing]
|
||||||
Control stereo output mode. Available modes for -mode:
|
Control stereo output mode. Available modes for -mode:
|
||||||
quadBuffer OpenGL QuadBuffer stereo;
|
quadBuffer OpenGL QuadBuffer stereo;
|
||||||
requires driver support;
|
requires driver support;
|
||||||
@ -14069,6 +14137,7 @@ Control stereo output mode. Available modes for -mode:
|
|||||||
anaglyph Anaglyph glasses, filters for -anaglyph:
|
anaglyph Anaglyph glasses, filters for -anaglyph:
|
||||||
redCyan, redCyanSimple, yellowBlue, yellowBlueSimple, greenMagentaSimple.
|
redCyan, redCyanSimple, yellowBlue, yellowBlueSimple, greenMagentaSimple.
|
||||||
rowInterlaced row-interlaced display
|
rowInterlaced row-interlaced display
|
||||||
|
smooth smooth interlaced output for better text readability
|
||||||
columnInterlaced column-interlaced display
|
columnInterlaced column-interlaced display
|
||||||
chessBoard chess-board output
|
chessBoard chess-board output
|
||||||
sideBySide horizontal pair
|
sideBySide horizontal pair
|
||||||
|
@ -18,15 +18,24 @@ vstereo -mode anaglyph
|
|||||||
vfit
|
vfit
|
||||||
vdump $::imagedir/${::casename}_anaglyph.png -stereo blend
|
vdump $::imagedir/${::casename}_anaglyph.png -stereo blend
|
||||||
|
|
||||||
vstereo -mode columnInterlaced
|
vstereo -mode columnInterlaced -smooth 0
|
||||||
vdump $::imagedir/${::casename}_col.png -stereo blend
|
vdump $::imagedir/${::casename}_col.png -stereo blend
|
||||||
|
|
||||||
vstereo -mode chessBoard
|
vstereo -mode columnInterlaced -smooth 1
|
||||||
|
vdump $::imagedir/${::casename}_col_smooth.png -stereo blend
|
||||||
|
|
||||||
|
vstereo -mode chessBoard -smooth 0
|
||||||
vdump $::imagedir/${::casename}_chess.png -stereo blend
|
vdump $::imagedir/${::casename}_chess.png -stereo blend
|
||||||
|
|
||||||
vstereo -mode rowInterlaced
|
vstereo -mode chessBoard -smooth 1
|
||||||
|
vdump $::imagedir/${::casename}_chess_smooth.png -stereo blend
|
||||||
|
|
||||||
|
vstereo -mode rowInterlaced -smooth 0
|
||||||
vdump $::imagedir/${::casename}_row.png -stereo blend
|
vdump $::imagedir/${::casename}_row.png -stereo blend
|
||||||
|
|
||||||
|
vstereo -mode rowInterlaced -smooth 1
|
||||||
|
vdump $::imagedir/${::casename}_row_smooth.png -stereo blend
|
||||||
|
|
||||||
vstereo -mode sideBySide
|
vstereo -mode sideBySide
|
||||||
vdump $::imagedir/${::casename}_sbs_anamorph.png -stereo blend
|
vdump $::imagedir/${::casename}_sbs_anamorph.png -stereo blend
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user