X-Git-Url: http://git.dev.opencascade.org/gitweb/?p=occt.git;a=blobdiff_plain;f=src%2FOpenGl%2FOpenGl_Structure.hxx;h=efac3ace6d3efc70d8eed9e1e1d358c9a3dbf65d;hp=04eb21feafcf6e98f3199b9cc82e80c50098871b;hb=1be4179947116e54658924f0149d3f35743a899a;hpb=51b10cd46682682f6b0f83ade5b32e43c1f89c8b diff --git a/src/OpenGl/OpenGl_Structure.hxx b/src/OpenGl/OpenGl_Structure.hxx index 04eb21feaf..efac3ace6d 100644 --- a/src/OpenGl/OpenGl_Structure.hxx +++ b/src/OpenGl/OpenGl_Structure.hxx @@ -1,94 +1,145 @@ // Created on: 2011-08-01 // Created by: Sergey ZERCHANINOV -// Copyright (c) 2011-2012 OPEN CASCADE SAS +// Copyright (c) 2011-2014 OPEN CASCADE SAS // -// The content of this file is subject to the Open CASCADE Technology Public -// License Version 6.5 (the "License"). You may not use the content of this file -// except in compliance with the License. Please obtain a copy of the License -// at http://www.opencascade.org and read it completely before using this file. +// This file is part of Open CASCADE Technology software library. // -// The Initial Developer of the Original Code is Open CASCADE S.A.S., having its -// main offices at: 1, place des Freres Montgolfier, 78280 Guyancourt, France. +// 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. // -// The Original Code and all software distributed under the License is -// distributed on an "AS IS" basis, without warranty of any kind, and the -// Initial Developer hereby disclaims all such warranties, including without -// limitation, any warranties of merchantability, fitness for a particular -// purpose or non-infringement. Please see the License for the specific terms -// and conditions governing the rights and limitations under the License. +// 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 +#include +#include -#include +#include class OpenGl_Structure; +class OpenGl_GraphicDriver; typedef NCollection_List OpenGl_ListOfStructure; -class OpenGl_Structure : public OpenGl_Element +//! Implementation of low-level graphic structure. +class OpenGl_Structure : public Graphic3d_CStructure { friend class OpenGl_Group; public: - OpenGl_Structure(); + //! 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->()); } - void SetTransformation (const float *AMatrix); + private: + Graphic3d_SequenceOfGroup::Iterator myIter; - void SetTransformPersistence (const CALL_DEF_TRANSFORM_PERSISTENCE &ATransPers); + }; - void SetAspectLine (const CALL_DEF_CONTEXTLINE &theAspect); - void SetAspectFace (const CALL_DEF_CONTEXTFILLAREA& theAspect); - void SetAspectMarker (const CALL_DEF_CONTEXTMARKER& theAspect); - void SetAspectText (const CALL_DEF_CONTEXTTEXT &theAspect); +public: - void SetHighlightBox (const Handle(OpenGl_Context)& theGlCtx, - const CALL_DEF_BOUNDBOX& theBoundBox); + //! Create empty structure + Standard_EXPORT OpenGl_Structure (const Handle(Graphic3d_StructureManager)& theManager); - void ClearHighlightBox (const Handle(OpenGl_Context)& theGlCtx); + //! Setup structure graphic state + Standard_EXPORT virtual void OnVisibilityChanged() Standard_OVERRIDE; - void SetHighlightColor (const Handle(OpenGl_Context)& theGlCtx, - const Standard_ShortReal R, - const Standard_ShortReal G, - const Standard_ShortReal B); + //! Clear graphic data + Standard_EXPORT virtual void Clear() Standard_OVERRIDE; - void ClearHighlightColor (const Handle(OpenGl_Context)& theGlCtx); + //! Connect other structure to this one + Standard_EXPORT virtual void Connect (Graphic3d_CStructure& theStructure) Standard_OVERRIDE; - void SetNamedStatus (const Standard_Integer aStatus); + //! Disconnect other structure to this one + Standard_EXPORT virtual void Disconnect (Graphic3d_CStructure& theStructure) Standard_OVERRIDE; - Standard_Boolean IsVisible() const { return !(myNamedStatus & OPENGL_NS_HIDE); } + //! Synchronize structure transformation + Standard_EXPORT virtual void SetTransformation (const Handle(Geom_Transformation)& theTrsf) Standard_OVERRIDE; - void SetClipPlanes (const Graphic3d_SequenceOfHClipPlane& thePlanes) { myClipPlanes = thePlanes; } + //! Highlights structure according to the given style and updates corresponding class fields + //! (highlight status and style) + Standard_EXPORT virtual void GraphicHighlight (const Handle(Graphic3d_HighlightStyle)& theStyle, + const Handle(Graphic3d_Structure)& theStruct) Standard_OVERRIDE; - void Connect (const OpenGl_Structure *astructure); - void Disconnect (const OpenGl_Structure *astructure); + //! Unighlights structure and updates corresponding class fields (highlight status and style) + Standard_EXPORT virtual void GraphicUnhighlight() Standard_OVERRIDE; - OpenGl_Group* AddGroup(); - void RemoveGroup (const Handle(OpenGl_Context)& theGlCtx, - const OpenGl_Group* theGroup); - void Clear (const Handle(OpenGl_Context)& theGlCtx); + //! Create shadow link to this structure + Standard_EXPORT virtual Handle(Graphic3d_CStructure) ShadowLink (const Handle(Graphic3d_StructureManager)& theManager) const Standard_OVERRIDE; - //! Set z layer ID to display the structure in specified layer - void SetZLayer (const Standard_Integer theLayerIndex); + //! Create new group within this structure + Standard_EXPORT virtual Handle(Graphic3d_Group) NewGroup (const Handle(Graphic3d_Structure)& theStruct) Standard_OVERRIDE; - //! Get z layer ID - Standard_Integer GetZLayer () const; + //! 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->(); + } + + Standard_EXPORT void Clear (const Handle(OpenGl_Context)& theGlCtx); + + //! Renders the structure. virtual void Render (const Handle(OpenGl_Workspace)& theWorkspace) const; - virtual void Release (const Handle(OpenGl_Context)& theGlCtx); + + //! 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 + || (!myTrsfPers.IsNull() && myTrsfPers->IsTrihedronOr2d()); + } //! This method releases GL resources without actual elements destruction. //! As result structure could be correctly destroyed layer without GL context @@ -96,93 +147,58 @@ public: //! //! Notice however that reusage of this structure after calling this method is incorrect //! and will lead to broken visualization due to loosed data. - void ReleaseGlResources (const Handle(OpenGl_Context)& theGlCtx); + Standard_EXPORT void ReleaseGlResources (const Handle(OpenGl_Context)& theGlCtx); - //! Returns list of OpenGL groups. - const OpenGl_ListOfGroup& Groups() const { return myGroups; } - - //! Returns list of connected OpenGL structures. - const OpenGl_ListOfStructure& ConnectedStructures() const { return myConnected; } - - //! Returns OpenGL face aspect. - const OpenGl_AspectFace* AspectFace() const { return myAspectFace; } - - //! Returns OpenGL transformation matrix. - const OpenGl_Matrix* Transformation() const { return myTransformation; } - - //! Returns OpenGL persistent translation. - const TEL_TRANSFORM_PERSISTENCE* PersistentTranslation() const { return myTransPers; } - -#ifdef HAVE_OPENCL + //! 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) + //! 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 { return myIsRaytracable; } - -#endif + Standard_Boolean IsRaytracable() const; protected: - virtual ~OpenGl_Structure(); + Standard_EXPORT virtual ~OpenGl_Structure(); -#ifdef HAVE_OPENCL + //! Updates ray-tracable status for structure and its parents. + void UpdateStateIfRaytracable (const Standard_Boolean toCheck = Standard_True) const; - //! Registers ancestor connected structure (for updating ray-tracing state). - void RegisterAncestorStructure (const OpenGl_Structure* theStructure) 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; - //! Unregisters ancestor connected structure (for updating ray-tracing state). - void UnregisterAncestorStructure (const OpenGl_Structure* theStructure) const; + //! Highlight structure using boundary box + Standard_EXPORT void highlightWithBndBox (const Handle(Graphic3d_Structure)& theStruct); - //! Unregisters structure from ancestor structure (for updating ray-tracing state). - void UnregisterFromAncestorStructure() const; + //! Invalidates highlight box and releases graphic resources it uses + Standard_EXPORT void clearHighlightBox (const Handle(OpenGl_Context)& theGlCtx); - //! Updates modification state for structure and its parents. - void UpdateStateWithAncestorStructures() const; +protected: - //! Updates ray-tracable status for structure and its parents. - void UpdateRaytracableWithAncestorStructures() const; + Handle(OpenGl_Group) myHighlightBox; - //! Sets ray-tracable status for structure and its parents. - void SetRaytracableWithAncestorStructures() const; + OpenGl_Structure* myInstancedStructure; -#endif + mutable Standard_Boolean myIsRaytracable; + mutable Standard_Size myModificationState; -protected: + mutable Standard_Boolean myIsCulled; //!< A status specifying is structure needs to be rendered after BVH tree traverse. - //Structure_LABBegin - OpenGl_Matrix* myTransformation; - TEL_TRANSFORM_PERSISTENCE* myTransPers; - OpenGl_AspectLine* myAspectLine; - OpenGl_AspectFace* myAspectFace; - OpenGl_AspectMarker* myAspectMarker; - OpenGl_AspectText* myAspectText; - //Structure_LABHighlight - OpenGl_Group* myHighlightBox; - TEL_COLOUR* myHighlightColor; - //Structure_LABVisibility - //Structure_LABPick - int myNamedStatus; //Structure_LABNameSet - int myZLayer; - - OpenGl_ListOfStructure myConnected; - OpenGl_ListOfGroup myGroups; - Graphic3d_SequenceOfHClipPlane myClipPlanes; - -#ifdef HAVE_OPENCL - mutable OpenGl_ListOfStructure myAncestorStructures; - mutable Standard_Boolean myIsRaytracable; - mutable Standard_Size myModificationState; -#endif + Standard_Boolean myIsMirrored; //!< Used to tell OpenGl to interpret polygons in clockwise order. public: - DEFINE_STANDARD_ALLOC + DEFINE_STANDARD_RTTIEXT(OpenGl_Structure,Graphic3d_CStructure) // Type definition }; -#endif //OpenGl_Structure_Header +DEFINE_STANDARD_HANDLE(OpenGl_Structure, Graphic3d_CStructure) + +#endif // OpenGl_Structure_Header