// Created on: 2013-08-27 // Created by: Denis BOGOLEPOV // 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 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. // // Alternatively, this file may be used under the terms of Open CASCADE // commercial license or contractual agreement. #ifndef _OpenGl_SceneGeometry_Header #define _OpenGl_SceneGeometry_Header #include #include #include #include #include #include #include class OpenGl_Element; struct OpenGl_ElementNode; class OpenGl_Group; class OpenGl_Structure; class OpenGl_PrimitiveArray; namespace OpenGl_Raytrace { //! Checks to see if the group contains ray-trace geometry. Standard_Boolean IsRaytracedGroup (const OpenGl_Group* theGroup); //! 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); } //! Stores properties of surface material. class OpenGl_RaytraceMaterial { public: //! Ambient reflection coefficient. BVH_Vec4f Ambient; //! Diffuse reflection coefficient. BVH_Vec4f Diffuse; //! Glossy reflection coefficient. BVH_Vec4f Specular; //! Material emission. BVH_Vec4f Emission; //! Specular reflection coefficient. BVH_Vec4f Reflection; //! Specular refraction coefficient. BVH_Vec4f Refraction; //! Material transparency. BVH_Vec4f Transparency; //! Texture transformation matrix. BVH_Mat4f TextureTransform; //! Physically-based material properties (used in path tracing engine). struct Physical { //! Weight of the diffuse BRDF. BVH_Vec4f Kd; //! Weight of the reflection BRDF. BVH_Vec4f Kr; //! Weight of the transmission BTDF. BVH_Vec4f Kt; //! Weight of the Blinn's glossy BRDF. BVH_Vec4f Ks; //! Self-emitted radiance. BVH_Vec4f Le; //! Fresnel coefficients. BVH_Vec4f Fresnel; //! Absorption color for the transmission BSDF. BVH_Vec4f Absorption; } BSDF; public: //! Creates new default material. OpenGl_RaytraceMaterial(); //! Creates new material with specified properties. OpenGl_RaytraceMaterial (const BVH_Vec4f& theAmbient, const BVH_Vec4f& theDiffuse, const BVH_Vec4f& theSpecular); //! Creates new material with specified properties. OpenGl_RaytraceMaterial (const BVH_Vec4f& theAmbient, const BVH_Vec4f& theDiffuse, const BVH_Vec4f& theSpecular, const BVH_Vec4f& theEmission, const BVH_Vec4f& theTranspar); //! Creates new material with specified properties. OpenGl_RaytraceMaterial (const BVH_Vec4f& theAmbient, const BVH_Vec4f& theDiffuse, const BVH_Vec4f& theSpecular, const BVH_Vec4f& theEmission, const BVH_Vec4f& theTranspar, const BVH_Vec4f& theReflection, const BVH_Vec4f& theRefraction); //! Returns packed (serialized) representation of material. const Standard_ShortReal* Packed() { return reinterpret_cast (this); } }; //! Stores properties of OpenGL light source. class OpenGl_RaytraceLight { public: //! Diffuse intensity (in terms of OpenGL). BVH_Vec4f Diffuse; //! Position of light source (in terms of OpenGL). BVH_Vec4f Position; public: //! Creates new light source. OpenGl_RaytraceLight (const BVH_Vec4f& theDiffuse, const BVH_Vec4f& thePosition); //! Returns packed (serialized) representation of light source. const Standard_ShortReal* Packed() { return reinterpret_cast (this); } }; //! Triangulation of single OpenGL primitive array. class OpenGl_TriangleSet : public BVH_Triangulation { public: //! 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 (const Standard_Size theArrayID); //! Releases resources of OpenGL element triangulation. ~OpenGl_TriangleSet() { // } //! Returns Id of associated primitive array. 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::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. }; //! Set of clipping planes specific for OpenGL primitive array. class OpenGl_RaytraceClipPlanes { public: //! Maximum number of clipping planes used in ray-tracing for each //! OpenGL primitive array. This is not implementation restriction, //! but it is reasonable to limit max number of planes in order to //! simplify GLSL data representation. static const Standard_Integer MAX_PLANE_NUMBER = 8; //! State of clipping plane. enum ClipPlaneState { CLIP_PLANE_OFF = -1, //!< plane is deactivated CLIP_PLANE_VIEW = 0, //!< plane is in view space CLIP_PLANE_WORLD = 1 //!< plane is in world space }; //! Wrapper for clipping plane configuration. class ClipPlane { public: //! Creates new clipping plane wrapper. ClipPlane (BVH_Vec4f& theSettings, BVH_Vec4f& theEquation) : mySettings (theSettings), myEquation (theEquation) {} //! Sets 4D equation vector for clipping plane. void SetEquation (const BVH_Vec4d& theEquation, const ClipPlaneState theState = CLIP_PLANE_WORLD) { for (Standard_Integer anIndex = 0; anIndex < 4; ++anIndex) { myEquation[anIndex] = static_cast (theEquation[anIndex]); } SetState (theState); } //! Returns state of clipping plane. ClipPlaneState State() { return static_cast (mySettings.x()); } //! Sets state of clipping plane. void SetState (const ClipPlaneState theState) { mySettings.x() = static_cast (theState); } private: //! Settings of clipping plane. BVH_Vec4f& mySettings; //! 4D equation vector of clipping plane. BVH_Vec4f& myEquation; }; public: //! Creates new set of clipping planes. OpenGl_RaytraceClipPlanes(); //! Returns clipping plane for the given index. ClipPlane operator[] (const Standard_Integer theIndex) { return ClipPlane (myClipPlanes[theIndex * 2 + 0], myClipPlanes[theIndex * 2 + 1]); } //! Returns packed (serialized) representation of clipping planes set. const Standard_ShortReal* Packed() { return reinterpret_cast (this); } private: //! Serialized clipping planes storage. BVH_Vec4f myClipPlanes[MAX_PLANE_NUMBER * 2]; }; //! Stores transform properties of ray-tracing object. class OpenGl_RaytraceTransform : public BVH_Transform { public: //! Value of invalid clipping plane set. static const Standard_Integer NO_CLIPPING = -1; public: //! Creates new identity transformation. OpenGl_RaytraceTransform() : BVH_Transform() { myClipSetID = NO_CLIPPING; // no clipping by default } //! Creates new transformation with specified matrix. OpenGl_RaytraceTransform (const BVH_Mat4f& theTransform) : BVH_Transform (theTransform) { myClipSetID = NO_CLIPPING; // no clipping by default } //! Returns ID of associated set of clipping planes. Standard_Integer ClipSetID() const { return myClipSetID; } //! Sets ID of associated set of clipping planes. void SetClipSetID (const Standard_Integer theClipSetID) { myClipSetID = theClipSetID; } protected: //! ID of associated set of clipping planes. Standard_Integer myClipSetID; }; //! Stores geometry of ray-tracing scene. class OpenGl_RaytraceGeometry : public BVH_Geometry { 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. std::vector > Sources; //! Array of 'front' material properties. std::vector > Materials; //! Array of sets of clipping plane parameters. std::vector > ClipPlanes; //! Global ambient from all light sources. BVH_Vec4f Ambient; public: //! Creates uninitialized ray-tracing geometry. OpenGl_RaytraceGeometry() : BVH_Geometry(), myHighLevelTreeDepth (0), myBottomLevelTreeDepth (0) { // } //! Releases resources of ray-tracing geometry. ~OpenGl_RaytraceGeometry() { // } //! Clears only ray-tracing materials. void ClearMaterials() { std::vector > anEmptyMaterials; Materials.swap (anEmptyMaterials); myTextures.Clear(); } //! Clears ray-tracing geometry. void Clear(); public: //! @name methods related to acceleration structure //! Performs post-processing of high-level scene BVH. Standard_Boolean ProcessAcceleration(); //! Returns offset of bottom-level BVH for given leaf node. //! If the node index is not valid the function returns -1. //! @note Can be used after processing acceleration structure. Standard_Integer AccelerationOffset (Standard_Integer theNodeIdx); //! Returns offset of triangulation vertices for given leaf node. //! If the node index is not valid the function returns -1. //! @note Can be used after processing acceleration structure. Standard_Integer VerticesOffset (Standard_Integer theNodeIdx); //! Returns offset of triangulation elements for given leaf node. //! If the node index is not valid the function returns -1. //! @note Can be used after processing acceleration structure. Standard_Integer ElementsOffset (Standard_Integer theNodeIdx); //! Returns triangulation data for given leaf node. //! 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& TextureHandles() const { return myTextureHandles; } //! Checks if scene contains textured objects. Standard_Boolean HasTextures() const { return !myTextures.IsEmpty(); } //! Releases OpenGL resources. void ReleaseResources (const Handle(OpenGl_Context)& theContext) { if (!myTextureSampler.IsNull()) { myTextureSampler->Release (theContext.operator->()); myTextureSampler.Nullify(); } } 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 myTextures; //!< Array of texture maps shared between rendered objects Handle(OpenGl_Sampler) myTextureSampler; //!< Sampler object providing fixed sampling params for texures std::vector 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