0025885: Visualization, ray tracing - Improve layer processing
[occt.git] / src / OpenGl / OpenGl_Workspace.hxx
index 5f74ef3..2b1ba45 100644 (file)
@@ -104,8 +104,14 @@ public:
   //! Default constructor.
   OpenGl_RaytraceFilter() {}
 
+  //! Returns the previously set filter.
+  const Handle(OpenGl_RenderFilter)& PrevRenderFilter()
+  {
+    return myPrevRenderFilter;
+  }
+
   //! Remembers the previously set filter.
-  inline void SetPrevRenderFilter (const Handle(OpenGl_RenderFilter)& theFilter)
+  void SetPrevRenderFilter (const Handle(OpenGl_RenderFilter)& theFilter)
   {
     myPrevRenderFilter = theFilter;
   }
@@ -259,8 +265,8 @@ public:
   //! @return true if clipping algorithm enabled
   inline Standard_Boolean IsCullingEnabled() const { return myIsCullingEnabled; }
 
-  //! Returns a flag whether to redraw the scene using OpenGL rasterization
-  Standard_Boolean ToRedrawGL() const { return myToRedrawGL; }
+  //! Returns framebuffer storing cached main presentation of the view.
+  const Handle(OpenGl_FrameBuffer)& ResultFBO() const { return myResultFBO; }
 
 protected:
 
@@ -292,358 +298,7 @@ protected:
   void setTextureParams (Handle(OpenGl_Texture)&                theTexture,
                          const Handle(Graphic3d_TextureParams)& theParams);
 
-protected:
-
-  //! Result of OpenGL shaders initialization.
-  enum RaytraceInitStatus
-  {
-    OpenGl_RT_NONE,
-    OpenGl_RT_INIT,
-    OpenGl_RT_FAIL
-  };
-
-  //! Describes update mode (state).
-  enum GeomUpdateMode
-  {
-    OpenGl_GUM_CHECK,   //!< check if geometry update is necessary
-    OpenGl_GUM_PREPARE, //!< collect unchanged objects
-    OpenGl_GUM_UPDATE   //!< update raytracing data, rebuild changed objects
-  };
-
-  //! Defines frequently used shader variables.
-  enum ShaderVariableIndex
-  {
-    OpenGl_RT_aPosition,
-
-    OpenGl_RT_uOriginLT,
-    OpenGl_RT_uOriginLB,
-    OpenGl_RT_uOriginRT,
-    OpenGl_RT_uOriginRB,
-    OpenGl_RT_uDirectLT,
-    OpenGl_RT_uDirectLB,
-    OpenGl_RT_uDirectRT,
-    OpenGl_RT_uDirectRB,
-    OpenGl_RT_uUnviewMat,
-
-    OpenGl_RT_uSceneRad,
-    OpenGl_RT_uSceneEps,
-    OpenGl_RT_uLightAmbnt,
-    OpenGl_RT_uLightCount,
-
-    OpenGl_RT_uShadEnabled,
-    OpenGl_RT_uReflEnabled,
-    OpenGl_RT_uEnvMapEnable,
-
-    OpenGl_RT_uOffsetX,
-    OpenGl_RT_uOffsetY,
-    OpenGl_RT_uSamples,
-    OpenGl_RT_uWinSizeX,
-    OpenGl_RT_uWinSizeY,
-
-    OpenGl_RT_uTextures,
-
-    OpenGl_RT_NbVariables // special field
-  };
-
-  //! Defines texture samplers.
-  enum ShaderSamplerNames
-  {
-    OpenGl_RT_SceneNodeInfoTexture  = 0,
-    OpenGl_RT_SceneMinPointTexture  = 1,
-    OpenGl_RT_SceneMaxPointTexture  = 2,
-    OpenGl_RT_SceneTransformTexture = 3,
-
-    OpenGl_RT_GeometryVertexTexture = 4,
-    OpenGl_RT_GeometryNormalTexture = 5,
-    OpenGl_RT_GeometryTexCrdTexture = 6,
-    OpenGl_RT_GeometryTriangTexture = 7,
-
-    OpenGl_RT_EnvironmentMapTexture = 8,
-
-    OpenGl_RT_RaytraceMaterialTexture = 9,
-    OpenGl_RT_RaytraceLightSrcTexture = 10,
-
-    OpenGl_RT_FSAAInputTexture = 11,
-
-    OpenGl_RT_OpenGlColorTexture = 12,
-    OpenGl_RT_OpenGlDepthTexture = 13
-  };
-
-  //! Tool class for management of shader sources.
-  class ShaderSource
-  {
-  public:
-
-    //! Creates new uninitialized shader source.
-    ShaderSource()
-    {
-      //
-    }
-
-    //! Creates new shader source from specified file.
-    ShaderSource (const TCollection_AsciiString& theFileName)
-    {
-      Load (&theFileName, 1);
-    }
-
-  public:
-
-    //! Returns prefix to insert before the source.
-    const TCollection_AsciiString& Prefix() const
-    {
-      return myPrefix;
-    }
-
-    //! Sets prefix to insert before the source.
-    void SetPrefix (const TCollection_AsciiString& thePrefix)
-    {
-      myPrefix = thePrefix;
-    }
-
-    //! Returns shader source combined with prefix.
-    TCollection_AsciiString Source() const;
-
-    //! Loads shader source from specified files.
-    void Load (const TCollection_AsciiString* theFileNames, const Standard_Integer theCount);
-
-  private:
-
-    TCollection_AsciiString mySource; //!< Source string of the shader object
-    TCollection_AsciiString myPrefix; //!< Prefix to insert before the source
-
-  };
-
-  //! Default ray-tracing depth.
-  static const Standard_Integer THE_DEFAULT_NB_BOUNCES = 3;
-
-  //! Default size of traversal stack.
-  static const Standard_Integer THE_DEFAULT_STACK_SIZE = 24;
-
-  //! Compile-time ray-tracing parameters.
-  struct RaytracingParams
-  {
-    //! Actual size of traversal stack in shader program.
-    Standard_Integer StackSize;
-
-    //! Actual ray-tracing depth (number of ray bounces).
-    Standard_Integer NbBounces;
-
-    //! Sets light propagation through transparent media.
-    Standard_Boolean TransparentShadows;
-
-    //! Creates default compile-time ray-tracing parameters.
-    RaytracingParams()
-    : StackSize (THE_DEFAULT_STACK_SIZE),
-      NbBounces (THE_DEFAULT_NB_BOUNCES),
-      TransparentShadows (Standard_False)
-    {
-      //
-    }
-  };
-
-protected: //! @name methods related to ray-tracing
-
-  //! Updates 3D scene geometry for ray-tracing.
-  Standard_Boolean UpdateRaytraceGeometry (GeomUpdateMode theMode);
-
-  //! Checks to see if the structure is modified.
-  Standard_Boolean CheckRaytraceStructure (const OpenGl_Structure* theStructure);
-
-  //! Creates ray-tracing material properties.
-  Standard_Boolean CreateMaterial (const OpenGl_AspectFace* theAspect, OpenGl_RaytraceMaterial& theMaterial);
-
-  //! Updates 3D scene light sources for ray-tracing.
-  Standard_Boolean UpdateRaytraceLightSources (const OpenGl_Mat4& theInvModelView);
-
-  //! Updates environment map for ray-tracing.
-  Standard_Boolean UpdateRaytraceEnvironmentMap();
-
-  //! Adds OpenGL structure to ray-traced scene geometry.
-  Standard_Boolean AddRaytraceStructure (const OpenGl_Structure* theStructure, std::set<const OpenGl_Structure*>& theElements);
-
-  //! Adds OpenGL groups to ray-traced scene geometry.
-  Standard_Boolean AddRaytraceGroups (const OpenGl_Structure*   theStructure,
-                                      const Standard_Integer    theStructMatId,
-                                      const Standard_ShortReal* theTransform);
-
-  //! Adds OpenGL primitive array to ray-traced scene geometry.
-  OpenGl_TriangleSet* AddRaytracePrimitiveArray (
-    const OpenGl_PrimitiveArray* theArray, int theMatID, const OpenGl_Mat4* theTrans);
-
-  //! Adds vertex indices from OpenGL primitive array to ray-traced scene geometry.
-  Standard_Boolean AddRaytraceVertexIndices (OpenGl_TriangleSet&          theSet,
-                                             const OpenGl_PrimitiveArray& theArray,
-                                             Standard_Integer             theOffset,
-                                             Standard_Integer             theCount,
-                                             Standard_Integer             theMatID);
-
-  //! Adds OpenGL triangle array to ray-traced scene geometry.
-  Standard_Boolean AddRaytraceTriangleArray (OpenGl_TriangleSet&                  theSet,
-                                             const Handle(Graphic3d_IndexBuffer)& theIndices,
-                                             Standard_Integer                     theOffset,
-                                             Standard_Integer                     theCount,
-                                             Standard_Integer                     theMatID);
-
-  //! Adds OpenGL triangle fan array to ray-traced scene geometry.
-  Standard_Boolean AddRaytraceTriangleFanArray (OpenGl_TriangleSet&                  theSet,
-                                                const Handle(Graphic3d_IndexBuffer)& theIndices,
-                                                Standard_Integer                     theOffset,
-                                                Standard_Integer                     theCount,
-                                                Standard_Integer                     theMatID);
-
-  //! Adds OpenGL triangle strip array to ray-traced scene geometry.
-  Standard_Boolean AddRaytraceTriangleStripArray (OpenGl_TriangleSet&                  theSet,
-                                                  const Handle(Graphic3d_IndexBuffer)& theIndices,
-                                                  Standard_Integer                     theOffset,
-                                                  Standard_Integer                     theCount,
-                                                  Standard_Integer                     theMatID);
-
-  //! Adds OpenGL quadrangle array to ray-traced scene geometry.
-  Standard_Boolean AddRaytraceQuadrangleArray (OpenGl_TriangleSet&                  theSet,
-                                               const Handle(Graphic3d_IndexBuffer)& theIndices,
-                                               Standard_Integer                     theOffset,
-                                               Standard_Integer                     theCount,
-                                               Standard_Integer                     theMatID);
-
-  //! Adds OpenGL quadrangle strip array to ray-traced scene geometry.
-  Standard_Boolean AddRaytraceQuadrangleStripArray (OpenGl_TriangleSet&                  theSet,
-                                                    const Handle(Graphic3d_IndexBuffer)& theIndices,
-                                                    Standard_Integer                     theOffset,
-                                                    Standard_Integer                     theCount,
-                                                    Standard_Integer                     theMatID);
-
-  //! Adds OpenGL polygon array to ray-traced scene geometry.
-  Standard_Boolean AddRaytracePolygonArray (OpenGl_TriangleSet&                  theSet,
-                                            const Handle(Graphic3d_IndexBuffer)& theIndices,
-                                            Standard_Integer                     theOffset,
-                                            Standard_Integer                     theCount,
-                                            Standard_Integer                     theMatID);
-
-  //! Loads and compiles shader object from specified source.
-  Handle(OpenGl_ShaderObject) LoadShader (const ShaderSource& theSource, GLenum theType);
-
-  //! Performs safe exit when shaders initialization fails.
-  Standard_Boolean SafeFailBack (const TCollection_ExtendedString& theMessage);
-
-  //! Generates shader prefix based on current ray-tracing options.
-  TCollection_AsciiString GenerateShaderPrefix();
-
-  //! Initializes OpenGL/GLSL shader programs.
-  Standard_Boolean InitRaytraceResources (const Graphic3d_CView& theCView);
-
-  //! Releases OpenGL/GLSL shader programs.
-  void ReleaseRaytraceResources();
-
-  //! Uploads ray-trace data to the GPU.
-  Standard_Boolean UploadRaytraceData();
-
-  //! Resizes OpenGL frame buffers.
-  Standard_Boolean ResizeRaytraceBuffers (const Standard_Integer theSizeX,
-                                          const Standard_Integer theSizeY);
-
-  //! Generates viewing rays for corners of screen quad.
-  void UpdateCamera (const OpenGl_Mat4& theOrientation,
-                     const OpenGl_Mat4& theViewMapping,
-                     OpenGl_Vec3        theOrigins[4],
-                     OpenGl_Vec3        theDirects[4],
-                     OpenGl_Mat4&       theInvModelProj);
-
-  //! Sets uniform state for the given ray-tracing shader program.
-  Standard_Boolean SetUniformState (const Graphic3d_CView&        theCView,
-                                    const Standard_Integer        theSizeX,
-                                    const Standard_Integer        theSizeY,
-                                    const OpenGl_Vec3*            theOrigins,
-                                    const OpenGl_Vec3*            theDirects,
-                                    const OpenGl_Mat4&            theUnviewMat,
-                                    const Standard_Integer        theProgramIndex,
-                                    Handle(OpenGl_ShaderProgram)& theRaytraceProgram);
-
-  //! Runs ray-tracing shader programs.
-  Standard_Boolean RunRaytraceShaders (const Graphic3d_CView& theCView,
-                                       const Standard_Integer theSizeX,
-                                       const Standard_Integer theSizeY,
-                                       const OpenGl_Vec3      theOrigins[4],
-                                       const OpenGl_Vec3      theDirects[4],
-                                       const OpenGl_Mat4&     theUnviewMat,
-                                       OpenGl_FrameBuffer*    theFrameBuffer);
-
-  //! Redraws the window using OpenGL/GLSL ray-tracing.
-  Standard_Boolean Raytrace (const Graphic3d_CView& theCView,
-                             const Standard_Integer theSizeX,
-                             const Standard_Integer theSizeY,
-                             const Aspect_CLayer2d& theCOverLayer,
-                             const Aspect_CLayer2d& theCUnderLayer,
-                             OpenGl_FrameBuffer*    theFrameBuffer);
-
-protected: //! @name fields related to ray-tracing
-
-  //! Result of shaders initialization.
-  RaytraceInitStatus myComputeInitStatus;
-
-  //! Is geometry data valid?
-  Standard_Boolean myIsRaytraceDataValid;
-
-  //! Warning about missing extension GL_ARB_bindless_texture has been displayed?
-  Standard_Boolean myIsRaytraceWarnTextures;
-
-  //! 3D scene geometry data for ray-tracing.
-  OpenGl_RaytraceGeometry myRaytraceGeometry;
-
-  //! Radius of bounding sphere of the scene.
-  Standard_ShortReal myRaytraceSceneRadius;
-  //! Scene epsilon to prevent self-intersections.
-  Standard_ShortReal myRaytraceSceneEpsilon;
-
-  //! Compile-time ray-tracing parameters.
-  RaytracingParams myRaytraceParameters;
-
-  //! OpenGL/GLSL source of ray-tracing fragment shader.
-  ShaderSource myRaytraceShaderSource;
-  //! OpenGL/GLSL source of adaptive-AA fragment shader.
-  ShaderSource myPostFSAAShaderSource;
-
-  //! OpenGL/GLSL ray-tracing fragment shader.
-  Handle(OpenGl_ShaderObject) myRaytraceShader;
-  //! OpenGL/GLSL adaptive-AA fragment shader.
-  Handle(OpenGl_ShaderObject) myPostFSAAShader;
-
-  //! OpenGL/GLSL ray-tracing shader program.
-  Handle(OpenGl_ShaderProgram) myRaytraceProgram;
-  //! OpenGL/GLSL adaptive-AA shader program.
-  Handle(OpenGl_ShaderProgram) myPostFSAAProgram;
-
-  //! Texture buffer of data records of bottom-level BVH nodes.
-  Handle(OpenGl_TextureBufferArb) mySceneNodeInfoTexture;
-  //! Texture buffer of minimum points of bottom-level BVH nodes.
-  Handle(OpenGl_TextureBufferArb) mySceneMinPointTexture;
-  //! Texture buffer of maximum points of bottom-level BVH nodes.
-  Handle(OpenGl_TextureBufferArb) mySceneMaxPointTexture;
-  //! Texture buffer of transformations of high-level BVH nodes.
-  Handle(OpenGl_TextureBufferArb) mySceneTransformTexture;
-
-  //! Texture buffer of vertex coords.
-  Handle(OpenGl_TextureBufferArb) myGeometryVertexTexture;
-  //! Texture buffer of vertex normals.
-  Handle(OpenGl_TextureBufferArb) myGeometryNormalTexture;
-  //! Texture buffer of vertex UV coords.
-  Handle(OpenGl_TextureBufferArb) myGeometryTexCrdTexture;
-  //! Texture buffer of triangle indices.
-  Handle(OpenGl_TextureBufferArb) myGeometryTriangTexture;
-
-  //! Texture buffer of material properties.
-  Handle(OpenGl_TextureBufferArb) myRaytraceMaterialTexture;
-  //! Texture buffer of light source properties.
-  Handle(OpenGl_TextureBufferArb) myRaytraceLightSrcTexture;
-
-  //! Vertex buffer (VBO) for drawing dummy quad.
-  OpenGl_VertexBuffer myRaytraceScreenQuad;
-
-  //! Framebuffer (FBO) to perform adaptive FSAA.
-  Handle(OpenGl_FrameBuffer) myRaytraceFBO1;
-  //! Framebuffer (FBO) to perform adaptive FSAA.
-  Handle(OpenGl_FrameBuffer) myRaytraceFBO2;
-  //! Framebuffer (FBO) for pre-raytrace rendering by OpenGL.
-  Handle(OpenGl_FrameBuffer) myOpenGlFBO;
+protected: //! @name protected fields
 
   //! Framebuffer stores cached main presentation of the view (without presentation of immediate layers).
   Handle(OpenGl_FrameBuffer) myResultFBO;
@@ -653,28 +308,6 @@ protected: //! @name fields related to ray-tracing
   //! Vertices for full-screen quad rendering.
   OpenGl_VertexBuffer        myFullScreenQuad;
 
-  //! State of OpenGL view.
-  Standard_Size myViewModificationStatus;
-  //! State of OpenGL layer list.
-  Standard_Size myLayersModificationStatus;
-
-  //! State of OpenGL structures reflected to ray-tracing.
-  std::map<const OpenGl_Structure*, Standard_Size> myStructureStates;
-
-  //! PrimitiveArray to TriangleSet map for scene partial update.
-  std::map<Standard_Size, OpenGl_TriangleSet*> myArrayToTrianglesMap;
-
-  //! Cached locations of frequently used uniform variables.
-  Standard_Integer myUniformLocations[2][OpenGl_RT_NbVariables];
-
-  //! Graphical ray-tracing filter to filter out all raytracable structures.
-  Handle(OpenGl_RaytraceFilter) myRaytraceFilter;
-
-  //! Redraw the scene using OpenGL rasterization or ray-tracing?
-  Standard_Boolean myToRedrawGL;
-
-protected: //! @name protected fields
-
   Handle(OpenGl_PrinterContext) myPrintContext;
   Handle(OpenGl_View)           myView;
   Handle(OpenGl_LineAttributes) myLineAttribs;