// 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
{
//! 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);
}
//! Material transparency.
BVH_Vec4f Transparency;
+ //! Texture transformation matrix.
+ BVH_Mat4f TextureTransform;
+
public:
//! Creates new default material.
};
//! 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)
{
//
}
{
//
}
+
+ //! 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.
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)
{
//
}
//
}
+ //! 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();
//! 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