1 // Created on: 2013-08-27
2 // Created by: Denis BOGOLEPOV
3 // Copyright (c) 2013-2014 OPEN CASCADE SAS
5 // This file is part of Open CASCADE Technology software library.
7 // This library is free software; you can redistribute it and/or modify it under
8 // the terms of the GNU Lesser General Public License version 2.1 as published
9 // by the Free Software Foundation, with special exception defined in the file
10 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
11 // distribution for complete text of the license and disclaimer of any warranty.
13 // Alternatively, this file may be used under the terms of Open CASCADE
14 // commercial license or contractual agreement.
16 #ifndef _OpenGl_SceneGeometry_Header
17 #define _OpenGl_SceneGeometry_Header
19 #include <BVH_Geometry.hxx>
20 #include <BVH_Triangulation.hxx>
21 #include <BVH_BinnedBuilder.hxx>
22 #include <NCollection_StdAllocator.hxx>
23 #include <OpenGl_TextureBufferArb.hxx>
24 #include <OpenGl_Texture.hxx>
25 #include <OpenGl_Sampler.hxx>
28 struct OpenGl_ElementNode;
30 class OpenGl_Structure;
31 class OpenGl_PrimitiveArray;
33 namespace OpenGl_Raytrace
35 //! Checks to see if the group contains ray-trace geometry.
36 Standard_EXPORT Standard_Boolean IsRaytracedGroup (const OpenGl_Group* theGroup);
38 //! Checks to see if the element contains ray-trace geometry.
39 Standard_EXPORT Standard_Boolean IsRaytracedElement (const OpenGl_ElementNode* theNode);
41 //! Checks to see if the element contains ray-trace geometry.
42 Standard_EXPORT Standard_Boolean IsRaytracedElement (const OpenGl_Element* theElement);
45 //! Stores properties of surface material.
46 struct OpenGl_RaytraceMaterial
48 BVH_Vec4f Ambient; //!< Ambient reflection coefficient
49 BVH_Vec4f Diffuse; //!< Diffuse reflection coefficient
50 BVH_Vec4f Specular; //!< Glossy reflection coefficient
51 BVH_Vec4f Emission; //!< Material emission
52 BVH_Vec4f Reflection; //!< Specular reflection coefficient
53 BVH_Vec4f Refraction; //!< Specular refraction coefficient
54 BVH_Vec4f Transparency; //!< Material transparency
55 BVH_Mat4f TextureTransform; //!< Texture transformation matrix
57 //! Physically-based material properties (used in path tracing engine).
60 BVH_Vec4f Kc; //!< Weight of coat specular/glossy BRDF
61 BVH_Vec4f Kd; //!< Weight of base diffuse BRDF
62 BVH_Vec4f Ks; //!< Weight of base specular/glossy BRDF
63 BVH_Vec4f Kt; //!< Weight of base specular/glossy BTDF
64 BVH_Vec4f Le; //!< Radiance emitted by the surface
65 BVH_Vec4f FresnelCoat; //!< Fresnel coefficients of coat layer
66 BVH_Vec4f FresnelBase; //!< Fresnel coefficients of base layer
67 BVH_Vec4f Absorption; //!< Absorption color/intensity
72 //! Empty constructor.
73 Standard_EXPORT OpenGl_RaytraceMaterial();
75 //! Returns packed (serialized) representation of material.
76 const Standard_ShortReal* Packed()
78 return reinterpret_cast<Standard_ShortReal*> (this);
82 //! Stores properties of OpenGL light source.
83 struct OpenGl_RaytraceLight
86 BVH_Vec4f Emission; //!< Diffuse intensity (in terms of OpenGL)
87 BVH_Vec4f Position; //!< Position of light source (in terms of OpenGL)
91 //! Creates new light source.
92 OpenGl_RaytraceLight() { }
94 //! Creates new light source.
95 Standard_EXPORT OpenGl_RaytraceLight (const BVH_Vec4f& theEmission,
96 const BVH_Vec4f& thePosition);
98 //! Returns packed (serialized) representation of light source.
99 const Standard_ShortReal* Packed()
101 return reinterpret_cast<Standard_ShortReal*> (this);
105 //! Shared pointer to quad BVH (QBVH) tree.
106 typedef opencascade::handle<BVH_Tree<Standard_ShortReal, 3, BVH_QuadTree> > QuadBvhHandle;
107 typedef BVH_Triangulation<Standard_ShortReal, 3> OpenGl_BVHTriangulation3f;
109 //! Triangulation of single OpenGL primitive array.
110 class OpenGl_TriangleSet : public OpenGl_BVHTriangulation3f
112 DEFINE_STANDARD_RTTIEXT(OpenGl_TriangleSet, OpenGl_BVHTriangulation3f)
115 //! Value of invalid material index to return in case of errors.
116 static const Standard_Integer INVALID_MATERIAL = -1;
120 //! Creates new OpenGL element triangulation.
121 Standard_EXPORT OpenGl_TriangleSet (const Standard_Size theArrayID,
122 const opencascade::handle<BVH_Builder<Standard_ShortReal, 3> >& theBuilder);
124 //! Returns ID of associated primitive array.
125 Standard_Size AssociatedPArrayID() const
130 //! Returns material index of triangle set.
131 Standard_Integer MaterialIndex() const
133 if (Elements.size() == 0)
135 return INVALID_MATERIAL;
138 return Elements.front().w();
141 //! Sets material index for entire triangle set.
142 void SetMaterialIndex (Standard_Integer theMatID)
144 for (Standard_Size anIdx = 0; anIdx < Elements.size(); ++anIdx)
146 Elements[anIdx].w() = theMatID;
150 //! Returns AABB of primitive set.
151 virtual BVH_BoxNt Box() const Standard_OVERRIDE;
153 //! Returns AABB of the given object.
154 using BVH_Triangulation<Standard_ShortReal, 3>::Box;
156 //! Returns centroid position along the given axis.
157 Standard_EXPORT virtual Standard_ShortReal Center (const Standard_Integer theIndex, const Standard_Integer theAxis) const Standard_OVERRIDE;
159 //! Returns quad BVH (QBVH) tree produced from binary BVH.
160 Standard_EXPORT const QuadBvhHandle& QuadBVH();
164 BVH_Array3f Normals; //!< Array of vertex normals.
165 BVH_Array2f TexCrds; //!< Array of texture coords.
169 Standard_Size myArrayID; //!< ID of associated primitive array.
171 QuadBvhHandle myQuadBVH; //!< QBVH produced from binary BVH tree.
175 //! Stores geometry of ray-tracing scene.
176 class OpenGl_RaytraceGeometry : public BVH_Geometry<Standard_ShortReal, 3>
180 //! Value of invalid offset to return in case of errors.
181 static const Standard_Integer INVALID_OFFSET = -1;
183 //! Maximum number of textures used in ray-tracing shaders.
184 //! This is not restriction of the solution implemented, but
185 //! rather the reasonable limit of the number of textures in
186 //! various applications (can be increased if needed).
187 static const Standard_Integer MAX_TEX_NUMBER = 32;
191 //! Array of properties of light sources.
192 std::vector<OpenGl_RaytraceLight,
193 NCollection_StdAllocator<OpenGl_RaytraceLight> > Sources;
195 //! Array of 'front' material properties.
196 std::vector<OpenGl_RaytraceMaterial,
197 NCollection_StdAllocator<OpenGl_RaytraceMaterial> > Materials;
199 //! Global ambient from all light sources.
204 //! Creates uninitialized ray-tracing geometry.
205 OpenGl_RaytraceGeometry()
206 : BVH_Geometry<Standard_ShortReal, 3>(),
207 myTopLevelTreeDepth (0),
208 myBotLevelTreeDepth (0)
213 //! Releases resources of ray-tracing geometry.
214 ~OpenGl_RaytraceGeometry()
219 //! Clears only ray-tracing materials.
220 void ClearMaterials()
222 std::vector<OpenGl_RaytraceMaterial,
223 NCollection_StdAllocator<OpenGl_RaytraceMaterial> > anEmptyMaterials;
225 Materials.swap (anEmptyMaterials);
230 //! Clears ray-tracing geometry.
231 Standard_EXPORT virtual void Clear() Standard_OVERRIDE;
233 public: //! @name methods related to acceleration structure
235 //! Performs post-processing of high-level scene BVH.
236 Standard_EXPORT Standard_Boolean ProcessAcceleration();
238 //! Returns offset of bottom-level BVH for given leaf node.
239 //! If the node index is not valid the function returns -1.
240 //! @note Can be used after processing acceleration structure.
241 Standard_EXPORT Standard_Integer AccelerationOffset (Standard_Integer theNodeIdx);
243 //! Returns offset of triangulation vertices for given leaf node.
244 //! If the node index is not valid the function returns -1.
245 //! @note Can be used after processing acceleration structure.
246 Standard_EXPORT Standard_Integer VerticesOffset (Standard_Integer theNodeIdx);
248 //! Returns offset of triangulation elements for given leaf node.
249 //! If the node index is not valid the function returns -1.
250 //! @note Can be used after processing acceleration structure.
251 Standard_EXPORT Standard_Integer ElementsOffset (Standard_Integer theNodeIdx);
253 //! Returns triangulation data for given leaf node.
254 //! If the node index is not valid the function returns NULL.
255 //! @note Can be used after processing acceleration structure.
256 Standard_EXPORT OpenGl_TriangleSet* TriangleSet (Standard_Integer theNodeIdx);
258 //! Returns quad BVH (QBVH) tree produced from binary BVH.
259 Standard_EXPORT const QuadBvhHandle& QuadBVH();
261 public: //! @name methods related to texture management
263 //! Checks if scene contains textured objects.
264 Standard_Boolean HasTextures() const
266 return !myTextures.IsEmpty();
269 //! Adds new OpenGL texture to the scene and returns its index.
270 Standard_EXPORT Standard_Integer AddTexture (const Handle(OpenGl_Texture)& theTexture);
272 //! Updates unique 64-bit texture handles to use in shaders.
273 Standard_EXPORT Standard_Boolean UpdateTextureHandles (const Handle(OpenGl_Context)& theContext);
275 //! Makes the OpenGL texture handles resident (must be called before using).
276 Standard_EXPORT Standard_Boolean AcquireTextures (const Handle(OpenGl_Context)& theContext);
278 //! Makes the OpenGL texture handles non-resident (must be called after using).
279 Standard_EXPORT Standard_Boolean ReleaseTextures (const Handle(OpenGl_Context)& theContext) const;
281 //! Returns array of texture handles.
282 const std::vector<GLuint64>& TextureHandles() const
284 return myTextureHandles;
287 //! Releases OpenGL resources.
288 void ReleaseResources (const Handle(OpenGl_Context)& )
293 public: //! @name auxiliary methods
295 //! Returns depth of top-level scene BVH from last build.
296 Standard_Integer TopLevelTreeDepth() const
298 return myTopLevelTreeDepth;
301 //! Returns maximum depth of bottom-level scene BVHs from last build.
302 Standard_Integer BotLevelTreeDepth() const
304 return myBotLevelTreeDepth;
309 NCollection_Vector<Handle(OpenGl_Texture)> myTextures; //!< Array of texture maps shared between rendered objects
310 std::vector<GLuint64> myTextureHandles; //!< Array of unique 64-bit texture handles obtained from OpenGL
311 Standard_Integer myTopLevelTreeDepth; //!< Depth of high-level scene BVH from last build
312 Standard_Integer myBotLevelTreeDepth; //!< Maximum depth of bottom-level scene BVHs from last build
314 QuadBvhHandle myQuadBVH; //!< QBVH produced from binary BVH tree.