From 8591dab99ee0d5e8e1869e841c73af2e1556ed5f Mon Sep 17 00:00:00 2001 From: vsv Date: Tue, 20 Dec 2016 15:54:49 +0300 Subject: [PATCH] Display symbolic presentations --- src/SketcherPrs/SketcherPrs_SymbolPrs.cpp | 362 +++------------------- src/SketcherPrs/SketcherPrs_SymbolPrs.h | 15 +- 2 files changed, 55 insertions(+), 322 deletions(-) diff --git a/src/SketcherPrs/SketcherPrs_SymbolPrs.cpp b/src/SketcherPrs/SketcherPrs_SymbolPrs.cpp index 24a31bc88..be1fef2d0 100644 --- a/src/SketcherPrs/SketcherPrs_SymbolPrs.cpp +++ b/src/SketcherPrs/SketcherPrs_SymbolPrs.cpp @@ -34,7 +34,10 @@ #include #include #include -#include +//#include +#include +//#include +#include #include #ifdef WIN32 @@ -46,182 +49,37 @@ /// Step between icons static const double MyDist = 0.02; -/// Function to convert opengl data type -GLenum toGlDataType (const Graphic3d_TypeOfData theType, GLint& theNbComp) -{ - switch (theType) { - case Graphic3d_TOD_USHORT: - theNbComp = 1; - return GL_UNSIGNED_SHORT; - case Graphic3d_TOD_UINT: - theNbComp = 1; - return GL_UNSIGNED_INT; - case Graphic3d_TOD_VEC2: - theNbComp = 2; - return GL_FLOAT; - case Graphic3d_TOD_VEC3: - theNbComp = 3; - return GL_FLOAT; - case Graphic3d_TOD_VEC4: - theNbComp = 4; - return GL_FLOAT; - case Graphic3d_TOD_VEC4UB: - theNbComp = 4; - return GL_UNSIGNED_BYTE; - } - theNbComp = 0; - return GL_NONE; -} - - -//******************************************************************* -//! Auxiliary class for Vertex buffer with interleaved attributes. -class SketcherPrs_VertexBuffer : public OpenGl_VertexBuffer -{ - -public: - - //! Create uninitialized VBO.. - //! \param theAttribs attributes - //! \param theStride a flag - SketcherPrs_VertexBuffer (const Graphic3d_Attribute* theAttribs, - const Standard_Integer theStride) - : Stride (theStride), NbAttributes(1) - { - - memcpy (Attribs, theAttribs, sizeof(Graphic3d_Attribute) * NbAttributes); - } - - //! Create uninitialized VBO. - SketcherPrs_VertexBuffer (const Graphic3d_Buffer& theAttribs) - : Stride (theAttribs.Stride), NbAttributes(1) - { - memcpy (Attribs, theAttribs.AttributesArray(), sizeof(Graphic3d_Attribute) * NbAttributes); - } - - /// Returns True if color attribute is defined - virtual bool HasColorAttribute() const - { - for (Standard_Integer anAttribIter = 0; anAttribIter < NbAttributes; ++anAttribIter) { - const Graphic3d_Attribute& anAttrib = Attribs[anAttribIter]; - if (anAttrib.Id == Graphic3d_TOA_COLOR) { - return true; - } - } - return false; - } - - /// Returns True if normal attribute is defined - virtual bool HasNormalAttribute() const - { - for (Standard_Integer anAttribIter = 0; anAttribIter < NbAttributes; ++anAttribIter) { - const Graphic3d_Attribute& anAttrib = Attribs[anAttribIter]; - if (anAttrib.Id == Graphic3d_TOA_NORM) { - return true; - } - } - return false; - } - - /// Bind position of the attribute - /// \param theGlCtx OpenGl context - virtual void BindPositionAttribute (const Handle(OpenGl_Context)& theGlCtx) const - { - if (!OpenGl_VertexBuffer::IsValid()) { - return; - } - - OpenGl_VertexBuffer::Bind (theGlCtx); - GLint aNbComp; - const GLubyte* anOffset = OpenGl_VertexBuffer::myOffset; - for (Standard_Integer anAttribIter = 0; anAttribIter < NbAttributes; ++anAttribIter) { - const Graphic3d_Attribute& anAttrib = Attribs[anAttribIter]; - const GLenum aDataType = toGlDataType (anAttrib.DataType, aNbComp); - if (aDataType == GL_NONE) { - continue; - } else if (anAttrib.Id == Graphic3d_TOA_POS) { - OpenGl_VertexBuffer::bindAttribute(theGlCtx, Graphic3d_TOA_POS, aNbComp, - aDataType, Stride, anOffset); - break; - } - - anOffset += Graphic3d_Attribute::Stride (anAttrib.DataType); - } - } - - /// Bind all attributes - /// \param theGlCtx OpenGl context - virtual void BindAllAttributes (const Handle(OpenGl_Context)& theGlCtx) const - { - if (!OpenGl_VertexBuffer::IsValid()) - return; - - OpenGl_VertexBuffer::Bind (theGlCtx); - GLint aNbComp; - const GLubyte* anOffset = OpenGl_VertexBuffer::myOffset; - for (Standard_Integer anAttribIter = 0; anAttribIter < NbAttributes; ++anAttribIter) - { - const Graphic3d_Attribute& anAttrib = Attribs[anAttribIter]; - const GLenum aDataType = toGlDataType (anAttrib.DataType, aNbComp); - if (aDataType == GL_NONE) - continue; - - OpenGl_VertexBuffer::bindAttribute(theGlCtx, anAttrib.Id, aNbComp, - aDataType, Stride, anOffset); - anOffset += Graphic3d_Attribute::Stride (anAttrib.DataType); - } - } - - /// Unbind all attributes - /// \param theGlCtx OpenGl context - virtual void UnbindAllAttributes (const Handle(OpenGl_Context)& theGlCtx) const - { - if (!OpenGl_VertexBuffer::IsValid()) - return; - OpenGl_VertexBuffer::Unbind (theGlCtx); - - for (Standard_Integer anAttribIter = 0; anAttribIter < NbAttributes; ++anAttribIter) { - const Graphic3d_Attribute& anAttrib = Attribs[anAttribIter]; - OpenGl_VertexBuffer::unbindAttribute (theGlCtx, anAttrib.Id); - } - } - -public: - - /// Array of attributes - Graphic3d_Attribute Attribs[1]; - - /// A flag - Standard_Integer Stride; - - /// Number of attributes - Standard_Integer NbAttributes; -}; //************************************************************** //! Redefinition of OpenGl_Element -class SketcherPrs_Element: public OpenGl_Element +class SketcherPrs_Element: public OpenGl_PrimitiveArray { public: - /// Constructor - /// \param theObj a presentation - SketcherPrs_Element(const Handle(SketcherPrs_SymbolPrs)& theObj) : - OpenGl_Element(), myObj(theObj) {} - - /// Render the current presentation - /// \param theWorkspace OpenGL workspace - virtual void Render (const Handle(OpenGl_Workspace)& theWorkspace) const - { - if (!myObj.IsNull()) - myObj->Render(theWorkspace); - } + SketcherPrs_Element(const OpenGl_GraphicDriver* theDriver, + const Handle(SketcherPrs_SymbolPrs)& theObj) + :OpenGl_PrimitiveArray(theDriver, theObj->myPntArray->Type(), theObj->myPntArray->Indices(), + theObj->myPntArray->Attributes(), theObj->myPntArray->Bounds()), myObj(theObj) {} - /// Releases OpenGL resources - /// \param theContext OpenGL context - virtual void Release (OpenGl_Context* theContext) + virtual void Render(const Handle(OpenGl_Workspace)& theWorkspace) const { - if (!myObj.IsNull()) - myObj->Release(theContext); + ModelAPI_Feature* aConstraint = myObj->feature(); + if (aConstraint->data().get() && aConstraint->data()->isValid()) { + Handle(OpenGl_View) aView = theWorkspace->View(); + double aScale = aView->Camera()->Scale(); + // Update points coordinate taking the viewer scale into account + myObj->updateIfReadyToDisplay(MyDist * aScale); + if (myIsVboInit) { + const Handle(OpenGl_Context)& aCtx = theWorkspace->GetGlContext(); + Handle(Graphic3d_Buffer) aAttr = myObj->myPntArray->Attributes(); + myVboAttribs->init(aCtx, 0, aAttr->NbElements, + aAttr->Data(), GL_NONE, aAttr->Stride); + } else { + myAttribs = myObj->myPntArray->Attributes(); + myIndices = myObj->myPntArray->Indices(); + myBounds = myObj->myPntArray->Bounds(); + } + } + OpenGl_PrimitiveArray::Render(theWorkspace); } private: @@ -229,21 +87,6 @@ private: }; -//************************************************************** -// PORTING_TO_SALOME_8 -//! Definition of call back -/*OpenGl_Element* SymbolPrsCallBack(const CALL_DEF_USERDRAW * theUserDraw) -{ - Handle(SketcherPrs_SymbolPrs) anIObj = (SketcherPrs_SymbolPrs*)theUserDraw->Data; - if (anIObj.IsNull()) { - std::cout << - "VUserDrawCallback error: null object passed, the custom scene element will not be rendered" - << std::endl; - } - return new SketcherPrs_Element(anIObj); -}*/ - - //***************************************************************************** IMPLEMENT_STANDARD_RTTIEXT(SketcherPrs_SymbolPrs, AIS_InteractiveObject); @@ -260,6 +103,7 @@ SketcherPrs_SymbolPrs::SketcherPrs_SymbolPrs(ModelAPI_Feature* theConstraint, myPntArray->AddVertex(0., 0., 0.); } +//********************************************************************************* SketcherPrs_SymbolPrs::~SketcherPrs_SymbolPrs() { SketcherPrs_PositionMgr* aMgr = SketcherPrs_PositionMgr::get(); @@ -271,6 +115,7 @@ SketcherPrs_SymbolPrs::~SketcherPrs_SymbolPrs() #pragma warning( disable : 4996 ) #endif +//********************************************************************************* Handle(Image_AlienPixMap) SketcherPrs_SymbolPrs::icon() { if (myIconsMap.count(iconName()) == 1) { @@ -303,6 +148,7 @@ Handle(Image_AlienPixMap) SketcherPrs_SymbolPrs::icon() return Handle(Image_AlienPixMap)(); } +//********************************************************************************* void SketcherPrs_SymbolPrs::prepareAspect() { // Create an aspect with the icon @@ -315,6 +161,7 @@ void SketcherPrs_SymbolPrs::prepareAspect() } } +//********************************************************************************* void SketcherPrs_SymbolPrs::addLine(const Handle(Graphic3d_Group)& theGroup, std::string theAttrName) const { @@ -334,6 +181,7 @@ void SketcherPrs_SymbolPrs::addLine(const Handle(Graphic3d_Group)& theGroup, theGroup->AddPrimitiveArray(aLines); } +//********************************************************************************* void SketcherPrs_SymbolPrs::HilightSelected(const Handle(PrsMgr_PresentationManager3d)& thePM, const SelectMgr_SequenceOfOwner& theOwners) { @@ -348,24 +196,25 @@ void SketcherPrs_SymbolPrs::HilightSelected(const Handle(PrsMgr_PresentationMana //thePM->Highlight(this); } +//********************************************************************************* void SketcherPrs_SymbolPrs::HilightOwnerWithColor( const Handle(PrsMgr_PresentationManager3d)& thePM, - const Quantity_NameOfColor theColor, + const Handle(Graphic3d_HighlightStyle)& theStyle, const Handle(SelectMgr_EntityOwner)& theOwner) { // PORTING_TO_SALOME_8 - /* - thePM->Color(this, theColor); + + thePM->Color(this, theStyle); Handle( Prs3d_Presentation ) aHilightPrs = GetHilightPresentation( thePM ); aHilightPrs->Clear(); - drawLines(aHilightPrs, theColor); + drawLines(aHilightPrs, theStyle->Color()); if (thePM->IsImmediateModeOn()) thePM->AddToImmediateList(aHilightPrs); - */ } +//********************************************************************************* void SketcherPrs_SymbolPrs::Compute( const Handle(PrsMgr_PresentationManager3d)& thePresentationManager, const Handle(Prs3d_Presentation)& thePresentation, @@ -377,11 +226,8 @@ void SketcherPrs_SymbolPrs::Compute( Handle(AIS_InteractiveContext) aCtx = GetContext(); Handle(OpenGl_GraphicDriver) aDriver = Handle(OpenGl_GraphicDriver)::DownCast(aCtx->CurrentViewer()->Driver()); - if (!aDriver.IsNull()) { - // register the custom element factory function - // PORTING_TO_SALOME_8 - //aDriver->UserDrawCallback() = SymbolPrsCallBack; - } + if (aDriver.IsNull()) + return; // Update points with default shift value // it updates array of points if the presentation is ready to display, or the array of points @@ -401,7 +247,7 @@ void SketcherPrs_SymbolPrs::Compute( mySPoints.Append(aSP); } - Handle(Graphic3d_Group) aGroup = Prs3d_Root::NewGroup(thePresentation); + Handle(OpenGl_Group) aGroup = Handle(OpenGl_Group)::DownCast(thePresentation->NewGroup()); aGroup->SetPrimitivesAspect(myAspect); // Recompute boundary box of the group @@ -414,12 +260,12 @@ void SketcherPrs_SymbolPrs::Compute( } // Pint the group with custom procedure (see Render) - // PORTING_TO_SALOME_8 - //aGroup->UserDraw(this, true); + SketcherPrs_Element* aElem = + new SketcherPrs_Element((OpenGl_GraphicDriver*)aDriver->This(), this); + aGroup->AddElement(aElem); // Disable frustum culling for this object by marking it as mutable - aGroup->Structure()->SetMutable(true); - //aGroup->AddPrimitiveArray(myPntArray); + //aGroup->Structure()->SetMutable(true); if (!aReadyToDisplay) SketcherPrs_Tools::sendEmptyPresentationError(myConstraint, @@ -427,7 +273,7 @@ void SketcherPrs_SymbolPrs::Compute( } - +//********************************************************************************* void SketcherPrs_SymbolPrs::ComputeSelection(const Handle(SelectMgr_Selection)& aSelection, const Standard_Integer aMode) { @@ -438,6 +284,7 @@ void SketcherPrs_SymbolPrs::ComputeSelection(const Handle(SelectMgr_Selection)& } } +//********************************************************************************* void SketcherPrs_SymbolPrs::SetConflictingConstraint(const bool& theConflicting, const std::vector& theColor) { @@ -456,116 +303,7 @@ void SketcherPrs_SymbolPrs::SetConflictingConstraint(const bool& theConflicting, } } -void SketcherPrs_SymbolPrs::Render(const Handle(OpenGl_Workspace)& theWorkspace) const -{ - // PORTING_TO_SALOME_8 - /* - // this method is a combination of OCCT OpenGL functions. The main purpose is to have - // equal distance from the source object to symbol indpendently of zoom. - // It is base on OCCT 6.9.1 and might need changes when using later OCCT versions. - // The specific SHAPER modifications are marked by ShaperModification:start/end, - // other is OCCT code - - // do not update presentation for invalid or already removed objects: the presentation - // should be removed soon - if (!myConstraint->data().get() || !myConstraint->data()->isValid()) - return; - - const OpenGl_AspectMarker* anAspectMarker = theWorkspace->AspectMarker(Standard_True); - const Handle(OpenGl_Context)& aCtx = theWorkspace->GetGlContext(); - Handle(OpenGl_View) aView = theWorkspace->ActiveView(); - - // ShaperModification:start - double aScale = aView->Camera()->Scale(); - // Update points coordinate taking the viewer scale into account - updateIfReadyToDisplay(MyDist * aScale); - - // ShaperModification:end - - Handle(Graphic3d_Buffer) aAttribs = myPntArray->Attributes(); - - if (myVboAttribs.IsNull()) { - myVboAttribs = new SketcherPrs_VertexBuffer(*aAttribs); - } - - // Update drawing attributes - if (!myVboAttribs->init(aCtx, 0, aAttribs->NbElements, - aAttribs->Data(), GL_NONE, aAttribs->Stride)) { - myVboAttribs->Release (aCtx.operator->()); - myVboAttribs.Nullify(); - return; - } - - Handle(OpenGl_Texture) aTextureBack = theWorkspace->DisableTexture(); - - const Handle(OpenGl_PointSprite)& aSpriteNorm = anAspectMarker->SpriteRes(aCtx); - - if (!aSpriteNorm.IsNull() && !aSpriteNorm->IsDisplayList()) { - // ShaperModification:start : filling the presentation with color if there is a conflict - const bool toHilight = - (theWorkspace->NamedStatus & OPENGL_NS_HIGHLIGHT) != 0 || myIsConflicting; - // ShaperModification:end - - const Handle(OpenGl_PointSprite)& aSprite = - (toHilight && anAspectMarker->SpriteHighlightRes(aCtx)->IsValid())? - anAspectMarker->SpriteHighlightRes(aCtx) - : aSpriteNorm; - theWorkspace->EnableTexture (aSprite); - aCtx->ShaderManager()->BindProgram(anAspectMarker, aSprite, Standard_False, - Standard_False, anAspectMarker->ShaderProgramRes(aCtx)); - const TEL_COLOUR* aLineColor = &anAspectMarker->Color(); - if (theWorkspace->NamedStatus & OPENGL_NS_HIGHLIGHT) - aLineColor = theWorkspace->HighlightColor; - - // Set lighting of the symbol - if (toHilight) - aCtx->core11fwd->glDisable (GL_LIGHTING); - else - aCtx->core11fwd->glEnable (GL_LIGHTING); - - aCtx->SetColor4fv(*(const OpenGl_Vec4* )(aLineColor->rgb)); - - - myVboAttribs->BindAllAttributes(aCtx); - // Textured markers will be drawn with the point sprites - aCtx->SetPointSize (anAspectMarker->MarkerSize()); - aCtx->core11fwd->glEnable (GL_ALPHA_TEST); - aCtx->core11fwd->glAlphaFunc (GL_GEQUAL, 0.1f); - - aCtx->core11fwd->glEnable (GL_BLEND); - aCtx->core11fwd->glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - - aCtx->core11fwd->glDrawArrays (0, 0, myVboAttribs->GetElemsNb()); - - aCtx->core11fwd->glDisable (GL_BLEND); - aCtx->core11fwd->glDisable (GL_ALPHA_TEST); - aCtx->SetPointSize (1.0f); - } - theWorkspace->EnableTexture (aTextureBack); - aCtx->BindProgram (NULL); - - // Update selection position only if there is no selected object - // because it can corrupt selection of other objects - if ((GetContext()->NbCurrents() == 0) && (GetContext()->NbSelected() == 0)) - { - GetContext()->MainSelector()->RebuildSensitivesTree (this); - GetContext()->MainSelector()->RebuildObjectsTree (false); - } -*/ -} - - -void SketcherPrs_SymbolPrs::Release (OpenGl_Context* theContext) -{ - // Release OpenGl resources - if (!myVboAttribs.IsNull()) { - if (theContext) { - theContext->DelayedRelease (myVboAttribs); - } - myVboAttribs.Nullify(); - } -} - +//********************************************************************************* void SketcherPrs_SymbolPrs::drawShape(const std::shared_ptr& theShape, const Handle(Prs3d_Presentation)& thePrs) const { @@ -594,6 +332,7 @@ void SketcherPrs_SymbolPrs::drawShape(const std::shared_ptr& theS } } +//********************************************************************************* void SketcherPrs_SymbolPrs::drawListOfShapes( const std::shared_ptr& theListAttr, const Handle(Prs3d_Presentation)& thePrs) const @@ -611,6 +350,7 @@ void SketcherPrs_SymbolPrs::drawListOfShapes( } } +//********************************************************************************* void SketcherPrs_SymbolPrs::BoundingBox (Bnd_Box& theBndBox) { Select3D_BndBox3d aTmpBox; diff --git a/src/SketcherPrs/SketcherPrs_SymbolPrs.h b/src/SketcherPrs/SketcherPrs_SymbolPrs.h index 5b7c07742..91ab4a27c 100644 --- a/src/SketcherPrs/SketcherPrs_SymbolPrs.h +++ b/src/SketcherPrs/SketcherPrs_SymbolPrs.h @@ -29,6 +29,7 @@ class OpenGl_Context; DEFINE_STANDARD_HANDLE(SketcherPrs_SymbolPrs, AIS_InteractiveObject) +class SketcherPrs_Element; /** * \ingroup GUI * A base class of constraint presentation which is represented by an icon @@ -52,7 +53,7 @@ public: //! this selectable object ( for fast presentation draw ) Standard_EXPORT virtual void HilightOwnerWithColor( const Handle(PrsMgr_PresentationManager3d)& thePM, - const Quantity_NameOfColor theColor, + const Handle(Graphic3d_HighlightStyle)& theStyle, const Handle(SelectMgr_EntityOwner)& theOwner); /// Returns sketcher plane @@ -72,14 +73,6 @@ public: Standard_EXPORT void SetConflictingConstraint(const bool& theConflicting, const std::vector& theColor); - /// Render of the presentation - /// \param theWorkspace is OpenGl workspace - void Render(const Handle(OpenGl_Workspace)& theWorkspace) const; - - /// Release used OpenGl resources - /// \param theContext is an OpenGL context - void Release (OpenGl_Context* theContext); - /// Add a bounding box of the presentation to common bounding box /// \param theBndBox the common bounding box to update Standard_EXPORT virtual void BoundingBox (Bnd_Box& theBndBox) Standard_OVERRIDE; @@ -154,13 +147,13 @@ private: /// Static map to collect constraints icons {IconName : IconPixMap} static std::map myIconsMap; - mutable Handle(OpenGl_VertexBuffer) myVboAttribs; - Select3D_EntitySequence mySPoints; bool myIsConflicting; /// state if the presentation is visualized in error state Handle(Image_AlienPixMap) myErrorIcon; Handle(Graphic3d_MarkerImage) myErrorImage; + + friend class SketcherPrs_Element; }; #endif \ No newline at end of file -- 2.39.2