From eaac086605f1b03a064cfa0b0b4e7fe7d07d1356 Mon Sep 17 00:00:00 2001 From: mnv Date: Mon, 24 Sep 2018 11:53:12 +0300 Subject: [PATCH] 0030153: Visualization, TKOpenGl - AIS_ColoredShape::SynchronizeAspects() doesn't update all aspects AIS_InteractiveObject::SynchronizeAspects() now propagates event to OpenGl_Group::SynchronizeAspects() which properly handles all aspects defined within the group. --- src/AIS/AIS_InteractiveObject.cxx | 26 ++------------------------ src/Graphic3d/Graphic3d_Group.hxx | 3 +++ src/OpenGl/OpenGl_AspectFace.hxx | 7 +++++-- src/OpenGl/OpenGl_AspectLine.hxx | 7 +++++-- src/OpenGl/OpenGl_AspectMarker.hxx | 7 +++++-- src/OpenGl/OpenGl_AspectText.hxx | 7 +++++-- src/OpenGl/OpenGl_Element.hxx | 3 +++ src/OpenGl/OpenGl_Group.cxx | 28 ++++++++++++++++++++++++++++ src/OpenGl/OpenGl_Group.hxx | 3 +++ 9 files changed, 59 insertions(+), 32 deletions(-) diff --git a/src/AIS/AIS_InteractiveObject.cxx b/src/AIS/AIS_InteractiveObject.cxx index fba30b6cf0..8e63104341 100644 --- a/src/AIS/AIS_InteractiveObject.cxx +++ b/src/AIS/AIS_InteractiveObject.cxx @@ -615,31 +615,9 @@ void AIS_InteractiveObject::SynchronizeAspects() for (Graphic3d_SequenceOfGroup::Iterator aGroupIter (aPrs3d->Presentation()->Groups()); aGroupIter.More(); aGroupIter.Next()) { - Handle(Graphic3d_Group)& aGrp = aGroupIter.ChangeValue(); - if (aGrp.IsNull()) + if (!aGroupIter.Value().IsNull()) { - continue; - } - - Handle(Graphic3d_AspectLine3d) aLineAspect = aGrp->LineAspect(); - Handle(Graphic3d_AspectFillArea3d) aFaceAspect = aGrp->FillAreaAspect(); - Handle(Graphic3d_AspectMarker3d) aMarkerAspect = aGrp->MarkerAspect(); - Handle(Graphic3d_AspectText3d) aTextAspect = aGrp->TextAspect(); - if (!aLineAspect.IsNull()) - { - aGrp->SetGroupPrimitivesAspect (aLineAspect); - } - if (!aFaceAspect.IsNull()) - { - aGrp->SetGroupPrimitivesAspect (aFaceAspect); - } - if (!aMarkerAspect.IsNull()) - { - aGrp->SetGroupPrimitivesAspect (aMarkerAspect); - } - if (!aTextAspect.IsNull()) - { - aGrp->SetGroupPrimitivesAspect (aTextAspect); + aGroupIter.ChangeValue()->SynchronizeAspects(); } } } diff --git a/src/Graphic3d/Graphic3d_Group.hxx b/src/Graphic3d/Graphic3d_Group.hxx index 4e1c26f9de..d0f1a478b3 100644 --- a/src/Graphic3d/Graphic3d_Group.hxx +++ b/src/Graphic3d/Graphic3d_Group.hxx @@ -146,6 +146,9 @@ public: //! after this call in the group. virtual void SetPrimitivesAspect (const Handle(Graphic3d_AspectMarker3d)& theAspect) = 0; + //! Update presentation aspects after their modification. + virtual void SynchronizeAspects() = 0; + //! Returns TRUE if aspect is set for the group. Standard_EXPORT Standard_Boolean IsGroupPrimitivesAspectSet (const Graphic3d_GroupAspect theAspect) const; diff --git a/src/OpenGl/OpenGl_AspectFace.hxx b/src/OpenGl/OpenGl_AspectFace.hxx index e5bf75c7e7..8d93a114d6 100644 --- a/src/OpenGl/OpenGl_AspectFace.hxx +++ b/src/OpenGl/OpenGl_AspectFace.hxx @@ -79,8 +79,11 @@ public: return myResources.ShaderProgram; } - Standard_EXPORT virtual void Render (const Handle(OpenGl_Workspace)& theWorkspace) const; - Standard_EXPORT virtual void Release (OpenGl_Context* theContext); + Standard_EXPORT virtual void Render (const Handle(OpenGl_Workspace)& theWorkspace) const Standard_OVERRIDE; + Standard_EXPORT virtual void Release (OpenGl_Context* theContext) Standard_OVERRIDE; + + //! Update presentation aspects parameters after their modification. + virtual void SynchronizeAspects() Standard_OVERRIDE { SetAspect (myAspect); } protected: diff --git a/src/OpenGl/OpenGl_AspectLine.hxx b/src/OpenGl/OpenGl_AspectLine.hxx index bc35f9ba93..a44bd54671 100644 --- a/src/OpenGl/OpenGl_AspectLine.hxx +++ b/src/OpenGl/OpenGl_AspectLine.hxx @@ -53,8 +53,11 @@ public: return myResources.ShaderProgram; } - Standard_EXPORT virtual void Render (const Handle(OpenGl_Workspace)& theWorkspace) const; - Standard_EXPORT virtual void Release (OpenGl_Context* theContext); + Standard_EXPORT virtual void Render (const Handle(OpenGl_Workspace)& theWorkspace) const Standard_OVERRIDE; + Standard_EXPORT virtual void Release (OpenGl_Context* theContext) Standard_OVERRIDE; + + //! Update presentation aspects parameters after their modification. + virtual void SynchronizeAspects() Standard_OVERRIDE { SetAspect (myAspect); } protected: diff --git a/src/OpenGl/OpenGl_AspectMarker.hxx b/src/OpenGl/OpenGl_AspectMarker.hxx index 2f83701ee3..c4178aa4b4 100644 --- a/src/OpenGl/OpenGl_AspectMarker.hxx +++ b/src/OpenGl/OpenGl_AspectMarker.hxx @@ -95,8 +95,11 @@ public: return myResources.ShaderProgram(); } - Standard_EXPORT virtual void Render (const Handle(OpenGl_Workspace)& theWorkspace) const; - Standard_EXPORT virtual void Release (OpenGl_Context* theContext); + Standard_EXPORT virtual void Render (const Handle(OpenGl_Workspace)& theWorkspace) const Standard_OVERRIDE; + Standard_EXPORT virtual void Release (OpenGl_Context* theContext) Standard_OVERRIDE; + + //! Update presentation aspects parameters after their modification. + virtual void SynchronizeAspects() Standard_OVERRIDE { SetAspect (myAspect); } protected: diff --git a/src/OpenGl/OpenGl_AspectText.hxx b/src/OpenGl/OpenGl_AspectText.hxx index 0be8f3d74e..2596b878a8 100755 --- a/src/OpenGl/OpenGl_AspectText.hxx +++ b/src/OpenGl/OpenGl_AspectText.hxx @@ -59,8 +59,11 @@ public: return myResources.ShaderProgram; } - Standard_EXPORT virtual void Render (const Handle(OpenGl_Workspace)& theWorkspace) const; - Standard_EXPORT virtual void Release (OpenGl_Context* theContext); + Standard_EXPORT virtual void Render (const Handle(OpenGl_Workspace)& theWorkspace) const Standard_OVERRIDE; + Standard_EXPORT virtual void Release (OpenGl_Context* theContext) Standard_OVERRIDE; + + //! Update presentation aspects parameters after their modification. + virtual void SynchronizeAspects() Standard_OVERRIDE { SetAspect (myAspect); } protected: diff --git a/src/OpenGl/OpenGl_Element.hxx b/src/OpenGl/OpenGl_Element.hxx index 0708f42c14..8a14275a1a 100644 --- a/src/OpenGl/OpenGl_Element.hxx +++ b/src/OpenGl/OpenGl_Element.hxx @@ -60,6 +60,9 @@ public: //! Return TRUE if primitive type generates shaded triangulation (to be used in filters). virtual Standard_Boolean IsFillDrawMode() const { return false; } + //! Update parameters of the drawable elements. + virtual void SynchronizeAspects() {} + protected: Standard_EXPORT virtual ~OpenGl_Element(); diff --git a/src/OpenGl/OpenGl_Group.cxx b/src/OpenGl/OpenGl_Group.cxx index c9211adcc5..8e0b41514b 100644 --- a/src/OpenGl/OpenGl_Group.cxx +++ b/src/OpenGl/OpenGl_Group.cxx @@ -264,6 +264,34 @@ void OpenGl_Group::SetPrimitivesAspect (const Handle(Graphic3d_AspectText3d)& th Update(); } +// ======================================================================= +// function : SynchronizeAspects +// purpose : +// ======================================================================= +void OpenGl_Group::SynchronizeAspects() +{ + if (myAspectFace != NULL) + { + myAspectFace->SynchronizeAspects(); + } + if (myAspectLine != NULL) + { + myAspectLine->SynchronizeAspects(); + } + if (myAspectMarker != NULL) + { + myAspectMarker->SynchronizeAspects(); + } + if (myAspectText != NULL) + { + myAspectText->SynchronizeAspects(); + } + for (OpenGl_ElementNode* aNode = myFirst; aNode != NULL; aNode = aNode->next) + { + aNode->elem->SynchronizeAspects(); + } +} + // ======================================================================= // function : AddPrimitiveArray // purpose : diff --git a/src/OpenGl/OpenGl_Group.hxx b/src/OpenGl/OpenGl_Group.hxx index c845615d48..eb779abad7 100644 --- a/src/OpenGl/OpenGl_Group.hxx +++ b/src/OpenGl/OpenGl_Group.hxx @@ -103,6 +103,9 @@ public: //! Append text aspect as an element. Standard_EXPORT virtual void SetPrimitivesAspect (const Handle(Graphic3d_AspectText3d)& theAspect) Standard_OVERRIDE; + //! Update presentation aspects after their modification. + Standard_EXPORT virtual void SynchronizeAspects() Standard_OVERRIDE; + //! Add primitive array element Standard_EXPORT virtual void AddPrimitiveArray (const Graphic3d_TypeOfPrimitiveArray theType, const Handle(Graphic3d_IndexBuffer)& theIndices,