diff --git a/src/AIS/AIS_ViewController.cxx b/src/AIS/AIS_ViewController.cxx index 5809f8516d..4a9300f712 100644 --- a/src/AIS/AIS_ViewController.cxx +++ b/src/AIS/AIS_ViewController.cxx @@ -2252,7 +2252,6 @@ void AIS_ViewController::handleCameraActions (const Handle(AIS_InteractiveContex const Handle(V3d_View)& theView, const AIS_WalkDelta& theWalk) { - std::cout << "handleCameraActions\n"; // apply view actions if (myGL.Orientation.ToSetViewOrient) { @@ -3110,7 +3109,6 @@ void AIS_ViewController::handleDynamicHighlight (const Handle(AIS_InteractiveCon void AIS_ViewController::handleMoveTo (const Handle(AIS_InteractiveContext)& theCtx, const Handle(V3d_View)& theView) { - std::cout << "handleMoveTo\n"; handleSelectionPick (theCtx, theView); handleDynamicHighlight(theCtx, theView); handleSelectionPoly (theCtx, theView); diff --git a/src/Graphic3d/Graphic3d_ShaderManager.cxx b/src/Graphic3d/Graphic3d_ShaderManager.cxx index 8650a554df..d70a83d4b9 100644 --- a/src/Graphic3d/Graphic3d_ShaderManager.cxx +++ b/src/Graphic3d/Graphic3d_ShaderManager.cxx @@ -2183,3 +2183,104 @@ Handle(Graphic3d_ShaderProgram) Graphic3d_ShaderManager::getColoredQuadProgram() return aProgSrc; } + +Handle(Graphic3d_ShaderProgram) Graphic3d_ShaderManager::getGridProgram() const +{ + Handle(Graphic3d_ShaderProgram) aProgSrc = new Graphic3d_ShaderProgram(); + + Graphic3d_ShaderObject::ShaderVariableList aUniforms, aStageInOuts; + aStageInOuts.Append (Graphic3d_ShaderObject::ShaderVariable ("vec3 NearPoint", Graphic3d_TOS_VERTEX | Graphic3d_TOS_FRAGMENT)); + aStageInOuts.Append (Graphic3d_ShaderObject::ShaderVariable ("vec3 FarPoint", Graphic3d_TOS_VERTEX | Graphic3d_TOS_FRAGMENT)); + aStageInOuts.Append (Graphic3d_ShaderObject::ShaderVariable ("mat4 MVP", Graphic3d_TOS_VERTEX | Graphic3d_TOS_FRAGMENT)); + aUniforms.Append (Graphic3d_ShaderObject::ShaderVariable ("float uZNear", Graphic3d_TOS_FRAGMENT)); + aUniforms.Append (Graphic3d_ShaderObject::ShaderVariable ("float uZFar", Graphic3d_TOS_FRAGMENT)); + aUniforms.Append (Graphic3d_ShaderObject::ShaderVariable ("bool uIsDrawAxis", Graphic3d_TOS_FRAGMENT)); + + TCollection_AsciiString aSrcVert = TCollection_AsciiString() + + EOL"vec3 gridPlane[6] = vec3[] (vec3( 1, 1, 0), vec3(-1, -1, 0), vec3(-1, 1, 0)," + EOL" vec3(-1, -1, 0), vec3( 1, 1, 0), vec3( 1, -1, 0));" + + EOL"vec3 UnprojectPoint (float aX, float anY, float aZ)" + EOL"{" + EOL" vec4 anUnprojPnt = occModelWorldMatrixInverse * occWorldViewMatrixInverse * occProjectionMatrixInverse * vec4 (aX, anY, aZ, 1.0);" + EOL" return anUnprojPnt.xyz / anUnprojPnt.w;" + EOL"}" + + EOL"void main()" + EOL"{" + EOL" vec3 aVertex = gridPlane[gl_VertexID];" + EOL" NearPoint = UnprojectPoint (aVertex.x, aVertex.y, 0.0);" + EOL" FarPoint = UnprojectPoint (aVertex.x, aVertex.y, 1.0);" + EOL" MVP = occProjectionMatrix * occWorldViewMatrix * occModelWorldMatrix;" + EOL" gl_Position = vec4 (aVertex, 1.0);" + EOL"}"; + + TCollection_AsciiString aSrcFrag = TCollection_AsciiString() + + EOL"vec4 grid (vec3 theFragPos3D, vec3 theColor, float theScale, bool theIsDrawAxis)" + EOL"{" + EOL" vec2 aCoord = theFragPos3D.xy * theScale;" + EOL" vec2 aDerivative = fwidth (aCoord);" + EOL" vec2 aGrid = abs (fract (aCoord - 0.5) - 0.5) / aDerivative;" + EOL" float aLine = min (aGrid.x, aGrid.y);" + EOL" float aMinY = min (aDerivative.y, 1);" + EOL" float aMinX = min (aDerivative.x, 1);" + EOL" vec4 aColor = vec4 (theColor, round (1.0 - min (aLine, 1.0)));" + EOL" if (uIsDrawAxis && theIsDrawAxis)" + EOL" {" + EOL" bool isYAxis = -aMinX < aCoord.x && aCoord.x < aMinX;" + EOL" bool isXAxis = -aMinY < aCoord.y && aCoord.y < aMinY;" + EOL" if (isXAxis && isYAxis) { aColor.xyz = vec3 (0.0, 0.0, 1.0); }" + EOL" else if (isXAxis) { aColor.xyz = vec3 (1.0, 0.0, 0.0); }" + EOL" else if (isYAxis) { aColor.xyz = vec3 (0.0, 1.0, 0.0); }" + EOL" }" + EOL" return aColor;" + EOL" }" + + EOL"float computeDepth (vec3 thePos)" + EOL"{" + EOL" vec4 aClipSpacePos = MVP * vec4 (thePos, 1.0);" + EOL" return (aClipSpacePos.z / aClipSpacePos.w);" + EOL"}" + + EOL"float computeLinearDepth (vec3 thePos)" + EOL"{" + EOL" float aClipSpaceDepth = computeDepth (thePos) * 2.0 - 1.0;" + EOL" float aLinearDepth = (2.0 * uZNear * uZFar) / (uZFar + uZNear - aClipSpaceDepth * (uZFar - uZNear));" + EOL" return aLinearDepth / uZFar;" + EOL"}" + + EOL"void main()" + EOL"{" + EOL" float aParam = -NearPoint.z / (FarPoint.z - NearPoint.z);" + EOL" vec3 aFragPos3D = NearPoint + aParam * (FarPoint - NearPoint);" + EOL" float aLinearDepth = computeLinearDepth (aFragPos3D);" + // TODO : Compute scale + EOL" vec4 aBigGridColor = grid (aFragPos3D, vec3 (0.8), 0.01, true);" + EOL" vec4 aColor = aBigGridColor.a == 0.0" + EOL" ? grid (aFragPos3D, vec3 (0.2), 0.1, false)" + EOL" : aBigGridColor;" + EOL" float aDepth = computeDepth (aFragPos3D);" + EOL" float aFar = gl_DepthRange.far;" + EOL" float aNear = gl_DepthRange.near;" + EOL" aDepth = ((aFar - aNear) * aDepth + aNear + aFar) * 0.5;" + EOL" if (aColor.a == 0.0 || (-1.0 < aLinearDepth && aLinearDepth < 0.0))" + EOL" {" + EOL" discard;" + EOL" };" + // TODO : Get actual background color + EOL" vec4 aBackgroundColor = vec4 (0.0, 0.0, 0.0, 1.0);" + EOL" if (abs (aLinearDepth) > 1.0)" + EOL" {" + EOL" float anInterpVal = float (aLinearDepth > 0.0) - sign (aLinearDepth) * clamp (1.0 / (abs (aLinearDepth) - 1.0), 0.5, 1.0);" + EOL" aColor = mix (aColor, aBackgroundColor, anInterpVal);" + EOL" }" + EOL" gl_FragDepth = aDepth;" + EOL" occFragColor = aColor;" + EOL"}"; + + defaultGlslVersion (aProgSrc, "grid", 0); + aProgSrc->AttachShader (Graphic3d_ShaderObject::CreateFromSource (aSrcVert, Graphic3d_TOS_VERTEX, aUniforms, aStageInOuts)); + aProgSrc->AttachShader (Graphic3d_ShaderObject::CreateFromSource (aSrcFrag, Graphic3d_TOS_FRAGMENT, aUniforms, aStageInOuts)); + + return aProgSrc; +} diff --git a/src/Graphic3d/Graphic3d_ShaderManager.hxx b/src/Graphic3d/Graphic3d_ShaderManager.hxx index 023b574260..1f2df5040f 100644 --- a/src/Graphic3d/Graphic3d_ShaderManager.hxx +++ b/src/Graphic3d/Graphic3d_ShaderManager.hxx @@ -148,6 +148,9 @@ protected: //! Generates shader program to render correctly colored quad. Standard_EXPORT Handle(Graphic3d_ShaderProgram) getColoredQuadProgram() const; + //! Generates shader program to render grid. + Standard_EXPORT Handle(Graphic3d_ShaderProgram) getGridProgram() const; + //! Prepare GLSL source for IBL generation used in PBR pipeline. Standard_EXPORT Handle(Graphic3d_ShaderProgram) getPBREnvBakingProgram (Standard_Integer theIndex) const; diff --git a/src/OpenGl/OpenGl_ShaderManager.cxx b/src/OpenGl/OpenGl_ShaderManager.cxx index eff6bf9f39..de9725674e 100644 --- a/src/OpenGl/OpenGl_ShaderManager.cxx +++ b/src/OpenGl/OpenGl_ShaderManager.cxx @@ -1361,6 +1361,27 @@ Standard_Boolean OpenGl_ShaderManager::preparePBREnvBakingProgram (Standard_Inte return Standard_True; } +// ======================================================================= +// function : prepareGridProgram +// purpose : +// ======================================================================= +Standard_Boolean OpenGl_ShaderManager::prepareGridProgram() +{ + Handle(Graphic3d_ShaderProgram) aProgramSrc = getGridProgram(); + + TCollection_AsciiString aKey; + if (!Create (aProgramSrc, aKey, myGridProgram)) + { + myGridProgram = new OpenGl_ShaderProgram(); // just mark as invalid + return Standard_False; + } + + myContext->BindProgram (myGridProgram); + myContext->BindProgram (Handle(OpenGl_ShaderProgram)()); + + return Standard_True; +} + // ======================================================================= // function : GetBgCubeMapProgram // purpose : diff --git a/src/OpenGl/OpenGl_ShaderManager.hxx b/src/OpenGl/OpenGl_ShaderManager.hxx index f8dc9da70b..bfe1db412d 100644 --- a/src/OpenGl/OpenGl_ShaderManager.hxx +++ b/src/OpenGl/OpenGl_ShaderManager.hxx @@ -225,6 +225,16 @@ public: return myContext->BindProgram (myPBREnvBakingProgram[theIndex]); } + //! Bind program for IBL maps generation in PBR pipeline. + Standard_Boolean BindGridProgram() + { + if (myGridProgram.IsNull()) + { + prepareGridProgram(); + } + return myContext->BindProgram (myGridProgram); + } + //! Generates shader program to render environment cubemap as background. Standard_EXPORT const Handle(Graphic3d_ShaderProgram)& GetBgCubeMapProgram(); @@ -709,6 +719,8 @@ protected: Standard_Boolean IsPbrAllowed() const { return myShadingModel == Graphic3d_TypeOfShadingModel_Pbr || myShadingModel == Graphic3d_TypeOfShadingModel_PbrFacet; } + Standard_EXPORT Standard_Boolean prepareGridProgram(); + protected: //! Packed properties of light source @@ -776,6 +788,7 @@ protected: Handle(Graphic3d_ShaderProgram) myBgCubeMapProgram; //!< program for background cubemap rendering Handle(Graphic3d_ShaderProgram) myBgSkydomeProgram; //!< program for background cubemap rendering Handle(Graphic3d_ShaderProgram) myColoredQuadProgram; //!< program for correct quad rendering + Handle(OpenGl_ShaderProgram) myGridProgram; //!< program for grid rendering Handle(OpenGl_ShaderProgram) myStereoPrograms[Graphic3d_StereoMode_NB]; //!< standard stereo programs diff --git a/src/OpenGl/OpenGl_View.cxx b/src/OpenGl/OpenGl_View.cxx index e1010f47df..c26975bfcd 100644 --- a/src/OpenGl/OpenGl_View.cxx +++ b/src/OpenGl/OpenGl_View.cxx @@ -2498,6 +2498,12 @@ void OpenGl_View::render (Graphic3d_Camera::Projection theProjection, aContext->core11fwd->glDisable (GL_LIGHTING); } + // ==================================== + // Step 3: Redraw grid + // ==================================== + + renderGrid(); + // ================================= // Step 3: Redraw main plane // ================================= @@ -2590,6 +2596,35 @@ void OpenGl_View::render (Graphic3d_Camera::Projection theProjection, } } +// ======================================================================= +// function : renderGrid +// purpose : +// ======================================================================= +void OpenGl_View::renderGrid() +{ + const Handle(OpenGl_Context)& aContext = myWorkspace->GetGlContext(); + + aContext->ShaderManager()->UpdateModelWorldStateTo (aContext->ModelWorldState.Current()); + aContext->ShaderManager()->UpdateProjectionStateTo (aContext->ProjectionState.Current()); + aContext->ShaderManager()->UpdateWorldViewStateTo (aContext->WorldViewState.Current()); + + aContext->core11fwd->glEnable (GL_BLEND); + aContext->core11fwd->glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + + if (aContext->ShaderManager()->BindGridProgram()) + { + const Handle(OpenGl_ShaderProgram)& aProg = aContext->ActiveProgram(); + aProg->SetUniform (aContext, "uZNear", GLfloat (aContext->Camera()->ZNear())); + aProg->SetUniform (aContext, "uZFar", GLfloat (aContext->Camera()->ZFar())); + // TODO : add param to draw command + aProg->SetUniform (aContext, "uIsDrawAxis", GLboolean (true)); + + aContext->ShaderManager()->PushState (aContext->ActiveProgram()); + aContext->core20fwd->glDrawArrays (GL_TRIANGLES, 0, 6); + aContext->BindProgram (NULL); + } +} + // ======================================================================= // function : InvalidateBVHData // purpose : diff --git a/src/OpenGl/OpenGl_View.hxx b/src/OpenGl/OpenGl_View.hxx index 766fccd9f1..3ed7296642 100644 --- a/src/OpenGl/OpenGl_View.hxx +++ b/src/OpenGl/OpenGl_View.hxx @@ -396,6 +396,9 @@ protected: //! @name Rendering of GL graphics (with prepared drawing buffer). OpenGl_FrameBuffer* theOitAccumFbo, const Standard_Boolean theToDrawImmediate); + //! Renders grid + Standard_EXPORT void renderGrid(); + //! Renders trihedron. void renderTrihedron (const Handle(OpenGl_Workspace) &theWorkspace);