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>
27 struct OpenGl_ElementNode;
29 class OpenGl_Structure;
30 class OpenGl_PrimitiveArray;
32 namespace OpenGl_Raytrace
34 //! Checks to see if the group contains ray-trace geometry.
35 Standard_Boolean IsRaytracedGroup (const OpenGl_Group* theGroup);
37 //! Checks to see if the element contains ray-trace geometry.
38 Standard_Boolean IsRaytracedElement (const OpenGl_ElementNode* theNode);
40 //! Checks to see if the element contains ray-trace geometry.
41 Standard_Boolean IsRaytracedElement (const OpenGl_Element* theElement);
43 //! Checks to see if the structure contains ray-trace geometry.
44 Standard_Boolean IsRaytracedStructure (const OpenGl_Structure* theStructure);
47 //! Stores properties of surface material.
48 class OpenGl_RaytraceMaterial
52 //! Ambient reflection coefficient.
55 //! Diffuse reflection coefficient.
58 //! Glossy reflection coefficient.
61 //! Material emission.
64 //! Specular reflection coefficient.
67 //! Specular refraction coefficient.
70 //! Material transparency.
71 BVH_Vec4f Transparency;
73 //! Texture transformation matrix.
74 BVH_Mat4f TextureTransform;
76 //! Physically-based material properties (used in path tracing engine).
79 //! Weight of the diffuse BRDF.
82 //! Weight of the reflection BRDF.
85 //! Weight of the transmission BTDF.
88 //! Weight of the Blinn's glossy BRDF.
91 //! Self-emitted radiance.
94 //! Fresnel coefficients.
97 //! Absorption color for the transmission BSDF.
104 //! Creates new default material.
105 OpenGl_RaytraceMaterial();
107 //! Creates new material with specified properties.
108 OpenGl_RaytraceMaterial (const BVH_Vec4f& theAmbient,
109 const BVH_Vec4f& theDiffuse,
110 const BVH_Vec4f& theSpecular);
112 //! Creates new material with specified properties.
113 OpenGl_RaytraceMaterial (const BVH_Vec4f& theAmbient,
114 const BVH_Vec4f& theDiffuse,
115 const BVH_Vec4f& theSpecular,
116 const BVH_Vec4f& theEmission,
117 const BVH_Vec4f& theTranspar);
119 //! Creates new material with specified properties.
120 OpenGl_RaytraceMaterial (const BVH_Vec4f& theAmbient,
121 const BVH_Vec4f& theDiffuse,
122 const BVH_Vec4f& theSpecular,
123 const BVH_Vec4f& theEmission,
124 const BVH_Vec4f& theTranspar,
125 const BVH_Vec4f& theReflection,
126 const BVH_Vec4f& theRefraction);
128 //! Returns packed (serialized) representation of material.
129 const Standard_ShortReal* Packed()
131 return reinterpret_cast<Standard_ShortReal*> (this);
135 //! Stores properties of OpenGL light source.
136 class OpenGl_RaytraceLight
140 //! Diffuse intensity (in terms of OpenGL).
143 //! Position of light source (in terms of OpenGL).
148 //! Creates new light source.
149 OpenGl_RaytraceLight (const BVH_Vec4f& theDiffuse,
150 const BVH_Vec4f& thePosition);
152 //! Returns packed (serialized) representation of light source.
153 const Standard_ShortReal* Packed()
155 return reinterpret_cast<Standard_ShortReal*> (this);
159 //! Triangulation of single OpenGL primitive array.
160 class OpenGl_TriangleSet : public BVH_Triangulation<Standard_ShortReal, 3>
164 //! Value of invalid material index to return in case of errors.
165 static const Standard_Integer INVALID_MATERIAL = -1;
169 //! Creates new OpenGL element triangulation.
170 OpenGl_TriangleSet (const Standard_Size theArrayID);
172 //! Releases resources of OpenGL element triangulation.
173 ~OpenGl_TriangleSet()
178 //! Returns Id of associated primitive array.
179 const Standard_Size AssociatedPArrayID() const
184 //! Returns material index of triangle set.
185 Standard_Integer MaterialIndex() const
187 if (Elements.size() == 0)
189 return INVALID_MATERIAL;
192 return Elements.front().w();
195 //! Sets material index for entire triangle set.
196 void SetMaterialIndex (Standard_Integer theMatID)
198 for (Standard_Size anIdx = 0; anIdx < Elements.size(); ++anIdx)
200 Elements[anIdx].w() = theMatID;
204 //! Returns AABB of the given object.
205 using BVH_Triangulation<Standard_ShortReal, 3>::Box;
207 //! Returns AABB of primitive set.
208 BVH_BoxNt Box() const;
210 //! Returns centroid position along the given axis.
211 Standard_ShortReal Center (const Standard_Integer theIndex, const Standard_Integer theAxis) const;
215 BVH_Array3f Normals; //!< Array of vertex normals.
217 BVH_Array2f TexCrds; //!< Array of vertex UV coords.
221 Standard_Size myArrayID; //!< ID of associated primitive array.
225 //! Stores geometry of ray-tracing scene.
226 class OpenGl_RaytraceGeometry : public BVH_Geometry<Standard_ShortReal, 3>
230 //! Value of invalid offset to return in case of errors.
231 static const Standard_Integer INVALID_OFFSET = -1;
233 //! Maximum number of textures used in ray-tracing shaders.
234 //! This is not restriction of the solution implemented, but
235 //! rather the reasonable limit of the number of textures in
236 //! various applications (can be increased if needed).
237 static const Standard_Integer MAX_TEX_NUMBER = 32;
241 //! Array of properties of light sources.
242 std::vector<OpenGl_RaytraceLight,
243 NCollection_StdAllocator<OpenGl_RaytraceLight> > Sources;
245 //! Array of 'front' material properties.
246 std::vector<OpenGl_RaytraceMaterial,
247 NCollection_StdAllocator<OpenGl_RaytraceMaterial> > Materials;
249 //! Global ambient from all light sources.
254 //! Creates uninitialized ray-tracing geometry.
255 OpenGl_RaytraceGeometry()
256 : BVH_Geometry<Standard_ShortReal, 3>(),
257 myHighLevelTreeDepth (0),
258 myBottomLevelTreeDepth (0)
263 //! Releases resources of ray-tracing geometry.
264 ~OpenGl_RaytraceGeometry()
269 //! Clears only ray-tracing materials.
270 void ClearMaterials()
272 std::vector<OpenGl_RaytraceMaterial,
273 NCollection_StdAllocator<OpenGl_RaytraceMaterial> > anEmptyMaterials;
275 Materials.swap (anEmptyMaterials);
280 //! Clears ray-tracing geometry.
283 public: //! @name methods related to acceleration structure
285 //! Performs post-processing of high-level scene BVH.
286 Standard_Boolean ProcessAcceleration();
288 //! Returns offset of bottom-level BVH for given leaf node.
289 //! If the node index is not valid the function returns -1.
290 //! @note Can be used after processing acceleration structure.
291 Standard_Integer AccelerationOffset (Standard_Integer theNodeIdx);
293 //! Returns offset of triangulation vertices for given leaf node.
294 //! If the node index is not valid the function returns -1.
295 //! @note Can be used after processing acceleration structure.
296 Standard_Integer VerticesOffset (Standard_Integer theNodeIdx);
298 //! Returns offset of triangulation elements for given leaf node.
299 //! If the node index is not valid the function returns -1.
300 //! @note Can be used after processing acceleration structure.
301 Standard_Integer ElementsOffset (Standard_Integer theNodeIdx);
303 //! Returns triangulation data for given leaf node.
304 //! If the node index is not valid the function returns NULL.
305 //! @note Can be used after processing acceleration structure.
306 OpenGl_TriangleSet* TriangleSet (Standard_Integer theNodeIdx);
308 public: //! @name methods related to texture management
310 //! Adds new OpenGL texture to the scene and returns its index.
311 Standard_Integer AddTexture (const Handle(OpenGl_Texture)& theTexture);
313 //! Updates unique 64-bit texture handles to use in shaders.
314 Standard_Boolean UpdateTextureHandles (const Handle(OpenGl_Context)& theContext);
316 //! Makes the OpenGL texture handles resident (must be called before using).
317 Standard_Boolean AcquireTextures (const Handle(OpenGl_Context)& theContext) const;
319 //! Makes the OpenGL texture handles non-resident (must be called after using).
320 Standard_Boolean ReleaseTextures (const Handle(OpenGl_Context)& theContext) const;
322 //! Returns array of texture handles.
323 const std::vector<GLuint64>& TextureHandles() const
325 return myTextureHandles;
328 //! Checks if scene contains textured objects.
329 Standard_Boolean HasTextures() const
331 return !myTextures.IsEmpty();
334 public: //! @name auxiliary methods
336 //! Returns depth of high-level scene BVH from last build.
337 Standard_Integer HighLevelTreeDepth() const
339 return myHighLevelTreeDepth;
342 //! Returns maximum depth of bottom-level scene BVHs from last build.
343 Standard_Integer BottomLevelTreeDepth() const
345 return myBottomLevelTreeDepth;
350 NCollection_Vector<Handle(OpenGl_Texture)> myTextures; //!< Array of texture maps shared between rendered objects
351 std::vector<GLuint64> myTextureHandles; //!< Array of unique 64-bit texture handles obtained from OpenGL
352 Standard_Integer myHighLevelTreeDepth; //!< Depth of high-level scene BVH from last build
353 Standard_Integer myBottomLevelTreeDepth; //!< Maximum depth of bottom-level scene BVHs from last build