0025442: Visualization, TKOpenGl - prevent inclusion of system header glxext.h
[occt.git] / src / OpenGl / OpenGl_SceneGeometry.hxx
index 3f27077..dc52558 100755 (executable)
@@ -1,11 +1,11 @@
 // Created on: 2013-08-27
 // Created by: Denis BOGOLEPOV
-// Copyright (c) 2013 OPEN CASCADE SAS
+// Copyright (c) 2013-2014 OPEN CASCADE SAS
 //
 // This file is part of Open CASCADE Technology software library.
 //
-// This library is free software; you can redistribute it and / or modify it
-// under the terms of the GNU Lesser General Public version 2.1 as published
+// This library is free software; you can redistribute it and/or modify it under
+// the terms of the GNU Lesser General Public License version 2.1 as published
 // by the Free Software Foundation, with special exception defined in the file
 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
 // distribution for complete text of the license and disclaimer of any warranty.
 #ifndef _OpenGl_SceneGeometry_Header
 #define _OpenGl_SceneGeometry_Header
 
-#ifdef HAVE_OPENCL
-
 #include <BVH_Geometry.hxx>
 #include <BVH_Triangulation.hxx>
 #include <NCollection_StdAllocator.hxx>
-#include <OpenGl_PrimitiveArray.hxx>
-#include <OpenGl_Structure.hxx>
+#include <OpenGl_TextureBufferArb.hxx>
+#include <OpenGl_Texture.hxx>
+
+class  OpenGl_Element;
+struct OpenGl_ElementNode;
+class  OpenGl_Group;
+class  OpenGl_Structure;
+class  OpenGl_PrimitiveArray;
 
 namespace OpenGl_Raytrace
 {
@@ -32,6 +36,9 @@ namespace OpenGl_Raytrace
   //! Checks to see if the element contains ray-trace geometry.
   Standard_Boolean IsRaytracedElement (const OpenGl_ElementNode* theNode);
 
+  //! Checks to see if the element contains ray-trace geometry.
+  Standard_Boolean IsRaytracedElement (const OpenGl_Element* theElement);
+
   //! Checks to see if the structure contains ray-trace geometry.
   Standard_Boolean IsRaytracedStructure (const OpenGl_Structure* theStructure);
 }
@@ -62,6 +69,9 @@ public:
   //! Material transparency.
   BVH_Vec4f Transparency;
 
+  //! Texture transformation matrix.
+  BVH_Mat4f TextureTransform;
+
 public:
 
   //! Creates new default material.
@@ -120,17 +130,19 @@ public:
 };
 
 //! Triangulation of single OpenGL primitive array.
-class OpenGl_TriangleSet : public BVH_Triangulation<Standard_ShortReal, 4>
+class OpenGl_TriangleSet : public BVH_Triangulation<Standard_ShortReal, 3>
 {
 public:
 
-  //! Array of vertex normals.
-  BVH_Array4f Normals;
+  //! Value of invalid material index to return in case of errors.
+  static const Standard_Integer INVALID_MATERIAL = -1;
 
 public:
 
   //! Creates new OpenGL element triangulation.
-  OpenGl_TriangleSet()
+  OpenGl_TriangleSet (const Standard_Size theArrayID)
+  : BVH_Triangulation<Standard_ShortReal, 3>(),
+    myArrayID (theArrayID)
   {
     //
   }
@@ -140,16 +152,68 @@ public:
   {
     //
   }
+
+  //! Returns Id of associated primitive array.
+  const Standard_Size AssociatedPArrayID() const
+  {
+    return myArrayID;
+  }
+
+  //! Returns material index of triangle set.
+  Standard_Integer MaterialIndex() const
+  {
+    if (Elements.size() == 0)
+    {
+      return INVALID_MATERIAL;
+    }
+
+    return Elements.front().w();
+  }
+
+  //! Sets material index for entire triangle set.
+  void SetMaterialIndex (Standard_Integer theMatID)
+  {
+    for (Standard_Size anIdx = 0; anIdx < Elements.size(); ++anIdx)
+    {
+      Elements[anIdx].w() = theMatID;
+    }
+  }
+
+  //! Returns AABB of the given object.
+  using BVH_Triangulation<Standard_ShortReal, 3>::Box;
+
+  //! Returns AABB of primitive set.
+  BVH_BoxNt Box() const;
+
+  //! Returns centroid position along the given axis.
+  Standard_ShortReal Center (const Standard_Integer theIndex, const Standard_Integer theAxis) const;
+
+public:
+
+  BVH_Array3f Normals; //!< Array of vertex normals.
+
+  BVH_Array2f TexCrds; //!< Array of vertex UV coords.
+
+private:
+
+  Standard_Size myArrayID; //!< ID of associated primitive array.
+
 };
 
 //! Stores geometry of ray-tracing scene.
-class OpenGl_RaytraceGeometry : public BVH_Geometry<Standard_ShortReal, 4>
+class OpenGl_RaytraceGeometry : public BVH_Geometry<Standard_ShortReal, 3>
 {
 public:
 
   //! Value of invalid offset to return in case of errors.
   static const Standard_Integer INVALID_OFFSET = -1;
 
+  //! Maximum number of textures used in ray-tracing shaders.
+  //! This is not restriction of the solution implemented, but
+  //! rather the reasonable limit of the number of textures in
+  //! various applications (can be increased if needed).
+  static const Standard_Integer MAX_TEX_NUMBER = 32;
+
 public:
 
   //! Array of properties of light sources.
@@ -161,12 +225,15 @@ public:
     NCollection_StdAllocator<OpenGl_RaytraceMaterial> > Materials;
 
   //! Global ambient from all light sources.
-  BVH_Vec4f GlobalAmbient;
+  BVH_Vec4f Ambient;
 
 public:
 
   //! Creates uninitialized ray-tracing geometry.
   OpenGl_RaytraceGeometry()
+  : BVH_Geometry<Standard_ShortReal, 3>(),
+    myHighLevelTreeDepth (0),
+    myBottomLevelTreeDepth (0)
   {
     //
   }
@@ -177,10 +244,21 @@ public:
     //
   }
 
+  //! Clears only ray-tracing materials.
+  void ClearMaterials()
+  {
+    std::vector<OpenGl_RaytraceMaterial,
+      NCollection_StdAllocator<OpenGl_RaytraceMaterial> > anEmptyMaterials;
+
+    Materials.swap (anEmptyMaterials);
+
+    myTextures.Clear();
+  }
+
   //! Clears ray-tracing geometry.
   void Clear();
 
-public:
+public: //! @name methods related to acceleration structure
 
   //! Performs post-processing of high-level scene BVH.
   Standard_Boolean ProcessAcceleration();
@@ -204,7 +282,54 @@ public:
   //! If the node index is not valid the function returns NULL.
   //! @note Can be used after processing acceleration structure.
   OpenGl_TriangleSet* TriangleSet (Standard_Integer theNodeIdx);
+
+public: //! @name methods related to texture management
+
+  //! Adds new OpenGL texture to the scene and returns its index.
+  Standard_Integer AddTexture (const Handle(OpenGl_Texture)& theTexture);
+
+  //! Updates unique 64-bit texture handles to use in shaders.
+  Standard_Boolean UpdateTextureHandles (const Handle(OpenGl_Context)& theContext);
+
+  //! Makes the OpenGL texture handles resident (must be called before using).
+  Standard_Boolean AcquireTextures (const Handle(OpenGl_Context)& theContext) const;
+
+  //! Makes the OpenGL texture handles non-resident (must be called after using).
+  Standard_Boolean ReleaseTextures (const Handle(OpenGl_Context)& theContext) const;
+
+  //! Returns array of texture handles.
+  const std::vector<GLuint64>& TextureHandles() const
+  {
+    return myTextureHandles;
+  }
+
+  //! Checks if scene contains textured objects.
+  Standard_Integer HasTextures() const
+  {
+    return !myTextures.IsEmpty();
+  }
+
+public: //! @name auxiliary methods
+
+  //! Returns depth of high-level scene BVH from last build.
+  Standard_Integer HighLevelTreeDepth() const
+  {
+    return myHighLevelTreeDepth;
+  }
+
+  //! Returns maximum depth of bottom-level scene BVHs from last build.
+  Standard_Integer BottomLevelTreeDepth() const
+  {
+    return myBottomLevelTreeDepth;
+  }
+
+protected:
+
+  NCollection_Vector<Handle(OpenGl_Texture)> myTextures;             //!< Array of texture maps shared between rendered objects
+  std::vector<GLuint64>                      myTextureHandles;       //!< Array of unique 64-bit texture handles obtained from OpenGL
+  Standard_Integer                           myHighLevelTreeDepth;   //!< Depth of high-level scene BVH from last build
+  Standard_Integer                           myBottomLevelTreeDepth; //!< Maximum depth of bottom-level scene BVHs from last build
+
 };
 
 #endif
-#endif