/////////////////////////////////////////////////////////////////////////////// // Copyright (C) 2002-2025, 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 Open Design Alliance software pursuant to a license // agreement with Open Design Alliance. // Open Design Alliance Copyright (C) 2002-2025 by Open Design Alliance. // All rights reserved. // // By use of this software, its documentation or related materials, you // acknowledge and accept the above terms. /////////////////////////////////////////////////////////////////////////////// // Basic rendition interface #ifndef ODTRVISRENDITION #define ODTRVISRENDITION #include "TD_PackPush.h" #include "TrVisExtensionObject.h" #include "TrVisInfoString.h" #include "TrVisSharingProviderClient.h" #include "TrVisSurfaceDef.h" #include "TrVisViewportDef.h" #include "TrVisMetafileDef.h" #include "TrVisTextureDef.h" #include "TrVisMaterialDef.h" #include "TrVisLightDef.h" #include "TrVisExtentsDef.h" #include "TrVisBackgroundDef.h" #include "TrVisFogDef.h" #include "TrVisSectionDef.h" #include "TrVisStateBranchDef.h" #include "TrVisVisualStyle.h" #include "TrVisLayerDef.h" #include "TrVisPropertyDef.h" #include "Ge/GeExtents3d.h" #include "Gs/GsDCRectArray.h" class OdTrVisRenderClient; class OdTrRndLocalRenditionHost; class OdTrVisUniqueID; class OdGiDrawable; class OdGsFiler; class OdTrVisIdMap; /** \details */ class OdTrVisRendition : public OdRxObject { public: // Core rendition data types enum DataType { //kNoData = 0, // No data type entrance kSurfaceData = 1, // Surface data kViewportData, kViewportPropsData, kVpOverrideData, kVpOverridePropsData, kMetafileData, kMetafilePropsData, kLightData, kLightPropsData, kStateBranchData, kStateBranchPropsData, kTextureData, kTexturePropsData, kMaterialData, kMaterialPropsData, kProgramData, kPropertiesData, kVisualStyleData, kVisualStylePropsData, kLayerData, kLayerPropsData, kOverlayData, kOverlayPropsData, kGroupData, kGroupPropsData, kExtensionData, kExtensionPropsData, kBlockData, kBlockPropsData, kRefPlaneData, kRefPlanePropsData, kNDataTypes, // Limited by 6 bits (63 - maximum value) kNGenericDataTypes = kNDataTypes >> 1 // Useful for IdMap's economy }; // Mt handling types enum MtHandlerType { kMtSkip = 0, // Skip data kMtRedirect, // Redirect data without handling kMtGlobal, // Redirect under global mutex kMtCompete, // Redirect under specified mutex kMtRecord, // Record till completion (placed under own recorder mutex) kMtComplex // Redirect under complex set of mutexes (up to 4) }; struct MtComplex { // It's recommended to set mutexes in strict order to avoid deadlocks. static inline MtHandlerType encode(DataType mutex1, DataType mutex2 = (DataType)0, DataType mutex3 = (DataType)0, DataType mutex4 = (DataType)0) { return (MtHandlerType)(kMtComplex + (mutex1 << 6) + (mutex2 << 12) + (mutex3 << 18) + (mutex4 << 24)); } static inline MtHandlerType decode(MtHandlerType handler) { return (MtHandlerType)(handler & 0x3F); } static inline DataType decode(MtHandlerType handler, OdUInt32 nElem) { return (DataType)((handler >> (6 * nElem)) & 0x3F); } static inline OdUInt32 toGenericDataType(DataType dt) { return dt >> 1; } static inline DataType fromGenericDataType(OdUInt32 nDt) { return (DataType)((nDt) ? (nDt << 1) : 1); } }; // Special DisplayId codes, provide fast access to renderer functionality directly from display list enum DisplayIdCodes { kDisplayCodeZero = 0x00, // Empty display code kDisplayCodeHighlight = 0x01, // Execute highlighting procedure kDisplayCodeUnhighlight = 0x02, // Execute unhighlighting procedure kDisplayCodePushMatrix = 0x03, // Execute push transformation matrix procedure kDisplayCodePopMatrix = 0x04, // Execute pop transformation matrix procedure kDisplayCodeFade = 0x05, // Execute fading procedure kDisplayCodeUnfade = 0x06, // Execute unfading procedure kDisplayCodeHlMarkers = 0x07, // Setup highlight markers kDisplayCodeVsMarkers = 0x08, // Setup visibility markers kDisplayCodeTfMarkers = 0x09, // Setup transformation markers kDisplayCodeDrawOrder = 0x0A, // Provide drawing order for upcoming geometry kDisplayCodeDepthIval = 0x0B, // Modify drawing order interval kDisplayCodeExploded = 0x0C, // Initiates exploded union geometry rendering kDisplayCodeNonExploded = 0x0D, // Stops exploded union geometry rendering kDisplayCodeSelStyle = 0x0E, // Setup selection style kDisplayCodeSelectionID = 0x0F, // Entity id for selection kDisplayCodeRange = 0x10 // We reserve first 16 codes for special procedures // Note: Currently we invoked all codes in reserved range. But, before extending range we should better think how to // compress exist codes. As we know smallest page size is 4k for modern systems (0x1000). This "faulting" page // always present at 0 address to check invalid dereferences. But to be more correct we shouldn't lean onto // this and keep display codes range minimal as this is possible to be safe on even most exotic OS. }; static const double kDisplayMultiDrawOrderMarker; // Marker for kDisplayCodeDrawOrder which means multi draw order (union stream) // Rendition flags enum RenditionFlags { kSupportPartialUpdate = (1 << 0), // isSupportPartialUpdate kSupportSnapshotQueries = (1 << 1), // isSupportSnapshotQueries kSupportCompositeMetafiles = (1 << 2), // isSupportCompositeMetafiles kSupportVisualStyles = (1 << 3), // isSupportVisualStyles kSupportGsStateSaving = (1 << 4), // isSupportGsStateSaving kSupportOverlayBuffers = (1 << 5), // isSupportOverlayBuffers kSupportGPUSelection = (1 << 6), // isSupportGPUSelection kUpdateClientSectionOnly = (1 << 7), // updateClientDependentSectionOnly kUpdateShareableSectionOnly = (1 << 8), // updateShareableSectionOnly }; public: struct IdRegistrator { // Register persistent resource virtual void reg(DataType type, OdTrVisId id, OdDbStub *pPersId) = 0; // Register transient resource virtual void reg(DataType type, OdTrVisId id, const OdGiDrawable *pTransId) = 0; // Register persistent or transient resource void reg(DataType type, OdTrVisId id, OdDbStub *pPersId, const void *pTransId) { if (pPersId) reg(type, id, pPersId); else reg(type, id, reinterpret_cast(pTransId)); } // Copy resource registration virtual void reg(DataType type, OdTrVisId id, const OdTrVisUniqueID &uId) = 0; // Remove resource registration virtual void kill(DataType type, OdTrVisId id) = 0; // Access resource registration virtual OdTrVisUniqueID *get(DataType type, OdTrVisId id, bool bKill = false) const = 0; }; public: // Client information struct ClientInfo { OdTrVisInfoString m_glVendor; // OpenGL vendor OdTrVisInfoString m_glRenderer; // OpenGL renderer name OdTrVisInfoString m_glVersion; // OpenGL version OdTrVisInfoString m_glSLVersion; // GLSL version OdTrVisInfoString m_glExtensions; // List of extensions }; // Client settings struct ClientSettings { bool m_bObtained; // True if settings obtained from client. // Client information ClientInfo m_ciInfo; // Flags enum Flags { // Texture settings kNonPow2Textures = (1 << 0), // True if support non power of two textures. kNonPow2Wrapping = (1 << 1), // True if support all non power of two textures wrapping modes. kSupportsBGR = (1 << 2), // True if support BGR textures format. kSupportsBGRA = (1 << 3), // True if support BGRA textures format. kRequireBGR = (1 << 4), // True if support only BGR/BGRA textures format. kOverrideLut = (1 << 5), // True if client override Lut device settings. kLutMonochrome = (1 << 6), // True if client prefer Lut monochrome textures. kLutPalette = (1 << 7), // True if client prefer Lut 4-8bpp textures. kCubeMapping = (1 << 8), // True if support cube textures. // Performance/quality options kShadeByFragment = (1 << 9), // Fragment lighting mostly not influence onto final performance, so we can // force per-fragment lighting for visual styles, which disable it. // Data precision kSupportDblAttrs = (1 << 10), // Support double precision attributes (vertex coordinates, depths, etc.) kSupportUintClrs = (1 << 11), // Support UInt8 color data attributes. kSupportHalfNorm = (1 << 12), // Support compressed normal data attributes. kSupportIndex32 = (1 << 13), // Support 32-bit index arrays. kSupportIndex8 = (1 << 14) // Support 8-bit index arrays. }; OdUInt32 m_uFlags; // Client flags. // Texture limits OdUInt32 m_nMaxTextureSize; // Maximal texture size OdUInt32 m_nTextureAlignment; // Required default texture alignment // Lineweights float m_nMaxLineWidth; // Maximal line width float m_nMaxPointSize; // Maximal point size // System limits OdUInt32 m_nMaxTextures; // Maximal number of textures OdUInt32 m_nMaxLights; // Maximal number of lights ClientSettings() : m_bObtained(false) , m_ciInfo() , m_uFlags(0) , m_nMaxTextureSize(2048) , m_nTextureAlignment(4) , m_nMaxLineWidth(1.0f) , m_nMaxPointSize(1.0f) , m_nMaxTextures(8) , m_nMaxLights(4) { } // Flag accessors // Textures bool isSupportNonPow2Textures() const { return GETBIT(m_uFlags, kNonPow2Textures); } void setSupportNonPow2Textures(bool bSet) { SETBIT(m_uFlags, kNonPow2Textures, bSet); } bool isSupportNonPow2TexturesWrapping() const { return GETBIT(m_uFlags, kNonPow2Wrapping); } void setSupportNonPow2TexturesWrapping(bool bSet) { SETBIT(m_uFlags, kNonPow2Wrapping, bSet); } bool isSupportBGR() const { return GETBIT(m_uFlags, kSupportsBGR); } void setSupportBGR(bool bSet) { SETBIT(m_uFlags, kSupportsBGR, bSet); } bool isSupportBGRA() const { return GETBIT(m_uFlags, kSupportsBGRA); } void setSupportBGRA(bool bSet) { SETBIT(m_uFlags, kSupportsBGRA, bSet); } bool isRequireBGR() const { return GETBIT(m_uFlags, kRequireBGR); } void setRequireBGR(bool bSet) { SETBIT(m_uFlags, kRequireBGR, bSet); } bool isLutOverride() const { return GETBIT(m_uFlags, kOverrideLut); } void setLutOverride(bool bSet) { SETBIT(m_uFlags, kOverrideLut, bSet); } bool isLutMonochrome() const { return GETBIT(m_uFlags, kLutMonochrome); } void setLutMonochrome(bool bSet) { SETBIT(m_uFlags, kLutMonochrome, bSet); } bool overridenLutMonochromeState(bool bDeviceSetting) const { return (isLutOverride()) ? isLutMonochrome() : bDeviceSetting; } bool isLutPalette() const { return GETBIT(m_uFlags, kLutPalette); } void setLutPalette(bool bSet) { SETBIT(m_uFlags, kLutPalette, bSet); } bool overridenLutPaletteState(bool bDeviceSetting) const { return (isLutOverride()) ? isLutPalette() : bDeviceSetting; } bool isSupportCubeMaps() const { return GETBIT(m_uFlags, kCubeMapping); } void setSupportCubeMaps(bool bSet) { SETBIT(m_uFlags, kCubeMapping, bSet); } // Performance/quality options bool isShadeForceByFragment() const { return GETBIT(m_uFlags, kShadeByFragment); } void setShadeForceByFragment(bool bSet) { SETBIT(m_uFlags, kShadeByFragment, bSet); } // Data precision bool isSupportDoubleCoords() const { return GETBIT(m_uFlags, kSupportDblAttrs); } void setSupportDoubleCoords(bool bSet) { SETBIT(m_uFlags, kSupportDblAttrs, bSet); } bool isSupportUIntColors() const { return GETBIT(m_uFlags, kSupportUintClrs); } void setSupportUIntColors(bool bSet) { SETBIT(m_uFlags, kSupportUintClrs, bSet); } bool isSupportHalfNormals() const { return GETBIT(m_uFlags, kSupportHalfNorm); } void setSupportHalfNormals(bool bSet) { SETBIT(m_uFlags, kSupportHalfNorm, bSet); } bool isSupport32BitIndex() const { return GETBIT(m_uFlags, kSupportIndex32); } void setSupport32BitIndex(bool bSet) { SETBIT(m_uFlags, kSupportIndex32, bSet); } bool isSupport8BitIndex() const { return GETBIT(m_uFlags, kSupportIndex8); } void setSupport8BitIndex(bool bSet) { SETBIT(m_uFlags, kSupportIndex8, bSet); } }; public: ODRX_USING_HEAP_OPERATORS(OdRxObject); OdTrVisRendition() { } ~OdTrVisRendition() override { } // High-level callbacks // Called on starting vectorizer update. virtual void onDeviceUpdateBegin(OdTrVisRenderClient *pDevice) = 0; // Called on ending vectorizer update. virtual void onDeviceUpdateEnd(OdTrVisRenderClient *pDevice, bool bRender = true) = 0; // Checks that vectorizer update started. virtual bool isWithinDeviceUpdate() const = 0; // Called by underlying application to store frame changing information. virtual void onFrameSwitchInfo(OdUInt32 nInterval) = 0; // Returns set of bit flags which indicate rendition capabilities/settings virtual OdUInt32 queryRenditionCaps(OdUInt32 requestFor = 0xFFFFFFFF) const = 0; // Rendition capabilities as separate methods // Called to check does rendition supports partial update (have sense for local renditions only). bool isSupportPartialUpdate() const { return GETBIT(queryRenditionCaps(kSupportPartialUpdate), kSupportPartialUpdate); } // Check does rendition support snapshot queries bool isSupportSnapshotQueries() const { return GETBIT(queryRenditionCaps(kSupportSnapshotQueries), kSupportSnapshotQueries); } // Check does rendition supports composite metafiles bool isSupportCompositeMetafiles() const { return GETBIT(queryRenditionCaps(kSupportCompositeMetafiles), kSupportCompositeMetafiles); } // Check does rendition supports visual styles bool isSupportVisualStyles() const { return GETBIT(queryRenditionCaps(kSupportVisualStyles), kSupportVisualStyles); } // Check does rendition supports GsFiler-compatible state saving/loading bool isSupportGsStateSaving() const { return GETBIT(queryRenditionCaps(kSupportGsStateSaving), kSupportGsStateSaving); } // Check does rendition supports multiple overlapping rendering buffers bool isSupportOverlayBuffers() const { return GETBIT(queryRenditionCaps(kSupportOverlayBuffers), kSupportOverlayBuffers); } // Check does rendition supports GPU selection bool isSupportGPUSelection() const { return GETBIT(queryRenditionCaps(kSupportGPUSelection), kSupportGPUSelection); } // Update client-dependent section only bool updateClientDependentSectionOnly() const { return GETBIT(queryRenditionCaps(kUpdateClientSectionOnly), kUpdateClientSectionOnly); } // Update shareable section only bool updateShareableSectionOnly() const { return GETBIT(queryRenditionCaps(kUpdateShareableSectionOnly), kUpdateShareableSectionOnly); } // Partial update support for local renditions: // Called to check does specified viewport/overlay combination support partial update query. virtual bool onPartialUpdateCheckLimit(OdTrVisViewportId viewportId, OdTrVisOverlayId overlayId) = 0; // Called to setup invalid rectangles and overlays on partial update. virtual void onPartialUpdateInvalidRects(OdTrVisOverlayId overlayId, const OdGsDCRectArray &invalidRects, bool bOverlayInvalid = false) = 0; // Called on partial update query to set entire actual visibilities list. virtual void onPartialUpdateList(OdTrVisViewportId viewportId, OdTrVisOverlayId overlayId, const OdTrVisDisplayId *pList, OdUInt32 nEntries) = 0; // Can be called by client side to check that rendition supports direct rendering ability. virtual bool queryPartialUpdateDirectInvocation(OdTrVisViewportId viewportId, OdTrVisOverlayId overlayId, OdTrVisDirectRenderPartialUpdateInvocationPtr &pInvocationPtr) = 0; // Can be called by client side to setup direct invocation interface for partial update instead of partial update list usage. virtual void onPartialUpdateDirectInvocation(const OdTrVisDirectRenderPartialUpdateInvocation *pInvocation, OdTrVisRenderDataDirectAccessor *pAccessor) = 0; // Query snapshot virtual void querySnapshot(OdUInt8 *pScanlines, long minX, long minY, long nWidth, long nHeight) = 0; /** \details Renders viewport to selection texture. Return top object id with (x, y) position in viewport \param id [in] Processing viewport id \param x [in] X coordinate in the screen space \param y [in] Y coordinate in the screen space \param outIDs [out] id chain of selected object(for example entity id and sub entity id). Empty if nothing selected \param outMarker [out] marker in selected object. */ virtual void getSelectedObject(OdTrVisViewportId id, const OdGePoint2d* aPtDc, int numPoints, OdArray &outIDs, OdTrVisGsMarker *outMarker = NULL) = 0; // Allocate new resource sharing provider compatible with rendition virtual OdTrVisSharingProviderClientPtr createSharingProvider() = 0; // Extract local rendition-specific host service. virtual OdTrRndLocalRenditionHost *localRenditionHost() = 0; // Multithread processing flags virtual MtHandlerType mtDataTypeProcessing(DataType &type) const = 0; // Returns Id registrator, or NULL if no registration supported virtual IdRegistrator *idRegistrator() const = 0; // Returns true if metafile streams accessible directly, returns stream by Id virtual bool queryMetafileStream(OdTrVisViewportId viewportId, OdTrVisOverlayId overlayId, const OdTrVisDisplayId *pDisplayId, OdUInt32 nPathLength, const OdTrVisMetafileContainer **pStream, const OdTrVisExtendedBindingAccessor **pExAccessor = nullptr) = 0; // Unlock metafile stream, queried by queryMetafileStream method virtual bool unlockMetafileStream(const OdTrVisMetafileContainer *pStream) = 0; // Returns block metafile list in case if it is accessible. virtual const OdTrVisDisplayId *queryBlockMetafilesList(OdTrVisBlockId blockId, OdUInt32 &numEntries) = 0; // Returns extension object by Id. virtual OdTrVisExtensionObjectPtr queryExtensionObject(OdTrVisExtensionId extId) = 0; // Returns non-kTrVisNegativeId in case if vectorizer supports ProgramID's embedded into metafile stream virtual OdTrVisProgramId queryProgramId(OdGsView::RenderMode mode, OdTrVisVisualStyleId vsId = kTrVisNegativeId, OdTrVisGeomType geomType = OdTrVisGeomType_Default, OdUInt16 attrFlags = 0, OdUInt16 shadingFlags = 0) const = 0; // GsFiler support virtual bool saveRenditionState(OdGsFiler *pFiler) const = 0; virtual bool loadRenditionState(OdGsFiler *pFiler, OdTrVisIdMap *pIdMap) = 0; // Mid-level callbacks // Client information // Returns rendering client settings. virtual void obtainClientSettings(ClientSettings &clientSets) = 0; // Surface // Called when output render surface parameters changed. virtual void onSurfaceChanged(const OdTrVisSurfaceDef &pDef) = 0; // Called when rendering surface needs to be invalidated forcibly. virtual void onSurfaceInvalidated() = 0; // Overlays // Called when new overlay added into device. virtual void onOverlayAdded(OdTrVisOverlayId overlayId, const OdTrVisOverlayDef &pDef) = 0; // Called when exist overlay removed from device. virtual void onOverlayDeleted(OdTrVisOverlayId overlayId) = 0; // Called when overlay visibility changed. virtual void onOverlayVisibilityChanged(OdTrVisOverlayId overlayId, bool bVisibility) = 0; // Called when overlay rendering order changed. virtual void onOverlayRenderOrderChanged(OdTrVisOverlayId overlayId, OdInt16 nRenderOrder) = 0; // Viewports // Called when new viewport added into device. virtual void onViewportAdded(OdTrVisViewportId viewportId, const OdTrVisViewportDef &pDef) = 0; // Called when viewport inserted in list with some index. virtual void onViewportInserted(OdTrVisViewportId viewportId, int nIndex, const OdTrVisViewportDef &pDef) = 0; // Called when viewport removed from device. virtual void onViewportDeleted(OdTrVisViewportId viewportId) = 0; // Called when viewport visibility changed. virtual void onViewportVisibilityChanged(OdTrVisViewportId viewportId, bool bVisibility) = 0; // Primary viewports configuration // Called when viewport view parameters is modified. virtual void onViewportViewParamsModified(OdTrVisViewportId viewportId, const OdTrVisViewParamsDef &pDef) = 0; // Called when viewport linestyle settings is modified. virtual void onViewportLineStylesModified(OdTrVisViewportId viewportId, const OdTrVisViewportLineStyleDef &pDef) = 0; // Called when viewport fading settings is modified. virtual void onViewportFadingModified(OdTrVisViewportId viewportId, const OdTrVisViewportFadingDef &pDef) = 0; // Called when viewport lineweight settings is modified. virtual void onViewportLineweightsModified(OdTrVisViewportId viewportId, const OdTrVisViewportLineweightsDef &pDef) = 0; // Called when viewport rendering mode is modified. virtual void onViewportShadingModified(OdTrVisViewportId viewportId, const OdTrVisViewportShadingDef &pDef) = 0; // Called when viewport clipping region is modified. virtual void onViewportClipModified(OdTrVisViewportId viewportId, const OdTrVisViewportClipDef &pDef, bool bNrcClipModified = true, bool bBorderModified = true) = 0; // Extended viewports configuration // Called when background stream in viewport is changed. virtual void onViewportBackgroundChanged(OdTrVisViewportId viewportId, const OdTrVisBackgroundDef &pDef) = 0; // Called when viewport fog changed. virtual void onViewportFogChanged(OdTrVisViewportId viewportId, const OdTrVisFogDef &pDef) = 0; // Called when viewport render settings changed. virtual void onViewportRenderSettingsChanged(OdTrVisViewportId viewportId, const OdTrVisRenderSettingsDef &pDef) = 0; // Called when viewport sectioning modified. virtual void onViewportSectioningChanged(OdTrVisViewportId viewportId, const OdTrVisSectionDef &pDef) = 0; // Called when viewport anti-aliasing setting changed. virtual void onViewportAntiAliasingChanged(OdTrVisViewportId viewportId, OdUInt32 nAntiAliasing) = 0; // Called when viewport ssao setting changed. virtual void onViewportSSAOChanged(OdTrVisViewportId viewportId, bool bEnabled) = 0; // Viewport default lights configuration // Called when viewport ambient light setting modified. virtual void onViewportAmbientLightChanged(OdTrVisViewportId viewportId, const OdTrVisMaterialColor &ambientLight) = 0; // Called when viewport default light setting modified. virtual void onViewportDefaultLightsChanged(OdTrVisViewportId viewportId, bool bDefaultLightsOn, const OdTrVisLightDef *pLightsList = NULL, OdUInt32 nLightsListEntries = 0) = 0; // Viewport lights management // Called when light source added into viewport light sources list. virtual void onViewportLightAttached(OdTrVisViewportId viewportId, OdTrVisLightId lightId, OdUInt32 nOverrides = 0, const OdTrVisLightDef &pOverrides = OdTrVisLightDef()) = 0; // Called when light source removed from viewport light sources list. virtual void onViewportLightDetached(OdTrVisViewportId viewportId, OdTrVisLightId lightId) = 0; // Per-overlay viewport overrides // Called when viewport needs override view parameters for specific overlay. virtual void onOverlayViewParamsOverride(OdTrVisViewportId viewportId, OdTrVisOverlayId overlayId, bool bOverride, const OdTrVisViewParamsDef &pDef = OdTrVisViewParamsDef()) = 0; // Called when viewport extents changed. virtual void onOverlayExtentsOverride(OdTrVisViewportId viewportId, OdTrVisOverlayId overlayId, const OdTrVisExtentsDef &pDef) = 0; // Viewports ordering lists // Called when order of metafiles in viewport is changed (for obtain full list by renderer). virtual void onMetafileOrderChanged(OdTrVisViewportId viewportId, OdTrVisOverlayId overlayId, const OdTrVisDisplayId *pList, OdUInt32 nEntries) = 0; // Called when order of metafiles in viewport is changed (for obtain modified part of list by renderer). virtual void onMetafileOrderChanged(OdTrVisViewportId viewportId, OdTrVisOverlayId overlayId, OdUInt32 nInvalidFrom, OdUInt32 nInvalidLen, const OdTrVisDisplayId *pValidFrom, OdUInt32 nValidLen) = 0; // Called when order of metafiles can be inherit from other source. virtual void onMetafileOrderInheritance( OdTrVisViewportId viewportId1, OdTrVisOverlayId overlayId1, OdTrVisViewportId viewportId2 ) = 0; // Metafiles // Called when new metafile added (returns visualId, equal to metafileId by default). virtual OdTrVisDisplayId onMetafileAdded(OdTrVisMetafileId metafileId, const OdTrVisMetafileDef &pDef) = 0; // Called when exist metafile deleted. virtual void onMetafileDeleted(OdTrVisMetafileId metafileId) = 0; // Called when exist metafile changed. //virtual void onMetafileModified(OdTrVisMetafileId metafileId, const OdTrVisMetafileDef &pDef) = 0; // Called when exist metafile extents updated (affected by transformation state branches). virtual void onMetafileExtentsUpdated(OdTrVisMetafileId metafileId, const OdGeExtents3d &extents) = 0; // Called when exist metafile visibility changed. virtual void onMetafileVisibilityChanged(OdTrVisMetafileId metafileId, bool bVisibility) = 0; // Called when exist metafile highlighting changed. virtual void onMetafileHighlightingChanged(OdTrVisMetafileId metafileId, bool bHighlight) = 0; // Called when exist metafile fading changed. virtual void onMetafileFadingChanged(OdTrVisMetafileId metafileId, bool bFade) = 0; // Lights // Called when new light source added. virtual void onLightAdded(OdTrVisLightId lightId, const OdTrVisLightDef &pDef) = 0; // Called when exist light source modified. virtual void onLightModified(OdTrVisLightId lightId, OdUInt32 nKindOfMod, const OdTrVisLightDef &pDef) = 0; // Called when exist light source deleted. virtual void onLightDeleted(OdTrVisLightId lightId) = 0; // State branches (highlighting, hide, transform) // Called when new state branch added. virtual void onStateBranchAdded(OdTrVisStateBranchId stateBranchId, const OdTrVisStateBranchDef &pDef) = 0; // Called when exist state branch modified. virtual void onStateBranchModified(OdTrVisStateBranchId stateBranchId, const OdTrVisStateBranchDef &pDef, bool bChildsModified, bool bMarkersModified) = 0; // Called when exist state branch deleted. virtual void onStateBranchDeleted(OdTrVisStateBranchId stateBranchId) = 0; // Called to attach additional data to range of state branch markers. virtual void onStateBranchMarkersRangeDataAdded(OdTrVisStateBranchId stateBranchId, const OdTrVisStateBranchMarkersRange &range, const OdTrVisPropertyDef &propDef) = 0; // Called to detach additional data from state branch markers range. virtual void onStateBranchMarkersRangeDataRemoved(OdTrVisStateBranchId stateBranchId, const OdTrVisStateBranchMarkersRange &range) = 0; // Textures // Called when new texture added. virtual void onTextureAdded(OdTrVisTextureId textureId, const OdTrVisTextureDef &pDef) = 0; // Called when exist texture deleted. virtual void onTextureDeleted(OdTrVisTextureId textureId) = 0; // Called when texture flags modified. virtual void onTextureFlagsModified(OdTrVisTextureId textureId, OdUInt32 newFlags) = 0; // Materials // Called when new material added. virtual void onMaterialAdded(OdTrVisMaterialId materialId, const OdTrVisMaterialDef &pDef) = 0; // Called when exist material deleted. virtual void onMaterialDeleted(OdTrVisMaterialId materialId) = 0; // Called when new material reflection plane added. virtual void onMaterialRefPlaneAdded(OdTrVisRefPlaneId refPlaneId, const OdTrVisRefPlaneDef &pDef) = 0; // Called when exist material reflection plane deleted. virtual void onMaterialRefPlaneDeleted(OdTrVisRefPlaneId refPlaneId) = 0; // Visual Styles // Called when new visual style added. virtual void onVisualStyleAdded(OdTrVisVisualStyleId visualStyleId, const OdTrVisVisualStyle &pDef) = 0; // Called when exist visual style modified. virtual void onVisualStyleModified(OdTrVisVisualStyleId visualStyleId, const OdTrVisVisualStyle &pDef) = 0; // Called when exist visual style deleted. virtual void onVisualStyleDeleted(OdTrVisVisualStyleId visualStyleId) = 0; // Layers // Called when new layer added. virtual void onLayerAdded(OdTrVisLayerId layerId, const OdTrVisLayerDef &pDef) = 0; // Called when exist layer modified. //virtual void onLayerModified(OdTrVisLayerId layerId, const OdTrVisLayerDef &pDef) = 0; // Called when exist layer deleted. virtual void onLayerDeleted(OdTrVisLayerId layerId) = 0; // Called when exist layer visibility changed. virtual void onLayerVisibilityChanged(OdTrVisLayerId layerId, bool bVisibility) = 0; // Called when exist layer fading changed. virtual void onLayerFadingChanged(OdTrVisLayerId layerId, bool bFade) = 0; // Called when layer viewport-dependent properties changed. virtual void onLayerVpDepPropsOverride(OdTrVisLayerId layerId, OdTrVisViewportId viewportId, bool bOverride, const OdTrVisLayerProps &pProps = OdTrVisLayerProps()) = 0; // Extension objects // Called when new extension object added. virtual void onExtensionObjectAdded(OdTrVisExtensionId extId, const OdTrVisExtensionObject *pObj) = 0; // Called when exist extension object deleted. virtual void onExtensionObjectDeleted(OdTrVisExtensionId extId) = 0; // Called to send special extension object specific data. virtual void onExtensionObjectSpecificData(OdTrVisExtensionId extId, OdUInt32 nDataId, const OdTrVisPropertyDef &propDef) = 0; // Called to change extension object visibility. virtual void onExtensionObjectVisibilityChanged(OdTrVisExtensionId extId, bool bVisibility) = 0; // Blocks // Called when new block added. virtual void onBlockAdded(OdTrVisBlockId blockId, const OdTrVisDisplayId *pList, OdUInt32 nEntries) = 0; // Called when block display list changed. virtual void onBlockModified(OdTrVisBlockId blockId, OdUInt32 nInvalidFrom, OdUInt32 nInvalidLen, const OdTrVisDisplayId *pValidFrom, OdUInt32 nValidLen) = 0; // Called when exist block deleted. virtual void onBlockDeleted(OdTrVisBlockId blockId) = 0; // Groups // Called when new group added. virtual void onGroupAdded(OdTrVisGroupId groupId) = 0; // Called when exist group deleted. virtual void onGroupDeleted(OdTrVisGroupId groupId) = 0; // Called to attach metafiles to group. virtual void onGroupMetafilesAttached(OdTrVisGroupId groupId, const OdTrVisMetafileId *pMetafilesList, OdUInt32 nMetafiles) = 0; // Called to detach metafiles from group (if no metafiles specified - clear entire list of groupped metafiles). virtual void onGroupMetafilesDetached(OdTrVisGroupId groupId, const OdTrVisMetafileId *pMetafilesList, OdUInt32 nMetafiles) = 0; // Called to delete all groupped metafiles from graphics scene. //virtual void onGroupMetafilesDeleted(OdTrVisGroupId groupId) = 0; // Called to change visibility state for all groupped metafiles. virtual void onGroupMetafilesVisibilityChanged(OdTrVisGroupId groupId, bool bVisibility) = 0; // Called to change highlighting state for all groupped metafiles. virtual void onGroupMetafilesHighlightingChanged(OdTrVisGroupId groupId, bool bHighlight) = 0; // Called to change fading state for all groupped metafiles. virtual void onGroupMetafilesFadingChanged(OdTrVisGroupId groupId, bool bFade) = 0; // Properties // Metafile-related properties. // Called to attach property to metafile. virtual void onMetafilePropertyAttached(OdTrVisMetafileId metafileId, const OdTrVisPropertyDef &propDef) = 0; // Called to detach property from metafile. virtual void onMetafilePropertyDetached(OdTrVisMetafileId metafileId, OdTrVisPropertyDef::PropertyType propType) = 0; // Group-related properties. // Called to attach property to group. virtual void onGroupPropertyAttached(OdTrVisGroupId groupId, const OdTrVisPropertyDef &propDef) = 0; // Called to detach property from group. virtual void onGroupPropertyDetached(OdTrVisGroupId groupId, OdTrVisPropertyDef::PropertyType propType) = 0; // Layer-related properties. // Called to attach property to layer. virtual void onLayerPropertyAttached(OdTrVisLayerId layerId, const OdTrVisPropertyDef &propDef) = 0; // Called to detach property from layer. virtual void onLayerPropertyDetached(OdTrVisLayerId layerId, OdTrVisPropertyDef::PropertyType propType) = 0; // VisualStyle-related properties. // Called to attach property to visual style. virtual void onVisualStylePropertyAttached(OdTrVisVisualStyleId visualStyleId, const OdTrVisPropertyDef &propDef) = 0; // Called to detach property from visual style. virtual void onVisualStylePropertyDetached(OdTrVisVisualStyleId visualStyleId, OdTrVisPropertyDef::PropertyType propType) = 0; // Material-related properties. // Called to attach property to material. virtual void onMaterialPropertyAttached(OdTrVisMaterialId materialId, const OdTrVisPropertyDef &propDef) = 0; // Called to detach property from material. virtual void onMaterialPropertyDetached(OdTrVisMaterialId materialId, OdTrVisPropertyDef::PropertyType propType) = 0; // Texture-related properties. // Called to attach property to texture. virtual void onTexturePropertyAttached(OdTrVisTextureId textureId, const OdTrVisPropertyDef &propDef) = 0; // Called to detach property from texture. virtual void onTexturePropertyDetached(OdTrVisTextureId textureId, OdTrVisPropertyDef::PropertyType propType) = 0; // Light-related properties. // Called to attach property to light source. virtual void onLightPropertyAttached(OdTrVisLightId lightId, const OdTrVisPropertyDef &propDef) = 0; // Called to detach property from light source. virtual void onLightPropertyDetached(OdTrVisLightId lightId, OdTrVisPropertyDef::PropertyType propType) = 0; // HlBranch-related properties. // Called to attach property to state branch. virtual void onStateBranchPropertyAttached(OdTrVisStateBranchId stateBranchId, const OdTrVisPropertyDef &propDef) = 0; // Called to detach property from state branch. virtual void onStateBranchPropertyDetached(OdTrVisStateBranchId stateBranchId, OdTrVisPropertyDef::PropertyType propType) = 0; // Viewport-related properties. // Called to attach property to viewport. virtual void onViewportPropertyAttached(OdTrVisViewportId viewportId, const OdTrVisPropertyDef &propDef) = 0; // Called to detach property from viewport. virtual void onViewportPropertyDetached(OdTrVisViewportId viewportId, OdTrVisPropertyDef::PropertyType propType) = 0; // Overlay-related properties. // Called to attach property to overlay. virtual void onOverlayPropertyAttached(OdTrVisOverlayId overlayId, const OdTrVisPropertyDef &propDef) = 0; // Called to detach property from overlay. virtual void onOverlayPropertyDetached(OdTrVisOverlayId overlayId, OdTrVisPropertyDef::PropertyType propType) = 0; // ExtensionObject-related properties. // Called to attach property to extension object. virtual void onExtensionObjectPropertyAttached(OdTrVisExtensionId extId, const OdTrVisPropertyDef &propDef) = 0; // Called to detach property from extension object. virtual void onExtensionObjectPropertyDetached(OdTrVisExtensionId extId, OdTrVisPropertyDef::PropertyType propType) = 0; // Block-related properties. // Called to attach property to block. virtual void onBlockPropertyAttached(OdTrVisBlockId blockId, const OdTrVisPropertyDef &propDef) = 0; // Called to detach property from viewport. virtual void onBlockPropertyDetached(OdTrVisBlockId blockId, OdTrVisPropertyDef::PropertyType propType) = 0; }; typedef OdSmartPtr OdTrVisRenditionPtr; /** \details */ class OdTrVisRenditionDef : public OdTrVisRendition { protected: struct IdRegistratorStub : public IdRegistrator { void reg(DataType /*type*/, OdTrVisId /*id*/, OdDbStub * /*pPersId*/) override { } void reg(DataType /*type*/, OdTrVisId /*id*/, const OdGiDrawable * /*pTransId*/) override { } void reg(DataType /*type*/, OdTrVisId /*id*/, const OdTrVisUniqueID & /*uId*/) override { } void kill(DataType /*type*/, OdTrVisId /*id*/) override { } OdTrVisUniqueID *get(DataType /*type*/, OdTrVisId /*id*/, bool /*bKill*/ = false) const override { return NULL; } } m_IdRegistratorStub; public: // High-level callbacks // Called on starting vectorizer update. void onDeviceUpdateBegin(OdTrVisRenderClient * /*pDevice*/) override { } // Called on ending vectorizer update. void onDeviceUpdateEnd(OdTrVisRenderClient * /*pDevice*/, bool /*bRender*/ = true) override { } // Checks that vectorizer update started. bool isWithinDeviceUpdate() const override { return false; } // Called by underlying application to store frame changing information. void onFrameSwitchInfo(OdUInt32 /*nInterval*/) override { } // Returns set of bit flags which indicate rendition capabilities/settings OdUInt32 queryRenditionCaps(OdUInt32 /*requestFor*/ = 0xFFFFFFFF) const override { return 0; } // Partial update support for local renditions: // Called to check does specified viewport/overlay combination support partial update query. bool onPartialUpdateCheckLimit(OdTrVisViewportId /*viewportId*/, OdTrVisOverlayId /*overlayId*/) override { return false; } // Called to setup invalid rectangles and overlays on partial update. void onPartialUpdateInvalidRects(OdTrVisOverlayId /*overlayId*/, const OdGsDCRectArray & /*invalidRects*/, bool /*bOverlayInvalid*/ = false) override { } // Called on partial update query to set entire actual visibilities list. void onPartialUpdateList(OdTrVisViewportId /*viewportId*/, OdTrVisOverlayId /*overlayId*/, const OdTrVisDisplayId * /*pList*/, OdUInt32 /*nEntries*/) override { } // Can be called by client side to check that rendition supports direct rendering ability. bool queryPartialUpdateDirectInvocation(OdTrVisViewportId /*viewportId*/, OdTrVisOverlayId /*overlayId*/, OdTrVisDirectRenderPartialUpdateInvocationPtr & /*pInvocationPtr*/) override { return false; } // Can be called by client side to setup direct invocation interface for partial update instead of partial update list usage. void onPartialUpdateDirectInvocation(const OdTrVisDirectRenderPartialUpdateInvocation * /*pInvocation*/, OdTrVisRenderDataDirectAccessor * /*pAccessor*/) override { } // Query snapshot void querySnapshot(OdUInt8 * /*pScanlines*/, long /*minX*/, long /*minY*/, long /*nWidth*/, long /*nHeight*/) override { } // Renders viewport to selection texture. Return top object id with (x, y) position in viewport. void getSelectedObject(OdTrVisViewportId /*id*/, const OdGePoint2d* /*aPtDc*/, int /*numPoints*/, OdArray & /*outIDs*/, OdTrVisGsMarker * /*outMarker*/ = NULL) ODRX_OVERRIDE { } // Allocate new resource sharing provider compatible with rendition OdTrVisSharingProviderClientPtr createSharingProvider() override { return OdTrVisSharingProviderClientPtr(); } // Extract local rendition-specific host service. OdTrRndLocalRenditionHost *localRenditionHost() override { return nullptr; } // Multithread processing flags MtHandlerType mtDataTypeProcessing(DataType & /*type*/) const override { return kMtSkip; } // Returns Id registrator, or NULL if no registration supported IdRegistrator *idRegistrator() const override { return NULL; } // Returns true if metafile streams accessible directly, returns stream by Id bool queryMetafileStream(OdTrVisViewportId /*viewportId*/, OdTrVisOverlayId /*overlayId*/, const OdTrVisDisplayId * /*pDisplayId*/, OdUInt32 /*nPathLength*/, const OdTrVisMetafileContainer ** /*pStream*/, const OdTrVisExtendedBindingAccessor ** /*pExAccessor*/ = nullptr) override { return false; } // Unlock metafile stream, queried by queryMetafileStream method bool unlockMetafileStream(const OdTrVisMetafileContainer * /*pStream*/) override { return false; } // Returns block metafile list in case if it is accessible. const OdTrVisDisplayId *queryBlockMetafilesList(OdTrVisBlockId /*blockId*/, OdUInt32 & /*numEntries*/) override { return NULL; } // Returns extension object by Id. OdTrVisExtensionObjectPtr queryExtensionObject(OdTrVisExtensionId /*extId*/) override { return OdTrVisExtensionObjectPtr(); } // Returns non-kTrVisNegativeId in case if vectorizer supports ProgramID's embedded into metafile stream OdTrVisProgramId queryProgramId(OdGsView::RenderMode /*mode*/, OdTrVisVisualStyleId /*vsId*/ = kTrVisNegativeId, OdTrVisGeomType /*geomType*/ = OdTrVisGeomType_Default, OdUInt16 /*attrFlags*/ = 0, OdUInt16 /*shadingFlags*/ = 0) const override { return kTrVisNegativeId; } // GsFiler support bool saveRenditionState(OdGsFiler * /*pFiler*/) const override { return false; } bool loadRenditionState(OdGsFiler * /*pFiler*/, OdTrVisIdMap * /*pIdMap*/) override { return false; } // Mid-level callbacks // Client information // Returns rendering client settings. void obtainClientSettings(ClientSettings & /*clientSets*/) override { } // Surface // Called when output render surface parameters changed. void onSurfaceChanged(const OdTrVisSurfaceDef & /*pDef*/) override { } // Called when rendering surface needs to be invalidated forcibly. void onSurfaceInvalidated() override { } // Overlays // Called when new overlay added into device. void onOverlayAdded(OdTrVisOverlayId /*overlayId*/, const OdTrVisOverlayDef & /*pDef*/) override { } // Called when exist overlay removed from device. void onOverlayDeleted(OdTrVisOverlayId /*overlayId*/) override { } // Called when overlay visibility changed. void onOverlayVisibilityChanged(OdTrVisOverlayId /*overlayId*/, bool /*bVisibility*/) override { } // Called when overlay rendering order changed. void onOverlayRenderOrderChanged(OdTrVisOverlayId /*overlayId*/, OdInt16 /*nRenderOrder*/) override { } // Viewports // Called when new viewport added into device. void onViewportAdded(OdTrVisViewportId /*viewportId*/, const OdTrVisViewportDef & /*pDef*/) override { } // Called when viewport inserted in list with some index. void onViewportInserted(OdTrVisViewportId /*viewportId*/, int /*nIndex*/, const OdTrVisViewportDef & /*pDef*/) override { } // Called when viewport removed from device. void onViewportDeleted(OdTrVisViewportId /*viewportId*/) override { } // Called when viewport visibility changed. void onViewportVisibilityChanged(OdTrVisViewportId /*viewportId*/, bool /*bVisibility*/) override { } // Primary viewports configuration // Called when viewport view parameters is modified. void onViewportViewParamsModified(OdTrVisViewportId /*viewportId*/, const OdTrVisViewParamsDef & /*pDef*/) override { } // Called when viewport linestyle settings is modified. void onViewportLineStylesModified(OdTrVisViewportId /*viewportId*/, const OdTrVisViewportLineStyleDef & /*pDef*/) override { } // Called when viewport fading settings is modified. void onViewportFadingModified(OdTrVisViewportId /*viewportId*/, const OdTrVisViewportFadingDef & /*pDef*/) override { } // Called when viewport lineweight settings is modified. void onViewportLineweightsModified(OdTrVisViewportId /*viewportId*/, const OdTrVisViewportLineweightsDef & /*pDef*/) override { } // Called when viewport rendering mode is modified. void onViewportShadingModified(OdTrVisViewportId /*viewportId*/, const OdTrVisViewportShadingDef & /*pDef*/) override { } // Called when viewport clipping region is modified. void onViewportClipModified(OdTrVisViewportId /*viewportId*/, const OdTrVisViewportClipDef & /*pDef*/, bool /*bNrcClipModified*/ = true, bool /*bBorderModified*/ = true) override { } // Extended viewports configuration // Called when background stream in viewport is changed. void onViewportBackgroundChanged(OdTrVisViewportId /*viewportId*/, const OdTrVisBackgroundDef & /*pDef*/) override { } // Called when viewport fog changed. void onViewportFogChanged(OdTrVisViewportId /*viewportId*/, const OdTrVisFogDef & /*pDef*/) override { } // Called when viewport render settings changed. void onViewportRenderSettingsChanged(OdTrVisViewportId /*viewportId*/, const OdTrVisRenderSettingsDef & /*pDef*/) override { } // Called when viewport sectioning modified. void onViewportSectioningChanged(OdTrVisViewportId /*viewportId*/, const OdTrVisSectionDef & /*pDef*/) override { } // Called when viewport anti-aliasing setting changed. void onViewportAntiAliasingChanged(OdTrVisViewportId /*viewportId*/, OdUInt32 /*nAntiAliasing*/) override { } // Called when viewport ssao setting changed. void onViewportSSAOChanged(OdTrVisViewportId /*viewportId*/, bool /*bEnabled*/) ODRX_OVERRIDE {} // Viewport default lights configuration // Called when viewport ambient light setting modified. void onViewportAmbientLightChanged(OdTrVisViewportId /*viewportId*/, const OdTrVisMaterialColor & /*ambientLight*/) override { } // Called when viewport default light setting modified. void onViewportDefaultLightsChanged(OdTrVisViewportId /*viewportId*/, bool /*bDefaultLightsOn*/, const OdTrVisLightDef * /*pLightsList*/ = NULL, OdUInt32 /*nLightsListEntries*/ = 0) override { } // Viewport lights management // Called when light source added into viewport light sources list. void onViewportLightAttached(OdTrVisViewportId /*viewportId*/, OdTrVisLightId /*lightId*/, OdUInt32 /*nOverrides*/ = 0, const OdTrVisLightDef & /*pOverrides*/ = OdTrVisLightDef()) override { } // Called when light source removed from viewport light sources list. void onViewportLightDetached(OdTrVisViewportId /*viewportId*/, OdTrVisLightId /*lightId*/) override { } // Per-overlay viewport overrides // Called when viewport needs override view parameters for specific overlay. void onOverlayViewParamsOverride(OdTrVisViewportId /*viewportId*/, OdTrVisOverlayId /*overlayId*/, bool /*bOverride*/, const OdTrVisViewParamsDef & /*pDef*/ = OdTrVisViewParamsDef()) override { } // Called when viewport extents changed. void onOverlayExtentsOverride(OdTrVisViewportId /*viewportId*/, OdTrVisOverlayId /*overlayId*/, const OdTrVisExtentsDef & /*pDef*/) override { } // Viewports ordering lists // Called when order of metafiles in viewport is changed. void onMetafileOrderChanged(OdTrVisViewportId /*viewportId*/, OdTrVisOverlayId /*overlayId*/, const OdTrVisDisplayId * /*pList*/, OdUInt32 /*nEntries*/) override { } // Called when order of metafiles in viewport is changed (for obtain modified part of list by renderer). void onMetafileOrderChanged(OdTrVisViewportId /*viewportId*/, OdTrVisOverlayId /*overlayId*/, OdUInt32 /*nInvalidFrom*/, OdUInt32 /*nInvalidLen*/, const OdTrVisDisplayId * /*pValidFrom*/, OdUInt32 /*nValidLen*/) override { } // Called when order of metafiles can be inherit from other source. void onMetafileOrderInheritance(OdTrVisViewportId /*viewportId1*/, OdTrVisOverlayId /*overlayId1*/, OdTrVisViewportId /*viewportId2*/) override { } // Metafiles // Called when new metafile added (returns visualId, equal to metafileId by default). OdTrVisDisplayId onMetafileAdded(OdTrVisMetafileId metafileId, const OdTrVisMetafileDef & /*pDef*/) override { return (OdTrVisDisplayId)metafileId; } // Called when exist metafile deleted. void onMetafileDeleted(OdTrVisMetafileId /*metafileId*/) override { } // Called when exist metafile changed. //virtual void onMetafileModified(OdTrVisMetafileId /*metafileId*/, const OdTrVisMetafileDef & /*pDef*/) { } // Called when exist metafile extents updated (affected by transformation state branches). void onMetafileExtentsUpdated(OdTrVisMetafileId /*metafileId*/, const OdGeExtents3d & /*extents*/) override { } // Called when exist metafile visibility changed. void onMetafileVisibilityChanged(OdTrVisMetafileId /*metafileId*/, bool /*bVisibility*/) override { } // Called when exist metafile highlighting changed. void onMetafileHighlightingChanged(OdTrVisMetafileId /*metafileId*/, bool /*bHighlight*/) override { } // Called when exist metafile fading changed. void onMetafileFadingChanged(OdTrVisMetafileId /*metafileId*/, bool /*bFade*/) override { } // Lights // Called when new light source added. void onLightAdded(OdTrVisLightId /*lightId*/, const OdTrVisLightDef & /*pDef*/) override { } // Called when exist light source modified. void onLightModified(OdTrVisLightId /*lightId*/, OdUInt32 /*nKindOfMod*/, const OdTrVisLightDef & /*pDef*/) override { } // Called when exist light source deleted. void onLightDeleted(OdTrVisLightId /*lightId*/) override { } // State branches (highlighting, hide, transform) // Called when new state branch added. void onStateBranchAdded(OdTrVisStateBranchId /*stateBranchId*/, const OdTrVisStateBranchDef & /*pDef*/) override { } // Called when exist state branch modified. void onStateBranchModified(OdTrVisStateBranchId /*stateBranchId*/, const OdTrVisStateBranchDef & /*pDef*/, bool /*bChildsModified*/, bool /*bMarkersModified*/) override { } // Called when exist state branch deleted. void onStateBranchDeleted(OdTrVisStateBranchId /*stateBranchId*/) override { } // Called to attach additional data to range of state branch markers. void onStateBranchMarkersRangeDataAdded(OdTrVisStateBranchId /*stateBranchId*/, const OdTrVisStateBranchMarkersRange & /*range */ , const OdTrVisPropertyDef & /*propDef*/) override { } // Called to detach additional data from state branch markers range. void onStateBranchMarkersRangeDataRemoved(OdTrVisStateBranchId /*stateBranchId*/, const OdTrVisStateBranchMarkersRange & /*range*/) override { } // Textures // Called when new texture added. void onTextureAdded(OdTrVisTextureId /*textureId*/, const OdTrVisTextureDef & /*pDef*/) override { } // Called when exist texture deleted. void onTextureDeleted(OdTrVisTextureId /*textureId*/) override { } // Called when texture flags modified. void onTextureFlagsModified(OdTrVisTextureId /*textureId*/, OdUInt32 /*newFlags*/) override { } // Materials // Called when new material added. void onMaterialAdded(OdTrVisMaterialId /*materialId*/, const OdTrVisMaterialDef & /*pDef*/) override { } // Called when exist material deleted. void onMaterialDeleted(OdTrVisMaterialId /*materialId*/) override { } // Called when new material reflection plane added. void onMaterialRefPlaneAdded(OdTrVisRefPlaneId /*refPlaneId*/, const OdTrVisRefPlaneDef & /*pDef*/) override { } // Called when exist material reflection plane deleted. void onMaterialRefPlaneDeleted(OdTrVisRefPlaneId /*refPlaneId*/) override { } // Visual Styles // Called when new visual style added. void onVisualStyleAdded(OdTrVisVisualStyleId /*visualStyleId*/, const OdTrVisVisualStyle & /*pDef*/) override { } // Called when exist visual style modified. void onVisualStyleModified(OdTrVisVisualStyleId /*visualStyleId*/, const OdTrVisVisualStyle & /*pDef*/) override { } // Called when exist visual style deleted. void onVisualStyleDeleted(OdTrVisVisualStyleId /*visualStyleId*/) override { } // Layers // Called when new layer added. void onLayerAdded(OdTrVisLayerId /*layerId*/, const OdTrVisLayerDef & /*pDef*/) override { } // Called when exist layer modified. //virtual void onLayerModified(OdTrVisLayerId /*layerId*/, const OdTrVisLayerDef & /*pDef*/) { } // Called when exist layer deleted. void onLayerDeleted(OdTrVisLayerId /*layerId*/) override { } // Called when exist layer visibility changed. void onLayerVisibilityChanged(OdTrVisLayerId /*layerId*/, bool /*bVisibility*/) override { } // Called when exist layer fading changed. void onLayerFadingChanged(OdTrVisLayerId /*layerId*/, bool /*bFade*/) override { } // Called when layer viewport-dependent properties changed. void onLayerVpDepPropsOverride(OdTrVisLayerId /*layerId*/, OdTrVisViewportId /*viewportId*/, bool /*bOverride*/, const OdTrVisLayerProps & /*pProps*/ = OdTrVisLayerProps()) override { } // Extension objects // Called when new extension object added. void onExtensionObjectAdded(OdTrVisExtensionId /*extId*/, const OdTrVisExtensionObject* /*pObj*/) override { } // Called when exist extension object deleted. void onExtensionObjectDeleted(OdTrVisExtensionId /*extId*/) override { } // Called to send special extension object specific data. void onExtensionObjectSpecificData(OdTrVisExtensionId /*extId*/, OdUInt32 /*nDataId*/, const OdTrVisPropertyDef& /*propDef*/) override { } // Called to change extension object visibility. void onExtensionObjectVisibilityChanged(OdTrVisExtensionId /*extId*/, bool /*bVisibility*/) override { } // Blocks // Called when new block added. void onBlockAdded(OdTrVisBlockId /*blockId*/, const OdTrVisDisplayId * /*pList*/, OdUInt32 /*nEntries*/) override { } // Called when block display list changed. void onBlockModified(OdTrVisBlockId /*blockId*/, OdUInt32 /*nInvalidFrom*/, OdUInt32 /*nInvalidLen */ , const OdTrVisDisplayId * /*pValidFrom*/, OdUInt32 /*nValidLen*/) override { } // Called when exist block deleted. void onBlockDeleted(OdTrVisBlockId /*blockId*/) override { } // Groups // Called when new group added. void onGroupAdded(OdTrVisGroupId /*groupId*/) override { } // Called when exist group deleted. void onGroupDeleted(OdTrVisGroupId /*groupId*/) override { } // Called to attach metafiles to group. void onGroupMetafilesAttached(OdTrVisGroupId /*groupId*/, const OdTrVisMetafileId * /*pMetafilesList*/, OdUInt32 /*nMetafiles*/) override { } // Called to detach metafiles from group (if no metafiles specified - clear entire list of groupped metafiles). void onGroupMetafilesDetached(OdTrVisGroupId /*groupId*/, const OdTrVisMetafileId * /*pMetafilesList*/, OdUInt32 /*nMetafiles*/) override { } // Called to delete all groupped metafiles from graphics scene. //virtual void onGroupMetafilesDeleted(OdTrVisGroupId /*groupId*/) { } // Called to change visibility state for all groupped metafiles. void onGroupMetafilesVisibilityChanged(OdTrVisGroupId /*groupId*/, bool /*bVisibility*/) override { } // Called to change highlighting state for all groupped metafiles. void onGroupMetafilesHighlightingChanged(OdTrVisGroupId /*groupId*/, bool /*bHighlight*/) override { } // Called to change fading state for all groupped metafiles. void onGroupMetafilesFadingChanged(OdTrVisGroupId /*groupId*/, bool /*bFade*/) override { } // Properties // Metafile-related properties. // Called to attach property to metafile. void onMetafilePropertyAttached(OdTrVisMetafileId /*metafileId*/, const OdTrVisPropertyDef & /*propDef*/) override { } // Called to detach property from metafile. void onMetafilePropertyDetached(OdTrVisMetafileId /*metafileId*/, OdTrVisPropertyDef::PropertyType /*propType*/) override { } // Group-related properties. // Called to attach property to group. void onGroupPropertyAttached(OdTrVisGroupId /*groupId*/, const OdTrVisPropertyDef & /*propDef*/) override { } // Called to detach property from group. void onGroupPropertyDetached(OdTrVisGroupId /*groupId*/, OdTrVisPropertyDef::PropertyType /*propType*/) override { } // Layer-related properties. // Called to attach property to layer. void onLayerPropertyAttached(OdTrVisLayerId /*layerId*/, const OdTrVisPropertyDef & /*propDef*/) override { } // Called to detach property from layer. void onLayerPropertyDetached(OdTrVisLayerId /*layerId*/, OdTrVisPropertyDef::PropertyType /*propType*/) override { } // VisualStyle-related properties. // Called to attach property to visual style. void onVisualStylePropertyAttached(OdTrVisVisualStyleId /*visualStyleId*/, const OdTrVisPropertyDef & /*propDef*/) override { } // Called to detach property from visual style. void onVisualStylePropertyDetached(OdTrVisVisualStyleId /*visualStyleId*/, OdTrVisPropertyDef::PropertyType /*propType*/) override { } // Material-related properties. // Called to attach property to material. void onMaterialPropertyAttached(OdTrVisMaterialId /*materialId*/, const OdTrVisPropertyDef & /*propDef*/) override { } // Called to detach property from material. void onMaterialPropertyDetached(OdTrVisMaterialId /*materialId*/, OdTrVisPropertyDef::PropertyType /*propType*/) override { } // Texture-related properties. // Called to attach property to texture. void onTexturePropertyAttached(OdTrVisTextureId /*textureId*/, const OdTrVisPropertyDef & /*propDef*/) override { } // Called to detach property from texture. void onTexturePropertyDetached(OdTrVisTextureId /*textureId*/, OdTrVisPropertyDef::PropertyType /*propType*/) override { } // Light-related properties. // Called to attach property to light source. void onLightPropertyAttached(OdTrVisLightId /*lightId*/, const OdTrVisPropertyDef & /*propDef*/) override { } // Called to detach property from light source. void onLightPropertyDetached(OdTrVisLightId /*lightId*/, OdTrVisPropertyDef::PropertyType /*propType*/) override { } // HlBranch-related properties. // Called to attach property to state branch. void onStateBranchPropertyAttached(OdTrVisStateBranchId /*stateBranchId*/, const OdTrVisPropertyDef & /*propDef*/) override { } // Called to detach property from state branch. void onStateBranchPropertyDetached(OdTrVisStateBranchId /*stateBranchId*/, OdTrVisPropertyDef::PropertyType /*propType*/) override { } // Viewport-related properties. // Called to attach property to viewport. void onViewportPropertyAttached(OdTrVisViewportId /*viewportId*/, const OdTrVisPropertyDef & /*propDef*/) override { } // Called to detach property from viewport. void onViewportPropertyDetached(OdTrVisViewportId /*viewportId*/, OdTrVisPropertyDef::PropertyType /*propType*/) override { } // Overlay-related properties. // Called to attach property to overlay. void onOverlayPropertyAttached(OdTrVisOverlayId /*overlayId*/, const OdTrVisPropertyDef & /*propDef*/) override { } // Called to detach property from overlay. void onOverlayPropertyDetached(OdTrVisOverlayId /*overlayId*/, OdTrVisPropertyDef::PropertyType /*propType*/) override { } // ExtensionObject-related properties. // Called to attach property to extension object. void onExtensionObjectPropertyAttached(OdTrVisExtensionId /*extId*/, const OdTrVisPropertyDef & /*propDef*/) override { } // Called to detach property from extension object. void onExtensionObjectPropertyDetached(OdTrVisExtensionId /*extId*/, OdTrVisPropertyDef::PropertyType /*propType*/) override { } // Block-related properties. // Called to attach property to block. void onBlockPropertyAttached(OdTrVisBlockId /*blockId*/, const OdTrVisPropertyDef & /*propDef*/) override { } // Called to detach property from viewport. void onBlockPropertyDetached(OdTrVisBlockId /*blockId*/, OdTrVisPropertyDef::PropertyType /*propType*/) override { } }; /** \details */ class OdTrVisRenditionRedir : public OdTrVisRendition { protected: OdTrVisRendition *m_pRedir; OdTrVisRendition *m_pInformationalRedir; public: struct IdRegistratorRedir : public IdRegistrator { IdRegistrator *m_pIdRegRedir; IdRegistratorRedir() : m_pIdRegRedir(NULL) { } void setIdRegRedirection(IdRegistrator *pRedir) { m_pIdRegRedir = pRedir; } IdRegistrator *getIdRegRedirection() { return m_pIdRegRedir; } const IdRegistrator *getIdRegRedirection() const { return m_pIdRegRedir; } bool hasIdRegRedirection() const { return (m_pIdRegRedir != NULL); } void reg(DataType type, OdTrVisId id, OdDbStub *pPersId) override { if (hasIdRegRedirection()) getIdRegRedirection()->reg(type, id, pPersId); } void reg(DataType type, OdTrVisId id, const OdGiDrawable *pTransId) override { if (hasIdRegRedirection()) getIdRegRedirection()->reg(type, id, pTransId); } void reg(DataType type, OdTrVisId id, const OdTrVisUniqueID &uId) override { if (hasIdRegRedirection()) getIdRegRedirection()->reg(type, id, uId); } void kill(DataType type, OdTrVisId id) override { if (hasIdRegRedirection()) getIdRegRedirection()->kill(type, id); } OdTrVisUniqueID *get(DataType type, OdTrVisId id, bool bKill = false) const override { if (hasIdRegRedirection()) return getIdRegRedirection()->get(type, id, bKill); return NULL; } }; public: OdTrVisRenditionRedir() : m_pRedir(NULL), m_pInformationalRedir(NULL) { } void setRedirection(OdTrVisRendition *pRedir) { m_pRedir = pRedir; } OdTrVisRendition *getRedirection() { return m_pRedir; } const OdTrVisRendition *getRedirection() const { return m_pRedir; } bool hasRedirection() const { return (m_pRedir != NULL); } void setInformationalRedirection(OdTrVisRendition *pRedir) { m_pInformationalRedir = pRedir; } OdTrVisRendition *getInformationalRedirection() { if (!m_pInformationalRedir) throw OdError(eNullPtr); return m_pInformationalRedir; } const OdTrVisRendition *getInformationalRedirection() const { if (!m_pInformationalRedir) throw OdError(eNullPtr); return m_pInformationalRedir; } bool hasInformationalRedirection() const { return (m_pInformationalRedir != NULL); } void setRedirections(OdTrVisRendition *pRedir) { setRedirection(pRedir); setInformationalRedirection(pRedir); } bool hasRedirections() const { return hasRedirection() && hasInformationalRedirection(); } // High-level callbacks // Called on starting vectorizer update. void onDeviceUpdateBegin(OdTrVisRenderClient *pDevice) override { if (hasInformationalRedirection()) getInformationalRedirection()->onDeviceUpdateBegin(pDevice); } // Called on ending vectorizer update. void onDeviceUpdateEnd(OdTrVisRenderClient *pDevice, bool bRender = true) override { if (hasInformationalRedirection()) getInformationalRedirection()->onDeviceUpdateEnd(pDevice, bRender); } // Checks that vectorizer update started. bool isWithinDeviceUpdate() const override { if (hasInformationalRedirection()) return getInformationalRedirection()->isWithinDeviceUpdate(); return false; } // Called by underlying application to store frame changing information. void onFrameSwitchInfo(OdUInt32 nInterval) override { if (hasInformationalRedirection()) getInformationalRedirection()->onFrameSwitchInfo(nInterval); } // Returns set of bit flags which indicate rendition capabilities/settings OdUInt32 queryRenditionCaps(OdUInt32 requestFor = 0xFFFFFFFF) const override { if (hasInformationalRedirection()) return getInformationalRedirection()->queryRenditionCaps(requestFor); return 0; } // Partial update support for local renditions: // Called to check does specified viewport/overlay combination support partial update query. bool onPartialUpdateCheckLimit(OdTrVisViewportId viewportId, OdTrVisOverlayId overlayId) override { if (hasInformationalRedirection()) return getInformationalRedirection()->onPartialUpdateCheckLimit(viewportId, overlayId); return false; } // Called to setup invalid rectangles and overlays on partial update. void onPartialUpdateInvalidRects(OdTrVisOverlayId overlayId, const OdGsDCRectArray &invalidRects, bool bOverlayInvalid = false) override { if (hasInformationalRedirection()) getInformationalRedirection()->onPartialUpdateInvalidRects(overlayId, invalidRects, bOverlayInvalid); } // Called on partial update query to set entire actual visibilities list. void onPartialUpdateList(OdTrVisViewportId viewportId, OdTrVisOverlayId overlayId, const OdTrVisDisplayId *pList, OdUInt32 nEntries) override { if (hasInformationalRedirection()) getInformationalRedirection()->onPartialUpdateList(viewportId, overlayId, pList, nEntries); } // Can be called by client side to check that rendition supports direct rendering ability. bool queryPartialUpdateDirectInvocation(OdTrVisViewportId viewportId, OdTrVisOverlayId overlayId, OdTrVisDirectRenderPartialUpdateInvocationPtr &pInvocationPtr) override { if (hasInformationalRedirection()) getInformationalRedirection()->queryPartialUpdateDirectInvocation(viewportId, overlayId, pInvocationPtr); return false; } // Can be called by client side to setup direct invocation interface for partial update instead of partial update list usage. void onPartialUpdateDirectInvocation(const OdTrVisDirectRenderPartialUpdateInvocation *pInvocation, OdTrVisRenderDataDirectAccessor *pAccessor) override { if (hasInformationalRedirection()) getInformationalRedirection()->onPartialUpdateDirectInvocation(pInvocation, pAccessor); } // Query snapshot void querySnapshot(OdUInt8 *pScanlines, long minX, long minY, long nWidth, long nHeight) override { if (hasInformationalRedirection()) getInformationalRedirection()->querySnapshot(pScanlines, minX, minY, nWidth, nHeight); } // Renders viewport to selection texture. Return top object id inside rect(aPtDc[0], aPtDc[1]) in viewport. void getSelectedObject(OdTrVisViewportId id, const OdGePoint2d* aPtDc, int numPoints, OdArray &outIDs, OdTrVisGsMarker *outMarker = NULL) ODRX_OVERRIDE { if (hasInformationalRedirection()) getInformationalRedirection()->getSelectedObject(id, aPtDc, numPoints, outIDs, outMarker); } // Allocate new resource sharing provider compatible with rendition OdTrVisSharingProviderClientPtr createSharingProvider() override { if (hasInformationalRedirection()) return getInformationalRedirection()->createSharingProvider(); return OdTrVisSharingProviderClientPtr(); } // Extract local rendition-specific host service. OdTrRndLocalRenditionHost *localRenditionHost() override { if (hasInformationalRedirection()) return getInformationalRedirection()->localRenditionHost(); return nullptr; } // Multithread processing flags MtHandlerType mtDataTypeProcessing(DataType &type) const override { if (hasInformationalRedirection()) return getInformationalRedirection()->mtDataTypeProcessing(type); return kMtSkip; } // Returns Id registrator, or NULL if no registration supported IdRegistrator *idRegistrator() const override { if (hasInformationalRedirection()) return getInformationalRedirection()->idRegistrator(); return NULL; } // Returns true if metafile streams accessible directly, returns stream by Id bool queryMetafileStream(OdTrVisViewportId viewportId, OdTrVisOverlayId overlayId, const OdTrVisDisplayId *pDisplayId, OdUInt32 nPathLength, const OdTrVisMetafileContainer **pStream, const OdTrVisExtendedBindingAccessor **pExAccessor = nullptr) override { if (hasInformationalRedirection()) return getInformationalRedirection()->queryMetafileStream(viewportId, overlayId, pDisplayId, nPathLength, pStream, pExAccessor); return false; } // Unlock metafile stream, queried by queryMetafileStream method bool unlockMetafileStream(const OdTrVisMetafileContainer *pStream) override { if (hasInformationalRedirection()) return getInformationalRedirection()->unlockMetafileStream(pStream); return false; } // Returns block metafile list in case if it is accessible. const OdTrVisDisplayId *queryBlockMetafilesList(OdTrVisBlockId blockId, OdUInt32 &numEntries) override { if (hasInformationalRedirection()) return getInformationalRedirection()->queryBlockMetafilesList(blockId, numEntries); return NULL; } // Returns extension object by Id. OdTrVisExtensionObjectPtr queryExtensionObject(OdTrVisExtensionId extId) override { if (hasInformationalRedirection()) return getInformationalRedirection()->queryExtensionObject(extId); return OdTrVisExtensionObjectPtr(); } // Returns non-kTrVisNegativeId in case if vectorizer supports ProgramID's embedded into metafile stream OdTrVisProgramId queryProgramId(OdGsView::RenderMode mode, OdTrVisVisualStyleId vsId = kTrVisNegativeId, OdTrVisGeomType geomType = OdTrVisGeomType_Default, OdUInt16 attrFlags = 0, OdUInt16 shadingFlags = 0) const override { if (hasInformationalRedirection()) return getInformationalRedirection()->queryProgramId(mode, vsId, geomType, attrFlags, shadingFlags); return kTrVisNegativeId; } // GsFiler support bool saveRenditionState(OdGsFiler *pFiler) const override { if (hasInformationalRedirection()) return getInformationalRedirection()->saveRenditionState(pFiler); return false; } bool loadRenditionState(OdGsFiler *pFiler, OdTrVisIdMap *pIdMap) override { if (hasInformationalRedirection()) return getInformationalRedirection()->loadRenditionState(pFiler, pIdMap); return false; } // Mid-level callbacks // Client information // Returns rendering client settings. void obtainClientSettings(ClientSettings &clientSets) override { if (hasInformationalRedirection()) getInformationalRedirection()->obtainClientSettings(clientSets); } // Surface // Called when output render surface parameters changed. void onSurfaceChanged(const OdTrVisSurfaceDef &pDef) override { if (hasRedirection()) getRedirection()->onSurfaceChanged(pDef); } // Called when rendering surface needs to be invalidated forcibly. void onSurfaceInvalidated() override { if (hasRedirection()) getRedirection()->onSurfaceInvalidated(); } // Overlays // Called when new overlay added into device. void onOverlayAdded(OdTrVisOverlayId overlayId, const OdTrVisOverlayDef &pDef) override { if (hasRedirection()) getRedirection()->onOverlayAdded(overlayId, pDef); } // Called when exist overlay removed from device. void onOverlayDeleted(OdTrVisOverlayId overlayId) override { if (hasRedirection()) getRedirection()->onOverlayDeleted(overlayId); } // Called when overlay visibility changed. void onOverlayVisibilityChanged(OdTrVisOverlayId overlayId, bool bVisibility) override { if (hasRedirection()) getRedirection()->onOverlayVisibilityChanged(overlayId, bVisibility); } // Called when overlay rendering order changed. void onOverlayRenderOrderChanged(OdTrVisOverlayId overlayId, OdInt16 nRenderOrder) override { if (hasRedirection()) getRedirection()->onOverlayRenderOrderChanged(overlayId, nRenderOrder); } // Viewports // Called when new viewport added into device. void onViewportAdded(OdTrVisViewportId viewportId, const OdTrVisViewportDef &pDef) override { if (hasRedirection()) getRedirection()->onViewportAdded(viewportId, pDef); } // Called when viewport inserted in list with some index. void onViewportInserted(OdTrVisViewportId viewportId, int nIndex, const OdTrVisViewportDef &pDef) override { if (hasRedirection()) getRedirection()->onViewportInserted(viewportId, nIndex, pDef); } // Called when viewport removed from device. void onViewportDeleted(OdTrVisViewportId viewportId) override { if (hasRedirection()) getRedirection()->onViewportDeleted(viewportId); } // Called when viewport visibility changed. void onViewportVisibilityChanged(OdTrVisViewportId viewportId, bool bVisibility) override { if (hasRedirection()) getRedirection()->onViewportVisibilityChanged(viewportId, bVisibility); } // Primary viewports configuration // Called when viewport view parameters is modified. void onViewportViewParamsModified(OdTrVisViewportId viewportId, const OdTrVisViewParamsDef &pDef) override { if (hasRedirection()) getRedirection()->onViewportViewParamsModified(viewportId, pDef); } // Called when viewport linestyle settings is modified. void onViewportLineStylesModified(OdTrVisViewportId viewportId, const OdTrVisViewportLineStyleDef &pDef) override { if (hasRedirection()) getRedirection()->onViewportLineStylesModified(viewportId, pDef); } // Called when viewport fading settings is modified. void onViewportFadingModified(OdTrVisViewportId viewportId, const OdTrVisViewportFadingDef &pDef) override { if (hasRedirection()) getRedirection()->onViewportFadingModified(viewportId, pDef); } // Called when viewport lineweight settings is modified. void onViewportLineweightsModified(OdTrVisViewportId viewportId, const OdTrVisViewportLineweightsDef &pDef) override { if (hasRedirection()) getRedirection()->onViewportLineweightsModified(viewportId, pDef); } // Called when viewport rendering mode is modified. void onViewportShadingModified(OdTrVisViewportId viewportId, const OdTrVisViewportShadingDef &pDef) override { if (hasRedirection()) getRedirection()->onViewportShadingModified(viewportId, pDef); } // Called when viewport clipping region is modified. void onViewportClipModified(OdTrVisViewportId viewportId, const OdTrVisViewportClipDef &pDef, bool bNrcClipModified = true, bool bBorderModified = true) override { if (hasRedirection()) getRedirection()->onViewportClipModified(viewportId, pDef, bNrcClipModified, bBorderModified); } // Extended viewports configuration // Called when background stream in viewport is changed. void onViewportBackgroundChanged(OdTrVisViewportId viewportId, const OdTrVisBackgroundDef &pDef) override { if (hasRedirection()) getRedirection()->onViewportBackgroundChanged(viewportId, pDef); } // Called when viewport fog changed. void onViewportFogChanged(OdTrVisViewportId viewportId, const OdTrVisFogDef &pDef) override { if (hasRedirection()) getRedirection()->onViewportFogChanged(viewportId, pDef); } // Called when viewport render settings changed. void onViewportRenderSettingsChanged(OdTrVisViewportId viewportId, const OdTrVisRenderSettingsDef &pDef) override { if (hasRedirection()) getRedirection()->onViewportRenderSettingsChanged(viewportId, pDef); } // Called when viewport sectioning modified. void onViewportSectioningChanged(OdTrVisViewportId viewportId, const OdTrVisSectionDef &pDef) override { if (hasRedirection()) getRedirection()->onViewportSectioningChanged(viewportId, pDef); } // Called when viewport anti-aliasing setting changed. void onViewportAntiAliasingChanged(OdTrVisViewportId viewportId, OdUInt32 nAntiAliasing) override { if (hasRedirection()) getRedirection()->onViewportAntiAliasingChanged(viewportId, nAntiAliasing); } // Called when viewport ssao setting changed. void onViewportSSAOChanged(OdTrVisViewportId viewportId, bool bEnabled) ODRX_OVERRIDE { if (hasRedirection()) getRedirection()->onViewportSSAOChanged(viewportId, bEnabled); } // Viewport default lights configuration // Called when viewport ambient light setting modified. void onViewportAmbientLightChanged(OdTrVisViewportId viewportId, const OdTrVisMaterialColor &ambientLight) override { if (hasRedirection()) getRedirection()->onViewportAmbientLightChanged(viewportId, ambientLight); } // Called when viewport default light setting modified. void onViewportDefaultLightsChanged(OdTrVisViewportId viewportId, bool bDefaultLightsOn, const OdTrVisLightDef *pLightsList = NULL, OdUInt32 nLightsListEntries = 0) override { if (hasRedirection()) getRedirection()->onViewportDefaultLightsChanged(viewportId, bDefaultLightsOn, pLightsList, nLightsListEntries); } // Viewport lights management // Called when light source added into viewport light sources list. void onViewportLightAttached(OdTrVisViewportId viewportId, OdTrVisLightId lightId, OdUInt32 nOverrides = 0, const OdTrVisLightDef &pOverrides = OdTrVisLightDef()) override { if (hasRedirection()) getRedirection()->onViewportLightAttached(viewportId, lightId, nOverrides, pOverrides); } // Called when light source removed from viewport light sources list. void onViewportLightDetached(OdTrVisViewportId viewportId, OdTrVisLightId lightId) override { if (hasRedirection()) getRedirection()->onViewportLightDetached(viewportId, lightId); } // Per-overlay viewport overrides // Called when viewport needs override view parameters for specific overlay. void onOverlayViewParamsOverride(OdTrVisViewportId viewportId, OdTrVisOverlayId overlayId, bool bOverride, const OdTrVisViewParamsDef &pDef = OdTrVisViewParamsDef()) override { if (hasRedirection()) getRedirection()->onOverlayViewParamsOverride(viewportId, overlayId, bOverride, pDef); } // Called when viewport extents changed. void onOverlayExtentsOverride(OdTrVisViewportId viewportId, OdTrVisOverlayId overlayId, const OdTrVisExtentsDef &pDef) override { if (hasRedirection()) getRedirection()->onOverlayExtentsOverride(viewportId, overlayId, pDef); } // Viewports ordering lists // Called when order of metafiles in viewport is changed. void onMetafileOrderChanged(OdTrVisViewportId viewportId, OdTrVisOverlayId overlayId, const OdTrVisDisplayId *pList, OdUInt32 nEntries) override { if (hasRedirection()) getRedirection()->onMetafileOrderChanged(viewportId, overlayId, pList, nEntries); } // Called when order of metafiles in viewport is changed (for obtain modified part of list by renderer). void onMetafileOrderChanged(OdTrVisViewportId viewportId, OdTrVisOverlayId overlayId, OdUInt32 nInvalidFrom, OdUInt32 nInvalidLen, const OdTrVisDisplayId *pValidFrom, OdUInt32 nValidLen) override { if (hasRedirection()) getRedirection()->onMetafileOrderChanged(viewportId, overlayId, nInvalidFrom, nInvalidLen, pValidFrom, nValidLen); } // Called when order of metafiles can be inherit from other source. void onMetafileOrderInheritance( OdTrVisViewportId viewportId1, OdTrVisOverlayId overlayId1, OdTrVisViewportId viewportId2 ) override { if( hasRedirection() ) getRedirection()->onMetafileOrderInheritance( viewportId1, overlayId1, viewportId2 ); } // Metafiles // Called when new metafile added (returns visualId, equal to metafileId by default). OdTrVisDisplayId onMetafileAdded(OdTrVisMetafileId metafileId, const OdTrVisMetafileDef &pDef) override { if (hasRedirection()) return getRedirection()->onMetafileAdded(metafileId, pDef); return metafileId; } // Called when exist metafile deleted. void onMetafileDeleted(OdTrVisMetafileId metafileId) override { if (hasRedirection()) getRedirection()->onMetafileDeleted(metafileId); } // Called when exist metafile changed. //virtual void onMetafileModified(OdTrVisMetafileId metafileId, const OdTrVisMetafileDef &pDef) //{ // if (hasRedirection()) // getRedirection()->onMetafileModified(metafileId, pDef); //} // Called when exist metafile extents updated (affected by transformation state branches). void onMetafileExtentsUpdated(OdTrVisMetafileId metafileId, const OdGeExtents3d &extents) override { if (hasRedirection()) getRedirection()->onMetafileExtentsUpdated(metafileId, extents); } // Called when exist metafile visibility changed. void onMetafileVisibilityChanged(OdTrVisMetafileId metafileId, bool bVisibility) override { if (hasRedirection()) getRedirection()->onMetafileVisibilityChanged(metafileId, bVisibility); } // Called when exist metafile highlighting changed. void onMetafileHighlightingChanged(OdTrVisMetafileId metafileId, bool bHighlight) override { if (hasRedirection()) getRedirection()->onMetafileHighlightingChanged(metafileId, bHighlight); } // Called when exist metafile fading changed. void onMetafileFadingChanged(OdTrVisMetafileId metafileId, bool bFade) override { if (hasRedirection()) getRedirection()->onMetafileFadingChanged(metafileId, bFade); } // Lights // Called when new light source added. void onLightAdded(OdTrVisLightId lightId, const OdTrVisLightDef &pDef) override { if (hasRedirection()) getRedirection()->onLightAdded(lightId, pDef); } // Called when exist light source modified. void onLightModified(OdTrVisLightId lightId, OdUInt32 nKindOfMod, const OdTrVisLightDef &pDef) override { if (hasRedirection()) getRedirection()->onLightModified(lightId, nKindOfMod, pDef); } // Called when exist light source deleted. void onLightDeleted(OdTrVisLightId lightId) override { if (hasRedirection()) getRedirection()->onLightDeleted(lightId); } // State branches (highlighting, hide, transform) // Called when new state branch added. void onStateBranchAdded(OdTrVisStateBranchId stateBranchId, const OdTrVisStateBranchDef &pDef) override { if (hasRedirection()) getRedirection()->onStateBranchAdded(stateBranchId, pDef); } // Called when exist state branch modified. void onStateBranchModified(OdTrVisStateBranchId stateBranchId, const OdTrVisStateBranchDef &pDef, bool bChildsModified, bool bMarkersModified) override { if (hasRedirection()) getRedirection()->onStateBranchModified(stateBranchId, pDef, bChildsModified, bMarkersModified); } // Called when exist state branch deleted. void onStateBranchDeleted(OdTrVisStateBranchId stateBranchId) override { if (hasRedirection()) getRedirection()->onStateBranchDeleted(stateBranchId); } // Called to attach additional data to range of state branch markers. void onStateBranchMarkersRangeDataAdded(OdTrVisStateBranchId stateBranchId, const OdTrVisStateBranchMarkersRange &range, const OdTrVisPropertyDef &propDef) override { if (hasRedirection()) getRedirection()->onStateBranchMarkersRangeDataAdded(stateBranchId, range, propDef); } // Called to detach additional data from state branch markers range. void onStateBranchMarkersRangeDataRemoved(OdTrVisStateBranchId stateBranchId, const OdTrVisStateBranchMarkersRange &range) override { if (hasRedirection()) getRedirection()->onStateBranchMarkersRangeDataRemoved(stateBranchId, range); } // Textures // Called when new texture added. void onTextureAdded(OdTrVisTextureId textureId, const OdTrVisTextureDef &pDef) override { if (hasRedirection()) getRedirection()->onTextureAdded(textureId, pDef); } // Called when exist texture deleted. void onTextureDeleted(OdTrVisTextureId textureId) override { if (hasRedirection()) getRedirection()->onTextureDeleted(textureId); } // Called when texture flags modified. void onTextureFlagsModified(OdTrVisTextureId textureId, OdUInt32 newFlags) override { if (hasRedirection()) getRedirection()->onTextureFlagsModified(textureId, newFlags); } // Materials // Called when new material added. void onMaterialAdded(OdTrVisMaterialId materialId, const OdTrVisMaterialDef &pDef) override { if (hasRedirection()) getRedirection()->onMaterialAdded(materialId, pDef); } // Called when exist material deleted. void onMaterialDeleted(OdTrVisMaterialId materialId) override { if (hasRedirection()) getRedirection()->onMaterialDeleted(materialId); } // Called when new material reflection plane added. void onMaterialRefPlaneAdded(OdTrVisRefPlaneId refPlaneId, const OdTrVisRefPlaneDef &pDef) override { if (hasRedirection()) getRedirection()->onMaterialRefPlaneAdded(refPlaneId, pDef); } // Called when exist material reflection plane deleted. void onMaterialRefPlaneDeleted(OdTrVisRefPlaneId refPlaneId) override { if (hasRedirection()) getRedirection()->onMaterialRefPlaneDeleted(refPlaneId); } // Visual Styles // Called when new visual style added. void onVisualStyleAdded(OdTrVisVisualStyleId visualStyleId, const OdTrVisVisualStyle &pDef) override { if (hasRedirection()) getRedirection()->onVisualStyleAdded(visualStyleId, pDef); } // Called when exist visual style modified. void onVisualStyleModified(OdTrVisVisualStyleId visualStyleId, const OdTrVisVisualStyle &pDef) override { if (hasRedirection()) getRedirection()->onVisualStyleModified(visualStyleId, pDef); } // Called when exist visual style deleted. void onVisualStyleDeleted(OdTrVisVisualStyleId visualStyleId) override { if (hasRedirection()) getRedirection()->onVisualStyleDeleted(visualStyleId); } // Layers // Called when new layer added. void onLayerAdded(OdTrVisLayerId layerId, const OdTrVisLayerDef &pDef) override { if (hasRedirection()) getRedirection()->onLayerAdded(layerId, pDef); } // Called when exist layer modified. //virtual void onLayerModified(OdTrVisLayerId layerId, const OdTrVisLayerDef &pDef) //{ // if (hasRedirection()) // getRedirection()->onLayerModified(layerId, pDef); //} // Called when exist layer deleted. void onLayerDeleted(OdTrVisLayerId layerId) override { if (hasRedirection()) getRedirection()->onLayerDeleted(layerId); } // Called when exist layer visibility changed. void onLayerVisibilityChanged(OdTrVisLayerId layerId, bool bVisibility) override { if (hasRedirection()) getRedirection()->onLayerVisibilityChanged(layerId, bVisibility); } // Called when exist layer fading changed. void onLayerFadingChanged(OdTrVisLayerId layerId, bool bFade) override { if (hasRedirection()) getRedirection()->onLayerFadingChanged(layerId, bFade); } // Called when layer viewport-dependent properties changed. void onLayerVpDepPropsOverride(OdTrVisLayerId layerId, OdTrVisViewportId viewportId, bool bOverride, const OdTrVisLayerProps &pProps = OdTrVisLayerProps()) override { if (hasRedirection()) getRedirection()->onLayerVpDepPropsOverride(layerId, viewportId, bOverride, pProps); } // Extension objects // Called when new extension object added. void onExtensionObjectAdded(OdTrVisExtensionId extId, const OdTrVisExtensionObject *pObj) override { if (hasRedirection()) getRedirection()->onExtensionObjectAdded(extId, pObj); } // Called when exist extension object deleted. void onExtensionObjectDeleted(OdTrVisExtensionId extId) override { if (hasRedirection()) getRedirection()->onExtensionObjectDeleted(extId); } // Called to send special extension object specific data. void onExtensionObjectSpecificData(OdTrVisExtensionId extId, OdUInt32 nDataId, const OdTrVisPropertyDef &propDef) override { if (hasRedirection()) getRedirection()->onExtensionObjectSpecificData(extId, nDataId, propDef); } // Called to change extension object visibility. void onExtensionObjectVisibilityChanged(OdTrVisExtensionId extId, bool bVisibility) override { if (hasRedirection()) getRedirection()->onExtensionObjectVisibilityChanged(extId, bVisibility); } // Blocks // Called when new block added. void onBlockAdded(OdTrVisBlockId blockId, const OdTrVisDisplayId *pList, OdUInt32 nEntries) override { if (hasRedirection()) getRedirection()->onBlockAdded(blockId, pList, nEntries); } // Called when block display list changed. void onBlockModified(OdTrVisBlockId blockId, OdUInt32 nInvalidFrom, OdUInt32 nInvalidLen, const OdTrVisDisplayId *pValidFrom, OdUInt32 nValidLen) override { if (hasRedirection()) getRedirection()->onBlockModified(blockId, nInvalidFrom, nInvalidLen, pValidFrom, nValidLen); } // Called when exist block deleted. void onBlockDeleted(OdTrVisBlockId blockId) override { if (hasRedirection()) getRedirection()->onBlockDeleted(blockId); } // Groups // Called when new group added. void onGroupAdded(OdTrVisGroupId groupId) override { if (hasRedirection()) getRedirection()->onGroupAdded(groupId); } // Called when exist group deleted. void onGroupDeleted(OdTrVisGroupId groupId) override { if (hasRedirection()) getRedirection()->onGroupDeleted(groupId); } // Called to attach metafiles to group. void onGroupMetafilesAttached(OdTrVisGroupId groupId, const OdTrVisMetafileId *pMetafilesList, OdUInt32 nMetafiles) override { if (hasRedirection()) getRedirection()->onGroupMetafilesAttached(groupId, pMetafilesList, nMetafiles); } // Called to detach metafiles from group (if no metafiles specified - clear entire list of groupped metafiles). void onGroupMetafilesDetached(OdTrVisGroupId groupId, const OdTrVisMetafileId *pMetafilesList, OdUInt32 nMetafiles) override { if (hasRedirection()) getRedirection()->onGroupMetafilesDetached(groupId, pMetafilesList, nMetafiles); } // Called to delete all groupped metafiles from graphics scene. //virtual void onGroupMetafilesDeleted(OdTrVisGroupId groupId) //{ // if (hasRedirection()) // getRedirection()->onGroupMetafilesDeleted(groupId); //} // Called to change visibility state for all groupped metafiles. void onGroupMetafilesVisibilityChanged(OdTrVisGroupId groupId, bool bVisibility) override { if (hasRedirection()) getRedirection()->onGroupMetafilesVisibilityChanged(groupId, bVisibility); } // Called to change highlighting state for all groupped metafiles. void onGroupMetafilesHighlightingChanged(OdTrVisGroupId groupId, bool bHighlight) override { if (hasRedirection()) getRedirection()->onGroupMetafilesHighlightingChanged(groupId, bHighlight); } // Called to change fading state for all groupped metafiles. void onGroupMetafilesFadingChanged(OdTrVisGroupId groupId, bool bFade) override { if (hasRedirection()) getRedirection()->onGroupMetafilesFadingChanged(groupId, bFade); } // Properties // Metafile-related properties. // Called to attach property to metafile. void onMetafilePropertyAttached(OdTrVisMetafileId metafileId, const OdTrVisPropertyDef &propDef) override { if (hasRedirection()) getRedirection()->onMetafilePropertyAttached(metafileId, propDef); } // Called to detach property from metafile. void onMetafilePropertyDetached(OdTrVisMetafileId metafileId, OdTrVisPropertyDef::PropertyType propType) override { if (hasRedirection()) getRedirection()->onMetafilePropertyDetached(metafileId, propType); } // Group-related properties. // Called to attach property to group. void onGroupPropertyAttached(OdTrVisGroupId groupId, const OdTrVisPropertyDef &propDef) override { if (hasRedirection()) getRedirection()->onGroupPropertyAttached(groupId, propDef); } // Called to detach property from group. void onGroupPropertyDetached(OdTrVisGroupId groupId, OdTrVisPropertyDef::PropertyType propType) override { if (hasRedirection()) getRedirection()->onGroupPropertyDetached(groupId, propType); } // Layer-related properties. // Called to attach property to layer. void onLayerPropertyAttached(OdTrVisLayerId layerId, const OdTrVisPropertyDef &propDef) override { if (hasRedirection()) getRedirection()->onLayerPropertyAttached(layerId, propDef); } // Called to detach property from layer. void onLayerPropertyDetached(OdTrVisLayerId layerId, OdTrVisPropertyDef::PropertyType propType) override { if (hasRedirection()) getRedirection()->onLayerPropertyDetached(layerId, propType); } // VisualStyle-related properties. // Called to attach property to visual style. void onVisualStylePropertyAttached(OdTrVisVisualStyleId visualStyleId, const OdTrVisPropertyDef &propDef) override { if (hasRedirection()) getRedirection()->onVisualStylePropertyAttached(visualStyleId, propDef); } // Called to detach property from visual style. void onVisualStylePropertyDetached(OdTrVisVisualStyleId visualStyleId, OdTrVisPropertyDef::PropertyType propType) override { if (hasRedirection()) getRedirection()->onVisualStylePropertyDetached(visualStyleId, propType); } // Material-related properties. // Called to attach property to material. void onMaterialPropertyAttached(OdTrVisMaterialId materialId, const OdTrVisPropertyDef &propDef) override { if (hasRedirection()) getRedirection()->onMaterialPropertyAttached(materialId, propDef); } // Called to detach property from material. void onMaterialPropertyDetached(OdTrVisMaterialId materialId, OdTrVisPropertyDef::PropertyType propType) override { if (hasRedirection()) getRedirection()->onMaterialPropertyDetached(materialId, propType); } // Texture-related properties. // Called to attach property to texture. void onTexturePropertyAttached(OdTrVisTextureId textureId, const OdTrVisPropertyDef &propDef) override { if (hasRedirection()) getRedirection()->onTexturePropertyAttached(textureId, propDef); } // Called to detach property from texture. void onTexturePropertyDetached(OdTrVisTextureId textureId, OdTrVisPropertyDef::PropertyType propType) override { if (hasRedirection()) getRedirection()->onTexturePropertyDetached(textureId, propType); } // Light-related properties. // Called to attach property to light source. void onLightPropertyAttached(OdTrVisLightId lightId, const OdTrVisPropertyDef &propDef) override { if (hasRedirection()) getRedirection()->onLightPropertyAttached(lightId, propDef); } // Called to detach property from light source. void onLightPropertyDetached(OdTrVisLightId lightId, OdTrVisPropertyDef::PropertyType propType) override { if (hasRedirection()) getRedirection()->onLightPropertyDetached(lightId, propType); } // StateBranch-related properties. // Called to attach property to state branch. void onStateBranchPropertyAttached(OdTrVisStateBranchId stateBranchId, const OdTrVisPropertyDef &propDef) override { if (hasRedirection()) getRedirection()->onStateBranchPropertyAttached(stateBranchId, propDef); } // Called to detach property from state branch. void onStateBranchPropertyDetached(OdTrVisStateBranchId stateBranchId, OdTrVisPropertyDef::PropertyType propType) override { if (hasRedirection()) getRedirection()->onStateBranchPropertyDetached(stateBranchId, propType); } // Viewport-related properties. // Called to attach property to viewport. void onViewportPropertyAttached(OdTrVisViewportId viewportId, const OdTrVisPropertyDef &propDef) override { if (hasRedirection()) getRedirection()->onViewportPropertyAttached(viewportId, propDef); } // Called to detach property from viewport. void onViewportPropertyDetached(OdTrVisViewportId viewportId, OdTrVisPropertyDef::PropertyType propType) override { if (hasRedirection()) getRedirection()->onViewportPropertyDetached(viewportId, propType); } // Overlay-related properties. // Called to attach property to overlay. void onOverlayPropertyAttached(OdTrVisOverlayId overlayId, const OdTrVisPropertyDef &propDef) override { if (hasRedirection()) getRedirection()->onOverlayPropertyAttached(overlayId, propDef); } // Called to detach property from overlay. void onOverlayPropertyDetached(OdTrVisOverlayId overlayId, OdTrVisPropertyDef::PropertyType propType) override { if (hasRedirection()) getRedirection()->onOverlayPropertyDetached(overlayId, propType); } // ExtensionObject-related properties. // Called to attach property to extension object. void onExtensionObjectPropertyAttached(OdTrVisExtensionId extId, const OdTrVisPropertyDef &propDef) override { if (hasRedirection()) getRedirection()->onExtensionObjectPropertyAttached(extId, propDef); } // Called to detach property from extension object. void onExtensionObjectPropertyDetached(OdTrVisExtensionId extId, OdTrVisPropertyDef::PropertyType propType) override { if (hasRedirection()) getRedirection()->onExtensionObjectPropertyDetached(extId, propType); } // Block-related properties. // Called to attach property to block. void onBlockPropertyAttached(OdTrVisBlockId blockId, const OdTrVisPropertyDef &propDef) override { if (hasRedirection()) getRedirection()->onBlockPropertyAttached(blockId, propDef); } // Called to detach property from viewport. void onBlockPropertyDetached(OdTrVisBlockId blockId, OdTrVisPropertyDef::PropertyType propType) override { if (hasRedirection()) getRedirection()->onBlockPropertyDetached(blockId, propType); } }; /** \details */ class OdTrVisRenditionDeviceUpdateScopes { protected: OdTrVisRendition *m_pRendition; OdTrVisRenderClient *m_pRenderClient; bool m_bRender; public: OdTrVisRenditionDeviceUpdateScopes(OdTrVisRendition *pRendition, OdTrVisRenderClient *pDevice, bool bReentrant = true, bool bRender = true) : m_pRendition(pRendition), m_pRenderClient(pDevice), m_bRender(bRender) { if (pRendition) { if (pRendition->isWithinDeviceUpdate()) { if (!bReentrant) throw OdError(eAlreadyActive); m_pRendition = NULL; } else pRendition->onDeviceUpdateBegin(pDevice); } } bool isReentered() const { return m_pRendition == NULL; } ~OdTrVisRenditionDeviceUpdateScopes() noexcept(false) { if (m_pRendition) m_pRendition->onDeviceUpdateEnd(m_pRenderClient, m_bRender); } }; #include "TD_PackPop.h" #endif // ODTRVISRENDITION