// Created on: 2011-08-01 // Created by: Sergey ZERCHANINOV // Copyright (c) 2011-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_Structure_Header #define OpenGl_Structure_Header #include #include #include #include #include #include #include #include #include #include #include #include class OpenGl_Structure; class OpenGl_GraphicDriver; typedef NCollection_List OpenGl_ListOfStructure; //! Implementation of low-level graphic structure. class OpenGl_Structure : public Graphic3d_CStructure { friend class OpenGl_Group; public: //! Auxiliary wrapper to iterate OpenGl_Group sequence. class GroupIterator { public: GroupIterator (const Graphic3d_SequenceOfGroup& theGroups) : myIter (theGroups) {} Standard_Boolean More() const { return myIter.More(); } void Next() { myIter.Next(); } const OpenGl_Group* Value() const { return (const OpenGl_Group* )(myIter.Value().operator->()); } OpenGl_Group* ChangeValue() { return (OpenGl_Group* )(myIter.ChangeValue().operator->()); } private: Graphic3d_SequenceOfGroup::Iterator myIter; }; public: //! Create empty structure Standard_EXPORT OpenGl_Structure (const Handle(Graphic3d_StructureManager)& theManager); //! Setup structure graphic state Standard_EXPORT virtual void OnVisibilityChanged() Standard_OVERRIDE; //! Clear graphic data Standard_EXPORT virtual void Clear() Standard_OVERRIDE; //! Connect other structure to this one Standard_EXPORT virtual void Connect (Graphic3d_CStructure& theStructure) Standard_OVERRIDE; //! Disconnect other structure to this one Standard_EXPORT virtual void Disconnect (Graphic3d_CStructure& theStructure) Standard_OVERRIDE; //! Synchronize structure transformation Standard_EXPORT virtual void UpdateTransformation() Standard_OVERRIDE; //! Highlight entire structure with color Standard_EXPORT virtual void HighlightWithColor (const Graphic3d_Vec3& theColor, const Standard_Boolean theToCreate) Standard_OVERRIDE; //! Highlight structure using boundary box Standard_EXPORT virtual void HighlightWithBndBox (const Handle(Graphic3d_Structure)& theStruct, const Standard_Boolean theToCreate) Standard_OVERRIDE; //! Create shadow link to this structure Standard_EXPORT virtual Handle(Graphic3d_CStructure) ShadowLink (const Handle(Graphic3d_StructureManager)& theManager) const Standard_OVERRIDE; //! Create new group within this structure Standard_EXPORT virtual Handle(Graphic3d_Group) NewGroup (const Handle(Graphic3d_Structure)& theStruct) Standard_OVERRIDE; //! Remove group from this structure Standard_EXPORT virtual void RemoveGroup (const Handle(Graphic3d_Group)& theGroup) Standard_OVERRIDE; public: //! Access graphic driver OpenGl_GraphicDriver* GlDriver() const { return (OpenGl_GraphicDriver* )myGraphicDriver.operator->(); } void clearHighlightBox (const Handle(OpenGl_Context)& theGlCtx); void setHighlightColor (const Handle(OpenGl_Context)& theGlCtx, const Graphic3d_Vec3& theColor); void clearHighlightColor (const Handle(OpenGl_Context)& theGlCtx); Standard_EXPORT void Clear (const Handle(OpenGl_Context)& theGlCtx); //! Renders the structure. virtual void Render (const Handle(OpenGl_Workspace)& theWorkspace) const; //! Releases structure resources. virtual void Release (const Handle(OpenGl_Context)& theGlCtx); //! Marks structure as not overlapping view volume (as it is by default). void ResetCullingStatus() const { if (!IsAlwaysRendered()) { myIsCulled = Standard_True; } } //! Marks structure as overlapping the current view volume one. //! The method is called during traverse of BVH tree. void MarkAsNotCulled() const { myIsCulled = Standard_False; } //! Returns Standard_False if the structure hits the current view volume, otherwise //! returns Standard_True. The default value for all structures before each traverse //! of BVH tree is Standard_True. Standard_Boolean IsCulled() const { return myIsCulled; } //! Checks if the structure should be included into BVH tree or not. Standard_Boolean IsAlwaysRendered() const { return IsInfinite || IsForHighlight || IsMutable || Is2dText || (TransformPersistence.Flags & Graphic3d_TMF_2d) != 0 || (TransformPersistence.Flags & Graphic3d_TMF_PanPers) != 0 || (TransformPersistence.Flags & Graphic3d_TMF_TriedronPers) != 0; } //! This method releases GL resources without actual elements destruction. //! As result structure could be correctly destroyed layer without GL context //! (after last window was closed for example). //! //! Notice however that reusage of this structure after calling this method is incorrect //! and will lead to broken visualization due to loosed data. Standard_EXPORT void ReleaseGlResources (const Handle(OpenGl_Context)& theGlCtx); //! Returns instanced OpenGL structure. const OpenGl_Structure* InstancedStructure() const { return myInstancedStructure; } //! Returns structure modification state (for ray-tracing). Standard_Size ModificationState() const { return myModificationState; } //! Resets structure modification state (for ray-tracing). void ResetModificationState() const { myModificationState = 0; } //! Is the structure ray-tracable (contains ray-tracable elements)? Standard_Boolean IsRaytracable() const; protected: Standard_EXPORT virtual ~OpenGl_Structure(); //! Updates ray-tracable status for structure and its parents. void UpdateStateIfRaytracable (const Standard_Boolean toCheck = Standard_True) const; //! Renders groups of structure without applying any attributes (i.e. transform, material etc). //! @param theWorkspace current workspace //! @param theHasClosed flag will be set to TRUE if structure contains at least one group of closed primitives Standard_EXPORT void renderGeometry (const Handle(OpenGl_Workspace)& theWorkspace, bool& theHasClosed) const; protected: Handle(OpenGl_Group) myHighlightBox; OpenGl_Vec4* myHighlightColor; OpenGl_Structure* myInstancedStructure; mutable Standard_Boolean myIsRaytracable; mutable Standard_Size myModificationState; mutable Standard_Boolean myIsCulled; //!< A status specifying is structure needs to be rendered after BVH tree traverse. Standard_Boolean myIsMirrored; //!< Used to tell OpenGl to interpret polygons in clockwise order. public: DEFINE_STANDARD_RTTIEXT(OpenGl_Structure,Graphic3d_CStructure) // Type definition }; DEFINE_STANDARD_HANDLE(OpenGl_Structure, Graphic3d_CStructure) #endif // OpenGl_Structure_Header