/////////////////////////////////////////////////////////////////////////////// // Copyright (C) 2002-2016, Open Design Alliance (the "Alliance"). // All rights reserved. // // This software and its documentation and related materials are owned by // the Alliance. The software may only be incorporated into application // programs owned by members of the Alliance, subject to a signed // Membership Agreement and Supplemental Software License Agreement with the // Alliance. The structure and organization of this software are the valuable // trade secrets of the Alliance and its suppliers. The software is also // protected by copyright law and international treaty provisions. Application // programs incorporating this software must include the following statement // with their copyright notices: // // This application incorporates Teigha(R) software pursuant to a license // agreement with Open Design Alliance. // Teigha(R) Copyright (C) 2002-2016 by Open Design Alliance. // All rights reserved. // // By use of this software, its documentation or related materials, you // acknowledge and accept the above terms. /////////////////////////////////////////////////////////////////////////////// #ifndef _ODGIFASTEXTCALC_INCLUDED_ #define _ODGIFASTEXTCALC_INCLUDED_ #include "Gi/GiBaseVectorizer.h" #include "Gi/GiTransformed.h" #include "OdStack.h" #include "TD_PackPush.h" /** \details This class is an implementation of the subWorldDraw() framework to quickly calculate the WCS extents of an OdGiDrawable object. \remarks This class is the same as OdGiExtCalc, but calculates the extents with lower precision to improve speed. Library: TD_Gi */ class ODGI_EXPORT ODRX_ABSTRACT OdGiFastExtCalc : public OdGiTransformed { typedef OdGeExtents3d Extents; OdGeExtents3d m_worldExt; OdStack m_extStack; OdGeExtents3d* m_pCurrExt; enum Flags { kSetExtentsCalledFlag = 1, kDrawInvisiblesFlag = 2, kDrawInvisiblesNestedFlag = 4, kDrawingInitiatedFlag = 8 }; OdUInt8 m_flags; void setSetExtentsCalled(bool bSet); bool isSetExtentsCalled() const; void setDrawingInitiated(bool bSet); bool isDrawingInitiated() const; void addTextExtents( const OdGePoint3d& locExtMin, const OdGePoint3d& locExtMax, const OdGePoint3d& position, const OdGeVector3d& normal, const OdGeVector3d& direction); protected: ODRX_USING_HEAP_OPERATORS(OdGiTransformed); OdGiFastExtCalc(); public: /** \details Resets the accumulated extents for the OdGiDrawable object associated with this Vectorization object. */ void resetExtents(); /** \details Returns the accumulated extents for the OdGiDrawable object associated with this Vectorization object. \param extents [out] Receives the extents. */ void getExtents(OdGeExtents3d& extents) const; /** \details Sets whether invisible entities will be drawn. \param bSet [in] true - to draw invisible entities, false - do not draw. */ void setDrawInvisible(bool bSet); /** \details Returns whether invisible entities are to be drawn. */ bool isDrawInvisible() const; /** \details Sets whether invisible nested entities will be drawn. \param bSet [in] true - to draw invisible nested entities, false - do not draw. */ void setDrawInvisibleNested(bool bSet); /** \details Returns whether invisible nested entities are to be drawn. */ bool isDrawInvisibleNested() const; /** \details Resets flag which is set after first draw call. This flag informs extents calculator that nested entities draw. */ void resetFirstDrawFlag(); ///////////////////////////////////////////////////////////////////////////// // OdGiCommonDraw Overrides bool regenAbort() const; double deviation(const OdGiDeviationType deviationType, const OdGePoint3d& pointOnCurve) const; OdGiRegenType regenType() const; ///////////////////////////////////////////////////////////////////////////// // OdGiGeometry Overrides void circle(const OdGePoint3d& center, double radius, const OdGeVector3d& normal); void circle(const OdGePoint3d& firstPoint, const OdGePoint3d& secondPoint, const OdGePoint3d& thirdPoint); void circularArc(const OdGePoint3d& center, double radius, const OdGeVector3d& normal, const OdGeVector3d& startVector, double sweepAngle, OdGiArcType arcType = kOdGiArcSimple); void circularArc(const OdGePoint3d& firstPoint, const OdGePoint3d& secondPoint, const OdGePoint3d& thirdPoint, OdGiArcType arcType = kOdGiArcSimple); void polyline(OdInt32 numVertices, const OdGePoint3d* vertexList, const OdGeVector3d* pNormal = 0, OdGsMarker baseSubEntMarker = -1); void polygon(OdInt32 numVertices, const OdGePoint3d* vertexList); void pline(const OdGiPolyline& polyline, OdUInt32 fromIndex = 0, OdUInt32 numSegs = 0); /** \details Introduces a shape into this vectorization context. \param position [in] Position of the shape. \param shapeNumber [in] Shape number. \param pTextStyle [in] Pointer to the TextStyle for the shape. \param direction [in] Baseline direction for the shape. \param normal [in] Normal vector. */ void shape(const OdGePoint3d& position, const OdGeVector3d& normal, const OdGeVector3d& direction, int shapeNumber, const OdGiTextStyle* pTextStyle); void text(const OdGePoint3d& position, const OdGeVector3d& normal, const OdGeVector3d& direction, double height, double width, double oblique, const OdString& msg); void text(const OdGePoint3d& position, const OdGeVector3d& normal, const OdGeVector3d& direction, const OdChar* msg, OdInt32 length, bool raw, const OdGiTextStyle* pTextStyle); void xline(const OdGePoint3d& firstPoint, const OdGePoint3d& secondPoint); void ray(const OdGePoint3d& basePoint, const OdGePoint3d& throughPoint ); void nurbs(const OdGeNurbCurve3d& nurbsCurve); void ellipArc(const OdGeEllipArc3d& ellipArc, const OdGePoint3d* endPointsOverrides = 0, OdGiArcType arcType = kOdGiArcSimple); void mesh(OdInt32 numRows, OdInt32 numColumns, const OdGePoint3d* vertexList, const OdGiEdgeData* pEdgeData = 0, const OdGiFaceData* pFaceData = 0, const OdGiVertexData* pVertexData = 0); void shell(OdInt32 numVertices, const OdGePoint3d* vertexList, OdInt32 faceListSize, const OdInt32* faceList, const OdGiEdgeData* pEdgeData = 0, const OdGiFaceData* pFaceData = 0, const OdGiVertexData* pVertexData = 0); void worldLine(const OdGePoint3d points[2]); void image(const OdGiImageBGRA32& img, const OdGePoint3d& origin, const OdGeVector3d& uVec, const OdGeVector3d& vVec, OdGiRasterImage::TransparencyMode trpMode = OdGiRasterImage::kTransparency8Bit); void edge(const OdGiEdge2dArray& edges); void polypoint(OdInt32 numPoints, const OdGePoint3d* vertexList, const OdCmEntityColor* pColors, const OdCmTransparency* pTransparency, const OdGeVector3d* pNormals, const OdGsMarker* pSubEntMarkers, OdInt32 nPointSize); void rowOfDots(OdInt32 numPoints, const OdGePoint3d& startPoint, const OdGeVector3d& dirToNextPoint); void setExtents(const OdGePoint3d *newExtents); void pushClipBoundary(OdGiClipBoundary* pBoundary); void popClipBoundary(); void pushModelTransform(const OdGeMatrix3d& xfm); void popModelTransform(); void draw(const OdGiDrawable* pDrawable); }; inline void OdGiFastExtCalc::setSetExtentsCalled(bool bSet) { SETBIT(m_flags, kSetExtentsCalledFlag, bSet); } inline bool OdGiFastExtCalc::isSetExtentsCalled() const { return GETBIT(m_flags, kSetExtentsCalledFlag); } inline void OdGiFastExtCalc::setDrawingInitiated(bool bSet) { SETBIT(m_flags, kDrawingInitiatedFlag, bSet); } inline bool OdGiFastExtCalc::isDrawingInitiated() const { return GETBIT(m_flags, kDrawingInitiatedFlag); } inline void OdGiFastExtCalc::setDrawInvisible(bool bSet) { SETBIT(m_flags, kDrawInvisiblesFlag, bSet); } inline bool OdGiFastExtCalc::isDrawInvisible() const { return GETBIT(m_flags, kDrawInvisiblesFlag); } inline void OdGiFastExtCalc::setDrawInvisibleNested(bool bSet) { SETBIT(m_flags, kDrawInvisiblesNestedFlag, bSet); } inline bool OdGiFastExtCalc::isDrawInvisibleNested() const { return GETBIT(m_flags, kDrawInvisiblesNestedFlag); } inline void OdGiFastExtCalc::resetFirstDrawFlag() { m_flags &= ~kDrawingInitiatedFlag; } #include "TD_PackPop.h" #endif // #ifndef _ODGIFASTEXTCALC_INCLUDED_