/////////////////////////////////////////////////////////////////////////////// // 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. /////////////////////////////////////////////////////////////////////////////// // Rendition branching interface #ifndef ODTRVISRENDITIONBRANCHING #define ODTRVISRENDITIONBRANCHING #include "TD_PackPush.h" #include "TrVisRendition.h" #define STL_USING_MAP #include "OdaSTL.h" /** \details */ class OdTrVisRenditionBranching : public OdTrVisRendition { protected: OdTrVisRenditionPtr m_pRenditionA, m_pRenditionB, m_pRenditionC; mutable struct IdRegistratorBranching : public IdRegistrator { IdRegistrator *m_pIdRegA, *m_pIdRegB; IdRegistratorBranching() : m_pIdRegA(NULL), m_pIdRegB(NULL) { } void setIdRegA(IdRegistrator *pReg) { m_pIdRegA = pReg; } IdRegistrator *getIdRegA() { return m_pIdRegA; } const IdRegistrator *getIdRegA() const { return m_pIdRegA; } bool hasIdRegA() const { return (m_pIdRegA != NULL); } void setIdRegB(IdRegistrator *pReg) { m_pIdRegB = pReg; } IdRegistrator *getIdRegB() { return m_pIdRegB; } const IdRegistrator *getIdRegB() const { return m_pIdRegB; } bool hasIdRegB() const { return (m_pIdRegB != NULL); } void setIdRegs(IdRegistrator *pRegA, IdRegistrator *pRegB) { setIdRegA(pRegA); setIdRegB(pRegB); } bool hasIdReg() const { return hasIdRegA() || hasIdRegB(); } bool hasIdRegs() const { return hasIdRegA() && hasIdRegB(); } void reg(DataType type, OdTrVisId id, OdDbStub *pPersId) override { if (hasIdRegA()) getIdRegA()->reg(type, id, pPersId); if (hasIdRegB()) getIdRegB()->reg(type, id, pPersId); } void reg(DataType type, OdTrVisId id, const OdGiDrawable *pTransId) override { if (hasIdRegA()) getIdRegA()->reg(type, id, pTransId); if (hasIdRegB()) getIdRegB()->reg(type, id, pTransId); } void reg(DataType type, OdTrVisId id, const OdTrVisUniqueID &uId) override { if (hasIdRegA()) getIdRegA()->reg(type, id, uId); if (hasIdRegB()) getIdRegB()->reg(type, id, uId); } void kill(DataType type, OdTrVisId id) override { if (hasIdRegA()) getIdRegA()->kill(type, id); if (hasIdRegB()) getIdRegB()->kill(type, id); } OdTrVisUniqueID *get(DataType type, OdTrVisId id, bool bKill = false) const override { if (hasIdRegA()) return getIdRegA()->get(type, id, bKill); if (hasIdRegB()) return getIdRegB()->get(type, id, bKill); return NULL; } } m_idRegsBranching; static const MtHandlerType g_mtHandlerPriority[6][6]; protected: struct DisplayIdMapping { // Map between metafileId and first displayId. typedef std::map MetafileRegMap; MetafileRegMap m_metafileIdMap; // Map between first displayId and second displayId. typedef std::map DisplayIdsMap; DisplayIdsMap m_displayIdMap; // Temporary displayId's array for second displayId's. mutable OdVector > m_temporaryDisplayIds; // Check does mapping exist. bool hasMapping() const { return !m_metafileIdMap.empty(); } // Insert mapping. void regMapping(OdTrVisMetafileId mfId, OdTrVisDisplayId ds1, OdTrVisDisplayId ds2) { m_metafileIdMap[mfId] = ds1; m_displayIdMap[ds1] = ds2; } // Remove mapping. void unregMapping(OdTrVisMetafileId mfId) { if (hasMapping()) { MetafileRegMap::iterator it = m_metafileIdMap.find(mfId); if (it != m_metafileIdMap.end()) { m_displayIdMap.erase(it->second); m_metafileIdMap.erase(it); } } } // Clear mapping by request. void clearMapping() { if (hasMapping()) { m_metafileIdMap.clear(); m_displayIdMap.clear(); m_temporaryDisplayIds.setPhysicalLength(0); } } // Make temporary displayId's mapping. OdTrVisDisplayId remap(OdTrVisDisplayId id) const { if (hasMapping()) { DisplayIdsMap::const_iterator it = m_displayIdMap.find(id); if (it != m_displayIdMap.end()) return it->second; } return id; } const OdTrVisDisplayId *remap(const OdTrVisDisplayId *pIdsList, OdUInt32 nData) const { if (!nData || !hasMapping()) { return pIdsList; } m_temporaryDisplayIds.resize(nData); OdTrVisDisplayId *pOutIds = m_temporaryDisplayIds.asArrayPtr(); for (OdUInt32 nId = 0; nId < nData; nId++) { DisplayIdsMap::const_iterator it = m_displayIdMap.find(pIdsList[nId]); if (it != m_displayIdMap.end()) pOutIds[nId] = it->second; else pOutIds[nId] = pIdsList[nId]; } return pOutIds; } } m_displayIdMapping; void metafileStreamRemapping(const OdTrVisMetafileDef &pDef); protected: void updateIdRegA() { m_idRegsBranching.setIdRegA((hasRenditionA()) ? getRenditionA()->idRegistrator() : NULL); } void updateIdRegB() { m_idRegsBranching.setIdRegB((hasRenditionB()) ? getRenditionB()->idRegistrator() : NULL); } public: OdTrVisRenditionBranching() { } void setRenditionA(OdTrVisRendition *pRendition) { m_pRenditionA = pRendition; updateIdRegA(); } OdTrVisRendition *getRenditionA() { return m_pRenditionA; } const OdTrVisRendition *getRenditionA() const { return m_pRenditionA; } bool hasRenditionA() const { return !m_pRenditionA.isNull(); } void setRenditionB(OdTrVisRendition *pRendition) { if (pRendition != m_pRenditionB) { m_displayIdMapping.clearMapping(); } m_pRenditionB = pRendition; updateIdRegB(); } OdTrVisRendition *getRenditionB() { return m_pRenditionB; } const OdTrVisRendition *getRenditionB() const { return m_pRenditionB; } bool hasRenditionB() const { return !m_pRenditionB.isNull(); } void setRenditions(OdTrVisRendition *pRenditionA, OdTrVisRendition *pRenditionB) { setRenditionA(pRenditionA); setRenditionB(pRenditionB); } bool hasRendition() const { return hasRenditionA() || hasRenditionB(); } bool hasRenditions() const { return hasRenditionA() && hasRenditionB(); } void setClientSettingsRendition(bool bRenditionA = true, bool bRenditionB = false) { if (bRenditionA) { if (bRenditionB) m_pRenditionC = NULL; else m_pRenditionC = m_pRenditionA; } else if (bRenditionB) m_pRenditionC = m_pRenditionB; else m_pRenditionC = NULL; } OdTrVisRendition *getClientSettingsRendition() { return m_pRenditionC; } const OdTrVisRendition *getClientSettingsRendition() const { return m_pRenditionC; } bool hasClientSettingsRendition() const { return !m_pRenditionC.isNull(); } // High-level callbacks // Called on starting vectorizer update. void onDeviceUpdateBegin(OdTrVisRenderClient *pDevice) override { if (hasRenditionA()) getRenditionA()->onDeviceUpdateBegin(pDevice), updateIdRegA(); if (hasRenditionB()) getRenditionB()->onDeviceUpdateBegin(pDevice), updateIdRegB(); } // Called on ending vectorizer update. void onDeviceUpdateEnd(OdTrVisRenderClient *pDevice, bool bRender = true) override { if (hasRenditionA()) getRenditionA()->onDeviceUpdateEnd(pDevice, bRender); if (hasRenditionB()) getRenditionB()->onDeviceUpdateEnd(pDevice, bRender); } // Checks that vectorizer update started. bool isWithinDeviceUpdate() const override { bool bRes = false; if (hasRenditionA()) bRes |= getRenditionA()->isWithinDeviceUpdate(); if (hasRenditionB()) bRes |= getRenditionB()->isWithinDeviceUpdate(); return bRes; } // Called by underlying application to store frame changing information. void onFrameSwitchInfo(OdUInt32 nInterval) override { if (hasRenditionA()) getRenditionA()->onFrameSwitchInfo(nInterval); if (hasRenditionB()) getRenditionB()->onFrameSwitchInfo(nInterval); } // Returns set of bit flags which indicate rendition capabilities/settings OdUInt32 queryRenditionCaps(OdUInt32 requestFor = 0xFFFFFFFF) const override { if (hasRenditions()) return getRenditionA()->queryRenditionCaps(requestFor) & getRenditionB()->queryRenditionCaps(requestFor); if (hasRenditionA()) return getRenditionA()->queryRenditionCaps(requestFor); if (hasRenditionB()) return getRenditionB()->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 { bool bRVal = false; if (hasRenditionA()) bRVal |= getRenditionA()->onPartialUpdateCheckLimit(viewportId, overlayId); if (hasRenditionB()) bRVal |= getRenditionB()->onPartialUpdateCheckLimit(viewportId, overlayId); return bRVal; } // Called to setup invalid rectangles and overlays on partial update. void onPartialUpdateInvalidRects(OdTrVisOverlayId overlayId, const OdGsDCRectArray &invalidRects, bool bOverlayInvalid = false) override { if (hasRenditionA()) getRenditionA()->onPartialUpdateInvalidRects(overlayId, invalidRects, bOverlayInvalid); if (hasRenditionB()) getRenditionB()->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 (hasRenditionA()) getRenditionA()->onPartialUpdateList(viewportId, overlayId, pList, nEntries); if (hasRenditionB()) getRenditionB()->onPartialUpdateList(viewportId, overlayId, m_displayIdMapping.remap(pList, nEntries), nEntries); } protected: class RemapABInvocation : public OdTrVisDirectRenderPartialUpdateInvocation, protected OdTrVisRenderDataInvokeRedirect { OdTrVisDirectRenderPartialUpdateInvocationPtr m_pInvocationA; OdTrVisDirectRenderPartialUpdateInvocationPtr m_pInvocationB; typedef std::map DisplayIdsMap; const DisplayIdsMap *m_pDisplayIdMap; bool incomeMetafile(OdTrVisDisplayId mfId) override { if (m_pDisplayIdMap) { DisplayIdsMap::const_iterator it = m_pDisplayIdMap->find(mfId); if (it != m_pDisplayIdMap->end()) mfId = it->second; } return OdTrVisRenderDataInvokeRedirect::incomeMetafile(mfId); } public: TD_USING(OdTrVisDirectRenderPartialUpdateInvocation::setup); void setup(OdTrVisDirectRenderPartialUpdateInvocation *pInvocationA, OdTrVisDirectRenderPartialUpdateInvocation *pInvocationB, const DisplayIdsMap *pIdMap) { m_pInvocationA = pInvocationA; m_pInvocationB = pInvocationB; m_pDisplayIdMap = pIdMap; } OdTrVisRenderDataInvoke *wrapInvoke(OdTrVisRenderDataInvokeHid *pInvoke) const override { RemapABInvocation *pRemap = const_cast(this); pRemap->setRedirection(OdTrVisDirectRenderPartialUpdateInvocation::wrapInvoke(pInvoke)); return pRemap; } const OdTrVisDirectRenderPartialUpdateInvocation *basicInvocation() const override { return m_pInvocationA; } }; public: // Can be called by client side to check that rendition supports direct rendering ability. bool queryPartialUpdateDirectInvocation(OdTrVisViewportId viewportId, OdTrVisOverlayId overlayId, OdTrVisDirectRenderPartialUpdateInvocationPtr &pInvocationPtr) override { const bool bHasA = hasRenditionA() ? getRenditionA()->queryPartialUpdateDirectInvocation(viewportId, overlayId, pInvocationPtr) : false; if (!hasRenditionB()) return bHasA; OdTrVisDirectRenderPartialUpdateInvocationPtr pInvocationA = pInvocationPtr; const bool bHasB = hasRenditionB() ? getRenditionB()->queryPartialUpdateDirectInvocation(viewportId, overlayId, pInvocationPtr) : false; if (bHasB) { OdSmartPtr rabInvocation = OdRxObjectImpl::createObject(); rabInvocation->setup(pInvocationPtr); rabInvocation->setup(pInvocationA, pInvocationPtr, (m_displayIdMapping.hasMapping()) ? &m_displayIdMapping.m_displayIdMap : NULL); pInvocationPtr = rabInvocation; } return bHasA || bHasB; } // 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 (hasRenditionA()) getRenditionA()->onPartialUpdateDirectInvocation(pInvocation->basicInvocation(), pAccessor); if (hasRenditionB()) getRenditionB()->onPartialUpdateDirectInvocation(pInvocation, pAccessor); } // Query snapshot void querySnapshot(OdUInt8 *pScanlines, long minX, long minY, long nWidth, long nHeight) override { if (hasRenditionA()) getRenditionA()->querySnapshot(pScanlines, minX, minY, nWidth, nHeight); if (hasRenditionB()) getRenditionB()->querySnapshot(pScanlines, minX, minY, nWidth, nHeight); } // 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 { if (hasRenditionA()) getRenditionA()->getSelectedObject(id, aPtDc, numPoints, outIDs, outMarker); if (hasRenditionB()) getRenditionB()->getSelectedObject(id, aPtDc, numPoints, outIDs, outMarker); } // Allocate new resource sharing provider compatible with rendition OdTrVisSharingProviderClientPtr createSharingProvider() override { // @@@TODO: probably we need branching of sharing providers? if (hasRenditionA()) return getRenditionA()->createSharingProvider(); if (hasRenditionB()) return getRenditionB()->createSharingProvider(); return OdTrVisSharingProviderClientPtr(); } // Extract local rendition-specific host service. OdTrRndLocalRenditionHost *localRenditionHost() override { // @@@TODO: probably we need branching of sharing providers? if (hasRenditionA()) return getRenditionA()->localRenditionHost(); if (hasRenditionB()) return getRenditionB()->localRenditionHost(); return nullptr; } // Multithread processing flags MtHandlerType mtDataTypeProcessing(DataType &type) const override { // Each rendition must be protected by own Mt handler, but we still can sort handler types by priority. if (hasRenditions()) { const MtHandlerType typeA = getRenditionA()->mtDataTypeProcessing(type), typeB = getRenditionB()->mtDataTypeProcessing(type); const MtHandlerType rv = g_mtHandlerPriority[MtComplex::decode(typeA)][MtComplex::decode(typeB)]; if (rv == kMtComplex) { if (MtComplex::decode(typeA) == kMtComplex) return typeA; return typeB; } return rv; } if (hasRenditionA()) return getRenditionA()->mtDataTypeProcessing(type); if (hasRenditionB()) return getRenditionB()->mtDataTypeProcessing(type); return kMtSkip; } // Returns Id registrator, or NULL if no registration supported IdRegistrator *idRegistrator() const override { if (m_idRegsBranching.hasIdRegs()) return &m_idRegsBranching; if (m_idRegsBranching.hasIdRegA()) return m_idRegsBranching.getIdRegA(); if (m_idRegsBranching.hasIdRegB()) return m_idRegsBranching.getIdRegB(); 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 (hasRenditionA() && getRenditionA()->queryMetafileStream(viewportId, overlayId, pDisplayId, nPathLength, pStream, pExAccessor)) return true; if (hasRenditionB()) return getRenditionB()->queryMetafileStream(viewportId, overlayId, m_displayIdMapping.remap(pDisplayId, nPathLength), nPathLength, pStream, pExAccessor); return false; } // Unlock metafile stream, queried by queryMetafileStream method bool unlockMetafileStream(const OdTrVisMetafileContainer *pStream) override { if (hasRenditionA() && getRenditionA()->unlockMetafileStream(pStream)) return true; if (hasRenditionB()) return getRenditionB()->unlockMetafileStream(pStream); return false; } // Returns block metafile list in case if it is accessible. const OdTrVisDisplayId *queryBlockMetafilesList(OdTrVisBlockId blockId, OdUInt32 &numEntries) override { const OdTrVisDisplayId *pRVal; if (hasRenditionA() && (pRVal = getRenditionA()->queryBlockMetafilesList(blockId, numEntries))) return pRVal; if (hasRenditionB()) return getRenditionB()->queryBlockMetafilesList(blockId, numEntries); return NULL; } // Returns extension object by Id. OdTrVisExtensionObjectPtr queryExtensionObject(OdTrVisExtensionId extId) override { OdTrVisExtensionObjectPtr pExtObj; if (hasRenditionA() && !(pExtObj = getRenditionA()->queryExtensionObject(extId)).isNull()) return pExtObj; if (hasRenditionB()) return getRenditionB()->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 (hasRenditionA()) { const OdTrVisProgramId prgId = getRenditionA()->queryProgramId(mode, vsId, geomType, attrFlags, shadingFlags); if (prgId != kTrVisNegativeId) return true; } if (hasRenditionB()) return getRenditionB()->queryProgramId(mode, vsId, geomType, attrFlags, shadingFlags); return kTrVisNegativeId; } // GsFiler support bool saveRenditionState(OdGsFiler *pFiler) const override { if (hasRenditionA() && !getRenditionA()->saveRenditionState(pFiler)) return false; if (hasRenditionB()) return getRenditionB()->saveRenditionState(pFiler); return false; } bool loadRenditionState(OdGsFiler *pFiler, OdTrVisIdMap *pIdMap) override { if (hasRenditionA() && !getRenditionA()->loadRenditionState(pFiler, pIdMap)) return false; if (hasRenditionB()) return getRenditionB()->loadRenditionState(pFiler, pIdMap); 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 { if (hasRenditionA()) getRenditionA()->onSurfaceChanged(pDef); if (hasRenditionB()) getRenditionB()->onSurfaceChanged(pDef); } // Called when rendering surface needs to be invalidated forcibly. void onSurfaceInvalidated() override { if (hasRenditionA()) getRenditionA()->onSurfaceInvalidated(); if (hasRenditionB()) getRenditionB()->onSurfaceInvalidated(); } // Overlays // Called when new overlay added into device. void onOverlayAdded(OdTrVisOverlayId overlayId, const OdTrVisOverlayDef &pDef) override { if (hasRenditionA()) getRenditionA()->onOverlayAdded(overlayId, pDef); if (hasRenditionB()) getRenditionB()->onOverlayAdded(overlayId, pDef); } // Called when exist overlay removed from device. void onOverlayDeleted(OdTrVisOverlayId overlayId) override { if (hasRenditionA()) getRenditionA()->onOverlayDeleted(overlayId); if (hasRenditionB()) getRenditionB()->onOverlayDeleted(overlayId); } // Called when overlay visibility changed. void onOverlayVisibilityChanged(OdTrVisOverlayId overlayId, bool bVisibility) override { if (hasRenditionA()) getRenditionA()->onOverlayVisibilityChanged(overlayId, bVisibility); if (hasRenditionB()) getRenditionB()->onOverlayVisibilityChanged(overlayId, bVisibility); } // Called when overlay rendering order changed. void onOverlayRenderOrderChanged(OdTrVisOverlayId overlayId, OdInt16 nRenderOrder) override { if (hasRenditionA()) getRenditionA()->onOverlayRenderOrderChanged(overlayId, nRenderOrder); if (hasRenditionB()) getRenditionB()->onOverlayRenderOrderChanged(overlayId, nRenderOrder); } // Viewports // Called when new viewport added into device. void onViewportAdded(OdTrVisViewportId viewportId, const OdTrVisViewportDef &pDef) override { if (hasRenditionA()) getRenditionA()->onViewportAdded(viewportId, pDef); if (hasRenditionB()) getRenditionB()->onViewportAdded(viewportId, pDef); } // Called when viewport inserted in list with some index. void onViewportInserted(OdTrVisViewportId viewportId, int nIndex, const OdTrVisViewportDef &pDef) override { if (hasRenditionA()) getRenditionA()->onViewportInserted(viewportId, nIndex, pDef); if (hasRenditionB()) getRenditionB()->onViewportInserted(viewportId, nIndex, pDef); } // Called when viewport removed from device. void onViewportDeleted(OdTrVisViewportId viewportId) override { if (hasRenditionA()) getRenditionA()->onViewportDeleted(viewportId); if (hasRenditionB()) getRenditionB()->onViewportDeleted(viewportId); } // Called when viewport visibility changed. void onViewportVisibilityChanged(OdTrVisViewportId viewportId, bool bVisibility) override { if (hasRenditionA()) getRenditionA()->onViewportVisibilityChanged(viewportId, bVisibility); if (hasRenditionB()) getRenditionB()->onViewportVisibilityChanged(viewportId, bVisibility); } // Primary viewports configuration // Called when viewport view parameters is modified. void onViewportViewParamsModified(OdTrVisViewportId viewportId, const OdTrVisViewParamsDef &pDef) override { if (hasRenditionA()) getRenditionA()->onViewportViewParamsModified(viewportId, pDef); if (hasRenditionB()) getRenditionB()->onViewportViewParamsModified(viewportId, pDef); } // Called when viewport linestyle settings is modified. void onViewportLineStylesModified(OdTrVisViewportId viewportId, const OdTrVisViewportLineStyleDef &pDef) override { if (hasRenditionA()) getRenditionA()->onViewportLineStylesModified(viewportId, pDef); if (hasRenditionB()) getRenditionB()->onViewportLineStylesModified(viewportId, pDef); } // Called when viewport fading settings is modified. void onViewportFadingModified(OdTrVisViewportId viewportId, const OdTrVisViewportFadingDef &pDef) override { if (hasRenditionA()) getRenditionA()->onViewportFadingModified(viewportId, pDef); if (hasRenditionB()) getRenditionB()->onViewportFadingModified(viewportId, pDef); } // Called when viewport lineweight settings is modified. void onViewportLineweightsModified(OdTrVisViewportId viewportId, const OdTrVisViewportLineweightsDef &pDef) override { if (hasRenditionA()) getRenditionA()->onViewportLineweightsModified(viewportId, pDef); if (hasRenditionB()) getRenditionB()->onViewportLineweightsModified(viewportId, pDef); } // Called when viewport rendering mode is modified. void onViewportShadingModified(OdTrVisViewportId viewportId, const OdTrVisViewportShadingDef &pDef) override { if (hasRenditionA()) getRenditionA()->onViewportShadingModified(viewportId, pDef); if (hasRenditionB()) getRenditionB()->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 (hasRenditionA()) getRenditionA()->onViewportClipModified(viewportId, pDef, bNrcClipModified, bBorderModified); if (hasRenditionB()) getRenditionB()->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 (hasRenditionA()) getRenditionA()->onViewportBackgroundChanged(viewportId, pDef); if (hasRenditionB()) getRenditionB()->onViewportBackgroundChanged(viewportId, pDef); } // Called when viewport fog changed. void onViewportFogChanged(OdTrVisViewportId viewportId, const OdTrVisFogDef &pDef) override { if (hasRenditionA()) getRenditionA()->onViewportFogChanged(viewportId, pDef); if (hasRenditionB()) getRenditionB()->onViewportFogChanged(viewportId, pDef); } // Called when viewport render settings changed. void onViewportRenderSettingsChanged(OdTrVisViewportId viewportId, const OdTrVisRenderSettingsDef &pDef) override { if (hasRenditionA()) getRenditionA()->onViewportRenderSettingsChanged(viewportId, pDef); if (hasRenditionB()) getRenditionB()->onViewportRenderSettingsChanged(viewportId, pDef); } // Called when viewport sectioning modified. void onViewportSectioningChanged(OdTrVisViewportId viewportId, const OdTrVisSectionDef &pDef) override { if (hasRenditionA()) getRenditionA()->onViewportSectioningChanged(viewportId, pDef); if (hasRenditionB()) getRenditionB()->onViewportSectioningChanged(viewportId, pDef); } // Called when viewport anti-aliasing setting changed. void onViewportAntiAliasingChanged(OdTrVisViewportId viewportId, OdUInt32 nAntiAliasing) override { if (hasRenditionA()) getRenditionA()->onViewportAntiAliasingChanged(viewportId, nAntiAliasing); if (hasRenditionB()) getRenditionB()->onViewportAntiAliasingChanged(viewportId, nAntiAliasing); } // Called when viewport ssao setting changed. void onViewportSSAOChanged(OdTrVisViewportId viewportId, bool bEnabled) ODRX_OVERRIDE { if (hasRenditionA()) getRenditionA()->onViewportSSAOChanged(viewportId, bEnabled); if (hasRenditionB()) getRenditionB()->onViewportSSAOChanged(viewportId, bEnabled); } // Viewport default lights configuration // Called when viewport ambient light setting modified. void onViewportAmbientLightChanged(OdTrVisViewportId viewportId, const OdTrVisMaterialColor &ambientLight) override { if (hasRenditionA()) getRenditionA()->onViewportAmbientLightChanged(viewportId, ambientLight); if (hasRenditionB()) getRenditionB()->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 (hasRenditionA()) getRenditionA()->onViewportDefaultLightsChanged(viewportId, bDefaultLightsOn, pLightsList, nLightsListEntries); if (hasRenditionB()) getRenditionB()->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 (hasRenditionA()) getRenditionA()->onViewportLightAttached(viewportId, lightId, nOverrides, pOverrides); if (hasRenditionB()) getRenditionB()->onViewportLightAttached(viewportId, lightId, nOverrides, pOverrides); } // Called when light source removed from viewport light sources list. void onViewportLightDetached(OdTrVisViewportId viewportId, OdTrVisLightId lightId) override { if (hasRenditionA()) getRenditionA()->onViewportLightDetached(viewportId, lightId); if (hasRenditionB()) getRenditionB()->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 (hasRenditionA()) getRenditionA()->onOverlayViewParamsOverride(viewportId, overlayId, bOverride, pDef); if (hasRenditionB()) getRenditionB()->onOverlayViewParamsOverride(viewportId, overlayId, bOverride, pDef); } // Called when viewport extents changed. void onOverlayExtentsOverride(OdTrVisViewportId viewportId, OdTrVisOverlayId overlayId, const OdTrVisExtentsDef &pDef) override { if (hasRenditionA()) getRenditionA()->onOverlayExtentsOverride(viewportId, overlayId, pDef); if (hasRenditionB()) getRenditionB()->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 (hasRenditionA()) getRenditionA()->onMetafileOrderChanged(viewportId, overlayId, pList, nEntries); if (hasRenditionB()) getRenditionB()->onMetafileOrderChanged(viewportId, overlayId, m_displayIdMapping.remap(pList, nEntries), 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 (hasRenditionA()) getRenditionA()->onMetafileOrderChanged(viewportId, overlayId, nInvalidFrom, nInvalidLen, pValidFrom, nValidLen); if (hasRenditionB()) getRenditionB()->onMetafileOrderChanged(viewportId, overlayId, nInvalidFrom, nInvalidLen, m_displayIdMapping.remap(pValidFrom, nValidLen), nValidLen); } // Called when order of metafiles can be inherit from other source. void onMetafileOrderInheritance( OdTrVisViewportId viewportId1, OdTrVisOverlayId overlayId1, OdTrVisViewportId viewportId2 ) override { if (hasRenditionA()) getRenditionA()->onMetafileOrderInheritance(viewportId1, overlayId1, viewportId2); if (hasRenditionB()) getRenditionB()->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 { OdTrVisDisplayId id1, id2; if (hasRenditionA()) { id1 = getRenditionA()->onMetafileAdded(metafileId, pDef); if (!hasRenditionB()) id2 = id1; } if (hasRenditionB()) { metafileStreamRemapping(pDef); id2 = getRenditionB()->onMetafileAdded(metafileId, pDef); if (!hasRenditionA()) id1 = id2; } if (id1 != id2) m_displayIdMapping.regMapping(metafileId, id1, id2); return id1; } // Called when exist metafile deleted. void onMetafileDeleted(OdTrVisMetafileId metafileId) override { if (hasRenditionA()) getRenditionA()->onMetafileDeleted(metafileId); if (hasRenditionB()) getRenditionB()->onMetafileDeleted(metafileId); m_displayIdMapping.unregMapping(metafileId); } // Called when exist metafile changed. //virtual void onMetafileModified(OdTrVisMetafileId metafileId, const OdTrVisMetafileDef &pDef) //{ // if (hasRenditionA()) // getRenditionA()->onMetafileModified(metafileId, pDef); // if (hasRenditionB()) // getRenditionB()->onMetafileModified(metafileId, pDef); //} // Called when exist metafile extents updated (affected by transformation state branches). void onMetafileExtentsUpdated(OdTrVisMetafileId metafileId, const OdGeExtents3d &extents) override { if (hasRenditionA()) getRenditionA()->onMetafileExtentsUpdated(metafileId, extents); if (hasRenditionB()) getRenditionB()->onMetafileExtentsUpdated(metafileId, extents); } // Called when exist metafile visibility changed. void onMetafileVisibilityChanged(OdTrVisMetafileId metafileId, bool bVisibility) override { if (hasRenditionA()) getRenditionA()->onMetafileVisibilityChanged(metafileId, bVisibility); if (hasRenditionB()) getRenditionB()->onMetafileVisibilityChanged(metafileId, bVisibility); } // Called when exist metafile highlighting changed. void onMetafileHighlightingChanged(OdTrVisMetafileId metafileId, bool bHighlight) override { if (hasRenditionA()) getRenditionA()->onMetafileHighlightingChanged(metafileId, bHighlight); if (hasRenditionB()) getRenditionB()->onMetafileHighlightingChanged(metafileId, bHighlight); } // Called when exist metafile fading changed. void onMetafileFadingChanged(OdTrVisMetafileId metafileId, bool bFade) override { if (hasRenditionA()) getRenditionA()->onMetafileFadingChanged(metafileId, bFade); if (hasRenditionB()) getRenditionB()->onMetafileFadingChanged(metafileId, bFade); } // Lights // Called when new light source added. void onLightAdded(OdTrVisLightId lightId, const OdTrVisLightDef &pDef) override { if (hasRenditionA()) getRenditionA()->onLightAdded(lightId, pDef); if (hasRenditionB()) getRenditionB()->onLightAdded(lightId, pDef); } // Called when exist light source modified. void onLightModified(OdTrVisLightId lightId, OdUInt32 nKindOfMod, const OdTrVisLightDef &pDef) override { if (hasRenditionA()) getRenditionA()->onLightModified(lightId, nKindOfMod, pDef); if (hasRenditionB()) getRenditionB()->onLightModified(lightId, nKindOfMod, pDef); } // Called when exist light source deleted. void onLightDeleted(OdTrVisLightId lightId) override { if (hasRenditionA()) getRenditionA()->onLightDeleted(lightId); if (hasRenditionB()) getRenditionB()->onLightDeleted(lightId); } // State branches (highlighting, hide, transform) // Called when new state branch added. void onStateBranchAdded(OdTrVisStateBranchId stateBranchId, const OdTrVisStateBranchDef &pDef) override { if (hasRenditionA()) getRenditionA()->onStateBranchAdded(stateBranchId, pDef); if (hasRenditionB()) getRenditionB()->onStateBranchAdded(stateBranchId, pDef); } // Called when exist state branch modified. void onStateBranchModified(OdTrVisStateBranchId stateBranchId, const OdTrVisStateBranchDef &pDef, bool bChildsModified, bool bMarkersModified) override { if (hasRenditionA()) getRenditionA()->onStateBranchModified(stateBranchId, pDef, bChildsModified, bMarkersModified); if (hasRenditionB()) getRenditionB()->onStateBranchModified(stateBranchId, pDef, bChildsModified, bMarkersModified); } // Called when exist state branch deleted. void onStateBranchDeleted(OdTrVisStateBranchId stateBranchId) override { if (hasRenditionA()) getRenditionA()->onStateBranchDeleted(stateBranchId); if (hasRenditionB()) getRenditionB()->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 (hasRenditionA()) getRenditionA()->onStateBranchMarkersRangeDataAdded(stateBranchId, range, propDef); if (hasRenditionB()) getRenditionB()->onStateBranchMarkersRangeDataAdded(stateBranchId, range, propDef); } // Called to detach additional data from state branch markers range. void onStateBranchMarkersRangeDataRemoved(OdTrVisStateBranchId stateBranchId, const OdTrVisStateBranchMarkersRange &range) override { if (hasRenditionA()) getRenditionA()->onStateBranchMarkersRangeDataRemoved(stateBranchId, range); if (hasRenditionB()) getRenditionB()->onStateBranchMarkersRangeDataRemoved(stateBranchId, range); } // Textures // Called when new texture added. void onTextureAdded(OdTrVisTextureId textureId, const OdTrVisTextureDef &pDef) override { if (hasRenditionA()) getRenditionA()->onTextureAdded(textureId, pDef); if (hasRenditionB()) getRenditionB()->onTextureAdded(textureId, pDef); } // Called when exist texture deleted. void onTextureDeleted(OdTrVisTextureId textureId) override { if (hasRenditionA()) getRenditionA()->onTextureDeleted(textureId); if (hasRenditionB()) getRenditionB()->onTextureDeleted(textureId); } // Called when texture flags modified. void onTextureFlagsModified(OdTrVisTextureId textureId, OdUInt32 newFlags) override { if (hasRenditionA()) getRenditionA()->onTextureFlagsModified(textureId, newFlags); if (hasRenditionB()) getRenditionB()->onTextureFlagsModified(textureId, newFlags); } // Materials // Called when new material added. void onMaterialAdded(OdTrVisMaterialId materialId, const OdTrVisMaterialDef &pDef) override { if (hasRenditionA()) getRenditionA()->onMaterialAdded(materialId, pDef); if (hasRenditionB()) getRenditionB()->onMaterialAdded(materialId, pDef); } // Called when exist material deleted. void onMaterialDeleted(OdTrVisMaterialId materialId) override { if (hasRenditionA()) getRenditionA()->onMaterialDeleted(materialId); if (hasRenditionB()) getRenditionB()->onMaterialDeleted(materialId); } // Called when new material reflection plane added. void onMaterialRefPlaneAdded(OdTrVisRefPlaneId refPlaneId, const OdTrVisRefPlaneDef &pDef) override { if (hasRenditionA()) getRenditionA()->onMaterialRefPlaneAdded(refPlaneId, pDef); if (hasRenditionB()) getRenditionB()->onMaterialRefPlaneAdded(refPlaneId, pDef); } // Called when exist material reflection plane deleted. void onMaterialRefPlaneDeleted(OdTrVisRefPlaneId refPlaneId) override { if (hasRenditionA()) getRenditionA()->onMaterialRefPlaneDeleted(refPlaneId); if (hasRenditionB()) getRenditionB()->onMaterialRefPlaneDeleted(refPlaneId); } // Visual Styles // Called when new visual style added. void onVisualStyleAdded(OdTrVisVisualStyleId visualStyleId, const OdTrVisVisualStyle &pDef) override { if (hasRenditionA()) getRenditionA()->onVisualStyleAdded(visualStyleId, pDef); if (hasRenditionB()) getRenditionB()->onVisualStyleAdded(visualStyleId, pDef); } // Called when exist visual style modified. void onVisualStyleModified(OdTrVisVisualStyleId visualStyleId, const OdTrVisVisualStyle &pDef) override { if (hasRenditionA()) getRenditionA()->onVisualStyleModified(visualStyleId, pDef); if (hasRenditionB()) getRenditionB()->onVisualStyleModified(visualStyleId, pDef); } // Called when exist visual style deleted. void onVisualStyleDeleted(OdTrVisVisualStyleId visualStyleId) override { if (hasRenditionA()) getRenditionA()->onVisualStyleDeleted(visualStyleId); if (hasRenditionB()) getRenditionB()->onVisualStyleDeleted(visualStyleId); } // Layers // Called when new layer added. void onLayerAdded(OdTrVisLayerId layerId, const OdTrVisLayerDef &pDef) override { if (hasRenditionA()) getRenditionA()->onLayerAdded(layerId, pDef); if (hasRenditionB()) getRenditionB()->onLayerAdded(layerId, pDef); } // Called when exist layer modified. //virtual void onLayerModified(OdTrVisLayerId layerId, const OdTrVisLayerDef &pDef) //{ // if (hasRenditionA()) // getRenditionA()->onLayerModified(layerId, pDef); // if (hasRenditionB()) // getRenditionB()->onLayerModified(layerId, pDef); //} // Called when exist layer deleted. void onLayerDeleted(OdTrVisLayerId layerId) override { if (hasRenditionA()) getRenditionA()->onLayerDeleted(layerId); if (hasRenditionB()) getRenditionB()->onLayerDeleted(layerId); } // Called when exist layer visibility changed. void onLayerVisibilityChanged(OdTrVisLayerId layerId, bool bVisibility) override { if (hasRenditionA()) getRenditionA()->onLayerVisibilityChanged(layerId, bVisibility); if (hasRenditionB()) getRenditionB()->onLayerVisibilityChanged(layerId, bVisibility); } // Called when exist layer fading changed. void onLayerFadingChanged(OdTrVisLayerId layerId, bool bFade) override { if (hasRenditionA()) getRenditionA()->onLayerFadingChanged(layerId, bFade); if (hasRenditionB()) getRenditionB()->onLayerFadingChanged(layerId, bFade); } // Called when layer viewport-dependent properties changed. void onLayerVpDepPropsOverride(OdTrVisLayerId layerId, OdTrVisViewportId viewportId, bool bOverride, const OdTrVisLayerProps &pProps = OdTrVisLayerProps()) override { if (hasRenditionA()) getRenditionA()->onLayerVpDepPropsOverride(layerId, viewportId, bOverride, pProps); if (hasRenditionB()) getRenditionB()->onLayerVpDepPropsOverride(layerId, viewportId, bOverride, pProps); } // Extension objects // Called when new extension object added. void onExtensionObjectAdded(OdTrVisExtensionId extId, const OdTrVisExtensionObject *pObj) override { if (hasRenditionA()) getRenditionA()->onExtensionObjectAdded(extId, pObj); if (hasRenditionB()) getRenditionB()->onExtensionObjectAdded(extId, pObj); } // Called when exist extension object deleted. void onExtensionObjectDeleted(OdTrVisExtensionId extId) override { if (hasRenditionA()) getRenditionA()->onExtensionObjectDeleted(extId); if (hasRenditionB()) getRenditionB()->onExtensionObjectDeleted(extId); } // Called to send special extension object specific data. void onExtensionObjectSpecificData(OdTrVisExtensionId extId, OdUInt32 nDataId, const OdTrVisPropertyDef &propDef) override { if (hasRenditionA()) getRenditionA()->onExtensionObjectSpecificData(extId, nDataId, propDef); if (hasRenditionB()) getRenditionB()->onExtensionObjectSpecificData(extId, nDataId, propDef); } // Called to change extension object visibility. void onExtensionObjectVisibilityChanged(OdTrVisExtensionId extId, bool bVisibility) override { if (hasRenditionA()) getRenditionA()->onExtensionObjectVisibilityChanged(extId, bVisibility); if (hasRenditionB()) getRenditionB()->onExtensionObjectVisibilityChanged(extId, bVisibility); } // Blocks // Called when new block added. void onBlockAdded(OdTrVisBlockId blockId, const OdTrVisDisplayId *pList, OdUInt32 nEntries) override { if (hasRenditionA()) getRenditionA()->onBlockAdded(blockId, pList, nEntries); if (hasRenditionB()) getRenditionB()->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 (hasRenditionA()) getRenditionA()->onBlockModified(blockId, nInvalidFrom, nInvalidLen, pValidFrom, nValidLen); if (hasRenditionB()) getRenditionB()->onBlockModified(blockId, nInvalidFrom, nInvalidLen, pValidFrom, nValidLen); } // Called when exist block deleted. void onBlockDeleted(OdTrVisBlockId blockId) override { if (hasRenditionA()) getRenditionA()->onBlockDeleted(blockId); if (hasRenditionB()) getRenditionB()->onBlockDeleted(blockId); } // Groups // Called when new group added. void onGroupAdded(OdTrVisGroupId groupId) override { if (hasRenditionA()) getRenditionA()->onGroupAdded(groupId); if (hasRenditionB()) getRenditionB()->onGroupAdded(groupId); } // Called when exist group deleted. void onGroupDeleted(OdTrVisGroupId groupId) override { if (hasRenditionA()) getRenditionA()->onGroupDeleted(groupId); if (hasRenditionB()) getRenditionB()->onGroupDeleted(groupId); } // Called to attach metafiles to group. void onGroupMetafilesAttached(OdTrVisGroupId groupId, const OdTrVisMetafileId *pMetafilesList, OdUInt32 nMetafiles) override { if (hasRenditionA()) getRenditionA()->onGroupMetafilesAttached(groupId, pMetafilesList, nMetafiles); if (hasRenditionB()) getRenditionB()->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 (hasRenditionA()) getRenditionA()->onGroupMetafilesDetached(groupId, pMetafilesList, nMetafiles); if (hasRenditionB()) getRenditionB()->onGroupMetafilesDetached(groupId, pMetafilesList, nMetafiles); } // Called to delete all groupped metafiles from graphics scene. //virtual void onGroupMetafilesDeleted(OdTrVisGroupId groupId) //{ // if (hasRenditionA()) // getRenditionA()->onGroupMetafilesDeleted(groupId); // if (hasRenditionB()) // getRenditionB()->onGroupMetafilesDeleted(groupId); //} // Called to change visibility state for all groupped metafiles. void onGroupMetafilesVisibilityChanged(OdTrVisGroupId groupId, bool bVisibility) override { if (hasRenditionA()) getRenditionA()->onGroupMetafilesVisibilityChanged(groupId, bVisibility); if (hasRenditionB()) getRenditionB()->onGroupMetafilesVisibilityChanged(groupId, bVisibility); } // Called to change highlighting state for all groupped metafiles. void onGroupMetafilesHighlightingChanged(OdTrVisGroupId groupId, bool bHighlight) override { if (hasRenditionA()) getRenditionA()->onGroupMetafilesHighlightingChanged(groupId, bHighlight); if (hasRenditionB()) getRenditionB()->onGroupMetafilesHighlightingChanged(groupId, bHighlight); } // Called to change fading state for all groupped metafiles. void onGroupMetafilesFadingChanged(OdTrVisGroupId groupId, bool bFade) override { if (hasRenditionA()) getRenditionA()->onGroupMetafilesFadingChanged(groupId, bFade); if (hasRenditionB()) getRenditionB()->onGroupMetafilesFadingChanged(groupId, bFade); } // Properties // Metafile-related properties. // Called to attach property to metafile. void onMetafilePropertyAttached(OdTrVisMetafileId metafileId, const OdTrVisPropertyDef &propDef) override { if (hasRenditionA()) getRenditionA()->onMetafilePropertyAttached(metafileId, propDef); if (hasRenditionB()) getRenditionB()->onMetafilePropertyAttached(metafileId, propDef); } // Called to detach property from metafile. void onMetafilePropertyDetached(OdTrVisMetafileId metafileId, OdTrVisPropertyDef::PropertyType propType) override { if (hasRenditionA()) getRenditionA()->onMetafilePropertyDetached(metafileId, propType); if (hasRenditionB()) getRenditionB()->onMetafilePropertyDetached(metafileId, propType); } // Group-related properties. // Called to attach property to group. void onGroupPropertyAttached(OdTrVisGroupId groupId, const OdTrVisPropertyDef &propDef) override { if (hasRenditionA()) getRenditionA()->onGroupPropertyAttached(groupId, propDef); if (hasRenditionB()) getRenditionB()->onGroupPropertyAttached(groupId, propDef); } // Called to detach property from group. void onGroupPropertyDetached(OdTrVisGroupId groupId, OdTrVisPropertyDef::PropertyType propType) override { if (hasRenditionA()) getRenditionA()->onGroupPropertyDetached(groupId, propType); if (hasRenditionB()) getRenditionB()->onGroupPropertyDetached(groupId, propType); } // Layer-related properties. // Called to attach property to layer. void onLayerPropertyAttached(OdTrVisLayerId layerId, const OdTrVisPropertyDef &propDef) override { if (hasRenditionA()) getRenditionA()->onLayerPropertyAttached(layerId, propDef); if (hasRenditionB()) getRenditionB()->onLayerPropertyAttached(layerId, propDef); } // Called to detach property from layer. void onLayerPropertyDetached(OdTrVisLayerId layerId, OdTrVisPropertyDef::PropertyType propType) override { if (hasRenditionA()) getRenditionA()->onLayerPropertyDetached(layerId, propType); if (hasRenditionB()) getRenditionB()->onLayerPropertyDetached(layerId, propType); } // VisualStyle-related properties. // Called to attach property to visual style. void onVisualStylePropertyAttached(OdTrVisVisualStyleId visualStyleId, const OdTrVisPropertyDef &propDef) override { if (hasRenditionA()) getRenditionA()->onVisualStylePropertyAttached(visualStyleId, propDef); if (hasRenditionB()) getRenditionB()->onVisualStylePropertyAttached(visualStyleId, propDef); } // Called to detach property from visual style. void onVisualStylePropertyDetached(OdTrVisVisualStyleId visualStyleId, OdTrVisPropertyDef::PropertyType propType) override { if (hasRenditionA()) getRenditionA()->onVisualStylePropertyDetached(visualStyleId, propType); if (hasRenditionB()) getRenditionB()->onVisualStylePropertyDetached(visualStyleId, propType); } // Material-related properties. // Called to attach property to material. void onMaterialPropertyAttached(OdTrVisMaterialId materialId, const OdTrVisPropertyDef &propDef) override { if (hasRenditionA()) getRenditionA()->onMaterialPropertyAttached(materialId, propDef); if (hasRenditionB()) getRenditionB()->onMaterialPropertyAttached(materialId, propDef); } // Called to detach property from material. void onMaterialPropertyDetached(OdTrVisMaterialId materialId, OdTrVisPropertyDef::PropertyType propType) override { if (hasRenditionA()) getRenditionA()->onMaterialPropertyDetached(materialId, propType); if (hasRenditionB()) getRenditionB()->onMaterialPropertyDetached(materialId, propType); } // Texture-related properties. // Called to attach property to texture. void onTexturePropertyAttached(OdTrVisTextureId textureId, const OdTrVisPropertyDef &propDef) override { if (hasRenditionA()) getRenditionA()->onTexturePropertyAttached(textureId, propDef); if (hasRenditionB()) getRenditionB()->onTexturePropertyAttached(textureId, propDef); } // Called to detach property from texture. void onTexturePropertyDetached(OdTrVisTextureId textureId, OdTrVisPropertyDef::PropertyType propType) override { if (hasRenditionA()) getRenditionA()->onTexturePropertyDetached(textureId, propType); if (hasRenditionB()) getRenditionB()->onTexturePropertyDetached(textureId, propType); } // Light-related properties. // Called to attach property to light source. void onLightPropertyAttached(OdTrVisLightId lightId, const OdTrVisPropertyDef &propDef) override { if (hasRenditionA()) getRenditionA()->onLightPropertyAttached(lightId, propDef); if (hasRenditionB()) getRenditionB()->onLightPropertyAttached(lightId, propDef); } // Called to detach property from light source. void onLightPropertyDetached(OdTrVisLightId lightId, OdTrVisPropertyDef::PropertyType propType) override { if (hasRenditionA()) getRenditionA()->onLightPropertyDetached(lightId, propType); if (hasRenditionB()) getRenditionB()->onLightPropertyDetached(lightId, propType); } // StateBranch-related properties. // Called to attach property to state branch. void onStateBranchPropertyAttached(OdTrVisStateBranchId stateBranchId, const OdTrVisPropertyDef &propDef) override { if (hasRenditionA()) getRenditionA()->onStateBranchPropertyAttached(stateBranchId, propDef); if (hasRenditionB()) getRenditionB()->onStateBranchPropertyAttached(stateBranchId, propDef); } // Called to detach property from state branch. void onStateBranchPropertyDetached(OdTrVisStateBranchId stateBranchId, OdTrVisPropertyDef::PropertyType propType) override { if (hasRenditionA()) getRenditionA()->onStateBranchPropertyDetached(stateBranchId, propType); if (hasRenditionB()) getRenditionB()->onStateBranchPropertyDetached(stateBranchId, propType); } // Viewport-related properties. // Called to attach property to viewport. void onViewportPropertyAttached(OdTrVisViewportId viewportId, const OdTrVisPropertyDef &propDef) override { if (hasRenditionA()) getRenditionA()->onViewportPropertyAttached(viewportId, propDef); if (hasRenditionB()) getRenditionB()->onViewportPropertyAttached(viewportId, propDef); } // Called to detach property from viewport. void onViewportPropertyDetached(OdTrVisViewportId viewportId, OdTrVisPropertyDef::PropertyType propType) override { if (hasRenditionA()) getRenditionA()->onViewportPropertyDetached(viewportId, propType); if (hasRenditionB()) getRenditionB()->onViewportPropertyDetached(viewportId, propType); } // Overlay-related properties. // Called to attach property to overlay. void onOverlayPropertyAttached(OdTrVisOverlayId overlayId, const OdTrVisPropertyDef &propDef) override { if (hasRenditionA()) getRenditionA()->onOverlayPropertyAttached(overlayId, propDef); if (hasRenditionB()) getRenditionB()->onOverlayPropertyAttached(overlayId, propDef); } // Called to detach property from overlay. void onOverlayPropertyDetached(OdTrVisOverlayId overlayId, OdTrVisPropertyDef::PropertyType propType) override { if (hasRenditionA()) getRenditionA()->onOverlayPropertyDetached(overlayId, propType); if (hasRenditionB()) getRenditionB()->onOverlayPropertyDetached(overlayId, propType); } // ExtensionObject-related properties. // Called to attach property to extension object. void onExtensionObjectPropertyAttached(OdTrVisExtensionId extId, const OdTrVisPropertyDef &propDef) override { if (hasRenditionA()) getRenditionA()->onExtensionObjectPropertyAttached(extId, propDef); if (hasRenditionB()) getRenditionB()->onExtensionObjectPropertyAttached(extId, propDef); } // Called to detach property from extension object. void onExtensionObjectPropertyDetached(OdTrVisExtensionId extId, OdTrVisPropertyDef::PropertyType propType) override { if (hasRenditionA()) getRenditionA()->onExtensionObjectPropertyDetached(extId, propType); if (hasRenditionB()) getRenditionB()->onExtensionObjectPropertyDetached(extId, propType); } // Block-related properties. // Called to attach property to block. void onBlockPropertyAttached(OdTrVisBlockId blockId, const OdTrVisPropertyDef &propDef) override { if (hasRenditionA()) getRenditionA()->onBlockPropertyAttached(blockId, propDef); if (hasRenditionB()) getRenditionB()->onBlockPropertyAttached(blockId, propDef); } // Called to detach property from viewport. void onBlockPropertyDetached(OdTrVisBlockId blockId, OdTrVisPropertyDef::PropertyType propType) override { if (hasRenditionA()) getRenditionA()->onBlockPropertyDetached(blockId, propType); if (hasRenditionB()) getRenditionB()->onBlockPropertyDetached(blockId, propType); } }; #include "TD_PackPop.h" #endif // ODTRVISRENDITIONBRANCHING